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/track_manager.py
CHANGED
|
@@ -4,13 +4,23 @@ Track manager for creating and managing tracks, specs, and plans.
|
|
|
4
4
|
Provides high-level operations for the Conductor-style planning workflow.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from pathlib import Path
|
|
8
7
|
from datetime import datetime
|
|
9
|
-
from
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import TYPE_CHECKING, Literal
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from htmlgraph.models import Node
|
|
10
13
|
|
|
11
|
-
from htmlgraph.planning import Track, Spec, Plan, Phase, Task, Requirement, AcceptanceCriterion
|
|
12
14
|
from htmlgraph.graph import HtmlGraph
|
|
13
15
|
from htmlgraph.ids import generate_id
|
|
16
|
+
from htmlgraph.planning import (
|
|
17
|
+
Phase,
|
|
18
|
+
Plan,
|
|
19
|
+
Requirement,
|
|
20
|
+
Spec,
|
|
21
|
+
Task,
|
|
22
|
+
Track,
|
|
23
|
+
)
|
|
14
24
|
|
|
15
25
|
|
|
16
26
|
class TrackManager:
|
|
@@ -328,6 +338,44 @@ class TrackManager:
|
|
|
328
338
|
track_id=track_id,
|
|
329
339
|
)
|
|
330
340
|
|
|
341
|
+
def load_track(self, track_id: str) -> Track | None:
|
|
342
|
+
"""
|
|
343
|
+
Load a track from disk.
|
|
344
|
+
|
|
345
|
+
Supports both consolidated (single .html file) and directory-based tracks.
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
track_id: Track ID
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
Track instance or None if not found
|
|
352
|
+
"""
|
|
353
|
+
track_path = self.get_track_path(track_id)
|
|
354
|
+
if track_path is None:
|
|
355
|
+
return None
|
|
356
|
+
|
|
357
|
+
# For now, return a basic Track instance
|
|
358
|
+
# TODO: Parse HTML back to Track using justhtml
|
|
359
|
+
if track_path.is_file():
|
|
360
|
+
# Consolidated format - single file
|
|
361
|
+
return Track(
|
|
362
|
+
id=track_id,
|
|
363
|
+
title=f"Track {track_id}",
|
|
364
|
+
description="Loaded from consolidated format",
|
|
365
|
+
)
|
|
366
|
+
else:
|
|
367
|
+
# Directory format - check for spec and plan
|
|
368
|
+
spec_exists = (track_path / "spec.html").exists()
|
|
369
|
+
plan_exists = (track_path / "plan.html").exists()
|
|
370
|
+
|
|
371
|
+
return Track(
|
|
372
|
+
id=track_id,
|
|
373
|
+
title=f"Track {track_id}",
|
|
374
|
+
description="Loaded from directory format",
|
|
375
|
+
has_spec=spec_exists,
|
|
376
|
+
has_plan=plan_exists,
|
|
377
|
+
)
|
|
378
|
+
|
|
331
379
|
def list_tracks(self) -> list[str]:
|
|
332
380
|
"""
|
|
333
381
|
List all track IDs.
|
|
@@ -461,8 +509,8 @@ class TrackManager:
|
|
|
461
509
|
<nav data-track-components>
|
|
462
510
|
<h2>Components</h2>
|
|
463
511
|
<ul>
|
|
464
|
-
<li><a href="spec.html">📝 Specification</a>{
|
|
465
|
-
<li><a href="plan.html">📋 Implementation Plan</a>{
|
|
512
|
+
<li><a href="spec.html">📝 Specification</a>{" (not created)" if not track.has_spec else ""}</li>
|
|
513
|
+
<li><a href="plan.html">📋 Implementation Plan</a>{" (not created)" if not track.has_plan else ""}</li>
|
|
466
514
|
</ul>
|
|
467
515
|
</nav>
|
|
468
516
|
|
|
@@ -471,12 +519,12 @@ class TrackManager:
|
|
|
471
519
|
<nav>
|
|
472
520
|
<h3>Features:</h3>
|
|
473
521
|
<ul>
|
|
474
|
-
{
|
|
522
|
+
{"<li>No features linked yet</li>" if not track.features else "".join(f'<li><a href="../../features/{fid}.html">{fid}</a></li>' for fid in track.features)}
|
|
475
523
|
</ul>
|
|
476
524
|
|
|
477
525
|
<h3>Sessions:</h3>
|
|
478
526
|
<ul>
|
|
479
|
-
{
|
|
527
|
+
{"<li>No sessions yet</li>" if not track.sessions else "".join(f'<li><a href="../../sessions/{sid}.html">{sid}</a></li>' for sid in track.sessions)}
|
|
480
528
|
</ul>
|
|
481
529
|
</nav>
|
|
482
530
|
</section>
|
|
@@ -496,7 +544,7 @@ class TrackManager:
|
|
|
496
544
|
self,
|
|
497
545
|
track_id: str,
|
|
498
546
|
plan: Plan | None = None,
|
|
499
|
-
features_dir: Path | str = ".htmlgraph/features"
|
|
547
|
+
features_dir: Path | str = ".htmlgraph/features",
|
|
500
548
|
) -> list["Node"]:
|
|
501
549
|
"""
|
|
502
550
|
Generate feature nodes from plan tasks.
|
|
@@ -541,11 +589,12 @@ class TrackManager:
|
|
|
541
589
|
"estimate_hours": task.estimate_hours,
|
|
542
590
|
"phase_id": phase.id,
|
|
543
591
|
"phase_name": phase.name,
|
|
544
|
-
}
|
|
592
|
+
},
|
|
545
593
|
)
|
|
546
594
|
|
|
547
595
|
# Save feature HTML
|
|
548
596
|
from htmlgraph.converter import NodeConverter
|
|
597
|
+
|
|
549
598
|
converter = NodeConverter(features_dir)
|
|
550
599
|
converter.save(feature)
|
|
551
600
|
|
|
@@ -562,10 +611,7 @@ class TrackManager:
|
|
|
562
611
|
return created_features
|
|
563
612
|
|
|
564
613
|
def link_feature_to_task(
|
|
565
|
-
self,
|
|
566
|
-
feature_id: str,
|
|
567
|
-
track_id: str,
|
|
568
|
-
task_id: str
|
|
614
|
+
self, feature_id: str, track_id: str, task_id: str
|
|
569
615
|
) -> None:
|
|
570
616
|
"""
|
|
571
617
|
Link an existing feature to a plan task.
|
|
@@ -601,9 +647,7 @@ class TrackManager:
|
|
|
601
647
|
plan_path.write_text(plan.to_html(), encoding="utf-8")
|
|
602
648
|
|
|
603
649
|
def sync_task_completion(
|
|
604
|
-
self,
|
|
605
|
-
track_id: str,
|
|
606
|
-
graph: "HtmlGraph | None" = None
|
|
650
|
+
self, track_id: str, graph: "HtmlGraph | None" = None
|
|
607
651
|
) -> Plan:
|
|
608
652
|
"""
|
|
609
653
|
Sync task completion status based on linked features.
|
|
@@ -621,6 +665,7 @@ class TrackManager:
|
|
|
621
665
|
|
|
622
666
|
if graph is None:
|
|
623
667
|
from htmlgraph.graph import HtmlGraph
|
|
668
|
+
|
|
624
669
|
graph = HtmlGraph(".htmlgraph/features")
|
|
625
670
|
|
|
626
671
|
for phase in plan.phases:
|
|
@@ -659,9 +704,7 @@ class TrackManager:
|
|
|
659
704
|
return plan
|
|
660
705
|
|
|
661
706
|
def check_spec_satisfaction(
|
|
662
|
-
self,
|
|
663
|
-
track_id: str,
|
|
664
|
-
graph: "HtmlGraph | None" = None
|
|
707
|
+
self, track_id: str, graph: "HtmlGraph | None" = None
|
|
665
708
|
) -> Spec:
|
|
666
709
|
"""
|
|
667
710
|
Check if spec requirements are satisfied by completed features.
|
|
@@ -680,6 +723,7 @@ class TrackManager:
|
|
|
680
723
|
|
|
681
724
|
if graph is None:
|
|
682
725
|
from htmlgraph.graph import HtmlGraph
|
|
726
|
+
|
|
683
727
|
graph = HtmlGraph(".htmlgraph/features")
|
|
684
728
|
|
|
685
729
|
# Check acceptance criteria
|
|
@@ -689,7 +733,9 @@ class TrackManager:
|
|
|
689
733
|
|
|
690
734
|
# Check if all linked features are completed
|
|
691
735
|
all_done = all(
|
|
692
|
-
fid in graph
|
|
736
|
+
fid in graph
|
|
737
|
+
and (feature := graph.get(fid)) is not None
|
|
738
|
+
and feature.status == "done"
|
|
693
739
|
for fid in criterion.feature_ids
|
|
694
740
|
)
|
|
695
741
|
|
|
@@ -702,7 +748,9 @@ class TrackManager:
|
|
|
702
748
|
|
|
703
749
|
# Check if all linked features are completed
|
|
704
750
|
all_done = all(
|
|
705
|
-
fid in graph
|
|
751
|
+
fid in graph
|
|
752
|
+
and (feature := graph.get(fid)) is not None
|
|
753
|
+
and feature.status == "done"
|
|
706
754
|
for fid in requirement.feature_ids
|
|
707
755
|
)
|
|
708
756
|
|