pumuki-ast-hooks 5.4.5 → 5.4.6

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 (164) hide show
  1. package/package.json +2 -2
  2. package/scripts/hooks-system/application/services/AutonomousOrchestrator.js +2 -0
  3. package/scripts/hooks-system/application/services/ContextDetectionEngine.js +2 -0
  4. package/scripts/hooks-system/application/services/DynamicRulesLoader.js +3 -1
  5. package/scripts/hooks-system/application/services/GitFlowService.js +2 -0
  6. package/scripts/hooks-system/application/services/GitTreeState.js +1 -0
  7. package/scripts/hooks-system/application/services/HookSystemScheduler.js +2 -0
  8. package/scripts/hooks-system/application/services/IntelligentCommitAnalyzer.js +4 -1
  9. package/scripts/hooks-system/application/services/IntelligentGitTreeMonitor.js +2 -0
  10. package/scripts/hooks-system/application/services/PlatformAnalysisService.js +2 -0
  11. package/scripts/hooks-system/application/services/PlatformDetectionService.js +3 -1
  12. package/scripts/hooks-system/application/services/PlaybookRunner.js +3 -0
  13. package/scripts/hooks-system/application/services/PredictiveHookAdvisor.js +2 -0
  14. package/scripts/hooks-system/application/services/RealtimeGuardPlugin.js +2 -0
  15. package/scripts/hooks-system/application/services/SmartDirtyTreeAnalyzer.js +2 -0
  16. package/scripts/hooks-system/application/services/commit/CommitMessageGenerator.js +3 -1
  17. package/scripts/hooks-system/application/services/commit/FeatureDetector.js +5 -1
  18. package/scripts/hooks-system/application/services/evidence/EvidenceContextManager.js +1 -0
  19. package/scripts/hooks-system/application/services/guard/GuardAutoManagerService.js +1 -0
  20. package/scripts/hooks-system/application/services/guard/GuardConfig.js +3 -1
  21. package/scripts/hooks-system/application/services/guard/GuardEventLogger.js +2 -0
  22. package/scripts/hooks-system/application/services/guard/GuardHealthReminder.js +5 -1
  23. package/scripts/hooks-system/application/services/guard/GuardHeartbeatMonitor.js +2 -0
  24. package/scripts/hooks-system/application/services/guard/GuardLockManager.js +2 -0
  25. package/scripts/hooks-system/application/services/guard/GuardMonitorLoop.js +3 -1
  26. package/scripts/hooks-system/application/services/guard/GuardNotificationHandler.js +4 -0
  27. package/scripts/hooks-system/application/services/guard/GuardNotifier.js +3 -1
  28. package/scripts/hooks-system/application/services/guard/GuardProcessManager.js +2 -0
  29. package/scripts/hooks-system/application/services/guard/GuardRecoveryService.js +3 -0
  30. package/scripts/hooks-system/application/services/installation/ConfigurationGeneratorService.js +4 -0
  31. package/scripts/hooks-system/application/services/installation/FileSystemInstallerService.js +3 -0
  32. package/scripts/hooks-system/application/services/installation/GitEnvironmentService.js +3 -0
  33. package/scripts/hooks-system/application/services/installation/HookInstaller.js +4 -0
  34. package/scripts/hooks-system/application/services/installation/IdeIntegrationService.js +3 -0
  35. package/scripts/hooks-system/application/services/installation/InstallService.js +3 -0
  36. package/scripts/hooks-system/application/services/installation/McpConfigurator.js +1 -0
  37. package/scripts/hooks-system/application/services/installation/PlatformDetectorService.js +4 -0
  38. package/scripts/hooks-system/application/services/installation/VSCodeTaskConfigurator.js +4 -0
  39. package/scripts/hooks-system/application/services/logging/UnifiedLogger.js +2 -0
  40. package/scripts/hooks-system/application/services/monitoring/ActivityMonitor.js +2 -0
  41. package/scripts/hooks-system/application/services/monitoring/AstMonitor.js +2 -0
  42. package/scripts/hooks-system/application/services/monitoring/DevDocsMonitor.js +2 -0
  43. package/scripts/hooks-system/application/services/monitoring/EvidenceMonitor.js +2 -0
  44. package/scripts/hooks-system/application/services/monitoring/EvidenceMonitorService.js +1 -0
  45. package/scripts/hooks-system/application/services/monitoring/GitTreeMonitor.js +2 -0
  46. package/scripts/hooks-system/application/services/monitoring/GitTreeMonitorService.js +3 -0
  47. package/scripts/hooks-system/application/services/monitoring/HealthCheckService.js +2 -0
  48. package/scripts/hooks-system/application/services/monitoring/HeartbeatMonitorService.js +2 -0
  49. package/scripts/hooks-system/application/services/monitoring/TokenMonitor.js +2 -0
  50. package/scripts/hooks-system/application/services/notification/MacNotificationSender.js +2 -0
  51. package/scripts/hooks-system/application/services/notification/NotificationCenterService.js +2 -0
  52. package/scripts/hooks-system/application/services/notification/NotificationDispatcher.js +3 -0
  53. package/scripts/hooks-system/application/services/notification/components/NotificationCooldownManager.js +3 -0
  54. package/scripts/hooks-system/application/services/notification/components/NotificationDeduplicator.js +2 -0
  55. package/scripts/hooks-system/application/services/notification/components/NotificationQueue.js +3 -0
  56. package/scripts/hooks-system/application/services/notification/components/NotificationRetryExecutor.js +4 -0
  57. package/scripts/hooks-system/application/services/platform/PlatformHeuristics.js +2 -0
  58. package/scripts/hooks-system/application/services/recovery/AutoRecoveryManager.js +2 -0
  59. package/scripts/hooks-system/application/services/smart-commit/CommitMessageSuggester.js +4 -0
  60. package/scripts/hooks-system/application/services/smart-commit/FileContextGrouper.js +2 -0
  61. package/scripts/hooks-system/application/services/smart-commit/SmartCommitSummaryBuilder.js +6 -0
  62. package/scripts/hooks-system/application/services/token/CursorTokenService.js +1 -0
  63. package/scripts/hooks-system/application/services/token/TokenMetricsService.js +4 -0
  64. package/scripts/hooks-system/application/services/token/TokenMonitorService.js +1 -0
  65. package/scripts/hooks-system/application/services/token/TokenStatusReporter.js +2 -0
  66. package/scripts/hooks-system/application/state/HookSystemStateMachine.js +2 -0
  67. package/scripts/hooks-system/application/use-cases/AnalyzeCodebaseUseCase.js +2 -0
  68. package/scripts/hooks-system/application/use-cases/AnalyzeStagedFilesUseCase.js +2 -0
  69. package/scripts/hooks-system/application/use-cases/AutoExecuteAIStartUseCase.js +2 -0
  70. package/scripts/hooks-system/application/use-cases/BlockCommitUseCase.js +2 -0
  71. package/scripts/hooks-system/application/use-cases/GenerateAuditReportUseCase.js +3 -0
  72. package/scripts/hooks-system/bin/audit-library.js +5 -4
  73. package/scripts/hooks-system/bin/auto-fix-violations.js +1 -0
  74. package/scripts/hooks-system/bin/auto-restart-guards.js +3 -2
  75. package/scripts/hooks-system/bin/check-doc-drift.js +1 -0
  76. package/scripts/hooks-system/bin/check-version.js +26 -25
  77. package/scripts/hooks-system/bin/cli.js +1 -0
  78. package/scripts/hooks-system/bin/guard-auto-manager.js +1 -0
  79. package/scripts/hooks-system/bin/guard-supervisor.js +1 -0
  80. package/scripts/hooks-system/bin/hook-status.js +1 -0
  81. package/scripts/hooks-system/bin/install.js +1 -0
  82. package/scripts/hooks-system/bin/nightly-metrics-report.js +1 -0
  83. package/scripts/hooks-system/bin/plan-review.js +1 -0
  84. package/scripts/hooks-system/bin/predictive-hooks.js +1 -0
  85. package/scripts/hooks-system/bin/pumuki-audit.js +1 -0
  86. package/scripts/hooks-system/bin/pumuki-init.js +1 -0
  87. package/scripts/hooks-system/bin/pumuki-mcp.js +1 -0
  88. package/scripts/hooks-system/bin/pumuki-rules.js +1 -0
  89. package/scripts/hooks-system/bin/run-ast-adapter.js +2 -0
  90. package/scripts/hooks-system/bin/run-orchestrator.js +1 -0
  91. package/scripts/hooks-system/bin/run-playbook.js +1 -0
  92. package/scripts/hooks-system/bin/setup-eslint.js +1 -0
  93. package/scripts/hooks-system/bin/violations-api.js +1 -0
  94. package/scripts/hooks-system/bin/watch-hooks.js +1 -0
  95. package/scripts/hooks-system/domain/errors/index.js +2 -0
  96. package/scripts/hooks-system/domain/services/AuditAnalyzer.js +2 -0
  97. package/scripts/hooks-system/domain/services/AuditFilter.js +5 -0
  98. package/scripts/hooks-system/domain/services/AuditResultSerializer.js +5 -0
  99. package/scripts/hooks-system/domain/services/AuditScorer.js +6 -0
  100. package/scripts/hooks-system/infrastructure/adapters/AstAnalyzerAdapter.js +3 -0
  101. package/scripts/hooks-system/infrastructure/adapters/FileEvidenceAdapter.js +2 -0
  102. package/scripts/hooks-system/infrastructure/adapters/GitCliAdapter.js +4 -0
  103. package/scripts/hooks-system/infrastructure/adapters/GitCommandAdapter.js +4 -0
  104. package/scripts/hooks-system/infrastructure/adapters/GitHubCliAdapter.js +2 -0
  105. package/scripts/hooks-system/infrastructure/adapters/GitQueryAdapter.js +4 -0
  106. package/scripts/hooks-system/infrastructure/adapters/LegacyAnalyzerAdapter.js +2 -0
  107. package/scripts/hooks-system/infrastructure/adapters/MacOSNotificationAdapter.js +4 -0
  108. package/scripts/hooks-system/infrastructure/adapters/git/GitCommandRunner.js +2 -0
  109. package/scripts/hooks-system/infrastructure/adapters/git/GitCommandService.js +3 -0
  110. package/scripts/hooks-system/infrastructure/adapters/git/GitQueryService.js +3 -0
  111. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidASTIntelligentAnalyzer.js +2 -0
  112. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidASTParser.js +2 -0
  113. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidAnalysisOrchestrator.js +2 -0
  114. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidArchitectureDetector.js +7 -5
  115. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidClassAnalyzer.js +3 -0
  116. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidForbiddenLiteralsAnalyzer.js +1 -0
  117. package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidSOLIDAnalyzer.js +2 -0
  118. package/scripts/hooks-system/infrastructure/ast/archive/ios-rules.js +2 -0
  119. package/scripts/hooks-system/infrastructure/ast/archive/kotlin-analyzer.js +2 -0
  120. package/scripts/hooks-system/infrastructure/ast/archive/kotlin-parser.js +2 -0
  121. package/scripts/hooks-system/infrastructure/ast/archive/swift-analyzer.js +2 -0
  122. package/scripts/hooks-system/infrastructure/ast/backend/analyzers/BackendArchitectureDetector.js +2 -0
  123. package/scripts/hooks-system/infrastructure/ast/backend/analyzers/BackendPatternDetector.js +2 -0
  124. package/scripts/hooks-system/infrastructure/ast/common/BDDTDDWorkflowRules.js +2 -0
  125. package/scripts/hooks-system/infrastructure/ast/common/rules/BDDRules.js +2 -0
  126. package/scripts/hooks-system/infrastructure/ast/common/rules/ImplementationRules.js +2 -0
  127. package/scripts/hooks-system/infrastructure/ast/common/rules/TDDRules.js +2 -0
  128. package/scripts/hooks-system/infrastructure/ast/common/rules/WorkflowRules.js +2 -0
  129. package/scripts/hooks-system/infrastructure/ast/frontend/analyzers/FrontendArchitectureDetector.js +16 -14
  130. package/scripts/hooks-system/infrastructure/ast/frontend/analyzers/FrontendForbiddenLiteralsAnalyzer.js +5 -0
  131. package/scripts/hooks-system/infrastructure/ast/frontend/analyzers/FrontendSOLIDAnalyzer.js +2 -0
  132. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSASTIntelligentAnalyzer.js +2 -0
  133. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSArchitectureDetector.js +12 -10
  134. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSArchitectureRules.js +2 -0
  135. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSCICDRules.js +2 -0
  136. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSEnterpriseAnalyzer.js +2 -0
  137. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSForbiddenLiteralsAnalyzer.js +1 -0
  138. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSNetworkingAdvancedRules.js +2 -0
  139. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSPerformanceRules.js +3 -0
  140. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSSPMRules.js +2 -0
  141. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSSwiftUIAdvancedRules.js +2 -0
  142. package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSTestingAdvancedRules.js +2 -0
  143. package/scripts/hooks-system/infrastructure/ast/ios/native-bridge.js +1 -0
  144. package/scripts/hooks-system/infrastructure/ast/ios/parsers/SourceKittenParser.js +2 -0
  145. package/scripts/hooks-system/infrastructure/cli/install-wizard.js +1 -0
  146. package/scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js +96 -41
  147. package/scripts/hooks-system/infrastructure/mcp/evidence-watcher.js +1 -0
  148. package/scripts/hooks-system/infrastructure/mcp/services/EvidenceService.js +4 -0
  149. package/scripts/hooks-system/infrastructure/mcp/services/McpProtocolHandler.js +2 -0
  150. package/scripts/hooks-system/infrastructure/orchestration/intelligent-audit.js +1 -1
  151. package/scripts/hooks-system/infrastructure/reporting/report-generator.js +2 -0
  152. package/scripts/hooks-system/infrastructure/repositories/CursorTokenRepository.js +4 -0
  153. package/scripts/hooks-system/infrastructure/repositories/FileFindingsRepository.js +2 -0
  154. package/scripts/hooks-system/infrastructure/repositories/datasources/CursorApiDataSource.js +4 -0
  155. package/scripts/hooks-system/infrastructure/repositories/datasources/CursorFileDataSource.js +2 -0
  156. package/scripts/hooks-system/infrastructure/severity/policies/gate-policies.js +1 -0
  157. package/scripts/hooks-system/infrastructure/severity/severity-evaluator.js +2 -0
  158. package/scripts/hooks-system/infrastructure/telemetry/TelemetryService.js +2 -0
  159. package/scripts/hooks-system/infrastructure/telemetry/metrics-logger.js +2 -0
  160. package/scripts/hooks-system/infrastructure/utils/token-manager.js +2 -0
  161. package/scripts/hooks-system/infrastructure/validators/detect-commit-language.js +1 -0
  162. package/scripts/hooks-system/infrastructure/watchdog/auto-recovery.js +1 -0
  163. package/scripts/hooks-system/infrastructure/watchdog/health-check.js +1 -0
  164. package/scripts/hooks-system/infrastructure/watchdog/token-monitor.js +2 -0
@@ -1,4 +1,5 @@
1
1
  const { SyntaxKind } = require('../../ast-core');
2
+ const AuditLogger = require('../../../application/services/logging/AuditLogger');
2
3
 
3
4
  const FORBIDDEN_STRING_LITERALS = [
4
5
  'unknown',
@@ -22,6 +23,10 @@ const FORBIDDEN_STATUS_LITERALS = [
22
23
  const MAGIC_NUMBERS = [0, 1];
23
24
 
24
25
  class FrontendForbiddenLiteralsAnalyzer {
26
+ constructor() {
27
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
28
+ }
29
+
25
30
  analyze(sf, findings, pushFinding) {
26
31
  const stringLiterals = sf.getDescendantsOfKind(SyntaxKind.StringLiteral);
27
32
  const numericLiterals = sf.getDescendantsOfKind(SyntaxKind.NumericLiteral);
@@ -1,6 +1,7 @@
1
1
 
2
2
  const path = require('path');
3
3
  const { pushFinding, SyntaxKind } = require(path.join(__dirname, '../../ast-core'));
4
+ const AuditLogger = require('../../../application/services/logging/AuditLogger');
4
5
 
5
6
  /**
6
7
  * FrontendSOLIDAnalyzer
@@ -12,6 +13,7 @@ const { pushFinding, SyntaxKind } = require(path.join(__dirname, '../../ast-core
12
13
  class FrontendSOLIDAnalyzer {
13
14
  constructor() {
14
15
  this.findings = [];
16
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
15
17
  }
16
18
 
17
19
  /**
@@ -4,10 +4,12 @@ const fs = require('fs');
4
4
  const path = require('path');
5
5
  const crypto = require('crypto');
6
6
  const env = require(path.join(__dirname, '../../../../config/env'));
7
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
7
8
 
8
9
  class iOSASTIntelligentAnalyzer {
9
10
  constructor(findings) {
10
11
  this.findings = findings;
12
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
11
13
  this.sourceKittenPath = '/opt/homebrew/bin/sourcekitten';
12
14
  this.isAvailable = this.checkSourceKitten();
13
15
  this.hasSwiftSyntax = this.checkSwiftSyntax();
@@ -1,12 +1,14 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
3
  const glob = require('glob');
4
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
4
5
 
5
6
  class iOSArchitectureDetector {
6
7
  constructor(projectRoot) {
7
8
  this.projectRoot = projectRoot;
9
+ this.auditLogger = new AuditLogger({ repoRoot: projectRoot });
8
10
  this.patterns = {
9
- featureFirstClean: 0,
11
+ featureFirstClean: 0,
10
12
  mvvm: 0,
11
13
  mvvmc: 0,
12
14
  mvp: 0,
@@ -81,7 +83,7 @@ class iOSArchitectureDetector {
81
83
  );
82
84
 
83
85
  if (hasFeaturesFolders) {
84
- this.patterns.featureFirstClean += 10;
86
+ this.patterns.featureFirstClean += 10;
85
87
  }
86
88
 
87
89
  if (foundCleanFolders.length >= 3) {
@@ -247,8 +249,8 @@ class iOSArchitectureDetector {
247
249
  const content = this.readFile(file);
248
250
 
249
251
  if (content.includes('protocol Coordinator') ||
250
- content.includes(': Coordinator') ||
251
- /func\s+start\(\)/.test(content) && /func\s+navigate/.test(content)) {
252
+ content.includes(': Coordinator') ||
253
+ /func\s+start\(\)/.test(content) && /func\s+navigate/.test(content)) {
252
254
  this.patterns.mvvmc += 2;
253
255
  }
254
256
  });
@@ -288,16 +290,16 @@ class iOSArchitectureDetector {
288
290
  const interactorFiles = files.filter(f => /Interactor\.swift$/.test(f));
289
291
 
290
292
  if (viewControllerFiles.length >= 2 &&
291
- viewModelFiles.length === 0 &&
292
- presenterFiles.length === 0 &&
293
- interactorFiles.length === 0) {
293
+ viewModelFiles.length === 0 &&
294
+ presenterFiles.length === 0 &&
295
+ interactorFiles.length === 0) {
294
296
 
295
297
  viewControllerFiles.forEach(file => {
296
298
  const content = this.readFile(file);
297
299
  const lines = content.split('\n').length;
298
300
 
299
301
  if (lines > 300) {
300
- this.patterns.mvc += 3;
302
+ this.patterns.mvc += 3;
301
303
  } else if (lines > 150) {
302
304
  this.patterns.mvc += 2;
303
305
  } else {
@@ -323,7 +325,7 @@ class iOSArchitectureDetector {
323
325
  }
324
326
 
325
327
  if (sorted.length > 1 && sorted[1][1] >= dominantScore * 0.7) {
326
- return 'MIXED';
328
+ return 'MIXED';
327
329
  }
328
330
 
329
331
  return this.normalizePatternName(dominant);
@@ -331,7 +333,7 @@ class iOSArchitectureDetector {
331
333
 
332
334
  normalizePatternName(pattern) {
333
335
  const mapping = {
334
- 'featureFirstClean': 'FEATURE_FIRST_CLEAN_DDD',
336
+ 'featureFirstClean': 'FEATURE_FIRST_CLEAN_DDD',
335
337
  'mvvm': 'MVVM',
336
338
  'mvvmc': 'MVVM-C',
337
339
  'mvp': 'MVP',
@@ -1,9 +1,11 @@
1
1
  const { pushFinding } = require('../../ast-core');
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
2
3
 
3
4
  class iOSArchitectureRules {
4
5
  constructor(findings, detectedPattern) {
5
6
  this.findings = findings;
6
7
  this.pattern = detectedPattern;
8
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
7
9
  }
8
10
 
9
11
  runRules(files) {
@@ -12,11 +12,13 @@ const { pushFinding } = require('../../ast-core');
12
12
  const fs = require('fs');
13
13
  const path = require('path');
14
14
  const glob = require('glob');
15
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
15
16
 
16
17
  class iOSCICDRules {
17
18
  constructor(findings, projectRoot) {
18
19
  this.findings = findings;
19
20
  this.projectRoot = projectRoot;
21
+ this.auditLogger = new AuditLogger({ repoRoot: projectRoot });
20
22
  }
21
23
 
22
24
  analyze() {
@@ -2,11 +2,13 @@ const path = require('path');
2
2
  const fs = require('fs').promises;
3
3
  const { SourceKittenParser } = require('../parsers/SourceKittenParser');
4
4
  const { pushFinding, mapToLevel } = require(path.join(__dirname, '../../ast-core'));
5
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
5
6
 
6
7
  class iOSEnterpriseAnalyzer {
7
8
  constructor() {
8
9
  this.parser = new SourceKittenParser();
9
10
  this.findings = [];
11
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
10
12
  }
11
13
 
12
14
  async analyzeFile(filePath, findings) {
@@ -1,4 +1,5 @@
1
1
  const { SyntaxKind } = require('../../ast-core');
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
2
3
 
3
4
  const FORBIDDEN_STRING_LITERALS = [
4
5
  'unknown',
@@ -9,10 +9,12 @@
9
9
  const { pushFinding } = require('../../ast-core');
10
10
  const fs = require('fs');
11
11
  const glob = require('glob');
12
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
12
13
 
13
14
  class iOSNetworkingAdvancedRules {
14
15
  constructor(findings, projectRoot) {
15
16
  this.findings = findings;
17
+ this.auditLogger = new AuditLogger({ repoRoot: projectRoot });
16
18
  this.projectRoot = projectRoot;
17
19
  }
18
20
 
@@ -1,6 +1,9 @@
1
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
2
+
1
3
  class iOSPerformanceRules {
2
4
  constructor(findings) {
3
5
  this.findings = findings;
6
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
4
7
  }
5
8
 
6
9
  analyzeFile(filePath, content) {
@@ -13,11 +13,13 @@
13
13
  const { pushFinding } = require('../../ast-core');
14
14
  const fs = require('fs');
15
15
  const path = require('path');
16
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
16
17
 
17
18
  class iOSSPMRules {
18
19
  constructor(findings, projectRoot) {
19
20
  this.findings = findings;
20
21
  this.projectRoot = projectRoot;
22
+ this.auditLogger = new AuditLogger({ repoRoot: projectRoot });
21
23
  }
22
24
 
23
25
  analyze() {
@@ -12,10 +12,12 @@
12
12
 
13
13
  const { pushFinding } = require('../../ast-core');
14
14
  const fs = require('fs');
15
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
15
16
 
16
17
  class iOSSwiftUIAdvancedRules {
17
18
  constructor(findings) {
18
19
  this.findings = findings;
20
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
19
21
  }
20
22
 
21
23
  analyzeFile(filePath, ast) {
@@ -10,10 +10,12 @@ const { pushFinding } = require('../../ast-core');
10
10
  const fs = require('fs');
11
11
  const glob = require('glob');
12
12
  const path = require('path');
13
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
13
14
 
14
15
  class iOSTestingAdvancedRules {
15
16
  constructor(findings, projectRoot) {
16
17
  this.findings = findings;
18
+ this.auditLogger = new AuditLogger({ repoRoot: projectRoot });
17
19
  this.projectRoot = projectRoot;
18
20
  }
19
21
 
@@ -3,6 +3,7 @@ const path = require('path');
3
3
  const fs = require('fs');
4
4
  const { pushFileFinding } = require('../ast-core');
5
5
  const env = require(path.join(__dirname, '../../../config/env'));
6
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
6
7
 
7
8
  function getStagedSwiftFiles(repoRoot) {
8
9
  try {
@@ -5,6 +5,7 @@ const util = require('util');
5
5
  const fs = require('fs').promises;
6
6
  const path = require('path');
7
7
  const { DomainError } = require('../../../../domain/errors');
8
+ const AuditLogger = require('../../../../application/services/logging/AuditLogger');
8
9
 
9
10
  const execPromise = util.promisify(exec);
10
11
 
@@ -20,6 +21,7 @@ class SourceKittenParser {
20
21
  constructor() {
21
22
  this.sourceKittenPath = '/opt/homebrew/bin/sourcekitten';
22
23
  this.timeout = 30000;
24
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
23
25
  }
24
26
 
25
27
  /**
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ const env = require('../../config/env');
3
4
  const fs = require('fs');
4
5
  const path = require('path');
5
6
  const readline = require('readline');
@@ -57,14 +57,25 @@ const MCP_LOCK_DIR = path.join(REPO_ROOT, '.audit_tmp', 'mcp-singleton.lock');
57
57
  const MCP_LOCK_PID = path.join(MCP_LOCK_DIR, 'pid');
58
58
 
59
59
  let MCP_IS_PRIMARY = true;
60
- let MCP_PRIMARY_PID = null;
60
+
61
+ function logMcpError(context, error) {
62
+ const msg = error instanceof Error ? error.message : String(error);
63
+ process.stderr.write(`[MCP][ERROR] ${context}: ${msg}\n`);
64
+ }
65
+
66
+ function logMcpDebug(message) {
67
+ if (process.env.DEBUG) {
68
+ process.stderr.write(`[MCP][DEBUG] ${message}\n`);
69
+ }
70
+ }
61
71
 
62
72
  function isPidRunning(pid) {
63
73
  if (!pid || !Number.isFinite(pid) || pid <= 0) return false;
64
74
  try {
65
75
  process.kill(pid, 0);
66
76
  return true;
67
- } catch {
77
+ } catch (error) {
78
+ logMcpDebug(`isPidRunning(${pid}) = false: ${error.code || error.message}`);
68
79
  return false;
69
80
  }
70
81
  }
@@ -76,7 +87,8 @@ function safeReadPid(filePath) {
76
87
  const pid = Number(raw);
77
88
  if (!Number.isFinite(pid) || pid <= 0) return null;
78
89
  return pid;
79
- } catch {
90
+ } catch (error) {
91
+ logMcpError('safeReadPid', error);
80
92
  return null;
81
93
  }
82
94
  }
@@ -85,68 +97,122 @@ function removeLockDir() {
85
97
  try {
86
98
  if (fs.existsSync(MCP_LOCK_PID)) {
87
99
  fs.unlinkSync(MCP_LOCK_PID);
100
+ logMcpDebug('Removed lock PID file');
88
101
  }
89
- } catch {
90
- // ignore
102
+ } catch (error) {
103
+ logMcpError('removeLockDir (pid file)', error);
91
104
  }
92
105
  try {
93
106
  if (fs.existsSync(MCP_LOCK_DIR)) {
94
107
  fs.rmdirSync(MCP_LOCK_DIR);
108
+ logMcpDebug('Removed lock directory');
95
109
  }
96
- } catch {
97
- // ignore
110
+ } catch (error) {
111
+ logMcpError('removeLockDir (directory)', error);
112
+ }
113
+ }
114
+
115
+ function cleanupAndExit(code = 0) {
116
+ const myPid = process.pid;
117
+ const lockPid = safeReadPid(MCP_LOCK_PID);
118
+
119
+ if (lockPid === myPid) {
120
+ logMcpDebug(`Cleaning up lock (my pid=${myPid})`);
121
+ removeLockDir();
122
+ } else {
123
+ logMcpDebug(`Not cleaning lock (lockPid=${lockPid}, myPid=${myPid})`);
124
+ }
125
+
126
+ process.exit(code);
127
+ }
128
+
129
+ function installStdioExitHandlers() {
130
+ const handleStdioTermination = (source) => (error) => {
131
+ if (error) {
132
+ const code = String(error.code || '').toUpperCase();
133
+ if (code === 'EPIPE' || code === 'ERR_STREAM_DESTROYED' || code === 'ECONNRESET') {
134
+ logMcpDebug(`STDIO ${source} closed (${code}), exiting cleanly`);
135
+ cleanupAndExit(0);
136
+ return;
137
+ }
138
+ logMcpError(`STDIO ${source} error`, error);
139
+ } else {
140
+ logMcpDebug(`STDIO ${source} ended, exiting cleanly`);
141
+ }
142
+ cleanupAndExit(0);
143
+ };
144
+
145
+ try {
146
+ process.stdin.on('end', handleStdioTermination('stdin'));
147
+ process.stdin.on('close', handleStdioTermination('stdin'));
148
+ process.stdin.on('error', handleStdioTermination('stdin'));
149
+ } catch (error) {
150
+ logMcpError('installStdioExitHandlers (stdin)', error);
151
+ }
152
+
153
+ try {
154
+ process.stdout.on('error', handleStdioTermination('stdout'));
155
+ process.stderr.on('error', handleStdioTermination('stderr'));
156
+ } catch (error) {
157
+ logMcpError('installStdioExitHandlers (stdout/stderr)', error);
98
158
  }
99
159
  }
100
160
 
101
161
  function acquireSingletonLock() {
102
162
  try {
103
163
  fs.mkdirSync(path.join(REPO_ROOT, '.audit_tmp'), { recursive: true });
104
- } catch {
105
- // ignore
164
+ } catch (error) {
165
+ logMcpError('acquireSingletonLock (create .audit_tmp)', error);
106
166
  }
107
167
 
108
168
  try {
109
169
  fs.mkdirSync(MCP_LOCK_DIR);
110
170
  } catch (error) {
111
171
  const existingPid = safeReadPid(MCP_LOCK_PID);
172
+
112
173
  if (existingPid && isPidRunning(existingPid)) {
113
- MCP_IS_PRIMARY = false;
114
- MCP_PRIMARY_PID = existingPid;
115
- process.stderr.write(`[MCP] Another instance is already running (pid ${existingPid}). Secondary mode enabled.\n`);
116
- return { acquired: false, pid: existingPid };
174
+ process.stderr.write(`[MCP] Another instance is already running (pid ${existingPid}). Exiting.\n`);
175
+ process.exit(0);
117
176
  }
118
177
 
178
+ logMcpDebug(`Lock exists but PID ${existingPid || 'unknown'} is not running, cleaning up`);
119
179
  removeLockDir();
120
- fs.mkdirSync(MCP_LOCK_DIR);
180
+
181
+ try {
182
+ fs.mkdirSync(MCP_LOCK_DIR);
183
+ } catch (retryError) {
184
+ logMcpError('acquireSingletonLock (retry mkdir)', retryError);
185
+ process.stderr.write(`[MCP] Failed to acquire lock after cleanup. Exiting.\n`);
186
+ process.exit(1);
187
+ }
121
188
  }
122
189
 
123
190
  try {
124
191
  fs.writeFileSync(MCP_LOCK_PID, String(process.pid), { encoding: 'utf8' });
125
- } catch {
126
- // ignore
192
+ logMcpDebug(`Lock acquired, PID ${process.pid} written`);
193
+ } catch (error) {
194
+ logMcpError('acquireSingletonLock (write pid)', error);
127
195
  }
128
196
 
129
- const cleanup = () => {
130
- const pid = safeReadPid(MCP_LOCK_PID);
131
- if (pid === process.pid) {
197
+ process.on('exit', () => {
198
+ const lockPid = safeReadPid(MCP_LOCK_PID);
199
+ if (lockPid === process.pid) {
132
200
  removeLockDir();
133
201
  }
134
- };
135
-
136
- process.on('exit', cleanup);
137
- process.on('SIGINT', () => {
138
- cleanup();
139
- process.exit(0);
140
- });
141
- process.on('SIGTERM', () => {
142
- cleanup();
143
- process.exit(0);
144
202
  });
145
203
 
204
+ process.on('SIGINT', () => cleanupAndExit(0));
205
+ process.on('SIGTERM', () => cleanupAndExit(0));
206
+ process.on('SIGHUP', () => cleanupAndExit(0));
207
+
146
208
  return { acquired: true, pid: process.pid };
147
209
  }
148
210
 
149
- acquireSingletonLock();
211
+ const singleton = acquireSingletonLock();
212
+ if (!singleton.acquired) {
213
+ process.exit(0);
214
+ }
215
+ installStdioExitHandlers();
150
216
 
151
217
  // Lazy-loaded CompositionRoot - only initialized when first needed
152
218
  let _compositionRoot = null;
@@ -767,17 +833,6 @@ async function handleMcpMessage(message) {
767
833
  try {
768
834
  const request = JSON.parse(message);
769
835
 
770
- if (!MCP_IS_PRIMARY && request.method !== 'initialize' && request.method !== 'resources/list' && request.method !== 'resources/read' && request.method !== 'tools/list') {
771
- return {
772
- jsonrpc: '2.0',
773
- id: request.id,
774
- error: {
775
- code: -32603,
776
- message: `MCP instance already running (pid ${MCP_PRIMARY_PID || 'unknown'}). Please restart the IDE or kill the running instance.`
777
- }
778
- };
779
- }
780
-
781
836
  if ((typeof request.id === 'undefined' || request.id === null) && request.method?.startsWith('notifications/')) {
782
837
  return null;
783
838
  }
@@ -6,6 +6,7 @@
6
6
  * The AI can automatically check if evidence is stale and update it
7
7
  */
8
8
 
9
+ const env = require('../../config/env');
9
10
  const path = require('path');
10
11
  const McpProtocolHandler = require('./services/McpProtocolHandler');
11
12
  const EvidenceService = require('./services/EvidenceService');
@@ -1,3 +1,6 @@
1
+ const env = require('../../config/env');
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
3
+
1
4
  const fs = require('fs');
2
5
  const path = require('path');
3
6
  const { execSync } = require('child_process');
@@ -5,6 +8,7 @@ const { execSync } = require('child_process');
5
8
  class EvidenceService {
6
9
  constructor(repoRoot, logger) {
7
10
  this.repoRoot = repoRoot || process.env.REPO_ROOT || process.cwd();
11
+ this.auditLogger = new AuditLogger({ repoRoot: this.repoRoot, logger });
8
12
  this.evidenceFile = path.join(this.repoRoot, '.AI_EVIDENCE.json');
9
13
  this.maxEvidenceAge = 180; // 3 minutes
10
14
  this.logger = logger;
@@ -1,10 +1,12 @@
1
1
  const MCP_VERSION = '2024-11-05';
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
2
3
 
3
4
  class McpProtocolHandler {
4
5
  constructor(inputStream, outputStream, logger) {
5
6
  this.inputStream = inputStream;
6
7
  this.outputStream = outputStream;
7
8
  this.logger = logger;
9
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd(), logger });
8
10
  this.buffer = Buffer.alloc(0);
9
11
  }
10
12
 
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ const env = require('../../config/env');
3
4
  const { evaluateViolations } = require('../severity/severity-evaluator');
4
5
  const { GatePolicies } = require('../severity/policies/gate-policies');
5
6
  const { ReportGenerator } = require('../reporting/report-generator');
@@ -8,7 +9,6 @@ const { TokenManager } = require('../utils/token-manager');
8
9
  const { toErrorMessage } = require('../utils/error-utils');
9
10
  const fs = require('fs');
10
11
  const path = require('path');
11
- const env = require('../../../config/env.js');
12
12
 
13
13
  function resolveAuditTmpDir() {
14
14
  const configured = (env.get('AUDIT_TMP', '') || '').trim();
@@ -1,3 +1,5 @@
1
+ const env = require('../../config/env');
2
+
1
3
  const fs = require('fs');
2
4
  const path = require('path');
3
5
  const ReportPresenter = require('./ReportPresenter');
@@ -1,3 +1,6 @@
1
+ const env = require('../../config/env');
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
3
+
1
4
  const path = require('path');
2
5
  const ICursorTokenRepository = require('../../domain/repositories/ICursorTokenRepository');
3
6
  const CursorApiDataSource = require('./datasources/CursorApiDataSource');
@@ -17,6 +20,7 @@ class CursorTokenRepository extends ICursorTokenRepository {
17
20
  this.apiDataSource = new CursorApiDataSource({ apiUrl, apiToken, fetchImpl, logger });
18
21
  this.fileDataSource = new CursorFileDataSource({ usageFile, logger });
19
22
  this.logger = logger;
23
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd(), logger });
20
24
  }
21
25
 
22
26
  /**
@@ -4,6 +4,7 @@ const path = require('path');
4
4
  const IFindingsRepository = require('../../domain/repositories/IFindingsRepository');
5
5
  const Finding = require('../../domain/entities/Finding');
6
6
  const AuditResult = require('../../domain/entities/AuditResult');
7
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
7
8
 
8
9
  class FileFindingsRepository extends IFindingsRepository {
9
10
  constructor(basePath = '.audit_tmp') {
@@ -11,6 +12,7 @@ class FileFindingsRepository extends IFindingsRepository {
11
12
  this.basePath = basePath;
12
13
  this.findingsFile = path.join(basePath, 'findings.json');
13
14
  this.auditResultFile = path.join(basePath, 'audit-result.json');
15
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
14
16
  }
15
17
 
16
18
  async ensureDirectory() {
@@ -1,3 +1,6 @@
1
+ const env = require('../../config/env');
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
3
+
1
4
  const { DomainError } = require('../../../domain/errors');
2
5
 
3
6
  class CursorApiDataSource {
@@ -11,6 +14,7 @@ class CursorApiDataSource {
11
14
  this.apiToken = apiToken;
12
15
  this.fetch = fetchImpl;
13
16
  this.logger = logger;
17
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd(), logger });
14
18
  this.failureCount = 0;
15
19
  this.failureThreshold = 5;
16
20
  this.circuitOpenUntil = null;
@@ -1,4 +1,5 @@
1
1
  const fs = require('fs');
2
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
2
3
 
3
4
  class CursorFileDataSource {
4
5
  constructor({
@@ -9,6 +10,7 @@ class CursorFileDataSource {
9
10
  this.usageFile = usageFile;
10
11
  this.fs = fsModule;
11
12
  this.logger = logger;
13
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd(), logger });
12
14
  }
13
15
 
14
16
  async readUsage() {
@@ -1,4 +1,5 @@
1
1
 
2
+ const env = require('../../../config/env');
2
3
  const fs = require('fs');
3
4
  const path = require('path');
4
5
 
@@ -8,6 +8,7 @@ const { ContextBuilder } = require('./context/context-builder');
8
8
  const RecommendationGenerator = require('./generators/RecommendationGenerator');
9
9
  const ContextMultiplier = require('./scorers/ContextMultiplier');
10
10
  const SeverityMapper = require('./mappers/SeverityMapper');
11
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
11
12
 
12
13
  /**
13
14
  * Main severity evaluator
@@ -22,6 +23,7 @@ class SeverityEvaluator {
22
23
  this.contextBuilder = new ContextBuilder();
23
24
  this.recommendationGenerator = new RecommendationGenerator();
24
25
  this.contextMultiplier = new ContextMultiplier();
26
+ this.auditLogger = new AuditLogger({ repoRoot: process.cwd() });
25
27
 
26
28
  this.weights = {
27
29
  security: 0.40,
@@ -1,9 +1,11 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
+ const AuditLogger = require('../../application/services/logging/AuditLogger');
3
4
 
4
5
  class TelemetryService {
5
6
  constructor(repoRoot) {
6
7
  this.repoRoot = repoRoot || process.cwd();
8
+ this.auditLogger = new AuditLogger({ repoRoot: this.repoRoot });
7
9
  this.logFile = path.join(this.repoRoot, '.audit_tmp/autonomous-decisions.jsonl');
8
10
  this.thresholds = {
9
11
  autoExecute: 90,
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ const env = require('../../config/env');
4
+
3
5
  /**
4
6
  * Simple metrics logger stub for the hook-system platform.
5
7
  * Usage (programmatic):