pumuki 6.3.130 → 6.3.132
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/VERSION +1 -1
- package/integrations/config/skillsCompilerTemplates.ts +10 -0
- package/integrations/config/skillsDetectorRegistry.ts +9 -0
- package/integrations/config/skillsRuleSet.ts +34 -2
- package/integrations/gate/evaluateAiGate.ts +2 -0
- package/integrations/git/runPlatformGate.ts +3 -8
- package/package.json +1 -1
- package/skills.lock.json +15 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,14 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [6.3.132] - 2026-05-03
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **Reglas declarativas sin detector no bloquean el gate:** `unsupported_detector_rule_ids` se conserva en evidencia, pero deja de convertirse en `SKILLS_DETECTOR_MAPPING_INCOMPLETE_HIGH` cuando no hay reglas AUTO ejecutables sin detector.
|
|
14
|
+
- **Bloqueo solo para AUTO real:** el guard de cobertura de skills ahora bloquea exclusivamente `unsupported_auto_rule_ids`, evitando que doctrina declarativa de skills vuelva a parar consumers con `coverage_ratio=1`.
|
|
15
|
+
- **Regresión focalizada:** `runPlatformGate` cubre el caso en modo strict para asegurar que declarativas sin detector quedan como evidencia no bloqueante.
|
|
16
|
+
|
|
9
17
|
## [6.3.130] - 2026-05-03
|
|
10
18
|
|
|
11
19
|
### Fixed
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v6.3.
|
|
1
|
+
v6.3.132
|
|
@@ -319,6 +319,16 @@ export const skillsCompilerTemplates: Record<string, SkillsCompilerTemplate> = {
|
|
|
319
319
|
description:
|
|
320
320
|
'Curated enforcement mapping for Swift Testing adoption in iOS unit and integration tests.',
|
|
321
321
|
rules: [
|
|
322
|
+
{
|
|
323
|
+
id: 'skills.ios.critical-test-quality',
|
|
324
|
+
description:
|
|
325
|
+
'Critical iOS test quality contract: Swift tests must be covered by modern testing rules and XCTest compatibility guards.',
|
|
326
|
+
severity: 'ERROR',
|
|
327
|
+
platform: 'ios',
|
|
328
|
+
confidence: 'HIGH',
|
|
329
|
+
stage: 'PRE_COMMIT',
|
|
330
|
+
locked: true,
|
|
331
|
+
},
|
|
322
332
|
{
|
|
323
333
|
id: 'skills.ios.prefer-swift-testing',
|
|
324
334
|
description:
|
|
@@ -112,6 +112,15 @@ const registryByRuleId: Record<string, SkillsDetectorBinding> = {
|
|
|
112
112
|
'skills.ios.no-uiscreen-main-bounds': heuristicDetector('ios.uiscreen-main-bounds', [
|
|
113
113
|
'heuristics.ios.uiscreen-main-bounds.ast',
|
|
114
114
|
]),
|
|
115
|
+
'skills.ios.critical-test-quality': heuristicDetector('ios.testing.critical-quality', [
|
|
116
|
+
'heuristics.ios.testing.xctest-import.ast',
|
|
117
|
+
'heuristics.ios.testing.xctest-suite-modernizable.ast',
|
|
118
|
+
'heuristics.ios.testing.xctassert.ast',
|
|
119
|
+
'heuristics.ios.testing.xctunwrap.ast',
|
|
120
|
+
'heuristics.ios.testing.wait-for-expectations.ast',
|
|
121
|
+
'heuristics.ios.testing.legacy-expectation-description.ast',
|
|
122
|
+
'heuristics.ios.testing.mixed-frameworks.ast',
|
|
123
|
+
]),
|
|
115
124
|
'skills.ios.prefer-swift-testing': heuristicDetector('ios.testing.xctest-import', [
|
|
116
125
|
'heuristics.ios.testing.xctest-import.ast',
|
|
117
126
|
'heuristics.ios.testing.xctest-suite-modernizable.ast',
|
|
@@ -507,6 +507,38 @@ const emptyResult = (): SkillsRuleSetLoadResult => {
|
|
|
507
507
|
};
|
|
508
508
|
};
|
|
509
509
|
|
|
510
|
+
const IOS_CRITICAL_TEST_QUALITY_RULE: SkillsCompiledRule = {
|
|
511
|
+
id: 'skills.ios.critical-test-quality',
|
|
512
|
+
description:
|
|
513
|
+
'Critical iOS test quality contract: Swift tests must be covered by modern testing rules and XCTest compatibility guards.',
|
|
514
|
+
severity: 'ERROR',
|
|
515
|
+
platform: 'ios',
|
|
516
|
+
sourceSkill: 'ios-swift-testing-guidelines',
|
|
517
|
+
sourcePath: 'compat:synthetic/ios-critical-test-quality',
|
|
518
|
+
stage: 'PRE_COMMIT',
|
|
519
|
+
confidence: 'HIGH',
|
|
520
|
+
locked: true,
|
|
521
|
+
evaluationMode: 'AUTO',
|
|
522
|
+
origin: 'core',
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
const withSyntheticCompatibilityRules = (
|
|
526
|
+
bundles: ReadonlyArray<SkillsLockBundle>
|
|
527
|
+
): SkillsLockBundle[] => {
|
|
528
|
+
return bundles.map((bundle) => {
|
|
529
|
+
if (bundle.name !== 'ios-swift-testing-guidelines') {
|
|
530
|
+
return bundle;
|
|
531
|
+
}
|
|
532
|
+
if (bundle.rules.some((rule) => rule.id === IOS_CRITICAL_TEST_QUALITY_RULE.id)) {
|
|
533
|
+
return bundle;
|
|
534
|
+
}
|
|
535
|
+
return {
|
|
536
|
+
...bundle,
|
|
537
|
+
rules: [IOS_CRITICAL_TEST_QUALITY_RULE, ...bundle.rules],
|
|
538
|
+
};
|
|
539
|
+
});
|
|
540
|
+
};
|
|
541
|
+
|
|
510
542
|
export const loadSkillsRuleSetForStage = (
|
|
511
543
|
stage: Exclude<GateStage, 'STAGED'>,
|
|
512
544
|
repoRoot: string = process.cwd(),
|
|
@@ -521,13 +553,13 @@ export const loadSkillsRuleSetForStage = (
|
|
|
521
553
|
const policy = loadSkillsPolicy(repoRoot);
|
|
522
554
|
const defaultBundleEnabled = policy?.defaultBundleEnabled ?? true;
|
|
523
555
|
|
|
524
|
-
const activeBundles = lock.bundles.filter((bundle) => {
|
|
556
|
+
const activeBundles = withSyntheticCompatibilityRules(lock.bundles.filter((bundle) => {
|
|
525
557
|
return resolveBundleEnabled({
|
|
526
558
|
bundleName: bundle.name,
|
|
527
559
|
defaultBundleEnabled,
|
|
528
560
|
bundlePolicy: policy?.bundles[bundle.name],
|
|
529
561
|
});
|
|
530
|
-
});
|
|
562
|
+
}));
|
|
531
563
|
|
|
532
564
|
if (activeBundles.length === 0) {
|
|
533
565
|
return emptyResult();
|
|
@@ -150,6 +150,8 @@ const PLATFORM_REQUIRED_SKILLS_BUNDLES: Readonly<Record<PreWriteSkillsPlatform,
|
|
|
150
150
|
'ios-guidelines',
|
|
151
151
|
'ios-concurrency-guidelines',
|
|
152
152
|
'ios-swiftui-expert-guidelines',
|
|
153
|
+
'ios-swift-testing-guidelines',
|
|
154
|
+
'ios-core-data-guidelines',
|
|
153
155
|
],
|
|
154
156
|
android: ['android-guidelines'],
|
|
155
157
|
backend: ['backend-guidelines'],
|
|
@@ -228,12 +228,7 @@ const toSkillsUnsupportedAutoRulesBlockingFinding = (params: {
|
|
|
228
228
|
return undefined;
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
-
const unsupportedRuleIds = [
|
|
232
|
-
...new Set([
|
|
233
|
-
...params.unsupportedAutoRuleIds,
|
|
234
|
-
...(params.unsupportedDetectorRuleIds ?? []),
|
|
235
|
-
]),
|
|
236
|
-
].sort();
|
|
231
|
+
const unsupportedRuleIds = [...new Set(params.unsupportedAutoRuleIds)].sort();
|
|
237
232
|
if (unsupportedRuleIds.length === 0) {
|
|
238
233
|
return undefined;
|
|
239
234
|
}
|
|
@@ -246,8 +241,8 @@ const toSkillsUnsupportedAutoRulesBlockingFinding = (params: {
|
|
|
246
241
|
code: 'SKILLS_DETECTOR_MAPPING_INCOMPLETE_HIGH',
|
|
247
242
|
message:
|
|
248
243
|
`Skills detector mapping incomplete at ${params.stage}: ` +
|
|
249
|
-
`
|
|
250
|
-
'Map every skill rule to an intelligent AST detector before proceeding
|
|
244
|
+
`unsupported_auto_rule_ids=[${unsupportedRuleIdsToken}]. ` +
|
|
245
|
+
'Map every stage-applicable AUTO skill rule to an intelligent AST detector before proceeding.',
|
|
251
246
|
filePath: '.ai_evidence.json',
|
|
252
247
|
matchedBy: 'SkillsDetectorMappingGuard',
|
|
253
248
|
source: 'skills-detector-mapping',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pumuki",
|
|
3
|
-
"version": "6.3.
|
|
3
|
+
"version": "6.3.132",
|
|
4
4
|
"description": "Enterprise-grade AST Intelligence System with multi-platform support (iOS, Android, Backend, Frontend) and Feature-First + DDD + Clean Architecture enforcement. Includes dynamic violations API for intelligent querying.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
package/skills.lock.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "1.0",
|
|
3
3
|
"compilerVersion": "1.0.0",
|
|
4
|
-
"generatedAt": "2026-
|
|
4
|
+
"generatedAt": "2026-05-03T12:45:29.960Z",
|
|
5
5
|
"bundles": [
|
|
6
6
|
{
|
|
7
7
|
"name": "android-guidelines",
|
|
@@ -8176,8 +8176,21 @@
|
|
|
8176
8176
|
"name": "ios-swift-testing-guidelines",
|
|
8177
8177
|
"version": "1.0.0",
|
|
8178
8178
|
"source": "file:vendor/skills/swift-testing-expert/SKILL.md",
|
|
8179
|
-
"hash": "
|
|
8179
|
+
"hash": "1d5d5236f9cd9fdd12a860048512fa3c2d6b9af5aedfafaaa4a18f837d2ca9e1",
|
|
8180
8180
|
"rules": [
|
|
8181
|
+
{
|
|
8182
|
+
"id": "skills.ios.critical-test-quality",
|
|
8183
|
+
"description": "Critical iOS test quality contract: Swift tests must be covered by modern testing rules and XCTest compatibility guards.",
|
|
8184
|
+
"severity": "ERROR",
|
|
8185
|
+
"platform": "ios",
|
|
8186
|
+
"confidence": "HIGH",
|
|
8187
|
+
"stage": "PRE_COMMIT",
|
|
8188
|
+
"locked": true,
|
|
8189
|
+
"sourceSkill": "ios-swift-testing-guidelines",
|
|
8190
|
+
"sourcePath": "vendor/skills/swift-testing-expert/SKILL.md",
|
|
8191
|
+
"evaluationMode": "AUTO",
|
|
8192
|
+
"origin": "core"
|
|
8193
|
+
},
|
|
8181
8194
|
{
|
|
8182
8195
|
"id": "skills.ios.guideline.ios-swift-testing.keep-tests-isolated-expressive-and-aligned-with-swift-concurrency",
|
|
8183
8196
|
"description": "Keep tests isolated, expressive, and aligned with Swift Concurrency.",
|