diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..5051114 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,81 @@ +name: Release + +on: + push: + tags: + - 'v*' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Extract version from tag + id: version + run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" + + - name: Build source archives + run: | + PROJECT="claude-statusline-${{ steps.version.outputs.VERSION }}" + + # Files to include in the release archives + INCLUDE=( + statusline.js + fetch-usage.js + install.sh + install.ps1 + install_wizard.py + package.json + requirements.txt + README.md + CHANGELOG.md + LICENSE + .gitattributes + claude_usage_widget/__init__.py + claude_usage_widget/__main__.py + claude_usage_widget/app.py + claude_usage_widget/config.py + claude_usage_widget/fetcher.py + claude_usage_widget/menu.py + claude_usage_widget/renderer.py + ) + + mkdir -p "dist/${PROJECT}/claude_usage_widget" + + for f in "${INCLUDE[@]}"; do + [ -f "$f" ] && cp "$f" "dist/${PROJECT}/$f" + done + + # tar.gz for Linux / macOS + tar -czf "dist/${PROJECT}.tar.gz" -C dist "${PROJECT}" + + # zip for Windows + cd dist && zip -r "${PROJECT}.zip" "${PROJECT}" && cd .. + + - name: Create release and upload assets + env: + TAG: ${{ github.ref_name }} + VERSION: ${{ steps.version.outputs.VERSION }} + TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITEA_URL: ${{ github.server_url }} + REPO: ${{ github.repository }} + run: | + API="${GITEA_URL}/api/v1/repos/${REPO}" + + # Create the release + RELEASE_ID=$(curl -s -X POST "${API}/releases" \ + -H "Authorization: token ${TOKEN}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"body\":\"See [CHANGELOG.md](CHANGELOG.md) for details.\",\"draft\":false,\"prerelease\":false}" \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") + + # Upload archives + for file in dist/claude-statusline-${VERSION}.tar.gz dist/claude-statusline-${VERSION}.zip; do + FILENAME=$(basename "$file") + curl -s -X POST "${API}/releases/${RELEASE_ID}/assets?name=${FILENAME}" \ + -H "Authorization: token ${TOKEN}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary "@${file}" + done diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9578c3d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,24 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/). + +## [0.2.0] — 2026-02-26 + +First tagged release. Includes the CLI statusline, standalone usage fetcher, cross-platform desktop widget, and installer wizard. + +### Added +- **CLI Statusline** — headless status bar for Claude Code showing context window and token usage as text progress bars +- **Usage Fetcher** — standalone Node.js cron job that fetches token usage from the Claude API and writes a shared JSON cache +- **Desktop Widget** — cross-platform system tray icon (pystray) with circular progress bar, Claude starburst logo, and color-coded usage severity +- **Installer Wizard** — interactive Python installer (`install_wizard.py`) with platform detection, component selection, cron/autostart setup, and session key configuration +- **Windows support** — PowerShell installer wrapper (`install.ps1`) and Windows-compatible paths +- **Session expiry warning** — statusline shows a warning when the session key is about to expire + +### Fixed +- CRLF line ending issues on cross-platform installs +- Tray icon visibility — switched to Claude orange with full opacity at larger size +- Block comment syntax error in cron example + +[0.2.0]: https://git.davoryn.de/calic/claude-statusline/releases/tag/v0.2.0 diff --git a/README.md b/README.md index 42d84a6..865c77a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ -# claude-statusline +
+ Monitor your Claude API usage — as a CLI statusline or a system tray widget +
+ + + +--- + +## Overview Both components share the same session key and fetcher logic. Install one or both depending on your setup. -## Components - ### CLI Statusline (Node.js) A headless-friendly status bar for Claude Code. Shows context window utilization and token usage as text progress bars, piped into the Claude Code statusline slot. @@ -24,30 +37,28 @@ Cross-platform system tray icon that shows the 5-hour usage window as a circular ## Topology -``` - claude.ai API - | - ┌────────────┴────────────┐ - | | - fetch-usage.js claude_usage_widget/ - (cron, Node.js) fetcher.py thread - | (Python, urllib) - | | - └────────┬────────────────┘ - v - /tmp/claude_usage.json - (shared cache) - ┌────────┴────────────────┐ - | | - statusline.js claude_usage_widget/ - (Claude Code) app.py (pystray) - | | - v v - Claude Code System tray icon - status bar + right-click menu +```mermaid +graph TD + API["claude.ai API"] + FetchJS["fetch-usage.js