foundry-mcp 0.7.4__tar.gz → 0.8.19__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.
- foundry_mcp-0.8.19/CHANGELOG.md +714 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/CLAUDE.md +1 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/PKG-INFO +2 -1
- foundry_mcp-0.8.19/docs/concepts/deep_research_workflow.md +1289 -0
- foundry_mcp-0.8.19/docs/examples/deep-research/README.md +144 -0
- foundry_mcp-0.8.19/docs/examples/deep-research/llm-judges-audit.jsonl +87 -0
- foundry_mcp-0.8.19/docs/examples/deep-research/llm-judges-report.md +60 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/development-guide.md +200 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/observability.md +17 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/README.md +1 -1
- foundry_mcp-0.8.19/foundry-mcp.toml +145 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/mcp/capabilities_manifest.json +53 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/pyproject.toml +2 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/samples/foundry-mcp.toml +247 -5
- {foundry_mcp-0.7.4/specs/pending → foundry_mcp-0.8.19/specs/archived}/validate-fix-auto-cleanup-2025-12-15-001.json +2 -2
- foundry_mcp-0.8.19/specs/completed/deep-research-workflow-2025-12-30-001.json +2543 -0
- foundry_mcp-0.8.19/specs/completed/minified-json-responses-2025-12-31-001.json +588 -0
- {foundry_mcp-0.7.4/specs/active → foundry_mcp-0.8.19/specs/completed}/research-router-2025-12-29-001.json +1 -1
- {foundry_mcp-0.7.4/specs/active → foundry_mcp-0.8.19/specs/completed}/spec-modification-capabilities-2025-12-23-001.json +1 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/__init__.py +0 -13
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/plan.py +1 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/session.py +1 -8
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/context.py +39 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/config.py +381 -7
- foundry_mcp-0.8.19/src/foundry_mcp/core/batch_operations.py +1196 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/discovery.py +1 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/llm_config.py +8 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/naming.py +25 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prometheus.py +0 -13
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/__init__.py +12 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/base.py +39 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/claude.py +61 -8
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/codex.py +78 -9
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/cursor_agent.py +42 -13
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/detectors.py +14 -12
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/gemini.py +81 -9
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/opencode.py +147 -75
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/opencode_wrapper.js +8 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/package-lock.json +4 -4
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/package.json +1 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/validation.py +128 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/memory.py +103 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/models.py +1234 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/__init__.py +40 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/base.py +242 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/google.py +507 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/perplexity.py +442 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/semantic_scholar.py +544 -0
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/tavily.py +383 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/__init__.py +5 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/base.py +106 -12
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/consensus.py +161 -18
- foundry_mcp-0.8.19/src/foundry_mcp/core/research/workflows/deep_research.py +4142 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/responses.py +240 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/spec.py +1 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/task.py +141 -12
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/validation.py +6 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/server.py +0 -52
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/__init__.py +37 -18
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/authoring.py +29 -37
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/documentation_helpers.py +7 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/environment.py +205 -32
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/plan.py +2 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/provider.py +0 -40
- foundry_mcp-0.8.19/src/foundry_mcp/tools/unified/research.py +1283 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/review_helpers.py +17 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/server.py +9 -24
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/task.py +530 -9
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/conftest.py +27 -1
- foundry_mcp-0.8.19/tests/core/research/providers/test_perplexity.py +496 -0
- foundry_mcp-0.8.19/tests/core/research/workflows/test_deep_research.py +1352 -0
- foundry_mcp-0.8.19/tests/fixtures/intake/empty.jsonl +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_router_smoke.py +2 -6
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_authoring_tools.py +13 -5
- foundry_mcp-0.8.19/tests/integration/test_json_minification.py +84 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_mcp_tools.py +3 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_provider_tools.py +3 -2
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_research_e2e.py +19 -69
- foundry_mcp-0.8.19/tests/tools/__init__.py +0 -0
- foundry_mcp-0.8.19/tests/tools/unified/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/tools/unified/test_research.py +34 -58
- foundry_mcp-0.8.19/tests/unit/test_batch_operations.py +1643 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_cli_review_helpers.py +64 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/test_workflows.py +177 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_discovery.py +2 -2
- foundry_mcp-0.8.19/tests/unit/test_disabled_tools.py +94 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_fix_verification_types.py +5 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_phase_add_bulk.py +5 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_implementations.py +27 -26
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_review.py +2 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_sdd_cli_core.py +0 -1
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_sdd_cli_runtime.py +0 -124
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_task_metadata_batch.py +5 -1
- foundry_mcp-0.7.4/CHANGELOG.md +0 -275
- foundry_mcp-0.7.4/PLAN.md +0 -96
- foundry_mcp-0.7.4/docs/mcp_best_practices/14-feature-flags.md +0 -463
- foundry_mcp-0.7.4/foundry-mcp.toml +0 -93
- foundry_mcp-0.7.4/src/foundry_mcp/cli/flags.py +0 -266
- foundry_mcp-0.7.4/src/foundry_mcp/core/feature_flags.py +0 -592
- foundry_mcp-0.7.4/src/foundry_mcp/core/research/models.py +0 -437
- foundry_mcp-0.7.4/src/foundry_mcp/tools/unified/research.py +0 -658
- foundry_mcp-0.7.4/tests/unit/test_core/test_feature_flags.py +0 -874
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/.github/workflows/publish.yml +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/.gitignore +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/AGENTS.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/LICENSE +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/README.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/bin/foundry-mcp +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/architecture/adr-001-cli-architecture.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/01-cli-runtime.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/02-command-shaping.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/03-shared-services.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/04-testing-parity.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/README.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/codebase_standards/cli-output.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/codebase_standards/mcp_response_schema.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/codebase_standards/naming-conventions.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/concepts/sdd-philosophy.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/README.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-errors.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-overview.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-slo.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-tools.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/prometheus-rules/README.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/prometheus-rules/foundry-mcp-alerting-rules.yaml +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/prometheus-rules/foundry-mcp-recording-rules.yaml +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/ai-consultation.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/intake.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/llm-configuration.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/testing.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/01-versioned-contracts.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/02-envelopes-metadata.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/03-serialization-helpers.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/04-validation-input-hygiene.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/05-observability-telemetry.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/06-pagination-streaming.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/07-error-semantics.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/08-security-trust-boundaries.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/09-spec-driven-development.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/10-testing-fixtures.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/11-ai-llm-integration.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/12-timeout-resilience.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/13-tool-discovery.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/15-concurrency-patterns.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/pytest.ini +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/bikelane.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/dashboard_improvement.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/research-router-implementation.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/test-coverage-parity.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/ai-consultation-layer-2025-12-03-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/bikelane-intake-2025-12-28-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/cli-provider-abstraction-2025-11-30-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/foundry-cli-gap-remediation-2025-12-02-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/foundry-mcp-2025-01-25-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/internal-cli-elimination-2025-12-01-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/mcp-best-practices-remediation-2025-11-26-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/mcp-tool-consolidation-2025-12-10-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/multi-model-consensus-2025-12-05-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/observability-stack-2025-12-05-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/parity-testing-framework-2025-01-26-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/phase-first-spec-authoring-improvements-2025-12-23-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/phase-remove-tool-2025-12-05-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/remove-docquery-rendering-docgen-2025-12-09-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/response-schema-standardization-2025-11-26-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/sdd-cli-native-parity-2025-11-27-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/sdd-core-operations-2025-11-27-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/sdd-llm-features-2025-11-27-001.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/__main__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/agent.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/cache.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/dashboard.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/dev.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/journal.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/lifecycle.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/modify.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/pr.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/specs.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/tasks.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/testing.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/validate.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/config.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/logging.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/main.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/output.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/registry.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/resilience.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/transcript.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/ai_consultation.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/cache.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/capabilities.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/concurrency.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/context.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/error_collection.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/error_store.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/health.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/intake.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/journal.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/lifecycle.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/llm_patterns.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/llm_provider.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/logging_config.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/metrics_persistence.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/metrics_registry.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/metrics_store.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/modifications.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/observability.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/otel.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/otel_stubs.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/pagination.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/progress.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/fidelity_review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/markdown_plan_review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/plan_review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/registry.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/test_provider.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/rate_limit.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/chat.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/ideate.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/thinkdeep.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/resilience.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/security.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/testing.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/app.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/cards.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/charts.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/filters.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/tables.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/data/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/data/stores.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/launcher.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/errors.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/metrics.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/overview.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/providers.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/sdd_workflow.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/tool_usage.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/prompts/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/prompts/workflows.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/resources/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/resources/specs.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/schemas/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/schemas/intake-schema.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/schemas/sdd-spec-schema.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/context_helpers.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/error.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/health.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/journal.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/lifecycle.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/metrics.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/pr.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/router.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/spec.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/test.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/verification.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/contract/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/contract/response_schema.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/contract/test_response_schema.py +0 -0
- {foundry_mcp-0.7.4/tests/tools → foundry_mcp-0.8.19/tests/core}/__init__.py +0 -0
- {foundry_mcp-0.7.4/tests/tools/unified → foundry_mcp-0.8.19/tests/core/research}/__init__.py +0 -0
- /foundry_mcp-0.7.4/tests/fixtures/intake/empty.jsonl → /foundry_mcp-0.8.19/tests/core/research/providers/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/ai_responses/fidelity_review_response.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/ai_responses/plan_review_response.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/context_tracker/transcript.jsonl +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/README.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/error_not_found.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/error_validation_failure.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_missing_prompt.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_success.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_timeout.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_unavailable.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_list_success.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_list_with_unavailable.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_status_missing_id.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_status_not_found.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_status_success.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_specs_list.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_task_progress.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_test_presets.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_validation.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/README.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/edge_cases.jsonl +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/malformed.jsonl +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/sample_items.jsonl +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/conftest.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/fixtures/simple_plan.md +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/fixtures/simple_spec.json +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_fidelity_review_flow.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_plan_review_flow.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_provider_smoke.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_synthesis_flow.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_ai_consultation_e2e.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_environment_tools.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_fallback_integration.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_mcp_smoke.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_notifications_sampling.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_prepare_task_cli.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_sdd_cli_advanced.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_sdd_cli_parity.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/property/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/property/test_input_validation.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/test_responses.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/core/test_review.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_ai_consultation.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase3_contracts.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase4_contracts.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase5_contracts.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase6_contracts.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase7_contracts.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/__init__.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/test_memory.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/test_models.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_concurrency.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_intake.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_journal.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_lifecycle.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_llm_patterns.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_pagination.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_phase_metadata_update.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_provider_spec.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_resilience.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_security.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec_find_replace.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec_history.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec_validation.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_task.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_task_batch_update.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_validation.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_environment.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_error_collection.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_golden_fixtures.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_llm_provider.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_metrics_persistence.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_observability_graceful.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_base.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_detectors.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_registry.py +0 -0
- {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_transcript.py +0 -0
|
@@ -0,0 +1,714 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.8.19] - 2026-01-06
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Deep research workflow failure state handling**: Fixed issue where failed research sessions appeared "stalled" instead of properly marked as failed
|
|
13
|
+
- Added `mark_failed(error: str)` method to `DeepResearchState` to explicitly mark sessions as failed
|
|
14
|
+
- `_execute_gathering_async` now returns descriptive error message when all sub-queries fail to find sources
|
|
15
|
+
- All phase failure blocks (planning, gathering, analysis, synthesis) now call `state.mark_failed()` before returning
|
|
16
|
+
- Status reporting now includes `is_failed` and `failure_error` fields
|
|
17
|
+
- Status display shows "Failed" instead of "In Progress" for failed sessions with error details
|
|
18
|
+
|
|
19
|
+
## [0.8.18] - 2026-01-06
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **Deep research `continue`/`resume` event loop conflict**: Fixed `RuntimeError: Cannot run the event loop while another loop is running`
|
|
24
|
+
- `_continue_research()` now uses same event loop handling pattern as `_start_research()`
|
|
25
|
+
- Detects running event loop with `asyncio.get_event_loop().is_running()`
|
|
26
|
+
- Uses `ThreadPoolExecutor` to run async code in separate thread when already in async context
|
|
27
|
+
- Fixes issue when MCP server calls deep research continue/resume actions
|
|
28
|
+
|
|
29
|
+
## [0.8.17] - 2026-01-06
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **MCP task tool missing `task_ids` parameter**: Added `task_ids: Optional[List[str]]` parameter to the task tool schema
|
|
34
|
+
- The `start-batch`, `complete-batch`, and `reset-batch` actions require a list of task IDs
|
|
35
|
+
- Previously, only `task_id` (singular string) was exposed in the MCP schema
|
|
36
|
+
- Now both `task_id` and `task_ids` are available for single vs batch operations
|
|
37
|
+
|
|
38
|
+
## [0.8.16] - 2026-01-06
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- **Timeout standardization for AI CLI providers**: Increased default timeouts across all workflows
|
|
43
|
+
- Per-provider/per-operation minimum: 360s (6 minutes) for Claude, Codex, Gemini, CursorAgent, OpenCode
|
|
44
|
+
- Whole workflow timeouts: 600s (10 minutes) for plan_review, markdown_plan_review, deep_research
|
|
45
|
+
- Deep research phase timeouts increased: planning/analysis/refinement 360s, synthesis 600s
|
|
46
|
+
- Updated defaults in: `config.py`, `research.py`, `consensus.py`, `plan.py`, `review_helpers.py`
|
|
47
|
+
- Updated sample and default TOML configs with new timeout standards and documentation
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **Deep research `continue` action background execution**: Now properly supports `background=True` parameter
|
|
52
|
+
- Previously, continuing a research session ignored the `background` flag
|
|
53
|
+
- Added `background` and `task_timeout` parameters to `_continue_research()` method
|
|
54
|
+
- Continued research can now run in background thread like initial `start` action
|
|
55
|
+
|
|
56
|
+
- **Deep research status check crash**: Fixed `'NoneType' object has no attribute 'done'` error
|
|
57
|
+
- `BackgroundTask.is_done` property now correctly handles thread-based execution
|
|
58
|
+
- Previously used `task.done()` which only works for asyncio tasks
|
|
59
|
+
- Now checks `thread.is_alive()` for thread-based execution (daemon threads with `asyncio.run()`)
|
|
60
|
+
- Added comprehensive tests for background task state checking
|
|
61
|
+
|
|
62
|
+
## [0.8.15] - 2026-01-05
|
|
63
|
+
|
|
64
|
+
### Fixed
|
|
65
|
+
|
|
66
|
+
- **OpenCodeProvider server health check**: Now verifies server is actually responding, not just port open
|
|
67
|
+
- Added `_is_opencode_server_healthy()` to verify HTTP response from `/session` endpoint
|
|
68
|
+
- Prevents using stale processes or other services on port 4096
|
|
69
|
+
- Clear error message when port is in use by another process
|
|
70
|
+
|
|
71
|
+
- **Missing `_intake_feature_flag_blocked` function**: Added missing function to authoring.py
|
|
72
|
+
- Caused `NameError` when using intake-add, intake-list, intake-dismiss actions
|
|
73
|
+
|
|
74
|
+
## [0.8.14] - 2026-01-05
|
|
75
|
+
|
|
76
|
+
### Fixed
|
|
77
|
+
|
|
78
|
+
- **OpenCodeProvider silent server failure**: Empty responses no longer masked as SUCCESS
|
|
79
|
+
- `opencode_wrapper.js` now exits with error (code 1) when server returns empty response
|
|
80
|
+
- `opencode.py` validates non-empty content before returning SUCCESS status
|
|
81
|
+
- Added logging to `_ensure_server_running()` for better visibility into server startup
|
|
82
|
+
|
|
83
|
+
## [0.8.13] - 2026-01-05
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- **All CLI providers use stdin for prompts**: ClaudeProvider, GeminiProvider, and CursorAgentProvider now pass prompts via stdin
|
|
88
|
+
- Avoids CLI argument length limits for long prompts
|
|
89
|
+
- Updated `RunnerProtocol`, `_build_command()`, and `_run()` signatures to support `input_data`
|
|
90
|
+
- Consistent pattern across all CLI-based providers (Claude, Gemini, Cursor, Codex)
|
|
91
|
+
|
|
92
|
+
- **Full spec review collects all task files**: `_build_implementation_artifacts()` now collects `file_path` from all task/subtask/verify nodes
|
|
93
|
+
- Previously only worked when task_id or phase_id was specified
|
|
94
|
+
- Full spec reviews now include implementation artifacts from entire spec hierarchy
|
|
95
|
+
|
|
96
|
+
### Changed
|
|
97
|
+
|
|
98
|
+
- **Provider tests updated**: Test assertions updated to reflect stdin-based prompt handling
|
|
99
|
+
- `_build_command()` no longer includes prompt in returned command
|
|
100
|
+
- Tests verify prompt is passed separately for stdin input
|
|
101
|
+
|
|
102
|
+
## [0.8.12] - 2026-01-04
|
|
103
|
+
|
|
104
|
+
### Fixed
|
|
105
|
+
|
|
106
|
+
- **CodexProvider stdin prompt handling**: Prompts are now passed via stdin instead of CLI arguments
|
|
107
|
+
- Avoids CLI argument length limits for long prompts
|
|
108
|
+
- Uses `-` marker to read prompt from stdin
|
|
109
|
+
- Updated `_build_command()` and `_run()` signatures to support `input_data`
|
|
110
|
+
|
|
111
|
+
## [0.8.11] - 2026-01-04
|
|
112
|
+
|
|
113
|
+
### Fixed
|
|
114
|
+
|
|
115
|
+
- **Deep research background task execution**: Sub-queries now execute correctly
|
|
116
|
+
- Root cause: `asyncio.create_task()` was called from sync MCP handlers without a running event loop
|
|
117
|
+
- Solution: Use daemon threads with `asyncio.run()` for reliable background execution
|
|
118
|
+
- `BackgroundTask` class now supports both thread-based and asyncio-based execution
|
|
119
|
+
|
|
120
|
+
- **Intake-add priority validation UX**: Improved error messages and usability
|
|
121
|
+
- Handle explicit `null` from JSON as "use default p2" (previously caused confusing error)
|
|
122
|
+
- Error messages now include valid values: `p0, p1, p2, p3, p4`
|
|
123
|
+
- Added human-readable priority aliases: `critical`, `high`, `medium`, `low`, `lowest`
|
|
124
|
+
|
|
125
|
+
## [0.8.10] - 2026-01-04
|
|
126
|
+
|
|
127
|
+
### Added
|
|
128
|
+
|
|
129
|
+
- **Implement command configuration**: New `[implement]` section in TOML config
|
|
130
|
+
- `auto`: Skip prompts between tasks (default: false)
|
|
131
|
+
- `delegate`: Use subagents for implementation (default: **true**)
|
|
132
|
+
- `parallel`: Run subagents concurrently (default: false)
|
|
133
|
+
- `model`: Model for delegated tasks - haiku, sonnet, opus (default: haiku)
|
|
134
|
+
|
|
135
|
+
## [0.8.9] - 2026-01-04
|
|
136
|
+
|
|
137
|
+
### Fixed
|
|
138
|
+
|
|
139
|
+
- **Improved `phase-remove` discoverability**: Error message when attempting to remove a phase via `task action="remove"` now hints to use `authoring action="phase-remove"` instead
|
|
140
|
+
|
|
141
|
+
## [0.8.8] - 2026-01-04
|
|
142
|
+
|
|
143
|
+
### Added
|
|
144
|
+
|
|
145
|
+
- **ErrorCode.OPERATION_FAILED**: Added missing error code to `ErrorCode` enum
|
|
146
|
+
- Fixes AttributeError when batch operations fail (e.g., `prepare-batch` on completed spec)
|
|
147
|
+
|
|
148
|
+
### Fixed
|
|
149
|
+
|
|
150
|
+
- **Graceful `prepare-batch` on Complete Specs**: No longer throws error when spec is complete
|
|
151
|
+
- Returns `{tasks: [], spec_complete: true}` instead of erroring
|
|
152
|
+
- Enables clean detection of spec completion in parallel workflows
|
|
153
|
+
|
|
154
|
+
### Changed
|
|
155
|
+
|
|
156
|
+
- **Test Updates**: Updated batch operation tests to verify graceful completion handling
|
|
157
|
+
- `test_no_active_phases` now expects `None` error (not error string)
|
|
158
|
+
- `test_prepare_batch_context_detects_spec_complete` verifies `spec_complete: true` response
|
|
159
|
+
|
|
160
|
+
## [0.8.7] - 2026-01-03
|
|
161
|
+
|
|
162
|
+
### Added
|
|
163
|
+
|
|
164
|
+
- **Research Nodes**: New `research` task type for spec-integrated research workflows
|
|
165
|
+
- Add research nodes via `task(action="add", task_type="research", research_type="...", blocking_mode="...")`
|
|
166
|
+
- Supported `research_type`: chat, consensus, thinkdeep, ideate, deep
|
|
167
|
+
- `blocking_mode` controls dependency behavior: `none`, `soft` (default), `hard`
|
|
168
|
+
- Research nodes with soft/none blocking don't block dependent tasks
|
|
169
|
+
|
|
170
|
+
- **Spec-Integrated Research Actions**: New research tool actions for spec nodes
|
|
171
|
+
- `node-execute`: Execute research workflow linked to spec node
|
|
172
|
+
- `node-record`: Record research findings to spec node
|
|
173
|
+
- `node-status`: Get research node status and linked session info
|
|
174
|
+
- `node-findings`: Retrieve recorded findings from spec node
|
|
175
|
+
|
|
176
|
+
- **Git Commit Suggestions**: Task completion now suggests commits based on git cadence
|
|
177
|
+
- Response includes `suggest_commit`, `commit_scope`, `commit_message_hint`
|
|
178
|
+
- Respects `[git].commit_cadence` config (task, phase, spec)
|
|
179
|
+
|
|
180
|
+
- **Environment get-config Action**: Read configuration sections from foundry-mcp.toml
|
|
181
|
+
- `environment(action="get-config", sections=["implement", "git"])`
|
|
182
|
+
- Supports filtering by specific key within a section
|
|
183
|
+
|
|
184
|
+
- **Research Memory Universal Lookup**: Added `load_session_by_id()` for loading any session type by ID prefix
|
|
185
|
+
|
|
186
|
+
### Fixed
|
|
187
|
+
|
|
188
|
+
- **Spec Validation**: Added `failed` to allowed task statuses in `_validate_spec_structure()`
|
|
189
|
+
- Batch operations set `status: "failed"` on task failure, but validation rejected it
|
|
190
|
+
- Now allows: `pending`, `in_progress`, `completed`, `blocked`, `failed`
|
|
191
|
+
|
|
192
|
+
- **Test Fixtures**: Fixed inline spec fixtures missing required `status` field on `spec-root` nodes
|
|
193
|
+
|
|
194
|
+
### Removed
|
|
195
|
+
|
|
196
|
+
- **Obsolete Test**: Removed `test_flags_with_context` referencing removed feature flags system
|
|
197
|
+
|
|
198
|
+
## [0.8.6] - 2026-01-03
|
|
199
|
+
|
|
200
|
+
### Fixed
|
|
201
|
+
|
|
202
|
+
- **Spec Validation**: Added `failed` to allowed task statuses in `_validate_spec_structure()`
|
|
203
|
+
- Batch operations set `status: "failed"` on task failure, but validation rejected it
|
|
204
|
+
- Now allows: `pending`, `in_progress`, `completed`, `blocked`, `failed`
|
|
205
|
+
|
|
206
|
+
- **Test Fixtures**: Fixed inline spec fixtures missing required `status` field on `spec-root` nodes
|
|
207
|
+
- Updated 8 test specs in `test_batch_operations.py` to include `status: "in_progress"`
|
|
208
|
+
|
|
209
|
+
### Removed
|
|
210
|
+
|
|
211
|
+
- **Obsolete Test**: Removed `test_flags_with_context` from `test_sdd_cli_runtime.py`
|
|
212
|
+
- Test referenced `get_cli_flags()` and `flags_for_discovery()` from removed feature flags system
|
|
213
|
+
|
|
214
|
+
## [0.8.5] - 2026-01-03
|
|
215
|
+
|
|
216
|
+
### Changed
|
|
217
|
+
|
|
218
|
+
- **Default Disabled Tools**: Added `environment` to default `disabled_tools` list
|
|
219
|
+
- Tools disabled by default: `error`, `metrics`, `health`, `environment`
|
|
220
|
+
- These tools are only used during setup or for dashboard features
|
|
221
|
+
|
|
222
|
+
## [0.8.4] - 2026-01-03
|
|
223
|
+
|
|
224
|
+
### Changed
|
|
225
|
+
|
|
226
|
+
- **Tools Configuration Section**: Added dedicated `[tools]` config section for tool settings
|
|
227
|
+
- `disabled_tools` now preferred under `[tools]` (backward compatible with `[server]`)
|
|
228
|
+
- Comprehensive documentation of all available tools and their purposes
|
|
229
|
+
- Updated sample config and setup template with `[tools]` section
|
|
230
|
+
- Default recommendation: disable `error`, `metrics`, `health` to save context tokens
|
|
231
|
+
|
|
232
|
+
## [0.8.3] - 2026-01-03
|
|
233
|
+
|
|
234
|
+
### Removed
|
|
235
|
+
|
|
236
|
+
- **Feature Flags System**: Removed the entire feature flags subsystem to simplify codebase
|
|
237
|
+
- Deleted `src/foundry_mcp/core/feature_flags.py` and `src/foundry_mcp/cli/flags.py`
|
|
238
|
+
- Removed `docs/mcp_best_practices/14-feature-flags.md` documentation
|
|
239
|
+
- Server tools now always use unified manifest (previously feature-flag controlled)
|
|
240
|
+
- Removed all feature flag imports and usage across tools
|
|
241
|
+
|
|
242
|
+
### Added
|
|
243
|
+
|
|
244
|
+
- **Task Add `phase_id` Alias**: Added `phase_id` as alias for `parent` parameter in task `add` action
|
|
245
|
+
- Provides more intuitive parameter name when adding tasks to phases
|
|
246
|
+
- Falls back to `parent` if `phase_id` not provided
|
|
247
|
+
|
|
248
|
+
## [0.8.2] - 2026-01-03
|
|
249
|
+
|
|
250
|
+
### Fixed
|
|
251
|
+
|
|
252
|
+
- **CLI Provider Error Extraction**: Improved error message extraction from CLI tool outputs
|
|
253
|
+
- `ClaudeProvider`: Extract errors from JSON output with `is_error: true` field
|
|
254
|
+
- `CodexProvider`: Extract errors from JSONL events (`type: error`, `type: turn.failed`)
|
|
255
|
+
- `CursorAgentProvider`: Check stdout for plain text errors (not just stderr)
|
|
256
|
+
- `GeminiProvider`: Parse text + JSON error format, skip unhelpful `[object Object]` messages
|
|
257
|
+
- `OpenCodeProvider`: Extract errors from wrapper JSONL output
|
|
258
|
+
|
|
259
|
+
- **OpenCode NODE_PATH Configuration**: Added `_ensure_node_path()` to include global npm modules
|
|
260
|
+
- Allows `@opencode-ai/sdk` to be installed globally rather than bundled
|
|
261
|
+
- Detects global npm root via `npm root -g` and adds to NODE_PATH
|
|
262
|
+
|
|
263
|
+
## [0.8.1] - 2026-01-03
|
|
264
|
+
|
|
265
|
+
### Added
|
|
266
|
+
|
|
267
|
+
- **Batch Operations for Parallel Task Execution**: New actions for autonomous multi-task workflows
|
|
268
|
+
- `prepare-batch`: Find independent tasks for parallel execution with file-path conflict detection
|
|
269
|
+
- `start-batch`: Atomically start multiple tasks as in_progress (all-or-nothing validation)
|
|
270
|
+
- `complete-batch`: Complete multiple tasks with partial failure support
|
|
271
|
+
- `reset-batch`: Reset batch on failure, returning tasks to pending status
|
|
272
|
+
- Token budget support for context-aware batch sizing
|
|
273
|
+
- Stale task detection for tasks stuck in_progress beyond threshold
|
|
274
|
+
- Dependency graph visualization in prepare-batch responses
|
|
275
|
+
|
|
276
|
+
- **Autonomous Session Context Tracking**: CLI context management for continuous task processing
|
|
277
|
+
- `AutonomousSession` class for tracking batch state across operations
|
|
278
|
+
- `ContextTracker` for managing session lifecycle and context limits
|
|
279
|
+
- Integration with task router for session-aware operations
|
|
280
|
+
|
|
281
|
+
- **Configurable Tool Disabling**: Added `disabled_tools` configuration option to selectively disable MCP tools
|
|
282
|
+
- Configure via environment variable: `FOUNDRY_MCP_DISABLED_TOOLS=error,health,metrics,test`
|
|
283
|
+
- Configure via TOML: `[server] disabled_tools = ["error", "health", "metrics", "test"]`
|
|
284
|
+
- Tools remain in codebase but are not registered with the MCP server when disabled
|
|
285
|
+
- Useful for reducing context window usage by hiding unused tools
|
|
286
|
+
|
|
287
|
+
### Changed
|
|
288
|
+
|
|
289
|
+
- Enhanced development guide with batch operations documentation and usage examples
|
|
290
|
+
|
|
291
|
+
## [0.7.11] - 2025-12-30
|
|
292
|
+
|
|
293
|
+
### Fixed
|
|
294
|
+
|
|
295
|
+
- **Consensus Workflow Provider Spec Parsing**: Extended provider spec parsing fix to consensus workflow
|
|
296
|
+
- Full specs like `[cli]codex:gpt-5.2` in `consensus_providers` config now work correctly
|
|
297
|
+
- Parses specs in `execute()`, `_query_provider_sync()`, and `_query_single_provider()`
|
|
298
|
+
- Filters providers by base ID availability while preserving model selection
|
|
299
|
+
|
|
300
|
+
## [0.7.10] - 2025-12-30
|
|
301
|
+
|
|
302
|
+
### Fixed
|
|
303
|
+
|
|
304
|
+
- **Research Workflow Provider Spec Parsing**: Fixed `_resolve_provider` to handle full provider specs
|
|
305
|
+
- Full specs like `[cli]codex:gpt-5.2-codex` in `default_provider` config now work correctly
|
|
306
|
+
- Extracts base provider ID for availability check (e.g., `codex` from full spec)
|
|
307
|
+
- Passes model from spec to `resolve_provider()` for proper model selection
|
|
308
|
+
- Caches providers by full spec string to differentiate model variants
|
|
309
|
+
|
|
310
|
+
## [0.7.9] - 2025-12-30
|
|
311
|
+
|
|
312
|
+
### Fixed
|
|
313
|
+
|
|
314
|
+
- **Provider Detector Cache Isolation**: Fixed test pollution where availability cache persisted across tests
|
|
315
|
+
- `reset_detectors()` now clears `_AVAILABILITY_CACHE` to ensure fresh detection
|
|
316
|
+
- Prevents false negatives when test order affects cached availability results
|
|
317
|
+
|
|
318
|
+
- **Research E2E Test Fixtures**: Added missing `max_messages_per_thread` to mock_config fixture
|
|
319
|
+
- Fixed `TypeError: '>=' not supported between instances of 'MagicMock' and 'int'`
|
|
320
|
+
- Research chat workflow now works correctly in test mode
|
|
321
|
+
|
|
322
|
+
- **OpenCode Model Validation Test**: Removed obsolete test for empty model validation
|
|
323
|
+
- Model validation was delegated to CLI in v0.7.5 but test was not removed
|
|
324
|
+
- OpenCode provider correctly passes any model to CLI for validation
|
|
325
|
+
|
|
326
|
+
## [0.7.8] - 2025-12-30
|
|
327
|
+
|
|
328
|
+
### Fixed
|
|
329
|
+
|
|
330
|
+
- **Consensus Event Loop Conflict**: Fixed `asyncio.run() cannot be called from a running event loop` error
|
|
331
|
+
- Replaced `asyncio.run()` with `ThreadPoolExecutor` for parallel provider execution
|
|
332
|
+
- Works correctly within MCP server's event loop context
|
|
333
|
+
- New `_execute_parallel_sync()` and `_query_provider_sync()` methods for thread-based parallelism
|
|
334
|
+
|
|
335
|
+
- **Research Timeout Configuration**: Fixed thinkdeep and other workflows timing out after 30 seconds
|
|
336
|
+
- Added `default_timeout` config option to `[research]` section (default: 60 seconds)
|
|
337
|
+
- Workflows now use configurable timeout from config instead of hardcoded 30s
|
|
338
|
+
- Longer-running investigation workflows like thinkdeep no longer timeout prematurely
|
|
339
|
+
|
|
340
|
+
## [0.7.7] - 2025-12-30
|
|
341
|
+
|
|
342
|
+
### Added
|
|
343
|
+
|
|
344
|
+
- **Research ProviderSpec Alignment**: Research config now supports full ProviderSpec notation like consultation
|
|
345
|
+
- `default_provider` accepts both simple IDs (`"gemini"`) and ProviderSpec (`"[cli]gemini:gemini-2.5-flash"`)
|
|
346
|
+
- `consensus_providers` accepts mixed notation for flexible model selection per provider
|
|
347
|
+
- New `ResearchConfig.get_default_provider_spec()` helper parses default provider
|
|
348
|
+
- New `ResearchConfig.get_consensus_provider_specs()` helper parses consensus providers
|
|
349
|
+
- New `ProviderSpec.parse_flexible()` method for backward-compatible parsing
|
|
350
|
+
- Workflows (`chat`, `consensus`, `thinkdeep`, `ideate`) now extract models from specs
|
|
351
|
+
- Added `[research]` section to sample config with notation examples
|
|
352
|
+
|
|
353
|
+
## [0.7.6] - 2025-12-30
|
|
354
|
+
|
|
355
|
+
### Fixed
|
|
356
|
+
|
|
357
|
+
- **Research Tools Feature Flag**: Fixed bug where `research_tools = true` in `[features]` config section was ignored
|
|
358
|
+
- Root cause 1: `research_tools` flag was never registered in the feature flag registry
|
|
359
|
+
- Root cause 2: `[features]` section in TOML config was not being read
|
|
360
|
+
- Added flag registration in `research.py` following `provider.py` pattern
|
|
361
|
+
- Added global override support to `FeatureFlagRegistry` for config-based flag settings
|
|
362
|
+
- Added `[features]` section handling in `ServerConfig._load_toml()`
|
|
363
|
+
- Added `FOUNDRY_MCP_FEATURES` environment variable support (format: `flag1=true,flag2=false`)
|
|
364
|
+
|
|
365
|
+
### Added
|
|
366
|
+
|
|
367
|
+
- **Feature Flag Global Overrides**: New methods on `FeatureFlagRegistry`:
|
|
368
|
+
- `set_global_override(flag_name, enabled)` - Set config-based override for all clients
|
|
369
|
+
- `clear_global_override(flag_name)` - Clear a global override
|
|
370
|
+
- `clear_all_global_overrides()` - Clear all global overrides
|
|
371
|
+
- `apply_config_overrides(features)` - Apply multiple overrides from config dict
|
|
372
|
+
|
|
373
|
+
### Dependencies
|
|
374
|
+
|
|
375
|
+
- Added `filelock>=3.20.1` as a required dependency
|
|
376
|
+
|
|
377
|
+
## [Unreleased]
|
|
378
|
+
|
|
379
|
+
## [0.8.1] - 2026-01-03
|
|
380
|
+
|
|
381
|
+
### Added
|
|
382
|
+
|
|
383
|
+
- **Batch Operations for Parallel Task Execution**: New actions for autonomous multi-task workflows
|
|
384
|
+
- `prepare-batch`: Find independent tasks for parallel execution with file-path conflict detection
|
|
385
|
+
- `start-batch`: Atomically start multiple tasks as in_progress (all-or-nothing validation)
|
|
386
|
+
- `complete-batch`: Complete multiple tasks with partial failure support
|
|
387
|
+
- `reset-batch`: Reset batch on failure, returning tasks to pending status
|
|
388
|
+
- Token budget support for context-aware batch sizing
|
|
389
|
+
- Stale task detection for tasks stuck in_progress beyond threshold
|
|
390
|
+
- Dependency graph visualization in prepare-batch responses
|
|
391
|
+
|
|
392
|
+
- **Autonomous Session Context Tracking**: CLI context management for continuous task processing
|
|
393
|
+
- `AutonomousSession` class for tracking batch state across operations
|
|
394
|
+
- `ContextTracker` for managing session lifecycle and context limits
|
|
395
|
+
- Integration with task router for session-aware operations
|
|
396
|
+
|
|
397
|
+
### Changed
|
|
398
|
+
|
|
399
|
+
- Enhanced development guide with batch operations documentation and usage examples
|
|
400
|
+
|
|
401
|
+
## [0.8.0] - 2026-01-01
|
|
402
|
+
|
|
403
|
+
### Added
|
|
404
|
+
|
|
405
|
+
- **Deep Research Workflow**: Multi-phase iterative research with parallel source gathering
|
|
406
|
+
- Background async execution with immediate `research_id` return for non-blocking operation
|
|
407
|
+
- Five-phase pipeline: decomposition → search → analyze → synthesize → report
|
|
408
|
+
- Query decomposition with strategic sub-query generation based on research intent
|
|
409
|
+
- Gap detection and iterative refinement loops for comprehensive coverage
|
|
410
|
+
- Final synthesis with confidence scoring (low/medium/high/confirmed) and source citations
|
|
411
|
+
- Crash handler infrastructure for session recovery
|
|
412
|
+
- Research tool actions:
|
|
413
|
+
- `deep-research`: Start, continue, or resume research sessions
|
|
414
|
+
- `deep-research-status`: Poll running research status with phase progress
|
|
415
|
+
- `deep-research-report`: Get final markdown report with citations and audit trail
|
|
416
|
+
- `deep-research-list`: List sessions with cursor-based pagination
|
|
417
|
+
- `deep-research-delete`: Clean up research sessions
|
|
418
|
+
|
|
419
|
+
- **Search Provider System**: Extensible multi-provider search architecture
|
|
420
|
+
- **Google Custom Search**: Web search via Google's Custom Search JSON API
|
|
421
|
+
- **Perplexity AI**: Sonar model integration for AI-powered search
|
|
422
|
+
- **Tavily AI**: Search and extract modes with content analysis
|
|
423
|
+
- **Semantic Scholar**: Academic paper search with citation metadata
|
|
424
|
+
- Domain quality tiers (authoritative → unreliable) for source credibility scoring
|
|
425
|
+
- Rate limiting and error handling per provider
|
|
426
|
+
- Pluggable provider interface for custom backends
|
|
427
|
+
|
|
428
|
+
- **Research Configuration**: New `[research.deep]` config section
|
|
429
|
+
- Per-provider API key configuration (Google, Perplexity, Tavily, Semantic Scholar)
|
|
430
|
+
- Timeout, iteration, and concurrency controls
|
|
431
|
+
- Source quality and domain tier preferences
|
|
432
|
+
- Storage path and session TTL settings
|
|
433
|
+
|
|
434
|
+
- **Deep Research Documentation**: Comprehensive workflow documentation
|
|
435
|
+
- `docs/concepts/deep_research_workflow.md`: Architecture and usage guide
|
|
436
|
+
- `docs/examples/deep-research/`: Example research sessions and reports
|
|
437
|
+
|
|
438
|
+
- **Provider Availability Caching**: Cache provider detection results to speed up MCP tool calls
|
|
439
|
+
- New `[providers] availability_cache_ttl` config option (default: 3600 seconds)
|
|
440
|
+
- Reduces repeated calls from ~5s to ~0s
|
|
441
|
+
|
|
442
|
+
### Changed
|
|
443
|
+
|
|
444
|
+
- **Provider Model Validation Removed**: Model allowlists removed from all CLI providers
|
|
445
|
+
- Providers no longer pre-register or validate model IDs against hardcoded lists
|
|
446
|
+
- Any model string is now passed through to the underlying CLI for validation
|
|
447
|
+
- Eliminates sync issues when providers release new models
|
|
448
|
+
- Affected providers: `claude`, `gemini`, `codex`, `cursor-agent`
|
|
449
|
+
- Default models remain as fallbacks: opus, pro, gpt-5.2, composer-1
|
|
450
|
+
|
|
451
|
+
- **BREAKING: Simplified Spec Templates**: Removed pre-baked spec templates (simple, medium, complex, security)
|
|
452
|
+
- Only `empty` template is now supported - creates a blank spec with no phases
|
|
453
|
+
- Use phase templates (`planning`, `implementation`, `testing`, `security`, `documentation`) to add structure
|
|
454
|
+
- Default template changed from `medium` to `empty`
|
|
455
|
+
- Mission statement no longer required (was required for medium/complex)
|
|
456
|
+
- `_requires_rich_task_fields()` now checks explicit `complexity` metadata instead of template
|
|
457
|
+
- Passing deprecated templates (simple, medium, complex, security) returns validation error
|
|
458
|
+
|
|
459
|
+
### Fixed
|
|
460
|
+
|
|
461
|
+
- **AI Consultation Config Loading**: Fixed issue where AI consultation features returned `model_used: "none"` because config was loaded from CWD instead of workspace path
|
|
462
|
+
- `review.py`: Now loads `foundry-mcp.toml` from workspace path for fidelity reviews
|
|
463
|
+
- `plan.py`: Added `_find_config_file()` helper to walk up directories and find config
|
|
464
|
+
|
|
465
|
+
### Migration
|
|
466
|
+
|
|
467
|
+
**Spec Templates:**
|
|
468
|
+
```python
|
|
469
|
+
# Old approach (no longer works)
|
|
470
|
+
authoring(action="spec-create", name="my-feature", template="medium", mission="...")
|
|
471
|
+
|
|
472
|
+
# New approach
|
|
473
|
+
authoring(action="spec-create", name="my-feature")
|
|
474
|
+
authoring(action="phase-template", template_action="apply", template_name="planning", spec_id="...")
|
|
475
|
+
authoring(action="phase-template", template_action="apply", template_name="implementation", spec_id="...")
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
**Deep Research:**
|
|
479
|
+
```python
|
|
480
|
+
# Start a deep research session (returns immediately with research_id)
|
|
481
|
+
research(action="deep-research", query="What are the best practices for LLM evaluation?")
|
|
482
|
+
|
|
483
|
+
# Poll for status
|
|
484
|
+
research(action="deep-research-status", research_id="...")
|
|
485
|
+
|
|
486
|
+
# Get final report when complete
|
|
487
|
+
research(action="deep-research-report", research_id="...")
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## [0.7.0] - 2025-12-30
|
|
491
|
+
|
|
492
|
+
### Added
|
|
493
|
+
|
|
494
|
+
- **Research Router**: New unified research tool providing multi-model orchestration capabilities
|
|
495
|
+
- **chat**: Single-model conversation with thread persistence
|
|
496
|
+
- Thread creation with title and system prompt
|
|
497
|
+
- Conversation continuation via thread_id
|
|
498
|
+
- Token budgeting for context management
|
|
499
|
+
- Thread CRUD operations (list, get, delete)
|
|
500
|
+
- **consensus**: Multi-model parallel consultation with synthesis
|
|
501
|
+
- Parallel execution via asyncio.gather with semaphore limiting
|
|
502
|
+
- Four synthesis strategies: all_responses, synthesize, majority, first_valid
|
|
503
|
+
- Partial failure handling with min_responses and require_all options
|
|
504
|
+
- Configurable timeout per provider
|
|
505
|
+
- **thinkdeep**: Hypothesis-driven systematic investigation
|
|
506
|
+
- Investigation step execution with state persistence
|
|
507
|
+
- Hypothesis creation and tracking with evidence accumulation
|
|
508
|
+
- Confidence level progression (speculation -> confirmed)
|
|
509
|
+
- Convergence detection based on depth and confidence
|
|
510
|
+
- **ideate**: Creative brainstorming with idea clustering
|
|
511
|
+
- Four-phase workflow: divergent, convergent, selection, elaboration
|
|
512
|
+
- Multi-perspective idea generation
|
|
513
|
+
- Automatic clustering and scoring
|
|
514
|
+
- Detailed plan elaboration for selected clusters
|
|
515
|
+
- **ResearchConfig**: New configuration section for research workflows
|
|
516
|
+
- Configurable storage path, TTL, max messages per thread
|
|
517
|
+
- Default provider and consensus provider list
|
|
518
|
+
- ThinkDeep max depth and Ideate perspectives
|
|
519
|
+
- **Research Data Models**: Pydantic models for all workflow states
|
|
520
|
+
- Enums: WorkflowType, ConfidenceLevel, ConsensusStrategy, ThreadStatus, IdeationPhase
|
|
521
|
+
- Conversation, ThinkDeep, Ideate, and Consensus state models
|
|
522
|
+
- **File-Based Memory Storage**: Persistent state management for research sessions
|
|
523
|
+
- FileStorageBackend with CRUD operations
|
|
524
|
+
- File locking via filelock for thread safety
|
|
525
|
+
- TTL-based cleanup for expired sessions
|
|
526
|
+
- **Research Test Suite**: 149 tests covering models, memory, and router
|
|
527
|
+
- **Feature Flag**: `research_tools` flag (experimental) gates research tool access
|
|
528
|
+
|
|
529
|
+
## [0.6.0] - 2025-12-29
|
|
530
|
+
|
|
531
|
+
### Added
|
|
532
|
+
|
|
533
|
+
- **Bikelane Intake System**: Fast-capture queue for rapid idea/task capture with automatic triage workflow
|
|
534
|
+
- **intake-add**: Add items to the intake queue with title, description, priority (p0-p4), tags, source, and requester fields
|
|
535
|
+
- Idempotency key support for deduplication (checks last 100 items)
|
|
536
|
+
- Tag normalization to lowercase
|
|
537
|
+
- Full dry-run support for validation without persistence
|
|
538
|
+
- **intake-list**: List pending intake items in FIFO order with cursor-based pagination
|
|
539
|
+
- Configurable page size (1-200, default 50)
|
|
540
|
+
- Efficient line-hint seeking with fallback to full scan
|
|
541
|
+
- Returns total_count for queue size visibility
|
|
542
|
+
- **intake-dismiss**: Mark items as dismissed with optional reason
|
|
543
|
+
- Atomic file rewrite pattern for data integrity
|
|
544
|
+
- Supports dry-run mode
|
|
545
|
+
- JSONL-based storage at `specs/.bikelane/intake.jsonl` with fcntl file locking
|
|
546
|
+
- Automatic file rotation at 1000 items or 1MB
|
|
547
|
+
- Thread-safe and cross-process safe with 5-second lock timeout
|
|
548
|
+
- Security hardening: path traversal prevention, prompt injection sanitization, control character stripping
|
|
549
|
+
- Feature flag gated: `intake_tools` (experimental, opt-in)
|
|
550
|
+
- **Intake Schema**: JSON Schema for intake-v1 format with comprehensive validation constraints
|
|
551
|
+
- **Intake Documentation**: User guide at `docs/guides/intake.md`
|
|
552
|
+
- **RESOURCE_BUSY Error Code**: New error code for lock contention scenarios
|
|
553
|
+
|
|
554
|
+
## [0.5.1] - 2025-12-27
|
|
555
|
+
|
|
556
|
+
### Added
|
|
557
|
+
|
|
558
|
+
- **Phase Metadata Updates**: New `authoring action=phase-update-metadata` for updating phase-level metadata
|
|
559
|
+
- Supports updating `estimated_hours`, `description`, and `purpose` fields
|
|
560
|
+
- Full dry-run support for previewing changes
|
|
561
|
+
- Tracks previous values for audit purposes
|
|
562
|
+
- Core function `update_phase_metadata()` in `spec.py` with comprehensive validation
|
|
563
|
+
|
|
564
|
+
### Fixed
|
|
565
|
+
|
|
566
|
+
- **Lifecycle Tool Router Compatibility**: Fixed `_handle_move()` and other lifecycle handlers receiving unexpected keyword arguments (`force`, `to_folder`) from the unified router dispatch
|
|
567
|
+
- All lifecycle handlers now accept full parameter set for router compatibility
|
|
568
|
+
- Resolves errors like `_handle_move() got an unexpected keyword argument 'force'`
|
|
569
|
+
|
|
570
|
+
## [0.5.0] - 2025-12-27
|
|
571
|
+
|
|
572
|
+
### Added
|
|
573
|
+
|
|
574
|
+
- **Spec Modification Capabilities**: Complete implementation of dynamic spec modification (7 phases, 54 tasks)
|
|
575
|
+
- **Task Hierarchy Mutations**: `task action=move` for repositioning tasks within/across phases with circular reference prevention
|
|
576
|
+
- **Dependency Management**: `task action=add-dependency`, `task action=remove-dependency` for blocks/blocked_by/depends relationships
|
|
577
|
+
- **Task Requirements**: `task action=add-requirement` for adding structured requirements to tasks
|
|
578
|
+
- **Bulk Operations**: `authoring action=phase-add-bulk` for batch phase creation, `authoring action=phase-template` for applying predefined structures
|
|
579
|
+
- **Metadata Batch Updates**: `task action=metadata-batch` with AND-based filtering by node_type, phase_id, or pattern regex
|
|
580
|
+
- **Find-Replace**: `authoring action=spec-find-replace` with regex support and scope filtering for bulk spec modifications
|
|
581
|
+
- **Spec Rollback**: `authoring action=spec-rollback` for restoring specs from automatic backups
|
|
582
|
+
- **Spec History & Diff**: `spec action=history` for backup timeline, `spec action=diff` for comparing specs
|
|
583
|
+
- **Validation Enhancements**: `spec action=completeness-check` with weighted scoring (0-100), `spec action=duplicate-detection` with configurable similarity threshold
|
|
584
|
+
- **Standardized Error Codes**: New `ErrorCode` enum with semantic error codes per 07-error-semantics.md
|
|
585
|
+
- **Contract Tests**: Comprehensive test suite for response-v2 envelope compliance across all phases
|
|
586
|
+
|
|
587
|
+
### Changed
|
|
588
|
+
|
|
589
|
+
- Updated capabilities manifest with 15 new actions documented
|
|
590
|
+
- Spec modification spec moved from pending to active (100% complete)
|
|
591
|
+
|
|
592
|
+
## [0.4.2] - 2025-12-24
|
|
593
|
+
|
|
594
|
+
### Added
|
|
595
|
+
|
|
596
|
+
- **Preflight Validation**: `authoring action=spec-create dry_run=true` now generates and validates the full spec, returning `is_valid`, `error_count`, `warning_count`, and detailed diagnostics before actual creation
|
|
597
|
+
- **Schema Introspection**: New `spec action=schema` returns all valid enum values (templates, node_types, statuses, task_categories, verification_types, journal_entry_types, blocker_types, status_folders) for LLM/client discovery
|
|
598
|
+
|
|
599
|
+
### Changed
|
|
600
|
+
|
|
601
|
+
- **Spec Field Requirements**: Medium/complex specs now require `metadata.mission` and task metadata for `task_category`, `description`, and `acceptance_criteria`; implementation/refactoring tasks must include `file_path`
|
|
602
|
+
- **Task Metadata Updates**: `task update-metadata` now accepts `acceptance_criteria` and aligns task category validation with the canonical spec categories
|
|
603
|
+
|
|
604
|
+
## [0.4.1] - 2025-12-24
|
|
605
|
+
|
|
606
|
+
### Added
|
|
607
|
+
|
|
608
|
+
- **Batch Metadata Utilities**: New task actions for bulk operations
|
|
609
|
+
- `task action=metadata-batch`: Apply metadata updates to multiple nodes with AND-based filtering by `node_type`, `phase_id`, or `pattern` regex
|
|
610
|
+
- `task action=fix-verification-types`: Auto-fix invalid/missing verification types on verify nodes with legacy mapping support
|
|
611
|
+
- Both actions support `dry_run` mode for previewing changes
|
|
612
|
+
- **Phase-First Authoring**: New `authoring action=phase-add-bulk` for creating multiple phases at once with metadata defaults
|
|
613
|
+
- **Spec Mission Field**: Added `mission` field to spec metadata schema for concise goal statements
|
|
614
|
+
- **Workflow Timeout Override**: AI consultation now supports workflow-specific timeout configuration
|
|
615
|
+
|
|
616
|
+
### Changed
|
|
617
|
+
|
|
618
|
+
- **JSON Output Optimization**: CLI and MCP server now emit minified JSON (no indentation) for smaller payloads
|
|
619
|
+
- **Fidelity Review Improvements**: Better path resolution with workspace_root support, graceful handling of non-JSON provider responses
|
|
620
|
+
- **Provider Configuration**: Updated OpenCode model IDs and default model; reordered provider priority
|
|
621
|
+
- **Claude Provider Tests**: Updated to use Haiku model for faster test execution
|
|
622
|
+
|
|
623
|
+
### Fixed
|
|
624
|
+
|
|
625
|
+
- Fixed parameter filtering in error_list handler to prevent unexpected argument errors
|
|
626
|
+
- Fixed duplicate file paths in fidelity review implementation artifacts
|
|
627
|
+
- Synced `__init__.py` version with `pyproject.toml`
|
|
628
|
+
|
|
629
|
+
## [0.4.0] - 2025-12-23
|
|
630
|
+
|
|
631
|
+
### Changed
|
|
632
|
+
|
|
633
|
+
- **Verification Types**: Aligned task API and spec validator to use canonical values (`run-tests`, `fidelity`, `manual`)
|
|
634
|
+
- Task API now accepts `run-tests`, `fidelity`, `manual` (previously `auto`, `manual`, `none`)
|
|
635
|
+
- Spec validator updated to match canonical schema values
|
|
636
|
+
- Legacy values automatically mapped: `test` → `run-tests`, `auto` → `run-tests`
|
|
637
|
+
|
|
638
|
+
### Added
|
|
639
|
+
|
|
640
|
+
- **Auto-fix for `INVALID_VERIFICATION_TYPE`**: Specs with legacy verification types are now auto-fixable via `validate-fix`
|
|
641
|
+
- **Auto-fix for `INVALID_ROOT_PARENT`**: Specs where spec-root has non-null parent are now auto-fixable
|
|
642
|
+
|
|
643
|
+
### Removed
|
|
644
|
+
|
|
645
|
+
- Removed `foundry-mcp-ctl` package and mode-toggling feature - server now always runs with all tools registered
|
|
646
|
+
|
|
647
|
+
## [0.3.4] - 2025-12-21
|
|
648
|
+
|
|
649
|
+
_Note: Mode toggling features added in this version were subsequently removed._
|
|
650
|
+
|
|
651
|
+
## [0.3.3] - 2025-12-17
|
|
652
|
+
|
|
653
|
+
### Changed
|
|
654
|
+
- **Dashboard**: Refactored pages module to views with cleaner organization
|
|
655
|
+
- **Dashboard**: Improved data stores with better caching and filtering
|
|
656
|
+
- **Observability**: Added action label to tool metrics for router-level granularity
|
|
657
|
+
- **Providers**: Codex CLI now ignores unsupported parameters (warning instead of error)
|
|
658
|
+
|
|
659
|
+
### Added
|
|
660
|
+
- Dashboard PID file tracking for cross-CLI process management
|
|
661
|
+
- Tool usage dashboard view with action-level breakdown
|
|
662
|
+
- OpenCode Node.js wrapper for subprocess execution
|
|
663
|
+
- Integration tests for provider smoke testing, fidelity review flow, and plan review flow
|
|
664
|
+
|
|
665
|
+
### Fixed
|
|
666
|
+
- Codex provider environment handling (unsets OPENAI_API_KEY/OPENAI_BASE_URL that interfere with CLI)
|
|
667
|
+
- Minor fixes to Claude and Gemini providers
|
|
668
|
+
|
|
669
|
+
## [0.3.2] - 2025-12-16
|
|
670
|
+
|
|
671
|
+
### Added
|
|
672
|
+
- Launcher script (`bin/foundry-mcp`) for configurable Python interpreter selection
|
|
673
|
+
- `FOUNDRY_MCP_PYTHON` environment variable to override the default Python interpreter
|
|
674
|
+
|
|
675
|
+
### Fixed
|
|
676
|
+
- Removed duplicate `spec_id` and `node_id` fields from task progress response
|
|
677
|
+
|
|
678
|
+
## [0.3.1] - 2025-12-16
|
|
679
|
+
|
|
680
|
+
### Removed
|
|
681
|
+
- Removed `code` unified tool (find-class, find-function, callers, callees, trace, impact actions) from MCP surface. Unified manifest reduced from 17 to 16 tools.
|
|
682
|
+
|
|
683
|
+
## [0.3.0] - 2025-12-15
|
|
684
|
+
|
|
685
|
+
### Changed
|
|
686
|
+
- Consolidated the MCP tool surface into 17 unified routers (tool + `action`) and aligned CLI/MCP naming.
|
|
687
|
+
- Updated documentation and manifests to reflect the unified router contract.
|
|
688
|
+
|
|
689
|
+
### Added
|
|
690
|
+
- New completed specs documenting MCP tool consolidation and removal of docquery/rendering/docgen.
|
|
691
|
+
- Unified-manifest budget telemetry (Prometheus metrics, recording rules, alerting rules, and dashboard panels).
|
|
692
|
+
|
|
693
|
+
### Removed
|
|
694
|
+
- Legacy per-tool MCP modules and legacy CLI command surfaces in favor of unified routers.
|
|
695
|
+
- Docquery/rendering/docgen modules and generated docs previously under `docs/generated/`.
|
|
696
|
+
|
|
697
|
+
## [0.2.1] - 2025-12-08
|
|
698
|
+
|
|
699
|
+
### Changed
|
|
700
|
+
- **Dashboard**: Replaced aiohttp+vanilla JS dashboard with Streamlit for better visualizations and interactivity
|
|
701
|
+
- Dashboard dependencies changed from `aiohttp` to `streamlit`, `plotly`, `pandas`
|
|
702
|
+
- Default dashboard port changed from 8080 to 8501 (Streamlit default)
|
|
703
|
+
|
|
704
|
+
### Added
|
|
705
|
+
- New Streamlit dashboard with 5 pages: Overview, Errors, Metrics, Providers, SDD Workflow
|
|
706
|
+
- Interactive Plotly charts with zoom, pan, and hover tooltips
|
|
707
|
+
- Data export functionality (CSV/JSON download buttons)
|
|
708
|
+
- Cached data access via `@st.cache_data` for performance
|
|
709
|
+
- CLI commands: `dashboard start`, `dashboard stop`, `dashboard status`
|
|
710
|
+
- New SDD Workflow page for spec progress tracking, phase burndown, task status
|
|
711
|
+
- Plan review tool (`plan-review`) for AI-assisted specification review
|
|
712
|
+
|
|
713
|
+
### Removed
|
|
714
|
+
- Old aiohttp-based dashboard server and static JS/CSS files
|