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.
Files changed (354) hide show
  1. foundry_mcp-0.8.19/CHANGELOG.md +714 -0
  2. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/CLAUDE.md +1 -2
  3. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/PKG-INFO +2 -1
  4. foundry_mcp-0.8.19/docs/concepts/deep_research_workflow.md +1289 -0
  5. foundry_mcp-0.8.19/docs/examples/deep-research/README.md +144 -0
  6. foundry_mcp-0.8.19/docs/examples/deep-research/llm-judges-audit.jsonl +87 -0
  7. foundry_mcp-0.8.19/docs/examples/deep-research/llm-judges-report.md +60 -0
  8. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/development-guide.md +200 -1
  9. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/observability.md +17 -0
  10. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/README.md +1 -1
  11. foundry_mcp-0.8.19/foundry-mcp.toml +145 -0
  12. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/mcp/capabilities_manifest.json +53 -0
  13. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/pyproject.toml +2 -1
  14. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/samples/foundry-mcp.toml +247 -5
  15. {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
  16. foundry_mcp-0.8.19/specs/completed/deep-research-workflow-2025-12-30-001.json +2543 -0
  17. foundry_mcp-0.8.19/specs/completed/minified-json-responses-2025-12-31-001.json +588 -0
  18. {foundry_mcp-0.7.4/specs/active → foundry_mcp-0.8.19/specs/completed}/research-router-2025-12-29-001.json +1 -1
  19. {foundry_mcp-0.7.4/specs/active → foundry_mcp-0.8.19/specs/completed}/spec-modification-capabilities-2025-12-23-001.json +1 -1
  20. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/__init__.py +0 -13
  21. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/plan.py +1 -1
  22. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/session.py +1 -8
  23. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/context.py +39 -0
  24. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/config.py +381 -7
  25. foundry_mcp-0.8.19/src/foundry_mcp/core/batch_operations.py +1196 -0
  26. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/discovery.py +1 -1
  27. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/llm_config.py +8 -0
  28. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/naming.py +25 -2
  29. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prometheus.py +0 -13
  30. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/__init__.py +12 -0
  31. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/base.py +39 -0
  32. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/claude.py +61 -8
  33. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/codex.py +78 -9
  34. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/cursor_agent.py +42 -13
  35. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/detectors.py +14 -12
  36. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/gemini.py +81 -9
  37. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/opencode.py +147 -75
  38. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/opencode_wrapper.js +8 -2
  39. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/package-lock.json +4 -4
  40. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/package.json +1 -1
  41. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/validation.py +128 -0
  42. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/memory.py +103 -0
  43. foundry_mcp-0.8.19/src/foundry_mcp/core/research/models.py +1234 -0
  44. foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/__init__.py +40 -0
  45. foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/base.py +242 -0
  46. foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/google.py +507 -0
  47. foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/perplexity.py +442 -0
  48. foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/semantic_scholar.py +544 -0
  49. foundry_mcp-0.8.19/src/foundry_mcp/core/research/providers/tavily.py +383 -0
  50. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/__init__.py +5 -2
  51. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/base.py +106 -12
  52. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/consensus.py +161 -18
  53. foundry_mcp-0.8.19/src/foundry_mcp/core/research/workflows/deep_research.py +4142 -0
  54. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/responses.py +240 -0
  55. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/spec.py +1 -0
  56. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/task.py +141 -12
  57. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/validation.py +6 -1
  58. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/server.py +0 -52
  59. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/__init__.py +37 -18
  60. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/authoring.py +29 -37
  61. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/documentation_helpers.py +7 -0
  62. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/environment.py +205 -32
  63. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/plan.py +2 -1
  64. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/provider.py +0 -40
  65. foundry_mcp-0.8.19/src/foundry_mcp/tools/unified/research.py +1283 -0
  66. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/review_helpers.py +17 -2
  67. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/server.py +9 -24
  68. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/task.py +530 -9
  69. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/conftest.py +27 -1
  70. foundry_mcp-0.8.19/tests/core/research/providers/test_perplexity.py +496 -0
  71. foundry_mcp-0.8.19/tests/core/research/workflows/test_deep_research.py +1352 -0
  72. foundry_mcp-0.8.19/tests/fixtures/intake/empty.jsonl +0 -0
  73. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_router_smoke.py +2 -6
  74. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_authoring_tools.py +13 -5
  75. foundry_mcp-0.8.19/tests/integration/test_json_minification.py +84 -0
  76. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_mcp_tools.py +3 -2
  77. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_provider_tools.py +3 -2
  78. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_research_e2e.py +19 -69
  79. foundry_mcp-0.8.19/tests/tools/__init__.py +0 -0
  80. foundry_mcp-0.8.19/tests/tools/unified/__init__.py +0 -0
  81. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/tools/unified/test_research.py +34 -58
  82. foundry_mcp-0.8.19/tests/unit/test_batch_operations.py +1643 -0
  83. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_cli_review_helpers.py +64 -0
  84. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/test_workflows.py +177 -0
  85. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_discovery.py +2 -2
  86. foundry_mcp-0.8.19/tests/unit/test_disabled_tools.py +94 -0
  87. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_fix_verification_types.py +5 -1
  88. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_phase_add_bulk.py +5 -1
  89. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_implementations.py +27 -26
  90. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_review.py +2 -1
  91. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_sdd_cli_core.py +0 -1
  92. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_sdd_cli_runtime.py +0 -124
  93. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_task_metadata_batch.py +5 -1
  94. foundry_mcp-0.7.4/CHANGELOG.md +0 -275
  95. foundry_mcp-0.7.4/PLAN.md +0 -96
  96. foundry_mcp-0.7.4/docs/mcp_best_practices/14-feature-flags.md +0 -463
  97. foundry_mcp-0.7.4/foundry-mcp.toml +0 -93
  98. foundry_mcp-0.7.4/src/foundry_mcp/cli/flags.py +0 -266
  99. foundry_mcp-0.7.4/src/foundry_mcp/core/feature_flags.py +0 -592
  100. foundry_mcp-0.7.4/src/foundry_mcp/core/research/models.py +0 -437
  101. foundry_mcp-0.7.4/src/foundry_mcp/tools/unified/research.py +0 -658
  102. foundry_mcp-0.7.4/tests/unit/test_core/test_feature_flags.py +0 -874
  103. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/.github/workflows/publish.yml +0 -0
  104. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/.gitignore +0 -0
  105. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/AGENTS.md +0 -0
  106. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/LICENSE +0 -0
  107. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/README.md +0 -0
  108. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/bin/foundry-mcp +0 -0
  109. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/architecture/adr-001-cli-architecture.md +0 -0
  110. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/01-cli-runtime.md +0 -0
  111. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/02-command-shaping.md +0 -0
  112. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/03-shared-services.md +0 -0
  113. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/04-testing-parity.md +0 -0
  114. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/cli_best_practices/README.md +0 -0
  115. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/codebase_standards/cli-output.md +0 -0
  116. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/codebase_standards/mcp_response_schema.md +0 -0
  117. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/codebase_standards/naming-conventions.md +0 -0
  118. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/concepts/sdd-philosophy.md +0 -0
  119. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/README.md +0 -0
  120. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-errors.json +0 -0
  121. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-overview.json +0 -0
  122. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-slo.json +0 -0
  123. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/foundry-mcp-tools.json +0 -0
  124. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/prometheus-rules/README.md +0 -0
  125. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/prometheus-rules/foundry-mcp-alerting-rules.yaml +0 -0
  126. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/dashboards/prometheus-rules/foundry-mcp-recording-rules.yaml +0 -0
  127. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/ai-consultation.md +0 -0
  128. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/intake.md +0 -0
  129. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/llm-configuration.md +0 -0
  130. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/guides/testing.md +0 -0
  131. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/01-versioned-contracts.md +0 -0
  132. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/02-envelopes-metadata.md +0 -0
  133. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/03-serialization-helpers.md +0 -0
  134. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/04-validation-input-hygiene.md +0 -0
  135. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/05-observability-telemetry.md +0 -0
  136. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/06-pagination-streaming.md +0 -0
  137. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/07-error-semantics.md +0 -0
  138. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/08-security-trust-boundaries.md +0 -0
  139. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/09-spec-driven-development.md +0 -0
  140. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/10-testing-fixtures.md +0 -0
  141. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/11-ai-llm-integration.md +0 -0
  142. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/12-timeout-resilience.md +0 -0
  143. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/13-tool-discovery.md +0 -0
  144. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/docs/mcp_best_practices/15-concurrency-patterns.md +0 -0
  145. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/pytest.ini +0 -0
  146. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/bikelane.md +0 -0
  147. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/dashboard_improvement.md +0 -0
  148. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/research-router-implementation.md +0 -0
  149. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/.plans/test-coverage-parity.md +0 -0
  150. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/ai-consultation-layer-2025-12-03-001.json +0 -0
  151. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/bikelane-intake-2025-12-28-001.json +0 -0
  152. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/cli-provider-abstraction-2025-11-30-001.json +0 -0
  153. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/foundry-cli-gap-remediation-2025-12-02-001.json +0 -0
  154. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/foundry-mcp-2025-01-25-001.json +0 -0
  155. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/internal-cli-elimination-2025-12-01-001.json +0 -0
  156. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/mcp-best-practices-remediation-2025-11-26-001.json +0 -0
  157. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/mcp-tool-consolidation-2025-12-10-001.json +0 -0
  158. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/multi-model-consensus-2025-12-05-001.json +0 -0
  159. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/observability-stack-2025-12-05-001.json +0 -0
  160. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/parity-testing-framework-2025-01-26-001.json +0 -0
  161. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/phase-first-spec-authoring-improvements-2025-12-23-001.json +0 -0
  162. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/phase-remove-tool-2025-12-05-001.json +0 -0
  163. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/remove-docquery-rendering-docgen-2025-12-09-001.json +0 -0
  164. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/response-schema-standardization-2025-11-26-001.json +0 -0
  165. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/sdd-cli-native-parity-2025-11-27-001.json +0 -0
  166. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/sdd-core-operations-2025-11-27-001.json +0 -0
  167. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/specs/completed/sdd-llm-features-2025-11-27-001.json +0 -0
  168. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/__init__.py +0 -0
  169. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/__main__.py +0 -0
  170. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/agent.py +0 -0
  171. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/__init__.py +0 -0
  172. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/cache.py +0 -0
  173. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/dashboard.py +0 -0
  174. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/dev.py +0 -0
  175. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/journal.py +0 -0
  176. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/lifecycle.py +0 -0
  177. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/modify.py +0 -0
  178. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/pr.py +0 -0
  179. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/review.py +0 -0
  180. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/specs.py +0 -0
  181. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/tasks.py +0 -0
  182. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/testing.py +0 -0
  183. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/commands/validate.py +0 -0
  184. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/config.py +0 -0
  185. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/logging.py +0 -0
  186. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/main.py +0 -0
  187. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/output.py +0 -0
  188. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/registry.py +0 -0
  189. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/resilience.py +0 -0
  190. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/cli/transcript.py +0 -0
  191. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/__init__.py +0 -0
  192. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/ai_consultation.py +0 -0
  193. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/cache.py +0 -0
  194. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/capabilities.py +0 -0
  195. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/concurrency.py +0 -0
  196. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/context.py +0 -0
  197. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/error_collection.py +0 -0
  198. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/error_store.py +0 -0
  199. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/health.py +0 -0
  200. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/intake.py +0 -0
  201. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/journal.py +0 -0
  202. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/lifecycle.py +0 -0
  203. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/llm_patterns.py +0 -0
  204. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/llm_provider.py +0 -0
  205. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/logging_config.py +0 -0
  206. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/metrics_persistence.py +0 -0
  207. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/metrics_registry.py +0 -0
  208. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/metrics_store.py +0 -0
  209. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/modifications.py +0 -0
  210. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/observability.py +0 -0
  211. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/otel.py +0 -0
  212. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/otel_stubs.py +0 -0
  213. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/pagination.py +0 -0
  214. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/progress.py +0 -0
  215. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/__init__.py +0 -0
  216. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/fidelity_review.py +0 -0
  217. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/markdown_plan_review.py +0 -0
  218. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/prompts/plan_review.py +0 -0
  219. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/registry.py +0 -0
  220. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/providers/test_provider.py +0 -0
  221. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/rate_limit.py +0 -0
  222. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/__init__.py +0 -0
  223. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/chat.py +0 -0
  224. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/ideate.py +0 -0
  225. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/research/workflows/thinkdeep.py +0 -0
  226. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/resilience.py +0 -0
  227. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/review.py +0 -0
  228. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/security.py +0 -0
  229. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/core/testing.py +0 -0
  230. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/__init__.py +0 -0
  231. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/app.py +0 -0
  232. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/__init__.py +0 -0
  233. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/cards.py +0 -0
  234. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/charts.py +0 -0
  235. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/filters.py +0 -0
  236. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/components/tables.py +0 -0
  237. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/data/__init__.py +0 -0
  238. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/data/stores.py +0 -0
  239. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/launcher.py +0 -0
  240. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/__init__.py +0 -0
  241. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/errors.py +0 -0
  242. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/metrics.py +0 -0
  243. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/overview.py +0 -0
  244. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/providers.py +0 -0
  245. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/sdd_workflow.py +0 -0
  246. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/dashboard/views/tool_usage.py +0 -0
  247. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/prompts/__init__.py +0 -0
  248. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/prompts/workflows.py +0 -0
  249. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/resources/__init__.py +0 -0
  250. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/resources/specs.py +0 -0
  251. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/schemas/__init__.py +0 -0
  252. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/schemas/intake-schema.json +0 -0
  253. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/schemas/sdd-spec-schema.json +0 -0
  254. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/__init__.py +0 -0
  255. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/context_helpers.py +0 -0
  256. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/error.py +0 -0
  257. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/health.py +0 -0
  258. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/journal.py +0 -0
  259. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/lifecycle.py +0 -0
  260. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/metrics.py +0 -0
  261. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/pr.py +0 -0
  262. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/review.py +0 -0
  263. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/router.py +0 -0
  264. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/spec.py +0 -0
  265. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/test.py +0 -0
  266. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/src/foundry_mcp/tools/unified/verification.py +0 -0
  267. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/__init__.py +0 -0
  268. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/contract/__init__.py +0 -0
  269. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/contract/response_schema.json +0 -0
  270. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/contract/test_response_schema.py +0 -0
  271. {foundry_mcp-0.7.4/tests/tools → foundry_mcp-0.8.19/tests/core}/__init__.py +0 -0
  272. {foundry_mcp-0.7.4/tests/tools/unified → foundry_mcp-0.8.19/tests/core/research}/__init__.py +0 -0
  273. /foundry_mcp-0.7.4/tests/fixtures/intake/empty.jsonl → /foundry_mcp-0.8.19/tests/core/research/providers/__init__.py +0 -0
  274. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/ai_responses/fidelity_review_response.json +0 -0
  275. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/ai_responses/plan_review_response.json +0 -0
  276. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/context_tracker/transcript.jsonl +0 -0
  277. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/README.md +0 -0
  278. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/error_not_found.json +0 -0
  279. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/error_validation_failure.json +0 -0
  280. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_missing_prompt.json +0 -0
  281. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_success.json +0 -0
  282. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_timeout.json +0 -0
  283. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_execute_unavailable.json +0 -0
  284. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_list_success.json +0 -0
  285. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_list_with_unavailable.json +0 -0
  286. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_status_missing_id.json +0 -0
  287. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_status_not_found.json +0 -0
  288. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/provider_status_success.json +0 -0
  289. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_specs_list.json +0 -0
  290. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_task_progress.json +0 -0
  291. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_test_presets.json +0 -0
  292. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/golden/success_validation.json +0 -0
  293. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/README.md +0 -0
  294. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/edge_cases.jsonl +0 -0
  295. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/malformed.jsonl +0 -0
  296. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/fixtures/intake/sample_items.jsonl +0 -0
  297. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/conftest.py +0 -0
  298. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/fixtures/simple_plan.md +0 -0
  299. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/fixtures/simple_spec.json +0 -0
  300. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_fidelity_review_flow.py +0 -0
  301. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_plan_review_flow.py +0 -0
  302. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_provider_smoke.py +0 -0
  303. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/providers/test_synthesis_flow.py +0 -0
  304. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_ai_consultation_e2e.py +0 -0
  305. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_environment_tools.py +0 -0
  306. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_fallback_integration.py +0 -0
  307. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_mcp_smoke.py +0 -0
  308. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_notifications_sampling.py +0 -0
  309. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_prepare_task_cli.py +0 -0
  310. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_sdd_cli_advanced.py +0 -0
  311. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/integration/test_sdd_cli_parity.py +0 -0
  312. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/property/__init__.py +0 -0
  313. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/property/test_input_validation.py +0 -0
  314. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/test_responses.py +0 -0
  315. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/__init__.py +0 -0
  316. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/core/test_review.py +0 -0
  317. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_ai_consultation.py +0 -0
  318. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/__init__.py +0 -0
  319. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase3_contracts.py +0 -0
  320. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase4_contracts.py +0 -0
  321. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase5_contracts.py +0 -0
  322. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase6_contracts.py +0 -0
  323. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_contracts/test_phase7_contracts.py +0 -0
  324. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/__init__.py +0 -0
  325. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/__init__.py +0 -0
  326. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/test_memory.py +0 -0
  327. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/research/test_models.py +0 -0
  328. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_concurrency.py +0 -0
  329. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_intake.py +0 -0
  330. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_journal.py +0 -0
  331. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_lifecycle.py +0 -0
  332. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_llm_patterns.py +0 -0
  333. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_pagination.py +0 -0
  334. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_phase_metadata_update.py +0 -0
  335. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_provider_spec.py +0 -0
  336. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_resilience.py +0 -0
  337. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_security.py +0 -0
  338. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec.py +0 -0
  339. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec_find_replace.py +0 -0
  340. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec_history.py +0 -0
  341. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_spec_validation.py +0 -0
  342. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_task.py +0 -0
  343. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_task_batch_update.py +0 -0
  344. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_core/test_validation.py +0 -0
  345. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_environment.py +0 -0
  346. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_error_collection.py +0 -0
  347. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_golden_fixtures.py +0 -0
  348. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_llm_provider.py +0 -0
  349. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_metrics_persistence.py +0 -0
  350. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_observability_graceful.py +0 -0
  351. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_base.py +0 -0
  352. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_detectors.py +0 -0
  353. {foundry_mcp-0.7.4 → foundry_mcp-0.8.19}/tests/unit/test_providers_registry.py +0 -0
  354. {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