forgeoptimizer 1.0.1__tar.gz → 1.0.3__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.1 → forgeoptimizer-1.0.3}/PKG-INFO +18 -1
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/README.md +17 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/patch_generator.py +9 -6
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/commands_diagnostics.py +10 -13
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/daemon.py +12 -11
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/docs/generator.py +9 -11
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/orchestrator/__init__.py +9 -12
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzer.py +14 -13
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/mcp_config.py +5 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/shared_extraction.py +22 -24
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/utils/fs.py +10 -18
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/pyproject.toml +1 -1
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/uv.lock +1 -1
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/.github/workflows/ci.yml +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/.gitignore +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/CHANGELOG.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/CONTRIBUTING.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/CREDITS.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/Forge.toml +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/LICENSE +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/MIGRATION.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/RELEASE_NOTES.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/SECURITY.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/SUPPORT.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/docs/commands.md +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/budget/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/budget/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/budget/planner.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/budget/window.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/apply.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/caveman_optimize.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/diff_extract.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/llm.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/optimize.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/pipeline.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/retrieval.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/summarize.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/build/test_run.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/builder/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/builder/builder.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/builder/editor.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/builder/formatter.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/bootstrap.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/commands_auth.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/commands_commit.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/commands_graph.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/commands_inspect.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/commands_wrappers.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/daemon_utils.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/main.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/cli/ui.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/config/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/config/loader.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/config/settings.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/config/writer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/conversation/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/conversation/manager.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/conversation/session.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/container.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/credentials.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/errors.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/events.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/logging.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/models.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/plugins.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/core/service.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/docs/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/defaults.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/events.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/execution.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/plugins.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/runner.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/caveman_optimizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/context_optimizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/execution_engine_stage.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/git_engine.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/intent_analyzer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/model_router.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/planning_engine.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/repository_analyzer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/engine/stages/validation_engine.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/git/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/git/repo.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/git/service.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/backend_forgegraph.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/edge.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/forgegraph.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/graph.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/indexer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/node.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/graph/repository.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/cache.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/caching_middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/history.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/memory_compression.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/memory/store.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/base.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/builder.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/caveman_adapter.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/decorators.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/defaults.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/exceptions.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/executor.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/graphify_adapter.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/middleware_manager.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/pipeline.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/ponytail_adapter.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/registration.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/request.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/middleware/response.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/negotiator/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/negotiator/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/negotiator/negotiator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/observability/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/observability/health.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/observability/metrics.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/observability/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/observability/tracing.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/adaptive_budget.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ast_extractor.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/cache.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/caveman/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/caveman/cli.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/caveman/decorator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/caveman/factory.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/caveman/ruleset.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/caveman/state.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/chunker.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/comment_stripper.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/compression.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/cost_estimator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/embedding_cache.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/git_context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/intelligent_retrieval.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/optimizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/orchestrator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/output/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/output/optimizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ponytail/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ponytail/cli.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ponytail/decorator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ponytail/factory.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ponytail/ruleset.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ponytail/state.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/prompt_optimizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/quality_validation.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/ranker.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/retrieval_cache.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/semantic_ranking.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/summarizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/optimizer/token_estimator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/agent.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/plan.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/planner.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/render.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/serialize.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/planner/software.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/platform/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/platform/core.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/platform/deps.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/platform/paths.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/platform/shell.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/platform/update.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/plugins/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/plugins/hook.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/policy/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/policy/engine.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/policy/exceptions.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/policy/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/policy/rules.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/prompts/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/prompts/loader.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/prompts/registry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/prompts/renderer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/anthropic.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/base.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/builtin.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/conversation.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/exceptions.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/google.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/health.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/http_base.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/mock.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/openai.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/openai_compatible.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_capabilities.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_events.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_factory.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_manager.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_metadata.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_registry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/provider_router.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/router.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/providers/router_state.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/registry/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/registry/model_registry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/resilience/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/resilience/circuit_breaker.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/resilience/exceptions.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/resilience/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/resilience/retry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/architecture.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/complexity.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/dead_code.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/duplicates.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/performance.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/analyzers/security.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/finding.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/report.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/repository.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/review/suggestions.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/agents.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/cache_store.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/pipeline_runner.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/prepare.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime/wrappers.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/config_manager.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/container.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/errors.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/events.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/factory.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/interfaces.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/lifecycle.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/provider_registry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/request.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/response.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/runtime_core/service_registry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/scheduler/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/scheduler/scheduler.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/scheduler/task.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/scheduler/worker.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/streaming/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/streaming/events.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/streaming/middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/templates/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/templates/engine.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/templates/registry.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/transport/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/transport/daemon.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/transport/http_server.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/transport/server.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/utils/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/utils/ids.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/utils/io.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/utils/paths.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/forgecli/utils/timing.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/packaging/scoop/forgecli.json +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/packaging/winget/forgecli.ForgeCli.yaml +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/__init__.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/conftest.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_auth.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_budget_context.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_build_pipeline.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_caching_observability.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_caveman_cli.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_caveman_ruleset.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_cli.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_commit.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_config.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_container.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_conversation_optimization.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_diagnostics.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_e2e.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_engine.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_forgegraph_client.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_graph.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_mcp_config.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_memory.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_middleware.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_negotiator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_optimizer.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_orchestrator.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_output_optimization.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_planner.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_planner_render.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_platform.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_policy.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_ponytail_cli.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_ponytail_ruleset.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_prompts.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_provider.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_providers.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_providers_http.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_redesign_optimizers.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_repository_graph.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_resilience.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_review.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_router.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_runtime.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_runtime_core.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_runtime_core_phase2.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_scheduler_plugins.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_software_planner.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_streaming.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_token_optimizations.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_transport.py +0 -0
- {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.3}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: forgeoptimizer
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
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
|
|
@@ -97,13 +97,16 @@ class PatchGenerator:
|
|
|
97
97
|
return path
|
|
98
98
|
|
|
99
99
|
# Fallback: scan root files for a filename match if only a base name was extracted
|
|
100
|
+
import os
|
|
101
|
+
skip_dirs = {".git", ".venv", "node_modules", "dist", "build", ".forge"}
|
|
100
102
|
for candidate in candidates:
|
|
101
103
|
base_name = Path(candidate).name
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
try:
|
|
105
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
106
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in skip_dirs)]
|
|
107
|
+
if base_name in filenames:
|
|
108
|
+
return Path(dirpath) / base_name
|
|
109
|
+
except OSError:
|
|
110
|
+
pass
|
|
108
111
|
|
|
109
112
|
return None
|
|
@@ -167,27 +167,24 @@ def stats_cmd() -> None:
|
|
|
167
167
|
|
|
168
168
|
|
|
169
169
|
try:
|
|
170
|
-
|
|
171
170
|
repo_root = resolve_repo_root(Path.cwd())
|
|
172
|
-
|
|
173
|
-
py_files = list(repo_root.rglob("*.py"))
|
|
174
|
-
|
|
175
|
-
all_files = list(repo_root.rglob("*"))
|
|
176
|
-
|
|
177
171
|
skip = {".git", ".venv", "node_modules", "__pycache__", "dist", "build", ".forge", "forgegraph-out"}
|
|
178
|
-
|
|
179
|
-
trackable = [
|
|
172
|
+
py_files = []
|
|
173
|
+
trackable = []
|
|
174
|
+
for dirpath, dirnames, filenames in os.walk(repo_root, topdown=True):
|
|
175
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in skip)]
|
|
176
|
+
for filename in filenames:
|
|
177
|
+
if not filename.startswith("."):
|
|
178
|
+
p = Path(dirpath) / filename
|
|
179
|
+
trackable.append(p)
|
|
180
|
+
if filename.endswith(".py"):
|
|
181
|
+
py_files.append(p)
|
|
180
182
|
|
|
181
183
|
console.print()
|
|
182
|
-
|
|
183
184
|
console.print(f" Repository : {repo_root.name}")
|
|
184
|
-
|
|
185
185
|
console.print(f" Python files : {len(py_files)}")
|
|
186
|
-
|
|
187
186
|
console.print(f" Total trackable : {len(trackable)}")
|
|
188
|
-
|
|
189
187
|
except Exception:
|
|
190
|
-
|
|
191
188
|
pass
|
|
192
189
|
|
|
193
190
|
|
|
@@ -114,27 +114,28 @@ watchers_lock = threading.Lock()
|
|
|
114
114
|
|
|
115
115
|
def get_recursive_fingerprint(root: Path) -> str:
|
|
116
116
|
"""Compute a signature of the repository based on file paths, modification times, and sizes."""
|
|
117
|
-
from forgecli.runtime.shared_extraction import
|
|
117
|
+
from forgecli.runtime.shared_extraction import _SKIP_DIRS
|
|
118
118
|
|
|
119
119
|
sig = hashlib.sha256()
|
|
120
120
|
sig.update(str(root.resolve()).encode("utf-8"))
|
|
121
121
|
|
|
122
122
|
try:
|
|
123
|
-
|
|
123
|
+
paths = []
|
|
124
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
125
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in _SKIP_DIRS)]
|
|
126
|
+
for filename in filenames:
|
|
127
|
+
if not filename.startswith("."):
|
|
128
|
+
paths.append(Path(dirpath) / filename)
|
|
129
|
+
paths.sort(key=lambda p: str(p))
|
|
130
|
+
for path in paths:
|
|
124
131
|
try:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if path.is_file() and not path.name.startswith("."):
|
|
129
|
-
stat = path.stat()
|
|
130
|
-
sig.update(f"{path.name}:{stat.st_mtime}:{stat.st_size}".encode())
|
|
131
|
-
except (ValueError, OSError):
|
|
132
|
+
stat = path.stat()
|
|
133
|
+
sig.update(f"{path.name}:{stat.st_mtime}:{stat.st_size}".encode())
|
|
134
|
+
except OSError:
|
|
132
135
|
continue
|
|
133
136
|
except OSError:
|
|
134
137
|
pass
|
|
135
138
|
|
|
136
|
-
|
|
137
|
-
|
|
138
139
|
return sig.hexdigest()[:24]
|
|
139
140
|
|
|
140
141
|
|
|
@@ -108,17 +108,15 @@ def _walk_nodes(root: Path) -> list[dict[str, object]]:
|
|
|
108
108
|
"""
|
|
109
109
|
|
|
110
110
|
nodes: list[dict[str, object]] = []
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
continue
|
|
121
|
-
|
|
111
|
+
import os
|
|
112
|
+
skip = {"__pycache__", "node_modules", ".venv", "venv"}
|
|
113
|
+
py_paths = []
|
|
114
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
115
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in skip)]
|
|
116
|
+
for filename in filenames:
|
|
117
|
+
if filename.endswith(".py") and not filename.startswith("."):
|
|
118
|
+
py_paths.append(Path(dirpath) / filename)
|
|
119
|
+
for path in sorted(py_paths):
|
|
122
120
|
rel = path.relative_to(root)
|
|
123
121
|
|
|
124
122
|
try:
|
|
@@ -955,19 +955,16 @@ class DocsWorkflow(Workflow):
|
|
|
955
955
|
|
|
956
956
|
|
|
957
957
|
root = context.app_context.cwd
|
|
958
|
-
|
|
959
958
|
files_info = []
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
continue
|
|
970
|
-
|
|
959
|
+
import os
|
|
960
|
+
skip = {"__pycache__", "node_modules", ".venv", "venv"}
|
|
961
|
+
py_paths = []
|
|
962
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
963
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in skip)]
|
|
964
|
+
for filename in filenames:
|
|
965
|
+
if filename.endswith(".py") and not filename.startswith("."):
|
|
966
|
+
py_paths.append(Path(dirpath) / filename)
|
|
967
|
+
for path in sorted(py_paths):
|
|
971
968
|
files_info.append(str(path.relative_to(root)))
|
|
972
969
|
|
|
973
970
|
|
|
@@ -162,20 +162,21 @@ class AnalysisContext:
|
|
|
162
162
|
|
|
163
163
|
return cls(root=root, files=files)
|
|
164
164
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
165
|
+
import os
|
|
166
|
+
paths = []
|
|
167
|
+
try:
|
|
168
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
169
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in ignore_set)]
|
|
170
|
+
for filename in filenames:
|
|
171
|
+
if filename in ignore_set:
|
|
172
|
+
continue
|
|
173
|
+
p = Path(dirpath) / filename
|
|
174
|
+
if p.suffix.lower() in extensions:
|
|
175
|
+
paths.append(p)
|
|
176
|
+
except OSError:
|
|
177
|
+
pass
|
|
178
178
|
|
|
179
|
+
for path in sorted(paths):
|
|
179
180
|
files.append(SourceFile.load(path))
|
|
180
181
|
|
|
181
182
|
return cls(root=root, files=files)
|
|
@@ -379,6 +379,11 @@ def configure_project_local_mcp(repo_root: Path) -> None:
|
|
|
379
379
|
|
|
380
380
|
"""Create a project-local .mcp.json for tools that support auto-discovery."""
|
|
381
381
|
|
|
382
|
+
# Never create a project-local .mcp.json in the user's home or system root directory
|
|
383
|
+
resolved = repo_root.resolve()
|
|
384
|
+
if resolved == Path.home().resolve() or resolved == Path("/").resolve():
|
|
385
|
+
return
|
|
386
|
+
|
|
382
387
|
_write_json_mcp(repo_root / ".mcp.json", "mcpServers")
|
|
383
388
|
|
|
384
389
|
|
|
@@ -6,6 +6,7 @@ All other implementations (middleware defaults, inline daemon parsers) must dele
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
+
import os
|
|
9
10
|
import re
|
|
10
11
|
from collections.abc import Iterable
|
|
11
12
|
from concurrent.futures import ThreadPoolExecutor
|
|
@@ -40,15 +41,11 @@ def should_skip(parts: tuple[str, ...]) -> bool:
|
|
|
40
41
|
def iter_trackable_files(root: Path) -> Iterable[Path]:
|
|
41
42
|
root = root.resolve()
|
|
42
43
|
try:
|
|
43
|
-
for
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if
|
|
47
|
-
|
|
48
|
-
if p.is_file() and not p.name.startswith("."):
|
|
49
|
-
yield p
|
|
50
|
-
except (ValueError, OSError):
|
|
51
|
-
continue
|
|
44
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
45
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in _SKIP_DIRS)]
|
|
46
|
+
for filename in filenames:
|
|
47
|
+
if not filename.startswith("."):
|
|
48
|
+
yield Path(dirpath) / filename
|
|
52
49
|
except OSError:
|
|
53
50
|
return
|
|
54
51
|
|
|
@@ -134,23 +131,24 @@ def extract_files(root: Path) -> list[dict[str, Any]]:
|
|
|
134
131
|
root = root.resolve()
|
|
135
132
|
files: list[dict[str, Any]] = []
|
|
136
133
|
try:
|
|
137
|
-
for
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
134
|
+
for dirpath, dirnames, filenames in os.walk(root, topdown=True):
|
|
135
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in _SKIP_DIRS)]
|
|
136
|
+
for filename in filenames:
|
|
137
|
+
if not filename.startswith("."):
|
|
138
|
+
p = Path(dirpath) / filename
|
|
139
|
+
try:
|
|
140
|
+
stat = p.stat()
|
|
141
|
+
files.append({
|
|
142
|
+
"name": filename,
|
|
143
|
+
"path": str(p.relative_to(root)),
|
|
144
|
+
"size_bytes": stat.st_size,
|
|
145
|
+
"mtime": stat.st_mtime,
|
|
146
|
+
})
|
|
147
|
+
except OSError:
|
|
148
|
+
continue
|
|
152
149
|
except OSError:
|
|
153
150
|
pass
|
|
151
|
+
files.sort(key=lambda x: x["path"])
|
|
154
152
|
return files
|
|
155
153
|
|
|
156
154
|
|
|
@@ -208,26 +208,18 @@ def has_supported_source_files(path: Path) -> bool:
|
|
|
208
208
|
}
|
|
209
209
|
|
|
210
210
|
if not path.exists() or not path.is_dir():
|
|
211
|
-
|
|
212
211
|
return False
|
|
213
212
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if p.is_file() and not p.name.startswith(".") and p.suffix.lower() in supported_exts:
|
|
225
|
-
|
|
226
|
-
return True
|
|
227
|
-
|
|
228
|
-
except ValueError:
|
|
229
|
-
|
|
230
|
-
continue
|
|
213
|
+
try:
|
|
214
|
+
for _, dirnames, filenames in os.walk(path, topdown=True):
|
|
215
|
+
dirnames[:] = [d for d in dirnames if not (d.startswith(".") or d in ignored_dirs)]
|
|
216
|
+
for filename in filenames:
|
|
217
|
+
if not filename.startswith("."):
|
|
218
|
+
suffix = Path(filename).suffix.lower()
|
|
219
|
+
if suffix in supported_exts:
|
|
220
|
+
return True
|
|
221
|
+
except OSError:
|
|
222
|
+
pass
|
|
231
223
|
|
|
232
224
|
return False
|
|
233
225
|
|
|
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.1 → forgeoptimizer-1.0.3}/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
|