htmlgraph 0.9.3__py3-none-any.whl → 0.27.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) 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 +173 -17
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +127 -0
  7. htmlgraph/agent_registry.py +45 -30
  8. htmlgraph/agents.py +160 -107
  9. htmlgraph/analytics/__init__.py +9 -2
  10. htmlgraph/analytics/cli.py +190 -51
  11. htmlgraph/analytics/cost_analyzer.py +391 -0
  12. htmlgraph/analytics/cost_monitor.py +664 -0
  13. htmlgraph/analytics/cost_reporter.py +675 -0
  14. htmlgraph/analytics/cross_session.py +617 -0
  15. htmlgraph/analytics/dependency.py +192 -100
  16. htmlgraph/analytics/pattern_learning.py +771 -0
  17. htmlgraph/analytics/session_graph.py +707 -0
  18. htmlgraph/analytics/strategic/__init__.py +80 -0
  19. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  20. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  21. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  22. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  23. htmlgraph/analytics/work_type.py +190 -14
  24. htmlgraph/analytics_index.py +135 -51
  25. htmlgraph/api/__init__.py +3 -0
  26. htmlgraph/api/cost_alerts_websocket.py +416 -0
  27. htmlgraph/api/main.py +2498 -0
  28. htmlgraph/api/static/htmx.min.js +1 -0
  29. htmlgraph/api/static/style-redesign.css +1344 -0
  30. htmlgraph/api/static/style.css +1079 -0
  31. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  32. htmlgraph/api/templates/dashboard.html +794 -0
  33. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  34. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  35. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  36. htmlgraph/api/templates/partials/agents.html +317 -0
  37. htmlgraph/api/templates/partials/event-traces.html +373 -0
  38. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  39. htmlgraph/api/templates/partials/features.html +578 -0
  40. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  41. htmlgraph/api/templates/partials/metrics.html +346 -0
  42. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  43. htmlgraph/api/templates/partials/orchestration.html +198 -0
  44. htmlgraph/api/templates/partials/spawners.html +375 -0
  45. htmlgraph/api/templates/partials/work-items.html +613 -0
  46. htmlgraph/api/websocket.py +538 -0
  47. htmlgraph/archive/__init__.py +24 -0
  48. htmlgraph/archive/bloom.py +234 -0
  49. htmlgraph/archive/fts.py +297 -0
  50. htmlgraph/archive/manager.py +583 -0
  51. htmlgraph/archive/search.py +244 -0
  52. htmlgraph/atomic_ops.py +560 -0
  53. htmlgraph/attribute_index.py +208 -0
  54. htmlgraph/bounded_paths.py +539 -0
  55. htmlgraph/builders/__init__.py +14 -0
  56. htmlgraph/builders/base.py +118 -29
  57. htmlgraph/builders/bug.py +150 -0
  58. htmlgraph/builders/chore.py +119 -0
  59. htmlgraph/builders/epic.py +150 -0
  60. htmlgraph/builders/feature.py +31 -6
  61. htmlgraph/builders/insight.py +195 -0
  62. htmlgraph/builders/metric.py +217 -0
  63. htmlgraph/builders/pattern.py +202 -0
  64. htmlgraph/builders/phase.py +162 -0
  65. htmlgraph/builders/spike.py +52 -19
  66. htmlgraph/builders/track.py +148 -72
  67. htmlgraph/cigs/__init__.py +81 -0
  68. htmlgraph/cigs/autonomy.py +385 -0
  69. htmlgraph/cigs/cost.py +475 -0
  70. htmlgraph/cigs/messages_basic.py +472 -0
  71. htmlgraph/cigs/messaging.py +365 -0
  72. htmlgraph/cigs/models.py +771 -0
  73. htmlgraph/cigs/pattern_storage.py +427 -0
  74. htmlgraph/cigs/patterns.py +503 -0
  75. htmlgraph/cigs/posttool_analyzer.py +234 -0
  76. htmlgraph/cigs/reporter.py +818 -0
  77. htmlgraph/cigs/tracker.py +317 -0
  78. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  79. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  80. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  81. htmlgraph/cli/__init__.py +42 -0
  82. htmlgraph/cli/__main__.py +6 -0
  83. htmlgraph/cli/analytics.py +1424 -0
  84. htmlgraph/cli/base.py +685 -0
  85. htmlgraph/cli/constants.py +206 -0
  86. htmlgraph/cli/core.py +954 -0
  87. htmlgraph/cli/main.py +147 -0
  88. htmlgraph/cli/models.py +475 -0
  89. htmlgraph/cli/templates/__init__.py +1 -0
  90. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  91. htmlgraph/cli/work/__init__.py +239 -0
  92. htmlgraph/cli/work/browse.py +115 -0
  93. htmlgraph/cli/work/features.py +568 -0
  94. htmlgraph/cli/work/orchestration.py +676 -0
  95. htmlgraph/cli/work/report.py +728 -0
  96. htmlgraph/cli/work/sessions.py +466 -0
  97. htmlgraph/cli/work/snapshot.py +559 -0
  98. htmlgraph/cli/work/tracks.py +486 -0
  99. htmlgraph/cli_commands/__init__.py +1 -0
  100. htmlgraph/cli_commands/feature.py +195 -0
  101. htmlgraph/cli_framework.py +115 -0
  102. htmlgraph/collections/__init__.py +18 -0
  103. htmlgraph/collections/base.py +415 -98
  104. htmlgraph/collections/bug.py +53 -0
  105. htmlgraph/collections/chore.py +53 -0
  106. htmlgraph/collections/epic.py +53 -0
  107. htmlgraph/collections/feature.py +12 -26
  108. htmlgraph/collections/insight.py +100 -0
  109. htmlgraph/collections/metric.py +92 -0
  110. htmlgraph/collections/pattern.py +97 -0
  111. htmlgraph/collections/phase.py +53 -0
  112. htmlgraph/collections/session.py +194 -0
  113. htmlgraph/collections/spike.py +56 -16
  114. htmlgraph/collections/task_delegation.py +241 -0
  115. htmlgraph/collections/todo.py +511 -0
  116. htmlgraph/collections/traces.py +487 -0
  117. htmlgraph/config/cost_models.json +56 -0
  118. htmlgraph/config.py +190 -0
  119. htmlgraph/context_analytics.py +344 -0
  120. htmlgraph/converter.py +216 -28
  121. htmlgraph/cost_analysis/__init__.py +5 -0
  122. htmlgraph/cost_analysis/analyzer.py +438 -0
  123. htmlgraph/dashboard.html +2406 -307
  124. htmlgraph/dashboard.html.backup +6592 -0
  125. htmlgraph/dashboard.html.bak +7181 -0
  126. htmlgraph/dashboard.html.bak2 +7231 -0
  127. htmlgraph/dashboard.html.bak3 +7232 -0
  128. htmlgraph/db/__init__.py +38 -0
  129. htmlgraph/db/queries.py +790 -0
  130. htmlgraph/db/schema.py +1788 -0
  131. htmlgraph/decorators.py +317 -0
  132. htmlgraph/dependency_models.py +19 -2
  133. htmlgraph/deploy.py +142 -125
  134. htmlgraph/deployment_models.py +474 -0
  135. htmlgraph/docs/API_REFERENCE.md +841 -0
  136. htmlgraph/docs/HTTP_API.md +750 -0
  137. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  138. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  139. htmlgraph/docs/README.md +532 -0
  140. htmlgraph/docs/__init__.py +77 -0
  141. htmlgraph/docs/docs_version.py +55 -0
  142. htmlgraph/docs/metadata.py +93 -0
  143. htmlgraph/docs/migrations.py +232 -0
  144. htmlgraph/docs/template_engine.py +143 -0
  145. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  146. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  147. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  148. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  149. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  150. htmlgraph/docs/version_check.py +163 -0
  151. htmlgraph/edge_index.py +182 -27
  152. htmlgraph/error_handler.py +544 -0
  153. htmlgraph/event_log.py +100 -52
  154. htmlgraph/event_migration.py +13 -4
  155. htmlgraph/exceptions.py +49 -0
  156. htmlgraph/file_watcher.py +101 -28
  157. htmlgraph/find_api.py +75 -63
  158. htmlgraph/git_events.py +145 -63
  159. htmlgraph/graph.py +1122 -106
  160. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  161. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  162. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  163. htmlgraph/hooks/__init__.py +45 -0
  164. htmlgraph/hooks/bootstrap.py +169 -0
  165. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  166. htmlgraph/hooks/concurrent_sessions.py +208 -0
  167. htmlgraph/hooks/context.py +350 -0
  168. htmlgraph/hooks/drift_handler.py +525 -0
  169. htmlgraph/hooks/event_tracker.py +1314 -0
  170. htmlgraph/hooks/git_commands.py +175 -0
  171. htmlgraph/hooks/hooks-config.example.json +12 -0
  172. htmlgraph/hooks/installer.py +343 -0
  173. htmlgraph/hooks/orchestrator.py +674 -0
  174. htmlgraph/hooks/orchestrator_reflector.py +223 -0
  175. htmlgraph/hooks/post-checkout.sh +28 -0
  176. htmlgraph/hooks/post-commit.sh +24 -0
  177. htmlgraph/hooks/post-merge.sh +26 -0
  178. htmlgraph/hooks/post_tool_use_failure.py +273 -0
  179. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  180. htmlgraph/hooks/posttooluse.py +408 -0
  181. htmlgraph/hooks/pre-commit.sh +94 -0
  182. htmlgraph/hooks/pre-push.sh +28 -0
  183. htmlgraph/hooks/pretooluse.py +819 -0
  184. htmlgraph/hooks/prompt_analyzer.py +637 -0
  185. htmlgraph/hooks/session_handler.py +668 -0
  186. htmlgraph/hooks/session_summary.py +395 -0
  187. htmlgraph/hooks/state_manager.py +504 -0
  188. htmlgraph/hooks/subagent_detection.py +202 -0
  189. htmlgraph/hooks/subagent_stop.py +369 -0
  190. htmlgraph/hooks/task_enforcer.py +255 -0
  191. htmlgraph/hooks/task_validator.py +177 -0
  192. htmlgraph/hooks/validator.py +628 -0
  193. htmlgraph/ids.py +41 -27
  194. htmlgraph/index.d.ts +286 -0
  195. htmlgraph/learning.py +767 -0
  196. htmlgraph/mcp_server.py +69 -23
  197. htmlgraph/models.py +1586 -87
  198. htmlgraph/operations/README.md +62 -0
  199. htmlgraph/operations/__init__.py +79 -0
  200. htmlgraph/operations/analytics.py +339 -0
  201. htmlgraph/operations/bootstrap.py +289 -0
  202. htmlgraph/operations/events.py +244 -0
  203. htmlgraph/operations/fastapi_server.py +231 -0
  204. htmlgraph/operations/hooks.py +350 -0
  205. htmlgraph/operations/initialization.py +597 -0
  206. htmlgraph/operations/initialization.py.backup +228 -0
  207. htmlgraph/operations/server.py +303 -0
  208. htmlgraph/orchestration/__init__.py +58 -0
  209. htmlgraph/orchestration/claude_launcher.py +179 -0
  210. htmlgraph/orchestration/command_builder.py +72 -0
  211. htmlgraph/orchestration/headless_spawner.py +281 -0
  212. htmlgraph/orchestration/live_events.py +377 -0
  213. htmlgraph/orchestration/model_selection.py +327 -0
  214. htmlgraph/orchestration/plugin_manager.py +140 -0
  215. htmlgraph/orchestration/prompts.py +137 -0
  216. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  217. htmlgraph/orchestration/spawners/__init__.py +16 -0
  218. htmlgraph/orchestration/spawners/base.py +194 -0
  219. htmlgraph/orchestration/spawners/claude.py +173 -0
  220. htmlgraph/orchestration/spawners/codex.py +435 -0
  221. htmlgraph/orchestration/spawners/copilot.py +294 -0
  222. htmlgraph/orchestration/spawners/gemini.py +471 -0
  223. htmlgraph/orchestration/subprocess_runner.py +36 -0
  224. htmlgraph/orchestration/task_coordination.py +343 -0
  225. htmlgraph/orchestration.md +563 -0
  226. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  227. htmlgraph/orchestrator.py +669 -0
  228. htmlgraph/orchestrator_config.py +357 -0
  229. htmlgraph/orchestrator_mode.py +328 -0
  230. htmlgraph/orchestrator_validator.py +133 -0
  231. htmlgraph/parallel.py +646 -0
  232. htmlgraph/parser.py +160 -35
  233. htmlgraph/path_query.py +608 -0
  234. htmlgraph/pattern_matcher.py +636 -0
  235. htmlgraph/planning.py +147 -52
  236. htmlgraph/pydantic_models.py +476 -0
  237. htmlgraph/quality_gates.py +350 -0
  238. htmlgraph/query_builder.py +109 -72
  239. htmlgraph/query_composer.py +509 -0
  240. htmlgraph/reflection.py +443 -0
  241. htmlgraph/refs.py +344 -0
  242. htmlgraph/repo_hash.py +512 -0
  243. htmlgraph/repositories/__init__.py +292 -0
  244. htmlgraph/repositories/analytics_repository.py +455 -0
  245. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  246. htmlgraph/repositories/feature_repository.py +581 -0
  247. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  248. htmlgraph/repositories/feature_repository_memory.py +607 -0
  249. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  250. htmlgraph/repositories/filter_service.py +620 -0
  251. htmlgraph/repositories/filter_service_standard.py +445 -0
  252. htmlgraph/repositories/shared_cache.py +621 -0
  253. htmlgraph/repositories/shared_cache_memory.py +395 -0
  254. htmlgraph/repositories/track_repository.py +552 -0
  255. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  256. htmlgraph/repositories/track_repository_memory.py +508 -0
  257. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  258. htmlgraph/routing.py +8 -19
  259. htmlgraph/scripts/deploy.py +1 -2
  260. htmlgraph/sdk/__init__.py +398 -0
  261. htmlgraph/sdk/__init__.pyi +14 -0
  262. htmlgraph/sdk/analytics/__init__.py +19 -0
  263. htmlgraph/sdk/analytics/engine.py +155 -0
  264. htmlgraph/sdk/analytics/helpers.py +178 -0
  265. htmlgraph/sdk/analytics/registry.py +109 -0
  266. htmlgraph/sdk/base.py +484 -0
  267. htmlgraph/sdk/constants.py +216 -0
  268. htmlgraph/sdk/core.pyi +308 -0
  269. htmlgraph/sdk/discovery.py +120 -0
  270. htmlgraph/sdk/help/__init__.py +12 -0
  271. htmlgraph/sdk/help/mixin.py +699 -0
  272. htmlgraph/sdk/mixins/__init__.py +15 -0
  273. htmlgraph/sdk/mixins/attribution.py +113 -0
  274. htmlgraph/sdk/mixins/mixin.py +410 -0
  275. htmlgraph/sdk/operations/__init__.py +12 -0
  276. htmlgraph/sdk/operations/mixin.py +427 -0
  277. htmlgraph/sdk/orchestration/__init__.py +17 -0
  278. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  279. htmlgraph/sdk/orchestration/spawner.py +204 -0
  280. htmlgraph/sdk/planning/__init__.py +19 -0
  281. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  282. htmlgraph/sdk/planning/mixin.py +211 -0
  283. htmlgraph/sdk/planning/parallel.py +186 -0
  284. htmlgraph/sdk/planning/queue.py +210 -0
  285. htmlgraph/sdk/planning/recommendations.py +87 -0
  286. htmlgraph/sdk/planning/smart_planning.py +319 -0
  287. htmlgraph/sdk/session/__init__.py +19 -0
  288. htmlgraph/sdk/session/continuity.py +57 -0
  289. htmlgraph/sdk/session/handoff.py +110 -0
  290. htmlgraph/sdk/session/info.py +309 -0
  291. htmlgraph/sdk/session/manager.py +103 -0
  292. htmlgraph/sdk/strategic/__init__.py +26 -0
  293. htmlgraph/sdk/strategic/mixin.py +563 -0
  294. htmlgraph/server.py +685 -180
  295. htmlgraph/services/__init__.py +10 -0
  296. htmlgraph/services/claiming.py +199 -0
  297. htmlgraph/session_hooks.py +300 -0
  298. htmlgraph/session_manager.py +1392 -175
  299. htmlgraph/session_registry.py +587 -0
  300. htmlgraph/session_state.py +436 -0
  301. htmlgraph/session_warning.py +201 -0
  302. htmlgraph/sessions/__init__.py +23 -0
  303. htmlgraph/sessions/handoff.py +756 -0
  304. htmlgraph/setup.py +34 -17
  305. htmlgraph/spike_index.py +143 -0
  306. htmlgraph/sync_docs.py +12 -15
  307. htmlgraph/system_prompts.py +450 -0
  308. htmlgraph/templates/AGENTS.md.template +366 -0
  309. htmlgraph/templates/CLAUDE.md.template +97 -0
  310. htmlgraph/templates/GEMINI.md.template +87 -0
  311. htmlgraph/templates/orchestration-view.html +350 -0
  312. htmlgraph/track_builder.py +146 -15
  313. htmlgraph/track_manager.py +69 -21
  314. htmlgraph/transcript.py +890 -0
  315. htmlgraph/transcript_analytics.py +699 -0
  316. htmlgraph/types.py +323 -0
  317. htmlgraph/validation.py +115 -0
  318. htmlgraph/watch.py +8 -5
  319. htmlgraph/work_type_utils.py +3 -2
  320. {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2406 -307
  321. htmlgraph-0.27.5.data/data/htmlgraph/templates/AGENTS.md.template +366 -0
  322. htmlgraph-0.27.5.data/data/htmlgraph/templates/CLAUDE.md.template +97 -0
  323. htmlgraph-0.27.5.data/data/htmlgraph/templates/GEMINI.md.template +87 -0
  324. {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +97 -64
  325. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  326. {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  327. htmlgraph/cli.py +0 -2688
  328. htmlgraph/sdk.py +0 -709
  329. htmlgraph-0.9.3.dist-info/RECORD +0 -61
  330. {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  331. {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,841 @@
1
+ # HtmlGraph SDK API Reference
2
+
3
+ Complete API documentation for HtmlGraph SDK with examples for every method.
4
+
5
+ ## Table of Contents
6
+
7
+ 1. [Initialization](#initialization)
8
+ 2. [Collections](#collections)
9
+ 3. [Builders](#builders)
10
+ 4. [Queries](#queries)
11
+ 5. [Analytics](#analytics)
12
+ 6. [Orchestration](#orchestration)
13
+ 7. [Error Handling](#error-handling)
14
+
15
+ ## Initialization
16
+
17
+ ### SDK Constructor
18
+
19
+ ```python
20
+ from htmlgraph import SDK
21
+
22
+ # Basic initialization (auto-discovers .htmlgraph directory)
23
+ sdk = SDK(agent="claude")
24
+
25
+ # With explicit directory
26
+ sdk = SDK(agent="claude", directory="/path/to/.htmlgraph")
27
+
28
+ # With parent session tracking (for nested contexts)
29
+ sdk = SDK(agent="claude", parent_session="sess-12345")
30
+ ```
31
+
32
+ **Parameters:**
33
+ - `agent` (str, REQUIRED): Agent identifier for work attribution. Examples: "claude", "explorer", "coder", "tester"
34
+ - `directory` (Path | str, optional): Path to .htmlgraph directory. Auto-discovered if not provided.
35
+ - `parent_session` (str, optional): Parent session ID for nested contexts
36
+
37
+ **Raises:**
38
+ - `ValueError`: If agent cannot be determined and not provided
39
+
40
+ **Auto-Discovery Logic:**
41
+ 1. Checks current directory for `.htmlgraph/`
42
+ 2. Recursively checks parent directories
43
+ 3. Raises error if not found
44
+
45
+ ---
46
+
47
+ ## Collections
48
+
49
+ All collections provide the same base interface for CRUD operations and querying.
50
+
51
+ ### Collection Methods
52
+
53
+ #### `create(title: str, **kwargs) -> Builder`
54
+
55
+ Create a new work item with fluent builder interface.
56
+
57
+ ```python
58
+ # Simple creation
59
+ feature = sdk.features.create("User Authentication")
60
+
61
+ # With builder pattern
62
+ feature = sdk.features.create("User Auth") \
63
+ .set_priority("high") \
64
+ .add_steps(["Design schema", "Implement", "Test"]) \
65
+ .set_status("in-progress") \
66
+ .save()
67
+
68
+ # Create with custom properties
69
+ spike = sdk.spikes.create(
70
+ "Investigate caching strategies",
71
+ investigation_type="technical",
72
+ estimated_hours=8
73
+ )
74
+ ```
75
+
76
+ **Parameters:**
77
+ - `title` (str): Work item title
78
+ - `**kwargs`: Additional properties
79
+
80
+ **Returns:**
81
+ - Builder instance with fluent interface (supports method chaining)
82
+
83
+ **Raises:**
84
+ - `ValidationError`: If title is empty
85
+
86
+ ---
87
+
88
+ #### `get(node_id: str) -> Node | None`
89
+
90
+ Retrieve a single work item by ID.
91
+
92
+ ```python
93
+ feature = sdk.features.get("feat-12345")
94
+ if feature:
95
+ print(f"Title: {feature.title}")
96
+ print(f"Status: {feature.status}")
97
+ else:
98
+ print("Feature not found")
99
+ ```
100
+
101
+ **Parameters:**
102
+ - `node_id` (str): Unique node identifier
103
+
104
+ **Returns:**
105
+ - `Node` object if found, `None` if not found
106
+
107
+ **Error Behavior:**
108
+ - Returns `None` (safe for conditional checks)
109
+
110
+ ---
111
+
112
+ #### `all() -> list[Node]`
113
+
114
+ Retrieve all work items in collection.
115
+
116
+ ```python
117
+ all_features = sdk.features.all()
118
+ print(f"Total features: {len(all_features)}")
119
+
120
+ # Safe iteration even if empty
121
+ for feature in all_features:
122
+ print(feature.title)
123
+ ```
124
+
125
+ **Returns:**
126
+ - List of Node objects (empty list if none found)
127
+
128
+ **Error Behavior:**
129
+ - Returns empty list on error (safe iteration)
130
+
131
+ ---
132
+
133
+ #### `where(**filters) -> list[Node]`
134
+
135
+ Query work items with filter conditions.
136
+
137
+ ```python
138
+ # Single filter
139
+ todo_features = sdk.features.where(status="todo")
140
+
141
+ # Multiple filters (AND condition)
142
+ high_priority_bugs = sdk.bugs.where(
143
+ status="todo",
144
+ priority="high"
145
+ )
146
+
147
+ # Complex queries
148
+ in_progress = sdk.features.where(
149
+ status="in-progress",
150
+ priority__in=["high", "critical"]
151
+ )
152
+ ```
153
+
154
+ **Parameters:**
155
+ - `**filters`: Key-value pairs for filtering
156
+ - Supports nested attributes: `priority__in=["high", "critical"]`
157
+ - Multiple filters combine with AND logic
158
+
159
+ **Returns:**
160
+ - List of matching Node objects (empty list if no matches)
161
+
162
+ **Common Filters:**
163
+ - `status`: "todo", "in-progress", "blocked", "done"
164
+ - `priority`: "low", "medium", "high", "critical"
165
+ - `agent`: Agent identifier
166
+ - `track`: Track identifier
167
+
168
+ ---
169
+
170
+ #### `edit(node_id: str) -> ContextManager[Node]`
171
+
172
+ Edit a work item using context manager.
173
+
174
+ ```python
175
+ # Update status
176
+ with sdk.features.edit("feat-12345") as feature:
177
+ feature.status = "done"
178
+ feature.priority = "low"
179
+ # Auto-saves on exit
180
+
181
+ # Modify steps
182
+ with sdk.features.edit("feat-12345") as feature:
183
+ if feature.steps:
184
+ feature.steps[0].completed = True
185
+ ```
186
+
187
+ **Parameters:**
188
+ - `node_id` (str): Node to edit
189
+
190
+ **Returns:**
191
+ - Context manager yielding Node object
192
+ - Auto-saves on exit
193
+
194
+ **Raises:**
195
+ - `NodeNotFoundError`: If node not found
196
+
197
+ **Error Behavior:**
198
+ - Raises exception (must handle with try/except)
199
+
200
+ ---
201
+
202
+ #### `mark_done(node_ids: list[str]) -> dict`
203
+
204
+ Mark multiple work items as done.
205
+
206
+ ```python
207
+ result = sdk.features.mark_done([
208
+ "feat-001",
209
+ "feat-002",
210
+ "feat-003"
211
+ ])
212
+
213
+ print(f"Completed: {result['success_count']}")
214
+ if result['failed_ids']:
215
+ print(f"Failed: {result['failed_ids']}")
216
+ print(f"Reasons: {result['warnings']}")
217
+ ```
218
+
219
+ **Parameters:**
220
+ - `node_ids` (list[str]): IDs to mark as done
221
+
222
+ **Returns:**
223
+ - Dict with:
224
+ - `success_count` (int): Number successfully updated
225
+ - `failed_ids` (list[str]): IDs that failed
226
+ - `warnings` (list[str]): Reason for each failure
227
+
228
+ **Error Behavior:**
229
+ - Returns results dict with partial success details
230
+
231
+ ---
232
+
233
+ #### `batch_update(updates: dict[str, dict]) -> dict`
234
+
235
+ Update multiple work items in batch.
236
+
237
+ ```python
238
+ updates = {
239
+ "feat-001": {"status": "done", "priority": "low"},
240
+ "feat-002": {"status": "in-progress"},
241
+ "feat-003": {"status": "blocked"}
242
+ }
243
+
244
+ result = sdk.features.batch_update(updates)
245
+ print(f"Updated: {result['success_count']}")
246
+ ```
247
+
248
+ **Parameters:**
249
+ - `updates` (dict): Mapping of node_id to update dict
250
+
251
+ **Returns:**
252
+ - Dict with success_count, failed_ids, warnings
253
+
254
+ ---
255
+
256
+ #### `delete(node_id: str) -> bool`
257
+
258
+ Delete a work item.
259
+
260
+ ```python
261
+ if sdk.features.delete("feat-12345"):
262
+ print("Deleted successfully")
263
+ else:
264
+ print("Feature not found")
265
+ ```
266
+
267
+ **Parameters:**
268
+ - `node_id` (str): Node to delete
269
+
270
+ **Returns:**
271
+ - `True` if deleted, `False` if not found
272
+
273
+ ---
274
+
275
+ #### `assign(node_ids: list[str], agent: str) -> dict`
276
+
277
+ Assign work items to an agent.
278
+
279
+ ```python
280
+ result = sdk.features.assign(
281
+ ["feat-001", "feat-002"],
282
+ agent="claude"
283
+ )
284
+ ```
285
+
286
+ **Parameters:**
287
+ - `node_ids` (list[str]): IDs to assign
288
+ - `agent` (str): Agent identifier
289
+
290
+ **Returns:**
291
+ - Results dict with success_count, failed_ids
292
+
293
+ ---
294
+
295
+ ### Available Collections
296
+
297
+ **Work Item Collections** (all support builder pattern):
298
+ - `sdk.features` - Feature work items
299
+ - `sdk.bugs` - Bug reports
300
+ - `sdk.spikes` - Investigation/research spikes
301
+ - `sdk.chores` - Maintenance tasks
302
+ - `sdk.epics` - Large bodies of work
303
+ - `sdk.phases` - Project phases
304
+
305
+ **Support Collections**:
306
+ - `sdk.sessions` - Agent sessions
307
+ - `sdk.tracks` - Work tracks
308
+ - `sdk.agents` - Agent information
309
+ - `sdk.todos` - Persistent task tracking (mirrors TodoWrite API)
310
+ - `sdk.patterns` - Workflow patterns (optimal/anti-pattern)
311
+ - `sdk.insights` - Session health insights
312
+ - `sdk.metrics` - Aggregated time-series metrics
313
+ - `sdk.task_delegations` - Task delegation observability
314
+
315
+ ---
316
+
317
+ ## Builders
318
+
319
+ Builders provide fluent interface for creating and configuring work items.
320
+
321
+ ### Base Builder Methods
322
+
323
+ All builders inherit from `BaseBuilder` and support these methods:
324
+
325
+ #### `set_priority(priority: str) -> Builder`
326
+
327
+ ```python
328
+ feature = sdk.features.create("Feature") \
329
+ .set_priority("high")
330
+ ```
331
+
332
+ **Values:** "low", "medium", "high", "critical"
333
+
334
+ ---
335
+
336
+ #### `set_status(status: str) -> Builder`
337
+
338
+ ```python
339
+ feature = sdk.features.create("Feature") \
340
+ .set_status("in-progress")
341
+ ```
342
+
343
+ **Values:** "todo", "in-progress", "blocked", "done"
344
+
345
+ ---
346
+
347
+ #### `add_step(description: str) -> Builder`
348
+
349
+ ```python
350
+ feature = sdk.features.create("Feature") \
351
+ .add_step("Design the schema") \
352
+ .add_step("Implement API")
353
+ ```
354
+
355
+ ---
356
+
357
+ #### `add_steps(descriptions: list[str]) -> Builder`
358
+
359
+ ```python
360
+ feature = sdk.features.create("Feature") \
361
+ .add_steps([
362
+ "Design the schema",
363
+ "Implement API",
364
+ "Add tests",
365
+ "Deploy"
366
+ ])
367
+ ```
368
+
369
+ ---
370
+
371
+ #### `set_description(description: str) -> Builder`
372
+
373
+ ```python
374
+ feature = sdk.features.create("Feature") \
375
+ .set_description("This feature adds user authentication")
376
+ ```
377
+
378
+ ---
379
+
380
+ #### `blocks(node_id: str) -> Builder`
381
+
382
+ ```python
383
+ feature = sdk.features.create("Feature") \
384
+ .blocks("feat-999") # This blocks feat-999
385
+ ```
386
+
387
+ ---
388
+
389
+ #### `blocked_by(node_id: str) -> Builder`
390
+
391
+ ```python
392
+ feature = sdk.features.create("Feature") \
393
+ .blocked_by("feat-111") # This is blocked by feat-111
394
+ ```
395
+
396
+ ---
397
+
398
+ #### `save() -> Node`
399
+
400
+ ```python
401
+ feature = sdk.features.create("Feature") \
402
+ .set_priority("high") \
403
+ .add_steps(["Step 1", "Step 2"]) \
404
+ .save()
405
+
406
+ print(f"Created: {feature.id}")
407
+ ```
408
+
409
+ **Returns:**
410
+ - Saved Node object with generated ID
411
+
412
+ **Raises:**
413
+ - `ValidationError`: If required fields missing
414
+
415
+ ---
416
+
417
+ ### Feature-Specific Builder Methods
418
+
419
+ ```python
420
+ feature = sdk.features.create("User Authentication") \
421
+ .set_track("auth") \
422
+ .set_priority("high") \
423
+ .add_steps([...]) \
424
+ .save()
425
+ ```
426
+
427
+ ---
428
+
429
+ ### Spike-Specific Builder Methods
430
+
431
+ ```python
432
+ spike = sdk.spikes.create("Investigate caching strategies") \
433
+ .set_spike_type("technical") \
434
+ .set_estimated_hours(8) \
435
+ .save()
436
+ ```
437
+
438
+ ---
439
+
440
+ ### Complete Builder Example
441
+
442
+ ```python
443
+ feature = sdk.features.create("User Authentication System") \
444
+ .set_priority("high") \
445
+ .set_status("todo") \
446
+ .set_description(
447
+ "Implement JWT-based authentication with OAuth2 support"
448
+ ) \
449
+ .add_steps([
450
+ "Design authentication schema",
451
+ "Implement JWT middleware",
452
+ "Add OAuth2 integration",
453
+ "Write comprehensive tests",
454
+ "Deploy to staging",
455
+ "Perform security audit",
456
+ "Deploy to production"
457
+ ]) \
458
+ .blocks("feat-post-auth-flow") \
459
+ .blocked_by("feat-database-setup") \
460
+ .save()
461
+
462
+ print(f"Feature {feature.id} created successfully")
463
+ ```
464
+
465
+ ---
466
+
467
+ ## Queries
468
+
469
+ ### Query Builder
470
+
471
+ For complex queries beyond basic filtering:
472
+
473
+ ```python
474
+ from htmlgraph import HtmlGraph, QueryBuilder
475
+
476
+ graph = HtmlGraph("features/")
477
+
478
+ # Query with multiple conditions
479
+ results = graph.query_builder() \
480
+ .where("status", "todo") \
481
+ .and_("priority").in_(["high", "critical"]) \
482
+ .and_("completion").lt(50) \
483
+ .execute()
484
+
485
+ # Text search
486
+ results = graph.query_builder() \
487
+ .where("title").contains("auth") \
488
+ .or_("title").contains("login") \
489
+ .execute()
490
+
491
+ # Numeric comparisons
492
+ results = graph.query_builder() \
493
+ .where("estimated_hours").gte(8) \
494
+ .and_("estimated_hours").lte(40) \
495
+ .execute()
496
+ ```
497
+
498
+ ### QueryBuilder Operators
499
+
500
+ **Comparison Operators:**
501
+ - `.eq(value)` - Equal
502
+ - `.ne(value)` - Not equal
503
+ - `.gt(value)` - Greater than
504
+ - `.gte(value)` - Greater than or equal
505
+ - `.lt(value)` - Less than
506
+ - `.lte(value)` - Less than or equal
507
+ - `.in_(values)` - In list
508
+ - `.not_in(values)` - Not in list
509
+ - `.between(a, b)` - Between (inclusive)
510
+
511
+ **String Operators:**
512
+ - `.contains(text)` - String contains
513
+ - `.starts_with(text)` - Starts with
514
+ - `.ends_with(text)` - Ends with
515
+ - `.matches(regex)` - Regex match
516
+
517
+ **Null Operators:**
518
+ - `.is_null()` - Is null
519
+ - `.is_not_null()` - Is not null
520
+
521
+ **Logical Operators:**
522
+ - `.and_(field)` - AND condition
523
+ - `.or_(field)` - OR condition
524
+ - `.not_()` - NOT condition
525
+
526
+ ---
527
+
528
+ ## Analytics
529
+
530
+ ### Work Type Analytics
531
+
532
+ ```python
533
+ # Get distribution of work types
534
+ distribution = sdk.analytics.get_work_type_distribution()
535
+ # Returns: {"feature": 25, "spike": 8, "bug": 12, "chore": 5}
536
+
537
+ # Get spike to feature ratio
538
+ ratio = sdk.analytics.get_spike_to_feature_ratio()
539
+ # Returns: 0.32 (1 spike per 3 features, indicating good investigation)
540
+
541
+ # Get maintenance burden
542
+ burden = sdk.analytics.get_maintenance_burden()
543
+ # Returns: 0.17 (chores are 17% of total work)
544
+ ```
545
+
546
+ ---
547
+
548
+ ### Dependency Analytics
549
+
550
+ ```python
551
+ # Find blocking tasks
552
+ bottlenecks = sdk.dep_analytics.find_bottlenecks(top_n=5)
553
+ # Returns: [
554
+ # {
555
+ # "node_id": "feat-001",
556
+ # "title": "Database Schema",
557
+ # "blocking_count": 8,
558
+ # "blocker_ids": [...]
559
+ # }
560
+ # ]
561
+
562
+ # Find parallelizable work
563
+ parallel = sdk.dep_analytics.get_parallel_work(max_agents=3)
564
+ # Returns: {
565
+ # "agent_1": ["feat-001", "feat-002"],
566
+ # "agent_2": ["feat-003", "feat-004"],
567
+ # "agent_3": ["feat-005"]
568
+ # }
569
+
570
+ # Get recommendations
571
+ recommendations = sdk.dep_analytics.recommend_next_tasks(agent_count=1)
572
+
573
+ # Assess dependency risk
574
+ risk = sdk.dep_analytics.assess_dependency_risk()
575
+ # Returns: {"has_cycles": false, "risk_level": "low"}
576
+
577
+ # Impact analysis
578
+ impact = sdk.dep_analytics.impact_analysis("feat-001")
579
+ # Returns: {"unlocked_nodes": [...], "impact_count": 5}
580
+ ```
581
+
582
+ ---
583
+
584
+ ### Context Analytics
585
+
586
+ ```python
587
+ # Get context usage metrics
588
+ usage = sdk.context.get_context_usage()
589
+ # Returns: {
590
+ # "current_tokens": 45000,
591
+ # "max_tokens": 100000,
592
+ # "usage_percent": 45
593
+ # }
594
+
595
+ # Get efficiency score
596
+ efficiency = sdk.context.get_context_efficiency()
597
+ # Returns: 0.85 (efficiency score 0-1)
598
+ ```
599
+
600
+ ---
601
+
602
+ ### System Prompts
603
+
604
+ ```python
605
+ # Get active system prompt (project override OR plugin default)
606
+ active = sdk.system_prompts.get_active()
607
+
608
+ # Get plugin default
609
+ default = sdk.system_prompts.get_default()
610
+
611
+ # Get project override if exists
612
+ project = sdk.system_prompts.get_project()
613
+
614
+ # Create project-level override
615
+ sdk.system_prompts.create("""
616
+ # Custom System Prompt
617
+
618
+ Your custom guidance here...
619
+ """)
620
+
621
+ # Validate prompt token count
622
+ stats = sdk.system_prompts.validate()
623
+ # Returns: {
624
+ # "tokens": 1250,
625
+ # "max_tokens": 2000,
626
+ # "is_valid": true
627
+ # }
628
+
629
+ # Get prompt statistics
630
+ stats = sdk.system_prompts.get_stats()
631
+
632
+ # Delete project override (fallback to default)
633
+ sdk.system_prompts.delete()
634
+ ```
635
+
636
+ ---
637
+
638
+ ## Orchestration
639
+
640
+ ### Task Delegation
641
+
642
+ ```python
643
+ from htmlgraph import SDK, delegate_with_id, get_results_by_task_id
644
+
645
+ sdk = SDK(agent="orchestrator")
646
+
647
+ # Delegate task to specific agent
648
+ task_id = delegate_with_id(
649
+ prompt="Implement authentication module",
650
+ agent="coder",
651
+ task_id="task-auth-001"
652
+ )
653
+
654
+ # Check results later
655
+ results = get_results_by_task_id("task-auth-001")
656
+ if results:
657
+ print(f"Result: {results['output']}")
658
+ print(f"Status: {results['status']}")
659
+ ```
660
+
661
+ ---
662
+
663
+ ### Parallel Delegation
664
+
665
+ ```python
666
+ from htmlgraph import parallel_delegate
667
+
668
+ # Delegate multiple tasks in parallel
669
+ results = parallel_delegate([
670
+ {
671
+ "prompt": "Implement login endpoint",
672
+ "agent": "coder",
673
+ "task_id": "auth-login"
674
+ },
675
+ {
676
+ "prompt": "Implement logout endpoint",
677
+ "agent": "coder",
678
+ "task_id": "auth-logout"
679
+ },
680
+ {
681
+ "prompt": "Write authentication tests",
682
+ "agent": "tester",
683
+ "task_id": "auth-tests"
684
+ }
685
+ ])
686
+
687
+ # Aggregate results
688
+ for task_id, result in results.items():
689
+ print(f"{task_id}: {result['status']}")
690
+ ```
691
+
692
+ ---
693
+
694
+ ### Model Selection
695
+
696
+ ```python
697
+ from htmlgraph.orchestration import select_model, TaskType, ComplexityLevel
698
+
699
+ # Select best model for task
700
+ model = select_model(
701
+ task_type=TaskType.CODE_GENERATION,
702
+ complexity=ComplexityLevel.HIGH,
703
+ budget_mode="balanced" # or "cost-optimized"
704
+ )
705
+ # Returns: "gpt-4-turbo" or "claude-opus" based on heuristics
706
+ ```
707
+
708
+ ---
709
+
710
+ ## Error Handling
711
+
712
+ ### Error Classes
713
+
714
+ ```python
715
+ from htmlgraph import (
716
+ HtmlGraphError,
717
+ NodeNotFoundError,
718
+ SessionNotFoundError,
719
+ ClaimConflictError,
720
+ ValidationError
721
+ )
722
+ ```
723
+
724
+ ---
725
+
726
+ ### Error Handling Patterns
727
+
728
+ **Pattern 1: Safe Lookup**
729
+
730
+ ```python
731
+ feature = sdk.features.get("feat-12345")
732
+ if feature:
733
+ print(feature.title)
734
+ else:
735
+ print("Not found - safe to ignore")
736
+ ```
737
+
738
+ **Pattern 2: Safe Query**
739
+
740
+ ```python
741
+ # Returns empty list - safe iteration
742
+ high_priority = sdk.features.where(status="todo", priority="high")
743
+ for item in high_priority:
744
+ process(item)
745
+ ```
746
+
747
+ **Pattern 3: Edit with Exception Handling**
748
+
749
+ ```python
750
+ try:
751
+ with sdk.features.edit("feat-12345") as feature:
752
+ feature.status = "done"
753
+ except NodeNotFoundError:
754
+ print("Feature not found")
755
+ ```
756
+
757
+ **Pattern 4: Batch with Results**
758
+
759
+ ```python
760
+ result = sdk.features.mark_done(["feat-1", "feat-2", "missing"])
761
+ if result['failed_ids']:
762
+ print(f"Failed: {result['failed_ids']}")
763
+ for warning in result['warnings']:
764
+ print(f" Reason: {warning}")
765
+ ```
766
+
767
+ ---
768
+
769
+ ### Common Error Scenarios
770
+
771
+ | Error | Cause | Solution |
772
+ |-------|-------|----------|
773
+ | `NodeNotFoundError` | Node ID doesn't exist | Check `.get()` result or catch exception |
774
+ | `ValidationError` | Invalid input (e.g., empty title) | Validate input before creating |
775
+ | `ClaimConflictError` | Another agent claimed the item | Release claim or work with different item |
776
+ | `SessionNotFoundError` | Parent session doesn't exist | Check parent_session parameter |
777
+
778
+ ---
779
+
780
+ ## Complete Example
781
+
782
+ ```python
783
+ from htmlgraph import SDK
784
+ from htmlgraph.exceptions import NodeNotFoundError
785
+
786
+ # Initialize
787
+ sdk = SDK(agent="claude")
788
+
789
+ # Create feature with builder
790
+ feature = sdk.features.create("User Authentication System") \
791
+ .set_priority("high") \
792
+ .add_steps([
793
+ "Design schema",
794
+ "Implement API",
795
+ "Add tests"
796
+ ]) \
797
+ .save()
798
+
799
+ print(f"Created feature: {feature.id}")
800
+
801
+ # Query work
802
+ high_priority_todos = sdk.features.where(
803
+ status="todo",
804
+ priority="high"
805
+ )
806
+
807
+ # Update feature
808
+ try:
809
+ with sdk.features.edit(feature.id) as f:
810
+ f.status = "in-progress"
811
+ f.priority = "critical"
812
+ except NodeNotFoundError:
813
+ print("Feature was deleted")
814
+
815
+ # Batch operations
816
+ result = sdk.features.mark_done([feature.id])
817
+ print(f"Marked done: {result['success_count']}")
818
+
819
+ # Analytics
820
+ distribution = sdk.analytics.get_work_type_distribution()
821
+ bottlenecks = sdk.dep_analytics.find_bottlenecks(top_n=3)
822
+
823
+ print(f"Work distribution: {distribution}")
824
+ print(f"Bottlenecks: {bottlenecks}")
825
+ ```
826
+
827
+ ---
828
+
829
+ ## Version
830
+
831
+ Current API version: 0.24.1
832
+
833
+ Compatible with: HtmlGraph 0.20.0+
834
+
835
+ ---
836
+
837
+ ## See Also
838
+
839
+ - [HTTP API Reference](HTTP_API.md) - REST endpoint documentation
840
+ - [Orchestration Patterns](ORCHESTRATION_PATTERNS.md) - Multi-agent coordination
841
+ - [Integration Guide](INTEGRATION_GUIDE.md) - Quick start and examples