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.
- stravinsky-0.4.36/.claude/commands/git-master.md +112 -0
- stravinsky-0.4.36/.claude/commands/str/list_watchers.md +96 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/strav.md +80 -8
- stravinsky-0.4.36/.claude/hooks/comment_checker.py +193 -0
- stravinsky-0.4.36/.claude/hooks/parallel_execution.py +243 -0
- stravinsky-0.4.36/.claude/hooks/parallel_reinforcement.py +85 -0
- stravinsky-0.4.36/.claude/hooks/session_recovery.py +263 -0
- {stravinsky-0.4.17/mcp_bridge → stravinsky-0.4.36/.claude}/hooks/todo_delegation.py +14 -9
- stravinsky-0.4.36/.claude/rules/deployment_safety.md +51 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/settings.json +17 -0
- stravinsky-0.4.36/.coverage +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.gitignore +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_22ea4fd7.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_2adee6b3.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_2f19ccb0.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_4312ce18.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_4efc8f46.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_61c9181c.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_61f58446.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_64e18f27.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_6510e677.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_70ddf50b.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_7afbeeb2.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_7bf8bd61.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_7c4c4581.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_91993dfa.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_a0bd5fb4.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_a500ada6.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_abc732c9.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_b9c789bd.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_c061a891.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_c1671b80.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_c95f8211.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_d4e46c9b.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_d80fba02.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_ed55bb33.log +1 -0
- stravinsky-0.4.36/.stravinsky/agents/agent_f90a5968.log +1 -0
- stravinsky-0.4.36/ARCHITECTURE_FLOWS.md +599 -0
- stravinsky-0.4.36/ARCHITECTURE_MAP.md +715 -0
- stravinsky-0.4.36/BASELINE_INDEX.md +363 -0
- stravinsky-0.4.36/BASELINE_SUMMARY.md +303 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/CLAUDE.md +31 -2
- stravinsky-0.4.36/COVERAGE_REPORT.md +226 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/PKG-INFO +45 -11
- {stravinsky-0.4.17 → stravinsky-0.4.36}/README.md +43 -10
- stravinsky-0.4.36/TEST_COVERAGE_INVOKE_GEMINI_AGENTIC.md +144 -0
- stravinsky-0.4.36/auth0.txt +1 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/deploy.sh +14 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/AGENT_WORKFLOW.md +4 -4
- stravinsky-0.4.36/docs/GEMINI_API_KEY_USAGE.md +280 -0
- stravinsky-0.4.36/docs/HOOKS.md +277 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INSTALL.md +3 -3
- stravinsky-0.4.36/docs/PARALLEL_EXECUTION_FIX.md +247 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/QUICKSTART.md +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/USAGE.md +1 -1
- stravinsky-0.4.36/htmlcov/.gitignore +2 -0
- stravinsky-0.4.36/htmlcov/class_index.html +411 -0
- stravinsky-0.4.36/htmlcov/coverage_html_cb_6fb7b396.js +733 -0
- stravinsky-0.4.36/htmlcov/favicon_32_cb_58284776.png +0 -0
- stravinsky-0.4.36/htmlcov/function_index.html +2059 -0
- stravinsky-0.4.36/htmlcov/index.html +223 -0
- stravinsky-0.4.36/htmlcov/keybd_closed_cb_ce680311.png +0 -0
- stravinsky-0.4.36/htmlcov/status.json +1 -0
- stravinsky-0.4.36/htmlcov/style_cb_6b508a39.css +377 -0
- stravinsky-0.4.36/htmlcov/z_bb9220b593e8850a___init___py.html +133 -0
- stravinsky-0.4.36/htmlcov/z_bb9220b593e8850a_manager_py.html +539 -0
- stravinsky-0.4.36/htmlcov/z_bb9220b593e8850a_tools_py.html +1110 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09___init___py.html +146 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_agent_manager_py.html +1218 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_background_tasks_py.html +260 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_code_search_py.html +483 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_continuous_loop_py.html +163 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_init_py.html +148 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_model_invoke_py.html +1457 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_project_context_py.html +237 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_query_classifier_py.html +420 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_semantic_search_py.html +3418 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_session_manager_py.html +397 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_skill_loader_py.html +312 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_task_runner_py.html +236 -0
- stravinsky-0.4.36/htmlcov/z_bbf7571ef27a4a09_templates_py.html +286 -0
- stravinsky-0.4.36/jwt_io.txt +1 -0
- stravinsky-0.4.36/mcp_bridge/__init__.py +1 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/__init__.py +16 -6
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/cli.py +9 -6
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/oauth.py +1 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/openai_oauth.py +4 -7
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/token_store.py +0 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/cli/install_hooks.py +45 -106
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/cli/session_report.py +0 -3
- stravinsky-0.4.36/mcp_bridge/config/hook_config.py +247 -0
- stravinsky-0.4.36/mcp_bridge/config/rate_limits.py +317 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/agent_reminder.py +4 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/auto_slash_command.py +5 -5
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/budget_optimizer.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/comment_checker.py +3 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/compaction.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/context.py +2 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/context_monitor.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/directory_context.py +3 -3
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/edit_recovery.py +3 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/empty_message_sanitizer.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/git_noninteractive.py +4 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/keyword_detector.py +2 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/manager.py +31 -22
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/notification_hook.py +2 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/parallel_enforcer.py +5 -5
- {stravinsky-0.4.17/.claude → stravinsky-0.4.36/mcp_bridge}/hooks/parallel_execution.py +22 -10
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/pre_compact.py +7 -8
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/preemptive_compaction.py +2 -3
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/rules_injector.py +11 -19
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/session_idle.py +4 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/session_notifier.py +4 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/session_recovery.py +4 -5
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/stravinsky_mode.py +1 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/subagent_stop.py +1 -3
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/task_validator.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/tmux_manager.py +7 -8
- {stravinsky-0.4.17/.claude → stravinsky-0.4.36/mcp_bridge}/hooks/todo_delegation.py +4 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/todo_enforcer.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/truncator.py +1 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/notifications.py +3 -4
- stravinsky-0.4.36/mcp_bridge/prompts/__init__.py +13 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/planner.py +2 -4
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/stravinsky.py +0 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/server.py +47 -14
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/server_tools.py +56 -4
- stravinsky-0.4.36/mcp_bridge/tools/__init__.py +49 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/agent_manager.py +82 -58
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/background_tasks.py +13 -17
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/code_search.py +1 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/continuous_loop.py +0 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/init.py +1 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/lsp/manager.py +14 -20
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/lsp/tools.py +7 -7
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/model_invoke.py +644 -77
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/project_context.py +1 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/query_classifier.py +132 -49
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/semantic_search.py +321 -47
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/session_manager.py +0 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/skill_loader.py +0 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/task_runner.py +4 -6
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/templates.py +1 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/update_manager.py +33 -37
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/update_manager_pypi.py +6 -8
- stravinsky-0.4.36/owasp.txt +1 -0
- stravinsky-0.4.36/pre_deploy_check.sh +126 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/pyproject.toml +2 -1
- stravinsky-0.4.36/rfc7519.txt +1 -0
- stravinsky-0.4.36/security_advisory.txt +1 -0
- stravinsky-0.4.36/test_agentic_api.py +64 -0
- stravinsky-0.4.36/test_auth_visibility.py +100 -0
- stravinsky-0.4.36/test_coverage_report.md +206 -0
- stravinsky-0.4.36/test_plan_uncovered_tools.md +868 -0
- stravinsky-0.4.36/tests/README_LSP_TESTS.md +259 -0
- stravinsky-0.4.36/tests/test_agent_manager.py +834 -0
- stravinsky-0.4.36/tests/test_api_key_auth.py +134 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_auto_indexing.py +123 -29
- stravinsky-0.4.36/tests/test_code_search.py +780 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_file_watcher.py +42 -7
- stravinsky-0.4.36/tests/test_hooks.py +29 -0
- stravinsky-0.4.36/tests/test_invoke_gemini_agentic.py +926 -0
- stravinsky-0.4.36/tests/test_lsp_tools.py +730 -0
- stravinsky-0.4.36/tests/test_mcp_server_integration.py +169 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_new_hooks.py +86 -72
- {stravinsky-0.4.17 → stravinsky-0.4.36}/uv.lock +31 -1
- stravinsky-0.4.36/verify_gemini_key.py +37 -0
- stravinsky-0.4.17/.stravinsky/agents/agent_0de66569.out +0 -117
- stravinsky-0.4.17/.stravinsky/agents/agent_0de66569.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_2ef2b305.out +0 -142
- stravinsky-0.4.17/.stravinsky/agents/agent_2ef2b305.system +0 -9
- stravinsky-0.4.17/.stravinsky/agents/agent_32fc606b.out +0 -123
- stravinsky-0.4.17/.stravinsky/agents/agent_32fc606b.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_4ed6ec7a.out +0 -132
- stravinsky-0.4.17/.stravinsky/agents/agent_4ed6ec7a.system +0 -9
- stravinsky-0.4.17/.stravinsky/agents/agent_622ae68b.out +0 -119
- stravinsky-0.4.17/.stravinsky/agents/agent_622ae68b.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_6731b838.out +0 -278
- stravinsky-0.4.17/.stravinsky/agents/agent_6731b838.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_6c536f2d.out +0 -103
- stravinsky-0.4.17/.stravinsky/agents/agent_6c536f2d.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_6ecde4ed.out +0 -76
- stravinsky-0.4.17/.stravinsky/agents/agent_6ecde4ed.system +0 -9
- stravinsky-0.4.17/.stravinsky/agents/agent_85449406.out +0 -13
- stravinsky-0.4.17/.stravinsky/agents/agent_85449406.system +0 -9
- stravinsky-0.4.17/.stravinsky/agents/agent_940fbc06.out +0 -170
- stravinsky-0.4.17/.stravinsky/agents/agent_940fbc06.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_adc99d05.out +0 -128
- stravinsky-0.4.17/.stravinsky/agents/agent_adc99d05.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_b3c09833.out +0 -124
- stravinsky-0.4.17/.stravinsky/agents/agent_b3c09833.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_cdd28e91.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents/agent_fee89a04.out +0 -81
- stravinsky-0.4.17/.stravinsky/agents/agent_fee89a04.system +0 -10
- stravinsky-0.4.17/.stravinsky/agents.json +0 -1442
- stravinsky-0.4.17/logs/.1c0e2f6784d083818216ed08579b248b799c8d86-audit.json +0 -40
- stravinsky-0.4.17/logs/.270de9f01be3c37438e0ae9542f6c146c85078ae-audit.json +0 -40
- stravinsky-0.4.17/logs/application-2026-01-03.log +0 -45
- stravinsky-0.4.17/logs/application-2026-01-04.log +0 -232
- stravinsky-0.4.17/logs/application-2026-01-05.log +0 -172
- stravinsky-0.4.17/logs/error-2026-01-03.log +0 -3
- stravinsky-0.4.17/logs/error-2026-01-04.log +0 -24
- stravinsky-0.4.17/logs/error-2026-01-05.log +0 -15
- stravinsky-0.4.17/mcp_bridge/__init__.py +0 -1
- stravinsky-0.4.17/mcp_bridge/hooks/parallel_execution.py +0 -111
- stravinsky-0.4.17/mcp_bridge/prompts/__init__.py +0 -20
- stravinsky-0.4.17/mcp_bridge/tools/__init__.py +0 -42
- stravinsky-0.4.17/tests/test_hooks.py +0 -56
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/HOOKS_INTEGRATION.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/HOOKS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/code-reviewer.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/debugger.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/delphi.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/dewey.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/explore.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/frontend.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/implementation-lead.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/research-lead.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/agents/stravinsky.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/delphi.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/dewey.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/index.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/publish.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/review.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/index.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/search.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/start_filewatch.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/stats.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str/stop_filewatch.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-cancel.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-clean.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-unwatch.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/str-watch.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/verify.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/commands/version.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/context.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/context_monitor.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/edit_recovery.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/notification_hook.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/pre_compact.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/stravinsky_mode.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/subagent_stop.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/todo_continuation.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/tool_messaging.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/hooks/truncator.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/rules/pypi_deployment.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/skills/chrome-devtools/SKILL.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/skills/sqlite/SKILL.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.claude/skills/supabase/SKILL.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.github/workflows/publish.yml +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/.stravinsky/mcp_mode +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/ARCHITECTURE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/AUTO_INDEXING_TEST_SUMMARY.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/COMPREHENSIVE_TEST_IMPLEMENTATION.txt +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/DELEGATION_FLOW_VERIFICATION.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/FILEWATCHER_DOCS_UPDATE_SUMMARY.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/FILEWATCHER_README.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/INSTALL.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/LSP_CLEANUP_FIX.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/MANUAL_TESTING_CHECKLIST.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/TESTING_AUTO_INDEXING.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/TESTING_SUMMARY_FINAL.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/TEST_ARTIFACTS_README.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/TEST_EXECUTION_REPORT.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/TEST_PLAN_AUTO_INDEXING.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/assets/logo.png +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/assets/logo.png.txt +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/assets/logo_small.png +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/AGENTS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/CALL_FLOW_DIAGRAM.txt +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/COMMANDS_CONSOLIDATION_REPORT.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/COMMANDS_QUICK_SUMMARY.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/DEPLOYMENT.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/FILEWATCHER_ARCHITECTURE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/FILEWATCHER_IMPLEMENTATION_SUMMARY.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/FILE_WATCHER.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/HOOKS_INSTALLATION.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/IMPLEMENTATION_PLAN.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INDEX_TOOL_CALL_LOGGING.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INJECTION_POINT_CODE_LOCATIONS.txt +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/INTELLIGENT_SEARCH_DESIGN.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/KEYRING_AUTH_FIX.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/LSP_MIGRATION_GUIDE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/MCP_TOOL_CALL_INJECTION_POINTS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/MODEL_ROUTING.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/QUERY_CLASSIFIER_DESIGN.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/QUICK_REFERENCE_INJECTION_POINTS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/README.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/README_COMMANDS_ANALYSIS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/README_filewatcher.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/REPORT_INDEX.txt +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEARCH_STRATEGY_TEST_SUITE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEARCH_TOOLS_ANALYSIS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_INDEXING_INDEX.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_BEST_PRACTICES.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_QUICK_START.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_TESTING_INDEX.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_SEARCH_TEST_REPORT.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/SEMANTIC_WATCHER_USAGE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/TEMPLATES_STRUCTURE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/TROUBLESHOOTING.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/architecture_workflow.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/filewatcher_design_summary.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/filewatcher_integration_design.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/filewatcher_quick_reference.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/remediation_plan.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/semantic_indexing_analysis.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/docs/semantic_indexing_quick_start.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/error.log +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/auth/token_refresh.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/cli/__init__.py +1 -1
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/MANIFEST_SCHEMA.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/README.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/__init__.py +2 -2
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/hooks.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/hooks_manifest.json +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/config/skills_manifest.json +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/HOOKS_SETTINGS.json +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/README.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/__init__.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/todo_continuation.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/hooks/tool_messaging.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/delphi.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/dewey.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/document_writer.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/explore.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/frontend.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/prompts/multimodal.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/tools/lsp/__init__.py +8 -8
- {stravinsky-0.4.17 → stravinsky-0.4.36}/mcp_bridge/utils/__init__.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/repro_spawn.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/run-mcp.sh +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/stdout_handshake_auditor.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/test_lsp_cleanup.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/test_lsp_manager.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/MANUAL_TEST_GUIDE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/QUERY_CLASSIFICATION_GUIDE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/QUICK_REFERENCE.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/README.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/README_AUTO_INDEXING_TESTS.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/README_QUERY_CLASSIFICATION.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/TEST_IMPLEMENTATION_SUMMARY.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/TEST_RESULTS_direct_gemini.md +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/conftest.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/manual_test_auto_indexing.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/manual_test_hooks.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_direct_gemini.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_file_watcher_no_index.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_query_classification.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_query_classifier.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_symlink_boundary.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/test_update_manager.py +0 -0
- {stravinsky-0.4.17 → stravinsky-0.4.36}/tests/verify_semantic_search.py +0 -0
- {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
|
|
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
|
|
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
|
|
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
|
-
###
|
|
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())
|