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
@@ -3,13 +3,56 @@ import test from 'node:test';
3
3
  import { androidRules } from './android';
4
4
 
5
5
  test('androidRules define reglas heurísticas locked para plataforma android', () => {
6
- assert.equal(androidRules.length, 14);
6
+ assert.equal(androidRules.length, 76);
7
7
 
8
8
  const ids = androidRules.map((rule) => rule.id);
9
9
  assert.deepEqual(ids, [
10
10
  'heuristics.android.thread-sleep.ast',
11
11
  'heuristics.android.globalscope.ast',
12
12
  'heuristics.android.run-blocking.ast',
13
+ 'heuristics.android.coroutines-async-await-no-callbacks.ast',
14
+ 'heuristics.android.async-await-paralelismo.ast',
15
+ 'heuristics.android.supervisorscope-errores-no-cancelan-otros-jobs.ast',
16
+ 'heuristics.android.suspend-functions-en-api-service.ast',
17
+ 'heuristics.android.suspend-functions-para-operaciones-async.ast',
18
+ 'heuristics.android.dao-data-access-objects-con-suspend-functions.ast',
19
+ 'heuristics.android.transaction-para-operaciones-multi-query.ast',
20
+ 'heuristics.android.stateflow-estado-mutable-observable.ast',
21
+ 'heuristics.android.sharedflow-hot-stream-puede-no-tener-valor-para-eventos.ast',
22
+ 'heuristics.android.flow-builders-flow-emit-flowof-asflow.ast',
23
+ 'heuristics.android.collect-terminal-operator-para-consumir-flow.ast',
24
+ 'heuristics.android.collect-as-state-consumir-flow-en-compose.ast',
25
+ 'heuristics.android.remember-evitar-recrear-objetos.ast',
26
+ 'heuristics.android.remember-para-mantener-estado-entre-recomposiciones.ast',
27
+ 'heuristics.android.derivedstateof-ca-lculos-caros-solo-cuando-cambia-input.ast',
28
+ 'heuristics.android.derivedstateof-ca-lculos-derivados-de-state.ast',
29
+ 'heuristics.android.launchedeffect-side-effects-con-lifecycle.ast',
30
+ 'heuristics.android.launchedeffect-keys-controlar-cuando-se-relanza-effect.ast',
31
+ 'heuristics.android.disposableeffect-cleanup-cuando-composable-sale-de-composicio-n.ast',
32
+ 'heuristics.android.preview-preview-para-ver-ui-sin-correr-app.ast',
33
+ 'heuristics.android.recomposition-composables-deben-ser-idempotentes.ast',
34
+ 'heuristics.android.uistate-sealed-class-loading-success-error-states.ast',
35
+ 'heuristics.android.use-cases-lo-gica-de-negocio-encapsulada.ast',
36
+ 'heuristics.android.repository-pattern-abstraer-acceso-a-datos.ast',
37
+ 'heuristics.android.app-startup-androidx-startup-para-lazy-init.ast',
38
+ 'heuristics.android.baseline-profiles-optimizacio-n-de-startup.ast',
39
+ 'heuristics.android.single-source-of-truth-viewmodel-es-la-fuente.ast',
40
+ 'heuristics.android.skip-recomposition-para-metros-inmutables-o-estables.ast',
41
+ 'heuristics.android.stability-composables-estables-recomponen-menos.ast',
42
+ 'heuristics.android.string-formatting-1-s-2-d-para-argumentos.ast',
43
+ 'heuristics.android.binds-para-implementaciones-de-interfaces-ma-s-eficiente.ast',
44
+ 'heuristics.android.provides-para-interfaces-o-third-party.ast',
45
+ 'heuristics.android.workmanager-androidx-work-work-runtime-ktx.ast',
46
+ 'heuristics.android.version-catalogs-libs-versions-toml-para-dependencias.ast',
47
+ 'heuristics.android.workmanager-background-tasks.ast',
48
+ 'heuristics.android.androidtest-instrumented-tests-device-emulator.ast',
49
+ 'heuristics.android.aaa-pattern-arrange-act-assert.ast',
50
+ 'heuristics.android.given-when-then-bdd-style.ast',
51
+ 'heuristics.android.test-unit-tests-jvm.ast',
52
+ 'heuristics.android.state-hoisting-elevar-estado-al-nivel-apropiado.ast',
53
+ 'heuristics.android.viewmodel-androidx-lifecycle-viewmodel.ast',
54
+ 'heuristics.android.viewmodel-sobrevive-configuration-changes.ast',
55
+ 'heuristics.android.viewmodelscope-scope-de-viewmodel-cancelado-automa-ticamente.ast',
13
56
  'heuristics.android.force-unwrap.ast',
14
57
  'heuristics.android.java-source.ast',
15
58
  'heuristics.android.asynctask-deprecated.ast',
@@ -18,8 +61,27 @@ test('androidRules define reglas heurísticas locked para plataforma android', (
18
61
  'heuristics.android.dispatchers-main-ui-io-network-disk-default-cpu.ast',
19
62
  'heuristics.android.withcontext-change-dispatcher.ast',
20
63
  'heuristics.android.no-console-log.ast',
64
+ 'heuristics.android.buildconfig-constantes-en-tiempo-de-compilacio-n.ast',
21
65
  'heuristics.android.hardcoded-strings.ast',
66
+ 'heuristics.android.localization-strings-xml-por-idioma-values-es-values-en.ast',
67
+ 'heuristics.android.plurals-values-plurals-xml.ast',
22
68
  'heuristics.android.no-singleton.ast',
69
+ 'heuristics.android.composable-functions-composable-para-ui.ast',
70
+ 'heuristics.android.arguments-pasar-datos-entre-pantallas.ast',
71
+ 'heuristics.android.adaptive-layouts-responsive-design-windowsizeclass.ast',
72
+ 'heuristics.android.analizar-estructura-existente-mo-dulos-interfaces-dependencias-gradle.ast',
73
+ 'heuristics.android.theme-color-scheme-typography-shapes.ast',
74
+ 'heuristics.android.dark-theme-soportar-desde-di-a-1-issystemindarktheme.ast',
75
+ 'heuristics.android.timber-logging-library.ast',
76
+ 'heuristics.android.analytics-firebase-analytics-o-custom.ast',
77
+ 'heuristics.android.android-profiler-cpu-memory-network-profiling.ast',
78
+ 'heuristics.android.touch-targets-mi-nimo-48dp.ast',
79
+ 'heuristics.android.text-scaling-soportar-font-scaling-del-sistema.ast',
80
+ 'heuristics.android.accessibility-semantics-contentdescription.ast',
81
+ 'heuristics.android.contentdescription-para-ima-genes-y-botones.ast',
82
+ 'heuristics.android.talkback-screen-reader-de-android.ast',
83
+ 'heuristics.android.god-activities-single-activity-composables.ast',
84
+ 'heuristics.android.single-activity-multiples-composables-fragments-no-activities.ast',
23
85
  'heuristics.android.try-catch-manejo-de-errores-en-coroutines.ast',
24
86
  ]);
25
87
 
@@ -36,6 +98,132 @@ test('androidRules define reglas heurísticas locked para plataforma android', (
36
98
  byId.get('heuristics.android.run-blocking.ast')?.then.code,
37
99
  'HEURISTICS_ANDROID_RUN_BLOCKING_AST'
38
100
  );
101
+ assert.equal(
102
+ byId.get('heuristics.android.coroutines-async-await-no-callbacks.ast')?.then.code,
103
+ 'HEURISTICS_ANDROID_COROUTINES_ASYNC_AWAIT_NO_CALLBACKS_AST'
104
+ );
105
+ assert.equal(
106
+ byId.get('heuristics.android.async-await-paralelismo.ast')?.then.code,
107
+ 'HEURISTICS_ANDROID_ASYNC_AWAIT_PARALELISMO_AST'
108
+ );
109
+ assert.equal(
110
+ byId.get('heuristics.android.supervisorscope-errores-no-cancelan-otros-jobs.ast')?.then.code,
111
+ 'HEURISTICS_ANDROID_SUPERVISORSCOPE_ERRORES_NO_CANCELAN_OTROS_JOBS_AST'
112
+ );
113
+ assert.equal(
114
+ byId.get('heuristics.android.suspend-functions-en-api-service.ast')?.then.code,
115
+ 'HEURISTICS_ANDROID_SUSPEND_FUNCTIONS_EN_API_SERVICE_AST'
116
+ );
117
+ assert.equal(
118
+ byId.get('heuristics.android.suspend-functions-para-operaciones-async.ast')?.then.code,
119
+ 'HEURISTICS_ANDROID_SUSPEND_FUNCTIONS_PARA_OPERACIONES_ASYNC_AST'
120
+ );
121
+ assert.equal(
122
+ byId.get('heuristics.android.dao-data-access-objects-con-suspend-functions.ast')?.then.code,
123
+ 'HEURISTICS_ANDROID_DAO_DATA_ACCESS_OBJECTS_CON_SUSPEND_FUNCTIONS_AST'
124
+ );
125
+ assert.equal(
126
+ byId.get('heuristics.android.transaction-para-operaciones-multi-query.ast')?.then.code,
127
+ 'HEURISTICS_ANDROID_TRANSACTION_PARA_OPERACIONES_MULTI_QUERY_AST'
128
+ );
129
+ assert.equal(
130
+ byId.get('heuristics.android.stateflow-estado-mutable-observable.ast')?.then.code,
131
+ 'HEURISTICS_ANDROID_STATEFLOW_ESTADO_MUTABLE_OBSERVABLE_AST'
132
+ );
133
+ assert.equal(
134
+ byId.get('heuristics.android.sharedflow-hot-stream-puede-no-tener-valor-para-eventos.ast')?.then.code,
135
+ 'HEURISTICS_ANDROID_SHAREDFLOW_HOT_STREAM_PUEDE_NO_TENER_VALOR_PARA_EVENTOS_AST'
136
+ );
137
+ assert.equal(
138
+ byId.get('heuristics.android.uistate-sealed-class-loading-success-error-states.ast')?.then.code,
139
+ 'HEURISTICS_ANDROID_UISTATE_SEALED_CLASS_LOADING_SUCCESS_ERROR_STATES_AST'
140
+ );
141
+ assert.equal(
142
+ byId.get('heuristics.android.use-cases-lo-gica-de-negocio-encapsulada.ast')?.then.code,
143
+ 'HEURISTICS_ANDROID_USE_CASES_LOGICA_DE_NEGOCIO_ENCAPSULADA_AST'
144
+ );
145
+ assert.equal(
146
+ byId.get('heuristics.android.repository-pattern-abstraer-acceso-a-datos.ast')?.then.code,
147
+ 'HEURISTICS_ANDROID_REPOSITORY_PATTERN_ABSTRAER_ACCESO_A_DATOS_AST'
148
+ );
149
+ assert.equal(
150
+ byId.get('heuristics.android.app-startup-androidx-startup-para-lazy-init.ast')?.then.code,
151
+ 'HEURISTICS_ANDROID_APP_STARTUP_ANDROIDX_STARTUP_PARA_LAZY_INIT_AST'
152
+ );
153
+ assert.equal(
154
+ byId.get('heuristics.android.baseline-profiles-optimizacio-n-de-startup.ast')?.then.code,
155
+ 'HEURISTICS_ANDROID_BASELINE_PROFILES_OPTIMIZACION_DE_STARTUP_AST'
156
+ );
157
+ assert.equal(
158
+ byId.get('heuristics.android.single-source-of-truth-viewmodel-es-la-fuente.ast')?.then.code,
159
+ 'HEURISTICS_ANDROID_SINGLE_SOURCE_OF_TRUTH_VIEWMODEL_ES_LA_FUENTE_AST'
160
+ );
161
+ assert.equal(
162
+ byId.get('heuristics.android.skip-recomposition-para-metros-inmutables-o-estables.ast')
163
+ ?.then.code,
164
+ 'HEURISTICS_ANDROID_SKIP_RECOMPOSITION_PARA_METROS_INMUTABLES_O_ESTABLES_AST'
165
+ );
166
+ assert.equal(
167
+ byId.get('heuristics.android.stability-composables-estables-recomponen-menos.ast')?.then.code,
168
+ 'HEURISTICS_ANDROID_STABILITY_COMPOSABLES_ESTABLES_RECOMPONEN_MENOS_AST'
169
+ );
170
+ assert.equal(
171
+ byId.get('heuristics.android.string-formatting-1-s-2-d-para-argumentos.ast')?.then.code,
172
+ 'HEURISTICS_ANDROID_STRING_FORMATTING_1_S_2_D_PARA_ARGUMENTOS_AST'
173
+ );
174
+ assert.equal(
175
+ byId.get('heuristics.android.binds-para-implementaciones-de-interfaces-ma-s-eficiente.ast')?.then.code,
176
+ 'HEURISTICS_ANDROID_BINDS_PARA_IMPLEMENTACIONES_DE_INTERFACES_MA_S_EFICIENTE_AST'
177
+ );
178
+ assert.equal(
179
+ byId.get('heuristics.android.provides-para-interfaces-o-third-party.ast')?.then.code,
180
+ 'HEURISTICS_ANDROID_PROVIDES_PARA_INTERFACES_O_THIRD_PARTY_AST'
181
+ );
182
+ assert.equal(
183
+ byId.get('heuristics.android.workmanager-androidx-work-work-runtime-ktx.ast')?.then.code,
184
+ 'HEURISTICS_ANDROID_WORKMANAGER_ANDROIDX_WORK_WORK_RUNTIME_KTX_AST'
185
+ );
186
+ assert.equal(
187
+ byId.get('heuristics.android.version-catalogs-libs-versions-toml-para-dependencias.ast')?.then.code,
188
+ 'HEURISTICS_ANDROID_VERSION_CATALOGS_LIBS_VERSIONS_TOML_PARA_DEPENDENCIAS_AST'
189
+ );
190
+ assert.equal(
191
+ byId.get('heuristics.android.workmanager-background-tasks.ast')?.then.code,
192
+ 'HEURISTICS_ANDROID_WORKMANAGER_BACKGROUND_TASKS_AST'
193
+ );
194
+ assert.equal(
195
+ byId.get('heuristics.android.androidtest-instrumented-tests-device-emulator.ast')?.then.code,
196
+ 'HEURISTICS_ANDROID_ANDROIDTEST_INSTRUMENTED_TESTS_DEVICE_EMULATOR_AST'
197
+ );
198
+ assert.equal(
199
+ byId.get('heuristics.android.aaa-pattern-arrange-act-assert.ast')?.then.code,
200
+ 'HEURISTICS_ANDROID_AAA_PATTERN_ARRANGE_ACT_ASSERT_AST'
201
+ );
202
+ assert.equal(
203
+ byId.get('heuristics.android.given-when-then-bdd-style.ast')?.then.code,
204
+ 'HEURISTICS_ANDROID_GIVEN_WHEN_THEN_BDD_STYLE_AST'
205
+ );
206
+ assert.equal(
207
+ byId.get('heuristics.android.test-unit-tests-jvm.ast')?.then.code,
208
+ 'HEURISTICS_ANDROID_TEST_UNIT_TESTS_JVM_AST'
209
+ );
210
+ assert.equal(
211
+ byId.get('heuristics.android.state-hoisting-elevar-estado-al-nivel-apropiado.ast')?.then.code,
212
+ 'HEURISTICS_ANDROID_STATE_HOISTING_ELEVAR_ESTADO_AL_NIVEL_APROPIADO_AST'
213
+ );
214
+ assert.equal(
215
+ byId.get('heuristics.android.viewmodel-androidx-lifecycle-viewmodel.ast')?.then.code,
216
+ 'HEURISTICS_ANDROID_VIEWMODEL_ANDROIDX_LIFECYCLE_VIEWMODEL_AST'
217
+ );
218
+ assert.equal(
219
+ byId.get('heuristics.android.viewmodel-sobrevive-configuration-changes.ast')?.then.code,
220
+ 'HEURISTICS_ANDROID_VIEWMODEL_SOBREVIVE_CONFIGURATION_CHANGES_AST'
221
+ );
222
+ assert.equal(
223
+ byId.get('heuristics.android.viewmodelscope-scope-de-viewmodel-cancelado-automa-ticamente.ast')
224
+ ?.then.code,
225
+ 'HEURISTICS_ANDROID_VIEWMODELSCOPE_SCOPE_DE_VIEWMODEL_CANCELADO_AUTOMATICAMENTE_AST'
226
+ );
39
227
  assert.equal(
40
228
  byId.get('heuristics.android.force-unwrap.ast')?.then.code,
41
229
  'HEURISTICS_ANDROID_FORCE_UNWRAP_AST'
@@ -56,6 +244,52 @@ test('androidRules define reglas heurísticas locked para plataforma android', (
56
244
  byId.get('heuristics.android.rxjava-new-code.ast')?.then.code,
57
245
  'HEURISTICS_ANDROID_RXJAVA_NEW_CODE_AST'
58
246
  );
247
+ assert.equal(
248
+ byId.get('heuristics.android.collect-terminal-operator-para-consumir-flow.ast')?.then.code,
249
+ 'HEURISTICS_ANDROID_COLLECT_TERMINAL_OPERATOR_PARA_CONSUMIR_FLOW_AST'
250
+ );
251
+ assert.equal(
252
+ byId.get('heuristics.android.collect-as-state-consumir-flow-en-compose.ast')?.then.code,
253
+ 'HEURISTICS_ANDROID_COLLECT_AS_STATE_CONSUMIR_FLOW_EN_COMPOSE_AST'
254
+ );
255
+ assert.equal(
256
+ byId.get('heuristics.android.remember-evitar-recrear-objetos.ast')?.then.code,
257
+ 'HEURISTICS_ANDROID_REMEMBER_EVITAR_RECREAR_OBJETOS_AST'
258
+ );
259
+ assert.equal(
260
+ byId.get('heuristics.android.remember-para-mantener-estado-entre-recomposiciones.ast')?.then.code,
261
+ 'HEURISTICS_ANDROID_REMEMBER_PARA_MANTENER_ESTADO_ENTRE_RECOMPOSICIONES_AST'
262
+ );
263
+ assert.equal(
264
+ byId.get('heuristics.android.derivedstateof-ca-lculos-caros-solo-cuando-cambia-input.ast')
265
+ ?.then.code,
266
+ 'HEURISTICS_ANDROID_DERIVEDSTATEOF_CALCULOS_CAROS_SOLO_CUANDO_CAMBIA_INPUT_AST'
267
+ );
268
+ assert.equal(
269
+ byId.get('heuristics.android.derivedstateof-ca-lculos-derivados-de-state.ast')?.then.code,
270
+ 'HEURISTICS_ANDROID_DERIVEDSTATEOF_CALCULOS_DERIVADOS_DE_STATE_AST'
271
+ );
272
+ assert.equal(
273
+ byId.get('heuristics.android.launchedeffect-side-effects-con-lifecycle.ast')?.then.code,
274
+ 'HEURISTICS_ANDROID_LAUNCHEDEFFECT_SIDE_EFFECTS_CON_LIFECYCLE_AST'
275
+ );
276
+ assert.equal(
277
+ byId.get('heuristics.android.launchedeffect-keys-controlar-cuando-se-relanza-effect.ast')?.then.code,
278
+ 'HEURISTICS_ANDROID_LAUNCHEDEFFECT_KEYS_CONTROLAR_CUANDO_SE_RELANZA_EFFECT_AST'
279
+ );
280
+ assert.equal(
281
+ byId.get('heuristics.android.disposableeffect-cleanup-cuando-composable-sale-de-composicio-n.ast')
282
+ ?.then.code,
283
+ 'HEURISTICS_ANDROID_DISPOSABLE_EFFECT_CLEANUP_CUANDO_COMPOSABLE_SALE_DE_COMPOSICIO_N_AST'
284
+ );
285
+ assert.equal(
286
+ byId.get('heuristics.android.preview-preview-para-ver-ui-sin-correr-app.ast')?.then.code,
287
+ 'HEURISTICS_ANDROID_PREVIEW_PREVIEW_PARA_VER_UI_SIN_CORRER_APP_AST'
288
+ );
289
+ assert.equal(
290
+ byId.get('heuristics.android.recomposition-composables-deben-ser-idempotentes.ast')?.then.code,
291
+ 'HEURISTICS_ANDROID_RECOMPOSITION_COMPOSABLES_DEBEN_SER_IDEMPOTENTES_AST'
292
+ );
59
293
  assert.equal(
60
294
  byId.get('heuristics.android.dispatchers-main-ui-io-network-disk-default-cpu.ast')?.then.code,
61
295
  'HEURISTICS_ANDROID_DISPATCHERS_MAIN_UI_IO_NETWORK_DISK_DEFAULT_CPU_AST'
@@ -72,10 +306,83 @@ test('androidRules define reglas heurísticas locked para plataforma android', (
72
306
  byId.get('heuristics.android.hardcoded-strings.ast')?.then.code,
73
307
  'HEURISTICS_ANDROID_HARDCODED_STRINGS_AST'
74
308
  );
309
+ assert.equal(
310
+ byId.get('heuristics.android.localization-strings-xml-por-idioma-values-es-values-en.ast')?.then.code,
311
+ 'HEURISTICS_ANDROID_LOCALIZATION_STRINGS_XML_POR_IDIOMA_VALUES_ES_VALUES_EN_AST'
312
+ );
313
+ assert.equal(
314
+ byId.get('heuristics.android.plurals-values-plurals-xml.ast')?.then.code,
315
+ 'HEURISTICS_ANDROID_PLURALS_VALUES_PLURALS_XML_AST'
316
+ );
75
317
  assert.equal(
76
318
  byId.get('heuristics.android.no-singleton.ast')?.then.code,
77
319
  'HEURISTICS_ANDROID_NO_SINGLETON_AST'
78
320
  );
321
+ assert.equal(
322
+ byId.get('heuristics.android.composable-functions-composable-para-ui.ast')?.then.code,
323
+ 'HEURISTICS_ANDROID_COMPOSABLE_FUNCTIONS_COMPOSABLE_PARA_UI_AST'
324
+ );
325
+ assert.equal(
326
+ byId.get('heuristics.android.arguments-pasar-datos-entre-pantallas.ast')?.then.code,
327
+ 'HEURISTICS_ANDROID_ARGUMENTS_PASAR_DATOS_ENTRE_PANTALLAS_AST'
328
+ );
329
+ assert.equal(
330
+ byId.get('heuristics.android.adaptive-layouts-responsive-design-windowsizeclass.ast')?.then.code,
331
+ 'HEURISTICS_ANDROID_ADAPTIVE_LAYOUTS_RESPONSIVE_DESIGN_WINDOW_SIZE_CLASS_AST'
332
+ );
333
+ assert.equal(
334
+ byId.get('heuristics.android.analizar-estructura-existente-mo-dulos-interfaces-dependencias-gradle.ast')
335
+ ?.then.code,
336
+ 'HEURISTICS_ANDROID_ANALIZAR_ESTRUCTURA_EXISTENTE_MO_DULOS_INTERFACES_DEPENDENCIAS_GRADLE_AST'
337
+ );
338
+ assert.equal(
339
+ byId.get('heuristics.android.theme-color-scheme-typography-shapes.ast')?.then.code,
340
+ 'HEURISTICS_ANDROID_THEME_COLOR_SCHEME_TYPOGRAPHY_SHAPES_AST'
341
+ );
342
+ assert.equal(
343
+ byId.get('heuristics.android.dark-theme-soportar-desde-di-a-1-issystemindarktheme.ast')?.then.code,
344
+ 'HEURISTICS_ANDROID_DARK_THEME_SOPORTAR_DESDE_DI_A_1_ISSYSTEMINDARKTHEME_AST'
345
+ );
346
+ assert.equal(
347
+ byId.get('heuristics.android.timber-logging-library.ast')?.then.code,
348
+ 'HEURISTICS_ANDROID_TIMBER_LOGGING_LIBRARY_AST'
349
+ );
350
+ assert.equal(
351
+ byId.get('heuristics.android.analytics-firebase-analytics-o-custom.ast')?.then.code,
352
+ 'HEURISTICS_ANDROID_ANALYTICS_FIREBASE_ANALYTICS_O_CUSTOM_AST'
353
+ );
354
+ assert.equal(
355
+ byId.get('heuristics.android.android-profiler-cpu-memory-network-profiling.ast')?.then.code,
356
+ 'HEURISTICS_ANDROID_ANDROID_PROFILER_CPU_MEMORY_NETWORK_PROFILING_AST'
357
+ );
358
+ assert.equal(
359
+ byId.get('heuristics.android.touch-targets-mi-nimo-48dp.ast')?.then.code,
360
+ 'HEURISTICS_ANDROID_TOUCH_TARGETS_MI_NIMO_48DP_AST'
361
+ );
362
+ assert.equal(
363
+ byId.get('heuristics.android.text-scaling-soportar-font-scaling-del-sistema.ast')?.then.code,
364
+ 'HEURISTICS_ANDROID_TEXT_SCALING_SOPORTAR_FONT_SCALING_DEL_SISTEMA_AST'
365
+ );
366
+ assert.equal(
367
+ byId.get('heuristics.android.accessibility-semantics-contentdescription.ast')?.then.code,
368
+ 'HEURISTICS_ANDROID_ACCESSIBILITY_SEMANTICS_CONTENTDESCRIPTION_AST'
369
+ );
370
+ assert.equal(
371
+ byId.get('heuristics.android.contentdescription-para-ima-genes-y-botones.ast')?.then.code,
372
+ 'HEURISTICS_ANDROID_CONTENTDESCRIPTION_PARA_IMAGENES_Y_BOTONES_AST'
373
+ );
374
+ assert.equal(
375
+ byId.get('heuristics.android.god-activities-single-activity-composables.ast')?.then.code,
376
+ 'HEURISTICS_ANDROID_GOD_ACTIVITIES_SINGLE_ACTIVITY_COMPOSABLES_AST'
377
+ );
378
+ assert.equal(
379
+ byId.get('heuristics.android.talkback-screen-reader-de-android.ast')?.then.code,
380
+ 'HEURISTICS_ANDROID_TALKBACK_SCREEN_READER_DE_ANDROID_AST'
381
+ );
382
+ assert.equal(
383
+ byId.get('heuristics.android.single-activity-multiples-composables-fragments-no-activities.ast')?.then.code,
384
+ 'HEURISTICS_ANDROID_SINGLE_ACTIVITY_MULTIPLES_COMPOSABLES_FRAGMENTS_NO_ACTIVITIES_AST'
385
+ );
79
386
  assert.equal(
80
387
  byId.get('heuristics.android.try-catch-manejo-de-errores-en-coroutines.ast')?.then.code,
81
388
  'HEURISTICS_ANDROID_TRY_CATCH_MANEJO_DE_ERRORES_EN_COROUTINES_AST'
@@ -83,6 +390,12 @@ test('androidRules define reglas heurísticas locked para plataforma android', (
83
390
 
84
391
  for (const rule of androidRules) {
85
392
  assert.equal(rule.platform, 'android');
393
+ if (
394
+ rule.id === 'heuristics.android.god-activities-single-activity-composables.ast'
395
+ ) {
396
+ assert.equal(rule.severity, 'ERROR');
397
+ continue;
398
+ }
86
399
  assert.equal(rule.severity, 'WARN');
87
400
  assert.equal(rule.locked, true);
88
401
  assert.equal(rule.when.kind, 'Heuristic');