@rosetears/aili-pi 0.1.0
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/LICENSE +21 -0
- package/README.md +109 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/extensions/index.ts +6 -0
- package/install.sh +5 -0
- package/manifests/adapter-evidence.json +45 -0
- package/manifests/capabilities.json +124 -0
- package/manifests/live-verification.json +26 -0
- package/manifests/provenance.json +71 -0
- package/manifests/roles.json +474 -0
- package/manifests/sbom.json +7797 -0
- package/manifests/skill-compatibility.json +8100 -0
- package/manifests/subagent-provenance.json +37 -0
- package/package.json +91 -0
- package/prompts/build.md +8 -0
- package/prompts/define.md +8 -0
- package/prompts/ideate.md +8 -0
- package/prompts/local-review.md +8 -0
- package/prompts/ship.md +8 -0
- package/roles/agent-evaluator.md +47 -0
- package/roles/ai-regression-scout.md +47 -0
- package/roles/browser-qa-runner.md +47 -0
- package/roles/code-reviewer.md +47 -0
- package/roles/code-scout.md +47 -0
- package/roles/convergence-reviewer.md +55 -0
- package/roles/doc-researcher.md +47 -0
- package/roles/e2e-artifact-runner.md +47 -0
- package/roles/implementer.md +47 -0
- package/roles/opensource-sanitizer.md +47 -0
- package/roles/plan-auditor.md +47 -0
- package/roles/pr-test-analyzer.md +47 -0
- package/roles/security-auditor.md +47 -0
- package/roles/silent-failure-reviewer.md +47 -0
- package/roles/spec-miner.md +47 -0
- package/roles/test-coverage-reviewer.md +47 -0
- package/roles/test-engineer.md +48 -0
- package/roles/web-performance-auditor.md +47 -0
- package/roles/web-researcher.md +47 -0
- package/scripts/apply-adapter-evidence.ts +73 -0
- package/scripts/bootstrap.sh +180 -0
- package/scripts/generate-provenance.ts +143 -0
- package/scripts/local-package-e2e.ts +51 -0
- package/scripts/sync-roles.ts +213 -0
- package/scripts/sync-skills.ts +356 -0
- package/scripts/validate-runtime.ts +11 -0
- package/skills/academic-paper-review/SKILL.md +81 -0
- package/skills/agents-md-initialization/SKILL.md +121 -0
- package/skills/agents-md-initialization/references/agents-template.md +83 -0
- package/skills/agents-md-initialization/references/agents_md.py +215 -0
- package/skills/ai-regression-scout/SKILL.md +24 -0
- package/skills/aili-delivery-flow/SKILL.md +125 -0
- package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
- package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
- package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
- package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
- package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
- package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
- package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
- package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
- package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
- package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
- package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
- package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
- package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
- package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
- package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
- package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
- package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
- package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
- package/skills/android-native-dev/SKILL.md +722 -0
- package/skills/android-native-dev/references/accessibility.md +209 -0
- package/skills/android-native-dev/references/adaptive-screens.md +231 -0
- package/skills/android-native-dev/references/design-style-guide.md +365 -0
- package/skills/android-native-dev/references/functional-requirements.md +229 -0
- package/skills/android-native-dev/references/motion-system.md +203 -0
- package/skills/android-native-dev/references/performance-stability.md +223 -0
- package/skills/android-native-dev/references/privacy-security.md +244 -0
- package/skills/android-native-dev/references/testing.md +554 -0
- package/skills/android-native-dev/references/visual-design.md +246 -0
- package/skills/api-and-interface-design/SKILL.md +318 -0
- package/skills/browser-qa/SKILL.md +32 -0
- package/skills/browser-testing-with-devtools/SKILL.md +323 -0
- package/skills/build-failure-repair/SKILL.md +49 -0
- package/skills/chart-visualization/SKILL.md +73 -0
- package/skills/ci-cd-and-automation/SKILL.md +353 -0
- package/skills/code-review-and-quality/SKILL.md +375 -0
- package/skills/code-review-quality-gates/SKILL.md +132 -0
- package/skills/code-simplification/SKILL.md +371 -0
- package/skills/comment-accuracy-review/SKILL.md +37 -0
- package/skills/consulting-analysis/SKILL.md +69 -0
- package/skills/context-engineering/SKILL.md +375 -0
- package/skills/coverage-review/SKILL.md +24 -0
- package/skills/data-analysis/SKILL.md +74 -0
- package/skills/deprecation-and-migration/SKILL.md +222 -0
- package/skills/documentation-and-adrs/SKILL.md +330 -0
- package/skills/e2e-artifact-handling/SKILL.md +30 -0
- package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
- package/skills/explain-by-allegory/SKILL.md +99 -0
- package/skills/flutter-dev/SKILL.md +162 -0
- package/skills/flutter-dev/references/animations.md +497 -0
- package/skills/flutter-dev/references/bloc-state.md +281 -0
- package/skills/flutter-dev/references/forms.md +656 -0
- package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
- package/skills/flutter-dev/references/localization.md +510 -0
- package/skills/flutter-dev/references/networking.md +566 -0
- package/skills/flutter-dev/references/performance.md +305 -0
- package/skills/flutter-dev/references/platform-specific.md +417 -0
- package/skills/flutter-dev/references/project-structure.md +273 -0
- package/skills/flutter-dev/references/riverpod-state.md +232 -0
- package/skills/flutter-dev/references/testing.md +364 -0
- package/skills/flutter-dev/references/widget-patterns.md +233 -0
- package/skills/frontend-dev/SKILL.md +468 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
- package/skills/frontend-dev/references/env-setup.md +33 -0
- package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
- package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
- package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
- package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
- package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
- package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
- package/skills/frontend-dev/references/motion-recipes.md +407 -0
- package/skills/frontend-dev/references/troubleshooting.md +85 -0
- package/skills/frontend-dev/scripts/minimax_image.py +137 -0
- package/skills/frontend-dev/scripts/minimax_music.py +157 -0
- package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
- package/skills/frontend-dev/scripts/minimax_video.py +187 -0
- package/skills/frontend-dev/templates/generator_template.js +223 -0
- package/skills/frontend-dev/templates/viewer.html +599 -0
- package/skills/frontend-ui-engineering/SKILL.md +367 -0
- package/skills/fullstack-dev/SKILL.md +819 -0
- package/skills/fullstack-dev/references/api-design.md +444 -0
- package/skills/fullstack-dev/references/auth-flow.md +165 -0
- package/skills/fullstack-dev/references/db-schema.md +706 -0
- package/skills/fullstack-dev/references/django-best-practices.md +466 -0
- package/skills/fullstack-dev/references/environment-management.md +78 -0
- package/skills/fullstack-dev/references/release-checklist.md +278 -0
- package/skills/fullstack-dev/references/technology-selection.md +254 -0
- package/skills/fullstack-dev/references/testing-strategy.md +404 -0
- package/skills/git-workflow-and-versioning/SKILL.md +446 -0
- package/skills/github-evidence-triage/SKILL.md +115 -0
- package/skills/harness-evolution/SKILL.md +59 -0
- package/skills/harness-evolution/references/activation-matrix.md +13 -0
- package/skills/harness-evolution/references/approval-policy.md +20 -0
- package/skills/harness-evolution/references/change-report-template.md +33 -0
- package/skills/harness-evolution/references/component-taxonomy.md +19 -0
- package/skills/harness-evolution/references/verdict-policy.md +13 -0
- package/skills/harness-issue-triage/SKILL.md +72 -0
- package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
- package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
- package/skills/harness-optimization-audit/SKILL.md +125 -0
- package/skills/idea-refine/SKILL.md +191 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
- package/skills/incremental-implementation/SKILL.md +252 -0
- package/skills/ios-application-dev/SKILL.md +212 -0
- package/skills/ios-application-dev/references/accessibility.md +259 -0
- package/skills/ios-application-dev/references/graphics-animation.md +350 -0
- package/skills/ios-application-dev/references/layout-system.md +199 -0
- package/skills/ios-application-dev/references/metal-shader.md +178 -0
- package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
- package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
- package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
- package/skills/ios-application-dev/references/system-integration.md +401 -0
- package/skills/ios-application-dev/references/uikit-components.md +297 -0
- package/skills/local-review-gate/SKILL.md +207 -0
- package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
- package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
- package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
- package/skills/local-review-gate/references/graphify-local-review.md +33 -0
- package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
- package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
- package/skills/local-review-gate/references/upstream-provenance.md +61 -0
- package/skills/mature-project-pattern-research/SKILL.md +155 -0
- package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
- package/skills/minimax-docx/LICENSE +21 -0
- package/skills/minimax-docx/SKILL.md +273 -0
- package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/skills/minimax-docx/references/comments_guide.md +191 -0
- package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/skills/minimax-docx/references/design_principles.md +819 -0
- package/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/skills/minimax-docx/references/openxml_units.md +72 -0
- package/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/skills/minimax-docx/references/typography_guide.md +294 -0
- package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/skills/minimax-docx/scripts/setup.sh +504 -0
- package/skills/minimax-pdf/README.md +222 -0
- package/skills/minimax-pdf/SKILL.md +218 -0
- package/skills/minimax-pdf/design/design.md +381 -0
- package/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/skills/minimax-pdf/scripts/make.sh +491 -0
- package/skills/minimax-pdf/scripts/merge.py +112 -0
- package/skills/minimax-pdf/scripts/palette.py +521 -0
- package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/skills/minimax-pdf/scripts/render_body.py +1052 -0
- package/skills/minimax-pdf/scripts/render_cover.js +111 -0
- package/skills/minimax-xlsx/SKILL.md +156 -0
- package/skills/minimax-xlsx/references/create.md +691 -0
- package/skills/minimax-xlsx/references/edit.md +684 -0
- package/skills/minimax-xlsx/references/fix.md +37 -0
- package/skills/minimax-xlsx/references/format.md +768 -0
- package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/skills/minimax-xlsx/references/validate.md +772 -0
- package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/skills/newsletter-generation/SKILL.md +71 -0
- package/skills/oss-release-readiness/SKILL.md +47 -0
- package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
- package/skills/performance-optimization/SKILL.md +364 -0
- package/skills/planning-and-task-breakdown/SKILL.md +290 -0
- package/skills/pptx-generator/SKILL.md +275 -0
- package/skills/pptx-generator/references/design-system.md +392 -0
- package/skills/pptx-generator/references/editing.md +162 -0
- package/skills/pptx-generator/references/pitfalls.md +112 -0
- package/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/skills/pptx-generator/references/slide-types.md +413 -0
- package/skills/pr-test-analysis/SKILL.md +24 -0
- package/skills/react-native-dev/SKILL.md +180 -0
- package/skills/react-native-dev/references/animations.md +254 -0
- package/skills/react-native-dev/references/components.md +124 -0
- package/skills/react-native-dev/references/engineering.md +527 -0
- package/skills/react-native-dev/references/forms.md +300 -0
- package/skills/react-native-dev/references/native-capabilities.md +163 -0
- package/skills/react-native-dev/references/navigation.md +271 -0
- package/skills/react-native-dev/references/networking.md +346 -0
- package/skills/react-native-dev/references/performance.md +215 -0
- package/skills/react-native-dev/references/state-management.md +230 -0
- package/skills/react-native-dev/references/styling.md +117 -0
- package/skills/react-native-dev/references/testing.md +341 -0
- package/skills/requirements-grilling/SKILL.md +447 -0
- package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
- package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
- package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
- package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
- package/skills/review-pipeline/SKILL.md +38 -0
- package/skills/rose-memory/SKILL.md +210 -0
- package/skills/rose-memory/references/README.md +48 -0
- package/skills/rose-memory/references/memory_cli.py +2384 -0
- package/skills/rose-memory/references/schema.sql +315 -0
- package/skills/security-and-hardening/SKILL.md +369 -0
- package/skills/session-handoff/SKILL.md +88 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
- package/skills/session-handoff/scripts/session_handoff.py +764 -0
- package/skills/shader-dev/SKILL.md +316 -0
- package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
- package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
- package/skills/shader-dev/reference/anti-aliasing.md +71 -0
- package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
- package/skills/shader-dev/reference/camera-effects.md +80 -0
- package/skills/shader-dev/reference/cellular-automata.md +635 -0
- package/skills/shader-dev/reference/color-palette.md +481 -0
- package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
- package/skills/shader-dev/reference/domain-repetition.md +436 -0
- package/skills/shader-dev/reference/domain-warping.md +419 -0
- package/skills/shader-dev/reference/fluid-simulation.md +425 -0
- package/skills/shader-dev/reference/fractal-rendering.md +525 -0
- package/skills/shader-dev/reference/lighting-model.md +639 -0
- package/skills/shader-dev/reference/matrix-transform.md +535 -0
- package/skills/shader-dev/reference/multipass-buffer.md +571 -0
- package/skills/shader-dev/reference/normal-estimation.md +418 -0
- package/skills/shader-dev/reference/particle-system.md +589 -0
- package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
- package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
- package/skills/shader-dev/reference/post-processing.md +375 -0
- package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
- package/skills/shader-dev/reference/procedural-noise.md +551 -0
- package/skills/shader-dev/reference/ray-marching.md +396 -0
- package/skills/shader-dev/reference/sdf-2d.md +724 -0
- package/skills/shader-dev/reference/sdf-3d.md +805 -0
- package/skills/shader-dev/reference/sdf-tricks.md +63 -0
- package/skills/shader-dev/reference/shadow-techniques.md +476 -0
- package/skills/shader-dev/reference/simulation-physics.md +644 -0
- package/skills/shader-dev/reference/sound-synthesis.md +578 -0
- package/skills/shader-dev/reference/terrain-rendering.md +839 -0
- package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
- package/skills/shader-dev/reference/texture-sampling.md +553 -0
- package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
- package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
- package/skills/shader-dev/reference/voxel-rendering.md +701 -0
- package/skills/shader-dev/reference/water-ocean.md +445 -0
- package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
- package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
- package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
- package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
- package/skills/shader-dev/techniques/camera-effects.md +115 -0
- package/skills/shader-dev/techniques/cellular-automata.md +531 -0
- package/skills/shader-dev/techniques/color-palette.md +380 -0
- package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
- package/skills/shader-dev/techniques/domain-repetition.md +333 -0
- package/skills/shader-dev/techniques/domain-warping.md +414 -0
- package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
- package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
- package/skills/shader-dev/techniques/lighting-model.md +527 -0
- package/skills/shader-dev/techniques/matrix-transform.md +455 -0
- package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
- package/skills/shader-dev/techniques/normal-estimation.md +318 -0
- package/skills/shader-dev/techniques/particle-system.md +1203 -0
- package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
- package/skills/shader-dev/techniques/post-processing.md +788 -0
- package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
- package/skills/shader-dev/techniques/procedural-noise.md +554 -0
- package/skills/shader-dev/techniques/ray-marching.md +467 -0
- package/skills/shader-dev/techniques/sdf-2d.md +631 -0
- package/skills/shader-dev/techniques/sdf-3d.md +589 -0
- package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
- package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
- package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
- package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
- package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
- package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
- package/skills/shader-dev/techniques/texture-sampling.md +382 -0
- package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
- package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
- package/skills/shader-dev/techniques/water-ocean.md +490 -0
- package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
- package/skills/shipping-and-launch/SKILL.md +334 -0
- package/skills/silent-failure-hunting/SKILL.md +24 -0
- package/skills/source-driven-development/SKILL.md +223 -0
- package/skills/spec-driven-development/SKILL.md +235 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
- package/skills/strategy-stress-test/SKILL.md +185 -0
- package/skills/systematic-literature-review/SKILL.md +77 -0
- package/skills/test-document-generator/SKILL.md +152 -0
- package/skills/test-document-generator/references/test-document-template.md +45 -0
- package/skills/test-driven-development/SKILL.md +399 -0
- package/skills/write-skills/GLOSSARY.md +113 -0
- package/skills/write-skills/SKILL.md +133 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
- package/src/runtime/child-guard.ts +70 -0
- package/src/runtime/conflicts.ts +25 -0
- package/src/runtime/contracts.ts +9 -0
- package/src/runtime/doctor.ts +134 -0
- package/src/runtime/global-resources.ts +152 -0
- package/src/runtime/index.ts +23 -0
- package/src/runtime/lifecycle.ts +19 -0
- package/src/runtime/native-integrations.ts +44 -0
- package/src/runtime/path-boundaries.ts +69 -0
- package/src/runtime/registry.ts +213 -0
- package/src/runtime/roles.ts +64 -0
- package/src/runtime/rose-context.ts +24 -0
- package/src/runtime/subagents.ts +426 -0
- package/templates/APPEND_SYSTEM.md +12 -0
- package/upstream/aili-workflows.lock.json +3226 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
# Testing
|
|
2
|
+
|
|
3
|
+
Detailed examples and patterns for each Android test layer. Read the section relevant to the layer you're working with.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Local Unit Tests (JUnit + Robolectric)](#1-local-unit-tests-junit--robolectric)
|
|
8
|
+
2. [Instrumentation Tests (Espresso)](#2-instrumentation-tests-espresso)
|
|
9
|
+
3. [UI Automator (Cross-App & System UI)](#3-ui-automator-cross-app--system-ui)
|
|
10
|
+
4. [Compose UI Testing](#4-compose-ui-testing)
|
|
11
|
+
5. [Gradle Managed Devices](#5-gradle-managed-devices)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Local Unit Tests (JUnit + Robolectric)
|
|
16
|
+
|
|
17
|
+
Local tests live in `src/test/` and run on the JVM — no emulator needed, so they're fast (milliseconds each). Use them for ViewModels, Repositories, mappers, validators, and any pure logic.
|
|
18
|
+
|
|
19
|
+
### Basic ViewModel Test
|
|
20
|
+
|
|
21
|
+
```kotlin
|
|
22
|
+
class CounterViewModelTest {
|
|
23
|
+
@get:Rule
|
|
24
|
+
val mainDispatcherRule = MainDispatcherRule() // see below
|
|
25
|
+
|
|
26
|
+
private lateinit var viewModel: CounterViewModel
|
|
27
|
+
|
|
28
|
+
@Before
|
|
29
|
+
fun setup() {
|
|
30
|
+
viewModel = CounterViewModel()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@Test
|
|
34
|
+
fun `increment updates count`() = runTest {
|
|
35
|
+
viewModel.increment()
|
|
36
|
+
assertEquals(1, viewModel.uiState.value.count)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Testing Coroutines (Critical)
|
|
42
|
+
|
|
43
|
+
The Main dispatcher doesn't exist on the JVM. Replace it with `TestDispatcher` or tests crash with `IllegalStateException`.
|
|
44
|
+
|
|
45
|
+
```kotlin
|
|
46
|
+
// Reusable rule — put in a shared test-util module
|
|
47
|
+
class MainDispatcherRule(
|
|
48
|
+
private val dispatcher: TestDispatcher = UnconfinedTestDispatcher()
|
|
49
|
+
) : TestWatcher() {
|
|
50
|
+
override fun starting(description: Description) {
|
|
51
|
+
Dispatchers.setMain(dispatcher)
|
|
52
|
+
}
|
|
53
|
+
override fun finished(description: Description) {
|
|
54
|
+
Dispatchers.resetMain()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```kotlin
|
|
60
|
+
// ❌ Wrong: No Main dispatcher replacement → crash
|
|
61
|
+
@Test
|
|
62
|
+
fun `load data`() = runTest {
|
|
63
|
+
val vm = MyViewModel(repo)
|
|
64
|
+
vm.load() // launches on Dispatchers.Main → IllegalStateException
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ✅ Correct: Use MainDispatcherRule
|
|
68
|
+
@get:Rule
|
|
69
|
+
val mainDispatcherRule = MainDispatcherRule()
|
|
70
|
+
|
|
71
|
+
@Test
|
|
72
|
+
fun `load data`() = runTest {
|
|
73
|
+
val vm = MyViewModel(repo)
|
|
74
|
+
vm.load()
|
|
75
|
+
assertEquals(UiState.Success, vm.uiState.value)
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Testing StateFlow with Turbine
|
|
80
|
+
|
|
81
|
+
```kotlin
|
|
82
|
+
@Test
|
|
83
|
+
fun `loading then success states`() = runTest {
|
|
84
|
+
val vm = MyViewModel(fakeRepo)
|
|
85
|
+
|
|
86
|
+
vm.uiState.test { // Turbine extension
|
|
87
|
+
assertEquals(UiState.Idle, awaitItem())
|
|
88
|
+
vm.load()
|
|
89
|
+
assertEquals(UiState.Loading, awaitItem())
|
|
90
|
+
assertEquals(UiState.Success(data), awaitItem())
|
|
91
|
+
cancelAndIgnoreRemainingEvents()
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Mocking with MockK
|
|
97
|
+
|
|
98
|
+
```kotlin
|
|
99
|
+
@Test
|
|
100
|
+
fun `repository calls api and caches`() = runTest {
|
|
101
|
+
val api = mockk<UserApi>()
|
|
102
|
+
coEvery { api.getUser("42") } returns User("42", "Alice")
|
|
103
|
+
|
|
104
|
+
val repo = UserRepository(api)
|
|
105
|
+
val user = repo.getUser("42")
|
|
106
|
+
|
|
107
|
+
assertEquals("Alice", user.name)
|
|
108
|
+
coVerify(exactly = 1) { api.getUser("42") }
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
| MockK Function | Purpose |
|
|
113
|
+
|----------------|------------------------|
|
|
114
|
+
| `mockk<T>()` | Create mock instance |
|
|
115
|
+
| `every { }` | Stub synchronous calls |
|
|
116
|
+
| `coEvery { }` | Stub suspend functions |
|
|
117
|
+
| `verify { }` | Verify call happened |
|
|
118
|
+
| `coVerify { }` | Verify suspend call |
|
|
119
|
+
| `slot<T>()` | Capture argument value |
|
|
120
|
+
|
|
121
|
+
### Robolectric — When You Need Android Classes
|
|
122
|
+
|
|
123
|
+
Robolectric simulates the Android framework on the JVM, so tests stay fast while accessing `Context`, `SharedPreferences`, resources, etc.
|
|
124
|
+
|
|
125
|
+
```kotlin
|
|
126
|
+
@RunWith(RobolectricTestRunner::class)
|
|
127
|
+
@Config(sdk = [34])
|
|
128
|
+
class PreferencesManagerTest {
|
|
129
|
+
|
|
130
|
+
private lateinit var context: Context
|
|
131
|
+
|
|
132
|
+
@Before
|
|
133
|
+
fun setup() {
|
|
134
|
+
context = ApplicationProvider.getApplicationContext()
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@Test
|
|
138
|
+
fun `saves and reads theme preference`() {
|
|
139
|
+
val prefs = PreferencesManager(context)
|
|
140
|
+
prefs.setDarkMode(true)
|
|
141
|
+
assertTrue(prefs.isDarkMode())
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Common Local Test Mistakes
|
|
147
|
+
|
|
148
|
+
```kotlin
|
|
149
|
+
// ❌ Wrong: Testing implementation details (fragile)
|
|
150
|
+
@Test
|
|
151
|
+
fun `check internal cache map size`() {
|
|
152
|
+
repo.load()
|
|
153
|
+
assertEquals(1, repo.cacheMap.size) // breaks if cache strategy changes
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ✅ Correct: Test observable behavior
|
|
157
|
+
@Test
|
|
158
|
+
fun `second call returns cached result without network`() = runTest {
|
|
159
|
+
coEvery { api.fetch() } returns data
|
|
160
|
+
|
|
161
|
+
repo.load()
|
|
162
|
+
repo.load()
|
|
163
|
+
|
|
164
|
+
coVerify(exactly = 1) { api.fetch() } // only one network call
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 2. Instrumentation Tests (Espresso)
|
|
171
|
+
|
|
172
|
+
Instrumentation tests live in `src/androidTest/` and run on a real device or emulator. Slower than local tests, but they exercise the actual Android stack — use them for UI flows, database integration, and cross-component interaction.
|
|
173
|
+
|
|
174
|
+
### Test Runner Setup
|
|
175
|
+
|
|
176
|
+
In `app/build.gradle.kts`:
|
|
177
|
+
|
|
178
|
+
```kotlin
|
|
179
|
+
android {
|
|
180
|
+
defaultConfig {
|
|
181
|
+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Espresso Basics
|
|
187
|
+
|
|
188
|
+
Espresso's API follows a consistent pattern: **find → act → assert**.
|
|
189
|
+
|
|
190
|
+
```kotlin
|
|
191
|
+
@RunWith(AndroidJUnit4::class)
|
|
192
|
+
class LoginScreenTest {
|
|
193
|
+
|
|
194
|
+
@get:Rule
|
|
195
|
+
val activityRule = ActivityScenarioRule(LoginActivity::class.java)
|
|
196
|
+
|
|
197
|
+
@Test
|
|
198
|
+
fun validLogin_navigatesToHome() {
|
|
199
|
+
// Find and act
|
|
200
|
+
onView(withId(R.id.email_input))
|
|
201
|
+
.perform(typeText("user@example.com"), closeSoftKeyboard())
|
|
202
|
+
onView(withId(R.id.password_input))
|
|
203
|
+
.perform(typeText("secret123"), closeSoftKeyboard())
|
|
204
|
+
onView(withId(R.id.login_button))
|
|
205
|
+
.perform(click())
|
|
206
|
+
|
|
207
|
+
// Assert
|
|
208
|
+
onView(withId(R.id.home_container))
|
|
209
|
+
.check(matches(isDisplayed()))
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
| Category | Common Matchers / Actions |
|
|
215
|
+
|------------|------------------------------------------------------------------------------------|
|
|
216
|
+
| **Find** | `withId(R.id.x)`, `withText("x")`, `withContentDescription("x")`, `withHint("x")` |
|
|
217
|
+
| **Act** | `click()`, `typeText("x")`, `clearText()`, `scrollTo()`, `swipeUp()` |
|
|
218
|
+
| **Assert** | `isDisplayed()`, `withText("x")`, `isEnabled()`, `isChecked()`, `doesNotExist()` |
|
|
219
|
+
|
|
220
|
+
### Testing Intents
|
|
221
|
+
|
|
222
|
+
Espresso-Intents lets you verify outgoing Intents and stub responses (e.g., camera, file picker).
|
|
223
|
+
|
|
224
|
+
```kotlin
|
|
225
|
+
@get:Rule
|
|
226
|
+
val intentsRule = IntentsRule()
|
|
227
|
+
|
|
228
|
+
@Test
|
|
229
|
+
fun shareButton_launchesShareIntent() {
|
|
230
|
+
onView(withId(R.id.share_button)).perform(click())
|
|
231
|
+
|
|
232
|
+
intended(allOf(
|
|
233
|
+
hasAction(Intent.ACTION_SEND),
|
|
234
|
+
hasType("text/plain")
|
|
235
|
+
))
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
@Test
|
|
239
|
+
fun cameraButton_handlesResult() {
|
|
240
|
+
val resultData = Intent().apply { putExtra("photo_uri", "content://mock") }
|
|
241
|
+
intending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE))
|
|
242
|
+
.respondWith(Instrumentation.ActivityResult(RESULT_OK, resultData))
|
|
243
|
+
|
|
244
|
+
onView(withId(R.id.camera_button)).perform(click())
|
|
245
|
+
onView(withId(R.id.photo_preview)).check(matches(isDisplayed()))
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### IdlingResource for Async Operations
|
|
250
|
+
|
|
251
|
+
Espresso waits for the UI thread and AsyncTask by default, but not for custom async work (Retrofit, coroutines, etc.). `IdlingResource` tells Espresso when your app is busy.
|
|
252
|
+
|
|
253
|
+
```kotlin
|
|
254
|
+
// In production code (thin wrapper)
|
|
255
|
+
object NetworkIdlingResource {
|
|
256
|
+
private val counter = CountingIdlingResource("Network")
|
|
257
|
+
fun increment() = counter.increment()
|
|
258
|
+
fun decrement() = counter.decrement()
|
|
259
|
+
fun get(): IdlingResource = counter
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// In test setup
|
|
263
|
+
@Before
|
|
264
|
+
fun registerIdling() {
|
|
265
|
+
IdlingRegistry.getInstance().register(NetworkIdlingResource.get())
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@After
|
|
269
|
+
fun unregisterIdling() {
|
|
270
|
+
IdlingRegistry.getInstance().unregister(NetworkIdlingResource.get())
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 3. UI Automator (Cross-App & System UI)
|
|
277
|
+
|
|
278
|
+
UI Automator can interact with any visible UI — system dialogs, notifications, other apps. Use it when Espresso can't reach outside your app's process.
|
|
279
|
+
|
|
280
|
+
| Use Case | Why UI Automator |
|
|
281
|
+
|------------------------------|----------------------------------------|
|
|
282
|
+
| Runtime permission dialogs | System UI, outside app process |
|
|
283
|
+
| Notification actions | System notification shade |
|
|
284
|
+
| Device settings interaction | Settings app |
|
|
285
|
+
| Multi-app workflows | e.g., share to another app and return |
|
|
286
|
+
|
|
287
|
+
```kotlin
|
|
288
|
+
@RunWith(AndroidJUnit4::class)
|
|
289
|
+
class PermissionFlowTest {
|
|
290
|
+
|
|
291
|
+
private lateinit var device: UiDevice
|
|
292
|
+
|
|
293
|
+
@Before
|
|
294
|
+
fun setup() {
|
|
295
|
+
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
@Test
|
|
299
|
+
fun grantsCameraPermission_andOpensCamera() {
|
|
300
|
+
// Trigger permission request from within your app
|
|
301
|
+
onView(withId(R.id.camera_button)).perform(click())
|
|
302
|
+
|
|
303
|
+
// Handle the system permission dialog via UI Automator
|
|
304
|
+
val allowButton = device.findObject(
|
|
305
|
+
By.res("com.android.permissioncontroller:id/permission_allow_foreground_only_button")
|
|
306
|
+
)
|
|
307
|
+
allowButton?.click()
|
|
308
|
+
|
|
309
|
+
// Back in Espresso territory — verify the camera view appeared
|
|
310
|
+
onView(withId(R.id.camera_preview)).check(matches(isDisplayed()))
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
@Test
|
|
314
|
+
fun notificationTap_opensDetail() {
|
|
315
|
+
// Open notification shade
|
|
316
|
+
device.openNotification()
|
|
317
|
+
device.wait(Until.hasObject(By.textStartsWith("New message")), 5000)
|
|
318
|
+
|
|
319
|
+
// Tap the notification
|
|
320
|
+
val notification = device.findObject(By.textStartsWith("New message"))
|
|
321
|
+
notification.click()
|
|
322
|
+
|
|
323
|
+
// Verify deep-link target
|
|
324
|
+
onView(withId(R.id.message_detail)).check(matches(isDisplayed()))
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 4. Compose UI Testing
|
|
332
|
+
|
|
333
|
+
Compose has its own testing framework that works with the semantic tree rather than the view hierarchy. Tests can run as local tests (with Robolectric) or instrumentation tests — the API is the same.
|
|
334
|
+
|
|
335
|
+
### Basic Setup
|
|
336
|
+
|
|
337
|
+
```kotlin
|
|
338
|
+
@RunWith(AndroidJUnit4::class)
|
|
339
|
+
class GreetingScreenTest {
|
|
340
|
+
|
|
341
|
+
@get:Rule
|
|
342
|
+
val composeTestRule = createComposeRule()
|
|
343
|
+
|
|
344
|
+
@Test
|
|
345
|
+
fun displaysGreeting_andRespondsToClick() {
|
|
346
|
+
composeTestRule.setContent {
|
|
347
|
+
MyAppTheme {
|
|
348
|
+
GreetingScreen(name = "World")
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
composeTestRule.onNodeWithText("Hello, World!")
|
|
353
|
+
.assertIsDisplayed()
|
|
354
|
+
|
|
355
|
+
composeTestRule.onNodeWithText("Say Hi")
|
|
356
|
+
.performClick()
|
|
357
|
+
|
|
358
|
+
composeTestRule.onNodeWithText("Hi back!")
|
|
359
|
+
.assertIsDisplayed()
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Finders, Assertions & Actions
|
|
365
|
+
|
|
366
|
+
| Category | API | Example |
|
|
367
|
+
|------------|----------------------------------------------|---------------------------------|
|
|
368
|
+
| **Find** | `onNodeWithText("x")` | Matches visible text |
|
|
369
|
+
| | `onNodeWithTag("x")` | Matches `Modifier.testTag("x")` |
|
|
370
|
+
| | `onNodeWithContentDescription("x")` | Matches semantics label |
|
|
371
|
+
| | `onAllNodesWithTag("x")` | Returns list of matches |
|
|
372
|
+
| **Assert** | `assertIsDisplayed()` | Node is visible |
|
|
373
|
+
| | `assertTextEquals("x")` | Exact text match |
|
|
374
|
+
| | `assertIsEnabled()` / `assertIsNotEnabled()` | Enabled state |
|
|
375
|
+
| | `assertDoesNotExist()` | Node not in tree |
|
|
376
|
+
| | `assertCountEquals(n)` | For `onAllNodes` |
|
|
377
|
+
| **Act** | `performClick()` | Tap |
|
|
378
|
+
| | `performTextInput("x")` | Type into text field |
|
|
379
|
+
| | `performScrollTo()` | Scroll node into view |
|
|
380
|
+
| | `performTouchInput { swipeUp() }` | Gestures |
|
|
381
|
+
|
|
382
|
+
### Using testTag for Reliable Selectors
|
|
383
|
+
|
|
384
|
+
Text-based finders break with localization or copy changes. Use `testTag` for stable selectors:
|
|
385
|
+
|
|
386
|
+
```kotlin
|
|
387
|
+
// ❌ Fragile: breaks if text changes or app is localized
|
|
388
|
+
composeTestRule.onNodeWithText("Submit Order").performClick()
|
|
389
|
+
|
|
390
|
+
// ✅ Stable: testTag doesn't change with locale
|
|
391
|
+
composeTestRule.onNodeWithTag("submit_order_button").performClick()
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
```kotlin
|
|
395
|
+
// In production Composable
|
|
396
|
+
Button(
|
|
397
|
+
onClick = { /* ... */ },
|
|
398
|
+
modifier = Modifier.testTag("submit_order_button")
|
|
399
|
+
) {
|
|
400
|
+
Text(stringResource(R.string.submit_order))
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Testing with Activity Context
|
|
405
|
+
|
|
406
|
+
When your Composable needs a `ComponentActivity` (e.g., for `viewModel()` or navigation), use `createAndroidComposeRule`:
|
|
407
|
+
|
|
408
|
+
```kotlin
|
|
409
|
+
@get:Rule
|
|
410
|
+
val composeTestRule = createAndroidComposeRule<MainActivity>()
|
|
411
|
+
|
|
412
|
+
@Test
|
|
413
|
+
fun fullScreen_endToEnd() {
|
|
414
|
+
// Activity is already launched — interact with the real content
|
|
415
|
+
composeTestRule.onNodeWithTag("login_email")
|
|
416
|
+
.performTextInput("user@test.com")
|
|
417
|
+
composeTestRule.onNodeWithTag("login_password")
|
|
418
|
+
.performTextInput("pass123")
|
|
419
|
+
composeTestRule.onNodeWithTag("login_submit")
|
|
420
|
+
.performClick()
|
|
421
|
+
|
|
422
|
+
composeTestRule.waitUntil(timeoutMillis = 5000) {
|
|
423
|
+
composeTestRule.onAllNodesWithTag("home_screen")
|
|
424
|
+
.fetchSemanticsNodes().isNotEmpty()
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
composeTestRule.onNodeWithTag("home_screen")
|
|
428
|
+
.assertIsDisplayed()
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Testing Navigation
|
|
433
|
+
|
|
434
|
+
```kotlin
|
|
435
|
+
@Test
|
|
436
|
+
fun navigatesToDetail_onItemClick() {
|
|
437
|
+
val navController = TestNavHostController(ApplicationProvider.getApplicationContext())
|
|
438
|
+
|
|
439
|
+
composeTestRule.setContent {
|
|
440
|
+
navController.navigatorProvider.addNavigator(ComposeNavigator())
|
|
441
|
+
MyAppNavHost(navController = navController)
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// Click item on list screen
|
|
445
|
+
composeTestRule.onNodeWithTag("item_0").performClick()
|
|
446
|
+
|
|
447
|
+
// Verify navigation destination
|
|
448
|
+
assertEquals("detail/0", navController.currentBackStackEntry?.destination?.route)
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Common Compose Test Mistakes
|
|
453
|
+
|
|
454
|
+
```kotlin
|
|
455
|
+
// ❌ Wrong: Asserting immediately after async operation
|
|
456
|
+
composeTestRule.onNodeWithTag("submit").performClick()
|
|
457
|
+
composeTestRule.onNodeWithText("Success").assertIsDisplayed() // may fail — UI hasn't updated yet
|
|
458
|
+
|
|
459
|
+
// ✅ Correct: Wait for the UI to settle
|
|
460
|
+
composeTestRule.onNodeWithTag("submit").performClick()
|
|
461
|
+
composeTestRule.waitForIdle()
|
|
462
|
+
composeTestRule.onNodeWithText("Success").assertIsDisplayed()
|
|
463
|
+
|
|
464
|
+
// ✅ Also correct: waitUntil for longer async work
|
|
465
|
+
composeTestRule.onNodeWithTag("submit").performClick()
|
|
466
|
+
composeTestRule.waitUntil(timeoutMillis = 3000) {
|
|
467
|
+
composeTestRule.onAllNodesWithText("Success")
|
|
468
|
+
.fetchSemanticsNodes().isNotEmpty()
|
|
469
|
+
}
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## 5. Gradle Managed Devices
|
|
475
|
+
|
|
476
|
+
Define emulator profiles in `build.gradle.kts` so anyone (including CI) can run instrumentation tests without manually creating AVDs. Gradle downloads the system image, creates the emulator, runs tests, and tears it down automatically.
|
|
477
|
+
|
|
478
|
+
### Device Configuration
|
|
479
|
+
|
|
480
|
+
In `app/build.gradle.kts`:
|
|
481
|
+
|
|
482
|
+
```kotlin
|
|
483
|
+
android {
|
|
484
|
+
testOptions {
|
|
485
|
+
managedDevices {
|
|
486
|
+
localDevices {
|
|
487
|
+
create("pixel6Api34") {
|
|
488
|
+
device = "Pixel 6"
|
|
489
|
+
apiLevel = 34
|
|
490
|
+
systemImageSource = "aosp-atd" // ATD = faster, headless
|
|
491
|
+
}
|
|
492
|
+
create("pixel4Api30") {
|
|
493
|
+
device = "Pixel 4"
|
|
494
|
+
apiLevel = 30
|
|
495
|
+
systemImageSource = "aosp-atd"
|
|
496
|
+
}
|
|
497
|
+
create("smallTabletApi34") {
|
|
498
|
+
device = "Nexus 7"
|
|
499
|
+
apiLevel = 34
|
|
500
|
+
systemImageSource = "google" // full Google APIs image
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// Group devices for matrix testing
|
|
505
|
+
groups {
|
|
506
|
+
create("phoneTests") {
|
|
507
|
+
targetDevices.add(devices["pixel6Api34"])
|
|
508
|
+
targetDevices.add(devices["pixel4Api30"])
|
|
509
|
+
}
|
|
510
|
+
create("allDevices") {
|
|
511
|
+
targetDevices.add(devices["pixel6Api34"])
|
|
512
|
+
targetDevices.add(devices["pixel4Api30"])
|
|
513
|
+
targetDevices.add(devices["smallTabletApi34"])
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### System Image Sources
|
|
522
|
+
|
|
523
|
+
| Source | Description | Best For |
|
|
524
|
+
|----------------|---------------------------------------------------|------------------------------|
|
|
525
|
+
| `"aosp-atd"` | Automated Test Device — minimal, no Play Services | Fast CI, pure logic tests |
|
|
526
|
+
| `"google-atd"` | ATD with Google APIs | Tests needing Maps, Firebase |
|
|
527
|
+
| `"aosp"` | Full AOSP image | Standard emulator testing |
|
|
528
|
+
| `"google"` | Full image with Google Play Services | Play Services integration |
|
|
529
|
+
|
|
530
|
+
ATD images boot faster and consume less memory because they strip out UI chrome and preinstalled apps irrelevant to testing. Prefer `aosp-atd` or `google-atd` for CI pipelines.
|
|
531
|
+
|
|
532
|
+
### Running Tests
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
# Run on a single managed device
|
|
536
|
+
./gradlew pixel6Api34DebugAndroidTest
|
|
537
|
+
|
|
538
|
+
# Run on a device group (all devices in parallel if hardware allows)
|
|
539
|
+
./gradlew phoneTestsGroupDebugAndroidTest
|
|
540
|
+
./gradlew allDevicesGroupDebugAndroidTest
|
|
541
|
+
|
|
542
|
+
# With specific flavor
|
|
543
|
+
./gradlew pixel6Api34DevDebugAndroidTest
|
|
544
|
+
|
|
545
|
+
# Enable test sharding across devices (speeds up large suites)
|
|
546
|
+
./gradlew allDevicesGroupDebugAndroidTest \
|
|
547
|
+
-Pandroid.experimental.androidTest.numManagedDeviceShards=2
|
|
548
|
+
|
|
549
|
+
# Generate HTML test report
|
|
550
|
+
./gradlew pixel6Api34DebugAndroidTest \
|
|
551
|
+
--continue # don't stop on first failure
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
Test results are written to `app/build/reports/androidTests/managedDevice/`.
|