claude-session-dashboard 0.1.0 → 0.1.2

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 ADDED
@@ -0,0 +1,52 @@
1
+ # Claude Session Dashboard
2
+
3
+ A read-only, local observability dashboard for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) sessions. Scans your `~/.claude` directory to visualize session details, tool usage, agent dispatches, token consumption, and execution timelines.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ npx claude-session-dashboard
9
+ ```
10
+
11
+ Or install globally:
12
+
13
+ ```bash
14
+ npm install -g claude-session-dashboard
15
+ claude-dashboard
16
+ ```
17
+
18
+ Open [http://localhost:3000](http://localhost:3000) in your browser.
19
+
20
+ ### CLI Options
21
+
22
+ ```
23
+ -p, --port <number> Port to listen on (default: 3000)
24
+ --host <hostname> Host to bind to (default: localhost)
25
+ -o, --open Open browser after starting
26
+ -v, --version Show version number
27
+ -h, --help Show this help message
28
+ ```
29
+
30
+ ## Features
31
+
32
+ - **Sessions list** with search, status filters, project filters, and pagination
33
+ - **Session detail** with context window breakdown, tool usage stats, agent dispatch history
34
+ - **Cost estimation** per session and per agent based on Anthropic API pricing
35
+ - **Timeline chart** showing tool calls, agent runs, and skill invocations
36
+ - **Stats page** with aggregate metrics across all sessions
37
+ - **Live updates** for active sessions
38
+ - **Privacy mode** to anonymize paths and usernames for safe screenshot sharing
39
+
40
+ ## How It Works
41
+
42
+ The dashboard runs a local server that reads `~/.claude/projects/` to discover session `.jsonl` files. It parses them to extract metadata, tool calls, agent dispatches, and token usage, then displays everything in a web UI. No data leaves your machine.
43
+
44
+ ## Links
45
+
46
+ - [GitHub](https://github.com/dlupiak/claude-session-dashboard)
47
+ - [Issues](https://github.com/dlupiak/claude-session-dashboard/issues)
48
+ - [Docker](https://github.com/dlupiak/claude-session-dashboard/pkgs/container/claude-session-dashboard)
49
+
50
+ ## License
51
+
52
+ MIT
package/bin/cli.mjs CHANGED
@@ -3,7 +3,7 @@
3
3
  import { createServer } from 'node:http';
4
4
  import { readFile, access, stat } from 'node:fs/promises';
5
5
  import { resolve, join, extname } from 'node:path';
6
- import { fileURLToPath } from 'node:url';
6
+ import { fileURLToPath, pathToFileURL } from 'node:url';
7
7
  import { exec } from 'node:child_process';
8
8
  import { homedir } from 'node:os';
9
9
 
@@ -93,7 +93,7 @@ const MIME_TYPES = {
93
93
 
94
94
  process.env.NODE_ENV = 'production';
95
95
 
96
- const serverModule = await import(join(distDir, 'server', 'server.js'));
96
+ const serverModule = await import(pathToFileURL(join(distDir, 'server', 'server.js')).href);
97
97
  const appServer = serverModule.default;
98
98
 
99
99
  async function tryServeStatic(pathname) {
@@ -17,9 +17,9 @@ function extractSessionId(filename) {
17
17
  return filename.replace(/\.jsonl$/, "");
18
18
  }
19
19
  export {
20
- getStatsPath as a,
20
+ getProjectsDir as a,
21
21
  extractSessionId as b,
22
22
  decodeProjectDirName as d,
23
23
  extractProjectName as e,
24
- getProjectsDir as g
24
+ getStatsPath as g
25
25
  };
@@ -1,7 +1,7 @@
1
1
  import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
2
  import * as path from "node:path";
3
3
  import * as fs from "node:fs";
4
- import { e as extractProjectName, g as getProjectsDir, d as decodeProjectDirName } from "./claude-path-CkuljM34.js";
4
+ import { e as extractProjectName, a as getProjectsDir, d as decodeProjectDirName } from "./claude-path-on7ZBAjl.js";
5
5
  import { p as parseDetail } from "./session-parser-CAEXxF1D.js";
6
6
  import { c as createServerFn } from "../server.js";
7
7
  import "node:os";
@@ -2,7 +2,7 @@ import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
2
  import { z } from "zod";
3
3
  import * as fs from "node:fs";
4
4
  import * as path from "node:path";
5
- import { g as getProjectsDir, d as decodeProjectDirName, e as extractProjectName, b as extractSessionId } from "./claude-path-CkuljM34.js";
5
+ import { a as getProjectsDir, d as decodeProjectDirName, e as extractProjectName, b as extractSessionId } from "./claude-path-on7ZBAjl.js";
6
6
  import { a as parseSummary } from "./session-parser-CAEXxF1D.js";
7
7
  import { c as createServerFn } from "../server.js";
8
8
  import "node:os";
@@ -1,6 +1,6 @@
1
1
  import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
2
  import * as fs from "node:fs";
3
- import { a as getStatsPath } from "./claude-path-CkuljM34.js";
3
+ import { g as getStatsPath } from "./claude-path-on7ZBAjl.js";
4
4
  import { z } from "zod";
5
5
  import { c as createServerFn } from "../server.js";
6
6
  import "node:path";
@@ -577,12 +577,12 @@ function createMultiplexedStream(jsonStream, rawStreams) {
577
577
  }
578
578
  });
579
579
  }
580
- const manifest = { "ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a859bb": {
581
- functionName: "getSessionDetail_createServerFn_handler",
582
- importer: () => import("./assets/session-detail.server-azkRfON2.js")
583
- }, "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5ea799": {
580
+ const manifest = { "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5ea799": {
584
581
  functionName: "getStats_createServerFn_handler",
585
- importer: () => import("./assets/stats.server-BZWxV-mC.js")
582
+ importer: () => import("./assets/stats.server-BBNHZZ4h.js")
583
+ }, "ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a859bb": {
584
+ functionName: "getSessionDetail_createServerFn_handler",
585
+ importer: () => import("./assets/session-detail.server-ClCRw8BG.js")
586
586
  }, "810657681a273df5b4e58f0d8fcc6a5451598b489431b9bcaa98eea0ad815da8": {
587
587
  functionName: "getSettings_createServerFn_handler",
588
588
  importer: () => import("./assets/settings.server-6B2PvLgf.js")
@@ -591,13 +591,13 @@ const manifest = { "ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a8
591
591
  importer: () => import("./assets/settings.server-6B2PvLgf.js")
592
592
  }, "bf8e4a7901f1843bdc9c46be1ad5ad59c615b8bbe611b73eb3ff28f20e43ee0d": {
593
593
  functionName: "getSessionList_createServerFn_handler",
594
- importer: () => import("./assets/sessions.server-B8zbmvSM.js")
594
+ importer: () => import("./assets/sessions.server-Cl8Ao_-2.js")
595
595
  }, "839d29fe93dfa2a6d506af7b48ca25197190a5ff4c796e970ddfdc6e8c98827f": {
596
596
  functionName: "getActiveSessionList_createServerFn_handler",
597
- importer: () => import("./assets/sessions.server-B8zbmvSM.js")
597
+ importer: () => import("./assets/sessions.server-Cl8Ao_-2.js")
598
598
  }, "a3f42f9012fd83586787da8f7cb90649da739dd947d867eb67572f68735ff495": {
599
599
  functionName: "getPaginatedSessions_createServerFn_handler",
600
- importer: () => import("./assets/sessions.server-B8zbmvSM.js")
600
+ importer: () => import("./assets/sessions.server-Cl8Ao_-2.js")
601
601
  } };
602
602
  async function getServerFnById(id) {
603
603
  const serverFnInfo = manifest[id];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-session-dashboard",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Local observability dashboard for Claude Code sessions",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -28,7 +28,8 @@
28
28
  "files": [
29
29
  "bin/",
30
30
  "dist/",
31
- "LICENSE"
31
+ "LICENSE",
32
+ "README.md"
32
33
  ],
33
34
  "scripts": {
34
35
  "dev": "vite",