htmlgraph 0.20.1__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 +51 -1
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +26 -10
- htmlgraph/agent_registry.py +2 -1
- htmlgraph/analytics/__init__.py +8 -1
- htmlgraph/analytics/cli.py +86 -20
- 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 +10 -6
- 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 +67 -27
- htmlgraph/analytics_index.py +53 -20
- 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 +2 -1
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/base.py +57 -2
- htmlgraph/builders/bug.py +19 -3
- htmlgraph/builders/chore.py +19 -3
- htmlgraph/builders/epic.py +19 -3
- htmlgraph/builders/feature.py +27 -3
- htmlgraph/builders/insight.py +2 -1
- htmlgraph/builders/metric.py +2 -1
- htmlgraph/builders/pattern.py +2 -1
- htmlgraph/builders/phase.py +19 -3
- htmlgraph/builders/spike.py +29 -3
- htmlgraph/builders/track.py +42 -1
- 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 +2 -0
- htmlgraph/collections/base.py +197 -14
- htmlgraph/collections/bug.py +2 -1
- htmlgraph/collections/chore.py +2 -1
- htmlgraph/collections/epic.py +2 -1
- htmlgraph/collections/feature.py +2 -1
- htmlgraph/collections/insight.py +2 -1
- htmlgraph/collections/metric.py +2 -1
- htmlgraph/collections/pattern.py +2 -1
- htmlgraph/collections/phase.py +2 -1
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +13 -2
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +14 -1
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +2 -1
- htmlgraph/converter.py +116 -7
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2246 -248
- 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 +2 -1
- htmlgraph/deploy.py +26 -27
- 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 +2 -1
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +86 -37
- htmlgraph/event_migration.py +2 -1
- htmlgraph/file_watcher.py +12 -8
- htmlgraph/find_api.py +2 -1
- htmlgraph/git_events.py +67 -9
- 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 +8 -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 +790 -99
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/installer.py +5 -1
- htmlgraph/hooks/orchestrator.py +327 -76
- htmlgraph/hooks/orchestrator_reflector.py +31 -4
- htmlgraph/hooks/post_tool_use_failure.py +32 -7
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +92 -19
- htmlgraph/hooks/pretooluse.py +527 -7
- 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 +99 -4
- htmlgraph/hooks/validator.py +212 -91
- htmlgraph/ids.py +2 -1
- htmlgraph/learning.py +125 -100
- htmlgraph/mcp_server.py +2 -1
- htmlgraph/models.py +217 -18
- 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.py → orchestration/task_coordination.py} +16 -8
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +2 -1
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +115 -4
- htmlgraph/parallel.py +2 -1
- htmlgraph/parser.py +86 -6
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +2 -1
- 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/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 +295 -107
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +285 -3
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +2 -1
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +33 -1
- htmlgraph/track_manager.py +38 -0
- htmlgraph/transcript.py +18 -5
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +2 -1
- htmlgraph/work_type_utils.py +2 -1
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -4839
- htmlgraph/sdk.py +0 -2359
- htmlgraph-0.20.1.dist-info/RECORD +0 -118
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
htmlgraph/builders/chore.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Chore builder for creating maintenance task nodes.
|
|
3
5
|
|
|
@@ -5,12 +7,11 @@ Extends BaseBuilder with chore-specific methods like
|
|
|
5
7
|
chore type and recurrence.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
|
-
from typing import TYPE_CHECKING
|
|
11
|
+
from typing import TYPE_CHECKING, Any
|
|
11
12
|
|
|
12
13
|
if TYPE_CHECKING:
|
|
13
|
-
|
|
14
|
+
from htmlgraph.sdk import SDK
|
|
14
15
|
|
|
15
16
|
from htmlgraph.builders.base import BaseBuilder
|
|
16
17
|
|
|
@@ -36,6 +37,21 @@ class ChoreBuilder(BaseBuilder["ChoreBuilder"]):
|
|
|
36
37
|
|
|
37
38
|
node_type = "chore"
|
|
38
39
|
|
|
40
|
+
def __init__(self, sdk: SDK, title: str, **kwargs: Any):
|
|
41
|
+
"""Initialize chore builder with agent attribution."""
|
|
42
|
+
super().__init__(sdk, title, **kwargs)
|
|
43
|
+
# Auto-assign agent from SDK for work tracking
|
|
44
|
+
if sdk._agent_id:
|
|
45
|
+
self._data["agent_assigned"] = sdk._agent_id
|
|
46
|
+
elif "agent_assigned" not in self._data:
|
|
47
|
+
# Log warning if agent not assigned (defensive check)
|
|
48
|
+
import logging
|
|
49
|
+
|
|
50
|
+
logging.warning(
|
|
51
|
+
f"Creating chore '{self._data.get('title', 'Unknown')}' without agent attribution. "
|
|
52
|
+
"Pass agent='name' to SDK() initialization."
|
|
53
|
+
)
|
|
54
|
+
|
|
39
55
|
def set_chore_type(self, chore_type: str) -> ChoreBuilder:
|
|
40
56
|
"""
|
|
41
57
|
Set the type of chore.
|
htmlgraph/builders/epic.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Epic builder for creating large body of work nodes.
|
|
3
5
|
|
|
@@ -5,13 +7,12 @@ Extends BaseBuilder with epic-specific methods like
|
|
|
5
7
|
child features and milestones.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
from datetime import date
|
|
11
|
-
from typing import TYPE_CHECKING
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
12
13
|
|
|
13
14
|
if TYPE_CHECKING:
|
|
14
|
-
|
|
15
|
+
from htmlgraph.sdk import SDK
|
|
15
16
|
|
|
16
17
|
from htmlgraph.builders.base import BaseBuilder
|
|
17
18
|
|
|
@@ -38,6 +39,21 @@ class EpicBuilder(BaseBuilder["EpicBuilder"]):
|
|
|
38
39
|
|
|
39
40
|
node_type = "epic"
|
|
40
41
|
|
|
42
|
+
def __init__(self, sdk: SDK, title: str, **kwargs: Any):
|
|
43
|
+
"""Initialize epic builder with agent attribution."""
|
|
44
|
+
super().__init__(sdk, title, **kwargs)
|
|
45
|
+
# Auto-assign agent from SDK for work tracking
|
|
46
|
+
if sdk._agent_id:
|
|
47
|
+
self._data["agent_assigned"] = sdk._agent_id
|
|
48
|
+
elif "agent_assigned" not in self._data:
|
|
49
|
+
# Log warning if agent not assigned (defensive check)
|
|
50
|
+
import logging
|
|
51
|
+
|
|
52
|
+
logging.warning(
|
|
53
|
+
f"Creating epic '{self._data.get('title', 'Unknown')}' without agent attribution. "
|
|
54
|
+
"Pass agent='name' to SDK() initialization."
|
|
55
|
+
)
|
|
56
|
+
|
|
41
57
|
def add_child_feature(self, feature_id: str) -> EpicBuilder:
|
|
42
58
|
"""
|
|
43
59
|
Add a feature as a child of this epic.
|
htmlgraph/builders/feature.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Feature builder for creating feature nodes.
|
|
3
5
|
|
|
@@ -5,12 +7,11 @@ Extends BaseBuilder with feature-specific methods like
|
|
|
5
7
|
capability management.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
|
-
from typing import TYPE_CHECKING
|
|
11
|
+
from typing import TYPE_CHECKING, Any
|
|
11
12
|
|
|
12
13
|
if TYPE_CHECKING:
|
|
13
|
-
|
|
14
|
+
from htmlgraph.sdk import SDK
|
|
14
15
|
|
|
15
16
|
from htmlgraph.builders.base import BaseBuilder
|
|
16
17
|
|
|
@@ -34,6 +35,29 @@ class FeatureBuilder(BaseBuilder["FeatureBuilder"]):
|
|
|
34
35
|
|
|
35
36
|
node_type = "feature"
|
|
36
37
|
|
|
38
|
+
def __init__(self, sdk: SDK, title: str, **kwargs: Any):
|
|
39
|
+
"""Initialize feature builder with agent attribution and validation."""
|
|
40
|
+
# Validate title before creating builder
|
|
41
|
+
|
|
42
|
+
stripped_title = title.strip() if title else ""
|
|
43
|
+
if not stripped_title:
|
|
44
|
+
raise ValueError("Feature title cannot be empty or whitespace only")
|
|
45
|
+
if len(stripped_title) < 3:
|
|
46
|
+
raise ValueError("Feature title must be at least 3 characters")
|
|
47
|
+
|
|
48
|
+
super().__init__(sdk, title, **kwargs)
|
|
49
|
+
# Auto-assign agent from SDK for work tracking
|
|
50
|
+
if sdk._agent_id:
|
|
51
|
+
self._data["agent_assigned"] = sdk._agent_id
|
|
52
|
+
elif "agent_assigned" not in self._data:
|
|
53
|
+
# Log warning if agent not assigned (defensive check)
|
|
54
|
+
import logging
|
|
55
|
+
|
|
56
|
+
logging.warning(
|
|
57
|
+
f"Creating feature '{self._data.get('title', 'Unknown')}' without agent attribution. "
|
|
58
|
+
"Pass agent='name' to SDK() initialization."
|
|
59
|
+
)
|
|
60
|
+
|
|
37
61
|
def set_required_capabilities(self, capabilities: list[str]) -> FeatureBuilder:
|
|
38
62
|
"""
|
|
39
63
|
Set required capabilities for this feature.
|
htmlgraph/builders/insight.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Insight builder for creating session insight nodes.
|
|
3
5
|
|
|
@@ -5,7 +7,6 @@ Extends BaseBuilder with insight-specific methods for
|
|
|
5
7
|
session health scoring and pattern detection.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
from typing import TYPE_CHECKING, Any
|
|
11
12
|
|
htmlgraph/builders/metric.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Metric builder for creating aggregated metric nodes.
|
|
3
5
|
|
|
@@ -5,7 +7,6 @@ Extends BaseBuilder with metric-specific methods for
|
|
|
5
7
|
time-series aggregation and trend analysis.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
from datetime import datetime
|
|
11
12
|
from typing import TYPE_CHECKING, Any
|
htmlgraph/builders/pattern.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Pattern builder for creating workflow pattern nodes.
|
|
3
5
|
|
|
@@ -5,7 +7,6 @@ Extends BaseBuilder with pattern-specific methods for
|
|
|
5
7
|
tracking optimal and anti-pattern tool sequences.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
from datetime import datetime
|
|
11
12
|
from typing import TYPE_CHECKING, Any
|
htmlgraph/builders/phase.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Phase builder for creating project phase nodes.
|
|
3
5
|
|
|
@@ -5,13 +7,12 @@ Extends BaseBuilder with phase-specific methods like
|
|
|
5
7
|
phase ordering and dependencies.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
from datetime import date
|
|
11
|
-
from typing import TYPE_CHECKING
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
12
13
|
|
|
13
14
|
if TYPE_CHECKING:
|
|
14
|
-
|
|
15
|
+
from htmlgraph.sdk import SDK
|
|
15
16
|
|
|
16
17
|
from htmlgraph.builders.base import BaseBuilder
|
|
17
18
|
|
|
@@ -37,6 +38,21 @@ class PhaseBuilder(BaseBuilder["PhaseBuilder"]):
|
|
|
37
38
|
|
|
38
39
|
node_type = "phase"
|
|
39
40
|
|
|
41
|
+
def __init__(self, sdk: SDK, title: str, **kwargs: Any):
|
|
42
|
+
"""Initialize phase builder with agent attribution."""
|
|
43
|
+
super().__init__(sdk, title, **kwargs)
|
|
44
|
+
# Auto-assign agent from SDK for work tracking
|
|
45
|
+
if sdk._agent_id:
|
|
46
|
+
self._data["agent_assigned"] = sdk._agent_id
|
|
47
|
+
elif "agent_assigned" not in self._data:
|
|
48
|
+
# Log warning if agent not assigned (defensive check)
|
|
49
|
+
import logging
|
|
50
|
+
|
|
51
|
+
logging.warning(
|
|
52
|
+
f"Creating phase '{self._data.get('title', 'Unknown')}' without agent attribution. "
|
|
53
|
+
"Pass agent='name' to SDK() initialization."
|
|
54
|
+
)
|
|
55
|
+
|
|
40
56
|
def set_phase_number(self, number: int) -> PhaseBuilder:
|
|
41
57
|
"""
|
|
42
58
|
Set the phase number for ordering.
|
htmlgraph/builders/spike.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Spike builder for creating spike investigation nodes.
|
|
3
5
|
|
|
@@ -5,7 +7,6 @@ Extends BaseBuilder with spike-specific methods like
|
|
|
5
7
|
spike_type and timebox_hours.
|
|
6
8
|
"""
|
|
7
9
|
|
|
8
|
-
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
from typing import TYPE_CHECKING, Any
|
|
11
12
|
|
|
@@ -48,6 +49,18 @@ class SpikeBuilder(BaseBuilder["SpikeBuilder"]):
|
|
|
48
49
|
self._data["spike_type"] = SpikeType.GENERAL
|
|
49
50
|
if "timebox_hours" not in self._data:
|
|
50
51
|
self._data["timebox_hours"] = 4
|
|
52
|
+
# Auto-assign agent from SDK (critical for work tracking)
|
|
53
|
+
if sdk._agent_id:
|
|
54
|
+
self._data["agent_assigned"] = sdk._agent_id
|
|
55
|
+
elif "agent_assigned" not in self._data:
|
|
56
|
+
# This should never happen now because SDK enforces agent parameter,
|
|
57
|
+
# but log warning if it does occur (for debugging)
|
|
58
|
+
import logging
|
|
59
|
+
|
|
60
|
+
logging.warning(
|
|
61
|
+
f"Creating spike '{self._data.get('title', 'Unknown')}' without agent attribution. "
|
|
62
|
+
"This will make work tracking impossible. Pass agent='name' to SDK() initialization."
|
|
63
|
+
)
|
|
51
64
|
|
|
52
65
|
def set_spike_type(self, spike_type: SpikeType) -> SpikeBuilder:
|
|
53
66
|
"""
|
|
@@ -86,15 +99,28 @@ class SpikeBuilder(BaseBuilder["SpikeBuilder"]):
|
|
|
86
99
|
Set the findings/learnings from spike investigation.
|
|
87
100
|
|
|
88
101
|
Args:
|
|
89
|
-
findings: Summary of what was learned
|
|
102
|
+
findings: Summary of what was learned (must be non-empty, min 10 chars)
|
|
90
103
|
|
|
91
104
|
Returns:
|
|
92
105
|
Self for method chaining
|
|
93
106
|
|
|
107
|
+
Raises:
|
|
108
|
+
ValueError: If findings are empty or too short
|
|
109
|
+
|
|
94
110
|
Example:
|
|
95
111
|
>>> spike.set_findings("OAuth2 is best fit. Recommend Auth0.")
|
|
96
112
|
"""
|
|
97
|
-
|
|
113
|
+
# Validate findings quality
|
|
114
|
+
stripped = findings.strip() if findings else ""
|
|
115
|
+
if not stripped:
|
|
116
|
+
raise ValueError(
|
|
117
|
+
"Findings cannot be empty. Provide meaningful investigation results."
|
|
118
|
+
)
|
|
119
|
+
if len(stripped) < 10:
|
|
120
|
+
raise ValueError(
|
|
121
|
+
"Findings must be at least 10 characters. Provide detailed results."
|
|
122
|
+
)
|
|
123
|
+
self._data["findings"] = stripped
|
|
98
124
|
return self
|
|
99
125
|
|
|
100
126
|
def set_decision(self, decision: str) -> SpikeBuilder:
|
htmlgraph/builders/track.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Track Builder for agent-friendly track creation.
|
|
3
5
|
"""
|
|
4
6
|
|
|
5
|
-
from __future__ import annotations
|
|
6
7
|
|
|
7
8
|
import re
|
|
8
9
|
from datetime import datetime
|
|
@@ -617,6 +618,30 @@ class TrackBuilder:
|
|
|
617
618
|
Phase(id=f"phase-{i + 1}", name=phase_name, tasks=phase_tasks)
|
|
618
619
|
)
|
|
619
620
|
|
|
621
|
+
# Persist features to database from plan phases
|
|
622
|
+
features_created = 0
|
|
623
|
+
if phases:
|
|
624
|
+
for phase in phases:
|
|
625
|
+
for task in phase.tasks:
|
|
626
|
+
# Generate feature ID from task description
|
|
627
|
+
feature_id = generate_id(node_type="feat", title=task.description)
|
|
628
|
+
|
|
629
|
+
# Insert feature into database
|
|
630
|
+
success = self.sdk._db.insert_feature(
|
|
631
|
+
feature_id=feature_id,
|
|
632
|
+
feature_type="task", # Tasks from tracks are features of type "task"
|
|
633
|
+
title=task.description,
|
|
634
|
+
status="todo", # All new tasks start as "todo"
|
|
635
|
+
priority=self._priority, # Inherit priority from track
|
|
636
|
+
assigned_to=None, # No assignment initially
|
|
637
|
+
track_id=track_id,
|
|
638
|
+
description=f"Task from {phase.name}",
|
|
639
|
+
steps_total=0,
|
|
640
|
+
tags=None,
|
|
641
|
+
)
|
|
642
|
+
if success:
|
|
643
|
+
features_created += 1
|
|
644
|
+
|
|
620
645
|
if self._consolidated:
|
|
621
646
|
# Single-file format: everything in one index.html
|
|
622
647
|
track_file = self.sdk._directory / "tracks" / f"{track_id}.html"
|
|
@@ -677,5 +702,21 @@ class TrackBuilder:
|
|
|
677
702
|
if self._plan_phases:
|
|
678
703
|
total_tasks = sum(len(tasks) for _, tasks in self._plan_phases)
|
|
679
704
|
print(f" - Plan with {len(self._plan_phases)} phases, {total_tasks} tasks")
|
|
705
|
+
if features_created > 0:
|
|
706
|
+
print(f" - Persisted {features_created} features to database")
|
|
680
707
|
|
|
681
708
|
return track
|
|
709
|
+
|
|
710
|
+
def save(self) -> Track:
|
|
711
|
+
"""
|
|
712
|
+
Save/create the track (alias for create()).
|
|
713
|
+
|
|
714
|
+
Provides API consistency with other builders.
|
|
715
|
+
|
|
716
|
+
Returns:
|
|
717
|
+
Track object that was created
|
|
718
|
+
|
|
719
|
+
Example:
|
|
720
|
+
track = sdk.tracks.create("My Track").save()
|
|
721
|
+
"""
|
|
722
|
+
return self.create()
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Computational Imperative Guidance System (CIGS)
|
|
3
|
+
|
|
4
|
+
Provides guidance, messaging, and tracking for delegation enforcement in HtmlGraph.
|
|
5
|
+
|
|
6
|
+
Modules:
|
|
7
|
+
- messages_basic: Level 0-1 imperative message templates
|
|
8
|
+
- models: Data models for violations, patterns, and autonomy
|
|
9
|
+
- tracker: Violation tracking and persistence
|
|
10
|
+
- cost: Cost calculation and efficiency metrics
|
|
11
|
+
- patterns: Anti-pattern detection and analysis
|
|
12
|
+
- autonomy: Autonomy level management
|
|
13
|
+
- reporter: Dashboard generation for cost analysis
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from htmlgraph.cigs.autonomy import AutonomyRecommender
|
|
17
|
+
from htmlgraph.cigs.messages_basic import (
|
|
18
|
+
BasicMessageGenerator,
|
|
19
|
+
MessageTemplateLibrary,
|
|
20
|
+
OperationContext,
|
|
21
|
+
ToolCategory,
|
|
22
|
+
classify_operation,
|
|
23
|
+
estimate_costs,
|
|
24
|
+
)
|
|
25
|
+
from htmlgraph.cigs.messaging import (
|
|
26
|
+
ImperativeMessageGenerator,
|
|
27
|
+
PositiveReinforcementGenerator,
|
|
28
|
+
)
|
|
29
|
+
from htmlgraph.cigs.models import (
|
|
30
|
+
AutonomyLevel,
|
|
31
|
+
CostMetrics,
|
|
32
|
+
CostPrediction,
|
|
33
|
+
OperationClassification,
|
|
34
|
+
PatternRecord,
|
|
35
|
+
SessionViolationSummary,
|
|
36
|
+
TokenCost,
|
|
37
|
+
ViolationRecord,
|
|
38
|
+
ViolationType,
|
|
39
|
+
)
|
|
40
|
+
from htmlgraph.cigs.patterns import (
|
|
41
|
+
DetectionResult,
|
|
42
|
+
PatternDetector,
|
|
43
|
+
detect_patterns,
|
|
44
|
+
)
|
|
45
|
+
from htmlgraph.cigs.posttool_analyzer import CIGSPostToolAnalyzer
|
|
46
|
+
from htmlgraph.cigs.reporter import CostReporter
|
|
47
|
+
from htmlgraph.cigs.tracker import ViolationTracker
|
|
48
|
+
|
|
49
|
+
__all__ = [
|
|
50
|
+
# Messages
|
|
51
|
+
"BasicMessageGenerator",
|
|
52
|
+
"PositiveReinforcementGenerator",
|
|
53
|
+
"ImperativeMessageGenerator",
|
|
54
|
+
"MessageTemplateLibrary",
|
|
55
|
+
"OperationContext",
|
|
56
|
+
"ToolCategory",
|
|
57
|
+
"classify_operation",
|
|
58
|
+
"estimate_costs",
|
|
59
|
+
# Models
|
|
60
|
+
"ViolationType",
|
|
61
|
+
"ViolationRecord",
|
|
62
|
+
"SessionViolationSummary",
|
|
63
|
+
"PatternRecord",
|
|
64
|
+
"TokenCost",
|
|
65
|
+
"CostPrediction",
|
|
66
|
+
"OperationClassification",
|
|
67
|
+
"AutonomyLevel",
|
|
68
|
+
"CostMetrics",
|
|
69
|
+
# Autonomy
|
|
70
|
+
"AutonomyRecommender",
|
|
71
|
+
# Patterns
|
|
72
|
+
"PatternDetector",
|
|
73
|
+
"DetectionResult",
|
|
74
|
+
"detect_patterns",
|
|
75
|
+
# Tracker
|
|
76
|
+
"ViolationTracker",
|
|
77
|
+
# PostTool Analysis
|
|
78
|
+
"CIGSPostToolAnalyzer",
|
|
79
|
+
# Reporter
|
|
80
|
+
"CostReporter",
|
|
81
|
+
]
|