pumuki-ast-hooks 5.5.57 → 5.5.60

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/README.md CHANGED
@@ -866,6 +866,15 @@ Automates the complete Git Flow cycle: commit → push → PR → merge, plus co
866
866
 
867
867
  For more details, see [MCP_SERVERS.md](./docs/MCP_SERVERS.md).
868
868
 
869
+ #### Troubleshooting
870
+
871
+ If `ai_gate_check` behaves inconsistently (stale branch name, missing rules, or intermittent transport errors), verify you are not running multiple `ast-intelligence-automation` servers across different repositories.
872
+
873
+ - Prefer enabling a single MCP server for the repository you are working on.
874
+ - Verify the active process points to this repository path:
875
+ - `.../ast-intelligence-hooks/scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js`
876
+ - If you detect multiple processes, stop the duplicates and restart your IDE/MCP servers.
877
+
869
878
  ---
870
879
 
871
880
  ## API Reference
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki-ast-hooks",
3
- "version": "5.5.57",
3
+ "version": "5.5.60",
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": {
@@ -134,4 +134,4 @@
134
134
  "./skills": "./skills/skill-rules.json",
135
135
  "./hooks": "./hooks/index.js"
136
136
  }
137
- }
137
+ }
@@ -3,7 +3,6 @@ const path = require('path');
3
3
  const AuditLogger = require('../logging/AuditLogger');
4
4
  const McpServerConfigBuilder = require('./mcp/McpServerConfigBuilder');
5
5
  const McpProjectConfigWriter = require('./mcp/McpProjectConfigWriter');
6
- const McpGlobalConfigCleaner = require('./mcp/McpGlobalConfigCleaner');
7
6
 
8
7
  const COLORS = {
9
8
  reset: '\x1b[0m',
@@ -19,7 +18,6 @@ class McpConfigurator {
19
18
  this.logger = logger;
20
19
  this.serverConfigBuilder = new McpServerConfigBuilder(targetRoot, hookSystemRoot, logger);
21
20
  this.projectWriter = new McpProjectConfigWriter(targetRoot, logger, this.logSuccess.bind(this), this.logWarning.bind(this), this.logInfo.bind(this));
22
- this.globalCleaner = new McpGlobalConfigCleaner(targetRoot, logger, this.logInfo.bind(this));
23
21
  }
24
22
 
25
23
  configure() {
@@ -27,7 +25,6 @@ class McpConfigurator {
27
25
 
28
26
  const { serverId, mcpConfig } = this.serverConfigBuilder.build();
29
27
  this.projectWriter.configureProjectScoped(mcpConfig, serverId);
30
- this.globalCleaner.cleanupGlobalConfig(serverId);
31
28
  }
32
29
 
33
30
  detectIDEs() {
@@ -281,6 +281,11 @@ function runCommonIntelligence(project, findings) {
281
281
 
282
282
  const full = sf.getFullText();
283
283
  const isSpecFile = /\.(spec|test)\.(ts|tsx|js|jsx)$/.test(filePath);
284
+ const isSwiftFile = /\.swift$/i.test(filePath);
285
+
286
+ // Skip secret detection for Swift struct/class properties - they're not hardcoded secrets
287
+ if (isSwiftFile) return;
288
+
284
289
  const secretPattern = /(PASSWORD|TOKEN|SECRET|API_KEY)\s*[:=]\s*['"]([^'"]{8,})['"]/gi;
285
290
  const matches = Array.from(full.matchAll(secretPattern));
286
291
 
@@ -153,7 +153,7 @@ function analyzeClassAST(analyzer, node, filePath) {
153
153
  return true;
154
154
  });
155
155
 
156
- if (name && !/Spec$|Test$|Mock/.test(name)) {
156
+ if (name && !/Spec$|Test$|Mock/.test(name) && !name.includes('Coordinator')) {
157
157
  const complexity = calculateComplexityAST(substructure);
158
158
  analyzer.godClassCandidates.push({
159
159
  name,
@@ -233,8 +233,15 @@ function analyzeClassAST(analyzer, node, filePath) {
233
233
  }
234
234
 
235
235
  // Skip ISP validation for test files - spies/mocks are allowed to have unused properties
236
+ <<<<<<< HEAD
237
+ // Also skip ObservableObject classes - their @Published properties are inherently observed externally
238
+ const isTestFile = /Tests?\/|Spec|Mock|Spy|Stub|Fake|Dummy/.test(filePath);
239
+ const isObservableObject = inheritedTypes.some((t) => t['key.name'] === 'ObservableObject');
240
+ if (!isTestFile && !isObservableObject) {
241
+ =======
236
242
  const isTestFile = /Tests?\/|Spec|Mock|Spy|Stub|Fake|Dummy/.test(filePath);
237
243
  if (!isTestFile) {
244
+ >>>>>>> origin/main
238
245
  const unusedProps = findUnusedPropertiesAST(analyzer, properties, methods);
239
246
  for (const prop of unusedProps) {
240
247
  analyzer.pushFinding(