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
htmlgraph/ids.py CHANGED
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  """
2
4
  Hash-based ID generation for HtmlGraph.
3
5
 
@@ -15,7 +17,6 @@ collision probability is effectively zero even with thousands
15
17
  of concurrent agents creating tasks simultaneously.
16
18
  """
17
19
 
18
- from __future__ import annotations
19
20
 
20
21
  import hashlib
21
22
  import os
@@ -25,8 +26,18 @@ from typing import Literal
25
26
 
26
27
  # Type alias for valid node types
27
28
  NodeType = Literal[
28
- "feature", "bug", "chore", "spike", "epic",
29
- "session", "track", "phase", "agent", "spec", "plan", "event"
29
+ "feature",
30
+ "bug",
31
+ "chore",
32
+ "spike",
33
+ "epic",
34
+ "session",
35
+ "track",
36
+ "phase",
37
+ "agent",
38
+ "spec",
39
+ "plan",
40
+ "event",
30
41
  ]
31
42
 
32
43
  # Prefix mapping for human readability
@@ -50,8 +61,8 @@ PREFIXES: dict[str, str] = {
50
61
  PREFIX_TO_TYPE: dict[str, str] = {v: k for k, v in PREFIXES.items()}
51
62
 
52
63
  # Regex patterns for ID validation
53
- HASH_ID_PATTERN = re.compile(r'^([a-z]{3,4})-([a-f0-9]{8})(\.\d+)*$')
54
- LEGACY_ID_PATTERN = re.compile(r'^([a-z]+)-(\d{8}-\d{6})$')
64
+ HASH_ID_PATTERN = re.compile(r"^([a-z]{3,4})-([a-f0-9]{8})(\.\d+)*$")
65
+ LEGACY_ID_PATTERN = re.compile(r"^([a-z]+)-(\d{8}-\d{6})$")
55
66
 
56
67
 
57
68
  def generate_id(
@@ -166,15 +177,15 @@ def parse_id(node_id: str) -> dict[str, str | int | list[int] | None]:
166
177
  hierarchy = []
167
178
  base_id = f"{prefix}-{hash_part}"
168
179
  if len(node_id) > len(base_id):
169
- hierarchy_str = node_id[len(base_id):] # e.g., ".1.2"
170
- hierarchy = [int(x) for x in hierarchy_str.split('.') if x]
180
+ hierarchy_str = node_id[len(base_id) :] # e.g., ".1.2"
181
+ hierarchy = [int(x) for x in hierarchy_str.split(".") if x]
171
182
 
172
183
  return {
173
- 'prefix': prefix,
174
- 'node_type': PREFIX_TO_TYPE.get(prefix, prefix),
175
- 'hash': hash_part,
176
- 'hierarchy': hierarchy,
177
- 'is_legacy': False,
184
+ "prefix": prefix,
185
+ "node_type": PREFIX_TO_TYPE.get(prefix, prefix),
186
+ "hash": hash_part,
187
+ "hierarchy": hierarchy,
188
+ "is_legacy": False,
178
189
  }
179
190
 
180
191
  # Try legacy format (feature-20241222-143022)
@@ -184,20 +195,20 @@ def parse_id(node_id: str) -> dict[str, str | int | list[int] | None]:
184
195
  timestamp = legacy_match.group(2)
185
196
 
186
197
  return {
187
- 'prefix': prefix,
188
- 'node_type': prefix, # Legacy uses full type as prefix
189
- 'hash': timestamp,
190
- 'hierarchy': [],
191
- 'is_legacy': True,
198
+ "prefix": prefix,
199
+ "node_type": prefix, # Legacy uses full type as prefix
200
+ "hash": timestamp,
201
+ "hierarchy": [],
202
+ "is_legacy": True,
192
203
  }
193
204
 
194
205
  # Unknown format
195
206
  return {
196
- 'prefix': None,
197
- 'node_type': None,
198
- 'hash': None,
199
- 'hierarchy': [],
200
- 'is_legacy': None,
207
+ "prefix": None,
208
+ "node_type": None,
209
+ "hash": None,
210
+ "hierarchy": [],
211
+ "is_legacy": None,
201
212
  }
202
213
 
203
214
 
@@ -261,10 +272,10 @@ def get_parent_id(node_id: str) -> str | None:
261
272
  >>> get_parent_id("feat-a1b2c3d4")
262
273
  None
263
274
  """
264
- if '.' not in node_id:
275
+ if "." not in node_id:
265
276
  return None
266
277
 
267
- return node_id.rsplit('.', 1)[0]
278
+ return node_id.rsplit(".", 1)[0]
268
279
 
269
280
 
270
281
  def get_root_id(node_id: str) -> str:
@@ -284,9 +295,9 @@ def get_root_id(node_id: str) -> str:
284
295
  'feat-a1b2c3d4'
285
296
  """
286
297
  parsed = parse_id(node_id)
287
- if parsed['prefix'] and parsed['hash']:
298
+ if parsed["prefix"] and parsed["hash"]:
288
299
  return f"{parsed['prefix']}-{parsed['hash']}"
289
- return node_id.split('.')[0]
300
+ return node_id.split(".")[0]
290
301
 
291
302
 
292
303
  def get_depth(node_id: str) -> int:
@@ -308,4 +319,7 @@ def get_depth(node_id: str) -> int:
308
319
  2
309
320
  """
310
321
  parsed = parse_id(node_id)
311
- return len(parsed.get('hierarchy', []))
322
+ hierarchy = parsed.get("hierarchy", [])
323
+ if isinstance(hierarchy, list):
324
+ return len(hierarchy)
325
+ return 0
htmlgraph/index.d.ts ADDED
@@ -0,0 +1,286 @@
1
+ /**
2
+ * HtmlGraph TypeScript Type Definitions
3
+ *
4
+ * Python SDK type definitions for TypeScript/JavaScript interoperability
5
+ * when using HtmlGraph via tools like pyodide or similar bridges.
6
+ */
7
+
8
+ // ============================================================================
9
+ // Core Types
10
+ // ============================================================================
11
+
12
+ export interface Step {
13
+ description: string;
14
+ completed: boolean;
15
+ agent?: string;
16
+ timestamp?: string;
17
+ }
18
+
19
+ export interface Edge {
20
+ target_id: string;
21
+ title?: string;
22
+ relationship?: string;
23
+ }
24
+
25
+ export interface Node {
26
+ id: string;
27
+ title: string;
28
+ type: string;
29
+ status: string;
30
+ priority: string;
31
+ created: string;
32
+ updated: string;
33
+ content?: string;
34
+ tags?: string[];
35
+ steps?: Step[];
36
+ edges?: Record<string, Edge[]>;
37
+ track?: string;
38
+ agent_assigned?: string;
39
+ }
40
+
41
+ export interface Feature extends Node {
42
+ type: 'feature';
43
+ }
44
+
45
+ export interface Bug extends Node {
46
+ type: 'bug';
47
+ }
48
+
49
+ export interface Chore extends Node {
50
+ type: 'chore';
51
+ maintenance_type?: 'corrective' | 'adaptive' | 'perfective' | 'preventive';
52
+ technical_debt_score?: number;
53
+ }
54
+
55
+ export interface Spike extends Node {
56
+ type: 'spike';
57
+ spike_type?: 'technical' | 'architectural' | 'risk' | 'general';
58
+ timebox_hours?: number;
59
+ findings?: string;
60
+ decision?: string;
61
+ }
62
+
63
+ export interface Requirement {
64
+ description: string;
65
+ priority: 'must-have' | 'should-have' | 'nice-to-have';
66
+ }
67
+
68
+ export interface AcceptanceCriteria {
69
+ description: string;
70
+ test_case: string;
71
+ }
72
+
73
+ export interface Spec {
74
+ overview: string;
75
+ context?: string;
76
+ requirements: Requirement[];
77
+ acceptance_criteria?: AcceptanceCriteria[];
78
+ }
79
+
80
+ export interface Task {
81
+ description: string;
82
+ estimated_hours?: number;
83
+ }
84
+
85
+ export interface Phase {
86
+ name: string;
87
+ tasks: Task[];
88
+ }
89
+
90
+ export interface Plan {
91
+ phases: Phase[];
92
+ total_estimated_hours?: number;
93
+ }
94
+
95
+ export interface Track {
96
+ id: string;
97
+ title: string;
98
+ description?: string;
99
+ priority: string;
100
+ status: string;
101
+ created: string;
102
+ updated: string;
103
+ spec?: Spec;
104
+ plan?: Plan;
105
+ }
106
+
107
+ // ============================================================================
108
+ // Analytics Types
109
+ // ============================================================================
110
+
111
+ export interface Bottleneck {
112
+ id: string;
113
+ title: string;
114
+ status: string;
115
+ priority: string;
116
+ blocks_count: number;
117
+ impact_score: number;
118
+ blocked_tasks: string[];
119
+ }
120
+
121
+ export interface Recommendation {
122
+ id: string;
123
+ title: string;
124
+ priority: string;
125
+ score: number;
126
+ reasons: string[];
127
+ estimated_hours?: number;
128
+ unlocks_count: number;
129
+ unlocks: string[];
130
+ }
131
+
132
+ export interface ParallelWork {
133
+ max_parallelism: number;
134
+ ready_now: number;
135
+ total_ready: number;
136
+ level_count: number;
137
+ next_level: string[][];
138
+ }
139
+
140
+ export interface Risk {
141
+ high_risk_count: number;
142
+ high_risk_tasks: Array<{
143
+ id: string;
144
+ title: string;
145
+ risk_factors: string[];
146
+ }>;
147
+ circular_dependencies: string[][];
148
+ orphaned_count: number;
149
+ recommendations: string[];
150
+ }
151
+
152
+ export interface Impact {
153
+ node_id: string;
154
+ direct_dependents: string[];
155
+ total_impact: number;
156
+ completion_impact: number;
157
+ unlocks_count: number;
158
+ affected_tasks: string[];
159
+ }
160
+
161
+ // ============================================================================
162
+ // Collection Interface
163
+ // ============================================================================
164
+
165
+ export interface Collection<T extends Node> {
166
+ /**
167
+ * Get all nodes in the collection
168
+ */
169
+ all(): T[];
170
+
171
+ /**
172
+ * Get a single node by ID
173
+ */
174
+ get(id: string): T | null;
175
+
176
+ /**
177
+ * Query nodes matching criteria
178
+ */
179
+ where(filters: Partial<T>): T[];
180
+
181
+ /**
182
+ * Create a new node (returns builder for features)
183
+ */
184
+ create(title: string): T | FeatureBuilder;
185
+
186
+ /**
187
+ * Edit a node with context manager-like behavior
188
+ */
189
+ edit(id: string): EditContext<T>;
190
+
191
+ /**
192
+ * Batch update multiple nodes
193
+ */
194
+ batch_update(ids: string[], updates: Partial<T>): void;
195
+
196
+ /**
197
+ * Mark nodes as done
198
+ */
199
+ mark_done(ids: string[]): void;
200
+
201
+ /**
202
+ * Assign nodes to an agent
203
+ */
204
+ assign(ids: string[], agent: string): void;
205
+ }
206
+
207
+ // ============================================================================
208
+ // Builder Interfaces
209
+ // ============================================================================
210
+
211
+ export interface FeatureBuilder {
212
+ set_priority(priority: string): FeatureBuilder;
213
+ set_description(description: string): FeatureBuilder;
214
+ set_track(track_id: string): FeatureBuilder;
215
+ add_steps(steps: string[]): FeatureBuilder;
216
+ add_tags(tags: string[]): FeatureBuilder;
217
+ blocked_by(feature_ids: string[]): FeatureBuilder;
218
+ save(): Feature;
219
+ }
220
+
221
+ export interface TrackBuilder {
222
+ title(title: string): TrackBuilder;
223
+ description(description: string): TrackBuilder;
224
+ priority(priority: string): TrackBuilder;
225
+ with_spec(spec: {
226
+ overview: string;
227
+ context?: string;
228
+ requirements: Array<[string, string] | string>;
229
+ acceptance_criteria?: Array<[string, string] | string>;
230
+ }): TrackBuilder;
231
+ with_plan_phases(phases: Array<[string, string[]]>): TrackBuilder;
232
+ create(): Track;
233
+ }
234
+
235
+ export interface EditContext<T> {
236
+ __enter__(): T;
237
+ __exit__(): void;
238
+ }
239
+
240
+ // ============================================================================
241
+ // SDK Interface
242
+ // ============================================================================
243
+
244
+ export interface SDK {
245
+ agent: string;
246
+
247
+ // Collections
248
+ features: Collection<Feature>;
249
+ bugs: Collection<Bug>;
250
+ chores: Collection<Chore>;
251
+ spikes: Collection<Spike>;
252
+ epics: Collection<Node>;
253
+ phases: Collection<Node>;
254
+ tracks: {
255
+ all(): Track[];
256
+ get(id: string): Track | null;
257
+ builder(): TrackBuilder;
258
+ };
259
+
260
+ // Analytics
261
+ find_bottlenecks(options?: { top_n?: number }): Bottleneck[];
262
+ recommend_next_work(options?: { agent_count?: number }): Recommendation[];
263
+ get_parallel_work(options?: { max_agents?: number }): ParallelWork;
264
+ assess_risks(): Risk;
265
+ analyze_impact(node_id: string): Impact;
266
+ }
267
+
268
+ // ============================================================================
269
+ // Factory Functions
270
+ // ============================================================================
271
+
272
+ /**
273
+ * Create a new SDK instance
274
+ */
275
+ export function SDK(options?: { agent?: string }): SDK;
276
+
277
+ /**
278
+ * Create a new HtmlGraph instance
279
+ */
280
+ export function HtmlGraph(directory: string): any;
281
+
282
+ // ============================================================================
283
+ // Exports
284
+ // ============================================================================
285
+
286
+ export default SDK;