pumuki-ast-hooks 6.0.14 → 6.1.0
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 +27 -0
- package/docs/RELEASE_NOTES.md +30 -0
- package/package.json +2 -2
- package/scripts/hooks-system/.audit-reports/auto-recovery.log +8 -0
- package/scripts/hooks-system/.audit-reports/install-wizard.log +32 -0
- package/scripts/hooks-system/.audit_tmp/hook-metrics.jsonl +192 -0
- package/scripts/hooks-system/application/services/installation/__tests__/McpConfigurator.mcp.spec.js +74 -0
- package/scripts/hooks-system/application/services/installation/mcp/McpProjectConfigWriter.js +14 -2
- package/scripts/hooks-system/application/services/installation/mcp/McpServerConfigBuilder.js +40 -0
- package/scripts/hooks-system/domain/strategies/ConcreteDependencyStrategy.js +33 -1
- package/scripts/hooks-system/domain/strategies/__tests__/ConcreteDependencyStrategy.spec.js +32 -0
- package/scripts/hooks-system/infrastructure/ast/ios/analyzers/iOSASTIntelligentAnalyzer.js +37 -0
- package/scripts/hooks-system/infrastructure/mcp/evidence-watcher.js +44 -0
- package/scripts/hooks-system/infrastructure/mcp/services/McpProtocolHandler.js +17 -0
- package/scripts/hooks-system/infrastructure/mcp/services/__tests__/McpProtocolHandler.notifications.spec.js +22 -0
- package/scripts/hooks-system/infrastructure/orchestration/__tests__/intelligent-audit.spec.js +51 -0
- package/scripts/hooks-system/infrastructure/orchestration/intelligent-audit.js +67 -4
- package/scripts/hooks-system/infrastructure/watchdog/__tests__/.audit-reports/token-monitor.log +24 -0
package/README.md
CHANGED
|
@@ -451,6 +451,33 @@ npm run ast:refresh
|
|
|
451
451
|
|
|
452
452
|
---
|
|
453
453
|
|
|
454
|
+
## 10. Rule Exclusions (`ast-exclusions.json`)
|
|
455
|
+
|
|
456
|
+
Use `config/ast-exclusions.json` to suppress specific rules for specific files.
|
|
457
|
+
|
|
458
|
+
Example:
|
|
459
|
+
|
|
460
|
+
```json
|
|
461
|
+
{
|
|
462
|
+
"exclusions": {
|
|
463
|
+
"rules": {
|
|
464
|
+
"ios.solid.dip.concrete_dependency": {
|
|
465
|
+
"files": [
|
|
466
|
+
"apps/ios/Infrastructure/Repositories/Auth/AuthLoginRepositoryImpl.swift"
|
|
467
|
+
],
|
|
468
|
+
"excludePatterns": [
|
|
469
|
+
"**/*Auth*Repository*.swift"
|
|
470
|
+
]
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
Rules without `files`/`paths`/`globs` are treated as global exclusions.
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
454
481
|
## 11. Typical Enterprise Use Cases
|
|
455
482
|
|
|
456
483
|
- Long‑running feature development with AI assistance.
|
package/docs/RELEASE_NOTES.md
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
# Release Notes - v6.0.16
|
|
2
|
+
|
|
3
|
+
**Release Date**: January 13, 2026
|
|
4
|
+
**Type**: Patch Release
|
|
5
|
+
**Compatibility**: Fully backward compatible with 6.0.x
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ✅ Fixes
|
|
10
|
+
|
|
11
|
+
- **Exclude patterns**: `excludePatterns` now prevent unintended global exclusions in intelligent-audit.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Release Notes - v6.0.15
|
|
16
|
+
|
|
17
|
+
**Release Date**: January 13, 2026
|
|
18
|
+
**Type**: Patch Release
|
|
19
|
+
**Compatibility**: Fully backward compatible with 6.0.x
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## ✅ Fixes
|
|
24
|
+
|
|
25
|
+
- **Exclusions-aware gate**: `ast-exclusions.json` filters violations for gate/evidence in intelligent-audit.
|
|
26
|
+
- **iOS DIP generics**: `any` generic constraint names now match normalized bounds.
|
|
27
|
+
- **iOS AST exclusions**: rule exclusions are applied per file in the iOS analyzer.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
1
31
|
# Release Notes - v6.0.14
|
|
2
32
|
|
|
3
33
|
**Release Date**: January 13, 2026
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pumuki-ast-hooks",
|
|
3
|
-
"version": "6.0
|
|
3
|
+
"version": "6.1.0",
|
|
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": {
|
|
@@ -135,4 +135,4 @@
|
|
|
135
135
|
"./skills": "./skills/skill-rules.json",
|
|
136
136
|
"./hooks": "./hooks/index.js"
|
|
137
137
|
}
|
|
138
|
-
}
|
|
138
|
+
}
|
|
@@ -20,3 +20,11 @@
|
|
|
20
20
|
{"timestamp":"2026-01-12T23:36:15.876Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
21
21
|
{"timestamp":"2026-01-13T00:00:36.969Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
22
22
|
{"timestamp":"2026-01-13T07:51:05.490Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
23
|
+
{"timestamp":"2026-01-13T11:12:40.853Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
24
|
+
{"timestamp":"2026-01-13T11:21:28.037Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
25
|
+
{"timestamp":"2026-01-13T11:31:00.351Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
26
|
+
{"timestamp":"2026-01-13T13:12:18.872Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
27
|
+
{"timestamp":"2026-01-13T13:23:55.165Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
28
|
+
{"timestamp":"2026-01-13T13:58:43.218Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
29
|
+
{"timestamp":"2026-01-13T17:20:09.962Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
30
|
+
{"timestamp":"2026-01-13T17:21:43.217Z","level":"info","component":"AutoRecovery","event":"NotificationCenterService shutdown","data":{"totalEnqueued":0,"totalSent":0,"totalDeduplicated":0,"totalCooldownSkipped":0,"totalFailed":0,"totalRetries":0,"queueSize":0,"deduplication":{"size":0},"cooldowns":{"activeCooldowns":0}},"context":{}}
|
|
@@ -90,3 +90,35 @@
|
|
|
90
90
|
{"timestamp":"2026-01-13T07:51:05.577Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
91
91
|
{"timestamp":"2026-01-13T07:51:05.577Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
92
92
|
{"timestamp":"2026-01-13T07:51:05.577Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
93
|
+
{"timestamp":"2026-01-13T11:12:40.975Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
94
|
+
{"timestamp":"2026-01-13T11:12:40.983Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
95
|
+
{"timestamp":"2026-01-13T11:12:40.983Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
96
|
+
{"timestamp":"2026-01-13T11:12:40.983Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
97
|
+
{"timestamp":"2026-01-13T11:21:28.232Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
98
|
+
{"timestamp":"2026-01-13T11:21:28.240Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
99
|
+
{"timestamp":"2026-01-13T11:21:28.240Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
100
|
+
{"timestamp":"2026-01-13T11:21:28.240Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
101
|
+
{"timestamp":"2026-01-13T11:31:00.195Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
102
|
+
{"timestamp":"2026-01-13T11:31:00.203Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
103
|
+
{"timestamp":"2026-01-13T11:31:00.203Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
104
|
+
{"timestamp":"2026-01-13T11:31:00.203Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
105
|
+
{"timestamp":"2026-01-13T13:12:18.928Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
106
|
+
{"timestamp":"2026-01-13T13:12:18.936Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
107
|
+
{"timestamp":"2026-01-13T13:12:18.937Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
108
|
+
{"timestamp":"2026-01-13T13:12:18.937Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
109
|
+
{"timestamp":"2026-01-13T13:23:55.815Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
110
|
+
{"timestamp":"2026-01-13T13:23:55.824Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
111
|
+
{"timestamp":"2026-01-13T13:23:55.825Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
112
|
+
{"timestamp":"2026-01-13T13:23:55.825Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
113
|
+
{"timestamp":"2026-01-13T13:58:43.281Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
114
|
+
{"timestamp":"2026-01-13T13:58:43.290Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
115
|
+
{"timestamp":"2026-01-13T13:58:43.290Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
116
|
+
{"timestamp":"2026-01-13T13:58:43.290Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
117
|
+
{"timestamp":"2026-01-13T17:20:10.168Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
118
|
+
{"timestamp":"2026-01-13T17:20:10.177Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
119
|
+
{"timestamp":"2026-01-13T17:20:10.177Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
120
|
+
{"timestamp":"2026-01-13T17:20:10.177Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
121
|
+
{"timestamp":"2026-01-13T17:21:43.135Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
|
|
122
|
+
{"timestamp":"2026-01-13T17:21:43.143Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_CONFIG_EXISTS","data":{"configPath":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.hook-system/config.json"},"context":{}}
|
|
123
|
+
{"timestamp":"2026-01-13T17:21:43.143Z","level":"error","component":"InstallWizard","event":"INSTALL_WIZARD_SYMLINK_FAILED","data":{"error":"EEXIST: file already exists, symlink '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/scripts/hooks-system/bin/guard-supervisor.js' -> '/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system/.git/hooks/guard-supervisor'"},"context":{}}
|
|
124
|
+
{"timestamp":"2026-01-13T17:21:43.143Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
|
|
@@ -794,3 +794,195 @@
|
|
|
794
794
|
{"timestamp":1768293907758,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
795
795
|
{"timestamp":1768293907758,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
796
796
|
{"timestamp":1768293907758,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
797
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
798
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
799
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
800
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
801
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
802
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
803
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
804
|
+
{"timestamp":1768302760852,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
805
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
806
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
807
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
808
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
809
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
810
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
811
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
812
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
813
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
814
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
815
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
816
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
817
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
818
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
819
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
820
|
+
{"timestamp":1768302760853,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
821
|
+
{"timestamp":1768303288034,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
822
|
+
{"timestamp":1768303288035,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
823
|
+
{"timestamp":1768303288035,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
824
|
+
{"timestamp":1768303288035,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
825
|
+
{"timestamp":1768303288035,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
826
|
+
{"timestamp":1768303288035,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
827
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
828
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
829
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
830
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
831
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
832
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
833
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
834
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
835
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
836
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
837
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
838
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
839
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
840
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
841
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
842
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
843
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
844
|
+
{"timestamp":1768303288036,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
845
|
+
{"timestamp":1768303860349,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
846
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
847
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
848
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
849
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
850
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
851
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
852
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
853
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
854
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
855
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
856
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
857
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
858
|
+
{"timestamp":1768303860350,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
859
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
860
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
861
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
862
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
863
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
864
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
865
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
866
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
867
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
868
|
+
{"timestamp":1768303860351,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
869
|
+
{"timestamp":1768309938870,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
870
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
871
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
872
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
873
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
874
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
875
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
876
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
877
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
878
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
879
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
880
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
881
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
882
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
883
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
884
|
+
{"timestamp":1768309938871,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
885
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
886
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
887
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
888
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
889
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
890
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
891
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
892
|
+
{"timestamp":1768309938872,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
893
|
+
{"timestamp":1768310635163,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
894
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
895
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
896
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
897
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
898
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
899
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
900
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
901
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
902
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
903
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
904
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
905
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
906
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
907
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
908
|
+
{"timestamp":1768310635164,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
909
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
910
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
911
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
912
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
913
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
914
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
915
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
916
|
+
{"timestamp":1768310635165,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
917
|
+
{"timestamp":1768312723217,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
918
|
+
{"timestamp":1768312723217,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
919
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
920
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
921
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
922
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
923
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
924
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
925
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
926
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
927
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
928
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
929
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
930
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
931
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
932
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
933
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
934
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
935
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
936
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
937
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
938
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
939
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
940
|
+
{"timestamp":1768312723218,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
941
|
+
{"timestamp":1768324809960,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
942
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
943
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
944
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
945
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
946
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
947
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
948
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
949
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
950
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
951
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
952
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
953
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
954
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
955
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
956
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
957
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
958
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
959
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
960
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
961
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
962
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
963
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
964
|
+
{"timestamp":1768324809961,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
965
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
966
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
967
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
968
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
969
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
970
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
971
|
+
{"timestamp":1768324903216,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
972
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
973
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
974
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
975
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
976
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
977
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
978
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
979
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
980
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
981
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
982
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
983
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
984
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
985
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"started","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
|
986
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"started"}
|
|
987
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"ensure_dir","status":"success"}
|
|
988
|
+
{"timestamp":1768324903217,"hook":"audit_logger","operation":"constructor","status":"success","repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"}
|
package/scripts/hooks-system/application/services/installation/__tests__/McpConfigurator.mcp.spec.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const os = require('os');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
const McpServerConfigBuilder = require('../mcp/McpServerConfigBuilder');
|
|
6
|
+
const McpProjectConfigWriter = require('../mcp/McpProjectConfigWriter');
|
|
7
|
+
|
|
8
|
+
describe('MCP installer (project-scoped)', () => {
|
|
9
|
+
let testRoot;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
testRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'ast-hooks-mcp-'));
|
|
13
|
+
fs.mkdirSync(path.join(testRoot, 'scripts', 'hooks-system', 'infrastructure', 'mcp'), { recursive: true });
|
|
14
|
+
fs.writeFileSync(
|
|
15
|
+
path.join(testRoot, 'scripts', 'hooks-system', 'infrastructure', 'mcp', 'ast-intelligence-automation.js'),
|
|
16
|
+
'#!/usr/bin/env node\nprocess.stdin.resume();\n'
|
|
17
|
+
);
|
|
18
|
+
fs.writeFileSync(
|
|
19
|
+
path.join(testRoot, 'scripts', 'hooks-system', 'infrastructure', 'mcp', 'evidence-watcher.js'),
|
|
20
|
+
'#!/usr/bin/env node\nprocess.stdin.resume();\n'
|
|
21
|
+
);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
if (testRoot && fs.existsSync(testRoot)) {
|
|
26
|
+
fs.rmSync(testRoot, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should write Cursor and Windsurf MCP configs with automation + evidence watcher servers', () => {
|
|
31
|
+
const builder = new McpServerConfigBuilder(testRoot, null, null);
|
|
32
|
+
const { serverId, mcpConfig } = builder.build();
|
|
33
|
+
|
|
34
|
+
const writer = new McpProjectConfigWriter(testRoot, null, null, null, null);
|
|
35
|
+
writer.configureProjectScoped(mcpConfig, serverId);
|
|
36
|
+
|
|
37
|
+
const cursorPath = path.join(testRoot, '.cursor', 'mcp.json');
|
|
38
|
+
const windsurfPath = path.join(testRoot, '.windsurf', 'mcp.json');
|
|
39
|
+
|
|
40
|
+
expect(fs.existsSync(cursorPath)).toBe(true);
|
|
41
|
+
expect(fs.existsSync(windsurfPath)).toBe(true);
|
|
42
|
+
|
|
43
|
+
const cursor = JSON.parse(fs.readFileSync(cursorPath, 'utf8'));
|
|
44
|
+
const windsurf = JSON.parse(fs.readFileSync(windsurfPath, 'utf8'));
|
|
45
|
+
|
|
46
|
+
const cursorServers = Object.keys(cursor.mcpServers || {});
|
|
47
|
+
const windsurfServers = Object.keys(windsurf.mcpServers || {});
|
|
48
|
+
|
|
49
|
+
expect(cursorServers.some(id => id.startsWith('ast-intelligence-automation-'))).toBe(true);
|
|
50
|
+
expect(cursorServers.some(id => id.startsWith('ai-evidence-watcher-'))).toBe(true);
|
|
51
|
+
|
|
52
|
+
expect(windsurfServers.some(id => id.startsWith('ast-intelligence-automation-'))).toBe(true);
|
|
53
|
+
expect(windsurfServers.some(id => id.startsWith('ai-evidence-watcher-'))).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should be idempotent and not duplicate servers across runs', () => {
|
|
57
|
+
const builder = new McpServerConfigBuilder(testRoot, null, null);
|
|
58
|
+
const { serverId, mcpConfig } = builder.build();
|
|
59
|
+
|
|
60
|
+
const writer = new McpProjectConfigWriter(testRoot, null, null, null, null);
|
|
61
|
+
writer.configureProjectScoped(mcpConfig, serverId);
|
|
62
|
+
writer.configureProjectScoped(mcpConfig, serverId);
|
|
63
|
+
|
|
64
|
+
const cursorPath = path.join(testRoot, '.cursor', 'mcp.json');
|
|
65
|
+
const cursor = JSON.parse(fs.readFileSync(cursorPath, 'utf8'));
|
|
66
|
+
|
|
67
|
+
const ids = Object.keys(cursor.mcpServers || {});
|
|
68
|
+
const automation = ids.filter(id => id.startsWith('ast-intelligence-automation-'));
|
|
69
|
+
const evidence = ids.filter(id => id.startsWith('ai-evidence-watcher-'));
|
|
70
|
+
|
|
71
|
+
expect(automation.length).toBe(1);
|
|
72
|
+
expect(evidence.length).toBe(1);
|
|
73
|
+
});
|
|
74
|
+
});
|
package/scripts/hooks-system/application/services/installation/mcp/McpProjectConfigWriter.js
CHANGED
|
@@ -37,12 +37,24 @@ class McpProjectConfigWriter {
|
|
|
37
37
|
if (fs.existsSync(filePath)) {
|
|
38
38
|
const existing = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
39
39
|
if (!existing.mcpServers) existing.mcpServers = {};
|
|
40
|
+
|
|
41
|
+
const newServerIds = Object.keys(mcpConfig.mcpServers || {});
|
|
42
|
+
const prefixesToDedupe = ['ast-intelligence-automation-', 'ai-evidence-watcher-'];
|
|
43
|
+
|
|
40
44
|
Object.keys(existing.mcpServers).forEach(id => {
|
|
41
|
-
|
|
45
|
+
const shouldDedupe = prefixesToDedupe.some(prefix => id.startsWith(prefix));
|
|
46
|
+
if (!shouldDedupe) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!newServerIds.includes(id)) {
|
|
42
51
|
delete existing.mcpServers[id];
|
|
43
52
|
}
|
|
44
53
|
});
|
|
45
|
-
|
|
54
|
+
|
|
55
|
+
newServerIds.forEach(id => {
|
|
56
|
+
existing.mcpServers[id] = mcpConfig.mcpServers[id];
|
|
57
|
+
});
|
|
46
58
|
finalConfig = existing;
|
|
47
59
|
}
|
|
48
60
|
|
package/scripts/hooks-system/application/services/installation/mcp/McpServerConfigBuilder.js
CHANGED
|
@@ -22,7 +22,9 @@ class McpServerConfigBuilder {
|
|
|
22
22
|
|
|
23
23
|
build() {
|
|
24
24
|
const serverId = this.computeServerIdForRepo(this.targetRoot);
|
|
25
|
+
const evidenceWatcherServerId = this.computeEvidenceWatcherServerIdForRepo(this.targetRoot);
|
|
25
26
|
const entrypoint = this.resolveAutomationEntrypoint();
|
|
27
|
+
const evidenceEntrypoint = this.resolveEvidenceWatcherEntrypoint();
|
|
26
28
|
const nodePath = this.resolveNodeBinary();
|
|
27
29
|
|
|
28
30
|
const mcpConfig = {
|
|
@@ -36,6 +38,14 @@ class McpServerConfigBuilder {
|
|
|
36
38
|
AUTO_PUSH_ENABLED: 'false',
|
|
37
39
|
AUTO_PR_ENABLED: 'false'
|
|
38
40
|
}
|
|
41
|
+
},
|
|
42
|
+
[evidenceWatcherServerId]: {
|
|
43
|
+
command: nodePath,
|
|
44
|
+
args: [evidenceEntrypoint],
|
|
45
|
+
env: {
|
|
46
|
+
REPO_ROOT: this.targetRoot,
|
|
47
|
+
MCP_MAC_NOTIFICATIONS: 'true'
|
|
48
|
+
}
|
|
39
49
|
}
|
|
40
50
|
}
|
|
41
51
|
};
|
|
@@ -62,6 +72,25 @@ class McpServerConfigBuilder {
|
|
|
62
72
|
return path.join(this.targetRoot, 'scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js');
|
|
63
73
|
}
|
|
64
74
|
|
|
75
|
+
resolveEvidenceWatcherEntrypoint() {
|
|
76
|
+
const candidates = [
|
|
77
|
+
this.hookSystemRoot
|
|
78
|
+
? path.join(this.hookSystemRoot, 'infrastructure', 'mcp', 'evidence-watcher.js')
|
|
79
|
+
: null,
|
|
80
|
+
path.join(this.targetRoot, 'scripts', 'hooks-system', 'infrastructure', 'mcp', 'evidence-watcher.js')
|
|
81
|
+
].filter(Boolean);
|
|
82
|
+
|
|
83
|
+
for (const candidate of candidates) {
|
|
84
|
+
try {
|
|
85
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
this.logger?.warn?.('MCP_EVIDENCE_ENTRYPOINT_CHECK_FAILED', { candidate, error: error.message });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return path.join(this.targetRoot, 'scripts/hooks-system/infrastructure/mcp/evidence-watcher.js');
|
|
92
|
+
}
|
|
93
|
+
|
|
65
94
|
resolveNodeBinary() {
|
|
66
95
|
let nodePath = process.execPath;
|
|
67
96
|
if (nodePath && fs.existsSync(nodePath)) return nodePath;
|
|
@@ -87,6 +116,17 @@ class McpServerConfigBuilder {
|
|
|
87
116
|
return `${legacyServerId}-${slug}-${fp}`;
|
|
88
117
|
}
|
|
89
118
|
|
|
119
|
+
computeEvidenceWatcherServerIdForRepo(repoRoot) {
|
|
120
|
+
const legacyServerId = 'ai-evidence-watcher';
|
|
121
|
+
const forced = (env.get('MCP_EVIDENCE_SERVER_ID', '') || '').trim();
|
|
122
|
+
if (forced.length > 0) return forced;
|
|
123
|
+
|
|
124
|
+
const repoName = path.basename(repoRoot || process.cwd());
|
|
125
|
+
const slug = slugifyId(repoName) || 'repo';
|
|
126
|
+
const fp = this.computeRepoFingerprint(repoRoot);
|
|
127
|
+
return `${legacyServerId}-${slug}-${fp}`;
|
|
128
|
+
}
|
|
129
|
+
|
|
90
130
|
computeRepoFingerprint(repoRoot) {
|
|
91
131
|
try {
|
|
92
132
|
const real = fs.realpathSync(repoRoot);
|
|
@@ -47,6 +47,10 @@ class ConcreteDependencyStrategy extends DIStrategy {
|
|
|
47
47
|
return true;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
if (this._isUseCaseProtocolBound(typename, className, context)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
50
54
|
if (this._isGenericConstraintType(typename, className, context)) {
|
|
51
55
|
return true;
|
|
52
56
|
}
|
|
@@ -80,13 +84,41 @@ class ConcreteDependencyStrategy extends DIStrategy {
|
|
|
80
84
|
|
|
81
85
|
const genericClause = match[2];
|
|
82
86
|
const constraints = genericClause.split(',').map((part) => part.trim());
|
|
87
|
+
const normalizedTypename = this._normalizeTypeName(typename);
|
|
83
88
|
|
|
84
89
|
return constraints.some((constraint) => {
|
|
85
90
|
const [name, bound] = constraint.split(':').map((value) => value.trim());
|
|
86
|
-
return name ===
|
|
91
|
+
return this._normalizeTypeName(name) === normalizedTypename && bound;
|
|
87
92
|
});
|
|
88
93
|
}
|
|
89
94
|
|
|
95
|
+
_isUseCaseProtocolBound(typename, className, context) {
|
|
96
|
+
const content = context?.analyzer?.fileContent || '';
|
|
97
|
+
if (!content) return false;
|
|
98
|
+
|
|
99
|
+
const classPattern = new RegExp(`\\b(class|struct)\\s+${className}\\s*<([^>]+)>`);
|
|
100
|
+
const match = content.match(classPattern);
|
|
101
|
+
if (!match) return false;
|
|
102
|
+
|
|
103
|
+
const genericClause = match[2];
|
|
104
|
+
const constraints = genericClause.split(',').map((part) => part.trim());
|
|
105
|
+
const normalizedTypename = this._normalizeTypeName(typename);
|
|
106
|
+
|
|
107
|
+
for (const constraint of constraints) {
|
|
108
|
+
const [name, bound] = constraint.split(':').map((value) => value.trim());
|
|
109
|
+
if (this._normalizeTypeName(name) !== normalizedTypename || !bound) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const normalizedBound = this._normalizeTypeName(bound);
|
|
114
|
+
if (/UseCaseProtocol$/.test(normalizedBound)) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
|
|
90
122
|
_isConcreteService(typename) {
|
|
91
123
|
const normalized = this._normalizeTypeName(typename);
|
|
92
124
|
const hasConcretePattern = this.config.concretePatterns.some(pattern =>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const ConcreteDependencyStrategy = require('../ConcreteDependencyStrategy');
|
|
2
|
+
|
|
3
|
+
describe('ConcreteDependencyStrategy', () => {
|
|
4
|
+
it('skips generic constraint when type uses any and bound is UseCaseProtocol', () => {
|
|
5
|
+
const strategy = new ConcreteDependencyStrategy({
|
|
6
|
+
targetClasses: ['Auth'],
|
|
7
|
+
allowedTypes: [],
|
|
8
|
+
protocolIndicators: [],
|
|
9
|
+
concretePatterns: ['^Login$'],
|
|
10
|
+
genericTypePatterns: {
|
|
11
|
+
singleLetter: false,
|
|
12
|
+
camelCase: '^$',
|
|
13
|
+
contextHints: []
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const context = {
|
|
18
|
+
className: 'AuthLoginRepo',
|
|
19
|
+
filePath: '/tmp/AuthLoginRepo.swift',
|
|
20
|
+
properties: [
|
|
21
|
+
{ 'key.typename': 'any Login', 'key.name': 'loginUseCase' }
|
|
22
|
+
],
|
|
23
|
+
analyzer: {
|
|
24
|
+
fileContent: 'class AuthLoginRepo<Login: LoginUseCaseProtocol> {}'
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const violations = strategy.detect({}, context);
|
|
29
|
+
|
|
30
|
+
expect(violations).toHaveLength(0);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -28,6 +28,40 @@ class iOSASTIntelligentAnalyzer {
|
|
|
28
28
|
this.functions = [];
|
|
29
29
|
this.properties = [];
|
|
30
30
|
this.closures = [];
|
|
31
|
+
this.exclusions = this.loadExclusions();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
loadExclusions() {
|
|
35
|
+
const { getRepoRoot } = require(path.join(__dirname, '../../ast-core'));
|
|
36
|
+
const repoRoot = getRepoRoot();
|
|
37
|
+
const exclusionPath = path.join(repoRoot, 'config', 'ast-exclusions.json');
|
|
38
|
+
try {
|
|
39
|
+
if (!fs.existsSync(exclusionPath)) {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
const payload = JSON.parse(fs.readFileSync(exclusionPath, 'utf8'));
|
|
43
|
+
return payload.exclusions || {};
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (process.env.DEBUG) {
|
|
46
|
+
console.debug(`[iOSASTIntelligentAnalyzer] Failed to load exclusions: ${error.message}`);
|
|
47
|
+
}
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
isExcluded(ruleId, filePath) {
|
|
53
|
+
const rules = this.exclusions.rules || {};
|
|
54
|
+
const rule = rules[ruleId];
|
|
55
|
+
if (!rule) return false;
|
|
56
|
+
|
|
57
|
+
const patterns = []
|
|
58
|
+
.concat(rule.files || [])
|
|
59
|
+
.concat(rule.paths || [])
|
|
60
|
+
.concat(rule.globs || []);
|
|
61
|
+
|
|
62
|
+
if (patterns.length === 0) return true;
|
|
63
|
+
|
|
64
|
+
return patterns.some((pattern) => filePath.includes(pattern));
|
|
31
65
|
}
|
|
32
66
|
|
|
33
67
|
resolveAuditTmpDir(repoRoot) {
|
|
@@ -212,6 +246,9 @@ class iOSASTIntelligentAnalyzer {
|
|
|
212
246
|
|
|
213
247
|
|
|
214
248
|
pushFinding(ruleId, severity, filePath, line, message) {
|
|
249
|
+
if (this.isExcluded(ruleId, filePath)) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
215
252
|
this.findings.push({
|
|
216
253
|
ruleId,
|
|
217
254
|
severity: severity.toUpperCase(),
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
const env = require('../../config/env');
|
|
10
|
+
const fs = require('fs');
|
|
10
11
|
const path = require('path');
|
|
12
|
+
const { exec } = require('child_process');
|
|
11
13
|
const McpProtocolHandler = require('./services/McpProtocolHandler');
|
|
12
14
|
const EvidenceService = require('./services/EvidenceService');
|
|
13
15
|
const UnifiedLogger = require('../../application/services/logging/UnifiedLogger');
|
|
@@ -15,6 +17,9 @@ const UnifiedLogger = require('../../application/services/logging/UnifiedLogger'
|
|
|
15
17
|
const MCP_VERSION = '1.0.0';
|
|
16
18
|
const MAX_EVIDENCE_AGE = 3 * 60 * 1000;
|
|
17
19
|
|
|
20
|
+
const NOTIFICATION_COOLDOWN_MS = 3000;
|
|
21
|
+
let lastNotificationAt = 0;
|
|
22
|
+
|
|
18
23
|
// Initialize Logger
|
|
19
24
|
const repoRoot = process.env.REPO_ROOT || process.cwd();
|
|
20
25
|
const logger = new UnifiedLogger({
|
|
@@ -30,6 +35,45 @@ const logger = new UnifiedLogger({
|
|
|
30
35
|
const evidenceService = new EvidenceService(repoRoot, logger);
|
|
31
36
|
const protocolHandler = new McpProtocolHandler(process.stdin, process.stdout, logger);
|
|
32
37
|
|
|
38
|
+
const evidenceFilePath = path.join(repoRoot, '.AI_EVIDENCE.json');
|
|
39
|
+
|
|
40
|
+
const enableMacNotifications = String(process.env.MCP_MAC_NOTIFICATIONS || '').trim().toLowerCase() === 'true';
|
|
41
|
+
const sendMacNotification = (title, message) => {
|
|
42
|
+
if (!enableMacNotifications) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const safeTitle = String(title).replace(/"/g, '\\"');
|
|
47
|
+
const safeMessage = String(message).replace(/"/g, '\\"');
|
|
48
|
+
exec(`osascript -e "display notification \"${safeMessage}\" with title \"${safeTitle}\""`, {
|
|
49
|
+
env: process.env
|
|
50
|
+
}, () => {
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const notifyEvidenceChanged = () => {
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
if (now - lastNotificationAt < NOTIFICATION_COOLDOWN_MS) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
lastNotificationAt = now;
|
|
61
|
+
const status = evidenceService.checkStatus();
|
|
62
|
+
const message = `🤖 AI Evidence Updated: ${status.status}`;
|
|
63
|
+
protocolHandler.sendNotificationMessage('info', message);
|
|
64
|
+
sendMacNotification('AI Evidence Updated', message);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
fs.watch(evidenceFilePath, { persistent: true }, (eventType) => {
|
|
69
|
+
if (eventType === 'change' || eventType === 'rename') {
|
|
70
|
+
notifyEvidenceChanged();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
} catch (err) {
|
|
74
|
+
if (logger) logger.warn('EVIDENCE_WATCHER_ERROR', { error: err.message });
|
|
75
|
+
}
|
|
76
|
+
|
|
33
77
|
if (logger) logger.info('MCP_SERVER_STARTED');
|
|
34
78
|
|
|
35
79
|
protocolHandler.start((message) => {
|
|
@@ -12,6 +12,23 @@ class McpProtocolHandler {
|
|
|
12
12
|
this.buffer = Buffer.alloc(0);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
sendNotificationMessage(level, message) {
|
|
16
|
+
const payload = {
|
|
17
|
+
jsonrpc: '2.0',
|
|
18
|
+
method: 'notifications/message',
|
|
19
|
+
params: {
|
|
20
|
+
level,
|
|
21
|
+
message
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
this.outputStream.write(JSON.stringify(payload) + '\n');
|
|
26
|
+
|
|
27
|
+
if (typeof this.outputStream.flush === 'function') {
|
|
28
|
+
this.outputStream.flush();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
15
32
|
start(messageHandler) {
|
|
16
33
|
if (process.env.DEBUG) {
|
|
17
34
|
process.stderr.write('[MCP] Protocol handler starting...\n');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const { PassThrough } = require('stream');
|
|
2
|
+
|
|
3
|
+
const McpProtocolHandler = require('../McpProtocolHandler');
|
|
4
|
+
|
|
5
|
+
describe('McpProtocolHandler notifications', () => {
|
|
6
|
+
it('should write notifications/message to output stream', async () => {
|
|
7
|
+
const input = new PassThrough();
|
|
8
|
+
const output = new PassThrough();
|
|
9
|
+
|
|
10
|
+
const handler = new McpProtocolHandler(input, output, null);
|
|
11
|
+
|
|
12
|
+
handler.sendNotificationMessage('info', 'Evidence updated');
|
|
13
|
+
|
|
14
|
+
const written = output.read().toString('utf8').trim();
|
|
15
|
+
const parsed = JSON.parse(written);
|
|
16
|
+
|
|
17
|
+
expect(parsed.jsonrpc).toBe('2.0');
|
|
18
|
+
expect(parsed.method).toBe('notifications/message');
|
|
19
|
+
expect(parsed.params.level).toBe('info');
|
|
20
|
+
expect(parsed.params.message).toBe('Evidence updated');
|
|
21
|
+
});
|
|
22
|
+
});
|
package/scripts/hooks-system/infrastructure/orchestration/__tests__/intelligent-audit.spec.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
|
+
const os = require('os');
|
|
3
4
|
|
|
4
5
|
describe('intelligent-audit', () => {
|
|
5
6
|
it('should export module', () => {
|
|
@@ -60,6 +61,56 @@ describe('intelligent-audit', () => {
|
|
|
60
61
|
expect(mod.isViolationInStagedFiles('apps/ios/Application/AppCoordinator', stagedSet)).toBe(false);
|
|
61
62
|
});
|
|
62
63
|
|
|
64
|
+
it('should exclude violations based on ast-exclusions config', () => {
|
|
65
|
+
const mod = require('../intelligent-audit');
|
|
66
|
+
|
|
67
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ast-audit-'));
|
|
68
|
+
const previousCwd = process.cwd();
|
|
69
|
+
try {
|
|
70
|
+
process.chdir(tmpDir);
|
|
71
|
+
|
|
72
|
+
const configDir = path.join(tmpDir, 'config');
|
|
73
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
74
|
+
fs.writeFileSync(path.join(configDir, 'ast-exclusions.json'), JSON.stringify({
|
|
75
|
+
exclusions: {
|
|
76
|
+
rules: {
|
|
77
|
+
'ios.solid.dip.concrete_dependency': {
|
|
78
|
+
files: ['apps/ios/Infrastructure/Repositories/Auth/AuthLoginRepositoryImpl.swift']
|
|
79
|
+
},
|
|
80
|
+
'ios.solid.dip.exclude_patterns': {
|
|
81
|
+
excludePatterns: ['**/*Auth*Repository*.swift']
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
|
|
87
|
+
const exclusions = mod.loadExclusions();
|
|
88
|
+
const violation = {
|
|
89
|
+
ruleId: 'ios.solid.dip.concrete_dependency',
|
|
90
|
+
filePath: 'apps/ios/Infrastructure/Repositories/Auth/AuthLoginRepositoryImpl.swift'
|
|
91
|
+
};
|
|
92
|
+
const otherViolation = {
|
|
93
|
+
ruleId: 'ios.solid.dip.concrete_dependency',
|
|
94
|
+
filePath: 'apps/ios/Infrastructure/Repositories/Auth/AuthLogoutRepositoryImpl.swift'
|
|
95
|
+
};
|
|
96
|
+
const patternViolation = {
|
|
97
|
+
ruleId: 'ios.solid.dip.exclude_patterns',
|
|
98
|
+
filePath: 'apps/ios/Infrastructure/Repositories/Auth/AuthLoginRepositoryImpl.swift'
|
|
99
|
+
};
|
|
100
|
+
const patternOther = {
|
|
101
|
+
ruleId: 'ios.solid.dip.exclude_patterns',
|
|
102
|
+
filePath: 'apps/ios/Infrastructure/Repositories/User/UserRepositoryImpl.swift'
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
expect(mod.isViolationExcluded(violation, exclusions)).toBe(true);
|
|
106
|
+
expect(mod.isViolationExcluded(otherViolation, exclusions)).toBe(false);
|
|
107
|
+
expect(mod.isViolationExcluded(patternViolation, exclusions)).toBe(true);
|
|
108
|
+
expect(mod.isViolationExcluded(patternOther, exclusions)).toBe(false);
|
|
109
|
+
} finally {
|
|
110
|
+
process.chdir(previousCwd);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
63
114
|
it('should refresh root timestamp when updating .AI_EVIDENCE.json', async () => {
|
|
64
115
|
const evidencePath = path.join(process.cwd(), '.AI_EVIDENCE.json');
|
|
65
116
|
const previous = {
|
|
@@ -414,6 +414,56 @@ function resolveAuditTmpDir() {
|
|
|
414
414
|
return path.join(process.cwd(), '.audit_tmp');
|
|
415
415
|
}
|
|
416
416
|
|
|
417
|
+
function loadExclusions() {
|
|
418
|
+
const configPath = path.join(process.cwd(), 'config', 'ast-exclusions.json');
|
|
419
|
+
try {
|
|
420
|
+
if (!fs.existsSync(configPath)) {
|
|
421
|
+
return {};
|
|
422
|
+
}
|
|
423
|
+
const payload = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
424
|
+
return payload.exclusions || {};
|
|
425
|
+
} catch (error) {
|
|
426
|
+
if (process.env.DEBUG) {
|
|
427
|
+
console.debug(`[Intelligent Audit] Failed to load exclusions: ${error.message}`);
|
|
428
|
+
}
|
|
429
|
+
return {};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function isViolationExcluded(violation, exclusions) {
|
|
434
|
+
const ruleId = violation.ruleId || violation.rule || '';
|
|
435
|
+
if (!ruleId) return false;
|
|
436
|
+
|
|
437
|
+
const rules = exclusions.rules || {};
|
|
438
|
+
const rule = rules[ruleId];
|
|
439
|
+
if (!rule) return false;
|
|
440
|
+
|
|
441
|
+
const files = rule.files || [];
|
|
442
|
+
const paths = rule.paths || [];
|
|
443
|
+
const globs = rule.globs || [];
|
|
444
|
+
const excludeFiles = rule.excludeFiles || [];
|
|
445
|
+
const excludePaths = rule.excludePaths || [];
|
|
446
|
+
const excludePatterns = rule.excludePatterns || [];
|
|
447
|
+
|
|
448
|
+
const hasSelectors = files.length || paths.length || globs.length || excludeFiles.length || excludePaths.length || excludePatterns.length;
|
|
449
|
+
if (!hasSelectors) return true;
|
|
450
|
+
|
|
451
|
+
const filePath = toRepoRelativePath(violation.filePath || violation.file || '');
|
|
452
|
+
|
|
453
|
+
if (files.some((pattern) => filePath.includes(pattern))) return true;
|
|
454
|
+
if (paths.some((pattern) => filePath.includes(pattern))) return true;
|
|
455
|
+
if (globs.some((pattern) => filePath.includes(pattern))) return true;
|
|
456
|
+
if (excludeFiles.some((pattern) => filePath.includes(pattern))) return true;
|
|
457
|
+
if (excludePaths.some((pattern) => filePath.includes(pattern))) return true;
|
|
458
|
+
|
|
459
|
+
for (const pattern of excludePatterns) {
|
|
460
|
+
const regex = new RegExp(pattern.replace(/\*/g, '.*'));
|
|
461
|
+
if (regex.test(filePath)) return true;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
|
|
417
467
|
/**
|
|
418
468
|
* Main orchestration function
|
|
419
469
|
* Called by audit.sh after AST analysis completes
|
|
@@ -424,6 +474,11 @@ async function runIntelligentAudit() {
|
|
|
424
474
|
|
|
425
475
|
const rawViolations = loadRawViolations();
|
|
426
476
|
console.log(`[Intelligent Audit] Loaded ${rawViolations.length} violations from AST`);
|
|
477
|
+
const exclusions = loadExclusions();
|
|
478
|
+
const filteredViolations = rawViolations.filter(v => !isViolationExcluded(v, exclusions));
|
|
479
|
+
if (filteredViolations.length !== rawViolations.length) {
|
|
480
|
+
console.log(`[Intelligent Audit] Excluded ${rawViolations.length - filteredViolations.length} violations via config`);
|
|
481
|
+
}
|
|
427
482
|
|
|
428
483
|
const autoEvidenceTrigger = String(env.get('AUTO_EVIDENCE_TRIGGER', process.env.AUTO_EVIDENCE_TRIGGER || '') || '').trim().toLowerCase();
|
|
429
484
|
const isAutoEvidenceRefresh = autoEvidenceTrigger === 'auto';
|
|
@@ -436,13 +491,13 @@ async function runIntelligentAudit() {
|
|
|
436
491
|
|
|
437
492
|
if (isRepoScope) {
|
|
438
493
|
console.log('[Intelligent Audit] Gate scope: REPOSITORY');
|
|
439
|
-
violationsForGate =
|
|
440
|
-
violationsForEvidence =
|
|
494
|
+
violationsForGate = filteredViolations;
|
|
495
|
+
violationsForEvidence = filteredViolations;
|
|
441
496
|
} else {
|
|
442
497
|
const stagedFiles = getStagedFiles();
|
|
443
498
|
const stagedSet = new Set((Array.isArray(stagedFiles) ? stagedFiles : []).map(toRepoRelativePath));
|
|
444
499
|
|
|
445
|
-
const stagedViolations =
|
|
500
|
+
const stagedViolations = filteredViolations.filter(v => {
|
|
446
501
|
const violationPath = toRepoRelativePath(v.filePath || v.file || '');
|
|
447
502
|
return isViolationInStagedFiles(violationPath, stagedSet);
|
|
448
503
|
});
|
|
@@ -876,4 +931,12 @@ if (require.main === module) {
|
|
|
876
931
|
});
|
|
877
932
|
}
|
|
878
933
|
|
|
879
|
-
module.exports = {
|
|
934
|
+
module.exports = {
|
|
935
|
+
runIntelligentAudit,
|
|
936
|
+
isViolationInStagedFiles,
|
|
937
|
+
toRepoRelativePath,
|
|
938
|
+
updateAIEvidence,
|
|
939
|
+
formatLocalTimestamp,
|
|
940
|
+
loadExclusions,
|
|
941
|
+
isViolationExcluded
|
|
942
|
+
};
|
package/scripts/hooks-system/infrastructure/watchdog/__tests__/.audit-reports/token-monitor.log
CHANGED
|
@@ -64,3 +64,27 @@
|
|
|
64
64
|
{"timestamp":"2026-01-13T07:51:07.491Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
65
65
|
{"timestamp":"2026-01-13T07:51:07.492Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
66
66
|
{"timestamp":"2026-01-13T07:51:07.493Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
67
|
+
{"timestamp":"2026-01-13T11:12:42.822Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
68
|
+
{"timestamp":"2026-01-13T11:12:42.825Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
69
|
+
{"timestamp":"2026-01-13T11:12:42.826Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
70
|
+
{"timestamp":"2026-01-13T11:21:29.481Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
71
|
+
{"timestamp":"2026-01-13T11:21:29.482Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
72
|
+
{"timestamp":"2026-01-13T11:21:29.482Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
73
|
+
{"timestamp":"2026-01-13T11:31:02.359Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
74
|
+
{"timestamp":"2026-01-13T11:31:02.360Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
75
|
+
{"timestamp":"2026-01-13T11:31:02.360Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
76
|
+
{"timestamp":"2026-01-13T13:12:20.560Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
77
|
+
{"timestamp":"2026-01-13T13:12:20.561Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
78
|
+
{"timestamp":"2026-01-13T13:12:20.561Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
79
|
+
{"timestamp":"2026-01-13T13:23:57.658Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
80
|
+
{"timestamp":"2026-01-13T13:23:57.659Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
81
|
+
{"timestamp":"2026-01-13T13:23:57.659Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
82
|
+
{"timestamp":"2026-01-13T13:58:44.971Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
83
|
+
{"timestamp":"2026-01-13T13:58:44.971Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
84
|
+
{"timestamp":"2026-01-13T13:58:44.971Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
85
|
+
{"timestamp":"2026-01-13T17:20:11.876Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
86
|
+
{"timestamp":"2026-01-13T17:20:11.877Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
87
|
+
{"timestamp":"2026-01-13T17:20:11.877Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|
|
88
|
+
{"timestamp":"2026-01-13T17:21:44.693Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"ok","percentUsed":10,"tokensUsed":100000,"maxTokens":1000000,"source":"realtime","stale":false},"context":{"message":"Result level=ok percent=10% used=100000/1000000 source=realtime"}}
|
|
89
|
+
{"timestamp":"2026-01-13T17:21:44.695Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"warning","percentUsed":91,"tokensUsed":910000,"maxTokens":1000000,"source":"fallback","stale":false},"context":{"message":"Result level=warning percent=91% used=910000/1000000 source=fallback"}}
|
|
90
|
+
{"timestamp":"2026-01-13T17:21:44.695Z","level":"info","component":"TokenMonitor","event":"TOKEN_MONITOR_RESULT","data":{"level":"critical","percentUsed":98,"tokensUsed":980000,"maxTokens":1000000,"source":"realtime","stale":true},"context":{"message":"Result level=critical percent=98% used=980000/1000000 source=realtime (stale)"}}
|