@jeganwrites/claudash 1.0.9 → 1.0.10

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
@@ -10,6 +10,8 @@ Zero pip dependencies. Single SQLite file. Single HTML page.
10
10
  ![python](https://img.shields.io/badge/python-3.8%2B-black)
11
11
  ![deps](https://img.shields.io/badge/dependencies-zero-black)
12
12
 
13
+ ![Claudash Dashboard](docs/screenshot.png)
14
+
13
15
  ## What you get
14
16
 
15
17
  - **Efficiency Score** — single 0-100 score across 5 dimensions: cache, model right-sizing, window discipline, floundering rate, compaction. Honest, actionable, comparable over time.
@@ -216,6 +218,25 @@ insights.
216
218
  | `floundering_detected` | red | Session stuck in retry loops (same tool >=4 times) |
217
219
  | `budget_warning` / `budget_exceeded` | amber / red | Daily budget threshold crossed |
218
220
 
221
+ ## Fix Tracker
222
+
223
+ Claudash tracks whether the fixes you make to your workflow actually work.
224
+
225
+ 1. **Baseline** — Claudash detects a waste pattern (e.g. floundering in Tidify costs $3,502/month)
226
+ 2. **Apply** — You make a change (add max-retry rule to CLAUDE.md, set autoCompactThreshold)
227
+ 3. **Measure** — Run `python3 cli.py measure <fix-id>` after 7 days
228
+ 4. **Verdict** — Claudash shows before/after: sessions, cost, floundering rate, cache hit
229
+
230
+ ```bash
231
+ # Add a fix
232
+ python3 cli.py fix add "Added max-retry:3 to CLAUDE.md for Tidify"
233
+
234
+ # Measure it after a week
235
+ python3 cli.py measure <fix-id>
236
+ ```
237
+
238
+ No other Claude Code tracker closes this loop. Most tools tell you what happened. Fix Tracker tells you whether your fix worked.
239
+
219
240
  ## API endpoints
220
241
 
221
242
  | Method | Path | Auth | Description |
package/_version.py ADDED
@@ -0,0 +1,11 @@
1
+ """Shared version constant — reads from package.json so there's one source of truth."""
2
+ import json
3
+ import os
4
+
5
+ _PKG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "package.json")
6
+
7
+ try:
8
+ with open(_PKG_PATH) as _f:
9
+ VERSION = json.load(_f).get("version", "0.0.0")
10
+ except (OSError, ValueError):
11
+ VERSION = "0.0.0"
package/cli.py CHANGED
@@ -10,6 +10,7 @@ from datetime import datetime, timezone, timedelta
10
10
 
11
11
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
12
12
 
13
+ from _version import VERSION
13
14
  from config import VPS_IP, VPS_PORT
14
15
  from db import (
15
16
  init_db, get_conn, get_insights, get_session_count, get_db_size_mb,
@@ -18,8 +19,8 @@ from db import (
18
19
  )
19
20
 
20
21
 
21
- HELP_TEXT = """
22
- Claudash v1.0 — personal Claude usage dashboard
22
+ HELP_TEXT = f"""
23
+ Claudash v{VERSION} — personal Claude usage dashboard
23
24
 
24
25
  Commands:
25
26
  dashboard Start dashboard server on :8080 (127.0.0.1 only)
@@ -129,7 +130,7 @@ def _run_dashboard(port=8080, no_browser=False, skip_init=False):
129
130
 
130
131
  print(flush=True)
131
132
  print(" ╔══════════════════════════════╗", flush=True)
132
- print(" ║ Claudash v1.0 ║", flush=True)
133
+ print(f" ║ Claudash v{VERSION:<17s}║", flush=True)
133
134
  print(" ╠══════════════════════════════╣", flush=True)
134
135
  print(f" ║ Records : {total:<17,}║", flush=True)
135
136
  print(f" ║ Accounts : {n_accts:<17s}║", flush=True)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jeganwrites/claudash",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "Claude Code usage intelligence dashboard",
5
5
  "bin": {
6
6
  "claudash": "./bin/claudash.js"
package/server.py CHANGED
@@ -26,6 +26,7 @@ from db import (
26
26
  )
27
27
 
28
28
  PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
29
+ from _version import VERSION
29
30
  from analyzer import full_analysis, project_metrics, window_intelligence, trend_metrics
30
31
  from scanner import scan_all, get_last_scan_time, preview_paths, discover_claude_paths
31
32
  from insights import generate_insights
@@ -246,7 +247,7 @@ class DashboardHandler(BaseHTTPRequestHandler):
246
247
  last_scan_iso = datetime.fromtimestamp(last_scan, tz=timezone.utc).isoformat() if last_scan else None
247
248
  self._serve_json({
248
249
  "status": "ok",
249
- "version": "1.0.0",
250
+ "version": VERSION,
250
251
  "uptime_seconds": int(time.time() - _server_start_time),
251
252
  "records": total,
252
253
  "last_scan": last_scan_iso,