htmlgraph 0.9.3__py3-none-any.whl → 0.27.5__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 +6 -0
- htmlgraph/.htmlgraph/agents.json +72 -0
- htmlgraph/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/__init__.py +173 -17
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +127 -0
- htmlgraph/agent_registry.py +45 -30
- htmlgraph/agents.py +160 -107
- htmlgraph/analytics/__init__.py +9 -2
- htmlgraph/analytics/cli.py +190 -51
- htmlgraph/analytics/cost_analyzer.py +391 -0
- htmlgraph/analytics/cost_monitor.py +664 -0
- htmlgraph/analytics/cost_reporter.py +675 -0
- htmlgraph/analytics/cross_session.py +617 -0
- htmlgraph/analytics/dependency.py +192 -100
- htmlgraph/analytics/pattern_learning.py +771 -0
- htmlgraph/analytics/session_graph.py +707 -0
- htmlgraph/analytics/strategic/__init__.py +80 -0
- htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
- htmlgraph/analytics/strategic/pattern_detector.py +876 -0
- htmlgraph/analytics/strategic/preference_manager.py +709 -0
- htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
- htmlgraph/analytics/work_type.py +190 -14
- htmlgraph/analytics_index.py +135 -51
- htmlgraph/api/__init__.py +3 -0
- htmlgraph/api/cost_alerts_websocket.py +416 -0
- htmlgraph/api/main.py +2498 -0
- htmlgraph/api/static/htmx.min.js +1 -0
- htmlgraph/api/static/style-redesign.css +1344 -0
- htmlgraph/api/static/style.css +1079 -0
- htmlgraph/api/templates/dashboard-redesign.html +1366 -0
- htmlgraph/api/templates/dashboard.html +794 -0
- htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
- htmlgraph/api/templates/partials/activity-feed.html +1100 -0
- htmlgraph/api/templates/partials/agents-redesign.html +317 -0
- htmlgraph/api/templates/partials/agents.html +317 -0
- htmlgraph/api/templates/partials/event-traces.html +373 -0
- htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
- htmlgraph/api/templates/partials/features.html +578 -0
- htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
- htmlgraph/api/templates/partials/metrics.html +346 -0
- htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
- htmlgraph/api/templates/partials/orchestration.html +198 -0
- htmlgraph/api/templates/partials/spawners.html +375 -0
- htmlgraph/api/templates/partials/work-items.html +613 -0
- htmlgraph/api/websocket.py +538 -0
- htmlgraph/archive/__init__.py +24 -0
- htmlgraph/archive/bloom.py +234 -0
- htmlgraph/archive/fts.py +297 -0
- htmlgraph/archive/manager.py +583 -0
- htmlgraph/archive/search.py +244 -0
- htmlgraph/atomic_ops.py +560 -0
- htmlgraph/attribute_index.py +208 -0
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/__init__.py +14 -0
- htmlgraph/builders/base.py +118 -29
- htmlgraph/builders/bug.py +150 -0
- htmlgraph/builders/chore.py +119 -0
- htmlgraph/builders/epic.py +150 -0
- htmlgraph/builders/feature.py +31 -6
- htmlgraph/builders/insight.py +195 -0
- htmlgraph/builders/metric.py +217 -0
- htmlgraph/builders/pattern.py +202 -0
- htmlgraph/builders/phase.py +162 -0
- htmlgraph/builders/spike.py +52 -19
- htmlgraph/builders/track.py +148 -72
- htmlgraph/cigs/__init__.py +81 -0
- htmlgraph/cigs/autonomy.py +385 -0
- htmlgraph/cigs/cost.py +475 -0
- htmlgraph/cigs/messages_basic.py +472 -0
- htmlgraph/cigs/messaging.py +365 -0
- htmlgraph/cigs/models.py +771 -0
- htmlgraph/cigs/pattern_storage.py +427 -0
- htmlgraph/cigs/patterns.py +503 -0
- htmlgraph/cigs/posttool_analyzer.py +234 -0
- htmlgraph/cigs/reporter.py +818 -0
- htmlgraph/cigs/tracker.py +317 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +1424 -0
- htmlgraph/cli/base.py +685 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +954 -0
- htmlgraph/cli/main.py +147 -0
- htmlgraph/cli/models.py +475 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +399 -0
- htmlgraph/cli/work/__init__.py +239 -0
- htmlgraph/cli/work/browse.py +115 -0
- htmlgraph/cli/work/features.py +568 -0
- htmlgraph/cli/work/orchestration.py +676 -0
- htmlgraph/cli/work/report.py +728 -0
- htmlgraph/cli/work/sessions.py +466 -0
- htmlgraph/cli/work/snapshot.py +559 -0
- htmlgraph/cli/work/tracks.py +486 -0
- htmlgraph/cli_commands/__init__.py +1 -0
- htmlgraph/cli_commands/feature.py +195 -0
- htmlgraph/cli_framework.py +115 -0
- htmlgraph/collections/__init__.py +18 -0
- htmlgraph/collections/base.py +415 -98
- htmlgraph/collections/bug.py +53 -0
- htmlgraph/collections/chore.py +53 -0
- htmlgraph/collections/epic.py +53 -0
- htmlgraph/collections/feature.py +12 -26
- htmlgraph/collections/insight.py +100 -0
- htmlgraph/collections/metric.py +92 -0
- htmlgraph/collections/pattern.py +97 -0
- htmlgraph/collections/phase.py +53 -0
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +56 -16
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +511 -0
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +344 -0
- htmlgraph/converter.py +216 -28
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2406 -307
- htmlgraph/dashboard.html.backup +6592 -0
- htmlgraph/dashboard.html.bak +7181 -0
- htmlgraph/dashboard.html.bak2 +7231 -0
- htmlgraph/dashboard.html.bak3 +7232 -0
- htmlgraph/db/__init__.py +38 -0
- htmlgraph/db/queries.py +790 -0
- htmlgraph/db/schema.py +1788 -0
- htmlgraph/decorators.py +317 -0
- htmlgraph/dependency_models.py +19 -2
- htmlgraph/deploy.py +142 -125
- htmlgraph/deployment_models.py +474 -0
- htmlgraph/docs/API_REFERENCE.md +841 -0
- htmlgraph/docs/HTTP_API.md +750 -0
- htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
- htmlgraph/docs/README.md +532 -0
- htmlgraph/docs/__init__.py +77 -0
- htmlgraph/docs/docs_version.py +55 -0
- htmlgraph/docs/metadata.py +93 -0
- htmlgraph/docs/migrations.py +232 -0
- htmlgraph/docs/template_engine.py +143 -0
- htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
- htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
- htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
- htmlgraph/docs/templates/base_agents.md.j2 +78 -0
- htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
- htmlgraph/docs/version_check.py +163 -0
- htmlgraph/edge_index.py +182 -27
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +100 -52
- htmlgraph/event_migration.py +13 -4
- htmlgraph/exceptions.py +49 -0
- htmlgraph/file_watcher.py +101 -28
- htmlgraph/find_api.py +75 -63
- htmlgraph/git_events.py +145 -63
- htmlgraph/graph.py +1122 -106
- htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/hooks/.htmlgraph/agents.json +72 -0
- htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
- htmlgraph/hooks/__init__.py +45 -0
- htmlgraph/hooks/bootstrap.py +169 -0
- htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
- htmlgraph/hooks/concurrent_sessions.py +208 -0
- htmlgraph/hooks/context.py +350 -0
- htmlgraph/hooks/drift_handler.py +525 -0
- htmlgraph/hooks/event_tracker.py +1314 -0
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/hooks-config.example.json +12 -0
- htmlgraph/hooks/installer.py +343 -0
- htmlgraph/hooks/orchestrator.py +674 -0
- htmlgraph/hooks/orchestrator_reflector.py +223 -0
- htmlgraph/hooks/post-checkout.sh +28 -0
- htmlgraph/hooks/post-commit.sh +24 -0
- htmlgraph/hooks/post-merge.sh +26 -0
- htmlgraph/hooks/post_tool_use_failure.py +273 -0
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +408 -0
- htmlgraph/hooks/pre-commit.sh +94 -0
- htmlgraph/hooks/pre-push.sh +28 -0
- htmlgraph/hooks/pretooluse.py +819 -0
- htmlgraph/hooks/prompt_analyzer.py +637 -0
- htmlgraph/hooks/session_handler.py +668 -0
- htmlgraph/hooks/session_summary.py +395 -0
- htmlgraph/hooks/state_manager.py +504 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/subagent_stop.py +369 -0
- htmlgraph/hooks/task_enforcer.py +255 -0
- htmlgraph/hooks/task_validator.py +177 -0
- htmlgraph/hooks/validator.py +628 -0
- htmlgraph/ids.py +41 -27
- htmlgraph/index.d.ts +286 -0
- htmlgraph/learning.py +767 -0
- htmlgraph/mcp_server.py +69 -23
- htmlgraph/models.py +1586 -87
- htmlgraph/operations/README.md +62 -0
- htmlgraph/operations/__init__.py +79 -0
- htmlgraph/operations/analytics.py +339 -0
- htmlgraph/operations/bootstrap.py +289 -0
- htmlgraph/operations/events.py +244 -0
- htmlgraph/operations/fastapi_server.py +231 -0
- htmlgraph/operations/hooks.py +350 -0
- htmlgraph/operations/initialization.py +597 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/operations/server.py +303 -0
- htmlgraph/orchestration/__init__.py +58 -0
- htmlgraph/orchestration/claude_launcher.py +179 -0
- htmlgraph/orchestration/command_builder.py +72 -0
- htmlgraph/orchestration/headless_spawner.py +281 -0
- htmlgraph/orchestration/live_events.py +377 -0
- htmlgraph/orchestration/model_selection.py +327 -0
- htmlgraph/orchestration/plugin_manager.py +140 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawner_event_tracker.py +383 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +173 -0
- htmlgraph/orchestration/spawners/codex.py +435 -0
- htmlgraph/orchestration/spawners/copilot.py +294 -0
- htmlgraph/orchestration/spawners/gemini.py +471 -0
- htmlgraph/orchestration/subprocess_runner.py +36 -0
- htmlgraph/orchestration/task_coordination.py +343 -0
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +669 -0
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +328 -0
- htmlgraph/orchestrator_validator.py +133 -0
- htmlgraph/parallel.py +646 -0
- htmlgraph/parser.py +160 -35
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/planning.py +147 -52
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +109 -72
- htmlgraph/query_composer.py +509 -0
- htmlgraph/reflection.py +443 -0
- htmlgraph/refs.py +344 -0
- htmlgraph/repo_hash.py +512 -0
- htmlgraph/repositories/__init__.py +292 -0
- htmlgraph/repositories/analytics_repository.py +455 -0
- htmlgraph/repositories/analytics_repository_standard.py +628 -0
- htmlgraph/repositories/feature_repository.py +581 -0
- htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
- htmlgraph/repositories/feature_repository_memory.py +607 -0
- htmlgraph/repositories/feature_repository_sqlite.py +858 -0
- htmlgraph/repositories/filter_service.py +620 -0
- htmlgraph/repositories/filter_service_standard.py +445 -0
- htmlgraph/repositories/shared_cache.py +621 -0
- htmlgraph/repositories/shared_cache_memory.py +395 -0
- htmlgraph/repositories/track_repository.py +552 -0
- htmlgraph/repositories/track_repository_htmlfile.py +619 -0
- htmlgraph/repositories/track_repository_memory.py +508 -0
- htmlgraph/repositories/track_repository_sqlite.py +711 -0
- htmlgraph/routing.py +8 -19
- htmlgraph/scripts/deploy.py +1 -2
- htmlgraph/sdk/__init__.py +398 -0
- htmlgraph/sdk/__init__.pyi +14 -0
- htmlgraph/sdk/analytics/__init__.py +19 -0
- htmlgraph/sdk/analytics/engine.py +155 -0
- htmlgraph/sdk/analytics/helpers.py +178 -0
- htmlgraph/sdk/analytics/registry.py +109 -0
- htmlgraph/sdk/base.py +484 -0
- htmlgraph/sdk/constants.py +216 -0
- htmlgraph/sdk/core.pyi +308 -0
- htmlgraph/sdk/discovery.py +120 -0
- htmlgraph/sdk/help/__init__.py +12 -0
- htmlgraph/sdk/help/mixin.py +699 -0
- htmlgraph/sdk/mixins/__init__.py +15 -0
- htmlgraph/sdk/mixins/attribution.py +113 -0
- htmlgraph/sdk/mixins/mixin.py +410 -0
- htmlgraph/sdk/operations/__init__.py +12 -0
- htmlgraph/sdk/operations/mixin.py +427 -0
- htmlgraph/sdk/orchestration/__init__.py +17 -0
- htmlgraph/sdk/orchestration/coordinator.py +203 -0
- htmlgraph/sdk/orchestration/spawner.py +204 -0
- htmlgraph/sdk/planning/__init__.py +19 -0
- htmlgraph/sdk/planning/bottlenecks.py +93 -0
- htmlgraph/sdk/planning/mixin.py +211 -0
- htmlgraph/sdk/planning/parallel.py +186 -0
- htmlgraph/sdk/planning/queue.py +210 -0
- htmlgraph/sdk/planning/recommendations.py +87 -0
- htmlgraph/sdk/planning/smart_planning.py +319 -0
- htmlgraph/sdk/session/__init__.py +19 -0
- htmlgraph/sdk/session/continuity.py +57 -0
- htmlgraph/sdk/session/handoff.py +110 -0
- htmlgraph/sdk/session/info.py +309 -0
- htmlgraph/sdk/session/manager.py +103 -0
- htmlgraph/sdk/strategic/__init__.py +26 -0
- htmlgraph/sdk/strategic/mixin.py +563 -0
- htmlgraph/server.py +685 -180
- htmlgraph/services/__init__.py +10 -0
- htmlgraph/services/claiming.py +199 -0
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +1392 -175
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +201 -0
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/setup.py +34 -17
- htmlgraph/spike_index.py +143 -0
- htmlgraph/sync_docs.py +12 -15
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph/templates/GEMINI.md.template +87 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +146 -15
- htmlgraph/track_manager.py +69 -21
- htmlgraph/transcript.py +890 -0
- htmlgraph/transcript_analytics.py +699 -0
- htmlgraph/types.py +323 -0
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +8 -5
- htmlgraph/work_type_utils.py +3 -2
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2406 -307
- htmlgraph-0.27.5.data/data/htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/GEMINI.md.template +87 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +97 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -2688
- htmlgraph/sdk.py +0 -709
- htmlgraph-0.9.3.dist-info/RECORD +0 -61
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
htmlgraph/planning.py
CHANGED
|
@@ -1,19 +1,94 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
This module provides models for
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
2
|
+
Planning utilities for HtmlGraph (Conductor-style workflow).
|
|
3
|
+
|
|
4
|
+
This module provides Pydantic models for comprehensive project planning and tracking.
|
|
5
|
+
It implements a Conductor-style planning workflow where complex work is organized
|
|
6
|
+
into Tracks, each containing a Spec (requirements) and Plan (implementation strategy).
|
|
7
|
+
|
|
8
|
+
Available Classes:
|
|
9
|
+
- Track: Top-level container for a work stream with spec and plan
|
|
10
|
+
- Spec: Requirements document with priorities and acceptance criteria
|
|
11
|
+
- Plan: Implementation plan with phases, tasks, and multiple views (list/kanban/timeline/graph)
|
|
12
|
+
- Phase: Logical grouping of related tasks within a plan
|
|
13
|
+
- Task: Individual work item with estimates, blocking, and assignment
|
|
14
|
+
- Requirement: A requirement within a spec with verification status
|
|
15
|
+
- AcceptanceCriterion: An acceptance criterion for validating a spec
|
|
16
|
+
|
|
17
|
+
Conductor Workflow:
|
|
18
|
+
1. Create Track: Define the work stream and its scope
|
|
19
|
+
2. Write Spec: Document requirements and acceptance criteria
|
|
20
|
+
3. Build Plan: Break work into phases and tasks
|
|
21
|
+
4. Execute: Work through tasks, track progress
|
|
22
|
+
5. Validate: Verify against acceptance criteria
|
|
23
|
+
|
|
24
|
+
Key Features:
|
|
25
|
+
- Multi-view rendering: List, Kanban, Timeline, and Graph views
|
|
26
|
+
- Dependency tracking: Tasks can be blocked by other tasks or features
|
|
27
|
+
- Progress tracking: Automatic completion percentage calculation
|
|
28
|
+
- HTML output: Rich, styled HTML documents with dashboard design system
|
|
29
|
+
- Linking: Tracks link to features and sessions for traceability
|
|
30
|
+
|
|
31
|
+
Usage:
|
|
32
|
+
from htmlgraph.planning import Track, Spec, Plan, Phase, Task
|
|
33
|
+
from htmlgraph.sdk import SDK
|
|
34
|
+
|
|
35
|
+
sdk = SDK(agent="claude")
|
|
36
|
+
|
|
37
|
+
# Create a track
|
|
38
|
+
track = Track(
|
|
39
|
+
id="track-001",
|
|
40
|
+
title="User Authentication System",
|
|
41
|
+
description="Complete auth system with OAuth",
|
|
42
|
+
status="active"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Build a spec with requirements
|
|
46
|
+
spec = Spec(
|
|
47
|
+
id="spec-001",
|
|
48
|
+
title="Auth System Requirements",
|
|
49
|
+
track_id="track-001",
|
|
50
|
+
overview="OAuth-based authentication with JWT sessions",
|
|
51
|
+
requirements=[
|
|
52
|
+
Requirement(
|
|
53
|
+
id="req-001",
|
|
54
|
+
description="Support Google and GitHub OAuth",
|
|
55
|
+
priority="must-have"
|
|
56
|
+
)
|
|
57
|
+
]
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Build a plan with phases and tasks
|
|
61
|
+
plan = Plan(
|
|
62
|
+
id="plan-001",
|
|
63
|
+
title="Auth Implementation Plan",
|
|
64
|
+
track_id="track-001",
|
|
65
|
+
phases=[
|
|
66
|
+
Phase(
|
|
67
|
+
id="1",
|
|
68
|
+
name="Foundation",
|
|
69
|
+
tasks=[
|
|
70
|
+
Task(
|
|
71
|
+
id="task-001",
|
|
72
|
+
description="Set up OAuth providers",
|
|
73
|
+
estimate_hours=4.0,
|
|
74
|
+
priority="high"
|
|
75
|
+
)
|
|
76
|
+
]
|
|
77
|
+
)
|
|
78
|
+
]
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Generate HTML outputs
|
|
82
|
+
spec_html = spec.to_html()
|
|
83
|
+
plan_html = plan.to_html()
|
|
10
84
|
"""
|
|
11
85
|
|
|
12
86
|
from datetime import datetime
|
|
13
87
|
from typing import Any, Literal
|
|
88
|
+
|
|
14
89
|
from pydantic import BaseModel, Field
|
|
15
90
|
|
|
16
|
-
from htmlgraph.models import Step
|
|
91
|
+
from htmlgraph.models import Step
|
|
17
92
|
|
|
18
93
|
|
|
19
94
|
class Requirement(BaseModel):
|
|
@@ -25,7 +100,9 @@ class Requirement(BaseModel):
|
|
|
25
100
|
verified: bool = False
|
|
26
101
|
notes: str = ""
|
|
27
102
|
related_tech: list[str] = Field(default_factory=list) # Links to tech stack
|
|
28
|
-
feature_ids: list[str] = Field(
|
|
103
|
+
feature_ids: list[str] = Field(
|
|
104
|
+
default_factory=list
|
|
105
|
+
) # Features satisfying this requirement
|
|
29
106
|
|
|
30
107
|
def to_html(self) -> str:
|
|
31
108
|
"""Convert requirement to HTML article element."""
|
|
@@ -40,11 +117,11 @@ class Requirement(BaseModel):
|
|
|
40
117
|
f'<li><a href="../../project/tech-stack.html#{tech}">{tech}</a></li>'
|
|
41
118
|
for tech in self.related_tech
|
|
42
119
|
)
|
|
43
|
-
tech_links = f
|
|
120
|
+
tech_links = f"""
|
|
44
121
|
<nav data-related>
|
|
45
122
|
<h4>Related Tech:</h4>
|
|
46
123
|
<ul>{tech_items}</ul>
|
|
47
|
-
</nav>
|
|
124
|
+
</nav>"""
|
|
48
125
|
|
|
49
126
|
notes_html = f"<p>{self.notes}</p>" if self.notes else ""
|
|
50
127
|
|
|
@@ -62,7 +139,9 @@ class AcceptanceCriterion(BaseModel):
|
|
|
62
139
|
description: str
|
|
63
140
|
completed: bool = False
|
|
64
141
|
test_case: str | None = None
|
|
65
|
-
feature_ids: list[str] = Field(
|
|
142
|
+
feature_ids: list[str] = Field(
|
|
143
|
+
default_factory=list
|
|
144
|
+
) # Features satisfying this criterion
|
|
66
145
|
|
|
67
146
|
def to_html(self) -> str:
|
|
68
147
|
"""Convert criterion to HTML list item."""
|
|
@@ -71,9 +150,9 @@ class AcceptanceCriterion(BaseModel):
|
|
|
71
150
|
|
|
72
151
|
test_html = ""
|
|
73
152
|
if self.test_case:
|
|
74
|
-
test_html = f
|
|
153
|
+
test_html = f"<code>{self.test_case}</code>"
|
|
75
154
|
|
|
76
|
-
return f
|
|
155
|
+
return f"<li{completed_attr}>{status} {self.description} {test_html}</li>"
|
|
77
156
|
|
|
78
157
|
|
|
79
158
|
class Spec(BaseModel):
|
|
@@ -111,35 +190,45 @@ class Spec(BaseModel):
|
|
|
111
190
|
req_html = ""
|
|
112
191
|
if self.requirements:
|
|
113
192
|
req_items = "\n".join(req.to_html() for req in self.requirements)
|
|
114
|
-
req_html = f
|
|
193
|
+
req_html = f"""
|
|
115
194
|
<section data-section="requirements">
|
|
116
195
|
<h2>Requirements</h2>
|
|
117
196
|
<div class="requirements-list">
|
|
118
197
|
{req_items}
|
|
119
198
|
</div>
|
|
120
|
-
</section>
|
|
199
|
+
</section>"""
|
|
121
200
|
|
|
122
201
|
# Build acceptance criteria HTML
|
|
123
202
|
ac_html = ""
|
|
124
203
|
if self.acceptance_criteria:
|
|
125
|
-
ac_items = "\n ".join(
|
|
126
|
-
|
|
204
|
+
ac_items = "\n ".join(
|
|
205
|
+
ac.to_html() for ac in self.acceptance_criteria
|
|
206
|
+
)
|
|
207
|
+
ac_html = f"""
|
|
127
208
|
<section data-section="acceptance-criteria">
|
|
128
209
|
<h2>Acceptance Criteria</h2>
|
|
129
210
|
<ol class="criteria-list">
|
|
130
211
|
{ac_items}
|
|
131
212
|
</ol>
|
|
132
|
-
</section>
|
|
213
|
+
</section>"""
|
|
133
214
|
|
|
134
215
|
# Build links HTML with back navigation
|
|
135
|
-
nav_html =
|
|
216
|
+
nav_html = """
|
|
136
217
|
<div class="spec-nav">
|
|
137
218
|
<a href="index.html" class="nav-link">← Track</a>
|
|
138
219
|
<a href="plan.html" class="nav-link">Plan →</a>
|
|
139
|
-
</div>
|
|
140
|
-
|
|
141
|
-
overview_html =
|
|
142
|
-
|
|
220
|
+
</div>"""
|
|
221
|
+
|
|
222
|
+
overview_html = (
|
|
223
|
+
f"<p>{self.overview}</p>"
|
|
224
|
+
if self.overview
|
|
225
|
+
else '<p class="muted">No overview provided</p>'
|
|
226
|
+
)
|
|
227
|
+
context_html = (
|
|
228
|
+
f"<p>{self.context}</p>"
|
|
229
|
+
if self.context
|
|
230
|
+
else '<p class="muted">No context provided</p>'
|
|
231
|
+
)
|
|
143
232
|
|
|
144
233
|
return f'''<!DOCTYPE html>
|
|
145
234
|
<html lang="en">
|
|
@@ -379,7 +468,9 @@ class Task(BaseModel):
|
|
|
379
468
|
# Relationships
|
|
380
469
|
blocked_by: list[str] = Field(default_factory=list) # Task IDs or feature IDs
|
|
381
470
|
subtasks: list[Step] = Field(default_factory=list)
|
|
382
|
-
feature_ids: list[str] = Field(
|
|
471
|
+
feature_ids: list[str] = Field(
|
|
472
|
+
default_factory=list
|
|
473
|
+
) # Features implementing this task
|
|
383
474
|
|
|
384
475
|
# Tracking
|
|
385
476
|
started_at: datetime | None = None
|
|
@@ -390,7 +481,9 @@ class Task(BaseModel):
|
|
|
390
481
|
completed_attr = f' data-completed="{str(self.completed).lower()}"'
|
|
391
482
|
priority_attr = f' data-priority="{self.priority}"'
|
|
392
483
|
assigned_attr = f' data-assigned="{self.assigned}"' if self.assigned else ""
|
|
393
|
-
blocked_attr =
|
|
484
|
+
blocked_attr = (
|
|
485
|
+
f' data-blocked-by="{",".join(self.blocked_by)}"' if self.blocked_by else ""
|
|
486
|
+
)
|
|
394
487
|
|
|
395
488
|
status_icon = "✅" if self.completed else ("⏳" if self.started_at else "○")
|
|
396
489
|
|
|
@@ -399,23 +492,25 @@ class Task(BaseModel):
|
|
|
399
492
|
if self.blocked_by:
|
|
400
493
|
block_items = "".join(
|
|
401
494
|
f'<li><a href="../../features/{bid}.html">Depends on: {bid}</a></li>'
|
|
402
|
-
if bid.startswith("feature-")
|
|
403
|
-
f
|
|
495
|
+
if bid.startswith("feature-")
|
|
496
|
+
else f"<li>Depends on: {bid}</li>"
|
|
404
497
|
for bid in self.blocked_by
|
|
405
498
|
)
|
|
406
|
-
blocking_html = f
|
|
499
|
+
blocking_html = f"""
|
|
407
500
|
<nav data-task-links>
|
|
408
501
|
<ul>{block_items}</ul>
|
|
409
|
-
</nav>
|
|
502
|
+
</nav>"""
|
|
410
503
|
|
|
411
504
|
# Build subtasks
|
|
412
505
|
subtasks_html = ""
|
|
413
506
|
if self.subtasks:
|
|
414
|
-
subtask_items = "\n ".join(
|
|
415
|
-
|
|
507
|
+
subtask_items = "\n ".join(
|
|
508
|
+
st.to_html() for st in self.subtasks
|
|
509
|
+
)
|
|
510
|
+
subtasks_html = f"""
|
|
416
511
|
<ul data-subtasks>
|
|
417
512
|
{subtask_items}
|
|
418
|
-
</ul>
|
|
513
|
+
</ul>"""
|
|
419
514
|
|
|
420
515
|
estimate_html = ""
|
|
421
516
|
if self.estimate_hours:
|
|
@@ -525,7 +620,7 @@ class Plan(BaseModel):
|
|
|
525
620
|
|
|
526
621
|
# Progress bar with dashboard styling
|
|
527
622
|
completion = self.completion_percentage
|
|
528
|
-
progress_html = f
|
|
623
|
+
progress_html = f"""
|
|
529
624
|
<div class="progress-container">
|
|
530
625
|
<div class="progress-info">
|
|
531
626
|
<span class="progress-label">{completion}% Complete</span>
|
|
@@ -534,19 +629,19 @@ class Plan(BaseModel):
|
|
|
534
629
|
<div class="progress-bar">
|
|
535
630
|
<div class="progress-fill" style="width: {completion}%"></div>
|
|
536
631
|
</div>
|
|
537
|
-
</div>
|
|
632
|
+
</div>"""
|
|
538
633
|
|
|
539
634
|
# Navigation for different views - matching dashboard view buttons exactly
|
|
540
|
-
view_nav =
|
|
635
|
+
view_nav = """
|
|
541
636
|
<div class="view-toggle">
|
|
542
637
|
<button onclick="showView('list')" class="view-btn active" data-view="list">List</button>
|
|
543
638
|
<button onclick="showView('kanban')" class="view-btn" data-view="kanban">Kanban</button>
|
|
544
639
|
<button onclick="showView('timeline')" class="view-btn" data-view="timeline">Timeline</button>
|
|
545
640
|
<button onclick="showView('graph')" class="view-btn" data-view="graph">Graph</button>
|
|
546
|
-
</div>
|
|
641
|
+
</div>"""
|
|
547
642
|
|
|
548
643
|
# JavaScript for view switching - updated for dashboard-style buttons
|
|
549
|
-
js_code =
|
|
644
|
+
js_code = """
|
|
550
645
|
<script>
|
|
551
646
|
function showView(view) {
|
|
552
647
|
// Hide all view containers
|
|
@@ -610,10 +705,10 @@ class Plan(BaseModel):
|
|
|
610
705
|
// TODO: Implement graph visualization of dependencies
|
|
611
706
|
console.log('Graph view');
|
|
612
707
|
}
|
|
613
|
-
</script>
|
|
708
|
+
</script>"""
|
|
614
709
|
|
|
615
710
|
# Search and filter controls with dashboard styling
|
|
616
|
-
controls_html =
|
|
711
|
+
controls_html = """
|
|
617
712
|
<div class="controls">
|
|
618
713
|
<input type="search" class="search-input" placeholder="Search tasks..." oninput="filterTasks(this.value)">
|
|
619
714
|
<select class="agent-filter" onchange="filterByAgent(this.value)">
|
|
@@ -621,27 +716,27 @@ class Plan(BaseModel):
|
|
|
621
716
|
<option value="claude">Claude</option>
|
|
622
717
|
<option value="copilot">Copilot</option>
|
|
623
718
|
</select>
|
|
624
|
-
</div>
|
|
719
|
+
</div>"""
|
|
625
720
|
|
|
626
721
|
# Navigation links to connect with existing features
|
|
627
|
-
nav_links =
|
|
722
|
+
nav_links = """
|
|
628
723
|
<div class="plan-nav">
|
|
629
724
|
<a href="../../index.html" class="nav-link">← Dashboard</a>
|
|
630
725
|
<a href="index.html" class="nav-link">Track</a>
|
|
631
726
|
<a href="spec.html" class="nav-link">Spec</a>
|
|
632
|
-
</div>
|
|
727
|
+
</div>"""
|
|
633
728
|
|
|
634
729
|
# List view (default)
|
|
635
|
-
list_view = f
|
|
730
|
+
list_view = f"""
|
|
636
731
|
<div class="view-container" data-view="list">
|
|
637
732
|
{controls_html}
|
|
638
733
|
<div class="phases-container">
|
|
639
734
|
{phases_html}
|
|
640
735
|
</div>
|
|
641
|
-
</div>
|
|
736
|
+
</div>"""
|
|
642
737
|
|
|
643
738
|
# Kanban view - matching dashboard kanban styling
|
|
644
|
-
kanban_view =
|
|
739
|
+
kanban_view = """
|
|
645
740
|
<div class="view-container kanban-view" data-view="kanban" style="display: none;">
|
|
646
741
|
<div class="kanban-board">
|
|
647
742
|
<div class="kanban-column" data-status="todo">
|
|
@@ -657,26 +752,26 @@ class Plan(BaseModel):
|
|
|
657
752
|
<div id="kanban-done" class="column-content"></div>
|
|
658
753
|
</div>
|
|
659
754
|
</div>
|
|
660
|
-
</div>
|
|
755
|
+
</div>"""
|
|
661
756
|
|
|
662
757
|
# Timeline view placeholder
|
|
663
|
-
timeline_view =
|
|
758
|
+
timeline_view = """
|
|
664
759
|
<div class="view-container" data-view="timeline" style="display: none;">
|
|
665
760
|
<div class="timeline-placeholder">
|
|
666
761
|
<p class="muted">Timeline view - Coming soon</p>
|
|
667
762
|
<p class="muted">Will visualize tasks on a timeline with milestones</p>
|
|
668
763
|
</div>
|
|
669
|
-
</div>
|
|
764
|
+
</div>"""
|
|
670
765
|
|
|
671
766
|
# Graph view placeholder
|
|
672
|
-
graph_view =
|
|
767
|
+
graph_view = """
|
|
673
768
|
<div class="view-container" data-view="graph" style="display: none;">
|
|
674
769
|
<div class="graph-placeholder">
|
|
675
770
|
<p class="muted">Dependency graph - Coming soon</p>
|
|
676
771
|
<p class="muted">Will visualize task dependencies and blocking relationships</p>
|
|
677
772
|
</div>
|
|
678
773
|
<svg id="dependency-graph" width="100%" height="600"></svg>
|
|
679
|
-
</div>
|
|
774
|
+
</div>"""
|
|
680
775
|
|
|
681
776
|
return f'''<!DOCTYPE html>
|
|
682
777
|
<html lang="en">
|