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 CHANGED
@@ -21,6 +21,14 @@ npm run install-hooks
21
21
  npx ast-hooks
22
22
  ```
23
23
 
24
+ Default installation mode is `npm-runtime`.
25
+
26
+ To opt into an embedded runtime copy (`vendored` mode):
27
+
28
+ ```bash
29
+ HOOK_INSTALL_MODE=vendored npm run install-hooks
30
+ ```
31
+
24
32
  ---
25
33
 
26
34
  ## Operational visuals (examples)
@@ -53,14 +61,7 @@ Documentation:
53
61
 
54
62
  - `docs/USAGE.md` (Interactive Menu, non‑interactive `AUDIT_OPTION`, and typical flows)
55
63
  - `CHANGELOG.md` (Release notes and changes)
56
- - Keychain/Security casts are exempted from `ios.types.forbidden_type_cast` to avoid false positives in secure storage implementations.
57
-
58
- Release 6.0.6:
59
- - Keychain/Security casts are exempted from `ios.types.forbidden_type_cast` to avoid false positives in secure storage implementations.
60
- - Staging-only detection now ignores deleted files when building the file list.
61
-
62
- Release 6.0.7:
63
- - God Class detection (backend): baseline-first by default; optional hard cap via env; detector always runs (with or without baseline).
64
+ - `docs/RELEASE_NOTES.md` (Historical release notes)
64
65
 
65
66
  ---
66
67
 
@@ -0,0 +1,50 @@
1
+ const fs = require('fs');
2
+ const os = require('os');
3
+ const path = require('path');
4
+
5
+ function makeTempProject() {
6
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'pumuki-uninstall-'));
7
+ fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name: 'tmp', version: '0.0.0' }));
8
+ fs.mkdirSync(path.join(root, '.ast-intelligence'), { recursive: true });
9
+ fs.writeFileSync(path.join(root, '.AI_EVIDENCE.json'), JSON.stringify({ ok: true }));
10
+ fs.writeFileSync(path.join(root, '.evidence-guard.pid'), '99999');
11
+ fs.writeFileSync(path.join(root, '.evidence-guard.log'), 'log');
12
+
13
+ const gitHooksDir = path.join(root, '.git', 'hooks');
14
+ fs.mkdirSync(gitHooksDir, { recursive: true });
15
+ fs.writeFileSync(path.join(gitHooksDir, 'pre-commit'), 'node_modules/pumuki-ast-hooks/scripts/hooks-system/infrastructure/shell/gitflow/gitflow-enforcer.sh');
16
+ fs.writeFileSync(path.join(gitHooksDir, 'pre-push'), 'node_modules/pumuki-ast-hooks/scripts/hooks-system/infrastructure/shell/gitflow/gitflow-enforcer.sh');
17
+
18
+ return root;
19
+ }
20
+
21
+ describe('ast-uninstall', () => {
22
+ it('should default to dry-run (no deletions)', () => {
23
+ const projectRoot = makeTempProject();
24
+ const { planUninstall, applyUninstall } = require('../uninstall');
25
+
26
+ const plan = planUninstall({ projectRoot });
27
+ expect(Array.isArray(plan.paths)).toBe(true);
28
+ expect(plan.paths.length).toBeGreaterThan(0);
29
+
30
+ const result = applyUninstall({ projectRoot, apply: false, yes: true });
31
+ expect(result.applied).toBe(false);
32
+ expect(fs.existsSync(path.join(projectRoot, '.ast-intelligence'))).toBe(true);
33
+ });
34
+
35
+ it('should delete pumuki artifacts when apply=true', () => {
36
+ const projectRoot = makeTempProject();
37
+ const { applyUninstall } = require('../uninstall');
38
+
39
+ const result = applyUninstall({ projectRoot, apply: true, yes: true });
40
+ expect(result.applied).toBe(true);
41
+
42
+ expect(fs.existsSync(path.join(projectRoot, '.ast-intelligence'))).toBe(false);
43
+ expect(fs.existsSync(path.join(projectRoot, '.AI_EVIDENCE.json'))).toBe(false);
44
+ expect(fs.existsSync(path.join(projectRoot, '.evidence-guard.pid'))).toBe(false);
45
+ expect(fs.existsSync(path.join(projectRoot, '.evidence-guard.log'))).toBe(false);
46
+
47
+ expect(fs.existsSync(path.join(projectRoot, '.git', 'hooks', 'pre-commit'))).toBe(false);
48
+ expect(fs.existsSync(path.join(projectRoot, '.git', 'hooks', 'pre-push'))).toBe(false);
49
+ });
50
+ });
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ function findProjectRoot(startDir) {
7
+ let current = startDir;
8
+ while (current !== '/') {
9
+ if (fs.existsSync(path.join(current, 'package.json'))) {
10
+ return current;
11
+ }
12
+ current = path.dirname(current);
13
+ }
14
+ return startDir;
15
+ }
16
+
17
+ function isPumukiHookContent(content) {
18
+ if (!content) return false;
19
+ const text = String(content);
20
+ return text.includes('pumuki-ast-hooks') ||
21
+ text.includes('AST Intelligence') ||
22
+ text.includes('gitflow-enforcer.sh') ||
23
+ text.includes('Hook-System Git Flow Enforcer');
24
+ }
25
+
26
+ function safeReadFile(filePath) {
27
+ try {
28
+ return fs.readFileSync(filePath, 'utf8');
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ function shouldRemoveGitHook(hookPath) {
35
+ if (!fs.existsSync(hookPath)) return false;
36
+ const content = safeReadFile(hookPath);
37
+ return isPumukiHookContent(content);
38
+ }
39
+
40
+ function buildUninstallPlan(projectRoot) {
41
+ const paths = [];
42
+
43
+ const artifactPaths = [
44
+ '.ast-intelligence',
45
+ '.AI_EVIDENCE.json',
46
+ '.evidence-guard.pid',
47
+ '.evidence-guard.log',
48
+ '.audit_tmp',
49
+ '.audit-reports'
50
+ ];
51
+
52
+ for (const rel of artifactPaths) {
53
+ const p = path.join(projectRoot, rel);
54
+ if (fs.existsSync(p)) {
55
+ paths.push(p);
56
+ }
57
+ }
58
+
59
+ const gitHooksDir = path.join(projectRoot, '.git', 'hooks');
60
+ const preCommit = path.join(gitHooksDir, 'pre-commit');
61
+ const prePush = path.join(gitHooksDir, 'pre-push');
62
+
63
+ if (shouldRemoveGitHook(preCommit)) {
64
+ paths.push(preCommit);
65
+ }
66
+ if (shouldRemoveGitHook(prePush)) {
67
+ paths.push(prePush);
68
+ }
69
+
70
+ const vendoredRoot = path.join(projectRoot, 'scripts', 'hooks-system');
71
+ if (fs.existsSync(vendoredRoot)) {
72
+ paths.push(vendoredRoot);
73
+ }
74
+
75
+ const cursorDir = path.join(projectRoot, '.cursor');
76
+ const windsurfDir = path.join(projectRoot, '.windsurf');
77
+ const vscodeDir = path.join(projectRoot, '.vscode');
78
+
79
+ const cursorMcp = path.join(cursorDir, 'mcp.json');
80
+ const windsurfMcp = path.join(windsurfDir, 'mcp.json');
81
+
82
+ if (fs.existsSync(cursorMcp) || fs.existsSync(windsurfMcp)) {
83
+ if (fs.existsSync(cursorDir)) paths.push(cursorDir);
84
+ if (fs.existsSync(windsurfDir)) paths.push(windsurfDir);
85
+ }
86
+
87
+ if (fs.existsSync(vscodeDir)) {
88
+ paths.push(vscodeDir);
89
+ }
90
+
91
+ const unique = Array.from(new Set(paths));
92
+ return {
93
+ projectRoot,
94
+ paths: unique.sort()
95
+ };
96
+ }
97
+
98
+ function removePath(targetPath) {
99
+ if (!fs.existsSync(targetPath)) return;
100
+ const stat = fs.lstatSync(targetPath);
101
+ if (stat.isDirectory()) {
102
+ fs.rmSync(targetPath, { recursive: true, force: true });
103
+ return;
104
+ }
105
+ fs.rmSync(targetPath, { force: true });
106
+ }
107
+
108
+ function stopEvidenceGuard(projectRoot) {
109
+ const pidPath = path.join(projectRoot, '.evidence-guard.pid');
110
+ if (!fs.existsSync(pidPath)) return;
111
+
112
+ const raw = safeReadFile(pidPath);
113
+ const pid = raw ? parseInt(raw.trim(), 10) : NaN;
114
+ if (Number.isNaN(pid)) return;
115
+
116
+ try {
117
+ process.kill(pid, 0);
118
+ } catch {
119
+ return;
120
+ }
121
+
122
+ try {
123
+ process.kill(pid, 'SIGTERM');
124
+ } catch {
125
+ return;
126
+ }
127
+ }
128
+
129
+ function parseArgs(argv) {
130
+ const args = argv.slice(2);
131
+ return {
132
+ apply: args.includes('--apply'),
133
+ dryRun: args.includes('--dry-run') || !args.includes('--apply'),
134
+ yes: args.includes('--yes'),
135
+ help: args.includes('--help') || args.includes('-h'),
136
+ projectRootArg: (() => {
137
+ const p = args.find(a => a.startsWith('--project-root='));
138
+ if (!p) return null;
139
+ return p.split('=').slice(1).join('=');
140
+ })()
141
+ };
142
+ }
143
+
144
+ function printUsage() {
145
+ process.stdout.write(`\nUsage:\n npx ast-uninstall [--dry-run] [--apply] [--yes] [--project-root=/path]\n\nDefaults:\n --dry-run is default (no changes)\n\nExamples:\n npx ast-uninstall\n npx ast-uninstall --apply\n npx ast-uninstall --apply --yes\n npx ast-uninstall --project-root=/path/to/repo\n\n`);
146
+ }
147
+
148
+ function planUninstall({ projectRoot }) {
149
+ return buildUninstallPlan(projectRoot);
150
+ }
151
+
152
+ function applyUninstall({ projectRoot, apply, yes }) {
153
+ const plan = buildUninstallPlan(projectRoot);
154
+
155
+ if (!apply) {
156
+ return { applied: false, plan };
157
+ }
158
+
159
+ if (!yes && process.stdout.isTTY) {
160
+ process.stdout.write('This will delete files from your repository. Re-run with --yes to confirm.\n');
161
+ return { applied: false, plan, needsConfirmation: true };
162
+ }
163
+
164
+ stopEvidenceGuard(projectRoot);
165
+
166
+ for (const p of plan.paths) {
167
+ removePath(p);
168
+ }
169
+
170
+ return { applied: true, plan };
171
+ }
172
+
173
+ function main() {
174
+ const options = parseArgs(process.argv);
175
+
176
+ if (options.help) {
177
+ printUsage();
178
+ process.exit(0);
179
+ }
180
+
181
+ const cwd = process.cwd();
182
+ const rootFromCwd = findProjectRoot(cwd);
183
+ const projectRoot = options.projectRootArg ? path.resolve(options.projectRootArg) : rootFromCwd;
184
+
185
+ const plan = buildUninstallPlan(projectRoot);
186
+
187
+ if (options.dryRun) {
188
+ process.stdout.write(`Project root: ${projectRoot}\n`);
189
+ process.stdout.write('Planned removals:\n');
190
+ for (const p of plan.paths) {
191
+ process.stdout.write(`- ${p}\n`);
192
+ }
193
+ process.exit(0);
194
+ }
195
+
196
+ const result = applyUninstall({ projectRoot, apply: true, yes: options.yes });
197
+
198
+ if (result.needsConfirmation) {
199
+ process.exit(2);
200
+ }
201
+
202
+ process.stdout.write('Uninstall completed.\n');
203
+ process.exit(0);
204
+ }
205
+
206
+ if (require.main === module) {
207
+ main();
208
+ }
209
+
210
+ module.exports = { planUninstall, applyUninstall, findProjectRoot };
@@ -91,6 +91,8 @@ npm install --save-dev pumuki-ast-hooks
91
91
  npm run install-hooks
92
92
  ```
93
93
 
94
+ By default, the installer uses npm-runtime mode (no embedded copy of `scripts/hooks-system` into your project). To use the vendored mode (embedded runtime), run the installer with `HOOK_INSTALL_MODE=vendored`.
95
+
94
96
  ### Option 2: Global Installation
95
97
 
96
98
  ```bash
@@ -231,7 +233,7 @@ cat > .cursor/mcp.json << 'EOF'
231
233
  "ai-evidence-watcher": {
232
234
  "command": "node",
233
235
  "args": [
234
- "${workspaceFolder}/node_modules/pumuki-ast-hooks/infrastructure/mcp/evidence-watcher.js"
236
+ "${workspaceFolder}/node_modules/pumuki-ast-hooks/scripts/hooks-system/infrastructure/mcp/evidence-watcher.js"
235
237
  ],
236
238
  "env": {
237
239
  "REPO_ROOT": "${workspaceFolder}"
@@ -240,7 +242,7 @@ cat > .cursor/mcp.json << 'EOF'
240
242
  "ast-intelligence-automation": {
241
243
  "command": "node",
242
244
  "args": [
243
- "${workspaceFolder}/scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js"
245
+ "${workspaceFolder}/node_modules/pumuki-ast-hooks/scripts/hooks-system/infrastructure/mcp/ast-intelligence-automation.js"
244
246
  ],
245
247
  "env": {
246
248
  "REPO_ROOT": "${workspaceFolder}",
@@ -358,6 +360,8 @@ cp node_modules/pumuki-ast-hooks/templates/config/rules.json.template \
358
360
  # Then customize as needed
359
361
  ```
360
362
 
363
+ If you are using npm-runtime mode (default), use `HOOK_INSTALL_MODE=vendored` before re-running the installer to ensure `scripts/hooks-system/config/` exists in your project.
364
+
361
365
  **Note:** Templates are optional. The library works without them using default configurations. Only copy and customize if you need project-specific overrides.
362
366
 
363
367
  ### 7. Configure Exclusions
@@ -653,7 +657,7 @@ npm run install-hooks
653
657
  This ensures:
654
658
  - ✅ Latest Git hooks are installed (with new features)
655
659
  - ✅ Latest MCP server configurations are updated
656
- - ✅ Latest system files are copied to `scripts/hooks-system/`
660
+ - ✅ Latest system files are copied to `scripts/hooks-system/` when using vendored mode
657
661
  - ✅ Any new configuration options are applied
658
662
 
659
663
  **What gets updated:**
package/docs/USAGE.md CHANGED
@@ -12,13 +12,6 @@
12
12
 
13
13
  ---
14
14
 
15
- ## Recent Changes (v6.0.6)
16
-
17
- - Keychain/Security casts are exempted from `ios.types.forbidden_type_cast` to avoid false positives.
18
- - Staging gate evaluation ignores deleted files when assembling the staged file list.
19
-
20
- ---
21
-
22
15
  ## Minimal Example (5 minutes)
23
16
 
24
17
  ### Step 1: Install
@@ -88,10 +81,15 @@ npm run ast:guard:logs
88
81
  Gate scope:
89
82
  ```bash
90
83
  # Default is staging (only staged files)
91
- AI_GATE_SCOPE=staging bash ./scripts/hooks-system/bin/update-evidence.sh --auto
84
+ AI_GATE_SCOPE=staging bash ./node_modules/pumuki-ast-hooks/scripts/hooks-system/bin/update-evidence.sh --auto
92
85
 
93
86
  # Repository-wide gate evaluation
94
- AI_GATE_SCOPE=repo bash ./scripts/hooks-system/bin/update-evidence.sh --auto
87
+ AI_GATE_SCOPE=repo bash ./node_modules/pumuki-ast-hooks/scripts/hooks-system/bin/update-evidence.sh --auto
88
+ ```
89
+
90
+ If you are using vendored mode, you can use:
91
+ ```bash
92
+ AI_GATE_SCOPE=staging bash ./scripts/hooks-system/bin/update-evidence.sh --auto
95
93
  ```
96
94
 
97
95
  ### Interactive Menu (Recommended)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki-ast-hooks",
3
- "version": "6.1.2",
3
+ "version": "6.1.6",
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": {
@@ -8,6 +8,7 @@
8
8
  "audit": "./bin/audit",
9
9
  "ast-hooks": "./bin/cli.js",
10
10
  "ast-install": "./bin/install.js",
11
+ "ast-uninstall": "./bin/uninstall.js",
11
12
  "ast-violations": "./bin/violations-api.js",
12
13
  "ast-check-version": "./bin/check-version.js",
13
14
  "ast-gitflow": "./scripts/hooks-system/bin/gitflow-cycle.js",
@@ -32,3 +32,10 @@
32
32
  {"timestamp":"2026-01-13T17:54:11.574Z","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":{}}
33
33
  {"timestamp":"2026-01-14T07:11:01.436Z","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":{}}
34
34
  {"timestamp":"2026-01-14T07:32:52.204Z","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":{}}
35
+ {"timestamp":"2026-01-14T10:52:05.241Z","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":{}}
36
+ {"timestamp":"2026-01-14T10:53:08.625Z","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":{}}
37
+ {"timestamp":"2026-01-14T10:53:45.774Z","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":{}}
38
+ {"timestamp":"2026-01-14T19:41:34.447Z","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":{}}
39
+ {"timestamp":"2026-01-14T22:23:58.130Z","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":{}}
40
+ {"timestamp":"2026-01-15T07:43:05.309Z","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":{}}
41
+ {"timestamp":"2026-01-15T07:49:00.777Z","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":{}}
@@ -138,3 +138,31 @@
138
138
  {"timestamp":"2026-01-14T07:32:52.286Z","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":{}}
139
139
  {"timestamp":"2026-01-14T07:32:52.287Z","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":{}}
140
140
  {"timestamp":"2026-01-14T07:32:52.287Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
141
+ {"timestamp":"2026-01-14T10:52:05.384Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
142
+ {"timestamp":"2026-01-14T10:52:05.395Z","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":{}}
143
+ {"timestamp":"2026-01-14T10:52:05.395Z","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":{}}
144
+ {"timestamp":"2026-01-14T10:52:05.395Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
145
+ {"timestamp":"2026-01-14T10:53:08.774Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
146
+ {"timestamp":"2026-01-14T10:53:08.783Z","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":{}}
147
+ {"timestamp":"2026-01-14T10:53:08.783Z","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":{}}
148
+ {"timestamp":"2026-01-14T10:53:08.783Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
149
+ {"timestamp":"2026-01-14T10:53:45.930Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
150
+ {"timestamp":"2026-01-14T10:53:45.937Z","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":{}}
151
+ {"timestamp":"2026-01-14T10:53:45.939Z","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":{}}
152
+ {"timestamp":"2026-01-14T10:53:45.939Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
153
+ {"timestamp":"2026-01-14T19:41:34.372Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
154
+ {"timestamp":"2026-01-14T19:41:34.380Z","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":{}}
155
+ {"timestamp":"2026-01-14T19:41:34.380Z","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":{}}
156
+ {"timestamp":"2026-01-14T19:41:34.380Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
157
+ {"timestamp":"2026-01-14T22:23:58.044Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
158
+ {"timestamp":"2026-01-14T22:23:58.052Z","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":{}}
159
+ {"timestamp":"2026-01-14T22:23:58.052Z","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":{}}
160
+ {"timestamp":"2026-01-14T22:23:58.053Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
161
+ {"timestamp":"2026-01-15T07:43:05.408Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
162
+ {"timestamp":"2026-01-15T07:43:05.416Z","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":{}}
163
+ {"timestamp":"2026-01-15T07:43:05.417Z","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":{}}
164
+ {"timestamp":"2026-01-15T07:43:05.417Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}
165
+ {"timestamp":"2026-01-15T07:49:00.924Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_START","data":{"repoRoot":"/Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks/scripts/hooks-system"},"context":{}}
166
+ {"timestamp":"2026-01-15T07:49:00.931Z","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":{}}
167
+ {"timestamp":"2026-01-15T07:49:00.931Z","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":{}}
168
+ {"timestamp":"2026-01-15T07:49:00.931Z","level":"info","component":"InstallWizard","event":"INSTALL_WIZARD_COMPLETED","data":{},"context":{}}