htmlgraph 0.20.0__tar.gz → 0.20.2__tar.gz

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 (238) hide show
  1. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/PKG-INFO +1 -1
  2. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/gemini-extension.json +1 -1
  3. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/pyproject.toml +1 -1
  4. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/__init__.py +1 -1
  5. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/post_tool_use_failure.py +49 -5
  6. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/posttooluse.py +38 -17
  7. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_post_tool_use_failure.py +10 -10
  8. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/.gitignore +0 -0
  9. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/README.md +0 -0
  10. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/agent-coordination/README.md +0 -0
  11. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/agent-coordination/demo.py +0 -0
  12. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/create_auth_track_demo.py +0 -0
  13. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/create_htmlgraph_dev_track.py +0 -0
  14. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/README.md +0 -0
  15. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/agents.json +0 -0
  16. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/demo.py +0 -0
  17. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-api-graph.html +0 -0
  18. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-api-overview.html +0 -0
  19. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-api-sdk.html +0 -0
  20. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-example-advanced.html +0 -0
  21. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-example-basic.html +0 -0
  22. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-index.html +0 -0
  23. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-installation.html +0 -0
  24. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/documentation-site/features/doc-quickstart.html +0 -0
  25. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/handoff-demo.py +0 -0
  26. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/README.md +0 -0
  27. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/agents.json +0 -0
  28. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/demo.py +0 -0
  29. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/features/feat-276c615f.html +0 -0
  30. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/features/feat-7a6f797d.html +0 -0
  31. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/features/note-ai-agents.html +0 -0
  32. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/features/note-graph-db.html +0 -0
  33. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/features/note-htmlgraph.html +0 -0
  34. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/knowledge-base/features/note-web-standards.html +0 -0
  35. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/parallel_task_coordination.py +0 -0
  36. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/routing-demo.py +0 -0
  37. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/sdk_demo.py +0 -0
  38. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/README.md +0 -0
  39. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/demo.py +0 -0
  40. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/index.html +0 -0
  41. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/styles.css +0 -0
  42. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/task-001.html +0 -0
  43. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/task-002.html +0 -0
  44. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/task-003.html +0 -0
  45. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/task-004.html +0 -0
  46. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/task-005.html +0 -0
  47. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/examples/todo-list/task-006.html +0 -0
  48. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/GEMINI.md +0 -0
  49. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/README.md +0 -0
  50. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_deploy.md +0 -0
  51. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_end.md +0 -0
  52. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_feature-add.md +0 -0
  53. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_feature-complete.md +0 -0
  54. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_feature-primary.md +0 -0
  55. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_feature-start.md +0 -0
  56. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_git-commit.md +0 -0
  57. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_help.md +0 -0
  58. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_init.md +0 -0
  59. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_plan.md +0 -0
  60. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_recommend.md +0 -0
  61. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_serve.md +0 -0
  62. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_spike.md +0 -0
  63. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_start.md +0 -0
  64. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_status.md +0 -0
  65. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/command_track.md +0 -0
  66. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/hooks/hooks.json +0 -0
  67. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/hooks/scripts/post-tool.sh +0 -0
  68. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/hooks/scripts/session-end.sh +0 -0
  69. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/packages/gemini-extension/hooks/scripts/session-start.sh +0 -0
  70. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/js/htmlgraph.js +0 -0
  71. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/agent_detection.py +0 -0
  72. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/agent_registry.py +0 -0
  73. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/agents.py +0 -0
  74. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/analytics/__init__.py +0 -0
  75. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/analytics/cli.py +0 -0
  76. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/analytics/dependency.py +0 -0
  77. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/analytics/work_type.py +0 -0
  78. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/analytics_index.py +0 -0
  79. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/attribute_index.py +0 -0
  80. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/__init__.py +0 -0
  81. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/base.py +0 -0
  82. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/bug.py +0 -0
  83. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/chore.py +0 -0
  84. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/epic.py +0 -0
  85. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/feature.py +0 -0
  86. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/insight.py +0 -0
  87. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/metric.py +0 -0
  88. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/pattern.py +0 -0
  89. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/phase.py +0 -0
  90. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/spike.py +0 -0
  91. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/builders/track.py +0 -0
  92. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/cli.py +0 -0
  93. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/__init__.py +0 -0
  94. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/base.py +0 -0
  95. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/bug.py +0 -0
  96. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/chore.py +0 -0
  97. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/epic.py +0 -0
  98. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/feature.py +0 -0
  99. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/insight.py +0 -0
  100. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/metric.py +0 -0
  101. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/pattern.py +0 -0
  102. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/phase.py +0 -0
  103. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/spike.py +0 -0
  104. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/collections/todo.py +0 -0
  105. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/context_analytics.py +0 -0
  106. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/converter.py +0 -0
  107. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/dashboard.html +0 -0
  108. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/dependency_models.py +0 -0
  109. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/deploy.py +0 -0
  110. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/deployment_models.py +0 -0
  111. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/edge_index.py +0 -0
  112. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/event_log.py +0 -0
  113. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/event_migration.py +0 -0
  114. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/exceptions.py +0 -0
  115. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/GEMINI.md +0 -0
  116. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/README.md +0 -0
  117. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/gemini-extension.json +0 -0
  118. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/hooks/hooks.json +0 -0
  119. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/hooks/scripts/post-tool.sh +0 -0
  120. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-end.sh +0 -0
  121. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-start.sh +0 -0
  122. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/file_watcher.py +0 -0
  123. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/find_api.py +0 -0
  124. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/git_events.py +0 -0
  125. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/graph.py +0 -0
  126. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/__init__.py +0 -0
  127. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/event_tracker.py +0 -0
  128. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/hooks-config.example.json +0 -0
  129. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/installer.py +0 -0
  130. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/orchestrator.py +0 -0
  131. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/orchestrator_reflector.py +0 -0
  132. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/post-checkout.sh +0 -0
  133. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/post-commit.sh +0 -0
  134. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/post-merge.sh +0 -0
  135. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/pre-commit.sh +0 -0
  136. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/pre-push.sh +0 -0
  137. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/pretooluse.py +0 -0
  138. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/task_enforcer.py +0 -0
  139. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/task_validator.py +0 -0
  140. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/hooks/validator.py +0 -0
  141. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/ids.py +0 -0
  142. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/index.d.ts +0 -0
  143. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/learning.py +0 -0
  144. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/mcp_server.py +0 -0
  145. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/models.py +0 -0
  146. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/orchestration.py +0 -0
  147. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/orchestrator.py +0 -0
  148. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/orchestrator_mode.py +0 -0
  149. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/orchestrator_validator.py +0 -0
  150. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/parallel.py +0 -0
  151. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/parser.py +0 -0
  152. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/planning.py +0 -0
  153. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/query_builder.py +0 -0
  154. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/routing.py +0 -0
  155. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/scripts/__init__.py +0 -0
  156. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/scripts/deploy.py +0 -0
  157. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/sdk.py +0 -0
  158. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/server.py +0 -0
  159. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/services/__init__.py +0 -0
  160. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/services/claiming.py +0 -0
  161. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/session_manager.py +0 -0
  162. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/session_warning.py +0 -0
  163. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/setup.py +0 -0
  164. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/spike_index.py +0 -0
  165. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/styles.css +0 -0
  166. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/sync_docs.py +0 -0
  167. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/templates/AGENTS.md.template +0 -0
  168. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/templates/CLAUDE.md.template +0 -0
  169. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/templates/GEMINI.md.template +0 -0
  170. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/track_builder.py +0 -0
  171. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/track_manager.py +0 -0
  172. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/transcript.py +0 -0
  173. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/transcript_analytics.py +0 -0
  174. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/types.py +0 -0
  175. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/watch.py +0 -0
  176. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/src/python/htmlgraph/work_type_utils.py +0 -0
  177. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/benchmarks/README.md +0 -0
  178. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/benchmarks/__init__.py +0 -0
  179. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/benchmarks/bench_graph.py +0 -0
  180. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/benchmarks/conftest.py +0 -0
  181. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/integration/test_deployment_workflow.py +0 -0
  182. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/integration/test_handoff_routing.py +0 -0
  183. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/integration/test_multi_agent_coordination.py +0 -0
  184. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/js/README.md +0 -0
  185. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/js/test_htmlgraph.html +0 -0
  186. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/__init__.py +0 -0
  187. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_agent_detection.py +0 -0
  188. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_analytics.py +0 -0
  189. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_auto_spike.py +0 -0
  190. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_claiming.py +0 -0
  191. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_cli_commands.py +0 -0
  192. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_collection_filter.py +0 -0
  193. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_cross_agent_attribution.py +0 -0
  194. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_dashboard_ui.py +0 -0
  195. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_delete.py +0 -0
  196. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_deploy.py +0 -0
  197. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_drift_parent_activity.py +0 -0
  198. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_drift_queue_cleanup.py +0 -0
  199. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_edge_index.py +0 -0
  200. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_event_index.py +0 -0
  201. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_event_query.py +0 -0
  202. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_find_api.py +0 -0
  203. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_git_events.py +0 -0
  204. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_graph_traversal.py +0 -0
  205. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_handoff.py +0 -0
  206. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_ids.py +0 -0
  207. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_install_hooks.py +0 -0
  208. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_lifecycle.py +0 -0
  209. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_mcp_server.py +0 -0
  210. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_mcp_stdio_transport.py +0 -0
  211. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_models.py +0 -0
  212. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_orchestration.py +0 -0
  213. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_orchestrator_cli.py +0 -0
  214. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_orchestrator_enforce_hook.py +0 -0
  215. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_orchestrator_mode.py +0 -0
  216. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_pre_work_validation_integration.py +0 -0
  217. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_query_builder.py +0 -0
  218. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_query_cache.py +0 -0
  219. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_query_compilation.py +0 -0
  220. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_routing.py +0 -0
  221. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_sdk_discoverability.py +0 -0
  222. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_sdk_get_active_work_item.py +0 -0
  223. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_session_cleanup.py +0 -0
  224. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_session_continuity.py +0 -0
  225. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_session_start_info_validation.py +0 -0
  226. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_system_overhead_drift.py +0 -0
  227. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_todo_collection.py +0 -0
  228. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_track_loading.py +0 -0
  229. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_transcript_linking.py +0 -0
  230. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_update_preserves_incoming_edges.py +0 -0
  231. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_validate_work_hook.py +0 -0
  232. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_work_queue.py +0 -0
  233. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/python/test_work_type.py +0 -0
  234. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/test_agent_routing.py +0 -0
  235. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/test_deployment_models.py +0 -0
  236. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/test_orchestrator_validator.py +0 -0
  237. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/test_transaction_snapshot.py +0 -0
  238. {htmlgraph-0.20.0 → htmlgraph-0.20.2}/tests/test_transcript.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: htmlgraph
3
- Version: 0.20.0
3
+ Version: 0.20.2
4
4
  Summary: HTML is All You Need - Graph database on web standards
5
5
  Project-URL: Homepage, https://github.com/Shakes-tzd/htmlgraph
6
6
  Project-URL: Documentation, https://github.com/Shakes-tzd/htmlgraph#readme
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "htmlgraph",
3
- "version": "0.20.0",
3
+ "version": "0.20.2",
4
4
  "description": "HtmlGraph session tracking and documentation for Gemini CLI. Ensures proper activity attribution, feature awareness, and continuous work tracking.",
5
5
  "author": "Shakes",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "htmlgraph"
3
- version = "0.20.0"
3
+ version = "0.20.2"
4
4
  description = "HTML is All You Need - Graph database on web standards"
5
5
  authors = [{name = "Shakes", email = "shakestzd@gmail.com"}]
6
6
  readme = "README.md"
@@ -84,7 +84,7 @@ from htmlgraph.types import (
84
84
  )
85
85
  from htmlgraph.work_type_utils import infer_work_type, infer_work_type_from_id
86
86
 
87
- __version__ = "0.20.0"
87
+ __version__ = "0.20.2"
88
88
  __all__ = [
89
89
  # Exceptions
90
90
  "HtmlGraphError",
@@ -29,19 +29,63 @@ def run(hook_input: dict[str, Any]) -> dict[str, Any]:
29
29
 
30
30
  Args:
31
31
  hook_input: Hook input containing:
32
- - tool/name: Tool name that failed
33
- - error: Error message
32
+ - name: Tool name that failed
33
+ - result: Tool result (may contain error field)
34
34
  - session_id: Current session ID
35
35
 
36
36
  Returns:
37
37
  Standard hook response: {"continue": True}
38
38
  """
39
39
  try:
40
- # Extract error information
41
- tool_name = hook_input.get("tool") or hook_input.get("name", "unknown")
42
- error_msg = hook_input.get("error", "No error message")
40
+ # DEBUG: Log raw hook input to understand structure
41
+ debug_log = Path(".htmlgraph/hook-debug.jsonl")
42
+ debug_log.parent.mkdir(parents=True, exist_ok=True)
43
+ with open(debug_log, "a") as f:
44
+ f.write(
45
+ json.dumps(
46
+ {
47
+ "raw_input": hook_input,
48
+ "keys": list(hook_input.keys()),
49
+ "ts": datetime.now().isoformat(),
50
+ }
51
+ )
52
+ + "\n"
53
+ )
54
+
55
+ # Extract error information from PostToolUse hook format
56
+ # Official PostToolUse uses: tool_name, tool_response
57
+ # Custom hooks may use: name, result
58
+ tool_name = hook_input.get("tool_name") or hook_input.get("name", "unknown")
43
59
  session_id = hook_input.get("session_id", "unknown")
44
60
 
61
+ # Error message can be in different places depending on tool
62
+ error_msg = "No error message"
63
+
64
+ # Check tool_response field first (official PostToolUse format)
65
+ # Then check result field (custom hook format)
66
+ result = hook_input.get("tool_response") or hook_input.get("result", {})
67
+ if isinstance(result, dict):
68
+ if "error" in result:
69
+ error_msg = result["error"]
70
+ elif "message" in result:
71
+ error_msg = result["message"]
72
+ elif isinstance(result, str):
73
+ # Sometimes the error is directly in the result as a string
74
+ error_msg = result
75
+
76
+ # Fallback: check top-level error field
77
+ if error_msg == "No error message" and "error" in hook_input:
78
+ error_msg = hook_input["error"]
79
+
80
+ # Last resort: stringify the result if it contains error indicators
81
+ if error_msg == "No error message" and result:
82
+ result_str = str(result).lower()
83
+ if any(
84
+ indicator in result_str
85
+ for indicator in ["error", "failed", "exception"]
86
+ ):
87
+ error_msg = str(result)[:500] # Truncate to 500 chars
88
+
45
89
  # Track error in file-based storage
46
90
  error_log = Path(".htmlgraph/errors.jsonl")
47
91
  error_log.parent.mkdir(parents=True, exist_ok=True)
@@ -119,6 +119,8 @@ async def run_error_tracking(hook_input: dict[str, Any]) -> dict[str, Any]:
119
119
  """
120
120
  Track errors to .htmlgraph/errors.jsonl and auto-create debug spikes.
121
121
 
122
+ Only tracks ACTUAL errors, not responses containing the word "error".
123
+
122
124
  Args:
123
125
  hook_input: Hook input with tool execution details
124
126
 
@@ -128,23 +130,26 @@ async def run_error_tracking(hook_input: dict[str, Any]) -> dict[str, Any]:
128
130
  try:
129
131
  loop = asyncio.get_event_loop()
130
132
 
131
- # Check if this is an error (check for error field or non-zero exit code)
133
+ # Check if this is an ACTUAL error
132
134
  has_error = False
133
- tool_response = hook_input.get("result", {}) or hook_input.get(
134
- "tool_response", {}
135
- )
135
+ tool_response = hook_input.get("tool_response") or hook_input.get("result", {})
136
+
137
+ if isinstance(tool_response, dict):
138
+ # Bash: non-empty stderr indicates error
139
+ stderr = tool_response.get("stderr", "")
140
+ if stderr and isinstance(stderr, str) and stderr.strip():
141
+ has_error = True
136
142
 
137
- # Check for explicit error field
138
- if "error" in tool_response or hook_input.get("error"):
139
- has_error = True
143
+ # Explicit error field with content
144
+ error_field = tool_response.get("error")
145
+ if error_field and str(error_field).strip():
146
+ has_error = True
140
147
 
141
- # Check for error indicators in response text
142
- response_text = str(tool_response).lower()
143
- error_indicators = ["error", "failed", "exception", "traceback", "errno"]
144
- if any(indicator in response_text for indicator in error_indicators):
145
- has_error = True
148
+ # success=false flag
149
+ if tool_response.get("success") is False:
150
+ has_error = True
146
151
 
147
- # Only track if there's an error
152
+ # Only track if there's an actual error
148
153
  if has_error:
149
154
  return await loop.run_in_executor(
150
155
  None,
@@ -162,6 +167,9 @@ async def suggest_debugging_resources(hook_input: dict[str, Any]) -> dict[str, A
162
167
  """
163
168
  Suggest debugging resources based on tool results.
164
169
 
170
+ Only triggers on ACTUAL errors, not on responses that happen to contain
171
+ the word "error" in their content.
172
+
165
173
  Args:
166
174
  hook_input: Hook input with tool execution details
167
175
 
@@ -176,11 +184,24 @@ async def suggest_debugging_resources(hook_input: dict[str, Any]) -> dict[str, A
176
184
 
177
185
  suggestions = []
178
186
 
179
- # Check for error indicators in response
180
- response_text = str(tool_response).lower()
181
- error_indicators = ["error", "failed", "exception", "traceback", "errno"]
187
+ # Check for ACTUAL errors (not just text containing "error")
188
+ has_actual_error = False
189
+
190
+ if isinstance(tool_response, dict):
191
+ # Bash: non-empty stderr indicates error
192
+ stderr = tool_response.get("stderr", "")
193
+ if stderr and isinstance(stderr, str) and stderr.strip():
194
+ has_actual_error = True
195
+
196
+ # Explicit error field
197
+ if tool_response.get("error"):
198
+ has_actual_error = True
199
+
200
+ # success=false flag
201
+ if tool_response.get("success") is False:
202
+ has_actual_error = True
182
203
 
183
- if any(indicator in response_text for indicator in error_indicators):
204
+ if has_actual_error:
184
205
  suggestions.append("⚠️ Error detected in tool response")
185
206
  suggestions.append("Debugging resources:")
186
207
  suggestions.append(" 📚 DEBUGGING.md - Systematic debugging guide")
@@ -23,8 +23,8 @@ def mock_htmlgraph_dir(tmp_path, monkeypatch):
23
23
  def test_error_logging(mock_htmlgraph_dir):
24
24
  """Test that errors are logged to file."""
25
25
  hook_input = {
26
- "tool": "Bash",
27
- "error": "Command failed with exit code 1",
26
+ "name": "Bash",
27
+ "result": {"error": "Command failed with exit code 1"},
28
28
  "session_id": "test-session",
29
29
  }
30
30
 
@@ -44,10 +44,10 @@ def test_error_logging(mock_htmlgraph_dir):
44
44
 
45
45
 
46
46
  def test_error_logging_with_name_field(mock_htmlgraph_dir):
47
- """Test that errors are logged when using 'name' field instead of 'tool'."""
47
+ """Test that errors are logged when using PostToolUse format with result.error."""
48
48
  hook_input = {
49
49
  "name": "Read",
50
- "error": "File not found",
50
+ "result": {"error": "File not found"},
51
51
  "session_id": "test-session-2",
52
52
  }
53
53
 
@@ -245,8 +245,8 @@ def test_hook_never_blocks(mock_htmlgraph_dir):
245
245
  f.write("invalid json\n")
246
246
 
247
247
  hook_input = {
248
- "tool": "Bash",
249
- "error": "test error",
248
+ "name": "Bash",
249
+ "result": {"error": "test error"},
250
250
  "session_id": "test",
251
251
  }
252
252
 
@@ -271,8 +271,8 @@ def test_integration_with_auto_spike_creation(mock_htmlgraph_dir):
271
271
  mock_sdk_class.return_value = mock_sdk
272
272
 
273
273
  hook_input = {
274
- "tool": "Edit",
275
- "error": "Pattern matching failed",
274
+ "name": "Edit",
275
+ "result": {"error": "Pattern matching failed"},
276
276
  "session_id": "integration-test",
277
277
  }
278
278
 
@@ -291,8 +291,8 @@ def test_error_log_creates_directory(tmp_path, monkeypatch):
291
291
  monkeypatch.chdir(tmp_path)
292
292
 
293
293
  hook_input = {
294
- "tool": "Test",
295
- "error": "test error",
294
+ "name": "Test",
295
+ "result": {"error": "test error"},
296
296
  "session_id": "test",
297
297
  }
298
298
 
File without changes
File without changes