specsmith 0.13.0.dev501__tar.gz → 0.13.0.dev502__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.
- {specsmith-0.13.0.dev501/src/specsmith.egg-info → specsmith-0.13.0.dev502}/PKG-INFO +1 -1
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/pyproject.toml +1 -1
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_mcp_server.py +52 -105
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/LICENSE +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/README.md +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/setup.cfg +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/belief.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/certainty.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/py.typed +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/recovery.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/session.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/trace.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/__main__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/architect.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/auditor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/auth.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/block_export.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/channel.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/cli.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compressor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/config.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/context_window.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/credits.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/differ.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/doctor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/drive.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/editor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/executor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/exporter.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/history_search.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/importer.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/instinct.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/languages.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/ledger.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m006_session_governance.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/patent.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/paths.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/phase.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/plugins.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/profiles.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/releaser.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/requirements.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/serve.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/session.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/session_init.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/session_store.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/governance.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/specsmith_skills.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/sync.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/tools.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/trace.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/updater.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/validator.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/workspace.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_CMD_001.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_ai_client.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_auditor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_channel.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_cli.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_compliance.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_compressor.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_dispatch.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_epistemic.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_importer.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_integrations.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_intelligence.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_mcp_client.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_new_modules.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_nexus.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_permissions.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_rate_limits.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_req_248_262.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_req_358_359.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_scaffolder.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_smoke.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_suggester.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_tools.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_validator.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_vcs.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_warp_parity.py +0 -0
- {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_warp_parity_followup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.13.0.
|
|
3
|
+
Version: 0.13.0.dev502
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License-Expression: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.13.0.
|
|
7
|
+
version = "0.13.0.dev502"
|
|
8
8
|
description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.13.0.
|
|
3
|
+
Version: 0.13.0.dev502
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License-Expression: MIT
|
|
@@ -21,6 +21,8 @@ from typing import Any
|
|
|
21
21
|
|
|
22
22
|
import pytest
|
|
23
23
|
|
|
24
|
+
import specsmith.mcp_server as mcp_mod
|
|
25
|
+
|
|
24
26
|
|
|
25
27
|
# ---------------------------------------------------------------------------
|
|
26
28
|
# Autouse: suppress auto-update noise
|
|
@@ -48,9 +50,7 @@ def _make_rpc(method: str, params: dict[str, Any] | None = None, req_id: int = 1
|
|
|
48
50
|
|
|
49
51
|
def _send_rpc(msg: dict[str, Any]) -> dict[str, Any]:
|
|
50
52
|
"""Feed one JSON-RPC message to _handle_request and return its response."""
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
resp = _handle_request(msg)
|
|
53
|
+
resp = mcp_mod._handle_request(msg)
|
|
54
54
|
assert resp is not None, "Expected a response but got None"
|
|
55
55
|
return resp
|
|
56
56
|
|
|
@@ -100,11 +100,9 @@ class TestMcpProtocol:
|
|
|
100
100
|
assert tool["inputSchema"]["type"] == "object"
|
|
101
101
|
|
|
102
102
|
def test_notification_returns_none(self) -> None:
|
|
103
|
-
from specsmith.mcp_server import _handle_request
|
|
104
|
-
|
|
105
103
|
# Notifications have no id — no response expected
|
|
106
104
|
msg = {"jsonrpc": "2.0", "method": "notifications/initialized", "params": {}}
|
|
107
|
-
assert _handle_request(msg) is None
|
|
105
|
+
assert mcp_mod._handle_request(msg) is None
|
|
108
106
|
|
|
109
107
|
def test_unknown_method_returns_error(self) -> None:
|
|
110
108
|
resp = _send_rpc(_make_rpc("no_such_method", {}, req_id=99))
|
|
@@ -126,10 +124,10 @@ class TestMcpProtocol:
|
|
|
126
124
|
assert resp["result"] == {}
|
|
127
125
|
|
|
128
126
|
def test_parse_error_on_bad_json(self) -> None:
|
|
129
|
-
from specsmith.mcp_server import _handle_request
|
|
130
|
-
|
|
131
127
|
# _handle_request only processes dicts; parse errors are handled in run_server
|
|
132
|
-
resp = _handle_request(
|
|
128
|
+
resp = mcp_mod._handle_request(
|
|
129
|
+
{"jsonrpc": "2.0", "method": "initialize", "id": 10, "params": {}}
|
|
130
|
+
)
|
|
133
131
|
assert resp is not None
|
|
134
132
|
assert "result" in resp
|
|
135
133
|
|
|
@@ -141,15 +139,11 @@ class TestMcpProtocol:
|
|
|
141
139
|
|
|
142
140
|
class TestGovernanceAudit:
|
|
143
141
|
def test_returns_healthy_key(self, tmp_path: Path) -> None:
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
result = _handle_governance_audit({"project_dir": str(tmp_path)})
|
|
142
|
+
result = mcp_mod._handle_governance_audit({"project_dir": str(tmp_path)})
|
|
147
143
|
assert "healthy" in result
|
|
148
144
|
|
|
149
145
|
def test_returns_checks_list(self, tmp_path: Path) -> None:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
result = _handle_governance_audit({"project_dir": str(tmp_path)})
|
|
146
|
+
result = mcp_mod._handle_governance_audit({"project_dir": str(tmp_path)})
|
|
153
147
|
assert isinstance(result.get("checks"), list)
|
|
154
148
|
|
|
155
149
|
def test_via_tools_call(self, tmp_path: Path) -> None:
|
|
@@ -167,16 +161,12 @@ class TestGovernanceAudit:
|
|
|
167
161
|
|
|
168
162
|
class TestGovernanceCheckpoint:
|
|
169
163
|
def test_returns_anchor_key(self, tmp_path: Path) -> None:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
result = _handle_governance_checkpoint({"project_dir": str(tmp_path)})
|
|
164
|
+
result = mcp_mod._handle_governance_checkpoint({"project_dir": str(tmp_path)})
|
|
173
165
|
assert "anchor" in result
|
|
174
166
|
assert result["anchor"].startswith("SPECSMITH-ANCHOR-")
|
|
175
167
|
|
|
176
168
|
def test_returns_phase_and_health(self, tmp_path: Path) -> None:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
result = _handle_governance_checkpoint({"project_dir": str(tmp_path)})
|
|
169
|
+
result = mcp_mod._handle_governance_checkpoint({"project_dir": str(tmp_path)})
|
|
180
170
|
assert "health" in result
|
|
181
171
|
assert "phase" in result
|
|
182
172
|
assert "req_count" in result
|
|
@@ -196,15 +186,11 @@ class TestGovernanceCheckpoint:
|
|
|
196
186
|
|
|
197
187
|
class TestGovernancePreflight:
|
|
198
188
|
def test_empty_intent_returns_rejected(self, tmp_path: Path) -> None:
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
result = _handle_governance_preflight({"intent": "", "project_dir": str(tmp_path)})
|
|
189
|
+
result = mcp_mod._handle_governance_preflight({"intent": "", "project_dir": str(tmp_path)})
|
|
202
190
|
assert result["decision"] == "rejected"
|
|
203
191
|
|
|
204
192
|
def test_returns_decision_key(self, tmp_path: Path) -> None:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
result = _handle_governance_preflight(
|
|
193
|
+
result = mcp_mod._handle_governance_preflight(
|
|
208
194
|
{
|
|
209
195
|
"intent": "read governance health status",
|
|
210
196
|
"project_dir": str(tmp_path),
|
|
@@ -233,9 +219,7 @@ class TestGovernancePreflight:
|
|
|
233
219
|
|
|
234
220
|
class TestGovernancePhase:
|
|
235
221
|
def test_returns_phase_key(self, tmp_path: Path) -> None:
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
result = _handle_governance_phase({"project_dir": str(tmp_path)})
|
|
222
|
+
result = mcp_mod._handle_governance_phase({"project_dir": str(tmp_path)})
|
|
239
223
|
assert "phase" in result
|
|
240
224
|
|
|
241
225
|
def test_via_tools_call(self, tmp_path: Path) -> None:
|
|
@@ -253,9 +237,7 @@ class TestGovernancePhase:
|
|
|
253
237
|
|
|
254
238
|
class TestGovernanceReqList:
|
|
255
239
|
def test_missing_requirements_json_returns_error(self, tmp_path: Path) -> None:
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
result = _handle_governance_req_list({"project_dir": str(tmp_path)})
|
|
240
|
+
result = mcp_mod._handle_governance_req_list({"project_dir": str(tmp_path)})
|
|
259
241
|
assert "error" in result
|
|
260
242
|
|
|
261
243
|
def test_with_requirements_json(self, tmp_path: Path) -> None:
|
|
@@ -270,9 +252,7 @@ class TestGovernanceReqList:
|
|
|
270
252
|
json.dumps([{"id": "TEST-001", "covers": "REQ-001"}]), encoding="utf-8"
|
|
271
253
|
)
|
|
272
254
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
result = _handle_governance_req_list({"project_dir": str(tmp_path)})
|
|
255
|
+
result = mcp_mod._handle_governance_req_list({"project_dir": str(tmp_path)})
|
|
276
256
|
assert result["total"] == 2
|
|
277
257
|
assert result["covered"] == 1
|
|
278
258
|
req_ids = [r["id"] for r in result["reqs"]]
|
|
@@ -290,9 +270,7 @@ class TestGovernanceReqList:
|
|
|
290
270
|
]
|
|
291
271
|
(spec_dir / "requirements.json").write_text(json.dumps(reqs), encoding="utf-8")
|
|
292
272
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
result = _handle_governance_req_list(
|
|
273
|
+
result = mcp_mod._handle_governance_req_list(
|
|
296
274
|
{
|
|
297
275
|
"project_dir": str(tmp_path),
|
|
298
276
|
"status_filter": "planned",
|
|
@@ -318,68 +296,56 @@ class TestRegistryFunctions:
|
|
|
318
296
|
def test_read_registry_missing_file_returns_empty( # noqa: E501
|
|
319
297
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
320
298
|
) -> None:
|
|
321
|
-
import specsmith.mcp_server as _mod
|
|
322
|
-
|
|
323
299
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
324
300
|
# No file created — should return empty list
|
|
325
|
-
result =
|
|
301
|
+
result = mcp_mod.read_registry()
|
|
326
302
|
assert result == []
|
|
327
303
|
|
|
328
304
|
def test_write_then_read_roundtrip(
|
|
329
305
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
330
306
|
) -> None:
|
|
331
|
-
import specsmith.mcp_server as _mod
|
|
332
|
-
|
|
333
307
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
334
308
|
paths = ["/path/to/proj1", "/path/to/proj2"]
|
|
335
|
-
|
|
336
|
-
assert
|
|
309
|
+
mcp_mod.write_registry(paths)
|
|
310
|
+
assert mcp_mod.read_registry() == paths
|
|
337
311
|
|
|
338
312
|
def test_register_project_adds_new_entry(
|
|
339
313
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
340
314
|
) -> None:
|
|
341
|
-
import specsmith.mcp_server as _mod
|
|
342
|
-
|
|
343
315
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
344
316
|
proj = tmp_path / "myproject"
|
|
345
317
|
proj.mkdir()
|
|
346
|
-
added =
|
|
318
|
+
added = mcp_mod.register_project(str(proj))
|
|
347
319
|
assert added is True
|
|
348
|
-
assert str(proj) in
|
|
320
|
+
assert str(proj) in mcp_mod.read_registry()
|
|
349
321
|
|
|
350
322
|
def test_register_project_idempotent(
|
|
351
323
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
352
324
|
) -> None:
|
|
353
|
-
import specsmith.mcp_server as _mod
|
|
354
|
-
|
|
355
325
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
356
326
|
proj = tmp_path / "myproject"
|
|
357
327
|
proj.mkdir()
|
|
358
|
-
|
|
359
|
-
added_again =
|
|
328
|
+
mcp_mod.register_project(str(proj))
|
|
329
|
+
added_again = mcp_mod.register_project(str(proj))
|
|
360
330
|
assert added_again is False
|
|
361
|
-
assert
|
|
331
|
+
assert mcp_mod.read_registry().count(str(proj)) == 1
|
|
362
332
|
|
|
363
333
|
def test_unregister_project_removes_entry(
|
|
364
334
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
365
335
|
) -> None:
|
|
366
|
-
import specsmith.mcp_server as _mod
|
|
367
|
-
|
|
368
336
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
369
337
|
proj = tmp_path / "myproject"
|
|
370
338
|
proj.mkdir()
|
|
371
|
-
|
|
372
|
-
removed =
|
|
339
|
+
mcp_mod.register_project(str(proj))
|
|
340
|
+
removed = mcp_mod.unregister_project(str(proj))
|
|
373
341
|
assert removed is True
|
|
374
|
-
assert str(proj) not in
|
|
342
|
+
assert str(proj) not in mcp_mod.read_registry()
|
|
375
343
|
|
|
376
344
|
def test_unregister_project_returns_false_if_not_registered(
|
|
377
345
|
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
378
346
|
) -> None:
|
|
379
|
-
import specsmith.mcp_server as _mod
|
|
380
|
-
|
|
381
347
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
382
|
-
result =
|
|
348
|
+
result = mcp_mod.unregister_project("/nonexistent/path")
|
|
383
349
|
assert result is False
|
|
384
350
|
|
|
385
351
|
def test_registry_based_server_startup(
|
|
@@ -388,50 +354,40 @@ class TestRegistryFunctions:
|
|
|
388
354
|
"""run_server with no args should pick up projects from the registry."""
|
|
389
355
|
import io
|
|
390
356
|
|
|
391
|
-
import specsmith.mcp_server as _mod
|
|
392
|
-
from specsmith.mcp_server import run_server
|
|
393
|
-
|
|
394
357
|
monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
|
|
395
358
|
proj_a = tmp_path / "alpha"
|
|
396
359
|
proj_a.mkdir()
|
|
397
360
|
proj_b = tmp_path / "beta"
|
|
398
361
|
proj_b.mkdir()
|
|
399
|
-
|
|
400
|
-
|
|
362
|
+
mcp_mod.register_project(str(proj_a))
|
|
363
|
+
mcp_mod.register_project(str(proj_b))
|
|
401
364
|
|
|
402
365
|
old_stdin = sys.stdin
|
|
403
366
|
sys.stdin = io.StringIO("")
|
|
404
367
|
try:
|
|
405
|
-
run_server() # no project_dir arg — should use registry
|
|
368
|
+
mcp_mod.run_server() # no project_dir arg — should use registry
|
|
406
369
|
finally:
|
|
407
370
|
sys.stdin = old_stdin
|
|
408
371
|
|
|
409
372
|
# First registered project is the default
|
|
410
|
-
assert str(proj_a) ==
|
|
411
|
-
assert str(proj_b) in
|
|
373
|
+
assert str(proj_a) == mcp_mod._DEFAULT_PROJECT_DIR
|
|
374
|
+
assert str(proj_b) in mcp_mod._REGISTERED_PROJECTS
|
|
412
375
|
|
|
413
376
|
|
|
414
377
|
class TestGovernanceProjectList:
|
|
415
378
|
def test_returns_default_project(self, tmp_path: Path) -> None:
|
|
416
|
-
from specsmith.mcp_server import _handle_governance_project_list, run_server
|
|
417
|
-
|
|
418
379
|
# Prime server state with a known directory
|
|
419
|
-
|
|
420
|
-
|
|
380
|
+
mcp_mod._DEFAULT_PROJECT_DIR = str(tmp_path)
|
|
381
|
+
mcp_mod._REGISTERED_PROJECTS = [str(tmp_path)]
|
|
421
382
|
|
|
422
|
-
|
|
423
|
-
_mod._REGISTERED_PROJECTS = [str(tmp_path)]
|
|
424
|
-
|
|
425
|
-
result = _handle_governance_project_list({})
|
|
383
|
+
result = mcp_mod._handle_governance_project_list({})
|
|
426
384
|
assert result["default_project"] == str(tmp_path)
|
|
427
385
|
assert str(tmp_path) in result["projects"]
|
|
428
386
|
assert result["count"] >= 1
|
|
429
387
|
|
|
430
388
|
def test_via_tools_call(self, tmp_path: Path) -> None:
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
_mod._DEFAULT_PROJECT_DIR = str(tmp_path)
|
|
434
|
-
_mod._REGISTERED_PROJECTS = [str(tmp_path)]
|
|
389
|
+
mcp_mod._DEFAULT_PROJECT_DIR = str(tmp_path)
|
|
390
|
+
mcp_mod._REGISTERED_PROJECTS = [str(tmp_path)]
|
|
435
391
|
|
|
436
392
|
resp = _send_rpc(
|
|
437
393
|
_make_rpc(
|
|
@@ -449,9 +405,6 @@ class TestGovernanceProjectList:
|
|
|
449
405
|
"""run_server registers extra_project_dirs and they appear in project_list."""
|
|
450
406
|
import io
|
|
451
407
|
|
|
452
|
-
import specsmith.mcp_server as _mod
|
|
453
|
-
from specsmith.mcp_server import run_server
|
|
454
|
-
|
|
455
408
|
extra = tmp_path / "extra"
|
|
456
409
|
extra.mkdir()
|
|
457
410
|
|
|
@@ -459,26 +412,24 @@ class TestGovernanceProjectList:
|
|
|
459
412
|
old_stdin = sys.stdin
|
|
460
413
|
sys.stdin = io.StringIO("")
|
|
461
414
|
try:
|
|
462
|
-
run_server(project_dir=str(tmp_path), extra_project_dirs=[str(extra)])
|
|
415
|
+
mcp_mod.run_server(project_dir=str(tmp_path), extra_project_dirs=[str(extra)])
|
|
463
416
|
finally:
|
|
464
417
|
sys.stdin = old_stdin
|
|
465
418
|
|
|
466
|
-
assert str(tmp_path.resolve()) ==
|
|
467
|
-
assert str(extra.resolve()) in
|
|
468
|
-
assert
|
|
419
|
+
assert str(tmp_path.resolve()) == mcp_mod._DEFAULT_PROJECT_DIR
|
|
420
|
+
assert str(extra.resolve()) in mcp_mod._REGISTERED_PROJECTS
|
|
421
|
+
assert mcp_mod._REGISTERED_PROJECTS[0] == str(tmp_path.resolve())
|
|
469
422
|
|
|
470
423
|
def test_no_chdir_called(self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
471
424
|
"""run_server must NOT call os.chdir — paths are resolved absolutely."""
|
|
472
425
|
import io
|
|
473
426
|
|
|
474
|
-
from specsmith.mcp_server import run_server
|
|
475
|
-
|
|
476
427
|
chdir_calls: list[str] = []
|
|
477
428
|
monkeypatch.setattr("os.chdir", lambda p: chdir_calls.append(str(p)))
|
|
478
429
|
old_stdin = sys.stdin
|
|
479
430
|
sys.stdin = io.StringIO("")
|
|
480
431
|
try:
|
|
481
|
-
run_server(project_dir=str(tmp_path))
|
|
432
|
+
mcp_mod.run_server(project_dir=str(tmp_path))
|
|
482
433
|
finally:
|
|
483
434
|
sys.stdin = old_stdin
|
|
484
435
|
|
|
@@ -487,9 +438,7 @@ class TestGovernanceProjectList:
|
|
|
487
438
|
|
|
488
439
|
class TestGovernanceTraceSeal:
|
|
489
440
|
def test_missing_description_returns_error(self, tmp_path: Path) -> None:
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
result = _handle_governance_trace_seal(
|
|
441
|
+
result = mcp_mod._handle_governance_trace_seal(
|
|
493
442
|
{
|
|
494
443
|
"seal_type": "milestone",
|
|
495
444
|
"description": "",
|
|
@@ -503,9 +452,7 @@ class TestGovernanceTraceSeal:
|
|
|
503
452
|
spec_dir = tmp_path / ".specsmith"
|
|
504
453
|
spec_dir.mkdir()
|
|
505
454
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
result = _handle_governance_trace_seal(
|
|
455
|
+
result = mcp_mod._handle_governance_trace_seal(
|
|
509
456
|
{
|
|
510
457
|
"seal_type": "milestone",
|
|
511
458
|
"description": "test seal for pytest",
|
|
@@ -520,12 +467,10 @@ class TestGovernanceTraceSeal:
|
|
|
520
467
|
spec_dir = tmp_path / ".specsmith"
|
|
521
468
|
spec_dir.mkdir()
|
|
522
469
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
_handle_governance_trace_seal(
|
|
470
|
+
mcp_mod._handle_governance_trace_seal(
|
|
526
471
|
{"seal_type": "decision", "description": "first", "project_dir": str(tmp_path)}
|
|
527
472
|
)
|
|
528
|
-
result2 = _handle_governance_trace_seal(
|
|
473
|
+
result2 = mcp_mod._handle_governance_trace_seal(
|
|
529
474
|
{"seal_type": "milestone", "description": "second", "project_dir": str(tmp_path)}
|
|
530
475
|
)
|
|
531
476
|
assert result2["seal_id"] == "SEAL-0002"
|
|
@@ -586,8 +531,9 @@ class TestMcpServeCli:
|
|
|
586
531
|
timeout=15,
|
|
587
532
|
env=env,
|
|
588
533
|
)
|
|
589
|
-
except subprocess.TimeoutExpired:
|
|
534
|
+
except subprocess.TimeoutExpired: # pragma: no cover
|
|
590
535
|
pytest.skip("mcp serve subprocess timed out (slow CI env)")
|
|
536
|
+
return # never reached; satisfies flow analysis
|
|
591
537
|
|
|
592
538
|
assert proc.stdout, f"No output from mcp serve (stderr: {proc.stderr[:500]})"
|
|
593
539
|
response = json.loads(proc.stdout.strip().splitlines()[0])
|
|
@@ -623,8 +569,9 @@ class TestMcpServeCli:
|
|
|
623
569
|
timeout=15,
|
|
624
570
|
env=env,
|
|
625
571
|
)
|
|
626
|
-
except subprocess.TimeoutExpired:
|
|
572
|
+
except subprocess.TimeoutExpired: # pragma: no cover
|
|
627
573
|
pytest.skip("mcp serve subprocess timed out (slow CI env)")
|
|
574
|
+
return # never reached; satisfies flow analysis
|
|
628
575
|
|
|
629
576
|
lines = [ln for ln in proc.stdout.strip().splitlines() if ln.strip()]
|
|
630
577
|
assert len(lines) >= 2, f"Expected ≥2 responses, got: {lines}"
|
|
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
|
{specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/dispatcher.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/execution_profiles.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/model_intelligence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/provider_registry.py
RENAMED
|
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
|
{specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/patentsview.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|