pumuki 6.3.305 → 6.3.307

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.
@@ -2795,6 +2795,24 @@ let text = "XCTAssertEqual(value, expected)"
2795
2795
  assert.deepEqual(collectSwiftXCTestAssertionLines(ignored), []);
2796
2796
  });
2797
2797
 
2798
+ test('hasSwiftXCTestAssertionUsage permite UI tests XCTest brownfield explicitos', () => {
2799
+ const uiTest = `
2800
+ import XCTest
2801
+
2802
+ final class BuyerCommerceUISmokeTests: XCTestCase {
2803
+ func testCheckoutFlow() {
2804
+ let app = XCUIApplication()
2805
+ app.launch()
2806
+ XCTAssertTrue(app.buttons["Continue"].exists)
2807
+ XCTAssertEqual(app.staticTexts["Title"].label, "RuralGo")
2808
+ }
2809
+ }
2810
+ `;
2811
+
2812
+ assert.equal(hasSwiftXCTestAssertionUsage(uiTest), false);
2813
+ assert.deepEqual(collectSwiftXCTestAssertionLines(uiTest), []);
2814
+ });
2815
+
2798
2816
  test('hasSwiftXCTUnwrapUsage detecta XCTUnwrap real y evita strings', () => {
2799
2817
  const source = `
2800
2818
  let value = try XCTUnwrap(optionalValue)
@@ -2832,6 +2850,24 @@ let sample = "waitForExpectations(timeout: 1)"
2832
2850
  assert.deepEqual(collectSwiftWaitForExpectationsLines(modernWait), []);
2833
2851
  });
2834
2852
 
2853
+ test('hasSwiftWaitForExpectationsUsage permite waits en UI tests XCTest brownfield explicitos', () => {
2854
+ const uiWait = `
2855
+ import XCTest
2856
+
2857
+ final class BuyerCommerceUISmokeTests: XCTestCase {
2858
+ func testCheckoutFlow() {
2859
+ let app = XCUIApplication()
2860
+ app.launch()
2861
+ XCTAssertTrue(app.buttons["Continue"].waitForExistence(timeout: 5))
2862
+ wait(for: [expectation(description: "Loaded")], timeout: 1)
2863
+ }
2864
+ }
2865
+ `;
2866
+
2867
+ assert.equal(hasSwiftWaitForExpectationsUsage(uiWait), false);
2868
+ assert.deepEqual(collectSwiftWaitForExpectationsLines(uiWait), []);
2869
+ });
2870
+
2835
2871
  test('hasSwiftLegacyExpectationDescriptionUsage detecta expectation(description:) sin flujo moderno', () => {
2836
2872
  const legacyExpectation = `
2837
2873
  let expectation = expectation(description: "Done")
@@ -2258,6 +2258,10 @@ export const collectSwiftQuickNimbleLines = (source: string): readonly number[]
2258
2258
  };
2259
2259
 
2260
2260
  export const hasSwiftXCTestAssertionUsage = (source: string): boolean => {
2261
+ if (hasSwiftLegacyXCTestUiOrPerformanceUsage(source)) {
2262
+ return false;
2263
+ }
2264
+
2261
2265
  if (hasSwiftBrownfieldXCTestQualityPattern(source)) {
2262
2266
  return false;
2263
2267
  }
@@ -2304,6 +2308,10 @@ const hasSwiftConfirmationUsage = (source: string): boolean => {
2304
2308
  };
2305
2309
 
2306
2310
  export const collectSwiftWaitForExpectationsLines = (source: string): readonly number[] => {
2311
+ if (hasSwiftLegacyXCTestUiOrPerformanceUsage(source)) {
2312
+ return [];
2313
+ }
2314
+
2307
2315
  return sortedUniqueLines([
2308
2316
  ...collectSwiftRegexLines(source, /\b(?:self\s*\.\s*)?wait\s*\(\s*for\s*:/),
2309
2317
  ...collectSwiftRegexLines(source, /\bwaitForExpectations\s*\(/),
@@ -103,7 +103,7 @@ const isFunctionalPath = (filePath: string): boolean => {
103
103
  return PRE_WRITE_FUNCTIONAL_EXTENSIONS.some((extension) => normalized.endsWith(extension));
104
104
  };
105
105
 
106
- const collectStagedPaths = (repoRoot: string): ReadonlyArray<string> => {
106
+ const collectStagedPaths = (repoRoot: string): ReadonlyArray<string> | null => {
107
107
  try {
108
108
  return execFileSync('git', ['diff', '--cached', '--name-only'], {
109
109
  cwd: repoRoot,
@@ -114,7 +114,7 @@ const collectStagedPaths = (repoRoot: string): ReadonlyArray<string> => {
114
114
  .map((line) => line.trim())
115
115
  .filter((line) => line.length > 0);
116
116
  } catch {
117
- return [];
117
+ return null;
118
118
  }
119
119
  };
120
120
 
@@ -124,7 +124,7 @@ const resolvePreWriteRefreshScope = (aiGate: ReturnType<typeof evaluateAiGate>):
124
124
  return { kind: 'workingTree' };
125
125
  }
126
126
  const stagedPaths = collectStagedPaths(aiGate.repo_state.repo_root);
127
- if (stagedPaths.length === 0 || stagedPaths.some(isFunctionalPath)) {
127
+ if (stagedPaths === null || stagedPaths.some(isFunctionalPath)) {
128
128
  return { kind: 'staged' };
129
129
  }
130
130
  return { kind: 'workingTree' };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.305",
3
+ "version": "6.3.307",
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-05-19T19:44:36.203Z",
4
+ "generatedAt": "2026-05-19T20:42:51.075Z",
5
5
  "bundles": [
6
6
  {
7
7
  "name": "android-guidelines",