forgeoptimizer 1.0.2__tar.gz → 1.0.4__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 (319) hide show
  1. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/PKG-INFO +18 -1
  2. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/README.md +17 -0
  3. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/mcp_config.py +17 -1
  4. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/wrappers.py +6 -2
  5. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/pyproject.toml +1 -1
  6. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_cli.py +44 -2
  7. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/uv.lock +1 -1
  8. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/.github/workflows/ci.yml +0 -0
  9. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/.gitignore +0 -0
  10. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/CHANGELOG.md +0 -0
  11. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/CONTRIBUTING.md +0 -0
  12. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/CREDITS.md +0 -0
  13. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/Forge.toml +0 -0
  14. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/LICENSE +0 -0
  15. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/MIGRATION.md +0 -0
  16. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/RELEASE_NOTES.md +0 -0
  17. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/SECURITY.md +0 -0
  18. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/SUPPORT.md +0 -0
  19. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/docs/commands.md +0 -0
  20. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/__init__.py +0 -0
  21. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/budget/__init__.py +0 -0
  22. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/budget/middleware.py +0 -0
  23. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/budget/planner.py +0 -0
  24. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/budget/window.py +0 -0
  25. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/__init__.py +0 -0
  26. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/apply.py +0 -0
  27. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/caveman_optimize.py +0 -0
  28. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/diff_extract.py +0 -0
  29. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/llm.py +0 -0
  30. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/optimize.py +0 -0
  31. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/patch_generator.py +0 -0
  32. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/pipeline.py +0 -0
  33. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/retrieval.py +0 -0
  34. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/summarize.py +0 -0
  35. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/build/test_run.py +0 -0
  36. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/builder/__init__.py +0 -0
  37. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/builder/builder.py +0 -0
  38. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/builder/editor.py +0 -0
  39. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/builder/formatter.py +0 -0
  40. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/__init__.py +0 -0
  41. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/bootstrap.py +0 -0
  42. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/commands_auth.py +0 -0
  43. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/commands_commit.py +0 -0
  44. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/commands_diagnostics.py +0 -0
  45. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/commands_graph.py +0 -0
  46. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/commands_inspect.py +0 -0
  47. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/commands_wrappers.py +0 -0
  48. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/daemon.py +0 -0
  49. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/daemon_utils.py +0 -0
  50. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/main.py +0 -0
  51. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/cli/ui.py +0 -0
  52. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/config/__init__.py +0 -0
  53. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/config/loader.py +0 -0
  54. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/config/settings.py +0 -0
  55. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/config/writer.py +0 -0
  56. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/conversation/__init__.py +0 -0
  57. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/conversation/manager.py +0 -0
  58. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/conversation/session.py +0 -0
  59. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/__init__.py +0 -0
  60. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/container.py +0 -0
  61. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/context.py +0 -0
  62. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/credentials.py +0 -0
  63. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/errors.py +0 -0
  64. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/events.py +0 -0
  65. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/logging.py +0 -0
  66. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/models.py +0 -0
  67. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/plugins.py +0 -0
  68. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/core/service.py +0 -0
  69. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/docs/__init__.py +0 -0
  70. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/docs/generator.py +0 -0
  71. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/__init__.py +0 -0
  72. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/context.py +0 -0
  73. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/defaults.py +0 -0
  74. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/events.py +0 -0
  75. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/execution.py +0 -0
  76. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/plugins.py +0 -0
  77. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/runner.py +0 -0
  78. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/__init__.py +0 -0
  79. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/caveman_optimizer.py +0 -0
  80. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/context_optimizer.py +0 -0
  81. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/execution_engine_stage.py +0 -0
  82. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/git_engine.py +0 -0
  83. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/intent_analyzer.py +0 -0
  84. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/model_router.py +0 -0
  85. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/planning_engine.py +0 -0
  86. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/repository_analyzer.py +0 -0
  87. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/engine/stages/validation_engine.py +0 -0
  88. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/git/__init__.py +0 -0
  89. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/git/repo.py +0 -0
  90. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/git/service.py +0 -0
  91. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/__init__.py +0 -0
  92. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/backend_forgegraph.py +0 -0
  93. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/edge.py +0 -0
  94. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/forgegraph.py +0 -0
  95. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/graph.py +0 -0
  96. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/indexer.py +0 -0
  97. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/node.py +0 -0
  98. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/graph/repository.py +0 -0
  99. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/__init__.py +0 -0
  100. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/cache.py +0 -0
  101. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/caching_middleware.py +0 -0
  102. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/history.py +0 -0
  103. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/memory_compression.py +0 -0
  104. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/middleware.py +0 -0
  105. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/memory/store.py +0 -0
  106. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/__init__.py +0 -0
  107. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/base.py +0 -0
  108. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/builder.py +0 -0
  109. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/caveman_adapter.py +0 -0
  110. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/context.py +0 -0
  111. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/decorators.py +0 -0
  112. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/defaults.py +0 -0
  113. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/exceptions.py +0 -0
  114. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/executor.py +0 -0
  115. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/graphify_adapter.py +0 -0
  116. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/middleware_manager.py +0 -0
  117. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/pipeline.py +0 -0
  118. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/ponytail_adapter.py +0 -0
  119. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/registration.py +0 -0
  120. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/request.py +0 -0
  121. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/middleware/response.py +0 -0
  122. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/negotiator/__init__.py +0 -0
  123. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/negotiator/middleware.py +0 -0
  124. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/negotiator/negotiator.py +0 -0
  125. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/observability/__init__.py +0 -0
  126. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/observability/health.py +0 -0
  127. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/observability/metrics.py +0 -0
  128. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/observability/middleware.py +0 -0
  129. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/observability/tracing.py +0 -0
  130. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/__init__.py +0 -0
  131. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/adaptive_budget.py +0 -0
  132. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ast_extractor.py +0 -0
  133. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/cache.py +0 -0
  134. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/caveman/__init__.py +0 -0
  135. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/caveman/cli.py +0 -0
  136. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/caveman/decorator.py +0 -0
  137. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/caveman/factory.py +0 -0
  138. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/caveman/ruleset.py +0 -0
  139. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/caveman/state.py +0 -0
  140. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/chunker.py +0 -0
  141. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/comment_stripper.py +0 -0
  142. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/compression.py +0 -0
  143. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/cost_estimator.py +0 -0
  144. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/embedding_cache.py +0 -0
  145. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/git_context.py +0 -0
  146. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/intelligent_retrieval.py +0 -0
  147. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/optimizer.py +0 -0
  148. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/orchestrator.py +0 -0
  149. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/output/__init__.py +0 -0
  150. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/output/optimizer.py +0 -0
  151. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ponytail/__init__.py +0 -0
  152. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ponytail/cli.py +0 -0
  153. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ponytail/decorator.py +0 -0
  154. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ponytail/factory.py +0 -0
  155. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ponytail/ruleset.py +0 -0
  156. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ponytail/state.py +0 -0
  157. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/prompt_optimizer.py +0 -0
  158. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/quality_validation.py +0 -0
  159. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/ranker.py +0 -0
  160. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/retrieval_cache.py +0 -0
  161. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/semantic_ranking.py +0 -0
  162. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/summarizer.py +0 -0
  163. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/optimizer/token_estimator.py +0 -0
  164. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/orchestrator/__init__.py +0 -0
  165. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/__init__.py +0 -0
  166. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/agent.py +0 -0
  167. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/plan.py +0 -0
  168. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/planner.py +0 -0
  169. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/render.py +0 -0
  170. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/serialize.py +0 -0
  171. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/planner/software.py +0 -0
  172. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/platform/__init__.py +0 -0
  173. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/platform/core.py +0 -0
  174. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/platform/deps.py +0 -0
  175. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/platform/paths.py +0 -0
  176. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/platform/shell.py +0 -0
  177. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/platform/update.py +0 -0
  178. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/plugins/__init__.py +0 -0
  179. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/plugins/hook.py +0 -0
  180. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/policy/__init__.py +0 -0
  181. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/policy/engine.py +0 -0
  182. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/policy/exceptions.py +0 -0
  183. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/policy/middleware.py +0 -0
  184. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/policy/rules.py +0 -0
  185. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/prompts/__init__.py +0 -0
  186. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/prompts/loader.py +0 -0
  187. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/prompts/registry.py +0 -0
  188. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/prompts/renderer.py +0 -0
  189. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/__init__.py +0 -0
  190. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/anthropic.py +0 -0
  191. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/base.py +0 -0
  192. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/builtin.py +0 -0
  193. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/conversation.py +0 -0
  194. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/exceptions.py +0 -0
  195. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/google.py +0 -0
  196. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/health.py +0 -0
  197. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/http_base.py +0 -0
  198. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/mock.py +0 -0
  199. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/openai.py +0 -0
  200. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/openai_compatible.py +0 -0
  201. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_capabilities.py +0 -0
  202. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_context.py +0 -0
  203. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_events.py +0 -0
  204. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_factory.py +0 -0
  205. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_manager.py +0 -0
  206. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_metadata.py +0 -0
  207. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_registry.py +0 -0
  208. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/provider_router.py +0 -0
  209. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/router.py +0 -0
  210. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/providers/router_state.py +0 -0
  211. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/registry/__init__.py +0 -0
  212. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/registry/model_registry.py +0 -0
  213. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/resilience/__init__.py +0 -0
  214. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/resilience/circuit_breaker.py +0 -0
  215. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/resilience/exceptions.py +0 -0
  216. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/resilience/middleware.py +0 -0
  217. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/resilience/retry.py +0 -0
  218. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/__init__.py +0 -0
  219. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzer.py +0 -0
  220. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/__init__.py +0 -0
  221. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/architecture.py +0 -0
  222. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/complexity.py +0 -0
  223. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/dead_code.py +0 -0
  224. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/duplicates.py +0 -0
  225. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/performance.py +0 -0
  226. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/analyzers/security.py +0 -0
  227. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/finding.py +0 -0
  228. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/report.py +0 -0
  229. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/repository.py +0 -0
  230. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/review/suggestions.py +0 -0
  231. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/__init__.py +0 -0
  232. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/agents.py +0 -0
  233. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/cache_store.py +0 -0
  234. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/pipeline_runner.py +0 -0
  235. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/prepare.py +0 -0
  236. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime/shared_extraction.py +0 -0
  237. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/__init__.py +0 -0
  238. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/config_manager.py +0 -0
  239. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/container.py +0 -0
  240. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/context.py +0 -0
  241. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/errors.py +0 -0
  242. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/events.py +0 -0
  243. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/factory.py +0 -0
  244. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/interfaces.py +0 -0
  245. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/lifecycle.py +0 -0
  246. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/provider_registry.py +0 -0
  247. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/request.py +0 -0
  248. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/response.py +0 -0
  249. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/runtime_core/service_registry.py +0 -0
  250. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/scheduler/__init__.py +0 -0
  251. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/scheduler/scheduler.py +0 -0
  252. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/scheduler/task.py +0 -0
  253. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/scheduler/worker.py +0 -0
  254. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/streaming/__init__.py +0 -0
  255. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/streaming/events.py +0 -0
  256. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/streaming/middleware.py +0 -0
  257. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/templates/__init__.py +0 -0
  258. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/templates/engine.py +0 -0
  259. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/templates/registry.py +0 -0
  260. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/transport/__init__.py +0 -0
  261. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/transport/daemon.py +0 -0
  262. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/transport/http_server.py +0 -0
  263. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/transport/server.py +0 -0
  264. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/utils/__init__.py +0 -0
  265. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/utils/fs.py +0 -0
  266. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/utils/ids.py +0 -0
  267. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/utils/io.py +0 -0
  268. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/utils/paths.py +0 -0
  269. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/forgecli/utils/timing.py +0 -0
  270. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/packaging/scoop/forgecli.json +0 -0
  271. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/packaging/winget/forgecli.ForgeCli.yaml +0 -0
  272. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/__init__.py +0 -0
  273. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/conftest.py +0 -0
  274. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_auth.py +0 -0
  275. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_budget_context.py +0 -0
  276. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_build_pipeline.py +0 -0
  277. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_caching_observability.py +0 -0
  278. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_caveman_cli.py +0 -0
  279. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_caveman_ruleset.py +0 -0
  280. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_commit.py +0 -0
  281. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_config.py +0 -0
  282. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_container.py +0 -0
  283. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_conversation_optimization.py +0 -0
  284. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_diagnostics.py +0 -0
  285. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_e2e.py +0 -0
  286. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_engine.py +0 -0
  287. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_forgegraph_client.py +0 -0
  288. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_graph.py +0 -0
  289. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_mcp_config.py +0 -0
  290. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_memory.py +0 -0
  291. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_middleware.py +0 -0
  292. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_negotiator.py +0 -0
  293. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_optimizer.py +0 -0
  294. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_orchestrator.py +0 -0
  295. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_output_optimization.py +0 -0
  296. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_planner.py +0 -0
  297. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_planner_render.py +0 -0
  298. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_platform.py +0 -0
  299. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_policy.py +0 -0
  300. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_ponytail_cli.py +0 -0
  301. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_ponytail_ruleset.py +0 -0
  302. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_prompts.py +0 -0
  303. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_provider.py +0 -0
  304. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_providers.py +0 -0
  305. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_providers_http.py +0 -0
  306. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_redesign_optimizers.py +0 -0
  307. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_repository_graph.py +0 -0
  308. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_resilience.py +0 -0
  309. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_review.py +0 -0
  310. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_router.py +0 -0
  311. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_runtime.py +0 -0
  312. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_runtime_core.py +0 -0
  313. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_runtime_core_phase2.py +0 -0
  314. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_scheduler_plugins.py +0 -0
  315. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_software_planner.py +0 -0
  316. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_streaming.py +0 -0
  317. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_token_optimizations.py +0 -0
  318. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_transport.py +0 -0
  319. {forgeoptimizer-1.0.2 → forgeoptimizer-1.0.4}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgeoptimizer
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: Forge — AI optimization runtime for Claude Code, Codex, Cursor, Antigravity
5
5
  Project-URL: Homepage, https://github.com/mdshzb04/Forge
6
6
  Project-URL: Repository, https://github.com/mdshzb04/Forge
@@ -118,6 +118,23 @@ uv tool install forgeoptimizer
118
118
 
119
119
  The CLI entrypoint is `forge`.
120
120
 
121
+ To upgrade an existing installation to get the latest optimization fixes:
122
+
123
+ ```bash
124
+ uv tool upgrade forgeoptimizer
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Important Usage Guidelines
130
+
131
+ > [!IMPORTANT]
132
+ > **Always run commands inside your specific project directories.**
133
+ >
134
+ > Forge scans the files in your current working directory to build context.
135
+ > - **Do not run `forge` commands inside your home directory (`~`) or root (`/)`**, as this will cause Forge to scan all unrelated system/home directories and files, leading to long scans or freezes.
136
+ > - **Always `cd` into your specific project folder or Git repository** before running commands like `forge claude`, `forge cursor`, or `forge antigravity`.
137
+
121
138
  ---
122
139
 
123
140
  ## Interfaces
@@ -68,6 +68,23 @@ uv tool install forgeoptimizer
68
68
 
69
69
  The CLI entrypoint is `forge`.
70
70
 
71
+ To upgrade an existing installation to get the latest optimization fixes:
72
+
73
+ ```bash
74
+ uv tool upgrade forgeoptimizer
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Important Usage Guidelines
80
+
81
+ > [!IMPORTANT]
82
+ > **Always run commands inside your specific project directories.**
83
+ >
84
+ > Forge scans the files in your current working directory to build context.
85
+ > - **Do not run `forge` commands inside your home directory (`~`) or root (`/)`**, as this will cause Forge to scan all unrelated system/home directories and files, leading to long scans or freezes.
86
+ > - **Always `cd` into your specific project folder or Git repository** before running commands like `forge claude`, `forge cursor`, or `forge antigravity`.
87
+
71
88
  ---
72
89
 
73
90
  ## Interfaces
@@ -98,6 +98,15 @@ def configure_mcp_for_agent(spec: AgentSpec, repo_root: Path) -> None:
98
98
 
99
99
  _write_json_mcp(path, target.table)
100
100
 
101
+ except PermissionError as e:
102
+
103
+ # Quietly skip permission errors on project/workspace targets since home targets are configured
104
+ if target.base == "repo":
105
+
106
+ continue
107
+
108
+ info(f"Note: Could not auto-configure {target.label or spec.name} MCP: {e}")
109
+
101
110
  except Exception as e:
102
111
 
103
112
  info(f"Note: Could not auto-configure {target.label or spec.name} MCP: {e}")
@@ -379,7 +388,14 @@ def configure_project_local_mcp(repo_root: Path) -> None:
379
388
 
380
389
  """Create a project-local .mcp.json for tools that support auto-discovery."""
381
390
 
382
- _write_json_mcp(repo_root / ".mcp.json", "mcpServers")
391
+ # Never create a project-local .mcp.json in the user's home or system root directory
392
+ resolved = repo_root.resolve()
393
+ if resolved == Path.home().resolve() or resolved == Path("/").resolve():
394
+ return
395
+
396
+ with contextlib.suppress(PermissionError):
397
+
398
+ _write_json_mcp(repo_root / ".mcp.json", "mcpServers")
383
399
 
384
400
 
385
401
 
@@ -78,8 +78,12 @@ def launch_wrapper(
78
78
 
79
79
  if spec.supports_mcp:
80
80
  try:
81
- from forgecli.runtime.mcp_config import configure_mcp_for_all
82
- configure_mcp_for_all(repo_root)
81
+ from forgecli.runtime.mcp_config import (
82
+ configure_mcp_for_agent,
83
+ configure_project_local_mcp,
84
+ )
85
+ configure_mcp_for_agent(spec, repo_root)
86
+ configure_project_local_mcp(repo_root)
83
87
  except Exception:
84
88
  pass
85
89
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "forgeoptimizer"
7
- version = "1.0.2"
7
+ version = "1.0.4"
8
8
  description = "Forge — AI optimization runtime for Claude Code, Codex, Cursor, Antigravity"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -486,6 +486,7 @@ def test_mcp_auto_configuration(tmp_path: Path, monkeypatch) -> None:
486
486
 
487
487
  import subprocess
488
488
 
489
+ # 1. Test Claude Code MCP Configuration
489
490
  with (
490
491
  patch("forgecli.runtime.wrappers.which", return_value="/usr/bin/claude"),
491
492
  patch(
@@ -507,7 +508,22 @@ def test_mcp_auto_configuration(tmp_path: Path, monkeypatch) -> None:
507
508
 
508
509
  assert "forge" in claude_config.get("mcpServers", {})
509
510
 
510
- assert "forge" in claude_config["mcpServers"]["forge"]["command"]
511
+ # Verify other agents' configs are NOT created yet
512
+ assert not (mock_home / ".cursor" / "mcp.json").exists()
513
+
514
+ # 2. Test Cursor MCP Configuration
515
+ with (
516
+ patch("forgecli.runtime.wrappers.which", return_value="/usr/bin/cursor"),
517
+ patch(
518
+ "forgecli.runtime.wrappers.subprocess.run",
519
+ return_value=subprocess.CompletedProcess([], 0, stdout="", stderr=""),
520
+ ),
521
+ ):
522
+ runner = CliRunner()
523
+
524
+ result = runner.invoke(app, ["cursor", "-p", str(mock_repo)], catch_exceptions=False)
525
+
526
+ assert result.exit_code == 0
511
527
 
512
528
  cursor_global_file = mock_home / ".cursor" / "mcp.json"
513
529
 
@@ -519,7 +535,19 @@ def test_mcp_auto_configuration(tmp_path: Path, monkeypatch) -> None:
519
535
 
520
536
  assert (mock_repo / ".cursor" / "mcp.json").exists()
521
537
 
522
- assert (mock_repo / ".mcp.json").exists()
538
+ # 3. Test Codex MCP Configuration
539
+ with (
540
+ patch("forgecli.runtime.wrappers.which", return_value="/usr/bin/codex"),
541
+ patch(
542
+ "forgecli.runtime.wrappers.subprocess.run",
543
+ return_value=subprocess.CompletedProcess([], 0, stdout="", stderr=""),
544
+ ),
545
+ ):
546
+ runner = CliRunner()
547
+
548
+ result = runner.invoke(app, ["codex", "-p", str(mock_repo)], catch_exceptions=False)
549
+
550
+ assert result.exit_code == 0
523
551
 
524
552
  codex_toml = mock_home / ".codex" / "config.toml"
525
553
 
@@ -527,6 +555,20 @@ def test_mcp_auto_configuration(tmp_path: Path, monkeypatch) -> None:
527
555
 
528
556
  assert "[mcp_servers.forge]" in codex_toml.read_text(encoding="utf-8")
529
557
 
558
+ # 4. Test Antigravity MCP Configuration
559
+ with (
560
+ patch("forgecli.runtime.wrappers.which", return_value="/usr/bin/antigravity"),
561
+ patch(
562
+ "forgecli.runtime.wrappers.subprocess.run",
563
+ return_value=subprocess.CompletedProcess([], 0, stdout="", stderr=""),
564
+ ),
565
+ ):
566
+ runner = CliRunner()
567
+
568
+ result = runner.invoke(app, ["antigravity", "-p", str(mock_repo)], catch_exceptions=False)
569
+
570
+ assert result.exit_code == 0
571
+
530
572
  antigravity_json = mock_home / ".gemini" / "config" / "mcp_config.json"
531
573
 
532
574
  assert antigravity_json.exists()
@@ -406,7 +406,7 @@ wheels = [
406
406
 
407
407
  [[package]]
408
408
  name = "forgectx"
409
- version = "1.0.2"
409
+ version = "1.0.4"
410
410
  source = { editable = "." }
411
411
  dependencies = [
412
412
  { name = "aiofiles" },
File without changes