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.
- package/package.json +2 -2
- package/scripts/hooks-system/application/services/AutonomousOrchestrator.js +2 -0
- package/scripts/hooks-system/application/services/ContextDetectionEngine.js +2 -0
- package/scripts/hooks-system/application/services/DynamicRulesLoader.js +3 -1
- package/scripts/hooks-system/application/services/GitFlowService.js +2 -0
- package/scripts/hooks-system/application/services/GitTreeState.js +1 -0
- package/scripts/hooks-system/application/services/HookSystemScheduler.js +2 -0
- package/scripts/hooks-system/application/services/IntelligentCommitAnalyzer.js +4 -1
- package/scripts/hooks-system/application/services/IntelligentGitTreeMonitor.js +2 -0
- package/scripts/hooks-system/application/services/PlatformAnalysisService.js +2 -0
- package/scripts/hooks-system/application/services/PlatformDetectionService.js +3 -1
- package/scripts/hooks-system/application/services/PlaybookRunner.js +3 -0
- package/scripts/hooks-system/application/services/PredictiveHookAdvisor.js +2 -0
- package/scripts/hooks-system/application/services/RealtimeGuardPlugin.js +2 -0
- package/scripts/hooks-system/application/services/SmartDirtyTreeAnalyzer.js +2 -0
- package/scripts/hooks-system/application/services/commit/CommitMessageGenerator.js +3 -1
- package/scripts/hooks-system/application/services/commit/FeatureDetector.js +5 -1
- package/scripts/hooks-system/application/services/evidence/EvidenceContextManager.js +1 -0
- package/scripts/hooks-system/application/services/guard/GuardAutoManagerService.js +1 -0
- package/scripts/hooks-system/application/services/guard/GuardConfig.js +3 -1
- package/scripts/hooks-system/application/services/guard/GuardEventLogger.js +2 -0
- package/scripts/hooks-system/application/services/guard/GuardHealthReminder.js +5 -1
- package/scripts/hooks-system/application/services/guard/GuardHeartbeatMonitor.js +2 -0
- package/scripts/hooks-system/application/services/guard/GuardLockManager.js +2 -0
- package/scripts/hooks-system/application/services/guard/GuardMonitorLoop.js +3 -1
- package/scripts/hooks-system/application/services/guard/GuardNotificationHandler.js +4 -0
- package/scripts/hooks-system/application/services/guard/GuardNotifier.js +3 -1
- package/scripts/hooks-system/application/services/guard/GuardProcessManager.js +2 -0
- package/scripts/hooks-system/application/services/guard/GuardRecoveryService.js +3 -0
- package/scripts/hooks-system/application/services/installation/ConfigurationGeneratorService.js +4 -0
- package/scripts/hooks-system/application/services/installation/FileSystemInstallerService.js +3 -0
- package/scripts/hooks-system/application/services/installation/GitEnvironmentService.js +3 -0
- package/scripts/hooks-system/application/services/installation/HookInstaller.js +4 -0
- package/scripts/hooks-system/application/services/installation/IdeIntegrationService.js +3 -0
- package/scripts/hooks-system/application/services/installation/InstallService.js +3 -0
- package/scripts/hooks-system/application/services/installation/McpConfigurator.js +1 -0
- package/scripts/hooks-system/application/services/installation/PlatformDetectorService.js +4 -0
- package/scripts/hooks-system/application/services/installation/VSCodeTaskConfigurator.js +4 -0
- package/scripts/hooks-system/application/services/logging/UnifiedLogger.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/ActivityMonitor.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/AstMonitor.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/DevDocsMonitor.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/EvidenceMonitor.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/EvidenceMonitorService.js +1 -0
- package/scripts/hooks-system/application/services/monitoring/GitTreeMonitor.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/GitTreeMonitorService.js +3 -0
- package/scripts/hooks-system/application/services/monitoring/HealthCheckService.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/HeartbeatMonitorService.js +2 -0
- package/scripts/hooks-system/application/services/monitoring/TokenMonitor.js +2 -0
- package/scripts/hooks-system/application/services/notification/MacNotificationSender.js +2 -0
- package/scripts/hooks-system/application/services/notification/NotificationCenterService.js +2 -0
- package/scripts/hooks-system/application/services/notification/NotificationDispatcher.js +3 -0
- package/scripts/hooks-system/application/services/notification/components/NotificationCooldownManager.js +3 -0
- package/scripts/hooks-system/application/services/notification/components/NotificationDeduplicator.js +2 -0
- package/scripts/hooks-system/application/services/notification/components/NotificationQueue.js +3 -0
- package/scripts/hooks-system/application/services/notification/components/NotificationRetryExecutor.js +4 -0
- package/scripts/hooks-system/application/services/platform/PlatformHeuristics.js +2 -0
- package/scripts/hooks-system/application/services/recovery/AutoRecoveryManager.js +2 -0
- package/scripts/hooks-system/application/services/smart-commit/CommitMessageSuggester.js +4 -0
- package/scripts/hooks-system/application/services/smart-commit/FileContextGrouper.js +2 -0
- package/scripts/hooks-system/application/services/smart-commit/SmartCommitSummaryBuilder.js +6 -0
- package/scripts/hooks-system/application/services/token/CursorTokenService.js +1 -0
- package/scripts/hooks-system/application/services/token/TokenMetricsService.js +4 -0
- package/scripts/hooks-system/application/services/token/TokenMonitorService.js +1 -0
- package/scripts/hooks-system/application/services/token/TokenStatusReporter.js +2 -0
- package/scripts/hooks-system/application/state/HookSystemStateMachine.js +2 -0
- package/scripts/hooks-system/application/use-cases/AnalyzeCodebaseUseCase.js +2 -0
- package/scripts/hooks-system/application/use-cases/AnalyzeStagedFilesUseCase.js +2 -0
- package/scripts/hooks-system/application/use-cases/AutoExecuteAIStartUseCase.js +2 -0
- package/scripts/hooks-system/application/use-cases/BlockCommitUseCase.js +2 -0
- package/scripts/hooks-system/application/use-cases/GenerateAuditReportUseCase.js +3 -0
- package/scripts/hooks-system/bin/audit-library.js +5 -4
- package/scripts/hooks-system/bin/auto-fix-violations.js +1 -0
- package/scripts/hooks-system/bin/auto-restart-guards.js +3 -2
- package/scripts/hooks-system/bin/check-doc-drift.js +1 -0
- package/scripts/hooks-system/bin/check-version.js +26 -25
- package/scripts/hooks-system/bin/cli.js +1 -0
- package/scripts/hooks-system/bin/guard-auto-manager.js +1 -0
- package/scripts/hooks-system/bin/guard-supervisor.js +1 -0
- package/scripts/hooks-system/bin/hook-status.js +1 -0
- package/scripts/hooks-system/bin/install.js +1 -0
- package/scripts/hooks-system/bin/nightly-metrics-report.js +1 -0
- package/scripts/hooks-system/bin/plan-review.js +1 -0
- package/scripts/hooks-system/bin/predictive-hooks.js +1 -0
- package/scripts/hooks-system/bin/pumuki-audit.js +1 -0
- package/scripts/hooks-system/bin/pumuki-init.js +1 -0
- package/scripts/hooks-system/bin/pumuki-mcp.js +1 -0
- package/scripts/hooks-system/bin/pumuki-rules.js +1 -0
- package/scripts/hooks-system/bin/run-ast-adapter.js +2 -0
- package/scripts/hooks-system/bin/run-orchestrator.js +1 -0
- package/scripts/hooks-system/bin/run-playbook.js +1 -0
- package/scripts/hooks-system/bin/setup-eslint.js +1 -0
- package/scripts/hooks-system/bin/violations-api.js +1 -0
- package/scripts/hooks-system/bin/watch-hooks.js +1 -0
- package/scripts/hooks-system/domain/errors/index.js +2 -0
- package/scripts/hooks-system/domain/services/AuditAnalyzer.js +2 -0
- package/scripts/hooks-system/domain/services/AuditFilter.js +5 -0
- package/scripts/hooks-system/domain/services/AuditResultSerializer.js +5 -0
- package/scripts/hooks-system/domain/services/AuditScorer.js +6 -0
- package/scripts/hooks-system/infrastructure/adapters/AstAnalyzerAdapter.js +3 -0
- package/scripts/hooks-system/infrastructure/adapters/FileEvidenceAdapter.js +2 -0
- package/scripts/hooks-system/infrastructure/adapters/GitCliAdapter.js +4 -0
- package/scripts/hooks-system/infrastructure/adapters/GitCommandAdapter.js +4 -0
- package/scripts/hooks-system/infrastructure/adapters/GitHubCliAdapter.js +2 -0
- package/scripts/hooks-system/infrastructure/adapters/GitQueryAdapter.js +4 -0
- package/scripts/hooks-system/infrastructure/adapters/LegacyAnalyzerAdapter.js +2 -0
- package/scripts/hooks-system/infrastructure/adapters/MacOSNotificationAdapter.js +4 -0
- package/scripts/hooks-system/infrastructure/adapters/git/GitCommandRunner.js +2 -0
- package/scripts/hooks-system/infrastructure/adapters/git/GitCommandService.js +3 -0
- package/scripts/hooks-system/infrastructure/adapters/git/GitQueryService.js +3 -0
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidASTIntelligentAnalyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidASTParser.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidAnalysisOrchestrator.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidArchitectureDetector.js +7 -5
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidClassAnalyzer.js +3 -0
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidForbiddenLiteralsAnalyzer.js +1 -0
- package/scripts/hooks-system/infrastructure/ast/android/analyzers/AndroidSOLIDAnalyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/archive/ios-rules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/archive/kotlin-analyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/archive/kotlin-parser.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/archive/swift-analyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/backend/analyzers/BackendArchitectureDetector.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/backend/analyzers/BackendPatternDetector.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/common/BDDTDDWorkflowRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/common/rules/BDDRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/common/rules/ImplementationRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/common/rules/TDDRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/common/rules/WorkflowRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/frontend/analyzers/FrontendArchitectureDetector.js +16 -14
- package/scripts/hooks-system/infrastructure/ast/frontend/analyzers/FrontendForbiddenLiteralsAnalyzer.js +5 -0
- package/scripts/hooks-system/infrastructure/ast/frontend/analyzers/FrontendSOLIDAnalyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSASTIntelligentAnalyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSArchitectureDetector.js +12 -10
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSArchitectureRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSCICDRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSEnterpriseAnalyzer.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSForbiddenLiteralsAnalyzer.js +1 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSNetworkingAdvancedRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSPerformanceRules.js +3 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSSPMRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSSwiftUIAdvancedRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSTestingAdvancedRules.js +2 -0
- package/scripts/hooks-system/infrastructure/ast/ios/native-bridge.js +1 -0
- package/scripts/hooks-system/infrastructure/ast/ios/parsers/SourceKittenParser.js +2 -0
- package/scripts/hooks-system/infrastructure/cli/install-wizard.js +1 -0
- package/scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js +96 -41
- package/scripts/hooks-system/infrastructure/mcp/evidence-watcher.js +1 -0
- package/scripts/hooks-system/infrastructure/mcp/services/EvidenceService.js +4 -0
- package/scripts/hooks-system/infrastructure/mcp/services/McpProtocolHandler.js +2 -0
- package/scripts/hooks-system/infrastructure/orchestration/intelligent-audit.js +1 -1
- package/scripts/hooks-system/infrastructure/reporting/report-generator.js +2 -0
- package/scripts/hooks-system/infrastructure/repositories/CursorTokenRepository.js +4 -0
- package/scripts/hooks-system/infrastructure/repositories/FileFindingsRepository.js +2 -0
- package/scripts/hooks-system/infrastructure/repositories/datasources/CursorApiDataSource.js +4 -0
- package/scripts/hooks-system/infrastructure/repositories/datasources/CursorFileDataSource.js +2 -0
- package/scripts/hooks-system/infrastructure/severity/policies/gate-policies.js +1 -0
- package/scripts/hooks-system/infrastructure/severity/severity-evaluator.js +2 -0
- package/scripts/hooks-system/infrastructure/telemetry/TelemetryService.js +2 -0
- package/scripts/hooks-system/infrastructure/telemetry/metrics-logger.js +2 -0
- package/scripts/hooks-system/infrastructure/utils/token-manager.js +2 -0
- package/scripts/hooks-system/infrastructure/validators/detect-commit-language.js +1 -0
- package/scripts/hooks-system/infrastructure/watchdog/auto-recovery.js +1 -0
- package/scripts/hooks-system/infrastructure/watchdog/health-check.js +1 -0
- 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
|
-
|
|
251
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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) {
|
|
@@ -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
|
/**
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
192
|
+
logMcpDebug(`Lock acquired, PID ${process.pid} written`);
|
|
193
|
+
} catch (error) {
|
|
194
|
+
logMcpError('acquireSingletonLock (write pid)', error);
|
|
127
195
|
}
|
|
128
196
|
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
if (
|
|
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,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;
|
package/scripts/hooks-system/infrastructure/repositories/datasources/CursorFileDataSource.js
CHANGED
|
@@ -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() {
|
|
@@ -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,
|