forgeoptimizer 1.0.3__tar.gz → 1.0.6__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.
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/.github/workflows/ci.yml +4 -10
- forgeoptimizer-1.0.6/.github/workflows/test.yml +127 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/PKG-INFO +1 -1
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/mcp_config.py +12 -1
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/wrappers.py +6 -2
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/pyproject.toml +1 -1
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_cli.py +44 -2
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/uv.lock +1 -1
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/.gitignore +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/CHANGELOG.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/CONTRIBUTING.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/CREDITS.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/Forge.toml +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/LICENSE +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/MIGRATION.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/README.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/RELEASE_NOTES.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/SECURITY.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/SUPPORT.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/docs/commands.md +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/budget/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/budget/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/budget/planner.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/budget/window.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/apply.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/caveman_optimize.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/diff_extract.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/llm.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/optimize.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/patch_generator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/pipeline.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/retrieval.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/summarize.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/build/test_run.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/builder/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/builder/builder.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/builder/editor.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/builder/formatter.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/bootstrap.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/commands_auth.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/commands_commit.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/commands_diagnostics.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/commands_graph.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/commands_inspect.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/commands_wrappers.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/daemon.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/daemon_utils.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/main.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/cli/ui.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/config/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/config/loader.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/config/settings.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/config/writer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/conversation/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/conversation/manager.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/conversation/session.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/container.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/credentials.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/errors.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/events.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/logging.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/models.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/plugins.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/core/service.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/docs/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/docs/generator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/defaults.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/events.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/execution.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/plugins.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/runner.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/caveman_optimizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/context_optimizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/execution_engine_stage.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/git_engine.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/intent_analyzer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/model_router.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/planning_engine.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/repository_analyzer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/validation_engine.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/git/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/git/repo.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/git/service.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/backend_forgegraph.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/edge.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/forgegraph.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/graph.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/indexer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/node.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/graph/repository.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/cache.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/caching_middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/history.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/memory_compression.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/memory/store.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/base.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/builder.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/caveman_adapter.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/decorators.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/defaults.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/exceptions.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/executor.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/graphify_adapter.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/middleware_manager.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/pipeline.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/ponytail_adapter.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/registration.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/request.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/middleware/response.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/negotiator/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/negotiator/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/negotiator/negotiator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/observability/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/observability/health.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/observability/metrics.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/observability/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/observability/tracing.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/adaptive_budget.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ast_extractor.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/cache.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/caveman/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/caveman/cli.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/caveman/decorator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/caveman/factory.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/caveman/ruleset.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/caveman/state.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/chunker.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/comment_stripper.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/compression.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/cost_estimator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/embedding_cache.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/git_context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/intelligent_retrieval.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/optimizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/orchestrator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/output/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/output/optimizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ponytail/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ponytail/cli.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ponytail/decorator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ponytail/factory.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ponytail/ruleset.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ponytail/state.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/prompt_optimizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/quality_validation.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/ranker.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/retrieval_cache.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/semantic_ranking.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/summarizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/optimizer/token_estimator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/orchestrator/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/agent.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/plan.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/planner.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/render.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/serialize.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/planner/software.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/platform/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/platform/core.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/platform/deps.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/platform/paths.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/platform/shell.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/platform/update.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/plugins/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/plugins/hook.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/policy/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/policy/engine.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/policy/exceptions.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/policy/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/policy/rules.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/prompts/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/prompts/loader.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/prompts/registry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/prompts/renderer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/anthropic.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/base.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/builtin.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/conversation.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/exceptions.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/google.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/health.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/http_base.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/mock.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/openai.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/openai_compatible.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_capabilities.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_events.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_factory.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_manager.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_metadata.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_registry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/provider_router.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/router.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/providers/router_state.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/registry/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/registry/model_registry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/resilience/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/resilience/circuit_breaker.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/resilience/exceptions.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/resilience/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/resilience/retry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/architecture.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/complexity.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/dead_code.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/duplicates.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/performance.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/analyzers/security.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/finding.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/report.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/repository.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/review/suggestions.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/agents.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/cache_store.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/pipeline_runner.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/prepare.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime/shared_extraction.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/config_manager.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/container.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/errors.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/events.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/factory.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/interfaces.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/lifecycle.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/provider_registry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/request.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/response.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/runtime_core/service_registry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/scheduler/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/scheduler/scheduler.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/scheduler/task.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/scheduler/worker.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/streaming/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/streaming/events.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/streaming/middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/templates/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/templates/engine.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/templates/registry.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/transport/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/transport/daemon.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/transport/http_server.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/transport/server.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/utils/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/utils/fs.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/utils/ids.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/utils/io.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/utils/paths.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/utils/timing.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/packaging/scoop/forgecli.json +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/packaging/winget/forgecli.ForgeCli.yaml +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/__init__.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/conftest.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_auth.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_budget_context.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_build_pipeline.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_caching_observability.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_caveman_cli.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_caveman_ruleset.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_commit.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_config.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_container.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_conversation_optimization.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_diagnostics.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_e2e.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_engine.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_forgegraph_client.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_graph.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_mcp_config.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_memory.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_middleware.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_negotiator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_optimizer.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_orchestrator.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_output_optimization.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_planner.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_planner_render.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_platform.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_policy.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_ponytail_cli.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_ponytail_ruleset.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_prompts.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_provider.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_providers.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_providers_http.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_redesign_optimizers.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_repository_graph.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_resilience.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_review.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_router.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_runtime.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_runtime_core.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_runtime_core_phase2.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_scheduler_plugins.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_software_planner.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_streaming.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_token_optimizations.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_transport.py +0 -0
- {forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/tests/test_utils.py +0 -0
|
@@ -3,11 +3,8 @@ env:
|
|
|
3
3
|
PYTHONUTF8: "1"
|
|
4
4
|
on:
|
|
5
5
|
push:
|
|
6
|
-
branches: [main]
|
|
7
6
|
tags:
|
|
8
7
|
- "v*"
|
|
9
|
-
pull_request:
|
|
10
|
-
branches: [main]
|
|
11
8
|
workflow_dispatch:
|
|
12
9
|
|
|
13
10
|
jobs:
|
|
@@ -128,10 +125,8 @@ jobs:
|
|
|
128
125
|
forge codex --help
|
|
129
126
|
forge cursor --help
|
|
130
127
|
|
|
131
|
-
|
|
132
128
|
publish-testpypi:
|
|
133
129
|
name: publish to TestPyPI (on tag or manual)
|
|
134
|
-
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
|
|
135
130
|
needs: [test, build, uv-install]
|
|
136
131
|
runs-on: ubuntu-latest
|
|
137
132
|
environment: testpypi
|
|
@@ -140,7 +135,8 @@ jobs:
|
|
|
140
135
|
contents: read
|
|
141
136
|
steps:
|
|
142
137
|
- uses: actions/checkout@v4
|
|
143
|
-
-
|
|
138
|
+
- name: Set up Python
|
|
139
|
+
uses: actions/setup-python@v5
|
|
144
140
|
with:
|
|
145
141
|
python-version: "3.12"
|
|
146
142
|
- name: Rename package to match TestPyPI Trusted Publisher
|
|
@@ -163,7 +159,6 @@ jobs:
|
|
|
163
159
|
|
|
164
160
|
publish-pypi:
|
|
165
161
|
name: publish to PyPI (on tag or manual)
|
|
166
|
-
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
|
|
167
162
|
needs: [test, build, uv-install]
|
|
168
163
|
runs-on: ubuntu-latest
|
|
169
164
|
environment: pypi
|
|
@@ -172,7 +167,8 @@ jobs:
|
|
|
172
167
|
contents: read
|
|
173
168
|
steps:
|
|
174
169
|
- uses: actions/checkout@v4
|
|
175
|
-
-
|
|
170
|
+
- name: Set up Python
|
|
171
|
+
uses: actions/setup-python@v5
|
|
176
172
|
with:
|
|
177
173
|
python-version: "3.12"
|
|
178
174
|
- name: Rename package to match PyPI Trusted Publisher
|
|
@@ -191,5 +187,3 @@ jobs:
|
|
|
191
187
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
192
188
|
with:
|
|
193
189
|
skip-existing: true
|
|
194
|
-
|
|
195
|
-
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
name: test
|
|
2
|
+
env:
|
|
3
|
+
PYTHONUTF8: "1"
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
name: test (${{ matrix.os }} / py${{ matrix.python-version }})
|
|
14
|
+
runs-on: ${{ matrix.os }}
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
19
|
+
python-version: ["3.12"]
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Check out
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
26
|
+
uses: actions/setup-python@v5
|
|
27
|
+
with:
|
|
28
|
+
python-version: ${{ matrix.python-version }}
|
|
29
|
+
cache: pip
|
|
30
|
+
|
|
31
|
+
- name: Install
|
|
32
|
+
run: |
|
|
33
|
+
python -m pip install --upgrade pip
|
|
34
|
+
python -m pip install -e ".[dev]"
|
|
35
|
+
|
|
36
|
+
- name: Smoke test CLI
|
|
37
|
+
run: |
|
|
38
|
+
forge --version
|
|
39
|
+
forge --help
|
|
40
|
+
forge graph --help
|
|
41
|
+
|
|
42
|
+
- name: Lint
|
|
43
|
+
run: python -m ruff check forgecli tests
|
|
44
|
+
|
|
45
|
+
- name: Tests
|
|
46
|
+
run: python -m pytest -q
|
|
47
|
+
|
|
48
|
+
- name: Cross-platform shell smoke
|
|
49
|
+
if: runner.os != 'Windows'
|
|
50
|
+
shell: bash
|
|
51
|
+
run: |
|
|
52
|
+
python -c "from forgecli.platform import run; r = run(['echo', 'cross-platform']); print('OK' if r.ok else 'FAIL')"
|
|
53
|
+
|
|
54
|
+
- name: Cross-platform shell smoke (Windows)
|
|
55
|
+
if: runner.os == 'Windows'
|
|
56
|
+
shell: pwsh
|
|
57
|
+
run: |
|
|
58
|
+
python -c "from forgecli.platform import run; r = run(['cmd.exe', '/c', 'echo cross-platform']); print('OK' if r.ok else 'FAIL')"
|
|
59
|
+
|
|
60
|
+
build:
|
|
61
|
+
name: build sdist + wheel
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/checkout@v4
|
|
65
|
+
- uses: actions/setup-python@v5
|
|
66
|
+
with:
|
|
67
|
+
python-version: "3.12"
|
|
68
|
+
- name: Install build
|
|
69
|
+
run: python -m pip install --upgrade build twine
|
|
70
|
+
- name: Build
|
|
71
|
+
run: python -m build
|
|
72
|
+
- name: Verify package metadata
|
|
73
|
+
run: |
|
|
74
|
+
twine check dist/*
|
|
75
|
+
python - <<'PY'
|
|
76
|
+
import zipfile
|
|
77
|
+
from pathlib import Path
|
|
78
|
+
wheel = next(Path("dist").glob("*.whl"))
|
|
79
|
+
with zipfile.ZipFile(wheel) as zf:
|
|
80
|
+
names = zf.namelist()
|
|
81
|
+
assert any(n.startswith("forgecli/") for n in names), "missing forgecli package"
|
|
82
|
+
print(f"OK: {wheel.name}")
|
|
83
|
+
PY
|
|
84
|
+
- name: Upload artifacts
|
|
85
|
+
uses: actions/upload-artifact@v4
|
|
86
|
+
with:
|
|
87
|
+
name: dist
|
|
88
|
+
path: dist/
|
|
89
|
+
|
|
90
|
+
uv-install:
|
|
91
|
+
name: uv tool install (${{ matrix.os }})
|
|
92
|
+
needs: build
|
|
93
|
+
runs-on: ${{ matrix.os }}
|
|
94
|
+
strategy:
|
|
95
|
+
fail-fast: false
|
|
96
|
+
matrix:
|
|
97
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
98
|
+
steps:
|
|
99
|
+
- name: Check out
|
|
100
|
+
uses: actions/checkout@v4
|
|
101
|
+
|
|
102
|
+
- name: Set up Python
|
|
103
|
+
uses: actions/setup-python@v5
|
|
104
|
+
with:
|
|
105
|
+
python-version: "3.12"
|
|
106
|
+
|
|
107
|
+
- name: Install uv
|
|
108
|
+
uses: astral-sh/setup-uv@v6
|
|
109
|
+
|
|
110
|
+
- uses: actions/download-artifact@v4
|
|
111
|
+
with:
|
|
112
|
+
name: dist
|
|
113
|
+
path: dist/
|
|
114
|
+
|
|
115
|
+
- name: Install forgectx via uv tool
|
|
116
|
+
shell: bash
|
|
117
|
+
run: |
|
|
118
|
+
uv tool install dist/*.whl
|
|
119
|
+
|
|
120
|
+
- name: Verify forge --help
|
|
121
|
+
run: forge --help
|
|
122
|
+
|
|
123
|
+
- name: Verify wrapper commands are registered
|
|
124
|
+
run: |
|
|
125
|
+
forge claude --help
|
|
126
|
+
forge codex --help
|
|
127
|
+
forge cursor --help
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: forgeoptimizer
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.6
|
|
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
|
|
@@ -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}")
|
|
@@ -384,7 +393,9 @@ def configure_project_local_mcp(repo_root: Path) -> None:
|
|
|
384
393
|
if resolved == Path.home().resolve() or resolved == Path("/").resolve():
|
|
385
394
|
return
|
|
386
395
|
|
|
387
|
-
|
|
396
|
+
with contextlib.suppress(PermissionError):
|
|
397
|
+
|
|
398
|
+
_write_json_mcp(repo_root / ".mcp.json", "mcpServers")
|
|
388
399
|
|
|
389
400
|
|
|
390
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
|
|
82
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{forgeoptimizer-1.0.3 → forgeoptimizer-1.0.6}/forgecli/engine/stages/execution_engine_stage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|