misterdev 0.2.1__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {misterdev-0.2.1/misterdev.egg-info → misterdev-0.2.2}/PKG-INFO +1 -1
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/__init__.py +1 -1
- misterdev-0.2.2/misterdev/mcp_server.py +309 -0
- {misterdev-0.2.1 → misterdev-0.2.2/misterdev.egg-info}/PKG-INFO +1 -1
- misterdev-0.2.1/misterdev/mcp_server.py +0 -208
- {misterdev-0.2.1 → misterdev-0.2.2}/COMMERCIAL_LICENSE.md +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/LICENSE +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/README.md +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/agent.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/agent_helpers.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/analyzers/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/analyzers/project_analyzer/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/analyzers/project_analyzer/detection.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/analyzers/project_analyzer/merge.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/analyzers/project_analyzer/overview.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/analyzers/project_analyzer/prompts.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/cli.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/config.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/audit.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/config.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/change_tracker.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/_log.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/_text.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/extraction.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/python_generic.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/registry.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/rust_line.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/contracts/rust_tree_sitter.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/lsp.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/scratchpad.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/_log.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/cache.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/engine.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/graph.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/nodes.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/parsers.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/context/topography/syntax.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/context_budget.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/embeddings.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/free_models.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/llm_cache.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/model_catalog.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/model_ledger.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/economics/model_selector.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/bounded.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/container.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/error_classifier.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/error_resolver.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/governance.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/outcomes.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/progress.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/project.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/registry.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/execution/runtime.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/gitcmd.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/integration/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/integration/mcp.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/integration/mcp_gather.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/models.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/modes.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/advisor.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/assessment.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/decomposer.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/metacognition.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/sovereign.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/planning/targets.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/reporting/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/reporting/report.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/reporting/report_view.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/task.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/claim_verifier.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/critic.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/gatekeeper/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/gatekeeper/constants.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/gatekeeper/helpers.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/goal_check.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/independent.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/mutation_gate.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/preflight.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/spec_tests.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/validator.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/vision_verify.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/core/verification/web_verify.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/environments/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/environments/base_env.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/environments/container_env.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/environments/venv_env.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/base.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/edits.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/embeddings.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/errors.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/providers.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/client/response.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/prompt_manager.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/responses/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/responses/apply.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/responses/json_extract.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/responses/models.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/llm/responses/parsing.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/logging_setup.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/nl_cli.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/plugins.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/py.typed +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/base_executor.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/commands_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/context_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/critic_spec_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/edits_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/execute_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/gates_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/git_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/helpers.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/llm_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/task_executors/markdown_plan_executor/results_mixin.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/tools/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/tools/base_tool.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/tools/command.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/tools/file_io.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/tools/formatter.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/tools/git_tool.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/utils/__init__.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/utils/file_utils.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev/utils/process.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev.egg-info/SOURCES.txt +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev.egg-info/dependency_links.txt +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev.egg-info/entry_points.txt +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev.egg-info/requires.txt +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/misterdev.egg-info/top_level.txt +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/pyproject.toml +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/setup.cfg +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_advisor.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_agent_helpers.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_assessment.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_audit.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_bounded.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_budget_halt.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_change_tracker.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_claim_verifier.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_command_tool.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_config.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_container.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_context_budget.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_contracts.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_critic.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_decomposer.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_dynamic_model_integration.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_embeddings.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_error_classifier.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_error_resolver.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_executor.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_executor_git.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_extensibility.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_file_utils.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_free_models.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_gatekeeper.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_gitcmd.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_goal_check.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_goal_check_wiring.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_governance.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_hms_integration.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_independent.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_integration_gate_count.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_llm_cache.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_llm_client.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_lsp.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_mcp.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_mcp_remote.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_mcp_server.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_metacognition.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_model_catalog.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_model_ledger.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_model_selector.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_modes.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_mutation_gate.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_nl_cli.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_orchestrator_config.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_orchestrator_fixes.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_outcomes.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_plugins.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_preflight.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_process.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_progress.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_prompt_manager.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_registry.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_report.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_report_view.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_responses.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_runtime.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_scratchpad.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_security.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_sovereign.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_spec_tests.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_swebench_harness.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_targets.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_task_manager.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_topography.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_topography_cache.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_validator.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_vision_verify.py +0 -0
- {misterdev-0.2.1 → misterdev-0.2.2}/tests/test_web_verify.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: misterdev
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: An autonomous, extensible LLM build orchestrator that plans, edits, and verifies code across languages.
|
|
5
5
|
Author-email: David Condrey <david@writerslogic.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"""misterdev as an MCP server: drive the orchestrator from any MCP client.
|
|
2
|
+
|
|
3
|
+
This is a THIN adapter over the same ``ProjectOrchestrator`` the CLI uses. The
|
|
4
|
+
heavy work — reading the codebase, symbol-graph context management, multi-step
|
|
5
|
+
reasoning, model selection, budget — all runs IN THIS PROCESS with misterdev's
|
|
6
|
+
own LLM key. The client only sends a short instruction and receives a short
|
|
7
|
+
summary, so the codebase never enters the client's context window and the
|
|
8
|
+
context-scaling misterdev exists to provide is fully preserved.
|
|
9
|
+
|
|
10
|
+
Run it with the ``misterdev-mcp`` entry point (needs the ``mcp`` extra:
|
|
11
|
+
``pip install 'misterdev[mcp]'``). Tool definitions carry per-parameter
|
|
12
|
+
descriptions and honest behavioral annotations (read-only vs. destructive,
|
|
13
|
+
idempotent, open-world) so an AI agent can pick and call them correctly.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from typing import Annotated, Any, Dict, Optional
|
|
17
|
+
|
|
18
|
+
from mcp.server.fastmcp import FastMCP
|
|
19
|
+
from mcp.types import ToolAnnotations
|
|
20
|
+
from pydantic import Field
|
|
21
|
+
|
|
22
|
+
from misterdev.agent import ProjectOrchestrator
|
|
23
|
+
|
|
24
|
+
# Conservative default $ ceiling for an AI-client-triggered build (the CLI
|
|
25
|
+
# default is higher). The client can raise it explicitly per call.
|
|
26
|
+
_DEFAULT_MCP_BUDGET = 10.0
|
|
27
|
+
|
|
28
|
+
mcp = FastMCP("misterdev")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@mcp.tool(
|
|
32
|
+
annotations=ToolAnnotations(
|
|
33
|
+
title="List every project in the registry",
|
|
34
|
+
readOnlyHint=True,
|
|
35
|
+
idempotentHint=True,
|
|
36
|
+
openWorldHint=False,
|
|
37
|
+
)
|
|
38
|
+
)
|
|
39
|
+
def list_projects() -> Dict[str, Any]:
|
|
40
|
+
"""List every project misterdev currently knows about.
|
|
41
|
+
|
|
42
|
+
Use when: you need to discover which projects are registered before calling
|
|
43
|
+
``status``, ``build``, or ``run`` on a specific one. Do NOT use when: the
|
|
44
|
+
project isn't registered yet — call ``scan`` first to register it. Related:
|
|
45
|
+
``scan`` (register projects), ``status`` (inspect one project). Takes no
|
|
46
|
+
parameters.
|
|
47
|
+
|
|
48
|
+
Side effects: none — read-only, calls no LLM, and returns the same result on
|
|
49
|
+
repeated calls (idempotent).
|
|
50
|
+
|
|
51
|
+
Returns a mapping of project id to an object with its registered ``path`` and
|
|
52
|
+
``name``; an empty mapping when nothing is registered.
|
|
53
|
+
"""
|
|
54
|
+
return ProjectOrchestrator().list_projects()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@mcp.tool(
|
|
58
|
+
annotations=ToolAnnotations(
|
|
59
|
+
title="Show a project's tasks and their state",
|
|
60
|
+
readOnlyHint=True,
|
|
61
|
+
idempotentHint=True,
|
|
62
|
+
openWorldHint=False,
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
def status(
|
|
66
|
+
path: Annotated[
|
|
67
|
+
str,
|
|
68
|
+
Field(
|
|
69
|
+
description=(
|
|
70
|
+
"Absolute path to a registered project's directory (the one "
|
|
71
|
+
"containing its project.yaml). Must be a directory that has been "
|
|
72
|
+
"registered via ``scan``. Example: '/Users/me/code/my-api'."
|
|
73
|
+
),
|
|
74
|
+
examples=["/Users/me/code/my-api", "/workspace/repos/service"],
|
|
75
|
+
min_length=1,
|
|
76
|
+
),
|
|
77
|
+
],
|
|
78
|
+
) -> Dict[str, Any]:
|
|
79
|
+
"""Show a project's tasks and their current state.
|
|
80
|
+
|
|
81
|
+
Use when: you want to inspect what work exists and how far it has progressed,
|
|
82
|
+
e.g. before deciding whether to ``run`` pending tasks or ``build`` new work.
|
|
83
|
+
Do NOT use when: the project isn't registered — call ``scan`` first, or
|
|
84
|
+
``list_projects`` to find the right path. Related: ``list_projects``,
|
|
85
|
+
``run``, ``build``.
|
|
86
|
+
|
|
87
|
+
Side effects: none — read-only, calls no LLM, idempotent.
|
|
88
|
+
|
|
89
|
+
Returns the project's tasks, each with its id, title, and status.
|
|
90
|
+
"""
|
|
91
|
+
return ProjectOrchestrator().get_project_status(path)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@mcp.tool(
|
|
95
|
+
annotations=ToolAnnotations(
|
|
96
|
+
title="Scan a directory and register the projects found",
|
|
97
|
+
readOnlyHint=False,
|
|
98
|
+
destructiveHint=False,
|
|
99
|
+
idempotentHint=True,
|
|
100
|
+
openWorldHint=False,
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
def scan(
|
|
104
|
+
directory: Annotated[
|
|
105
|
+
str,
|
|
106
|
+
Field(
|
|
107
|
+
description=(
|
|
108
|
+
"Absolute path to an existing, readable directory to search "
|
|
109
|
+
"recursively for misterdev projects (directories containing a "
|
|
110
|
+
"project.yaml). Must be a directory, not a file. "
|
|
111
|
+
"Example: '/Users/me/code'."
|
|
112
|
+
),
|
|
113
|
+
examples=["/Users/me/code", "/workspace/repos"],
|
|
114
|
+
min_length=1,
|
|
115
|
+
),
|
|
116
|
+
],
|
|
117
|
+
) -> str:
|
|
118
|
+
"""Discover misterdev projects under a directory and add them to the registry.
|
|
119
|
+
|
|
120
|
+
Use when: you have projects on disk that misterdev does not know about yet,
|
|
121
|
+
before calling ``status``, ``build``, or ``run`` on them. Do NOT use when:
|
|
122
|
+
the projects are already registered (call ``list_projects`` to check) — a
|
|
123
|
+
re-scan is harmless but redundant. Related: ``list_projects`` (see what is
|
|
124
|
+
registered), ``status`` (inspect a registered project).
|
|
125
|
+
|
|
126
|
+
Side effects: writes only to misterdev's project registry — it never reads,
|
|
127
|
+
edits, or executes any project code, and re-scanning the same directory is
|
|
128
|
+
idempotent (no duplicates).
|
|
129
|
+
|
|
130
|
+
Returns a short confirmation string naming the directory scanned.
|
|
131
|
+
"""
|
|
132
|
+
ProjectOrchestrator().scan_directory(directory)
|
|
133
|
+
return f"Scanned and registered projects under: {directory}"
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@mcp.tool(
|
|
137
|
+
annotations=ToolAnnotations(
|
|
138
|
+
title="Autonomous build",
|
|
139
|
+
readOnlyHint=False,
|
|
140
|
+
destructiveHint=True,
|
|
141
|
+
idempotentHint=False,
|
|
142
|
+
openWorldHint=True,
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
def build(
|
|
146
|
+
path: Annotated[
|
|
147
|
+
str,
|
|
148
|
+
Field(
|
|
149
|
+
description=(
|
|
150
|
+
"Absolute path to the project directory to build (containing "
|
|
151
|
+
"project.yaml). Its git working tree must be clean. "
|
|
152
|
+
"Example: '/Users/me/code/my-api'."
|
|
153
|
+
),
|
|
154
|
+
examples=["/Users/me/code/my-api"],
|
|
155
|
+
min_length=1,
|
|
156
|
+
),
|
|
157
|
+
],
|
|
158
|
+
goal: Annotated[
|
|
159
|
+
str,
|
|
160
|
+
Field(
|
|
161
|
+
description=(
|
|
162
|
+
"Plain-English description of what to build, or a mode word: "
|
|
163
|
+
"'debug' (fix what's broken), 'complete' (finish unfinished work), "
|
|
164
|
+
"or 'review'. Example: 'add rate limiting to the public API'."
|
|
165
|
+
),
|
|
166
|
+
examples=["add rate limiting to the public API", "debug", "complete"],
|
|
167
|
+
min_length=1,
|
|
168
|
+
),
|
|
169
|
+
],
|
|
170
|
+
budget: Annotated[
|
|
171
|
+
float,
|
|
172
|
+
Field(
|
|
173
|
+
description=(
|
|
174
|
+
"Maximum US dollars to spend on this run. Must be > 0; the run "
|
|
175
|
+
"halts when reached. Example: 5.0."
|
|
176
|
+
),
|
|
177
|
+
examples=[5.0, 25.0],
|
|
178
|
+
gt=0,
|
|
179
|
+
),
|
|
180
|
+
] = _DEFAULT_MCP_BUDGET,
|
|
181
|
+
dry_run: Annotated[
|
|
182
|
+
bool,
|
|
183
|
+
Field(
|
|
184
|
+
description=(
|
|
185
|
+
"When true, plan and preview the tasks without editing any code "
|
|
186
|
+
"or spending beyond planning. Example: true."
|
|
187
|
+
),
|
|
188
|
+
examples=[False, True],
|
|
189
|
+
),
|
|
190
|
+
] = False,
|
|
191
|
+
parallel: Annotated[
|
|
192
|
+
bool,
|
|
193
|
+
Field(
|
|
194
|
+
description=(
|
|
195
|
+
"When true, run independent tasks concurrently in isolated git "
|
|
196
|
+
"worktrees. Example: false."
|
|
197
|
+
),
|
|
198
|
+
examples=[False, True],
|
|
199
|
+
),
|
|
200
|
+
] = False,
|
|
201
|
+
max_tasks: Annotated[
|
|
202
|
+
Optional[int],
|
|
203
|
+
Field(
|
|
204
|
+
description=(
|
|
205
|
+
"Cap how many tasks are planned/executed (bounds cost and scope). "
|
|
206
|
+
"Must be >= 1; omit for no cap. Example: 5."
|
|
207
|
+
),
|
|
208
|
+
examples=[5, 10],
|
|
209
|
+
ge=1,
|
|
210
|
+
),
|
|
211
|
+
] = None,
|
|
212
|
+
) -> str:
|
|
213
|
+
"""Autonomously plan AND execute a goal in a project, from scratch.
|
|
214
|
+
|
|
215
|
+
Use when: you have a goal but no existing task plan — ``build`` analyzes the
|
|
216
|
+
project, decomposes ``goal`` into tasks, edits the code, and verifies each
|
|
217
|
+
change through build/test/lint/typecheck gates, reverting anything that
|
|
218
|
+
regresses. Do NOT use when: a task plan already exists and you just want to
|
|
219
|
+
execute it (use ``run``), or the working tree is dirty (commit/stash first).
|
|
220
|
+
Related: ``run`` (execute an existing plan), ``status`` (inspect tasks).
|
|
221
|
+
|
|
222
|
+
DESTRUCTIVE side effects: edits files and makes git commits, and calls an
|
|
223
|
+
external LLM provider (open-world, non-idempotent). It refuses to run on a
|
|
224
|
+
dirty working tree. ``dry_run=True`` previews without changing anything;
|
|
225
|
+
``budget`` caps spend; ``max_tasks`` caps scope.
|
|
226
|
+
|
|
227
|
+
Returns a compact text report: what was done, per-gate results, and cost.
|
|
228
|
+
"""
|
|
229
|
+
orch = ProjectOrchestrator()
|
|
230
|
+
parts = [goal, "--budget", str(budget)]
|
|
231
|
+
if dry_run:
|
|
232
|
+
parts.append("--dry-run")
|
|
233
|
+
if parallel:
|
|
234
|
+
parts.append("--parallel")
|
|
235
|
+
if max_tasks is not None:
|
|
236
|
+
parts += ["--max-tasks", str(max_tasks)]
|
|
237
|
+
report = orch.build(path, " ".join(parts))
|
|
238
|
+
outcome = "succeeded" if orch.last_build_succeeded else "did not fully succeed"
|
|
239
|
+
return f"Build {outcome}.\n\n{report}"
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
@mcp.tool(
|
|
243
|
+
annotations=ToolAnnotations(
|
|
244
|
+
title="Run planned tasks",
|
|
245
|
+
readOnlyHint=False,
|
|
246
|
+
destructiveHint=True,
|
|
247
|
+
idempotentHint=False,
|
|
248
|
+
openWorldHint=True,
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
def run(
|
|
252
|
+
path: Annotated[
|
|
253
|
+
str,
|
|
254
|
+
Field(
|
|
255
|
+
description=(
|
|
256
|
+
"Absolute path to a registered project's directory that already "
|
|
257
|
+
"has planned tasks (a devplan). Example: '/Users/me/code/my-api'."
|
|
258
|
+
),
|
|
259
|
+
examples=["/Users/me/code/my-api"],
|
|
260
|
+
min_length=1,
|
|
261
|
+
),
|
|
262
|
+
],
|
|
263
|
+
task_id: Annotated[
|
|
264
|
+
Optional[str],
|
|
265
|
+
Field(
|
|
266
|
+
description=(
|
|
267
|
+
"Run only this single task id (as shown by ``status``); omit to "
|
|
268
|
+
"run all pending tasks in dependency order. Example: '010-add-auth'."
|
|
269
|
+
),
|
|
270
|
+
examples=["010-add-auth", "T-003"],
|
|
271
|
+
),
|
|
272
|
+
] = None,
|
|
273
|
+
dry_run: Annotated[
|
|
274
|
+
bool,
|
|
275
|
+
Field(
|
|
276
|
+
description=(
|
|
277
|
+
"When true, preview the tasks that would run without executing "
|
|
278
|
+
"or editing anything. Example: true."
|
|
279
|
+
),
|
|
280
|
+
examples=[False, True],
|
|
281
|
+
),
|
|
282
|
+
] = False,
|
|
283
|
+
) -> str:
|
|
284
|
+
"""Execute a project's ALREADY-PLANNED pending tasks (a devplan).
|
|
285
|
+
|
|
286
|
+
Use when: tasks already exist (from a prior ``plan`` or a devplan directory)
|
|
287
|
+
and you want to execute them. Do NOT use when: no plan exists and you are
|
|
288
|
+
starting from a goal — that is ``build``'s job (it analyzes and decomposes).
|
|
289
|
+
Related: ``build`` (plan + execute a goal), ``status`` (see the task ids).
|
|
290
|
+
Pass ``task_id`` to run a single task.
|
|
291
|
+
|
|
292
|
+
DESTRUCTIVE side effects: edits files and makes git commits, and calls an
|
|
293
|
+
external LLM provider (open-world, non-idempotent). ``dry_run=True`` previews
|
|
294
|
+
without changing anything.
|
|
295
|
+
|
|
296
|
+
Returns a short text summary of what was run or previewed.
|
|
297
|
+
"""
|
|
298
|
+
orch = ProjectOrchestrator()
|
|
299
|
+
if task_id:
|
|
300
|
+
orch.run_task(path, task_id)
|
|
301
|
+
return f"Ran task {task_id} for {path}."
|
|
302
|
+
orch.run_project(path, dry_run=dry_run)
|
|
303
|
+
verb = "Previewed" if dry_run else "Ran"
|
|
304
|
+
return f"{verb} pending tasks for {path}."
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def main() -> None:
|
|
308
|
+
"""Console entry point: serve misterdev over stdio MCP."""
|
|
309
|
+
mcp.run()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: misterdev
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: An autonomous, extensible LLM build orchestrator that plans, edits, and verifies code across languages.
|
|
5
5
|
Author-email: David Condrey <david@writerslogic.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
"""misterdev as an MCP server: drive the orchestrator from any MCP client.
|
|
2
|
-
|
|
3
|
-
This is a THIN adapter over the same ``ProjectOrchestrator`` the CLI uses. The
|
|
4
|
-
heavy work — reading the codebase, symbol-graph context management, multi-step
|
|
5
|
-
reasoning, model selection, budget — all runs IN THIS PROCESS with misterdev's
|
|
6
|
-
own LLM key. The client only sends a short instruction and receives a short
|
|
7
|
-
summary, so the codebase never enters the client's context window and the
|
|
8
|
-
context-scaling misterdev exists to provide is fully preserved.
|
|
9
|
-
|
|
10
|
-
Run it with the ``misterdev-mcp`` entry point (needs the ``mcp`` extra:
|
|
11
|
-
``pip install 'misterdev[mcp]'``). Tool definitions carry per-parameter
|
|
12
|
-
descriptions and honest behavioral annotations (read-only vs. destructive,
|
|
13
|
-
idempotent, open-world) so an AI agent can pick and call them correctly.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from typing import Annotated, Any, Dict, Optional
|
|
17
|
-
|
|
18
|
-
from mcp.server.fastmcp import FastMCP
|
|
19
|
-
from mcp.types import ToolAnnotations
|
|
20
|
-
from pydantic import Field
|
|
21
|
-
|
|
22
|
-
from misterdev.agent import ProjectOrchestrator
|
|
23
|
-
|
|
24
|
-
# Conservative default $ ceiling for an AI-client-triggered build (the CLI
|
|
25
|
-
# default is higher). The client can raise it explicitly per call.
|
|
26
|
-
_DEFAULT_MCP_BUDGET = 10.0
|
|
27
|
-
|
|
28
|
-
mcp = FastMCP("misterdev")
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@mcp.tool(
|
|
32
|
-
annotations=ToolAnnotations(
|
|
33
|
-
title="List registered projects",
|
|
34
|
-
readOnlyHint=True,
|
|
35
|
-
idempotentHint=True,
|
|
36
|
-
openWorldHint=False,
|
|
37
|
-
)
|
|
38
|
-
)
|
|
39
|
-
def list_projects() -> Dict[str, Any]:
|
|
40
|
-
"""List every project misterdev currently knows about.
|
|
41
|
-
|
|
42
|
-
Use this first to see what is registered before calling ``status`` or
|
|
43
|
-
``build`` on a specific one. Read-only — nothing is changed.
|
|
44
|
-
|
|
45
|
-
Returns a mapping of project id to its registered path and name.
|
|
46
|
-
"""
|
|
47
|
-
return ProjectOrchestrator().list_projects()
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
@mcp.tool(
|
|
51
|
-
annotations=ToolAnnotations(
|
|
52
|
-
title="Project status",
|
|
53
|
-
readOnlyHint=True,
|
|
54
|
-
idempotentHint=True,
|
|
55
|
-
openWorldHint=False,
|
|
56
|
-
)
|
|
57
|
-
)
|
|
58
|
-
def status(
|
|
59
|
-
path: Annotated[
|
|
60
|
-
str,
|
|
61
|
-
Field(
|
|
62
|
-
description="Path to the project (its directory, containing project.yaml)."
|
|
63
|
-
),
|
|
64
|
-
],
|
|
65
|
-
) -> Dict[str, Any]:
|
|
66
|
-
"""Show a project's tasks and their current state.
|
|
67
|
-
|
|
68
|
-
Use to inspect what work exists and how far it has progressed, e.g. before
|
|
69
|
-
deciding whether to ``run`` pending tasks or ``build`` something new.
|
|
70
|
-
Read-only — it does not run anything.
|
|
71
|
-
|
|
72
|
-
Returns the project's tasks with their statuses.
|
|
73
|
-
"""
|
|
74
|
-
return ProjectOrchestrator().get_project_status(path)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
@mcp.tool(
|
|
78
|
-
annotations=ToolAnnotations(
|
|
79
|
-
title="Scan for projects",
|
|
80
|
-
readOnlyHint=False,
|
|
81
|
-
destructiveHint=False,
|
|
82
|
-
idempotentHint=True,
|
|
83
|
-
openWorldHint=False,
|
|
84
|
-
)
|
|
85
|
-
)
|
|
86
|
-
def scan(
|
|
87
|
-
directory: Annotated[
|
|
88
|
-
str,
|
|
89
|
-
Field(description="Directory to search recursively for projects to register."),
|
|
90
|
-
],
|
|
91
|
-
) -> str:
|
|
92
|
-
"""Discover misterdev projects under a directory and register them.
|
|
93
|
-
|
|
94
|
-
Use once to make projects known to misterdev before inspecting or building
|
|
95
|
-
them. It writes to the project registry but does not touch project code, and
|
|
96
|
-
re-scanning the same directory is idempotent.
|
|
97
|
-
|
|
98
|
-
Returns a short confirmation string.
|
|
99
|
-
"""
|
|
100
|
-
ProjectOrchestrator().scan_directory(directory)
|
|
101
|
-
return f"Scanned and registered projects under: {directory}"
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@mcp.tool(
|
|
105
|
-
annotations=ToolAnnotations(
|
|
106
|
-
title="Autonomous build",
|
|
107
|
-
readOnlyHint=False,
|
|
108
|
-
destructiveHint=True,
|
|
109
|
-
idempotentHint=False,
|
|
110
|
-
openWorldHint=True,
|
|
111
|
-
)
|
|
112
|
-
)
|
|
113
|
-
def build(
|
|
114
|
-
path: Annotated[
|
|
115
|
-
str, Field(description="Path to the project to build (its directory).")
|
|
116
|
-
],
|
|
117
|
-
goal: Annotated[
|
|
118
|
-
str,
|
|
119
|
-
Field(
|
|
120
|
-
description="Plain-English goal, or a mode word: 'debug', 'complete', or 'review'."
|
|
121
|
-
),
|
|
122
|
-
],
|
|
123
|
-
budget: Annotated[
|
|
124
|
-
float,
|
|
125
|
-
Field(description="Maximum dollars to spend on this run.", gt=0),
|
|
126
|
-
] = _DEFAULT_MCP_BUDGET,
|
|
127
|
-
dry_run: Annotated[
|
|
128
|
-
bool,
|
|
129
|
-
Field(description="Plan and preview tasks without editing any code."),
|
|
130
|
-
] = False,
|
|
131
|
-
parallel: Annotated[
|
|
132
|
-
bool,
|
|
133
|
-
Field(
|
|
134
|
-
description="Run independent tasks concurrently in isolated git worktrees."
|
|
135
|
-
),
|
|
136
|
-
] = False,
|
|
137
|
-
max_tasks: Annotated[
|
|
138
|
-
Optional[int],
|
|
139
|
-
Field(description="Cap how many tasks are planned/executed (bounds cost)."),
|
|
140
|
-
] = None,
|
|
141
|
-
) -> str:
|
|
142
|
-
"""Autonomously plan AND execute a goal in a project, from scratch.
|
|
143
|
-
|
|
144
|
-
This is the main tool. Unlike ``run`` (which executes an existing plan),
|
|
145
|
-
``build`` analyzes the project, decomposes ``goal`` into tasks, edits the
|
|
146
|
-
code, and verifies each change through build/test/lint/typecheck gates,
|
|
147
|
-
reverting anything that regresses.
|
|
148
|
-
|
|
149
|
-
DESTRUCTIVE: it edits files and makes git commits. It refuses to run on a
|
|
150
|
-
dirty working tree (commit or stash first). Use ``dry_run=True`` to preview
|
|
151
|
-
the plan without changing anything. ``budget`` caps spend; ``max_tasks``
|
|
152
|
-
caps scope. It calls an external LLM provider (open-world).
|
|
153
|
-
|
|
154
|
-
Returns a compact report: what was done, gate results, and cost.
|
|
155
|
-
"""
|
|
156
|
-
orch = ProjectOrchestrator()
|
|
157
|
-
parts = [goal, "--budget", str(budget)]
|
|
158
|
-
if dry_run:
|
|
159
|
-
parts.append("--dry-run")
|
|
160
|
-
if parallel:
|
|
161
|
-
parts.append("--parallel")
|
|
162
|
-
if max_tasks is not None:
|
|
163
|
-
parts += ["--max-tasks", str(max_tasks)]
|
|
164
|
-
report = orch.build(path, " ".join(parts))
|
|
165
|
-
outcome = "succeeded" if orch.last_build_succeeded else "did not fully succeed"
|
|
166
|
-
return f"Build {outcome}.\n\n{report}"
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
@mcp.tool(
|
|
170
|
-
annotations=ToolAnnotations(
|
|
171
|
-
title="Run planned tasks",
|
|
172
|
-
readOnlyHint=False,
|
|
173
|
-
destructiveHint=True,
|
|
174
|
-
idempotentHint=False,
|
|
175
|
-
openWorldHint=True,
|
|
176
|
-
)
|
|
177
|
-
)
|
|
178
|
-
def run(
|
|
179
|
-
path: Annotated[str, Field(description="Path to the project.")],
|
|
180
|
-
task_id: Annotated[
|
|
181
|
-
Optional[str],
|
|
182
|
-
Field(description="Run only this task id; omit to run all pending tasks."),
|
|
183
|
-
] = None,
|
|
184
|
-
dry_run: Annotated[
|
|
185
|
-
bool, Field(description="Preview the tasks without executing them.")
|
|
186
|
-
] = False,
|
|
187
|
-
) -> str:
|
|
188
|
-
"""Execute a project's ALREADY-PLANNED pending tasks (a devplan).
|
|
189
|
-
|
|
190
|
-
Use this when tasks already exist (from a prior ``plan`` or devplan) and you
|
|
191
|
-
just want to run them — it does NOT analyze or decompose a goal; that is
|
|
192
|
-
``build``'s job. Pass ``task_id`` to run a single task.
|
|
193
|
-
|
|
194
|
-
DESTRUCTIVE: it edits files and commits. Use ``dry_run=True`` to preview.
|
|
195
|
-
Calls an external LLM provider (open-world). Returns a summary.
|
|
196
|
-
"""
|
|
197
|
-
orch = ProjectOrchestrator()
|
|
198
|
-
if task_id:
|
|
199
|
-
orch.run_task(path, task_id)
|
|
200
|
-
return f"Ran task {task_id} for {path}."
|
|
201
|
-
orch.run_project(path, dry_run=dry_run)
|
|
202
|
-
verb = "Previewed" if dry_run else "Ran"
|
|
203
|
-
return f"{verb} pending tasks for {path}."
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
def main() -> None:
|
|
207
|
-
"""Console entry point: serve misterdev over stdio MCP."""
|
|
208
|
-
mcp.run()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|