[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C0SVPGY65K4DCTT09SP12Z":3,"skill-same:01M6C0SVPGY65K4DCTT09SP12Z":94},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":50,"linkOnly":51,"markdownContent":52,"markdownBody":53,"frontMatter":54,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":14,"repositoryHtmlUrl":58,"repositoryHomepageUrl":6,"ownerHtmlUrl":59,"ownerBlogUrl":6,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6C0SVPGY65K4DCTT09SP12Z","frontend-ui-engineering",null,"Build production-quality React UIs in AS v2 (React 19 + Antd v5 + Tailwind). Use when creating components, implementing pages, managing client state, or modifying any user-facing interface.","matheusnorjosa\u002Faprender_sistema","matheusnorjosa","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F117673804?v=4","01M6C0S19FG12BDFBTRWY9TTEQ","Matheus Norjosa","01M6C0S1DF0YB17TKGEYC70GSP",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ffrontend-ui-engineering\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"ui","engineering","frontend ui engineering","frontend","user","when","implementing","interface","react 19","client","as","pages","build","quality react","use","quality","Tailwind","Production","state","react","components","2026-11-10 10:12:30",false,"---\nname: frontend-ui-engineering\ndescription: Build production-quality React UIs in AS v2 (React 19 + Antd v5 + Tailwind). Use when creating components, implementing pages, managing client state, or modifying any user-facing interface.\n---\n\n# Frontend UI Engineering — Aprender Sistema\n\n## Overview\n\nStack: **React 19 + Ant Design v5 + Tailwind CSS + Vite 7** (migrado do React 18 no #1675;\nantd usa o shim `@ant-design\u002Fv5-patch-for-react-19`, importado no `main.tsx`). Goal: UI that\nmatches AS v2's existing design language, not AI-generated-looking output.\n\nLayout under `v2\u002Ffrontend\u002Fsrc\u002F`: `pages\u002F` (41, lazy-loaded in `AppRoutes.tsx`), `components\u002F` (22 reusable + `access\u002F`,\n`google\u002F`, `lgpd\u002F`), `hooks\u002F` (13 custom), `api\u002F` (one client per domain).\n\n## The one rule: Antd first\n\nUse Antd components for everything that has one; Tailwind for spacing\u002Flayout only.\n\n```tsx\n\u002F\u002F Good: Antd component, Tailwind for layout\n\u003CCard className=\"mb-4\">\n  \u003CSpace direction=\"vertical\" className=\"w-full\">\n    \u003CTypography.Title level={4}>Solicitação\u003C\u002FTypography.Title>\n  \u003C\u002FSpace>\n\u003C\u002FCard>\n\n\u002F\u002F Avoid: custom div when Antd has a component\n\u003Cdiv className=\"border rounded p-4 bg-white shadow\">  \u002F\u002F use \u003CCard>\n```\n\n## Reference (read the file for the task at hand)\n\n- **UX principles (owner's rule, read first):** `v2\u002Fdocs\u002Fspecs\u002Ffrontend\u002Fux-principios.spec.md` — clarity, flow,\n  a11y as baseline, feedback; no paternalism\u002Fdark patterns\u002Fuseless polish; hard limits (WCAG AA, CWV); PR checklist.\n  Screen pattern: `pages.spec.md` → \"Padrão responsivo\".\n\n- Forms, data fetching (`fetchAPI`), polling, state management → `reference\u002Fforms.md`\n- Tables (`useTableFilters`), empty\u002Floading\u002Ferror states → `reference\u002Ftables.md`\n- Accessibility (WCAG), keyboard, ARIA, responsive → `reference\u002Fa11y.md`\n- Timezone, wizard, approval flow, conflict codes → `reference\u002Fdomain-patterns.md`\n\n## Anti-Patterns to Avoid\n\n| Anti-Pattern | Why Bad | Correct Approach |\n|--------------|---------|------------------|\n| `fetch()` direct \u002F raw axios | No CSRF\u002Fcredentials; axios removed (ADR-013) | `fetchAPI` from `api\u002Fconfig.ts` |\n| Custom CSS \u002F inline `style={{padding:15}}` | Off Antd\u002FTailwind scale | Antd `Space` + Tailwind `p-4`\u002F`gap-*` |\n| Manually rendered toasts | Antd has it | `message.error('Erro ao salvar')` |\n| Naive date display | UTC ≠ Fortaleza (CP-03) | `.tz('America\u002FFortaleza')` |\n| Redux\u002FZustand\u002FReact Query | Project uses Context + `fetchAPI` + polling | see `reference\u002Fforms.md` |\n| `React.memo` everywhere | Premature optimization | Only on profiled bottlenecks |\n| Vite `manualChunks` | Breaks dep ordering, crashed prod | Never (`feedback_no_manual_chunks.md`) |\n| lowercase `fetchpriority` | React 19: `Invalid DOM property` (só o checklist console-errors pega) | camelCase `fetchPriority` |\n| `useRef()` sem argumento | React 19 exige valor inicial | `useRef\u003CT>(null)` |\n| `import ... from 'react-router-dom'` | v8 removeu o pacote `-dom` (#1675) | `from 'react-router'` |\n| Proportional digits in numbers that change or get compared (counters, totals, table columns) | Digits have different widths: values jitter as they update and columns don't line up. Antd v5 doesn't set `tabular-nums` (v4 did) | Tailwind `tabular-nums` on the counter or cell (column `className: 'tabular-nums'`) |\n| Pointer target smaller than 40×40px | Missed taps on tablets in the field; antd's default `Button` is 32px, `size=\"small\"` 24px | New or touched controls: `size=\"large\"` (40px) where it fits; in a dense table, enlarge the hit area with a pseudo-element that stops short of the neighbours (`after:absolute after:-inset-1` takes a 32px button to 40px; antd's `Button` is already `position: relative`) |\n| Swapping content for a spinner (`if (loading) return \u003CSpin \u002F>`) | The page collapses to a spinner and jumps back when data arrives (layout shift) | Keep the component mounted (`\u003CTable loading>`, `\u003CCard loading>`, `\u003CSpin spinning>`) or reserve the final size (`Skeleton` of the same shape) |\n\n## Measure, don't eyeball\n\nA claim about the rendered page (\"the target is big enough\", \"the digits line up\", \"nothing\njumps when the data arrives\") is a number read from the browser, not an impression from a\nscreenshot. Read it with the Playwright already in `v2\u002Ffrontend` (`playwright.config.ts`,\nspecs in `e2e\u002F`; authenticated pages run in the `chromium` project):\n\n```ts\nimport { test, expect } from '@playwright\u002Ftest';\n\ntest('alvo e dígitos medidos', async ({ page }) => {\n  await page.goto('\u002Fsolicitacoes\u002Fminhas');\n\n  \u002F\u002F The control you added or touched: visible box >= 40x40px\n  const alvo = page.getByRole('button', { name: 'Nova Solicitação' });\n  const { width, height } = await alvo.evaluate((el) => el.getBoundingClientRect());\n  expect(Math.min(width, height)).toBeGreaterThanOrEqual(40);\n\n  \u002F\u002F A numeric column you added: tabular digits are what the browser actually computed\n  const numero = page.getByRole('cell').filter({ hasText: \u002F^\\d[\\d.,]*$\u002F }).first();\n  expect(await numero.evaluate((el) => getComputedStyle(el).fontVariantNumeric))\n    .toContain('tabular-nums');\n});\n```\n\n- **A hit area enlarged by a pseudo-element doesn't show up in `getBoundingClientRect`**,\n  which measures the element's own box. Probe a point outside the visible box but inside the\n  intended 40px with `document.elementFromPoint(x, y)`; `el.contains(hit)` must be true.\n- **Layout shift** is the sum of the `layout-shift` entries without `hadRecentInput`, the same\n  sum `getPerformanceMetrics()` does in `e2e\u002Fchecklist\u002Fperformance.spec.ts`. Read the entries\n  with a buffered `PerformanceObserver`: `performance.getEntriesByType('layout-shift')`, which\n  that helper calls, returns no entries in Chromium, so it always reads 0. The callback never\n  fires when nothing shifted, hence the timeout:\n\n```ts\nconst cls = await page.evaluate(() => new Promise\u003Cnumber>((resolve) => {\n  type Shift = PerformanceEntry & { value: number; hadRecentInput: boolean };\n  new PerformanceObserver((list) => resolve((list.getEntries() as Shift[])\n    .reduce((sum, e) => (e.hadRecentInput ? sum : sum + e.value), 0)))\n    .observe({ type: 'layout-shift', buffered: true });\n  setTimeout(() => resolve(0), 1000);\n}));\nexpect(cls).toBeLessThan(0.1);\n```\n\n## Verification Checklist\n\nBefore merging a UI change:\n\n- [ ] Antd components used before custom ones\n- [ ] Uses `fetchAPI` (not raw fetch or axios)\n- [ ] Dates rendered in America\u002FFortaleza timezone (CP-03)\n- [ ] Empty \u002F loading \u002F error states — no blank screens, no layout shift: final size reserved\n- [ ] Pointer targets ≥ 40×40px on new or touched controls — measured, not eyeballed\n- [ ] Numeric columns and counters use `tabular-nums`\n- [ ] Keyboard navigable (Tab through page); icon-only buttons have `aria-label`\n- [ ] Responsive at 375 \u002F 768 \u002F 1024 \u002F 1920px\n- [ ] No console errors\u002Fwarnings\n- [ ] Lighthouse Performance ≥ 70 (Lighthouse CI gate, `v2\u002Ffrontend\u002Flighthouserc.cjs`); bundle size not significantly increased\n- [ ] E2E checklist passes (`cd v2\u002Ffrontend && npm run test:checklist`)\n\n## References\n\n- CP-03 (timezone Fortaleza), CP-06 (conventional commits)\n- ADR-013: axios pinning → fetch migration (`docs\u002Farchitecture\u002Fproject-decisions\u002F`)\n- `v2\u002Ffrontend\u002Fsrc\u002Fapi\u002Fconfig.ts` — `fetchAPI`, `buildUrl`, `fetchBlob`\n- `v2\u002Ffrontend\u002Fsrc\u002Fhooks\u002FuseTableFilters.ts`\n- Tabular numbers, 40px hit area and no-layout-shift rules adapted from\n  [wellwelwel\u002Fskills@1c4eb58](https:\u002F\u002Fgithub.com\u002Fwellwelwel\u002Fskills\u002Ftree\u002F1c4eb580a2a8c9d0257381202a11ffb7380d9d0e\u002Fskills\u002Ffrontend\u002Fui)\n  (MIT), itself adapted from\n  [jakubkrehel\u002Fmake-interfaces-feel-better@3845620](https:\u002F\u002Fgithub.com\u002Fjakubkrehel\u002Fmake-interfaces-feel-better\u002Ftree\u002F384562064fcdd99778fcbafd8729626fe6aab02f)\n  (MIT) by Jakub Krehel.\n","# Frontend UI Engineering — Aprender Sistema\n\n## Overview\n\nStack: **React 19 + Ant Design v5 + Tailwind CSS + Vite 7** (migrado do React 18 no #1675;\nantd usa o shim `@ant-design\u002Fv5-patch-for-react-19`, importado no `main.tsx`). Goal: UI that\nmatches AS v2's existing design language, not AI-generated-looking output.\n\nLayout under `v2\u002Ffrontend\u002Fsrc\u002F`: `pages\u002F` (41, lazy-loaded in `AppRoutes.tsx`), `components\u002F` (22 reusable + `access\u002F`,\n`google\u002F`, `lgpd\u002F`), `hooks\u002F` (13 custom), `api\u002F` (one client per domain).\n\n## The one rule: Antd first\n\nUse Antd components for everything that has one; Tailwind for spacing\u002Flayout only.\n\n```tsx\n\u002F\u002F Good: Antd component, Tailwind for layout\n\u003CCard className=\"mb-4\">\n  \u003CSpace direction=\"vertical\" className=\"w-full\">\n    \u003CTypography.Title level={4}>Solicitação\u003C\u002FTypography.Title>\n  \u003C\u002FSpace>\n\u003C\u002FCard>\n\n\u002F\u002F Avoid: custom div when Antd has a component\n\u003Cdiv className=\"border rounded p-4 bg-white shadow\">  \u002F\u002F use \u003CCard>\n```\n\n## Reference (read the file for the task at hand)\n\n- **UX principles (owner's rule, read first):** `v2\u002Fdocs\u002Fspecs\u002Ffrontend\u002Fux-principios.spec.md` — clarity, flow,\n  a11y as baseline, feedback; no paternalism\u002Fdark patterns\u002Fuseless polish; hard limits (WCAG AA, CWV); PR checklist.\n  Screen pattern: `pages.spec.md` → \"Padrão responsivo\".\n\n- Forms, data fetching (`fetchAPI`), polling, state management → `reference\u002Fforms.md`\n- Tables (`useTableFilters`), empty\u002Floading\u002Ferror states → `reference\u002Ftables.md`\n- Accessibility (WCAG), keyboard, ARIA, responsive → `reference\u002Fa11y.md`\n- Timezone, wizard, approval flow, conflict codes → `reference\u002Fdomain-patterns.md`\n\n## Anti-Patterns to Avoid\n\n| Anti-Pattern | Why Bad | Correct Approach |\n|--------------|---------|------------------|\n| `fetch()` direct \u002F raw axios | No CSRF\u002Fcredentials; axios removed (ADR-013) | `fetchAPI` from `api\u002Fconfig.ts` |\n| Custom CSS \u002F inline `style={{padding:15}}` | Off Antd\u002FTailwind scale | Antd `Space` + Tailwind `p-4`\u002F`gap-*` |\n| Manually rendered toasts | Antd has it | `message.error('Erro ao salvar')` |\n| Naive date display | UTC ≠ Fortaleza (CP-03) | `.tz('America\u002FFortaleza')` |\n| Redux\u002FZustand\u002FReact Query | Project uses Context + `fetchAPI` + polling | see `reference\u002Fforms.md` |\n| `React.memo` everywhere | Premature optimization | Only on profiled bottlenecks |\n| Vite `manualChunks` | Breaks dep ordering, crashed prod | Never (`feedback_no_manual_chunks.md`) |\n| lowercase `fetchpriority` | React 19: `Invalid DOM property` (só o checklist console-errors pega) | camelCase `fetchPriority` |\n| `useRef()` sem argumento | React 19 exige valor inicial | `useRef\u003CT>(null)` |\n| `import ... from 'react-router-dom'` | v8 removeu o pacote `-dom` (#1675) | `from 'react-router'` |\n| Proportional digits in numbers that change or get compared (counters, totals, table columns) | Digits have different widths: values jitter as they update and columns don't line up. Antd v5 doesn't set `tabular-nums` (v4 did) | Tailwind `tabular-nums` on the counter or cell (column `className: 'tabular-nums'`) |\n| Pointer target smaller than 40×40px | Missed taps on tablets in the field; antd's default `Button` is 32px, `size=\"small\"` 24px | New or touched controls: `size=\"large\"` (40px) where it fits; in a dense table, enlarge the hit area with a pseudo-element that stops short of the neighbours (`after:absolute after:-inset-1` takes a 32px button to 40px; antd's `Button` is already `position: relative`) |\n| Swapping content for a spinner (`if (loading) return \u003CSpin \u002F>`) | The page collapses to a spinner and jumps back when data arrives (layout shift) | Keep the component mounted (`\u003CTable loading>`, `\u003CCard loading>`, `\u003CSpin spinning>`) or reserve the final size (`Skeleton` of the same shape) |\n\n## Measure, don't eyeball\n\nA claim about the rendered page (\"the target is big enough\", \"the digits line up\", \"nothing\njumps when the data arrives\") is a number read from the browser, not an impression from a\nscreenshot. Read it with the Playwright already in `v2\u002Ffrontend` (`playwright.config.ts`,\nspecs in `e2e\u002F`; authenticated pages run in the `chromium` project):\n\n```ts\nimport { test, expect } from '@playwright\u002Ftest';\n\ntest('alvo e dígitos medidos', async ({ page }) => {\n  await page.goto('\u002Fsolicitacoes\u002Fminhas');\n\n  \u002F\u002F The control you added or touched: visible box >= 40x40px\n  const alvo = page.getByRole('button', { name: 'Nova Solicitação' });\n  const { width, height } = await alvo.evaluate((el) => el.getBoundingClientRect());\n  expect(Math.min(width, height)).toBeGreaterThanOrEqual(40);\n\n  \u002F\u002F A numeric column you added: tabular digits are what the browser actually computed\n  const numero = page.getByRole('cell').filter({ hasText: \u002F^\\d[\\d.,]*$\u002F }).first();\n  expect(await numero.evaluate((el) => getComputedStyle(el).fontVariantNumeric))\n    .toContain('tabular-nums');\n});\n```\n\n- **A hit area enlarged by a pseudo-element doesn't show up in `getBoundingClientRect`**,\n  which measures the element's own box. Probe a point outside the visible box but inside the\n  intended 40px with `document.elementFromPoint(x, y)`; `el.contains(hit)` must be true.\n- **Layout shift** is the sum of the `layout-shift` entries without `hadRecentInput`, the same\n  sum `getPerformanceMetrics()` does in `e2e\u002Fchecklist\u002Fperformance.spec.ts`. Read the entries\n  with a buffered `PerformanceObserver`: `performance.getEntriesByType('layout-shift')`, which\n  that helper calls, returns no entries in Chromium, so it always reads 0. The callback never\n  fires when nothing shifted, hence the timeout:\n\n```ts\nconst cls = await page.evaluate(() => new Promise\u003Cnumber>((resolve) => {\n  type Shift = PerformanceEntry & { value: number; hadRecentInput: boolean };\n  new PerformanceObserver((list) => resolve((list.getEntries() as Shift[])\n    .reduce((sum, e) => (e.hadRecentInput ? sum : sum + e.value), 0)))\n    .observe({ type: 'layout-shift', buffered: true });\n  setTimeout(() => resolve(0), 1000);\n}));\nexpect(cls).toBeLessThan(0.1);\n```\n\n## Verification Checklist\n\nBefore merging a UI change:\n\n- [ ] Antd components used before custom ones\n- [ ] Uses `fetchAPI` (not raw fetch or axios)\n- [ ] Dates rendered in America\u002FFortaleza timezone (CP-03)\n- [ ] Empty \u002F loading \u002F error states — no blank screens, no layout shift: final size reserved\n- [ ] Pointer targets ≥ 40×40px on new or touched controls — measured, not eyeballed\n- [ ] Numeric columns and counters use `tabular-nums`\n- [ ] Keyboard navigable (Tab through page); icon-only buttons have `aria-label`\n- [ ] Responsive at 375 \u002F 768 \u002F 1024 \u002F 1920px\n- [ ] No console errors\u002Fwarnings\n- [ ] Lighthouse Performance ≥ 70 (Lighthouse CI gate, `v2\u002Ffrontend\u002Flighthouserc.cjs`); bundle size not significantly increased\n- [ ] E2E checklist passes (`cd v2\u002Ffrontend && npm run test:checklist`)\n\n## References\n\n- CP-03 (timezone Fortaleza), CP-06 (conventional commits)\n- ADR-013: axios pinning → fetch migration (`docs\u002Farchitecture\u002Fproject-decisions\u002F`)\n- `v2\u002Ffrontend\u002Fsrc\u002Fapi\u002Fconfig.ts` — `fetchAPI`, `buildUrl`, `fetchBlob`\n- `v2\u002Ffrontend\u002Fsrc\u002Fhooks\u002FuseTableFilters.ts`\n- Tabular numbers, 40px hit area and no-layout-shift rules adapted from\n  [wellwelwel\u002Fskills@1c4eb58](https:\u002F\u002Fgithub.com\u002Fwellwelwel\u002Fskills\u002Ftree\u002F1c4eb580a2a8c9d0257381202a11ffb7380d9d0e\u002Fskills\u002Ffrontend\u002Fui)\n  (MIT), itself adapted from\n  [jakubkrehel\u002Fmake-interfaces-feel-better@3845620](https:\u002F\u002Fgithub.com\u002Fjakubkrehel\u002Fmake-interfaces-feel-better\u002Ftree\u002F384562064fcdd99778fcbafd8729626fe6aab02f)\n  (MIT) by Jakub Krehel.\n",{"name":5,"description":7},"main","9e3a882d83e0853bdc570ae9d89c02d2a53bed82",".agents\u002Fskills\u002Ffrontend-ui-engineering","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa","Dev Python | IA | Automation | HTML | CSS | Data | Process | Projects","2026-11-12 02:52:37",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add matheusnorjosa\u002Faprender_sistema --skill frontend-ui-engineering",{"tool":68,"command":69},"bunx","bunx skills add matheusnorjosa\u002Faprender_sistema --skill frontend-ui-engineering",{"tool":71,"command":72},"pnpm","pnpm dlx skills add matheusnorjosa\u002Faprender_sistema --skill frontend-ui-engineering","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ffrontend-ui-engineering\u002FSKILL.md",true,[76,82,86,90],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"reference\u002Fa11y.md","REFERENCE","参考文档",1096,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ffrontend-ui-engineering\u002Freference\u002Fa11y.md",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"reference\u002Fdomain-patterns.md",2339,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ffrontend-ui-engineering\u002Freference\u002Fdomain-patterns.md",{"path":87,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":88,"sourceHtmlUrl":89},"reference\u002Fforms.md",2038,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ffrontend-ui-engineering\u002Freference\u002Fforms.md",{"path":91,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":92,"sourceHtmlUrl":93},"reference\u002Ftables.md",1374,"https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ffrontend-ui-engineering\u002Freference\u002Ftables.md",[95,128,150,171,183,215],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":107,"publishedAt":50},"01M6C0WHSP7S2QMJGGMQRXJ6PD","writing-standards","Apply AS v2 technical-writing standards (clarity, brevity, active voice, Python\u002FDjango conventions). Use when writing a README, a docstring (PEP 257), a commit message, a PR description, an error message, or any technical doc.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwriting-standards\u002FSKILL.md",[101,104],{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":105,"categoryName":106,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者",[108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,39,124,125,126,127,34],"writing","writing standards","standards","python","commit","pr","pr description","commit message","doc","voice","clarity","django","technical","README","message","active","error","technical-writing","brevity","docstring",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":50},"01M6C0WG2SBP9PJG1YQFGGVJAR","verification-gate","Verify before claiming success. Use when about to say something works\u002Fis done, after implementing a feature, after a bugfix, or before pushing — run the proof command and confirm output first.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fverification-gate\u002FSKILL.md",[],[135,136,137,138,139,140,141,43,142,143,144,145,146,147,148,149,35,34],"verification","verification gate","gate","run","first","verify","command","verify before claiming","say","done","feature","proof","bugfix","output","about",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":159,"publishedAt":50},"01M6C0WE010G12KH45YZW6M7K5","test-driven-development","Write the failing test before the implementation in AS v2 (pytest + Django\u002FDRF). Use when implementing a feature or fixing a bug, before any production code is written.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-driven-development\u002FSKILL.md",[156],{"categoryNo":157,"categoryName":158,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[160,161,162,163,164,46,119,165,43,166,167,168,145,39,169,35,34,170],"test","test driven development","development","driven","code","write","bug","implementation","pytest","drf","failing",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":50},"01M6C0WC6Y81XRVBJQSTKA96XQ","subagent-development","Orquestra subagents no AS v2 — decompõe a tarefa em domínios independentes, paraleliza e revisa em 2 estágios. Use ao delegar exploração, implementação ou validação cross-arquivo para acelerar o trabalho e poupar o contexto principal.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsubagent-development\u002FSKILL.md",[],[162,178,179,180,181,43,182,39],"subagent","subagent development","para","subagents","ao",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":50},"01M6C0W9W8D6JJWXW28Q7ZHAC9","security-scan","Automated security scanning for AS v2. Use before commits or when reviewing changes for vulnerabilities. Runs dependency audit (pip-audit, npm audit), secret detection (grep patterns), and code pattern scanning (SQL injection, XSS, eval, pickle, hardcoded secrets). Integrates with project hooks system.","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsecurity-scan\u002FSKILL.md",[],[190,191,192,193,194,164,195,196,197,198,199,200,201,202,203,204,205,206,43,207,208,209,39,210,211,212,213,214,34],"security","security scan","scan","vulnerabilities","sql","npm","audit","dependency audit","detection","injection","xss","secrets","pip-audit","commits","system","grep","eval","hooks","security scanning","project","with","true","pip","for","changes",{"skillNo":216,"name":217,"nameZh":6,"description":218,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":219,"categories":220,"keywords":224,"publishedAt":50},"01M6C0W7RE3G3C2852YXQKR5J9","resume-handoff","Resume work from a saved handoff document, validating its state against the current codebase before continuing. Use when resuming work from a saved handoff after a context clear or in a new session (path, session name, or GitHub issue).","https:\u002F\u002Fgithub.com\u002Fmatheusnorjosa\u002Faprender_sistema\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fresume-handoff\u002FSKILL.md",[221],{"categoryNo":222,"categoryName":223,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000038","人力资源",[225,226,227,228,47,229,230,231,232,43,233,234,235,236,237,238,239,240,34,241],"handoff","resume handoff","resume","github","new session","work","context","session","github issue","issue","document","clear","name","saved","codebase","resuming","new"]