foundry-mcp 0.3.3__py3-none-any.whl → 0.7.0__py3-none-any.whl

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 (60) hide show
  1. foundry_mcp/__init__.py +7 -1
  2. foundry_mcp/cli/commands/plan.py +10 -3
  3. foundry_mcp/cli/commands/review.py +19 -4
  4. foundry_mcp/cli/commands/specs.py +38 -208
  5. foundry_mcp/cli/output.py +3 -3
  6. foundry_mcp/config.py +235 -5
  7. foundry_mcp/core/ai_consultation.py +146 -9
  8. foundry_mcp/core/discovery.py +6 -6
  9. foundry_mcp/core/error_store.py +2 -2
  10. foundry_mcp/core/intake.py +933 -0
  11. foundry_mcp/core/llm_config.py +20 -2
  12. foundry_mcp/core/metrics_store.py +2 -2
  13. foundry_mcp/core/progress.py +70 -0
  14. foundry_mcp/core/prompts/fidelity_review.py +149 -4
  15. foundry_mcp/core/prompts/markdown_plan_review.py +5 -1
  16. foundry_mcp/core/prompts/plan_review.py +5 -1
  17. foundry_mcp/core/providers/claude.py +6 -47
  18. foundry_mcp/core/providers/codex.py +6 -57
  19. foundry_mcp/core/providers/cursor_agent.py +3 -44
  20. foundry_mcp/core/providers/gemini.py +6 -57
  21. foundry_mcp/core/providers/opencode.py +35 -5
  22. foundry_mcp/core/research/__init__.py +68 -0
  23. foundry_mcp/core/research/memory.py +425 -0
  24. foundry_mcp/core/research/models.py +437 -0
  25. foundry_mcp/core/research/workflows/__init__.py +22 -0
  26. foundry_mcp/core/research/workflows/base.py +204 -0
  27. foundry_mcp/core/research/workflows/chat.py +271 -0
  28. foundry_mcp/core/research/workflows/consensus.py +396 -0
  29. foundry_mcp/core/research/workflows/ideate.py +682 -0
  30. foundry_mcp/core/research/workflows/thinkdeep.py +405 -0
  31. foundry_mcp/core/responses.py +450 -0
  32. foundry_mcp/core/spec.py +2438 -236
  33. foundry_mcp/core/task.py +1064 -19
  34. foundry_mcp/core/testing.py +512 -123
  35. foundry_mcp/core/validation.py +313 -42
  36. foundry_mcp/dashboard/components/charts.py +0 -57
  37. foundry_mcp/dashboard/launcher.py +11 -0
  38. foundry_mcp/dashboard/views/metrics.py +25 -35
  39. foundry_mcp/dashboard/views/overview.py +1 -65
  40. foundry_mcp/resources/specs.py +25 -25
  41. foundry_mcp/schemas/intake-schema.json +89 -0
  42. foundry_mcp/schemas/sdd-spec-schema.json +33 -5
  43. foundry_mcp/server.py +38 -0
  44. foundry_mcp/tools/unified/__init__.py +4 -2
  45. foundry_mcp/tools/unified/authoring.py +2423 -267
  46. foundry_mcp/tools/unified/documentation_helpers.py +69 -6
  47. foundry_mcp/tools/unified/environment.py +235 -6
  48. foundry_mcp/tools/unified/error.py +18 -1
  49. foundry_mcp/tools/unified/lifecycle.py +8 -0
  50. foundry_mcp/tools/unified/plan.py +113 -1
  51. foundry_mcp/tools/unified/research.py +658 -0
  52. foundry_mcp/tools/unified/review.py +370 -16
  53. foundry_mcp/tools/unified/spec.py +367 -0
  54. foundry_mcp/tools/unified/task.py +1163 -48
  55. foundry_mcp/tools/unified/test.py +69 -8
  56. {foundry_mcp-0.3.3.dist-info → foundry_mcp-0.7.0.dist-info}/METADATA +7 -1
  57. {foundry_mcp-0.3.3.dist-info → foundry_mcp-0.7.0.dist-info}/RECORD +60 -48
  58. {foundry_mcp-0.3.3.dist-info → foundry_mcp-0.7.0.dist-info}/WHEEL +0 -0
  59. {foundry_mcp-0.3.3.dist-info → foundry_mcp-0.7.0.dist-info}/entry_points.txt +0 -0
  60. {foundry_mcp-0.3.3.dist-info → foundry_mcp-0.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -23,7 +23,12 @@ from foundry_mcp.core.responses import (
23
23
  error_response,
24
24
  success_response,
25
25
  )
26
- from foundry_mcp.core.testing import TestRunner, get_presets
26
+ from foundry_mcp.core.testing import (
27
+ TestRunner,
28
+ get_presets,
29
+ get_runner,
30
+ get_available_runners,
31
+ )
27
32
  from foundry_mcp.tools.unified.router import (
28
33
  ActionDefinition,
29
34
  ActionRouter,
@@ -42,13 +47,31 @@ def _metric(action: str) -> str:
42
47
  return f"unified_tools.test.{action.replace('-', '_')}"
43
48
 
44
49
 
45
- def _get_runner(config: ServerConfig, workspace: Optional[str]) -> TestRunner:
50
+ def _get_test_runner(
51
+ config: ServerConfig,
52
+ workspace: Optional[str],
53
+ runner_name: Optional[str] = None,
54
+ ) -> TestRunner:
55
+ """Get a TestRunner with the appropriate backend.
56
+
57
+ Args:
58
+ config: Server configuration
59
+ workspace: Workspace path override
60
+ runner_name: Name of the test runner backend to use
61
+
62
+ Returns:
63
+ TestRunner configured with the appropriate backend
64
+ """
46
65
  ws: Optional[Path] = None
47
66
  if workspace:
48
67
  ws = Path(workspace)
49
68
  elif config.specs_dir is not None:
50
69
  ws = config.specs_dir.parent
51
- return TestRunner(workspace=ws)
70
+
71
+ # Get the runner backend from config or defaults
72
+ runner_backend = get_runner(runner_name, config.test)
73
+
74
+ return TestRunner(workspace=ws, runner=runner_backend)
52
75
 
53
76
 
54
77
  def _validation_error(
@@ -68,6 +91,24 @@ def _validation_error(
68
91
  def _handle_run(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
69
92
  request_id = _request_id()
70
93
 
94
+ # Validate runner parameter
95
+ runner_name = payload.get("runner")
96
+ if runner_name is not None and not isinstance(runner_name, str):
97
+ return _validation_error(
98
+ message="runner must be a string",
99
+ request_id=request_id,
100
+ remediation="Use runner=pytest|go|npm|jest|make or a custom runner name",
101
+ )
102
+
103
+ if isinstance(runner_name, str):
104
+ available_runners = get_available_runners(config.test)
105
+ if runner_name not in available_runners:
106
+ return _validation_error(
107
+ message=f"Unknown runner: {runner_name}",
108
+ request_id=request_id,
109
+ remediation=f"Use one of: {', '.join(sorted(available_runners))}",
110
+ )
111
+
71
112
  preset = payload.get("preset")
72
113
  if preset is not None and not isinstance(preset, str):
73
114
  return _validation_error(
@@ -90,7 +131,7 @@ def _handle_run(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
90
131
  return _validation_error(
91
132
  message="target must be a string",
92
133
  request_id=request_id,
93
- remediation="Provide a pytest target like tests/unit or tests/test_file.py",
134
+ remediation="Provide a test target like tests/unit or tests/test_file.py",
94
135
  )
95
136
 
96
137
  timeout = payload.get("timeout", 300)
@@ -155,7 +196,7 @@ def _handle_run(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
155
196
  include_passed_value if isinstance(include_passed_value, bool) else False
156
197
  )
157
198
 
158
- runner = _get_runner(config, workspace)
199
+ runner = _get_test_runner(config, workspace, runner_name)
159
200
 
160
201
  start = time.perf_counter()
161
202
  result = runner.run_tests(
@@ -223,6 +264,24 @@ def _handle_run(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
223
264
  def _handle_discover(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
224
265
  request_id = _request_id()
225
266
 
267
+ # Validate runner parameter
268
+ runner_name = payload.get("runner")
269
+ if runner_name is not None and not isinstance(runner_name, str):
270
+ return _validation_error(
271
+ message="runner must be a string",
272
+ request_id=request_id,
273
+ remediation="Use runner=pytest|go|npm|jest|make or a custom runner name",
274
+ )
275
+
276
+ if isinstance(runner_name, str):
277
+ available_runners = get_available_runners(config.test)
278
+ if runner_name not in available_runners:
279
+ return _validation_error(
280
+ message=f"Unknown runner: {runner_name}",
281
+ request_id=request_id,
282
+ remediation=f"Use one of: {', '.join(sorted(available_runners))}",
283
+ )
284
+
226
285
  target = payload.get("target")
227
286
  if target is not None and not isinstance(target, str):
228
287
  return _validation_error(
@@ -247,7 +306,7 @@ def _handle_discover(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
247
306
  remediation="Provide an absolute path to the workspace",
248
307
  )
249
308
 
250
- runner = _get_runner(config, workspace)
309
+ runner = _get_test_runner(config, workspace, runner_name)
251
310
 
252
311
  start = time.perf_counter()
253
312
  result = runner.discover_tests(target=target, pattern=pattern)
@@ -291,8 +350,8 @@ def _handle_discover(*, config: ServerConfig, payload: Dict[str, Any]) -> dict:
291
350
 
292
351
 
293
352
  _ACTION_SUMMARY = {
294
- "run": "Execute pytest using a preset or target.",
295
- "discover": "Discover pytest tests without executing.",
353
+ "run": "Execute tests using the specified runner (pytest, go, npm, jest, make).",
354
+ "discover": "Discover tests without executing using the specified runner.",
296
355
  }
297
356
 
298
357
 
@@ -341,6 +400,7 @@ def register_unified_test_tool(mcp: FastMCP, config: ServerConfig) -> None:
341
400
  action: str,
342
401
  target: Optional[str] = None,
343
402
  preset: Optional[str] = None,
403
+ runner: Optional[str] = None,
344
404
  timeout: int = 300,
345
405
  verbose: bool = True,
346
406
  fail_fast: bool = False,
@@ -352,6 +412,7 @@ def register_unified_test_tool(mcp: FastMCP, config: ServerConfig) -> None:
352
412
  payload: Dict[str, Any] = {
353
413
  "target": target,
354
414
  "preset": preset,
415
+ "runner": runner,
355
416
  "timeout": timeout,
356
417
  "verbose": verbose,
357
418
  "fail_fast": fail_fast,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: foundry-mcp
3
- Version: 0.3.3
3
+ Version: 0.7.0
4
4
  Summary: MCP server for SDD toolkit spec management
5
5
  Project-URL: Homepage, https://github.com/tylerburleigh/foundry-mcp
6
6
  Project-URL: Repository, https://github.com/tylerburleigh/foundry-mcp
@@ -125,6 +125,11 @@ specs/
125
125
  - `plan(action=create|list|review)` supports lightweight planning and review flows.
126
126
  - Notifications and sampling channels surface phase completions to MCP clients.
127
127
 
128
+ ### Batch metadata utilities
129
+
130
+ - `task(action=metadata-batch)` — Apply metadata updates (e.g., `file_path`, `estimated_hours`) to multiple nodes at once. Supports flexible AND-based filtering by `node_type`, `phase_id`, or `pattern` regex. Includes `dry_run` mode for previewing changes.
131
+ - `task(action=fix-verification-types)` — Auto-fix invalid or missing `verification_type` on verify nodes. Supports legacy mappings (`test` → `run-tests`, `auto` → `run-tests`) and defaults unknown types to `manual`. Includes `dry_run` mode for previewing fixes.
132
+
128
133
  ### Code, docs, and testing intelligence
129
134
 
130
135
  - Code navigation tools via `code(action=...)` support symbol lookup and call-graph tracing.
@@ -199,6 +204,7 @@ All MCP tools emit the standardized envelope defined in `docs/codebase_standards
199
204
  | `FOUNDRY_MCP_API_KEYS` | Comma-separated API keys required for tool access | Disabled |
200
205
  | `FOUNDRY_MCP_FEATURE_FLAGS` | Additional feature flags to enable (e.g., `planning_tools`) | Based on spec rollout |
201
206
  | `FOUNDRY_MCP_RESPONSE_CONTRACT` | Force response contract version (`v2`) | Auto-negotiated |
207
+ | `FOUNDRY_MODE` | Server mode: `full` (16 tools) or `minimal` (1 wake tool) | `full` |
202
208
  | `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | LLM provider credentials | Not set |
203
209
 
204
210
  ### TOML configuration
@@ -1,6 +1,6 @@
1
- foundry_mcp/__init__.py,sha256=-ioCy0T9SKP61LjLdabx3rEHBrDan3SjmrErulXsZz0,191
2
- foundry_mcp/config.py,sha256=neqA7-YyfS33Aap8SV2jFTbLuKVuqUoAp7flJfHFOY8,31237
3
- foundry_mcp/server.py,sha256=Efi7FtjuiFHqaU5L40yy-1hu7oQEdrpEutSc8Z-Aezo,5382
1
+ foundry_mcp/__init__.py,sha256=r2Q-D1qsSPgSgUM53YV2Se_yyIZRwYKluJJKCEjEAKQ,404
2
+ foundry_mcp/config.py,sha256=-7IZ2mzAfEIJnnf5bHZ4Sxd72lB1dmxQbBP0IJTKDeo,39560
3
+ foundry_mcp/server.py,sha256=UjP8ghtU3d91C0HteJ0jbwSzx9dtE7m41r4otiC-TLI,6983
4
4
  foundry_mcp/cli/__init__.py,sha256=tHj_9cQK1yBsqY0wxsn2eg5OHPyW6wN3oRJ-w-eBvuc,1887
5
5
  foundry_mcp/cli/__main__.py,sha256=wPwlid-SomQl5oGxtM319jjN4OSE-KWZtsdHctp4juU,167
6
6
  foundry_mcp/cli/agent.py,sha256=QPuoZkLeNwmvjqCb2a3CPXJx9YWNJmd8s4a9iRbENIM,2855
@@ -9,7 +9,7 @@ foundry_mcp/cli/context.py,sha256=PUBwWqzvxW-qOibu3yedPNeWJcbANEsalUjl45i6jwo,89
9
9
  foundry_mcp/cli/flags.py,sha256=_9W-xj1VhTtAT5cSp3Ch7zoAhhoC_HRcjztmHRq24lw,8137
10
10
  foundry_mcp/cli/logging.py,sha256=z-O-qQSIfndcIOiCkKr8TJ78Pldn0jNXWtjrCk8t1Ho,5974
11
11
  foundry_mcp/cli/main.py,sha256=0BPbEbbNzZtS1rDjTqQlLZw2cGL4jaOdHtSk5ov9NWU,1088
12
- foundry_mcp/cli/output.py,sha256=OOYfASmErEUajwbPajqnZzQ9elCnhUPQVNh1EE5tvio,3965
12
+ foundry_mcp/cli/output.py,sha256=ZH3cHMoNo39hEXlXO2hcdX21SZdg5ewXyV7YGjl1txs,3986
13
13
  foundry_mcp/cli/registry.py,sha256=25yV3o-q7VgnfqjDvqVQHyphe9BQF6y2y70zY52jWLM,2816
14
14
  foundry_mcp/cli/resilience.py,sha256=o4flW5JN9nOPq5RVYvRf88cEb4KbqgI3kg2rfkcxv6g,5248
15
15
  foundry_mcp/cli/transcript.py,sha256=DbusgsUCipi9l8YVHY20U5rbE13dM76PQbUokGocgV4,7227
@@ -20,116 +20,128 @@ foundry_mcp/cli/commands/dev.py,sha256=kBtZacvf-lXyGpmdNuZIZZrdZdtMEtxsQqP6HtUR5
20
20
  foundry_mcp/cli/commands/journal.py,sha256=T7SGvZrdnV0iN1TgHibqBoZSVSMWaye7FiFED3duYik,10936
21
21
  foundry_mcp/cli/commands/lifecycle.py,sha256=vtmNyw4QL1igwEeQMoyM0lD-blCvY-3qlYF6sZHc4Z8,8301
22
22
  foundry_mcp/cli/commands/modify.py,sha256=Loe5J-P093E9rFJJDZyRFnQB6ez6OkWlZ_eF1bVmiC0,21936
23
- foundry_mcp/cli/commands/plan.py,sha256=OgOaZkA8W9ZCU1PYWHSeAzw_UBEJBKOjzz6zLKG1dic,17609
23
+ foundry_mcp/cli/commands/plan.py,sha256=T5V2Kb0GUcypBpAHrVCzvfp9QrGyn3UAwQ3IeP3OZg4,18017
24
24
  foundry_mcp/cli/commands/pr.py,sha256=4PnLJrsB7op6RIP7Z1cDvrcSGMfknRRfBJrDd8aXBpw,11035
25
- foundry_mcp/cli/commands/review.py,sha256=TXQt8A9VVF6runZL2iPYQ_Ozx6X6ziaw00wnB50Ying,20604
25
+ foundry_mcp/cli/commands/review.py,sha256=2AblIo2NgXHEghlKLFGYeMRnj27mw_mTvjxRUpjHyBo,21174
26
26
  foundry_mcp/cli/commands/session.py,sha256=IIZIEGk8ME7Z2DB_DTJLt9GYGIhFe2E4olxuymyBiN0,15970
27
- foundry_mcp/cli/commands/specs.py,sha256=B6FhDkYrpe34BVu2fdJdS750hb_p8B1jYNmpD8__QOE,26352
27
+ foundry_mcp/cli/commands/specs.py,sha256=awVhJ1hUvDai4IibjEjDDUcB_FOmSTo-yLh7yROF6h8,20644
28
28
  foundry_mcp/cli/commands/tasks.py,sha256=TToK6pcwlAqF1zYQ2mKB36Esw9C3htAyvx6Qc8-nOQE,25246
29
29
  foundry_mcp/cli/commands/testing.py,sha256=5ZtZ2XJ79V9FmsnvgQ1Z47qGGKMVeFuCOf7GivntMkI,20317
30
30
  foundry_mcp/cli/commands/validate.py,sha256=Y_dJmx0WgdxYQkIa8y6H0HSHtQBhXYaqFMv62wEwuD8,30630
31
31
  foundry_mcp/core/__init__.py,sha256=LgBtknZIRhvDQT2c8D07TeymkSmDZonrCxWZUZOgeSM,3025
32
- foundry_mcp/core/ai_consultation.py,sha256=738PtRMM7_3eSHGdkTPq45wBL1mI_gJW9wU_QCCCbVQ,57174
32
+ foundry_mcp/core/ai_consultation.py,sha256=wAtIUuCHIGy84Bbv6WIC4nEg91x5VqjOH1w58y7zTeA,62861
33
33
  foundry_mcp/core/cache.py,sha256=7eM1-J_CXgQUid1JTTRS0aRxOZK9HgTRLEzX-k534po,5443
34
34
  foundry_mcp/core/capabilities.py,sha256=Zq6QJ7bvHL4GIOxjQNjmUGLFBeEjvVNj4XP2RLswebE,13144
35
35
  foundry_mcp/core/concurrency.py,sha256=qOlfYmlSDYU-deqnqa0r5ccGwey-MIM5QiDag_K6xzk,26571
36
36
  foundry_mcp/core/context.py,sha256=2M77uy-1KW-EzVxT2bdWPUFc6mWbANK1iYsCNFhMOls,16292
37
- foundry_mcp/core/discovery.py,sha256=GRMMZBo44he-4t3z7Kg0shUhkQMfCIvpW1KHpHfXrho,53856
37
+ foundry_mcp/core/discovery.py,sha256=hgfo_wpMjPxHLImo_-jl0Xdv_eQA2pY3KIWw5JH0AjQ,53897
38
38
  foundry_mcp/core/error_collection.py,sha256=MjpYU0OrTpQRIg8ND-EQzd-H-vM4LKtRHUNuveQFvp8,25069
39
- foundry_mcp/core/error_store.py,sha256=AthrqQSktYTdwlf7Vfji-2dpGGTbylLpLy7T35RlzpU,20739
39
+ foundry_mcp/core/error_store.py,sha256=P5irmUJIXh9BNyg_Mh7HYoKqtSjwHpj9vhUcwtqh4V8,20725
40
40
  foundry_mcp/core/feature_flags.py,sha256=Pv4E4vFBe1bfLHRG3xRqfWmyVRhrw0GLcoZnYKA_DBo,19599
41
41
  foundry_mcp/core/health.py,sha256=GcpLnHDSF5W_nf0k7-5icGeZmrKw-sUU_67ddMe8Kt4,25115
42
+ foundry_mcp/core/intake.py,sha256=qjmX5gk9Ae5HjSVLvwmQmPSloJFMsho1SsyUboNhkx8,32722
42
43
  foundry_mcp/core/journal.py,sha256=f1q52bjVOOLqMevd4hmdii2vCeLRT-sQhEwaUj0s9Bk,19124
43
44
  foundry_mcp/core/lifecycle.py,sha256=LALbkljjUrXtGe0No8eux9vAr-AIlDDltn9jz1HToHY,10959
44
- foundry_mcp/core/llm_config.py,sha256=OZOCUWMq06vjWM3WFjB11YKAw3tYlr0Ii99qdeHoD_w,47322
45
+ foundry_mcp/core/llm_config.py,sha256=xk9zGSLBZBoJZxbvwvpYuGonOQwmQnvxkGcVVGft3BQ,48194
45
46
  foundry_mcp/core/llm_patterns.py,sha256=1ZCuCkZ6ov2abk4Wt6T35a2Fg0Dp-0ALV5sdm5N9gXE,15336
46
47
  foundry_mcp/core/llm_provider.py,sha256=VG4lJn5gIF8QNbAV81ysyEPkbg3XehCdw5m2KDtae9c,52595
47
48
  foundry_mcp/core/logging_config.py,sha256=Dlo6lL5eollUXk9U43PviuvU9d6jW_AREEQK63vE2IE,10960
48
49
  foundry_mcp/core/metrics_persistence.py,sha256=rvcNsaGXC811feicjLu7nq7ayUX_aTD7tyHcDGPYO8w,18231
49
50
  foundry_mcp/core/metrics_registry.py,sha256=TpOkaFXpPMDagV537IbNPW4InZH1IaQT8v0pLZyBXJc,10438
50
- foundry_mcp/core/metrics_store.py,sha256=T26VDgHZPCC1UUPkwX59jNcYZ4rGMZu5YzsAwe1A_QY,22496
51
+ foundry_mcp/core/metrics_store.py,sha256=ctBgaedVkSmeyQlQmkrnJEg9jAAxw6sZNfCW2xt2a6o,22482
51
52
  foundry_mcp/core/modifications.py,sha256=g6nnXunEhqjXyr5HrV3dPoMMmMjML-3tYWKjlmxt1GY,6343
52
53
  foundry_mcp/core/naming.py,sha256=3ru58LJC68wcrfvxlsVwE9Sey7fo5OSWfOAd3u1NNFc,4094
53
54
  foundry_mcp/core/observability.py,sha256=Y7f9ws8Glml4ThoMynj4G0vkhZEAw2rHtglw9uap7Vo,41477
54
55
  foundry_mcp/core/otel.py,sha256=BVb4rgyo11GMUnJuGSji_0mjvTNyO8f5E1LNCoyVe08,13516
55
56
  foundry_mcp/core/otel_stubs.py,sha256=lVWL7qQHo7QRj9NvvyqNvvxzjGvLFiDEdJQDqpc5XcE,6834
56
57
  foundry_mcp/core/pagination.py,sha256=S_iTmZYmLda1to-__LLMM0sQI1xJMvAzjW0NAHLKx6A,7243
57
- foundry_mcp/core/progress.py,sha256=Rc3dvGnFIA1khFkg6wphv_r0HcwJaIlM7P868vOgM9M,9724
58
+ foundry_mcp/core/progress.py,sha256=ZFBVzxFY_YTQPKOM1zOA_ylQG-tJishht3h41xhWz2I,11978
58
59
  foundry_mcp/core/prometheus.py,sha256=4sE58NzWzK5FTp3qGJ27r9Sd_aOa0ogh2mSKtOrhu3Q,17814
59
60
  foundry_mcp/core/rate_limit.py,sha256=6Hrx60Az4z8lxXW0DeEx1hrGQPXRwbhhRVI1PA72BKQ,13395
60
61
  foundry_mcp/core/resilience.py,sha256=DrH6fbMYXjRmjKDukT8zLL49JEKsgza2LGsgBow4usQ,18831
61
- foundry_mcp/core/responses.py,sha256=bAZCbpsrte8PxNwXU9unI0kkuzuZG0LrmQCsnNUGUX0,31250
62
+ foundry_mcp/core/responses.py,sha256=67Ll_LaSbLbgqDiXjcG7Cvw2C0y1IXKOaV6oiNv0fwE,45750
62
63
  foundry_mcp/core/review.py,sha256=DkiNG1DWgmm5PCuZrGstYI6mcd7ub9sXQpPARbk-HWM,11183
63
64
  foundry_mcp/core/security.py,sha256=4ABOhWBzu7P9gMuC8gTXr3PrjEmEp_eSAgrFZG2sjyI,15444
64
- foundry_mcp/core/spec.py,sha256=uJjbziJ2enKmVb7zbhtu1GftBmhrAOG7rnjXXXNkOFY,50470
65
- foundry_mcp/core/task.py,sha256=e4AACpMBC0CeWTbmWkh5WtYy3WaRBq0i-gE_eAoVp98,41710
66
- foundry_mcp/core/testing.py,sha256=-B_XR9rIv0EYhEaDYIaJXL6Uf39c4bBJch8s1QBsMIg,12549
67
- foundry_mcp/core/validation.py,sha256=1lunXVQPFUvkNrNfrmUAA62p7aaoSSTGr_JsF_iuLSA,68870
65
+ foundry_mcp/core/spec.py,sha256=tySACz0HqN-Ju1wdF4DlDrwZVdbI3R9YFLmbODMkCo4,129357
66
+ foundry_mcp/core/task.py,sha256=IK1rdFO9gDFQLQdQTjbmAaMlaoEY7ze5emZOI0s-OdA,80685
67
+ foundry_mcp/core/testing.py,sha256=roee_ZddoB7xNxRk1pz89-4eOb6Sc2X6vKk0VLzd3Cg,24930
68
+ foundry_mcp/core/validation.py,sha256=OTI3WsiUE-NDk3znrGrhgVq_ukGpibEw6R4RDcnDmcM,80633
68
69
  foundry_mcp/core/prompts/__init__.py,sha256=0rx9sX-D_Zgfah-gPoUPYxW5GnhjxZmCVNzvurMOk8s,14316
69
- foundry_mcp/core/prompts/fidelity_review.py,sha256=Du0vAP9RUZlj8FJLR4vPSMJ79RTEIElaqiEES07Cpxk,16544
70
- foundry_mcp/core/prompts/markdown_plan_review.py,sha256=yIYxzepSULPVHvYn7Ez-KmRj0_thYmrEvNAI-Xuqqws,17880
71
- foundry_mcp/core/prompts/plan_review.py,sha256=BMEzJ9A-FwS75m-3zQi9PTl4SRC5cm_9FLLfaoiZ7E0,21616
70
+ foundry_mcp/core/prompts/fidelity_review.py,sha256=mmuWuDW5Ljj1IUYy3yGY7MjuOguLhytz5tYY9y0SqOI,22360
71
+ foundry_mcp/core/prompts/markdown_plan_review.py,sha256=WXH0N-QwC31Bo4i2lrCGWfIjviyi0ZkPS5kAuNOYsZ0,18256
72
+ foundry_mcp/core/prompts/plan_review.py,sha256=m4N5p_EQFrtvhYxt5PVtU9KcSr9sDBGboF-9ZvR40Cg,21992
72
73
  foundry_mcp/core/providers/__init__.py,sha256=wWP2_G6EMJuwl-enLoyVBXhl558gOI89lxlM7kLIPz0,5914
73
74
  foundry_mcp/core/providers/base.py,sha256=LG4e6sPqRlssniaLR4j0x8T-ftfbFMLYw_veKlnPCUE,16584
74
- foundry_mcp/core/providers/claude.py,sha256=_8Y-a5-olIp0BwmhMO7SFtm6f1k5ZOEtYL1KNtU0hqc,15024
75
- foundry_mcp/core/providers/codex.py,sha256=2UxDvk-_tGz0kPqNDelFP0WM6zpoDDNSg-QRLLWvEU4,20781
76
- foundry_mcp/core/providers/cursor_agent.py,sha256=W1pmS98PmdbWVeerZKlfRDLNoYMJhLjJkioAuQgpmYM,22492
75
+ foundry_mcp/core/providers/claude.py,sha256=1tyanVmQ1wqVheoe81qzl1ewmog1OJuWYp9EeFhswmU,13572
76
+ foundry_mcp/core/providers/codex.py,sha256=x8Kf_aKVmbIAR8nEQDgyTHxuVPzLyQ81Yl33rBQBVs8,19041
77
+ foundry_mcp/core/providers/cursor_agent.py,sha256=Rc_jax7xY2nejricOHJZBwzvEOkGrV5rcMRUj3KtPbU,21108
77
78
  foundry_mcp/core/providers/detectors.py,sha256=cFt-FMcOQpbMNsOLlTXqLFACnYyvF66GIPDA_CMSUeU,15398
78
- foundry_mcp/core/providers/gemini.py,sha256=4ZnPooPw84lTsvYGcUC85ac6KbK9yBDOgLEHFR6R74E,13521
79
- foundry_mcp/core/providers/opencode.py,sha256=VFDMGwN2SLZsfAqWkenrUNhkYWDUHNDETqW8HyTbOjw,22114
79
+ foundry_mcp/core/providers/gemini.py,sha256=Jd6KHORmgMYbIZCf08Hhv6onPFRw1eMb0LRJiDxVoYk,11804
80
+ foundry_mcp/core/providers/opencode.py,sha256=GCKoScwTicJJYDb_dq50clXGvi0c7kky4T-AktCZh2M,22976
80
81
  foundry_mcp/core/providers/opencode_wrapper.js,sha256=m7zHGmXwYGM8SQn29Wq3o8rVUa-gOLXq_haPwXHDI4w,7521
81
82
  foundry_mcp/core/providers/package-lock.json,sha256=NaVOX26YlJlKw6suq_Vg9MWES_B_pEIkRiVIxXcthss,646
82
83
  foundry_mcp/core/providers/package.json,sha256=qQ80lM53NDZYEt7sUYLAydzUAnNJBUE6a-NLyFLnxNo,511
83
84
  foundry_mcp/core/providers/registry.py,sha256=uAVJ0dvE_lTtTM6lE_RV9QCvGjP33gYxxXYCy_68Y8c,19147
84
85
  foundry_mcp/core/providers/test_provider.py,sha256=7RlAkc8H-2uBd25tmKs_Cu7Fl6EUpBB5eXKTx7G1Esk,5213
85
86
  foundry_mcp/core/providers/validation.py,sha256=ik82u5Uiclnb2AWVe337M2kIKq-lhPwuhtOtq5-Vf6o,21767
87
+ foundry_mcp/core/research/__init__.py,sha256=fEBsDm4Oz5qVgEN3etuEEx27jnDV3PkxndTlhOQwcCY,1478
88
+ foundry_mcp/core/research/memory.py,sha256=AogMwndqc2MFofTvbZ9FYBKavs7ewWwEZ7hopKHNflI,13808
89
+ foundry_mcp/core/research/models.py,sha256=t1gUSmH4pXwUql73tULCe_6d1QLh54ohBJ4j8x78HIQ,17232
90
+ foundry_mcp/core/research/workflows/__init__.py,sha256=zmbDubDVaseFF57KxB7SAwSHx9X98og_3eDpWIcN_Oc,877
91
+ foundry_mcp/core/research/workflows/base.py,sha256=ETyY3qNls_Ya622iehkQffno5TIfxocvZhm9gWJkuVw,6546
92
+ foundry_mcp/core/research/workflows/chat.py,sha256=mrMRh2dyYWjxwc2yFNJL-hrqnb4na0yZuovSPz1c_7o,8313
93
+ foundry_mcp/core/research/workflows/consensus.py,sha256=DyTfMcGpvT_4lpl7oM7CuQKQPGTPpQA7n-Yy27CmYKc,13891
94
+ foundry_mcp/core/research/workflows/ideate.py,sha256=SiV9RTIX4hsjmMDNSNRvD77OVYfbV_LGx-8SLmLyggc,22271
95
+ foundry_mcp/core/research/workflows/thinkdeep.py,sha256=5yWhDstcoxPSkxdyblPniXoB6GRqdFNOY-cjtAL-XaQ,14029
86
96
  foundry_mcp/dashboard/__init__.py,sha256=3XUgs6JJbcrx37ABvZPosgNzd5oFqdDm7raNDqWkmFs,811
87
97
  foundry_mcp/dashboard/app.py,sha256=Ktv0o6nBjtkXF08g2Oq15daR_hgV22vs1DlUZ55kJGI,3004
88
- foundry_mcp/dashboard/launcher.py,sha256=U58onATJyWsSPvOJYHfWPfBAyISVLHb9cO7lL3dPliQ,7742
98
+ foundry_mcp/dashboard/launcher.py,sha256=budmYi7UkJc_bCITfKOCTL9kOO6MdkV87NreNaJTJ8o,8357
89
99
  foundry_mcp/dashboard/components/__init__.py,sha256=etYzKPHwfZdYvm9u7s2CPR0VPnBmWHl8FyJ2YoE7mEI,352
90
100
  foundry_mcp/dashboard/components/cards.py,sha256=QQTa4dlLyHwAUVe6zBwPoATmyIMXq24kTVRC0Uyvqno,2414
91
- foundry_mcp/dashboard/components/charts.py,sha256=hWBr5DHrjZLUqzRwlNXcZg5XndM-LafzgakZazVe9n0,5432
101
+ foundry_mcp/dashboard/components/charts.py,sha256=5iy7916wy9_jD2adePUB1KObUbcyRdMl-ZOwxxtsWsk,3978
92
102
  foundry_mcp/dashboard/components/filters.py,sha256=uN7rFrBvZk6oacPcOiexET02BExNM5olWepjCXDrTf8,3061
93
103
  foundry_mcp/dashboard/components/tables.py,sha256=WVq_BMbWBGyaIxuvy3qUrH6tBWsJABC5wfulojJNEK0,4873
94
104
  foundry_mcp/dashboard/data/__init__.py,sha256=CFz07CIZhmD12kx77Mr2LG0J--b9DTvyu3uaHDJusvI,261
95
105
  foundry_mcp/dashboard/data/stores.py,sha256=-2193Vdz1q4Ls2qmP1aQZ7cF1DWRxeCItq4LxJi6UnA,12391
96
106
  foundry_mcp/dashboard/views/__init__.py,sha256=12fUzf3TkGMs0dJHfA6Y856qJEO7lOS_hs6msP3xYRs,208
97
107
  foundry_mcp/dashboard/views/errors.py,sha256=suDaoQQsnyr2sYOWhN2nNNWIuIBZPkVIHGMlVvYsgr8,7305
98
- foundry_mcp/dashboard/views/metrics.py,sha256=t5M_QckgMPnBonPM2ynduTbG8WZ-Sa7oLrS5jf9uBjU,6186
99
- foundry_mcp/dashboard/views/overview.py,sha256=mBJelbRMVBiy2EdVPf1KcjFqQye9TH0SW-ZF-bpr7sI,5821
108
+ foundry_mcp/dashboard/views/metrics.py,sha256=88Blo0iObfV_2mvhJV1RuqW7K278mn6vVoejonkTiuY,5725
109
+ foundry_mcp/dashboard/views/overview.py,sha256=BqtUVRC44PNXTd_Vu_PxVPZc3kThbytxANNGs3cmOhI,3369
100
110
  foundry_mcp/dashboard/views/providers.py,sha256=sFCh-F8xIhLRQQzgjd_dwZz_S6AgolWSmP3iqczxxYE,2819
101
111
  foundry_mcp/dashboard/views/sdd_workflow.py,sha256=lKvh8Ru6WBg5nE8vCcNZibemtRvhMoB3P5boK5Sd68M,8281
102
112
  foundry_mcp/dashboard/views/tool_usage.py,sha256=-SD9VwhDJ1SRpHkYXDPINenSaLrQAiXRFEvRrp3-HbA,4760
103
113
  foundry_mcp/prompts/__init__.py,sha256=AeAFELo1TTBdw4MVg4VoeDWsGGvzFTmdRtHHOBxwVzA,200
104
114
  foundry_mcp/prompts/workflows.py,sha256=1bg43V6lEGeGuGX37G49UYGtDjZ6SZqsXguKb_zZQss,18369
105
115
  foundry_mcp/resources/__init__.py,sha256=rnxmkQKsDcL-p-NyVlZtEh9Ie2BQn0nzQ_16NuCLBPY,201
106
- foundry_mcp/resources/specs.py,sha256=dkJcfry5F6X18J6uz6DAd5PzW573XLz4cB-v9QD_SxU,19271
116
+ foundry_mcp/resources/specs.py,sha256=HcXxZFJt8eDFTQpshwxC9PLdtYPbOttVGFbT8mLRO5A,19828
107
117
  foundry_mcp/schemas/__init__.py,sha256=iKHwedYPusMeg-Ozdeq-gHDT5nhmqEPP-a9jXi8VyOM,1140
108
- foundry_mcp/schemas/sdd-spec-schema.json,sha256=9dhaS7mpkhGIRutQpjHqiKqsZDRh9j5HsKTWIDlVMro,11484
118
+ foundry_mcp/schemas/intake-schema.json,sha256=YisuGVRpMhg66lm-_vSs8SMVwjbsyWfXPSv0u4dI5UI,2691
119
+ foundry_mcp/schemas/sdd-spec-schema.json,sha256=VAmeihOuDHldgk-evwjZLPmoRt4o4mVZ1vCZkhWuh74,12480
109
120
  foundry_mcp/tools/__init__.py,sha256=yNmGFFGNp-OMA758oAMxB4z7cvXb_6KPxm-ZyHbi-9I,199
110
- foundry_mcp/tools/unified/__init__.py,sha256=ilXrrgJNs3lK-DMXQvpcVtGN2_KFeG9v2b_0kSxcXJM,2609
111
- foundry_mcp/tools/unified/authoring.py,sha256=zgGw5yOqOqLVBZoQIPLyp9YU4QMMKSVVBe03slllg6c,49423
121
+ foundry_mcp/tools/unified/__init__.py,sha256=UrO3_jStMwck1_SRy3yXX8mPjUc4Kr7f25xGDZS_I6M,2745
122
+ foundry_mcp/tools/unified/authoring.py,sha256=_oLgy68r-7Ppj0V9oA4z6Ri9Lz6s-LhvLgd0xEHzTVM,127790
112
123
  foundry_mcp/tools/unified/context_helpers.py,sha256=JcaEdn1nVgaZ4GfTktRdZ7oD4pHkU9TH6O8WfWJ9lr0,3056
113
- foundry_mcp/tools/unified/documentation_helpers.py,sha256=NhYxFx3RF7ZJy4A_NcOTdhV3-mUZy1ecaClHFZRXhiM,7615
114
- foundry_mcp/tools/unified/environment.py,sha256=rTmS6nK0GLGlKBIj2yyUEqGWdXld3zryYMOw6KBeL_w,31437
115
- foundry_mcp/tools/unified/error.py,sha256=OIqgcMvhaV_MUyoI3ghtShVU_2io4g3wLXDI3YycITY,14048
124
+ foundry_mcp/tools/unified/documentation_helpers.py,sha256=7kAt17bQiZ_WJ8BG2qDqZzdVGjBnIILlG5rzvJ4bfH4,10005
125
+ foundry_mcp/tools/unified/environment.py,sha256=DnjxuTSHtiHYjU3L_nzAt7-0YkaTnZFsj6fp7zWiHpo,39403
126
+ foundry_mcp/tools/unified/error.py,sha256=qzkI6GoFs4bfN79-x0fMpS1ogAn3lkdgzGGymUWEmE8,14452
116
127
  foundry_mcp/tools/unified/health.py,sha256=8oo61HeTfuyxTYyuKQPLMHvvYh54ju33invxIGFi5s4,6833
117
128
  foundry_mcp/tools/unified/journal.py,sha256=mbVivCiJymd6QFq2u1stVkqhLMM7odrpSyU6X9nRnak,23262
118
- foundry_mcp/tools/unified/lifecycle.py,sha256=RDKuVCGhboDgwRV2JpNeb_5rHU344cfxxzWE3DWJ9b0,19792
129
+ foundry_mcp/tools/unified/lifecycle.py,sha256=RKESL2wEaEHagDl61eRX0y0AivUoaPn8ibcdHunohmw,20436
119
130
  foundry_mcp/tools/unified/metrics.py,sha256=Q1vIXLpQnTfHnpFxXKWwqQpNDc2_iuGIr48Bg7EM47c,22600
120
- foundry_mcp/tools/unified/plan.py,sha256=W6Remrmb4IJPmCOFQMcxnqBOMp9m9NSgbbIP822aDTc,23562
131
+ foundry_mcp/tools/unified/plan.py,sha256=Ph8XjDDZz0dXHcB0-oTnWud-Oa_SSBpjk56NX0Z7On4,29320
121
132
  foundry_mcp/tools/unified/pr.py,sha256=L_Gk9oVP-8PgmbdULFr_BwXBPaLRib_55H8MyHuZ_34,9786
122
133
  foundry_mcp/tools/unified/provider.py,sha256=6v4eihUts59eoBVkxA7ZuM12v360jD0LbLvq2e8Jl_A,21770
123
- foundry_mcp/tools/unified/review.py,sha256=eUOqaB0KKqzL6uU7R20g_D70qfPgOFVB2oDqHwNeWhg,23791
134
+ foundry_mcp/tools/unified/research.py,sha256=OMdV7zpJb2Xr95z3ZX59vYzO-deXmsnZqwQg1bcek7o,21537
135
+ foundry_mcp/tools/unified/review.py,sha256=ym0WsErBgXLJH69q0rYIDJGiKL-E2jo1pf5ieK83W-s,37464
124
136
  foundry_mcp/tools/unified/review_helpers.py,sha256=k1_zJXMOGSgp7AP6_swEQdDLwcduOb_iy0D7wUX4YVk,9463
125
137
  foundry_mcp/tools/unified/router.py,sha256=sWqAaey9yhiAoxyrnL8lr2reMWyPgmyIPlwrNgZZmRI,3489
126
138
  foundry_mcp/tools/unified/server.py,sha256=2QiID5O4cHVSWkakcDH1qwhJM7IHjJ5LdenffbzXmEY,19812
127
- foundry_mcp/tools/unified/spec.py,sha256=imTDpZ3UcAeDPI2diuBvt_bDJX5PUvDD5WZVWbIzH_c,26363
128
- foundry_mcp/tools/unified/task.py,sha256=iKO57JTGLF0XUsLa_BSGNVAbwMq9fE_GWgwjRlNPVgw,75725
129
- foundry_mcp/tools/unified/test.py,sha256=k2_Ko_Ek9qFgtrE8e-HMJk8nsN4rN83dWcgiks2TkOY,11736
139
+ foundry_mcp/tools/unified/spec.py,sha256=R2Fp8RjgqRUkCYMFafuIiuLpykvtqZ1IVZscFThnYaA,38792
140
+ foundry_mcp/tools/unified/task.py,sha256=LcLf3T5q7dfCAxxpbJCiYS-Wm-1mpVCy_ufaz4SU8H8,115966
141
+ foundry_mcp/tools/unified/test.py,sha256=7H2UObajxz0vHZ_1HUne4E7hlkVGnigT70SnDlkPlfk,13894
130
142
  foundry_mcp/tools/unified/verification.py,sha256=Kq3BJ7-Rnp2R35dHoFSTdwHPjEf60nce8vWMIKOA32s,16945
131
- foundry_mcp-0.3.3.dist-info/METADATA,sha256=UNKnJ7t2qSVxgrMIEClUteFtv4aDR2A7cmOC0b_hxC0,13221
132
- foundry_mcp-0.3.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
133
- foundry_mcp-0.3.3.dist-info/entry_points.txt,sha256=EBy4TVvlciNngt9ErVIyNjTImjczKa2FkoZRtIEw6aU,95
134
- foundry_mcp-0.3.3.dist-info/licenses/LICENSE,sha256=8dabQwxo8HuixKsQaXcVaIHLLQWvPPLuKQFZLAIXL4w,1071
135
- foundry_mcp-0.3.3.dist-info/RECORD,,
143
+ foundry_mcp-0.7.0.dist-info/METADATA,sha256=_oRr_aCZSSJAtUldtjvOajhVBaisfUV2UJapfNO-1rM,13868
144
+ foundry_mcp-0.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
145
+ foundry_mcp-0.7.0.dist-info/entry_points.txt,sha256=EBy4TVvlciNngt9ErVIyNjTImjczKa2FkoZRtIEw6aU,95
146
+ foundry_mcp-0.7.0.dist-info/licenses/LICENSE,sha256=8dabQwxo8HuixKsQaXcVaIHLLQWvPPLuKQFZLAIXL4w,1071
147
+ foundry_mcp-0.7.0.dist-info/RECORD,,