@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1
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/CHANGELOG.md +21 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +285 -285
- package/package.json +3 -3
- package/pipeline/lib/redact.mjs +3 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/scripts/gen-skills-index.mjs +13 -1
- package/pipeline/scripts/pre-commit-check.sh +4 -0
- package/pipeline/skills/.skill-manifest.json +69 -69
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
- package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
- package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -25,6 +25,8 @@ import urllib.error
|
|
|
25
25
|
import urllib.parse
|
|
26
26
|
import urllib.request
|
|
27
27
|
|
|
28
|
+
from _shared import slug
|
|
29
|
+
|
|
28
30
|
API = "https://api.figma.com/v1"
|
|
29
31
|
SEP = "[:\\-\u2013]"
|
|
30
32
|
TR_RE = re.compile("^(?:tr|tr[kc]e|t[\u00fcu]rk[\u00e7c]e)\\s*" + SEP + "\\s*(.+)$", re.IGNORECASE)
|
|
@@ -40,9 +42,10 @@ RIGHT_MARGIN = 40
|
|
|
40
42
|
PINK = "#EC1E91"
|
|
41
43
|
GRAY = "#9aa0a6"
|
|
42
44
|
BACKGROUND = "#1e1e1e"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
LABELS = {
|
|
46
|
+
"en": {"cms": "CMS copy", "pending": "Awaiting copy", "unmatched": "(unmatched)"},
|
|
47
|
+
"tr": {"cms": "\u0130\u00e7erik (CMS)", "pending": "\u00d6neri bekleniyor", "unmatched": "(e\u015fle\u015fmedi)"},
|
|
48
|
+
}
|
|
46
49
|
|
|
47
50
|
PAGE_OPEN = "<!doctype html><html><head>"
|
|
48
51
|
META_UTF8 = '<meta charset="utf-8">'
|
|
@@ -60,13 +63,12 @@ PATH_CHROMES = (
|
|
|
60
63
|
)
|
|
61
64
|
|
|
62
65
|
|
|
63
|
-
|
|
64
|
-
return str(node_id or "").strip().replace("-", ":")
|
|
66
|
+
URL_NODE_ID = re.compile(r"^\d+-\d+$")
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
-
return
|
|
69
|
+
def canon_id(node_id):
|
|
70
|
+
text = str(node_id or "").strip()
|
|
71
|
+
return text.replace("-", ":") if URL_NODE_ID.match(text) else text
|
|
70
72
|
|
|
71
73
|
|
|
72
74
|
def split_lang(text):
|
|
@@ -248,7 +250,7 @@ def page_from_rest(file_key, node_id, scale, token, ca_file):
|
|
|
248
250
|
}
|
|
249
251
|
|
|
250
252
|
|
|
251
|
-
def build_cards(page, rows):
|
|
253
|
+
def build_cards(page, rows, labels):
|
|
252
254
|
index = build_index(rows)
|
|
253
255
|
cards = []
|
|
254
256
|
taken = set()
|
|
@@ -273,7 +275,7 @@ def build_cards(page, rows):
|
|
|
273
275
|
box = {axis: float(node.get(axis, 0)) for axis in ("x", "y", "w", "h")}
|
|
274
276
|
cards.append({
|
|
275
277
|
"num": number,
|
|
276
|
-
"key": new_key or
|
|
278
|
+
"key": new_key or labels["unmatched"],
|
|
277
279
|
"tr": tr,
|
|
278
280
|
"en": en,
|
|
279
281
|
"text": node.get("characters") or "",
|
|
@@ -302,9 +304,9 @@ def chip(kind, colour, content):
|
|
|
302
304
|
return f'<span class="{kind}" style="background:{colour}">{content}</span>'
|
|
303
305
|
|
|
304
306
|
|
|
305
|
-
def card_html(card, left):
|
|
307
|
+
def card_html(card, left, labels):
|
|
306
308
|
colour = PINK if card["annotated"] else GRAY
|
|
307
|
-
pill =
|
|
309
|
+
pill = labels["cms"] if card["annotated"] else labels["pending"]
|
|
308
310
|
if card["annotated"]:
|
|
309
311
|
body = "".join(
|
|
310
312
|
f'<div class="line"><b>{label}</b> {html.escape(card[lang] or "-")}</div>'
|
|
@@ -336,7 +338,7 @@ def connector(card, lane, lane_count, start_x, target_x, from_left):
|
|
|
336
338
|
)
|
|
337
339
|
|
|
338
340
|
|
|
339
|
-
def build_html(page, cards):
|
|
341
|
+
def build_html(page, cards, labels):
|
|
340
342
|
fw, fh = page["frame"]["w"], page["frame"]["h"]
|
|
341
343
|
sides = {"left": [], "right": []}
|
|
342
344
|
for card in cards:
|
|
@@ -350,7 +352,7 @@ def build_html(page, cards):
|
|
|
350
352
|
for card_x, group in ((COLUMN_X, sides["left"]), (right_x, sides["right"])):
|
|
351
353
|
from_left = card_x == COLUMN_X
|
|
352
354
|
for lane, card in enumerate(group):
|
|
353
|
-
boxes.append(card_html(card, card_x))
|
|
355
|
+
boxes.append(card_html(card, card_x, labels))
|
|
354
356
|
if from_left:
|
|
355
357
|
wire = connector(card, lane, len(group), COLUMN_X + CARD_W, screen_x + card["x"], True)
|
|
356
358
|
else:
|
|
@@ -430,12 +432,26 @@ def chrome_screenshot(chrome, html_text, out_png, width, height, scale):
|
|
|
430
432
|
raise RuntimeError((log.read() or "no output").strip()[-300:])
|
|
431
433
|
|
|
432
434
|
|
|
435
|
+
def is_number(value):
|
|
436
|
+
try:
|
|
437
|
+
float(value)
|
|
438
|
+
except (TypeError, ValueError):
|
|
439
|
+
return False
|
|
440
|
+
return True
|
|
441
|
+
|
|
442
|
+
|
|
433
443
|
def load_spec_pages(path):
|
|
434
444
|
with open(path, encoding="utf-8") as stream:
|
|
435
445
|
spec = json.load(stream)
|
|
436
446
|
folder = os.path.dirname(os.path.abspath(path))
|
|
437
447
|
pages = spec.get("pages") or []
|
|
438
|
-
for page in pages:
|
|
448
|
+
for number, page in enumerate(pages, 1):
|
|
449
|
+
frame = page.get("frame") if isinstance(page, dict) else None
|
|
450
|
+
if not (isinstance(frame, dict) and all(is_number(frame.get(side)) for side in ("w", "h"))):
|
|
451
|
+
sys.exit(f"{path}: page {number} needs \"frame\": {{\"w\": <width>, \"h\": <height>}} in px")
|
|
452
|
+
for side in ("w", "h"):
|
|
453
|
+
if not isinstance(frame[side], (int, float)):
|
|
454
|
+
frame[side] = float(frame[side])
|
|
439
455
|
page["image"] = image_source(page.get("image"), folder)
|
|
440
456
|
return spec, pages
|
|
441
457
|
|
|
@@ -445,7 +461,7 @@ def split_nodes(flag, mapping):
|
|
|
445
461
|
return given or list(mapping.get("figmaNodes") or [])
|
|
446
462
|
|
|
447
463
|
|
|
448
|
-
def
|
|
464
|
+
def build_cli():
|
|
449
465
|
cli = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
|
450
466
|
cli.add_argument("--mapping", required=True, help="the reuse-map JSON")
|
|
451
467
|
cli.add_argument("--spec", help="geometry from MCP or measured by hand: {fileKey, pages:[{nodeId, image, frame, nodes}]}")
|
|
@@ -456,7 +472,14 @@ def main():
|
|
|
456
472
|
cli.add_argument("--ca-file", help="PEM roots to trust when a proxy intercepts TLS")
|
|
457
473
|
cli.add_argument("--out", dest="target_dir", default=".", help="folder that receives the generated files")
|
|
458
474
|
cli.add_argument("--slug", help="stem for the file names; derived from the screen name when omitted")
|
|
475
|
+
cli.add_argument("--ui-lang", choices=sorted(LABELS), default="en", help="language of the card labels")
|
|
476
|
+
return cli
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
def main():
|
|
480
|
+
cli = build_cli()
|
|
459
481
|
opts = cli.parse_args()
|
|
482
|
+
labels = LABELS[opts.ui_lang]
|
|
460
483
|
|
|
461
484
|
with open(opts.mapping, encoding="utf-8") as stream:
|
|
462
485
|
mapping = json.load(stream)
|
|
@@ -467,6 +490,9 @@ def main():
|
|
|
467
490
|
if not pages:
|
|
468
491
|
sys.exit("--spec lists no pages")
|
|
469
492
|
page = pages[0]
|
|
493
|
+
if len(pages) > 1:
|
|
494
|
+
print(f"# warning: {len(pages) - 1} extra page(s) in --spec ignored; the overlay draws the first page only "
|
|
495
|
+
"(render-key-shots.py reads every page)", file=sys.stderr)
|
|
470
496
|
file_key = spec.get("fileKey") or mapping.get("figmaFileKey")
|
|
471
497
|
else:
|
|
472
498
|
file_key = opts.file or mapping.get("figmaFileKey")
|
|
@@ -479,8 +505,8 @@ def main():
|
|
|
479
505
|
"Without one, measure the boxes on the screenshot and hand them over with --spec.")
|
|
480
506
|
page = page_from_rest(file_key, canon_id(nodes[0]), opts.scale, token, opts.ca_file)
|
|
481
507
|
|
|
482
|
-
cards = build_cards(page, mapping.get("rows") or [])
|
|
483
|
-
document, width, height = build_html(page, cards)
|
|
508
|
+
cards = build_cards(page, mapping.get("rows") or [], labels)
|
|
509
|
+
document, width, height = build_html(page, cards, labels)
|
|
484
510
|
os.makedirs(opts.target_dir, exist_ok=True)
|
|
485
511
|
|
|
486
512
|
def output(suffix):
|
package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py
CHANGED
|
@@ -13,7 +13,8 @@ import plistlib
|
|
|
13
13
|
import sys
|
|
14
14
|
import urllib.request
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
from _shared import LANGS as ALL_LANGS
|
|
17
|
+
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
def split_csv(value):
|
|
@@ -149,6 +150,8 @@ def main():
|
|
|
149
150
|
|
|
150
151
|
keys = split_csv(args.keys)
|
|
151
152
|
langs = parse_langs(args.langs)
|
|
153
|
+
if not (args.snapshot_root or args.plist_root or args.endpoint):
|
|
154
|
+
sys.exit("no source given: pass --snapshot-root, --plist-root, or --live with --endpoint")
|
|
152
155
|
|
|
153
156
|
if args.snapshot_root and not args.live:
|
|
154
157
|
result = from_snapshot(args.snapshot_root, keys, langs, args.prefix)
|
|
@@ -165,7 +168,7 @@ def main():
|
|
|
165
168
|
elif args.plist_root:
|
|
166
169
|
result = from_plist(args.plist_root, keys, langs, args.prefix)
|
|
167
170
|
else:
|
|
168
|
-
|
|
171
|
+
sys.exit("no --snapshot-root or --plist-root to fall back on")
|
|
169
172
|
|
|
170
173
|
json.dump(result, sys.stdout, indent=2, ensure_ascii=False)
|
|
171
174
|
sys.stdout.write("\n")
|
package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py
CHANGED
|
@@ -11,7 +11,8 @@ import json
|
|
|
11
11
|
import os
|
|
12
12
|
import sys
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
from _shared import LANGS as ALL_LANGS, normalize_key
|
|
15
|
+
|
|
15
16
|
|
|
16
17
|
DOMAIN_DIRS = {
|
|
17
18
|
"localization": ("Suggested", "LocalizationStrings"),
|
|
@@ -25,10 +26,6 @@ def parse_langs(value):
|
|
|
25
26
|
return [part.strip() for part in value.split(",") if part.strip()]
|
|
26
27
|
|
|
27
28
|
|
|
28
|
-
def normalize_key(key):
|
|
29
|
-
return ".".join(seg[:1].upper() + seg[1:] for seg in key.split("."))
|
|
30
|
-
|
|
31
|
-
|
|
32
29
|
def read_keys(opts):
|
|
33
30
|
raw = [piece.strip() for piece in opts.keys.split(",")] if opts.keys else []
|
|
34
31
|
if opts.keys_file:
|
|
@@ -85,12 +82,14 @@ def read_suggested(path, langs):
|
|
|
85
82
|
|
|
86
83
|
|
|
87
84
|
def from_catalog(catalog, key, langs):
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
85
|
+
for candidate in dict.fromkeys((key, normalize_key(key))):
|
|
86
|
+
entry = catalog.get(candidate)
|
|
87
|
+
if not isinstance(entry, dict):
|
|
88
|
+
continue
|
|
89
|
+
values = {lang: entry.get(lang) for lang in langs}
|
|
90
|
+
if any(value is not None for value in values.values()):
|
|
91
|
+
return values
|
|
92
|
+
return None
|
|
94
93
|
|
|
95
94
|
|
|
96
95
|
def main():
|
|
@@ -13,22 +13,17 @@ import os
|
|
|
13
13
|
import re
|
|
14
14
|
import sys
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
from _shared import IDENT, WEB_DOLLAR_T, WEB_T, WORD, is_interpolated, lsk_keys, source_files
|
|
17
|
+
|
|
17
18
|
ANDROID = {".kt", ".kts", ".xml"}
|
|
18
19
|
WEB = {".ts", ".tsx", ".js", ".jsx", ".vue"}
|
|
19
|
-
SKIP_PARTS = ("/.git", "/Generated/")
|
|
20
20
|
|
|
21
21
|
ERROR_WORDS = ("toast", "snackbar", "alert", "warning", "failure", "exception", "showerror", "errormessage", "error", "validat")
|
|
22
22
|
ERROR_CONTEXT = re.compile("|".join(ERROR_WORDS), re.IGNORECASE)
|
|
23
23
|
|
|
24
|
-
WORD = "A-Za-z0-9_"
|
|
25
|
-
IDENT = rf"[A-Za-z_][{WORD}]*"
|
|
26
|
-
LSK = re.compile(rf"LocalizationStringKey((?:\.{IDENT}){{2,}})")
|
|
27
24
|
LITERAL_LOCALIZED = re.compile(r"\"([^\"\\\n]+)\"\.localized\b")
|
|
28
25
|
R_STRING = re.compile(rf"\bR\.string\.([{WORD}]+)")
|
|
29
26
|
XML_STRING = re.compile(rf"@string/([{WORD}.]+)")
|
|
30
|
-
WEB_T = re.compile(r"(?<![\w$])t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
|
|
31
|
-
WEB_DOLLAR_T = re.compile(r"\$t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
|
|
32
27
|
WEB_T_DYNAMIC = re.compile(r"(?<![\w$])t\(\s*[`$A-Za-z_]")
|
|
33
28
|
WEB_DOLLAR_T_DYNAMIC = re.compile(r"\$t\(\s*[`$A-Za-z_]")
|
|
34
29
|
LSK_DYNAMIC = re.compile(r"LocalizationStringKey\(")
|
|
@@ -38,13 +33,6 @@ INTERPOLATED_LOCALIZED = re.compile(r"\"([^\"\n]*(?:\\\(|\$\{|\$[A-Za-z_])[^\"\n
|
|
|
38
33
|
RECEIVER_LOCALIZED = re.compile(rf"(?<![\w.\"])({IDENT}(?:\.{IDENT})*)\.localized\b")
|
|
39
34
|
|
|
40
35
|
|
|
41
|
-
def strip_accessor(chain):
|
|
42
|
-
segments = chain.strip(".").split(".")
|
|
43
|
-
while segments and segments[-1].startswith("localized"):
|
|
44
|
-
segments.pop()
|
|
45
|
-
return ".".join(segments)
|
|
46
|
-
|
|
47
|
-
|
|
48
36
|
def platform_of(path):
|
|
49
37
|
ext = os.path.splitext(path)[1]
|
|
50
38
|
if ext in ANDROID:
|
|
@@ -54,20 +42,6 @@ def platform_of(path):
|
|
|
54
42
|
return "ios"
|
|
55
43
|
|
|
56
44
|
|
|
57
|
-
def source_files(root):
|
|
58
|
-
if os.path.isfile(root):
|
|
59
|
-
yield root
|
|
60
|
-
return
|
|
61
|
-
for current, dirs, files in os.walk(root):
|
|
62
|
-
probe = current.replace(os.sep, "/") + "/"
|
|
63
|
-
if any(part in probe for part in SKIP_PARTS):
|
|
64
|
-
dirs[:] = []
|
|
65
|
-
continue
|
|
66
|
-
for name in sorted(files):
|
|
67
|
-
if os.path.splitext(name)[1] in EXTENSIONS:
|
|
68
|
-
yield os.path.join(current, name)
|
|
69
|
-
|
|
70
|
-
|
|
71
45
|
def hits_in_line(line, ext):
|
|
72
46
|
static, dynamic = [], []
|
|
73
47
|
if ext == ".xml":
|
|
@@ -81,11 +55,8 @@ def hits_in_line(line, ext):
|
|
|
81
55
|
if WEB_DOLLAR_T_DYNAMIC.search(line):
|
|
82
56
|
dynamic.append("(dynamic: $t(...))")
|
|
83
57
|
return static, dynamic
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if key.count(".") >= 1:
|
|
87
|
-
static.append(key)
|
|
88
|
-
static.extend(m.group(1) for m in LITERAL_LOCALIZED.finditer(line))
|
|
58
|
+
static.extend(lsk_keys(line))
|
|
59
|
+
static.extend(m.group(1) for m in LITERAL_LOCALIZED.finditer(line) if not is_interpolated(m.group(1)))
|
|
89
60
|
static.extend(m.group(1) for m in R_STRING.finditer(line))
|
|
90
61
|
if LSK_DYNAMIC.search(line):
|
|
91
62
|
dynamic.append("(dynamic: LocalizationStringKey(...))")
|
|
@@ -11,42 +11,10 @@ import os
|
|
|
11
11
|
import re
|
|
12
12
|
import sys
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
LSK = re.compile(rf"LocalizationStringKey((?:\.[A-Za-z_][{WORD}]*)+)")
|
|
19
|
-
LITERAL_LOCALIZED = re.compile(rf"\"([{WORD}.]+)\"\.localized\b")
|
|
20
|
-
WEB_T = re.compile(r"(?<![\w$])t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
|
|
21
|
-
WEB_DOLLAR_T = re.compile(r"\$t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
|
|
22
|
-
TRAILING_MARKER = re.compile(r"\s*\([^()]*\)\s*$")
|
|
23
|
-
COMPONENT_MARKER = re.compile(r"\([^)]*(owned by|bile\u015fen|component)[^)]*\)", re.IGNORECASE)
|
|
24
|
-
PLACEHOLDER = re.compile(r"<[^<>]+>")
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def strip_accessor(chain):
|
|
28
|
-
segments = chain.strip(".").split(".")
|
|
29
|
-
while segments and segments[-1].startswith("localized"):
|
|
30
|
-
segments.pop()
|
|
31
|
-
return ".".join(segments)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def normalize_key(key):
|
|
35
|
-
return ".".join(seg[:1].upper() + seg[1:] for seg in key.split("."))
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def source_files(root):
|
|
39
|
-
if os.path.isfile(root):
|
|
40
|
-
yield root
|
|
41
|
-
return
|
|
42
|
-
for current, dirs, files in os.walk(root):
|
|
43
|
-
probe = current.replace(os.sep, "/") + "/"
|
|
44
|
-
if any(part in probe for part in SKIP_PARTS):
|
|
45
|
-
dirs[:] = []
|
|
46
|
-
continue
|
|
47
|
-
for name in sorted(files):
|
|
48
|
-
if os.path.splitext(name)[1] in EXTENSIONS:
|
|
49
|
-
yield os.path.join(current, name)
|
|
14
|
+
from _shared import (
|
|
15
|
+
LITERAL_KEY, WEB_DOLLAR_T, WEB_T, clean_key, is_component, is_dynamic, lsk_keys, normalize_key, raw_key,
|
|
16
|
+
source_files,
|
|
17
|
+
)
|
|
50
18
|
|
|
51
19
|
|
|
52
20
|
def scan_code(root):
|
|
@@ -61,28 +29,14 @@ def scan_code(root):
|
|
|
61
29
|
continue
|
|
62
30
|
scanned += 1
|
|
63
31
|
corpus.append(text.lower())
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
for pattern, group in ((LITERAL_LOCALIZED, 1), (WEB_T, 2), (WEB_DOLLAR_T, 2)):
|
|
32
|
+
keys.update(key.lower() for key in lsk_keys(text))
|
|
33
|
+
for pattern, group in ((LITERAL_KEY, 1), (WEB_T, 2), (WEB_DOLLAR_T, 2)):
|
|
67
34
|
keys.update(hit.group(group).lower() for hit in pattern.finditer(text))
|
|
68
35
|
return keys, "\n".join(corpus), scanned
|
|
69
36
|
|
|
70
37
|
|
|
71
|
-
def
|
|
72
|
-
|
|
73
|
-
return bool(COMPONENT_MARKER.search(text))
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def is_dynamic(row, key):
|
|
77
|
-
element = str(row.get("element") or "").lower()
|
|
78
|
-
note = str(row.get("note") or "").lower()
|
|
79
|
-
return (
|
|
80
|
-
key.startswith("(dynamic")
|
|
81
|
-
or bool(PLACEHOLDER.search(key))
|
|
82
|
-
or "dinamik" in element
|
|
83
|
-
or "dynamic" in element
|
|
84
|
-
or "enumerate at runtime" in note
|
|
85
|
-
)
|
|
38
|
+
def filled(value):
|
|
39
|
+
return bool(str(value or "").strip())
|
|
86
40
|
|
|
87
41
|
|
|
88
42
|
def suggested_exists(root, key):
|
|
@@ -114,8 +68,7 @@ def main():
|
|
|
114
68
|
map_keys = set()
|
|
115
69
|
|
|
116
70
|
for row in rows:
|
|
117
|
-
|
|
118
|
-
key = raw_key if raw_key.startswith("(dynamic") else TRAILING_MARKER.sub("", raw_key)
|
|
71
|
+
key = clean_key(raw_key(row))
|
|
119
72
|
component = is_component(row)
|
|
120
73
|
dynamic = is_dynamic(row, key)
|
|
121
74
|
if key:
|
|
@@ -136,11 +89,11 @@ def main():
|
|
|
136
89
|
verdict = row.get("verdict")
|
|
137
90
|
new = row.get("new") or {}
|
|
138
91
|
legacy = row.get("legacy") or {}
|
|
139
|
-
if verdict != "new" and not new.get("tr") and not dynamic:
|
|
92
|
+
if verdict != "new" and not filled(new.get("tr")) and not dynamic:
|
|
140
93
|
gaps.append({"key": key, "issue": "new.tr empty"})
|
|
141
|
-
if verdict in ("reuse", "review") and not (legacy.get("en") or legacy.get("tr")):
|
|
94
|
+
if verdict in ("reuse", "review") and not (filled(legacy.get("en")) or filled(legacy.get("tr"))):
|
|
142
95
|
gaps.append({"key": key, "issue": f"verdict={verdict} but no legacy value"})
|
|
143
|
-
if new.get("tr") and new.get("tr") == new.get("en"):
|
|
96
|
+
if filled(new.get("tr")) and new.get("tr") == new.get("en"):
|
|
144
97
|
untranslated.append(key)
|
|
145
98
|
if args.resources_root and not component and not dynamic and key and not suggested_exists(args.resources_root, key):
|
|
146
99
|
gaps.append({"key": key, "issue": f"no Suggested/{normalize_key(key)}.json"})
|