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.
- package/.claude-plugin/marketplace.json +25 -0
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/SPEC.md +160 -0
- package/package.json +20 -0
- package/scripts/generate-dashboard.mjs +505 -0
- package/scripts/parsers/agents.mjs +32 -0
- package/scripts/parsers/commands.mjs +32 -0
- package/scripts/parsers/config-files.mjs +93 -0
- package/scripts/parsers/frontmatter.mjs +46 -0
- package/scripts/parsers/hooks.mjs +46 -0
- package/scripts/parsers/mcp-servers.mjs +55 -0
- package/scripts/parsers/memory.mjs +41 -0
- package/scripts/parsers/plans.mjs +29 -0
- package/scripts/parsers/plugins.mjs +90 -0
- package/scripts/parsers/rules.mjs +45 -0
- package/scripts/parsers/scopes.mjs +142 -0
- package/scripts/parsers/skills.mjs +128 -0
- package/scripts/parsers/teams.mjs +45 -0
- package/scripts/parsers/todos.mjs +39 -0
- package/scripts/parsers/usage.mjs +383 -0
- package/skills/omh/SKILL.md +54 -0
- package/templates/app.js +3651 -0
- package/templates/dashboard.html +50 -0
- package/templates/locales/ko.json +201 -0
- package/templates/styles.css +1871 -0
|
@@ -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
|
+

|
|
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
|
+
}
|