Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
"url": "https://github.com/Shakes-tzd"
},
"description": "HTML-based agent observability + workflow analytics. Git-first JSONL event tracking with rebuildable SQLite index. Zero external dependencies, works offline, version control friendly.",
"version": "0.33.77",
"version": "0.33.79",
"plugins": [
{
"name": "htmlgraph",
"version": "0.33.77",
"version": "0.33.79",
"source": "./packages/claude-plugin",
"description": "HTML-based agent observability + workflow analytics (Git-first JSONL + rebuildable SQLite index)",
"category": "Development Tools",
Expand Down
44 changes: 44 additions & 0 deletions .claude/rules/code-hygiene.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,47 @@ git commit -m "..."
```

**Remember: Fixing errors immediately is faster than letting them accumulate.**

## Module Size & Complexity Standards

### Line Count Limits

| Metric | Target | Warning | Fail (new code) |
|--------|--------|---------|------------------|
| Module | 200-500 lines | >300 lines | >500 lines |
| Function | 10-20 lines | >30 lines | >50 lines |
| Class | 100-200 lines | >200 lines | >300 lines |

### Principles

1. **Single Responsibility**: Each module should have one clear purpose describable in one sentence
2. **No Duplication**: Check `src/python/htmlgraph/utils/` for shared utilities before writing new ones
3. **Prefer Existing Dependencies**: Check `pyproject.toml` and stdlib before custom implementations
4. **Import Direction**: Dependencies flow one way (services -> models, never models -> services)

### Enforcement

- **Script**: `python scripts/check-module-size.py` checks all modules against limits
- **Pre-commit**: Runs automatically on changed files
- **Grandfathered modules**: 15 existing modules >1000 lines are tracked but not blocking (see `scripts/check-module-size.py` for list)
- **Ratchet rule**: Any modification to a grandfathered module must not increase its line count
- **Refactoring track**: See `docs/tracks/MODULE_REFACTORING_TRACK.md` for planned splits

### Quick Commands

```bash
# Check all modules
python scripts/check-module-size.py

# Check only changed files
python scripts/check-module-size.py --changed-only

# Summary table of oversized modules
python scripts/check-module-size.py --summary

# JSON output for CI
python scripts/check-module-size.py --json

# Strict mode (warnings = failures)
python scripts/check-module-size.py --fail-on-warning
```
36 changes: 36 additions & 0 deletions .htmlgraph/features/feat-335cb001.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Test Feature 1</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-335cb001"
data-type="feature"
data-status="done"
data-priority="medium"
data-created="2026-03-15T08:01:57.971899"
data-updated="2026-03-15T08:02:02.072771" data-agent-assigned="test-agent" data-track-id="trk-f0515efe">

<header>
<h1>Test Feature 1</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-medium">Medium Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-e1f8958b.html" data-relationship="implemented-in" data-since="2026-03-15T08:02:02.060772">sess-e1f8958b</a></li>
</ul>
</section>
</nav>
</article>
</body>
</html>
51 changes: 51 additions & 0 deletions .htmlgraph/features/feat-6ce2908f.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Sync status monitoring</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-6ce2908f"
data-type="feature"
data-status="done"
data-priority="medium"
data-created="2026-03-14T22:17:37.186016"
data-updated="2026-03-14T22:17:37.186942+00:00" data-agent-assigned="claude" data-track-id="trk-a8de6021">

<header>
<h1>Sync status monitoring</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-medium">Medium Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-6c56e756.html" data-relationship="implemented-in" data-since="2026-03-14T22:17:37.186935">sess-6c56e756</a></li>
</ul>
</section>
</nav>
<section data-steps>
<h3>Implementation Steps</h3>
<ol>
<li data-completed="false">⏳ Add sync status polling to EventPoller (every 3s, dedup via signature)</li>
<li data-completed="false">⏳ Add sync_status PubSub broadcast</li>
<li data-completed="false">⏳ Add sync_status handle_info in LiveView</li>
<li data-completed="false">⏳ Add sync_status assign to mount</li>
<li data-completed="false">⏳ Add sync status bar template</li>
<li data-completed="false">⏳ Add sync status bar CSS with warn/error states</li>
</ol>
</section>
<section data-content>
<h3>Description</h3>
<p>Display oplog sequence, pending conflicts, consumer count, and pipeline lag in a status bar</p>
</section>
</article>
</body>
</html>
48 changes: 48 additions & 0 deletions .htmlgraph/features/feat-8110d25a.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Work item type-specific colors</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-8110d25a"
data-type="feature"
data-status="done"
data-priority="high"
data-created="2026-03-14T22:17:37.184387"
data-updated="2026-03-14T22:17:37.185336+00:00" data-agent-assigned="claude" data-track-id="trk-a8de6021">

<header>
<h1>Work item type-specific colors</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-high">High Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-6c56e756.html" data-relationship="implemented-in" data-since="2026-03-14T22:17:37.185329">sess-6c56e756</a></li>
</ul>
</section>
</nav>
<section data-steps>
<h3>Implementation Steps</h3>
<ol>
<li data-completed="false">⏳ Add work_item_type_class/1 helper for 8 types</li>
<li data-completed="false">⏳ Add 8 CSS classes for work item types</li>
<li data-completed="false">⏳ Update parent row work item badge to use typed class</li>
</ol>
</section>
<section data-content>
<h3>Description</h3>
<p>Color-code work item badges by type: feature/bug/spike/task/chore/epic/track/insight</p>
</section>
</article>
</body>
</html>
48 changes: 48 additions & 0 deletions .htmlgraph/features/feat-ce3eb030.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Model name formatting</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-ce3eb030"
data-type="feature"
data-status="done"
data-priority="high"
data-created="2026-03-14T22:17:37.180153"
data-updated="2026-03-14T22:17:37.181711+00:00" data-agent-assigned="claude" data-track-id="trk-a8de6021">

<header>
<h1>Model name formatting</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-high">High Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-6c56e756.html" data-relationship="implemented-in" data-since="2026-03-14T22:17:37.181704">sess-6c56e756</a></li>
</ul>
</section>
</nav>
<section data-steps>
<h3>Implementation Steps</h3>
<ol>
<li data-completed="false">⏳ Add format_model_name/1 helper function</li>
<li data-completed="false">⏳ Update model badge in event_row to use formatter</li>
<li data-completed="false">⏳ Update model badges in parent row stats</li>
</ol>
</section>
<section data-content>
<h3>Description</h3>
<p>Strip claude- prefix and reformat version numbers (claude-3-5-sonnet -> 3-5.sonnet)</p>
</section>
</article>
</body>
</html>
36 changes: 36 additions & 0 deletions .htmlgraph/features/feat-cf7dea09.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Test Feature 2</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-cf7dea09"
data-type="feature"
data-status="done"
data-priority="medium"
data-created="2026-03-15T08:02:02.062435"
data-updated="2026-03-15T08:02:02.073498" data-agent-assigned="test-agent" data-track-id="trk-f0515efe">

<header>
<h1>Test Feature 2</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-medium">Medium Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-e1f8958b.html" data-relationship="implemented-in" data-since="2026-03-15T08:02:02.069821">sess-e1f8958b</a></li>
</ul>
</section>
</nav>
</article>
</body>
</html>
51 changes: 51 additions & 0 deletions .htmlgraph/features/feat-e3ebc1c7.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Agent filter with debounce</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-e3ebc1c7"
data-type="feature"
data-status="done"
data-priority="high"
data-created="2026-03-14T22:17:37.182516"
data-updated="2026-03-14T22:17:37.183539+00:00" data-agent-assigned="claude" data-track-id="trk-a8de6021">

<header>
<h1>Agent filter with debounce</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-high">High Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-6c56e756.html" data-relationship="implemented-in" data-since="2026-03-14T22:17:37.183533">sess-6c56e756</a></li>
</ul>
</section>
</nav>
<section data-steps>
<h3>Implementation Steps</h3>
<ol>
<li data-completed="false">⏳ Add agent_filter assign to LiveView mount</li>
<li data-completed="false">⏳ Add filter_agent handle_event</li>
<li data-completed="false">⏳ Add agent_id param to Activity.list_activity_feed/1</li>
<li data-completed="false">⏳ Add fetch_user_queries/3 with EXISTS subquery for agent filtering</li>
<li data-completed="false">⏳ Add filter input to template with phx-debounce=500</li>
<li data-completed="false">⏳ Add filter bar CSS</li>
</ol>
</section>
<section data-content>
<h3>Description</h3>
<p>Add text input to filter activity feed by agent name with 500ms debounce</p>
</section>
</article>
</body>
</html>
48 changes: 48 additions & 0 deletions .htmlgraph/features/feat-e6e1c8a2.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="htmlgraph-version" content="1.0">
<title>Subagent badge classification</title>
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<article id="feat-e6e1c8a2"
data-type="feature"
data-status="done"
data-priority="high"
data-created="2026-03-14T22:17:33.698004"
data-updated="2026-03-14T22:17:37.179250+00:00" data-agent-assigned="claude" data-track-id="trk-a8de6021">

<header>
<h1>Subagent badge classification</h1>
<div class="metadata">
<span class="badge status-done">Done</span>
<span class="badge priority-high">High Priority</span>
</div>
</header>

<nav data-graph-edges>
<section data-edge-type="implemented-in">
<h3>Implemented-In:</h3>
<ul>
<li><a href="sess-6c56e756.html" data-relationship="implemented-in" data-since="2026-03-14T22:17:37.179243">sess-6c56e756</a></li>
</ul>
</section>
</nav>
<section data-steps>
<h3>Implementation Steps</h3>
<ol>
<li data-completed="false">⏳ Add subagent_badge_class/1 helper function</li>
<li data-completed="false">⏳ Add 5 CSS badge classes (researcher, haiku, opus, green, claude)</li>
<li data-completed="false">⏳ Update event_row template to use typed badges</li>
</ol>
</section>
<section data-content>
<h3>Description</h3>
<p>Port 5-family subagent badge system from HTMX (researcher/haiku/opus/test+debug/claude)</p>
</section>
</article>
</body>
</html>
Binary file modified .htmlgraph/htmlgraph.db
Binary file not shown.
Loading
Loading