[{"data":1,"prerenderedAt":572},["ShallowReactive",2],{"navigation_docs_en":3,"-en-development-ai-workflow-skills":191,"-en-development-ai-workflow-skills-surround":567},[4,61,127,171],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":60},"Guide","i-lucide-book-open","\u002Fen\u002Fguide","en\u002F1.guide",[10,15,20,25,30,35,40,45,50,55],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fguide\u002Fintroduction","en\u002F1.guide\u002F01.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Install the App","\u002Fen\u002Fguide\u002Finstallation","en\u002F1.guide\u002F02.installation","i-lucide-smartphone",{"title":21,"path":22,"stem":23,"icon":24},"Authentication","\u002Fen\u002Fguide\u002Fauth","en\u002F1.guide\u002F03.auth","i-lucide-lock",{"title":26,"path":27,"stem":28,"icon":29},"Wallets","\u002Fen\u002Fguide\u002Fwallets","en\u002F1.guide\u002F04.wallets","i-lucide-wallet",{"title":31,"path":32,"stem":33,"icon":34},"Categories","\u002Fen\u002Fguide\u002Fcategories","en\u002F1.guide\u002F05.categories","i-lucide-tags",{"title":36,"path":37,"stem":38,"icon":39},"Transactions","\u002Fen\u002Fguide\u002Ftransactions","en\u002F1.guide\u002F06.transactions","i-lucide-receipt",{"title":41,"path":42,"stem":43,"icon":44},"Transfers","\u002Fen\u002Fguide\u002Ftransfers","en\u002F1.guide\u002F07.transfers","i-lucide-arrow-left-right",{"title":46,"path":47,"stem":48,"icon":49},"Statistics","\u002Fen\u002Fguide\u002Fstatistics","en\u002F1.guide\u002F08.statistics","i-lucide-bar-chart-3",{"title":51,"path":52,"stem":53,"icon":54},"Theme","\u002Fen\u002Fguide\u002Ftheme","en\u002F1.guide\u002F09.theme","i-lucide-palette",{"title":56,"path":57,"stem":58,"icon":59},"Settings","\u002Fen\u002Fguide\u002Fsettings","en\u002F1.guide\u002F10.settings","i-lucide-settings",false,{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":60},"Development","i-lucide-code","\u002Fen\u002Fdevelopment","en\u002F2.development",[67,72,77,82,87,92,97,102,122],{"title":68,"path":69,"stem":70,"icon":71},"Installation","\u002Fen\u002Fdevelopment\u002Finstallation","en\u002F2.development\u002F01.installation","i-lucide-download",{"title":73,"path":74,"stem":75,"icon":76},"Codebase Graph","\u002Fen\u002Fdevelopment\u002Funderstand-anything","en\u002F2.development\u002F02.understand-anything","i-lucide-network",{"title":78,"path":79,"stem":80,"icon":81},"Offline & PWA","\u002Fen\u002Fdevelopment\u002Foffline","en\u002F2.development\u002F03.offline","i-lucide-wifi-off",{"title":83,"path":84,"stem":85,"icon":86},"Data Migration History","\u002Fen\u002Fdevelopment\u002Fmigration","en\u002F2.development\u002F04.migration","i-lucide-database",{"title":88,"path":89,"stem":90,"icon":91},"Deployment","\u002Fen\u002Fdevelopment\u002Fdeployment","en\u002F2.development\u002F05.deployment","i-lucide-rocket",{"title":93,"path":94,"stem":95,"icon":96},"Testing","\u002Fen\u002Fdevelopment\u002Ftesting","en\u002F2.development\u002F06.testing","i-lucide-flask-conical",{"title":98,"path":99,"stem":100,"icon":101},"Date Utilities","\u002Fen\u002Fdevelopment\u002Fdate-utilities","en\u002F2.development\u002F07.date-utilities","i-lucide-calendar",{"title":103,"path":104,"stem":105,"children":106,"page":60},"Ai Workflow","\u002Fen\u002Fdevelopment\u002Fai-workflow","en\u002F2.development\u002F08.ai-workflow",[107,112,117],{"title":108,"path":109,"stem":110,"icon":111},"Overview","\u002Fen\u002Fdevelopment\u002Fai-workflow\u002Foverview","en\u002F2.development\u002F08.ai-workflow\u002F01.overview","i-lucide-bot",{"title":113,"path":114,"stem":115,"icon":116},"Agents","\u002Fen\u002Fdevelopment\u002Fai-workflow\u002Fagents","en\u002F2.development\u002F08.ai-workflow\u002F02.agents","i-lucide-users",{"title":118,"path":119,"stem":120,"icon":121},"Skills","\u002Fen\u002Fdevelopment\u002Fai-workflow\u002Fskills","en\u002F2.development\u002F08.ai-workflow\u002F03.skills","i-lucide-lightbulb",{"title":123,"path":124,"stem":125,"icon":126},"Troubleshooting","\u002Fen\u002Fdevelopment\u002Ftroubleshooting","en\u002F2.development\u002F09.troubleshooting","i-lucide-life-buoy",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":60},"Reference","i-lucide-file-code","\u002Fen\u002Freference","en\u002F3.reference",[133,138,142,147,152,156,161,166],{"title":134,"path":135,"stem":136,"icon":137},"Architecture","\u002Fen\u002Freference\u002Farchitecture","en\u002F3.reference\u002F01.architecture","i-lucide-boxes",{"title":139,"path":140,"stem":141,"icon":44},"Transaction Types","\u002Fen\u002Freference\u002Ftransaction-types","en\u002F3.reference\u002F02.transaction-types",{"title":143,"path":144,"stem":145,"icon":146},"Sync","\u002Fen\u002Freference\u002Fsync","en\u002F3.reference\u002F03.sync","i-lucide-refresh-cw",{"title":148,"path":149,"stem":150,"icon":151},"Offline-first","\u002Fen\u002Freference\u002Foffline-first","en\u002F3.reference\u002F04.offline-first","i-lucide-list-ordered",{"title":153,"path":154,"stem":155,"icon":121},"Technical Decisions","\u002Fen\u002Freference\u002Ftech-decisions","en\u002F3.reference\u002F05.tech-decisions",{"title":157,"path":158,"stem":159,"icon":160},"Validation Strategy","\u002Fen\u002Freference\u002Fvalidation-strategy","en\u002F3.reference\u002F06.validation-strategy","i-lucide-shield-check",{"title":162,"path":163,"stem":164,"icon":165},"What Changed Since Firebase","\u002Fen\u002Freference\u002Ffirebase-migration","en\u002F3.reference\u002F07.firebase-migration","i-lucide-hamburger",{"title":167,"path":168,"stem":169,"icon":170},"Performance","\u002Fen\u002Freference\u002Fperformance","en\u002F3.reference\u002F08.performance","i-lucide-gauge",{"title":172,"icon":173,"path":174,"stem":175,"children":176,"page":60},"Premium","i-lucide-star","\u002Fen\u002Fpremium","en\u002F4.premium",[177,181,186],{"title":108,"path":178,"stem":179,"icon":180},"\u002Fen\u002Fpremium\u002Foverview","en\u002F4.premium\u002F01.overview","i-lucide-layers",{"title":182,"path":183,"stem":184,"icon":185},"Telegram Bot","\u002Fen\u002Fpremium\u002Ftelegram-bot","en\u002F4.premium\u002F02.telegram-bot","i-lucide-send",{"title":187,"path":188,"stem":189,"icon":190},"AI Chat","\u002Fen\u002Fpremium\u002Fai-chat","en\u002F4.premium\u002F03.ai-chat","i-lucide-sparkles",{"id":192,"title":118,"body":193,"description":558,"extension":559,"links":560,"meta":561,"navigation":562,"path":119,"seo":563,"stem":120,"__hash__":566},"docs_en\u002Fen\u002F2.development\u002F08.ai-workflow\u002F03.skills.md",{"type":194,"value":195,"toc":546},"minimark",[196,201,210,214,218,228,231,236,312,315,318,321,328,331,336,366,371,398,400,403,410,413,417,500,502,505,512,515,519],[197,198,200],"h2",{"id":199},"what-are-skills","What Are Skills",[202,203,204,205,209],"p",{},"Skills are detailed guides that Claude loads on demand via slash commands. They provide checklists, code examples, and patterns for specific workflows. They live in ",[206,207,208],"code",{},".claude\u002Fskills\u002F",".",[197,211,213],{"id":212},"available-skills","Available Skills",[215,216,217],"h3",{"id":217},"security-review",[202,219,220,224,225],{},[221,222,223],"strong",{},"Invoke:"," ",[206,226,227],{},"\u002Fsecurity-review",[202,229,230],{},"Comprehensive security checklist adapted for Supabase + PowerSync + Vue 3.",[202,232,233],{},[221,234,235],{},"Sections:",[237,238,239,256,262,272,282,292,298,306],"ol",{},[240,241,242,245,246,249,250,249,253],"li",{},[221,243,244],{},"Secrets management"," - env vars, ",[206,247,248],{},"VITE_SUPABASE_URL",", ",[206,251,252],{},"VITE_SUPABASE_ANON_KEY",[206,254,255],{},"VITE_POWERSYNC_URL",[240,257,258,261],{},[221,259,260],{},"Input validation"," - Zod (frontend) + Postgres constraints\u002FRLS (server); no server-side business validators",[240,263,264,267,268,271],{},[221,265,266],{},"Auth & authorization"," - Supabase JWT \u002F RLS, data isolation by ",[206,269,270],{},"userId",", cookie security",[240,273,274,277,278,281],{},[221,275,276],{},"XSS prevention"," - ",[206,279,280],{},"v-html"," sanitization, Vue auto-escaping",[240,283,284,287,288,291],{},[221,285,286],{},"CSRF protection"," - Supabase JWT \u002F RLS (no traditional CSRF), ",[206,289,290],{},"trustedOrigins",", webhook secrets",[240,293,294,297],{},[221,295,296],{},"Sensitive data exposure"," - logging, error messages, Supabase\u002FPowerSync query results",[240,299,300,277,303],{},[221,301,302],{},"Dependency security",[206,304,305],{},"pnpm audit",[240,307,308,311],{},[221,309,310],{},"Offline queue security"," - localStorage ops, frontend ID trust boundaries",[202,313,314],{},"Includes a pre-deployment checklist with all items to verify before production.",[316,317],"hr",{},[215,319,320],{"id":320},"tdd-workflow",[202,322,323,224,325],{},[221,324,223],{},[206,326,327],{},"\u002Ftdd-workflow",[202,329,330],{},"Test-driven development cycle with Vitest.",[202,332,333],{},[221,334,335],{},"TDD Cycle:",[237,337,338,354,360],{},[240,339,340,343,344,347,348,347,351],{},[221,341,342],{},"RED"," - Write a failing test with ",[206,345,346],{},"describe","\u002F",[206,349,350],{},"it",[206,352,353],{},"expect",[240,355,356,359],{},[221,357,358],{},"GREEN"," - Minimal implementation to pass",[240,361,362,365],{},[221,363,364],{},"REFACTOR"," - Improve code, verify tests still pass",[202,367,368],{},[221,369,370],{},"Includes:",[372,373,374,377,389,392,395],"ul",{},[240,375,376],{},"Project test conventions (file location, structure)",[240,378,379,380,249,383,249,386],{},"Running tests: ",[206,381,382],{},"pnpm test",[206,384,385],{},"--run",[206,387,388],{},"--coverage",[240,390,391],{},"Mocking patterns for PowerSync, Pinia stores, localStorage",[240,393,394],{},"What to test vs what to skip",[240,396,397],{},"80% coverage target on business logic",[316,399],{},[215,401,402],{"id":402},"nuxt4-patterns",[202,404,405,224,407],{},[221,406,223],{},[206,408,409],{},"\u002Fnuxt4-patterns",[202,411,412],{},"Nuxt 4 patterns adapted for Finapp's SPA mode.",[202,414,415],{},[221,416,235],{},[372,418,419,428,446,459,465,480,491],{},[240,420,421,424,425],{},[221,422,423],{},"SPA mode notes"," - what applies and what doesn't with ",[206,426,427],{},"ssr: false",[240,429,430,433,434,437,438,441,442,445],{},[221,431,432],{},"Data fetching"," - PowerSync ",[206,435,436],{},"watchTable"," + supabase-js (not ",[206,439,440],{},"useFetch","), ",[206,443,444],{},"$fetch"," for external APIs",[240,447,448,277,451,454,455,458],{},[221,449,450],{},"Lazy loading",[206,452,453],{},"Lazy"," prefix, ",[206,456,457],{},"v-if"," for deferred chunks, when to use\u002Fskip",[240,460,461,464],{},[221,462,463],{},"Component organization"," - feature grouping, auto-imports, PascalCase",[240,466,467,277,470,454,473,249,476,479],{},[221,468,469],{},"Composables",[206,471,472],{},"use",[206,474,475],{},"shallowRef",[206,477,478],{},"computed"," for derived state",[240,481,482,277,485,487,488],{},[221,483,484],{},"Pinia store pattern",[206,486,475],{},", immutable updates, ",[206,489,490],{},"debouncedPersist",[240,492,493,277,496,499],{},[221,494,495],{},"Build optimization",[206,497,498],{},"manualChunks"," for heavy libs like echarts",[316,501],{},[215,503,504],{"id":504},"e2e-testing",[202,506,507,224,509],{},[221,508,223],{},[206,510,511],{},"\u002Fe2e-testing",[202,513,514],{},"Playwright E2E testing patterns (foundation for future implementation).",[202,516,517],{},[221,518,235],{},[372,520,521,524,527,530,537,540,543],{},[240,522,523],{},"Setup and configuration for port 3050",[240,525,526],{},"Page Object Model pattern",[240,528,529],{},"Test patterns for auth flow and transaction CRUD",[240,531,532,533,536],{},"Locator best practices (",[206,534,535],{},"data-testid"," > CSS selectors)",[240,538,539],{},"SPA-specific waits (client render, PowerSync first sync)",[240,541,542],{},"Flaky test quarantine",[240,544,545],{},"Critical user journeys to cover (auth, transactions, wallets, categories, statistics, offline)",{"title":547,"searchDepth":548,"depth":548,"links":549},"",2,[550,551],{"id":199,"depth":548,"text":200},{"id":212,"depth":548,"text":213,"children":552},[553,555,556,557],{"id":217,"depth":554,"text":217},3,{"id":320,"depth":554,"text":320},{"id":402,"depth":554,"text":402},{"id":504,"depth":554,"text":504},"On-demand guides for security review, TDD, Nuxt 4 patterns, and E2E testing.","md",null,{},{"icon":121},{"title":564,"description":565},"AI Skills","Claude Code skills for Finapp - security review checklist, TDD workflow with Vitest, Nuxt 4 SPA patterns, and Playwright E2E testing.","jLafo8d6GiHfmqogKFyDWHoOma34l6a3lY5N-Ze_3q8",[568,570],{"title":113,"path":114,"stem":115,"description":569,"icon":116,"children":-1},"Specialized AI subagents for code review, TypeScript review, planning, and build fixing.",{"title":123,"path":124,"stem":125,"description":571,"icon":126,"children":-1},"Known gotchas for the local Supabase+PowerSync dev setup and offline-first data layer.",1782114345832]