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.
@@ -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
- execSync(`node "${auditScript}"`, {
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
- execSync(
406
- `node ${path.join(HOOKS_ROOT, 'infrastructure/ast/ast-intelligence.js')} ${filteredArgs.join(' ')}`,
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
- execSync(`node ${path.join(HOOKS_ROOT, 'bin/install.js')}`, { stdio: 'inherit' });
413
+ execFileSync(process.execPath, [path.join(HOOKS_ROOT, 'bin/install.js')], { stdio: 'inherit' });
413
414
  },
414
415
 
415
416
  'verify-policy': () => {
416
- execSync(`bash ${path.join(HOOKS_ROOT, 'bin/verify-no-verify.sh')}`, { stdio: 'inherit' });
417
+ execFileSync('bash', [path.join(HOOKS_ROOT, 'bin/verify-no-verify.sh')], { stdio: 'inherit' });
417
418
  },
418
419
 
419
420
  'progress': () => {
420
- execSync(`bash ${path.join(HOOKS_ROOT, 'bin/generate-progress-report.sh')}`, { stdio: 'inherit' });
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
- execSync(`node ${path.join(HOOKS_ROOT, 'bin/watch-hooks.js')}`, { stdio: 'inherit' });
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
- execSync(`bash ${path.join(HOOKS_ROOT, 'infrastructure/shell/gitflow-enforcer.sh')} ${subcommand}`, { stdio: 'inherit' });
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
- bash "$ENFORCER" "${1:-check}"
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 = {
@@ -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
- if (isPublic && isInstance && isMutable && !attributes.includes('setter_access')) {
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
- if ! bash "${HOOKS_SYSTEM_ROOT}/infrastructure/shell/gitflow-enforcer.sh" check; then
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);
@@ -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)"}}