htmlgraph 0.26.5__py3-none-any.whl → 0.26.6__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.
- htmlgraph/.htmlgraph/.session-warning-state.json +1 -1
- htmlgraph/__init__.py +1 -1
- htmlgraph/api/main.py +50 -10
- htmlgraph/api/templates/dashboard-redesign.html +608 -54
- htmlgraph/api/templates/partials/activity-feed.html +21 -0
- htmlgraph/api/templates/partials/features.html +81 -12
- htmlgraph/api/templates/partials/orchestration.html +35 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +939 -0
- htmlgraph/cli/base.py +660 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +856 -0
- htmlgraph/cli/main.py +143 -0
- htmlgraph/cli/models.py +462 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +398 -0
- htmlgraph/cli/work/__init__.py +159 -0
- htmlgraph/cli/work/features.py +567 -0
- htmlgraph/cli/work/orchestration.py +675 -0
- htmlgraph/cli/work/sessions.py +465 -0
- htmlgraph/cli/work/tracks.py +485 -0
- htmlgraph/dashboard.html +6414 -634
- htmlgraph/db/schema.py +8 -3
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +20 -13
- htmlgraph/docs/README.md +2 -3
- htmlgraph/hooks/event_tracker.py +157 -25
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/orchestrator.py +137 -71
- htmlgraph/hooks/orchestrator_reflector.py +23 -0
- htmlgraph/hooks/pretooluse.py +29 -6
- htmlgraph/hooks/session_handler.py +28 -0
- htmlgraph/hooks/session_summary.py +391 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/validator.py +192 -79
- htmlgraph/operations/__init__.py +18 -0
- htmlgraph/operations/initialization.py +596 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/orchestration/__init__.py +16 -1
- htmlgraph/orchestration/claude_launcher.py +185 -0
- htmlgraph/orchestration/command_builder.py +71 -0
- htmlgraph/orchestration/headless_spawner.py +72 -1332
- htmlgraph/orchestration/plugin_manager.py +136 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +170 -0
- htmlgraph/orchestration/spawners/codex.py +442 -0
- htmlgraph/orchestration/spawners/copilot.py +299 -0
- htmlgraph/orchestration/spawners/gemini.py +478 -0
- htmlgraph/orchestration/subprocess_runner.py +33 -0
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +620 -55
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +45 -12
- htmlgraph/transcript.py +16 -4
- htmlgraph-0.26.6.data/data/htmlgraph/dashboard.html +6592 -0
- {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.6.dist-info}/METADATA +1 -1
- {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.6.dist-info}/RECORD +67 -33
- {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.6.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -7256
- htmlgraph-0.26.5.data/data/htmlgraph/dashboard.html +0 -812
- {htmlgraph-0.26.5.data → htmlgraph-0.26.6.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.26.5.data → htmlgraph-0.26.6.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
- {htmlgraph-0.26.5.data → htmlgraph-0.26.6.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
- {htmlgraph-0.26.5.data → htmlgraph-0.26.6.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
- {htmlgraph-0.26.5.dist-info → htmlgraph-0.26.6.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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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,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
|
+
]
|