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.
- package/AGENTS.md +16 -1
- package/CHANGELOG.md +9 -0
- package/README.md +14 -10
- package/VERSION +1 -1
- package/core/facts/detectors/text/android.test.ts +2583 -24
- package/core/facts/detectors/text/android.ts +4633 -34
- package/core/facts/detectors/typescript/index.test.ts +3639 -73
- package/core/facts/detectors/typescript/index.ts +4819 -270
- package/core/facts/extractHeuristicFacts.ts +271 -6
- package/core/rules/presets/heuristics/android.test.ts +314 -1
- package/core/rules/presets/heuristics/android.ts +1220 -50
- package/core/rules/presets/heuristics/typescript.test.ts +158 -2
- package/core/rules/presets/heuristics/typescript.ts +508 -0
- package/docs/README.md +3 -3
- package/docs/operations/RELEASE_NOTES.md +7 -1
- package/docs/operations/framework-menu-consumer-walkthrough.md +18 -15
- package/docs/product/API_REFERENCE.md +1 -1
- package/docs/product/USAGE.md +1 -1
- package/docs/validation/README.md +3 -1
- package/integrations/config/skillsCompilerTemplates.test.ts +131 -0
- package/integrations/config/skillsCompilerTemplates.ts +953 -7
- package/integrations/config/skillsDetectorRegistry.ts +451 -8
- package/integrations/config/skillsMarkdownRules.ts +884 -2
- package/integrations/evidence/buildEvidence.ts +29 -1
- package/integrations/evidence/platformSummary.test.ts +73 -9
- package/integrations/evidence/platformSummary.ts +165 -7
- package/integrations/evidence/repoState.ts +3 -0
- package/integrations/evidence/schema.ts +18 -0
- package/integrations/evidence/trackingContract.ts +17 -0
- package/integrations/evidence/writeEvidence.test.ts +3 -0
- package/integrations/evidence/writeEvidence.ts +29 -1
- package/integrations/gate/evaluateAiGate.ts +251 -8
- package/integrations/gate/governanceActionCatalog.ts +275 -0
- package/integrations/gate/remediationCatalog.ts +8 -0
- package/integrations/git/runPlatformGate.ts +9 -1
- package/integrations/lifecycle/adapter.ts +24 -0
- package/integrations/lifecycle/bootstrapManifest.ts +248 -0
- package/integrations/lifecycle/cliGovernanceConsole.ts +69 -0
- package/integrations/lifecycle/governanceNextAction.ts +171 -0
- package/integrations/lifecycle/governanceObservationSnapshot.ts +369 -0
- package/integrations/lifecycle/packageInfo.ts +118 -1
- package/integrations/lifecycle/state.ts +8 -1
- package/integrations/lifecycle/trackingState.ts +403 -0
- package/integrations/lifecycle/watch.ts +1 -1
- package/integrations/mcp/aiGateCheck.ts +194 -10
- package/integrations/mcp/alignedPlatformGate.ts +232 -0
- package/integrations/mcp/enterpriseServer.ts +19 -3
- package/integrations/mcp/preFlightCheck.ts +66 -3
- package/integrations/mcp/readMcpPrePushStdin.ts +7 -0
- package/package.json +1 -1
- package/scripts/build-ruralgo-s1-evidence-pack.ts +85 -0
- package/scripts/check-tracking-single-active.sh +1 -1
- package/scripts/framework-menu-advanced-view-lib.ts +49 -0
- package/scripts/framework-menu-consumer-actions-lib.ts +32 -32
- package/scripts/framework-menu-consumer-preflight-render.ts +10 -0
- package/scripts/framework-menu-consumer-preflight-run.ts +23 -0
- package/scripts/framework-menu-consumer-preflight-types.ts +12 -0
- package/scripts/framework-menu-consumer-runtime-actions.ts +11 -5
- package/scripts/framework-menu-consumer-runtime-audit.ts +0 -28
- package/scripts/framework-menu-consumer-runtime-evidence-classic.ts +118 -42
- package/scripts/framework-menu-consumer-runtime-lib.ts +38 -0
- package/scripts/framework-menu-consumer-runtime-menu.ts +55 -15
- package/scripts/framework-menu-consumer-runtime-types.ts +4 -0
- package/scripts/framework-menu-evidence-summary-read.ts +17 -1
- package/scripts/framework-menu-evidence-summary-types.ts +3 -0
- package/scripts/framework-menu-layout-data.ts +3 -23
- package/scripts/framework-menu-system-notifications-macos-applescript-dialog.ts +1 -1
- package/scripts/framework-menu-system-notifications-macos-dialog-payload.ts +14 -2
- package/scripts/framework-menu-system-notifications-macos-swift-source.ts +1 -1
- package/scripts/framework-menu-system-notifications-payloads-blocked.ts +128 -4
- package/scripts/framework-menu-system-notifications-payloads.ts +8 -1
- package/scripts/framework-menu-system-notifications-text.ts +7 -1
- package/scripts/framework-menu.ts +37 -2
- package/scripts/package-install-smoke-consumer-git-repo-lib.ts +10 -1
- package/scripts/package-install-smoke-consumer-npm-lib.ts +46 -9
- package/scripts/ruralgo-s1-evidence-pack-lib.ts +200 -0
- 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
|
-
|
|
171
|
-
|
|
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']
|