pumuki-ast-hooks 6.1.2 → 6.1.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/README.md +9 -8
- package/bin/__tests__/uninstall.spec.js +50 -0
- package/bin/uninstall.js +210 -0
- package/docs/INSTALLATION.md +7 -3
- package/docs/USAGE.md +7 -9
- package/package.json +2 -1
- package/scripts/hooks-system/.audit-reports/auto-recovery.log +7 -0
- package/scripts/hooks-system/.audit-reports/install-wizard.log +28 -0
- package/scripts/hooks-system/.audit_tmp/hook-metrics.jsonl +168 -0
- package/scripts/hooks-system/application/services/installation/ConfigurationGeneratorService.js +22 -12
- package/scripts/hooks-system/application/services/installation/GitEnvironmentService.js +8 -0
- package/scripts/hooks-system/application/services/installation/InstallService.js +33 -14
- package/scripts/hooks-system/bin/__tests__/cli.spec.js +36 -6
- package/scripts/hooks-system/bin/__tests__/install-mode.spec.js +98 -0
- package/scripts/hooks-system/bin/cli.js +14 -9
- package/scripts/hooks-system/bin/gitflow +19 -2
- package/scripts/hooks-system/bin/install.js +8 -1
- package/scripts/hooks-system/infrastructure/ast/ios/detectors/__tests__/ios-encapsulation-public-mutable.spec.js +16 -0
- package/scripts/hooks-system/infrastructure/ast/ios/detectors/ios-ast-intelligent-strategies.js +2 -1
- package/scripts/hooks-system/infrastructure/git-hooks/pre-push +6 -1
- package/scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js +1 -1
- package/scripts/hooks-system/infrastructure/watchdog/__tests__/.audit-reports/token-monitor.log +21 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Unified CLI to run audits from any project
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
const { execSync } = require('child_process');
|
|
9
|
+
const { execSync, execFileSync } = require('child_process');
|
|
10
10
|
const fs = require('fs');
|
|
11
11
|
const path = require('path');
|
|
12
12
|
const env = require('../config/env');
|
|
@@ -365,7 +365,7 @@ const commands = {
|
|
|
365
365
|
console.log('🔍 Running full AST analysis and updating evidence...');
|
|
366
366
|
|
|
367
367
|
try {
|
|
368
|
-
|
|
368
|
+
execFileSync(process.execPath, [auditScript], {
|
|
369
369
|
stdio: 'inherit',
|
|
370
370
|
env: {
|
|
371
371
|
...process.env,
|
|
@@ -402,22 +402,23 @@ const commands = {
|
|
|
402
402
|
execEnv.STAGING_ONLY_MODE = '1';
|
|
403
403
|
}
|
|
404
404
|
|
|
405
|
-
|
|
406
|
-
|
|
405
|
+
execFileSync(
|
|
406
|
+
process.execPath,
|
|
407
|
+
[path.join(HOOKS_ROOT, 'infrastructure/ast/ast-intelligence.js'), ...filteredArgs],
|
|
407
408
|
{ stdio: 'inherit', env: execEnv }
|
|
408
409
|
);
|
|
409
410
|
},
|
|
410
411
|
|
|
411
412
|
install: () => {
|
|
412
|
-
|
|
413
|
+
execFileSync(process.execPath, [path.join(HOOKS_ROOT, 'bin/install.js')], { stdio: 'inherit' });
|
|
413
414
|
},
|
|
414
415
|
|
|
415
416
|
'verify-policy': () => {
|
|
416
|
-
|
|
417
|
+
execFileSync('bash', [path.join(HOOKS_ROOT, 'bin/verify-no-verify.sh')], { stdio: 'inherit' });
|
|
417
418
|
},
|
|
418
419
|
|
|
419
420
|
'progress': () => {
|
|
420
|
-
|
|
421
|
+
execFileSync('bash', [path.join(HOOKS_ROOT, 'bin/generate-progress-report.sh')], { stdio: 'inherit' });
|
|
421
422
|
},
|
|
422
423
|
|
|
423
424
|
health: () => {
|
|
@@ -426,12 +427,16 @@ const commands = {
|
|
|
426
427
|
},
|
|
427
428
|
|
|
428
429
|
watch: () => {
|
|
429
|
-
|
|
430
|
+
execFileSync(process.execPath, [path.join(HOOKS_ROOT, 'bin/watch-hooks.js')], { stdio: 'inherit' });
|
|
430
431
|
},
|
|
431
432
|
|
|
432
433
|
'gitflow': () => {
|
|
433
434
|
const subcommand = args[0] || 'check';
|
|
434
|
-
|
|
435
|
+
let enforcerPath = path.join(HOOKS_ROOT, 'infrastructure/shell/gitflow/gitflow-enforcer.sh');
|
|
436
|
+
if (!fs.existsSync(enforcerPath)) {
|
|
437
|
+
enforcerPath = path.join(HOOKS_ROOT, 'infrastructure/shell/gitflow-enforcer.sh');
|
|
438
|
+
}
|
|
439
|
+
execFileSync('bash', [enforcerPath, subcommand], { stdio: 'inherit' });
|
|
435
440
|
},
|
|
436
441
|
|
|
437
442
|
'intent': () => {
|
|
@@ -6,7 +6,11 @@
|
|
|
6
6
|
# =============================================================================
|
|
7
7
|
|
|
8
8
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
-
ENFORCER="${SCRIPT_DIR}/../infrastructure/shell/gitflow-enforcer.sh"
|
|
9
|
+
ENFORCER="${SCRIPT_DIR}/../infrastructure/shell/gitflow/gitflow-enforcer.sh"
|
|
10
|
+
|
|
11
|
+
if [[ ! -f "$ENFORCER" ]]; then
|
|
12
|
+
ENFORCER="${SCRIPT_DIR}/../infrastructure/shell/gitflow-enforcer.sh"
|
|
13
|
+
fi
|
|
10
14
|
|
|
11
15
|
if [[ ! -f "$ENFORCER" ]]; then
|
|
12
16
|
echo "❌ Error: gitflow-enforcer.sh not found"
|
|
@@ -14,4 +18,17 @@ if [[ ! -f "$ENFORCER" ]]; then
|
|
|
14
18
|
exit 1
|
|
15
19
|
fi
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
SUBCOMMAND="${1:-check}"
|
|
22
|
+
case "$SUBCOMMAND" in
|
|
23
|
+
status)
|
|
24
|
+
SUBCOMMAND="check"
|
|
25
|
+
;;
|
|
26
|
+
workflow)
|
|
27
|
+
SUBCOMMAND="cycle"
|
|
28
|
+
;;
|
|
29
|
+
reset)
|
|
30
|
+
SUBCOMMAND="cleanup"
|
|
31
|
+
;;
|
|
32
|
+
esac
|
|
33
|
+
|
|
34
|
+
bash "$ENFORCER" "$SUBCOMMAND"
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const env = require('../config/env');
|
|
4
3
|
const InstallService = require('../application/services/installation/InstallService');
|
|
5
4
|
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
if (args.includes('--vendored') || args.includes('--embedded')) {
|
|
7
|
+
process.env.HOOK_INSTALL_MODE = 'vendored';
|
|
8
|
+
}
|
|
9
|
+
if (args.includes('--npm-runtime') || args.includes('--npm')) {
|
|
10
|
+
process.env.HOOK_INSTALL_MODE = 'npm';
|
|
11
|
+
}
|
|
12
|
+
|
|
6
13
|
// Run installation
|
|
7
14
|
const installer = new InstallService();
|
|
8
15
|
installer.run().catch(error => {
|
|
@@ -12,6 +12,22 @@ describe('ios.encapsulation.public_mutable', () => {
|
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
it('does not flag public private(set) stored property', () => {
|
|
16
|
+
const analyzer = makeAnalyzer();
|
|
17
|
+
const node = {
|
|
18
|
+
'key.name': 'state',
|
|
19
|
+
'key.line': 10,
|
|
20
|
+
'key.kind': 'source.lang.swift.decl.var.instance',
|
|
21
|
+
'key.accessibility': 'source.lang.swift.accessibility.public'
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
analyzer.getAttributes = () => ['setter_access.private'];
|
|
25
|
+
|
|
26
|
+
analyzePropertyAST(analyzer, node, '/tmp/Foo.swift');
|
|
27
|
+
|
|
28
|
+
expect(analyzer.findings.find(f => f.ruleId === 'ios.encapsulation.public_mutable')).toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
|
|
15
31
|
it('does not flag public computed get-only property', () => {
|
|
16
32
|
const analyzer = makeAnalyzer();
|
|
17
33
|
const node = {
|
package/scripts/hooks-system/infrastructure/ast/ios/detectors/ios-ast-intelligent-strategies.js
CHANGED
|
@@ -457,7 +457,8 @@ function analyzePropertyAST(analyzer, node, filePath) {
|
|
|
457
457
|
const isComputed = hasAccessorGet || hasAccessorSet;
|
|
458
458
|
const isMutable = isComputed ? hasAccessorSet : true;
|
|
459
459
|
|
|
460
|
-
|
|
460
|
+
const hasSetterAccessRestriction = attributes.some(a => String(a).startsWith('setter_access'));
|
|
461
|
+
if (isPublic && isInstance && isMutable && !hasSetterAccessRestriction) {
|
|
461
462
|
analyzer.pushFinding('ios.encapsulation.public_mutable', 'medium', filePath, line, `Public mutable property '${name}' - consider private(set)`);
|
|
462
463
|
}
|
|
463
464
|
}
|
|
@@ -19,7 +19,12 @@ echo ""
|
|
|
19
19
|
echo "🔍 Validating Git Flow compliance before push..."
|
|
20
20
|
echo ""
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
ENFORCER_SCRIPT="${HOOKS_SYSTEM_ROOT}/infrastructure/shell/gitflow/gitflow-enforcer.sh"
|
|
23
|
+
if [[ ! -f "$ENFORCER_SCRIPT" ]]; then
|
|
24
|
+
ENFORCER_SCRIPT="${HOOKS_SYSTEM_ROOT}/infrastructure/shell/gitflow-enforcer.sh"
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
if ! bash "$ENFORCER_SCRIPT" check; then
|
|
23
28
|
echo ""
|
|
24
29
|
echo "🚨 PUSH BLOCKED: Complete Git Flow cycle first"
|
|
25
30
|
echo ""
|
|
@@ -2432,7 +2432,7 @@ async function handleMcpMessage(message) {
|
|
|
2432
2432
|
result = suggestHumanIntent();
|
|
2433
2433
|
break;
|
|
2434
2434
|
case 'pre_flight_check':
|
|
2435
|
-
result = preFlightCheck(toolParams);
|
|
2435
|
+
result = await preFlightCheck(toolParams);
|
|
2436
2436
|
break;
|
|
2437
2437
|
case 'record_test_created':
|
|
2438
2438
|
result = recordTestCreated(toolParams);
|
package/scripts/hooks-system/infrastructure/watchdog/__tests__/.audit-reports/token-monitor.log
CHANGED
|
@@ -100,3 +100,24 @@
|
|
|
100
100
|
{"timestamp":"2026-01-14T07:32:54.063Z","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"}}
|
|
101
101
|
{"timestamp":"2026-01-14T07:32:54.064Z","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"}}
|
|
102
102
|
{"timestamp":"2026-01-14T07:32:54.064Z","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)"}}
|
|
103
|
+
{"timestamp":"2026-01-14T10:52:07.651Z","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"}}
|
|
104
|
+
{"timestamp":"2026-01-14T10:52:07.652Z","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"}}
|
|
105
|
+
{"timestamp":"2026-01-14T10:52:07.652Z","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)"}}
|
|
106
|
+
{"timestamp":"2026-01-14T10:53:10.842Z","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"}}
|
|
107
|
+
{"timestamp":"2026-01-14T10:53:10.843Z","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"}}
|
|
108
|
+
{"timestamp":"2026-01-14T10:53:10.843Z","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)"}}
|
|
109
|
+
{"timestamp":"2026-01-14T10:53:47.998Z","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"}}
|
|
110
|
+
{"timestamp":"2026-01-14T10:53:47.999Z","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"}}
|
|
111
|
+
{"timestamp":"2026-01-14T10:53:47.999Z","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)"}}
|
|
112
|
+
{"timestamp":"2026-01-14T19:41:36.274Z","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"}}
|
|
113
|
+
{"timestamp":"2026-01-14T19:41:36.275Z","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"}}
|
|
114
|
+
{"timestamp":"2026-01-14T19:41:36.275Z","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)"}}
|
|
115
|
+
{"timestamp":"2026-01-14T22:24:01.361Z","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"}}
|
|
116
|
+
{"timestamp":"2026-01-14T22:24:01.362Z","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"}}
|
|
117
|
+
{"timestamp":"2026-01-14T22:24:01.362Z","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)"}}
|
|
118
|
+
{"timestamp":"2026-01-15T07:43:06.798Z","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"}}
|
|
119
|
+
{"timestamp":"2026-01-15T07:43:06.800Z","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"}}
|
|
120
|
+
{"timestamp":"2026-01-15T07:43:06.800Z","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)"}}
|
|
121
|
+
{"timestamp":"2026-01-15T07:49:02.751Z","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"}}
|
|
122
|
+
{"timestamp":"2026-01-15T07:49:02.752Z","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"}}
|
|
123
|
+
{"timestamp":"2026-01-15T07:49:02.753Z","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)"}}
|