Skip to content

Commit 6566d89

Browse files
committed
feat: Add auto-update support and enhanced version detection (v0.3.4)
## Features - Added --autoupdate flag to configure install-all command - Doctor command now detects unpinned eyelet versions - Enhanced doctor output with clear auto-update instructions ## Fixes - CRITICAL: Execute command supports both hook_type and hook_event_name - Fixed pydantic validation errors with Claude Code input ## Documentation - Added comprehensive version update section to README - Clear guidance on enabling auto-updates - Three options for managing eyelet versions This ensures users are aware of version pinning and can easily enable auto-updates with uvx eyelet@latest for continuous improvements.
1 parent da27c9e commit 6566d89

File tree

6 files changed

+101
-11
lines changed

6 files changed

+101
-11
lines changed

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.3.4] - 2025-01-30
11+
12+
### Added
13+
- **Auto-update support**: New `--autoupdate` flag for `configure install-all` command
14+
- **Version detection**: Doctor command now detects and warns about unpinned eyelet versions
15+
- **Update guidance**: Doctor provides clear instructions for enabling auto-updates
16+
17+
### Fixed
18+
- **CRITICAL**: Execute command now supports both `hook_type` and `hook_event_name` fields
19+
- Fixed validation error when Claude Code sends hook_event_name
20+
21+
### Changed
22+
- Enhanced doctor command output with prominent auto-update notifications
23+
- Improved README with version update documentation
24+
1025
## [0.3.3] - 2025-01-30
1126

1227
### Fixed

README.md

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
[![CI](https://github.com/bdmorin/eyelet/actions/workflows/ci.yml/badge.svg)](https://github.com/bdmorin/eyelet/actions/workflows/ci.yml)
1010
[![Status](https://img.shields.io/badge/status-alpha-yellow)](https://github.com/bdmorin/eyelet)
1111

12-
## 🎉 New in v0.3.3: Recall Feature & TUI Framework!
12+
## 🎉 New in v0.3.4: Auto-update Support & Critical Fixes!
13+
14+
### v0.3.4 Updates
15+
- **Auto-update support**: `--autoupdate` flag for install-all command
16+
- **Version detection**: Doctor command warns about unpinned versions
17+
- **Critical fix**: Execute command now supports both hook_type and hook_event_name
18+
- **Enhanced doctor**: Clear guidance on enabling auto-updates
1319

1420
### v0.3.3 Updates (Hotfix)
1521
- Fixed missing TUI module in PyPI package
@@ -53,13 +59,16 @@ Eyelet provides comprehensive management, templating, and execution handling for
5359
## 🚀 Quick Start
5460

5561
```bash
56-
# Install universal logging for ALL hooks (one command!)
62+
# Install universal logging for ALL hooks with auto-updates
63+
uvx eyelet configure install-all --autoupdate
64+
65+
# Or install without auto-updates (manual updates required)
5766
uvx eyelet configure install-all
5867

5968
# Enable SQLite logging for better performance
6069
uvx eyelet configure logging --format sqlite
6170

62-
# Check your configuration health
71+
# Check your configuration health (detects unpinned versions)
6372
uvx eyelet doctor
6473

6574
# Query your hook data
@@ -68,6 +77,29 @@ uvx eyelet query search --help # Search options
6877
uvx eyelet query errors # Debug issues
6978
```
7079

80+
### ⚠️ Important: Version Updates
81+
82+
By default, `uvx eyelet` caches the package and won't auto-update. You have three options:
83+
84+
1. **Enable auto-updates** (recommended):
85+
```bash
86+
uvx eyelet configure install-all --autoupdate
87+
```
88+
This uses `uvx eyelet@latest` which always fetches the latest version.
89+
90+
2. **Manual update** when needed:
91+
```bash
92+
uvx --reinstall eyelet@latest execute --log-only
93+
```
94+
95+
3. **Use pipx** for global installation:
96+
```bash
97+
pipx install eyelet
98+
pipx upgrade eyelet # When updates are available
99+
```
100+
101+
Run `eyelet doctor` to check if your hooks are configured for auto-updates.
102+
71103
## 🎯 Universal Hook Handler
72104

73105
Eyelet includes a powerful universal hook handler that logs EVERY Claude Code hook to a structured directory:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "eyelet"
3-
version = "0.3.3"
3+
version = "0.3.4"
44
description = "Hook orchestration system for AI agents with SQLite logging and powerful analytics"
55
readme = "README.md"
66
authors = [{name = "Brian Morin"}]

src/eyelet/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
Thread through the eyelet!
55
"""
66

7-
__version__ = "0.3.3"
7+
__version__ = "0.3.4"
88
__author__ = "Brian Morin"
99

1010
# Defer imports to avoid circular dependencies

src/eyelet/cli/configure.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,11 @@ def clear(ctx, scope, force):
304304
@click.option(
305305
"--dev", is_flag=True, help="Use local development wheel instead of public uvx"
306306
)
307+
@click.option(
308+
"--autoupdate", is_flag=True, help="Pin to @latest for automatic updates"
309+
)
307310
@click.pass_context
308-
def install_all(ctx, scope, force, dev):
311+
def install_all(ctx, scope, force, dev, autoupdate):
309312
"""
310313
Install universal logging for ALL hooks - Full broadside!
311314
@@ -369,10 +372,16 @@ def install_all(ctx, scope, force, dev):
369372
)
370373
else:
371374
# Use public uvx (requires package to be published to PyPI)
372-
eyelet_cmd = "uvx eyelet execute --log-only"
373-
console.print(
374-
"[cyan]Using public uvx command (requires PyPI package)[/cyan]"
375-
)
375+
if autoupdate:
376+
eyelet_cmd = "uvx eyelet@latest execute --log-only"
377+
console.print(
378+
"[cyan]Using public uvx command with @latest (auto-updates enabled)[/cyan]"
379+
)
380+
else:
381+
eyelet_cmd = "uvx eyelet execute --log-only"
382+
console.print(
383+
"[cyan]Using public uvx command (requires PyPI package)[/cyan]"
384+
)
376385

377386
# PreToolUse and PostToolUse for all tools
378387

src/eyelet/cli/doctor.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ def doctor(ctx, fix, verbose):
6666
issues.extend(dep_issues[0])
6767
warnings.extend(dep_issues[1])
6868

69+
# Check for version pinning warning specifically
70+
has_unpinned_warning = any("unpinned eyelet command" in w for w in warnings)
71+
6972
# Summary
7073
console.print("\n" + "=" * 50 + "\n")
7174

@@ -95,6 +98,19 @@ def doctor(ctx, fix, verbose):
9598
console.print(
9699
"\n💡 Run with [bold]--fix[/bold] to automatically fix issues where possible."
97100
)
101+
102+
# Special notification for unpinned versions
103+
if has_unpinned_warning:
104+
console.print("\n" + "=" * 50)
105+
console.print("\n🔔 [bold yellow]IMPORTANT: Auto-updates not enabled[/bold yellow]")
106+
console.print("\nYour eyelet hooks won't automatically get updates.")
107+
console.print("To enable auto-updates, choose one option:\n")
108+
console.print(" 1. [cyan]eyelet configure install-all --autoupdate[/cyan]")
109+
console.print(" Reinstalls all hooks with @latest pinning\n")
110+
console.print(" 2. [cyan]uvx --reinstall eyelet@latest execute --log-only[/cyan]")
111+
console.print(" Manually update individual hooks in settings.json\n")
112+
console.print(" 3. [cyan]pipx upgrade eyelet[/cyan] (if using pipx)")
113+
console.print(" Updates globally installed version")
98114

99115

100116
def check_claude_integration(
@@ -125,18 +141,36 @@ def check_claude_integration(
125141

126142
# Check hook configuration
127143
hooks = settings.get("hooks", {})
144+
unpinned_commands = []
128145
for _hook_type, hook_list in hooks.items():
129146
if isinstance(hook_list, list):
130147
for entry in hook_list:
131148
if "hooks" in entry:
132149
for hook in entry["hooks"]:
133150
total_hooks += 1
134-
if "eyelet" in hook.get("command", ""):
151+
command = hook.get("command", "")
152+
if "eyelet" in command:
135153
eyelet_hooks += 1
154+
# Check if version is pinned
155+
if "uvx eyelet" in command and "@" not in command:
156+
unpinned_commands.append(command[:50] + "..." if len(command) > 50 else command)
136157

137158
if verbose:
138159
console.print(f" 📊 Total hooks: {total_hooks}")
139160
console.print(f" 📊 Eyelet hooks: {eyelet_hooks}")
161+
162+
# Warn about unpinned versions
163+
if unpinned_commands:
164+
warnings.append(
165+
f"Found {len(unpinned_commands)} unpinned eyelet command(s). "
166+
"These won't auto-update. Use 'eyelet configure install-all --autoupdate' "
167+
"or add '@latest' to commands manually."
168+
)
169+
if verbose:
170+
for cmd in unpinned_commands[:3]: # Show first 3
171+
console.print(f" • {cmd}")
172+
if len(unpinned_commands) > 3:
173+
console.print(f" • ... and {len(unpinned_commands) - 3} more")
140174

141175
except Exception as e:
142176
issues.append(f"Failed to parse {settings_path}: {e}")

0 commit comments

Comments
 (0)