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
@@ -0,0 +1,699 @@
1
+ """
2
+ Help mixin for SDK - documentation and discoverability.
3
+
4
+ Provides comprehensive help system for SDK methods and collections.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+
10
+ class HelpMixin:
11
+ """
12
+ Mixin providing help and documentation capabilities to SDK.
13
+
14
+ Adds methods for getting help on SDK usage and improved discoverability.
15
+ """
16
+
17
+ def help(self, topic: str | None = None) -> str:
18
+ """
19
+ Get help on SDK usage.
20
+
21
+ Args:
22
+ topic: Optional topic (e.g., 'features', 'sessions', 'analytics', 'orchestration')
23
+
24
+ Returns:
25
+ Formatted help text
26
+
27
+ Example:
28
+ >>> sdk = SDK(agent="claude")
29
+ >>> print(sdk.help()) # List all topics
30
+ >>> print(sdk.help('features')) # Feature collection help
31
+ >>> print(sdk.help('analytics')) # Analytics help
32
+
33
+ See also:
34
+ Python's built-in help(sdk) for full API documentation
35
+ sdk.features, sdk.bugs, sdk.spikes for work item managers
36
+ """
37
+ if topic is None:
38
+ return self._help_index()
39
+ return self._help_topic(topic)
40
+
41
+ def _help_index(self) -> str:
42
+ """Return overview of all available methods/collections."""
43
+ return """HtmlGraph SDK - Quick Reference
44
+
45
+ COLLECTIONS (Work Items):
46
+ sdk.features - Feature work items with builder support
47
+ sdk.bugs - Bug reports
48
+ sdk.spikes - Investigation and research spikes
49
+ sdk.chores - Maintenance and chore tasks
50
+ sdk.epics - Large bodies of work
51
+ sdk.phases - Project phases
52
+
53
+ COLLECTIONS (Non-Work):
54
+ sdk.sessions - Agent sessions
55
+ sdk.tracks - Work tracks with builder support
56
+ sdk.agents - Agent information
57
+
58
+ LEARNING (Active Learning):
59
+ sdk.patterns - Workflow patterns (optimal/anti-pattern)
60
+ sdk.insights - Session health insights
61
+ sdk.metrics - Aggregated time-series metrics
62
+
63
+ CORE METHODS:
64
+ sdk.summary() - Get project summary
65
+ sdk.my_work() - Get current agent's workload
66
+ sdk.next_task() - Get next available task
67
+ sdk.reload() - Reload all data from disk
68
+
69
+ SESSION MANAGEMENT:
70
+ sdk.start_session() - Start a new session
71
+ sdk.end_session() - End a session
72
+ sdk.track_activity() - Track activity in session
73
+ sdk.dedupe_sessions() - Clean up low-signal sessions
74
+ sdk.get_status() - Get project status
75
+
76
+ STRATEGIC ANALYTICS:
77
+ sdk.find_bottlenecks() - Identify blocking tasks
78
+ sdk.recommend_next_work() - Get smart recommendations
79
+ sdk.get_parallel_work() - Find parallelizable work
80
+ sdk.assess_risks() - Assess dependency risks
81
+ sdk.analyze_impact() - Analyze task impact
82
+
83
+ WORK QUEUE:
84
+ sdk.get_work_queue() - Get prioritized work queue
85
+ sdk.work_next() - Get next best task (smart routing)
86
+
87
+ PLANNING WORKFLOW:
88
+ sdk.smart_plan() - Smart planning with research
89
+ sdk.start_planning_spike() - Create planning spike
90
+ sdk.create_track_from_plan() - Create track from plan
91
+ sdk.plan_parallel_work() - Plan parallel execution
92
+ sdk.aggregate_parallel_results() - Aggregate parallel results
93
+
94
+ ORCHESTRATION:
95
+ sdk.spawn_explorer() - Spawn explorer subagent
96
+ sdk.spawn_coder() - Spawn coder subagent
97
+ sdk.orchestrate() - Orchestrate feature implementation
98
+
99
+ SESSION OPTIMIZATION:
100
+ sdk.get_session_start_info() - Get comprehensive session start info
101
+ sdk.get_active_work_item() - Get currently active work item
102
+
103
+ ANALYTICS INTERFACES:
104
+ sdk.analytics - Work type analytics
105
+ sdk.dep_analytics - Dependency analytics
106
+ sdk.context - Context analytics
107
+
108
+ OPERATIONS (Server, Hooks, Events):
109
+ sdk.start_server() - Start web server for graph browsing
110
+ sdk.stop_server() - Stop running server
111
+ sdk.install_hooks() - Install Git hooks for tracking
112
+ sdk.list_hooks() - List Git hooks status
113
+ sdk.export_sessions() - Export HTML sessions to JSONL
114
+ sdk.rebuild_event_index() - Rebuild SQLite index from events
115
+ sdk.query_events() - Query JSONL event logs
116
+ sdk.get_event_stats() - Get event statistics
117
+ sdk.analyze_session() - Analyze single session metrics
118
+ sdk.analyze_project() - Analyze project-wide metrics
119
+ sdk.get_work_recommendations() - Get work recommendations
120
+
121
+ ERROR HANDLING:
122
+ Lookup (.get) - Returns None if not found
123
+ Query (.where) - Returns empty list on no matches
124
+ Edit (.edit) - Raises NodeNotFoundError if missing
125
+ Batch (.mark_done) - Returns dict with success_count, failed_ids, warnings
126
+
127
+ For detailed help on a topic:
128
+ sdk.help('features') - Feature collection methods
129
+ sdk.help('analytics') - Analytics methods
130
+ sdk.help('sessions') - Session management
131
+ sdk.help('orchestration') - Subagent orchestration
132
+ sdk.help('planning') - Planning workflow
133
+ sdk.help('operations') - Server, hooks, events operations
134
+ """
135
+
136
+ def __dir__(self) -> list[str]:
137
+ """Return attributes with most useful ones first for discoverability."""
138
+ priority = [
139
+ # Work item managers
140
+ "features",
141
+ "bugs",
142
+ "spikes",
143
+ "chores",
144
+ "epics",
145
+ "phases",
146
+ # Non-work collections
147
+ "tracks",
148
+ "sessions",
149
+ "agents",
150
+ # Learning collections
151
+ "patterns",
152
+ "insights",
153
+ "metrics",
154
+ # Orchestration
155
+ "spawn_explorer",
156
+ "spawn_coder",
157
+ "orchestrate",
158
+ # Session management
159
+ "get_session_start_info",
160
+ "start_session",
161
+ "end_session",
162
+ # Strategic analytics
163
+ "find_bottlenecks",
164
+ "recommend_next_work",
165
+ "get_parallel_work",
166
+ # Work queue
167
+ "get_work_queue",
168
+ "work_next",
169
+ # Operations
170
+ "start_server",
171
+ "install_hooks",
172
+ "export_sessions",
173
+ "analyze_project",
174
+ # Help
175
+ "help",
176
+ ]
177
+ # Get all attributes
178
+ all_attrs = object.__dir__(self)
179
+ # Separate into priority, regular, and dunder attributes
180
+ regular = [a for a in all_attrs if not a.startswith("_") and a not in priority]
181
+ dunder = [a for a in all_attrs if a.startswith("_")]
182
+ # Return priority items first, then regular, then dunder
183
+ return priority + regular + dunder
184
+
185
+ def _help_topic(self, topic: str) -> str:
186
+ """Return specific help for topic."""
187
+ topic = topic.lower()
188
+
189
+ if topic in ["feature", "features"]:
190
+ return """FEATURES COLLECTION
191
+
192
+ Create and manage feature work items with builder support.
193
+
194
+ COMMON METHODS:
195
+ sdk.features.create(title) - Create new feature (returns builder)
196
+ sdk.features.get(id) - Get feature by ID
197
+ sdk.features.all() - Get all features
198
+ sdk.features.where(**filters) - Query features
199
+ sdk.features.edit(id) - Edit feature (context manager)
200
+ sdk.features.mark_done(ids) - Mark features as done
201
+ sdk.features.assign(ids, agent) - Assign features to agent
202
+
203
+ BUILDER PATTERN:
204
+ feature = (sdk.features.create("User Auth")
205
+ .set_priority("high")
206
+ .add_steps(["Login", "Logout", "Reset password"])
207
+ .add_edge("blocked_by", "feat-database")
208
+ .save())
209
+
210
+ QUERIES:
211
+ high_priority = sdk.features.where(status="todo", priority="high")
212
+ my_features = sdk.features.where(agent_assigned="claude")
213
+ blocked = sdk.features.where(status="blocked")
214
+
215
+ CONTEXT MANAGER:
216
+ with sdk.features.edit("feat-001") as f:
217
+ f.status = "in-progress"
218
+ f.complete_step(0)
219
+ # Auto-saves on exit
220
+
221
+ BATCH OPERATIONS:
222
+ result = sdk.features.mark_done(["feat-001", "feat-002"])
223
+ logger.info(f"Completed {result['success_count']} features")
224
+ if result['failed_ids']:
225
+ logger.info(f"Failed: {result['failed_ids']}")
226
+
227
+ COMMON MISTAKES:
228
+ sdk.features.mark_complete([ids]) -> sdk.features.mark_done([ids])
229
+ sdk.feature.create(...) -> sdk.features.create(...)
230
+ claim(id, agent_id=...) -> claim(id, agent=...)
231
+ builder.status = "done" -> builder.save(); then edit()
232
+
233
+ See also: sdk.help('bugs'), sdk.help('spikes'), sdk.help('chores')
234
+ """
235
+
236
+ elif topic in ["bug", "bugs"]:
237
+ return """BUGS COLLECTION
238
+
239
+ Create and manage bug reports.
240
+
241
+ COMMON METHODS:
242
+ sdk.bugs.create(title) - Create new bug (returns builder)
243
+ sdk.bugs.get(id) - Get bug by ID
244
+ sdk.bugs.all() - Get all bugs
245
+ sdk.bugs.where(**filters) - Query bugs
246
+ sdk.bugs.edit(id) - Edit bug (context manager)
247
+
248
+ BUILDER PATTERN:
249
+ bug = (sdk.bugs.create("Login fails on Safari")
250
+ .set_priority("critical")
251
+ .add_steps(["Reproduce", "Fix", "Test"])
252
+ .save())
253
+
254
+ QUERIES:
255
+ critical = sdk.bugs.where(priority="critical", status="todo")
256
+ my_bugs = sdk.bugs.where(agent_assigned="claude")
257
+
258
+ See also: sdk.help('features'), sdk.help('spikes')
259
+ """
260
+
261
+ elif topic in ["spike", "spikes"]:
262
+ return """SPIKES COLLECTION
263
+
264
+ Create and manage investigation/research spikes.
265
+
266
+ COMMON METHODS:
267
+ sdk.spikes.create(title) - Create new spike (returns builder)
268
+ sdk.spikes.get(id) - Get spike by ID
269
+ sdk.spikes.all() - Get all spikes
270
+ sdk.spikes.where(**filters) - Query spikes
271
+
272
+ BUILDER PATTERN:
273
+ spike = (sdk.spikes.create("Research OAuth providers")
274
+ .set_priority("high")
275
+ .add_steps(["Research", "Document findings"])
276
+ .save())
277
+
278
+ PLANNING SPIKES:
279
+ spike = sdk.start_planning_spike(
280
+ "Plan User Auth",
281
+ context="Users need login",
282
+ timebox_hours=4.0
283
+ )
284
+
285
+ See also: sdk.help('planning'), sdk.help('features')
286
+ """
287
+
288
+ elif topic in ["chore", "chores"]:
289
+ return """CHORES COLLECTION
290
+
291
+ Create and manage maintenance and chore tasks.
292
+
293
+ COMMON METHODS:
294
+ sdk.chores.create(title) - Create new chore (returns builder)
295
+ sdk.chores.get(id) - Get chore by ID
296
+ sdk.chores.all() - Get all chores
297
+ sdk.chores.where(**filters) - Query chores
298
+
299
+ BUILDER PATTERN:
300
+ chore = (sdk.chores.create("Update dependencies")
301
+ .set_priority("medium")
302
+ .add_steps(["Run uv update", "Test", "Commit"])
303
+ .save())
304
+
305
+ See also: sdk.help('features'), sdk.help('bugs')
306
+ """
307
+
308
+ elif topic in ["epic", "epics"]:
309
+ return """EPICS COLLECTION
310
+
311
+ Create and manage large bodies of work.
312
+
313
+ COMMON METHODS:
314
+ sdk.epics.create(title) - Create new epic (returns builder)
315
+ sdk.epics.get(id) - Get epic by ID
316
+ sdk.epics.all() - Get all epics
317
+ sdk.epics.where(**filters) - Query epics
318
+
319
+ BUILDER PATTERN:
320
+ epic = (sdk.epics.create("Authentication System")
321
+ .set_priority("critical")
322
+ .add_steps(["Design", "Implement", "Test", "Deploy"])
323
+ .save())
324
+
325
+ See also: sdk.help('features'), sdk.help('tracks')
326
+ """
327
+
328
+ elif topic in ["track", "tracks"]:
329
+ return """TRACKS COLLECTION
330
+
331
+ Create and manage work tracks with builder support.
332
+
333
+ COMMON METHODS:
334
+ sdk.tracks.create(title) - Create new track (returns builder)
335
+ sdk.tracks.builder() - Get track builder
336
+ sdk.tracks.get(id) - Get track by ID
337
+ sdk.tracks.all() - Get all tracks
338
+ sdk.tracks.where(**filters) - Query tracks
339
+
340
+ BUILDER PATTERN:
341
+ track = (sdk.tracks.builder()
342
+ .title("User Authentication")
343
+ .description("OAuth 2.0 system")
344
+ .priority("high")
345
+ .with_spec(
346
+ overview="OAuth integration",
347
+ requirements=[("OAuth 2.0", "must-have")],
348
+ acceptance_criteria=["Login works"]
349
+ )
350
+ .with_plan_phases([
351
+ ("Phase 1", ["Setup (2h)", "Config (1h)"]),
352
+ ("Phase 2", ["Testing (2h)"])
353
+ ])
354
+ .create())
355
+
356
+ FROM PLANNING:
357
+ track_info = sdk.create_track_from_plan(
358
+ title="User Auth",
359
+ description="OAuth system",
360
+ requirements=[("OAuth", "must-have")],
361
+ phases=[("Phase 1", ["Setup", "Config"])]
362
+ )
363
+
364
+ See also: sdk.help('planning'), sdk.help('features')
365
+ """
366
+
367
+ elif topic in ["session", "sessions"]:
368
+ return """SESSION MANAGEMENT
369
+
370
+ Create and manage agent sessions.
371
+
372
+ SESSION METHODS:
373
+ sdk.start_session(title=...) - Start new session
374
+ sdk.end_session(id) - End session
375
+ sdk.track_activity(...) - Track activity in session
376
+ sdk.dedupe_sessions(...) - Clean up low-signal sessions
377
+ sdk.get_status() - Get project status
378
+
379
+ SESSION COLLECTION:
380
+ sdk.sessions.get(id) - Get session by ID
381
+ sdk.sessions.all() - Get all sessions
382
+ sdk.sessions.where(**filters) - Query sessions
383
+
384
+ TYPICAL WORKFLOW:
385
+ # Session start hook handles this automatically
386
+ session = sdk.start_session(title="Fix login bug")
387
+
388
+ # Track activities (handled by hooks)
389
+ sdk.track_activity(
390
+ tool="Edit",
391
+ summary="Fixed auth logic",
392
+ file_paths=["src/auth.py"],
393
+ success=True
394
+ )
395
+
396
+ # End session
397
+ sdk.end_session(
398
+ session.id,
399
+ handoff_notes="Login bug fixed, needs testing"
400
+ )
401
+
402
+ CLEANUP:
403
+ # Remove orphaned sessions (<=1 event)
404
+ result = sdk.dedupe_sessions(max_events=1, dry_run=False)
405
+
406
+ See also: sdk.help('analytics')
407
+ """
408
+
409
+ elif topic in ["analytic", "analytics", "strategic"]:
410
+ return """STRATEGIC ANALYTICS
411
+
412
+ Find bottlenecks, recommend work, and assess risks.
413
+
414
+ DEPENDENCY ANALYTICS:
415
+ bottlenecks = sdk.find_bottlenecks(top_n=5)
416
+ # Returns tasks blocking the most work
417
+
418
+ parallel = sdk.get_parallel_work(max_agents=5)
419
+ # Returns tasks that can run simultaneously
420
+
421
+ recs = sdk.recommend_next_work(agent_count=3)
422
+ # Returns smart recommendations with scoring
423
+
424
+ risks = sdk.assess_risks()
425
+ # Returns high-risk tasks and circular deps
426
+
427
+ impact = sdk.analyze_impact("feat-001")
428
+ # Returns what unlocks if you complete this task
429
+
430
+ DIRECT ACCESS (preferred):
431
+ sdk.dep_analytics.find_bottlenecks(top_n=5)
432
+ sdk.dep_analytics.recommend_next_tasks(agent_count=3)
433
+ sdk.dep_analytics.find_parallelizable_work(status="todo")
434
+ sdk.dep_analytics.assess_dependency_risk()
435
+ sdk.dep_analytics.impact_analysis("feat-001")
436
+
437
+ WORK TYPE ANALYTICS:
438
+ sdk.analytics.get_wip_by_type()
439
+ sdk.analytics.get_completion_rates()
440
+ sdk.analytics.get_agent_workload()
441
+
442
+ CONTEXT ANALYTICS:
443
+ sdk.context.track_usage(...)
444
+ sdk.context.get_usage_report()
445
+
446
+ See also: sdk.help('planning'), sdk.help('work_queue')
447
+ """
448
+
449
+ elif topic in ["queue", "work_queue", "routing"]:
450
+ return """WORK QUEUE & ROUTING
451
+
452
+ Get prioritized work using smart routing.
453
+
454
+ WORK QUEUE:
455
+ queue = sdk.get_work_queue(limit=10, min_score=0.0)
456
+ # Returns prioritized list with scores
457
+
458
+ for item in queue:
459
+ logger.info(f"{item['score']:.1f} - {item['title']}")
460
+ if item.get('blocked_by'):
461
+ logger.info(f" Blocked by: {item['blocked_by']}")
462
+
463
+ SMART ROUTING:
464
+ task = sdk.work_next(auto_claim=True, min_score=0.5)
465
+ # Returns next best task using analytics + capabilities
466
+
467
+ if task:
468
+ logger.info(f"Working on: {task.title}")
469
+ # Task is auto-claimed and assigned
470
+
471
+ SIMPLE NEXT TASK:
472
+ task = sdk.next_task(priority="high", auto_claim=True)
473
+ # Simpler version without smart routing
474
+
475
+ See also: sdk.help('analytics')
476
+ """
477
+
478
+ elif topic in ["plan", "planning", "workflow"]:
479
+ return """PLANNING WORKFLOW
480
+
481
+ Research, plan, and create tracks for new work.
482
+
483
+ SMART PLANNING:
484
+ plan = sdk.smart_plan(
485
+ "User authentication system",
486
+ create_spike=True,
487
+ timebox_hours=4.0,
488
+ research_completed=True, # IMPORTANT: Do research first!
489
+ research_findings={
490
+ "topic": "OAuth 2.0 best practices",
491
+ "recommended_library": "authlib",
492
+ "key_insights": ["Use PKCE", "Token rotation"]
493
+ }
494
+ )
495
+
496
+ PLANNING SPIKE:
497
+ spike = sdk.start_planning_spike(
498
+ "Plan Real-time Notifications",
499
+ context="Users need live updates",
500
+ timebox_hours=3.0
501
+ )
502
+
503
+ CREATE TRACK FROM PLAN:
504
+ track_info = sdk.create_track_from_plan(
505
+ title="User Authentication",
506
+ description="OAuth 2.0 with JWT",
507
+ requirements=[
508
+ ("OAuth 2.0 integration", "must-have"),
509
+ ("JWT token management", "must-have")
510
+ ],
511
+ phases=[
512
+ ("Phase 1: OAuth", ["Setup (2h)", "Callback (2h)"]),
513
+ ("Phase 2: JWT", ["Token signing (2h)"])
514
+ ]
515
+ )
516
+
517
+ PARALLEL PLANNING:
518
+ plan = sdk.plan_parallel_work(max_agents=3)
519
+ if plan["can_parallelize"]:
520
+ for p in plan["prompts"]:
521
+ Task(prompt=p["prompt"])
522
+
523
+ # After parallel work completes
524
+ results = sdk.aggregate_parallel_results([
525
+ "agent-1", "agent-2", "agent-3"
526
+ ])
527
+
528
+ See also: sdk.help('tracks'), sdk.help('spikes')
529
+ """
530
+
531
+ elif topic in ["orchestration", "orchestrate", "subagent", "subagents"]:
532
+ return """SUBAGENT ORCHESTRATION
533
+
534
+ Spawn explorer and coder subagents for complex work.
535
+
536
+ EXPLORER (Discovery):
537
+ prompt = sdk.spawn_explorer(
538
+ task="Find all API endpoints",
539
+ scope="src/api/",
540
+ patterns=["*.py"],
541
+ questions=["What framework is used?"]
542
+ )
543
+ # Execute with Task tool
544
+ Task(prompt=prompt["prompt"], description=prompt["description"])
545
+
546
+ CODER (Implementation):
547
+ prompt = sdk.spawn_coder(
548
+ feature_id="feat-add-auth",
549
+ context=explorer_results,
550
+ files_to_modify=["src/auth.py"],
551
+ test_command="uv run pytest tests/auth/"
552
+ )
553
+ Task(prompt=prompt["prompt"], description=prompt["description"])
554
+
555
+ FULL ORCHESTRATION:
556
+ prompts = sdk.orchestrate(
557
+ "feat-add-caching",
558
+ exploration_scope="src/cache/",
559
+ test_command="uv run pytest tests/cache/"
560
+ )
561
+
562
+ # Phase 1: Explorer
563
+ Task(prompt=prompts["explorer"]["prompt"])
564
+
565
+ # Phase 2: Coder (with explorer results)
566
+ Task(prompt=prompts["coder"]["prompt"])
567
+
568
+ WORKFLOW:
569
+ 1. Explorer discovers code patterns and files
570
+ 2. Coder implements changes using explorer findings
571
+ 3. Both agents auto-track in sessions
572
+ 4. Feature gets updated with progress
573
+
574
+ See also: sdk.help('planning')
575
+ """
576
+
577
+ elif topic in ["optimization", "session_start", "active_work"]:
578
+ return """SESSION OPTIMIZATION
579
+
580
+ Reduce context usage with optimized methods.
581
+
582
+ SESSION START INFO:
583
+ info = sdk.get_session_start_info(
584
+ include_git_log=True,
585
+ git_log_count=5,
586
+ analytics_top_n=3
587
+ )
588
+
589
+ # Single call returns:
590
+ # - status: Project status
591
+ # - active_work: Current work item
592
+ # - features: All features
593
+ # - sessions: Recent sessions
594
+ # - git_log: Recent commits
595
+ # - analytics: Bottlenecks, recommendations, parallel
596
+
597
+ ACTIVE WORK ITEM:
598
+ active = sdk.get_active_work_item()
599
+ if active:
600
+ logger.info(f"Working on: {active['title']}")
601
+ logger.info(f"Progress: {active['steps_completed']}/{active['steps_total']}")
602
+
603
+ # Filter by agent
604
+ active = sdk.get_active_work_item(filter_by_agent=True)
605
+
606
+ BENEFITS:
607
+ - 6+ tool calls -> 1 method call
608
+ - Reduced token usage
609
+ - Faster session initialization
610
+ - All context in one place
611
+
612
+ See also: sdk.help('sessions')
613
+ """
614
+
615
+ elif topic in ["operation", "operations", "server", "hooks", "events"]:
616
+ return """OPERATIONS - Server, Hooks, Events
617
+
618
+ Infrastructure operations for running HtmlGraph.
619
+
620
+ SERVER OPERATIONS:
621
+ # Start server for web UI
622
+ result = sdk.start_server(port=8080, watch=True)
623
+ logger.info(f"Server at {result.handle.url}")
624
+
625
+ # Stop server
626
+ sdk.stop_server(result.handle)
627
+
628
+ # Check status
629
+ status = sdk.get_server_status(result.handle)
630
+
631
+ HOOK OPERATIONS:
632
+ # Install Git hooks for automatic tracking
633
+ result = sdk.install_hooks()
634
+ logger.info(f"Installed: {result.installed}")
635
+
636
+ # List hook status
637
+ result = sdk.list_hooks()
638
+ logger.info(f"Enabled: {result.enabled}")
639
+ logger.info(f"Missing: {result.missing}")
640
+
641
+ # Validate configuration
642
+ result = sdk.validate_hook_config()
643
+ if not result.valid:
644
+ logger.info(f"Errors: {result.errors}")
645
+
646
+ EVENT OPERATIONS:
647
+ # Export HTML sessions to JSONL
648
+ result = sdk.export_sessions()
649
+ logger.info(f"Exported {result.written} sessions")
650
+
651
+ # Rebuild SQLite index
652
+ result = sdk.rebuild_event_index()
653
+ logger.info(f"Inserted {result.inserted} events")
654
+
655
+ # Query events
656
+ result = sdk.query_events(
657
+ session_id="sess-123",
658
+ tool="Bash",
659
+ limit=10
660
+ )
661
+ for event in result.events:
662
+ logger.info(f"{event['timestamp']}: {event['summary']}")
663
+
664
+ # Get statistics
665
+ stats = sdk.get_event_stats()
666
+ logger.info(f"Total events: {stats.total_events}")
667
+
668
+ ANALYTICS OPERATIONS:
669
+ # Analyze session
670
+ result = sdk.analyze_session("sess-123")
671
+ logger.info(f"Primary work: {result.metrics['primary_work_type']}")
672
+
673
+ # Analyze project
674
+ result = sdk.analyze_project()
675
+ logger.info(f"Total sessions: {result.metrics['total_sessions']}")
676
+ logger.info(f"Work distribution: {result.metrics['work_distribution']}")
677
+
678
+ # Get recommendations
679
+ result = sdk.get_work_recommendations()
680
+ for rec in result.recommendations:
681
+ logger.info(f"{rec['title']} (score: {rec['score']})")
682
+
683
+ See also: sdk.help('analytics'), sdk.help('sessions')
684
+ """
685
+
686
+ else:
687
+ return f"""Unknown topic: '{topic}'
688
+
689
+ Available topics:
690
+ - features, bugs, spikes, chores, epics (work collections)
691
+ - tracks, sessions, agents (non-work collections)
692
+ - analytics, strategic (dependency and work analytics)
693
+ - work_queue, routing (smart task routing)
694
+ - planning, workflow (planning and track creation)
695
+ - orchestration, subagents (explorer/coder spawning)
696
+ - optimization, session_start (context optimization)
697
+
698
+ Try: sdk.help() for full overview
699
+ """
@@ -0,0 +1,15 @@
1
+ """
2
+ Core mixins module for SDK - essential methods and utilities.
3
+
4
+ Provides:
5
+ - CoreMixin: Database, refs, export, and utility methods
6
+ - TaskAttributionMixin: Task attribution for subagent tracking
7
+ """
8
+
9
+ from htmlgraph.sdk.mixins.attribution import TaskAttributionMixin
10
+ from htmlgraph.sdk.mixins.mixin import CoreMixin
11
+
12
+ __all__ = [
13
+ "CoreMixin",
14
+ "TaskAttributionMixin",
15
+ ]