forgeoptimizer 1.0.0__tar.gz → 1.0.2__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.0 → forgeoptimizer-1.0.2}/.github/workflows/ci.yml +0 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/.gitignore +14 -1
- forgeoptimizer-1.0.2/CHANGELOG.md +27 -0
- forgeoptimizer-1.0.2/CONTRIBUTING.md +107 -0
- forgeoptimizer-1.0.2/CREDITS.md +19 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/Forge.toml +1 -1
- forgeoptimizer-1.0.2/MIGRATION.md +40 -0
- forgeoptimizer-1.0.2/PKG-INFO +199 -0
- forgeoptimizer-1.0.2/README.md +149 -0
- forgeoptimizer-1.0.2/RELEASE_NOTES.md +52 -0
- forgeoptimizer-1.0.2/SECURITY.md +42 -0
- forgeoptimizer-1.0.2/SUPPORT.md +32 -0
- forgeoptimizer-1.0.2/docs/commands.md +102 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/__init__.py +5 -1
- forgeoptimizer-1.0.2/forgecli/budget/__init__.py +20 -0
- forgeoptimizer-1.0.2/forgecli/budget/middleware.py +134 -0
- forgeoptimizer-1.0.2/forgecli/budget/planner.py +102 -0
- forgeoptimizer-1.0.2/forgecli/budget/window.py +89 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/__init__.py +131 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/apply.py +213 -7
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/caveman_optimize.py +33 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/diff_extract.py +203 -12
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/llm.py +168 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/optimize.py +33 -2
- forgeoptimizer-1.0.2/forgecli/build/patch_generator.py +112 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/pipeline.py +79 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/retrieval.py +148 -4
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/summarize.py +73 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/build/test_run.py +107 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/builder/__init__.py +7 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/builder/builder.py +42 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/builder/editor.py +26 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/builder/formatter.py +18 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/cli/__init__.py +3 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/cli/bootstrap.py +219 -6
- forgeoptimizer-1.0.2/forgecli/cli/commands_auth.py +112 -0
- forgeoptimizer-1.0.2/forgecli/cli/commands_commit.py +122 -0
- forgeoptimizer-1.0.2/forgecli/cli/commands_diagnostics.py +857 -0
- forgeoptimizer-1.0.2/forgecli/cli/commands_graph.py +282 -0
- forgeoptimizer-1.0.2/forgecli/cli/commands_inspect.py +404 -0
- forgeoptimizer-1.0.2/forgecli/cli/commands_wrappers.py +66 -0
- forgeoptimizer-1.0.2/forgecli/cli/daemon.py +1128 -0
- forgeoptimizer-1.0.2/forgecli/cli/daemon_utils.py +53 -0
- forgeoptimizer-1.0.2/forgecli/cli/main.py +493 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/cli/ui.py +50 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/config/__init__.py +19 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/config/loader.py +77 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/config/settings.py +237 -8
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/config/writer.py +132 -4
- forgeoptimizer-1.0.2/forgecli/conversation/__init__.py +11 -0
- forgeoptimizer-1.0.2/forgecli/conversation/manager.py +198 -0
- forgeoptimizer-1.0.2/forgecli/conversation/session.py +53 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/__init__.py +20 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/container.py +55 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/context.py +38 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/credentials.py +98 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/errors.py +24 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/events.py +53 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/logging.py +42 -1
- forgeoptimizer-1.0.2/forgecli/core/models.py +423 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/plugins.py +39 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/core/service.py +17 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/docs/__init__.py +3 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/docs/generator.py +95 -21
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/__init__.py +39 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/context.py +150 -32
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/defaults.py +39 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/events.py +174 -21
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/execution.py +463 -42
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/plugins.py +120 -13
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/runner.py +136 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/__init__.py +13 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/caveman_optimizer.py +33 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/context_optimizer.py +30 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/execution_engine_stage.py +89 -10
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/git_engine.py +21 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/intent_analyzer.py +25 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/model_router.py +53 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/planning_engine.py +35 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/repository_analyzer.py +40 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/engine/stages/validation_engine.py +71 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/git/__init__.py +6 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/git/repo.py +44 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/git/service.py +34 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/graph/__init__.py +40 -16
- forgeoptimizer-1.0.0/forgecli/graph/backend_graphify.py → forgeoptimizer-1.0.2/forgecli/graph/backend_forgegraph.py +494 -63
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/graph/edge.py +11 -0
- forgeoptimizer-1.0.2/forgecli/graph/forgegraph.py +845 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/graph/graph.py +72 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/graph/indexer.py +62 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/graph/node.py +40 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/graph/repository.py +152 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/memory/__init__.py +9 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/memory/cache.py +51 -1
- forgeoptimizer-1.0.2/forgecli/memory/caching_middleware.py +157 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/memory/history.py +97 -3
- forgeoptimizer-1.0.2/forgecli/memory/memory_compression.py +162 -0
- forgeoptimizer-1.0.2/forgecli/memory/middleware.py +120 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/memory/store.py +69 -5
- forgeoptimizer-1.0.2/forgecli/middleware/__init__.py +85 -0
- forgeoptimizer-1.0.2/forgecli/middleware/base.py +207 -0
- forgeoptimizer-1.0.2/forgecli/middleware/builder.py +74 -0
- forgeoptimizer-1.0.2/forgecli/middleware/caveman_adapter.py +140 -0
- forgeoptimizer-1.0.2/forgecli/middleware/context.py +20 -0
- forgeoptimizer-1.0.2/forgecli/middleware/decorators.py +53 -0
- forgeoptimizer-1.0.2/forgecli/middleware/defaults.py +951 -0
- forgeoptimizer-1.0.2/forgecli/middleware/exceptions.py +70 -0
- forgeoptimizer-1.0.2/forgecli/middleware/executor.py +119 -0
- forgeoptimizer-1.0.2/forgecli/middleware/graphify_adapter.py +169 -0
- forgeoptimizer-1.0.2/forgecli/middleware/middleware_manager.py +239 -0
- forgeoptimizer-1.0.2/forgecli/middleware/pipeline.py +326 -0
- forgeoptimizer-1.0.2/forgecli/middleware/ponytail_adapter.py +140 -0
- forgeoptimizer-1.0.2/forgecli/middleware/registration.py +99 -0
- forgeoptimizer-1.0.2/forgecli/middleware/request.py +115 -0
- forgeoptimizer-1.0.2/forgecli/middleware/response.py +100 -0
- forgeoptimizer-1.0.2/forgecli/negotiator/__init__.py +11 -0
- forgeoptimizer-1.0.2/forgecli/negotiator/middleware.py +168 -0
- forgeoptimizer-1.0.2/forgecli/negotiator/negotiator.py +183 -0
- forgeoptimizer-1.0.2/forgecli/observability/__init__.py +23 -0
- forgeoptimizer-1.0.2/forgecli/observability/health.py +97 -0
- forgeoptimizer-1.0.2/forgecli/observability/metrics.py +189 -0
- forgeoptimizer-1.0.2/forgecli/observability/middleware.py +115 -0
- forgeoptimizer-1.0.2/forgecli/observability/tracing.py +100 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/__init__.py +7 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/adaptive_budget.py +127 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/ast_extractor.py +707 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/cache.py +208 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/__init__.py +6 -11
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/cli.py +40 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/decorator.py +44 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/factory.py +33 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/ruleset.py +148 -25
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/state.py +40 -4
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/chunker.py +73 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/comment_stripper.py +293 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/compression.py +365 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/cost_estimator.py +122 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/embedding_cache.py +139 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/git_context.py +206 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/intelligent_retrieval.py +277 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/optimizer.py +71 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/orchestrator.py +256 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/output/__init__.py +10 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/output/optimizer.py +509 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/__init__.py +4 -6
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/cli.py +133 -14
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/decorator.py +50 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/factory.py +33 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/ruleset.py +132 -6
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/state.py +40 -4
- forgeoptimizer-1.0.2/forgecli/optimizer/prompt_optimizer.py +154 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/quality_validation.py +115 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/ranker.py +25 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/retrieval_cache.py +120 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/semantic_ranking.py +86 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/optimizer/summarizer.py +32 -0
- forgeoptimizer-1.0.2/forgecli/optimizer/token_estimator.py +117 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/orchestrator/__init__.py +690 -59
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/__init__.py +31 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/agent.py +46 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/plan.py +56 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/planner.py +10 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/render.py +251 -9
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/serialize.py +98 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/planner/software.py +818 -23
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/platform/__init__.py +37 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/platform/core.py +182 -13
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/platform/deps.py +397 -44
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/platform/paths.py +204 -18
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/platform/shell.py +133 -5
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/platform/update.py +211 -4
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/plugins/__init__.py +200 -20
- forgeoptimizer-1.0.2/forgecli/plugins/hook.py +109 -0
- forgeoptimizer-1.0.2/forgecli/policy/__init__.py +30 -0
- forgeoptimizer-1.0.2/forgecli/policy/engine.py +94 -0
- forgeoptimizer-1.0.2/forgecli/policy/exceptions.py +28 -0
- forgeoptimizer-1.0.2/forgecli/policy/middleware.py +69 -0
- forgeoptimizer-1.0.2/forgecli/policy/rules.py +265 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/prompts/__init__.py +7 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/prompts/loader.py +21 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/prompts/registry.py +25 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/prompts/renderer.py +13 -0
- forgeoptimizer-1.0.2/forgecli/providers/__init__.py +126 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/anthropic.py +217 -14
- forgeoptimizer-1.0.2/forgecli/providers/base.py +1194 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/builtin.py +11 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/conversation.py +72 -6
- forgeoptimizer-1.0.2/forgecli/providers/exceptions.py +68 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/google.py +288 -35
- forgeoptimizer-1.0.2/forgecli/providers/health.py +44 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/http_base.py +231 -28
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/mock.py +92 -6
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/openai.py +192 -10
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/openai_compatible.py +894 -67
- forgeoptimizer-1.0.2/forgecli/providers/provider_capabilities.py +96 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_context.py +45 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_events.py +129 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_factory.py +165 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_manager.py +167 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_metadata.py +25 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_registry.py +183 -0
- forgeoptimizer-1.0.2/forgecli/providers/provider_router.py +252 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/router.py +334 -35
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/providers/router_state.py +74 -0
- forgeoptimizer-1.0.2/forgecli/registry/__init__.py +10 -0
- forgeoptimizer-1.0.2/forgecli/registry/model_registry.py +317 -0
- forgeoptimizer-1.0.2/forgecli/resilience/__init__.py +33 -0
- forgeoptimizer-1.0.2/forgecli/resilience/circuit_breaker.py +149 -0
- forgeoptimizer-1.0.2/forgecli/resilience/exceptions.py +49 -0
- forgeoptimizer-1.0.2/forgecli/resilience/middleware.py +110 -0
- forgeoptimizer-1.0.2/forgecli/resilience/retry.py +115 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/__init__.py +24 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzer.py +116 -9
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/__init__.py +1 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/architecture.py +238 -13
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/complexity.py +148 -10
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/dead_code.py +238 -15
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/duplicates.py +152 -16
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/performance.py +138 -6
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/security.py +232 -16
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/finding.py +56 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/report.py +332 -19
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/repository.py +111 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/review/suggestions.py +83 -1
- forgeoptimizer-1.0.2/forgecli/runtime/__init__.py +10 -0
- forgeoptimizer-1.0.2/forgecli/runtime/agents.py +220 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/runtime/cache_store.py +66 -3
- forgeoptimizer-1.0.2/forgecli/runtime/mcp_config.py +397 -0
- forgeoptimizer-1.0.2/forgecli/runtime/pipeline_runner.py +306 -0
- forgeoptimizer-1.0.2/forgecli/runtime/prepare.py +249 -0
- forgeoptimizer-1.0.2/forgecli/runtime/shared_extraction.py +175 -0
- forgeoptimizer-1.0.2/forgecli/runtime/wrappers.py +98 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/__init__.py +104 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/config_manager.py +245 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/container.py +458 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/context.py +268 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/errors.py +95 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/events.py +213 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/factory.py +51 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/interfaces.py +188 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/lifecycle.py +275 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/provider_registry.py +190 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/request.py +184 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/response.py +158 -0
- forgeoptimizer-1.0.2/forgecli/runtime_core/service_registry.py +269 -0
- forgeoptimizer-1.0.2/forgecli/scheduler/__init__.py +22 -0
- forgeoptimizer-1.0.2/forgecli/scheduler/scheduler.py +143 -0
- forgeoptimizer-1.0.2/forgecli/scheduler/task.py +30 -0
- forgeoptimizer-1.0.2/forgecli/scheduler/worker.py +127 -0
- forgeoptimizer-1.0.2/forgecli/streaming/__init__.py +20 -0
- forgeoptimizer-1.0.2/forgecli/streaming/events.py +63 -0
- forgeoptimizer-1.0.2/forgecli/streaming/middleware.py +155 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/templates/__init__.py +6 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/templates/engine.py +29 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/templates/registry.py +25 -0
- forgeoptimizer-1.0.2/forgecli/transport/__init__.py +18 -0
- forgeoptimizer-1.0.2/forgecli/transport/daemon.py +80 -0
- forgeoptimizer-1.0.2/forgecli/transport/http_server.py +99 -0
- forgeoptimizer-1.0.2/forgecli/transport/server.py +53 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/utils/__init__.py +13 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/utils/fs.py +147 -13
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/utils/ids.py +6 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/utils/io.py +19 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/utils/paths.py +78 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/forgecli/utils/timing.py +11 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/packaging/scoop/forgecli.json +2 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/packaging/winget/forgecli.ForgeCli.yaml +3 -3
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/pyproject.toml +10 -7
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/__init__.py +1 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/conftest.py +42 -0
- forgeoptimizer-1.0.2/tests/test_auth.py +110 -0
- forgeoptimizer-1.0.2/tests/test_budget_context.py +239 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_build_pipeline.py +445 -52
- forgeoptimizer-1.0.2/tests/test_caching_observability.py +405 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_caveman_cli.py +115 -9
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_caveman_ruleset.py +187 -2
- forgeoptimizer-1.0.2/tests/test_cli.py +554 -0
- forgeoptimizer-1.0.2/tests/test_commit.py +173 -0
- forgeoptimizer-1.0.2/tests/test_config.py +216 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_container.py +46 -0
- forgeoptimizer-1.0.2/tests/test_conversation_optimization.py +488 -0
- forgeoptimizer-1.0.2/tests/test_diagnostics.py +65 -0
- forgeoptimizer-1.0.2/tests/test_e2e.py +578 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_engine.py +465 -87
- forgeoptimizer-1.0.0/tests/test_graphify_client.py → forgeoptimizer-1.0.2/tests/test_forgegraph_client.py +195 -35
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_graph.py +34 -0
- forgeoptimizer-1.0.2/tests/test_mcp_config.py +402 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_memory.py +42 -2
- forgeoptimizer-1.0.2/tests/test_middleware.py +1320 -0
- forgeoptimizer-1.0.2/tests/test_negotiator.py +405 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_optimizer.py +44 -2
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_orchestrator.py +320 -36
- forgeoptimizer-1.0.2/tests/test_output_optimization.py +211 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_planner.py +41 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_planner_render.py +112 -4
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_platform.py +391 -42
- forgeoptimizer-1.0.2/tests/test_policy.py +355 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_ponytail_cli.py +202 -17
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_ponytail_ruleset.py +176 -1
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_prompts.py +12 -0
- forgeoptimizer-1.0.2/tests/test_provider.py +873 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_providers.py +82 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_providers_http.py +273 -19
- forgeoptimizer-1.0.2/tests/test_redesign_optimizers.py +239 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_repository_graph.py +159 -27
- forgeoptimizer-1.0.2/tests/test_resilience.py +245 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_review.py +398 -39
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_router.py +152 -6
- forgeoptimizer-1.0.2/tests/test_runtime.py +225 -0
- forgeoptimizer-1.0.2/tests/test_runtime_core.py +504 -0
- forgeoptimizer-1.0.2/tests/test_runtime_core_phase2.py +1209 -0
- forgeoptimizer-1.0.2/tests/test_scheduler_plugins.py +176 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_software_planner.py +181 -16
- forgeoptimizer-1.0.2/tests/test_streaming.py +202 -0
- forgeoptimizer-1.0.2/tests/test_token_optimizations.py +185 -0
- forgeoptimizer-1.0.2/tests/test_transport.py +125 -0
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/tests/test_utils.py +59 -4
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/uv.lock +282 -2
- forgeoptimizer-1.0.0/PKG-INFO +0 -169
- forgeoptimizer-1.0.0/README.md +0 -100
- forgeoptimizer-1.0.0/forgecli/cli/commands_graph.py +0 -137
- forgeoptimizer-1.0.0/forgecli/cli/commands_wrappers.py +0 -63
- forgeoptimizer-1.0.0/forgecli/cli/main.py +0 -122
- forgeoptimizer-1.0.0/forgecli/core/models.py +0 -159
- forgeoptimizer-1.0.0/forgecli/graph/graphify.py +0 -412
- forgeoptimizer-1.0.0/forgecli/providers/__init__.py +0 -39
- forgeoptimizer-1.0.0/forgecli/providers/base.py +0 -206
- forgeoptimizer-1.0.0/forgecli/runtime/__init__.py +0 -6
- forgeoptimizer-1.0.0/forgecli/runtime/prepare.py +0 -199
- forgeoptimizer-1.0.0/forgecli/runtime/wrappers.py +0 -152
- forgeoptimizer-1.0.0/forgecli/sdk/__init__.py +0 -132
- forgeoptimizer-1.0.0/forgecli/sdk/events.py +0 -206
- forgeoptimizer-1.0.0/forgecli/sdk/interfaces.py +0 -282
- forgeoptimizer-1.0.0/forgecli/sdk/loader.py +0 -243
- forgeoptimizer-1.0.0/forgecli/sdk/manager.py +0 -693
- forgeoptimizer-1.0.0/forgecli/sdk/manifest.py +0 -397
- forgeoptimizer-1.0.0/forgecli/sdk/sandbox.py +0 -197
- forgeoptimizer-1.0.0/forgecli/sdk/version.py +0 -316
- forgeoptimizer-1.0.0/forgecli.toml +0 -1
- forgeoptimizer-1.0.0/tests/test_cli.py +0 -127
- forgeoptimizer-1.0.0/tests/test_config.py +0 -36
- forgeoptimizer-1.0.0/tests/test_runtime.py +0 -58
- forgeoptimizer-1.0.0/tests/test_sdk.py +0 -581
- {forgeoptimizer-1.0.0 → forgeoptimizer-1.0.2}/LICENSE +0 -0
|
@@ -8,7 +8,7 @@ __pycache__/
|
|
|
8
8
|
|
|
9
9
|
# Distribution / packaging
|
|
10
10
|
build/
|
|
11
|
-
|
|
11
|
+
forgegraph-out/
|
|
12
12
|
dist/
|
|
13
13
|
*.egg-info/
|
|
14
14
|
*.egg
|
|
@@ -49,3 +49,16 @@ htmlcov/
|
|
|
49
49
|
# Test artifacts (prevent CI failures)
|
|
50
50
|
foo.py
|
|
51
51
|
main.go
|
|
52
|
+
|
|
53
|
+
# Forge local configurations & editor integration settings
|
|
54
|
+
forgecli.toml
|
|
55
|
+
.cursor/
|
|
56
|
+
.mcp.json
|
|
57
|
+
.agents/
|
|
58
|
+
|
|
59
|
+
# Frontend build and dependencies
|
|
60
|
+
**/node_modules/
|
|
61
|
+
**/.next/
|
|
62
|
+
**/out/
|
|
63
|
+
**/dist/
|
|
64
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.0 (2024-07-09)
|
|
4
|
+
|
|
5
|
+
### Forge v1.0 — Initial Production Release
|
|
6
|
+
|
|
7
|
+
Forge is a lightweight, high-performance AI optimization runtime that prepares repository-aware context before launching supported AI coding tools.
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- **8 AI CLI Wrappers**: Unified launch for Claude Code, Codex CLI, Cursor CLI, Antigravity, Gemini CLI, Aider, OpenCode, and CommandCode through a single `launch_wrapper()` path.
|
|
12
|
+
- **19-Stage Middleware Pipeline**: Telemetry → Auth → Policy → Cache → History → Token → Context → Conversation → Caveman → Ponytail → Repository → DepGraph → SymbolLookup → Graphify → SemanticRetrieval → Streaming → Resilience → Provider → ResponseOptimizer.
|
|
13
|
+
- **Optimization Profiles**: Ponytail (prompt YAGNI rules), Caveman (output conciseness), and Output Optimization with `off/lite/full/ultra/wenyan` intensities.
|
|
14
|
+
- **ForgeGraph Integration**: Knowledge graph generation for intelligent context retrieval with `forge graph build`.
|
|
15
|
+
- **MCP Server**: Stdio Model Context Protocol server with 6 tools (`get_optimized_context`, `get_summary`, `get_dependency_graph`, `file_lookup`, `symbol_lookup`, `semantic_search`).
|
|
16
|
+
- **Background Daemon**: Repository watcher with auto-refresh, chunking, and graph snapshot on port 16868.
|
|
17
|
+
- **16 Provider Drivers**: OpenAI, Anthropic, Google Gemini, OpenRouter, Groq, Mistral, DeepSeek, GLM, Qwen, Kimi, Ollama, LM Studio, and more — with real HTTP implementations for the big three.
|
|
18
|
+
- **Developer Diagnostics**: `forge inspect`, `forge stats`, `forge doctor`, `forge profile`, `forge explain`.
|
|
19
|
+
- **Configuration**: TOML-based `forgecli.toml` with environment variable override for all settings.
|
|
20
|
+
- **Packaging**: pip install, CI/CD across ubuntu/macos/windows, PyPI ready.
|
|
21
|
+
|
|
22
|
+
### System
|
|
23
|
+
|
|
24
|
+
- Python 3.12+ required
|
|
25
|
+
- 463+ tests passing
|
|
26
|
+
- 40% faster startup vs initial implementation (0.63s CLI import)
|
|
27
|
+
- MIT License
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Contributing to Forge
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to **Forge**! Forge is a lightweight, high-performance AI optimization runtime designed to prepare repository-aware context before launching supported AI coding tools.
|
|
4
|
+
|
|
5
|
+
This document outlines the guidelines and best practices for contributing to the codebase.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Code of Conduct
|
|
10
|
+
|
|
11
|
+
We expect all contributors to adhere to standard respectful community interactions. Be kind, helpful, and professional in all communications.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Getting Started
|
|
16
|
+
|
|
17
|
+
### Prerequisites
|
|
18
|
+
- **Python 3.12** or higher.
|
|
19
|
+
- [uv](https://github.com/astral-sh/uv) (recommended) or `pip` + `venv`.
|
|
20
|
+
|
|
21
|
+
### Local Development Setup
|
|
22
|
+
|
|
23
|
+
1. **Fork and Clone the Repository**
|
|
24
|
+
```bash
|
|
25
|
+
git clone https://github.com/mdshzb04/Forge.git
|
|
26
|
+
cd Forge
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. **Create and Activate a Virtual Environment**
|
|
30
|
+
Using `uv` (recommended):
|
|
31
|
+
```bash
|
|
32
|
+
uv venv
|
|
33
|
+
source .venv/bin/activate
|
|
34
|
+
```
|
|
35
|
+
Or using standard Python:
|
|
36
|
+
```bash
|
|
37
|
+
python -m venv .venv
|
|
38
|
+
source .venv/bin/activate
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
3. **Install Dependencies**
|
|
42
|
+
Install Forge in editable mode with development dependencies:
|
|
43
|
+
```bash
|
|
44
|
+
pip install -e ".[dev]"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Development Workflow
|
|
50
|
+
|
|
51
|
+
### Running Tests
|
|
52
|
+
|
|
53
|
+
We use `pytest` for all unit and integration testing. Ensure your tests pass before submitting any pull requests.
|
|
54
|
+
|
|
55
|
+
To run the full test suite:
|
|
56
|
+
```bash
|
|
57
|
+
pytest
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
To run a specific test file:
|
|
61
|
+
```bash
|
|
62
|
+
pytest tests/test_mcp_config.py
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Code Quality & Styling
|
|
66
|
+
|
|
67
|
+
We use **Ruff** for linting, formatting, and import sorting.
|
|
68
|
+
|
|
69
|
+
To check for style violations:
|
|
70
|
+
```bash
|
|
71
|
+
ruff check forgecli tests
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
To automatically fix violations and format code:
|
|
75
|
+
```bash
|
|
76
|
+
ruff check --fix forgecli tests
|
|
77
|
+
ruff format forgecli tests
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Static Type Checking
|
|
81
|
+
|
|
82
|
+
We use **mypy** for static type verification:
|
|
83
|
+
```bash
|
|
84
|
+
mypy forgecli
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Code Architecture
|
|
90
|
+
|
|
91
|
+
Forge consists of two main pillars:
|
|
92
|
+
1. **`forgecli.runtime`**: Orchestrates runtime environments, command wrappers, daemon processing, and MCP standard input/output configurations.
|
|
93
|
+
2. **`forgecli.optimizer`**: Contains token compression, Ponytail (YAGNI pruning rules), and Caveman (brevity prompts) components.
|
|
94
|
+
|
|
95
|
+
Ensure any changes respect this separation of concerns.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Pull Request Guidelines
|
|
100
|
+
|
|
101
|
+
1. **Branch Naming**: Use descriptive branch names (e.g., `feature/optimize-caching`, `bugfix/fix-toml-regex`).
|
|
102
|
+
2. **Commit Messages**: Write clear, descriptive commit messages in the imperative mood (e.g., `Fix TOML config regex to correctly match blocks`).
|
|
103
|
+
3. **Add Tests**: If you are adding a new feature or fixing a bug, please write corresponding tests in the `tests/` directory.
|
|
104
|
+
4. **Documentation**: Update the `README.md`, `docs/`, or docstrings if your changes modify any public-facing behaviors or flags.
|
|
105
|
+
5. **CI Compliance**: Ensure the Github Actions CI build passes.
|
|
106
|
+
|
|
107
|
+
Thank you for making Forge better for everyone! 🚀
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Acknowledgements & Credits
|
|
2
|
+
|
|
3
|
+
Forge draws inspiration from, and implements custom versions of ideas from, several excellent open-source projects and concepts in the AI developer tooling ecosystem. We would like to thank their authors and communities:
|
|
4
|
+
|
|
5
|
+
* **Graphify**
|
|
6
|
+
* **Contribution:** Inspired ideas around repository-aware knowledge graph generation and parsing to help AI engines navigate codebase structures.
|
|
7
|
+
* **License:** Licensed under the MIT License.
|
|
8
|
+
|
|
9
|
+
* **Caveman** (by Julius Brussee)
|
|
10
|
+
* **Original Project:** [github.com/JuliusBrussee/caveman](https://github.com/JuliusBrussee/caveman)
|
|
11
|
+
* **Contribution:** Inspired the concept of system-prompt communication compression and brevity constraints to reduce completion token sizes.
|
|
12
|
+
* **License:** Licensed under the MIT License.
|
|
13
|
+
|
|
14
|
+
* **Ponytail**
|
|
15
|
+
* **Contribution:** Inspired the implementation of the pragmatic YAGNI ("You Ain't Gonna Need It") prompt ruleset for code simplification.
|
|
16
|
+
* **License:** Licensed under the MIT License.
|
|
17
|
+
|
|
18
|
+
Forge adapts these open-source prompt optimization concepts into its own custom Python-based rulesets, combining them with original runtime infrastructure, background caching daemons, and IDE wrappers to provide a seamless context experience.
|
|
19
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Migration Guide
|
|
2
|
+
|
|
3
|
+
## From Pre-1.0 to v1.0.0
|
|
4
|
+
|
|
5
|
+
Forge v1.0.0 is the first production release. If you were using earlier development versions, the following changes apply:
|
|
6
|
+
|
|
7
|
+
### CLI Changes
|
|
8
|
+
|
|
9
|
+
All wrapper commands remain identical:
|
|
10
|
+
```bash
|
|
11
|
+
forge claude # unchanged
|
|
12
|
+
forge codex # unchanged
|
|
13
|
+
forge cursor # unchanged
|
|
14
|
+
forge antigravity # unchanged
|
|
15
|
+
forge aider # unchanged
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**New wrappers added**:
|
|
19
|
+
```bash
|
|
20
|
+
forge opencode # new
|
|
21
|
+
forge commandcode # new
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**New commands**: `forge stats`, `forge profile`, `forge explain`, `forge inspect`
|
|
25
|
+
|
|
26
|
+
### Python API
|
|
27
|
+
|
|
28
|
+
The following internal functions were renamed but backward-compatible aliases exist:
|
|
29
|
+
|
|
30
|
+
- `build_merged_context(repack_context, restart_root)` — new unified entry point
|
|
31
|
+
- `get_merged_context(repo_context)` — still available as deprecated alias
|
|
32
|
+
- `build_behavior_instructions()` — still available as deprecated alias
|
|
33
|
+
|
|
34
|
+
### Configuration
|
|
35
|
+
|
|
36
|
+
No changes to `forgecli.toml` format. All existing configuration files work without modification.
|
|
37
|
+
|
|
38
|
+
### Provider System
|
|
39
|
+
|
|
40
|
+
No breaking changes. The same `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, and `GOOGLE_API_KEY` environment variables are used.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: forgeoptimizer
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Forge — AI optimization runtime for Claude Code, Codex, Cursor, Antigravity
|
|
5
|
+
Project-URL: Homepage, https://github.com/mdshzb04/Forge
|
|
6
|
+
Project-URL: Repository, https://github.com/mdshzb04/Forge
|
|
7
|
+
Project-URL: Documentation, https://github.com/mdshzb04/Forge#readme
|
|
8
|
+
Project-URL: Issues, https://github.com/mdshzb04/Forge/issues
|
|
9
|
+
Author: Forge Authors
|
|
10
|
+
License: MIT
|
|
11
|
+
Keywords: ai,claude,cli,codex,cursor,developer-tools
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development
|
|
21
|
+
Requires-Python: >=3.12
|
|
22
|
+
Requires-Dist: aiofiles>=23.2.1
|
|
23
|
+
Requires-Dist: click>=8.1.7
|
|
24
|
+
Requires-Dist: cryptography>=42.0.5
|
|
25
|
+
Requires-Dist: fastapi>=0.100.0
|
|
26
|
+
Requires-Dist: gitpython>=3.1.42
|
|
27
|
+
Requires-Dist: httpx>=0.27.0
|
|
28
|
+
Requires-Dist: keyring>=25.2.0
|
|
29
|
+
Requires-Dist: platformdirs>=4.2.0
|
|
30
|
+
Requires-Dist: pydantic-settings>=2.2.0
|
|
31
|
+
Requires-Dist: pydantic>=2.6.0
|
|
32
|
+
Requires-Dist: pyyaml>=6.0
|
|
33
|
+
Requires-Dist: rich>=13.7.0
|
|
34
|
+
Requires-Dist: tree-sitter-languages>=1.10.0
|
|
35
|
+
Requires-Dist: tree-sitter>=0.21.0
|
|
36
|
+
Requires-Dist: typer>=0.12.0
|
|
37
|
+
Requires-Dist: uvicorn>=0.20.0
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: build>=1.0.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: mypy>=1.10.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: pytest-timeout>=2.3.0; extra == 'dev'
|
|
44
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
45
|
+
Requires-Dist: respx>=0.21.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: twine>=5.0.0; extra == 'dev'
|
|
48
|
+
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
49
|
+
Description-Content-Type: text/markdown
|
|
50
|
+
|
|
51
|
+
# Forge
|
|
52
|
+
|
|
53
|
+
<p align="center">
|
|
54
|
+
<a href="https://github.com/mdshzb04/Forge/actions/workflows/ci.yml">
|
|
55
|
+
<img src="https://github.com/mdshzb04/Forge/actions/workflows/ci.yml/badge.svg" alt="CI Status">
|
|
56
|
+
</a>
|
|
57
|
+
<a href="https://pypi.org/project/forgeoptimizer/">
|
|
58
|
+
<img src="https://img.shields.io/pypi/v/forgeoptimizer.svg" alt="PyPI Version">
|
|
59
|
+
</a>
|
|
60
|
+
<a href="https://pypi.org/project/forgeoptimizer/">
|
|
61
|
+
<img src="https://img.shields.io/pypi/pyversions/forgeoptimizer.svg" alt="Supported Python Versions">
|
|
62
|
+
</a>
|
|
63
|
+
<a href="https://github.com/mdshzb04/Forge/blob/main/LICENSE">
|
|
64
|
+
<img src="https://img.shields.io/github/license/mdshzb04/Forge.svg" alt="License: MIT">
|
|
65
|
+
</a>
|
|
66
|
+
<a href="https://github.com/astral-sh/ruff">
|
|
67
|
+
<img src="https://img.shields.io/badge/code%20style-ruff-000000.svg" alt="Code Style: Ruff">
|
|
68
|
+
</a>
|
|
69
|
+
</p>
|
|
70
|
+
|
|
71
|
+
Forge is a pre-launch context preparation tool for AI coding assistants. Before you run `claude`, `codex`, or `cursor`, Forge scans your repository, extracts symbols and dependencies, builds a structured summary, injects configurable behavior instructions, and passes the optimized context to the AI tool through environment variables and MCP tools.
|
|
72
|
+
|
|
73
|
+
## Core Philosophy
|
|
74
|
+
|
|
75
|
+
> [!IMPORTANT]
|
|
76
|
+
> **Forge optimizes what it controls.**
|
|
77
|
+
>
|
|
78
|
+
> Forge focuses on three areas:
|
|
79
|
+
>
|
|
80
|
+
> - **Repository Intelligence** — Symbol extraction, dependency analysis, file scanning, and native graph generation.
|
|
81
|
+
> - **Behavior Optimization** — Configurable implementation guidance (Ponytail YAGNI rules) and response style optimization (Caveman conciseness rules).
|
|
82
|
+
> - **Runtime Infrastructure** — Zero-configuration wrappers, context caching, background daemon, and MCP server.
|
|
83
|
+
>
|
|
84
|
+
> Forge prepares context before the AI session begins. It does **not** modify provider billing, quota accounting, model pricing, model inference, or the AI client's internal tool selection logic.
|
|
85
|
+
|
|
86
|
+
## Architecture
|
|
87
|
+
|
|
88
|
+
Forge has a single unified context preparation path used by all wrappers:
|
|
89
|
+
|
|
90
|
+
1. **Repository scan** — Extracts files, symbols (classes/functions), and dependencies (imports/requires) using parallel regex-based parsers for Python, JS, TS, JSX, and TSX.
|
|
91
|
+
2. **Semantic ranking** — Ranks files by TF-IDF query relevance with dependency centrality scoring.
|
|
92
|
+
3. **AST pruning** — Uses tree-sitter to prune files to only relevant symbols, keeping context lean.
|
|
93
|
+
4. **Behavior injection** — Prepends intensity-gated Ponytail (YAGNI) and Caveman (conciseness) instructions.
|
|
94
|
+
5. **Compression** — Collapses whitespace, strips boilerplate, and removes redundant content.
|
|
95
|
+
6. **Caching** — Fingerprints repositories and caches context between launches.
|
|
96
|
+
7. **Launch** — Sets `FORGE_CONTEXT` env var and starts the AI CLI.
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
### Advanced Graph
|
|
100
|
+
|
|
101
|
+
The native builder works out of the box with no extra setup. For the advanced graph (Leiden clustering and LLM-powered analysis), Forge will automatically detect and install the external `graphify` tool and its required provider dependencies when you run the build command.
|
|
102
|
+
|
|
103
|
+
You only need to configure your API key and run the command:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# 1. Provide an API key for your provider
|
|
107
|
+
export ANTHROPIC_API_KEY="your-key-here"
|
|
108
|
+
|
|
109
|
+
# 2. Build the graph (Forge automatically manages the graphify installation)
|
|
110
|
+
forge graph build
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Installation
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
uv tool install forgeoptimizer
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The CLI entrypoint is `forge`.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Interfaces
|
|
124
|
+
|
|
125
|
+
Forge provides two ways to connect with your AI coding tools:
|
|
126
|
+
|
|
127
|
+
1. **Convenience Wrappers** (`forge claude`, `forge cursor`, `forge codex`, `forge antigravity`) — Automatically prepare context, configure MCP, and launch the target AI CLI.
|
|
128
|
+
2. **MCP Server** (`forge mcp`) — Standard stdio JSON-RPC interface exposing 6 tools that AI clients can call during sessions.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Command Reference
|
|
133
|
+
|
|
134
|
+
| Command | Description |
|
|
135
|
+
| -------- | ----------- |
|
|
136
|
+
| `forge claude` | Launch Claude Code with optimized context |
|
|
137
|
+
| `forge codex` | Launch Codex CLI with optimized context |
|
|
138
|
+
| `forge cursor` | Launch Cursor CLI with optimized context |
|
|
139
|
+
| `forge antigravity` | Launch Antigravity CLI with optimized context |
|
|
140
|
+
| `forge commit` | Generate a Conventional Commit message from staged changes |
|
|
141
|
+
| `forge mcp` | Start the stdio MCP server |
|
|
142
|
+
| `forge start` | Start the background daemon |
|
|
143
|
+
| `forge graph build` | Build a codebase graph (native or external) |
|
|
144
|
+
| `forge config` | Configure optimization profiles |
|
|
145
|
+
| `forge status` | Show repository, daemon, and optimization status |
|
|
146
|
+
| `forge doctor` | Verify installation and dependencies |
|
|
147
|
+
| `forge inspect` | Display active pipeline and optimization stages |
|
|
148
|
+
| `forge stats` | Show cache metrics and pipeline performance |
|
|
149
|
+
| `forge profile` | View or set optimization profiles |
|
|
150
|
+
| `forge explain` | Explain pipeline stages, concepts, or topics |
|
|
151
|
+
| `forge --version` | Show version |
|
|
152
|
+
|
|
153
|
+
Use `--refresh` to bypass the cache on any wrapper command:
|
|
154
|
+
```bash
|
|
155
|
+
forge claude --refresh
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## MCP Tools
|
|
161
|
+
|
|
162
|
+
Forge exposes 6 tools over MCP:
|
|
163
|
+
|
|
164
|
+
* `get_optimized_context` — Full optimized repository context with optional query filtering
|
|
165
|
+
* `get_summary` — Repository layout, file count, and size summary
|
|
166
|
+
* `get_dependency_graph` — Module/file import relationships
|
|
167
|
+
* `file_lookup` — File contents by relative path
|
|
168
|
+
* `symbol_lookup` — Class/function definitions and locations
|
|
169
|
+
* `semantic_search` — Keyword search across codebase chunks
|
|
170
|
+
|
|
171
|
+
> [!IMPORTANT]
|
|
172
|
+
> Forge exposes these tools, but whether they are called depends on the AI client's internal orchestration. Forge does not control tool selection.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Environment Variables
|
|
177
|
+
|
|
178
|
+
| Variable | Purpose |
|
|
179
|
+
| -------- | -------- |
|
|
180
|
+
| `FORGE_CONTEXT` | Optimized pre-launch context text |
|
|
181
|
+
| `FORGE_CONTEXT_FILE` | Path to the cached context file |
|
|
182
|
+
| `FORGE_REPO_ROOT` | Detected repository root |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Development
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
git clone https://github.com/mdshzb04/Forge
|
|
190
|
+
cd Forge
|
|
191
|
+
python -m venv .venv && source .venv/bin/activate
|
|
192
|
+
pip install -e ".[dev]"
|
|
193
|
+
pytest
|
|
194
|
+
ruff check forgecli tests
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## License
|
|
198
|
+
|
|
199
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Forge
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="https://github.com/mdshzb04/Forge/actions/workflows/ci.yml">
|
|
5
|
+
<img src="https://github.com/mdshzb04/Forge/actions/workflows/ci.yml/badge.svg" alt="CI Status">
|
|
6
|
+
</a>
|
|
7
|
+
<a href="https://pypi.org/project/forgeoptimizer/">
|
|
8
|
+
<img src="https://img.shields.io/pypi/v/forgeoptimizer.svg" alt="PyPI Version">
|
|
9
|
+
</a>
|
|
10
|
+
<a href="https://pypi.org/project/forgeoptimizer/">
|
|
11
|
+
<img src="https://img.shields.io/pypi/pyversions/forgeoptimizer.svg" alt="Supported Python Versions">
|
|
12
|
+
</a>
|
|
13
|
+
<a href="https://github.com/mdshzb04/Forge/blob/main/LICENSE">
|
|
14
|
+
<img src="https://img.shields.io/github/license/mdshzb04/Forge.svg" alt="License: MIT">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://github.com/astral-sh/ruff">
|
|
17
|
+
<img src="https://img.shields.io/badge/code%20style-ruff-000000.svg" alt="Code Style: Ruff">
|
|
18
|
+
</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
Forge is a pre-launch context preparation tool for AI coding assistants. Before you run `claude`, `codex`, or `cursor`, Forge scans your repository, extracts symbols and dependencies, builds a structured summary, injects configurable behavior instructions, and passes the optimized context to the AI tool through environment variables and MCP tools.
|
|
22
|
+
|
|
23
|
+
## Core Philosophy
|
|
24
|
+
|
|
25
|
+
> [!IMPORTANT]
|
|
26
|
+
> **Forge optimizes what it controls.**
|
|
27
|
+
>
|
|
28
|
+
> Forge focuses on three areas:
|
|
29
|
+
>
|
|
30
|
+
> - **Repository Intelligence** — Symbol extraction, dependency analysis, file scanning, and native graph generation.
|
|
31
|
+
> - **Behavior Optimization** — Configurable implementation guidance (Ponytail YAGNI rules) and response style optimization (Caveman conciseness rules).
|
|
32
|
+
> - **Runtime Infrastructure** — Zero-configuration wrappers, context caching, background daemon, and MCP server.
|
|
33
|
+
>
|
|
34
|
+
> Forge prepares context before the AI session begins. It does **not** modify provider billing, quota accounting, model pricing, model inference, or the AI client's internal tool selection logic.
|
|
35
|
+
|
|
36
|
+
## Architecture
|
|
37
|
+
|
|
38
|
+
Forge has a single unified context preparation path used by all wrappers:
|
|
39
|
+
|
|
40
|
+
1. **Repository scan** — Extracts files, symbols (classes/functions), and dependencies (imports/requires) using parallel regex-based parsers for Python, JS, TS, JSX, and TSX.
|
|
41
|
+
2. **Semantic ranking** — Ranks files by TF-IDF query relevance with dependency centrality scoring.
|
|
42
|
+
3. **AST pruning** — Uses tree-sitter to prune files to only relevant symbols, keeping context lean.
|
|
43
|
+
4. **Behavior injection** — Prepends intensity-gated Ponytail (YAGNI) and Caveman (conciseness) instructions.
|
|
44
|
+
5. **Compression** — Collapses whitespace, strips boilerplate, and removes redundant content.
|
|
45
|
+
6. **Caching** — Fingerprints repositories and caches context between launches.
|
|
46
|
+
7. **Launch** — Sets `FORGE_CONTEXT` env var and starts the AI CLI.
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### Advanced Graph
|
|
50
|
+
|
|
51
|
+
The native builder works out of the box with no extra setup. For the advanced graph (Leiden clustering and LLM-powered analysis), Forge will automatically detect and install the external `graphify` tool and its required provider dependencies when you run the build command.
|
|
52
|
+
|
|
53
|
+
You only need to configure your API key and run the command:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 1. Provide an API key for your provider
|
|
57
|
+
export ANTHROPIC_API_KEY="your-key-here"
|
|
58
|
+
|
|
59
|
+
# 2. Build the graph (Forge automatically manages the graphify installation)
|
|
60
|
+
forge graph build
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Installation
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
uv tool install forgeoptimizer
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The CLI entrypoint is `forge`.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Interfaces
|
|
74
|
+
|
|
75
|
+
Forge provides two ways to connect with your AI coding tools:
|
|
76
|
+
|
|
77
|
+
1. **Convenience Wrappers** (`forge claude`, `forge cursor`, `forge codex`, `forge antigravity`) — Automatically prepare context, configure MCP, and launch the target AI CLI.
|
|
78
|
+
2. **MCP Server** (`forge mcp`) — Standard stdio JSON-RPC interface exposing 6 tools that AI clients can call during sessions.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Command Reference
|
|
83
|
+
|
|
84
|
+
| Command | Description |
|
|
85
|
+
| -------- | ----------- |
|
|
86
|
+
| `forge claude` | Launch Claude Code with optimized context |
|
|
87
|
+
| `forge codex` | Launch Codex CLI with optimized context |
|
|
88
|
+
| `forge cursor` | Launch Cursor CLI with optimized context |
|
|
89
|
+
| `forge antigravity` | Launch Antigravity CLI with optimized context |
|
|
90
|
+
| `forge commit` | Generate a Conventional Commit message from staged changes |
|
|
91
|
+
| `forge mcp` | Start the stdio MCP server |
|
|
92
|
+
| `forge start` | Start the background daemon |
|
|
93
|
+
| `forge graph build` | Build a codebase graph (native or external) |
|
|
94
|
+
| `forge config` | Configure optimization profiles |
|
|
95
|
+
| `forge status` | Show repository, daemon, and optimization status |
|
|
96
|
+
| `forge doctor` | Verify installation and dependencies |
|
|
97
|
+
| `forge inspect` | Display active pipeline and optimization stages |
|
|
98
|
+
| `forge stats` | Show cache metrics and pipeline performance |
|
|
99
|
+
| `forge profile` | View or set optimization profiles |
|
|
100
|
+
| `forge explain` | Explain pipeline stages, concepts, or topics |
|
|
101
|
+
| `forge --version` | Show version |
|
|
102
|
+
|
|
103
|
+
Use `--refresh` to bypass the cache on any wrapper command:
|
|
104
|
+
```bash
|
|
105
|
+
forge claude --refresh
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## MCP Tools
|
|
111
|
+
|
|
112
|
+
Forge exposes 6 tools over MCP:
|
|
113
|
+
|
|
114
|
+
* `get_optimized_context` — Full optimized repository context with optional query filtering
|
|
115
|
+
* `get_summary` — Repository layout, file count, and size summary
|
|
116
|
+
* `get_dependency_graph` — Module/file import relationships
|
|
117
|
+
* `file_lookup` — File contents by relative path
|
|
118
|
+
* `symbol_lookup` — Class/function definitions and locations
|
|
119
|
+
* `semantic_search` — Keyword search across codebase chunks
|
|
120
|
+
|
|
121
|
+
> [!IMPORTANT]
|
|
122
|
+
> Forge exposes these tools, but whether they are called depends on the AI client's internal orchestration. Forge does not control tool selection.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Environment Variables
|
|
127
|
+
|
|
128
|
+
| Variable | Purpose |
|
|
129
|
+
| -------- | -------- |
|
|
130
|
+
| `FORGE_CONTEXT` | Optimized pre-launch context text |
|
|
131
|
+
| `FORGE_CONTEXT_FILE` | Path to the cached context file |
|
|
132
|
+
| `FORGE_REPO_ROOT` | Detected repository root |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Development
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
git clone https://github.com/mdshzb04/Forge
|
|
140
|
+
cd Forge
|
|
141
|
+
python -m venv .venv && source .venv/bin/activate
|
|
142
|
+
pip install -e ".[dev]"
|
|
143
|
+
pytest
|
|
144
|
+
ruff check forgecli tests
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## License
|
|
148
|
+
|
|
149
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Forge v1.0.0 Release Notes
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Forge v1.0.0 is the first production release of the Forge AI optimization runtime. Forge prepares optimized repository-aware context for AI coding assistants, reducing token usage and improving response quality through prompt engineering, output optimization, and intelligent context retrieval.
|
|
6
|
+
|
|
7
|
+
## What's New
|
|
8
|
+
|
|
9
|
+
Forge provides a complete developer experience:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
forge claude # Launch Claude Code with optimized context
|
|
13
|
+
forge codex # Launch Codex CLI
|
|
14
|
+
forge cursor # Launch Cursor CLI
|
|
15
|
+
forge antigravity # Launch Antigravity CLI
|
|
16
|
+
forge aider # Launch Aider with context injection
|
|
17
|
+
forge opencode # Launch OpenCode
|
|
18
|
+
forge commandcode # Launch CommandCode
|
|
19
|
+
|
|
20
|
+
forge start # Start the background daemon
|
|
21
|
+
forge mcp # Start the MCP server over stdio
|
|
22
|
+
forge graph build # Build a knowledge graph
|
|
23
|
+
|
|
24
|
+
forge config # Configure optimization profiles
|
|
25
|
+
forge profile # View/set profiles with rich output
|
|
26
|
+
forge status # Repository and daemon status
|
|
27
|
+
forge stats # Usage statistics
|
|
28
|
+
forge doctor # System diagnostics
|
|
29
|
+
forge inspect # Pipeline and providers
|
|
30
|
+
forge explain # Explain pipeline stages and concepts
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Key Capabilities
|
|
34
|
+
|
|
35
|
+
- **19-stage middleware pipeline** processes every AI request through telemetry, auth, policy, caching, history compression, token planning, context optimization, conversation tracking, Ponytail prompt engineering, Caveman output compression, repository scanning, dependency analysis, symbol extraction, graph enrichment, semantic ranking, streaming, resilience, provider execution, and response optimization.
|
|
36
|
+
- **7 AI CLI wrappers** unified through a single runtime path.
|
|
37
|
+
- **16 providers** with real HTTP drivers for OpenAI, Anthropic, and Google Gemini.
|
|
38
|
+
- **Knowledge graph** integration for intelligent file context injection.
|
|
39
|
+
- **Optimization profiles** with 4-5 intensity levels per optimizer.
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install forgeoptimizer
|
|
45
|
+
# or
|
|
46
|
+
uv tool install forgeoptimizer
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## What's Next
|
|
50
|
+
|
|
51
|
+
- Performance profiling and optimization of 19-stage pipeline under production load
|
|
52
|
+
- Standalone binary packaging (PyInstaller/Nuitka)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
| Version | Supported |
|
|
6
|
+
|---------|-----------|
|
|
7
|
+
| 1.0.x | ✅ Yes |
|
|
8
|
+
| < 1.0 | ❌ No |
|
|
9
|
+
|
|
10
|
+
## Reporting a Vulnerability
|
|
11
|
+
|
|
12
|
+
If you discover a security vulnerability in Forge, please do **not** open a public GitHub issue.
|
|
13
|
+
|
|
14
|
+
Instead, email the maintainers directly. We will respond within 48 hours and work with you on a coordinated disclosure timeline.
|
|
15
|
+
|
|
16
|
+
## Security Design
|
|
17
|
+
|
|
18
|
+
### API Keys
|
|
19
|
+
|
|
20
|
+
Forge stores API keys in two ways:
|
|
21
|
+
1. **Environment variables** (recommended): `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`, etc.
|
|
22
|
+
2. **System keyring** (optional): Forge can store credentials in your OS keychain via the `keyring` library.
|
|
23
|
+
|
|
24
|
+
Forge never writes API keys to log files, configuration files, or cache directories.
|
|
25
|
+
|
|
26
|
+
### Subprocess Execution
|
|
27
|
+
|
|
28
|
+
Wrapper commands (`forge claude`, `forge codex`, etc.) launch external CLI binaries via `subprocess.run()` with arguments passed as a list — never through `shell=True`. This prevents command injection.
|
|
29
|
+
|
|
30
|
+
### Dependency Verification
|
|
31
|
+
|
|
32
|
+
All dependencies are pinned and sourced from PyPI. We do not include vendored dependencies. The CI pipeline verifies package integrity through `twine check` before publishing.
|
|
33
|
+
|
|
34
|
+
## Security Checks
|
|
35
|
+
|
|
36
|
+
Run `forge doctor` to check your installation's security posture, including:
|
|
37
|
+
- Which provider API keys are configured
|
|
38
|
+
- Configuration file integrity
|
|
39
|
+
|
|
40
|
+
## Disclosure Timeline
|
|
41
|
+
|
|
42
|
+
We aim to fix confirmed vulnerabilities within 7 days and release a patch. Critical vulnerabilities may receive same-day patches.
|