oh-my-hi 0.1.0

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.
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "oh-my-hi",
3
+ "metadata": {
4
+ "description": "Claude Code harness insights dashboard"
5
+ },
6
+ "owner": {
7
+ "name": "Jae Sung Park",
8
+ "email": "alberto.park@gmail.com"
9
+ },
10
+ "plugins": [
11
+ {
12
+ "name": "oh-my-hi",
13
+ "description": "Visual dashboard for Claude Code harness β€” usage/token analysis of skills, agents, plugins, hooks, memory, MCP servers, rules, and principles",
14
+ "version": "0.1.0",
15
+ "author": {
16
+ "name": "Jae Sung Park",
17
+ "email": "alberto.park@gmail.com"
18
+ },
19
+ "category": "analytics",
20
+ "source": "./",
21
+ "homepage": "https://github.com/netil/oh-my-hi",
22
+ "keywords": ["dashboard", "harness", "insights", "usage", "tokens", "analytics"]
23
+ }
24
+ ]
25
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jae Sung Park
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # πŸ‘‹ oh-my-hi (Oh My Harness Insights)
2
+ ![oh-my-hi dashboard](https://img.shields.io/badge/Claude_Code-Plugin-blue)
3
+
4
+ **Harness Insights** β€” A visual dashboard for your Claude Code harness.
5
+
6
+ Parses your entire Claude Code configuration and usage data, then generates an interactive single-file HTML dashboard you can open locally.
7
+
8
+
9
+ ## What it shows
10
+
11
+ - **Harness overview** β€” skills, agents, plugins, hooks, memory, MCP servers, rules, principles, commands, teams, plans
12
+ - **Token analytics** β€” usage by model, daily trends, cache efficiency, prompt statistics, response latency
13
+ - **Activity heatmaps** β€” daily usage patterns across skills, agents, and commands
14
+ - **Task categories** β€” auto-classified token usage by work type (code editing, docs, planning, etc.)
15
+ - **Multi-workspace** β€” switch between global and per-project scopes
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ # 1. Add marketplace
21
+ claude plugin marketplace add github:netil/oh-my-hi
22
+
23
+ # 2. Install plugin
24
+ claude plugin install oh-my-hi
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ Run in Claude Code:
30
+
31
+ ```
32
+ /omh
33
+ ```
34
+
35
+ This will parse your harness data, build the dashboard, and open it in your browser.
36
+
37
+ ### Parameters
38
+
39
+ | Command | Description |
40
+ |---------|-------------|
41
+ | `/omh` | Full build β€” parse data, build web-ui, open in browser |
42
+ | `/omh --data-only` | Regenerate data + web-ui without opening browser |
43
+ | `/omh --enable-auto` | Auto-rebuild on session end (registers Stop hook) |
44
+ | `/omh --disable-auto` | Disable auto-rebuild |
45
+ | `/omh --status` | Check auto-rebuild status |
46
+ | `/omh <path>` | Build with specific project paths only |
47
+
48
+ ### Auto-refresh
49
+
50
+ Enable automatic data refresh so the dashboard stays up to date:
51
+
52
+ ```
53
+ /omh --enable-auto
54
+ ```
55
+
56
+ This registers a Stop hook that rebuilds the dashboard data whenever a Claude Code session ends. Refresh the browser tab to see the latest data.
57
+
58
+ ## How it works
59
+
60
+ 1. **Parse** β€” Reads your Claude Code config directory for skills, agents, plugins, hooks, memory, MCP servers, rules, principles, commands, teams, plans, and usage transcripts
61
+ 2. **Analyze** β€” Extracts token usage, prompt stats, response latency, activity patterns from `.jsonl` transcripts
62
+ 3. **Classify** β€” Auto-categorizes token usage into work types (code editing, docs, planning, etc.) based on skill/agent descriptions. Saves to `task-categories.json` for user customization
63
+ 4. **Build** β€” Generates a single `index.html` with all data, CSS, JS, and locale inlined (works with `file://` protocol, no server needed)
64
+ 5. **Open** β€” On macOS, reuses an existing browser tab if found (AppleScript). On Windows/Linux, opens a new tab
65
+
66
+ ## i18n
67
+
68
+ - **English**: Built-in default
69
+ - **Other languages**: A template locale file is auto-generated on first build. Translate it and rebuild
70
+
71
+ ## Browser support
72
+
73
+ The dashboard opens as a local `file://` HTML file. No web server required.
74
+
75
+ On macOS, subsequent builds will refresh the existing browser tab instead of opening a new one (Chrome and Safari supported).
76
+
77
+ ## License
78
+
79
+ [MIT](LICENSE)
package/SPEC.md ADDED
@@ -0,0 +1,160 @@
1
+ # oh-my-hi β€” Specification
2
+
3
+ ## Overview
4
+
5
+ Claude Code harness dashboard generator. Invoked as `/omh` skill.
6
+ Parses harness configuration and usage data, builds a single-file HTML dashboard.
7
+
8
+ ## Directory Structure
9
+
10
+ ```
11
+ oh-my-hi/
12
+ β”œβ”€β”€ SKILL.md # Skill definition (invoked as /omh)
13
+ β”œβ”€β”€ SPEC.md # This file
14
+ β”œβ”€β”€ task-categories.json # Persistent task category mapping (user-editable)
15
+ β”œβ”€β”€ scripts/
16
+ β”‚ β”œβ”€β”€ generate-dashboard.mjs # Main entry point
17
+ β”‚ └── parsers/
18
+ β”‚ β”œβ”€β”€ agents.mjs # agents/*.md (frontmatter)
19
+ β”‚ β”œβ”€β”€ commands.mjs # commands/*.md (frontmatter)
20
+ β”‚ β”œβ”€β”€ config-files.mjs # CLAUDE.md, AGENTS.md, settings.json
21
+ β”‚ β”œβ”€β”€ frontmatter.mjs # Shared YAML frontmatter parser
22
+ β”‚ β”œβ”€β”€ hooks.mjs # settings.json hooks section
23
+ β”‚ β”œβ”€β”€ mcp-servers.mjs # .claude.json, mcp.json (env values masked)
24
+ β”‚ β”œβ”€β”€ memory.mjs # projects/*/memory/*.md (excludes MEMORY.md)
25
+ β”‚ β”œβ”€β”€ plans.mjs # plans/*.md (plain markdown)
26
+ β”‚ β”œβ”€β”€ plugins.mjs # installed_plugins.json + settings.json
27
+ β”‚ β”œβ”€β”€ rules.mjs # rules/*.md, principles/*.md (no frontmatter)
28
+ β”‚ β”œβ”€β”€ scopes.mjs # Global + project scope detection
29
+ β”‚ β”œβ”€β”€ skills.mjs # skills/*/SKILL.md + plugin cache
30
+ β”‚ β”œβ”€β”€ teams.mjs # teams/*/config.json
31
+ β”‚ β”œβ”€β”€ todos.mjs # todos/*.json
32
+ β”‚ └── usage.mjs # history.jsonl + transcripts
33
+ β”œβ”€β”€ templates/
34
+ β”‚ β”œβ”€β”€ dashboard.html # HTML shell with placeholders
35
+ β”‚ β”œβ”€β”€ styles.css # All CSS
36
+ β”‚ β”œβ”€β”€ app.js # Frontend JS (English i18n only)
37
+ β”‚ └── locales/
38
+ β”‚ └── ko.json # Korean locale (shipped)
39
+ └── output/ # Generated artifacts
40
+ β”œβ”€β”€ data.json # Raw data (for programmatic access)
41
+ └── index.html # Single file with inlined data+locale+CSS+JS
42
+ ```
43
+
44
+ ## CLI Parameters
45
+
46
+ | Parameter | Description |
47
+ |-----------|-------------|
48
+ | `/omh` | Full build: parse data β†’ build web-ui β†’ open/refresh browser |
49
+ | `--data-only` | Regenerate data + web-ui (skip auto-refresh notice, still opens browser) |
50
+ | `--enable-auto` | Register Stop hook for auto-rebuild on session end |
51
+ | `--disable-auto` | Remove Stop hook |
52
+ | `--status` | Show auto-refresh hook status |
53
+ | `<path> [path...]` | Include only specified project paths |
54
+ | `--help` | Show help |
55
+
56
+ ## Build Pipeline
57
+
58
+ ```
59
+ 1. Detect scopes (global + projects)
60
+ 2. Parse all data sources per scope
61
+ 3. Build task categories (description-based classification β†’ task-categories.json)
62
+ 4. Detect system locale β†’ load locales/{locale}.json
63
+ 5. Generate data.json
64
+ 6. Generate index.html:
65
+ - dashboard.html template
66
+ - __STYLES__ β†’ styles.css
67
+ - __DATA__ β†’ data.json (escaped, inlined)
68
+ - __LOCALE_DATA__ β†’ locale JSON (with _lang field)
69
+ - __APP_JS__ β†’ app.js
70
+ 7. Open/refresh browser
71
+ ```
72
+
73
+ ## Data Sources (13 parsers)
74
+
75
+ | Parser | Source | Key Fields |
76
+ |--------|--------|------------|
77
+ | config-files | CLAUDE.md, AGENTS.md, settings.json | name, body, jsonContent, jsonStats |
78
+ | skills | skills/*/SKILL.md + plugins/cache | name, description, version, argument-hint, allowed-tools, plugin |
79
+ | agents | agents/*.md | name, description, model |
80
+ | plugins | installed_plugins.json + settings.json | name, marketplace, version, enabled, author |
81
+ | hooks | settings.json hooks | event, matcher, commands |
82
+ | memory | projects/*/memory/*.md | name, description, type, scope |
83
+ | mcpServers | .claude.json, mcp.json | name, command, args, envKeys (values masked) |
84
+ | rules | rules/*.md | name, body (no frontmatter) |
85
+ | principles | principles/*.md | name, body (no frontmatter) |
86
+ | commands | commands/*.md | name, description, allowed-tools |
87
+ | teams | teams/*/config.json | name, description, memberList (name, agentType, model, prompt, color, cwd) |
88
+ | plans | plans/*.md | name, body |
89
+ | todos | todos/*.json | name, total, pending, completed |
90
+
91
+ ### Usage Parser (usage.mjs)
92
+
93
+ Parses `history.jsonl` and `projects/*/*.jsonl` transcripts.
94
+
95
+ | Output | Source | Notes |
96
+ |--------|--------|-------|
97
+ | commands | history.jsonl | Filters built-in commands (20 types), file paths |
98
+ | skills | transcript tool_use (name=Skill) | Extracted from input.skill |
99
+ | agents | transcript tool_use (name=Agent) | From input.subagent_type or input.description |
100
+ | mcpCalls | transcript tool_use (name=mcp__*) | Server name from between `__` delimiters |
101
+ | tokenEntries | transcript assistant.usage | input/output/cache tokens, model, context attribution |
102
+ | promptStats | transcript human messages | charLen (text character count) |
103
+ | latencyEntries | humanβ†’assistant timestamp diff | 0–600,000ms range, per session |
104
+
105
+ **Token context attribution**: Tracks most recently active context per session (`skill` / `agent` / `mcp` / `tool` / `general`) and attaches it to each token entry.
106
+
107
+ ## Task Categories
108
+
109
+ Built at build time in `generate-dashboard.mjs`. Persisted in `task-categories.json`.
110
+
111
+ **Classification priority**:
112
+ 1. `task-categories.json` existing entry β†’ preserved (user edits survive)
113
+ 2. Built-in tool name → structural mapping (Edit→code-edit, Bash→execution, etc.)
114
+ 3. Skill/agent description + name β†’ keyword matching against category seeds
115
+ 4. Fallback β†’ `other`
116
+
117
+ **Categories**: code-edit, code-search, execution, review, planning, docs, browser, workflow, team, config, general, other
118
+
119
+ ## i18n
120
+
121
+ - **Base language**: English (hardcoded in app.js `I18N.en`)
122
+ - **Korean**: `locales/ko.json` (shipped with project)
123
+ - **Other locales**: Auto-generated English template on first build if locale file missing
124
+ - **Build injection**: System locale detected β†’ `locales/{locale}.json` loaded β†’ injected as `__LOCALE_DATA__` with `_lang` field
125
+ - **Runtime**: `t()` function checks `I18N[currentLang]` β†’ falls back to `I18N.en`
126
+ - **Template variables**: `{{configDir}}` β†’ `DATA.configDir` (replaced at runtime by `t()`)
127
+
128
+ ## Browser Open/Refresh
129
+
130
+ | OS | Tab Reuse | Open |
131
+ |----|-----------|------|
132
+ | macOS | AppleScript: Chrome β†’ Safari (search by URL containing "oh-my-hi", reload + activate) | `open` fallback |
133
+ | Windows | β€” | `start ""` |
134
+ | Linux | β€” | `xdg-open` |
135
+
136
+ ## Dashboard Pages
137
+
138
+ | Page | Hash | Content |
139
+ |------|------|---------|
140
+ | Harness Overview | `#overview` | Stats cards, category distribution donut, daily trend, popular skills, activity heatmap, recent activity, insights, unused items |
141
+ | Token Overview | `#tokens` | Token stats, model distribution donut, trend chart, activity heatmap, model table, insights |
142
+ | Token Analysis | `#tokens-analysis` | Task category bar, tool context bar, prompt stats, response latency, session analysis, hourly distribution, cache efficiency |
143
+ | Structure | `#structure` | Component flow SVG, file tree |
144
+ | Help | `#help` | Parameters table, data parsing reference, token/activity reference |
145
+ | Category Overview | `#{categoryKey}` | Total count, usage stats, all items list |
146
+ | Detail View | `#{categoryKey}/{name}` | Per-item detail (varies by category) |
147
+
148
+ ## Sidebar Categories (13)
149
+
150
+ Dynamically shown β€” hidden when item count is 0.
151
+
152
+ configFiles, skills, agents, plugins, hooks, memory, mcpServers, rules, principles, commands, teams, plans, todos
153
+
154
+ ## Key Architectural Decisions
155
+
156
+ 1. **Data inline (no fetch)**: index.html embeds data.json as `DATA` variable. Required for file:// protocol compatibility.
157
+ 2. **Single output file**: All CSS, JS, data, locale inlined into index.html. No external dependencies except CDN (billboard.js, d3).
158
+ 3. **Persistent category mapping**: `task-categories.json` survives rebuilds. User can manually reclassify items.
159
+ 4. **Locale built once**: Locale file generated on first build for unknown locales. Not rebuilt on subsequent runs.
160
+ 5. **AppleScript tab reuse**: macOS-only optimization. Searches all browser windows/tabs for URL match.
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "oh-my-hi",
3
+ "version": "0.1.0",
4
+ "description": "Claude Code harness insights dashboard",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/netil/oh-my-hi.git"
8
+ },
9
+ "author": "Jae Sung Park <alberto.park@gmail.com>",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "claude-code",
13
+ "plugin",
14
+ "dashboard",
15
+ "harness",
16
+ "insights",
17
+ "analytics"
18
+ ],
19
+ "homepage": "https://github.com/netil/oh-my-hi"
20
+ }