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.
Files changed (304) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
  2. htmlgraph/.htmlgraph/agents.json +72 -0
  3. htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  4. htmlgraph/__init__.py +51 -1
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +26 -10
  7. htmlgraph/agent_registry.py +2 -1
  8. htmlgraph/analytics/__init__.py +8 -1
  9. htmlgraph/analytics/cli.py +86 -20
  10. htmlgraph/analytics/cost_analyzer.py +391 -0
  11. htmlgraph/analytics/cost_monitor.py +664 -0
  12. htmlgraph/analytics/cost_reporter.py +675 -0
  13. htmlgraph/analytics/cross_session.py +617 -0
  14. htmlgraph/analytics/dependency.py +10 -6
  15. htmlgraph/analytics/pattern_learning.py +771 -0
  16. htmlgraph/analytics/session_graph.py +707 -0
  17. htmlgraph/analytics/strategic/__init__.py +80 -0
  18. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  19. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  20. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  21. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  22. htmlgraph/analytics/work_type.py +67 -27
  23. htmlgraph/analytics_index.py +53 -20
  24. htmlgraph/api/__init__.py +3 -0
  25. htmlgraph/api/cost_alerts_websocket.py +416 -0
  26. htmlgraph/api/main.py +2498 -0
  27. htmlgraph/api/static/htmx.min.js +1 -0
  28. htmlgraph/api/static/style-redesign.css +1344 -0
  29. htmlgraph/api/static/style.css +1079 -0
  30. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  31. htmlgraph/api/templates/dashboard.html +794 -0
  32. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  33. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  34. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  35. htmlgraph/api/templates/partials/agents.html +317 -0
  36. htmlgraph/api/templates/partials/event-traces.html +373 -0
  37. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  38. htmlgraph/api/templates/partials/features.html +578 -0
  39. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  40. htmlgraph/api/templates/partials/metrics.html +346 -0
  41. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  42. htmlgraph/api/templates/partials/orchestration.html +198 -0
  43. htmlgraph/api/templates/partials/spawners.html +375 -0
  44. htmlgraph/api/templates/partials/work-items.html +613 -0
  45. htmlgraph/api/websocket.py +538 -0
  46. htmlgraph/archive/__init__.py +24 -0
  47. htmlgraph/archive/bloom.py +234 -0
  48. htmlgraph/archive/fts.py +297 -0
  49. htmlgraph/archive/manager.py +583 -0
  50. htmlgraph/archive/search.py +244 -0
  51. htmlgraph/atomic_ops.py +560 -0
  52. htmlgraph/attribute_index.py +2 -1
  53. htmlgraph/bounded_paths.py +539 -0
  54. htmlgraph/builders/base.py +57 -2
  55. htmlgraph/builders/bug.py +19 -3
  56. htmlgraph/builders/chore.py +19 -3
  57. htmlgraph/builders/epic.py +19 -3
  58. htmlgraph/builders/feature.py +27 -3
  59. htmlgraph/builders/insight.py +2 -1
  60. htmlgraph/builders/metric.py +2 -1
  61. htmlgraph/builders/pattern.py +2 -1
  62. htmlgraph/builders/phase.py +19 -3
  63. htmlgraph/builders/spike.py +29 -3
  64. htmlgraph/builders/track.py +42 -1
  65. htmlgraph/cigs/__init__.py +81 -0
  66. htmlgraph/cigs/autonomy.py +385 -0
  67. htmlgraph/cigs/cost.py +475 -0
  68. htmlgraph/cigs/messages_basic.py +472 -0
  69. htmlgraph/cigs/messaging.py +365 -0
  70. htmlgraph/cigs/models.py +771 -0
  71. htmlgraph/cigs/pattern_storage.py +427 -0
  72. htmlgraph/cigs/patterns.py +503 -0
  73. htmlgraph/cigs/posttool_analyzer.py +234 -0
  74. htmlgraph/cigs/reporter.py +818 -0
  75. htmlgraph/cigs/tracker.py +317 -0
  76. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  77. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  78. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  79. htmlgraph/cli/__init__.py +42 -0
  80. htmlgraph/cli/__main__.py +6 -0
  81. htmlgraph/cli/analytics.py +1424 -0
  82. htmlgraph/cli/base.py +685 -0
  83. htmlgraph/cli/constants.py +206 -0
  84. htmlgraph/cli/core.py +954 -0
  85. htmlgraph/cli/main.py +147 -0
  86. htmlgraph/cli/models.py +475 -0
  87. htmlgraph/cli/templates/__init__.py +1 -0
  88. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  89. htmlgraph/cli/work/__init__.py +239 -0
  90. htmlgraph/cli/work/browse.py +115 -0
  91. htmlgraph/cli/work/features.py +568 -0
  92. htmlgraph/cli/work/orchestration.py +676 -0
  93. htmlgraph/cli/work/report.py +728 -0
  94. htmlgraph/cli/work/sessions.py +466 -0
  95. htmlgraph/cli/work/snapshot.py +559 -0
  96. htmlgraph/cli/work/tracks.py +486 -0
  97. htmlgraph/cli_commands/__init__.py +1 -0
  98. htmlgraph/cli_commands/feature.py +195 -0
  99. htmlgraph/cli_framework.py +115 -0
  100. htmlgraph/collections/__init__.py +2 -0
  101. htmlgraph/collections/base.py +197 -14
  102. htmlgraph/collections/bug.py +2 -1
  103. htmlgraph/collections/chore.py +2 -1
  104. htmlgraph/collections/epic.py +2 -1
  105. htmlgraph/collections/feature.py +2 -1
  106. htmlgraph/collections/insight.py +2 -1
  107. htmlgraph/collections/metric.py +2 -1
  108. htmlgraph/collections/pattern.py +2 -1
  109. htmlgraph/collections/phase.py +2 -1
  110. htmlgraph/collections/session.py +194 -0
  111. htmlgraph/collections/spike.py +13 -2
  112. htmlgraph/collections/task_delegation.py +241 -0
  113. htmlgraph/collections/todo.py +14 -1
  114. htmlgraph/collections/traces.py +487 -0
  115. htmlgraph/config/cost_models.json +56 -0
  116. htmlgraph/config.py +190 -0
  117. htmlgraph/context_analytics.py +2 -1
  118. htmlgraph/converter.py +116 -7
  119. htmlgraph/cost_analysis/__init__.py +5 -0
  120. htmlgraph/cost_analysis/analyzer.py +438 -0
  121. htmlgraph/dashboard.html +2246 -248
  122. htmlgraph/dashboard.html.backup +6592 -0
  123. htmlgraph/dashboard.html.bak +7181 -0
  124. htmlgraph/dashboard.html.bak2 +7231 -0
  125. htmlgraph/dashboard.html.bak3 +7232 -0
  126. htmlgraph/db/__init__.py +38 -0
  127. htmlgraph/db/queries.py +790 -0
  128. htmlgraph/db/schema.py +1788 -0
  129. htmlgraph/decorators.py +317 -0
  130. htmlgraph/dependency_models.py +2 -1
  131. htmlgraph/deploy.py +26 -27
  132. htmlgraph/docs/API_REFERENCE.md +841 -0
  133. htmlgraph/docs/HTTP_API.md +750 -0
  134. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  135. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  136. htmlgraph/docs/README.md +532 -0
  137. htmlgraph/docs/__init__.py +77 -0
  138. htmlgraph/docs/docs_version.py +55 -0
  139. htmlgraph/docs/metadata.py +93 -0
  140. htmlgraph/docs/migrations.py +232 -0
  141. htmlgraph/docs/template_engine.py +143 -0
  142. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  143. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  144. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  145. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  146. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  147. htmlgraph/docs/version_check.py +163 -0
  148. htmlgraph/edge_index.py +2 -1
  149. htmlgraph/error_handler.py +544 -0
  150. htmlgraph/event_log.py +86 -37
  151. htmlgraph/event_migration.py +2 -1
  152. htmlgraph/file_watcher.py +12 -8
  153. htmlgraph/find_api.py +2 -1
  154. htmlgraph/git_events.py +67 -9
  155. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  156. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  157. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  158. htmlgraph/hooks/__init__.py +8 -0
  159. htmlgraph/hooks/bootstrap.py +169 -0
  160. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  161. htmlgraph/hooks/concurrent_sessions.py +208 -0
  162. htmlgraph/hooks/context.py +350 -0
  163. htmlgraph/hooks/drift_handler.py +525 -0
  164. htmlgraph/hooks/event_tracker.py +790 -99
  165. htmlgraph/hooks/git_commands.py +175 -0
  166. htmlgraph/hooks/installer.py +5 -1
  167. htmlgraph/hooks/orchestrator.py +327 -76
  168. htmlgraph/hooks/orchestrator_reflector.py +31 -4
  169. htmlgraph/hooks/post_tool_use_failure.py +32 -7
  170. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  171. htmlgraph/hooks/posttooluse.py +92 -19
  172. htmlgraph/hooks/pretooluse.py +527 -7
  173. htmlgraph/hooks/prompt_analyzer.py +637 -0
  174. htmlgraph/hooks/session_handler.py +668 -0
  175. htmlgraph/hooks/session_summary.py +395 -0
  176. htmlgraph/hooks/state_manager.py +504 -0
  177. htmlgraph/hooks/subagent_detection.py +202 -0
  178. htmlgraph/hooks/subagent_stop.py +369 -0
  179. htmlgraph/hooks/task_enforcer.py +99 -4
  180. htmlgraph/hooks/validator.py +212 -91
  181. htmlgraph/ids.py +2 -1
  182. htmlgraph/learning.py +125 -100
  183. htmlgraph/mcp_server.py +2 -1
  184. htmlgraph/models.py +217 -18
  185. htmlgraph/operations/README.md +62 -0
  186. htmlgraph/operations/__init__.py +79 -0
  187. htmlgraph/operations/analytics.py +339 -0
  188. htmlgraph/operations/bootstrap.py +289 -0
  189. htmlgraph/operations/events.py +244 -0
  190. htmlgraph/operations/fastapi_server.py +231 -0
  191. htmlgraph/operations/hooks.py +350 -0
  192. htmlgraph/operations/initialization.py +597 -0
  193. htmlgraph/operations/initialization.py.backup +228 -0
  194. htmlgraph/operations/server.py +303 -0
  195. htmlgraph/orchestration/__init__.py +58 -0
  196. htmlgraph/orchestration/claude_launcher.py +179 -0
  197. htmlgraph/orchestration/command_builder.py +72 -0
  198. htmlgraph/orchestration/headless_spawner.py +281 -0
  199. htmlgraph/orchestration/live_events.py +377 -0
  200. htmlgraph/orchestration/model_selection.py +327 -0
  201. htmlgraph/orchestration/plugin_manager.py +140 -0
  202. htmlgraph/orchestration/prompts.py +137 -0
  203. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  204. htmlgraph/orchestration/spawners/__init__.py +16 -0
  205. htmlgraph/orchestration/spawners/base.py +194 -0
  206. htmlgraph/orchestration/spawners/claude.py +173 -0
  207. htmlgraph/orchestration/spawners/codex.py +435 -0
  208. htmlgraph/orchestration/spawners/copilot.py +294 -0
  209. htmlgraph/orchestration/spawners/gemini.py +471 -0
  210. htmlgraph/orchestration/subprocess_runner.py +36 -0
  211. htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
  212. htmlgraph/orchestration.md +563 -0
  213. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  214. htmlgraph/orchestrator.py +2 -1
  215. htmlgraph/orchestrator_config.py +357 -0
  216. htmlgraph/orchestrator_mode.py +115 -4
  217. htmlgraph/parallel.py +2 -1
  218. htmlgraph/parser.py +86 -6
  219. htmlgraph/path_query.py +608 -0
  220. htmlgraph/pattern_matcher.py +636 -0
  221. htmlgraph/pydantic_models.py +476 -0
  222. htmlgraph/quality_gates.py +350 -0
  223. htmlgraph/query_builder.py +2 -1
  224. htmlgraph/query_composer.py +509 -0
  225. htmlgraph/reflection.py +443 -0
  226. htmlgraph/refs.py +344 -0
  227. htmlgraph/repo_hash.py +512 -0
  228. htmlgraph/repositories/__init__.py +292 -0
  229. htmlgraph/repositories/analytics_repository.py +455 -0
  230. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  231. htmlgraph/repositories/feature_repository.py +581 -0
  232. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  233. htmlgraph/repositories/feature_repository_memory.py +607 -0
  234. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  235. htmlgraph/repositories/filter_service.py +620 -0
  236. htmlgraph/repositories/filter_service_standard.py +445 -0
  237. htmlgraph/repositories/shared_cache.py +621 -0
  238. htmlgraph/repositories/shared_cache_memory.py +395 -0
  239. htmlgraph/repositories/track_repository.py +552 -0
  240. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  241. htmlgraph/repositories/track_repository_memory.py +508 -0
  242. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  243. htmlgraph/sdk/__init__.py +398 -0
  244. htmlgraph/sdk/__init__.pyi +14 -0
  245. htmlgraph/sdk/analytics/__init__.py +19 -0
  246. htmlgraph/sdk/analytics/engine.py +155 -0
  247. htmlgraph/sdk/analytics/helpers.py +178 -0
  248. htmlgraph/sdk/analytics/registry.py +109 -0
  249. htmlgraph/sdk/base.py +484 -0
  250. htmlgraph/sdk/constants.py +216 -0
  251. htmlgraph/sdk/core.pyi +308 -0
  252. htmlgraph/sdk/discovery.py +120 -0
  253. htmlgraph/sdk/help/__init__.py +12 -0
  254. htmlgraph/sdk/help/mixin.py +699 -0
  255. htmlgraph/sdk/mixins/__init__.py +15 -0
  256. htmlgraph/sdk/mixins/attribution.py +113 -0
  257. htmlgraph/sdk/mixins/mixin.py +410 -0
  258. htmlgraph/sdk/operations/__init__.py +12 -0
  259. htmlgraph/sdk/operations/mixin.py +427 -0
  260. htmlgraph/sdk/orchestration/__init__.py +17 -0
  261. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  262. htmlgraph/sdk/orchestration/spawner.py +204 -0
  263. htmlgraph/sdk/planning/__init__.py +19 -0
  264. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  265. htmlgraph/sdk/planning/mixin.py +211 -0
  266. htmlgraph/sdk/planning/parallel.py +186 -0
  267. htmlgraph/sdk/planning/queue.py +210 -0
  268. htmlgraph/sdk/planning/recommendations.py +87 -0
  269. htmlgraph/sdk/planning/smart_planning.py +319 -0
  270. htmlgraph/sdk/session/__init__.py +19 -0
  271. htmlgraph/sdk/session/continuity.py +57 -0
  272. htmlgraph/sdk/session/handoff.py +110 -0
  273. htmlgraph/sdk/session/info.py +309 -0
  274. htmlgraph/sdk/session/manager.py +103 -0
  275. htmlgraph/sdk/strategic/__init__.py +26 -0
  276. htmlgraph/sdk/strategic/mixin.py +563 -0
  277. htmlgraph/server.py +295 -107
  278. htmlgraph/session_hooks.py +300 -0
  279. htmlgraph/session_manager.py +285 -3
  280. htmlgraph/session_registry.py +587 -0
  281. htmlgraph/session_state.py +436 -0
  282. htmlgraph/session_warning.py +2 -1
  283. htmlgraph/sessions/__init__.py +23 -0
  284. htmlgraph/sessions/handoff.py +756 -0
  285. htmlgraph/system_prompts.py +450 -0
  286. htmlgraph/templates/orchestration-view.html +350 -0
  287. htmlgraph/track_builder.py +33 -1
  288. htmlgraph/track_manager.py +38 -0
  289. htmlgraph/transcript.py +18 -5
  290. htmlgraph/validation.py +115 -0
  291. htmlgraph/watch.py +2 -1
  292. htmlgraph/work_type_utils.py +2 -1
  293. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
  294. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
  295. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  296. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  297. htmlgraph/cli.py +0 -4839
  298. htmlgraph/sdk.py +0 -2359
  299. htmlgraph-0.20.1.dist-info/RECORD +0 -118
  300. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  301. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  302. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  303. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  304. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -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
- pass
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.
@@ -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
- pass
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.
@@ -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
- pass
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.
@@ -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
 
@@ -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
@@ -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
@@ -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
- pass
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.
@@ -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
- self._data["findings"] = findings
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:
@@ -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
+ ]