novahiz 0.2.2 → 0.2.5
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/NOTICE.md +25 -15
- package/README.md +353 -355
- package/adapters/README.md +1 -1
- package/adapters/opencode/agent/novahiz.md +1 -2
- package/adapters/opencode/commands/novahiz-init.md +10 -0
- package/adapters/opencode/instructions.md +1 -1
- package/adapters/opencode/novahiz.ts +182 -4
- package/bin/novahiz.cmd +2 -2
- package/catalog/categories.json +1085 -1093
- package/catalog/overrides.json +12 -13
- package/catalog/providers.json +18 -34
- package/catalog/rules.json +15 -22
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/CATALOG.md +7 -6
- package/docs/CONFIGURATION.md +5 -5
- package/docs/CONSTITUTION.md +4 -4
- package/docs/GATE.md +7 -11
- package/docs/HARNESSES.md +11 -0
- package/docs/INSTALL.md +7 -5
- package/docs/PLUGIN.md +24 -6
- package/docs/PROVIDERS.md +12 -10
- package/docs/ROADMAPS.md +4 -3
- package/docs/RULES.md +11 -10
- package/install/bootstrap.mjs +9 -19
- package/install/install.mjs +23 -41
- package/mcp/novahiz-tools/index.mjs +35 -6
- package/novahiz.config.example.json +1 -5
- package/package.json +6 -7
- package/skills/apple-ui-audit/SKILL.md +95 -0
- package/skills/apple-ui-audit/references/screen-walkthrough.md +29 -0
- package/skills/browser-session/SKILL.md +61 -0
- package/skills/browser-session/references/session-run-sheet.md +30 -0
- package/skills/browser-session/scripts/browser_session_preflight.mjs +74 -0
- package/skills/browser-session/scripts/sample-run.json +5 -0
- package/skills/code-standards/SKILL.md +85 -0
- package/skills/code-standards/references/pr-review-worksheet.md +35 -0
- package/skills/design-token-pipeline/SKILL.md +85 -0
- package/skills/design-token-pipeline/references/dtcg-sample.json +37 -0
- package/skills/llm-threat-review/SKILL.md +99 -0
- package/skills/llm-threat-review/references/review-worksheet.md +34 -0
- package/skills/llm-threat-review/scripts/llm_risk_lint.mjs +105 -0
- package/skills/novahiz-audit/SKILL.md +1 -1
- package/skills/novahiz-gate/SKILL.md +7 -6
- package/skills/novahiz-humanizer/SKILL.md +1 -1
- package/skills/novahiz-implement/SKILL.md +1 -1
- package/skills/novahiz-init/SKILL.md +112 -0
- package/skills/novahiz-planner/SKILL.md +1 -2
- package/skills/openapi-mcp-server/SKILL.md +76 -0
- package/skills/openapi-mcp-server/references/mcp-ship-checklist.md +30 -0
- package/skills/openapi-mcp-server/references/tool-worksheet.md +30 -0
- package/skills/openapi-mcp-server/scripts/openapi_mcp_lint.mjs +133 -0
- package/skills/package-risk-audit/SKILL.md +83 -0
- package/skills/package-risk-audit/references/intake-worksheet.md +19 -0
- package/skills/package-risk-audit/scripts/dep_risk_lint.mjs +131 -0
- package/skills/secrets-hygiene/SKILL.md +62 -0
- package/skills/secrets-hygiene/references/rotation-playbook.md +27 -0
- package/skills/secrets-hygiene/scripts/secret_scan.mjs +120 -0
- package/skills/skill-authoring/SKILL.md +93 -0
- package/skills/skill-authoring/references/skill-template.md +59 -0
- package/skills/skill-authoring/scripts/skill_frontmatter_lint.mjs +65 -0
- package/skills/skill-eval-loop/SKILL.md +103 -0
- package/skills/skill-eval-loop/references/negative-patterns.md +12 -0
- package/skills/skill-eval-loop/references/run-sheet.md +40 -0
- package/skills/skill-eval-loop/scripts/skill_structure_check.mjs +100 -0
- package/skills/ui-craft-rules/SKILL.md +96 -0
- package/skills/ui-slop-remover/SKILL.md +110 -0
- package/skills/ui-slop-remover/references/tell-catalogue.md +58 -0
- package/skills/ui-slop-remover/scripts/slop_lint.mjs +119 -0
- package/src/autodocs.ts +192 -0
- package/src/cli.ts +8 -1
- package/src/commands/autodocs.ts +250 -0
- package/src/commands/doctor.ts +226 -217
- package/src/commands/gate.ts +16 -5
- package/src/commands/init.ts +356 -0
- package/src/commands/task.ts +20 -7
- package/src/gate.ts +401 -401
- package/src/ledger.ts +39 -0
- package/src/targets.ts +43 -7
- package/bundled-skills/ab-testing/SKILL.md +0 -353
- package/bundled-skills/ab-testing/evals/evals.json +0 -105
- package/bundled-skills/ab-testing/references/sample-size-guide.md +0 -263
- package/bundled-skills/ab-testing/references/test-templates.md +0 -277
- package/bundled-skills/ad-creative/SKILL.md +0 -425
- package/bundled-skills/ad-creative/assets/creative-review-template.html +0 -400
- package/bundled-skills/ad-creative/evals/evals.json +0 -217
- package/bundled-skills/ad-creative/references/creative-review-page.md +0 -106
- package/bundled-skills/ad-creative/references/creative-roadmap.md +0 -118
- package/bundled-skills/ad-creative/references/generative-tools.md +0 -637
- package/bundled-skills/ad-creative/references/hook-system.md +0 -115
- package/bundled-skills/ad-creative/references/imessage-video-ads.md +0 -201
- package/bundled-skills/ad-creative/references/meta-creative-formats.md +0 -114
- package/bundled-skills/ad-creative/references/motion-video-ads.md +0 -126
- package/bundled-skills/ad-creative/references/platform-specs.md +0 -213
- package/bundled-skills/ad-creative/references/short-form-video-specs.md +0 -213
- package/bundled-skills/ad-creative/references/static-ad-templates.md +0 -308
- package/bundled-skills/ads/SKILL.md +0 -499
- package/bundled-skills/ads/evals/evals.json +0 -157
- package/bundled-skills/ads/references/abm-playbook.md +0 -93
- package/bundled-skills/ads/references/ad-copy-templates.md +0 -207
- package/bundled-skills/ads/references/audience-targeting.md +0 -243
- package/bundled-skills/ads/references/audit-guardrails.md +0 -83
- package/bundled-skills/ads/references/b2b-paid-playbook.md +0 -115
- package/bundled-skills/ads/references/conversion-tracking.md +0 -361
- package/bundled-skills/ads/references/creative-research-automation.md +0 -103
- package/bundled-skills/ads/references/google-ads-audit-checklist.md +0 -84
- package/bundled-skills/ads/references/google-search-playbook.md +0 -120
- package/bundled-skills/ads/references/linkedin-b2b-playbook.md +0 -107
- package/bundled-skills/ads/references/meta-decision-system.md +0 -176
- package/bundled-skills/ads/references/payback-period.md +0 -69
- package/bundled-skills/ads/references/platform-setup-checklists.md +0 -277
- package/bundled-skills/ads/references/rsa-output-spec.md +0 -88
- package/bundled-skills/agent-device/SKILL.md +0 -20
- package/bundled-skills/ai-seo/SKILL.md +0 -488
- package/bundled-skills/ai-seo/evals/evals.json +0 -135
- package/bundled-skills/ai-seo/references/agent-readiness.md +0 -57
- package/bundled-skills/ai-seo/references/citations-vs-recommendations.md +0 -85
- package/bundled-skills/ai-seo/references/content-patterns.md +0 -287
- package/bundled-skills/ai-seo/references/content-types.md +0 -71
- package/bundled-skills/ai-seo/references/format-volatility.md +0 -98
- package/bundled-skills/ai-seo/references/okf.md +0 -104
- package/bundled-skills/ai-seo/references/platform-ranking-factors.md +0 -154
- package/bundled-skills/ai-seo/references/youtube-ai-citations.md +0 -60
- package/bundled-skills/analytics/SKILL.md +0 -310
- package/bundled-skills/analytics/evals/evals.json +0 -90
- package/bundled-skills/analytics/references/event-library.md +0 -260
- package/bundled-skills/analytics/references/ga4-implementation.md +0 -300
- package/bundled-skills/analytics/references/gtm-implementation.md +0 -390
- package/bundled-skills/android-emulator/SKILL.md +0 -32
- package/bundled-skills/android-reverse-engineering/LICENSE +0 -190
- package/bundled-skills/android-reverse-engineering/SKILL.md +0 -313
- package/bundled-skills/android-reverse-engineering/references/api-extraction-patterns.md +0 -197
- package/bundled-skills/android-reverse-engineering/references/call-flow-analysis.md +0 -210
- package/bundled-skills/android-reverse-engineering/references/fernflower-usage.md +0 -115
- package/bundled-skills/android-reverse-engineering/references/jadx-usage.md +0 -116
- package/bundled-skills/android-reverse-engineering/references/kotlin-name-recovery.md +0 -108
- package/bundled-skills/android-reverse-engineering/references/setup-guide.md +0 -221
- package/bundled-skills/android-reverse-engineering/references/third_party_hosts.txt +0 -122
- package/bundled-skills/android-reverse-engineering/scripts/check-deps.ps1 +0 -165
- package/bundled-skills/android-reverse-engineering/scripts/check-deps.sh +0 -129
- package/bundled-skills/android-reverse-engineering/scripts/decompile.ps1 +0 -400
- package/bundled-skills/android-reverse-engineering/scripts/decompile.sh +0 -578
- package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.ps1 +0 -121
- package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.sh +0 -339
- package/bundled-skills/android-reverse-engineering/scripts/fingerprint.sh +0 -241
- package/bundled-skills/android-reverse-engineering/scripts/install-dep.ps1 +0 -345
- package/bundled-skills/android-reverse-engineering/scripts/install-dep.sh +0 -448
- package/bundled-skills/android-reverse-engineering/scripts/lookup-name.sh +0 -85
- package/bundled-skills/android-reverse-engineering/scripts/recover-kotlin-names.sh +0 -140
- package/bundled-skills/build-graph/SKILL.md +0 -38
- package/bundled-skills/claude-history-ingest/SKILL.md +0 -463
- package/bundled-skills/claude-history-ingest/references/claude-data-format.md +0 -118
- package/bundled-skills/codex-history-ingest/SKILL.md +0 -248
- package/bundled-skills/codex-history-ingest/references/codex-data-format.md +0 -82
- package/bundled-skills/cold-email/SKILL.md +0 -159
- package/bundled-skills/cold-email/evals/evals.json +0 -94
- package/bundled-skills/cold-email/references/benchmarks.md +0 -83
- package/bundled-skills/cold-email/references/follow-up-sequences.md +0 -81
- package/bundled-skills/cold-email/references/frameworks.md +0 -90
- package/bundled-skills/cold-email/references/personalization.md +0 -79
- package/bundled-skills/cold-email/references/subject-lines.md +0 -53
- package/bundled-skills/competitor-profiling/SKILL.md +0 -415
- package/bundled-skills/competitor-profiling/evals/evals.json +0 -85
- package/bundled-skills/competitor-profiling/references/templates.md +0 -167
- package/bundled-skills/competitor-profiling/references/tool-reference.md +0 -179
- package/bundled-skills/computer-use/SKILL.md +0 -41
- package/bundled-skills/content-strategy/SKILL.md +0 -439
- package/bundled-skills/content-strategy/evals/evals.json +0 -116
- package/bundled-skills/content-strategy/references/content-distribution.md +0 -83
- package/bundled-skills/content-strategy/references/headless-cms.md +0 -194
- package/bundled-skills/copilot-history-ingest/SKILL.md +0 -376
- package/bundled-skills/copilot-history-ingest/references/copilot-data-format.md +0 -321
- package/bundled-skills/copy-editing/SKILL.md +0 -457
- package/bundled-skills/copy-editing/evals/evals.json +0 -89
- package/bundled-skills/copy-editing/references/checklist.md +0 -66
- package/bundled-skills/copy-editing/references/content-refresh.md +0 -38
- package/bundled-skills/copy-editing/references/plain-english-alternatives.md +0 -394
- package/bundled-skills/copywriting/SKILL.md +0 -256
- package/bundled-skills/copywriting/evals/evals.json +0 -126
- package/bundled-skills/copywriting/references/copy-frameworks.md +0 -433
- package/bundled-skills/copywriting/references/natural-transitions.md +0 -272
- package/bundled-skills/cro/SKILL.md +0 -187
- package/bundled-skills/cro/evals/evals.json +0 -111
- package/bundled-skills/cro/references/experiments.md +0 -248
- package/bundled-skills/cro/references/form.md +0 -422
- package/bundled-skills/cross-linker/SKILL.md +0 -309
- package/bundled-skills/customer-research/SKILL.md +0 -305
- package/bundled-skills/customer-research/evals/evals.json +0 -176
- package/bundled-skills/customer-research/references/interviews-and-surveys.md +0 -155
- package/bundled-skills/customer-research/references/source-guides.md +0 -401
- package/bundled-skills/daily-update/SKILL.md +0 -223
- package/bundled-skills/dart-add-unit-test/SKILL.md +0 -122
- package/bundled-skills/dart-build-cli-app/SKILL.md +0 -185
- package/bundled-skills/dart-collect-coverage/SKILL.md +0 -141
- package/bundled-skills/dart-fix-runtime-errors/SKILL.md +0 -166
- package/bundled-skills/dart-generate-test-mocks/SKILL.md +0 -155
- package/bundled-skills/dart-migrate-to-checks-package/SKILL.md +0 -528
- package/bundled-skills/dart-resolve-package-conflicts/SKILL.md +0 -116
- package/bundled-skills/dart-run-static-analysis/SKILL.md +0 -104
- package/bundled-skills/dart-setup-ffi-assets/SKILL.md +0 -419
- package/bundled-skills/dart-use-doc-examples/SKILL.md +0 -96
- package/bundled-skills/dart-use-ffigen/SKILL.md +0 -218
- package/bundled-skills/dart-use-pattern-matching/SKILL.md +0 -146
- package/bundled-skills/dart-use-primary-constructors/SKILL.md +0 -262
- package/bundled-skills/dart-write-documentation/SKILL.md +0 -136
- package/bundled-skills/debug-issue/SKILL.md +0 -28
- package/bundled-skills/dogfood/SKILL.md +0 -27
- package/bundled-skills/eas-app-stores/SKILL.md +0 -176
- package/bundled-skills/eas-app-stores/agents/openai.yaml +0 -4
- package/bundled-skills/eas-app-stores/references/app-store-metadata.md +0 -497
- package/bundled-skills/eas-app-stores/references/ios-app-store.md +0 -376
- package/bundled-skills/eas-app-stores/references/native-ios.md +0 -167
- package/bundled-skills/eas-app-stores/references/play-store.md +0 -244
- package/bundled-skills/eas-app-stores/references/testflight.md +0 -62
- package/bundled-skills/eas-app-stores/references/workflows.md +0 -120
- package/bundled-skills/eas-hosting/SKILL.md +0 -431
- package/bundled-skills/eas-hosting/agents/openai.yaml +0 -4
- package/bundled-skills/eas-observe/SKILL.md +0 -54
- package/bundled-skills/eas-observe/agents/openai.yaml +0 -4
- package/bundled-skills/eas-observe/references/metrics.md +0 -98
- package/bundled-skills/eas-observe/references/queries.md +0 -403
- package/bundled-skills/eas-observe/references/setup.md +0 -476
- package/bundled-skills/eas-observe/references/third-party.md +0 -136
- package/bundled-skills/eas-simulator/SKILL.md +0 -208
- package/bundled-skills/eas-simulator/agents/openai.yaml +0 -4
- package/bundled-skills/eas-simulator/references/controllers.md +0 -106
- package/bundled-skills/eas-simulator/references/run-your-app.md +0 -224
- package/bundled-skills/eas-simulator/references/troubleshooting.md +0 -44
- package/bundled-skills/eas-update/SKILL.md +0 -146
- package/bundled-skills/eas-update/agents/openai.yaml +0 -4
- package/bundled-skills/eas-update-insights/SKILL.md +0 -238
- package/bundled-skills/eas-update-insights/agents/openai.yaml +0 -4
- package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +0 -47
- package/bundled-skills/eas-update-insights/references/update-insights-schema.md +0 -69
- package/bundled-skills/eas-workflows/SKILL.md +0 -99
- package/bundled-skills/eas-workflows/agents/openai.yaml +0 -4
- package/bundled-skills/eas-workflows/scripts/fetch.js +0 -109
- package/bundled-skills/eas-workflows/scripts/package.json +0 -6
- package/bundled-skills/emails/SKILL.md +0 -311
- package/bundled-skills/emails/evals/evals.json +0 -93
- package/bundled-skills/emails/references/copy-guidelines.md +0 -113
- package/bundled-skills/emails/references/email-types.md +0 -515
- package/bundled-skills/emails/references/sequence-templates.md +0 -168
- package/bundled-skills/explore-codebase/SKILL.md +0 -29
- package/bundled-skills/expo-animation/LICENSE +0 -21
- package/bundled-skills/expo-animation/RECIPES.md +0 -385
- package/bundled-skills/expo-animation/SKILL.md +0 -267
- package/bundled-skills/expo-animation/agents/openai.yaml +0 -4
- package/bundled-skills/expo-app-clip/SKILL.md +0 -290
- package/bundled-skills/expo-app-clip/agents/openai.yaml +0 -4
- package/bundled-skills/expo-app-clip/references/native-module.md +0 -96
- package/bundled-skills/expo-brownfield/SKILL.md +0 -62
- package/bundled-skills/expo-brownfield/agents/openai.yaml +0 -4
- package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +0 -526
- package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +0 -451
- package/bundled-skills/expo-brownfield/references/comparison.md +0 -63
- package/bundled-skills/expo-brownfield/references/troubleshooting.md +0 -88
- package/bundled-skills/expo-data-fetching/SKILL.md +0 -478
- package/bundled-skills/expo-data-fetching/agents/openai.yaml +0 -4
- package/bundled-skills/expo-data-fetching/references/expo-router-loaders.md +0 -341
- package/bundled-skills/expo-data-fetching/references/offline-and-cancellation.md +0 -68
- package/bundled-skills/expo-design-system/SKILL.md +0 -376
- package/bundled-skills/expo-design-system/agents/openai.yaml +0 -4
- package/bundled-skills/expo-design-system/references/audit.md +0 -190
- package/bundled-skills/expo-design-system/references/native-slop.md +0 -74
- package/bundled-skills/expo-dev-client/SKILL.md +0 -182
- package/bundled-skills/expo-dev-client/agents/openai.yaml +0 -4
- package/bundled-skills/expo-dom/SKILL.md +0 -425
- package/bundled-skills/expo-dom/agents/openai.yaml +0 -4
- package/bundled-skills/expo-examples/SKILL.md +0 -106
- package/bundled-skills/expo-examples/agents/openai.yaml +0 -4
- package/bundled-skills/expo-examples/references/catalog.md +0 -105
- package/bundled-skills/expo-migrate-module/SKILL.md +0 -113
- package/bundled-skills/expo-migrate-module/agents/openai.yaml +0 -4
- package/bundled-skills/expo-migrate-module/references/compatibility.md +0 -73
- package/bundled-skills/expo-migrate-module/references/example.md +0 -212
- package/bundled-skills/expo-migrate-module/references/migration-map.md +0 -306
- package/bundled-skills/expo-module/SKILL.md +0 -151
- package/bundled-skills/expo-module/agents/openai.yaml +0 -4
- package/bundled-skills/expo-module/references/config-plugin.md +0 -90
- package/bundled-skills/expo-module/references/create-expo-module.md +0 -206
- package/bundled-skills/expo-module/references/lifecycle.md +0 -127
- package/bundled-skills/expo-module/references/module-config.md +0 -48
- package/bundled-skills/expo-module/references/native-module.md +0 -286
- package/bundled-skills/expo-module/references/native-view.md +0 -171
- package/bundled-skills/expo-native-ui/SKILL.md +0 -201
- package/bundled-skills/expo-native-ui/agents/openai.yaml +0 -4
- package/bundled-skills/expo-native-ui/references/controls.md +0 -231
- package/bundled-skills/expo-native-ui/references/gradients.md +0 -106
- package/bundled-skills/expo-native-ui/references/icons.md +0 -232
- package/bundled-skills/expo-native-ui/references/media.md +0 -193
- package/bundled-skills/expo-native-ui/references/storage.md +0 -121
- package/bundled-skills/expo-native-ui/references/visual-effects.md +0 -198
- package/bundled-skills/expo-native-ui/references/webgpu-three.md +0 -605
- package/bundled-skills/expo-overview/SKILL.md +0 -115
- package/bundled-skills/expo-overview/agents/openai.yaml +0 -4
- package/bundled-skills/expo-project-structure/SKILL.md +0 -114
- package/bundled-skills/expo-project-structure/agents/openai.yaml +0 -4
- package/bundled-skills/expo-router/SKILL.md +0 -240
- package/bundled-skills/expo-router/agents/openai.yaml +0 -4
- package/bundled-skills/expo-router/references/form-sheet.md +0 -253
- package/bundled-skills/expo-router/references/route-structure.md +0 -229
- package/bundled-skills/expo-router/references/search.md +0 -248
- package/bundled-skills/expo-router/references/tabs.md +0 -433
- package/bundled-skills/expo-router/references/toolbar-and-headers.md +0 -284
- package/bundled-skills/expo-router/references/zoom-transitions.md +0 -158
- package/bundled-skills/expo-skill-eval/SKILL.md +0 -314
- package/bundled-skills/expo-skill-eval/agents/visual-grader.md +0 -52
- package/bundled-skills/expo-skill-eval/references/design-rubric.md +0 -45
- package/bundled-skills/expo-skill-eval/references/runtime-matrix.md +0 -34
- package/bundled-skills/expo-skill-eval/scripts/check-static.sh +0 -64
- package/bundled-skills/expo-skill-eval/scripts/clean-fixture.sh +0 -56
- package/bundled-skills/expo-skill-eval/scripts/generate_viewer.py +0 -450
- package/bundled-skills/expo-skill-eval/scripts/latest-sdk.sh +0 -46
- package/bundled-skills/expo-skill-eval/scripts/make-fixture.sh +0 -95
- package/bundled-skills/expo-skill-eval/scripts/make-workspace.sh +0 -31
- package/bundled-skills/expo-skill-eval/scripts/snapshot-android.sh +0 -284
- package/bundled-skills/expo-skill-eval/scripts/snapshot-ios.sh +0 -132
- package/bundled-skills/expo-skill-eval/scripts/snapshot-web.sh +0 -61
- package/bundled-skills/expo-skill-feedback/SKILL.md +0 -87
- package/bundled-skills/expo-skill-feedback/agents/openai.yaml +0 -4
- package/bundled-skills/expo-skill-feedback/scripts/skill-event.cjs +0 -180
- package/bundled-skills/expo-skill-feedback/scripts/telemetry.cjs +0 -65
- package/bundled-skills/expo-skill-feedback/scripts/telemetry_common.cjs +0 -171
- package/bundled-skills/expo-ui/SKILL.md +0 -101
- package/bundled-skills/expo-ui/agents/openai.yaml +0 -4
- package/bundled-skills/expo-ui/references/drop-in-replacements.md +0 -27
- package/bundled-skills/expo-ui/references/jetpack-compose.md +0 -73
- package/bundled-skills/expo-ui/references/swift-ui.md +0 -73
- package/bundled-skills/expo-ui/references/universal.md +0 -104
- package/bundled-skills/expo-ui/scripts/list-components.js +0 -193
- package/bundled-skills/expo-upgrade/SKILL.md +0 -150
- package/bundled-skills/expo-upgrade/agents/openai.yaml +0 -4
- package/bundled-skills/expo-upgrade/references/expo-av-to-audio.md +0 -132
- package/bundled-skills/expo-upgrade/references/expo-av-to-video.md +0 -160
- package/bundled-skills/expo-upgrade/references/native-tabs.md +0 -124
- package/bundled-skills/expo-upgrade/references/new-architecture.md +0 -79
- package/bundled-skills/expo-upgrade/references/react-19.md +0 -79
- package/bundled-skills/expo-upgrade/references/react-compiler.md +0 -59
- package/bundled-skills/expo-upgrade/references/react-navigation-to-expo-router.md +0 -61
- package/bundled-skills/expo-web-to-native/SKILL.md +0 -91
- package/bundled-skills/expo-web-to-native/agents/openai.yaml +0 -4
- package/bundled-skills/expo-web-to-native/references/false-friends.md +0 -119
- package/bundled-skills/expo-web-to-native/references/native-patterns.md +0 -39
- package/bundled-skills/expo-web-to-native/references/run-as-goal.md +0 -48
- package/bundled-skills/expo-web-to-native/references/verify-on-device.md +0 -45
- package/bundled-skills/find-skills/SKILL.md +0 -141
- package/bundled-skills/flutter-add-integration-test/SKILL.md +0 -163
- package/bundled-skills/flutter-add-widget-preview/SKILL.md +0 -145
- package/bundled-skills/flutter-add-widget-test/SKILL.md +0 -154
- package/bundled-skills/flutter-apply-architecture-best-practices/SKILL.md +0 -162
- package/bundled-skills/flutter-build-responsive-layout/SKILL.md +0 -139
- package/bundled-skills/flutter-fix-layout-issues/SKILL.md +0 -130
- package/bundled-skills/flutter-implement-json-serialization/SKILL.md +0 -153
- package/bundled-skills/flutter-setup-declarative-routing/SKILL.md +0 -255
- package/bundled-skills/flutter-setup-localization/SKILL.md +0 -210
- package/bundled-skills/flutter-use-http-package/SKILL.md +0 -174
- package/bundled-skills/graph-colorize/SKILL.md +0 -180
- package/bundled-skills/hermes-history-ingest/SKILL.md +0 -239
- package/bundled-skills/hermes-history-ingest/references/hermes-data-format.md +0 -131
- package/bundled-skills/impl-validator/SKILL.md +0 -118
- package/bundled-skills/ios-simulator/SKILL.md +0 -32
- package/bundled-skills/json-canvas/SKILL.md +0 -244
- package/bundled-skills/json-canvas/references/EXAMPLES.md +0 -329
- package/bundled-skills/launch/SKILL.md +0 -381
- package/bundled-skills/launch/evals/evals.json +0 -106
- package/bundled-skills/llm-wiki/SKILL.md +0 -661
- package/bundled-skills/llm-wiki/references/WRITING.md +0 -28
- package/bundled-skills/llm-wiki/references/karpathy-pattern.md +0 -45
- package/bundled-skills/marketing-plan/SKILL.md +0 -300
- package/bundled-skills/marketing-plan/evals/evals.json +0 -112
- package/bundled-skills/marketing-plan/references/aarrr-framework.md +0 -180
- package/bundled-skills/marketing-plan/references/budget-planning.md +0 -168
- package/bundled-skills/marketing-plan/references/client-types.md +0 -373
- package/bundled-skills/marketing-plan/references/current-state-rubric.md +0 -255
- package/bundled-skills/marketing-plan/references/example-quietude.md +0 -972
- package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +0 -230
- package/bundled-skills/marketing-plan/references/growth-patterns.md +0 -190
- package/bundled-skills/marketing-plan/references/idea-cross-reference.md +0 -265
- package/bundled-skills/marketing-plan/references/measurement-framework.md +0 -213
- package/bundled-skills/marketing-plan/references/methodology.md +0 -363
- package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +0 -197
- package/bundled-skills/marketing-plan/references/plan-template.md +0 -494
- package/bundled-skills/marketing-plan/references/team-and-agency-model.md +0 -278
- package/bundled-skills/marketing-psychology/SKILL.md +0 -455
- package/bundled-skills/marketing-psychology/evals/evals.json +0 -88
- package/bundled-skills/memory-bridge/SKILL.md +0 -163
- package/bundled-skills/memory-save/SKILL.md +0 -88
- package/bundled-skills/obsidian-bases/SKILL.md +0 -499
- package/bundled-skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -173
- package/bundled-skills/obsidian-cli/SKILL.md +0 -106
- package/bundled-skills/obsidian-layout-adjustment/SKILL.md +0 -226
- package/bundled-skills/obsidian-layout-adjustment/evals/evals.json +0 -53
- package/bundled-skills/obsidian-layout-adjustment/references/workflow-reference.md +0 -212
- package/bundled-skills/obsidian-markdown/SKILL.md +0 -196
- package/bundled-skills/obsidian-markdown/references/CALLOUTS.md +0 -58
- package/bundled-skills/obsidian-markdown/references/EMBEDS.md +0 -70
- package/bundled-skills/obsidian-markdown/references/PROPERTIES.md +0 -61
- package/bundled-skills/offers/SKILL.md +0 -155
- package/bundled-skills/offers/evals/evals.json +0 -21
- package/bundled-skills/offers/references/bonus-stacking.md +0 -150
- package/bundled-skills/offers/references/examples.md +0 -215
- package/bundled-skills/offers/references/guarantee-design.md +0 -172
- package/bundled-skills/offers/references/offer-anatomy.md +0 -203
- package/bundled-skills/offers/references/offer-formats.md +0 -240
- package/bundled-skills/offers/references/saas-offers.md +0 -116
- package/bundled-skills/offers/references/scarcity-urgency.md +0 -175
- package/bundled-skills/offers/references/value-equation.md +0 -134
- package/bundled-skills/onboarding/SKILL.md +0 -261
- package/bundled-skills/onboarding/evals/evals.json +0 -108
- package/bundled-skills/onboarding/references/activation-models.md +0 -57
- package/bundled-skills/onboarding/references/experiments.md +0 -258
- package/bundled-skills/onboarding/references/minimum-path-to-value.md +0 -49
- package/bundled-skills/openclaw-history-ingest/SKILL.md +0 -257
- package/bundled-skills/openclaw-history-ingest/references/openclaw-data-format.md +0 -154
- package/bundled-skills/orchestration/SKILL.md +0 -69
- package/bundled-skills/pi-history-ingest/SKILL.md +0 -312
- package/bundled-skills/pricing/SKILL.md +0 -295
- package/bundled-skills/pricing/evals/evals.json +0 -119
- package/bundled-skills/pricing/references/pricing-models.md +0 -66
- package/bundled-skills/pricing/references/pricing-page-teardown.md +0 -85
- package/bundled-skills/pricing/references/research-methods.md +0 -152
- package/bundled-skills/pricing/references/tier-structure.md +0 -232
- package/bundled-skills/product-marketing/SKILL.md +0 -255
- package/bundled-skills/product-marketing/evals/evals.json +0 -98
- package/bundled-skills/prospecting/SKILL.md +0 -262
- package/bundled-skills/prospecting/evals/evals.json +0 -122
- package/bundled-skills/prospecting/references/b2b-prospecting.md +0 -106
- package/bundled-skills/prospecting/references/compliance.md +0 -123
- package/bundled-skills/prospecting/references/data-sources.md +0 -287
- package/bundled-skills/prospecting/references/demand-signals.md +0 -129
- package/bundled-skills/prospecting/references/local-prospecting.md +0 -165
- package/bundled-skills/prospecting/references/saas-prospecting.md +0 -123
- package/bundled-skills/refactor-safely/SKILL.md +0 -29
- package/bundled-skills/review-delta/SKILL.md +0 -46
- package/bundled-skills/review-pr/SKILL.md +0 -66
- package/bundled-skills/sales-enablement/SKILL.md +0 -359
- package/bundled-skills/sales-enablement/evals/evals.json +0 -91
- package/bundled-skills/sales-enablement/references/deck-frameworks.md +0 -263
- package/bundled-skills/sales-enablement/references/demo-scripts.md +0 -355
- package/bundled-skills/sales-enablement/references/objection-library.md +0 -270
- package/bundled-skills/sales-enablement/references/one-pager-templates.md +0 -208
- package/bundled-skills/seo-audit/SKILL.md +0 -499
- package/bundled-skills/seo-audit/evals/evals.json +0 -136
- package/bundled-skills/seo-audit/references/ai-writing-detection.md +0 -200
- package/bundled-skills/seo-audit/references/international-seo.md +0 -230
- package/bundled-skills/session-brain/SKILL.md +0 -101
- package/bundled-skills/session-search/SKILL.md +0 -97
- package/bundled-skills/social/SKILL.md +0 -413
- package/bundled-skills/social/evals/evals.json +0 -107
- package/bundled-skills/social/references/carousel-frameworks.md +0 -141
- package/bundled-skills/social/references/listening-sources-template.md +0 -123
- package/bundled-skills/social/references/listening.md +0 -283
- package/bundled-skills/social/references/platform-limits.md +0 -110
- package/bundled-skills/social/references/platforms.md +0 -170
- package/bundled-skills/social/references/post-templates.md +0 -179
- package/bundled-skills/social/references/reverse-engineering.md +0 -195
- package/bundled-skills/social/references/short-form-video.md +0 -237
- package/bundled-skills/tag-taxonomy/SKILL.md +0 -218
- package/bundled-skills/vault-skill-factory/SKILL.md +0 -143
- package/bundled-skills/video/SKILL.md +0 -346
- package/bundled-skills/video/evals/evals.json +0 -103
- package/bundled-skills/video/references/ai-video-prompting.md +0 -175
- package/bundled-skills/video/references/edit-anatomy.md +0 -84
- package/bundled-skills/wiki-agent/SKILL.md +0 -322
- package/bundled-skills/wiki-capture/SKILL.md +0 -337
- package/bundled-skills/wiki-capture/references/RAW-FORMAT.md +0 -115
- package/bundled-skills/wiki-context-pack/SKILL.md +0 -89
- package/bundled-skills/wiki-dashboard/SKILL.md +0 -472
- package/bundled-skills/wiki-dedup/SKILL.md +0 -320
- package/bundled-skills/wiki-digest/SKILL.md +0 -243
- package/bundled-skills/wiki-export/SKILL.md +0 -445
- package/bundled-skills/wiki-history-ingest/SKILL.md +0 -61
- package/bundled-skills/wiki-import/SKILL.md +0 -276
- package/bundled-skills/wiki-ingest/SKILL.md +0 -563
- package/bundled-skills/wiki-ingest/references/ingest-prompts.md +0 -54
- package/bundled-skills/wiki-ingest/references/pageindex.md +0 -72
- package/bundled-skills/wiki-ingest/references/url-sources.md +0 -295
- package/bundled-skills/wiki-lint/SKILL.md +0 -643
- package/bundled-skills/wiki-narrate/SKILL.md +0 -120
- package/bundled-skills/wiki-narrate/references/voices.md +0 -29
- package/bundled-skills/wiki-query/SKILL.md +0 -307
- package/bundled-skills/wiki-rebuild/SKILL.md +0 -212
- package/bundled-skills/wiki-research/SKILL.md +0 -319
- package/bundled-skills/wiki-setup/SKILL.md +0 -359
- package/bundled-skills/wiki-stage-commit/SKILL.md +0 -164
- package/bundled-skills/wiki-status/SKILL.md +0 -556
- package/bundled-skills/wiki-switch/SKILL.md +0 -115
- package/bundled-skills/wiki-synthesize/SKILL.md +0 -212
- package/bundled-skills/wiki-update/SKILL.md +0 -271
- package/skills/ai-security/SKILL.md +0 -132
- package/skills/ai-security/references/atlas-coverage.md +0 -60
- package/skills/ai-security/scripts/ai_threat_scanner.py +0 -373
- package/skills/anti-AI-design/SKILL.md +0 -72
- package/skills/apple-hig-audit/SKILL.md +0 -64
- package/skills/apple-hig-audit/references/accessibility.md +0 -78
- package/skills/apple-hig-audit/references/platform-specifics.md +0 -57
- package/skills/apple-hig-audit/references/visual-design.md +0 -68
- package/skills/apple-hig-audit/scripts/hig_checker.py +0 -115
- package/skills/apple-hig-audit/templates/hig-audit-template.md +0 -114
- package/skills/dependency-auditor/README.md +0 -98
- package/skills/dependency-auditor/SKILL.md +0 -114
- package/skills/dependency-auditor/assets/sample_go.mod +0 -53
- package/skills/dependency-auditor/assets/sample_package.json +0 -72
- package/skills/dependency-auditor/assets/sample_requirements.txt +0 -71
- package/skills/dependency-auditor/expected_outputs/sample_license_report.txt +0 -37
- package/skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +0 -59
- package/skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +0 -71
- package/skills/dependency-auditor/references/dependency_management_best_practices.md +0 -46
- package/skills/dependency-auditor/references/license_compatibility_matrix.md +0 -57
- package/skills/dependency-auditor/references/vulnerability_assessment_guide.md +0 -62
- package/skills/dependency-auditor/scripts/dep_scanner.py +0 -595
- package/skills/dependency-auditor/scripts/license_checker.py +0 -442
- package/skills/dependency-auditor/scripts/upgrade_planner.py +0 -490
- package/skills/dependency-auditor/test-inventory.json +0 -421
- package/skills/dependency-auditor/test-project/package.json +0 -72
- package/skills/design-system-tokens/SKILL.md +0 -90
- package/skills/design-system-tokens/assets/design_system_doc_template.md +0 -129
- package/skills/design-system-tokens/references/component-architecture.md +0 -88
- package/skills/design-system-tokens/references/developer-handoff.md +0 -61
- package/skills/design-system-tokens/references/responsive-calculations.md +0 -72
- package/skills/design-system-tokens/references/token-generation.md +0 -62
- package/skills/design-system-tokens/scripts/design_token_generator.py +0 -315
- package/skills/engineering-code-standards/SKILL.md +0 -174
- package/skills/env-secrets-manager/SKILL.md +0 -102
- package/skills/env-secrets-manager/references/secret-patterns.md +0 -56
- package/skills/env-secrets-manager/references/validation-detection-rotation.md +0 -76
- package/skills/env-secrets-manager/scripts/env_auditor.py +0 -340
- package/skills/frontend-design-taste/SKILL.md +0 -62
- package/skills/mcp-server-builder/README.md +0 -42
- package/skills/mcp-server-builder/SKILL.md +0 -144
- package/skills/mcp-server-builder/references/openapi-extraction-guide.md +0 -34
- package/skills/mcp-server-builder/references/production-hardening-guide.md +0 -80
- package/skills/mcp-server-builder/references/python-server-template.md +0 -22
- package/skills/mcp-server-builder/references/spec-compatibility.md +0 -129
- package/skills/mcp-server-builder/references/typescript-server-template.md +0 -19
- package/skills/mcp-server-builder/references/validation-checklist.md +0 -30
- package/skills/mcp-server-builder/scripts/mcp_validator.py +0 -180
- package/skills/mcp-server-builder/scripts/openapi_to_mcp.py +0 -279
- package/skills/playwright-agent/SKILL.md +0 -147
- package/skills/skill-creator/LICENSE.txt +0 -14
- package/skills/skill-creator/SKILL.md +0 -471
- package/skills/skill-creator/agents/analyzer.md +0 -274
- package/skills/skill-creator/agents/comparator.md +0 -202
- package/skills/skill-creator/agents/grader.md +0 -223
- package/skills/skill-creator/assets/eval_review.html +0 -143
- package/skills/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/skill-creator/eval-viewer/viewer.html +0 -1321
- package/skills/skill-creator/references/schemas.md +0 -430
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/skill-creator/scripts/generate_report.py +0 -322
- package/skills/skill-creator/scripts/improve_description.py +0 -247
- package/skills/skill-creator/scripts/package_skill.py +0 -136
- package/skills/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/skill-creator/scripts/run_eval.py +0 -310
- package/skills/skill-creator/scripts/run_loop.py +0 -328
- package/skills/skill-creator/scripts/utils.py +0 -47
- package/skills/write-a-skill/SKILL.md +0 -111
- package/skills/write-a-skill/references/companion_tooling.md +0 -61
- package/skills/write-a-skill/references/description_design_patterns.md +0 -136
- package/skills/write-a-skill/references/progressive_disclosure_principles.md +0 -87
- package/skills/write-a-skill/references/quality_gates_for_skills.md +0 -158
- package/skills/write-a-skill/scripts/skill_description_validator.py +0 -241
- package/skills/write-a-skill/scripts/skill_review_checklist_runner.py +0 -257
- package/skills/write-a-skill/scripts/skill_structure_validator.py +0 -265
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# find-api-calls.sh — Search decompiled source for API calls and HTTP endpoints
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
|
|
5
|
-
usage() {
|
|
6
|
-
cat <<EOF
|
|
7
|
-
Usage: find-api-calls.sh <source-dir> [OPTIONS]
|
|
8
|
-
|
|
9
|
-
Search decompiled Java/Kotlin source for HTTP API calls and endpoints.
|
|
10
|
-
|
|
11
|
-
Arguments:
|
|
12
|
-
<source-dir> Path to the decompiled sources directory
|
|
13
|
-
|
|
14
|
-
Options:
|
|
15
|
-
--retrofit Search only for Retrofit annotations
|
|
16
|
-
--okhttp Search only for OkHttp patterns
|
|
17
|
-
--ktor Search only for Ktor client patterns
|
|
18
|
-
--apollo Search only for Apollo (GraphQL) patterns
|
|
19
|
-
--volley Search only for Volley patterns
|
|
20
|
-
--urls Search only for hardcoded URLs
|
|
21
|
-
--paths Extract unique endpoint-shaped path string literals
|
|
22
|
-
(works on heavily obfuscated apps where call sites are inlined)
|
|
23
|
-
--auth Search only for auth-related patterns
|
|
24
|
-
--all Search all patterns (default)
|
|
25
|
-
-h, --help Show this help message
|
|
26
|
-
|
|
27
|
-
Output:
|
|
28
|
-
Results are printed as file:line:match for easy navigation.
|
|
29
|
-
EOF
|
|
30
|
-
exit 0
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
SOURCE_DIR=""
|
|
34
|
-
SEARCH_RETROFIT=false
|
|
35
|
-
SEARCH_OKHTTP=false
|
|
36
|
-
SEARCH_KTOR=false
|
|
37
|
-
SEARCH_APOLLO=false
|
|
38
|
-
SEARCH_VOLLEY=false
|
|
39
|
-
SEARCH_URLS=false
|
|
40
|
-
SEARCH_PATHS=false
|
|
41
|
-
SEARCH_AUTH=false
|
|
42
|
-
SEARCH_ALL=true
|
|
43
|
-
|
|
44
|
-
while [[ $# -gt 0 ]]; do
|
|
45
|
-
case "$1" in
|
|
46
|
-
--retrofit) SEARCH_RETROFIT=true; SEARCH_ALL=false; shift ;;
|
|
47
|
-
--okhttp) SEARCH_OKHTTP=true; SEARCH_ALL=false; shift ;;
|
|
48
|
-
--ktor) SEARCH_KTOR=true; SEARCH_ALL=false; shift ;;
|
|
49
|
-
--apollo) SEARCH_APOLLO=true; SEARCH_ALL=false; shift ;;
|
|
50
|
-
--volley) SEARCH_VOLLEY=true; SEARCH_ALL=false; shift ;;
|
|
51
|
-
--urls) SEARCH_URLS=true; SEARCH_ALL=false; shift ;;
|
|
52
|
-
--paths) SEARCH_PATHS=true; SEARCH_ALL=false; shift ;;
|
|
53
|
-
--auth) SEARCH_AUTH=true; SEARCH_ALL=false; shift ;;
|
|
54
|
-
--all) SEARCH_ALL=true; shift ;;
|
|
55
|
-
-h|--help) usage ;;
|
|
56
|
-
-*) echo "Error: Unknown option $1" >&2; usage ;;
|
|
57
|
-
*) SOURCE_DIR="$1"; shift ;;
|
|
58
|
-
esac
|
|
59
|
-
done
|
|
60
|
-
|
|
61
|
-
if [[ -z "$SOURCE_DIR" ]]; then
|
|
62
|
-
echo "Error: No source directory specified." >&2
|
|
63
|
-
usage
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
if [[ ! -d "$SOURCE_DIR" ]]; then
|
|
67
|
-
echo "Error: Directory not found: $SOURCE_DIR" >&2
|
|
68
|
-
exit 1
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
GREP_OPTS="-rn --include=*.java --include=*.kt"
|
|
72
|
-
|
|
73
|
-
section() {
|
|
74
|
-
echo
|
|
75
|
-
echo "==== $1 ===="
|
|
76
|
-
echo
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
run_grep() {
|
|
80
|
-
local pattern="$1"
|
|
81
|
-
# shellcheck disable=SC2086
|
|
82
|
-
grep $GREP_OPTS -E "$pattern" "$SOURCE_DIR" 2>/dev/null || true
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
# Print a one-screen summary FIRST so a reader knows what to expect from
|
|
86
|
-
# the long output that follows. Skipped when a single section flag was
|
|
87
|
-
# requested (the user wants raw matches, not an overview). One pass over
|
|
88
|
-
# the tree, counts bucketed by tag — running 8 separate greps was too slow.
|
|
89
|
-
if [[ "$SEARCH_ALL" == true ]]; then
|
|
90
|
-
section "Summary (counted in a single pass)"
|
|
91
|
-
declare -A H=(
|
|
92
|
-
[retrofit]=0 [okhttp]=0 [ktor]=0 [apollo]=0 [volley]=0
|
|
93
|
-
[hilt]=0 [koin]=0 [bearer]=0 [hmac]=0
|
|
94
|
-
)
|
|
95
|
-
while IFS= read -r line; do
|
|
96
|
-
case "$line" in
|
|
97
|
-
*"@GET("*|*"@POST("*|*"@PUT("*|*"@DELETE("*|*"@PATCH("*|*"@HTTP("*) H[retrofit]=$((H[retrofit]+1));;
|
|
98
|
-
esac
|
|
99
|
-
case "$line" in
|
|
100
|
-
*"Request.Builder"*|*"HttpUrl"*|*".newCall("*) H[okhttp]=$((H[okhttp]+1));;
|
|
101
|
-
esac
|
|
102
|
-
case "$line" in
|
|
103
|
-
*"BearerTokens"*|*"defaultRequest {"*|*"client.get("*|*"client.post("*|*"httpClient.get("*|*"httpClient.post("*|*"HttpClient.get("*) H[ktor]=$((H[ktor]+1));;
|
|
104
|
-
esac
|
|
105
|
-
case "$line" in
|
|
106
|
-
*"ApolloClient"*|*".serverUrl("*) H[apollo]=$((H[apollo]+1));;
|
|
107
|
-
esac
|
|
108
|
-
case "$line" in
|
|
109
|
-
*"StringRequest"*|*"JsonObjectRequest"*|*"RequestQueue"*) H[volley]=$((H[volley]+1));;
|
|
110
|
-
esac
|
|
111
|
-
case "$line" in
|
|
112
|
-
*"@HiltAndroidApp"*|*"@AndroidEntryPoint"*|*"@HiltViewModel"*|*"@Provides"*|*"@Binds"*) H[hilt]=$((H[hilt]+1));;
|
|
113
|
-
esac
|
|
114
|
-
case "$line" in
|
|
115
|
-
*"org.koin."*|*"module {"*|*"single<"*|*"factory<"*|*"singleOf("*|*"factoryOf("*) H[koin]=$((H[koin]+1));;
|
|
116
|
-
esac
|
|
117
|
-
case "$line" in
|
|
118
|
-
*'"Bearer '*|*'"bearer '*|*"BearerTokens"*) H[bearer]=$((H[bearer]+1));;
|
|
119
|
-
esac
|
|
120
|
-
case "$line" in
|
|
121
|
-
*"HmacSHA"*|*'Mac.getInstance("Hmac'*) H[hmac]=$((H[hmac]+1));;
|
|
122
|
-
esac
|
|
123
|
-
done < <(grep -rEh --include='*.java' --include='*.kt' \
|
|
124
|
-
'@(GET|POST|PUT|DELETE|PATCH|HTTP)\(|Request\.Builder|HttpUrl|\.newCall\(|BearerTokens|defaultRequest \{|client\.(get|post)\(|httpClient\.(get|post)\(|ApolloClient|\.serverUrl\(|StringRequest|JsonObjectRequest|RequestQueue|@HiltAndroidApp|@AndroidEntryPoint|@HiltViewModel|@Provides|@Binds|org\.koin\.|module \{|single<|factory<|"[Bb]earer |HmacSHA|Mac\.getInstance' \
|
|
125
|
-
"$SOURCE_DIR" 2>/dev/null || true)
|
|
126
|
-
printf ' HTTP framework: Retrofit=%-5s OkHttp=%-5s Ktor=%-5s Apollo=%-5s Volley=%-5s\n' \
|
|
127
|
-
"${H[retrofit]}" "${H[okhttp]}" "${H[ktor]}" "${H[apollo]}" "${H[volley]}"
|
|
128
|
-
printf ' DI framework: Hilt/Dagger=%-5s Koin=%-5s\n' \
|
|
129
|
-
"${H[hilt]}" "${H[koin]}"
|
|
130
|
-
printf ' Auth signals: Bearer=%-5s HMAC/Sign=%-5s\n' \
|
|
131
|
-
"${H[bearer]}" "${H[hmac]}"
|
|
132
|
-
echo
|
|
133
|
-
echo " Run with one of --retrofit / --okhttp / --ktor / --apollo / --volley /"
|
|
134
|
-
echo " --paths / --urls / --auth to inspect a single section."
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
# --- Retrofit ---
|
|
138
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_RETROFIT" == true ]]; then
|
|
139
|
-
section "Retrofit Annotations"
|
|
140
|
-
run_grep '@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|HTTP)\s*\('
|
|
141
|
-
section "Retrofit Headers & Parameters"
|
|
142
|
-
run_grep '@(Headers|Header|Query|QueryMap|Path|Body|Field|FieldMap|Part|PartMap|Url)\s*\('
|
|
143
|
-
section "Retrofit Base URL"
|
|
144
|
-
run_grep '(baseUrl|base_url)\s*\('
|
|
145
|
-
fi
|
|
146
|
-
|
|
147
|
-
# --- OkHttp ---
|
|
148
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_OKHTTP" == true ]]; then
|
|
149
|
-
section "OkHttp Request Building"
|
|
150
|
-
run_grep '(Request\.Builder|HttpUrl|\.newCall|\.enqueue|addInterceptor|addNetworkInterceptor)'
|
|
151
|
-
section "OkHttp URL Construction"
|
|
152
|
-
run_grep '(\.url\s*\(|\.addQueryParameter|\.addPathSegment|\.scheme\s*\(|\.host\s*\()'
|
|
153
|
-
fi
|
|
154
|
-
|
|
155
|
-
# --- Ktor (Kotlin) ---
|
|
156
|
-
# Ktor doesn't use annotations. Endpoints appear as string args to
|
|
157
|
-
# client.get/post/etc., or are built via HttpRequestBuilder.url(...). Auth
|
|
158
|
-
# is configured via the bearer { loadTokens / refreshTokens } DSL.
|
|
159
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_KTOR" == true ]]; then
|
|
160
|
-
section "Ktor — Client Calls"
|
|
161
|
-
run_grep '\b(client|httpClient|HttpClient)\.(get|post|put|delete|patch|head|request)\s*[<(]'
|
|
162
|
-
section "Ktor — Request Building / Default Request"
|
|
163
|
-
run_grep '(HttpRequestBuilder|defaultRequest\s*\{|\burl\s*\(\s*"|URLBuilder|URLProtocol)'
|
|
164
|
-
section "Ktor — Auth Plugin (Bearer / Refresh)"
|
|
165
|
-
run_grep '(\bbearer\s*\{|BearerTokens\s*\(|loadTokens\s*\{|refreshTokens\s*\{|\bAuth\s*\)\s*\{)'
|
|
166
|
-
fi
|
|
167
|
-
|
|
168
|
-
# --- Apollo (GraphQL) ---
|
|
169
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_APOLLO" == true ]]; then
|
|
170
|
-
section "Apollo — GraphQL Client"
|
|
171
|
-
run_grep '(ApolloClient|\.serverUrl\s*\(|\.subscriptionNetworkTransport|HttpNetworkTransport)'
|
|
172
|
-
section "Apollo — Operations"
|
|
173
|
-
run_grep '(\.query\s*\(\s*[A-Z]|\.mutation\s*\(\s*[A-Z]|\.subscription\s*\(\s*[A-Z])'
|
|
174
|
-
fi
|
|
175
|
-
|
|
176
|
-
# --- Volley ---
|
|
177
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_VOLLEY" == true ]]; then
|
|
178
|
-
section "Volley Requests"
|
|
179
|
-
run_grep '(StringRequest|JsonObjectRequest|JsonArrayRequest|ImageRequest|RequestQueue|Volley\.newRequestQueue)'
|
|
180
|
-
fi
|
|
181
|
-
|
|
182
|
-
# --- Endpoint-shaped path literals ---
|
|
183
|
-
# Survives R8 obfuscation: even when call sites are inlined to a.b(c, "path"),
|
|
184
|
-
# the path strings themselves are not obfuscated. This produces a deduplicated
|
|
185
|
-
# inventory of likely API endpoints that other modes miss.
|
|
186
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_PATHS" == true ]]; then
|
|
187
|
-
section "Endpoint-Shaped Path Literals (deduplicated)"
|
|
188
|
-
# Quoted strings that begin with /<segment> or <segment>/ where the leading
|
|
189
|
-
# segment is a typical API root word. Cap segment count and length to keep
|
|
190
|
-
# the regex grounded.
|
|
191
|
-
# An endpoint-shaped string is one of:
|
|
192
|
-
# "/seg/seg..." — absolute path with >= 2 segments
|
|
193
|
-
# "api-root/seg/seg..." — relative path starting with a known
|
|
194
|
-
# API root keyword and containing >= 1
|
|
195
|
-
# '/' followed by another segment
|
|
196
|
-
# Segments are URL-safe chars plus {} for path-template placeholders.
|
|
197
|
-
SEG='[A-Za-z0-9_{}.\-]+'
|
|
198
|
-
ROOT='(api|v[0-9]+|graphql|rest|mobile|auth|oauth|sso|users?|account|session|token|register|signup|signin|logout|password|verify|otp|sms|profile|customer|cart|basket|order|checkout|payment|invoice|product|catalog|inventory|search|category|favo[u]?rites?|wishlist|address|location|delivery|shipping|review|feedback|notification|push|message|chat|track|event|stat[a-z]*|metric|config|settings?|feature|flag|banner|content|media|upload|download|file|image|video|live|stream|webhook|callback)'
|
|
199
|
-
PATHS_REGEX="\"(/${SEG}(/${SEG})+/?|${ROOT}(/${SEG})+/?)\""
|
|
200
|
-
# Filter out frequent false positives (MIME types, /proc, /sys, /dev).
|
|
201
|
-
EXCLUDE='^"(image|video|audio|text|application|content|font|model|multipart|message)/|^"/(proc|sys|dev|tmp|etc|usr|var|opt)/'
|
|
202
|
-
# Print a flat unique list rather than file:line — this is the inventory.
|
|
203
|
-
grep -rhoE --include='*.java' --include='*.kt' "$PATHS_REGEX" "$SOURCE_DIR" 2>/dev/null \
|
|
204
|
-
| grep -Ev "$EXCLUDE" \
|
|
205
|
-
| sort -u || true
|
|
206
|
-
echo
|
|
207
|
-
section "Endpoint-Shaped Path Literals — call sites"
|
|
208
|
-
grep $GREP_OPTS -E "$PATHS_REGEX" "$SOURCE_DIR" 2>/dev/null \
|
|
209
|
-
| grep -Ev ":[0-9]+:.*${EXCLUDE#^}" || true
|
|
210
|
-
fi
|
|
211
|
-
|
|
212
|
-
# --- Hardcoded URLs ---
|
|
213
|
-
# A loose grep for http(s)://... drowns in compression-dictionary garbage and
|
|
214
|
-
# in third-party SDK URLs (Google, Firebase, AppsFlyer, Datadog, ...). The
|
|
215
|
-
# strict regex requires a syntactically valid hostname and rejects strings
|
|
216
|
-
# containing whitespace, angle brackets, or non-printable bytes. Hosts are
|
|
217
|
-
# then bucketed into "first-party candidates" vs "third-party (denylist)".
|
|
218
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_URLS" == true ]]; then
|
|
219
|
-
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
220
|
-
DENYLIST="$HERE/../references/third_party_hosts.txt"
|
|
221
|
-
# Accept three host shapes, all rejecting whitespace / angle brackets /
|
|
222
|
-
# non-printables in the path:
|
|
223
|
-
# * IPv4 literal (dev/staging endpoints, high signal) 192.168.0.1
|
|
224
|
-
# * dotted host: >=2 labels ending in a 2+ letter TLD (incl apex) example.com
|
|
225
|
-
# * bare single-label host, BUT only when followed by ':port' or localhost:3000
|
|
226
|
-
# '/path' — keeps internal hosts (localhost, internal-backend) svc/health
|
|
227
|
-
# while still dropping Kotlin-stdlib dictionary fragments like
|
|
228
|
-
# "http://An Introduction..." (bare word, no port/path follows).
|
|
229
|
-
STRICT_URL='https?://(([0-9]{1,3}(\.[0-9]{1,3}){3}|[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,})(:[0-9]{1,5})?(/[^"<>[:space:]]*)?|[A-Za-z0-9-]+(:[0-9]{1,5}(/[^"<>[:space:]]*)?|/[^"<>[:space:]]*))'
|
|
230
|
-
|
|
231
|
-
TMP="$(mktemp)"
|
|
232
|
-
trap 'rm -f "$TMP"' EXIT
|
|
233
|
-
# Extraction (STRICT_URL) is deliberately permissive; this awk pass drops the
|
|
234
|
-
# residual Kotlin-stdlib dictionary noise WITHOUT losing the high-signal
|
|
235
|
-
# shapes a strict-only regex discards (IPs, apex domains, internal hosts).
|
|
236
|
-
# Decision table, top-down, on the host (authority before any :port / /path):
|
|
237
|
-
# * IPv4 literal -> keep (dict fragments are words,
|
|
238
|
-
# never dotted-quads)
|
|
239
|
-
# * >=3 labels (sub.domain.tld) -> keep (any TLD; same tolerance the
|
|
240
|
-
# original strict regex had)
|
|
241
|
-
# * any host WITH a :port or /path -> keep (structured = high signal:
|
|
242
|
-
# localhost:3000, svc/health)
|
|
243
|
-
# * bare 2-label apex, no port/path -> keep ONLY if the TLD is a real one,
|
|
244
|
-
# compared as a whole field (kills
|
|
245
|
-
# "www.this" / "this.introduction",
|
|
246
|
-
# keeps "mytrackera-api.com")
|
|
247
|
-
# Trade-off: a first-party host referenced bare with an uncommon TLD (e.g.
|
|
248
|
-
# https://foo.store with no path) is dropped — give it a path/port, or add the
|
|
249
|
-
# TLD to the list below, if you hit that case.
|
|
250
|
-
{ grep -rhoE --include='*.java' --include='*.kt' "$STRICT_URL" "$SOURCE_DIR" 2>/dev/null || true; } \
|
|
251
|
-
| sort -u \
|
|
252
|
-
| awk '
|
|
253
|
-
{ rest=$0; sub(/^https?:\/\//,"",rest)
|
|
254
|
-
host=rest; sub(/[/:].*/,"",host)
|
|
255
|
-
haspathport = (rest ~ /[/:]/)
|
|
256
|
-
if (host ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) { print; next } # IPv4
|
|
257
|
-
n = split(host, a, ".")
|
|
258
|
-
if (n >= 3) { print; next } # sub.domain.tld
|
|
259
|
-
if (haspathport) { print; next } # has :port or /path
|
|
260
|
-
if (n == 2 && a[2] ~ /^(com|net|org|io|co|app|dev|me|ai|xyz|info|biz|gov|edu|mil|int|tech|cloud|uk|de|fr|it|es|nl|in|us|ca|au|jp|cn|br|ru|eu|ch|se|no|fi|dk|pl|pt|gr|ie|be|at|cz|sg|hk|kr|tw|mx|ar|cl|za|nz)$/) print # real apex TLD
|
|
261
|
-
}' > "$TMP"
|
|
262
|
-
|
|
263
|
-
# Extract host: strip scheme, take part up to first ':' or '/'.
|
|
264
|
-
HOSTS_TMP="$(mktemp)"
|
|
265
|
-
sed -E 's#^https?://##; s#[/:].*$##' "$TMP" | sort -u > "$HOSTS_TMP"
|
|
266
|
-
|
|
267
|
-
if [[ -f "$DENYLIST" ]]; then
|
|
268
|
-
# Build a single combined regex from the denylist (one line each).
|
|
269
|
-
DENY_REGEX="$(grep -vE '^\s*(#|$)' "$DENYLIST" | tr '\n' '|' | sed 's/|$//')"
|
|
270
|
-
THIRD_HOSTS=$(grep -E "$DENY_REGEX" "$HOSTS_TMP" || true)
|
|
271
|
-
FIRST_HOSTS=$(grep -vE "$DENY_REGEX" "$HOSTS_TMP" || true)
|
|
272
|
-
else
|
|
273
|
-
THIRD_HOSTS=""
|
|
274
|
-
FIRST_HOSTS=$(cat "$HOSTS_TMP")
|
|
275
|
-
fi
|
|
276
|
-
|
|
277
|
-
section "Likely First-Party Hosts (frequency-sorted)"
|
|
278
|
-
if [[ -n "$FIRST_HOSTS" ]]; then
|
|
279
|
-
while IFS= read -r h; do
|
|
280
|
-
[[ -z "$h" ]] && continue
|
|
281
|
-
n=$(grep -cE "://${h//./\\.}([/:\"]|$)" "$TMP" || true)
|
|
282
|
-
printf ' %5d %s\n' "$n" "$h"
|
|
283
|
-
done <<< "$FIRST_HOSTS" | sort -rn -k1
|
|
284
|
-
else
|
|
285
|
-
echo " (none — every URL matched the third-party denylist)"
|
|
286
|
-
fi
|
|
287
|
-
|
|
288
|
-
section "Third-Party Hosts (denylist matches, collapsed)"
|
|
289
|
-
if [[ -n "$THIRD_HOSTS" ]]; then
|
|
290
|
-
echo "$THIRD_HOSTS" | sed 's/^/ /'
|
|
291
|
-
else
|
|
292
|
-
echo " (none)"
|
|
293
|
-
fi
|
|
294
|
-
|
|
295
|
-
section "All First-Party URLs (full strings)"
|
|
296
|
-
if [[ -n "$FIRST_HOSTS" ]]; then
|
|
297
|
-
while IFS= read -r h; do
|
|
298
|
-
[[ -z "$h" ]] && continue
|
|
299
|
-
grep -E "://${h//./\\.}([/:\"]|$)" "$TMP" | sed 's/^/ /'
|
|
300
|
-
done <<< "$FIRST_HOSTS"
|
|
301
|
-
fi
|
|
302
|
-
|
|
303
|
-
rm -f "$HOSTS_TMP" "$TMP"
|
|
304
|
-
trap - EXIT
|
|
305
|
-
|
|
306
|
-
section "HttpURLConnection"
|
|
307
|
-
run_grep '(openConnection|setRequestMethod|HttpURLConnection|HttpsURLConnection)'
|
|
308
|
-
section "WebView URLs"
|
|
309
|
-
run_grep '(loadUrl|loadData|evaluateJavascript|addJavascriptInterface|WebViewClient|WebChromeClient)'
|
|
310
|
-
fi
|
|
311
|
-
|
|
312
|
-
# --- Auth patterns ---
|
|
313
|
-
if [[ "$SEARCH_ALL" == true || "$SEARCH_AUTH" == true ]]; then
|
|
314
|
-
section "Authentication & API Keys"
|
|
315
|
-
run_grep -i '(api[_-]?key|auth[_-]?token|bearer|authorization|x-api-key|client[_-]?secret|access[_-]?token|refresh[_-]?token)'
|
|
316
|
-
|
|
317
|
-
# Request-signing schemes: a hardcoded HMAC / RSA secret in an APK is a
|
|
318
|
-
# security finding worth surfacing prominently. These patterns catch the
|
|
319
|
-
# common shapes of homegrown / SDK-issued request signers.
|
|
320
|
-
section "Request Signing (HMAC / signature schemes)"
|
|
321
|
-
run_grep '(HmacSHA(1|256|512)|Mac\.getInstance\("Hmac|SecretKeySpec\(|Signature\.getInstance\()'
|
|
322
|
-
run_grep -i '(x-signature|x-client-authorization|x-amz-signature|x-hmac|aws4-hmac|signRequest|signatureFor|computeSignature|signaturev[0-9])'
|
|
323
|
-
|
|
324
|
-
# Hardcoded high-entropy strings adjacent to "secret"/"key" assignments
|
|
325
|
-
# are the canonical leaked-credential pattern.
|
|
326
|
-
section "Possible Hardcoded Secrets / Keys"
|
|
327
|
-
run_grep -i '(app[_-]?secret|client[_-]?secret|signing[_-]?key|hmac[_-]?secret|consumer[_-]?secret|private[_-]?key)'
|
|
328
|
-
|
|
329
|
-
section "Base URLs and Constants"
|
|
330
|
-
run_grep -i '(BASE_URL|API_URL|SERVER_URL|ENDPOINT|API_BASE|HOST_NAME)'
|
|
331
|
-
|
|
332
|
-
# Ktor BearerTokens / refresh DSL — common on Kotlin apps and lives on
|
|
333
|
-
# Ktor's public API, so it survives R8 unchanged.
|
|
334
|
-
section "Ktor Auth (Bearer + Refresh)"
|
|
335
|
-
run_grep '(BearerTokens|loadTokens\s*\{|refreshTokens\s*\{|\bbearer\s*\{)'
|
|
336
|
-
fi
|
|
337
|
-
|
|
338
|
-
echo
|
|
339
|
-
echo "=== Search complete ==="
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# fingerprint.sh — Triage an APK/XAPK before decompiling.
|
|
3
|
-
#
|
|
4
|
-
# Detects mobile framework (Flutter, React Native, Cordova/Capacitor,
|
|
5
|
-
# Xamarin, KMP/native), HTTP-stack hints, obfuscation level, native libs,
|
|
6
|
-
# and notable third-party SDKs.
|
|
7
|
-
#
|
|
8
|
-
# Decompiling Java is mostly useless for Flutter / RN / Xamarin / Cordova
|
|
9
|
-
# apps — different tools are needed. Run this BEFORE Phase 2 to choose
|
|
10
|
-
# the right path.
|
|
11
|
-
|
|
12
|
-
set -euo pipefail
|
|
13
|
-
|
|
14
|
-
usage() {
|
|
15
|
-
cat <<EOF
|
|
16
|
-
Usage: fingerprint.sh <file.apk|file.xapk>
|
|
17
|
-
|
|
18
|
-
Prints a one-screen summary:
|
|
19
|
-
* mobile framework (with rationale)
|
|
20
|
-
* HTTP / DI / serialization stack hints
|
|
21
|
-
* obfuscation indicator
|
|
22
|
-
* native libraries (consolidated across split APKs)
|
|
23
|
-
* notable third-party SDKs found in assets/
|
|
24
|
-
EOF
|
|
25
|
-
exit 0
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
[[ $# -lt 1 || "$1" == "-h" || "$1" == "--help" ]] && usage
|
|
29
|
-
INPUT="$1"
|
|
30
|
-
[[ ! -f "$INPUT" ]] && { echo "File not found: $INPUT" >&2; exit 1; }
|
|
31
|
-
|
|
32
|
-
TMP="$(mktemp -d -t apkfp.XXXXXX)"
|
|
33
|
-
trap 'rm -rf "$TMP"' EXIT
|
|
34
|
-
|
|
35
|
-
# Resolve to a list of APKs (handle XAPK = ZIP of APKs)
|
|
36
|
-
APKS=()
|
|
37
|
-
case "${INPUT,,}" in
|
|
38
|
-
*.xapk|*.apks|*.apkm)
|
|
39
|
-
unzip -q -o "$INPUT" -d "$TMP/xapk"
|
|
40
|
-
while IFS= read -r p; do APKS+=("$p"); done < <(find "$TMP/xapk" -maxdepth 2 -type f -name '*.apk')
|
|
41
|
-
;;
|
|
42
|
-
*.apk)
|
|
43
|
-
APKS=("$INPUT")
|
|
44
|
-
;;
|
|
45
|
-
*)
|
|
46
|
-
echo "Unsupported input: $INPUT" >&2; exit 1 ;;
|
|
47
|
-
esac
|
|
48
|
-
|
|
49
|
-
# Aggregate ZIP listings from every APK in the bundle (split-aware view)
|
|
50
|
-
LISTING="$TMP/listing.txt"
|
|
51
|
-
: > "$LISTING"
|
|
52
|
-
for apk in "${APKS[@]}"; do
|
|
53
|
-
unzip -l -- "$apk" 2>/dev/null | awk '{print $NF}' >> "$LISTING"
|
|
54
|
-
done
|
|
55
|
-
|
|
56
|
-
# Most class-level libs live inside classes*.dex, not as visible zip paths.
|
|
57
|
-
# Extract the type-name strings out of each dex with `strings` and append them
|
|
58
|
-
# to the listing so `has()` can match e.g. 'io/ktor/' or 'org/koin/'.
|
|
59
|
-
DEX_STRINGS="$TMP/dex_strings.txt"
|
|
60
|
-
: > "$DEX_STRINGS"
|
|
61
|
-
for apk in "${APKS[@]}"; do
|
|
62
|
-
for dex in $(unzip -Z1 -- "$apk" 2>/dev/null | grep -E '^classes[0-9]*\.dex$' || true); do
|
|
63
|
-
# DEX type descriptors look like "Lcom/foo/Bar;". Extract the inner
|
|
64
|
-
# slash-separated FQN so callers can match e.g. 'io/ktor/' directly.
|
|
65
|
-
unzip -p -- "$apk" "$dex" 2>/dev/null \
|
|
66
|
-
| strings -n 8 \
|
|
67
|
-
| grep -oE 'L[a-z][a-zA-Z0-9_]*(/[a-zA-Z0-9_$]+)+;' \
|
|
68
|
-
| sed -E 's/^L//; s/;$//' \
|
|
69
|
-
>> "$DEX_STRINGS" || true
|
|
70
|
-
done
|
|
71
|
-
done
|
|
72
|
-
sort -u "$DEX_STRINGS" -o "$DEX_STRINGS"
|
|
73
|
-
|
|
74
|
-
has() { grep -qE "$1" "$LISTING" || grep -qE "$1" "$DEX_STRINGS"; }
|
|
75
|
-
|
|
76
|
-
# ----------------------------------------------------------------------
|
|
77
|
-
# Framework detection (priority order — first match wins)
|
|
78
|
-
# ----------------------------------------------------------------------
|
|
79
|
-
FRAMEWORK="unknown"
|
|
80
|
-
RATIONALE=""
|
|
81
|
-
|
|
82
|
-
if has '^lib/[^/]+/libflutter\.so$'; then
|
|
83
|
-
FRAMEWORK="Flutter"
|
|
84
|
-
RATIONALE="lib/<abi>/libflutter.so present"
|
|
85
|
-
has '^lib/[^/]+/libapp\.so$' && RATIONALE+="; libapp.so contains AOT-compiled Dart"
|
|
86
|
-
elif has '^lib/[^/]+/libhermes\.so$' || has '^assets/index\.android\.bundle$' || has '^lib/[^/]+/libreactnativejni\.so$'; then
|
|
87
|
-
FRAMEWORK="React Native"
|
|
88
|
-
reasons=()
|
|
89
|
-
has '^lib/[^/]+/libhermes\.so$' && reasons+=("libhermes.so")
|
|
90
|
-
has '^lib/[^/]+/libreactnativejni\.so$' && reasons+=("libreactnativejni.so")
|
|
91
|
-
has '^assets/index\.android\.bundle$' && reasons+=("assets/index.android.bundle")
|
|
92
|
-
RATIONALE="${reasons[*]}"
|
|
93
|
-
elif has '^assets/www/index\.html$' || has '^assets/www/cordova\.js$' || has '^assets/public/index\.html$'; then
|
|
94
|
-
FRAMEWORK="Cordova / Capacitor (WebView hybrid)"
|
|
95
|
-
RATIONALE="assets/www/ or assets/public/ shell present"
|
|
96
|
-
elif has '^lib/[^/]+/libmonodroid\.so$' || has '^assemblies/'; then
|
|
97
|
-
FRAMEWORK="Xamarin / .NET MAUI"
|
|
98
|
-
RATIONALE="libmonodroid.so or assemblies/ present — code is in .NET DLLs"
|
|
99
|
-
elif has '^lib/[^/]+/libmaui\.so$'; then
|
|
100
|
-
FRAMEWORK=".NET MAUI"
|
|
101
|
-
RATIONALE="libmaui.so present"
|
|
102
|
-
elif has '^assets/flutter_assets/' && ! has '^lib/[^/]+/libflutter\.so$'; then
|
|
103
|
-
FRAMEWORK="Flutter (code-only split?)"
|
|
104
|
-
RATIONALE="flutter_assets/ but no libflutter.so in this APK — check splits"
|
|
105
|
-
else
|
|
106
|
-
# Native: distinguish Compose vs classic Android by androidx.compose presence
|
|
107
|
-
if has 'androidx\.compose'; then
|
|
108
|
-
FRAMEWORK="Native Android (Kotlin + Jetpack Compose)"
|
|
109
|
-
RATIONALE="androidx.compose.* libraries detected"
|
|
110
|
-
elif has '^META-INF/.*\.kotlin_module$'; then
|
|
111
|
-
FRAMEWORK="Native Android (Kotlin)"
|
|
112
|
-
RATIONALE="kotlin_module metadata present, no Compose markers"
|
|
113
|
-
else
|
|
114
|
-
FRAMEWORK="Native Android (Java/Kotlin)"
|
|
115
|
-
RATIONALE="no cross-platform framework markers found"
|
|
116
|
-
fi
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# ----------------------------------------------------------------------
|
|
120
|
-
# HTTP / DI / serialization stack hints
|
|
121
|
-
# ----------------------------------------------------------------------
|
|
122
|
-
http=()
|
|
123
|
-
has 'retrofit2' && http+=("Retrofit")
|
|
124
|
-
has 'okhttp3' && http+=("OkHttp")
|
|
125
|
-
has 'io/ktor/' && http+=("Ktor")
|
|
126
|
-
has 'com/apollographql/' && http+=("Apollo (GraphQL)")
|
|
127
|
-
has 'com/android/volley' && http+=("Volley")
|
|
128
|
-
|
|
129
|
-
di=()
|
|
130
|
-
has 'dagger/hilt/' && di+=("Hilt")
|
|
131
|
-
has '^META-INF/.*dagger.*' && di+=("Dagger")
|
|
132
|
-
has 'org/koin/' && di+=("Koin")
|
|
133
|
-
has 'javax/inject/' && [[ ${#di[@]} -eq 0 ]] && di+=("javax.inject")
|
|
134
|
-
|
|
135
|
-
ser=()
|
|
136
|
-
has 'kotlinx/serialization/' && ser+=("kotlinx.serialization")
|
|
137
|
-
has 'com/google/gson/' && ser+=("Gson")
|
|
138
|
-
has 'com/squareup/moshi/' && ser+=("Moshi")
|
|
139
|
-
has 'com/fasterxml/jackson/' && ser+=("Jackson")
|
|
140
|
-
|
|
141
|
-
# ----------------------------------------------------------------------
|
|
142
|
-
# Obfuscation indicator (R8/ProGuard) — count single-letter dex packages
|
|
143
|
-
# ----------------------------------------------------------------------
|
|
144
|
-
# Note: pipefail is on, so guard greps that may legitimately return 0 matches.
|
|
145
|
-
short_dirs=$( { grep -oE '^[a-z]{1,2}/' "$LISTING" || true; } | sort -u | wc -l | tr -d ' ')
|
|
146
|
-
if [[ "$short_dirs" -gt 30 ]]; then
|
|
147
|
-
OBFUSCATION="HIGH ($short_dirs single/double-letter dirs at root)"
|
|
148
|
-
elif [[ "$short_dirs" -gt 10 ]]; then
|
|
149
|
-
OBFUSCATION="MODERATE ($short_dirs short root dirs)"
|
|
150
|
-
else
|
|
151
|
-
OBFUSCATION="LOW (no significant short-name namespace pollution)"
|
|
152
|
-
fi
|
|
153
|
-
|
|
154
|
-
# ----------------------------------------------------------------------
|
|
155
|
-
# Native libraries (consolidated)
|
|
156
|
-
# ----------------------------------------------------------------------
|
|
157
|
-
NATIVE=$(grep -E '^lib/[^/]+/[^/]+\.so$' "$LISTING" | sort -u || true)
|
|
158
|
-
|
|
159
|
-
# ----------------------------------------------------------------------
|
|
160
|
-
# Notable third-party SDKs (assets-based markers)
|
|
161
|
-
# ----------------------------------------------------------------------
|
|
162
|
-
sdks=()
|
|
163
|
-
has '^assets/com/appsflyer/' && sdks+=("AppsFlyer")
|
|
164
|
-
has 'datadog\.buildId|com/datadog/' && sdks+=("Datadog")
|
|
165
|
-
has 'io/sentry/' && sdks+=("Sentry")
|
|
166
|
-
has 'com/google/firebase/' && sdks+=("Firebase")
|
|
167
|
-
has 'com/google/android/gms/' && sdks+=("Google Play Services")
|
|
168
|
-
has 'com/facebook/' && sdks+=("Facebook SDK")
|
|
169
|
-
has 'com/payu/' && sdks+=("PayU")
|
|
170
|
-
has 'com/stripe/' && sdks+=("Stripe")
|
|
171
|
-
has 'com/braintreepayments/' && sdks+=("Braintree")
|
|
172
|
-
has 'com/storyteller/' && sdks+=("Storyteller")
|
|
173
|
-
has 'zendesk/' && sdks+=("Zendesk")
|
|
174
|
-
has 'com/intercom/' && sdks+=("Intercom")
|
|
175
|
-
has 'com/segment/analytics' && sdks+=("Segment")
|
|
176
|
-
has 'com/amplitude/' && sdks+=("Amplitude")
|
|
177
|
-
has 'com/mixpanel/' && sdks+=("Mixpanel")
|
|
178
|
-
has 'com/onesignal/' && sdks+=("OneSignal")
|
|
179
|
-
has 'com/microsoft/clarity' && sdks+=("Microsoft Clarity")
|
|
180
|
-
has 'com/hotjar/' && sdks+=("Hotjar")
|
|
181
|
-
has 'com/instabug/' && sdks+=("Instabug")
|
|
182
|
-
|
|
183
|
-
# BuildConfig.java is almost never obfuscated and often holds base URLs / flavor.
|
|
184
|
-
if has 'BuildConfig\.class$'; then
|
|
185
|
-
BUILDCONFIG="present (grep BuildConfig.java after decompile for base URLs / flavor)"
|
|
186
|
-
else
|
|
187
|
-
BUILDCONFIG="not detected in zip listing (still worth grepping after decompile)"
|
|
188
|
-
fi
|
|
189
|
-
|
|
190
|
-
# ----------------------------------------------------------------------
|
|
191
|
-
# Summary
|
|
192
|
-
# ----------------------------------------------------------------------
|
|
193
|
-
echo "=== APK Fingerprint: $(basename "$INPUT") ==="
|
|
194
|
-
echo
|
|
195
|
-
echo "Framework: $FRAMEWORK"
|
|
196
|
-
echo " Rationale: $RATIONALE"
|
|
197
|
-
echo "Obfuscation: $OBFUSCATION"
|
|
198
|
-
echo
|
|
199
|
-
echo "HTTP stack: ${http[*]:-none detected}"
|
|
200
|
-
echo "DI: ${di[*]:-none detected}"
|
|
201
|
-
echo "Serialization: ${ser[*]:-none detected}"
|
|
202
|
-
echo "BuildConfig: $BUILDCONFIG"
|
|
203
|
-
echo
|
|
204
|
-
echo "Third-party SDKs: ${sdks[*]:-none detected}"
|
|
205
|
-
echo
|
|
206
|
-
echo "Native libraries (consolidated across splits):"
|
|
207
|
-
if [[ -n "$NATIVE" ]]; then
|
|
208
|
-
echo "$NATIVE" | sed 's/^/ /'
|
|
209
|
-
else
|
|
210
|
-
echo " (none)"
|
|
211
|
-
fi
|
|
212
|
-
echo
|
|
213
|
-
|
|
214
|
-
# ----------------------------------------------------------------------
|
|
215
|
-
# Recommendation
|
|
216
|
-
# ----------------------------------------------------------------------
|
|
217
|
-
echo "Recommended next step:"
|
|
218
|
-
case "$FRAMEWORK" in
|
|
219
|
-
Flutter*)
|
|
220
|
-
echo " Java decompilation will yield ~no app code. The Dart logic lives in"
|
|
221
|
-
echo " libapp.so (AOT). Use tools designed for Flutter:"
|
|
222
|
-
echo " - reFlutter / Doldrums / blutter (extract Dart class structure)"
|
|
223
|
-
echo " - strings/rabin2 on libapp.so for endpoints & string constants"
|
|
224
|
-
;;
|
|
225
|
-
React*)
|
|
226
|
-
echo " Java code is just the RN host. Real app logic is in JS/Hermes:"
|
|
227
|
-
echo " - if Hermes: hbctool disasm assets/index.android.bundle"
|
|
228
|
-
echo " - if JSC: js-beautify the bundle and grep for 'fetch('/'axios'"
|
|
229
|
-
;;
|
|
230
|
-
Cordova*)
|
|
231
|
-
echo " All app code is in assets/www/ (or assets/public/). Just unzip and"
|
|
232
|
-
echo " inspect the HTML/JS — no Java decompile needed."
|
|
233
|
-
;;
|
|
234
|
-
Xamarin*|.NET*)
|
|
235
|
-
echo " App logic is in .NET DLLs (assemblies/). Use ILSpy or dotPeek;"
|
|
236
|
-
echo " jadx will only show the Mono host."
|
|
237
|
-
;;
|
|
238
|
-
*)
|
|
239
|
-
echo " Proceed with Phase 2: bash scripts/decompile.sh <file>"
|
|
240
|
-
;;
|
|
241
|
-
esac
|