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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
  2. htmlgraph/.htmlgraph/agents.json +72 -0
  3. htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  4. htmlgraph/__init__.py +51 -1
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +26 -10
  7. htmlgraph/agent_registry.py +2 -1
  8. htmlgraph/analytics/__init__.py +8 -1
  9. htmlgraph/analytics/cli.py +86 -20
  10. htmlgraph/analytics/cost_analyzer.py +391 -0
  11. htmlgraph/analytics/cost_monitor.py +664 -0
  12. htmlgraph/analytics/cost_reporter.py +675 -0
  13. htmlgraph/analytics/cross_session.py +617 -0
  14. htmlgraph/analytics/dependency.py +10 -6
  15. htmlgraph/analytics/pattern_learning.py +771 -0
  16. htmlgraph/analytics/session_graph.py +707 -0
  17. htmlgraph/analytics/strategic/__init__.py +80 -0
  18. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  19. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  20. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  21. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  22. htmlgraph/analytics/work_type.py +67 -27
  23. htmlgraph/analytics_index.py +53 -20
  24. htmlgraph/api/__init__.py +3 -0
  25. htmlgraph/api/cost_alerts_websocket.py +416 -0
  26. htmlgraph/api/main.py +2498 -0
  27. htmlgraph/api/static/htmx.min.js +1 -0
  28. htmlgraph/api/static/style-redesign.css +1344 -0
  29. htmlgraph/api/static/style.css +1079 -0
  30. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  31. htmlgraph/api/templates/dashboard.html +794 -0
  32. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  33. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  34. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  35. htmlgraph/api/templates/partials/agents.html +317 -0
  36. htmlgraph/api/templates/partials/event-traces.html +373 -0
  37. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  38. htmlgraph/api/templates/partials/features.html +578 -0
  39. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  40. htmlgraph/api/templates/partials/metrics.html +346 -0
  41. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  42. htmlgraph/api/templates/partials/orchestration.html +198 -0
  43. htmlgraph/api/templates/partials/spawners.html +375 -0
  44. htmlgraph/api/templates/partials/work-items.html +613 -0
  45. htmlgraph/api/websocket.py +538 -0
  46. htmlgraph/archive/__init__.py +24 -0
  47. htmlgraph/archive/bloom.py +234 -0
  48. htmlgraph/archive/fts.py +297 -0
  49. htmlgraph/archive/manager.py +583 -0
  50. htmlgraph/archive/search.py +244 -0
  51. htmlgraph/atomic_ops.py +560 -0
  52. htmlgraph/attribute_index.py +2 -1
  53. htmlgraph/bounded_paths.py +539 -0
  54. htmlgraph/builders/base.py +57 -2
  55. htmlgraph/builders/bug.py +19 -3
  56. htmlgraph/builders/chore.py +19 -3
  57. htmlgraph/builders/epic.py +19 -3
  58. htmlgraph/builders/feature.py +27 -3
  59. htmlgraph/builders/insight.py +2 -1
  60. htmlgraph/builders/metric.py +2 -1
  61. htmlgraph/builders/pattern.py +2 -1
  62. htmlgraph/builders/phase.py +19 -3
  63. htmlgraph/builders/spike.py +29 -3
  64. htmlgraph/builders/track.py +42 -1
  65. htmlgraph/cigs/__init__.py +81 -0
  66. htmlgraph/cigs/autonomy.py +385 -0
  67. htmlgraph/cigs/cost.py +475 -0
  68. htmlgraph/cigs/messages_basic.py +472 -0
  69. htmlgraph/cigs/messaging.py +365 -0
  70. htmlgraph/cigs/models.py +771 -0
  71. htmlgraph/cigs/pattern_storage.py +427 -0
  72. htmlgraph/cigs/patterns.py +503 -0
  73. htmlgraph/cigs/posttool_analyzer.py +234 -0
  74. htmlgraph/cigs/reporter.py +818 -0
  75. htmlgraph/cigs/tracker.py +317 -0
  76. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  77. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  78. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  79. htmlgraph/cli/__init__.py +42 -0
  80. htmlgraph/cli/__main__.py +6 -0
  81. htmlgraph/cli/analytics.py +1424 -0
  82. htmlgraph/cli/base.py +685 -0
  83. htmlgraph/cli/constants.py +206 -0
  84. htmlgraph/cli/core.py +954 -0
  85. htmlgraph/cli/main.py +147 -0
  86. htmlgraph/cli/models.py +475 -0
  87. htmlgraph/cli/templates/__init__.py +1 -0
  88. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  89. htmlgraph/cli/work/__init__.py +239 -0
  90. htmlgraph/cli/work/browse.py +115 -0
  91. htmlgraph/cli/work/features.py +568 -0
  92. htmlgraph/cli/work/orchestration.py +676 -0
  93. htmlgraph/cli/work/report.py +728 -0
  94. htmlgraph/cli/work/sessions.py +466 -0
  95. htmlgraph/cli/work/snapshot.py +559 -0
  96. htmlgraph/cli/work/tracks.py +486 -0
  97. htmlgraph/cli_commands/__init__.py +1 -0
  98. htmlgraph/cli_commands/feature.py +195 -0
  99. htmlgraph/cli_framework.py +115 -0
  100. htmlgraph/collections/__init__.py +2 -0
  101. htmlgraph/collections/base.py +197 -14
  102. htmlgraph/collections/bug.py +2 -1
  103. htmlgraph/collections/chore.py +2 -1
  104. htmlgraph/collections/epic.py +2 -1
  105. htmlgraph/collections/feature.py +2 -1
  106. htmlgraph/collections/insight.py +2 -1
  107. htmlgraph/collections/metric.py +2 -1
  108. htmlgraph/collections/pattern.py +2 -1
  109. htmlgraph/collections/phase.py +2 -1
  110. htmlgraph/collections/session.py +194 -0
  111. htmlgraph/collections/spike.py +13 -2
  112. htmlgraph/collections/task_delegation.py +241 -0
  113. htmlgraph/collections/todo.py +14 -1
  114. htmlgraph/collections/traces.py +487 -0
  115. htmlgraph/config/cost_models.json +56 -0
  116. htmlgraph/config.py +190 -0
  117. htmlgraph/context_analytics.py +2 -1
  118. htmlgraph/converter.py +116 -7
  119. htmlgraph/cost_analysis/__init__.py +5 -0
  120. htmlgraph/cost_analysis/analyzer.py +438 -0
  121. htmlgraph/dashboard.html +2246 -248
  122. htmlgraph/dashboard.html.backup +6592 -0
  123. htmlgraph/dashboard.html.bak +7181 -0
  124. htmlgraph/dashboard.html.bak2 +7231 -0
  125. htmlgraph/dashboard.html.bak3 +7232 -0
  126. htmlgraph/db/__init__.py +38 -0
  127. htmlgraph/db/queries.py +790 -0
  128. htmlgraph/db/schema.py +1788 -0
  129. htmlgraph/decorators.py +317 -0
  130. htmlgraph/dependency_models.py +2 -1
  131. htmlgraph/deploy.py +26 -27
  132. htmlgraph/docs/API_REFERENCE.md +841 -0
  133. htmlgraph/docs/HTTP_API.md +750 -0
  134. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  135. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  136. htmlgraph/docs/README.md +532 -0
  137. htmlgraph/docs/__init__.py +77 -0
  138. htmlgraph/docs/docs_version.py +55 -0
  139. htmlgraph/docs/metadata.py +93 -0
  140. htmlgraph/docs/migrations.py +232 -0
  141. htmlgraph/docs/template_engine.py +143 -0
  142. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  143. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  144. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  145. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  146. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  147. htmlgraph/docs/version_check.py +163 -0
  148. htmlgraph/edge_index.py +2 -1
  149. htmlgraph/error_handler.py +544 -0
  150. htmlgraph/event_log.py +86 -37
  151. htmlgraph/event_migration.py +2 -1
  152. htmlgraph/file_watcher.py +12 -8
  153. htmlgraph/find_api.py +2 -1
  154. htmlgraph/git_events.py +67 -9
  155. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  156. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  157. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  158. htmlgraph/hooks/__init__.py +8 -0
  159. htmlgraph/hooks/bootstrap.py +169 -0
  160. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  161. htmlgraph/hooks/concurrent_sessions.py +208 -0
  162. htmlgraph/hooks/context.py +350 -0
  163. htmlgraph/hooks/drift_handler.py +525 -0
  164. htmlgraph/hooks/event_tracker.py +790 -99
  165. htmlgraph/hooks/git_commands.py +175 -0
  166. htmlgraph/hooks/installer.py +5 -1
  167. htmlgraph/hooks/orchestrator.py +327 -76
  168. htmlgraph/hooks/orchestrator_reflector.py +31 -4
  169. htmlgraph/hooks/post_tool_use_failure.py +32 -7
  170. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  171. htmlgraph/hooks/posttooluse.py +92 -19
  172. htmlgraph/hooks/pretooluse.py +527 -7
  173. htmlgraph/hooks/prompt_analyzer.py +637 -0
  174. htmlgraph/hooks/session_handler.py +668 -0
  175. htmlgraph/hooks/session_summary.py +395 -0
  176. htmlgraph/hooks/state_manager.py +504 -0
  177. htmlgraph/hooks/subagent_detection.py +202 -0
  178. htmlgraph/hooks/subagent_stop.py +369 -0
  179. htmlgraph/hooks/task_enforcer.py +99 -4
  180. htmlgraph/hooks/validator.py +212 -91
  181. htmlgraph/ids.py +2 -1
  182. htmlgraph/learning.py +125 -100
  183. htmlgraph/mcp_server.py +2 -1
  184. htmlgraph/models.py +217 -18
  185. htmlgraph/operations/README.md +62 -0
  186. htmlgraph/operations/__init__.py +79 -0
  187. htmlgraph/operations/analytics.py +339 -0
  188. htmlgraph/operations/bootstrap.py +289 -0
  189. htmlgraph/operations/events.py +244 -0
  190. htmlgraph/operations/fastapi_server.py +231 -0
  191. htmlgraph/operations/hooks.py +350 -0
  192. htmlgraph/operations/initialization.py +597 -0
  193. htmlgraph/operations/initialization.py.backup +228 -0
  194. htmlgraph/operations/server.py +303 -0
  195. htmlgraph/orchestration/__init__.py +58 -0
  196. htmlgraph/orchestration/claude_launcher.py +179 -0
  197. htmlgraph/orchestration/command_builder.py +72 -0
  198. htmlgraph/orchestration/headless_spawner.py +281 -0
  199. htmlgraph/orchestration/live_events.py +377 -0
  200. htmlgraph/orchestration/model_selection.py +327 -0
  201. htmlgraph/orchestration/plugin_manager.py +140 -0
  202. htmlgraph/orchestration/prompts.py +137 -0
  203. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  204. htmlgraph/orchestration/spawners/__init__.py +16 -0
  205. htmlgraph/orchestration/spawners/base.py +194 -0
  206. htmlgraph/orchestration/spawners/claude.py +173 -0
  207. htmlgraph/orchestration/spawners/codex.py +435 -0
  208. htmlgraph/orchestration/spawners/copilot.py +294 -0
  209. htmlgraph/orchestration/spawners/gemini.py +471 -0
  210. htmlgraph/orchestration/subprocess_runner.py +36 -0
  211. htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
  212. htmlgraph/orchestration.md +563 -0
  213. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  214. htmlgraph/orchestrator.py +2 -1
  215. htmlgraph/orchestrator_config.py +357 -0
  216. htmlgraph/orchestrator_mode.py +115 -4
  217. htmlgraph/parallel.py +2 -1
  218. htmlgraph/parser.py +86 -6
  219. htmlgraph/path_query.py +608 -0
  220. htmlgraph/pattern_matcher.py +636 -0
  221. htmlgraph/pydantic_models.py +476 -0
  222. htmlgraph/quality_gates.py +350 -0
  223. htmlgraph/query_builder.py +2 -1
  224. htmlgraph/query_composer.py +509 -0
  225. htmlgraph/reflection.py +443 -0
  226. htmlgraph/refs.py +344 -0
  227. htmlgraph/repo_hash.py +512 -0
  228. htmlgraph/repositories/__init__.py +292 -0
  229. htmlgraph/repositories/analytics_repository.py +455 -0
  230. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  231. htmlgraph/repositories/feature_repository.py +581 -0
  232. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  233. htmlgraph/repositories/feature_repository_memory.py +607 -0
  234. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  235. htmlgraph/repositories/filter_service.py +620 -0
  236. htmlgraph/repositories/filter_service_standard.py +445 -0
  237. htmlgraph/repositories/shared_cache.py +621 -0
  238. htmlgraph/repositories/shared_cache_memory.py +395 -0
  239. htmlgraph/repositories/track_repository.py +552 -0
  240. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  241. htmlgraph/repositories/track_repository_memory.py +508 -0
  242. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  243. htmlgraph/sdk/__init__.py +398 -0
  244. htmlgraph/sdk/__init__.pyi +14 -0
  245. htmlgraph/sdk/analytics/__init__.py +19 -0
  246. htmlgraph/sdk/analytics/engine.py +155 -0
  247. htmlgraph/sdk/analytics/helpers.py +178 -0
  248. htmlgraph/sdk/analytics/registry.py +109 -0
  249. htmlgraph/sdk/base.py +484 -0
  250. htmlgraph/sdk/constants.py +216 -0
  251. htmlgraph/sdk/core.pyi +308 -0
  252. htmlgraph/sdk/discovery.py +120 -0
  253. htmlgraph/sdk/help/__init__.py +12 -0
  254. htmlgraph/sdk/help/mixin.py +699 -0
  255. htmlgraph/sdk/mixins/__init__.py +15 -0
  256. htmlgraph/sdk/mixins/attribution.py +113 -0
  257. htmlgraph/sdk/mixins/mixin.py +410 -0
  258. htmlgraph/sdk/operations/__init__.py +12 -0
  259. htmlgraph/sdk/operations/mixin.py +427 -0
  260. htmlgraph/sdk/orchestration/__init__.py +17 -0
  261. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  262. htmlgraph/sdk/orchestration/spawner.py +204 -0
  263. htmlgraph/sdk/planning/__init__.py +19 -0
  264. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  265. htmlgraph/sdk/planning/mixin.py +211 -0
  266. htmlgraph/sdk/planning/parallel.py +186 -0
  267. htmlgraph/sdk/planning/queue.py +210 -0
  268. htmlgraph/sdk/planning/recommendations.py +87 -0
  269. htmlgraph/sdk/planning/smart_planning.py +319 -0
  270. htmlgraph/sdk/session/__init__.py +19 -0
  271. htmlgraph/sdk/session/continuity.py +57 -0
  272. htmlgraph/sdk/session/handoff.py +110 -0
  273. htmlgraph/sdk/session/info.py +309 -0
  274. htmlgraph/sdk/session/manager.py +103 -0
  275. htmlgraph/sdk/strategic/__init__.py +26 -0
  276. htmlgraph/sdk/strategic/mixin.py +563 -0
  277. htmlgraph/server.py +295 -107
  278. htmlgraph/session_hooks.py +300 -0
  279. htmlgraph/session_manager.py +285 -3
  280. htmlgraph/session_registry.py +587 -0
  281. htmlgraph/session_state.py +436 -0
  282. htmlgraph/session_warning.py +2 -1
  283. htmlgraph/sessions/__init__.py +23 -0
  284. htmlgraph/sessions/handoff.py +756 -0
  285. htmlgraph/system_prompts.py +450 -0
  286. htmlgraph/templates/orchestration-view.html +350 -0
  287. htmlgraph/track_builder.py +33 -1
  288. htmlgraph/track_manager.py +38 -0
  289. htmlgraph/transcript.py +18 -5
  290. htmlgraph/validation.py +115 -0
  291. htmlgraph/watch.py +2 -1
  292. htmlgraph/work_type_utils.py +2 -1
  293. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
  294. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
  295. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  296. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  297. htmlgraph/cli.py +0 -4839
  298. htmlgraph/sdk.py +0 -2359
  299. htmlgraph-0.20.1.dist-info/RECORD +0 -118
  300. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  301. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  302. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  303. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  304. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,563 @@
1
+ # Orchestration Rules - Cost-First Delegation
2
+
3
+ **CRITICAL: When operating in orchestrator mode, you MUST delegate ALL operations except a minimal set of strategic activities.**
4
+
5
+ ## Cost-First Delegation Priority
6
+
7
+ **IMPERATIVE: ALWAYS choose the cheapest/best approach for each task type.**
8
+
9
+ Use this decision tree IN ORDER (check each before falling back):
10
+
11
+ 1. **Exploration/Research** → `Task(subagent_type="Explore")` (Uses Gemini FREE, 2M tokens)
12
+ 2. **Git/GitHub Operations** → `Bash` tool with `gh` CLI (direct GitHub integration)
13
+ 3. **Code Implementation** → `Task(subagent_type="general-purpose")` (Claude native)
14
+ 4. **Simple Operations** → `Bash` tool (direct, for ls/pwd/cat/echo type commands)
15
+ 5. **Deep Reasoning/Architecture** → Task() with Opus subagent ($$$$)
16
+ 6. **Multi-Agent Coordination** → Task() with Sonnet subagent ($$$)
17
+ 7. **FALLBACK ONLY** → Task() with Haiku subagent ($$, when above unavailable)
18
+
19
+ ### Using Skills for Guidance
20
+
21
+ **Skills provide implementation guidance for common patterns:**
22
+
23
+ ```
24
+ # Use /gemini skill for exploration guidance
25
+ Skill(skill="gemini") # Shows how to use Explore agent effectively
26
+
27
+ # Use /codex skill for implementation patterns
28
+ Skill(skill="codex") # Shows code generation best practices
29
+
30
+ # Use /copilot skill for Git/GitHub workflows
31
+ Skill(skill="copilot") # Shows gh CLI commands and patterns
32
+ ```
33
+
34
+ ### Task() for Claude Subagents
35
+
36
+ **Task() delegates work to Claude-based subagents:**
37
+
38
+ ```python
39
+ # Exploration using Explore agent (uses Gemini FREE)
40
+ Task(
41
+ subagent_type="Explore",
42
+ prompt="Analyze codebase patterns for authentication"
43
+ )
44
+
45
+ # Code implementation using general-purpose agent
46
+ Task(
47
+ subagent_type="general-purpose",
48
+ prompt="Implement JWT authentication middleware with tests"
49
+ )
50
+
51
+ # Strategic planning using Opus
52
+ Task(
53
+ subagent_type="general-purpose",
54
+ model="opus",
55
+ prompt="Design authentication architecture"
56
+ )
57
+ ```
58
+
59
+ ### Bash for Direct Operations
60
+
61
+ **Use Bash tool directly for Git/GitHub operations:**
62
+
63
+ ```bash
64
+ # Git operations
65
+ git add . && git commit -m "feat: add auth"
66
+
67
+ # GitHub operations via gh CLI
68
+ gh pr create --title "Add auth" --body "Implements JWT middleware"
69
+
70
+ # Chained operations
71
+ git checkout -b feature/auth && git add . && gh pr create
72
+ ```
73
+
74
+ ### When to Use Each Approach
75
+
76
+ **Use Explore Agent (Task with subagent_type="Explore"):**
77
+ - ✅ Large codebase searches (FREE via Gemini)
78
+ - ✅ Understanding unfamiliar systems
79
+ - ✅ Documentation research
80
+ - ✅ Analysis requiring large context
81
+
82
+ **Use General-Purpose Agent (Task with subagent_type="general-purpose"):**
83
+ - ✅ Code generation and implementation
84
+ - ✅ Strategic coordination across models
85
+ - ✅ Multi-agent orchestration
86
+ - ✅ Architecture/design decisions
87
+
88
+ **Use Bash Tool:**
89
+ - ✅ Git operations (commit, push, branch)
90
+ - ✅ GitHub operations via gh CLI
91
+ - ✅ Simple file operations (ls, cat, echo)
92
+ - ✅ Build and deployment commands
93
+
94
+ **Cost Comparison**:
95
+ - Exploring 100 files: Explore agent (FREE via Gemini) vs general-purpose Task ($15-25) = 100% savings
96
+ - Git operations: Bash with gh CLI (minimal) vs Task ($5-10) = near 100% savings
97
+ - Code generation: Task ($10-15) = standard Claude rates
98
+
99
+ **Token Cache Consideration**:
100
+ Task() provides 5x cheaper prompt caching for RELATED sequential work within same conversation.
101
+
102
+ ## Model Selection Reference
103
+
104
+ For detailed model selection logic, see:
105
+ - `/multi-ai-orchestration` skill (comprehensive guide)
106
+ - `src/python/htmlgraph/orchestration/model_selection.py` (decision matrix)
107
+ - `src/python/htmlgraph/orchestration/headless_spawner.py` (implementation)
108
+
109
+ ## Core Philosophy
110
+
111
+ **You don't know the outcome before running a tool.** What looks like "one bash call" often becomes 2, 3, 4+ calls when handling failures, conflicts, hooks, or errors. Delegation preserves strategic context by isolating tactical execution in subagent threads.
112
+
113
+ ## Operations You MUST Delegate
114
+
115
+ **ALL operations EXCEPT:**
116
+ - `Task()` - Delegation itself (use spawner subagent types when possible)
117
+ - `AskUserQuestion()` - Clarifying requirements with user
118
+ - `TodoWrite()` - Tracking work items
119
+ - SDK operations - Creating features, spikes, bugs, analytics
120
+
121
+ **Everything else MUST be delegated**, including:
122
+
123
+ ### 1. Git Operations - ALWAYS use Copilot
124
+
125
+ **REQUIRED: MUST use Copilot spawner for all git/GitHub operations.**
126
+
127
+ - ❌ NEVER run git commands directly (add, commit, push, branch, merge)
128
+ - ❌ NEVER use generic Task() for git operations (expensive, not specialized)
129
+ - ✅ ALWAYS use Copilot spawner (cheaper, GitHub-specialized)
130
+
131
+ **Why Copilot?** Git operations cascade unpredictably + Copilot is specialized:
132
+ - Commit hooks may fail (need fix + retry)
133
+ - Conflicts may occur (need resolution + retry)
134
+ - Push may fail (need pull + merge + retry)
135
+ - Tests may fail in hooks (need fix + retry)
136
+ - Copilot has native GitHub integration
137
+
138
+ **Cost comparison:**
139
+ ```
140
+ Task() for git: $5-10 per workflow
141
+ Copilot for git: $2-3 per workflow (60% savings + better results)
142
+ Direct execution: 7+ tool calls (context pollution)
143
+ ```
144
+
145
+ **IMPERATIVE Delegation pattern:**
146
+ ```
147
+ # ✅ CORRECT - Use Bash tool with gh CLI for git operations
148
+ Bash("""
149
+ gh pr create --title "Add feature" --body "Description" || \
150
+ git add CLAUDE.md SKILL.md git-commit-push.sh && \
151
+ git commit -m 'docs: enforce strict git delegation in orchestrator directives' && \
152
+ git push origin main
153
+ """)
154
+
155
+ # See /copilot skill for more gh CLI workflows
156
+
157
+ # ❌ INCORRECT - Don't run git commands in multiple separate Bash calls
158
+ Bash("git add file.py")
159
+ Bash("git commit -m 'message'")
160
+ Bash("git push")
161
+ ```
162
+
163
+ ### 2. Code Changes - Delegate to General-Purpose Agent
164
+
165
+ **REQUIRED: MUST delegate code implementation (unless trivial).**
166
+
167
+ - ❌ NEVER execute code changes directly (expensive, loses strategic context)
168
+ - ❌ Multi-file edits → MUST delegate to general-purpose agent
169
+ - ❌ Implementation requiring research → MUST delegate
170
+ - ❌ Changes with testing requirements → MUST delegate
171
+ - ✅ Single-line typo fixes (OK to do directly)
172
+
173
+ **IMPERATIVE Delegation pattern:**
174
+ ```
175
+ # ✅ CORRECT - Use Task() for code implementation
176
+ Task(
177
+ subagent_type="general-purpose",
178
+ prompt="Implement authentication middleware with JWT..."
179
+ )
180
+
181
+ # See /codex skill for implementation patterns
182
+
183
+ # ❌ INCORRECT - Don't execute code changes directly
184
+ Edit(file_path="...", old_string="...", new_string="...")
185
+ Write(file_path="...", content="...")
186
+ ```
187
+
188
+ ### 3. Research & Exploration - Use Explore Agent (FREE!)
189
+
190
+ **REQUIRED: MUST use Explore agent for exploration (FREE via Gemini!).**
191
+
192
+ - ❌ NEVER use general-purpose Task() for exploration (expensive)
193
+ - ❌ Large codebase searches → MUST use Explore agent (FREE)
194
+ - ❌ Understanding unfamiliar systems → MUST use Explore agent (FREE)
195
+ - ❌ Documentation research → MUST use Explore agent (FREE)
196
+ - ✅ Single file quick lookup (OK to do directly)
197
+
198
+ **IMPERATIVE Delegation pattern:**
199
+ ```
200
+ # ✅ CORRECT - Use Explore agent (leverages Gemini FREE tier)
201
+ Task(
202
+ subagent_type="Explore",
203
+ prompt="Analyze all authentication patterns in codebase"
204
+ )
205
+
206
+ # See /gemini skill for exploration guidance
207
+
208
+ # ❌ INCORRECT - Don't use general-purpose Task() (costs $15-25 vs FREE)
209
+ Task(subagent_type="general-purpose", prompt="Explore codebase...")
210
+ ```
211
+
212
+ ### 4. Testing & Validation - MUST DELEGATE
213
+
214
+ **REQUIRED: MUST delegate testing operations.**
215
+
216
+ - ❌ Running test suites → MUST delegate to general-purpose agent
217
+ - ❌ Debugging test failures → MUST delegate
218
+ - ❌ Quality gate validation → MUST delegate
219
+ - ✅ Checking test command exists (OK to do directly)
220
+
221
+ **Delegation pattern:**
222
+ ```
223
+ # ✅ CORRECT - Delegate testing to general-purpose agent
224
+ Task(
225
+ subagent_type="general-purpose",
226
+ prompt="Run pytest suite and fix any failures"
227
+ )
228
+
229
+ # Or use Bash for simple test runs (no fixes)
230
+ Bash("uv run pytest")
231
+ ```
232
+
233
+ ### 5. Build & Deployment - MUST DELEGATE
234
+ - ❌ Build processes → MUST delegate
235
+ - ❌ Package publishing → MUST delegate
236
+ - ❌ Environment setup → MUST delegate
237
+ - ✅ Checking deployment script exists (OK to do directly)
238
+
239
+ ### 6. File Operations - DELEGATE Complex Operations
240
+ - ❌ Batch file operations (multiple files) → MUST delegate
241
+ - ❌ Large file reading/writing → MUST delegate
242
+ - ❌ Complex file transformations → MUST delegate
243
+ - ✅ Reading single config file (OK to do directly)
244
+ - ✅ Writing single small file (OK to do directly)
245
+
246
+ ### 7. Analysis & Computation - ALWAYS use Gemini
247
+
248
+ **REQUIRED: MUST use Gemini spawner for analysis (FREE!).**
249
+
250
+ - ❌ Performance profiling → MUST use Gemini spawner (FREE)
251
+ - ❌ Large-scale analysis → MUST use Gemini spawner (FREE)
252
+ - ❌ Complex calculations → MUST delegate
253
+ - ✅ Simple status checks (OK to do directly)
254
+
255
+ ## Why Strict Delegation Matters
256
+
257
+ **1. Cost Optimization (NEW - MOST IMPORTANT)**
258
+ - Gemini is FREE for exploration (vs $15-25 with Task)
259
+ - Codex is 70% cheaper for code (vs Task)
260
+ - Copilot is 60% cheaper for git (vs Task)
261
+ - Choosing the right model saves 60-100% per operation
262
+
263
+ **2. Context Preservation**
264
+ - Each tool call consumes tokens
265
+ - Failed operations consume MORE tokens
266
+ - Cascading failures consume MOST tokens
267
+ - Delegation isolates failure to subagent context
268
+
269
+ **3. Parallel Efficiency**
270
+ - Multiple subagents can work simultaneously
271
+ - Orchestrator stays available for decisions
272
+ - Higher throughput on independent tasks
273
+
274
+ **4. Error Isolation**
275
+ - Subagent handles retries and recovery
276
+ - Orchestrator receives clean success/failure
277
+ - No pollution of strategic context
278
+
279
+ **5. Cognitive Clarity**
280
+ - Orchestrator maintains high-level view
281
+ - Subagents handle tactical details
282
+ - Clear separation of concerns
283
+
284
+ ## Decision Framework
285
+
286
+ Ask yourself IN ORDER:
287
+ 1. **Is this exploration/research?**
288
+ - If yes → MUST use Gemini spawner (FREE)
289
+
290
+ 2. **Is this code implementation?**
291
+ - If yes → MUST use Codex spawner (cheaper, specialized)
292
+
293
+ 3. **Is this git/GitHub operation?**
294
+ - If yes → MUST use Copilot spawner (cheaper, specialized)
295
+
296
+ 4. **Is this strategic coordination?**
297
+ - If yes → MAY use generic Task() with Opus/Sonnet
298
+
299
+ 5. **Is this a trivial single tool call?**
300
+ - If yes AND certain → MAY do directly
301
+ - If uncertain → MUST delegate to appropriate spawner
302
+
303
+ ## Orchestrator Reflection System
304
+
305
+ When orchestrator mode is enabled (strict), you'll receive reflections after direct tool execution:
306
+
307
+ ```
308
+ ORCHESTRATOR REFLECTION: You executed code directly.
309
+
310
+ Ask yourself:
311
+ - Could this have been delegated to Gemini spawner (FREE)?
312
+ - Could this have been delegated to Codex spawner (70% cheaper)?
313
+ - Could this have been delegated to Copilot spawner (60% cheaper)?
314
+ - What if this operation fails - how many retries will consume context?
315
+ - Would parallel spawner Task() calls have been faster?
316
+ ```
317
+
318
+ Use these reflections to adjust your delegation habits.
319
+
320
+ ## Integration with HtmlGraph SDK
321
+
322
+ Always use SDK to track orchestration activities:
323
+
324
+ ```python
325
+ from htmlgraph import SDK
326
+
327
+ sdk = SDK(agent='orchestrator')
328
+
329
+ # Track what you delegate
330
+ feature = sdk.features.create("Implement authentication") \
331
+ .set_priority("high") \
332
+ .add_steps([
333
+ "Research existing auth patterns (delegated to Gemini FREE)",
334
+ "Implement OAuth flow (delegated to Codex)",
335
+ "Add tests (delegated to Codex)",
336
+ "Commit changes (delegated to Copilot)"
337
+ ]) \
338
+ .save()
339
+ ```
340
+
341
+ Then delegate using Skill tool to invoke spawner skills:
342
+
343
+ ```
344
+ # Research (FREE!)
345
+ Skill(
346
+ skill=".claude-plugin:gemini-spawner",
347
+ args="Find all auth-related code and analyze patterns"
348
+ )
349
+
350
+ # Implementation
351
+ Skill(
352
+ skill=".claude-plugin:codex-spawner",
353
+ args="Implement OAuth flow based on research findings"
354
+ )
355
+
356
+ # Git operations
357
+ Skill(
358
+ skill=".claude-plugin:copilot-spawner",
359
+ args="Commit changes with message: 'feat: add OAuth'"
360
+ )
361
+ ```
362
+
363
+ **See:** `packages/claude-plugin/skills/multi-ai-orchestration-skill/SKILL.md` for complete model selection patterns
364
+
365
+ ## Task ID Pattern for Parallel Coordination
366
+
367
+ **Problem:** Timestamp-based lookup cannot distinguish parallel task results.
368
+
369
+ **Solution:** Generate unique task ID for each delegation.
370
+
371
+ ### Helper Functions
372
+
373
+ HtmlGraph provides orchestration helpers in `htmlgraph.orchestration`:
374
+
375
+ ```python
376
+ from htmlgraph.orchestration import delegate_with_id, get_results_by_task_id
377
+
378
+ # Generate task ID and enhanced prompt
379
+ task_id, prompt = delegate_with_id(
380
+ "Implement authentication",
381
+ "Add JWT auth to API endpoints...",
382
+ "general-purpose"
383
+ )
384
+
385
+ # Delegate (orchestrator calls Task tool)
386
+ Task(
387
+ prompt=prompt,
388
+ description=f"{task_id}: Implement authentication",
389
+ subagent_type="general-purpose"
390
+ )
391
+
392
+ # Retrieve results by task ID
393
+ results = get_results_by_task_id(sdk, task_id, timeout=120)
394
+ if results["success"]:
395
+ print(results["findings"])
396
+ ```
397
+
398
+ ### Parallel Task Coordination
399
+
400
+ ```python
401
+ from htmlgraph.orchestration import delegate_with_id, get_results_by_task_id
402
+
403
+ # Spawn 3 parallel tasks
404
+ auth_id, auth_prompt = delegate_with_id("Implement auth", "...", "general-purpose")
405
+ test_id, test_prompt = delegate_with_id("Write tests", "...", "general-purpose")
406
+ docs_id, docs_prompt = delegate_with_id("Update docs", "...", "general-purpose")
407
+
408
+ # Delegate all in parallel (single message, multiple Task calls)
409
+ Task(prompt=auth_prompt, description=f"{auth_id}: Implement auth")
410
+ Task(prompt=test_prompt, description=f"{test_id}: Write tests")
411
+ Task(prompt=docs_prompt, description=f"{docs_id}: Update docs")
412
+
413
+ # Retrieve results independently (order doesn't matter)
414
+ auth_results = get_results_by_task_id(sdk, auth_id)
415
+ test_results = get_results_by_task_id(sdk, test_id)
416
+ docs_results = get_results_by_task_id(sdk, docs_id)
417
+ ```
418
+
419
+ **Benefits:**
420
+ - Works with parallel delegations
421
+ - Full traceability (Task → task_id → spike → findings)
422
+ - Timeout handling with polling
423
+ - Independent result retrieval
424
+
425
+ ## Git Workflow Patterns
426
+
427
+ ### Orchestrator Pattern (REQUIRED)
428
+
429
+ When operating as orchestrator, ALWAYS use Copilot spawner skill for git operations:
430
+
431
+ ```
432
+ # ✅ CORRECT - Use Skill to invoke Copilot spawner for git workflow
433
+ Skill(
434
+ skill=".claude-plugin:copilot-spawner",
435
+ args="""Commit and push changes to git:
436
+
437
+ Files to commit: [list files or use 'all changes']
438
+ Commit message: "chore: update session tracking"
439
+
440
+ Steps:
441
+ 1. Run ./scripts/git-commit-push.sh "chore: update session tracking" --no-confirm
442
+ 2. If that script doesn't exist, use manual git workflow:
443
+ - git add [files]
444
+ - git commit -m "message"
445
+ - git push origin main
446
+ 3. Handle any errors (pre-commit hooks, conflicts, push failures)
447
+ 4. Retry with fixes if needed
448
+
449
+ Report final status: success or failure with details.
450
+
451
+ 🔴 CRITICAL - Track in HtmlGraph:
452
+ After successful commit, update the active feature/spike with completion status."""
453
+ )
454
+
455
+ # ❌ INCORRECT - Don't use Task() for spawners (spawns Claude subagent)
456
+ Task(
457
+ prompt="commit changes...",
458
+ subagent_type="general-purpose"
459
+ )
460
+ ```
461
+
462
+ **Why Copilot?** Git operations cascade unpredictably + cost savings:
463
+ - Pre-commit hooks may fail → need code fix → retry commit
464
+ - Push may fail due to conflicts → need pull → merge → retry push
465
+ - Tests may fail in hooks → need debugging → fix → retry
466
+ - Copilot is 60% cheaper than Task() for git operations
467
+
468
+ **Cost:**
469
+ - Direct execution: 5-10+ tool calls (with failures and retries)
470
+ - Task() delegation: $5-10 per workflow
471
+ - Copilot delegation: $2-3 per workflow (60% savings)
472
+
473
+ ## Troubleshooting Spawner Issues
474
+
475
+ ### "Spawner 'gemini' requires 'gemini' CLI"
476
+
477
+ **Meaning:** The Gemini CLI is not installed on the system.
478
+
479
+ **Solution 1: Install the CLI**
480
+ ```bash
481
+ # Install Gemini CLI
482
+ # See: https://ai.google.dev/gemini-api/docs/cli
483
+
484
+ # Verify installation
485
+ which gemini
486
+ ```
487
+
488
+ **Solution 2: Use different spawner**
489
+ ```
490
+ # Try Codex instead
491
+ Skill(skill=".claude-plugin:codex-spawner", args="Same task")
492
+
493
+ # Or fallback to Claude subagent
494
+ Task(subagent_type="haiku", prompt="Same task")
495
+ ```
496
+
497
+ ### Spawner Execution Timeout
498
+
499
+ **Meaning:** The spawner took longer than expected to complete.
500
+
501
+ **Solution:**
502
+ ```
503
+ # Break into smaller subtasks
504
+ Skill(skill=".claude-plugin:gemini-spawner", args="Analyze first 50 files")
505
+ Skill(skill=".claude-plugin:gemini-spawner", args="Analyze next 50 files")
506
+ ```
507
+
508
+ ### "Operation cannot proceed without required CLI"
509
+
510
+ **Meaning:** The CLI is genuinely not installed, not a transient error.
511
+
512
+ **This is TRANSPARENT - not a silent fallback:**
513
+ - Orchestrator receives explicit error
514
+ - You decide: install, use different spawner, or fallback to Claude
515
+ - Do NOT silently fallback
516
+
517
+ **Example:**
518
+ ```python
519
+ # This fails explicitly if CLI missing (no silent fallback)
520
+ try:
521
+ result = Skill(skill=".claude-plugin:gemini-spawner", args="...")
522
+ except CLINotFound as e:
523
+ # Orchestrator handles explicitly
524
+ if ask_user("Install Gemini CLI?"):
525
+ install_gemini()
526
+ result = Skill(skill=".claude-plugin:gemini-spawner", args="...")
527
+ else:
528
+ # Explicit fallback to Claude subagent
529
+ result = Task(subagent_type="haiku", prompt="...")
530
+ ```
531
+
532
+ ### Spawner Returns Empty/Malformed Results
533
+
534
+ **Solution:**
535
+ ```
536
+ # Request explicit output format
537
+ Skill(
538
+ skill=".claude-plugin:gemini-spawner",
539
+ args="""Find all API endpoints and return as JSON:
540
+ {
541
+ "endpoints": [
542
+ {"path": "/api/users", "method": "GET", "file": "src/api/users.py"}
543
+ ]
544
+ }"""
545
+ )
546
+ ```
547
+
548
+ ### Spawner Cost Higher Than Expected
549
+
550
+ **Solution:**
551
+ ```
552
+ # Use cheaper spawner for exploration
553
+ Skill(skill=".claude-plugin:gemini-spawner", args="Quick analysis") # FREE
554
+
555
+ # Use Codex for code (cheaper than Claude)
556
+ Skill(skill=".claude-plugin:codex-spawner", args="Code generation") # 70% cheaper
557
+
558
+ # Use Copilot for git (cheaper than Claude)
559
+ Skill(skill=".claude-plugin:copilot-spawner", args="Git operations") # 60% cheaper
560
+
561
+ # Only use Claude subagents for strategic reasoning
562
+ Task(subagent_type="sonnet", prompt="Architecture analysis") # Necessary cost
563
+ ```