@oriro/orirocli 0.1.8 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATTRIBUTION.md +53 -45
- package/LICENSE +21 -0
- package/README.md +20 -17
- package/dist/cli.js +4425 -2975
- package/package.json +64 -64
- package/skills/1password/SKILL.md +118 -118
- package/skills/1password/references/cli-examples.md +29 -29
- package/skills/1password/references/get-started.md +21 -21
- package/skills/21stdev/SKILL.md +64 -0
- package/skills/algorithmic-art/LICENSE +21 -21
- package/skills/algorithmic-art/SKILL.md +446 -446
- package/skills/algorithmic-art/templates/generator_template.js +223 -223
- package/skills/algorithmic-art/templates/viewer.html +598 -598
- package/skills/apple-notes/SKILL.md +81 -81
- package/skills/apple-reminders/SKILL.md +122 -122
- package/skills/bear-notes/SKILL.md +111 -111
- package/skills/blogwatcher/SKILL.md +73 -73
- package/skills/blucli/SKILL.md +51 -51
- package/skills/brand-guidelines/LICENSE +21 -21
- package/skills/brand-guidelines/SKILL.md +76 -76
- package/skills/business/biz-analysis/LICENSE +21 -21
- package/skills/business/biz-analysis/SKILL.md +103 -103
- package/skills/business/biz-corporate-strategy/LICENSE +21 -21
- package/skills/business/biz-corporate-strategy/SKILL.md +76 -76
- package/skills/business/biz-customer-success/LICENSE +21 -21
- package/skills/business/biz-customer-success/SKILL.md +55 -55
- package/skills/business/biz-entrepreneurship/LICENSE +21 -21
- package/skills/business/biz-entrepreneurship/SKILL.md +72 -72
- package/skills/business/biz-hr/LICENSE +21 -21
- package/skills/business/biz-hr/SKILL.md +67 -67
- package/skills/business/biz-international/LICENSE +21 -21
- package/skills/business/biz-international/SKILL.md +51 -51
- package/skills/business/biz-leadership/LICENSE +21 -21
- package/skills/business/biz-leadership/SKILL.md +106 -106
- package/skills/business/biz-marketing-strategy/LICENSE +21 -21
- package/skills/business/biz-marketing-strategy/SKILL.md +119 -119
- package/skills/business/biz-negotiation/LICENSE +21 -21
- package/skills/business/biz-negotiation/SKILL.md +152 -152
- package/skills/business/biz-operations/LICENSE +21 -21
- package/skills/business/biz-operations/SKILL.md +74 -74
- package/skills/business/biz-project/LICENSE +21 -21
- package/skills/business/biz-project/SKILL.md +203 -203
- package/skills/business/biz-risk/LICENSE +21 -21
- package/skills/business/biz-risk/SKILL.md +85 -85
- package/skills/business/biz-sales/LICENSE +21 -21
- package/skills/business/biz-sales/SKILL.md +92 -92
- package/skills/business/biz-startup-ops/LICENSE +21 -21
- package/skills/business/biz-startup-ops/SKILL.md +70 -70
- package/skills/business/biz-strategy/LICENSE +21 -21
- package/skills/business/biz-strategy/SKILL.md +233 -233
- package/skills/business/biz-supply-chain-advanced/LICENSE +21 -21
- package/skills/business/biz-supply-chain-advanced/SKILL.md +68 -68
- package/skills/business/fin-chartered-exams/LICENSE +21 -21
- package/skills/business/fin-chartered-exams/SKILL.md +69 -69
- package/skills/camsnap/SKILL.md +49 -49
- package/skills/canvas/SKILL.md +82 -82
- package/skills/canvas-design/LICENSE +21 -21
- package/skills/canvas-design/SKILL.md +140 -140
- package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -94
- package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -93
- package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -93
- package/skills/coding-agent/SKILL.md +146 -146
- package/skills/communication/comm-business-writing/LICENSE +21 -21
- package/skills/communication/comm-business-writing/SKILL.md +67 -67
- package/skills/communication/comm-cross-cultural/LICENSE +21 -21
- package/skills/communication/comm-cross-cultural/SKILL.md +88 -88
- package/skills/communication/comm-journalism/LICENSE +21 -21
- package/skills/communication/comm-journalism/SKILL.md +81 -81
- package/skills/communication/comm-linguistics/LICENSE +21 -21
- package/skills/communication/comm-linguistics/SKILL.md +82 -82
- package/skills/communication/comm-negotiation/LICENSE +21 -21
- package/skills/communication/comm-negotiation/SKILL.md +120 -120
- package/skills/communication/comm-presentations/LICENSE +21 -21
- package/skills/communication/comm-presentations/SKILL.md +93 -93
- package/skills/communication/comm-public-speaking/LICENSE +21 -21
- package/skills/communication/comm-public-speaking/SKILL.md +68 -68
- package/skills/communication/comm-writing/LICENSE +21 -21
- package/skills/communication/comm-writing/SKILL.md +69 -69
- package/skills/craft/ai-engineering/LICENSE +21 -21
- package/skills/craft/ai-engineering/SKILL.md +828 -828
- package/skills/craft/app-builder-guide/LICENSE +21 -21
- package/skills/craft/app-builder-guide/SKILL.md +332 -332
- package/skills/craft/become-an-ai-engineer-26/CONTRIBUTING.md +46 -46
- package/skills/craft/become-an-ai-engineer-26/LICENSE +21 -21
- package/skills/craft/become-an-ai-engineer-26/README.md +270 -270
- package/skills/craft/become-an-ai-engineer-26/SKILL.md +667 -667
- package/skills/craft/become-an-ai-engineer-26/community/BUILDS.md +13 -13
- package/skills/craft/become-an-ai-engineer-26/community/DISCUSSIONS.md +8 -8
- package/skills/craft/become-an-ai-engineer-26/phases/phase-0-mental-models/README.md +14 -14
- package/skills/craft/become-an-ai-engineer-26/phases/phase-0-mental-models/project/TEMPLATE.md +33 -33
- package/skills/craft/become-an-ai-engineer-26/phases/phase-1-first-agent/README.md +25 -25
- package/skills/craft/become-an-ai-engineer-26/phases/phase-1-first-agent/code/raw_loop.py +126 -126
- package/skills/craft/become-an-ai-engineer-26/phases/phase-2-architecture/README.md +17 -17
- package/skills/craft/become-an-ai-engineer-26/phases/phase-3-harness/README.md +17 -17
- package/skills/craft/become-an-ai-engineer-26/phases/phase-4-evals/README.md +21 -21
- package/skills/craft/become-an-ai-engineer-26/phases/phase-4-evals/code/.github/workflows/eval.yml +40 -40
- package/skills/craft/become-an-ai-engineer-26/phases/phase-5-production/README.md +16 -16
- package/skills/craft/become-an-ai-engineer-26/projects/1-mobile-app-slm/README.md +11 -11
- package/skills/craft/become-an-ai-engineer-26/projects/2-self-improving-coder/README.md +11 -11
- package/skills/craft/become-an-ai-engineer-26/projects/3-video-editor-agent/README.md +11 -11
- package/skills/craft/become-an-ai-engineer-26/projects/4-personal-life-os/README.md +12 -12
- package/skills/craft/become-an-ai-engineer-26/projects/5-enterprise-workflow/README.md +12 -12
- package/skills/craft/become-an-ai-engineer-26/references/benchmark-numbers.md +41 -41
- package/skills/craft/become-an-ai-engineer-26/references/mhc-stable-training.md +73 -73
- package/skills/craft/become-an-ai-engineer-26/references/stack-decisions.md +37 -37
- package/skills/craft/become-an-ai-engineer-26/references/yarn-context-extension.md +123 -123
- package/skills/craft/codex-result-handling/LICENSE +21 -21
- package/skills/craft/codex-result-handling/SKILL.md +26 -26
- package/skills/craft/debug-and-build-methodology/LICENSE +21 -21
- package/skills/craft/debug-and-build-methodology/SKILL.md +432 -432
- package/skills/craft/design/LICENSE +21 -21
- package/skills/craft/design/SKILL.md +274 -274
- package/skills/craft/dev/LICENSE +21 -21
- package/skills/craft/dev/SKILL.md +12 -12
- package/skills/craft/dev/release.md +85 -85
- package/skills/craft/dev/roll.md +50 -50
- package/skills/craft/doc-coauthoring/LICENSE +21 -21
- package/skills/craft/doc-coauthoring/SKILL.md +397 -397
- package/skills/craft/focus/LICENSE +21 -21
- package/skills/craft/focus/SKILL.md +432 -432
- package/skills/craft/focus/UPSTREAM_README.md +233 -233
- package/skills/craft/gh/LICENSE +21 -21
- package/skills/craft/gh/SKILL.md +84 -84
- package/skills/craft/gh-skill/LICENSE +21 -21
- package/skills/craft/gh-skill/SKILL.md +121 -121
- package/skills/craft/godmode/LICENSE +21 -21
- package/skills/craft/godmode/SKILL.md +87 -87
- package/skills/craft/godmode/references/android-launch.md +680 -680
- package/skills/craft/godmode/references/data-gcp.md +1038 -1038
- package/skills/craft/godmode/references/expo-eas.md +816 -816
- package/skills/craft/godmode/references/ios-launch.md +734 -734
- package/skills/craft/google-ai-latest/LICENSE +21 -21
- package/skills/craft/google-ai-latest/SKILL.md +682 -682
- package/skills/craft/gpt-5-4-prompting/LICENSE +21 -21
- package/skills/craft/gpt-5-4-prompting/SKILL.md +63 -63
- package/skills/craft/gpt-5-4-prompting/references/codex-prompt-antipatterns.md +101 -101
- package/skills/craft/gpt-5-4-prompting/references/codex-prompt-recipes.md +150 -150
- package/skills/craft/gpt-5-4-prompting/references/prompt-blocks.md +172 -172
- package/skills/craft/grill-me/LICENSE +21 -21
- package/skills/craft/grill-me/SKILL.md +13 -13
- package/skills/craft/idea-to-deploy/LICENSE +21 -21
- package/skills/craft/idea-to-deploy/SKILL.md +292 -292
- package/skills/craft/idea-to-deploy/references/auth-playbook.md +195 -195
- package/skills/craft/idea-to-deploy/references/gcp-deployment.md +268 -268
- package/skills/craft/idea-to-deploy/references/stack-selection.md +117 -117
- package/skills/craft/image-generation-engineer/LICENSE +21 -21
- package/skills/craft/image-generation-engineer/SKILL.md +183 -183
- package/skills/craft/image-generation-engineer/references/architectures.md +260 -260
- package/skills/craft/image-generation-engineer/references/foundations.md +107 -107
- package/skills/craft/image-generation-engineer/references/inference-and-serving.md +253 -253
- package/skills/craft/image-generation-engineer/references/training.md +149 -149
- package/skills/craft/marketing/LICENSE +21 -21
- package/skills/craft/marketing/SKILL.md +1954 -1954
- package/skills/craft/master-architect/LICENSE +21 -21
- package/skills/craft/master-architect/SKILL.md +361 -361
- package/skills/craft/master-architect/references/ai-ml.md +317 -317
- package/skills/craft/master-architect/references/architecture.md +268 -268
- package/skills/craft/master-architect/references/auth-playbook.md +195 -195
- package/skills/craft/master-architect/references/cloud.md +323 -323
- package/skills/craft/master-architect/references/cyber.md +839 -839
- package/skills/craft/master-architect/references/data-eng.md +366 -366
- package/skills/craft/master-architect/references/devops.md +550 -550
- package/skills/craft/master-architect/references/gcp-deployment.md +268 -268
- package/skills/craft/master-architect/references/languages.md +748 -748
- package/skills/craft/master-architect/references/legacy.md +240 -240
- package/skills/craft/master-architect/references/mobile.md +447 -447
- package/skills/craft/master-architect/references/patterns.md +451 -451
- package/skills/craft/master-architect/references/saas-patterns.md +379 -379
- package/skills/craft/master-architect/references/sdlc.md +349 -349
- package/skills/craft/master-architect/references/stack-selection.md +117 -117
- package/skills/craft/oriro-ui-2026/LICENSE +21 -21
- package/skills/craft/oriro-ui-2026/SKILL.md +329 -329
- package/skills/craft/playwright-cli/LICENSE +21 -21
- package/skills/craft/playwright-cli/SKILL.md +393 -393
- package/skills/craft/playwright-cli/references/element-attributes.md +23 -23
- package/skills/craft/playwright-cli/references/playwright-tests.md +39 -39
- package/skills/craft/playwright-cli/references/request-mocking.md +87 -87
- package/skills/craft/playwright-cli/references/running-code.md +240 -240
- package/skills/craft/playwright-cli/references/session-management.md +226 -226
- package/skills/craft/playwright-cli/references/spec-driven-testing.md +312 -312
- package/skills/craft/playwright-cli/references/storage-state.md +275 -275
- package/skills/craft/playwright-cli/references/test-generation.md +134 -134
- package/skills/craft/playwright-cli/references/tracing.md +142 -142
- package/skills/craft/playwright-cli/references/video-recording.md +150 -150
- package/skills/craft/remotion-best-practices/LICENSE +21 -21
- package/skills/craft/remotion-best-practices/SKILL.md +345 -345
- package/skills/craft/remotion-best-practices/rules/3d.md +86 -86
- package/skills/craft/remotion-best-practices/rules/assets/charts-bar-chart.tsx +165 -165
- package/skills/craft/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +89 -89
- package/skills/craft/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +101 -101
- package/skills/craft/remotion-best-practices/rules/audio-visualization.md +195 -195
- package/skills/craft/remotion-best-practices/rules/audio.md +167 -167
- package/skills/craft/remotion-best-practices/rules/calculate-metadata.md +118 -118
- package/skills/craft/remotion-best-practices/rules/compositions.md +132 -132
- package/skills/craft/remotion-best-practices/rules/display-captions.md +176 -176
- package/skills/craft/remotion-best-practices/rules/ffmpeg.md +34 -34
- package/skills/craft/remotion-best-practices/rules/get-audio-duration.md +58 -58
- package/skills/craft/remotion-best-practices/rules/get-video-dimensions.md +68 -68
- package/skills/craft/remotion-best-practices/rules/get-video-duration.md +60 -60
- package/skills/craft/remotion-best-practices/rules/gifs.md +135 -135
- package/skills/craft/remotion-best-practices/rules/google-fonts.md +72 -72
- package/skills/craft/remotion-best-practices/rules/html-in-canvas.md +122 -122
- package/skills/craft/remotion-best-practices/rules/images.md +67 -67
- package/skills/craft/remotion-best-practices/rules/import-srt-captions.md +69 -69
- package/skills/craft/remotion-best-practices/rules/light-leaks.md +73 -73
- package/skills/craft/remotion-best-practices/rules/local-fonts.md +65 -65
- package/skills/craft/remotion-best-practices/rules/lottie.md +67 -67
- package/skills/craft/remotion-best-practices/rules/maplibre.md +441 -441
- package/skills/craft/remotion-best-practices/rules/measuring-dom-nodes.md +34 -34
- package/skills/craft/remotion-best-practices/rules/measuring-text.md +140 -140
- package/skills/craft/remotion-best-practices/rules/parameters.md +109 -109
- package/skills/craft/remotion-best-practices/rules/sequencing.md +144 -144
- package/skills/craft/remotion-best-practices/rules/sfx.md +30 -30
- package/skills/craft/remotion-best-practices/rules/silence-detection.md +73 -73
- package/skills/craft/remotion-best-practices/rules/subtitles.md +36 -36
- package/skills/craft/remotion-best-practices/rules/tailwind.md +11 -11
- package/skills/craft/remotion-best-practices/rules/text-animations.md +20 -20
- package/skills/craft/remotion-best-practices/rules/timing.md +130 -130
- package/skills/craft/remotion-best-practices/rules/transcribe-captions.md +70 -70
- package/skills/craft/remotion-best-practices/rules/transitions.md +193 -193
- package/skills/craft/remotion-best-practices/rules/transparent-videos.md +102 -102
- package/skills/craft/remotion-best-practices/rules/trimming.md +51 -51
- package/skills/craft/remotion-best-practices/rules/videos.md +169 -169
- package/skills/craft/remotion-best-practices/rules/voiceover.md +94 -94
- package/skills/craft/supabase-postgres-best-practices/CHANGELOG.md +25 -25
- package/skills/craft/supabase-postgres-best-practices/LICENSE +21 -21
- package/skills/craft/supabase-postgres-best-practices/SKILL.md +69 -69
- package/skills/craft/supabase-postgres-best-practices/references/_contributing.md +166 -166
- package/skills/craft/supabase-postgres-best-practices/references/_sections.md +47 -47
- package/skills/craft/supabase-postgres-best-practices/references/_template.md +34 -34
- package/skills/craft/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -55
- package/skills/craft/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -49
- package/skills/craft/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -46
- package/skills/craft/supabase-postgres-best-practices/references/conn-limits.md +44 -44
- package/skills/craft/supabase-postgres-best-practices/references/conn-pooling.md +41 -41
- package/skills/craft/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -46
- package/skills/craft/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -54
- package/skills/craft/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -53
- package/skills/craft/supabase-postgres-best-practices/references/data-pagination.md +50 -50
- package/skills/craft/supabase-postgres-best-practices/references/data-upsert.md +50 -50
- package/skills/craft/supabase-postgres-best-practices/references/lock-advisory.md +56 -56
- package/skills/craft/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -68
- package/skills/craft/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -50
- package/skills/craft/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -54
- package/skills/craft/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -45
- package/skills/craft/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -55
- package/skills/craft/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -55
- package/skills/craft/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -44
- package/skills/craft/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -40
- package/skills/craft/supabase-postgres-best-practices/references/query-index-types.md +48 -48
- package/skills/craft/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -43
- package/skills/craft/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -45
- package/skills/craft/supabase-postgres-best-practices/references/schema-constraints.md +80 -80
- package/skills/craft/supabase-postgres-best-practices/references/schema-data-types.md +46 -46
- package/skills/craft/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -59
- package/skills/craft/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -55
- package/skills/craft/supabase-postgres-best-practices/references/schema-partitioning.md +55 -55
- package/skills/craft/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -61
- package/skills/craft/supabase-postgres-best-practices/references/security-privileges.md +54 -54
- package/skills/craft/supabase-postgres-best-practices/references/security-rls-basics.md +50 -50
- package/skills/craft/supabase-postgres-best-practices/references/security-rls-performance.md +63 -63
- package/skills/craft/uipm-banner-design/LICENSE +21 -21
- package/skills/craft/uipm-banner-design/SKILL.md +201 -201
- package/skills/craft/uipm-banner-design/references/banner-sizes-and-styles.md +129 -129
- package/skills/craft/uipm-brand/LICENSE +21 -21
- package/skills/craft/uipm-brand/SKILL.md +104 -104
- package/skills/craft/uipm-brand/references/approval-checklist.md +184 -184
- package/skills/craft/uipm-brand/references/asset-organization.md +167 -167
- package/skills/craft/uipm-brand/references/brand-guideline-template.md +161 -161
- package/skills/craft/uipm-brand/references/color-palette-management.md +203 -203
- package/skills/craft/uipm-brand/references/consistency-checklist.md +105 -105
- package/skills/craft/uipm-brand/references/logo-usage-rules.md +204 -204
- package/skills/craft/uipm-brand/references/messaging-framework.md +91 -91
- package/skills/craft/uipm-brand/references/typography-specifications.md +265 -265
- package/skills/craft/uipm-brand/references/update.md +128 -128
- package/skills/craft/uipm-brand/references/visual-identity.md +109 -109
- package/skills/craft/uipm-brand/references/voice-framework.md +99 -99
- package/skills/craft/uipm-brand/scripts/extract-colors.cjs +333 -333
- package/skills/craft/uipm-brand/scripts/inject-brand-context.cjs +324 -324
- package/skills/craft/uipm-brand/scripts/sync-brand-to-tokens.cjs +269 -269
- package/skills/craft/uipm-brand/scripts/validate-asset.cjs +361 -361
- package/skills/craft/uipm-brand/templates/brand-guidelines-starter.md +280 -280
- package/skills/craft/uipm-design/LICENSE +21 -21
- package/skills/craft/uipm-design/SKILL.md +305 -305
- package/skills/craft/uipm-design/data/cip/deliverables.csv +50 -50
- package/skills/craft/uipm-design/data/cip/industries.csv +20 -20
- package/skills/craft/uipm-design/data/cip/mockup-contexts.csv +20 -20
- package/skills/craft/uipm-design/data/cip/styles.csv +20 -20
- package/skills/craft/uipm-design/data/icon/styles.csv +16 -16
- package/skills/craft/uipm-design/data/logo/colors.csv +56 -56
- package/skills/craft/uipm-design/data/logo/industries.csv +56 -56
- package/skills/craft/uipm-design/data/logo/styles.csv +56 -56
- package/skills/craft/uipm-design/references/banner-sizes-and-styles.md +129 -129
- package/skills/craft/uipm-design/references/cip-deliverable-guide.md +111 -111
- package/skills/craft/uipm-design/references/cip-design.md +121 -121
- package/skills/craft/uipm-design/references/cip-prompt-engineering.md +94 -94
- package/skills/craft/uipm-design/references/cip-style-guide.md +76 -76
- package/skills/craft/uipm-design/references/design-routing.md +226 -226
- package/skills/craft/uipm-design/references/icon-design.md +122 -122
- package/skills/craft/uipm-design/references/logo-color-psychology.md +113 -113
- package/skills/craft/uipm-design/references/logo-design.md +92 -92
- package/skills/craft/uipm-design/references/logo-prompt-engineering.md +176 -176
- package/skills/craft/uipm-design/references/logo-style-guide.md +129 -129
- package/skills/craft/uipm-design/references/slides-copywriting-formulas.md +92 -92
- package/skills/craft/uipm-design/references/slides-create.md +5 -5
- package/skills/craft/uipm-design/references/slides-html-template.md +374 -374
- package/skills/craft/uipm-design/references/slides-layout-patterns.md +155 -155
- package/skills/craft/uipm-design/references/slides-strategies.md +97 -97
- package/skills/craft/uipm-design/references/slides.md +42 -42
- package/skills/craft/uipm-design/references/social-photos-design.md +353 -353
- package/skills/craft/uipm-design/scripts/cip/core.py +215 -215
- package/skills/craft/uipm-design/scripts/cip/generate.py +484 -484
- package/skills/craft/uipm-design/scripts/cip/render-html.py +424 -424
- package/skills/craft/uipm-design/scripts/cip/search.py +127 -127
- package/skills/craft/uipm-design/scripts/icon/generate.py +487 -487
- package/skills/craft/uipm-design/scripts/logo/core.py +175 -175
- package/skills/craft/uipm-design/scripts/logo/generate.py +362 -362
- package/skills/craft/uipm-design/scripts/logo/search.py +114 -114
- package/skills/craft/uipm-design-system/LICENSE +21 -21
- package/skills/craft/uipm-design-system/SKILL.md +255 -255
- package/skills/craft/uipm-design-system/data/slide-backgrounds.csv +11 -11
- package/skills/craft/uipm-design-system/data/slide-charts.csv +26 -26
- package/skills/craft/uipm-design-system/data/slide-color-logic.csv +14 -14
- package/skills/craft/uipm-design-system/data/slide-copy.csv +26 -26
- package/skills/craft/uipm-design-system/data/slide-layout-logic.csv +16 -16
- package/skills/craft/uipm-design-system/data/slide-layouts.csv +26 -26
- package/skills/craft/uipm-design-system/data/slide-strategies.csv +16 -16
- package/skills/craft/uipm-design-system/data/slide-typography.csv +15 -15
- package/skills/craft/uipm-design-system/references/component-specs.md +236 -236
- package/skills/craft/uipm-design-system/references/component-tokens.md +214 -214
- package/skills/craft/uipm-design-system/references/primitive-tokens.md +199 -199
- package/skills/craft/uipm-design-system/references/semantic-tokens.md +215 -215
- package/skills/craft/uipm-design-system/references/states-and-variants.md +243 -243
- package/skills/craft/uipm-design-system/references/tailwind-integration.md +257 -257
- package/skills/craft/uipm-design-system/references/token-architecture.md +226 -226
- package/skills/craft/uipm-design-system/scripts/embed-tokens.cjs +97 -97
- package/skills/craft/uipm-design-system/scripts/fetch-background.py +317 -317
- package/skills/craft/uipm-design-system/scripts/generate-slide.py +753 -753
- package/skills/craft/uipm-design-system/scripts/generate-tokens.cjs +213 -213
- package/skills/craft/uipm-design-system/scripts/html-token-validator.py +327 -327
- package/skills/craft/uipm-design-system/scripts/search-slides.py +218 -218
- package/skills/craft/uipm-design-system/scripts/slide-token-validator.py +35 -35
- package/skills/craft/uipm-design-system/scripts/slide_search_core.py +453 -453
- package/skills/craft/uipm-design-system/scripts/validate-tokens.cjs +254 -254
- package/skills/craft/uipm-design-system/templates/design-tokens-starter.json +143 -143
- package/skills/craft/uipm-slides/LICENSE +21 -21
- package/skills/craft/uipm-slides/SKILL.md +45 -45
- package/skills/craft/uipm-slides/references/copywriting-formulas.md +92 -92
- package/skills/craft/uipm-slides/references/create.md +5 -5
- package/skills/craft/uipm-slides/references/html-template.md +374 -374
- package/skills/craft/uipm-slides/references/layout-patterns.md +155 -155
- package/skills/craft/uipm-slides/references/slide-strategies.md +97 -97
- package/skills/craft/uipm-ui-ux-pro-max/LICENSE +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/SKILL.md +678 -678
- package/skills/craft/uipm-ui-ux-pro-max/data/_sync_all.py +414 -414
- package/skills/craft/uipm-ui-ux-pro-max/data/app-interface.csv +30 -30
- package/skills/craft/uipm-ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/craft/uipm-ui-ux-pro-max/data/colors.csv +161 -161
- package/skills/craft/uipm-ui-ux-pro-max/data/design.csv +1775 -1775
- package/skills/craft/uipm-ui-ux-pro-max/data/draft.csv +1778 -1778
- package/skills/craft/uipm-ui-ux-pro-max/data/google-fonts.csv +1924 -1924
- package/skills/craft/uipm-ui-ux-pro-max/data/icons.csv +105 -105
- package/skills/craft/uipm-ui-ux-pro-max/data/landing.csv +35 -35
- package/skills/craft/uipm-ui-ux-pro-max/data/products.csv +162 -162
- package/skills/craft/uipm-ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/angular.csv +51 -51
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/laravel.csv +51 -51
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/threejs.csv +54 -54
- package/skills/craft/uipm-ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/craft/uipm-ui-ux-pro-max/data/styles.csv +85 -85
- package/skills/craft/uipm-ui-ux-pro-max/data/typography.csv +74 -74
- package/skills/craft/uipm-ui-ux-pro-max/data/ui-reasoning.csv +162 -162
- package/skills/craft/uipm-ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/craft/uipm-ui-ux-pro-max/scripts/core.py +262 -262
- package/skills/craft/uipm-ui-ux-pro-max/scripts/design_system.py +1148 -1148
- package/skills/craft/uipm-ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/craft/uipm-ui-ux-pro-max/templates/base/quick-reference.md +297 -297
- package/skills/craft/uipm-ui-ux-pro-max/templates/base/skill-content.md +375 -375
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/agent.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/augment.json +18 -18
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/claude.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/codebuddy.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/codex.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/continue.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/copilot.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/cursor.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/droid.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/gemini.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/kilocode.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/kiro.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/opencode.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/qoder.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/roocode.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/trae.json +21 -21
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/warp.json +18 -18
- package/skills/craft/uipm-ui-ux-pro-max/templates/platforms/windsurf.json +21 -21
- package/skills/craft/vercel-optimize/AGENTS.md +48 -48
- package/skills/craft/vercel-optimize/CONTRIBUTING.md +41 -41
- package/skills/craft/vercel-optimize/LICENSE +21 -21
- package/skills/craft/vercel-optimize/README.md +91 -91
- package/skills/craft/vercel-optimize/SKILL.md +325 -325
- package/skills/craft/vercel-optimize/lib/auth-route.mjs +23 -23
- package/skills/craft/vercel-optimize/lib/budget-summary.mjs +208 -208
- package/skills/craft/vercel-optimize/lib/citations.mjs +147 -147
- package/skills/craft/vercel-optimize/lib/cost-coverage.mjs +162 -162
- package/skills/craft/vercel-optimize/lib/dedup-recs.mjs +340 -340
- package/skills/craft/vercel-optimize/lib/deep-dive.mjs +371 -371
- package/skills/craft/vercel-optimize/lib/display-labels.mjs +219 -219
- package/skills/craft/vercel-optimize/lib/extract-claims.mjs +640 -640
- package/skills/craft/vercel-optimize/lib/framework-support.mjs +69 -69
- package/skills/craft/vercel-optimize/lib/gates/build-minutes-fanout.mjs +73 -73
- package/skills/craft/vercel-optimize/lib/gates/cold-start.mjs +72 -72
- package/skills/craft/vercel-optimize/lib/gates/contract.mjs +82 -82
- package/skills/craft/vercel-optimize/lib/gates/cwv-poor.mjs +95 -95
- package/skills/craft/vercel-optimize/lib/gates/external-api-slow.mjs +60 -60
- package/skills/craft/vercel-optimize/lib/gates/hard-gates.mjs +70 -70
- package/skills/craft/vercel-optimize/lib/gates/index.mjs +45 -45
- package/skills/craft/vercel-optimize/lib/gates/isr-overrevalidation.mjs +62 -62
- package/skills/craft/vercel-optimize/lib/gates/middleware-heavy.mjs +53 -53
- package/skills/craft/vercel-optimize/lib/gates/observability-events-attribution.mjs +58 -58
- package/skills/craft/vercel-optimize/lib/gates/platform-bot-protection.mjs +123 -123
- package/skills/craft/vercel-optimize/lib/gates/platform-fluid-compute.mjs +94 -94
- package/skills/craft/vercel-optimize/lib/gates/region-misconfig.mjs +71 -71
- package/skills/craft/vercel-optimize/lib/gates/route-errors.mjs +95 -95
- package/skills/craft/vercel-optimize/lib/gates/scanner-driven.mjs +150 -150
- package/skills/craft/vercel-optimize/lib/gates/select-candidates.mjs +137 -137
- package/skills/craft/vercel-optimize/lib/gates/slow-route.mjs +97 -97
- package/skills/craft/vercel-optimize/lib/gates/types.d.ts +38 -38
- package/skills/craft/vercel-optimize/lib/gates/uncached-route.mjs +103 -103
- package/skills/craft/vercel-optimize/lib/gates/usage-spike-triage.mjs +122 -122
- package/skills/craft/vercel-optimize/lib/grade-recommendation.mjs +170 -170
- package/skills/craft/vercel-optimize/lib/impact-label.mjs +128 -128
- package/skills/craft/vercel-optimize/lib/impact-magnitude.mjs +66 -66
- package/skills/craft/vercel-optimize/lib/investigation-brief.mjs +751 -751
- package/skills/craft/vercel-optimize/lib/observation-safety.mjs +217 -217
- package/skills/craft/vercel-optimize/lib/project-facts.mjs +101 -101
- package/skills/craft/vercel-optimize/lib/queries.mjs +333 -333
- package/skills/craft/vercel-optimize/lib/reconcile-candidates.mjs +388 -388
- package/skills/craft/vercel-optimize/lib/render-report.mjs +1065 -1065
- package/skills/craft/vercel-optimize/lib/repo-root.mjs +97 -97
- package/skills/craft/vercel-optimize/lib/route-normalize.mjs +224 -224
- package/skills/craft/vercel-optimize/lib/sanitizers/bot-protection-certainty.mjs +56 -56
- package/skills/craft/vercel-optimize/lib/sanitizers/cache-tag-invalidation-certainty.mjs +33 -33
- package/skills/craft/vercel-optimize/lib/sanitizers/count-correct.mjs +53 -53
- package/skills/craft/vercel-optimize/lib/sanitizers/function-duration-invocations.mjs +32 -32
- package/skills/craft/vercel-optimize/lib/sanitizers/index.mjs +87 -87
- package/skills/craft/vercel-optimize/lib/sanitizers/middleware-conflict.mjs +37 -37
- package/skills/craft/vercel-optimize/lib/sanitizers/missing-citation.mjs +16 -16
- package/skills/craft/vercel-optimize/lib/sanitizers/pre-release.mjs +75 -75
- package/skills/craft/vercel-optimize/lib/sanitizers/rate-limit.mjs +73 -73
- package/skills/craft/vercel-optimize/lib/sanitizers/rendering-mode-mislabel.mjs +42 -42
- package/skills/craft/vercel-optimize/lib/sanitizers/undeclared-dep.mjs +110 -110
- package/skills/craft/vercel-optimize/lib/sanitizers/vercel-directive-strip.mjs +37 -37
- package/skills/craft/vercel-optimize/lib/sanitizers/window-units.mjs +26 -26
- package/skills/craft/vercel-optimize/lib/scanners/cache-components-suspense-dedupe.mjs +114 -114
- package/skills/craft/vercel-optimize/lib/scanners/edge-heavy-import.mjs +102 -102
- package/skills/craft/vercel-optimize/lib/scanners/force-dynamic.mjs +39 -39
- package/skills/craft/vercel-optimize/lib/scanners/headers-in-page.mjs +43 -43
- package/skills/craft/vercel-optimize/lib/scanners/index.mjs +35 -35
- package/skills/craft/vercel-optimize/lib/scanners/large-static-asset.mjs +93 -93
- package/skills/craft/vercel-optimize/lib/scanners/max-age-without-s-maxage.mjs +47 -47
- package/skills/craft/vercel-optimize/lib/scanners/middleware-broad-matcher.mjs +53 -53
- package/skills/craft/vercel-optimize/lib/scanners/missing-cache-headers.mjs +97 -97
- package/skills/craft/vercel-optimize/lib/scanners/prisma-include-tree.mjs +39 -39
- package/skills/craft/vercel-optimize/lib/scanners/region-pin-in-config.mjs +89 -89
- package/skills/craft/vercel-optimize/lib/scanners/source-maps-production.mjs +33 -33
- package/skills/craft/vercel-optimize/lib/scanners/sveltekit-prerender-missing.mjs +47 -47
- package/skills/craft/vercel-optimize/lib/scanners/turbo-force-bypass.mjs +136 -136
- package/skills/craft/vercel-optimize/lib/scanners/unoptimized-image.mjs +127 -127
- package/skills/craft/vercel-optimize/lib/scanners/use-cache-date-stamp.mjs +112 -112
- package/skills/craft/vercel-optimize/lib/support-topics.mjs +365 -365
- package/skills/craft/vercel-optimize/lib/throttle.mjs +280 -280
- package/skills/craft/vercel-optimize/lib/util.mjs +17 -17
- package/skills/craft/vercel-optimize/lib/vercel.mjs +855 -855
- package/skills/craft/vercel-optimize/lib/verify-claim.mjs +1843 -1843
- package/skills/craft/vercel-optimize/lib/workspace-resolver.mjs +552 -552
- package/skills/craft/vercel-optimize/metadata.json +14 -14
- package/skills/craft/vercel-optimize/references/candidates.md +176 -176
- package/skills/craft/vercel-optimize/references/data-collection.md +224 -224
- package/skills/craft/vercel-optimize/references/docs-library.json +683 -683
- package/skills/craft/vercel-optimize/references/doctrine.md +108 -108
- package/skills/craft/vercel-optimize/references/observability-plus.md +109 -109
- package/skills/craft/vercel-optimize/references/playbooks/README.md +57 -57
- package/skills/craft/vercel-optimize/references/playbooks/ai-application.md +32 -32
- package/skills/craft/vercel-optimize/references/playbooks/api-service.md +30 -30
- package/skills/craft/vercel-optimize/references/playbooks/content-site.md +30 -30
- package/skills/craft/vercel-optimize/references/playbooks/ecommerce.md +30 -30
- package/skills/craft/vercel-optimize/references/playbooks/marketing.md +30 -30
- package/skills/craft/vercel-optimize/references/playbooks/saas.md +31 -31
- package/skills/craft/vercel-optimize/references/playbooks/sveltekit.md +75 -75
- package/skills/craft/vercel-optimize/references/recommendations.md +214 -214
- package/skills/craft/vercel-optimize/references/scanner-patterns.md +266 -266
- package/skills/craft/vercel-optimize/references/scoring.md +208 -208
- package/skills/craft/vercel-optimize/references/support-topics/README.md +50 -50
- package/skills/craft/vercel-optimize/references/support-topics/astro-edge-middleware-scope.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/astro-output-mode-and-isr.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/auth-preserving-parallelization.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/bot-protection-product-guardrails.md +32 -32
- package/skills/craft/vercel-optimize/references/support-topics/build-minutes-monorepo-fanout.md +32 -32
- package/skills/craft/vercel-optimize/references/support-topics/cache-components-static-shell-boundaries.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/cache-components-suspense-dedupe-pitfall.md +32 -32
- package/skills/craft/vercel-optimize/references/support-topics/cdn-cache-auth-safety.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/cold-start-initialization-bundle.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/core-web-vitals-client-bottlenecks.md +33 -33
- package/skills/craft/vercel-optimize/references/support-topics/database-egress-pooling-region.md +32 -32
- package/skills/craft/vercel-optimize/references/support-topics/dynamic-rendering-traps.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/external-api-critical-path-platform.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/external-api-critical-path.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/fast-data-transfer-payloads.md +26 -26
- package/skills/craft/vercel-optimize/references/support-topics/fluid-compute-caveats.md +26 -26
- package/skills/craft/vercel-optimize/references/support-topics/function-duration-io-and-after.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/function-invocation-reduction.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/function-region-misconfiguration-ttfb.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/image-optimization-cost-control.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/isr-revalidation-static-generation.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/middleware-proxy-edge-cost.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/next-fetch-revalidate-floor.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/next-font-cls-self-hosting.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/next-heavy-ui-lazy-load-boundaries.md +28 -28
- package/skills/craft/vercel-optimize/references/support-topics/next-image-lcp-preload-sizes.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/next-route-handler-get-cache-defaults.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/next-script-third-party-strategy.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/nextjs-version-cache-semantics.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/not-found-catchall-request-waste.md +33 -33
- package/skills/craft/vercel-optimize/references/support-topics/nuxt-route-rules-cache-isr.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/observability-events-cost-attribution.md +27 -27
- package/skills/craft/vercel-optimize/references/support-topics/post-response-work-waituntil.md +26 -26
- package/skills/craft/vercel-optimize/references/support-topics/route-error-durable-offload.md +33 -33
- package/skills/craft/vercel-optimize/references/support-topics/route-error-runtime-limits.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/runtime-cache-reusable-data.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/sveltekit-isr-prerender-safety.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/sveltekit-split-cold-start-tradeoff.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/usage-spike-triage.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/use-cache-date-stamp-isr-write-amplifier.md +31 -31
- package/skills/craft/vercel-optimize/references/support-topics/use-cache-remote-shared-origin-data.md +30 -30
- package/skills/craft/vercel-optimize/references/support-topics/workflow-resumable-stream-routes.md +32 -32
- package/skills/craft/vercel-optimize/references/verification.md +102 -102
- package/skills/craft/vercel-optimize/references/voice.md +76 -76
- package/skills/craft/vercel-optimize/scripts/budget-summary.mjs +58 -58
- package/skills/craft/vercel-optimize/scripts/build-docs.mjs +76 -76
- package/skills/craft/vercel-optimize/scripts/check-citations.mjs +91 -91
- package/skills/craft/vercel-optimize/scripts/check-docs-fresh.mjs +100 -100
- package/skills/craft/vercel-optimize/scripts/collect-signals.mjs +638 -638
- package/skills/craft/vercel-optimize/scripts/collect-sub-agent-outputs.mjs +306 -306
- package/skills/craft/vercel-optimize/scripts/deep-dive.mjs +358 -358
- package/skills/craft/vercel-optimize/scripts/gate-investigations.mjs +178 -178
- package/skills/craft/vercel-optimize/scripts/merge-signals.mjs +203 -203
- package/skills/craft/vercel-optimize/scripts/prepare-investigation-brief.mjs +249 -249
- package/skills/craft/vercel-optimize/scripts/reconcile-candidates.mjs +69 -69
- package/skills/craft/vercel-optimize/scripts/render-report.mjs +462 -462
- package/skills/craft/vercel-optimize/scripts/scan-codebase.mjs +361 -361
- package/skills/craft/vercel-optimize/scripts/verify-and-regen.mjs +379 -379
- package/skills/craft/vercel-optimize/scripts/verify-finding.mjs +21 -21
- package/skills/craft/web-design-guidelines/LICENSE +21 -21
- package/skills/craft/web-design-guidelines/SKILL.md +43 -43
- package/skills/craft/zero-to-live/LICENSE +21 -21
- package/skills/craft/zero-to-live/SKILL.md +422 -422
- package/skills/creative/creative-3d-modeling/LICENSE +21 -21
- package/skills/creative/creative-3d-modeling/SKILL.md +70 -70
- package/skills/creative/creative-architecture/LICENSE +21 -21
- package/skills/creative/creative-architecture/SKILL.md +94 -94
- package/skills/creative/creative-design-principles/LICENSE +21 -21
- package/skills/creative/creative-design-principles/SKILL.md +95 -95
- package/skills/creative/creative-fashion-advanced/LICENSE +21 -21
- package/skills/creative/creative-fashion-advanced/SKILL.md +68 -68
- package/skills/creative/creative-fashion-design/LICENSE +21 -21
- package/skills/creative/creative-fashion-design/SKILL.md +66 -66
- package/skills/creative/creative-game-design/LICENSE +21 -21
- package/skills/creative/creative-game-design/SKILL.md +77 -77
- package/skills/creative/creative-industrial-design/LICENSE +21 -21
- package/skills/creative/creative-industrial-design/SKILL.md +57 -57
- package/skills/creative/creative-interior-design/LICENSE +21 -21
- package/skills/creative/creative-interior-design/SKILL.md +59 -59
- package/skills/creative/creative-music-theory/LICENSE +21 -21
- package/skills/creative/creative-music-theory/SKILL.md +98 -98
- package/skills/creative/creative-photography/LICENSE +21 -21
- package/skills/creative/creative-photography/SKILL.md +87 -87
- package/skills/creative/creative-textile-science/LICENSE +21 -21
- package/skills/creative/creative-textile-science/SKILL.md +67 -67
- package/skills/creative/creative-ux/LICENSE +21 -21
- package/skills/creative/creative-ux/SKILL.md +81 -81
- package/skills/creative/creative-video/LICENSE +21 -21
- package/skills/creative/creative-video/SKILL.md +84 -84
- package/skills/creative/creative-writing-craft/LICENSE +21 -21
- package/skills/creative/creative-writing-craft/SKILL.md +91 -91
- package/skills/diagram-maker/SKILL.md +56 -56
- package/skills/diagram-maker/references/excalidraw-patterns.md +85 -85
- package/skills/diagram-maker/references/svg-template.md +112 -112
- package/skills/discord/SKILL.md +140 -140
- package/skills/education/edu-adult-learning/LICENSE +21 -21
- package/skills/education/edu-adult-learning/SKILL.md +81 -81
- package/skills/education/edu-africa-multilingual/LICENSE +21 -21
- package/skills/education/edu-africa-multilingual/SKILL.md +55 -55
- package/skills/education/edu-arabic/LICENSE +21 -21
- package/skills/education/edu-arabic/SKILL.md +60 -60
- package/skills/education/edu-australia-nz/LICENSE +21 -21
- package/skills/education/edu-australia-nz/SKILL.md +48 -48
- package/skills/education/edu-china-mandarin/LICENSE +21 -21
- package/skills/education/edu-china-mandarin/SKILL.md +58 -58
- package/skills/education/edu-critical-thinking/LICENSE +21 -21
- package/skills/education/edu-critical-thinking/SKILL.md +86 -86
- package/skills/education/edu-curriculum/LICENSE +21 -21
- package/skills/education/edu-curriculum/SKILL.md +87 -87
- package/skills/education/edu-ed-tech/LICENSE +21 -21
- package/skills/education/edu-ed-tech/SKILL.md +73 -73
- package/skills/education/edu-france/LICENSE +21 -21
- package/skills/education/edu-france/SKILL.md +42 -42
- package/skills/education/edu-germany/LICENSE +21 -21
- package/skills/education/edu-germany/SKILL.md +46 -46
- package/skills/education/edu-india-competitive/LICENSE +21 -21
- package/skills/education/edu-india-competitive/SKILL.md +159 -159
- package/skills/education/edu-india-east/LICENSE +21 -21
- package/skills/education/edu-india-east/SKILL.md +60 -60
- package/skills/education/edu-india-hindi/LICENSE +21 -21
- package/skills/education/edu-india-hindi/SKILL.md +107 -107
- package/skills/education/edu-india-south/LICENSE +21 -21
- package/skills/education/edu-india-south/SKILL.md +64 -64
- package/skills/education/edu-india-west/LICENSE +21 -21
- package/skills/education/edu-india-west/SKILL.md +68 -68
- package/skills/education/edu-indonesia-malay/LICENSE +21 -21
- package/skills/education/edu-indonesia-malay/SKILL.md +57 -57
- package/skills/education/edu-international-ib/LICENSE +21 -21
- package/skills/education/edu-international-ib/SKILL.md +61 -61
- package/skills/education/edu-japan/LICENSE +21 -21
- package/skills/education/edu-japan/SKILL.md +48 -48
- package/skills/education/edu-korea/LICENSE +21 -21
- package/skills/education/edu-korea/SKILL.md +48 -48
- package/skills/education/edu-learning-science/LICENSE +21 -21
- package/skills/education/edu-learning-science/SKILL.md +76 -76
- package/skills/education/edu-portuguese-brazil/LICENSE +21 -21
- package/skills/education/edu-portuguese-brazil/SKILL.md +51 -51
- package/skills/education/edu-russia/LICENSE +21 -21
- package/skills/education/edu-russia/SKILL.md +50 -50
- package/skills/education/edu-spain-latam/LICENSE +21 -21
- package/skills/education/edu-spain-latam/SKILL.md +55 -55
- package/skills/education/edu-special/LICENSE +21 -21
- package/skills/education/edu-special/SKILL.md +76 -76
- package/skills/education/edu-thailand/LICENSE +21 -21
- package/skills/education/edu-thailand/SKILL.md +55 -55
- package/skills/education/edu-turkey/LICENSE +21 -21
- package/skills/education/edu-turkey/SKILL.md +58 -58
- package/skills/education/edu-uk-gcse-alevel/LICENSE +21 -21
- package/skills/education/edu-uk-gcse-alevel/SKILL.md +51 -51
- package/skills/education/edu-usa-graduate/LICENSE +21 -21
- package/skills/education/edu-usa-graduate/SKILL.md +57 -57
- package/skills/education/edu-usa-sat-act/LICENSE +21 -21
- package/skills/education/edu-usa-sat-act/SKILL.md +55 -55
- package/skills/education/edu-vietnam/LICENSE +21 -21
- package/skills/education/edu-vietnam/SKILL.md +53 -53
- package/skills/eightctl/SKILL.md +54 -54
- package/skills/engineering/eng-aerospace/LICENSE +21 -21
- package/skills/engineering/eng-aerospace/SKILL.md +117 -117
- package/skills/engineering/eng-chemical/LICENSE +21 -21
- package/skills/engineering/eng-chemical/SKILL.md +63 -63
- package/skills/engineering/eng-civil/LICENSE +21 -21
- package/skills/engineering/eng-civil/SKILL.md +223 -223
- package/skills/engineering/eng-control-systems/LICENSE +21 -21
- package/skills/engineering/eng-control-systems/SKILL.md +158 -158
- package/skills/engineering/eng-cryogenics/LICENSE +21 -21
- package/skills/engineering/eng-cryogenics/SKILL.md +151 -151
- package/skills/engineering/eng-electrical/LICENSE +21 -21
- package/skills/engineering/eng-electrical/SKILL.md +70 -70
- package/skills/engineering/eng-electronics-embedded/LICENSE +21 -21
- package/skills/engineering/eng-electronics-embedded/SKILL.md +89 -89
- package/skills/engineering/eng-environmental/LICENSE +21 -21
- package/skills/engineering/eng-environmental/SKILL.md +66 -66
- package/skills/engineering/eng-manufacturing/LICENSE +21 -21
- package/skills/engineering/eng-manufacturing/SKILL.md +78 -78
- package/skills/engineering/eng-mechanical/LICENSE +21 -21
- package/skills/engineering/eng-mechanical/SKILL.md +66 -66
- package/skills/engineering/eng-project/LICENSE +21 -21
- package/skills/engineering/eng-project/SKILL.md +72 -72
- package/skills/engineering/eng-propulsion/LICENSE +21 -21
- package/skills/engineering/eng-propulsion/SKILL.md +133 -133
- package/skills/engineering/eng-robotics/LICENSE +21 -21
- package/skills/engineering/eng-robotics/SKILL.md +92 -92
- package/skills/engineering/eng-systems/LICENSE +21 -21
- package/skills/engineering/eng-systems/SKILL.md +81 -81
- package/skills/environment/env-biodiversity/LICENSE +21 -21
- package/skills/environment/env-biodiversity/SKILL.md +66 -66
- package/skills/environment/env-circular-economy/LICENSE +21 -21
- package/skills/environment/env-circular-economy/SKILL.md +71 -71
- package/skills/environment/env-climate-action/LICENSE +21 -21
- package/skills/environment/env-climate-action/SKILL.md +55 -55
- package/skills/environment/env-energy/LICENSE +21 -21
- package/skills/environment/env-energy/SKILL.md +83 -83
- package/skills/environment/env-sustainability-biz/LICENSE +21 -21
- package/skills/environment/env-sustainability-biz/SKILL.md +65 -65
- package/skills/environment/env-water/LICENSE +21 -21
- package/skills/environment/env-water/SKILL.md +67 -67
- package/skills/finance/finance-accounting/LICENSE +21 -21
- package/skills/finance/finance-accounting/SKILL.md +239 -239
- package/skills/finance/finance-banking/LICENSE +21 -21
- package/skills/finance/finance-banking/SKILL.md +54 -54
- package/skills/finance/finance-corporate/LICENSE +21 -21
- package/skills/finance/finance-corporate/SKILL.md +105 -105
- package/skills/finance/finance-crypto/LICENSE +21 -21
- package/skills/finance/finance-crypto/SKILL.md +94 -94
- package/skills/finance/finance-debt-management/LICENSE +21 -21
- package/skills/finance/finance-debt-management/SKILL.md +87 -87
- package/skills/finance/finance-insurance/LICENSE +21 -21
- package/skills/finance/finance-insurance/SKILL.md +91 -91
- package/skills/finance/finance-investing/LICENSE +21 -21
- package/skills/finance/finance-investing/SKILL.md +269 -269
- package/skills/finance/finance-options-derivatives/LICENSE +21 -21
- package/skills/finance/finance-options-derivatives/SKILL.md +68 -68
- package/skills/finance/finance-personal/LICENSE +21 -21
- package/skills/finance/finance-personal/SKILL.md +268 -268
- package/skills/finance/finance-real-estate/LICENSE +21 -21
- package/skills/finance/finance-real-estate/SKILL.md +110 -110
- package/skills/finance/finance-startup/LICENSE +21 -21
- package/skills/finance/finance-startup/SKILL.md +253 -253
- package/skills/finance/finance-tax-planning/LICENSE +21 -21
- package/skills/finance/finance-tax-planning/SKILL.md +89 -89
- package/skills/finance/finance-trading/LICENSE +21 -21
- package/skills/finance/finance-trading/SKILL.md +112 -112
- package/skills/gemini/SKILL.md +51 -51
- package/skills/gh-issues/SKILL.md +216 -216
- package/skills/gifgrep/SKILL.md +89 -89
- package/skills/github/SKILL.md +87 -87
- package/skills/gog/SKILL.md +120 -120
- package/skills/goplaces/SKILL.md +56 -56
- package/skills/graphify/SKILL.md +619 -0
- package/skills/graphify/__init__.py +28 -0
- package/skills/graphify/__main__.py +4582 -0
- package/skills/graphify/affected.py +154 -0
- package/skills/graphify/always_on/agents-md.md +12 -0
- package/skills/graphify/always_on/antigravity-rules.md +14 -0
- package/skills/graphify/always_on/claude-md.md +9 -0
- package/skills/graphify/always_on/gemini-md.md +9 -0
- package/skills/graphify/always_on/kiro-steering.md +5 -0
- package/skills/graphify/always_on/vscode-instructions.md +17 -0
- package/skills/graphify/analyze.py +724 -0
- package/skills/graphify/benchmark.py +155 -0
- package/skills/graphify/build.py +487 -0
- package/skills/graphify/cache.py +417 -0
- package/skills/graphify/callflow_html.py +2020 -0
- package/skills/graphify/cluster.py +272 -0
- package/skills/graphify/command-kilo.md +15 -0
- package/skills/graphify/dedup.py +429 -0
- package/skills/graphify/detect.py +1379 -0
- package/skills/graphify/diagnostics.py +390 -0
- package/skills/graphify/export.py +1408 -0
- package/skills/graphify/extract.py +11570 -0
- package/skills/graphify/global_graph.py +159 -0
- package/skills/graphify/google_workspace.py +223 -0
- package/skills/graphify/hooks.py +457 -0
- package/skills/graphify/ingest.py +331 -0
- package/skills/graphify/llm.py +1896 -0
- package/skills/graphify/manifest.py +4 -0
- package/skills/graphify/mcp_ingest.py +392 -0
- package/skills/graphify/multigraph_compat.py +212 -0
- package/skills/graphify/pg_introspect.py +142 -0
- package/skills/graphify/prs.py +748 -0
- package/skills/graphify/querylog.py +70 -0
- package/skills/graphify/report.py +218 -0
- package/skills/graphify/scip_ingest.py +363 -0
- package/skills/graphify/security.py +336 -0
- package/skills/graphify/semantic_cleanup.py +319 -0
- package/skills/graphify/serve.py +1309 -0
- package/skills/graphify/skill-aider.md +1246 -0
- package/skills/graphify/skill-amp.md +613 -0
- package/skills/graphify/skill-claw.md +616 -0
- package/skills/graphify/skill-codex.md +613 -0
- package/skills/graphify/skill-copilot.md +616 -0
- package/skills/graphify/skill-devin.md +1372 -0
- package/skills/graphify/skill-droid.md +613 -0
- package/skills/graphify/skill-kilo.md +625 -0
- package/skills/graphify/skill-kiro.md +615 -0
- package/skills/graphify/skill-opencode.md +608 -0
- package/skills/graphify/skill-pi.md +615 -0
- package/skills/graphify/skill-trae.md +614 -0
- package/skills/graphify/skill-vscode.md +612 -0
- package/skills/graphify/skill-windows.md +651 -0
- package/skills/graphify/skills/amp/references/add-watch.md +56 -0
- package/skills/graphify/skills/amp/references/exports.md +71 -0
- package/skills/graphify/skills/amp/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/amp/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/amp/references/hooks.md +33 -0
- package/skills/graphify/skills/amp/references/query.md +249 -0
- package/skills/graphify/skills/amp/references/transcribe.md +48 -0
- package/skills/graphify/skills/amp/references/update.md +179 -0
- package/skills/graphify/skills/claude/references/add-watch.md +56 -0
- package/skills/graphify/skills/claude/references/exports.md +71 -0
- package/skills/graphify/skills/claude/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/claude/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/claude/references/hooks.md +33 -0
- package/skills/graphify/skills/claude/references/query.md +103 -0
- package/skills/graphify/skills/claude/references/transcribe.md +48 -0
- package/skills/graphify/skills/claude/references/update.md +179 -0
- package/skills/graphify/skills/claw/references/add-watch.md +56 -0
- package/skills/graphify/skills/claw/references/exports.md +71 -0
- package/skills/graphify/skills/claw/references/extraction-spec.md +29 -0
- package/skills/graphify/skills/claw/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/claw/references/hooks.md +33 -0
- package/skills/graphify/skills/claw/references/query.md +249 -0
- package/skills/graphify/skills/claw/references/transcribe.md +48 -0
- package/skills/graphify/skills/claw/references/update.md +179 -0
- package/skills/graphify/skills/codex/references/add-watch.md +56 -0
- package/skills/graphify/skills/codex/references/exports.md +71 -0
- package/skills/graphify/skills/codex/references/extraction-spec.md +29 -0
- package/skills/graphify/skills/codex/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/codex/references/hooks.md +33 -0
- package/skills/graphify/skills/codex/references/query.md +249 -0
- package/skills/graphify/skills/codex/references/transcribe.md +48 -0
- package/skills/graphify/skills/codex/references/update.md +179 -0
- package/skills/graphify/skills/copilot/references/add-watch.md +56 -0
- package/skills/graphify/skills/copilot/references/exports.md +71 -0
- package/skills/graphify/skills/copilot/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/copilot/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/copilot/references/hooks.md +33 -0
- package/skills/graphify/skills/copilot/references/query.md +249 -0
- package/skills/graphify/skills/copilot/references/transcribe.md +48 -0
- package/skills/graphify/skills/copilot/references/update.md +179 -0
- package/skills/graphify/skills/droid/references/add-watch.md +56 -0
- package/skills/graphify/skills/droid/references/exports.md +71 -0
- package/skills/graphify/skills/droid/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/droid/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/droid/references/hooks.md +33 -0
- package/skills/graphify/skills/droid/references/query.md +249 -0
- package/skills/graphify/skills/droid/references/transcribe.md +48 -0
- package/skills/graphify/skills/droid/references/update.md +179 -0
- package/skills/graphify/skills/kilo/references/add-watch.md +56 -0
- package/skills/graphify/skills/kilo/references/exports.md +71 -0
- package/skills/graphify/skills/kilo/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/kilo/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/kilo/references/hooks.md +33 -0
- package/skills/graphify/skills/kilo/references/query.md +249 -0
- package/skills/graphify/skills/kilo/references/transcribe.md +48 -0
- package/skills/graphify/skills/kilo/references/update.md +179 -0
- package/skills/graphify/skills/kiro/references/add-watch.md +56 -0
- package/skills/graphify/skills/kiro/references/exports.md +71 -0
- package/skills/graphify/skills/kiro/references/extraction-spec.md +29 -0
- package/skills/graphify/skills/kiro/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/kiro/references/hooks.md +33 -0
- package/skills/graphify/skills/kiro/references/query.md +249 -0
- package/skills/graphify/skills/kiro/references/transcribe.md +48 -0
- package/skills/graphify/skills/kiro/references/update.md +179 -0
- package/skills/graphify/skills/opencode/references/add-watch.md +56 -0
- package/skills/graphify/skills/opencode/references/exports.md +71 -0
- package/skills/graphify/skills/opencode/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/opencode/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/opencode/references/hooks.md +33 -0
- package/skills/graphify/skills/opencode/references/query.md +249 -0
- package/skills/graphify/skills/opencode/references/transcribe.md +48 -0
- package/skills/graphify/skills/opencode/references/update.md +179 -0
- package/skills/graphify/skills/pi/references/add-watch.md +56 -0
- package/skills/graphify/skills/pi/references/exports.md +71 -0
- package/skills/graphify/skills/pi/references/extraction-spec.md +29 -0
- package/skills/graphify/skills/pi/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/pi/references/hooks.md +33 -0
- package/skills/graphify/skills/pi/references/query.md +249 -0
- package/skills/graphify/skills/pi/references/transcribe.md +48 -0
- package/skills/graphify/skills/pi/references/update.md +179 -0
- package/skills/graphify/skills/trae/references/add-watch.md +56 -0
- package/skills/graphify/skills/trae/references/exports.md +71 -0
- package/skills/graphify/skills/trae/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/trae/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/trae/references/hooks.md +35 -0
- package/skills/graphify/skills/trae/references/query.md +249 -0
- package/skills/graphify/skills/trae/references/transcribe.md +48 -0
- package/skills/graphify/skills/trae/references/update.md +179 -0
- package/skills/graphify/skills/vscode/references/add-watch.md +56 -0
- package/skills/graphify/skills/vscode/references/exports.md +71 -0
- package/skills/graphify/skills/vscode/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/vscode/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/vscode/references/hooks.md +33 -0
- package/skills/graphify/skills/vscode/references/query.md +249 -0
- package/skills/graphify/skills/vscode/references/transcribe.md +48 -0
- package/skills/graphify/skills/vscode/references/update.md +179 -0
- package/skills/graphify/skills/windows/references/add-watch.md +56 -0
- package/skills/graphify/skills/windows/references/exports.md +71 -0
- package/skills/graphify/skills/windows/references/extraction-spec.md +68 -0
- package/skills/graphify/skills/windows/references/github-and-merge.md +46 -0
- package/skills/graphify/skills/windows/references/hooks.md +33 -0
- package/skills/graphify/skills/windows/references/query.md +249 -0
- package/skills/graphify/skills/windows/references/transcribe.md +48 -0
- package/skills/graphify/skills/windows/references/update.md +179 -0
- package/skills/graphify/symbol_resolution.py +538 -0
- package/skills/graphify/transcribe.py +184 -0
- package/skills/graphify/tree_html.py +582 -0
- package/skills/graphify/validate.py +72 -0
- package/skills/graphify/watch.py +898 -0
- package/skills/graphify/wiki.py +282 -0
- package/skills/health/health-aging/LICENSE +21 -21
- package/skills/health/health-aging/SKILL.md +82 -82
- package/skills/health/health-chronic/LICENSE +21 -21
- package/skills/health/health-chronic/SKILL.md +202 -202
- package/skills/health/health-dental/LICENSE +21 -21
- package/skills/health/health-dental/SKILL.md +41 -41
- package/skills/health/health-eye-care/LICENSE +21 -21
- package/skills/health/health-eye-care/SKILL.md +56 -56
- package/skills/health/health-first-aid/LICENSE +21 -21
- package/skills/health/health-first-aid/SKILL.md +201 -201
- package/skills/health/health-fitness/LICENSE +21 -21
- package/skills/health/health-fitness/SKILL.md +111 -111
- package/skills/health/health-general/LICENSE +21 -21
- package/skills/health/health-general/SKILL.md +277 -277
- package/skills/health/health-mens/LICENSE +21 -21
- package/skills/health/health-mens/SKILL.md +53 -53
- package/skills/health/health-mental/LICENSE +21 -21
- package/skills/health/health-mental/SKILL.md +221 -221
- package/skills/health/health-naturopathy-ayurveda/LICENSE +21 -21
- package/skills/health/health-naturopathy-ayurveda/SKILL.md +60 -60
- package/skills/health/health-nutrition/LICENSE +21 -21
- package/skills/health/health-nutrition/SKILL.md +262 -262
- package/skills/health/health-pediatric/LICENSE +21 -21
- package/skills/health/health-pediatric/SKILL.md +94 -94
- package/skills/health/health-pharmacology/LICENSE +21 -21
- package/skills/health/health-pharmacology/SKILL.md +87 -87
- package/skills/health/health-pregnancy/LICENSE +21 -21
- package/skills/health/health-pregnancy/SKILL.md +71 -71
- package/skills/health/health-skin/LICENSE +21 -21
- package/skills/health/health-skin/SKILL.md +71 -71
- package/skills/health/health-sleep/LICENSE +21 -21
- package/skills/health/health-sleep/SKILL.md +81 -81
- package/skills/health/health-womens/LICENSE +21 -21
- package/skills/health/health-womens/SKILL.md +72 -72
- package/skills/health/health-yoga-wellness/LICENSE +21 -21
- package/skills/health/health-yoga-wellness/SKILL.md +58 -58
- package/skills/healthcare-systems/health-sys-global/LICENSE +21 -21
- package/skills/healthcare-systems/health-sys-global/SKILL.md +69 -69
- package/skills/healthcare-systems/health-sys-management/LICENSE +21 -21
- package/skills/healthcare-systems/health-sys-management/SKILL.md +71 -71
- package/skills/healthcare-systems/health-sys-navigation/LICENSE +21 -21
- package/skills/healthcare-systems/health-sys-navigation/SKILL.md +60 -60
- package/skills/healthcare-systems/health-sys-public/LICENSE +21 -21
- package/skills/healthcare-systems/health-sys-public/SKILL.md +71 -71
- package/skills/healthcheck/SKILL.md +109 -109
- package/skills/himalaya/SKILL.md +84 -84
- package/skills/himalaya/references/configuration.md +184 -184
- package/skills/himalaya/references/message-composition.md +199 -199
- package/skills/humanities/humanities-history-world/LICENSE +21 -21
- package/skills/humanities/humanities-history-world/SKILL.md +59 -59
- package/skills/humanities/humanities-indian-classical/LICENSE +21 -21
- package/skills/humanities/humanities-indian-classical/SKILL.md +104 -104
- package/skills/humanities/humanities-philosophy/LICENSE +21 -21
- package/skills/humanities/humanities-philosophy/SKILL.md +105 -105
- package/skills/humanities/humanities-world-religions/LICENSE +21 -21
- package/skills/humanities/humanities-world-religions/SKILL.md +67 -67
- package/skills/impeccable/SKILL.md +186 -0
- package/skills/impeccable/agents/impeccable_asset_producer.toml +92 -0
- package/skills/impeccable/agents/impeccable_manual_edit_applier.toml +95 -0
- package/skills/impeccable/agents/openai.yaml +4 -0
- package/skills/impeccable/reference/adapt.md +311 -0
- package/skills/impeccable/reference/animate.md +201 -0
- package/skills/impeccable/reference/audit.md +133 -0
- package/skills/impeccable/reference/bolder.md +113 -0
- package/skills/impeccable/reference/brand.md +108 -0
- package/skills/impeccable/reference/clarify.md +288 -0
- package/skills/impeccable/reference/codex.md +105 -0
- package/skills/impeccable/reference/colorize.md +257 -0
- package/skills/impeccable/reference/craft.md +123 -0
- package/skills/impeccable/reference/critique.md +790 -0
- package/skills/impeccable/reference/delight.md +302 -0
- package/skills/impeccable/reference/distill.md +111 -0
- package/skills/impeccable/reference/document.md +429 -0
- package/skills/impeccable/reference/extract.md +69 -0
- package/skills/impeccable/reference/harden.md +347 -0
- package/skills/impeccable/reference/init.md +172 -0
- package/skills/impeccable/reference/interaction-design.md +189 -0
- package/skills/impeccable/reference/layout.md +161 -0
- package/skills/impeccable/reference/live.md +720 -0
- package/skills/impeccable/reference/onboard.md +234 -0
- package/skills/impeccable/reference/optimize.md +258 -0
- package/skills/impeccable/reference/overdrive.md +130 -0
- package/skills/impeccable/reference/polish.md +241 -0
- package/skills/impeccable/reference/product.md +60 -0
- package/skills/impeccable/reference/quieter.md +99 -0
- package/skills/impeccable/reference/shape.md +165 -0
- package/skills/impeccable/reference/typeset.md +279 -0
- package/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/skills/impeccable/scripts/command-metadata.json +94 -0
- package/skills/impeccable/scripts/context-signals.mjs +225 -0
- package/skills/impeccable/scripts/context.mjs +266 -0
- package/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/skills/impeccable/scripts/design-parser.mjs +835 -0
- package/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/skills/impeccable/scripts/detect.mjs +21 -0
- package/skills/impeccable/scripts/detector/browser/injected/index.mjs +1733 -0
- package/skills/impeccable/scripts/detector/cli/main.mjs +244 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +4618 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
- package/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +252 -0
- package/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +535 -0
- package/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +986 -0
- package/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +208 -0
- package/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/skills/impeccable/scripts/detector/findings.mjs +12 -0
- package/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/skills/impeccable/scripts/detector/registry/antipatterns.mjs +419 -0
- package/skills/impeccable/scripts/detector/rules/checks.mjs +2384 -0
- package/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/skills/impeccable/scripts/impeccable-paths.mjs +126 -0
- package/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/skills/impeccable/scripts/live-accept.mjs +812 -0
- package/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/skills/impeccable/scripts/live-browser.js +10295 -0
- package/skills/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
- package/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/skills/impeccable/scripts/live-completion.mjs +19 -0
- package/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/skills/impeccable/scripts/live-event-validation.mjs +137 -0
- package/skills/impeccable/scripts/live-inject.mjs +557 -0
- package/skills/impeccable/scripts/live-insert-ui.mjs +458 -0
- package/skills/impeccable/scripts/live-insert.mjs +272 -0
- package/skills/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
- package/skills/impeccable/scripts/live-manual-edits-buffer.mjs +152 -0
- package/skills/impeccable/scripts/live-poll.mjs +379 -0
- package/skills/impeccable/scripts/live-resume.mjs +94 -0
- package/skills/impeccable/scripts/live-server.mjs +2326 -0
- package/skills/impeccable/scripts/live-session-store.mjs +289 -0
- package/skills/impeccable/scripts/live-status.mjs +61 -0
- package/skills/impeccable/scripts/live-svelte-component.mjs +826 -0
- package/skills/impeccable/scripts/live-sveltekit-adapter.mjs +274 -0
- package/skills/impeccable/scripts/live-ui-core.mjs +179 -0
- package/skills/impeccable/scripts/live-vocabulary.mjs +36 -0
- package/skills/impeccable/scripts/live-wrap.mjs +894 -0
- package/skills/impeccable/scripts/live.mjs +246 -0
- package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/impeccable/scripts/palette.mjs +633 -0
- package/skills/impeccable/scripts/pin.mjs +214 -0
- package/skills/imsg/SKILL.md +126 -126
- package/skills/industry/industry-construction/LICENSE +21 -21
- package/skills/industry/industry-construction/SKILL.md +81 -81
- package/skills/industry/industry-education-sector/LICENSE +21 -21
- package/skills/industry/industry-education-sector/SKILL.md +49 -49
- package/skills/industry/industry-fashion/LICENSE +21 -21
- package/skills/industry/industry-fashion/SKILL.md +82 -82
- package/skills/industry/industry-food/LICENSE +21 -21
- package/skills/industry/industry-food/SKILL.md +79 -79
- package/skills/industry/industry-government/LICENSE +21 -21
- package/skills/industry/industry-government/SKILL.md +80 -80
- package/skills/industry/industry-hospitality/LICENSE +21 -21
- package/skills/industry/industry-hospitality/SKILL.md +73 -73
- package/skills/industry/industry-insurance-sector/LICENSE +21 -21
- package/skills/industry/industry-insurance-sector/SKILL.md +57 -57
- package/skills/industry/industry-logistics/LICENSE +21 -21
- package/skills/industry/industry-logistics/SKILL.md +80 -80
- package/skills/industry/industry-media/LICENSE +21 -21
- package/skills/industry/industry-media/SKILL.md +66 -66
- package/skills/industry/industry-nonprofit/LICENSE +21 -21
- package/skills/industry/industry-nonprofit/SKILL.md +77 -77
- package/skills/industry/industry-pharma/LICENSE +21 -21
- package/skills/industry/industry-pharma/SKILL.md +69 -69
- package/skills/industry/industry-real-estate/LICENSE +21 -21
- package/skills/industry/industry-real-estate/SKILL.md +61 -61
- package/skills/industry/industry-sports/LICENSE +21 -21
- package/skills/industry/industry-sports/SKILL.md +71 -71
- package/skills/industry/industry-tech-startup/LICENSE +21 -21
- package/skills/industry/industry-tech-startup/SKILL.md +82 -82
- package/skills/internal-comms/LICENSE +21 -21
- package/skills/internal-comms/SKILL.md +38 -38
- package/skills/internal-comms/examples/3p-updates.md +49 -49
- package/skills/internal-comms/examples/company-newsletter.md +76 -76
- package/skills/internal-comms/examples/faq-answers.md +35 -35
- package/skills/internal-comms/examples/general-comms.md +19 -19
- package/skills/legal/legal-business/LICENSE +21 -21
- package/skills/legal/legal-business/SKILL.md +227 -227
- package/skills/legal/legal-consumer/LICENSE +21 -21
- package/skills/legal/legal-consumer/SKILL.md +155 -155
- package/skills/legal/legal-contracts/LICENSE +21 -21
- package/skills/legal/legal-contracts/SKILL.md +268 -268
- package/skills/legal/legal-corporate-governance/LICENSE +21 -21
- package/skills/legal/legal-corporate-governance/SKILL.md +53 -53
- package/skills/legal/legal-employment/LICENSE +21 -21
- package/skills/legal/legal-employment/SKILL.md +291 -291
- package/skills/legal/legal-immigration/LICENSE +21 -21
- package/skills/legal/legal-immigration/SKILL.md +146 -146
- package/skills/legal/legal-international/LICENSE +21 -21
- package/skills/legal/legal-international/SKILL.md +51 -51
- package/skills/legal/legal-ip/LICENSE +21 -21
- package/skills/legal/legal-ip/SKILL.md +264 -264
- package/skills/legal/legal-privacy/LICENSE +21 -21
- package/skills/legal/legal-privacy/SKILL.md +161 -161
- package/skills/legal/legal-real-estate/LICENSE +21 -21
- package/skills/legal/legal-real-estate/SKILL.md +142 -142
- package/skills/legal/legal-startup/LICENSE +21 -21
- package/skills/legal/legal-startup/SKILL.md +182 -182
- package/skills/legal/legal-tax/LICENSE +21 -21
- package/skills/legal/legal-tax/SKILL.md +156 -156
- package/skills/mcp-builder/LICENSE +21 -21
- package/skills/mcp-builder/SKILL.md +257 -257
- package/skills/mcp-builder/reference/evaluation.md +630 -630
- package/skills/mcp-builder/reference/mcp_best_practices.md +269 -269
- package/skills/mcp-builder/reference/node_mcp_server.md +980 -980
- package/skills/mcp-builder/reference/python_mcp_server.md +737 -737
- package/skills/mcp-builder/scripts/connections.py +151 -151
- package/skills/mcp-builder/scripts/evaluation.py +373 -373
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -22
- package/skills/mcp-builder/scripts/requirements.txt +2 -2
- package/skills/mcporter/SKILL.md +65 -65
- package/skills/meme-maker/SKILL.md +46 -46
- package/skills/meme-maker/references/templates.json +358 -358
- package/skills/meme-maker/scripts/meme.mjs +398 -398
- package/skills/mental-health/mental-health-cbt/LICENSE +21 -21
- package/skills/mental-health/mental-health-cbt/SKILL.md +254 -254
- package/skills/mental-health/psych-addiction/LICENSE +21 -21
- package/skills/mental-health/psych-addiction/SKILL.md +79 -79
- package/skills/mental-health/psych-behavioral-econ/LICENSE +21 -21
- package/skills/mental-health/psych-behavioral-econ/SKILL.md +84 -84
- package/skills/mental-health/psych-child/LICENSE +21 -21
- package/skills/mental-health/psych-child/SKILL.md +84 -84
- package/skills/mental-health/psych-grief/LICENSE +21 -21
- package/skills/mental-health/psych-grief/SKILL.md +85 -85
- package/skills/mental-health/psych-mindfulness/LICENSE +21 -21
- package/skills/mental-health/psych-mindfulness/SKILL.md +71 -71
- package/skills/mental-health/psych-org/LICENSE +21 -21
- package/skills/mental-health/psych-org/SKILL.md +115 -115
- package/skills/mental-health/psych-positive/LICENSE +21 -21
- package/skills/mental-health/psych-positive/SKILL.md +86 -86
- package/skills/mental-health/psych-relationships/LICENSE +21 -21
- package/skills/mental-health/psych-relationships/SKILL.md +100 -100
- package/skills/mental-health/psych-trauma/LICENSE +21 -21
- package/skills/mental-health/psych-trauma/SKILL.md +109 -109
- package/skills/model-usage/SKILL.md +75 -75
- package/skills/model-usage/references/codexbar-cli.md +33 -33
- package/skills/model-usage/scripts/model_usage.py +319 -319
- package/skills/model-usage/scripts/test_model_usage.py +40 -40
- package/skills/nano-pdf/SKILL.md +42 -42
- package/skills/node-connect/SKILL.md +147 -147
- package/skills/node-inspect-debugger/SKILL.md +88 -88
- package/skills/notion/SKILL.md +154 -154
- package/skills/obsidian/SKILL.md +123 -123
- package/skills/openai-whisper/SKILL.md +42 -42
- package/skills/openai-whisper-api/SKILL.md +75 -75
- package/skills/openai-whisper-api/scripts/transcribe.sh +154 -154
- package/skills/openhue/SKILL.md +116 -116
- package/skills/oracle/SKILL.md +130 -130
- package/skills/ordercli/SKILL.md +82 -82
- package/skills/peekaboo/SKILL.md +217 -217
- package/skills/pyproject.toml +10 -10
- package/skills/python-debugpy/SKILL.md +76 -76
- package/skills/sag/SKILL.md +91 -91
- package/skills/science/sci-astronomy/LICENSE +21 -21
- package/skills/science/sci-astronomy/SKILL.md +80 -80
- package/skills/science/sci-biology/LICENSE +21 -21
- package/skills/science/sci-biology/SKILL.md +74 -74
- package/skills/science/sci-chemistry/LICENSE +21 -21
- package/skills/science/sci-chemistry/SKILL.md +89 -89
- package/skills/science/sci-climate/LICENSE +21 -21
- package/skills/science/sci-climate/SKILL.md +72 -72
- package/skills/science/sci-data-analysis/LICENSE +21 -21
- package/skills/science/sci-data-analysis/SKILL.md +87 -87
- package/skills/science/sci-environmental-science/LICENSE +21 -21
- package/skills/science/sci-environmental-science/SKILL.md +69 -69
- package/skills/science/sci-geology/LICENSE +21 -21
- package/skills/science/sci-geology/SKILL.md +56 -56
- package/skills/science/sci-method/LICENSE +21 -21
- package/skills/science/sci-method/SKILL.md +77 -77
- package/skills/science/sci-neuroscience/LICENSE +21 -21
- package/skills/science/sci-neuroscience/SKILL.md +79 -79
- package/skills/science/sci-physics/LICENSE +21 -21
- package/skills/science/sci-physics/SKILL.md +78 -78
- package/skills/science/sci-research-methods/LICENSE +21 -21
- package/skills/science/sci-research-methods/SKILL.md +83 -83
- package/skills/science/sci-statistics/LICENSE +21 -21
- package/skills/science/sci-statistics/SKILL.md +249 -249
- package/skills/session-logs/SKILL.md +155 -155
- package/skills/sherpa-onnx-tts/SKILL.md +113 -113
- package/skills/skill-creator/SKILL.md +81 -81
- package/skills/skill-creator/license.txt +202 -202
- package/skills/skill-creator/scripts/init_skill.py +378 -378
- package/skills/skill-creator/scripts/package_skill.py +144 -144
- package/skills/skill-creator/scripts/quick_validate.py +169 -169
- package/skills/skill-creator/scripts/test_init_skill.py +51 -51
- package/skills/skill-creator/scripts/test_package_skill.py +199 -199
- package/skills/skill-creator/scripts/test_quick_validate.py +116 -116
- package/skills/slack/SKILL.md +82 -82
- package/skills/slack-gif-creator/LICENSE +21 -21
- package/skills/slack-gif-creator/SKILL.md +293 -293
- package/skills/slack-gif-creator/requirements.txt +3 -3
- package/skills/social-sciences/social-anthropology/LICENSE +21 -21
- package/skills/social-sciences/social-anthropology/SKILL.md +62 -62
- package/skills/social-sciences/social-economics/LICENSE +21 -21
- package/skills/social-sciences/social-economics/SKILL.md +88 -88
- package/skills/social-sciences/social-geography/LICENSE +21 -21
- package/skills/social-sciences/social-geography/SKILL.md +61 -61
- package/skills/social-sciences/social-international-dev/LICENSE +21 -21
- package/skills/social-sciences/social-international-dev/SKILL.md +76 -76
- package/skills/social-sciences/social-political-science/LICENSE +21 -21
- package/skills/social-sciences/social-political-science/SKILL.md +70 -70
- package/skills/social-sciences/social-public-policy/LICENSE +21 -21
- package/skills/social-sciences/social-public-policy/SKILL.md +73 -73
- package/skills/social-sciences/social-sociology/LICENSE +21 -21
- package/skills/social-sciences/social-sociology/SKILL.md +78 -78
- package/skills/songsee/SKILL.md +53 -53
- package/skills/sonoscli/SKILL.md +69 -69
- package/skills/spike/SKILL.md +55 -55
- package/skills/spotify-player/SKILL.md +68 -68
- package/skills/summarize/SKILL.md +90 -90
- package/skills/taskflow/SKILL.md +153 -153
- package/skills/taskflow/examples/inbox-triage.lobster +33 -33
- package/skills/taskflow/examples/pr-intake.lobster +32 -32
- package/skills/taskflow-inbox-triage/SKILL.md +123 -123
- package/skills/technical/ai-ethics/LICENSE +21 -21
- package/skills/technical/ai-ethics/SKILL.md +92 -92
- package/skills/technical/ai-product-builder/LICENSE +21 -21
- package/skills/technical/ai-product-builder/SKILL.md +180 -180
- package/skills/technical/analytics-setup/LICENSE +21 -21
- package/skills/technical/analytics-setup/SKILL.md +125 -125
- package/skills/technical/api-builder/LICENSE +21 -21
- package/skills/technical/api-builder/SKILL.md +202 -202
- package/skills/technical/architecture-decisions/LICENSE +21 -21
- package/skills/technical/architecture-decisions/SKILL.md +120 -120
- package/skills/technical/auth-security/LICENSE +21 -21
- package/skills/technical/auth-security/SKILL.md +209 -209
- package/skills/technical/blockchain-web3/LICENSE +21 -21
- package/skills/technical/blockchain-web3/SKILL.md +84 -84
- package/skills/technical/cloud-architecture/LICENSE +21 -21
- package/skills/technical/cloud-architecture/SKILL.md +85 -85
- package/skills/technical/content-platform/LICENSE +21 -21
- package/skills/technical/content-platform/SKILL.md +134 -134
- package/skills/technical/cybersecurity-advanced/LICENSE +21 -21
- package/skills/technical/cybersecurity-advanced/SKILL.md +99 -99
- package/skills/technical/data-engineering/LICENSE +21 -21
- package/skills/technical/data-engineering/SKILL.md +117 -117
- package/skills/technical/database-design/LICENSE +21 -21
- package/skills/technical/database-design/SKILL.md +185 -185
- package/skills/technical/devops-cicd/LICENSE +21 -21
- package/skills/technical/devops-cicd/SKILL.md +181 -181
- package/skills/technical/ecommerce-builder/LICENSE +21 -21
- package/skills/technical/ecommerce-builder/SKILL.md +123 -123
- package/skills/technical/email-marketing/LICENSE +21 -21
- package/skills/technical/email-marketing/SKILL.md +128 -128
- package/skills/technical/fintech-builder/LICENSE +21 -21
- package/skills/technical/fintech-builder/SKILL.md +141 -141
- package/skills/technical/full-stack-web/LICENSE +21 -21
- package/skills/technical/full-stack-web/SKILL.md +173 -173
- package/skills/technical/gdpr-basics/LICENSE +21 -21
- package/skills/technical/gdpr-basics/SKILL.md +145 -145
- package/skills/technical/launch-playbook/LICENSE +21 -21
- package/skills/technical/launch-playbook/SKILL.md +95 -95
- package/skills/technical/marketing-copy/LICENSE +21 -21
- package/skills/technical/marketing-copy/SKILL.md +126 -126
- package/skills/technical/marketplace-builder/LICENSE +21 -21
- package/skills/technical/marketplace-builder/SKILL.md +105 -105
- package/skills/technical/mobile-pwa/LICENSE +21 -21
- package/skills/technical/mobile-pwa/SKILL.md +191 -191
- package/skills/technical/no-code-tools/LICENSE +21 -21
- package/skills/technical/no-code-tools/SKILL.md +80 -80
- package/skills/technical/open-source/LICENSE +21 -21
- package/skills/technical/open-source/SKILL.md +71 -71
- package/skills/technical/performance-optimization/LICENSE +21 -21
- package/skills/technical/performance-optimization/SKILL.md +155 -155
- package/skills/technical/pricing-design/LICENSE +21 -21
- package/skills/technical/pricing-design/SKILL.md +87 -87
- package/skills/technical/product-management/LICENSE +21 -21
- package/skills/technical/product-management/SKILL.md +94 -94
- package/skills/technical/saas-builder/LICENSE +21 -21
- package/skills/technical/saas-builder/SKILL.md +138 -138
- package/skills/technical/scope-estimation/LICENSE +21 -21
- package/skills/technical/scope-estimation/SKILL.md +99 -99
- package/skills/technical/secrets-management/LICENSE +21 -21
- package/skills/technical/secrets-management/SKILL.md +135 -135
- package/skills/technical/seo-technical/LICENSE +21 -21
- package/skills/technical/seo-technical/SKILL.md +136 -136
- package/skills/technical/technical-writing/LICENSE +21 -21
- package/skills/technical/technical-writing/SKILL.md +149 -149
- package/skills/technical/ux-research-tools/LICENSE +21 -21
- package/skills/technical/ux-research-tools/SKILL.md +54 -54
- package/skills/theme-factory/LICENSE +21 -21
- package/skills/theme-factory/SKILL.md +65 -65
- package/skills/theme-factory/themes/arctic-frost.md +19 -19
- package/skills/theme-factory/themes/botanical-garden.md +19 -19
- package/skills/theme-factory/themes/desert-rose.md +19 -19
- package/skills/theme-factory/themes/forest-canopy.md +19 -19
- package/skills/theme-factory/themes/golden-hour.md +19 -19
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -19
- package/skills/theme-factory/themes/modern-minimalist.md +19 -19
- package/skills/theme-factory/themes/ocean-depths.md +19 -19
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -19
- package/skills/theme-factory/themes/tech-innovation.md +19 -19
- package/skills/things-mac/SKILL.md +90 -90
- package/skills/tmux/SKILL.md +95 -95
- package/skills/tmux/scripts/find-sessions.sh +112 -112
- package/skills/tmux/scripts/wait-for-text.sh +83 -83
- package/skills/trades/trades-agriculture/LICENSE +21 -21
- package/skills/trades/trades-agriculture/SKILL.md +80 -80
- package/skills/trades/trades-automotive/LICENSE +21 -21
- package/skills/trades/trades-automotive/SKILL.md +84 -84
- package/skills/trades/trades-carpentry/LICENSE +21 -21
- package/skills/trades/trades-carpentry/SKILL.md +71 -71
- package/skills/trades/trades-cooking-pro/LICENSE +21 -21
- package/skills/trades/trades-cooking-pro/SKILL.md +90 -90
- package/skills/trades/trades-electrical/LICENSE +21 -21
- package/skills/trades/trades-electrical/SKILL.md +146 -146
- package/skills/trades/trades-hvac/LICENSE +21 -21
- package/skills/trades/trades-hvac/SKILL.md +80 -80
- package/skills/trades/trades-landscaping/LICENSE +21 -21
- package/skills/trades/trades-landscaping/SKILL.md +60 -60
- package/skills/trades/trades-metalworking/LICENSE +21 -21
- package/skills/trades/trades-metalworking/SKILL.md +64 -64
- package/skills/trades/trades-painting/LICENSE +21 -21
- package/skills/trades/trades-painting/SKILL.md +70 -70
- package/skills/trades/trades-plumbing/LICENSE +21 -21
- package/skills/trades/trades-plumbing/SKILL.md +160 -160
- package/skills/trades/trades-welding/LICENSE +21 -21
- package/skills/trades/trades-welding/SKILL.md +82 -82
- package/skills/trello/SKILL.md +112 -112
- package/skills/uipm-ui-styling/LICENSE.txt +202 -0
- package/skills/uipm-ui-styling/SKILL.md +328 -0
- package/skills/uipm-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/uipm-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/uipm-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/uipm-ui-styling/references/canvas-design-system.md +320 -0
- package/skills/uipm-ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/uipm-ui-styling/references/shadcn-components.md +424 -0
- package/skills/uipm-ui-styling/references/shadcn-theming.md +373 -0
- package/skills/uipm-ui-styling/references/tailwind-customization.md +483 -0
- package/skills/uipm-ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/uipm-ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/uipm-ui-styling/scripts/.coverage +0 -0
- package/skills/uipm-ui-styling/scripts/requirements.txt +17 -0
- package/skills/uipm-ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/uipm-ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/uipm-ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/uipm-ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/uipm-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/uipm-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/video-frames/SKILL.md +50 -50
- package/skills/video-frames/scripts/frame.sh +81 -81
- package/skills/voice-call/SKILL.md +49 -49
- package/skills/wacli/SKILL.md +76 -76
- package/skills/weather/SKILL.md +91 -91
- package/skills/web-artifacts-builder/LICENSE +21 -21
- package/skills/web-artifacts-builder/SKILL.md +82 -82
- package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +53 -53
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -322
- package/skills/xurl/SKILL.md +124 -124
|
@@ -1,680 +1,680 @@
|
|
|
1
|
-
# Android Expert Reference — Build to Launch
|
|
2
|
-
|
|
3
|
-
## Table of Contents
|
|
4
|
-
|
|
5
|
-
1. [Android Project Fundamentals](#1-android-project-fundamentals)
|
|
6
|
-
2. [Signing & Keystores](#2-signing--keystores)
|
|
7
|
-
3. [Play App Signing](#3-play-app-signing)
|
|
8
|
-
4. [SHA-1 Fingerprints & OAuth](#4-sha-1-fingerprints--oauth)
|
|
9
|
-
5. [Play Console Deep Dive](#5-play-console-deep-dive)
|
|
10
|
-
6. [Play Store Review & Policies](#6-play-store-review--policies)
|
|
11
|
-
7. [App Bundle (AAB) vs APK](#7-app-bundle-aab-vs-apk)
|
|
12
|
-
8. [FCM v1 API](#8-fcm-v1-api)
|
|
13
|
-
9. [Google Sign-In Android](#9-google-sign-in-android)
|
|
14
|
-
10. [Target SDK Requirements](#10-target-sdk-requirements)
|
|
15
|
-
11. [Background Processing](#11-background-processing)
|
|
16
|
-
12. [ProGuard / R8](#12-proguard--r8)
|
|
17
|
-
13. [Firebase Android Integration](#13-firebase-android-integration)
|
|
18
|
-
14. [Play Integrity API](#14-play-integrity-api)
|
|
19
|
-
15. [Common Android Submission Failures](#15-common-android-submission-failures)
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 1. Android Project Fundamentals
|
|
24
|
-
|
|
25
|
-
**versionCode rules:**
|
|
26
|
-
|
|
27
|
-
- Always an integer: 1, 2, 3...
|
|
28
|
-
- Must STRICTLY increase with every upload to Play Console
|
|
29
|
-
- Once uploaded, that versionCode can never be reused for that app
|
|
30
|
-
- EAS manages this via `android.versionCode` in app.json
|
|
31
|
-
|
|
32
|
-
**versionName rules:**
|
|
33
|
-
|
|
34
|
-
- Human-readable string: "2.3.0", "2.3.1"
|
|
35
|
-
- No strict requirement to increment (but should match marketing version)
|
|
36
|
-
- Shown to users in Play Store
|
|
37
|
-
|
|
38
|
-
**<project> Android current state:**
|
|
39
|
-
|
|
40
|
-
- versionCode 14 / v2.3.0 — under Play Store review
|
|
41
|
-
- versionCode 10 — currently active on devices
|
|
42
|
-
- Next build: versionCode 15 / v2.4.0
|
|
43
|
-
|
|
44
|
-
**Package name:** `com.<project>.shield` — permanent, never changes after first upload.
|
|
45
|
-
Changing package name = entirely new app listing with zero install base.
|
|
46
|
-
|
|
47
|
-
**Minimum SDK targets (2026):**
|
|
48
|
-
|
|
49
|
-
- `minSdkVersion`: 21 (Android 5.0) — covers 99%+ of active devices
|
|
50
|
-
- `targetSdkVersion`: 34 (Android 14) — **required by Google Play as of August 2024**
|
|
51
|
-
- `compileSdkVersion`: 35 (Android 15) — use latest
|
|
52
|
-
|
|
53
|
-
**Kotlin 2.0 highlights:**
|
|
54
|
-
|
|
55
|
-
- K2 compiler: 2x faster compilation
|
|
56
|
-
- `data class` copy with named arguments required
|
|
57
|
-
- Smart casts improved across function boundaries
|
|
58
|
-
- Compose: stable with Kotlin 2.0
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## 2. Signing & Keystores
|
|
63
|
-
|
|
64
|
-
**Upload key vs App signing key:**
|
|
65
|
-
With Play App Signing (mandatory for AAB):
|
|
66
|
-
|
|
67
|
-
- **Upload key:** Used to sign AAB before uploading. Lives on your machine / EAS.
|
|
68
|
-
- **App signing key:** Managed by Google. Applied to the final APK delivered to devices.
|
|
69
|
-
- If you lose your upload key, you can register a new one in Play Console.
|
|
70
|
-
- The SHA-1 that matters for Google Sign-In is the **App signing key** SHA-1 (Google manages this).
|
|
71
|
-
|
|
72
|
-
**EAS manages signing automatically:**
|
|
73
|
-
|
|
74
|
-
- EAS generates and stores your upload keystore
|
|
75
|
-
- View keystore details: `eas credentials`
|
|
76
|
-
- SHA-1 of upload key (dev): `D6:04:59:BE:DC:0C:BC:0E:85:00:23:CA:A4:2B:F7:BE:1C:5D:C1:E4`
|
|
77
|
-
- SHA-1 of production key (Play App Signing): `41:35:AF:FE:B8:FE:BE:F9:DD:77:B4:61:05:BC:DA:7A:49:FC:F6:2B`
|
|
78
|
-
|
|
79
|
-
**Generating a keystore manually (if needed):**
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
keytool -genkeypair -v \
|
|
83
|
-
-storetype PKCS12 \
|
|
84
|
-
-keystore <project>-upload-key.jks \
|
|
85
|
-
-alias <project> \
|
|
86
|
-
-keyalg RSA \
|
|
87
|
-
-keysize 2048 \
|
|
88
|
-
-validity 10000
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**Getting SHA-1 from keystore:**
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
keytool -list -v \
|
|
95
|
-
-keystore <project>-upload-key.jks \
|
|
96
|
-
-alias <project>
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
**CRITICAL:** Back up your keystore file + password + alias + alias password.
|
|
100
|
-
Without these you cannot update your app (you lose upload key recovery option).
|
|
101
|
-
EAS stores keystores in their secure vault — managed builds are backed up.
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## 3. Play App Signing
|
|
106
|
-
|
|
107
|
-
**Mandatory since August 2021** for new apps using AAB format.
|
|
108
|
-
|
|
109
|
-
**Flow:**
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
You sign AAB with upload key
|
|
113
|
-
→ Upload to Play Console
|
|
114
|
-
→ Google verifies your signature
|
|
115
|
-
→ Google re-signs with app signing key
|
|
116
|
-
→ Distributed to users signed with Google's key
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**Finding your App Signing Certificate SHA-1 (for OAuth):**
|
|
120
|
-
|
|
121
|
-
1. Play Console → Release → Setup → App signing
|
|
122
|
-
2. "App signing key certificate" section → SHA-1 certificate fingerprint
|
|
123
|
-
3. This is the value that goes into Google Cloud Console / Firebase for production OAuth
|
|
124
|
-
|
|
125
|
-
**<project> App Signing Key SHA-1:**
|
|
126
|
-
`41:35:AF:FE:B8:FE:BE:F9:DD:77:B4:61:05:BC:DA:7A:49:FC:F6:2B`
|
|
127
|
-
|
|
128
|
-
**Upload key reset (if lost):**
|
|
129
|
-
|
|
130
|
-
1. Play Console → App → Setup → App signing
|
|
131
|
-
2. Request upload key reset
|
|
132
|
-
3. Generate new keystore, sign a new AAB
|
|
133
|
-
4. Submit with new AAB — Google verifies identity via Play Developer account
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## 4. SHA-1 Fingerprints & OAuth
|
|
138
|
-
|
|
139
|
-
**Two SHA-1 fingerprints for <project> Android:**
|
|
140
|
-
|
|
141
|
-
1. **Dev SHA-1** (for debug builds and EAS development profile):
|
|
142
|
-
`D6:04:59:BE:DC:0C:BC:0E:85:00:23:CA:A4:2B:F7:BE:1C:5D:C1:E4`
|
|
143
|
-
→ Add to Firebase Android app → google-services.json regenerated
|
|
144
|
-
|
|
145
|
-
2. **Production SHA-1** (Play App Signing key — for Play Store builds):
|
|
146
|
-
`41:35:AF:FE:B8:FE:BE:F9:DD:77:B4:61:05:BC:DA:7A:49:FC:F6:2B`
|
|
147
|
-
→ Add to Firebase Android app → google-services.json regenerated
|
|
148
|
-
|
|
149
|
-
**Both SHA-1s must be registered in Firebase** for Google Sign-In to work across dev and production builds.
|
|
150
|
-
|
|
151
|
-
**Firebase Console → Project Settings → Your apps → Android app:**
|
|
152
|
-
|
|
153
|
-
- Add both SHA-1 fingerprints
|
|
154
|
-
- Download updated google-services.json
|
|
155
|
-
- Commit to repo root
|
|
156
|
-
|
|
157
|
-
**OAuth flow with SHA-1:**
|
|
158
|
-
Android Google Sign-In verifies the APK signing certificate at runtime.
|
|
159
|
-
If the SHA-1 of the signing cert doesn't match what's registered in Firebase/OAuth Console,
|
|
160
|
-
sign-in fails with `DEVELOPER_ERROR` (error code 10).
|
|
161
|
-
|
|
162
|
-
**Error code 10 in Google Sign-In = SHA-1 mismatch.** Always the first thing to check.
|
|
163
|
-
|
|
164
|
-
**Firebase OAuth client ID for Android:**
|
|
165
|
-
`929418470411-ipdh7o4dp8fijjm7vbcmk43u03nnf1s7.apps.googleusercontent.com`
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## 5. Play Console Deep Dive
|
|
170
|
-
|
|
171
|
-
**Account:** <email>
|
|
172
|
-
**App:** <project> Shield · Package: com.<project>.shield
|
|
173
|
-
**App ID:** 6099591004492585106
|
|
174
|
-
|
|
175
|
-
**Track types:**
|
|
176
|
-
| Track | Description | Review required |
|
|
177
|
-
|-------|-------------|-----------------|
|
|
178
|
-
| Internal testing | Up to 100 testers (by email) | No review, available in minutes |
|
|
179
|
-
| Closed testing (Alpha) | Up to ~thousand testers | Brief review (~hours) |
|
|
180
|
-
| Open testing (Beta) | Unlimited testers, opt-in | Brief review |
|
|
181
|
-
| Production | All users | Full review (~days) |
|
|
182
|
-
|
|
183
|
-
**Staged rollout:**
|
|
184
|
-
|
|
185
|
-
- Roll out to 1%, 5%, 10%, 20%, 50%, 100% of users
|
|
186
|
-
- Monitor crash rate and ANR rate before expanding
|
|
187
|
-
- Can halt rollout if issues detected
|
|
188
|
-
- <project>: start at 20% for new releases until stable
|
|
189
|
-
|
|
190
|
-
**Play Console review timeline:**
|
|
191
|
-
|
|
192
|
-
- Internal testing: minutes (no review)
|
|
193
|
-
- Closed/Open testing: a few hours to 1 day
|
|
194
|
-
- Production first release: 1-3 business days
|
|
195
|
-
- Production updates for established apps: hours to 1 day
|
|
196
|
-
- Post-rejection resubmission: same timeline
|
|
197
|
-
|
|
198
|
-
**Policy dashboard:** Play Console → Policy status → Review violations
|
|
199
|
-
**Pre-launch reports:** Automated Firebase Test Lab tests run on your AAB
|
|
200
|
-
**Android vitals:** Crash rate, ANR rate, battery, permissions
|
|
201
|
-
|
|
202
|
-
**AAB upload steps:**
|
|
203
|
-
|
|
204
|
-
1. Play Console → App → Release → Closed testing (or Internal testing)
|
|
205
|
-
2. Create new release
|
|
206
|
-
3. Upload AAB file
|
|
207
|
-
4. Fill "What's new in this release"
|
|
208
|
-
5. Review release → Save → Start rollout
|
|
209
|
-
|
|
210
|
-
**Version code error on upload:**
|
|
211
|
-
|
|
212
|
-
> "Version code X has already been used. Try another version code."
|
|
213
|
-
> Fix: increment versionCode in app.json and rebuild.
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 6. Play Store Review & Policies
|
|
218
|
-
|
|
219
|
-
**Critical policies for <project> (financial app):**
|
|
220
|
-
|
|
221
|
-
- **Financial services policy:** Apps offering banking/financial services must comply with local laws, display required disclosures, and not mislead users about financial products.
|
|
222
|
-
- **Personal data:** Declare all data collection in the Data Safety section.
|
|
223
|
-
- **Sensitive permissions:** CAMERA, CONTACTS, LOCATION, READ_CALL_LOG require prominent disclosure at runtime before requesting.
|
|
224
|
-
|
|
225
|
-
**Data Safety section (required since 2022):**
|
|
226
|
-
|
|
227
|
-
- Must declare all data types collected, whether shared with third parties, whether data can be deleted by user
|
|
228
|
-
- <project> data types: Name, Email, Phone number, Financial info (account numbers), Device identifiers
|
|
229
|
-
- Fill in Play Console → App content → Data safety
|
|
230
|
-
|
|
231
|
-
**Target audience:** If any content could appeal to children, must comply with Families Policy.
|
|
232
|
-
<project> target: adults only → confirm in Play Console → App content → Target audience.
|
|
233
|
-
|
|
234
|
-
**POST_NOTIFICATIONS permission (Android 13+):**
|
|
235
|
-
Must request at runtime — cannot assume it's granted.
|
|
236
|
-
|
|
237
|
-
```kotlin
|
|
238
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
239
|
-
ActivityCompat.requestPermissions(
|
|
240
|
-
this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1)
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
In Expo: `expo-notifications` handles this automatically.
|
|
245
|
-
|
|
246
|
-
**Permission best practices:**
|
|
247
|
-
|
|
248
|
-
- Request permissions at the moment they're needed (contextual)
|
|
249
|
-
- Never request all permissions at app launch
|
|
250
|
-
- Provide rationale before requesting (especially for sensitive permissions)
|
|
251
|
-
- Handle denial gracefully
|
|
252
|
-
|
|
253
|
-
**Common rejection reasons:**
|
|
254
|
-
|
|
255
|
-
- Missing privacy policy (must be accessible in-app AND in store listing)
|
|
256
|
-
- Missing data safety declaration
|
|
257
|
-
- Misleading app description
|
|
258
|
-
- Screenshot doesn't match actual app UI
|
|
259
|
-
- App requests permissions not needed for stated functionality
|
|
260
|
-
- Financial claims not substantiated (e.g., "guaranteed fraud protection")
|
|
261
|
-
- App crashes during Play review testing
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
## 7. App Bundle (AAB) vs APK
|
|
266
|
-
|
|
267
|
-
**Always use AAB for Play Store.** APKs are no longer accepted for new apps.
|
|
268
|
-
|
|
269
|
-
**AAB benefits:**
|
|
270
|
-
|
|
271
|
-
- Google optimizes delivery per device (only relevant code/resources)
|
|
272
|
-
- Smaller install size for users (20-50% reduction)
|
|
273
|
-
- Required for Play App Signing
|
|
274
|
-
|
|
275
|
-
**AAB structure:**
|
|
276
|
-
|
|
277
|
-
- `base/` — main app module
|
|
278
|
-
- `feature/` — optional dynamic feature modules
|
|
279
|
-
- Resources split by density, ABI, language
|
|
280
|
-
|
|
281
|
-
**EAS produces AAB** for the `production` profile automatically.
|
|
282
|
-
EAS produces APK for `preview` profile (for direct installation without Play Store).
|
|
283
|
-
|
|
284
|
-
**Local build (not EAS):**
|
|
285
|
-
|
|
286
|
-
```bash
|
|
287
|
-
cd android
|
|
288
|
-
./gradlew bundleRelease
|
|
289
|
-
# Output: app/build/outputs/bundle/release/app-release.aab
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
---
|
|
293
|
-
|
|
294
|
-
## 8. FCM v1 API
|
|
295
|
-
|
|
296
|
-
**Legacy HTTP API deprecated July 2024 — use v1 API only.**
|
|
297
|
-
|
|
298
|
-
**FCM v1 endpoint:**
|
|
299
|
-
`POST https://fcm.googleapis.com/v1/projects/{project_id}/messages:send`
|
|
300
|
-
|
|
301
|
-
**Auth:** OAuth 2.0 Bearer token using service account key (FIREBASE_SERVICE_ACCOUNT_KEY in GCP Secret Manager)
|
|
302
|
-
|
|
303
|
-
**Message structure (v1):**
|
|
304
|
-
|
|
305
|
-
```json
|
|
306
|
-
{
|
|
307
|
-
"message": {
|
|
308
|
-
"token": "device_fcm_token",
|
|
309
|
-
"notification": {
|
|
310
|
-
"title": "ACH Transfer Challenge",
|
|
311
|
-
"body": "Tap the matching number"
|
|
312
|
-
},
|
|
313
|
-
"data": {
|
|
314
|
-
"type": "ach_challenge",
|
|
315
|
-
"challengeId": "uuid",
|
|
316
|
-
"options": "[\"3\",\"7\",\"9\"]"
|
|
317
|
-
},
|
|
318
|
-
"android": {
|
|
319
|
-
"priority": "high",
|
|
320
|
-
"notification": {
|
|
321
|
-
"channel_id": "ach_challenges",
|
|
322
|
-
"sound": "default"
|
|
323
|
-
}
|
|
324
|
-
},
|
|
325
|
-
"apns": {
|
|
326
|
-
"headers": { "apns-priority": "10" },
|
|
327
|
-
"payload": {
|
|
328
|
-
"aps": {
|
|
329
|
-
"sound": "default",
|
|
330
|
-
"badge": 1,
|
|
331
|
-
"content-available": 1
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
**Android notification channels (required Android 8.0+):**
|
|
340
|
-
Create channels at app startup:
|
|
341
|
-
|
|
342
|
-
```kotlin
|
|
343
|
-
val channel = NotificationChannel(
|
|
344
|
-
"ach_challenges",
|
|
345
|
-
"ACH Challenges",
|
|
346
|
-
NotificationManager.IMPORTANCE_HIGH
|
|
347
|
-
).apply {
|
|
348
|
-
description = "ACH transfer challenge notifications"
|
|
349
|
-
}
|
|
350
|
-
val notificationManager = getSystemService(NotificationManager::class.java)
|
|
351
|
-
notificationManager.createNotificationChannel(channel)
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
In Expo: configure in `app.json`:
|
|
355
|
-
|
|
356
|
-
```json
|
|
357
|
-
{
|
|
358
|
-
"expo": {
|
|
359
|
-
"android": {
|
|
360
|
-
"googleServicesFile": "./google-services.json"
|
|
361
|
-
},
|
|
362
|
-
"plugins": [
|
|
363
|
-
[
|
|
364
|
-
"expo-notifications",
|
|
365
|
-
{
|
|
366
|
-
"androidCollapsedTitle": "<project>",
|
|
367
|
-
"channels": [
|
|
368
|
-
{
|
|
369
|
-
"name": "ach_challenges",
|
|
370
|
-
"importance": "max",
|
|
371
|
-
"vibrationPattern": [0, 250, 250, 250]
|
|
372
|
-
}
|
|
373
|
-
]
|
|
374
|
-
}
|
|
375
|
-
]
|
|
376
|
-
]
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
**Sending FCM from Next.js backend:**
|
|
382
|
-
|
|
383
|
-
```typescript
|
|
384
|
-
import { GoogleAuth } from "google-auth-library";
|
|
385
|
-
|
|
386
|
-
async function sendFCMNotification(token: string, data: object) {
|
|
387
|
-
const auth = new GoogleAuth({
|
|
388
|
-
scopes: ["https://www.googleapis.com/auth/firebase.messaging"],
|
|
389
|
-
credentials: JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_KEY!),
|
|
390
|
-
});
|
|
391
|
-
const client = await auth.getClient();
|
|
392
|
-
const accessToken = await client.getAccessToken();
|
|
393
|
-
|
|
394
|
-
const response = await fetch(
|
|
395
|
-
`https://fcm.googleapis.com/v1/projects/<gcp-project>-a98aa/messages:send`,
|
|
396
|
-
{
|
|
397
|
-
method: "POST",
|
|
398
|
-
headers: {
|
|
399
|
-
Authorization: `Bearer ${accessToken.token}`,
|
|
400
|
-
"Content-Type": "application/json",
|
|
401
|
-
},
|
|
402
|
-
body: JSON.stringify({ message: { token, ...data } }),
|
|
403
|
-
},
|
|
404
|
-
);
|
|
405
|
-
return response.json();
|
|
406
|
-
}
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
---
|
|
410
|
-
|
|
411
|
-
## 9. Google Sign-In Android
|
|
412
|
-
|
|
413
|
-
**Error codes:**
|
|
414
|
-
| Code | Meaning | Fix |
|
|
415
|
-
|------|---------|-----|
|
|
416
|
-
| 10 (DEVELOPER_ERROR) | SHA-1 mismatch | Add both dev + prod SHA-1 to Firebase; download new google-services.json |
|
|
417
|
-
| 12500 | Sign-in failed | Check SHA-1 and OAuth client configuration |
|
|
418
|
-
| 12501 | Sign-in cancelled | User dismissed |
|
|
419
|
-
| 12502 | Sign-in currently in progress | Deduplicate calls |
|
|
420
|
-
| 7 | NETWORK_ERROR | No internet connection |
|
|
421
|
-
|
|
422
|
-
**SHA-1 is the #1 cause of DEVELOPER_ERROR (code 10).**
|
|
423
|
-
|
|
424
|
-
Diagnosis: `adb logcat | grep "Google Sign-In"` — look for "SHA-1 not registered"
|
|
425
|
-
|
|
426
|
-
**Expo/React Native Google Sign-In setup:**
|
|
427
|
-
|
|
428
|
-
```json
|
|
429
|
-
// app.json
|
|
430
|
-
{
|
|
431
|
-
"expo": {
|
|
432
|
-
"plugins": [
|
|
433
|
-
[
|
|
434
|
-
"@react-native-google-signin/google-signin",
|
|
435
|
-
{
|
|
436
|
-
"iosUrlScheme": "com.googleusercontent.apps.929418470411-XXXXX"
|
|
437
|
-
}
|
|
438
|
-
]
|
|
439
|
-
]
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
```typescript
|
|
445
|
-
import { GoogleSignin } from "@react-native-google-signin/google-signin";
|
|
446
|
-
|
|
447
|
-
GoogleSignin.configure({
|
|
448
|
-
webClientId: "WEB_CLIENT_ID.apps.googleusercontent.com", // from Firebase Console
|
|
449
|
-
offlineAccess: true,
|
|
450
|
-
});
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
**webClientId = Web client OAuth client ID**, NOT Android client ID.
|
|
454
|
-
Find in Firebase Console → Authentication → Sign-in method → Google → Web SDK configuration.
|
|
455
|
-
|
|
456
|
-
---
|
|
457
|
-
|
|
458
|
-
## 10. Target SDK Requirements
|
|
459
|
-
|
|
460
|
-
**Google Play enforcement schedule:**
|
|
461
|
-
| Date | Requirement |
|
|
462
|
-
|------|-------------|
|
|
463
|
-
| August 2024 | New apps: targetSdkVersion ≥ 34 |
|
|
464
|
-
| November 2024 | Existing apps updates: targetSdkVersion ≥ 34 |
|
|
465
|
-
| 2025+ | ≥ 35 for new apps (Android 15) |
|
|
466
|
-
|
|
467
|
-
**Android 14 (API 34) behavior changes affecting <project>:**
|
|
468
|
-
|
|
469
|
-
- Foreground service types required (specify `android:foregroundServiceType`)
|
|
470
|
-
- `ACTION_SCHEDULE_EXACT_ALARM` permission requires user opt-in
|
|
471
|
-
- Photos/Media permissions split (partial access option)
|
|
472
|
-
- Health Connect for health data
|
|
473
|
-
|
|
474
|
-
**Android 15 (API 35) behavior changes:**
|
|
475
|
-
|
|
476
|
-
- Edge-to-edge display enforcement
|
|
477
|
-
- Health Connect permissions more granular
|
|
478
|
-
- Predictive back gesture default on
|
|
479
|
-
|
|
480
|
-
**In Expo (SDK 54), targetSdkVersion is set automatically.**
|
|
481
|
-
Verify in `android/build.gradle` (ejected) or let EAS manage it.
|
|
482
|
-
|
|
483
|
-
---
|
|
484
|
-
|
|
485
|
-
## 11. Background Processing
|
|
486
|
-
|
|
487
|
-
**WorkManager (recommended for most background work):**
|
|
488
|
-
|
|
489
|
-
```kotlin
|
|
490
|
-
// Kotlin
|
|
491
|
-
val workRequest = PeriodicWorkRequestBuilder<SyncWorker>(15, TimeUnit.MINUTES)
|
|
492
|
-
.setConstraints(Constraints.Builder()
|
|
493
|
-
.setRequiredNetworkType(NetworkType.CONNECTED)
|
|
494
|
-
.build())
|
|
495
|
-
.build()
|
|
496
|
-
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
|
|
497
|
-
"sync_guardian", ExistingPeriodicWorkPolicy.KEEP, workRequest)
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
In Expo/React Native: `expo-background-fetch` wraps this.
|
|
501
|
-
|
|
502
|
-
**Doze mode and App Standby:**
|
|
503
|
-
|
|
504
|
-
- Android 6+ throttles background processes when device is idle
|
|
505
|
-
- FCM high-priority messages bypass Doze
|
|
506
|
-
- WorkManager automatically handles Doze scheduling
|
|
507
|
-
- Battery optimization exemption: can request user to exempt your app (not automatic)
|
|
508
|
-
|
|
509
|
-
**Exact alarms (Android 12+):**
|
|
510
|
-
|
|
511
|
-
- `SCHEDULE_EXACT_ALARM` permission required for exact alarms
|
|
512
|
-
- Must show rationale and send user to settings if denied
|
|
513
|
-
- For most use cases, use `setAndAllowWhileIdle` or WorkManager instead
|
|
514
|
-
|
|
515
|
-
---
|
|
516
|
-
|
|
517
|
-
## 12. ProGuard / R8
|
|
518
|
-
|
|
519
|
-
**R8 (default in modern Android) replaces ProGuard:**
|
|
520
|
-
|
|
521
|
-
- Minification (removes unused code)
|
|
522
|
-
- Obfuscation (renames classes/methods)
|
|
523
|
-
- Optimization (inlines code, removes dead code)
|
|
524
|
-
|
|
525
|
-
**Enable in build.gradle (enabled by default in release builds):**
|
|
526
|
-
|
|
527
|
-
```groovy
|
|
528
|
-
buildTypes {
|
|
529
|
-
release {
|
|
530
|
-
minifyEnabled true
|
|
531
|
-
shrinkResources true
|
|
532
|
-
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
```
|
|
536
|
-
|
|
537
|
-
**Critical keep rules for <project>:**
|
|
538
|
-
|
|
539
|
-
```proguard
|
|
540
|
-
# Keep Firebase classes
|
|
541
|
-
-keep class com.google.firebase.** { *; }
|
|
542
|
-
-keep class com.google.android.gms.** { *; }
|
|
543
|
-
|
|
544
|
-
# Keep React Native
|
|
545
|
-
-keep class com.facebook.react.** { *; }
|
|
546
|
-
|
|
547
|
-
# Keep Expo modules
|
|
548
|
-
-keep class expo.modules.** { *; }
|
|
549
|
-
|
|
550
|
-
# Keep data classes used with JSON parsing
|
|
551
|
-
-keep class com.<project>.** { *; }
|
|
552
|
-
-keepclassmembers class ** {
|
|
553
|
-
@com.google.gson.annotations.SerializedName <fields>;
|
|
554
|
-
}
|
|
555
|
-
```
|
|
556
|
-
|
|
557
|
-
**EAS handles ProGuard configuration** for managed workflow.
|
|
558
|
-
For bare workflow: maintain `android/app/proguard-rules.pro`.
|
|
559
|
-
|
|
560
|
-
**Debugging ProGuard issues:**
|
|
561
|
-
|
|
562
|
-
- Use `mapping.txt` (generated with each release build) to de-obfuscate stack traces
|
|
563
|
-
- Upload `mapping.txt` to Play Console for automatic de-obfuscation in Android Vitals
|
|
564
|
-
- Firebase Crashlytics can also use mapping.txt for clear crash reports
|
|
565
|
-
|
|
566
|
-
---
|
|
567
|
-
|
|
568
|
-
## 13. Firebase Android Integration
|
|
569
|
-
|
|
570
|
-
**<project> Firebase:**
|
|
571
|
-
|
|
572
|
-
- Project: <gcp-project>-a98aa
|
|
573
|
-
- Android App ID: `1:929418470411:android:d88ddc48cf7656271d130e`
|
|
574
|
-
- google-services.json: in repo root
|
|
575
|
-
|
|
576
|
-
**google-services.json structure:**
|
|
577
|
-
|
|
578
|
-
```json
|
|
579
|
-
{
|
|
580
|
-
"project_info": {
|
|
581
|
-
"project_number": "929418470411",
|
|
582
|
-
"project_id": "<gcp-project>-a98aa"
|
|
583
|
-
},
|
|
584
|
-
"client": [{
|
|
585
|
-
"client_info": {
|
|
586
|
-
"mobilesdk_app_id": "1:929418470411:android:d88ddc48cf7656271d130e",
|
|
587
|
-
"android_client_info": {
|
|
588
|
-
"package_name": "com.<project>.shield"
|
|
589
|
-
}
|
|
590
|
-
},
|
|
591
|
-
"oauth_client": [{
|
|
592
|
-
"client_id": "929418470411-ipdh7o4dp8fijjm7vbcmk43u03nnf1s7.apps.googleusercontent.com",
|
|
593
|
-
"client_type": 1,
|
|
594
|
-
"android_info": {
|
|
595
|
-
"package_name": "com.<project>.shield",
|
|
596
|
-
"certificate_hash": "SHA-1 goes here"
|
|
597
|
-
}
|
|
598
|
-
}],
|
|
599
|
-
"services": {
|
|
600
|
-
"appinvite_service": { ... }
|
|
601
|
-
}
|
|
602
|
-
}]
|
|
603
|
-
}
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
**After adding SHA-1 to Firebase → regenerate and re-download google-services.json.**
|
|
607
|
-
The file must be in the root of the Expo project (not android/ — EAS copies it).
|
|
608
|
-
|
|
609
|
-
---
|
|
610
|
-
|
|
611
|
-
## 14. Play Integrity API
|
|
612
|
-
|
|
613
|
-
**Replaces SafetyNet (deprecated November 2024).**
|
|
614
|
-
Use to verify: device integrity, app integrity, user license.
|
|
615
|
-
|
|
616
|
-
**Verdict types:**
|
|
617
|
-
|
|
618
|
-
- `MEETS_DEVICE_INTEGRITY` — device passes Android compatibility checks
|
|
619
|
-
- `MEETS_BASIC_INTEGRITY` — passes basic Android security checks
|
|
620
|
-
- `MEETS_STRONG_INTEGRITY` — certified hardware, bootloader locked
|
|
621
|
-
|
|
622
|
-
**For <project> (fintech):** Check `MEETS_BASIC_INTEGRITY` minimum before allowing ACH transactions.
|
|
623
|
-
|
|
624
|
-
**Implementation:**
|
|
625
|
-
|
|
626
|
-
```kotlin
|
|
627
|
-
val integrityManager = IntegrityManagerFactory.create(context)
|
|
628
|
-
val nonce = generateSecureNonce() // backend-generated
|
|
629
|
-
val integrityTokenResponse = integrityManager
|
|
630
|
-
.requestIntegrityToken(IntegrityTokenRequest.builder()
|
|
631
|
-
.setNonce(nonce)
|
|
632
|
-
.setCloudProjectNumber(929418470411L)
|
|
633
|
-
.build()).await()
|
|
634
|
-
// Send token to backend for verification
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
**Backend verification:**
|
|
638
|
-
POST to Google Play Integrity API → returns verdict.
|
|
639
|
-
Server-to-server verification using service account.
|
|
640
|
-
|
|
641
|
-
---
|
|
642
|
-
|
|
643
|
-
## 15. Common Android Submission Failures
|
|
644
|
-
|
|
645
|
-
**"You uploaded an APK or Android App Bundle that is not zip aligned":**
|
|
646
|
-
EAS handles this. If building locally: `zipalign -v -p 4 app.apk app-aligned.apk`
|
|
647
|
-
|
|
648
|
-
**"Your app targets an old version of Android":**
|
|
649
|
-
Increase `targetSdkVersion` to ≥ 34 in build.gradle or let EAS SDK 54 handle it.
|
|
650
|
-
|
|
651
|
-
**"This release is not compliant with the EU User Choice Billing policy":**
|
|
652
|
-
If operating in EU: must offer alternative billing options for subscriptions. <project>: not relevant for free app.
|
|
653
|
-
|
|
654
|
-
**"You need to publish to a restricted track first":**
|
|
655
|
-
For new accounts or apps: publish to internal testing first, then promote to production.
|
|
656
|
-
|
|
657
|
-
**"Sensitive permissions not declared":**
|
|
658
|
-
Add to Data Safety section in Play Console. Cannot just be in AndroidManifest.
|
|
659
|
-
|
|
660
|
-
**"Multiple DEX files define the same class":**
|
|
661
|
-
Dependency conflict in `build.gradle`. Use `exclude group:` to resolve.
|
|
662
|
-
|
|
663
|
-
**"App crashes on launch during pre-launch testing":**
|
|
664
|
-
Firebase Test Lab runs your app automatically. Common causes:
|
|
665
|
-
|
|
666
|
-
- Missing network permissions
|
|
667
|
-
- Missing google-services.json
|
|
668
|
-
- Unhandled exception on main thread at startup
|
|
669
|
-
- Native library not found
|
|
670
|
-
|
|
671
|
-
**versionCode not incrementing:**
|
|
672
|
-
Symptom: "Version code already uploaded"
|
|
673
|
-
Fix: `android.versionCode: <current + 1>` in app.json → EAS rebuild
|
|
674
|
-
|
|
675
|
-
**Google Sign-In fails in production but works in debug:**
|
|
676
|
-
Production SHA-1 (`41:35:AF...`) not added to Firebase.
|
|
677
|
-
Fix: Firebase Console → Android app → Add fingerprint → Download new google-services.json → commit → rebuild.
|
|
678
|
-
|
|
679
|
-
**"This app has not been reviewed yet":**
|
|
680
|
-
Normal for first closed testing release. Wait for review completion before promoting to production.
|
|
1
|
+
# Android Expert Reference — Build to Launch
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [Android Project Fundamentals](#1-android-project-fundamentals)
|
|
6
|
+
2. [Signing & Keystores](#2-signing--keystores)
|
|
7
|
+
3. [Play App Signing](#3-play-app-signing)
|
|
8
|
+
4. [SHA-1 Fingerprints & OAuth](#4-sha-1-fingerprints--oauth)
|
|
9
|
+
5. [Play Console Deep Dive](#5-play-console-deep-dive)
|
|
10
|
+
6. [Play Store Review & Policies](#6-play-store-review--policies)
|
|
11
|
+
7. [App Bundle (AAB) vs APK](#7-app-bundle-aab-vs-apk)
|
|
12
|
+
8. [FCM v1 API](#8-fcm-v1-api)
|
|
13
|
+
9. [Google Sign-In Android](#9-google-sign-in-android)
|
|
14
|
+
10. [Target SDK Requirements](#10-target-sdk-requirements)
|
|
15
|
+
11. [Background Processing](#11-background-processing)
|
|
16
|
+
12. [ProGuard / R8](#12-proguard--r8)
|
|
17
|
+
13. [Firebase Android Integration](#13-firebase-android-integration)
|
|
18
|
+
14. [Play Integrity API](#14-play-integrity-api)
|
|
19
|
+
15. [Common Android Submission Failures](#15-common-android-submission-failures)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Android Project Fundamentals
|
|
24
|
+
|
|
25
|
+
**versionCode rules:**
|
|
26
|
+
|
|
27
|
+
- Always an integer: 1, 2, 3...
|
|
28
|
+
- Must STRICTLY increase with every upload to Play Console
|
|
29
|
+
- Once uploaded, that versionCode can never be reused for that app
|
|
30
|
+
- EAS manages this via `android.versionCode` in app.json
|
|
31
|
+
|
|
32
|
+
**versionName rules:**
|
|
33
|
+
|
|
34
|
+
- Human-readable string: "2.3.0", "2.3.1"
|
|
35
|
+
- No strict requirement to increment (but should match marketing version)
|
|
36
|
+
- Shown to users in Play Store
|
|
37
|
+
|
|
38
|
+
**<project> Android current state:**
|
|
39
|
+
|
|
40
|
+
- versionCode 14 / v2.3.0 — under Play Store review
|
|
41
|
+
- versionCode 10 — currently active on devices
|
|
42
|
+
- Next build: versionCode 15 / v2.4.0
|
|
43
|
+
|
|
44
|
+
**Package name:** `com.<project>.shield` — permanent, never changes after first upload.
|
|
45
|
+
Changing package name = entirely new app listing with zero install base.
|
|
46
|
+
|
|
47
|
+
**Minimum SDK targets (2026):**
|
|
48
|
+
|
|
49
|
+
- `minSdkVersion`: 21 (Android 5.0) — covers 99%+ of active devices
|
|
50
|
+
- `targetSdkVersion`: 34 (Android 14) — **required by Google Play as of August 2024**
|
|
51
|
+
- `compileSdkVersion`: 35 (Android 15) — use latest
|
|
52
|
+
|
|
53
|
+
**Kotlin 2.0 highlights:**
|
|
54
|
+
|
|
55
|
+
- K2 compiler: 2x faster compilation
|
|
56
|
+
- `data class` copy with named arguments required
|
|
57
|
+
- Smart casts improved across function boundaries
|
|
58
|
+
- Compose: stable with Kotlin 2.0
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 2. Signing & Keystores
|
|
63
|
+
|
|
64
|
+
**Upload key vs App signing key:**
|
|
65
|
+
With Play App Signing (mandatory for AAB):
|
|
66
|
+
|
|
67
|
+
- **Upload key:** Used to sign AAB before uploading. Lives on your machine / EAS.
|
|
68
|
+
- **App signing key:** Managed by Google. Applied to the final APK delivered to devices.
|
|
69
|
+
- If you lose your upload key, you can register a new one in Play Console.
|
|
70
|
+
- The SHA-1 that matters for Google Sign-In is the **App signing key** SHA-1 (Google manages this).
|
|
71
|
+
|
|
72
|
+
**EAS manages signing automatically:**
|
|
73
|
+
|
|
74
|
+
- EAS generates and stores your upload keystore
|
|
75
|
+
- View keystore details: `eas credentials`
|
|
76
|
+
- SHA-1 of upload key (dev): `D6:04:59:BE:DC:0C:BC:0E:85:00:23:CA:A4:2B:F7:BE:1C:5D:C1:E4`
|
|
77
|
+
- SHA-1 of production key (Play App Signing): `41:35:AF:FE:B8:FE:BE:F9:DD:77:B4:61:05:BC:DA:7A:49:FC:F6:2B`
|
|
78
|
+
|
|
79
|
+
**Generating a keystore manually (if needed):**
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
keytool -genkeypair -v \
|
|
83
|
+
-storetype PKCS12 \
|
|
84
|
+
-keystore <project>-upload-key.jks \
|
|
85
|
+
-alias <project> \
|
|
86
|
+
-keyalg RSA \
|
|
87
|
+
-keysize 2048 \
|
|
88
|
+
-validity 10000
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Getting SHA-1 from keystore:**
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
keytool -list -v \
|
|
95
|
+
-keystore <project>-upload-key.jks \
|
|
96
|
+
-alias <project>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**CRITICAL:** Back up your keystore file + password + alias + alias password.
|
|
100
|
+
Without these you cannot update your app (you lose upload key recovery option).
|
|
101
|
+
EAS stores keystores in their secure vault — managed builds are backed up.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 3. Play App Signing
|
|
106
|
+
|
|
107
|
+
**Mandatory since August 2021** for new apps using AAB format.
|
|
108
|
+
|
|
109
|
+
**Flow:**
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
You sign AAB with upload key
|
|
113
|
+
→ Upload to Play Console
|
|
114
|
+
→ Google verifies your signature
|
|
115
|
+
→ Google re-signs with app signing key
|
|
116
|
+
→ Distributed to users signed with Google's key
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Finding your App Signing Certificate SHA-1 (for OAuth):**
|
|
120
|
+
|
|
121
|
+
1. Play Console → Release → Setup → App signing
|
|
122
|
+
2. "App signing key certificate" section → SHA-1 certificate fingerprint
|
|
123
|
+
3. This is the value that goes into Google Cloud Console / Firebase for production OAuth
|
|
124
|
+
|
|
125
|
+
**<project> App Signing Key SHA-1:**
|
|
126
|
+
`41:35:AF:FE:B8:FE:BE:F9:DD:77:B4:61:05:BC:DA:7A:49:FC:F6:2B`
|
|
127
|
+
|
|
128
|
+
**Upload key reset (if lost):**
|
|
129
|
+
|
|
130
|
+
1. Play Console → App → Setup → App signing
|
|
131
|
+
2. Request upload key reset
|
|
132
|
+
3. Generate new keystore, sign a new AAB
|
|
133
|
+
4. Submit with new AAB — Google verifies identity via Play Developer account
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 4. SHA-1 Fingerprints & OAuth
|
|
138
|
+
|
|
139
|
+
**Two SHA-1 fingerprints for <project> Android:**
|
|
140
|
+
|
|
141
|
+
1. **Dev SHA-1** (for debug builds and EAS development profile):
|
|
142
|
+
`D6:04:59:BE:DC:0C:BC:0E:85:00:23:CA:A4:2B:F7:BE:1C:5D:C1:E4`
|
|
143
|
+
→ Add to Firebase Android app → google-services.json regenerated
|
|
144
|
+
|
|
145
|
+
2. **Production SHA-1** (Play App Signing key — for Play Store builds):
|
|
146
|
+
`41:35:AF:FE:B8:FE:BE:F9:DD:77:B4:61:05:BC:DA:7A:49:FC:F6:2B`
|
|
147
|
+
→ Add to Firebase Android app → google-services.json regenerated
|
|
148
|
+
|
|
149
|
+
**Both SHA-1s must be registered in Firebase** for Google Sign-In to work across dev and production builds.
|
|
150
|
+
|
|
151
|
+
**Firebase Console → Project Settings → Your apps → Android app:**
|
|
152
|
+
|
|
153
|
+
- Add both SHA-1 fingerprints
|
|
154
|
+
- Download updated google-services.json
|
|
155
|
+
- Commit to repo root
|
|
156
|
+
|
|
157
|
+
**OAuth flow with SHA-1:**
|
|
158
|
+
Android Google Sign-In verifies the APK signing certificate at runtime.
|
|
159
|
+
If the SHA-1 of the signing cert doesn't match what's registered in Firebase/OAuth Console,
|
|
160
|
+
sign-in fails with `DEVELOPER_ERROR` (error code 10).
|
|
161
|
+
|
|
162
|
+
**Error code 10 in Google Sign-In = SHA-1 mismatch.** Always the first thing to check.
|
|
163
|
+
|
|
164
|
+
**Firebase OAuth client ID for Android:**
|
|
165
|
+
`929418470411-ipdh7o4dp8fijjm7vbcmk43u03nnf1s7.apps.googleusercontent.com`
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 5. Play Console Deep Dive
|
|
170
|
+
|
|
171
|
+
**Account:** <email>
|
|
172
|
+
**App:** <project> Shield · Package: com.<project>.shield
|
|
173
|
+
**App ID:** 6099591004492585106
|
|
174
|
+
|
|
175
|
+
**Track types:**
|
|
176
|
+
| Track | Description | Review required |
|
|
177
|
+
|-------|-------------|-----------------|
|
|
178
|
+
| Internal testing | Up to 100 testers (by email) | No review, available in minutes |
|
|
179
|
+
| Closed testing (Alpha) | Up to ~thousand testers | Brief review (~hours) |
|
|
180
|
+
| Open testing (Beta) | Unlimited testers, opt-in | Brief review |
|
|
181
|
+
| Production | All users | Full review (~days) |
|
|
182
|
+
|
|
183
|
+
**Staged rollout:**
|
|
184
|
+
|
|
185
|
+
- Roll out to 1%, 5%, 10%, 20%, 50%, 100% of users
|
|
186
|
+
- Monitor crash rate and ANR rate before expanding
|
|
187
|
+
- Can halt rollout if issues detected
|
|
188
|
+
- <project>: start at 20% for new releases until stable
|
|
189
|
+
|
|
190
|
+
**Play Console review timeline:**
|
|
191
|
+
|
|
192
|
+
- Internal testing: minutes (no review)
|
|
193
|
+
- Closed/Open testing: a few hours to 1 day
|
|
194
|
+
- Production first release: 1-3 business days
|
|
195
|
+
- Production updates for established apps: hours to 1 day
|
|
196
|
+
- Post-rejection resubmission: same timeline
|
|
197
|
+
|
|
198
|
+
**Policy dashboard:** Play Console → Policy status → Review violations
|
|
199
|
+
**Pre-launch reports:** Automated Firebase Test Lab tests run on your AAB
|
|
200
|
+
**Android vitals:** Crash rate, ANR rate, battery, permissions
|
|
201
|
+
|
|
202
|
+
**AAB upload steps:**
|
|
203
|
+
|
|
204
|
+
1. Play Console → App → Release → Closed testing (or Internal testing)
|
|
205
|
+
2. Create new release
|
|
206
|
+
3. Upload AAB file
|
|
207
|
+
4. Fill "What's new in this release"
|
|
208
|
+
5. Review release → Save → Start rollout
|
|
209
|
+
|
|
210
|
+
**Version code error on upload:**
|
|
211
|
+
|
|
212
|
+
> "Version code X has already been used. Try another version code."
|
|
213
|
+
> Fix: increment versionCode in app.json and rebuild.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 6. Play Store Review & Policies
|
|
218
|
+
|
|
219
|
+
**Critical policies for <project> (financial app):**
|
|
220
|
+
|
|
221
|
+
- **Financial services policy:** Apps offering banking/financial services must comply with local laws, display required disclosures, and not mislead users about financial products.
|
|
222
|
+
- **Personal data:** Declare all data collection in the Data Safety section.
|
|
223
|
+
- **Sensitive permissions:** CAMERA, CONTACTS, LOCATION, READ_CALL_LOG require prominent disclosure at runtime before requesting.
|
|
224
|
+
|
|
225
|
+
**Data Safety section (required since 2022):**
|
|
226
|
+
|
|
227
|
+
- Must declare all data types collected, whether shared with third parties, whether data can be deleted by user
|
|
228
|
+
- <project> data types: Name, Email, Phone number, Financial info (account numbers), Device identifiers
|
|
229
|
+
- Fill in Play Console → App content → Data safety
|
|
230
|
+
|
|
231
|
+
**Target audience:** If any content could appeal to children, must comply with Families Policy.
|
|
232
|
+
<project> target: adults only → confirm in Play Console → App content → Target audience.
|
|
233
|
+
|
|
234
|
+
**POST_NOTIFICATIONS permission (Android 13+):**
|
|
235
|
+
Must request at runtime — cannot assume it's granted.
|
|
236
|
+
|
|
237
|
+
```kotlin
|
|
238
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
239
|
+
ActivityCompat.requestPermissions(
|
|
240
|
+
this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1)
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
In Expo: `expo-notifications` handles this automatically.
|
|
245
|
+
|
|
246
|
+
**Permission best practices:**
|
|
247
|
+
|
|
248
|
+
- Request permissions at the moment they're needed (contextual)
|
|
249
|
+
- Never request all permissions at app launch
|
|
250
|
+
- Provide rationale before requesting (especially for sensitive permissions)
|
|
251
|
+
- Handle denial gracefully
|
|
252
|
+
|
|
253
|
+
**Common rejection reasons:**
|
|
254
|
+
|
|
255
|
+
- Missing privacy policy (must be accessible in-app AND in store listing)
|
|
256
|
+
- Missing data safety declaration
|
|
257
|
+
- Misleading app description
|
|
258
|
+
- Screenshot doesn't match actual app UI
|
|
259
|
+
- App requests permissions not needed for stated functionality
|
|
260
|
+
- Financial claims not substantiated (e.g., "guaranteed fraud protection")
|
|
261
|
+
- App crashes during Play review testing
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 7. App Bundle (AAB) vs APK
|
|
266
|
+
|
|
267
|
+
**Always use AAB for Play Store.** APKs are no longer accepted for new apps.
|
|
268
|
+
|
|
269
|
+
**AAB benefits:**
|
|
270
|
+
|
|
271
|
+
- Google optimizes delivery per device (only relevant code/resources)
|
|
272
|
+
- Smaller install size for users (20-50% reduction)
|
|
273
|
+
- Required for Play App Signing
|
|
274
|
+
|
|
275
|
+
**AAB structure:**
|
|
276
|
+
|
|
277
|
+
- `base/` — main app module
|
|
278
|
+
- `feature/` — optional dynamic feature modules
|
|
279
|
+
- Resources split by density, ABI, language
|
|
280
|
+
|
|
281
|
+
**EAS produces AAB** for the `production` profile automatically.
|
|
282
|
+
EAS produces APK for `preview` profile (for direct installation without Play Store).
|
|
283
|
+
|
|
284
|
+
**Local build (not EAS):**
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
cd android
|
|
288
|
+
./gradlew bundleRelease
|
|
289
|
+
# Output: app/build/outputs/bundle/release/app-release.aab
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 8. FCM v1 API
|
|
295
|
+
|
|
296
|
+
**Legacy HTTP API deprecated July 2024 — use v1 API only.**
|
|
297
|
+
|
|
298
|
+
**FCM v1 endpoint:**
|
|
299
|
+
`POST https://fcm.googleapis.com/v1/projects/{project_id}/messages:send`
|
|
300
|
+
|
|
301
|
+
**Auth:** OAuth 2.0 Bearer token using service account key (FIREBASE_SERVICE_ACCOUNT_KEY in GCP Secret Manager)
|
|
302
|
+
|
|
303
|
+
**Message structure (v1):**
|
|
304
|
+
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"message": {
|
|
308
|
+
"token": "device_fcm_token",
|
|
309
|
+
"notification": {
|
|
310
|
+
"title": "ACH Transfer Challenge",
|
|
311
|
+
"body": "Tap the matching number"
|
|
312
|
+
},
|
|
313
|
+
"data": {
|
|
314
|
+
"type": "ach_challenge",
|
|
315
|
+
"challengeId": "uuid",
|
|
316
|
+
"options": "[\"3\",\"7\",\"9\"]"
|
|
317
|
+
},
|
|
318
|
+
"android": {
|
|
319
|
+
"priority": "high",
|
|
320
|
+
"notification": {
|
|
321
|
+
"channel_id": "ach_challenges",
|
|
322
|
+
"sound": "default"
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
"apns": {
|
|
326
|
+
"headers": { "apns-priority": "10" },
|
|
327
|
+
"payload": {
|
|
328
|
+
"aps": {
|
|
329
|
+
"sound": "default",
|
|
330
|
+
"badge": 1,
|
|
331
|
+
"content-available": 1
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**Android notification channels (required Android 8.0+):**
|
|
340
|
+
Create channels at app startup:
|
|
341
|
+
|
|
342
|
+
```kotlin
|
|
343
|
+
val channel = NotificationChannel(
|
|
344
|
+
"ach_challenges",
|
|
345
|
+
"ACH Challenges",
|
|
346
|
+
NotificationManager.IMPORTANCE_HIGH
|
|
347
|
+
).apply {
|
|
348
|
+
description = "ACH transfer challenge notifications"
|
|
349
|
+
}
|
|
350
|
+
val notificationManager = getSystemService(NotificationManager::class.java)
|
|
351
|
+
notificationManager.createNotificationChannel(channel)
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
In Expo: configure in `app.json`:
|
|
355
|
+
|
|
356
|
+
```json
|
|
357
|
+
{
|
|
358
|
+
"expo": {
|
|
359
|
+
"android": {
|
|
360
|
+
"googleServicesFile": "./google-services.json"
|
|
361
|
+
},
|
|
362
|
+
"plugins": [
|
|
363
|
+
[
|
|
364
|
+
"expo-notifications",
|
|
365
|
+
{
|
|
366
|
+
"androidCollapsedTitle": "<project>",
|
|
367
|
+
"channels": [
|
|
368
|
+
{
|
|
369
|
+
"name": "ach_challenges",
|
|
370
|
+
"importance": "max",
|
|
371
|
+
"vibrationPattern": [0, 250, 250, 250]
|
|
372
|
+
}
|
|
373
|
+
]
|
|
374
|
+
}
|
|
375
|
+
]
|
|
376
|
+
]
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**Sending FCM from Next.js backend:**
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
import { GoogleAuth } from "google-auth-library";
|
|
385
|
+
|
|
386
|
+
async function sendFCMNotification(token: string, data: object) {
|
|
387
|
+
const auth = new GoogleAuth({
|
|
388
|
+
scopes: ["https://www.googleapis.com/auth/firebase.messaging"],
|
|
389
|
+
credentials: JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_KEY!),
|
|
390
|
+
});
|
|
391
|
+
const client = await auth.getClient();
|
|
392
|
+
const accessToken = await client.getAccessToken();
|
|
393
|
+
|
|
394
|
+
const response = await fetch(
|
|
395
|
+
`https://fcm.googleapis.com/v1/projects/<gcp-project>-a98aa/messages:send`,
|
|
396
|
+
{
|
|
397
|
+
method: "POST",
|
|
398
|
+
headers: {
|
|
399
|
+
Authorization: `Bearer ${accessToken.token}`,
|
|
400
|
+
"Content-Type": "application/json",
|
|
401
|
+
},
|
|
402
|
+
body: JSON.stringify({ message: { token, ...data } }),
|
|
403
|
+
},
|
|
404
|
+
);
|
|
405
|
+
return response.json();
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## 9. Google Sign-In Android
|
|
412
|
+
|
|
413
|
+
**Error codes:**
|
|
414
|
+
| Code | Meaning | Fix |
|
|
415
|
+
|------|---------|-----|
|
|
416
|
+
| 10 (DEVELOPER_ERROR) | SHA-1 mismatch | Add both dev + prod SHA-1 to Firebase; download new google-services.json |
|
|
417
|
+
| 12500 | Sign-in failed | Check SHA-1 and OAuth client configuration |
|
|
418
|
+
| 12501 | Sign-in cancelled | User dismissed |
|
|
419
|
+
| 12502 | Sign-in currently in progress | Deduplicate calls |
|
|
420
|
+
| 7 | NETWORK_ERROR | No internet connection |
|
|
421
|
+
|
|
422
|
+
**SHA-1 is the #1 cause of DEVELOPER_ERROR (code 10).**
|
|
423
|
+
|
|
424
|
+
Diagnosis: `adb logcat | grep "Google Sign-In"` — look for "SHA-1 not registered"
|
|
425
|
+
|
|
426
|
+
**Expo/React Native Google Sign-In setup:**
|
|
427
|
+
|
|
428
|
+
```json
|
|
429
|
+
// app.json
|
|
430
|
+
{
|
|
431
|
+
"expo": {
|
|
432
|
+
"plugins": [
|
|
433
|
+
[
|
|
434
|
+
"@react-native-google-signin/google-signin",
|
|
435
|
+
{
|
|
436
|
+
"iosUrlScheme": "com.googleusercontent.apps.929418470411-XXXXX"
|
|
437
|
+
}
|
|
438
|
+
]
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
import { GoogleSignin } from "@react-native-google-signin/google-signin";
|
|
446
|
+
|
|
447
|
+
GoogleSignin.configure({
|
|
448
|
+
webClientId: "WEB_CLIENT_ID.apps.googleusercontent.com", // from Firebase Console
|
|
449
|
+
offlineAccess: true,
|
|
450
|
+
});
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**webClientId = Web client OAuth client ID**, NOT Android client ID.
|
|
454
|
+
Find in Firebase Console → Authentication → Sign-in method → Google → Web SDK configuration.
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## 10. Target SDK Requirements
|
|
459
|
+
|
|
460
|
+
**Google Play enforcement schedule:**
|
|
461
|
+
| Date | Requirement |
|
|
462
|
+
|------|-------------|
|
|
463
|
+
| August 2024 | New apps: targetSdkVersion ≥ 34 |
|
|
464
|
+
| November 2024 | Existing apps updates: targetSdkVersion ≥ 34 |
|
|
465
|
+
| 2025+ | ≥ 35 for new apps (Android 15) |
|
|
466
|
+
|
|
467
|
+
**Android 14 (API 34) behavior changes affecting <project>:**
|
|
468
|
+
|
|
469
|
+
- Foreground service types required (specify `android:foregroundServiceType`)
|
|
470
|
+
- `ACTION_SCHEDULE_EXACT_ALARM` permission requires user opt-in
|
|
471
|
+
- Photos/Media permissions split (partial access option)
|
|
472
|
+
- Health Connect for health data
|
|
473
|
+
|
|
474
|
+
**Android 15 (API 35) behavior changes:**
|
|
475
|
+
|
|
476
|
+
- Edge-to-edge display enforcement
|
|
477
|
+
- Health Connect permissions more granular
|
|
478
|
+
- Predictive back gesture default on
|
|
479
|
+
|
|
480
|
+
**In Expo (SDK 54), targetSdkVersion is set automatically.**
|
|
481
|
+
Verify in `android/build.gradle` (ejected) or let EAS manage it.
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 11. Background Processing
|
|
486
|
+
|
|
487
|
+
**WorkManager (recommended for most background work):**
|
|
488
|
+
|
|
489
|
+
```kotlin
|
|
490
|
+
// Kotlin
|
|
491
|
+
val workRequest = PeriodicWorkRequestBuilder<SyncWorker>(15, TimeUnit.MINUTES)
|
|
492
|
+
.setConstraints(Constraints.Builder()
|
|
493
|
+
.setRequiredNetworkType(NetworkType.CONNECTED)
|
|
494
|
+
.build())
|
|
495
|
+
.build()
|
|
496
|
+
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
|
|
497
|
+
"sync_guardian", ExistingPeriodicWorkPolicy.KEEP, workRequest)
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
In Expo/React Native: `expo-background-fetch` wraps this.
|
|
501
|
+
|
|
502
|
+
**Doze mode and App Standby:**
|
|
503
|
+
|
|
504
|
+
- Android 6+ throttles background processes when device is idle
|
|
505
|
+
- FCM high-priority messages bypass Doze
|
|
506
|
+
- WorkManager automatically handles Doze scheduling
|
|
507
|
+
- Battery optimization exemption: can request user to exempt your app (not automatic)
|
|
508
|
+
|
|
509
|
+
**Exact alarms (Android 12+):**
|
|
510
|
+
|
|
511
|
+
- `SCHEDULE_EXACT_ALARM` permission required for exact alarms
|
|
512
|
+
- Must show rationale and send user to settings if denied
|
|
513
|
+
- For most use cases, use `setAndAllowWhileIdle` or WorkManager instead
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
## 12. ProGuard / R8
|
|
518
|
+
|
|
519
|
+
**R8 (default in modern Android) replaces ProGuard:**
|
|
520
|
+
|
|
521
|
+
- Minification (removes unused code)
|
|
522
|
+
- Obfuscation (renames classes/methods)
|
|
523
|
+
- Optimization (inlines code, removes dead code)
|
|
524
|
+
|
|
525
|
+
**Enable in build.gradle (enabled by default in release builds):**
|
|
526
|
+
|
|
527
|
+
```groovy
|
|
528
|
+
buildTypes {
|
|
529
|
+
release {
|
|
530
|
+
minifyEnabled true
|
|
531
|
+
shrinkResources true
|
|
532
|
+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
**Critical keep rules for <project>:**
|
|
538
|
+
|
|
539
|
+
```proguard
|
|
540
|
+
# Keep Firebase classes
|
|
541
|
+
-keep class com.google.firebase.** { *; }
|
|
542
|
+
-keep class com.google.android.gms.** { *; }
|
|
543
|
+
|
|
544
|
+
# Keep React Native
|
|
545
|
+
-keep class com.facebook.react.** { *; }
|
|
546
|
+
|
|
547
|
+
# Keep Expo modules
|
|
548
|
+
-keep class expo.modules.** { *; }
|
|
549
|
+
|
|
550
|
+
# Keep data classes used with JSON parsing
|
|
551
|
+
-keep class com.<project>.** { *; }
|
|
552
|
+
-keepclassmembers class ** {
|
|
553
|
+
@com.google.gson.annotations.SerializedName <fields>;
|
|
554
|
+
}
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
**EAS handles ProGuard configuration** for managed workflow.
|
|
558
|
+
For bare workflow: maintain `android/app/proguard-rules.pro`.
|
|
559
|
+
|
|
560
|
+
**Debugging ProGuard issues:**
|
|
561
|
+
|
|
562
|
+
- Use `mapping.txt` (generated with each release build) to de-obfuscate stack traces
|
|
563
|
+
- Upload `mapping.txt` to Play Console for automatic de-obfuscation in Android Vitals
|
|
564
|
+
- Firebase Crashlytics can also use mapping.txt for clear crash reports
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## 13. Firebase Android Integration
|
|
569
|
+
|
|
570
|
+
**<project> Firebase:**
|
|
571
|
+
|
|
572
|
+
- Project: <gcp-project>-a98aa
|
|
573
|
+
- Android App ID: `1:929418470411:android:d88ddc48cf7656271d130e`
|
|
574
|
+
- google-services.json: in repo root
|
|
575
|
+
|
|
576
|
+
**google-services.json structure:**
|
|
577
|
+
|
|
578
|
+
```json
|
|
579
|
+
{
|
|
580
|
+
"project_info": {
|
|
581
|
+
"project_number": "929418470411",
|
|
582
|
+
"project_id": "<gcp-project>-a98aa"
|
|
583
|
+
},
|
|
584
|
+
"client": [{
|
|
585
|
+
"client_info": {
|
|
586
|
+
"mobilesdk_app_id": "1:929418470411:android:d88ddc48cf7656271d130e",
|
|
587
|
+
"android_client_info": {
|
|
588
|
+
"package_name": "com.<project>.shield"
|
|
589
|
+
}
|
|
590
|
+
},
|
|
591
|
+
"oauth_client": [{
|
|
592
|
+
"client_id": "929418470411-ipdh7o4dp8fijjm7vbcmk43u03nnf1s7.apps.googleusercontent.com",
|
|
593
|
+
"client_type": 1,
|
|
594
|
+
"android_info": {
|
|
595
|
+
"package_name": "com.<project>.shield",
|
|
596
|
+
"certificate_hash": "SHA-1 goes here"
|
|
597
|
+
}
|
|
598
|
+
}],
|
|
599
|
+
"services": {
|
|
600
|
+
"appinvite_service": { ... }
|
|
601
|
+
}
|
|
602
|
+
}]
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
**After adding SHA-1 to Firebase → regenerate and re-download google-services.json.**
|
|
607
|
+
The file must be in the root of the Expo project (not android/ — EAS copies it).
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
## 14. Play Integrity API
|
|
612
|
+
|
|
613
|
+
**Replaces SafetyNet (deprecated November 2024).**
|
|
614
|
+
Use to verify: device integrity, app integrity, user license.
|
|
615
|
+
|
|
616
|
+
**Verdict types:**
|
|
617
|
+
|
|
618
|
+
- `MEETS_DEVICE_INTEGRITY` — device passes Android compatibility checks
|
|
619
|
+
- `MEETS_BASIC_INTEGRITY` — passes basic Android security checks
|
|
620
|
+
- `MEETS_STRONG_INTEGRITY` — certified hardware, bootloader locked
|
|
621
|
+
|
|
622
|
+
**For <project> (fintech):** Check `MEETS_BASIC_INTEGRITY` minimum before allowing ACH transactions.
|
|
623
|
+
|
|
624
|
+
**Implementation:**
|
|
625
|
+
|
|
626
|
+
```kotlin
|
|
627
|
+
val integrityManager = IntegrityManagerFactory.create(context)
|
|
628
|
+
val nonce = generateSecureNonce() // backend-generated
|
|
629
|
+
val integrityTokenResponse = integrityManager
|
|
630
|
+
.requestIntegrityToken(IntegrityTokenRequest.builder()
|
|
631
|
+
.setNonce(nonce)
|
|
632
|
+
.setCloudProjectNumber(929418470411L)
|
|
633
|
+
.build()).await()
|
|
634
|
+
// Send token to backend for verification
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
**Backend verification:**
|
|
638
|
+
POST to Google Play Integrity API → returns verdict.
|
|
639
|
+
Server-to-server verification using service account.
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
## 15. Common Android Submission Failures
|
|
644
|
+
|
|
645
|
+
**"You uploaded an APK or Android App Bundle that is not zip aligned":**
|
|
646
|
+
EAS handles this. If building locally: `zipalign -v -p 4 app.apk app-aligned.apk`
|
|
647
|
+
|
|
648
|
+
**"Your app targets an old version of Android":**
|
|
649
|
+
Increase `targetSdkVersion` to ≥ 34 in build.gradle or let EAS SDK 54 handle it.
|
|
650
|
+
|
|
651
|
+
**"This release is not compliant with the EU User Choice Billing policy":**
|
|
652
|
+
If operating in EU: must offer alternative billing options for subscriptions. <project>: not relevant for free app.
|
|
653
|
+
|
|
654
|
+
**"You need to publish to a restricted track first":**
|
|
655
|
+
For new accounts or apps: publish to internal testing first, then promote to production.
|
|
656
|
+
|
|
657
|
+
**"Sensitive permissions not declared":**
|
|
658
|
+
Add to Data Safety section in Play Console. Cannot just be in AndroidManifest.
|
|
659
|
+
|
|
660
|
+
**"Multiple DEX files define the same class":**
|
|
661
|
+
Dependency conflict in `build.gradle`. Use `exclude group:` to resolve.
|
|
662
|
+
|
|
663
|
+
**"App crashes on launch during pre-launch testing":**
|
|
664
|
+
Firebase Test Lab runs your app automatically. Common causes:
|
|
665
|
+
|
|
666
|
+
- Missing network permissions
|
|
667
|
+
- Missing google-services.json
|
|
668
|
+
- Unhandled exception on main thread at startup
|
|
669
|
+
- Native library not found
|
|
670
|
+
|
|
671
|
+
**versionCode not incrementing:**
|
|
672
|
+
Symptom: "Version code already uploaded"
|
|
673
|
+
Fix: `android.versionCode: <current + 1>` in app.json → EAS rebuild
|
|
674
|
+
|
|
675
|
+
**Google Sign-In fails in production but works in debug:**
|
|
676
|
+
Production SHA-1 (`41:35:AF...`) not added to Firebase.
|
|
677
|
+
Fix: Firebase Console → Android app → Add fingerprint → Download new google-services.json → commit → rebuild.
|
|
678
|
+
|
|
679
|
+
**"This app has not been reviewed yet":**
|
|
680
|
+
Normal for first closed testing release. Wait for review completion before promoting to production.
|