htmlgraph 0.26.5__py3-none-any.whl → 0.26.7__py3-none-any.whl

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.
Files changed (70) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +1 -1
  2. htmlgraph/__init__.py +1 -1
  3. htmlgraph/api/main.py +50 -10
  4. htmlgraph/api/templates/dashboard-redesign.html +608 -54
  5. htmlgraph/api/templates/partials/activity-feed.html +21 -0
  6. htmlgraph/api/templates/partials/features.html +81 -12
  7. htmlgraph/api/templates/partials/orchestration.html +35 -0
  8. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  9. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  10. htmlgraph/cli/__init__.py +42 -0
  11. htmlgraph/cli/__main__.py +6 -0
  12. htmlgraph/cli/analytics.py +939 -0
  13. htmlgraph/cli/base.py +660 -0
  14. htmlgraph/cli/constants.py +206 -0
  15. htmlgraph/cli/core.py +856 -0
  16. htmlgraph/cli/main.py +143 -0
  17. htmlgraph/cli/models.py +462 -0
  18. htmlgraph/cli/templates/__init__.py +1 -0
  19. htmlgraph/cli/templates/cost_dashboard.py +398 -0
  20. htmlgraph/cli/work/__init__.py +159 -0
  21. htmlgraph/cli/work/features.py +567 -0
  22. htmlgraph/cli/work/orchestration.py +675 -0
  23. htmlgraph/cli/work/sessions.py +465 -0
  24. htmlgraph/cli/work/tracks.py +485 -0
  25. htmlgraph/dashboard.html +6414 -634
  26. htmlgraph/db/schema.py +8 -3
  27. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +20 -13
  28. htmlgraph/docs/README.md +2 -3
  29. htmlgraph/hooks/event_tracker.py +355 -26
  30. htmlgraph/hooks/git_commands.py +175 -0
  31. htmlgraph/hooks/orchestrator.py +137 -71
  32. htmlgraph/hooks/orchestrator_reflector.py +23 -0
  33. htmlgraph/hooks/pretooluse.py +29 -6
  34. htmlgraph/hooks/session_handler.py +28 -0
  35. htmlgraph/hooks/session_summary.py +391 -0
  36. htmlgraph/hooks/subagent_detection.py +202 -0
  37. htmlgraph/hooks/subagent_stop.py +71 -12
  38. htmlgraph/hooks/validator.py +192 -79
  39. htmlgraph/operations/__init__.py +18 -0
  40. htmlgraph/operations/initialization.py +596 -0
  41. htmlgraph/operations/initialization.py.backup +228 -0
  42. htmlgraph/orchestration/__init__.py +16 -1
  43. htmlgraph/orchestration/claude_launcher.py +185 -0
  44. htmlgraph/orchestration/command_builder.py +71 -0
  45. htmlgraph/orchestration/headless_spawner.py +72 -1332
  46. htmlgraph/orchestration/plugin_manager.py +136 -0
  47. htmlgraph/orchestration/prompts.py +137 -0
  48. htmlgraph/orchestration/spawners/__init__.py +16 -0
  49. htmlgraph/orchestration/spawners/base.py +194 -0
  50. htmlgraph/orchestration/spawners/claude.py +170 -0
  51. htmlgraph/orchestration/spawners/codex.py +442 -0
  52. htmlgraph/orchestration/spawners/copilot.py +299 -0
  53. htmlgraph/orchestration/spawners/gemini.py +478 -0
  54. htmlgraph/orchestration/subprocess_runner.py +33 -0
  55. htmlgraph/orchestration.md +563 -0
  56. htmlgraph/orchestrator-system-prompt-optimized.txt +620 -55
  57. htmlgraph/orchestrator_config.py +357 -0
  58. htmlgraph/orchestrator_mode.py +45 -12
  59. htmlgraph/transcript.py +16 -4
  60. htmlgraph-0.26.7.data/data/htmlgraph/dashboard.html +6592 -0
  61. {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.7.dist-info}/METADATA +1 -1
  62. {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.7.dist-info}/RECORD +68 -34
  63. {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.7.dist-info}/entry_points.txt +1 -1
  64. htmlgraph/cli.py +0 -7256
  65. htmlgraph-0.26.5.data/data/htmlgraph/dashboard.html +0 -812
  66. {htmlgraph-0.26.5.data → htmlgraph-0.26.7.data}/data/htmlgraph/styles.css +0 -0
  67. {htmlgraph-0.26.5.data → htmlgraph-0.26.7.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  68. {htmlgraph-0.26.5.data → htmlgraph-0.26.7.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  69. {htmlgraph-0.26.5.data → htmlgraph-0.26.7.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  70. {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.7.dist-info}/WHEEL +0 -0
@@ -130,6 +130,13 @@
130
130
  </span>
131
131
  {% endif %}
132
132
 
133
+ <!-- Feature Attribution -->
134
+ {% if child.feature_id %}
135
+ <span class="child-feature-badge" title="Linked to {{ child.feature_id }}">
136
+ #{{ child.feature_id[:8] }}
137
+ </span>
138
+ {% endif %}
139
+
133
140
  <!-- Duration -->
134
141
  <span class="child-duration">
135
142
  {{ "%.2f"|format(child.duration_seconds) }}s
@@ -407,6 +414,20 @@
407
414
  color: #4ade80;
408
415
  }
409
416
 
417
+ /* Feature Badge */
418
+ .child-feature-badge {
419
+ display: inline-block;
420
+ padding: 0.1rem 0.35rem;
421
+ font-size: 0.65rem;
422
+ font-weight: 700;
423
+ background: rgba(255, 255, 255, 0.05);
424
+ color: var(--accent-lime);
425
+ border: 1px solid rgba(163, 230, 53, 0.3);
426
+ border-radius: 2px;
427
+ font-family: 'JetBrains Mono', monospace;
428
+ flex-shrink: 0;
429
+ }
430
+
410
431
  /* Child Duration */
411
432
  .child-duration {
412
433
  display: inline-block;
@@ -44,9 +44,18 @@
44
44
  {% endif %}
45
45
  <div class="card-footer">
46
46
  <span class="feature-id" title="{{ feature.id }}">{{ feature.id[:8] }}</span>
47
- {% if feature.assigned_to %}
48
- <span class="assigned-to">👤 {{ feature.assigned_to }}</span>
49
- {% endif %}
47
+ <div class="contributors">
48
+ {% if feature.contributors %}
49
+ {% for agent in feature.contributors %}
50
+ <span class="contributor-tag agent-{{ agent|lower|replace(' ', '-') }}" title="{{ agent }}">
51
+ {{ agent[:1]|upper }}
52
+ </span>
53
+ {% endfor %}
54
+ {% endif %}
55
+ {% if feature.assigned_to %}
56
+ <span class="assigned-to" title="Assigned to {{ feature.assigned_to }}">👤 {{ feature.assigned_to[:8] }}</span>
57
+ {% endif %}
58
+ </div>
50
59
  </div>
51
60
  </div>
52
61
  {% endfor %}
@@ -77,9 +86,18 @@
77
86
  {% endif %}
78
87
  <div class="card-footer">
79
88
  <span class="feature-id" title="{{ feature.id }}">{{ feature.id[:8] }}</span>
80
- {% if feature.assigned_to %}
81
- <span class="assigned-to">👤 {{ feature.assigned_to }}</span>
82
- {% endif %}
89
+ <div class="contributors">
90
+ {% if feature.contributors %}
91
+ {% for agent in feature.contributors %}
92
+ <span class="contributor-tag agent-{{ agent|lower|replace(' ', '-') }}" title="{{ agent }}">
93
+ {{ agent[:1]|upper }}
94
+ </span>
95
+ {% endfor %}
96
+ {% endif %}
97
+ {% if feature.assigned_to %}
98
+ <span class="assigned-to" title="Assigned to {{ feature.assigned_to }}">👤 {{ feature.assigned_to[:8] }}</span>
99
+ {% endif %}
100
+ </div>
83
101
  </div>
84
102
  </div>
85
103
  {% endfor %}
@@ -110,9 +128,18 @@
110
128
  {% endif %}
111
129
  <div class="card-footer">
112
130
  <span class="feature-id" title="{{ feature.id }}">{{ feature.id[:8] }}</span>
113
- {% if feature.assigned_to %}
114
- <span class="assigned-to">👤 {{ feature.assigned_to }}</span>
115
- {% endif %}
131
+ <div class="contributors">
132
+ {% if feature.contributors %}
133
+ {% for agent in feature.contributors %}
134
+ <span class="contributor-tag agent-{{ agent|lower|replace(' ', '-') }}" title="{{ agent }}">
135
+ {{ agent[:1]|upper }}
136
+ </span>
137
+ {% endfor %}
138
+ {% endif %}
139
+ {% if feature.assigned_to %}
140
+ <span class="assigned-to" title="Assigned to {{ feature.assigned_to }}">👤 {{ feature.assigned_to[:8] }}</span>
141
+ {% endif %}
142
+ </div>
116
143
  </div>
117
144
  </div>
118
145
  {% endfor %}
@@ -143,9 +170,18 @@
143
170
  {% endif %}
144
171
  <div class="card-footer">
145
172
  <span class="feature-id" title="{{ feature.id }}">{{ feature.id[:8] }}</span>
146
- {% if feature.assigned_to %}
147
- <span class="assigned-to">👤 {{ feature.assigned_to }}</span>
148
- {% endif %}
173
+ <div class="contributors">
174
+ {% if feature.contributors %}
175
+ {% for agent in feature.contributors %}
176
+ <span class="contributor-tag agent-{{ agent|lower|replace(' ', '-') }}" title="{{ agent }}">
177
+ {{ agent[:1]|upper }}
178
+ </span>
179
+ {% endfor %}
180
+ {% endif %}
181
+ {% if feature.assigned_to %}
182
+ <span class="assigned-to" title="Assigned to {{ feature.assigned_to }}">👤 {{ feature.assigned_to[:8] }}</span>
183
+ {% endif %}
184
+ </div>
149
185
  </div>
150
186
  </div>
151
187
  {% endfor %}
@@ -480,8 +516,41 @@
480
516
  font-weight: 600;
481
517
  }
482
518
 
519
+ .contributors {
520
+ display: flex;
521
+ gap: 4px;
522
+ align-items: center;
523
+ }
524
+
525
+ .contributor-tag {
526
+ display: inline-flex;
527
+ align-items: center;
528
+ justify-content: center;
529
+ width: 18px;
530
+ height: 18px;
531
+ border-radius: 50%;
532
+ background: rgba(255, 255, 255, 0.1);
533
+ color: var(--text-primary);
534
+ font-size: 0.6rem;
535
+ font-weight: 700;
536
+ border: 1px solid var(--border-subtle);
537
+ }
538
+
539
+ .contributor-tag.agent-claude-code, .contributor-tag.agent-claude {
540
+ background: rgba(200, 255, 0, 0.2);
541
+ color: #c8ff00;
542
+ border-color: rgba(200, 255, 0, 0.4);
543
+ }
544
+
545
+ .contributor-tag.agent-gemini {
546
+ background: rgba(74, 222, 128, 0.2);
547
+ color: #4ade80;
548
+ border-color: rgba(74, 222, 128, 0.4);
549
+ }
550
+
483
551
  .assigned-to {
484
552
  color: var(--text-muted);
553
+ margin-left: 4px;
485
554
  }
486
555
 
487
556
  .empty-column {
@@ -79,6 +79,8 @@
79
79
  <th style="padding: 0.5rem 0.75rem; text-align: left; color: var(--accent-lime); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;">From</th>
80
80
  <th style="padding: 0.5rem 0.75rem; text-align: left; color: var(--accent-lime); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;">To</th>
81
81
  <th style="padding: 0.5rem 0.75rem; text-align: left; color: var(--accent-lime); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;">Task</th>
82
+ <th style="padding: 0.5rem 0.75rem; text-align: left; color: var(--accent-lime); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;">Status</th>
83
+ <th style="padding: 0.5rem 0.75rem; text-align: left; color: var(--accent-lime); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;">Session</th>
82
84
  <th style="padding: 0.5rem 0.75rem; text-align: left; color: var(--accent-lime); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;">Timestamp</th>
83
85
  </tr>
84
86
  </thead>
@@ -102,6 +104,14 @@
102
104
  <span style="color: var(--text-muted);">—</span>
103
105
  {% endif %}
104
106
  </td>
107
+ <td style="padding: 0.4rem 0.75rem;">
108
+ <span class="status-badge status-{{ delegation.status|lower }}">
109
+ {{ delegation.status }}
110
+ </span>
111
+ </td>
112
+ <td style="padding: 0.4rem 0.75rem; color: var(--text-muted); font-size: 0.7rem; font-family: monospace;">
113
+ {{ delegation.session_id[:8] }}
114
+ </td>
105
115
  <td style="padding: 0.4rem 0.75rem; color: var(--text-secondary); font-family: 'Courier New', monospace; font-size: 0.75rem;">
106
116
  {{ delegation.timestamp }}
107
117
  </td>
@@ -155,6 +165,31 @@
155
165
  font-size: 0.65rem;
156
166
  }
157
167
 
168
+ /* Status Badges */
169
+ .status-badge {
170
+ padding: 0.15rem 0.4rem;
171
+ border-radius: 2px;
172
+ font-size: 0.65rem;
173
+ font-weight: 600;
174
+ text-transform: uppercase;
175
+ letter-spacing: 0.05em;
176
+ }
177
+ .status-completed, .status-success, .status-recorded {
178
+ background: rgba(34, 197, 94, 0.15);
179
+ color: #4ade80;
180
+ border: 1px solid rgba(34, 197, 94, 0.3);
181
+ }
182
+ .status-pending, .status-active {
183
+ background: rgba(251, 191, 36, 0.15);
184
+ color: #fbbf24;
185
+ border: 1px solid rgba(251, 191, 36, 0.3);
186
+ }
187
+ .status-failed, .status-error {
188
+ background: rgba(239, 68, 68, 0.15);
189
+ color: #f87171;
190
+ border: 1px solid rgba(239, 68, 68, 0.3);
191
+ }
192
+
158
193
  @media (max-width: 768px) {
159
194
  .orchestration-view .metrics-grid {
160
195
  grid-template-columns: repeat(2, 1fr);
@@ -0,0 +1,6 @@
1
+ {
2
+ "dismissed_at": null,
3
+ "dismissed_by": null,
4
+ "session_id": null,
5
+ "show_count": 6
6
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "version": "1.0",
3
+ "updated": "2026-01-11T21:41:53.445581",
4
+ "agents": {
5
+ "claude": {
6
+ "id": "claude",
7
+ "name": "Claude",
8
+ "capabilities": [
9
+ "python",
10
+ "javascript",
11
+ "typescript",
12
+ "html",
13
+ "css",
14
+ "code-review",
15
+ "testing",
16
+ "documentation",
17
+ "debugging",
18
+ "refactoring",
19
+ "architecture",
20
+ "api-design"
21
+ ],
22
+ "max_parallel_tasks": 3,
23
+ "preferred_complexity": [
24
+ "low",
25
+ "medium",
26
+ "high",
27
+ "very-high"
28
+ ],
29
+ "active": true,
30
+ "metadata": {}
31
+ },
32
+ "gemini": {
33
+ "id": "gemini",
34
+ "name": "Gemini",
35
+ "capabilities": [
36
+ "python",
37
+ "data-analysis",
38
+ "documentation",
39
+ "testing",
40
+ "code-review",
41
+ "javascript"
42
+ ],
43
+ "max_parallel_tasks": 2,
44
+ "preferred_complexity": [
45
+ "low",
46
+ "medium",
47
+ "high"
48
+ ],
49
+ "active": true,
50
+ "metadata": {}
51
+ },
52
+ "codex": {
53
+ "id": "codex",
54
+ "name": "Codex",
55
+ "capabilities": [
56
+ "python",
57
+ "javascript",
58
+ "debugging",
59
+ "testing",
60
+ "code-generation",
61
+ "documentation"
62
+ ],
63
+ "max_parallel_tasks": 2,
64
+ "preferred_complexity": [
65
+ "low",
66
+ "medium"
67
+ ],
68
+ "active": true,
69
+ "metadata": {}
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,42 @@
1
+ """HtmlGraph CLI - Modular command-line interface.
2
+
3
+ Architecture:
4
+ - base.py: Base classes, formatters, error handling
5
+ - constants.py: Single source of truth for all configuration
6
+ - main.py: Entry point, argument parsing
7
+ - core.py: Infrastructure commands (serve, init, status, etc.)
8
+ - work.py: Work management (features, sessions, tracks, etc.)
9
+ - analytics.py: Reporting and analytics commands
10
+
11
+ Usage:
12
+ from htmlgraph.cli.main import main
13
+ main()
14
+ """
15
+
16
+ from htmlgraph.cli.base import (
17
+ BaseCommand,
18
+ CommandError,
19
+ CommandResult,
20
+ JsonFormatter,
21
+ TextFormatter,
22
+ get_formatter,
23
+ )
24
+ from htmlgraph.cli.main import main
25
+ from htmlgraph.cli.work import (
26
+ cmd_orchestrator_reset_violations,
27
+ cmd_orchestrator_set_level,
28
+ cmd_orchestrator_status,
29
+ )
30
+
31
+ __all__ = [
32
+ "main",
33
+ "BaseCommand",
34
+ "CommandError",
35
+ "CommandResult",
36
+ "JsonFormatter",
37
+ "TextFormatter",
38
+ "get_formatter",
39
+ "cmd_orchestrator_reset_violations",
40
+ "cmd_orchestrator_set_level",
41
+ "cmd_orchestrator_status",
42
+ ]
@@ -0,0 +1,6 @@
1
+ """CLI entry point for python -m htmlgraph.cli execution."""
2
+
3
+ from htmlgraph.cli.main import main
4
+
5
+ if __name__ == "__main__":
6
+ main()