htmlgraph 0.23.3__tar.gz → 0.23.5__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 (286) hide show
  1. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/PKG-INFO +2 -1
  2. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/README.md +1 -0
  3. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/gemini-extension.json +1 -1
  4. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/pyproject.toml +1 -1
  5. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/__init__.py +1 -1
  6. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/agent_detection.py +2 -41
  7. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/cli.py +105 -7
  8. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/base.py +68 -9
  9. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/converter.py +12 -6
  10. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/models.py +18 -0
  11. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestration/headless_spawner.py +6 -14
  12. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/parser.py +22 -8
  13. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_agent_detection.py +0 -56
  14. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_headless_spawner.py +41 -0
  15. htmlgraph-0.23.5/tests/test_sdk_api_surface.py +111 -0
  16. htmlgraph-0.23.3/tests/python/test_opencode_integration.py +0 -163
  17. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/.gitignore +0 -0
  18. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/agent-coordination/README.md +0 -0
  19. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/agent-coordination/demo.py +0 -0
  20. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/create_auth_track_demo.py +0 -0
  21. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/create_htmlgraph_dev_track.py +0 -0
  22. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/README.md +0 -0
  23. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/agents.json +0 -0
  24. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/demo.py +0 -0
  25. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-api-graph.html +0 -0
  26. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-api-overview.html +0 -0
  27. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-api-sdk.html +0 -0
  28. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-example-advanced.html +0 -0
  29. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-example-basic.html +0 -0
  30. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-index.html +0 -0
  31. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-installation.html +0 -0
  32. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/documentation-site/features/doc-quickstart.html +0 -0
  33. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/handoff-demo.py +0 -0
  34. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/README.md +0 -0
  35. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/agents.json +0 -0
  36. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/demo.py +0 -0
  37. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/features/feat-276c615f.html +0 -0
  38. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/features/feat-7a6f797d.html +0 -0
  39. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/features/note-ai-agents.html +0 -0
  40. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/features/note-graph-db.html +0 -0
  41. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/features/note-htmlgraph.html +0 -0
  42. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/knowledge-base/features/note-web-standards.html +0 -0
  43. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/parallel_task_coordination.py +0 -0
  44. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/routing-demo.py +0 -0
  45. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/sdk_demo.py +0 -0
  46. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/README.md +0 -0
  47. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/demo.py +0 -0
  48. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/index.html +0 -0
  49. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/styles.css +0 -0
  50. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/task-001.html +0 -0
  51. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/task-002.html +0 -0
  52. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/task-003.html +0 -0
  53. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/task-004.html +0 -0
  54. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/task-005.html +0 -0
  55. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/examples/todo-list/task-006.html +0 -0
  56. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/GEMINI.md +0 -0
  57. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/README.md +0 -0
  58. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_deploy.md +0 -0
  59. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_end.md +0 -0
  60. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_feature-add.md +0 -0
  61. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_feature-complete.md +0 -0
  62. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_feature-primary.md +0 -0
  63. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_feature-start.md +0 -0
  64. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_git-commit.md +0 -0
  65. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_help.md +0 -0
  66. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_init.md +0 -0
  67. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_plan.md +0 -0
  68. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_recommend.md +0 -0
  69. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_serve.md +0 -0
  70. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_spike.md +0 -0
  71. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_start.md +0 -0
  72. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_status.md +0 -0
  73. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/command_track.md +0 -0
  74. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/hooks/hooks.json +0 -0
  75. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/hooks/scripts/post-tool.sh +0 -0
  76. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/hooks/scripts/session-end.sh +0 -0
  77. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/packages/gemini-extension/hooks/scripts/session-start.sh +0 -0
  78. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/js/htmlgraph.js +0 -0
  79. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/agent_registry.py +0 -0
  80. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/agents.py +0 -0
  81. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/analytics/__init__.py +0 -0
  82. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/analytics/cli.py +0 -0
  83. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/analytics/cross_session.py +0 -0
  84. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/analytics/dependency.py +0 -0
  85. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/analytics/work_type.py +0 -0
  86. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/analytics_index.py +0 -0
  87. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/archive/__init__.py +0 -0
  88. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/archive/bloom.py +0 -0
  89. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/archive/fts.py +0 -0
  90. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/archive/manager.py +0 -0
  91. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/archive/search.py +0 -0
  92. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/attribute_index.py +0 -0
  93. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/__init__.py +0 -0
  94. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/base.py +0 -0
  95. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/bug.py +0 -0
  96. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/chore.py +0 -0
  97. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/epic.py +0 -0
  98. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/feature.py +0 -0
  99. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/insight.py +0 -0
  100. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/metric.py +0 -0
  101. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/pattern.py +0 -0
  102. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/phase.py +0 -0
  103. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/spike.py +0 -0
  104. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/builders/track.py +0 -0
  105. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/__init__.py +0 -0
  106. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/bug.py +0 -0
  107. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/chore.py +0 -0
  108. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/epic.py +0 -0
  109. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/feature.py +0 -0
  110. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/insight.py +0 -0
  111. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/metric.py +0 -0
  112. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/pattern.py +0 -0
  113. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/phase.py +0 -0
  114. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/spike.py +0 -0
  115. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/collections/todo.py +0 -0
  116. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/context_analytics.py +0 -0
  117. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/dashboard.html +0 -0
  118. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/dependency_models.py +0 -0
  119. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/deploy.py +0 -0
  120. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/deployment_models.py +0 -0
  121. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/__init__.py +0 -0
  122. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/docs_version.py +0 -0
  123. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/metadata.py +0 -0
  124. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/migrations.py +0 -0
  125. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/template_engine.py +0 -0
  126. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/templates/_sections/cli_reference.md.j2 +0 -0
  127. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/templates/_sections/core_concepts.md.j2 +0 -0
  128. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +0 -0
  129. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/templates/base_agents.md.j2 +0 -0
  130. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/templates/example_user_override.md.j2 +0 -0
  131. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/docs/version_check.py +0 -0
  132. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/edge_index.py +0 -0
  133. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/event_log.py +0 -0
  134. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/event_migration.py +0 -0
  135. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/exceptions.py +0 -0
  136. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/GEMINI.md +0 -0
  137. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/README.md +0 -0
  138. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/gemini-extension.json +0 -0
  139. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/hooks/hooks.json +0 -0
  140. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/hooks/scripts/post-tool.sh +0 -0
  141. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-end.sh +0 -0
  142. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-start.sh +0 -0
  143. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/file_watcher.py +0 -0
  144. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/find_api.py +0 -0
  145. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/git_events.py +0 -0
  146. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/graph.py +0 -0
  147. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/__init__.py +0 -0
  148. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/event_tracker.py +0 -0
  149. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/hooks-config.example.json +0 -0
  150. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/installer.py +0 -0
  151. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/orchestrator.py +0 -0
  152. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/orchestrator_reflector.py +0 -0
  153. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/post-checkout.sh +0 -0
  154. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/post-commit.sh +0 -0
  155. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/post-merge.sh +0 -0
  156. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/post_tool_use_failure.py +0 -0
  157. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/posttooluse.py +0 -0
  158. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/pre-commit.sh +0 -0
  159. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/pre-push.sh +0 -0
  160. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/pretooluse.py +0 -0
  161. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/task_enforcer.py +0 -0
  162. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/task_validator.py +0 -0
  163. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/hooks/validator.py +0 -0
  164. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/ids.py +0 -0
  165. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/index.d.ts +0 -0
  166. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/learning.py +0 -0
  167. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/mcp_server.py +0 -0
  168. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/operations/README.md +0 -0
  169. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/operations/__init__.py +0 -0
  170. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/operations/analytics.py +0 -0
  171. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/operations/events.py +0 -0
  172. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/operations/hooks.py +0 -0
  173. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/operations/server.py +0 -0
  174. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestration/__init__.py +0 -0
  175. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestration/model_selection.py +0 -0
  176. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestration/task_coordination.py +0 -0
  177. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestrator-system-prompt-optimized.txt +0 -0
  178. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestrator.py +0 -0
  179. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestrator_mode.py +0 -0
  180. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/orchestrator_validator.py +0 -0
  181. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/parallel.py +0 -0
  182. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/planning.py +0 -0
  183. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/query_builder.py +0 -0
  184. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/routing.py +0 -0
  185. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/scripts/__init__.py +0 -0
  186. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/scripts/deploy.py +0 -0
  187. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/sdk.py +0 -0
  188. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/server.py +0 -0
  189. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/services/__init__.py +0 -0
  190. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/services/claiming.py +0 -0
  191. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/session_manager.py +0 -0
  192. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/session_warning.py +0 -0
  193. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/setup.py +0 -0
  194. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/spike_index.py +0 -0
  195. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/styles.css +0 -0
  196. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/sync_docs.py +0 -0
  197. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/templates/AGENTS.md.template +0 -0
  198. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/templates/CLAUDE.md.template +0 -0
  199. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/templates/GEMINI.md.template +0 -0
  200. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/track_builder.py +0 -0
  201. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/track_manager.py +0 -0
  202. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/transcript.py +0 -0
  203. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/transcript_analytics.py +0 -0
  204. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/types.py +0 -0
  205. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/watch.py +0 -0
  206. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/src/python/htmlgraph/work_type_utils.py +0 -0
  207. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/benchmarks/README.md +0 -0
  208. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/benchmarks/__init__.py +0 -0
  209. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/benchmarks/bench_graph.py +0 -0
  210. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/benchmarks/conftest.py +0 -0
  211. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/multi_agent/README.md +0 -0
  212. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/multi_agent/__init__.py +0 -0
  213. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/multi_agent/test_agent_quirks.py +0 -0
  214. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/multi_agent/test_git_continuity_spine.py +0 -0
  215. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/test_deployment_workflow.py +0 -0
  216. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/test_handoff_routing.py +0 -0
  217. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/integration/test_multi_agent_coordination.py +0 -0
  218. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/js/README.md +0 -0
  219. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/js/test_htmlgraph.html +0 -0
  220. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/operations/__init__.py +0 -0
  221. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/operations/test_hooks.py +0 -0
  222. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/operations/test_server.py +0 -0
  223. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/__init__.py +0 -0
  224. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_analytics.py +0 -0
  225. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_archive_manager.py +0 -0
  226. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_archive_search.py +0 -0
  227. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_auto_spike.py +0 -0
  228. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_claiming.py +0 -0
  229. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_cli_commands.py +0 -0
  230. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_collection_filter.py +0 -0
  231. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_cross_agent_attribution.py +0 -0
  232. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_cross_session_analytics.py +0 -0
  233. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_dashboard_ui.py +0 -0
  234. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_delete.py +0 -0
  235. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_deploy.py +0 -0
  236. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_drift_parent_activity.py +0 -0
  237. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_drift_queue_cleanup.py +0 -0
  238. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_edge_index.py +0 -0
  239. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_event_index.py +0 -0
  240. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_event_query.py +0 -0
  241. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_find_api.py +0 -0
  242. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_git_events.py +0 -0
  243. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_graph_traversal.py +0 -0
  244. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_handoff.py +0 -0
  245. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_ids.py +0 -0
  246. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_install_hooks.py +0 -0
  247. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_lifecycle.py +0 -0
  248. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_mcp_server.py +0 -0
  249. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_mcp_stdio_transport.py +0 -0
  250. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_models.py +0 -0
  251. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_orchestration.py +0 -0
  252. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_orchestrator_circuit_breaker.py +0 -0
  253. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_orchestrator_cli.py +0 -0
  254. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_orchestrator_enforce_hook.py +0 -0
  255. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_orchestrator_mode.py +0 -0
  256. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_plugin_update_preservation.py +0 -0
  257. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_post_tool_use_failure.py +0 -0
  258. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_pre_work_validation_integration.py +0 -0
  259. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_query_builder.py +0 -0
  260. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_query_cache.py +0 -0
  261. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_query_compilation.py +0 -0
  262. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_routing.py +0 -0
  263. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_sdk_discoverability.py +0 -0
  264. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_sdk_get_active_work_item.py +0 -0
  265. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_session_cleanup.py +0 -0
  266. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_session_continuity.py +0 -0
  267. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_session_start_info_validation.py +0 -0
  268. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_system_overhead_drift.py +0 -0
  269. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_template_system.py +0 -0
  270. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_todo_collection.py +0 -0
  271. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_track_loading.py +0 -0
  272. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_transcript_linking.py +0 -0
  273. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_update_preserves_incoming_edges.py +0 -0
  274. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_validate_work_hook.py +0 -0
  275. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_version_migration.py +0 -0
  276. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_work_queue.py +0 -0
  277. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/python/test_work_type.py +0 -0
  278. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_agent_routing.py +0 -0
  279. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_cli_output_snapshots.py +0 -0
  280. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_cli_sdk_parity.py +0 -0
  281. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_deployment_models.py +0 -0
  282. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_event_log.py +0 -0
  283. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_orchestrator_validator.py +0 -0
  284. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_sdk_operations.py +0 -0
  285. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_transaction_snapshot.py +0 -0
  286. {htmlgraph-0.23.3 → htmlgraph-0.23.5}/tests/test_transcript.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: htmlgraph
3
- Version: 0.23.3
3
+ Version: 0.23.5
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
@@ -259,6 +259,7 @@ MIT
259
259
  ## Links
260
260
 
261
261
  - [GitHub](https://github.com/Shakes-tzd/htmlgraph)
262
+ - [API Reference](docs/API_REFERENCE.md) - Complete SDK API documentation
262
263
  - [Documentation](docs/) - SDK guide, workflows, development principles
263
264
  - [Examples](examples/) - Real-world usage examples
264
265
  - [PyPI](https://pypi.org/project/htmlgraph/)
@@ -218,6 +218,7 @@ MIT
218
218
  ## Links
219
219
 
220
220
  - [GitHub](https://github.com/Shakes-tzd/htmlgraph)
221
+ - [API Reference](docs/API_REFERENCE.md) - Complete SDK API documentation
221
222
  - [Documentation](docs/) - SDK guide, workflows, development principles
222
223
  - [Examples](examples/) - Real-world usage examples
223
224
  - [PyPI](https://pypi.org/project/htmlgraph/)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "htmlgraph",
3
- "version": "0.23.3",
3
+ "version": "0.23.5",
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.23.3"
3
+ version = "0.23.5"
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.23.3"
87
+ __version__ = "0.23.5"
88
88
  __all__ = [
89
89
  # Exceptions
90
90
  "HtmlGraphError",
@@ -20,8 +20,7 @@ def detect_agent_name() -> str:
20
20
  1. HTMLGRAPH_AGENT environment variable (explicit override)
21
21
  2. Claude Code detection (CLAUDE_CODE_VERSION, parent process)
22
22
  3. Gemini detection (GEMINI environment markers)
23
- 4. OpenCode detection (OPENCODE environment markers)
24
- 5. Fall back to "cli"
23
+ 4. Fall back to "cli"
25
24
  """
26
25
  # 1. Explicit override
27
26
  explicit = os.environ.get("HTMLGRAPH_AGENT")
@@ -36,11 +35,7 @@ def detect_agent_name() -> str:
36
35
  if _is_gemini():
37
36
  return "gemini"
38
37
 
39
- # 4. OpenCode detection
40
- if _is_opencode():
41
- return "opencode"
42
-
43
- # 5. Default to CLI
38
+ # 4. Default to CLI
44
39
  return "cli"
45
40
 
46
41
 
@@ -93,39 +88,6 @@ def _is_gemini() -> bool:
93
88
  return False
94
89
 
95
90
 
96
- def _is_opencode() -> bool:
97
- """Check if running in OpenCode environment."""
98
- # Check for OpenCode-specific environment variables
99
- if os.environ.get("OPENCODE_VERSION"):
100
- return True
101
-
102
- if os.environ.get("OPENCODE_API_KEY"):
103
- return True
104
-
105
- if os.environ.get("OPENCODE_SESSION_ID"):
106
- return True
107
-
108
- # Check for opencode in command line args
109
- if any("opencode" in arg.lower() for arg in sys.argv):
110
- return True
111
-
112
- # Check for OpenCode configuration
113
- try:
114
- # Look for OpenCode config in common locations
115
- opencode_config = Path.home() / ".opencode"
116
- if opencode_config.exists():
117
- return True
118
-
119
- # Check project-level OpenCode config
120
- project_config = Path.cwd() / ".opencode"
121
- if project_config.exists():
122
- return True
123
- except Exception:
124
- pass
125
-
126
- return False
127
-
128
-
129
91
  def get_agent_display_name(agent: str) -> str:
130
92
  """
131
93
  Get a human-friendly display name for an agent.
@@ -140,7 +102,6 @@ def get_agent_display_name(agent: str) -> str:
140
102
  "claude": "Claude",
141
103
  "claude-code": "Claude",
142
104
  "gemini": "Gemini",
143
- "opencode": "OpenCode",
144
105
  "cli": "CLI",
145
106
  "haiku": "Haiku",
146
107
  "opus": "Opus",
@@ -11,7 +11,8 @@ Usage:
11
11
  Claude Code Integration:
12
12
  htmlgraph claude # Start Claude Code
13
13
  htmlgraph claude --init # Start with orchestrator system prompt (recommended)
14
- htmlgraph claude --continue # Resume last Claude Code session
14
+ htmlgraph claude --continue # Resume last Claude Code session (with plugin loaded)
15
+ htmlgraph claude --dev # Start in development mode (load plugin from packages/)
15
16
 
16
17
  Session Management:
17
18
  htmlgraph session start [--id ID] [--agent AGENT]
@@ -170,7 +171,7 @@ def cmd_init(args: argparse.Namespace) -> None:
170
171
  generate_docs = True # Always generate in non-interactive mode
171
172
 
172
173
  def init_progress() -> tuple[Any | None, Any | None]:
173
- if args.quiet or getattr(args, "format", "text") != "text":
174
+ if getattr(args, "quiet", False) or getattr(args, "format", "text") != "text":
174
175
  return None, None
175
176
  try:
176
177
  from rich.console import Console
@@ -3589,6 +3590,19 @@ def cmd_claude(args: argparse.Namespace) -> None:
3589
3590
  """Start Claude Code with orchestrator prompt."""
3590
3591
  import textwrap
3591
3592
 
3593
+ # Load orchestration rules from plugin
3594
+ rules_file = (
3595
+ Path(__file__).parent.parent.parent.parent
3596
+ / "packages"
3597
+ / "claude-plugin"
3598
+ / "rules"
3599
+ / "orchestration.md"
3600
+ )
3601
+
3602
+ orchestration_rules = ""
3603
+ if rules_file.exists():
3604
+ orchestration_rules = rules_file.read_text(encoding="utf-8")
3605
+
3592
3606
  try:
3593
3607
  if args.init:
3594
3608
  # Load optimized orchestrator system prompt
@@ -3622,9 +3636,14 @@ def cmd_claude(args: argparse.Namespace) -> None:
3622
3636
  """
3623
3637
  )
3624
3638
 
3639
+ # Combine fallback prompt with orchestration rules
3640
+ combined_prompt = system_prompt
3641
+ if orchestration_rules:
3642
+ combined_prompt = f"{system_prompt}\n\n---\n\n{orchestration_rules}"
3643
+
3625
3644
  if args.quiet or args.format == "json":
3626
3645
  # Non-interactive: directly launch Claude with system prompt
3627
- cmd = ["claude", "--append-system-prompt", system_prompt]
3646
+ cmd = ["claude", "--append-system-prompt", combined_prompt]
3628
3647
  else:
3629
3648
  # Interactive: show summary first
3630
3649
  print("=" * 60)
@@ -3632,13 +3651,13 @@ def cmd_claude(args: argparse.Namespace) -> None:
3632
3651
  print("=" * 60)
3633
3652
  print("\nStarting Claude Code with orchestrator system prompt...")
3634
3653
  print("Key directives:")
3635
- print(" ✓ Delegate implementation to subagents")
3654
+ print(" ✓ Delegate to Gemini (FREE), Codex, Copilot first")
3655
+ print(" ✓ Use Task() only as fallback")
3636
3656
  print(" ✓ Create work items before delegating")
3637
3657
  print(" ✓ Track all work in .htmlgraph/")
3638
- print(" ✓ Respect dependency chains")
3639
3658
  print()
3640
3659
 
3641
- cmd = ["claude", "--append-system-prompt", system_prompt]
3660
+ cmd = ["claude", "--append-system-prompt", combined_prompt]
3642
3661
 
3643
3662
  try:
3644
3663
  subprocess.run(cmd, check=False)
@@ -3652,12 +3671,78 @@ def cmd_claude(args: argparse.Namespace) -> None:
3652
3671
 
3653
3672
  elif args.continue_session:
3654
3673
  # Resume last Claude Code session
3674
+ # Find plugin directory relative to project root
3675
+ plugin_dir = (
3676
+ Path(__file__).parent.parent.parent.parent
3677
+ / "packages"
3678
+ / "claude-plugin"
3679
+ / ".claude-plugin"
3680
+ )
3681
+
3655
3682
  if args.quiet or args.format == "json":
3656
3683
  cmd = ["claude", "--resume"]
3657
3684
  else:
3658
3685
  print("Resuming last Claude Code session...")
3659
3686
  cmd = ["claude", "--resume"]
3660
3687
 
3688
+ # Add orchestration rules if available
3689
+ if orchestration_rules:
3690
+ cmd.extend(["--append-system-prompt", orchestration_rules])
3691
+ if not (args.quiet or args.format == "json"):
3692
+ print(" ✓ Multi-AI delegation rules injected")
3693
+
3694
+ # Add plugin directory if it exists
3695
+ if plugin_dir.exists():
3696
+ cmd.extend(["--plugin-dir", str(plugin_dir)])
3697
+ if not (args.quiet or args.format == "json"):
3698
+ print(f" ✓ Loading plugin from: {plugin_dir}")
3699
+
3700
+ try:
3701
+ subprocess.run(cmd, check=False)
3702
+ except FileNotFoundError:
3703
+ print("Error: 'claude' command not found.", file=sys.stderr)
3704
+ print(
3705
+ "Please install Claude Code CLI: https://code.claude.com",
3706
+ file=sys.stderr,
3707
+ )
3708
+ sys.exit(1)
3709
+
3710
+ elif args.dev:
3711
+ # Development mode: load plugin from local directory
3712
+ plugin_dir = (
3713
+ Path(__file__).parent.parent.parent.parent
3714
+ / "packages"
3715
+ / "claude-plugin"
3716
+ / ".claude-plugin"
3717
+ )
3718
+
3719
+ if not plugin_dir.exists():
3720
+ print(
3721
+ f"Error: Plugin directory not found: {plugin_dir}", file=sys.stderr
3722
+ )
3723
+ print(
3724
+ "Expected location: packages/claude-plugin/.claude-plugin",
3725
+ file=sys.stderr,
3726
+ )
3727
+ sys.exit(1)
3728
+
3729
+ if args.quiet or args.format == "json":
3730
+ cmd = ["claude", "--plugin-dir", str(plugin_dir)]
3731
+ else:
3732
+ print("=" * 60)
3733
+ print("🔧 HtmlGraph Development Mode")
3734
+ print("=" * 60)
3735
+ print(f"\nLoading plugin from: {plugin_dir}")
3736
+ print(" ✓ Skills, agents, and hooks will be loaded from local files")
3737
+ print(" ✓ Multi-AI delegation rules will be injected")
3738
+ print(" ✓ Changes to plugin files will take effect after restart")
3739
+ print()
3740
+ cmd = ["claude", "--plugin-dir", str(plugin_dir)]
3741
+
3742
+ # Add orchestration rules if available
3743
+ if orchestration_rules:
3744
+ cmd.extend(["--append-system-prompt", orchestration_rules])
3745
+
3661
3746
  try:
3662
3747
  subprocess.run(cmd, check=False)
3663
3748
  except FileNotFoundError:
@@ -3670,8 +3755,16 @@ def cmd_claude(args: argparse.Namespace) -> None:
3670
3755
 
3671
3756
  else:
3672
3757
  # Default: start normal Claude Code session
3758
+ cmd = ["claude"]
3759
+
3760
+ # Add orchestration rules if available
3761
+ if orchestration_rules:
3762
+ cmd.extend(["--append-system-prompt", orchestration_rules])
3763
+ if not (args.quiet or args.format == "json"):
3764
+ print("Starting Claude Code with multi-AI delegation rules...")
3765
+
3673
3766
  try:
3674
- subprocess.run(["claude"], check=False)
3767
+ subprocess.run(cmd, check=False)
3675
3768
  except FileNotFoundError:
3676
3769
  print("Error: 'claude' command not found.", file=sys.stderr)
3677
3770
  print(
@@ -5106,6 +5199,11 @@ For more help: https://github.com/Shakes-tzd/htmlgraph
5106
5199
  action="store_true",
5107
5200
  help="Resume last Claude Code session",
5108
5201
  )
5202
+ claude_group.add_argument(
5203
+ "--dev",
5204
+ action="store_true",
5205
+ help="Start in development mode with plugin loaded from packages/claude-plugin",
5206
+ )
5109
5207
  claude_parser.set_defaults(func=cmd_claude)
5110
5208
 
5111
5209
  args = parser.parse_args()
@@ -71,7 +71,19 @@ class BaseCollection(Generic[CollectionT]):
71
71
  self._graph: HtmlGraph | None = None # Lazy-loaded
72
72
 
73
73
  def _ensure_graph(self) -> HtmlGraph:
74
- """Get the graph for this collection, using SDK's shared instances where available."""
74
+ """
75
+ Get or initialize the graph for this collection.
76
+
77
+ Uses SDK's shared graph instances where available to avoid creating
78
+ multiple graph objects for the same collection. Creates a new instance
79
+ for unrecognized collections.
80
+
81
+ Returns:
82
+ HtmlGraph instance for this collection
83
+
84
+ Note:
85
+ This method is lazy - the graph is only loaded on first access.
86
+ """
75
87
  if self._graph is None:
76
88
  # Use SDK's shared graph instances to avoid multiple graph objects
77
89
  if self._collection_name == "features" and hasattr(self._sdk, "_graph"):
@@ -92,7 +104,21 @@ class BaseCollection(Generic[CollectionT]):
92
104
  return self._graph
93
105
 
94
106
  def __getattribute__(self, name: str) -> Any:
95
- """Override to provide helpful error messages for missing attributes."""
107
+ """
108
+ Override attribute access to provide helpful error messages.
109
+
110
+ When an attribute doesn't exist, provides suggestions for common
111
+ mistakes and similar method names to improve discoverability.
112
+
113
+ Args:
114
+ name: Attribute name being accessed
115
+
116
+ Returns:
117
+ The requested attribute
118
+
119
+ Raises:
120
+ AttributeError: With helpful suggestions if attribute not found
121
+ """
96
122
  try:
97
123
  return object.__getattribute__(self, name)
98
124
  except AttributeError as e:
@@ -134,7 +160,15 @@ class BaseCollection(Generic[CollectionT]):
134
160
  raise AttributeError(error_msg) from e
135
161
 
136
162
  def __dir__(self) -> list[str]:
137
- """Return attributes with most useful ones first for discoverability."""
163
+ """
164
+ Return attributes with most useful ones first.
165
+
166
+ Orders attributes to show commonly-used methods first in auto-complete
167
+ and help() output, improving discoverability for new users.
168
+
169
+ Returns:
170
+ List of attribute names, ordered by priority then alphabetically
171
+ """
138
172
  priority = [
139
173
  # Creation and retrieval
140
174
  "create",
@@ -518,13 +552,15 @@ class BaseCollection(Generic[CollectionT]):
518
552
  """
519
553
  Start working on a node (feature/bug/etc).
520
554
 
521
- Delegates to SessionManager to:
555
+ Delegates to SessionManager if available for smart tracking:
522
556
  1. Check WIP limits
523
557
  2. Ensure not claimed by others
524
558
  3. Auto-claim for agent
525
559
  4. Link to active session
526
560
  5. Log 'FeatureStart' event
527
561
 
562
+ Falls back to simple status update if SessionManager not available.
563
+
528
564
  Args:
529
565
  node_id: Node ID to start
530
566
  agent: Agent ID (defaults to SDK agent)
@@ -534,6 +570,10 @@ class BaseCollection(Generic[CollectionT]):
534
570
 
535
571
  Raises:
536
572
  NodeNotFoundError: If node not found
573
+
574
+ Example:
575
+ >>> sdk.features.start('feat-abc123')
576
+ >>> sdk.features.start('feat-xyz', agent='claude')
537
577
  """
538
578
  agent = agent or self._sdk.agent
539
579
 
@@ -566,14 +606,17 @@ class BaseCollection(Generic[CollectionT]):
566
606
  transcript_id: str | None = None,
567
607
  ) -> Node | None:
568
608
  """
569
- Complete a node.
609
+ Mark a node as complete.
570
610
 
571
- Delegates to SessionManager to:
572
- 1. Update status
611
+ Delegates to SessionManager if available for event logging and
612
+ transcript linking:
613
+ 1. Update status to 'done'
573
614
  2. Log 'FeatureComplete' event
574
615
  3. Release claim (optional behavior)
575
616
  4. Link transcript if provided (for parallel agent tracking)
576
617
 
618
+ Falls back to simple status update if SessionManager not available.
619
+
577
620
  Args:
578
621
  node_id: Node ID to complete
579
622
  agent: Agent ID (defaults to SDK agent)
@@ -585,6 +628,10 @@ class BaseCollection(Generic[CollectionT]):
585
628
 
586
629
  Raises:
587
630
  NodeNotFoundError: If node not found
631
+
632
+ Example:
633
+ >>> sdk.features.complete('feat-abc123')
634
+ >>> sdk.features.complete('feat-xyz', agent='claude', transcript_id='trans-123')
588
635
  """
589
636
  agent = agent or self._sdk.agent
590
637
 
@@ -615,11 +662,13 @@ class BaseCollection(Generic[CollectionT]):
615
662
  """
616
663
  Claim a node for an agent.
617
664
 
618
- Delegates to SessionManager to:
665
+ Delegates to SessionManager if available for ownership tracking:
619
666
  1. Check ownership rules
620
667
  2. Update assignment
621
668
  3. Log 'FeatureClaim' event
622
669
 
670
+ Falls back to simple assignment if SessionManager not available.
671
+
623
672
  Args:
624
673
  node_id: Node ID to claim
625
674
  agent: Agent ID (defaults to SDK agent)
@@ -631,6 +680,10 @@ class BaseCollection(Generic[CollectionT]):
631
680
  ValueError: If agent not provided and SDK has no agent
632
681
  NodeNotFoundError: If node not found
633
682
  ClaimConflictError: If node already claimed by different agent
683
+
684
+ Example:
685
+ >>> sdk.features.claim('feat-abc123')
686
+ >>> sdk.features.claim('feat-xyz', agent='claude')
634
687
  """
635
688
  agent = agent or self._sdk.agent
636
689
  if not agent:
@@ -665,11 +718,13 @@ class BaseCollection(Generic[CollectionT]):
665
718
  """
666
719
  Release a claimed node.
667
720
 
668
- Delegates to SessionManager to:
721
+ Delegates to SessionManager if available for ownership tracking:
669
722
  1. Verify ownership
670
723
  2. Clear assignment
671
724
  3. Log 'FeatureRelease' event
672
725
 
726
+ Falls back to simple assignment clearing if SessionManager not available.
727
+
673
728
  Args:
674
729
  node_id: Node ID to release
675
730
  agent: Agent ID (defaults to SDK agent)
@@ -679,6 +734,10 @@ class BaseCollection(Generic[CollectionT]):
679
734
 
680
735
  Raises:
681
736
  NodeNotFoundError: If node not found
737
+
738
+ Example:
739
+ >>> sdk.features.release('feat-abc123')
740
+ >>> sdk.features.release('feat-xyz', agent='claude')
682
741
  """
683
742
  # SessionManager.release_feature requires an agent to verify ownership
684
743
  agent = agent or self._sdk.agent
@@ -395,7 +395,8 @@ def html_to_session(filepath: Path | str) -> Session:
395
395
  parser = HtmlParser.from_file(filepath)
396
396
 
397
397
  # Get article element with session data
398
- article = parser.query_one("article[data-type='session']")
398
+ article_results = parser.query("article[data-type='session']")
399
+ article = article_results[0] if article_results else None
399
400
  if not article:
400
401
  raise ValueError(f"No session article found in: {filepath}")
401
402
 
@@ -465,7 +466,8 @@ def html_to_session(filepath: Path | str) -> Session:
465
466
  data["transcript_git_branch"] = transcript_branch
466
467
 
467
468
  # Parse title
468
- title_el = parser.query_one("h1")
469
+ title_el_results = parser.query("h1")
470
+ title_el = title_el_results[0] if title_el_results else None
469
471
  if title_el:
470
472
  data["title"] = title_el.to_text().strip()
471
473
 
@@ -482,24 +484,28 @@ def html_to_session(filepath: Path | str) -> Session:
482
484
  data["worked_on"] = worked_on
483
485
 
484
486
  # Parse continued_from edge
485
- continued_link = parser.query_one(
487
+ continued_link_results = parser.query(
486
488
  "nav[data-graph-edges] section[data-edge-type='continued-from'] a"
487
489
  )
490
+ continued_link = continued_link_results[0] if continued_link_results else None
488
491
  if continued_link:
489
492
  href = continued_link.attrs.get("href") or ""
490
493
  data["continued_from"] = href.replace(".html", "")
491
494
 
492
495
  # Parse handoff context
493
- handoff_section = parser.query_one("section[data-handoff]")
496
+ handoff_section_results = parser.query("section[data-handoff]")
497
+ handoff_section = handoff_section_results[0] if handoff_section_results else None
494
498
  if handoff_section:
495
- notes_el = parser.query_one("section[data-handoff] [data-handoff-notes]")
499
+ notes_el_results = parser.query("section[data-handoff] [data-handoff-notes]")
500
+ notes_el = notes_el_results[0] if notes_el_results else None
496
501
  if notes_el:
497
502
  notes_text = notes_el.to_text().strip()
498
503
  if notes_text.lower().startswith("notes:"):
499
504
  notes_text = notes_text.split(":", 1)[1].strip()
500
505
  data["handoff_notes"] = notes_text
501
506
 
502
- next_el = parser.query_one("section[data-handoff] [data-recommended-next]")
507
+ next_el_results = parser.query("section[data-handoff] [data-recommended-next]")
508
+ next_el = next_el_results[0] if next_el_results else None
503
509
  if next_el:
504
510
  next_text = next_el.to_text().strip()
505
511
  if next_text.lower().startswith("recommended next:"):
@@ -317,6 +317,24 @@ class Node(BaseModel):
317
317
  "session_ids": self.context_sessions,
318
318
  }
319
319
 
320
+ def to_dict(self) -> dict:
321
+ """
322
+ Convert Node to dictionary format.
323
+
324
+ This is a convenience alias for Pydantic's model_dump() method,
325
+ providing a more discoverable API for serialization.
326
+
327
+ Returns:
328
+ dict: Dictionary representation of the Node with all fields
329
+
330
+ Example:
331
+ >>> feature = sdk.features.create("My Feature").save()
332
+ >>> data = feature.to_dict()
333
+ >>> print(data['title'])
334
+ 'My Feature'
335
+ """
336
+ return self.model_dump()
337
+
320
338
  def to_html(self, stylesheet_path: str = "../styles.css") -> str:
321
339
  """
322
340
  Convert node to full HTML document.
@@ -65,7 +65,6 @@ class HeadlessSpawner:
65
65
  output_format: str = "json",
66
66
  model: str | None = None,
67
67
  include_directories: list[str] | None = None,
68
- color: str = "auto",
69
68
  timeout: int = 120,
70
69
  ) -> AIResult:
71
70
  """
@@ -76,7 +75,6 @@ class HeadlessSpawner:
76
75
  output_format: "json" or "stream-json"
77
76
  model: Model selection (e.g., "gemini-2.0-flash"). Default: None (uses default)
78
77
  include_directories: List of directories to include for context. Default: None
79
- color: Color output control ("auto", "on", "off"). Default: "auto"
80
78
  timeout: Max seconds to wait
81
79
 
82
80
  Returns:
@@ -95,8 +93,8 @@ class HeadlessSpawner:
95
93
  for directory in include_directories:
96
94
  cmd.extend(["--include-directories", directory])
97
95
 
98
- # Add color option
99
- cmd.extend(["--color", color])
96
+ # CRITICAL: Add --yolo for headless mode (auto-approve all tools)
97
+ cmd.append("--yolo")
100
98
 
101
99
  # Execute with timeout and stderr redirection
102
100
  # Note: Cannot use capture_output with stderr parameter
@@ -180,13 +178,11 @@ class HeadlessSpawner:
180
178
  def spawn_codex(
181
179
  self,
182
180
  prompt: str,
183
- approval: str = "never",
184
181
  output_json: bool = True,
185
182
  model: str | None = None,
186
183
  sandbox: str | None = None,
187
- full_auto: bool = False,
184
+ full_auto: bool = True,
188
185
  images: list[str] | None = None,
189
- color: str = "auto",
190
186
  output_last_message: str | None = None,
191
187
  output_schema: str | None = None,
192
188
  skip_git_check: bool = False,
@@ -200,13 +196,11 @@ class HeadlessSpawner:
200
196
 
201
197
  Args:
202
198
  prompt: Task description for Codex
203
- approval: Approval mode ("never", "always")
204
199
  output_json: Use --json flag for JSONL output
205
200
  model: Model selection (e.g., "gpt-4-turbo"). Default: None
206
201
  sandbox: Sandbox mode ("read-only", "workspace-write", "danger-full-access"). Default: None
207
- full_auto: Enable full auto mode (--full-auto). Default: False
202
+ full_auto: Enable full auto mode (--full-auto). Default: True (required for headless)
208
203
  images: List of image paths (--image). Default: None
209
- color: Color output control ("auto", "on", "off"). Default: "auto"
210
204
  output_last_message: Write last message to file (--output-last-message). Default: None
211
205
  output_schema: JSON schema for validation (--output-schema). Default: None
212
206
  skip_git_check: Skip git repo check (--skip-git-repo-check). Default: False
@@ -240,9 +234,6 @@ class HeadlessSpawner:
240
234
  for image in images:
241
235
  cmd.extend(["--image", image])
242
236
 
243
- # Add color option
244
- cmd.extend(["--color", color])
245
-
246
237
  # Add output last message file if specified
247
238
  if output_last_message:
248
239
  cmd.extend(["--output-last-message", output_last_message])
@@ -267,7 +258,8 @@ class HeadlessSpawner:
267
258
  if bypass_approvals:
268
259
  cmd.append("--dangerously-bypass-approvals-and-sandbox")
269
260
 
270
- cmd.extend(["--approval", approval, prompt])
261
+ # Add prompt as final argument
262
+ cmd.append(prompt)
271
263
 
272
264
  try:
273
265
  result = subprocess.run(