@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,757 @@
|
|
|
1
|
+
# Swift Coding Standards
|
|
2
|
+
|
|
3
|
+
Best practices for writing clean, safe, and idiomatic Swift code following Apple's guidelines and modern Swift conventions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Optionals and Safety
|
|
8
|
+
|
|
9
|
+
**Impact:** CRITICAL
|
|
10
|
+
|
|
11
|
+
Swift's optional system eliminates null pointer exceptions through compile-time safety.
|
|
12
|
+
|
|
13
|
+
### 1.1 Safe Unwrapping with if let
|
|
14
|
+
|
|
15
|
+
```swift
|
|
16
|
+
if let name = optionalName {
|
|
17
|
+
print("Hello, \(name)")
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Multiple bindings
|
|
21
|
+
if let name = userName, let age = userAge, age >= 18 {
|
|
22
|
+
print("\(name) is an adult")
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 1.2 Guard for Early Exit
|
|
27
|
+
|
|
28
|
+
Use `guard` to exit early when preconditions aren't met:
|
|
29
|
+
|
|
30
|
+
```swift
|
|
31
|
+
func processUser(_ user: User?) {
|
|
32
|
+
guard let user = user else { return }
|
|
33
|
+
guard !user.name.isEmpty else { return }
|
|
34
|
+
print(user.name)
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 1.3 Nil Coalescing for Defaults
|
|
39
|
+
|
|
40
|
+
```swift
|
|
41
|
+
let displayName = name ?? "Anonymous"
|
|
42
|
+
let count = items?.count ?? 0
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 1.4 Optional Chaining
|
|
46
|
+
|
|
47
|
+
```swift
|
|
48
|
+
let count = user?.profile?.posts?.count
|
|
49
|
+
let uppercased = optionalString?.uppercased()
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 1.5 Optional map/flatMap
|
|
53
|
+
|
|
54
|
+
```swift
|
|
55
|
+
let uppercasedName = userName.map { $0.uppercased() }
|
|
56
|
+
let userID = userIDString.flatMap { Int($0) }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 1.6 Never Force Unwrap
|
|
60
|
+
|
|
61
|
+
Avoid `!` force unwrapping. Use safe alternatives:
|
|
62
|
+
|
|
63
|
+
| Instead of | Use |
|
|
64
|
+
|------------|-----|
|
|
65
|
+
| `value!` | `if let value = value { }` |
|
|
66
|
+
| `array[0]` (unsafe) | `array.first` |
|
|
67
|
+
| `dictionary["key"]!` | `dictionary["key", default: defaultValue]` |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 2. Naming Conventions
|
|
72
|
+
|
|
73
|
+
**Impact:** HIGH
|
|
74
|
+
|
|
75
|
+
### 2.1 Types: PascalCase
|
|
76
|
+
|
|
77
|
+
```swift
|
|
78
|
+
class UserProfileViewController { }
|
|
79
|
+
struct NetworkRequest { }
|
|
80
|
+
protocol DataSource { }
|
|
81
|
+
enum LoadingState { }
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 2.2 Variables and Functions: camelCase
|
|
85
|
+
|
|
86
|
+
```swift
|
|
87
|
+
var userName: String
|
|
88
|
+
let maximumRetryCount = 3
|
|
89
|
+
func fetchUserProfile() { }
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 2.3 Boolean Naming
|
|
93
|
+
|
|
94
|
+
Use `is`, `has`, `should`, `can` prefixes:
|
|
95
|
+
|
|
96
|
+
```swift
|
|
97
|
+
var isLoading: Bool
|
|
98
|
+
var hasCompletedOnboarding: Bool
|
|
99
|
+
var shouldShowAlert: Bool
|
|
100
|
+
var canEditProfile: Bool
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 2.4 Function Naming
|
|
104
|
+
|
|
105
|
+
Use verb phrases, read like natural English:
|
|
106
|
+
|
|
107
|
+
```swift
|
|
108
|
+
// Good - clear actions
|
|
109
|
+
func fetchUsers() async throws -> [User]
|
|
110
|
+
func remove(_ item: Item, at index: Int)
|
|
111
|
+
func makeIterator() -> Iterator
|
|
112
|
+
|
|
113
|
+
// Avoid - unclear or redundant
|
|
114
|
+
func getUsersData() // "get" is redundant
|
|
115
|
+
func doRemove() // vague
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 2.5 Parameter Labels
|
|
119
|
+
|
|
120
|
+
First parameter label can be omitted when obvious:
|
|
121
|
+
|
|
122
|
+
```swift
|
|
123
|
+
func insert(_ element: Element, at index: Int)
|
|
124
|
+
func move(from source: Int, to destination: Int)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 3. Protocol-Oriented Design
|
|
130
|
+
|
|
131
|
+
**Impact:** HIGH
|
|
132
|
+
|
|
133
|
+
Swift favors composition over inheritance through protocols.
|
|
134
|
+
|
|
135
|
+
### 3.1 Define Capabilities Through Protocols
|
|
136
|
+
|
|
137
|
+
```swift
|
|
138
|
+
protocol DataStore {
|
|
139
|
+
func save<T: Codable>(_ item: T, key: String) throws
|
|
140
|
+
func load<T: Codable>(key: String) throws -> T?
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
protocol Drawable {
|
|
144
|
+
var color: Color { get set }
|
|
145
|
+
func draw()
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 3.2 Protocol Extensions for Default Behavior
|
|
150
|
+
|
|
151
|
+
```swift
|
|
152
|
+
extension Drawable {
|
|
153
|
+
func draw() {
|
|
154
|
+
print("Drawing with \(color)")
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
extension Collection {
|
|
159
|
+
func chunked(into size: Int) -> [[Element]] {
|
|
160
|
+
guard size > 0 else { return [] }
|
|
161
|
+
|
|
162
|
+
var result: [[Element]] = []
|
|
163
|
+
var i = startIndex
|
|
164
|
+
|
|
165
|
+
while i != endIndex {
|
|
166
|
+
let j = index(i, offsetBy: size, limitedBy: endIndex) ?? endIndex
|
|
167
|
+
result.append(Array(self[i..<j]))
|
|
168
|
+
i = j
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return result
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 3.3 Associated Types for Flexibility
|
|
177
|
+
|
|
178
|
+
```swift
|
|
179
|
+
protocol Repository {
|
|
180
|
+
associatedtype Item
|
|
181
|
+
func fetchAll() async throws -> [Item]
|
|
182
|
+
func save(_ item: Item) async throws
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
class UserRepository: Repository {
|
|
186
|
+
typealias Item = User
|
|
187
|
+
|
|
188
|
+
func fetchAll() async throws -> [User] { /* ... */ }
|
|
189
|
+
func save(_ item: User) async throws { /* ... */ }
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 3.4 Protocol Composition
|
|
194
|
+
|
|
195
|
+
```swift
|
|
196
|
+
protocol Named { var name: String { get } }
|
|
197
|
+
protocol Aged { var age: Int { get } }
|
|
198
|
+
|
|
199
|
+
func greet(_ person: Named & Aged) {
|
|
200
|
+
print("Hello, \(person.name), age \(person.age)")
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 4. Value Types vs Reference Types
|
|
207
|
+
|
|
208
|
+
**Impact:** HIGH
|
|
209
|
+
|
|
210
|
+
### 4.1 Prefer Structs (Value Types)
|
|
211
|
+
|
|
212
|
+
Use structs for simple data models, independent copies:
|
|
213
|
+
|
|
214
|
+
```swift
|
|
215
|
+
struct User {
|
|
216
|
+
var name: String
|
|
217
|
+
var email: String
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
struct Point {
|
|
221
|
+
var x: Double
|
|
222
|
+
var y: Double
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 4.2 Use Classes When Needed
|
|
227
|
+
|
|
228
|
+
Use classes when identity, shared ownership, or reference semantics matter.
|
|
229
|
+
Prefer actors for mutable state shared across concurrent tasks:
|
|
230
|
+
|
|
231
|
+
```swift
|
|
232
|
+
class NetworkManager {
|
|
233
|
+
static let shared = NetworkManager()
|
|
234
|
+
private init() { }
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
class FileHandle {
|
|
238
|
+
// Wrapping system resource
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 4.3 Enums for Finite States
|
|
243
|
+
|
|
244
|
+
```swift
|
|
245
|
+
enum LoadingState {
|
|
246
|
+
case idle
|
|
247
|
+
case loading
|
|
248
|
+
case success(Data)
|
|
249
|
+
case failure(Error)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
enum Result<Success, Failure: Error> {
|
|
253
|
+
case success(Success)
|
|
254
|
+
case failure(Failure)
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
| Type | Use When |
|
|
259
|
+
|------|----------|
|
|
260
|
+
| `struct` | Data models, coordinates, independent values |
|
|
261
|
+
| `class` | Shared state, identity matters, inheritance needed |
|
|
262
|
+
| `enum` | Finite set of options, state machines |
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 5. Memory Management with ARC
|
|
267
|
+
|
|
268
|
+
**Impact:** CRITICAL
|
|
269
|
+
|
|
270
|
+
### 5.1 Breaking Retain Cycles with weak
|
|
271
|
+
|
|
272
|
+
```swift
|
|
273
|
+
class Apartment {
|
|
274
|
+
weak var tenant: Person?
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
class Person {
|
|
278
|
+
var apartment: Apartment?
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### 5.2 Closure Capture Lists
|
|
283
|
+
|
|
284
|
+
Use capture lists intentionally to avoid retain cycles.
|
|
285
|
+
Choose `weak` or `unowned` based on lifetime guarantees:
|
|
286
|
+
|
|
287
|
+
```swift
|
|
288
|
+
// Weak capture for optional self
|
|
289
|
+
onComplete = { [weak self] in
|
|
290
|
+
self?.processResult()
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Capture specific values
|
|
294
|
+
let id = user.id
|
|
295
|
+
fetchData { [id] result in
|
|
296
|
+
print("Fetched for \(id)")
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 5.3 unowned for Guaranteed Lifetime
|
|
301
|
+
|
|
302
|
+
Use when reference should never be nil during object lifetime:
|
|
303
|
+
|
|
304
|
+
```swift
|
|
305
|
+
class CreditCard {
|
|
306
|
+
unowned let customer: Customer
|
|
307
|
+
|
|
308
|
+
init(customer: Customer) {
|
|
309
|
+
self.customer = customer
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
| Keyword | Use When |
|
|
315
|
+
|---------|----------|
|
|
316
|
+
| `weak` | Reference may become nil |
|
|
317
|
+
| `unowned` | Reference guaranteed to outlive |
|
|
318
|
+
| None | Strong ownership needed |
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## 6. Error Handling
|
|
323
|
+
|
|
324
|
+
**Impact:** HIGH
|
|
325
|
+
|
|
326
|
+
### 6.1 Define Typed Errors
|
|
327
|
+
|
|
328
|
+
```swift
|
|
329
|
+
enum NetworkError: Error {
|
|
330
|
+
case invalidURL
|
|
331
|
+
case noConnection
|
|
332
|
+
case serverError(statusCode: Int)
|
|
333
|
+
case decodingFailed(underlying: Error)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
enum ValidationError: LocalizedError {
|
|
337
|
+
case emptyField(name: String)
|
|
338
|
+
case invalidFormat(field: String, expected: String)
|
|
339
|
+
|
|
340
|
+
var errorDescription: String? {
|
|
341
|
+
switch self {
|
|
342
|
+
case .emptyField(let name):
|
|
343
|
+
return "\(name) cannot be empty"
|
|
344
|
+
case .invalidFormat(let field, let expected):
|
|
345
|
+
return "\(field) must be \(expected)"
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### 6.2 Throwing Functions
|
|
352
|
+
|
|
353
|
+
```swift
|
|
354
|
+
func fetchUser(id: Int) throws -> User {
|
|
355
|
+
guard let url = URL(string: "https://api.example.com/users/\(id)") else {
|
|
356
|
+
throw NetworkError.invalidURL
|
|
357
|
+
}
|
|
358
|
+
// ... implementation
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### 6.3 Do-Catch Handling
|
|
363
|
+
|
|
364
|
+
```swift
|
|
365
|
+
do {
|
|
366
|
+
let user = try fetchUser(id: 123)
|
|
367
|
+
print(user.name)
|
|
368
|
+
} catch NetworkError.serverError(let code) {
|
|
369
|
+
print("Server error: \(code)")
|
|
370
|
+
} catch NetworkError.noConnection {
|
|
371
|
+
print("Check your internet connection")
|
|
372
|
+
} catch {
|
|
373
|
+
print("Unknown error: \(error)")
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### 6.4 try? and try!
|
|
378
|
+
|
|
379
|
+
```swift
|
|
380
|
+
// try? returns optional (nil on error)
|
|
381
|
+
let user = try? fetchUser(id: 123)
|
|
382
|
+
|
|
383
|
+
// try! crashes on error - use only when failure is programmer error
|
|
384
|
+
let config = try! loadBundledConfig()
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### 6.5 Rethrows
|
|
388
|
+
|
|
389
|
+
```swift
|
|
390
|
+
func perform<T>(_ operation: () throws -> T) rethrows -> T {
|
|
391
|
+
return try operation()
|
|
392
|
+
}
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## 7. Modern Concurrency (async/await)
|
|
398
|
+
|
|
399
|
+
**Impact:** CRITICAL
|
|
400
|
+
|
|
401
|
+
Use actor isolation and `Sendable` to prevent data races across concurrency domains.
|
|
402
|
+
|
|
403
|
+
### 7.1 Async Functions
|
|
404
|
+
|
|
405
|
+
```swift
|
|
406
|
+
func fetchUser(id: Int) async throws -> User {
|
|
407
|
+
guard let url = URL(string: "https://api.example.com/users/\(id)") else {
|
|
408
|
+
throw NetworkError.invalidURL
|
|
409
|
+
}
|
|
410
|
+
let (data, _) = try await URLSession.shared.data(from: url)
|
|
411
|
+
return try JSONDecoder().decode(User.self, from: data)
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Calling async functions
|
|
415
|
+
Task {
|
|
416
|
+
do {
|
|
417
|
+
let user = try await fetchUser(id: 123)
|
|
418
|
+
print(user.name)
|
|
419
|
+
} catch {
|
|
420
|
+
print("Failed: \(error)")
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### 7.2 Parallel Execution with TaskGroup
|
|
426
|
+
|
|
427
|
+
```swift
|
|
428
|
+
func fetchAllUsers(ids: [Int]) async throws -> [User] {
|
|
429
|
+
try await withThrowingTaskGroup(of: User.self) { group in
|
|
430
|
+
for id in ids {
|
|
431
|
+
group.addTask {
|
|
432
|
+
try await fetchUser(id: id)
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return try await group.reduce(into: []) { $0.append($1) }
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 7.3 async let for Concurrent Bindings
|
|
441
|
+
|
|
442
|
+
```swift
|
|
443
|
+
async let user = fetchUser(id: 1)
|
|
444
|
+
async let posts = fetchPosts(userId: 1)
|
|
445
|
+
async let followers = fetchFollowers(userId: 1)
|
|
446
|
+
|
|
447
|
+
let profile = try await ProfileData(
|
|
448
|
+
user: user,
|
|
449
|
+
posts: posts,
|
|
450
|
+
followers: followers
|
|
451
|
+
)
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### 7.4 Actors for Thread-Safe State
|
|
455
|
+
|
|
456
|
+
```swift
|
|
457
|
+
actor BankAccount {
|
|
458
|
+
private var balance: Double = 0
|
|
459
|
+
|
|
460
|
+
func deposit(_ amount: Double) {
|
|
461
|
+
balance += amount
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
func withdraw(_ amount: Double) throws {
|
|
465
|
+
guard balance >= amount else {
|
|
466
|
+
throw BankError.insufficientFunds
|
|
467
|
+
}
|
|
468
|
+
balance -= amount
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
func getBalance() -> Double {
|
|
472
|
+
balance
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Usage
|
|
477
|
+
let account = BankAccount()
|
|
478
|
+
await account.deposit(100)
|
|
479
|
+
let balance = await account.getBalance()
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### 7.5 MainActor for UI Updates
|
|
483
|
+
|
|
484
|
+
```swift
|
|
485
|
+
@MainActor
|
|
486
|
+
class ViewModel: ObservableObject {
|
|
487
|
+
@Published var isLoading = false
|
|
488
|
+
@Published var users: [User] = []
|
|
489
|
+
|
|
490
|
+
func loadUsers() async {
|
|
491
|
+
isLoading = true
|
|
492
|
+
defer { isLoading = false }
|
|
493
|
+
|
|
494
|
+
do {
|
|
495
|
+
users = try await fetchUsers()
|
|
496
|
+
} catch {
|
|
497
|
+
// Handle error
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### 7.6 Task Cancellation
|
|
504
|
+
|
|
505
|
+
```swift
|
|
506
|
+
func fetchWithTimeout() async throws -> Data {
|
|
507
|
+
try await withThrowingTaskGroup(of: Data.self) { group in
|
|
508
|
+
group.addTask {
|
|
509
|
+
try await fetchData()
|
|
510
|
+
}
|
|
511
|
+
group.addTask {
|
|
512
|
+
try await Task.sleep(for: .seconds(10))
|
|
513
|
+
throw TimeoutError()
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
let result = try await group.next()!
|
|
517
|
+
group.cancelAll()
|
|
518
|
+
return result
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Check for cancellation
|
|
523
|
+
func longOperation() async throws {
|
|
524
|
+
for item in items {
|
|
525
|
+
try Task.checkCancellation()
|
|
526
|
+
await process(item)
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
## 8. Access Control
|
|
534
|
+
|
|
535
|
+
**Impact:** MEDIUM
|
|
536
|
+
|
|
537
|
+
### 8.1 Access Levels
|
|
538
|
+
|
|
539
|
+
| Level | Scope |
|
|
540
|
+
|-------|-------|
|
|
541
|
+
| `private` | Enclosing declaration only |
|
|
542
|
+
| `fileprivate` | Entire source file |
|
|
543
|
+
| `internal` | Module (default) |
|
|
544
|
+
| `public` | Other modules can access |
|
|
545
|
+
| `open` | Other modules can subclass/override |
|
|
546
|
+
|
|
547
|
+
### 8.2 Best Practices
|
|
548
|
+
|
|
549
|
+
```swift
|
|
550
|
+
public class UserService {
|
|
551
|
+
// Public API
|
|
552
|
+
public func fetchUser(id: Int) async throws -> User { }
|
|
553
|
+
|
|
554
|
+
// Internal helper
|
|
555
|
+
func buildRequest(for id: Int) -> URLRequest { }
|
|
556
|
+
|
|
557
|
+
// Private implementation detail
|
|
558
|
+
private let session: URLSession
|
|
559
|
+
private var cache: [Int: User] = [:]
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### 8.3 Private Setters
|
|
564
|
+
|
|
565
|
+
```swift
|
|
566
|
+
public struct Counter {
|
|
567
|
+
public private(set) var count = 0
|
|
568
|
+
|
|
569
|
+
public mutating func increment() {
|
|
570
|
+
count += 1
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
## 9. Generics and Type Constraints
|
|
578
|
+
|
|
579
|
+
**Impact:** MEDIUM
|
|
580
|
+
|
|
581
|
+
### 9.1 Generic Functions
|
|
582
|
+
|
|
583
|
+
```swift
|
|
584
|
+
func swapValues<T>(_ a: inout T, _ b: inout T) {
|
|
585
|
+
let temp = a
|
|
586
|
+
a = b
|
|
587
|
+
b = temp
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### 9.2 Type Constraints
|
|
592
|
+
|
|
593
|
+
```swift
|
|
594
|
+
func findIndex<T: Equatable>(of value: T, in array: [T]) -> Int? {
|
|
595
|
+
array.firstIndex(of: value)
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
func decode<T: Decodable>(_ type: T.Type, from data: Data) throws -> T {
|
|
599
|
+
try JSONDecoder().decode(type, from: data)
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### 9.3 Where Clauses
|
|
604
|
+
|
|
605
|
+
```swift
|
|
606
|
+
func allMatch<C: Collection>(_ collection: C, predicate: (C.Element) -> Bool) -> Bool
|
|
607
|
+
where C.Element: Equatable {
|
|
608
|
+
collection.allSatisfy(predicate)
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
extension Array where Element: Numeric {
|
|
612
|
+
func sum() -> Element {
|
|
613
|
+
reduce(0, +)
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
### 9.4 Opaque Types (some)
|
|
619
|
+
|
|
620
|
+
```swift
|
|
621
|
+
func makeCollection() -> some Collection {
|
|
622
|
+
[1, 2, 3]
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
var body: some View {
|
|
626
|
+
Text("Hello")
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
---
|
|
631
|
+
|
|
632
|
+
## 10. Property Wrappers
|
|
633
|
+
|
|
634
|
+
**Impact:** MEDIUM
|
|
635
|
+
|
|
636
|
+
### 10.1 Common SwiftUI Property Wrappers
|
|
637
|
+
|
|
638
|
+
| Wrapper | Use Case |
|
|
639
|
+
|---------|----------|
|
|
640
|
+
| `@State` | View-local mutable state |
|
|
641
|
+
| `@Binding` | Two-way connection to parent state |
|
|
642
|
+
| `@StateObject` | View-owned observable object |
|
|
643
|
+
| `@ObservedObject` | Passed-in observable object |
|
|
644
|
+
| `@EnvironmentObject` | Shared object from ancestor |
|
|
645
|
+
| `@Environment` | System environment values |
|
|
646
|
+
| `@Published` | Observable property in class |
|
|
647
|
+
|
|
648
|
+
### 10.2 Custom Property Wrappers
|
|
649
|
+
|
|
650
|
+
```swift
|
|
651
|
+
@propertyWrapper
|
|
652
|
+
struct Clamped<Value: Comparable> {
|
|
653
|
+
private var value: Value
|
|
654
|
+
let range: ClosedRange<Value>
|
|
655
|
+
|
|
656
|
+
var wrappedValue: Value {
|
|
657
|
+
get { value }
|
|
658
|
+
set { value = min(max(newValue, range.lowerBound), range.upperBound) }
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
init(wrappedValue: Value, _ range: ClosedRange<Value>) {
|
|
662
|
+
self.range = range
|
|
663
|
+
self.value = min(max(wrappedValue, range.lowerBound), range.upperBound)
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
struct Settings {
|
|
668
|
+
@Clamped(0...100) var volume: Int = 50
|
|
669
|
+
}
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
## Quick Reference
|
|
675
|
+
|
|
676
|
+
### Optionals
|
|
677
|
+
|
|
678
|
+
```swift
|
|
679
|
+
if let x = optional { } // Safe unwrap
|
|
680
|
+
guard let x = optional else { return } // Early exit
|
|
681
|
+
let x = optional ?? default // Default value
|
|
682
|
+
optional?.method() // Optional chaining
|
|
683
|
+
optional.map { transform($0) } // Transform if present
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
### Common Patterns
|
|
687
|
+
|
|
688
|
+
```swift
|
|
689
|
+
// Defer for cleanup
|
|
690
|
+
func process() {
|
|
691
|
+
let file = openFile()
|
|
692
|
+
defer { closeFile(file) }
|
|
693
|
+
// ... work with file
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
// Lazy initialization
|
|
697
|
+
lazy var expensive: ExpensiveObject = {
|
|
698
|
+
ExpensiveObject()
|
|
699
|
+
}()
|
|
700
|
+
|
|
701
|
+
// Type inference
|
|
702
|
+
let numbers = [1, 2, 3] // [Int]
|
|
703
|
+
let doubled = numbers.map { $0 * 2 } // [Int]
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### Closure Syntax
|
|
707
|
+
|
|
708
|
+
```swift
|
|
709
|
+
// Full syntax
|
|
710
|
+
let sorted = names.sorted(by: { (s1: String, s2: String) -> Bool in
|
|
711
|
+
return s1 < s2
|
|
712
|
+
})
|
|
713
|
+
|
|
714
|
+
// Shortened
|
|
715
|
+
let sorted = names.sorted { $0 < $1 }
|
|
716
|
+
|
|
717
|
+
// Trailing closure
|
|
718
|
+
UIView.animate(withDuration: 0.3) {
|
|
719
|
+
view.alpha = 0
|
|
720
|
+
}
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
---
|
|
724
|
+
|
|
725
|
+
## Checklist
|
|
726
|
+
|
|
727
|
+
### Safety
|
|
728
|
+
- [ ] No force unwrapping (`!`) except for IB outlets and known-safe cases
|
|
729
|
+
- [ ] All optionals handled with `if let`, `guard let`, or `??`
|
|
730
|
+
- [ ] No implicitly unwrapped optionals (`!`) in data models
|
|
731
|
+
|
|
732
|
+
### Memory
|
|
733
|
+
- [ ] Escaping closures capture `self` intentionally; use `[weak self]` or `[unowned self]` to avoid retain cycles when needed
|
|
734
|
+
- [ ] Delegate properties are `weak`
|
|
735
|
+
- [ ] No retain cycles between objects
|
|
736
|
+
|
|
737
|
+
### Concurrency
|
|
738
|
+
- [ ] Async functions used instead of completion handlers
|
|
739
|
+
- [ ] Mutable state shared across concurrency domains is isolated, often with actors
|
|
740
|
+
- [ ] Types crossing concurrency domains use `Sendable` when appropriate
|
|
741
|
+
- [ ] UI updates on `@MainActor`
|
|
742
|
+
- [ ] Task cancellation checked in long operations
|
|
743
|
+
|
|
744
|
+
### Access Control
|
|
745
|
+
- [ ] `private` used for implementation details
|
|
746
|
+
- [ ] `public` API is minimal and intentional
|
|
747
|
+
- [ ] No unnecessary `internal` exposure
|
|
748
|
+
|
|
749
|
+
### Naming
|
|
750
|
+
- [ ] Types use PascalCase
|
|
751
|
+
- [ ] Functions and variables use camelCase
|
|
752
|
+
- [ ] Booleans have `is`/`has`/`should` prefix
|
|
753
|
+
- [ ] Functions read like natural English
|
|
754
|
+
|
|
755
|
+
---
|
|
756
|
+
|
|
757
|
+
*Swift and Apple are trademarks of Apple Inc.*
|