Buzzform
buildnbuzz/buzzform
A skill your agent uses when working with BuzzForm schema-driven forms, @buildnbuzz/form-core, @buildnbuzz/form-react, or any related APIs like defineSchema, InferType, FormProvider, useDataField…
Extract a Formik form section into a TanStack Form drawer with Zod validation, following the plan form migration pattern.
$ npx skills add getlago/lago-front --skill extract-section-to-drawer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install getlago/lago-front extract-section-to-drawer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/getlago/lago-front.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/extract-section-to-drawer .claude/skills/extract-section-to-drawer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "extract-section-to-drawer" agent skill from https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawer into .claude/skills/extract-section-to-drawer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-section-to-drawer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add getlago/lago-front --skill extract-section-to-drawer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install getlago/lago-front extract-section-to-drawer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/getlago/lago-front.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/extract-section-to-drawer .agents/skills/extract-section-to-drawer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "extract-section-to-drawer" agent skill from https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawer into .agents/skills/extract-section-to-drawer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-section-to-drawer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add getlago/lago-front --skill extract-section-to-drawer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install getlago/lago-front extract-section-to-drawer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/getlago/lago-front.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/extract-section-to-drawer .cursor/skills/extract-section-to-drawer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "extract-section-to-drawer" agent skill from https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawer into .cursor/skills/extract-section-to-drawer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-section-to-drawer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/getlago/lago-front.git --path .agents/skills/extract-section-to-drawer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add getlago/lago-front --skill extract-section-to-drawer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install getlago/lago-front extract-section-to-drawer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/getlago/lago-front.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/extract-section-to-drawer .gemini/skills/extract-section-to-drawer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "extract-section-to-drawer" agent skill from https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawer into .gemini/skills/extract-section-to-drawer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-section-to-drawer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install getlago/lago-front extract-section-to-drawerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add getlago/lago-front --skill extract-section-to-drawer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/getlago/lago-front.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/extract-section-to-drawer .github/skills/extract-section-to-drawer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "extract-section-to-drawer" agent skill from https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawer into .github/skills/extract-section-to-drawer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-section-to-drawer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add getlago/lago-front --skill extract-section-to-drawer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install getlago/lago-front extract-section-to-drawer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/getlago/lago-front.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/extract-section-to-drawer .opencode/skills/extract-section-to-drawer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "extract-section-to-drawer" agent skill from https://github.com/getlago/lago-front/tree/main/.agents/skills/extract-section-to-drawer into .opencode/skills/extract-section-to-drawer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-section-to-drawer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
extract-section-to-drawerExtract a Formik form section into a TanStack Form drawer with Zod validation, following the plan form migration pattern.
Extract Section To Drawer is an agent skill from getlago/lago-front. Extract a Formik form section into a TanStack Form drawer with Zod validation, following the plan form migration pattern. Use this skill when the user wants to extract a plan form section (or similar Formik section) into an independent TanStack Form drawer.
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Forms and validation. It works with TanStack and Zod. The repository describes itself as: Open Source Metering and Usage Based Billing. The licence is AGPL-3.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4e13a85. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadGlobGrepEditWriteBashAskUserQuestionFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Extract Section To Drawer loads about 4k tokens when it runs. Until then it costs about 71 tokens; SKILL.md has 1,220 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Glob, Grep, Edit, Write, Bash, AskUserQuestionAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from getlago/lago-front at commit 4e13a85, republished under its AGPL-3.0 licence (© getlago). 1,220 words, ~4,044 tokens.
.claude/skills/extract-section-to-drawer/SKILL.md (or your agent's skills folder).Target section to extract: $ARGUMENTS
Important: If no path was provided above (empty or missing), use the AskUserQuestion tool to ask the user for the path to the section component they want to extract into a drawer.
This skill extracts a Formik-based form section into an independent TanStack Form inside a ref-based Drawer, bridging data back to the parent Formik form via a callback. Both the existing Formik section and the new drawer coexist during migration.
Before starting, read these files to understand existing patterns:
src/hooks/forms/useAppForm.ts — registered field componentssrc/hooks/forms/formContext.ts — useFieldContext for TanStack fieldssrc/pages/settings/teamAndSecurity/members/dialogs/CreateInviteDialog.tsxsrc/components/designSystem/Drawer.tsx — ref-based DrawerRef with openDrawer/closeDrawersrc/components/plans/drawers/SubscriptionFeeDrawer.tsx — first completed extractionsrc/components/plans/SubscriptionFeeSection.tsx — section that hosts its drawer internallysrc/contexts/PlanFormContext.tsx — shared read-only context for currency/intervalsrc/components/form/TextInput/TextInputFieldForTanstack.tsxsrc/components/form/AmountInput/AmountInputFieldForTanstack.tsxsrc/components/form/Switch/SwitchFieldForTanstack.tsxsrc/components/form/Radio/RadioGroupFieldForTanstack.tsxCreate an interface for the drawer's form values. The field names must match the Formik field names exactly so the parent can spread them back with setValues:
interface SectionNameFormValues {
fieldA: string
fieldB: boolean
fieldC: number | null
}Critical rule: The keys in this type must be a subset of the parent Formik form's type (PlanFormInput or equivalent). This enables the spread pattern:
formikProps.setValues({ ...formikProps.values, ...drawerValues })Define a Zod schema that validates exactly the form values shape:
const sectionNameSchema = z.object({
fieldA: z.string().min(1, 'text_translationKeyForError'),
fieldB: z.boolean(),
fieldC: z.number().positive().nullable(),
})Important:
z.enum(MyEnum) for GraphQL/TS string enums. z.nativeEnum() is deprecated in Zod v4.useInternationalization.Create the drawer file at src/components/plans/drawers/SectionNameDrawer.tsx following this structure:
import { revalidateLogic, useStore } from '@tanstack/react-form'
import { forwardRef, useImperativeHandle, useRef } from 'react'
import { z } from 'zod'
import { Button } from '~/components/designSystem/Button'
import { Drawer, DrawerRef } from '~/components/designSystem/Drawer'
// ... other imports
export interface SectionNameFormValues { /* ... */ }
const sectionNameSchema = z.object({ /* ... */ })
const DEFAULT_VALUES: SectionNameFormValues = { /* ... */ }
const SECTION_NAME_FORM_ID = 'section-name-drawer-form'
export interface SectionNameDrawerRef {
openDrawer: (values: SectionNameFormValues) => void
closeDrawer: () => void
}
interface SectionNameDrawerProps {
onSave: (values: SectionNameFormValues) => void
}
export const SectionNameDrawer = forwardRef<SectionNameDrawerRef, SectionNameDrawerProps>(
({ onSave }, ref) => {
const drawerRef = useRef<DrawerRef>(null)
const form = useAppForm({
defaultValues: DEFAULT_VALUES,
validationLogic: revalidateLogic(),
validators: { onDynamic: sectionNameSchema },
onSubmit: async ({ value }) => {
onSave(value)
drawerRef.current?.closeDrawer()
},
})
useImperativeHandle(ref, () => ({
openDrawer: (values) => {
// keepDefaultValues: true prevents the React adapter's formApi.update()
// from overwriting values — it compares opts.defaultValues against
// this.options.defaultValues, and since we keep DEFAULT_VALUES as both,
// they match and no overwrite occurs. isDirty starts as false because
// reset() clears all field meta.
form.reset(values, { keepDefaultValues: true })
drawerRef.current?.openDrawer()
},
closeDrawer: () => drawerRef.current?.closeDrawer(),
}))
// IMPORTANT: subscribe to isDirty via useStore — reading form.state.isDirty
// directly is a passive read that does NOT trigger re-renders.
const isDirty = useStore(form.store, (state) => state.isDirty)
const handleFormSubmit = (event: React.FormEvent) => {
event.preventDefault()
form.handleSubmit()
}
return (
<Drawer
ref={drawerRef}
title="..."
showCloseWarningDialog={isDirty}
onClose={() => form.reset()}
stickyBottomBar={({ closeDrawer }) => (
<div className="flex justify-end gap-3">
<Button variant="quaternary" onClick={closeDrawer}>Cancel</Button>
{/* form.SubmitButton uses type="submit" which requires being inside <form>.
In drawers, stickyBottomBar is outside <form> in the DOM, so use
form.Subscribe + programmatic form.handleSubmit() instead. */}
<form.Subscribe selector={(state) => ({ canSubmit: state.canSubmit })}>
{({ canSubmit }) => (
<Button disabled={!canSubmit} onClick={() => form.handleSubmit()}>
Save
</Button>
)}
</form.Subscribe>
</div>
)}
>
<form id={SECTION_NAME_FORM_ID} onSubmit={handleFormSubmit}>
{/* Hidden submit button enables Enter-key submission.
The visible SubmitButton is in stickyBottomBar, outside the <form> in the DOM. */}
<button type="submit" hidden aria-hidden="true" />
{/* form.AppField for each field */}
</form>
</Drawer>
)
},
)<form> wrapper: Always wrap drawer content in a <form> element with an id and onSubmit handler. Add a <button type="submit" hidden aria-hidden="true" /> inside the form — the visible SubmitButton is in stickyBottomBar (outside <form> in the DOM), so the hidden button is needed for Enter-key submission to work.onSubmit on useAppForm: The save logic lives in the form's onSubmit config, not in a manual handler. This ensures Zod validation runs via form.handleSubmit() before saving.form.SubmitButton uses type="submit" which only works inside a <form> element. In drawers, the stickyBottomBar is rendered outside the <form> in the DOM, so use form.Subscribe + form.handleSubmit() instead: <form.Subscribe selector={(state) => ({ canSubmit: state.canSubmit })}>{({ canSubmit }) => (<Button disabled={!canSubmit} onClick={() => form.handleSubmit()}>Save</Button>)}</form.Subscribe>. This gives you the same canSubmit gating as SubmitButton with programmatic submission.reset(values, { keepDefaultValues: true }): On openDrawer, reset the form to the provided values while keeping DEFAULT_VALUES as the internal defaultValues. This prevents the React adapter's formApi.update() from overwriting values on re-render, without needing a useState workaround.openDrawer(values) accepts initial values from Formik, not just openDrawer()useStore(form.store, (state) => state.isDirty) — reading form.state.isDirty directly is a passive read that does NOT trigger re-renders.onClose={() => form.reset()} cleans up when drawer closesThe drawer lives inside the section component, not at the page level:
useRef<SectionNameDrawerRef> inside the section componentonDrawerSave prop (required, not optional) to the section's props interfaceSelector component) that calls drawerRef.current?.openDrawer(currentValues)<SectionNameDrawer ref={drawerRef} onSave={onDrawerSave} /> inside the sectioninterface SectionProps {
formikProps: FormikProps<PlanFormInput>
onDrawerSave: (values: SectionNameFormValues) => void
// ... other existing props
}Critical rule for sections that render items in a loop (e.g., fixed charges, usage charges, where each charge is an accordion item):
The drawer must be rendered once at the section level, NOT inside each loop item. Only the drawerRef is passed down to each item as a prop. This prevents N drawer instances in the DOM (one per item).
// ✅ Correct: ONE drawer at the section level, ref passed to items
const ChargesSection = ({ formikProps, onDrawerSave }: ChargesSectionProps) => {
const drawerRef = useRef<ChargeDrawerRef>(null)
return (
<>
{formikProps.values.charges.map((charge, index) => (
<ChargeAccordionItem
key={charge.id}
charge={charge}
drawerRef={drawerRef} // ← pass only the ref
/>
))}
<ChargeDrawer ref={drawerRef} onSave={onDrawerSave} />
</>
)
}
// Each item calls drawerRef.current?.openDrawer(itsValues)
const ChargeAccordionItem = ({ charge, drawerRef }: ChargeAccordionItemProps) => {
return (
<Selector
onClick={() => drawerRef.current?.openDrawer(charge)}
// ...
/>
)
}// ❌ Wrong: drawer rendered inside each loop item = N drawers in DOM
{formikProps.values.charges.map((charge, index) => (
<ChargeAccordionItem key={charge.id} charge={charge}>
<ChargeDrawer onSave={onDrawerSave} /> {/* duplicated per item! */}
</ChargeAccordionItem>
))}In the parent page (e.g., CreatePlan.tsx, CreateSubscription.tsx):
onDrawerSave using the spread pattern:<SectionComponent
formikProps={formikProps}
onDrawerSave={(values) => {
formikProps.setValues({ ...formikProps.values, ...values })
}}
/>PlanFormProvider wraps the section (provides currency/interval to the drawer):<PlanFormProvider
currency={formikProps.values.amountCurrency || CurrencyEnum.Usd}
interval={formikProps.values.interval || PlanInterval.Monthly}
>
{/* ... section components ... */}
</PlanFormProvider>If the section uses a Formik field component that doesn't have a TanStack equivalent yet:
src/hooks/forms/useAppForm.ts for the fieldComponents map*ForTanstack.tsx file following the pattern of existing ones (e.g., SwitchFieldForTanstack.tsx)useAppForm.tsThe TanStack field pattern:
const FieldName = (props: Omit<OriginalProps, 'name' | 'value' | 'onChange'>) => {
const field = useFieldContext<FieldType>()
return (
<OriginalComponent
{...props}
name={field.name}
value={field.state.value}
onChange={(value) => field.handleChange(value)}
/>
)
}Never manually create translation keys. Always use the script to generate properly formatted keys:
pnpm translations:add <count>This generates <count> keys with the format text_<timestamp><random> and appends them with empty values to translations/base.json. Then fill in the values for each generated key.
For example, if you need 2 new strings ("Pricing settings" and "Open drawer"):
pnpm translations:add 2translations/base.json"text_1771963033466...": "Pricing settings"translate('text_1771963033466...')After completing the extraction:
pnpm tsc --noEmit — zero errorspnpm eslint on changed files — zero new errorsonDrawerSave and is wrapped with PlanFormProvider<form> wrapper: Always wrap drawer content in a <form> element. Without it, form.handleSubmit() won't trigger the validation → submit lifecycle, and Zod validation is never enforced.form.handleSubmit(): Never read form.state.values directly and pass to onSave. Always use form.handleSubmit() which runs validation first, then calls the onSubmit handler only if valid.useState for defaultValues: Don't use useState to track defaultValues. Use form.reset(values, { keepDefaultValues: true }) instead — this prevents the React adapter's formApi.update() from overwriting values while keeping isDirty correct.z.nativeEnum() usage: Deprecated in Zod v4. Use z.enum(MyEnum) for GraphQL/TS string enums.onDrawerSave: Keep it required. If a parent doesn't need the drawer, it still passes a handler. This avoids conditional rendering bugs.usePlanFormContext() for currency/interval. Every parent that renders the section must be wrapped.useAppForm is imported from ~/hooks/forms/useAppform (lowercase 'f').validationLogic: revalidateLogic() from @tanstack/react-form.drawerRef to each item. Never render a drawer inside each loop iteration.pnpm translations:add <count> to generate them with the correct format.*ForTanstack.tsx) wire up error state via useStore(field.store, (state) => state.meta.errors) and getErrorToDisplay(). If the underlying component accepts an error prop, it must be connected.© getlago, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/extract-section-to-drawer of getlago/lago-front.
Open the folder on GitHubat commit 4e13a85
Extract Section To Drawer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Extract Section To Drawer this skillgetlago/lago-front | 163 | — | ~4k | Automated safety check: Notes | AGPL-3.0 | |
| Buzzformbuildnbuzz/buzzform | 102 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Opik Frontend Patternscomet-ml/opik | 22k | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Tanstack Formexceptionless/Exceptionless | 2.5k | — | ~544 | Automated safety check: Pass | Apache-2.0 | |
| Web Frontendlatitude-dev/latitude-llm | 4.7k | — | ~5.2k | Automated safety check: Pass | MIT | |
| React TypescriptMadAppGang/claude-code | 285 | — | ~4.1k | Automated safety check: Pass | MIT |
buildnbuzz/buzzform
A skill your agent uses when working with BuzzForm schema-driven forms, @buildnbuzz/form-core, @buildnbuzz/form-react, or any related APIs like defineSchema, InferType, FormProvider, useDataField…
comet-ml/opik
Sets the conventions for the Opik React frontend: TanStack Query for data, Zustand for shared state, one-way layer imports and a fix for Google Translate crashes.
exceptionless/Exceptionless
Build Svelte forms with TanStack Form, Zod validation, and API error mapping.
latitude-dev/latitude-llm
apps/web UI — routes, @repo/ui, TanStack Start server functions and collections, navigation (Link vs useNavigate), forms (useForm + createFormSubmitHandler + fieldErrorsAsStrings for Zod field…
MadAppGang/claude-code
Modern React 19+ patterns with TypeScript including function components, hooks, state management, TanStack Query integration, form handling with Zod, error boundaries, and performance optimization.
Mindrally/skills
Type-safe, file-based routing for React with TanStack Router.
getlago/lago-front
A skill your agent uses when asked to babysit, monitor, shepherd, or keep working on a GitHub pull request until it is green, review-ready, approved, mergeable, or ready to merge.
getlago/lago-front
Triage a CVE / Dependabot alert in a JS/TS project and recommend the least-invasive fix.
getlago/lago-front
Phase 2 of the loop pipeline for lago-front. An agent skill from getlago/lago-front.
getlago/lago-front
Cleanup phase of the loop pipeline for lago-front, for the worktree layout only.
getlago/lago-front
You are an advanced Docker containerization expert with comprehensive, practical knowledge of container optimization, security hardening, multi-stage builds, orchestration patterns, and production…
getlago/lago-front
Harvest phase of the loop pipeline for lago-front. An agent skill from getlago/lago-front.
Categories
Extract a Formik form section into a TanStack Form drawer with Zod validation, following the plan form migration pattern. Extract Section To Drawer is an agent skill from getlago/lago-front. Extract a Formik form section into a TanStack Form drawer with Zod validation, following the plan form migration pattern.
Extract Section To Drawer fits situations like: the user wants to extract a plan form section (or similar Formik section) into an independent TanStack Form drawer; tasks that involve Forms and validation.
Run `npx skills add getlago/lago-front --skill extract-section-to-drawer -a claude-code`. Or copy the skill folder (.agents/skills/extract-section-to-drawer in getlago/lago-front) into .claude/skills/extract-section-to-drawer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add getlago/lago-front --skill extract-section-to-drawer -a codex`. Or copy the skill folder (.agents/skills/extract-section-to-drawer in getlago/lago-front) into .agents/skills/extract-section-to-drawer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add getlago/lago-front --skill extract-section-to-drawer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/extract-section-to-drawer, .gemini/skills/extract-section-to-drawer, .github/skills/extract-section-to-drawer and .opencode/skills/extract-section-to-drawer in your project.
Going by SKILL.md and its folder, Extract Section To Drawer needs the command-line tools its instructions call (pnpm). Its frontmatter pre-approves these tools: Read, Glob, Grep, Edit, Write, Bash, AskUserQuestion.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Extract Section To Drawer is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Extract Section To Drawer: Buzzform (buildnbuzz/buzzform, 102 stars), Opik Frontend Patterns (comet-ml/opik, 22k stars), Tanstack Form (exceptionless/Exceptionless, 2.5k stars) and Web Frontend (latitude-dev/latitude-llm, 4.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
getlago (a GitHub organization) maintains it in getlago/lago-front, which has 163 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 9, 2026.
Source: getlago/lago-front on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.