stravinsky 0.4.17__tar.gz → 0.4.36__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.

Potentially problematic release.


This version of stravinsky might be problematic. Click here for more details.

Files changed (354) hide show
  1. stravinsky-0.4.36/.claude/commands/git-master.md +112 -0
  2. stravinsky-0.4.36/.claude/commands/str/list_watchers.md +96 -0
  3. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/strav.md +80 -8
  4. stravinsky-0.4.36/.claude/hooks/comment_checker.py +193 -0
  5. stravinsky-0.4.36/.claude/hooks/parallel_execution.py +243 -0
  6. stravinsky-0.4.36/.claude/hooks/parallel_reinforcement.py +85 -0
  7. stravinsky-0.4.36/.claude/hooks/session_recovery.py +263 -0
  8. {stravinsky-0.4.17/mcp_bridge → stravinsky-0.4.36/.claude}/hooks/todo_delegation.py +14 -9
  9. stravinsky-0.4.36/.claude/rules/deployment_safety.md +51 -0
  10. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/settings.json +17 -0
  11. stravinsky-0.4.36/.coverage +0 -0
  12. {stravinsky-0.4.17 → stravinsky-0.4.36}/.gitignore +1 -0
  13. stravinsky-0.4.36/.stravinsky/agents/agent_22ea4fd7.log +1 -0
  14. stravinsky-0.4.36/.stravinsky/agents/agent_2adee6b3.log +1 -0
  15. stravinsky-0.4.36/.stravinsky/agents/agent_2f19ccb0.log +1 -0
  16. stravinsky-0.4.36/.stravinsky/agents/agent_4312ce18.log +1 -0
  17. stravinsky-0.4.36/.stravinsky/agents/agent_4efc8f46.log +1 -0
  18. stravinsky-0.4.36/.stravinsky/agents/agent_61c9181c.log +1 -0
  19. stravinsky-0.4.36/.stravinsky/agents/agent_61f58446.log +1 -0
  20. stravinsky-0.4.36/.stravinsky/agents/agent_64e18f27.log +1 -0
  21. stravinsky-0.4.36/.stravinsky/agents/agent_6510e677.log +1 -0
  22. stravinsky-0.4.36/.stravinsky/agents/agent_70ddf50b.log +1 -0
  23. stravinsky-0.4.36/.stravinsky/agents/agent_7afbeeb2.log +1 -0
  24. stravinsky-0.4.36/.stravinsky/agents/agent_7bf8bd61.log +1 -0
  25. stravinsky-0.4.36/.stravinsky/agents/agent_7c4c4581.log +1 -0
  26. stravinsky-0.4.36/.stravinsky/agents/agent_91993dfa.log +1 -0
  27. stravinsky-0.4.36/.stravinsky/agents/agent_a0bd5fb4.log +1 -0
  28. stravinsky-0.4.36/.stravinsky/agents/agent_a500ada6.log +1 -0
  29. stravinsky-0.4.36/.stravinsky/agents/agent_abc732c9.log +1 -0
  30. stravinsky-0.4.36/.stravinsky/agents/agent_b9c789bd.log +1 -0
  31. stravinsky-0.4.36/.stravinsky/agents/agent_c061a891.log +1 -0
  32. stravinsky-0.4.36/.stravinsky/agents/agent_c1671b80.log +1 -0
  33. stravinsky-0.4.36/.stravinsky/agents/agent_c95f8211.log +1 -0
  34. stravinsky-0.4.36/.stravinsky/agents/agent_d4e46c9b.log +1 -0
  35. stravinsky-0.4.36/.stravinsky/agents/agent_d80fba02.log +1 -0
  36. stravinsky-0.4.36/.stravinsky/agents/agent_ed55bb33.log +1 -0
  37. stravinsky-0.4.36/.stravinsky/agents/agent_f90a5968.log +1 -0
  38. stravinsky-0.4.36/ARCHITECTURE_FLOWS.md +599 -0
  39. stravinsky-0.4.36/ARCHITECTURE_MAP.md +715 -0
  40. stravinsky-0.4.36/BASELINE_INDEX.md +363 -0
  41. stravinsky-0.4.36/BASELINE_SUMMARY.md +303 -0
  42. {stravinsky-0.4.17 → stravinsky-0.4.36}/CLAUDE.md +31 -2
  43. stravinsky-0.4.36/COVERAGE_REPORT.md +226 -0
  44. {stravinsky-0.4.17 → stravinsky-0.4.36}/PKG-INFO +45 -11
  45. {stravinsky-0.4.17 → stravinsky-0.4.36}/README.md +43 -10
  46. stravinsky-0.4.36/TEST_COVERAGE_INVOKE_GEMINI_AGENTIC.md +144 -0
  47. stravinsky-0.4.36/auth0.txt +1 -0
  48. {stravinsky-0.4.17 → stravinsky-0.4.36}/deploy.sh +14 -0
  49. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/AGENT_WORKFLOW.md +4 -4
  50. stravinsky-0.4.36/docs/GEMINI_API_KEY_USAGE.md +280 -0
  51. stravinsky-0.4.36/docs/HOOKS.md +277 -0
  52. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INSTALL.md +3 -3
  53. stravinsky-0.4.36/docs/PARALLEL_EXECUTION_FIX.md +247 -0
  54. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/QUICKSTART.md +2 -2
  55. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/USAGE.md +1 -1
  56. stravinsky-0.4.36/htmlcov/.gitignore +2 -0
  57. stravinsky-0.4.36/htmlcov/class_index.html +411 -0
  58. stravinsky-0.4.36/htmlcov/coverage_html_cb_6fb7b396.js +733 -0
  59. stravinsky-0.4.36/htmlcov/favicon_32_cb_58284776.png +0 -0
  60. stravinsky-0.4.36/htmlcov/function_index.html +2059 -0
  61. stravinsky-0.4.36/htmlcov/index.html +223 -0
  62. stravinsky-0.4.36/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  63. stravinsky-0.4.36/htmlcov/status.json +1 -0
  64. stravinsky-0.4.36/htmlcov/style_cb_6b508a39.css +377 -0
  65. stravinsky-0.4.36/htmlcov/z_bb9220b593e8850a___init___py.html +133 -0
  66. stravinsky-0.4.36/htmlcov/z_bb9220b593e8850a_manager_py.html +539 -0
  67. stravinsky-0.4.36/htmlcov/z_bb9220b593e8850a_tools_py.html +1110 -0
  68. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09___init___py.html +146 -0
  69. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_agent_manager_py.html +1218 -0
  70. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_background_tasks_py.html +260 -0
  71. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_code_search_py.html +483 -0
  72. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_continuous_loop_py.html +163 -0
  73. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_init_py.html +148 -0
  74. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_model_invoke_py.html +1457 -0
  75. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_project_context_py.html +237 -0
  76. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_query_classifier_py.html +420 -0
  77. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_semantic_search_py.html +3418 -0
  78. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_session_manager_py.html +397 -0
  79. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_skill_loader_py.html +312 -0
  80. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_task_runner_py.html +236 -0
  81. stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_templates_py.html +286 -0
  82. stravinsky-0.4.36/jwt_io.txt +1 -0
  83. stravinsky-0.4.36/mcp_bridge/__init__.py +1 -0
  84. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/__init__.py +16 -6
  85. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/cli.py +9 -6
  86. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/oauth.py +1 -2
  87. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/openai_oauth.py +4 -7
  88. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/token_store.py +0 -1
  89. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/cli/install_hooks.py +45 -106
  90. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/cli/session_report.py +0 -3
  91. stravinsky-0.4.36/mcp_bridge/config/hook_config.py +247 -0
  92. stravinsky-0.4.36/mcp_bridge/config/rate_limits.py +317 -0
  93. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/agent_reminder.py +4 -4
  94. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/auto_slash_command.py +5 -5
  95. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/budget_optimizer.py +2 -2
  96. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/comment_checker.py +3 -4
  97. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/compaction.py +2 -2
  98. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/context.py +2 -1
  99. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/context_monitor.py +2 -2
  100. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/directory_context.py +3 -3
  101. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/edit_recovery.py +3 -2
  102. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/empty_message_sanitizer.py +2 -2
  103. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/git_noninteractive.py +4 -4
  104. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/keyword_detector.py +2 -4
  105. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/manager.py +31 -22
  106. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/notification_hook.py +2 -4
  107. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/parallel_enforcer.py +5 -5
  108. {stravinsky-0.4.17/.claude → stravinsky-0.4.36/mcp_bridge}/hooks/parallel_execution.py +22 -10
  109. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/pre_compact.py +7 -8
  110. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/preemptive_compaction.py +2 -3
  111. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/rules_injector.py +11 -19
  112. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/session_idle.py +4 -4
  113. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/session_notifier.py +4 -4
  114. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/session_recovery.py +4 -5
  115. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/stravinsky_mode.py +1 -1
  116. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/subagent_stop.py +1 -3
  117. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/task_validator.py +2 -2
  118. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/tmux_manager.py +7 -8
  119. {stravinsky-0.4.17/.claude → stravinsky-0.4.36/mcp_bridge}/hooks/todo_delegation.py +4 -1
  120. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/todo_enforcer.py +2 -2
  121. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/truncator.py +1 -2
  122. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/notifications.py +3 -4
  123. stravinsky-0.4.36/mcp_bridge/prompts/__init__.py +13 -0
  124. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/planner.py +2 -4
  125. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/stravinsky.py +0 -1
  126. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/server.py +47 -14
  127. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/server_tools.py +56 -4
  128. stravinsky-0.4.36/mcp_bridge/tools/__init__.py +49 -0
  129. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/agent_manager.py +82 -58
  130. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/background_tasks.py +13 -17
  131. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/code_search.py +1 -2
  132. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/continuous_loop.py +0 -1
  133. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/init.py +1 -0
  134. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/lsp/manager.py +14 -20
  135. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/lsp/tools.py +7 -7
  136. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/model_invoke.py +644 -77
  137. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/project_context.py +1 -2
  138. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/query_classifier.py +132 -49
  139. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/semantic_search.py +321 -47
  140. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/session_manager.py +0 -2
  141. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/skill_loader.py +0 -1
  142. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/task_runner.py +4 -6
  143. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/templates.py +1 -1
  144. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/update_manager.py +33 -37
  145. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/update_manager_pypi.py +6 -8
  146. stravinsky-0.4.36/owasp.txt +1 -0
  147. stravinsky-0.4.36/pre_deploy_check.sh +126 -0
  148. {stravinsky-0.4.17 → stravinsky-0.4.36}/pyproject.toml +2 -1
  149. stravinsky-0.4.36/rfc7519.txt +1 -0
  150. stravinsky-0.4.36/security_advisory.txt +1 -0
  151. stravinsky-0.4.36/test_agentic_api.py +64 -0
  152. stravinsky-0.4.36/test_auth_visibility.py +100 -0
  153. stravinsky-0.4.36/test_coverage_report.md +206 -0
  154. stravinsky-0.4.36/test_plan_uncovered_tools.md +868 -0
  155. stravinsky-0.4.36/tests/README_LSP_TESTS.md +259 -0
  156. stravinsky-0.4.36/tests/test_agent_manager.py +834 -0
  157. stravinsky-0.4.36/tests/test_api_key_auth.py +134 -0
  158. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_auto_indexing.py +123 -29
  159. stravinsky-0.4.36/tests/test_code_search.py +780 -0
  160. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_file_watcher.py +42 -7
  161. stravinsky-0.4.36/tests/test_hooks.py +29 -0
  162. stravinsky-0.4.36/tests/test_invoke_gemini_agentic.py +926 -0
  163. stravinsky-0.4.36/tests/test_lsp_tools.py +730 -0
  164. stravinsky-0.4.36/tests/test_mcp_server_integration.py +169 -0
  165. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_new_hooks.py +86 -72
  166. {stravinsky-0.4.17 → stravinsky-0.4.36}/uv.lock +31 -1
  167. stravinsky-0.4.36/verify_gemini_key.py +37 -0
  168. stravinsky-0.4.17/.stravinsky/agents/agent_0de66569.out +0 -117
  169. stravinsky-0.4.17/.stravinsky/agents/agent_0de66569.system +0 -10
  170. stravinsky-0.4.17/.stravinsky/agents/agent_2ef2b305.out +0 -142
  171. stravinsky-0.4.17/.stravinsky/agents/agent_2ef2b305.system +0 -9
  172. stravinsky-0.4.17/.stravinsky/agents/agent_32fc606b.out +0 -123
  173. stravinsky-0.4.17/.stravinsky/agents/agent_32fc606b.system +0 -10
  174. stravinsky-0.4.17/.stravinsky/agents/agent_4ed6ec7a.out +0 -132
  175. stravinsky-0.4.17/.stravinsky/agents/agent_4ed6ec7a.system +0 -9
  176. stravinsky-0.4.17/.stravinsky/agents/agent_622ae68b.out +0 -119
  177. stravinsky-0.4.17/.stravinsky/agents/agent_622ae68b.system +0 -10
  178. stravinsky-0.4.17/.stravinsky/agents/agent_6731b838.out +0 -278
  179. stravinsky-0.4.17/.stravinsky/agents/agent_6731b838.system +0 -10
  180. stravinsky-0.4.17/.stravinsky/agents/agent_6c536f2d.out +0 -103
  181. stravinsky-0.4.17/.stravinsky/agents/agent_6c536f2d.system +0 -10
  182. stravinsky-0.4.17/.stravinsky/agents/agent_6ecde4ed.out +0 -76
  183. stravinsky-0.4.17/.stravinsky/agents/agent_6ecde4ed.system +0 -9
  184. stravinsky-0.4.17/.stravinsky/agents/agent_85449406.out +0 -13
  185. stravinsky-0.4.17/.stravinsky/agents/agent_85449406.system +0 -9
  186. stravinsky-0.4.17/.stravinsky/agents/agent_940fbc06.out +0 -170
  187. stravinsky-0.4.17/.stravinsky/agents/agent_940fbc06.system +0 -10
  188. stravinsky-0.4.17/.stravinsky/agents/agent_adc99d05.out +0 -128
  189. stravinsky-0.4.17/.stravinsky/agents/agent_adc99d05.system +0 -10
  190. stravinsky-0.4.17/.stravinsky/agents/agent_b3c09833.out +0 -124
  191. stravinsky-0.4.17/.stravinsky/agents/agent_b3c09833.system +0 -10
  192. stravinsky-0.4.17/.stravinsky/agents/agent_cdd28e91.system +0 -10
  193. stravinsky-0.4.17/.stravinsky/agents/agent_fee89a04.out +0 -81
  194. stravinsky-0.4.17/.stravinsky/agents/agent_fee89a04.system +0 -10
  195. stravinsky-0.4.17/.stravinsky/agents.json +0 -1442
  196. stravinsky-0.4.17/logs/.1c0e2f6784d083818216ed08579b248b799c8d86-audit.json +0 -40
  197. stravinsky-0.4.17/logs/.270de9f01be3c37438e0ae9542f6c146c85078ae-audit.json +0 -40
  198. stravinsky-0.4.17/logs/application-2026-01-03.log +0 -45
  199. stravinsky-0.4.17/logs/application-2026-01-04.log +0 -232
  200. stravinsky-0.4.17/logs/application-2026-01-05.log +0 -172
  201. stravinsky-0.4.17/logs/error-2026-01-03.log +0 -3
  202. stravinsky-0.4.17/logs/error-2026-01-04.log +0 -24
  203. stravinsky-0.4.17/logs/error-2026-01-05.log +0 -15
  204. stravinsky-0.4.17/mcp_bridge/__init__.py +0 -1
  205. stravinsky-0.4.17/mcp_bridge/hooks/parallel_execution.py +0 -111
  206. stravinsky-0.4.17/mcp_bridge/prompts/__init__.py +0 -20
  207. stravinsky-0.4.17/mcp_bridge/tools/__init__.py +0 -42
  208. stravinsky-0.4.17/tests/test_hooks.py +0 -56
  209. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/HOOKS_INTEGRATION.md +0 -0
  210. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/HOOKS.md +0 -0
  211. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/code-reviewer.md +0 -0
  212. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/debugger.md +0 -0
  213. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/delphi.md +0 -0
  214. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/dewey.md +0 -0
  215. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/explore.md +0 -0
  216. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/frontend.md +0 -0
  217. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/implementation-lead.md +0 -0
  218. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/research-lead.md +0 -0
  219. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/stravinsky.md +0 -0
  220. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/delphi.md +0 -0
  221. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/dewey.md +0 -0
  222. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/index.md +0 -0
  223. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/publish.md +0 -0
  224. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/review.md +0 -0
  225. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/index.md +0 -0
  226. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/search.md +0 -0
  227. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/start_filewatch.md +0 -0
  228. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/stats.md +0 -0
  229. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/stop_filewatch.md +0 -0
  230. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-cancel.md +0 -0
  231. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-clean.md +0 -0
  232. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-unwatch.md +0 -0
  233. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-watch.md +0 -0
  234. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/verify.md +0 -0
  235. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/version.md +0 -0
  236. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/context.py +0 -0
  237. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/context_monitor.py +0 -0
  238. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/edit_recovery.py +0 -0
  239. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/notification_hook.py +0 -0
  240. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/pre_compact.py +0 -0
  241. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/stravinsky_mode.py +0 -0
  242. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/subagent_stop.py +0 -0
  243. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/todo_continuation.py +0 -0
  244. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/tool_messaging.py +0 -0
  245. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/truncator.py +0 -0
  246. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/rules/pypi_deployment.md +0 -0
  247. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/skills/chrome-devtools/SKILL.md +0 -0
  248. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/skills/sqlite/SKILL.md +0 -0
  249. {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/skills/supabase/SKILL.md +0 -0
  250. {stravinsky-0.4.17 → stravinsky-0.4.36}/.github/workflows/publish.yml +0 -0
  251. {stravinsky-0.4.17 → stravinsky-0.4.36}/.stravinsky/mcp_mode +0 -0
  252. {stravinsky-0.4.17 → stravinsky-0.4.36}/ARCHITECTURE.md +0 -0
  253. {stravinsky-0.4.17 → stravinsky-0.4.36}/AUTO_INDEXING_TEST_SUMMARY.md +0 -0
  254. {stravinsky-0.4.17 → stravinsky-0.4.36}/COMPREHENSIVE_TEST_IMPLEMENTATION.txt +0 -0
  255. {stravinsky-0.4.17 → stravinsky-0.4.36}/DELEGATION_FLOW_VERIFICATION.md +0 -0
  256. {stravinsky-0.4.17 → stravinsky-0.4.36}/FILEWATCHER_DOCS_UPDATE_SUMMARY.md +0 -0
  257. {stravinsky-0.4.17 → stravinsky-0.4.36}/FILEWATCHER_README.md +0 -0
  258. {stravinsky-0.4.17 → stravinsky-0.4.36}/INSTALL.md +0 -0
  259. {stravinsky-0.4.17 → stravinsky-0.4.36}/LSP_CLEANUP_FIX.md +0 -0
  260. {stravinsky-0.4.17 → stravinsky-0.4.36}/MANUAL_TESTING_CHECKLIST.md +0 -0
  261. {stravinsky-0.4.17 → stravinsky-0.4.36}/TESTING_AUTO_INDEXING.md +0 -0
  262. {stravinsky-0.4.17 → stravinsky-0.4.36}/TESTING_SUMMARY_FINAL.md +0 -0
  263. {stravinsky-0.4.17 → stravinsky-0.4.36}/TEST_ARTIFACTS_README.md +0 -0
  264. {stravinsky-0.4.17 → stravinsky-0.4.36}/TEST_EXECUTION_REPORT.md +0 -0
  265. {stravinsky-0.4.17 → stravinsky-0.4.36}/TEST_PLAN_AUTO_INDEXING.md +0 -0
  266. {stravinsky-0.4.17 → stravinsky-0.4.36}/assets/logo.png +0 -0
  267. {stravinsky-0.4.17 → stravinsky-0.4.36}/assets/logo.png.txt +0 -0
  268. {stravinsky-0.4.17 → stravinsky-0.4.36}/assets/logo_small.png +0 -0
  269. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/AGENTS.md +0 -0
  270. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/CALL_FLOW_DIAGRAM.txt +0 -0
  271. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/COMMANDS_CONSOLIDATION_REPORT.md +0 -0
  272. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/COMMANDS_QUICK_SUMMARY.md +0 -0
  273. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/DEPLOYMENT.md +0 -0
  274. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/FILEWATCHER_ARCHITECTURE.md +0 -0
  275. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/FILEWATCHER_IMPLEMENTATION_SUMMARY.md +0 -0
  276. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/FILE_WATCHER.md +0 -0
  277. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/HOOKS_INSTALLATION.md +0 -0
  278. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/IMPLEMENTATION_PLAN.md +0 -0
  279. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INDEX_TOOL_CALL_LOGGING.md +0 -0
  280. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INJECTION_POINT_CODE_LOCATIONS.txt +0 -0
  281. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INTELLIGENT_SEARCH_DESIGN.md +0 -0
  282. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/KEYRING_AUTH_FIX.md +0 -0
  283. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/LSP_MIGRATION_GUIDE.md +0 -0
  284. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/MCP_TOOL_CALL_INJECTION_POINTS.md +0 -0
  285. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/MODEL_ROUTING.md +0 -0
  286. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/QUERY_CLASSIFIER_DESIGN.md +0 -0
  287. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/QUICK_REFERENCE_INJECTION_POINTS.md +0 -0
  288. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/README.md +0 -0
  289. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/README_COMMANDS_ANALYSIS.md +0 -0
  290. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/README_filewatcher.md +0 -0
  291. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/REPORT_INDEX.txt +0 -0
  292. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEARCH_STRATEGY_TEST_SUITE.md +0 -0
  293. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEARCH_TOOLS_ANALYSIS.md +0 -0
  294. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_INDEXING_INDEX.md +0 -0
  295. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_BEST_PRACTICES.md +0 -0
  296. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_QUICK_START.md +0 -0
  297. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_TESTING_INDEX.md +0 -0
  298. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_TEST_REPORT.md +0 -0
  299. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_WATCHER_USAGE.md +0 -0
  300. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/TEMPLATES_STRUCTURE.md +0 -0
  301. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/TROUBLESHOOTING.md +0 -0
  302. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/architecture_workflow.md +0 -0
  303. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/filewatcher_design_summary.md +0 -0
  304. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/filewatcher_integration_design.md +0 -0
  305. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/filewatcher_quick_reference.md +0 -0
  306. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/remediation_plan.md +0 -0
  307. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/semantic_indexing_analysis.md +0 -0
  308. {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/semantic_indexing_quick_start.md +0 -0
  309. {stravinsky-0.4.17 → stravinsky-0.4.36}/error.log +0 -0
  310. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/token_refresh.py +0 -0
  311. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/cli/__init__.py +1 -1
  312. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/MANIFEST_SCHEMA.md +0 -0
  313. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/README.md +0 -0
  314. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/__init__.py +2 -2
  315. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/hooks.py +0 -0
  316. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/hooks_manifest.json +0 -0
  317. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/skills_manifest.json +0 -0
  318. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/HOOKS_SETTINGS.json +0 -0
  319. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/README.md +0 -0
  320. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/__init__.py +0 -0
  321. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/todo_continuation.py +0 -0
  322. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/tool_messaging.py +0 -0
  323. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/delphi.py +0 -0
  324. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/dewey.py +0 -0
  325. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/document_writer.py +0 -0
  326. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/explore.py +0 -0
  327. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/frontend.py +0 -0
  328. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/multimodal.py +0 -0
  329. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/lsp/__init__.py +8 -8
  330. {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/utils/__init__.py +0 -0
  331. {stravinsky-0.4.17 → stravinsky-0.4.36}/repro_spawn.py +0 -0
  332. {stravinsky-0.4.17 → stravinsky-0.4.36}/run-mcp.sh +0 -0
  333. {stravinsky-0.4.17 → stravinsky-0.4.36}/stdout_handshake_auditor.py +0 -0
  334. {stravinsky-0.4.17 → stravinsky-0.4.36}/test_lsp_cleanup.py +0 -0
  335. {stravinsky-0.4.17 → stravinsky-0.4.36}/test_lsp_manager.py +0 -0
  336. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/MANUAL_TEST_GUIDE.md +0 -0
  337. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/QUERY_CLASSIFICATION_GUIDE.md +0 -0
  338. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/QUICK_REFERENCE.md +0 -0
  339. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/README.md +0 -0
  340. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/README_AUTO_INDEXING_TESTS.md +0 -0
  341. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/README_QUERY_CLASSIFICATION.md +0 -0
  342. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/TEST_IMPLEMENTATION_SUMMARY.md +0 -0
  343. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/TEST_RESULTS_direct_gemini.md +0 -0
  344. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/conftest.py +0 -0
  345. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/manual_test_auto_indexing.py +0 -0
  346. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/manual_test_hooks.py +0 -0
  347. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_direct_gemini.py +0 -0
  348. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_file_watcher_no_index.py +0 -0
  349. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_query_classification.py +0 -0
  350. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_query_classifier.py +0 -0
  351. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_symlink_boundary.py +0 -0
  352. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_update_manager.py +0 -0
  353. {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/verify_semantic_search.py +0 -0
  354. {stravinsky-0.4.17 → stravinsky-0.4.36}/verify_tools.py +0 -0
@@ -0,0 +1,112 @@
1
+ # Git Master Skill
2
+
3
+ Atomic commits with conventional format and smart history search.
4
+
5
+ ## Invocation
6
+
7
+ ```
8
+ /git-master <command>
9
+ ```
10
+
11
+ ## Commands
12
+
13
+ ### commit - Smart Atomic Commit
14
+
15
+ ```
16
+ /git-master commit
17
+ ```
18
+
19
+ Workflow:
20
+ 1. Run `git status` and `git diff --staged`
21
+ 2. Analyze changes to determine commit type
22
+ 3. Generate conventional commit message
23
+ 4. Create atomic commit
24
+
25
+ **Commit Types** (Conventional Commits):
26
+ - `feat`: New feature
27
+ - `fix`: Bug fix
28
+ - `docs`: Documentation only
29
+ - `style`: Formatting, no code change
30
+ - `refactor`: Code restructuring
31
+ - `perf`: Performance improvement
32
+ - `test`: Adding/updating tests
33
+ - `chore`: Build, config, dependencies
34
+
35
+ **Message Format**:
36
+ ```
37
+ <type>(<scope>): <description>
38
+
39
+ [optional body]
40
+
41
+ [optional footer]
42
+ ```
43
+
44
+ ### search - History Search
45
+
46
+ ```
47
+ /git-master search <pattern>
48
+ ```
49
+
50
+ Find commits matching a pattern:
51
+ - By message: `/git-master search "fix auth"`
52
+ - By file: `/git-master search --file src/auth.py`
53
+ - By author: `/git-master search --author david`
54
+ - By date: `/git-master search --since "1 week ago"`
55
+
56
+ ### split - Split Large Changes
57
+
58
+ ```
59
+ /git-master split
60
+ ```
61
+
62
+ When staged changes are too large:
63
+ 1. Analyze logical groupings
64
+ 2. Suggest split points
65
+ 3. Create multiple atomic commits
66
+
67
+ ### amend - Smart Amend
68
+
69
+ ```
70
+ /git-master amend
71
+ ```
72
+
73
+ Safely amend the last commit:
74
+ 1. Verify commit hasn't been pushed
75
+ 2. Verify you're the author
76
+ 3. Add staged changes to last commit
77
+ 4. Update message if requested
78
+
79
+ ## Rules
80
+
81
+ 1. **Atomic Commits**: One logical change per commit
82
+ 2. **Conventional Format**: Always use conventional commits
83
+ 3. **No Secrets**: Block commits containing secrets
84
+ 4. **Pre-push Check**: Verify before push to main/master
85
+
86
+ ## Examples
87
+
88
+ ```bash
89
+ # Smart commit with auto-generated message
90
+ /git-master commit
91
+
92
+ # Search for auth-related commits
93
+ /git-master search "auth"
94
+
95
+ # Find commits that modified a specific file
96
+ /git-master search --file mcp_bridge/auth/oauth.py
97
+
98
+ # Split large staged changes
99
+ /git-master split
100
+ ```
101
+
102
+ ## Safety Checks
103
+
104
+ Before committing, Git Master checks for:
105
+ - Exposed secrets (API keys, tokens, passwords)
106
+ - Debug/test code that shouldn't be committed
107
+ - Large binary files
108
+ - Merge conflict markers
109
+
110
+ ---
111
+
112
+ $ARGUMENTS: command (required) - The git-master command to execute
@@ -0,0 +1,96 @@
1
+ ---
2
+ description: /str:list_watchers - List all active file watchers across projects
3
+ allowed-tools: mcp__stravinsky__list_file_watchers
4
+ ---
5
+
6
+ # List Active File Watchers
7
+
8
+ View all currently running file watchers for automatic semantic search reindexing.
9
+
10
+ ## What This Does
11
+
12
+ Displays information about active file watchers across all projects including:
13
+ - Project path being watched
14
+ - Embedding provider (ollama, gemini, openai, huggingface)
15
+ - Debounce interval (wait time before reindexing)
16
+ - Current status (running/stopped)
17
+
18
+ ## Prerequisites
19
+
20
+ At least one file watcher must be running. Start a watcher with `/str:start_filewatch` first.
21
+
22
+ ## Usage
23
+
24
+ Call the MCP tool directly (no parameters):
25
+
26
+ ```python
27
+ mcp__stravinsky__list_file_watchers()
28
+ ```
29
+
30
+ Returns a list of dicts with:
31
+ - `project_path`: Root directory being watched
32
+ - `provider`: Embedding provider name
33
+ - `debounce_seconds`: Wait time before reindexing
34
+ - `status`: "running" or "stopped"
35
+
36
+ ## Example Output
37
+
38
+ ```
39
+ Active File Watchers
40
+ ====================
41
+
42
+ Watcher 1:
43
+ Project: /Users/dev/project1
44
+ Provider: ollama
45
+ Debounce: 2.0s
46
+ Status: running
47
+
48
+ Watcher 2:
49
+ Project: /Users/dev/project2
50
+ Provider: gemini
51
+ Debounce: 3.0s
52
+ Status: running
53
+
54
+ Total: 2 active watchers
55
+ ```
56
+
57
+ ## Use Cases
58
+
59
+ **Before stopping a watcher:**
60
+ ```python
61
+ # List watchers to get project path
62
+ mcp__stravinsky__list_file_watchers()
63
+
64
+ # Stop specific watcher
65
+ mcp__stravinsky__stop_file_watcher(project_path="/Users/dev/project1")
66
+ ```
67
+
68
+ **Check status across multiple repos:**
69
+ ```python
70
+ # See all watched projects at once
71
+ mcp__stravinsky__list_file_watchers()
72
+ ```
73
+
74
+ **Verify watcher started successfully:**
75
+ ```python
76
+ # After starting watcher
77
+ mcp__stravinsky__start_file_watcher(project_path=".", provider="ollama")
78
+
79
+ # Confirm it's running
80
+ mcp__stravinsky__list_file_watchers()
81
+ ```
82
+
83
+ ## Troubleshooting
84
+
85
+ **"No active watchers"**: Start a watcher with `/str:start_filewatch` first.
86
+
87
+ **"Watcher shows stopped"**: The watcher encountered an error or was manually stopped. Restart with `/str:start_filewatch`.
88
+
89
+ **Multiple watchers for same project**: This indicates duplicate watcher processes. Stop and restart with `/str:stop_filewatch`.
90
+
91
+ ## Tips
92
+
93
+ - Run this before stopping watchers to identify project paths
94
+ - Use to verify watchers are running after system restart
95
+ - Check status if reindexing seems not to be happening automatically
96
+ - Each project can only have ONE active watcher per provider
@@ -26,10 +26,30 @@ Before ANY classification or action:
26
26
 
27
27
  ## Phase 1: Classify & Validate
28
28
 
29
+ ### Step 0: IRONSTAR Mode Detection (PRIORITY CHECK)
30
+
31
+ **BEFORE classification, scan prompt for:**
32
+ - Keywords: `ironstar`, `irs`, `ultrawork`, `ulw` (case-insensitive)
33
+ - If detected: **ACTIVATE MAXIMUM PARALLEL MODE**
34
+
35
+ **IRONSTAR MODE RULES:**
36
+ 1. **ALWAYS use agents** - NEVER work alone with Read/Grep/Bash
37
+ 2. **Spawn ALL independent tasks in parallel** - Minimum 2+ agents for any multi-step work
38
+ 3. **Default to explore/dewey** - Use cheap agents aggressively
39
+ 4. **No sequential work** - If tasks can run in parallel, they MUST
40
+
41
+ **Example:**
42
+ ```
43
+ User: "ironstar Find auth flow and error handling"
44
+ → IMMEDIATE: agent_spawn(explore, "auth flow") + agent_spawn(explore, "error handling")
45
+ → NEVER: Read file yourself, grep yourself, or work sequentially
46
+ ```
47
+
29
48
  ### Step 1: Classify Request Type
30
49
 
31
50
  | Type | Signal | Action |
32
51
  |------|--------|--------|
52
+ | **IRONSTAR Mode** | Contains: ironstar, irs, ultrawork, ulw | Maximum parallel delegation (2+ agents minimum) |
33
53
  | **Skill Match** | Matches skill trigger | INVOKE skill via `skill_get` |
34
54
  | **Exploratory** | "How does X work?", "Find Y" | Fire explore agents in parallel |
35
55
  | **Implementation** | "Add feature", "Refactor" | Create TODO list → spawn parallel agents |
@@ -40,22 +60,24 @@ Before ANY classification or action:
40
60
  - Do I have implicit assumptions?
41
61
  - What tools/agents can I use: `agent_spawn`, parallel tools, LSP?
42
62
  - Should I challenge the user if design seems flawed?
63
+ - **If IRONSTAR detected**: Am I spawning at least 2+ agents in parallel?
43
64
 
44
65
  ---
45
66
 
46
67
  ## ⚠️ CRITICAL: PARALLEL-FIRST WORKFLOW
47
68
 
48
- **For implementation tasks, your response MUST be:**
69
+ **For ANY task with 2+ independent steps, your response MUST be:**
49
70
 
50
71
  ```
51
- 1. TodoWrite (create all items)
52
- 2. SAME RESPONSE: Multiple agent_spawn() calls for ALL independent TODOs
72
+ 1. TodoWrite (create all items) OR identify independent subtasks
73
+ 2. SAME RESPONSE: Multiple agent_spawn() calls for ALL independent work
53
74
  3. NEVER mark in_progress until agents return
75
+ 4. NEVER use Read/Grep/Bash when agents can do it
54
76
  ```
55
77
 
56
- **BLOCKING REQUIREMENT**: After TodoWrite, spawn ALL agents in the SAME response.
78
+ **BLOCKING REQUIREMENT**: After TodoWrite OR after identifying exploratory work, spawn ALL agents in the SAME response.
57
79
 
58
- ### CORRECT (one response with parallel agents):
80
+ ### CORRECT Pattern 1: Implementation with TODOs
59
81
  ```
60
82
  TodoWrite([todo1, todo2, todo3])
61
83
  agent_spawn(agent_type="explore", prompt="TODO 1...")
@@ -64,14 +86,46 @@ agent_spawn(agent_type="explore", prompt="TODO 2...")
64
86
  → explore:gemini-3-flash('TODO 2...') task_id=agent_def456
65
87
  agent_spawn(agent_type="dewey", prompt="TODO 3...")
66
88
  → dewey:gemini-3-flash('TODO 3...') task_id=agent_ghi789
89
+ # Continue in SAME response - collect results later
67
90
  ```
68
91
 
69
- ### WRONG (sequential - defeats parallelism):
92
+ ### CORRECT Pattern 2: Exploratory (NO TodoWrite needed)
93
+ ```
94
+ User: "Find auth flow and error handling"
95
+
96
+ # IMMEDIATE parallel spawn (no TodoWrite):
97
+ agent_spawn(agent_type="explore", prompt="Find auth flow...")
98
+ → explore:gemini-3-flash('Find auth flow...') task_id=agent_abc123
99
+ agent_spawn(agent_type="explore", prompt="Find error handling...")
100
+ → explore:gemini-3-flash('Find error handling...') task_id=agent_def456
101
+ # Continue in SAME response
102
+ ```
103
+
104
+ ### ❌ WRONG Pattern 1: Sequential (defeats parallelism)
70
105
  ```
71
106
  TodoWrite([todo1, todo2, todo3])
72
107
  # Response ends - WRONG!
73
- # Next: Mark todo1 in_progress - WRONG!
74
- # Next: Do work manually - WRONG!
108
+ # Next response: Mark todo1 in_progress - WRONG!
109
+ # Next response: Do work manually - WRONG!
110
+ ```
111
+
112
+ ### ❌ WRONG Pattern 2: Manual Work (when agents available)
113
+ ```
114
+ User: "Find auth flow and error handling"
115
+
116
+ # WRONG - doing it yourself:
117
+ Read("src/auth.py") # Should be agent_spawn(explore)
118
+ Grep("error", "**/*.py") # Should be agent_spawn(explore)
119
+ ```
120
+
121
+ ### Decision Tree: When to Spawn Agents
122
+
123
+ ```
124
+ Is this exploratory (search, find, understand)?
125
+ ├─ YES → Spawn explore/dewey agents immediately (no TodoWrite)
126
+ └─ NO → Is this implementation with 2+ steps?
127
+ ├─ YES → TodoWrite + spawn agents in SAME response
128
+ └─ NO → Single simple task, work directly (rare)
75
129
  ```
76
130
 
77
131
  ---
@@ -119,12 +173,30 @@ When using `agent_spawn`, include ALL 7 sections:
119
173
 
120
174
  | Domain | Delegate To | Trigger |
121
175
  |--------|-------------|---------|
176
+ | **Maximum Parallel Mode** | `explore` + `dewey` | **IRONSTAR, IRS, ULTRAWORK, ULW** |
122
177
  | Frontend Visual | `frontend` | Color, spacing, layout, CSS, animation |
123
178
  | External Research | `dewey` | Docs, library usage, OSS examples |
124
179
  | Internal Search | `explore` | Find patterns in THIS repo |
125
180
  | Architecture | `delphi` | Design decisions, tradeoffs |
126
181
  | Hard Debugging | `delphi` | After 2+ failed fixes |
127
182
 
183
+ ### IRONSTAR Mode Behavior
184
+
185
+ When IRONSTAR/IRS/ULTRAWORK/ULW keywords detected:
186
+
187
+ **MANDATORY:**
188
+ - ✅ Spawn 2+ agents minimum (even for simple tasks)
189
+ - ✅ Use explore for ALL code searches
190
+ - ✅ Use dewey for ALL external research
191
+ - ✅ Fire all agents in SAME response
192
+ - ✅ NEVER use Read/Grep/Bash directly
193
+
194
+ **FORBIDDEN:**
195
+ - ❌ Working alone without agents
196
+ - ❌ Sequential execution (spawn one, wait, spawn another)
197
+ - ❌ Single agent for multi-part tasks
198
+ - ❌ Direct tool usage (Read, Grep, Bash) when agents available
199
+
128
200
  ---
129
201
 
130
202
  ## Execution Context (READ THIS FIRST)
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ PreToolUse hook: Comment Quality Enforcer (oh-my-opencode parity)
4
+
5
+ Fires BEFORE git commit/push operations to check for low-quality comments.
6
+ Challenges comments that just restate what the code does.
7
+
8
+ Exit codes:
9
+ - 0: Allow the operation to proceed
10
+ - 2: Block the operation (hard block)
11
+
12
+ Trigger: PreToolUse on Bash tool when command contains 'git commit' or 'git push'
13
+ """
14
+
15
+ import json
16
+ import sys
17
+ import re
18
+ from pathlib import Path
19
+ from typing import List, Tuple, Optional
20
+
21
+ # Patterns that indicate low-quality comments
22
+ LOW_QUALITY_PATTERNS = [
23
+ # Comments that just describe what code literally does
24
+ r"#\s*(?:set|get|return|call|create|initialize|init)\s+\w+",
25
+ # Comments that are just variable/function names repeated
26
+ r"#\s*\w+\s*$",
27
+ # Empty or trivial comments
28
+ r"#\s*(?:TODO|FIXME|XXX|HACK)?\s*$",
29
+ # Comments that state the obvious
30
+ r"#\s*(?:loop|iterate|check|if|else|for|while)\s+(?:through|over|if|the)?\s*\w*\s*$",
31
+ # Comments like "# increment i" or "# add 1 to x"
32
+ r"#\s*(?:increment|decrement|add|subtract|multiply|divide)\s+\w+",
33
+ ]
34
+
35
+ # Patterns for GOOD comments we should NOT flag
36
+ GOOD_COMMENT_PATTERNS = [
37
+ # Docstrings and multi-line comments explaining WHY
38
+ r'""".*"""',
39
+ r"'''.*'''",
40
+ # Comments explaining business logic or reasoning
41
+ r"#\s*(?:because|since|note|important|warning|caution|reason|why|rationale)",
42
+ # Comments with URLs or references
43
+ r"#\s*(?:see|ref|https?://|link)",
44
+ # Type hints or type comments
45
+ r"#\s*type:",
46
+ # Pragma or directive comments
47
+ r"#\s*(?:noqa|type:|pragma|pylint|flake8)",
48
+ ]
49
+
50
+
51
+ def is_low_quality_comment(comment: str) -> bool:
52
+ """Check if a comment is low-quality (just restates code)."""
53
+ comment_lower = comment.lower().strip()
54
+
55
+ # Skip if it matches a good pattern
56
+ for pattern in GOOD_COMMENT_PATTERNS:
57
+ if re.search(pattern, comment_lower, re.IGNORECASE):
58
+ return False
59
+
60
+ # Check against low-quality patterns
61
+ for pattern in LOW_QUALITY_PATTERNS:
62
+ if re.search(pattern, comment_lower, re.IGNORECASE):
63
+ return True
64
+
65
+ # Very short comments (< 10 chars after #) are often low quality
66
+ content = comment.replace("#", "").strip()
67
+ if len(content) < 10 and not any(c in content for c in ["!", "?", ":", "TODO", "FIXME"]):
68
+ return True
69
+
70
+ return False
71
+
72
+
73
+ def extract_added_comments_from_diff(diff_text: str) -> List[Tuple[str, str]]:
74
+ """
75
+ Extract newly added comments from a git diff.
76
+ Returns list of (filename, comment) tuples.
77
+ """
78
+ added_comments = []
79
+ current_file = None
80
+
81
+ for line in diff_text.split("\n"):
82
+ # Track which file we're in
83
+ if line.startswith("+++ b/"):
84
+ current_file = line[6:]
85
+ # Only look at added lines (starting with +, but not +++)
86
+ elif line.startswith("+") and not line.startswith("+++"):
87
+ content = line[1:] # Remove the leading +
88
+ # Check for Python comments
89
+ if "#" in content and not content.strip().startswith("#!"):
90
+ # Extract the comment part
91
+ comment_match = re.search(r"#.*$", content)
92
+ if comment_match:
93
+ comment = comment_match.group(0)
94
+ if current_file:
95
+ added_comments.append((current_file, comment))
96
+
97
+ return added_comments
98
+
99
+
100
+ def check_staged_diff() -> Optional[str]:
101
+ """
102
+ Check the staged diff for low-quality comments.
103
+ Returns a warning message if issues found, None otherwise.
104
+ """
105
+ import subprocess
106
+
107
+ try:
108
+ # Get the staged diff
109
+ result = subprocess.run(
110
+ ["git", "diff", "--cached", "--unified=0"], capture_output=True, text=True, timeout=10
111
+ )
112
+
113
+ if result.returncode != 0:
114
+ return None # Can't get diff, allow commit
115
+
116
+ diff_text = result.stdout
117
+ if not diff_text:
118
+ return None # No staged changes
119
+
120
+ # Extract and check comments
121
+ added_comments = extract_added_comments_from_diff(diff_text)
122
+ low_quality = []
123
+
124
+ for filename, comment in added_comments:
125
+ if is_low_quality_comment(comment):
126
+ low_quality.append((filename, comment))
127
+
128
+ if low_quality:
129
+ warning = "⚠️ **Comment Quality Check Failed**\n\n"
130
+ warning += "The following comments appear to just restate the code:\n\n"
131
+ for filename, comment in low_quality[:5]: # Limit to 5 examples
132
+ warning += f"- `{filename}`: `{comment[:50]}...`\n"
133
+ warning += "\n**Good comments explain WHY, not WHAT.**\n"
134
+ warning += "Consider removing or improving these comments.\n\n"
135
+ warning += "To proceed anyway, use: `git commit --no-verify`"
136
+ return warning
137
+
138
+ return None
139
+
140
+ except subprocess.TimeoutExpired:
141
+ return None # Timeout, allow commit
142
+ except FileNotFoundError:
143
+ return None # Git not found, allow commit
144
+ except Exception:
145
+ return None # Any other error, allow commit
146
+
147
+
148
+ def is_git_commit_command(command: str) -> bool:
149
+ """Check if the command is a git commit or push."""
150
+ command_lower = command.lower()
151
+ return any(
152
+ pattern in command_lower
153
+ for pattern in [
154
+ "git commit",
155
+ "git push",
156
+ ]
157
+ )
158
+
159
+
160
+ def main():
161
+ try:
162
+ hook_input = json.load(sys.stdin)
163
+ except (json.JSONDecodeError, EOFError):
164
+ return 0
165
+
166
+ tool_name = hook_input.get("tool_name", "")
167
+ tool_input = hook_input.get("tool_input", {})
168
+
169
+ # Only check Bash commands
170
+ if tool_name != "Bash":
171
+ return 0
172
+
173
+ command = tool_input.get("command", "")
174
+
175
+ # Only check git commit/push commands
176
+ if not is_git_commit_command(command):
177
+ return 0
178
+
179
+ # Check for low-quality comments in staged diff
180
+ warning = check_staged_diff()
181
+
182
+ if warning:
183
+ # Output warning to stderr (shown to user)
184
+ print(warning, file=sys.stderr)
185
+ # Return 0 to allow but warn, or 2 to block
186
+ # We'll warn but allow - users can use --no-verify to skip
187
+ return 0
188
+
189
+ return 0
190
+
191
+
192
+ if __name__ == "__main__":
193
+ sys.exit(main())