foundry-mcp 0.7.0__py3-none-any.whl → 0.8.10__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 (54) hide show
  1. foundry_mcp/cli/__init__.py +0 -13
  2. foundry_mcp/cli/commands/session.py +1 -8
  3. foundry_mcp/cli/context.py +39 -0
  4. foundry_mcp/config.py +381 -7
  5. foundry_mcp/core/batch_operations.py +1196 -0
  6. foundry_mcp/core/discovery.py +1 -1
  7. foundry_mcp/core/llm_config.py +8 -0
  8. foundry_mcp/core/naming.py +25 -2
  9. foundry_mcp/core/prometheus.py +0 -13
  10. foundry_mcp/core/providers/__init__.py +12 -0
  11. foundry_mcp/core/providers/base.py +39 -0
  12. foundry_mcp/core/providers/claude.py +45 -1
  13. foundry_mcp/core/providers/codex.py +64 -3
  14. foundry_mcp/core/providers/cursor_agent.py +22 -3
  15. foundry_mcp/core/providers/detectors.py +34 -7
  16. foundry_mcp/core/providers/gemini.py +63 -1
  17. foundry_mcp/core/providers/opencode.py +95 -71
  18. foundry_mcp/core/providers/package-lock.json +4 -4
  19. foundry_mcp/core/providers/package.json +1 -1
  20. foundry_mcp/core/providers/validation.py +128 -0
  21. foundry_mcp/core/research/memory.py +103 -0
  22. foundry_mcp/core/research/models.py +783 -0
  23. foundry_mcp/core/research/providers/__init__.py +40 -0
  24. foundry_mcp/core/research/providers/base.py +242 -0
  25. foundry_mcp/core/research/providers/google.py +507 -0
  26. foundry_mcp/core/research/providers/perplexity.py +442 -0
  27. foundry_mcp/core/research/providers/semantic_scholar.py +544 -0
  28. foundry_mcp/core/research/providers/tavily.py +383 -0
  29. foundry_mcp/core/research/workflows/__init__.py +5 -2
  30. foundry_mcp/core/research/workflows/base.py +106 -12
  31. foundry_mcp/core/research/workflows/consensus.py +160 -17
  32. foundry_mcp/core/research/workflows/deep_research.py +4020 -0
  33. foundry_mcp/core/responses.py +240 -0
  34. foundry_mcp/core/spec.py +1 -0
  35. foundry_mcp/core/task.py +141 -12
  36. foundry_mcp/core/validation.py +6 -1
  37. foundry_mcp/server.py +0 -52
  38. foundry_mcp/tools/unified/__init__.py +37 -18
  39. foundry_mcp/tools/unified/authoring.py +0 -33
  40. foundry_mcp/tools/unified/environment.py +202 -29
  41. foundry_mcp/tools/unified/plan.py +20 -1
  42. foundry_mcp/tools/unified/provider.py +0 -40
  43. foundry_mcp/tools/unified/research.py +644 -19
  44. foundry_mcp/tools/unified/review.py +5 -2
  45. foundry_mcp/tools/unified/review_helpers.py +16 -1
  46. foundry_mcp/tools/unified/server.py +9 -24
  47. foundry_mcp/tools/unified/task.py +528 -9
  48. {foundry_mcp-0.7.0.dist-info → foundry_mcp-0.8.10.dist-info}/METADATA +2 -1
  49. {foundry_mcp-0.7.0.dist-info → foundry_mcp-0.8.10.dist-info}/RECORD +52 -46
  50. foundry_mcp/cli/flags.py +0 -266
  51. foundry_mcp/core/feature_flags.py +0 -592
  52. {foundry_mcp-0.7.0.dist-info → foundry_mcp-0.8.10.dist-info}/WHEEL +0 -0
  53. {foundry_mcp-0.7.0.dist-info → foundry_mcp-0.8.10.dist-info}/entry_points.txt +0 -0
  54. {foundry_mcp-0.7.0.dist-info → foundry_mcp-0.8.10.dist-info}/licenses/LICENSE +0 -0
@@ -1,12 +1,11 @@
1
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
- foundry_mcp/cli/__init__.py,sha256=tHj_9cQK1yBsqY0wxsn2eg5OHPyW6wN3oRJ-w-eBvuc,1887
2
+ foundry_mcp/config.py,sha256=G7SsxFN-hkqR2QdL5fLp0tONYfyJd7JI5nWUQL-YXTA,57002
3
+ foundry_mcp/server.py,sha256=9GjG4xkk2yD_nNcynCC8RV0EX7xljRWeoWQ-mC0COaw,4897
4
+ foundry_mcp/cli/__init__.py,sha256=K7cSTO88RGrsSwQkpZvhi88ZuazN8X_ldPDEhnAGyqU,1583
5
5
  foundry_mcp/cli/__main__.py,sha256=wPwlid-SomQl5oGxtM319jjN4OSE-KWZtsdHctp4juU,167
6
6
  foundry_mcp/cli/agent.py,sha256=QPuoZkLeNwmvjqCb2a3CPXJx9YWNJmd8s4a9iRbENIM,2855
7
7
  foundry_mcp/cli/config.py,sha256=9jdpVw_LfTOOLR9LO3wzm82ziwKq7tv1JMBrj40iWsE,2980
8
- foundry_mcp/cli/context.py,sha256=PUBwWqzvxW-qOibu3yedPNeWJcbANEsalUjl45i6jwo,8998
9
- foundry_mcp/cli/flags.py,sha256=_9W-xj1VhTtAT5cSp3Ch7zoAhhoC_HRcjztmHRq24lw,8137
8
+ foundry_mcp/cli/context.py,sha256=RKlYfcDsjS3Z-rvQxQl3DT8FjDQliDi928SCTJR28MI,10480
10
9
  foundry_mcp/cli/logging.py,sha256=z-O-qQSIfndcIOiCkKr8TJ78Pldn0jNXWtjrCk8t1Ho,5974
11
10
  foundry_mcp/cli/main.py,sha256=0BPbEbbNzZtS1rDjTqQlLZw2cGL4jaOdHtSk5ov9NWU,1088
12
11
  foundry_mcp/cli/output.py,sha256=ZH3cHMoNo39hEXlXO2hcdX21SZdg5ewXyV7YGjl1txs,3986
@@ -23,26 +22,26 @@ foundry_mcp/cli/commands/modify.py,sha256=Loe5J-P093E9rFJJDZyRFnQB6ez6OkWlZ_eF1b
23
22
  foundry_mcp/cli/commands/plan.py,sha256=T5V2Kb0GUcypBpAHrVCzvfp9QrGyn3UAwQ3IeP3OZg4,18017
24
23
  foundry_mcp/cli/commands/pr.py,sha256=4PnLJrsB7op6RIP7Z1cDvrcSGMfknRRfBJrDd8aXBpw,11035
25
24
  foundry_mcp/cli/commands/review.py,sha256=2AblIo2NgXHEghlKLFGYeMRnj27mw_mTvjxRUpjHyBo,21174
26
- foundry_mcp/cli/commands/session.py,sha256=IIZIEGk8ME7Z2DB_DTJLt9GYGIhFe2E4olxuymyBiN0,15970
25
+ foundry_mcp/cli/commands/session.py,sha256=ZBWNHblgqkQHKkx4hkFZIQ5K1Wh7LnB8vw0nMdXtenw,15700
27
26
  foundry_mcp/cli/commands/specs.py,sha256=awVhJ1hUvDai4IibjEjDDUcB_FOmSTo-yLh7yROF6h8,20644
28
27
  foundry_mcp/cli/commands/tasks.py,sha256=TToK6pcwlAqF1zYQ2mKB36Esw9C3htAyvx6Qc8-nOQE,25246
29
28
  foundry_mcp/cli/commands/testing.py,sha256=5ZtZ2XJ79V9FmsnvgQ1Z47qGGKMVeFuCOf7GivntMkI,20317
30
29
  foundry_mcp/cli/commands/validate.py,sha256=Y_dJmx0WgdxYQkIa8y6H0HSHtQBhXYaqFMv62wEwuD8,30630
31
30
  foundry_mcp/core/__init__.py,sha256=LgBtknZIRhvDQT2c8D07TeymkSmDZonrCxWZUZOgeSM,3025
32
31
  foundry_mcp/core/ai_consultation.py,sha256=wAtIUuCHIGy84Bbv6WIC4nEg91x5VqjOH1w58y7zTeA,62861
32
+ foundry_mcp/core/batch_operations.py,sha256=8kNDN-Xw9lXzcV4a1K3oGK45SV-4bAW16S97xb5Cduc,38179
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=hgfo_wpMjPxHLImo_-jl0Xdv_eQA2pY3KIWw5JH0AjQ,53897
37
+ foundry_mcp/core/discovery.py,sha256=d-pouSFhYQToQnH6s6Yw5cPDHKp2UpRzMkkNhlmHaKs,53898
38
38
  foundry_mcp/core/error_collection.py,sha256=MjpYU0OrTpQRIg8ND-EQzd-H-vM4LKtRHUNuveQFvp8,25069
39
39
  foundry_mcp/core/error_store.py,sha256=P5irmUJIXh9BNyg_Mh7HYoKqtSjwHpj9vhUcwtqh4V8,20725
40
- foundry_mcp/core/feature_flags.py,sha256=Pv4E4vFBe1bfLHRG3xRqfWmyVRhrw0GLcoZnYKA_DBo,19599
41
40
  foundry_mcp/core/health.py,sha256=GcpLnHDSF5W_nf0k7-5icGeZmrKw-sUU_67ddMe8Kt4,25115
42
41
  foundry_mcp/core/intake.py,sha256=qjmX5gk9Ae5HjSVLvwmQmPSloJFMsho1SsyUboNhkx8,32722
43
42
  foundry_mcp/core/journal.py,sha256=f1q52bjVOOLqMevd4hmdii2vCeLRT-sQhEwaUj0s9Bk,19124
44
43
  foundry_mcp/core/lifecycle.py,sha256=LALbkljjUrXtGe0No8eux9vAr-AIlDDltn9jz1HToHY,10959
45
- foundry_mcp/core/llm_config.py,sha256=xk9zGSLBZBoJZxbvwvpYuGonOQwmQnvxkGcVVGft3BQ,48194
44
+ foundry_mcp/core/llm_config.py,sha256=9wzUiT7-oAXE-T__VNwX812jUtS6avqczgdBELjCgis,48489
46
45
  foundry_mcp/core/llm_patterns.py,sha256=1ZCuCkZ6ov2abk4Wt6T35a2Fg0Dp-0ALV5sdm5N9gXE,15336
47
46
  foundry_mcp/core/llm_provider.py,sha256=VG4lJn5gIF8QNbAV81ysyEPkbg3XehCdw5m2KDtae9c,52595
48
47
  foundry_mcp/core/logging_config.py,sha256=Dlo6lL5eollUXk9U43PviuvU9d6jW_AREEQK63vE2IE,10960
@@ -50,47 +49,54 @@ foundry_mcp/core/metrics_persistence.py,sha256=rvcNsaGXC811feicjLu7nq7ayUX_aTD7t
50
49
  foundry_mcp/core/metrics_registry.py,sha256=TpOkaFXpPMDagV537IbNPW4InZH1IaQT8v0pLZyBXJc,10438
51
50
  foundry_mcp/core/metrics_store.py,sha256=ctBgaedVkSmeyQlQmkrnJEg9jAAxw6sZNfCW2xt2a6o,22482
52
51
  foundry_mcp/core/modifications.py,sha256=g6nnXunEhqjXyr5HrV3dPoMMmMjML-3tYWKjlmxt1GY,6343
53
- foundry_mcp/core/naming.py,sha256=3ru58LJC68wcrfvxlsVwE9Sey7fo5OSWfOAd3u1NNFc,4094
52
+ foundry_mcp/core/naming.py,sha256=lzIx_6ZScAHD2RO_N_FOzLDoKS7J2Drxh6irCE083IY,4779
54
53
  foundry_mcp/core/observability.py,sha256=Y7f9ws8Glml4ThoMynj4G0vkhZEAw2rHtglw9uap7Vo,41477
55
54
  foundry_mcp/core/otel.py,sha256=BVb4rgyo11GMUnJuGSji_0mjvTNyO8f5E1LNCoyVe08,13516
56
55
  foundry_mcp/core/otel_stubs.py,sha256=lVWL7qQHo7QRj9NvvyqNvvxzjGvLFiDEdJQDqpc5XcE,6834
57
56
  foundry_mcp/core/pagination.py,sha256=S_iTmZYmLda1to-__LLMM0sQI1xJMvAzjW0NAHLKx6A,7243
58
57
  foundry_mcp/core/progress.py,sha256=ZFBVzxFY_YTQPKOM1zOA_ylQG-tJishht3h41xhWz2I,11978
59
- foundry_mcp/core/prometheus.py,sha256=4sE58NzWzK5FTp3qGJ27r9Sd_aOa0ogh2mSKtOrhu3Q,17814
58
+ foundry_mcp/core/prometheus.py,sha256=d2pYrRlY201RCzMPG_70wrJ0PzCdVzBbJqFAJ7_IiOw,17313
60
59
  foundry_mcp/core/rate_limit.py,sha256=6Hrx60Az4z8lxXW0DeEx1hrGQPXRwbhhRVI1PA72BKQ,13395
61
60
  foundry_mcp/core/resilience.py,sha256=DrH6fbMYXjRmjKDukT8zLL49JEKsgza2LGsgBow4usQ,18831
62
- foundry_mcp/core/responses.py,sha256=67Ll_LaSbLbgqDiXjcG7Cvw2C0y1IXKOaV6oiNv0fwE,45750
61
+ foundry_mcp/core/responses.py,sha256=q9OTtuWzL5ueKT3iEGKa6HTMTYDLM-PsXA_G6jbmyHI,55048
63
62
  foundry_mcp/core/review.py,sha256=DkiNG1DWgmm5PCuZrGstYI6mcd7ub9sXQpPARbk-HWM,11183
64
63
  foundry_mcp/core/security.py,sha256=4ABOhWBzu7P9gMuC8gTXr3PrjEmEp_eSAgrFZG2sjyI,15444
65
- foundry_mcp/core/spec.py,sha256=tySACz0HqN-Ju1wdF4DlDrwZVdbI3R9YFLmbODMkCo4,129357
66
- foundry_mcp/core/task.py,sha256=IK1rdFO9gDFQLQdQTjbmAaMlaoEY7ze5emZOI0s-OdA,80685
64
+ foundry_mcp/core/spec.py,sha256=KsEJE9iftWozXIxkcIYZaKKrj1LkEh7S-7bz0N4HE5s,129379
65
+ foundry_mcp/core/task.py,sha256=CCt_qJD-60Z_r5FmZfUlLVGpdQrpUT6WpVe_PohXsRg,85886
67
66
  foundry_mcp/core/testing.py,sha256=roee_ZddoB7xNxRk1pz89-4eOb6Sc2X6vKk0VLzd3Cg,24930
68
- foundry_mcp/core/validation.py,sha256=OTI3WsiUE-NDk3znrGrhgVq_ukGpibEw6R4RDcnDmcM,80633
67
+ foundry_mcp/core/validation.py,sha256=Ra5SYGk5iULxBMDqXRQRYFQgrwRfCAv1Y4yqlASbl4Y,80887
69
68
  foundry_mcp/core/prompts/__init__.py,sha256=0rx9sX-D_Zgfah-gPoUPYxW5GnhjxZmCVNzvurMOk8s,14316
70
69
  foundry_mcp/core/prompts/fidelity_review.py,sha256=mmuWuDW5Ljj1IUYy3yGY7MjuOguLhytz5tYY9y0SqOI,22360
71
70
  foundry_mcp/core/prompts/markdown_plan_review.py,sha256=WXH0N-QwC31Bo4i2lrCGWfIjviyi0ZkPS5kAuNOYsZ0,18256
72
71
  foundry_mcp/core/prompts/plan_review.py,sha256=m4N5p_EQFrtvhYxt5PVtU9KcSr9sDBGboF-9ZvR40Cg,21992
73
- foundry_mcp/core/providers/__init__.py,sha256=wWP2_G6EMJuwl-enLoyVBXhl558gOI89lxlM7kLIPz0,5914
74
- foundry_mcp/core/providers/base.py,sha256=LG4e6sPqRlssniaLR4j0x8T-ftfbFMLYw_veKlnPCUE,16584
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
78
- foundry_mcp/core/providers/detectors.py,sha256=cFt-FMcOQpbMNsOLlTXqLFACnYyvF66GIPDA_CMSUeU,15398
79
- foundry_mcp/core/providers/gemini.py,sha256=Jd6KHORmgMYbIZCf08Hhv6onPFRw1eMb0LRJiDxVoYk,11804
80
- foundry_mcp/core/providers/opencode.py,sha256=GCKoScwTicJJYDb_dq50clXGvi0c7kky4T-AktCZh2M,22976
72
+ foundry_mcp/core/providers/__init__.py,sha256=E9PuavQrH9LyjP33PWwIlBo2uYjjbOebqpvm0N42E7o,6286
73
+ foundry_mcp/core/providers/base.py,sha256=9tNNY4R-mFmiLEocqrDk5Lgt9iSVAd9BZWac0qJ7tXY,17953
74
+ foundry_mcp/core/providers/claude.py,sha256=8lEQ-HXCshMuvsezcHClL3eTSGpMnCW_MFGLkDXpYdM,15108
75
+ foundry_mcp/core/providers/codex.py,sha256=uKzazf1Xt55Yt4zldIQnJBHbR7pNarpMi-83D4wOgKo,21374
76
+ foundry_mcp/core/providers/cursor_agent.py,sha256=wo71-4NzgQJQRveNRhGHI4uq5QxZbCOJ01cnwQzqyHs,22101
77
+ foundry_mcp/core/providers/detectors.py,sha256=yOEUB22-P11zdxhNXVOxr-R435YQ4PGx81RmF8vqHSo,16580
78
+ foundry_mcp/core/providers/gemini.py,sha256=1w5pzdGKzDPv1zy9ZJS6pO4c6PB7cLrxILNqIFbGcvw,14283
79
+ foundry_mcp/core/providers/opencode.py,sha256=XCj3I65hvIARet10GL6CJAHOBK_3lz0A_5drn07E-UY,24040
81
80
  foundry_mcp/core/providers/opencode_wrapper.js,sha256=m7zHGmXwYGM8SQn29Wq3o8rVUa-gOLXq_haPwXHDI4w,7521
82
- foundry_mcp/core/providers/package-lock.json,sha256=NaVOX26YlJlKw6suq_Vg9MWES_B_pEIkRiVIxXcthss,646
83
- foundry_mcp/core/providers/package.json,sha256=qQ80lM53NDZYEt7sUYLAydzUAnNJBUE6a-NLyFLnxNo,511
81
+ foundry_mcp/core/providers/package-lock.json,sha256=J49dNHIagU2eArW1wyZhGqHaHOV6EyiNerdldoPF3Qs,648
82
+ foundry_mcp/core/providers/package.json,sha256=nwRGNP00W0_kSgSN4b8BxofmagXYPTELhNm3p_eg3g8,513
84
83
  foundry_mcp/core/providers/registry.py,sha256=uAVJ0dvE_lTtTM6lE_RV9QCvGjP33gYxxXYCy_68Y8c,19147
85
84
  foundry_mcp/core/providers/test_provider.py,sha256=7RlAkc8H-2uBd25tmKs_Cu7Fl6EUpBB5eXKTx7G1Esk,5213
86
- foundry_mcp/core/providers/validation.py,sha256=ik82u5Uiclnb2AWVe337M2kIKq-lhPwuhtOtq5-Vf6o,21767
85
+ foundry_mcp/core/providers/validation.py,sha256=ohhDPzvJOkt3y6vLx1_Dl8dTIu6kTtXT39zVm6HhzbA,25866
87
86
  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
87
+ foundry_mcp/core/research/memory.py,sha256=Z-hitvjiWBTJn1vdFyEECTlrCIaN2FBoirXP23pIdrU,17586
88
+ foundry_mcp/core/research/models.py,sha256=y9rycU0sR2rLXTNv11UscCVJrzeNy5WFtv90irsuYDk,43799
89
+ foundry_mcp/core/research/providers/__init__.py,sha256=KQ39_7XiWkQWVs95rdibZziv6rvHjKlOIcfWq6LihAs,1282
90
+ foundry_mcp/core/research/providers/base.py,sha256=Sso29K5AEr-6IYeIZNoa3LK7tCWoiUECkAQQCFzfjk4,7424
91
+ foundry_mcp/core/research/providers/google.py,sha256=UDthug1szRH1jz_DB0MRMaoj--F3joN0N0u79UVDhB0,17580
92
+ foundry_mcp/core/research/providers/perplexity.py,sha256=4PPZQvTSzjEHY4kxXkwC7h9Z8I5_YKNq6hRajYMvO_c,15093
93
+ foundry_mcp/core/research/providers/semantic_scholar.py,sha256=qGxw5z24yPs9NkKR7cBUKWqRM7gstRBxrPvrSEgW_9I,18993
94
+ foundry_mcp/core/research/providers/tavily.py,sha256=C-8S7jAsCmbuUfsSmZy7JFDZwHC6pPHc2IvHD2NdElE,13019
95
+ foundry_mcp/core/research/workflows/__init__.py,sha256=LHyTClhlGaENg5USVLZs_dWsMLS91YmeBxOC75YpVVQ,1048
96
+ foundry_mcp/core/research/workflows/base.py,sha256=yzGMXdYmGDP_RX9rn0LOdwEEc01ntoLvGNZYy0fvras,10254
92
97
  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
98
+ foundry_mcp/core/research/workflows/consensus.py,sha256=lFLUB-gAS2KXojPdtBhASQgyKAssVQOQnJ1XmfYpno4,19325
99
+ foundry_mcp/core/research/workflows/deep_research.py,sha256=FhQt614fj_7VoW14N6nRUsCmkz1fQ2hPSIfWbBLUb9g,151261
94
100
  foundry_mcp/core/research/workflows/ideate.py,sha256=SiV9RTIX4hsjmMDNSNRvD77OVYfbV_LGx-8SLmLyggc,22271
95
101
  foundry_mcp/core/research/workflows/thinkdeep.py,sha256=5yWhDstcoxPSkxdyblPniXoB6GRqdFNOY-cjtAL-XaQ,14029
96
102
  foundry_mcp/dashboard/__init__.py,sha256=3XUgs6JJbcrx37ABvZPosgNzd5oFqdDm7raNDqWkmFs,811
@@ -118,30 +124,30 @@ foundry_mcp/schemas/__init__.py,sha256=iKHwedYPusMeg-Ozdeq-gHDT5nhmqEPP-a9jXi8Vy
118
124
  foundry_mcp/schemas/intake-schema.json,sha256=YisuGVRpMhg66lm-_vSs8SMVwjbsyWfXPSv0u4dI5UI,2691
119
125
  foundry_mcp/schemas/sdd-spec-schema.json,sha256=VAmeihOuDHldgk-evwjZLPmoRt4o4mVZ1vCZkhWuh74,12480
120
126
  foundry_mcp/tools/__init__.py,sha256=yNmGFFGNp-OMA758oAMxB4z7cvXb_6KPxm-ZyHbi-9I,199
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
127
+ foundry_mcp/tools/unified/__init__.py,sha256=cKkaNLCbe0XI1XlzndTrPZmjgqw1IJuaqv0Go1E67RU,3431
128
+ foundry_mcp/tools/unified/authoring.py,sha256=OU0EOY0ytxB9UCrcyHWkg4Eeyfp5-HQH8zIFVUMzA8Q,126735
123
129
  foundry_mcp/tools/unified/context_helpers.py,sha256=JcaEdn1nVgaZ4GfTktRdZ7oD4pHkU9TH6O8WfWJ9lr0,3056
124
130
  foundry_mcp/tools/unified/documentation_helpers.py,sha256=7kAt17bQiZ_WJ8BG2qDqZzdVGjBnIILlG5rzvJ4bfH4,10005
125
- foundry_mcp/tools/unified/environment.py,sha256=DnjxuTSHtiHYjU3L_nzAt7-0YkaTnZFsj6fp7zWiHpo,39403
131
+ foundry_mcp/tools/unified/environment.py,sha256=1Uejax3XLh5pUhMGL186yM07frn4QSVm0z_8JzMFZng,46063
126
132
  foundry_mcp/tools/unified/error.py,sha256=qzkI6GoFs4bfN79-x0fMpS1ogAn3lkdgzGGymUWEmE8,14452
127
133
  foundry_mcp/tools/unified/health.py,sha256=8oo61HeTfuyxTYyuKQPLMHvvYh54ju33invxIGFi5s4,6833
128
134
  foundry_mcp/tools/unified/journal.py,sha256=mbVivCiJymd6QFq2u1stVkqhLMM7odrpSyU6X9nRnak,23262
129
135
  foundry_mcp/tools/unified/lifecycle.py,sha256=RKESL2wEaEHagDl61eRX0y0AivUoaPn8ibcdHunohmw,20436
130
136
  foundry_mcp/tools/unified/metrics.py,sha256=Q1vIXLpQnTfHnpFxXKWwqQpNDc2_iuGIr48Bg7EM47c,22600
131
- foundry_mcp/tools/unified/plan.py,sha256=Ph8XjDDZz0dXHcB0-oTnWud-Oa_SSBpjk56NX0Z7On4,29320
137
+ foundry_mcp/tools/unified/plan.py,sha256=XNfBy7SWrbgzOypZOVhBQ2pfgfGPMc2vm1kfQnsNdJE,30199
132
138
  foundry_mcp/tools/unified/pr.py,sha256=L_Gk9oVP-8PgmbdULFr_BwXBPaLRib_55H8MyHuZ_34,9786
133
- foundry_mcp/tools/unified/provider.py,sha256=6v4eihUts59eoBVkxA7ZuM12v360jD0LbLvq2e8Jl_A,21770
134
- foundry_mcp/tools/unified/research.py,sha256=OMdV7zpJb2Xr95z3ZX59vYzO-deXmsnZqwQg1bcek7o,21537
135
- foundry_mcp/tools/unified/review.py,sha256=ym0WsErBgXLJH69q0rYIDJGiKL-E2jo1pf5ieK83W-s,37464
136
- foundry_mcp/tools/unified/review_helpers.py,sha256=k1_zJXMOGSgp7AP6_swEQdDLwcduOb_iy0D7wUX4YVk,9463
139
+ foundry_mcp/tools/unified/provider.py,sha256=rUIrtr4rh0YWEUoSbb-0GpM_Lx0dUuv2ElFvK8F0_O4,20558
140
+ foundry_mcp/tools/unified/research.py,sha256=ea3IibKCLF4T06zAW5LkXzg_r9mHQ0ofE5PYSF0M9Vg,43861
141
+ foundry_mcp/tools/unified/review.py,sha256=iA0AmIIE1qr15gmzzM1vAKixc_KEy2Y3_yUGfN9dI6U,37720
142
+ foundry_mcp/tools/unified/review_helpers.py,sha256=d4KPI-44Zwh9qvueywI1mcofLVPsscnVr2pcsvXYZBA,10253
137
143
  foundry_mcp/tools/unified/router.py,sha256=sWqAaey9yhiAoxyrnL8lr2reMWyPgmyIPlwrNgZZmRI,3489
138
- foundry_mcp/tools/unified/server.py,sha256=2QiID5O4cHVSWkakcDH1qwhJM7IHjJ5LdenffbzXmEY,19812
144
+ foundry_mcp/tools/unified/server.py,sha256=Krxwz011kXRmpjnUzP3ifwPkFN83tl5fhRczR3j9Isg,19218
139
145
  foundry_mcp/tools/unified/spec.py,sha256=R2Fp8RjgqRUkCYMFafuIiuLpykvtqZ1IVZscFThnYaA,38792
140
- foundry_mcp/tools/unified/task.py,sha256=LcLf3T5q7dfCAxxpbJCiYS-Wm-1mpVCy_ufaz4SU8H8,115966
146
+ foundry_mcp/tools/unified/task.py,sha256=2yR1Up_qbR14dqqxts2n2zjfCnkSry0sPGKoP0Cs8Zw,135247
141
147
  foundry_mcp/tools/unified/test.py,sha256=7H2UObajxz0vHZ_1HUne4E7hlkVGnigT70SnDlkPlfk,13894
142
148
  foundry_mcp/tools/unified/verification.py,sha256=Kq3BJ7-Rnp2R35dHoFSTdwHPjEf60nce8vWMIKOA32s,16945
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,,
149
+ foundry_mcp-0.8.10.dist-info/METADATA,sha256=EXKoBka7n7g9rdfTw0KCggui3XbhkM43RaLdEtcatjI,13901
150
+ foundry_mcp-0.8.10.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
151
+ foundry_mcp-0.8.10.dist-info/entry_points.txt,sha256=EBy4TVvlciNngt9ErVIyNjTImjczKa2FkoZRtIEw6aU,95
152
+ foundry_mcp-0.8.10.dist-info/licenses/LICENSE,sha256=8dabQwxo8HuixKsQaXcVaIHLLQWvPPLuKQFZLAIXL4w,1071
153
+ foundry_mcp-0.8.10.dist-info/RECORD,,
foundry_mcp/cli/flags.py DELETED
@@ -1,266 +0,0 @@
1
- """CLI feature flag bootstrap bridging CLI options and discovery manifest.
2
-
3
- Provides CLI-specific flag management that wraps the core feature flag
4
- infrastructure, enabling runtime flag overrides via CLI options and
5
- exposing flag status for tool discovery.
6
-
7
- See docs/mcp_best_practices/14-feature-flags.md for guidance.
8
- """
9
-
10
- from typing import Any, Callable, Dict, List, Optional, TypeVar
11
-
12
- import click
13
-
14
- from foundry_mcp.core.feature_flags import (
15
- FeatureFlag,
16
- FeatureFlagRegistry,
17
- FlagState,
18
- get_registry,
19
- )
20
-
21
- __all__ = [
22
- "CLIFlagRegistry",
23
- "get_cli_flags",
24
- "apply_cli_flag_overrides",
25
- "flags_for_discovery",
26
- "with_flag_options",
27
- ]
28
-
29
- T = TypeVar("T")
30
-
31
-
32
- class CLIFlagRegistry:
33
- """Registry of CLI-specific feature flags.
34
-
35
- Wraps the core FeatureFlagRegistry and provides CLI-specific
36
- functionality like mapping command-line options to flag overrides
37
- and generating discovery manifests.
38
-
39
- Example:
40
- >>> registry = CLIFlagRegistry()
41
- >>> registry.register_cli_flag(
42
- ... name="experimental_commands",
43
- ... description="Enable experimental CLI commands",
44
- ... default_enabled=False,
45
- ... state=FlagState.BETA,
46
- ... )
47
- >>> registry.is_enabled("experimental_commands")
48
- False
49
- """
50
-
51
- def __init__(self, core_registry: Optional[FeatureFlagRegistry] = None):
52
- """Initialize with optional core registry.
53
-
54
- Args:
55
- core_registry: Core feature flag registry. Uses global if None.
56
- """
57
- self._core = core_registry or get_registry()
58
- self._cli_flags: Dict[str, FeatureFlag] = {}
59
-
60
- def register_cli_flag(
61
- self,
62
- name: str,
63
- description: str,
64
- default_enabled: bool = False,
65
- state: FlagState = FlagState.BETA,
66
- **kwargs: Any,
67
- ) -> None:
68
- """Register a CLI-specific feature flag.
69
-
70
- Creates a flag in both the CLI registry and the core registry
71
- for unified evaluation.
72
-
73
- Args:
74
- name: Unique flag identifier (e.g., "experimental_commands").
75
- description: Human-readable description for discovery.
76
- default_enabled: Whether enabled by default.
77
- state: Flag lifecycle state.
78
- **kwargs: Additional FeatureFlag parameters.
79
- """
80
- flag = FeatureFlag(
81
- name=name,
82
- description=description,
83
- default_enabled=default_enabled,
84
- state=state,
85
- **kwargs,
86
- )
87
- self._cli_flags[name] = flag
88
- try:
89
- self._core.register(flag)
90
- except ValueError:
91
- # Flag already registered in core, update our local copy
92
- existing = self._core.get(name)
93
- if existing:
94
- self._cli_flags[name] = existing
95
-
96
- def is_enabled(self, flag_name: str, default: bool = False) -> bool:
97
- """Check if a CLI flag is enabled.
98
-
99
- Args:
100
- flag_name: Name of the flag to check.
101
- default: Value if flag doesn't exist.
102
-
103
- Returns:
104
- True if flag is enabled, False otherwise.
105
- """
106
- return self._core.is_enabled(flag_name, client_id="cli", default=default)
107
-
108
- def apply_overrides(self, overrides: Dict[str, bool]) -> None:
109
- """Apply multiple flag overrides.
110
-
111
- Used to translate CLI options into flag state. Overrides
112
- persist for the duration of the CLI command execution.
113
-
114
- Args:
115
- overrides: Mapping of flag names to enabled/disabled state.
116
- """
117
- for flag_name, enabled in overrides.items():
118
- self._core.set_override("cli", flag_name, enabled)
119
-
120
- def clear_overrides(self) -> None:
121
- """Clear all CLI-applied overrides."""
122
- self._core.clear_all_overrides("cli")
123
-
124
- def get_discovery_manifest(self) -> Dict[str, Dict[str, Any]]:
125
- """Generate discovery manifest for CLI flags.
126
-
127
- Returns flag information suitable for tool discovery responses,
128
- allowing AI coding assistants to understand available features.
129
-
130
- Returns:
131
- Dictionary with flag names as keys and info dicts as values.
132
- """
133
- manifest = {}
134
- for name, flag in self._cli_flags.items():
135
- manifest[name] = {
136
- "enabled": self.is_enabled(name),
137
- "state": flag.state.value,
138
- "description": flag.description,
139
- "default": flag.default_enabled,
140
- }
141
- if flag.state == FlagState.DEPRECATED and flag.expires_at:
142
- manifest[name]["expires"] = flag.expires_at.isoformat()
143
- return manifest
144
-
145
- def list_flags(self) -> List[str]:
146
- """List all registered CLI flag names."""
147
- return list(self._cli_flags.keys())
148
-
149
-
150
- # Global CLI flag registry
151
- _cli_registry: Optional[CLIFlagRegistry] = None
152
-
153
-
154
- def get_cli_flags() -> CLIFlagRegistry:
155
- """Get the global CLI flag registry."""
156
- global _cli_registry
157
- if _cli_registry is None:
158
- _cli_registry = CLIFlagRegistry()
159
- return _cli_registry
160
-
161
-
162
- def apply_cli_flag_overrides(
163
- enable: Optional[List[str]] = None,
164
- disable: Optional[List[str]] = None,
165
- ) -> None:
166
- """Apply flag overrides from CLI options.
167
-
168
- Translates --enable-feature and --disable-feature CLI options
169
- into feature flag overrides.
170
-
171
- Args:
172
- enable: List of flag names to enable.
173
- disable: List of flag names to disable.
174
- """
175
- registry = get_cli_flags()
176
- overrides: Dict[str, bool] = {}
177
-
178
- if enable:
179
- for flag_name in enable:
180
- overrides[flag_name] = True
181
-
182
- if disable:
183
- for flag_name in disable:
184
- overrides[flag_name] = False
185
-
186
- if overrides:
187
- registry.apply_overrides(overrides)
188
-
189
-
190
- def flags_for_discovery() -> Dict[str, Any]:
191
- """Get flag status for inclusion in discovery responses.
192
-
193
- Returns:
194
- Dictionary suitable for JSON serialization in discovery manifest.
195
- """
196
- return get_cli_flags().get_discovery_manifest()
197
-
198
-
199
- def with_flag_options(
200
- func: Optional[Callable[..., T]] = None,
201
- ) -> Callable[..., T]:
202
- """Click decorator that adds --enable-feature/--disable-feature options.
203
-
204
- Adds common flag override options to a Click command and applies
205
- them before command execution.
206
-
207
- Example:
208
- >>> @cli.command()
209
- ... @with_flag_options
210
- ... def my_command():
211
- ... # flags are already applied
212
- ... if get_cli_flags().is_enabled("experimental"):
213
- ... do_experimental_thing()
214
-
215
- Args:
216
- func: The Click command function to wrap.
217
-
218
- Returns:
219
- Decorated function with flag options.
220
- """
221
-
222
- def decorator(f: Callable[..., T]) -> Callable[..., T]:
223
- # Add the Click options
224
- f = click.option(
225
- "--enable-feature",
226
- "enable_features",
227
- multiple=True,
228
- help="Enable feature flag(s) for this command.",
229
- )(f)
230
- f = click.option(
231
- "--disable-feature",
232
- "disable_features",
233
- multiple=True,
234
- help="Disable feature flag(s) for this command.",
235
- )(f)
236
-
237
- # Wrap to apply flags before execution
238
- original = f
239
-
240
- @click.pass_context
241
- def wrapper(ctx: click.Context, *args: Any, **kwargs: Any) -> T:
242
- enable = kwargs.pop("enable_features", ())
243
- disable = kwargs.pop("disable_features", ())
244
-
245
- apply_cli_flag_overrides(
246
- enable=list(enable) if enable else None,
247
- disable=list(disable) if disable else None,
248
- )
249
-
250
- try:
251
- # Call original with remaining kwargs
252
- return ctx.invoke(original, *args, **kwargs)
253
- finally:
254
- # Clean up overrides after command
255
- get_cli_flags().clear_overrides()
256
-
257
- # Preserve function metadata
258
- wrapper.__name__ = f.__name__
259
- wrapper.__doc__ = f.__doc__
260
-
261
- return wrapper # type: ignore[return-value]
262
-
263
- if func is not None:
264
- return decorator(func)
265
-
266
- return decorator # type: ignore[return-value]