@devo-bmad-custom/agent-orchestration 1.0.1 → 1.0.3
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/lib/installer.js +44 -11
- package/package.json +1 -1
- package/src/.agents/skills/audit-website/README.md +20 -20
- package/src/.agents/skills/audit-website/SKILL.md +470 -470
- package/src/.agents/skills/audit-website/agents/openai.yaml +6 -6
- package/src/.agents/skills/audit-website/assets/icon-small.svg +41 -41
- package/src/.agents/skills/audit-website/references/OUTPUT-FORMAT.md +250 -250
- package/src/.agents/skills/clean-code-standards/SKILL.md +104 -104
- package/src/.agents/skills/excalidraw-dark-standard/SKILL.md +281 -281
- package/src/.agents/skills/frontend-responsive-design-standards/SKILL.md +434 -434
- package/src/.agents/skills/java-fundamentals/SKILL.md +116 -116
- package/src/.agents/skills/java-performance/SKILL.md +119 -119
- package/src/.agents/skills/next-best-practices/SKILL.md +153 -153
- package/src/.agents/skills/next-best-practices/async-patterns.md +87 -87
- package/src/.agents/skills/next-best-practices/bundling.md +180 -180
- package/src/.agents/skills/next-best-practices/data-patterns.md +297 -297
- package/src/.agents/skills/next-best-practices/debug-tricks.md +105 -105
- package/src/.agents/skills/next-best-practices/directives.md +73 -73
- package/src/.agents/skills/next-best-practices/error-handling.md +227 -227
- package/src/.agents/skills/next-best-practices/file-conventions.md +140 -140
- package/src/.agents/skills/next-best-practices/font.md +245 -245
- package/src/.agents/skills/next-best-practices/functions.md +108 -108
- package/src/.agents/skills/next-best-practices/hydration-error.md +91 -91
- package/src/.agents/skills/next-best-practices/image.md +173 -173
- package/src/.agents/skills/next-best-practices/metadata.md +301 -301
- package/src/.agents/skills/next-best-practices/parallel-routes.md +287 -287
- package/src/.agents/skills/next-best-practices/route-handlers.md +146 -146
- package/src/.agents/skills/next-best-practices/rsc-boundaries.md +159 -159
- package/src/.agents/skills/next-best-practices/runtime-selection.md +39 -39
- package/src/.agents/skills/next-best-practices/scripts.md +141 -141
- package/src/.agents/skills/next-best-practices/self-hosting.md +371 -371
- package/src/.agents/skills/next-best-practices/suspense-boundaries.md +67 -67
- package/src/.agents/skills/nextjs-app-router-patterns/SKILL.md +537 -537
- package/src/.agents/skills/postgresql-optimization/SKILL.md +404 -404
- package/src/.agents/skills/python-backend/SKILL.md +153 -153
- package/src/.agents/skills/python-fundamentals/SKILL.md +234 -234
- package/src/.agents/skills/python-performance/SKILL.md +404 -404
- package/src/.agents/skills/react-expert/SKILL.md +335 -335
- package/src/.agents/skills/redis-best-practices/SKILL.md +438 -438
- package/src/.agents/skills/security-best-practices/SKILL.md +288 -288
- package/src/.agents/skills/security-review/LICENSE +22 -22
- package/src/.agents/skills/security-review/SKILL.md +312 -312
- package/src/.agents/skills/security-review/infrastructure/docker.md +432 -432
- package/src/.agents/skills/security-review/languages/javascript.md +388 -388
- package/src/.agents/skills/security-review/languages/python.md +363 -363
- package/src/.agents/skills/security-review/references/api-security.md +519 -519
- package/src/.agents/skills/security-review/references/authentication.md +353 -353
- package/src/.agents/skills/security-review/references/authorization.md +372 -372
- package/src/.agents/skills/security-review/references/business-logic.md +443 -443
- package/src/.agents/skills/security-review/references/cryptography.md +329 -329
- package/src/.agents/skills/security-review/references/csrf.md +398 -398
- package/src/.agents/skills/security-review/references/data-protection.md +378 -378
- package/src/.agents/skills/security-review/references/deserialization.md +410 -410
- package/src/.agents/skills/security-review/references/error-handling.md +436 -436
- package/src/.agents/skills/security-review/references/file-security.md +457 -457
- package/src/.agents/skills/security-review/references/injection.md +259 -259
- package/src/.agents/skills/security-review/references/logging.md +433 -433
- package/src/.agents/skills/security-review/references/misconfiguration.md +435 -435
- package/src/.agents/skills/security-review/references/modern-threats.md +475 -475
- package/src/.agents/skills/security-review/references/ssrf.md +415 -415
- package/src/.agents/skills/security-review/references/supply-chain.md +405 -405
- package/src/.agents/skills/security-review/references/xss.md +336 -336
- package/src/.agents/skills/subagent-driven-development/SKILL.md +275 -275
- package/src/.agents/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -26
- package/src/.agents/skills/subagent-driven-development/implementer-prompt.md +113 -113
- package/src/.agents/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -61
- package/src/.agents/skills/systematic-debugging/CREATION-LOG.md +119 -119
- package/src/.agents/skills/systematic-debugging/SKILL.md +296 -296
- package/src/.agents/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/src/.agents/skills/systematic-debugging/condition-based-waiting.md +115 -115
- package/src/.agents/skills/systematic-debugging/defense-in-depth.md +122 -122
- package/src/.agents/skills/systematic-debugging/root-cause-tracing.md +169 -169
- package/src/.agents/skills/systematic-debugging/test-academic.md +14 -14
- package/src/.agents/skills/systematic-debugging/test-pressure-1.md +58 -58
- package/src/.agents/skills/systematic-debugging/test-pressure-2.md +68 -68
- package/src/.agents/skills/systematic-debugging/test-pressure-3.md +69 -69
- package/src/.agents/skills/typescript-best-practices/SKILL.md +373 -373
- package/src/.agents/skills/ui-ux-pro-custom/SKILL.md +348 -348
- package/src/.agents/skills/ui-ux-pro-custom/data/charts.csv +26 -26
- package/src/.agents/skills/ui-ux-pro-custom/data/colors.csv +97 -97
- package/src/.agents/skills/ui-ux-pro-custom/data/icons.csv +101 -101
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/SKILL.md +106 -106
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/accessibility.md +475 -475
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/animation.md +466 -466
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/composition-locals.md +231 -231
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/deprecated-patterns.md +323 -323
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/lists-scrolling.md +400 -400
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/modifiers.md +331 -331
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/navigation.md +416 -416
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/performance.md +446 -446
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/side-effects.md +516 -516
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/foundation-source.md +13327 -13327
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/material3-source.md +19097 -19097
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/navigation-source.md +2947 -2947
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/runtime-source.md +11316 -11316
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/ui-source.md +7896 -7896
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/state-management.md +377 -377
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/styles-experimental.md +470 -470
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/theming-material3.md +349 -349
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/view-composition.md +595 -595
- package/src/.agents/skills/ui-ux-pro-custom/data/landing.csv +31 -31
- package/src/.agents/skills/ui-ux-pro-custom/data/mobile-ui-layout.md +654 -654
- package/src/.agents/skills/ui-ux-pro-custom/data/products.csv +96 -96
- package/src/.agents/skills/ui-ux-pro-custom/data/react-performance.csv +45 -45
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/astro.csv +54 -54
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/flutter.csv +53 -53
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/html-tailwind.csv +56 -56
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/jetpack-compose.csv +53 -53
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nextjs.csv +53 -53
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxt-ui.csv +51 -51
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxtjs.csv +59 -59
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react-native.csv +56 -56
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react.csv +54 -54
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/shadcn.csv +61 -61
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/svelte.csv +54 -54
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/swiftui.csv +51 -51
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/vue.csv +50 -50
- package/src/.agents/skills/ui-ux-pro-custom/data/styles.csv +68 -68
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/SKILL.md +438 -438
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/references/alarmkit-patterns.md +584 -584
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-clips/SKILL.md +436 -436
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/SKILL.md +489 -489
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/references/appintents-advanced.md +1076 -1076
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/SKILL.md +340 -340
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/privacy-manifest.md +90 -90
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/review-checklists.md +106 -106
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-conversion.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-optimization.md +344 -344
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/foundation-models.md +508 -508
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/mlx-swift.md +285 -285
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/SKILL.md +496 -496
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/references/keychain-biometric.md +211 -211
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/SKILL.md +499 -499
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/references/background-task-patterns.md +390 -390
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/SKILL.md +461 -461
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/references/callkit-patterns.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/SKILL.md +492 -492
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/references/cloudkit-patterns.md +461 -461
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/codable-patterns/SKILL.md +467 -467
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/SKILL.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/references/contacts-patterns.md +409 -409
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/SKILL.md +491 -491
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/references/ble-patterns.md +435 -435
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/SKILL.md +388 -388
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/references/motion-patterns.md +405 -405
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/SKILL.md +495 -495
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/references/nfc-patterns.md +420 -420
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/SKILL.md +459 -459
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/references/coreml-swift-integration.md +765 -765
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/SKILL.md +422 -422
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/instruments-guide.md +387 -387
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/lldb-patterns.md +298 -298
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/device-integrity/SKILL.md +477 -477
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/SKILL.md +460 -460
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/references/energykit-patterns.md +541 -541
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/SKILL.md +483 -483
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/references/eventkit-patterns.md +326 -326
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/SKILL.md +498 -498
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/references/healthkit-patterns.md +602 -602
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/SKILL.md +496 -496
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/references/matter-commissioning.md +455 -455
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/SKILL.md +301 -301
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/references/a11y-patterns.md +140 -140
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/SKILL.md +418 -418
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/formatstyle-locale.md +627 -627
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/string-catalogs.md +462 -462
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/SKILL.md +441 -441
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/background-websocket.md +862 -862
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/lightweight-clients.md +93 -93
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/network-framework.md +563 -563
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/urlsession-patterns.md +1116 -1116
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/SKILL.md +496 -496
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/app-review-guidelines.md +174 -174
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/cryptokit-advanced.md +296 -296
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/file-storage-patterns.md +354 -354
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/privacy-manifest.md +117 -117
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/references/live-activity-patterns.md +868 -868
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/SKILL.md +485 -485
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/corelocation-patterns.md +730 -730
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/mapkit-patterns.md +748 -748
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/metrickit-diagnostics/SKILL.md +479 -479
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/SKILL.md +395 -395
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/references/musickit-patterns.md +363 -363
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/SKILL.md +412 -412
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/references/translation-patterns.md +311 -311
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/SKILL.md +398 -398
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/references/wallet-passes.md +254 -254
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/SKILL.md +387 -387
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/paperkit-integration.md +376 -376
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/pencilkit-patterns.md +302 -302
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/SKILL.md +446 -446
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/references/permissionkit-patterns.md +435 -435
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/av-playback.md +701 -701
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/camera-capture.md +774 -774
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/image-loading-caching.md +869 -869
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/photospicker-patterns.md +597 -597
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/notification-patterns.md +677 -677
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/rich-notifications.md +745 -745
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/SKILL.md +479 -479
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/references/realitykit-patterns.md +480 -480
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/SKILL.md +483 -483
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/references/shareplay-patterns.md +544 -544
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/speech-recognition/SKILL.md +485 -485
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/SKILL.md +478 -478
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/app-review-guidelines.md +58 -58
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/storekit-advanced.md +755 -755
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/SKILL.md +487 -487
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/references/charts-patterns.md +895 -895
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/SKILL.md +408 -408
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/approachable-concurrency.md +80 -80
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swift-6-2-concurrency.md +233 -233
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swiftui-concurrency.md +187 -187
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/synchronization-primitives.md +341 -341
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/SKILL.md +498 -498
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/references/swift-patterns-extended.md +505 -505
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/SKILL.md +467 -467
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/references/testing-patterns.md +504 -504
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/SKILL.md +334 -334
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/core-data-coexistence.md +504 -504
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-advanced.md +975 -975
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-queries.md +675 -675
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/SKILL.md +481 -481
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/animation-advanced.md +804 -804
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/core-animation-bridge.md +553 -553
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/SKILL.md +450 -450
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/references/gesture-patterns.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/SKILL.md +336 -336
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/form.md +97 -97
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/grids.md +69 -69
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/list.md +99 -99
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/scrollview.md +147 -147
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/SKILL.md +325 -325
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/references/liquid-glass.md +387 -387
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/SKILL.md +262 -262
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/deeplinks.md +207 -207
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/navigationstack.md +177 -177
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/sheets.md +169 -169
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/tabview.md +178 -178
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/SKILL.md +381 -381
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/architecture-patterns.md +486 -486
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/deprecated-migration.md +1097 -1097
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/design-polish.md +780 -780
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/platform-and-sharing.md +696 -696
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/SKILL.md +491 -491
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -46
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -29
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -33
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -52
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/SKILL.md +428 -428
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/hosting-migration.md +534 -534
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/representable-recipes.md +1133 -1133
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/SKILL.md +494 -494
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/references/tipkit-patterns.md +782 -782
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/SKILL.md +475 -475
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/vision-requests.md +736 -736
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/visionkit-scanner.md +738 -738
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/SKILL.md +410 -410
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/references/weatherkit-patterns.md +567 -567
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/SKILL.md +497 -497
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/references/widgetkit-advanced.md +871 -871
- package/src/.agents/skills/ui-ux-pro-custom/data/typography.csv +57 -57
- package/src/.agents/skills/ui-ux-pro-custom/data/ui-reasoning.csv +101 -101
- package/src/.agents/skills/ui-ux-pro-custom/data/ux-guidelines.csv +99 -99
- package/src/.agents/skills/ui-ux-pro-custom/data/web-interface.csv +31 -31
- package/src/.agents/skills/ui-ux-pro-custom/scripts/core.py +253 -253
- package/src/.agents/skills/ui-ux-pro-custom/scripts/design_system.py +1067 -1067
- package/src/.agents/skills/ui-ux-pro-custom/scripts/search.py +114 -114
- package/src/.agents/skills/ux-audit/SKILL.md +150 -150
- package/src/.agents/skills/websocket-engineer/SKILL.md +168 -168
- package/src/.agents/skills/websocket-engineer/references/alternatives.md +391 -391
- package/src/.agents/skills/websocket-engineer/references/patterns.md +400 -400
- package/src/.agents/skills/websocket-engineer/references/protocol.md +195 -195
- package/src/.agents/skills/websocket-engineer/references/scaling.md +333 -333
- package/src/.agents/skills/websocket-engineer/references/security.md +474 -474
- package/src/.agents/skills/writing-skills/SKILL.md +655 -655
- package/src/.agents/skills/writing-skills/anthropic-best-practices.md +1150 -1150
- package/src/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/src/.agents/skills/writing-skills/graphviz-conventions.dot +171 -171
- package/src/.agents/skills/writing-skills/persuasion-principles.md +187 -187
- package/src/.agents/skills/writing-skills/render-graphs.js +168 -168
- package/src/.agents/skills/writing-skills/testing-skills-with-subagents.md +384 -384
- package/src/.claude/commands/bmad-track-compact.md +1 -1
- package/src/.claude/commands/bmad-track-extended.md +1 -1
- package/src/.claude/commands/bmad-track-large.md +1 -1
- package/src/.claude/commands/bmad-track-medium.md +1 -1
- package/src/.claude/commands/bmad-track-nano.md +1 -1
- package/src/.claude/commands/bmad-track-rv.md +1 -1
- package/src/.claude/commands/bmad-track-small.md +1 -1
- package/src/.claude/commands/master-orchestrator.md +15 -0
- package/src/_memory/config.yaml +11 -11
- package/src/_memory/master-orchestrator-sidecar/instructions.md +85 -32
- package/src/_memory/skills/nimbalyst-tracking/SKILL.md +103 -103
- package/src/_memory/skills/writing-skills/SKILL.md +655 -655
- package/src/bmb/agents/agent-builder.md +59 -59
- package/src/bmb/agents/module-builder.md +60 -60
- package/src/bmb/agents/workflow-builder.md +61 -61
- package/src/bmb/config.yaml +12 -12
- package/src/bmb/module-help.csv +13 -13
- package/src/bmb/workflows/agent/data/agent-architecture.md +258 -258
- package/src/bmb/workflows/agent/data/agent-compilation.md +185 -185
- package/src/bmb/workflows/agent/data/agent-menu-patterns.md +189 -189
- package/src/bmb/workflows/agent/data/agent-metadata.md +133 -133
- package/src/bmb/workflows/agent/data/agent-validation.md +111 -111
- package/src/bmb/workflows/agent/data/brainstorm-context.md +96 -96
- package/src/bmb/workflows/agent/data/communication-presets.csv +61 -61
- package/src/bmb/workflows/agent/data/critical-actions.md +75 -75
- package/src/bmb/workflows/agent/data/persona-properties.md +252 -252
- package/src/bmb/workflows/agent/data/principles-crafting.md +142 -142
- package/src/bmb/workflows/agent/data/reference/module-examples/architect.md +68 -68
- package/src/bmb/workflows/agent/data/reference/with-sidecar/journal-keeper/journal-keeper-sidecar/entries/yy-mm-dd-entry-template.md +16 -16
- package/src/bmb/workflows/agent/data/understanding-agent-types.md +126 -126
- package/src/bmb/workflows/agent/steps-c/step-01-brainstorm.md +129 -129
- package/src/bmb/workflows/agent/steps-c/step-02-discovery.md +170 -170
- package/src/bmb/workflows/agent/steps-c/step-03-sidecar-metadata.md +309 -309
- package/src/bmb/workflows/agent/steps-c/step-04-persona.md +213 -213
- package/src/bmb/workflows/agent/steps-c/step-05-commands-menu.md +179 -179
- package/src/bmb/workflows/agent/steps-c/step-06-activation.md +278 -278
- package/src/bmb/workflows/agent/steps-c/step-07-build-agent.md +316 -316
- package/src/bmb/workflows/agent/steps-c/step-08-celebrate.md +247 -247
- package/src/bmb/workflows/agent/steps-e/e-01-load-existing.md +221 -221
- package/src/bmb/workflows/agent/steps-e/e-02-discover-edits.md +195 -195
- package/src/bmb/workflows/agent/steps-e/e-04-sidecar-metadata.md +126 -126
- package/src/bmb/workflows/agent/steps-e/e-05-persona.md +135 -135
- package/src/bmb/workflows/agent/steps-e/e-06-commands-menu.md +123 -123
- package/src/bmb/workflows/agent/steps-e/e-07-activation.md +124 -124
- package/src/bmb/workflows/agent/steps-e/e-08-edit-agent.md +197 -197
- package/src/bmb/workflows/agent/steps-e/e-09-celebrate.md +155 -155
- package/src/bmb/workflows/agent/steps-v/v-01-load-review.md +137 -137
- package/src/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +116 -116
- package/src/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +124 -124
- package/src/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +127 -127
- package/src/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +134 -134
- package/src/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +134 -134
- package/src/bmb/workflows/agent/steps-v/v-03-summary.md +104 -104
- package/src/bmb/workflows/agent/templates/agent-plan.template.md +5 -5
- package/src/bmb/workflows/agent/templates/agent-template.md +89 -89
- package/src/bmb/workflows/agent/workflow-create-agent.md +72 -72
- package/src/bmb/workflows/agent/workflow-edit-agent.md +75 -75
- package/src/bmb/workflows/agent/workflow-validate-agent.md +73 -73
- package/src/bmb/workflows/module/data/agent-architecture.md +179 -179
- package/src/bmb/workflows/module/data/agent-spec-template.md +79 -79
- package/src/bmb/workflows/module/data/module-standards.md +263 -263
- package/src/bmb/workflows/module/data/module-yaml-conventions.md +392 -392
- package/src/bmb/workflows/module/module-help-generate.md +254 -254
- package/src/bmb/workflows/module/steps-b/step-01-welcome.md +148 -148
- package/src/bmb/workflows/module/steps-b/step-02-spark.md +141 -141
- package/src/bmb/workflows/module/steps-b/step-03-module-type.md +149 -149
- package/src/bmb/workflows/module/steps-b/step-04-vision.md +83 -83
- package/src/bmb/workflows/module/steps-b/step-05-identity.md +97 -97
- package/src/bmb/workflows/module/steps-b/step-06-users.md +86 -86
- package/src/bmb/workflows/module/steps-b/step-07-value.md +76 -76
- package/src/bmb/workflows/module/steps-b/step-08-agents.md +97 -97
- package/src/bmb/workflows/module/steps-b/step-09-workflows.md +83 -83
- package/src/bmb/workflows/module/steps-b/step-10-tools.md +91 -91
- package/src/bmb/workflows/module/steps-b/step-11-scenarios.md +84 -84
- package/src/bmb/workflows/module/steps-b/step-12-creative.md +95 -95
- package/src/bmb/workflows/module/steps-b/step-13-review.md +105 -105
- package/src/bmb/workflows/module/steps-b/step-14-finalize.md +117 -117
- package/src/bmb/workflows/module/steps-c/step-01-load-brief.md +179 -179
- package/src/bmb/workflows/module/steps-c/step-01b-continue.md +82 -82
- package/src/bmb/workflows/module/steps-c/step-02-structure.md +105 -105
- package/src/bmb/workflows/module/steps-c/step-03-config.md +119 -119
- package/src/bmb/workflows/module/steps-c/step-04-agents.md +168 -168
- package/src/bmb/workflows/module/steps-c/step-05-workflows.md +184 -184
- package/src/bmb/workflows/module/steps-c/step-06-docs.md +401 -401
- package/src/bmb/workflows/module/steps-c/step-07-complete.md +152 -152
- package/src/bmb/workflows/module/steps-e/step-01-load-target.md +81 -81
- package/src/bmb/workflows/module/steps-e/step-02-select-edit.md +77 -77
- package/src/bmb/workflows/module/steps-e/step-03-apply-edit.md +77 -77
- package/src/bmb/workflows/module/steps-e/step-04-review.md +80 -80
- package/src/bmb/workflows/module/steps-e/step-05-confirm.md +75 -75
- package/src/bmb/workflows/module/steps-v/step-01-load-target.md +96 -96
- package/src/bmb/workflows/module/steps-v/step-02-file-structure.md +93 -93
- package/src/bmb/workflows/module/steps-v/step-03-module-yaml.md +99 -99
- package/src/bmb/workflows/module/steps-v/step-04-agent-specs.md +152 -152
- package/src/bmb/workflows/module/steps-v/step-05-workflow-specs.md +152 -152
- package/src/bmb/workflows/module/steps-v/step-06-documentation.md +143 -143
- package/src/bmb/workflows/module/steps-v/step-07-installation.md +102 -102
- package/src/bmb/workflows/module/steps-v/step-08-report.md +197 -197
- package/src/bmb/workflows/module/templates/brief-template.md +154 -154
- package/src/bmb/workflows/module/templates/workflow-spec-template.md +96 -96
- package/src/bmb/workflows/module/workflow-create-module-brief.md +71 -71
- package/src/bmb/workflows/module/workflow-create-module.md +86 -86
- package/src/bmb/workflows/module/workflow-edit-module.md +66 -66
- package/src/bmb/workflows/module/workflow-validate-module.md +66 -66
- package/src/bmb/workflows/workflow/data/architecture.md +150 -150
- package/src/bmb/workflows/workflow/data/common-workflow-tools.csv +19 -19
- package/src/bmb/workflows/workflow/data/csv-data-file-standards.md +53 -53
- package/src/bmb/workflows/workflow/data/frontmatter-standards.md +184 -184
- package/src/bmb/workflows/workflow/data/input-discovery-standards.md +191 -191
- package/src/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md +44 -44
- package/src/bmb/workflows/workflow/data/menu-handling-standards.md +133 -133
- package/src/bmb/workflows/workflow/data/output-format-standards.md +135 -135
- package/src/bmb/workflows/workflow/data/step-file-rules.md +235 -235
- package/src/bmb/workflows/workflow/data/step-type-patterns.md +257 -257
- package/src/bmb/workflows/workflow/data/subprocess-optimization-patterns.md +188 -188
- package/src/bmb/workflows/workflow/data/trimodal-workflow-structure.md +164 -164
- package/src/bmb/workflows/workflow/data/workflow-chaining-standards.md +222 -222
- package/src/bmb/workflows/workflow/data/workflow-examples.md +232 -232
- package/src/bmb/workflows/workflow/data/workflow-type-criteria.md +134 -134
- package/src/bmb/workflows/workflow/steps-c/step-00-conversion.md +263 -263
- package/src/bmb/workflows/workflow/steps-c/step-01-discovery.md +194 -194
- package/src/bmb/workflows/workflow/steps-c/step-01b-continuation.md +3 -3
- package/src/bmb/workflows/workflow/steps-c/step-02-classification.md +270 -270
- package/src/bmb/workflows/workflow/steps-c/step-03-requirements.md +283 -283
- package/src/bmb/workflows/workflow/steps-c/step-04-tools.md +282 -282
- package/src/bmb/workflows/workflow/steps-c/step-05-plan-review.md +243 -243
- package/src/bmb/workflows/workflow/steps-c/step-06-design.md +330 -330
- package/src/bmb/workflows/workflow/steps-c/step-07-foundation.md +239 -239
- package/src/bmb/workflows/workflow/steps-c/step-08-build-step-01.md +379 -379
- package/src/bmb/workflows/workflow/steps-c/step-09-build-next-step.md +350 -350
- package/src/bmb/workflows/workflow/steps-c/step-10-confirmation.md +322 -322
- package/src/bmb/workflows/workflow/steps-c/step-11-completion.md +191 -191
- package/src/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md +237 -237
- package/src/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md +251 -251
- package/src/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md +254 -254
- package/src/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md +277 -277
- package/src/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md +154 -154
- package/src/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md +190 -190
- package/src/bmb/workflows/workflow/steps-e/step-e-07-complete.md +206 -206
- package/src/bmb/workflows/workflow/steps-v/step-01-validate-max-mode.md +109 -109
- package/src/bmb/workflows/workflow/steps-v/step-01-validate.md +221 -221
- package/src/bmb/workflows/workflow/steps-v/step-01b-structure.md +152 -152
- package/src/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md +199 -199
- package/src/bmb/workflows/workflow/steps-v/step-02b-path-violations.md +265 -265
- package/src/bmb/workflows/workflow/steps-v/step-03-menu-validation.md +164 -164
- package/src/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md +211 -211
- package/src/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md +200 -200
- package/src/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md +195 -195
- package/src/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md +209 -209
- package/src/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md +199 -199
- package/src/bmb/workflows/workflow/steps-v/step-08b-subprocess-optimization.md +179 -179
- package/src/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md +186 -186
- package/src/bmb/workflows/workflow/steps-v/step-10-report-complete.md +154 -154
- package/src/bmb/workflows/workflow/steps-v/step-11-plan-validation.md +237 -237
- package/src/bmb/workflows/workflow/templates/minimal-output-template.md +11 -11
- package/src/bmb/workflows/workflow/templates/step-01-init-continuable-template.md +241 -241
- package/src/bmb/workflows/workflow/templates/step-1b-template.md +224 -224
- package/src/bmb/workflows/workflow/templates/step-template.md +294 -294
- package/src/bmb/workflows/workflow/templates/workflow-template.md +102 -102
- package/src/bmb/workflows/workflow/workflow-create-workflow.md +79 -79
- package/src/bmb/workflows/workflow/workflow-edit-workflow.md +65 -65
- package/src/bmb/workflows/workflow/workflow-rework-workflow.md +65 -65
- package/src/bmb/workflows/workflow/workflow-validate-max-parallel-workflow.md +66 -66
- package/src/bmb/workflows/workflow/workflow-validate-workflow.md +65 -65
- package/src/bmm/agents/analyst.md +104 -104
- package/src/bmm/agents/dev.md +100 -100
- package/src/bmm/agents/qa.md +100 -90
- package/src/bmm/agents/review-agent.md +1 -1
- package/src/bmm/agents/tech-writer/tech-writer.md +94 -94
- package/src/bmm/module-help.csv +31 -31
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +115 -115
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +107 -107
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +141 -141
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +144 -144
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +147 -147
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +161 -161
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +99 -99
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -57
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +87 -87
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +156 -156
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +165 -165
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +140 -140
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +152 -152
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +345 -345
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +92 -92
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +164 -164
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +174 -174
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +184 -184
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +105 -105
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +360 -360
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +87 -87
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +165 -165
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +174 -174
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +141 -141
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +159 -159
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +387 -387
- package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -54
- package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -54
- package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -54
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +100 -100
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +160 -160
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +88 -88
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +99 -99
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +169 -169
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +156 -156
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +136 -136
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +176 -176
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +184 -184
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +174 -174
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +175 -175
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +189 -189
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +162 -162
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +79 -79
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +183 -183
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +149 -149
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +187 -187
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +192 -192
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +108 -108
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +166 -166
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +131 -131
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +150 -150
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +118 -118
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +155 -155
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +170 -170
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +158 -158
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +147 -147
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +182 -182
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +202 -202
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +148 -148
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +201 -201
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +179 -179
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +164 -164
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +65 -65
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -65
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -63
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +63 -63
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +106 -106
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +111 -111
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +115 -115
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +127 -127
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +167 -167
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +143 -143
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +118 -118
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +154 -154
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +136 -136
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +165 -165
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +135 -135
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +192 -192
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +101 -101
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +45 -45
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +185 -185
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +129 -129
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +130 -130
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +93 -93
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +196 -196
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -129
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -54
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +82 -82
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +106 -106
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +138 -138
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +129 -129
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +166 -166
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +186 -186
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +163 -163
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +38 -38
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -49
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +124 -124
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +122 -122
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +84 -84
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -58
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -43
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -53
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +159 -159
- package/src/bmm/workflows/4-implementation/create-story/template.md +79 -79
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -52
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -20
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -52
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -52
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -25
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +158 -158
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +122 -122
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +93 -93
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +93 -93
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +87 -87
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -146
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -50
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +152 -152
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +123 -123
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -201
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -79
- package/src/bmm/workflows/document-project/workflow.yaml +22 -22
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -184
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +322 -322
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +235 -235
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -49
- package/src/bmm/workflows/qa/automate/workflow.yaml +233 -233
- package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -42
- package/src/core/agents/master-orchestrator.md +3 -3
- package/src/core/config.yaml +9 -9
- package/src/core/module-help.csv +10 -10
- package/src/core/scripts/generate-loop-report.py +72 -72
- package/src/core/tasks/editorial-review-prose.xml +101 -101
- package/src/core/tasks/editorial-review-structure.xml +207 -207
- package/src/core/tasks/help.md +86 -86
- package/src/core/tasks/index-docs.xml +64 -64
- package/src/core/tasks/review-adversarial-general.xml +66 -66
- package/src/core/tasks/review-adversarial-loop.xml +46 -46
- package/src/core/tasks/review-edge-case-hunter.xml +63 -63
- package/src/core/tasks/review-party-loop.xml +46 -46
- package/src/core/tasks/shard-doc.xml +107 -107
- package/src/core/tasks/workflow.xml +235 -235
- package/src/core/templates/review-loop-report.html +88 -88
- package/src/core/templates/review-loop-report.md +5 -5
- package/src/core/workflows/advanced-elicitation/workflow.xml +117 -117
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +212 -212
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
- package/src/core/workflows/brainstorming/steps/step-02e-deep-dive.md +68 -68
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +403 -403
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
- package/src/core/workflows/brainstorming/workflow.md +60 -60
- package/src/core/workflows/extract-trackers/workflow.md +45 -45
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +142 -142
- package/src/core/workflows/party-mode/workflow.md +194 -194
- package/src/docs/dev/tmux/actions_popup.py +291 -291
- package/src/docs/dev/tmux/tmux-setup.md +62 -1
|
@@ -1,412 +1,412 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: natural-language
|
|
3
|
-
description: "Tokenize, tag, and analyze natural language text using Apple's NaturalLanguage framework and translate between languages with the Translation framework. Use when adding language identification, sentiment analysis, named entity recognition, part-of-speech tagging, text embeddings, or in-app translation to iOS/macOS/visionOS apps."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# NaturalLanguage + Translation
|
|
7
|
-
|
|
8
|
-
Analyze natural language text for tokenization, part-of-speech tagging, named
|
|
9
|
-
entity recognition, sentiment analysis, language identification, and word/sentence
|
|
10
|
-
embeddings. Translate text between languages with the Translation framework.
|
|
11
|
-
Targets Swift 6.2 / iOS 26+.
|
|
12
|
-
|
|
13
|
-
> This skill covers two related frameworks: **NaturalLanguage** (`NLTokenizer`, `NLTagger`, `NLEmbedding`) for on-device text analysis, and **Translation** (`TranslationSession`, `LanguageAvailability`) for language translation.
|
|
14
|
-
|
|
15
|
-
## Contents
|
|
16
|
-
|
|
17
|
-
- [Setup](#setup)
|
|
18
|
-
- [Tokenization](#tokenization)
|
|
19
|
-
- [Language Identification](#language-identification)
|
|
20
|
-
- [Part-of-Speech Tagging](#part-of-speech-tagging)
|
|
21
|
-
- [Named Entity Recognition](#named-entity-recognition)
|
|
22
|
-
- [Sentiment Analysis](#sentiment-analysis)
|
|
23
|
-
- [Text Embeddings](#text-embeddings)
|
|
24
|
-
- [Translation](#translation)
|
|
25
|
-
- [Common Mistakes](#common-mistakes)
|
|
26
|
-
- [Review Checklist](#review-checklist)
|
|
27
|
-
- [References](#references)
|
|
28
|
-
|
|
29
|
-
## Setup
|
|
30
|
-
|
|
31
|
-
Import `NaturalLanguage` for text analysis and `Translation` for language
|
|
32
|
-
translation. No special entitlements or capabilities are required for
|
|
33
|
-
NaturalLanguage. Translation requires iOS 17.4+ / macOS 14.4+.
|
|
34
|
-
|
|
35
|
-
```swift
|
|
36
|
-
import NaturalLanguage
|
|
37
|
-
import Translation
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
NaturalLanguage classes (`NLTokenizer`, `NLTagger`) are **not thread-safe**.
|
|
41
|
-
Use each instance from one thread or dispatch queue at a time.
|
|
42
|
-
|
|
43
|
-
## Tokenization
|
|
44
|
-
|
|
45
|
-
Segment text into words, sentences, or paragraphs with `NLTokenizer`.
|
|
46
|
-
|
|
47
|
-
```swift
|
|
48
|
-
import NaturalLanguage
|
|
49
|
-
|
|
50
|
-
func tokenizeWords(in text: String) -> [String] {
|
|
51
|
-
let tokenizer = NLTokenizer(unit: .word)
|
|
52
|
-
tokenizer.string = text
|
|
53
|
-
|
|
54
|
-
let range = text.startIndex..<text.endIndex
|
|
55
|
-
return tokenizer.tokens(for: range).map { String(text[$0]) }
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Token Units
|
|
60
|
-
|
|
61
|
-
| Unit | Description |
|
|
62
|
-
|---|---|
|
|
63
|
-
| `.word` | Individual words |
|
|
64
|
-
| `.sentence` | Sentences |
|
|
65
|
-
| `.paragraph` | Paragraphs |
|
|
66
|
-
| `.document` | Entire document |
|
|
67
|
-
|
|
68
|
-
### Enumerating with Attributes
|
|
69
|
-
|
|
70
|
-
Use `enumerateTokens(in:using:)` to detect numeric or emoji tokens.
|
|
71
|
-
|
|
72
|
-
```swift
|
|
73
|
-
let tokenizer = NLTokenizer(unit: .word)
|
|
74
|
-
tokenizer.string = text
|
|
75
|
-
|
|
76
|
-
tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, attributes in
|
|
77
|
-
if attributes.contains(.numeric) {
|
|
78
|
-
print("Number: \(text[range])")
|
|
79
|
-
}
|
|
80
|
-
return true // continue enumeration
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Language Identification
|
|
85
|
-
|
|
86
|
-
Detect the dominant language of a string with `NLLanguageRecognizer`.
|
|
87
|
-
|
|
88
|
-
```swift
|
|
89
|
-
func detectLanguage(for text: String) -> NLLanguage? {
|
|
90
|
-
NLLanguageRecognizer.dominantLanguage(for: text)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Multiple hypotheses with confidence scores
|
|
94
|
-
func languageHypotheses(for text: String, max: Int = 5) -> [NLLanguage: Double] {
|
|
95
|
-
let recognizer = NLLanguageRecognizer()
|
|
96
|
-
recognizer.processString(text)
|
|
97
|
-
return recognizer.languageHypotheses(withMaximum: max)
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Constrain the recognizer to expected languages for better accuracy on short text.
|
|
102
|
-
|
|
103
|
-
```swift
|
|
104
|
-
let recognizer = NLLanguageRecognizer()
|
|
105
|
-
recognizer.languageConstraints = [.english, .french, .spanish]
|
|
106
|
-
recognizer.processString(text)
|
|
107
|
-
let detected = recognizer.dominantLanguage
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## Part-of-Speech Tagging
|
|
111
|
-
|
|
112
|
-
Identify nouns, verbs, adjectives, and other lexical classes with `NLTagger`.
|
|
113
|
-
|
|
114
|
-
```swift
|
|
115
|
-
func tagPartsOfSpeech(in text: String) -> [(String, NLTag)] {
|
|
116
|
-
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
117
|
-
tagger.string = text
|
|
118
|
-
|
|
119
|
-
var results: [(String, NLTag)] = []
|
|
120
|
-
let range = text.startIndex..<text.endIndex
|
|
121
|
-
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
|
|
122
|
-
|
|
123
|
-
tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
|
|
124
|
-
if let tag {
|
|
125
|
-
results.append((String(text[tokenRange]), tag))
|
|
126
|
-
}
|
|
127
|
-
return true
|
|
128
|
-
}
|
|
129
|
-
return results
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### Common Tag Schemes
|
|
134
|
-
|
|
135
|
-
| Scheme | Output |
|
|
136
|
-
|---|---|
|
|
137
|
-
| `.lexicalClass` | Part of speech (noun, verb, adjective) |
|
|
138
|
-
| `.nameType` | Named entity type (person, place, organization) |
|
|
139
|
-
| `.nameTypeOrLexicalClass` | Combined NER + POS |
|
|
140
|
-
| `.lemma` | Base form of a word |
|
|
141
|
-
| `.language` | Per-token language |
|
|
142
|
-
| `.sentimentScore` | Sentiment polarity score |
|
|
143
|
-
|
|
144
|
-
## Named Entity Recognition
|
|
145
|
-
|
|
146
|
-
Extract people, places, and organizations.
|
|
147
|
-
|
|
148
|
-
```swift
|
|
149
|
-
func extractEntities(from text: String) -> [(String, NLTag)] {
|
|
150
|
-
let tagger = NLTagger(tagSchemes: [.nameType])
|
|
151
|
-
tagger.string = text
|
|
152
|
-
|
|
153
|
-
var entities: [(String, NLTag)] = []
|
|
154
|
-
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]
|
|
155
|
-
|
|
156
|
-
tagger.enumerateTags(
|
|
157
|
-
in: text.startIndex..<text.endIndex,
|
|
158
|
-
unit: .word,
|
|
159
|
-
scheme: .nameType,
|
|
160
|
-
options: options
|
|
161
|
-
) { tag, tokenRange in
|
|
162
|
-
if let tag, tag != .other {
|
|
163
|
-
entities.append((String(text[tokenRange]), tag))
|
|
164
|
-
}
|
|
165
|
-
return true
|
|
166
|
-
}
|
|
167
|
-
return entities
|
|
168
|
-
}
|
|
169
|
-
// NLTag values: .personalName, .placeName, .organizationName
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
## Sentiment Analysis
|
|
173
|
-
|
|
174
|
-
Score text sentiment from -1.0 (negative) to +1.0 (positive).
|
|
175
|
-
|
|
176
|
-
```swift
|
|
177
|
-
func sentimentScore(for text: String) -> Double? {
|
|
178
|
-
let tagger = NLTagger(tagSchemes: [.sentimentScore])
|
|
179
|
-
tagger.string = text
|
|
180
|
-
|
|
181
|
-
let (tag, _) = tagger.tag(
|
|
182
|
-
at: text.startIndex,
|
|
183
|
-
unit: .paragraph,
|
|
184
|
-
scheme: .sentimentScore
|
|
185
|
-
)
|
|
186
|
-
return tag.flatMap { Double($0.rawValue) }
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
## Text Embeddings
|
|
191
|
-
|
|
192
|
-
Measure semantic similarity between words or sentences with `NLEmbedding`.
|
|
193
|
-
|
|
194
|
-
```swift
|
|
195
|
-
func wordSimilarity(_ word1: String, _ word2: String) -> Double? {
|
|
196
|
-
guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return nil }
|
|
197
|
-
return embedding.distance(between: word1, and: word2, distanceType: .cosine)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
func findSimilarWords(to word: String, count: Int = 5) -> [(String, Double)] {
|
|
201
|
-
guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return [] }
|
|
202
|
-
return embedding.neighbors(for: word, maximumCount: count, distanceType: .cosine)
|
|
203
|
-
}
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
Sentence embeddings compare entire sentences.
|
|
207
|
-
|
|
208
|
-
```swift
|
|
209
|
-
func sentenceSimilarity(_ s1: String, _ s2: String) -> Double? {
|
|
210
|
-
guard let embedding = NLEmbedding.sentenceEmbedding(for: .english) else { return nil }
|
|
211
|
-
return embedding.distance(between: s1, and: s2, distanceType: .cosine)
|
|
212
|
-
}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
## Translation
|
|
216
|
-
|
|
217
|
-
### System Translation Overlay
|
|
218
|
-
|
|
219
|
-
Show the built-in translation UI with `.translationPresentation()`.
|
|
220
|
-
|
|
221
|
-
```swift
|
|
222
|
-
import SwiftUI
|
|
223
|
-
import Translation
|
|
224
|
-
|
|
225
|
-
struct TranslatableView: View {
|
|
226
|
-
@State private var showTranslation = false
|
|
227
|
-
let text = "Hello, how are you?"
|
|
228
|
-
|
|
229
|
-
var body: some View {
|
|
230
|
-
Text(text)
|
|
231
|
-
.onTapGesture { showTranslation = true }
|
|
232
|
-
.translationPresentation(
|
|
233
|
-
isPresented: $showTranslation,
|
|
234
|
-
text: text
|
|
235
|
-
)
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Programmatic Translation
|
|
241
|
-
|
|
242
|
-
Use `.translationTask()` for programmatic translations within a view context.
|
|
243
|
-
|
|
244
|
-
```swift
|
|
245
|
-
struct TranslatingView: View {
|
|
246
|
-
@State private var translatedText = ""
|
|
247
|
-
@State private var configuration: TranslationSession.Configuration?
|
|
248
|
-
|
|
249
|
-
var body: some View {
|
|
250
|
-
VStack {
|
|
251
|
-
Text(translatedText)
|
|
252
|
-
Button("Translate") {
|
|
253
|
-
configuration = .init(source: Locale.Language(identifier: "en"),
|
|
254
|
-
target: Locale.Language(identifier: "es"))
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
.translationTask(configuration) { session in
|
|
258
|
-
let response = try await session.translate("Hello, world!")
|
|
259
|
-
translatedText = response.targetText
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Batch Translation
|
|
266
|
-
|
|
267
|
-
Translate multiple strings in a single session.
|
|
268
|
-
|
|
269
|
-
```swift
|
|
270
|
-
.translationTask(configuration) { session in
|
|
271
|
-
let requests = texts.enumerated().map { index, text in
|
|
272
|
-
TranslationSession.Request(sourceText: text,
|
|
273
|
-
clientIdentifier: "\(index)")
|
|
274
|
-
}
|
|
275
|
-
let responses = try await session.translations(from: requests)
|
|
276
|
-
for response in responses {
|
|
277
|
-
print("\(response.sourceText) -> \(response.targetText)")
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
### Checking Language Availability
|
|
283
|
-
|
|
284
|
-
```swift
|
|
285
|
-
let availability = LanguageAvailability()
|
|
286
|
-
let status = await availability.status(
|
|
287
|
-
from: Locale.Language(identifier: "en"),
|
|
288
|
-
to: Locale.Language(identifier: "ja")
|
|
289
|
-
)
|
|
290
|
-
switch status {
|
|
291
|
-
case .installed: break // Ready to translate offline
|
|
292
|
-
case .supported: break // Needs download
|
|
293
|
-
case .unsupported: break // Language pair not available
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
## Common Mistakes
|
|
298
|
-
|
|
299
|
-
### DON'T: Share NLTagger/NLTokenizer across threads
|
|
300
|
-
|
|
301
|
-
These classes are not thread-safe and will produce incorrect results or crash.
|
|
302
|
-
|
|
303
|
-
```swift
|
|
304
|
-
// WRONG
|
|
305
|
-
let sharedTagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
306
|
-
DispatchQueue.concurrentPerform(iterations: 10) { _ in
|
|
307
|
-
sharedTagger.string = someText // Data race
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// CORRECT
|
|
311
|
-
await withTaskGroup(of: Void.self) { group in
|
|
312
|
-
for _ in 0..<10 {
|
|
313
|
-
group.addTask {
|
|
314
|
-
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
315
|
-
tagger.string = someText
|
|
316
|
-
// process...
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
### DON'T: Confuse NaturalLanguage with Core ML
|
|
323
|
-
|
|
324
|
-
NaturalLanguage provides built-in linguistic analysis. Use Core ML for custom
|
|
325
|
-
trained models. They complement each other via `NLModel`.
|
|
326
|
-
|
|
327
|
-
```swift
|
|
328
|
-
// WRONG: Trying to do NER with raw Core ML
|
|
329
|
-
let coreMLModel = try MLModel(contentsOf: modelURL)
|
|
330
|
-
|
|
331
|
-
// CORRECT: Use NLTagger for built-in NER
|
|
332
|
-
let tagger = NLTagger(tagSchemes: [.nameType])
|
|
333
|
-
|
|
334
|
-
// Or load a custom Core ML model via NLModel
|
|
335
|
-
let nlModel = try NLModel(mlModel: coreMLModel)
|
|
336
|
-
tagger.setModels([nlModel], forTagScheme: .nameType)
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### DON'T: Assume embeddings exist for all languages
|
|
340
|
-
|
|
341
|
-
Not all languages have word or sentence embeddings available on device.
|
|
342
|
-
|
|
343
|
-
```swift
|
|
344
|
-
// WRONG: Force unwrap
|
|
345
|
-
let embedding = NLEmbedding.wordEmbedding(for: .japanese)!
|
|
346
|
-
|
|
347
|
-
// CORRECT: Handle nil
|
|
348
|
-
guard let embedding = NLEmbedding.wordEmbedding(for: .japanese) else {
|
|
349
|
-
// Embedding not available for this language
|
|
350
|
-
return
|
|
351
|
-
}
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### DON'T: Create a new tagger per token
|
|
355
|
-
|
|
356
|
-
Creating and configuring a tagger is expensive. Reuse it for the same text.
|
|
357
|
-
|
|
358
|
-
```swift
|
|
359
|
-
// WRONG: New tagger per word
|
|
360
|
-
for word in words {
|
|
361
|
-
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
362
|
-
tagger.string = word
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// CORRECT: Set string once, enumerate
|
|
366
|
-
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
367
|
-
tagger.string = fullText
|
|
368
|
-
tagger.enumerateTags(in: fullText.startIndex..<fullText.endIndex,
|
|
369
|
-
unit: .word, scheme: .lexicalClass, options: []) { tag, range in
|
|
370
|
-
return true
|
|
371
|
-
}
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
### DON'T: Ignore language hints for short text
|
|
375
|
-
|
|
376
|
-
Language detection on short strings (under ~20 characters) is unreliable.
|
|
377
|
-
Set constraints or hints to improve accuracy.
|
|
378
|
-
|
|
379
|
-
```swift
|
|
380
|
-
// WRONG: Detect language of a single word
|
|
381
|
-
let lang = NLLanguageRecognizer.dominantLanguage(for: "chat") // French or English?
|
|
382
|
-
|
|
383
|
-
// CORRECT: Provide context
|
|
384
|
-
let recognizer = NLLanguageRecognizer()
|
|
385
|
-
recognizer.languageHints = [.english: 0.8, .french: 0.2]
|
|
386
|
-
recognizer.processString("chat")
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
## Review Checklist
|
|
390
|
-
|
|
391
|
-
- [ ] `NLTokenizer` and `NLTagger` instances used from a single thread
|
|
392
|
-
- [ ] Tagger created once per text, not per token
|
|
393
|
-
- [ ] Language detection uses constraints/hints for short text
|
|
394
|
-
- [ ] `NLEmbedding` availability checked before use (returns nil if unavailable)
|
|
395
|
-
- [ ] Translation `LanguageAvailability` checked before attempting translation
|
|
396
|
-
- [ ] `.translationTask()` used within a SwiftUI view hierarchy
|
|
397
|
-
- [ ] Batch translation uses `clientIdentifier` to match responses to requests
|
|
398
|
-
- [ ] Sentiment scores handled as optional (may return nil for unsupported languages)
|
|
399
|
-
- [ ] `.joinNames` option used with NER to keep multi-word names together
|
|
400
|
-
- [ ] Custom ML models loaded via `NLModel`, not raw Core ML
|
|
401
|
-
|
|
402
|
-
## References
|
|
403
|
-
|
|
404
|
-
- Extended patterns (custom models, contextual embeddings, gazetteers): `references/translation-patterns.md`
|
|
405
|
-
- [Natural Language framework](https://sosumi.ai/documentation/naturallanguage)
|
|
406
|
-
- [NLTokenizer](https://sosumi.ai/documentation/naturallanguage/nltokenizer)
|
|
407
|
-
- [NLTagger](https://sosumi.ai/documentation/naturallanguage/nltagger)
|
|
408
|
-
- [NLEmbedding](https://sosumi.ai/documentation/naturallanguage/nlembedding)
|
|
409
|
-
- [NLLanguageRecognizer](https://sosumi.ai/documentation/naturallanguage/nllanguagerecognizer)
|
|
410
|
-
- [Translation framework](https://sosumi.ai/documentation/translation)
|
|
411
|
-
- [TranslationSession](https://sosumi.ai/documentation/translation/translationsession)
|
|
412
|
-
- [LanguageAvailability](https://sosumi.ai/documentation/translation/languageavailability)
|
|
1
|
+
---
|
|
2
|
+
name: natural-language
|
|
3
|
+
description: "Tokenize, tag, and analyze natural language text using Apple's NaturalLanguage framework and translate between languages with the Translation framework. Use when adding language identification, sentiment analysis, named entity recognition, part-of-speech tagging, text embeddings, or in-app translation to iOS/macOS/visionOS apps."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# NaturalLanguage + Translation
|
|
7
|
+
|
|
8
|
+
Analyze natural language text for tokenization, part-of-speech tagging, named
|
|
9
|
+
entity recognition, sentiment analysis, language identification, and word/sentence
|
|
10
|
+
embeddings. Translate text between languages with the Translation framework.
|
|
11
|
+
Targets Swift 6.2 / iOS 26+.
|
|
12
|
+
|
|
13
|
+
> This skill covers two related frameworks: **NaturalLanguage** (`NLTokenizer`, `NLTagger`, `NLEmbedding`) for on-device text analysis, and **Translation** (`TranslationSession`, `LanguageAvailability`) for language translation.
|
|
14
|
+
|
|
15
|
+
## Contents
|
|
16
|
+
|
|
17
|
+
- [Setup](#setup)
|
|
18
|
+
- [Tokenization](#tokenization)
|
|
19
|
+
- [Language Identification](#language-identification)
|
|
20
|
+
- [Part-of-Speech Tagging](#part-of-speech-tagging)
|
|
21
|
+
- [Named Entity Recognition](#named-entity-recognition)
|
|
22
|
+
- [Sentiment Analysis](#sentiment-analysis)
|
|
23
|
+
- [Text Embeddings](#text-embeddings)
|
|
24
|
+
- [Translation](#translation)
|
|
25
|
+
- [Common Mistakes](#common-mistakes)
|
|
26
|
+
- [Review Checklist](#review-checklist)
|
|
27
|
+
- [References](#references)
|
|
28
|
+
|
|
29
|
+
## Setup
|
|
30
|
+
|
|
31
|
+
Import `NaturalLanguage` for text analysis and `Translation` for language
|
|
32
|
+
translation. No special entitlements or capabilities are required for
|
|
33
|
+
NaturalLanguage. Translation requires iOS 17.4+ / macOS 14.4+.
|
|
34
|
+
|
|
35
|
+
```swift
|
|
36
|
+
import NaturalLanguage
|
|
37
|
+
import Translation
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
NaturalLanguage classes (`NLTokenizer`, `NLTagger`) are **not thread-safe**.
|
|
41
|
+
Use each instance from one thread or dispatch queue at a time.
|
|
42
|
+
|
|
43
|
+
## Tokenization
|
|
44
|
+
|
|
45
|
+
Segment text into words, sentences, or paragraphs with `NLTokenizer`.
|
|
46
|
+
|
|
47
|
+
```swift
|
|
48
|
+
import NaturalLanguage
|
|
49
|
+
|
|
50
|
+
func tokenizeWords(in text: String) -> [String] {
|
|
51
|
+
let tokenizer = NLTokenizer(unit: .word)
|
|
52
|
+
tokenizer.string = text
|
|
53
|
+
|
|
54
|
+
let range = text.startIndex..<text.endIndex
|
|
55
|
+
return tokenizer.tokens(for: range).map { String(text[$0]) }
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Token Units
|
|
60
|
+
|
|
61
|
+
| Unit | Description |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `.word` | Individual words |
|
|
64
|
+
| `.sentence` | Sentences |
|
|
65
|
+
| `.paragraph` | Paragraphs |
|
|
66
|
+
| `.document` | Entire document |
|
|
67
|
+
|
|
68
|
+
### Enumerating with Attributes
|
|
69
|
+
|
|
70
|
+
Use `enumerateTokens(in:using:)` to detect numeric or emoji tokens.
|
|
71
|
+
|
|
72
|
+
```swift
|
|
73
|
+
let tokenizer = NLTokenizer(unit: .word)
|
|
74
|
+
tokenizer.string = text
|
|
75
|
+
|
|
76
|
+
tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, attributes in
|
|
77
|
+
if attributes.contains(.numeric) {
|
|
78
|
+
print("Number: \(text[range])")
|
|
79
|
+
}
|
|
80
|
+
return true // continue enumeration
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Language Identification
|
|
85
|
+
|
|
86
|
+
Detect the dominant language of a string with `NLLanguageRecognizer`.
|
|
87
|
+
|
|
88
|
+
```swift
|
|
89
|
+
func detectLanguage(for text: String) -> NLLanguage? {
|
|
90
|
+
NLLanguageRecognizer.dominantLanguage(for: text)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Multiple hypotheses with confidence scores
|
|
94
|
+
func languageHypotheses(for text: String, max: Int = 5) -> [NLLanguage: Double] {
|
|
95
|
+
let recognizer = NLLanguageRecognizer()
|
|
96
|
+
recognizer.processString(text)
|
|
97
|
+
return recognizer.languageHypotheses(withMaximum: max)
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Constrain the recognizer to expected languages for better accuracy on short text.
|
|
102
|
+
|
|
103
|
+
```swift
|
|
104
|
+
let recognizer = NLLanguageRecognizer()
|
|
105
|
+
recognizer.languageConstraints = [.english, .french, .spanish]
|
|
106
|
+
recognizer.processString(text)
|
|
107
|
+
let detected = recognizer.dominantLanguage
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Part-of-Speech Tagging
|
|
111
|
+
|
|
112
|
+
Identify nouns, verbs, adjectives, and other lexical classes with `NLTagger`.
|
|
113
|
+
|
|
114
|
+
```swift
|
|
115
|
+
func tagPartsOfSpeech(in text: String) -> [(String, NLTag)] {
|
|
116
|
+
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
117
|
+
tagger.string = text
|
|
118
|
+
|
|
119
|
+
var results: [(String, NLTag)] = []
|
|
120
|
+
let range = text.startIndex..<text.endIndex
|
|
121
|
+
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
|
|
122
|
+
|
|
123
|
+
tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
|
|
124
|
+
if let tag {
|
|
125
|
+
results.append((String(text[tokenRange]), tag))
|
|
126
|
+
}
|
|
127
|
+
return true
|
|
128
|
+
}
|
|
129
|
+
return results
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Common Tag Schemes
|
|
134
|
+
|
|
135
|
+
| Scheme | Output |
|
|
136
|
+
|---|---|
|
|
137
|
+
| `.lexicalClass` | Part of speech (noun, verb, adjective) |
|
|
138
|
+
| `.nameType` | Named entity type (person, place, organization) |
|
|
139
|
+
| `.nameTypeOrLexicalClass` | Combined NER + POS |
|
|
140
|
+
| `.lemma` | Base form of a word |
|
|
141
|
+
| `.language` | Per-token language |
|
|
142
|
+
| `.sentimentScore` | Sentiment polarity score |
|
|
143
|
+
|
|
144
|
+
## Named Entity Recognition
|
|
145
|
+
|
|
146
|
+
Extract people, places, and organizations.
|
|
147
|
+
|
|
148
|
+
```swift
|
|
149
|
+
func extractEntities(from text: String) -> [(String, NLTag)] {
|
|
150
|
+
let tagger = NLTagger(tagSchemes: [.nameType])
|
|
151
|
+
tagger.string = text
|
|
152
|
+
|
|
153
|
+
var entities: [(String, NLTag)] = []
|
|
154
|
+
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]
|
|
155
|
+
|
|
156
|
+
tagger.enumerateTags(
|
|
157
|
+
in: text.startIndex..<text.endIndex,
|
|
158
|
+
unit: .word,
|
|
159
|
+
scheme: .nameType,
|
|
160
|
+
options: options
|
|
161
|
+
) { tag, tokenRange in
|
|
162
|
+
if let tag, tag != .other {
|
|
163
|
+
entities.append((String(text[tokenRange]), tag))
|
|
164
|
+
}
|
|
165
|
+
return true
|
|
166
|
+
}
|
|
167
|
+
return entities
|
|
168
|
+
}
|
|
169
|
+
// NLTag values: .personalName, .placeName, .organizationName
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Sentiment Analysis
|
|
173
|
+
|
|
174
|
+
Score text sentiment from -1.0 (negative) to +1.0 (positive).
|
|
175
|
+
|
|
176
|
+
```swift
|
|
177
|
+
func sentimentScore(for text: String) -> Double? {
|
|
178
|
+
let tagger = NLTagger(tagSchemes: [.sentimentScore])
|
|
179
|
+
tagger.string = text
|
|
180
|
+
|
|
181
|
+
let (tag, _) = tagger.tag(
|
|
182
|
+
at: text.startIndex,
|
|
183
|
+
unit: .paragraph,
|
|
184
|
+
scheme: .sentimentScore
|
|
185
|
+
)
|
|
186
|
+
return tag.flatMap { Double($0.rawValue) }
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Text Embeddings
|
|
191
|
+
|
|
192
|
+
Measure semantic similarity between words or sentences with `NLEmbedding`.
|
|
193
|
+
|
|
194
|
+
```swift
|
|
195
|
+
func wordSimilarity(_ word1: String, _ word2: String) -> Double? {
|
|
196
|
+
guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return nil }
|
|
197
|
+
return embedding.distance(between: word1, and: word2, distanceType: .cosine)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
func findSimilarWords(to word: String, count: Int = 5) -> [(String, Double)] {
|
|
201
|
+
guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return [] }
|
|
202
|
+
return embedding.neighbors(for: word, maximumCount: count, distanceType: .cosine)
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Sentence embeddings compare entire sentences.
|
|
207
|
+
|
|
208
|
+
```swift
|
|
209
|
+
func sentenceSimilarity(_ s1: String, _ s2: String) -> Double? {
|
|
210
|
+
guard let embedding = NLEmbedding.sentenceEmbedding(for: .english) else { return nil }
|
|
211
|
+
return embedding.distance(between: s1, and: s2, distanceType: .cosine)
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Translation
|
|
216
|
+
|
|
217
|
+
### System Translation Overlay
|
|
218
|
+
|
|
219
|
+
Show the built-in translation UI with `.translationPresentation()`.
|
|
220
|
+
|
|
221
|
+
```swift
|
|
222
|
+
import SwiftUI
|
|
223
|
+
import Translation
|
|
224
|
+
|
|
225
|
+
struct TranslatableView: View {
|
|
226
|
+
@State private var showTranslation = false
|
|
227
|
+
let text = "Hello, how are you?"
|
|
228
|
+
|
|
229
|
+
var body: some View {
|
|
230
|
+
Text(text)
|
|
231
|
+
.onTapGesture { showTranslation = true }
|
|
232
|
+
.translationPresentation(
|
|
233
|
+
isPresented: $showTranslation,
|
|
234
|
+
text: text
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Programmatic Translation
|
|
241
|
+
|
|
242
|
+
Use `.translationTask()` for programmatic translations within a view context.
|
|
243
|
+
|
|
244
|
+
```swift
|
|
245
|
+
struct TranslatingView: View {
|
|
246
|
+
@State private var translatedText = ""
|
|
247
|
+
@State private var configuration: TranslationSession.Configuration?
|
|
248
|
+
|
|
249
|
+
var body: some View {
|
|
250
|
+
VStack {
|
|
251
|
+
Text(translatedText)
|
|
252
|
+
Button("Translate") {
|
|
253
|
+
configuration = .init(source: Locale.Language(identifier: "en"),
|
|
254
|
+
target: Locale.Language(identifier: "es"))
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
.translationTask(configuration) { session in
|
|
258
|
+
let response = try await session.translate("Hello, world!")
|
|
259
|
+
translatedText = response.targetText
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Batch Translation
|
|
266
|
+
|
|
267
|
+
Translate multiple strings in a single session.
|
|
268
|
+
|
|
269
|
+
```swift
|
|
270
|
+
.translationTask(configuration) { session in
|
|
271
|
+
let requests = texts.enumerated().map { index, text in
|
|
272
|
+
TranslationSession.Request(sourceText: text,
|
|
273
|
+
clientIdentifier: "\(index)")
|
|
274
|
+
}
|
|
275
|
+
let responses = try await session.translations(from: requests)
|
|
276
|
+
for response in responses {
|
|
277
|
+
print("\(response.sourceText) -> \(response.targetText)")
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Checking Language Availability
|
|
283
|
+
|
|
284
|
+
```swift
|
|
285
|
+
let availability = LanguageAvailability()
|
|
286
|
+
let status = await availability.status(
|
|
287
|
+
from: Locale.Language(identifier: "en"),
|
|
288
|
+
to: Locale.Language(identifier: "ja")
|
|
289
|
+
)
|
|
290
|
+
switch status {
|
|
291
|
+
case .installed: break // Ready to translate offline
|
|
292
|
+
case .supported: break // Needs download
|
|
293
|
+
case .unsupported: break // Language pair not available
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Common Mistakes
|
|
298
|
+
|
|
299
|
+
### DON'T: Share NLTagger/NLTokenizer across threads
|
|
300
|
+
|
|
301
|
+
These classes are not thread-safe and will produce incorrect results or crash.
|
|
302
|
+
|
|
303
|
+
```swift
|
|
304
|
+
// WRONG
|
|
305
|
+
let sharedTagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
306
|
+
DispatchQueue.concurrentPerform(iterations: 10) { _ in
|
|
307
|
+
sharedTagger.string = someText // Data race
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// CORRECT
|
|
311
|
+
await withTaskGroup(of: Void.self) { group in
|
|
312
|
+
for _ in 0..<10 {
|
|
313
|
+
group.addTask {
|
|
314
|
+
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
315
|
+
tagger.string = someText
|
|
316
|
+
// process...
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### DON'T: Confuse NaturalLanguage with Core ML
|
|
323
|
+
|
|
324
|
+
NaturalLanguage provides built-in linguistic analysis. Use Core ML for custom
|
|
325
|
+
trained models. They complement each other via `NLModel`.
|
|
326
|
+
|
|
327
|
+
```swift
|
|
328
|
+
// WRONG: Trying to do NER with raw Core ML
|
|
329
|
+
let coreMLModel = try MLModel(contentsOf: modelURL)
|
|
330
|
+
|
|
331
|
+
// CORRECT: Use NLTagger for built-in NER
|
|
332
|
+
let tagger = NLTagger(tagSchemes: [.nameType])
|
|
333
|
+
|
|
334
|
+
// Or load a custom Core ML model via NLModel
|
|
335
|
+
let nlModel = try NLModel(mlModel: coreMLModel)
|
|
336
|
+
tagger.setModels([nlModel], forTagScheme: .nameType)
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### DON'T: Assume embeddings exist for all languages
|
|
340
|
+
|
|
341
|
+
Not all languages have word or sentence embeddings available on device.
|
|
342
|
+
|
|
343
|
+
```swift
|
|
344
|
+
// WRONG: Force unwrap
|
|
345
|
+
let embedding = NLEmbedding.wordEmbedding(for: .japanese)!
|
|
346
|
+
|
|
347
|
+
// CORRECT: Handle nil
|
|
348
|
+
guard let embedding = NLEmbedding.wordEmbedding(for: .japanese) else {
|
|
349
|
+
// Embedding not available for this language
|
|
350
|
+
return
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### DON'T: Create a new tagger per token
|
|
355
|
+
|
|
356
|
+
Creating and configuring a tagger is expensive. Reuse it for the same text.
|
|
357
|
+
|
|
358
|
+
```swift
|
|
359
|
+
// WRONG: New tagger per word
|
|
360
|
+
for word in words {
|
|
361
|
+
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
362
|
+
tagger.string = word
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// CORRECT: Set string once, enumerate
|
|
366
|
+
let tagger = NLTagger(tagSchemes: [.lexicalClass])
|
|
367
|
+
tagger.string = fullText
|
|
368
|
+
tagger.enumerateTags(in: fullText.startIndex..<fullText.endIndex,
|
|
369
|
+
unit: .word, scheme: .lexicalClass, options: []) { tag, range in
|
|
370
|
+
return true
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### DON'T: Ignore language hints for short text
|
|
375
|
+
|
|
376
|
+
Language detection on short strings (under ~20 characters) is unreliable.
|
|
377
|
+
Set constraints or hints to improve accuracy.
|
|
378
|
+
|
|
379
|
+
```swift
|
|
380
|
+
// WRONG: Detect language of a single word
|
|
381
|
+
let lang = NLLanguageRecognizer.dominantLanguage(for: "chat") // French or English?
|
|
382
|
+
|
|
383
|
+
// CORRECT: Provide context
|
|
384
|
+
let recognizer = NLLanguageRecognizer()
|
|
385
|
+
recognizer.languageHints = [.english: 0.8, .french: 0.2]
|
|
386
|
+
recognizer.processString("chat")
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Review Checklist
|
|
390
|
+
|
|
391
|
+
- [ ] `NLTokenizer` and `NLTagger` instances used from a single thread
|
|
392
|
+
- [ ] Tagger created once per text, not per token
|
|
393
|
+
- [ ] Language detection uses constraints/hints for short text
|
|
394
|
+
- [ ] `NLEmbedding` availability checked before use (returns nil if unavailable)
|
|
395
|
+
- [ ] Translation `LanguageAvailability` checked before attempting translation
|
|
396
|
+
- [ ] `.translationTask()` used within a SwiftUI view hierarchy
|
|
397
|
+
- [ ] Batch translation uses `clientIdentifier` to match responses to requests
|
|
398
|
+
- [ ] Sentiment scores handled as optional (may return nil for unsupported languages)
|
|
399
|
+
- [ ] `.joinNames` option used with NER to keep multi-word names together
|
|
400
|
+
- [ ] Custom ML models loaded via `NLModel`, not raw Core ML
|
|
401
|
+
|
|
402
|
+
## References
|
|
403
|
+
|
|
404
|
+
- Extended patterns (custom models, contextual embeddings, gazetteers): `references/translation-patterns.md`
|
|
405
|
+
- [Natural Language framework](https://sosumi.ai/documentation/naturallanguage)
|
|
406
|
+
- [NLTokenizer](https://sosumi.ai/documentation/naturallanguage/nltokenizer)
|
|
407
|
+
- [NLTagger](https://sosumi.ai/documentation/naturallanguage/nltagger)
|
|
408
|
+
- [NLEmbedding](https://sosumi.ai/documentation/naturallanguage/nlembedding)
|
|
409
|
+
- [NLLanguageRecognizer](https://sosumi.ai/documentation/naturallanguage/nllanguagerecognizer)
|
|
410
|
+
- [Translation framework](https://sosumi.ai/documentation/translation)
|
|
411
|
+
- [TranslationSession](https://sosumi.ai/documentation/translation/translationsession)
|
|
412
|
+
- [LanguageAvailability](https://sosumi.ai/documentation/translation/languageavailability)
|