pumuki 6.3.129 → 6.3.130

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.
Files changed (77) hide show
  1. package/AGENTS.md +16 -1
  2. package/CHANGELOG.md +9 -0
  3. package/README.md +14 -10
  4. package/VERSION +1 -1
  5. package/core/facts/detectors/text/android.test.ts +2583 -24
  6. package/core/facts/detectors/text/android.ts +4633 -34
  7. package/core/facts/detectors/typescript/index.test.ts +3639 -73
  8. package/core/facts/detectors/typescript/index.ts +4819 -270
  9. package/core/facts/extractHeuristicFacts.ts +271 -6
  10. package/core/rules/presets/heuristics/android.test.ts +314 -1
  11. package/core/rules/presets/heuristics/android.ts +1220 -50
  12. package/core/rules/presets/heuristics/typescript.test.ts +158 -2
  13. package/core/rules/presets/heuristics/typescript.ts +508 -0
  14. package/docs/README.md +3 -3
  15. package/docs/operations/RELEASE_NOTES.md +7 -1
  16. package/docs/operations/framework-menu-consumer-walkthrough.md +18 -15
  17. package/docs/product/API_REFERENCE.md +1 -1
  18. package/docs/product/USAGE.md +1 -1
  19. package/docs/validation/README.md +3 -1
  20. package/integrations/config/skillsCompilerTemplates.test.ts +131 -0
  21. package/integrations/config/skillsCompilerTemplates.ts +953 -7
  22. package/integrations/config/skillsDetectorRegistry.ts +451 -8
  23. package/integrations/config/skillsMarkdownRules.ts +884 -2
  24. package/integrations/evidence/buildEvidence.ts +29 -1
  25. package/integrations/evidence/platformSummary.test.ts +73 -9
  26. package/integrations/evidence/platformSummary.ts +165 -7
  27. package/integrations/evidence/repoState.ts +3 -0
  28. package/integrations/evidence/schema.ts +18 -0
  29. package/integrations/evidence/trackingContract.ts +17 -0
  30. package/integrations/evidence/writeEvidence.test.ts +3 -0
  31. package/integrations/evidence/writeEvidence.ts +29 -1
  32. package/integrations/gate/evaluateAiGate.ts +251 -8
  33. package/integrations/gate/governanceActionCatalog.ts +275 -0
  34. package/integrations/gate/remediationCatalog.ts +8 -0
  35. package/integrations/git/runPlatformGate.ts +9 -1
  36. package/integrations/lifecycle/adapter.ts +24 -0
  37. package/integrations/lifecycle/bootstrapManifest.ts +248 -0
  38. package/integrations/lifecycle/cliGovernanceConsole.ts +69 -0
  39. package/integrations/lifecycle/governanceNextAction.ts +171 -0
  40. package/integrations/lifecycle/governanceObservationSnapshot.ts +369 -0
  41. package/integrations/lifecycle/packageInfo.ts +118 -1
  42. package/integrations/lifecycle/state.ts +8 -1
  43. package/integrations/lifecycle/trackingState.ts +403 -0
  44. package/integrations/lifecycle/watch.ts +1 -1
  45. package/integrations/mcp/aiGateCheck.ts +194 -10
  46. package/integrations/mcp/alignedPlatformGate.ts +232 -0
  47. package/integrations/mcp/enterpriseServer.ts +19 -3
  48. package/integrations/mcp/preFlightCheck.ts +66 -3
  49. package/integrations/mcp/readMcpPrePushStdin.ts +7 -0
  50. package/package.json +1 -1
  51. package/scripts/build-ruralgo-s1-evidence-pack.ts +85 -0
  52. package/scripts/check-tracking-single-active.sh +1 -1
  53. package/scripts/framework-menu-advanced-view-lib.ts +49 -0
  54. package/scripts/framework-menu-consumer-actions-lib.ts +32 -32
  55. package/scripts/framework-menu-consumer-preflight-render.ts +10 -0
  56. package/scripts/framework-menu-consumer-preflight-run.ts +23 -0
  57. package/scripts/framework-menu-consumer-preflight-types.ts +12 -0
  58. package/scripts/framework-menu-consumer-runtime-actions.ts +11 -5
  59. package/scripts/framework-menu-consumer-runtime-audit.ts +0 -28
  60. package/scripts/framework-menu-consumer-runtime-evidence-classic.ts +118 -42
  61. package/scripts/framework-menu-consumer-runtime-lib.ts +38 -0
  62. package/scripts/framework-menu-consumer-runtime-menu.ts +55 -15
  63. package/scripts/framework-menu-consumer-runtime-types.ts +4 -0
  64. package/scripts/framework-menu-evidence-summary-read.ts +17 -1
  65. package/scripts/framework-menu-evidence-summary-types.ts +3 -0
  66. package/scripts/framework-menu-layout-data.ts +3 -23
  67. package/scripts/framework-menu-system-notifications-macos-applescript-dialog.ts +1 -1
  68. package/scripts/framework-menu-system-notifications-macos-dialog-payload.ts +14 -2
  69. package/scripts/framework-menu-system-notifications-macos-swift-source.ts +1 -1
  70. package/scripts/framework-menu-system-notifications-payloads-blocked.ts +128 -4
  71. package/scripts/framework-menu-system-notifications-payloads.ts +8 -1
  72. package/scripts/framework-menu-system-notifications-text.ts +7 -1
  73. package/scripts/framework-menu.ts +37 -2
  74. package/scripts/package-install-smoke-consumer-git-repo-lib.ts +10 -1
  75. package/scripts/package-install-smoke-consumer-npm-lib.ts +46 -9
  76. package/scripts/ruralgo-s1-evidence-pack-lib.ts +200 -0
  77. package/skills.lock.json +613 -698
@@ -147,12 +147,114 @@ const registryByRuleId: Record<string, SkillsDetectorBinding> = {
147
147
  'ios.core-data.nsmanagedobject-state-leak',
148
148
  ['heuristics.ios.core-data.nsmanagedobject-state-leak.ast']
149
149
  ),
150
+ 'skills.android.no-solid-violations': heuristicDetector('android.solid', [
151
+ 'heuristics.android.solid.srp.presentation-mixed-responsibilities.ast',
152
+ 'heuristics.android.solid.dip.concrete-framework-dependency.ast',
153
+ 'heuristics.android.solid.ocp.discriminator-branching.ast',
154
+ 'heuristics.android.solid.isp.fat-interface-dependency.ast',
155
+ 'heuristics.android.solid.lsp.narrowed-precondition.ast',
156
+ ]),
157
+ 'skills.android.enforce-clean-architecture': heuristicDetector('android.clean-architecture', [
158
+ 'heuristics.android.solid.srp.presentation-mixed-responsibilities.ast',
159
+ 'heuristics.android.solid.dip.concrete-framework-dependency.ast',
160
+ 'heuristics.android.solid.ocp.discriminator-branching.ast',
161
+ 'heuristics.android.solid.isp.fat-interface-dependency.ast',
162
+ 'heuristics.android.solid.lsp.narrowed-precondition.ast',
163
+ ]),
150
164
  'skills.backend.no-empty-catch': heuristicDetector('typescript.empty-catch', [
151
165
  'heuristics.ts.empty-catch.ast',
152
166
  ]),
153
167
  'skills.backend.no-console-log': heuristicDetector('typescript.console-log', [
154
168
  'heuristics.ts.console-log.ast',
155
169
  ]),
170
+ 'skills.backend.no-loggear-datos-sensibles-passwords-tokens-pii': heuristicDetector(
171
+ 'typescript.sensitive-log',
172
+ ['heuristics.ts.no-sensitive-log.ast']
173
+ ),
174
+ 'skills.backend.password-hashing-bcrypt-con-salt-rounds-10': heuristicDetector(
175
+ 'typescript.password-hashing',
176
+ ['heuristics.ts.password-hashing-bcrypt-salt-rounds-10.ast']
177
+ ),
178
+ 'skills.backend.guideline.backend.rate-limiting-nestjs-throttler-para-prevenir-brute-force':
179
+ heuristicDetector('typescript.rate-limiting-throttler', [
180
+ 'heuristics.ts.rate-limiting-throttler.ast',
181
+ ]),
182
+ 'skills.backend.guideline.backend.rate-limiting-throttler-para-prevenir-abuse':
183
+ heuristicDetector('typescript.rate-limiting-throttler', [
184
+ 'heuristics.ts.rate-limiting-throttler.ast',
185
+ ]),
186
+ 'skills.backend.guideline.backend.cors-configurado-solo-ori-genes-permitidos': heuristicDetector(
187
+ 'typescript.cors-configured',
188
+ ['heuristics.ts.cors-configured.ast']
189
+ ),
190
+ 'skills.backend.guideline.backend.cors-configurar-ori-genes-permitidos': heuristicDetector(
191
+ 'typescript.cors-configured',
192
+ ['heuristics.ts.cors-configured.ast']
193
+ ),
194
+ 'skills.backend.guideline.backend.pipes-para-validacio-n-global-validationpipe-en-main-ts':
195
+ heuristicDetector('typescript.validationpipe-global', [
196
+ 'heuristics.ts.validationpipe-global.ast',
197
+ ]),
198
+ 'skills.backend.guideline.backend.validationpipe-global-en-main-ts-con-whitelist-true':
199
+ heuristicDetector('typescript.validationpipe-global', [
200
+ 'heuristics.ts.validationpipe-global.ast',
201
+ ]),
202
+ 'skills.backend.guideline.backend.versionado-api-v1-api-v2':
203
+ heuristicDetector('typescript.versionado-api-v1-api-v2', [
204
+ 'heuristics.ts.versionado-api-v1-api-v2.ast',
205
+ ]),
206
+ 'skills.backend.guideline.backend.validation-de-config-joi-o-class-validator-para-env':
207
+ heuristicDetector('typescript.validation-config', ['heuristics.ts.validation-config.ast']),
208
+ 'skills.backend.guideline.backend.class-validator-decorators-isstring-isemail-min-max':
209
+ heuristicDetector('typescript.class-validator-decorators', [
210
+ 'heuristics.ts.class-validator-decorators.ast',
211
+ ]),
212
+ 'skills.backend.guideline.backend.class-transformer-transform-exclude-expose':
213
+ heuristicDetector('typescript.class-transformer-decorators', [
214
+ 'heuristics.ts.class-transformer-decorators.ast',
215
+ ]),
216
+ 'skills.backend.guideline.backend.input-validation-siempre-validar-con-dtos':
217
+ heuristicDetector('typescript.input-validation-siempre-validar-con-dtos', [
218
+ 'heuristics.ts.input-validation-siempre-validar-con-dtos.ast',
219
+ ]),
220
+ 'skills.backend.guideline.backend.nested-validation-validatenested-type':
221
+ heuristicDetector('typescript.nested-validation-validatenested-type', [
222
+ 'heuristics.ts.nested-validation-validatenested-type.ast',
223
+ ]),
224
+ 'skills.backend.guideline.backend.dtos-en-boundaries-validacio-n-en-entrada-salida':
225
+ heuristicDetector('typescript.dto-boundaries', [
226
+ 'heuristics.ts.dtos-en-boundaries-validacio-n-en-entrada-salida.ast',
227
+ ]),
228
+ 'skills.backend.guideline.backend.dtos-separados-createorderdto-updateorderdto-orderresponsedto':
229
+ heuristicDetector('typescript.dto-separated-contracts', [
230
+ 'heuristics.ts.dtos-separados-createorderdto-updateorderdto-orderresponsedto.ast',
231
+ ]),
232
+ 'skills.backend.guideline.backend.retornar-dtos-no-exponer-entidades-directamente':
233
+ heuristicDetector('typescript.return-dtos', [
234
+ 'heuristics.ts.return-dtos-no-exponer-entidades-directamente.ast',
235
+ ]),
236
+ 'skills.backend.guideline.backend.transacciones-para-operaciones-cri-ticas':
237
+ heuristicDetector('typescript.transactions', [
238
+ 'heuristics.ts.transacciones-para-operaciones-cri-ticas.ast',
239
+ ]),
240
+ 'skills.backend.guideline.backend.transacciones-para-operaciones-multi-tabla':
241
+ heuristicDetector('typescript.transactions', [
242
+ 'heuristics.ts.transacciones-para-operaciones-multi-tabla.ast',
243
+ ]),
244
+ 'skills.backend.guideline.backend.winston-logger-estructurado-json-logs': heuristicDetector(
245
+ 'typescript.winston-structured-json-logger',
246
+ ['heuristics.ts.winston-structured-json-logger.ast']
247
+ ),
248
+ 'skills.backend.guideline.backend.loggear-errores-con-contexto-completo': heuristicDetector(
249
+ 'typescript.error-logging-full-context',
250
+ ['heuristics.ts.error-logging-full-context.ast']
251
+ ),
252
+ 'skills.backend.guideline.backend.correlation-ids-para-tracing-distribuido': heuristicDetector(
253
+ 'typescript.correlation-ids',
254
+ ['heuristics.ts.correlation-ids.ast']
255
+ ),
256
+ 'skills.backend.guideline.backend.me-tricas-prometheus-prom-client-para-me-tricas':
257
+ heuristicDetector('typescript.prometheus-metrics', ['heuristics.ts.prometheus-prom-client.ast']),
156
258
  'skills.backend.avoid-explicit-any': heuristicDetector('typescript.explicit-any', [
157
259
  'heuristics.ts.explicit-any.ast',
158
260
  ]),
@@ -166,14 +268,69 @@ const registryByRuleId: Record<string, SkillsDetectorBinding> = {
166
268
  ]),
167
269
  'skills.backend.enforce-clean-architecture': heuristicDetector(
168
270
  'typescript.clean-architecture',
169
- [
170
- 'heuristics.ts.solid.dip.framework-import.ast',
171
- 'heuristics.ts.solid.dip.concrete-instantiation.ast',
172
- ]
271
+ ['heuristics.ts.clean-architecture.ast']
272
+ ),
273
+ 'skills.backend.mocks-en-produccio-n-solo-datos-reales': heuristicDetector(
274
+ 'typescript.production-mock',
275
+ ['heuristics.ts.production-mock.ast']
276
+ ),
277
+ 'skills.backend.exception-filters-catch-para-manejo-global': heuristicDetector(
278
+ 'typescript.exception-filter',
279
+ ['heuristics.ts.exception-filter.ast']
173
280
  ),
281
+ 'skills.backend.guards-para-autenticacio-n-autorizacio-n-useguards-jwtauthguard': heuristicDetector(
282
+ 'typescript.guard',
283
+ ['heuristics.ts.guards-useguards-jwtauthguard.ast']
284
+ ),
285
+ 'skills.backend.interceptors-para-logging-transformacio-n-no-en-cada-endpoint': heuristicDetector(
286
+ 'typescript.interceptor',
287
+ ['heuristics.ts.interceptors-useinterceptors-logging-transform.ast']
288
+ ),
289
+ 'skills.backend.no-singleton': heuristicDetector('typescript.singleton', [
290
+ 'heuristics.ts.singleton-pattern.ast',
291
+ ]),
292
+ 'skills.backend.magic-numbers-usar-constantes-con-nombres-descriptivos': heuristicDetector(
293
+ 'typescript.magic-numbers',
294
+ ['heuristics.ts.magic-numbers.ast']
295
+ ),
296
+ 'skills.backend.hardcoded-values-config-en-variables-de-entorno': heuristicDetector(
297
+ 'typescript.hardcoded-values',
298
+ ['heuristics.ts.hardcoded-values.ast']
299
+ ),
300
+ 'skills.backend.no-defaults-en-produccio-n-fallar-si-falta-config-cri-tica': heuristicDetector(
301
+ 'typescript.env-default-fallback',
302
+ ['heuristics.ts.env-default-fallback.ast']
303
+ ),
304
+ 'skills.backend.callback-hell-usar-async-await': heuristicDetector('typescript.callback-hell', [
305
+ 'heuristics.ts.callback-hell.ast',
306
+ ]),
174
307
  'skills.backend.no-god-classes': heuristicDetector('typescript.god-class', [
175
308
  'heuristics.ts.god-class-large-class.ast',
176
309
  ]),
310
+ 'skills.backend.guideline.backend.callback-hell-usar-async-await': heuristicDetector(
311
+ 'typescript.new-promise-async',
312
+ ['heuristics.ts.new-promise-async.ast']
313
+ ),
314
+ 'skills.backend.guideline.backend.try-catch-silenciosos-siempre-loggear-o-propagar':
315
+ heuristicDetector('typescript.empty-catch', ['heuristics.ts.empty-catch.ast']),
316
+ 'skills.backend.guideline.backend.hardcoded-values-config-en-variables-de-entorno':
317
+ heuristicDetector('typescript.hardcoded-secret-token', [
318
+ 'heuristics.ts.hardcoded-secret-token.ast',
319
+ ]),
320
+ 'skills.backend.guideline.backend.magic-numbers-usar-constantes-con-nombres-descriptivos':
321
+ heuristicDetector('typescript.magic-number', ['heuristics.ts.magic-number.ast']),
322
+ 'skills.backend.guideline.backend.mocks-en-produccion-usar-fakes-spies-de-test':
323
+ heuristicDetector('typescript.production-mock-artifact', [
324
+ 'heuristics.ts.production-mock-artifact.ast',
325
+ ]),
326
+ 'skills.backend.guideline.backend.anemic-domain-models-entidades-con-comportamiento':
327
+ heuristicDetector('typescript.anemic-domain-model', [
328
+ 'heuristics.ts.anemic-domain-model.ast',
329
+ ]),
330
+ 'skills.backend.guideline.backend.logica-en-controllers-mover-logica-de-negocio-a-casos-de-uso-servicios':
331
+ heuristicDetector('typescript.controller-business-logic', [
332
+ 'heuristics.ts.controller-business-logic.ast',
333
+ ]),
177
334
  'skills.frontend.no-empty-catch': heuristicDetector('typescript.empty-catch', [
178
335
  'heuristics.ts.empty-catch.ast',
179
336
  ]),
@@ -193,11 +350,17 @@ const registryByRuleId: Record<string, SkillsDetectorBinding> = {
193
350
  ]),
194
351
  'skills.frontend.enforce-clean-architecture': heuristicDetector(
195
352
  'typescript.clean-architecture',
196
- [
197
- 'heuristics.ts.solid.dip.framework-import.ast',
198
- 'heuristics.ts.solid.dip.concrete-instantiation.ast',
199
- ]
353
+ ['heuristics.ts.clean-architecture.ast']
200
354
  ),
355
+ 'skills.frontend.no-singleton': heuristicDetector('typescript.singleton', [
356
+ 'heuristics.ts.singleton-pattern.ast',
357
+ ]),
358
+ 'skills.frontend.callback-hell-usar-async-await': heuristicDetector('typescript.callback-hell', [
359
+ 'heuristics.ts.callback-hell.ast',
360
+ ]),
361
+ 'skills.frontend.no-class-components': heuristicDetector('typescript.react-class-component', [
362
+ 'heuristics.ts.react-class-component.ast',
363
+ ]),
201
364
  'skills.frontend.no-god-classes': heuristicDetector('typescript.god-class', [
202
365
  'heuristics.ts.god-class-large-class.ast',
203
366
  ]),
@@ -210,6 +373,118 @@ const registryByRuleId: Record<string, SkillsDetectorBinding> = {
210
373
  'skills.android.no-runblocking': heuristicDetector('android.run-blocking', [
211
374
  'heuristics.android.run-blocking.ast',
212
375
  ]),
376
+ 'skills.android.guideline.android.coroutines-async-await-no-callbacks': heuristicDetector(
377
+ 'android.coroutines-async-await-no-callbacks',
378
+ ['heuristics.android.coroutines-async-await-no-callbacks.ast']
379
+ ),
380
+ 'skills.android.guideline.android.async-await-paralelismo': heuristicDetector(
381
+ 'android.async-await-paralelismo',
382
+ ['heuristics.android.async-await-paralelismo.ast']
383
+ ),
384
+ 'skills.android.guideline.android.supervisorscope-errores-no-cancelan-otros-jobs': heuristicDetector(
385
+ 'android.supervisorscope-errores-no-cancelan-otros-jobs',
386
+ ['heuristics.android.supervisorscope-errores-no-cancelan-otros-jobs.ast']
387
+ ),
388
+ 'skills.android.guideline.android.suspend-functions-en-api-service': heuristicDetector(
389
+ 'android.suspend-functions-en-api-service',
390
+ ['heuristics.android.suspend-functions-en-api-service.ast']
391
+ ),
392
+ 'skills.android.guideline.android.suspend-functions-para-operaciones-async': heuristicDetector(
393
+ 'android.suspend-functions-para-operaciones-async',
394
+ ['heuristics.android.suspend-functions-para-operaciones-async.ast']
395
+ ),
396
+ 'skills.android.guideline.android.dao-data-access-objects-con-suspend-functions': heuristicDetector(
397
+ 'android.dao-data-access-objects-con-suspend-functions',
398
+ ['heuristics.android.dao-data-access-objects-con-suspend-functions.ast']
399
+ ),
400
+ 'skills.android.guideline.android.transaction-para-operaciones-multi-query': heuristicDetector(
401
+ 'android.transaction-para-operaciones-multi-query',
402
+ ['heuristics.android.transaction-para-operaciones-multi-query.ast']
403
+ ),
404
+ 'skills.android.guideline.android.stateflow-estado-mutable-observable': heuristicDetector(
405
+ 'android.stateflow-estado-mutable-observable',
406
+ ['heuristics.android.stateflow-estado-mutable-observable.ast']
407
+ ),
408
+ 'skills.android.guideline.android.sharedflow-hot-stream-puede-no-tener-valor-para-eventos':
409
+ heuristicDetector('android.sharedflow-hot-stream-puede-no-tener-valor-para-eventos', [
410
+ 'heuristics.android.sharedflow-hot-stream-puede-no-tener-valor-para-eventos.ast',
411
+ ]),
412
+ 'skills.android.guideline.android.flow-builders-flow-emit-flowof-asflow': heuristicDetector(
413
+ 'android.flow-builders-flow-emit-flowof-asflow',
414
+ ['heuristics.android.flow-builders-flow-emit-flowof-asflow.ast']
415
+ ),
416
+ 'skills.android.guideline.android.collect-terminal-operator-para-consumir-flow':
417
+ heuristicDetector('android.collect-terminal-operator-para-consumir-flow', [
418
+ 'heuristics.android.collect-terminal-operator-para-consumir-flow.ast',
419
+ ]),
420
+ 'skills.android.guideline.android.collect-as-state-consumir-flow-en-compose':
421
+ heuristicDetector('android.collect-as-state-consumir-flow-en-compose', [
422
+ 'heuristics.android.collect-as-state-consumir-flow-en-compose.ast',
423
+ ]),
424
+ 'skills.android.guideline.android.remember-evitar-recrear-objetos': heuristicDetector(
425
+ 'android.remember-evitar-recrear-objetos',
426
+ ['heuristics.android.remember-evitar-recrear-objetos.ast']
427
+ ),
428
+ 'skills.android.guideline.android.remember-para-mantener-estado-entre-recomposiciones':
429
+ heuristicDetector('android.remember-para-mantener-estado-entre-recomposiciones', [
430
+ 'heuristics.android.remember-para-mantener-estado-entre-recomposiciones.ast',
431
+ ]),
432
+ 'skills.android.guideline.android.derivedstateof-ca-lculos-caros-solo-cuando-cambia-input':
433
+ heuristicDetector('android.derivedstateof-ca-lculos-caros-solo-cuando-cambia-input', [
434
+ 'heuristics.android.derivedstateof-ca-lculos-caros-solo-cuando-cambia-input.ast',
435
+ ]),
436
+ 'skills.android.guideline.android.derivedstateof-ca-lculos-derivados-de-state': heuristicDetector(
437
+ 'android.derivedstateof-ca-lculos-derivados-de-state',
438
+ ['heuristics.android.derivedstateof-ca-lculos-derivados-de-state.ast']
439
+ ),
440
+ 'skills.android.guideline.android.launchedeffect-side-effects-con-lifecycle': heuristicDetector(
441
+ 'android.launchedeffect-side-effects-con-lifecycle',
442
+ ['heuristics.android.launchedeffect-side-effects-con-lifecycle.ast']
443
+ ),
444
+ 'skills.android.guideline.android.launchedeffect-keys-controlar-cuando-se-relanza-effect':
445
+ heuristicDetector('android.launchedeffect-keys-controlar-cuando-se-relanza-effect', [
446
+ 'heuristics.android.launchedeffect-keys-controlar-cuando-se-relanza-effect.ast',
447
+ ]),
448
+ 'skills.android.guideline.android.disposableeffect-cleanup-cuando-composable-sale-de-composicio-n':
449
+ heuristicDetector('android.disposableeffect-cleanup-cuando-composable-sale-de-composicio-n', [
450
+ 'heuristics.android.disposableeffect-cleanup-cuando-composable-sale-de-composicio-n.ast',
451
+ ]),
452
+ 'skills.android.guideline.android.preview-preview-para-ver-ui-sin-correr-app': heuristicDetector(
453
+ 'android.preview-preview-para-ver-ui-sin-correr-app',
454
+ ['heuristics.android.preview-preview-para-ver-ui-sin-correr-app.ast']
455
+ ),
456
+ 'skills.android.guideline.android.recomposition-composables-deben-ser-idempotentes':
457
+ heuristicDetector('android.recomposition-composables-deben-ser-idempotentes', [
458
+ 'heuristics.android.recomposition-composables-deben-ser-idempotentes.ast',
459
+ ]),
460
+ 'skills.android.guideline.android.uistate-sealed-class-loading-success-error-states':
461
+ heuristicDetector('android.uistate-sealed-class-loading-success-error-states', [
462
+ 'heuristics.android.uistate-sealed-class-loading-success-error-states.ast',
463
+ ]),
464
+ 'skills.android.guideline.android.use-cases-lo-gica-de-negocio-encapsulada': heuristicDetector(
465
+ 'android.use-cases-lo-gica-de-negocio-encapsulada',
466
+ ['heuristics.android.use-cases-lo-gica-de-negocio-encapsulada.ast']
467
+ ),
468
+ 'skills.android.guideline.android.repository-pattern-abstraer-acceso-a-datos': heuristicDetector(
469
+ 'android.repository-pattern-abstraer-acceso-a-datos',
470
+ ['heuristics.android.repository-pattern-abstraer-acceso-a-datos.ast']
471
+ ),
472
+ 'skills.android.guideline.android.repository-pattern-ordersrep': heuristicDetector(
473
+ 'android.repository-pattern-abstraer-acceso-a-datos',
474
+ ['heuristics.android.repository-pattern-abstraer-acceso-a-datos.ast']
475
+ ),
476
+ 'skills.android.guideline.android.app-startup-androidx-startup-para-lazy-init': heuristicDetector(
477
+ 'android.app-startup-androidx-startup-para-lazy-init',
478
+ ['heuristics.android.app-startup-androidx-startup-para-lazy-init.ast']
479
+ ),
480
+ 'skills.android.guideline.android.baseline-profiles-optimizacio-n-de-startup': heuristicDetector(
481
+ 'android.baseline-profiles-optimizacio-n-de-startup',
482
+ ['heuristics.android.baseline-profiles-optimizacio-n-de-startup.ast']
483
+ ),
484
+ 'skills.android.guideline.android.state-hoisting-elevar-estado-al-nivel-apropiado':
485
+ heuristicDetector('android.state-hoisting', [
486
+ 'heuristics.android.state-hoisting-elevar-estado-al-nivel-apropiado.ast',
487
+ ]),
213
488
  'skills.android.no-force-unwrap': heuristicDetector('android.force-unwrap', [
214
489
  'heuristics.android.force-unwrap.ast',
215
490
  ]),
@@ -235,13 +510,181 @@ const registryByRuleId: Record<string, SkillsDetectorBinding> = {
235
510
  'skills.android.no-console-log': heuristicDetector('android.no-console-log', [
236
511
  'heuristics.android.no-console-log.ast',
237
512
  ]),
513
+ 'skills.android.guideline.android.analytics-firebase-analytics-o-custom': heuristicDetector(
514
+ 'android.analytics-firebase-analytics-o-custom',
515
+ ['heuristics.android.analytics-firebase-analytics-o-custom.ast']
516
+ ),
517
+ 'skills.android.guideline.android.android-profiler-cpu-memory-network-profiling': heuristicDetector(
518
+ 'android.android-profiler-cpu-memory-network-profiling',
519
+ ['heuristics.android.android-profiler-cpu-memory-network-profiling.ast']
520
+ ),
521
+ 'skills.android.guideline.android.timber-logging-library': heuristicDetector(
522
+ 'android.timber-logging-library',
523
+ ['heuristics.android.timber-logging-library.ast']
524
+ ),
525
+ 'skills.android.guideline.android.touch-targets-mi-nimo-48dp': heuristicDetector(
526
+ 'android.touch-targets-mi-nimo-48dp',
527
+ ['heuristics.android.touch-targets-mi-nimo-48dp.ast']
528
+ ),
529
+ 'skills.android.guideline.android.buildconfig-constantes-en-tiempo-de-compilacio-n': heuristicDetector(
530
+ 'android.buildconfig-constantes-en-tiempo-de-compilacio-n',
531
+ ['heuristics.android.buildconfig-constantes-en-tiempo-de-compilacio-n.ast']
532
+ ),
238
533
  'skills.android.hardcoded-strings-usar-strings-xml': heuristicDetector('android.hardcoded-strings', [
239
534
  'heuristics.android.hardcoded-strings.ast',
240
535
  ]),
536
+ 'skills.android.guideline.android.localization-strings-xml-por-idioma-values-es-values-en': heuristicDetector(
537
+ 'android.localization-strings-xml-por-idioma-values-es-values-en',
538
+ ['heuristics.android.localization-strings-xml-por-idioma-values-es-values-en.ast']
539
+ ),
540
+ 'skills.android.guideline.android.plurals-values-plurals-xml': heuristicDetector(
541
+ 'android.plurals-values-plurals-xml',
542
+ ['heuristics.android.plurals-values-plurals-xml.ast']
543
+ ),
241
544
  'skills.android.no-singleton-usar-inyeccio-n-de-dependencias-hilt-dagger': heuristicDetector(
242
545
  'android.no-singleton',
243
546
  ['heuristics.android.no-singleton.ast']
244
547
  ),
548
+ 'skills.android.guideline.android.hilt-com-google-dagger-hilt-android': heuristicDetector(
549
+ 'android.hilt-dependency',
550
+ ['heuristics.android.hilt-com-google-dagger-hilt-android.ast']
551
+ ),
552
+ 'skills.android.guideline.android.hilt-di-framework-no-manual-factories': heuristicDetector(
553
+ 'android.hilt-framework',
554
+ ['heuristics.android.hilt-di-framework-no-manual-factories.ast']
555
+ ),
556
+ 'skills.android.guideline.android.hiltandroidapp-application-class': heuristicDetector(
557
+ 'android.hiltandroidapp',
558
+ ['heuristics.android.hiltandroidapp-application-class.ast']
559
+ ),
560
+ 'skills.android.guideline.android.androidentrypoint-activity-fragment-viewmodel': heuristicDetector(
561
+ 'android.androidentrypoint',
562
+ ['heuristics.android.androidentrypoint-activity-fragment-viewmodel.ast']
563
+ ),
564
+ 'skills.android.guideline.android.viewmodel-androidx-lifecycle-viewmodel': heuristicDetector(
565
+ 'android.viewmodel',
566
+ ['heuristics.android.viewmodel-androidx-lifecycle-viewmodel.ast']
567
+ ),
568
+ 'skills.android.guideline.android.viewmodel-sobrevive-configuration-changes': heuristicDetector(
569
+ 'android.viewmodel',
570
+ ['heuristics.android.viewmodel-sobrevive-configuration-changes.ast']
571
+ ),
572
+ 'skills.android.guideline.android.single-source-of-truth-viewmodel-es-la-fuente':
573
+ heuristicDetector('android.single-source-of-truth-viewmodel-es-la-fuente', [
574
+ 'heuristics.android.single-source-of-truth-viewmodel-es-la-fuente.ast',
575
+ ]),
576
+ 'skills.android.guideline.android.skip-recomposition-para-metros-inmutables-o-estables':
577
+ heuristicDetector('android.skip-recomposition-para-metros-inmutables-o-estables', [
578
+ 'heuristics.android.skip-recomposition-para-metros-inmutables-o-estables.ast',
579
+ ]),
580
+ 'skills.android.guideline.android.stability-composables-estables-recomponen-menos':
581
+ heuristicDetector('android.stability-composables-estables-recomponen-menos', [
582
+ 'heuristics.android.stability-composables-estables-recomponen-menos.ast',
583
+ ]),
584
+ 'skills.android.guideline.android.string-formatting-1-s-2-d-para-argumentos':
585
+ heuristicDetector('android.string-formatting-1-s-2-d-para-argumentos', [
586
+ 'heuristics.android.string-formatting-1-s-2-d-para-argumentos.ast',
587
+ ]),
588
+ 'skills.android.guideline.android.inject-constructor-constructor-injection': heuristicDetector(
589
+ 'android.inject-constructor',
590
+ ['heuristics.android.inject-constructor-constructor-injection.ast']
591
+ ),
592
+ 'skills.android.guideline.android.module-installin-provide-dependencies': heuristicDetector(
593
+ 'android.module-installin',
594
+ ['heuristics.android.module-installin-provide-dependencies.ast']
595
+ ),
596
+ 'skills.android.guideline.android.binds-para-implementaciones-de-interfaces-ma-s-eficiente':
597
+ heuristicDetector('android.binds-para-implementaciones-de-interfaces-ma-s-eficiente', [
598
+ 'heuristics.android.binds-para-implementaciones-de-interfaces-ma-s-eficiente.ast',
599
+ ]),
600
+ 'skills.android.guideline.android.provides-para-interfaces-o-third-party': heuristicDetector(
601
+ 'android.provides-para-interfaces-o-third-party',
602
+ ['heuristics.android.provides-para-interfaces-o-third-party.ast']
603
+ ),
604
+ 'skills.android.guideline.android.workmanager-androidx-work-work-runtime-ktx': heuristicDetector(
605
+ 'android.workmanager-androidx-work-work-runtime-ktx',
606
+ ['heuristics.android.workmanager-androidx-work-work-runtime-ktx.ast']
607
+ ),
608
+ 'skills.android.guideline.android.version-catalogs-libs-versions-toml-para-dependencias':
609
+ heuristicDetector('android.version-catalogs-libs-versions-toml', [
610
+ 'heuristics.android.version-catalogs-libs-versions-toml-para-dependencias.ast',
611
+ ]),
612
+ 'skills.android.guideline.android.workmanager-background-tasks': heuristicDetector(
613
+ 'android.workmanager-background-tasks',
614
+ ['heuristics.android.workmanager-background-tasks.ast']
615
+ ),
616
+ 'skills.android.guideline.android.androidtest-instrumented-tests-device-emulator': heuristicDetector(
617
+ 'android.androidtest-instrumented-tests-device-emulator',
618
+ ['heuristics.android.androidtest-instrumented-tests-device-emulator.ast']
619
+ ),
620
+ 'skills.android.guideline.android.aaa-pattern-arrange-act-assert': heuristicDetector(
621
+ 'android.aaa-pattern-arrange-act-assert',
622
+ ['heuristics.android.aaa-pattern-arrange-act-assert.ast']
623
+ ),
624
+ 'skills.android.guideline.android.given-when-then-bdd-style': heuristicDetector(
625
+ 'android.given-when-then-bdd-style',
626
+ ['heuristics.android.given-when-then-bdd-style.ast']
627
+ ),
628
+ 'skills.android.guideline.android.test-unit-tests-jvm': heuristicDetector(
629
+ 'android.test-unit-tests-jvm',
630
+ ['heuristics.android.test-unit-tests-jvm.ast']
631
+ ),
632
+ 'skills.android.guideline.android.viewmodelscope-scope-de-viewmodel-cancelado-automa-ticamente': heuristicDetector(
633
+ 'android.viewmodelscope',
634
+ ['heuristics.android.viewmodelscope-scope-de-viewmodel-cancelado-automa-ticamente.ast']
635
+ ),
636
+ 'skills.android.guideline.android.viewmodelscoped-para-dependencias-de-viewmodel': heuristicDetector(
637
+ 'android.viewmodelscoped',
638
+ ['heuristics.android.viewmodelscoped-para-dependencias-de-viewmodel.ast']
639
+ ),
640
+ 'skills.android.guideline.android.composable-functions-composable-para-ui': heuristicDetector(
641
+ 'android.composable-functions',
642
+ ['heuristics.android.composable-functions-composable-para-ui.ast']
643
+ ),
644
+ 'skills.android.guideline.android.arguments-pasar-datos-entre-pantallas': heuristicDetector(
645
+ 'android.arguments-pasar-datos-entre-pantallas',
646
+ ['heuristics.android.arguments-pasar-datos-entre-pantallas.ast']
647
+ ),
648
+ 'skills.android.guideline.android.adaptive-layouts-responsive-design-windowsizeclass': heuristicDetector(
649
+ 'android.adaptive-layouts-responsive-design-windowsizeclass',
650
+ ['heuristics.android.adaptive-layouts-responsive-design-windowsizeclass.ast']
651
+ ),
652
+ 'skills.android.guideline.android.analizar-estructura-existente-mo-dulos-interfaces-dependencias-gradle': heuristicDetector(
653
+ 'android.analizar-estructura-existente-mo-dulos-interfaces-dependencias-gradle',
654
+ ['heuristics.android.analizar-estructura-existente-mo-dulos-interfaces-dependencias-gradle.ast']
655
+ ),
656
+ 'skills.android.guideline.android.theme-color-scheme-typography-shapes': heuristicDetector(
657
+ 'android.theme-color-scheme-typography-shapes',
658
+ ['heuristics.android.theme-color-scheme-typography-shapes.ast']
659
+ ),
660
+ 'skills.android.guideline.android.dark-theme-soportar-desde-di-a-1-issystemindarktheme': heuristicDetector(
661
+ 'android.dark-theme-soportar-desde-di-a-1-issystemindarktheme',
662
+ ['heuristics.android.dark-theme-soportar-desde-di-a-1-issystemindarktheme.ast']
663
+ ),
664
+ 'skills.android.guideline.android.text-scaling-soportar-font-scaling-del-sistema': heuristicDetector(
665
+ 'android.text-scaling-soportar-font-scaling-del-sistema',
666
+ ['heuristics.android.text-scaling-soportar-font-scaling-del-sistema.ast']
667
+ ),
668
+ 'skills.android.guideline.android.accessibility-semantics-contentdescription': heuristicDetector(
669
+ 'android.accessibility-semantics-contentdescription',
670
+ ['heuristics.android.accessibility-semantics-contentdescription.ast']
671
+ ),
672
+ 'skills.android.guideline.android.contentdescription-para-ima-genes-y-botones': heuristicDetector(
673
+ 'android.contentdescription-para-ima-genes-y-botones',
674
+ ['heuristics.android.contentdescription-para-ima-genes-y-botones.ast']
675
+ ),
676
+ 'skills.android.guideline.android.talkback-screen-reader-de-android': heuristicDetector(
677
+ 'android.talkback-screen-reader-de-android',
678
+ ['heuristics.android.talkback-screen-reader-de-android.ast']
679
+ ),
680
+ 'skills.android.guideline.android.god-activities-single-activity-composables': heuristicDetector(
681
+ 'android.god-activities',
682
+ ['heuristics.android.god-activities-single-activity-composables.ast']
683
+ ),
684
+ 'skills.android.guideline.android.single-activity-mu-ltiples-composables-fragments-no-activities':
685
+ heuristicDetector('android.single-activity', [
686
+ 'heuristics.android.single-activity-multiples-composables-fragments-no-activities.ast',
687
+ ]),
245
688
  'skills.android.try-catch-manejo-de-errores-en-coroutines': heuristicDetector(
246
689
  'android.try-catch-manejo-de-errores-en-coroutines',
247
690
  ['heuristics.android.try-catch-manejo-de-errores-en-coroutines.ast']