forgeoptimizer 1.0.1__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.
Files changed (319) hide show
  1. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/PKG-INFO +1 -1
  2. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/patch_generator.py +9 -6
  3. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/commands_diagnostics.py +10 -13
  4. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/daemon.py +12 -11
  5. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/docs/generator.py +9 -11
  6. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/orchestrator/__init__.py +9 -12
  7. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzer.py +14 -13
  8. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/shared_extraction.py +22 -24
  9. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/utils/fs.py +10 -18
  10. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/pyproject.toml +1 -1
  11. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/uv.lock +1 -1
  12. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/.github/workflows/ci.yml +0 -0
  13. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/.gitignore +0 -0
  14. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/CHANGELOG.md +0 -0
  15. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/CONTRIBUTING.md +0 -0
  16. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/CREDITS.md +0 -0
  17. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/Forge.toml +0 -0
  18. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/LICENSE +0 -0
  19. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/MIGRATION.md +0 -0
  20. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/README.md +0 -0
  21. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/RELEASE_NOTES.md +0 -0
  22. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/SECURITY.md +0 -0
  23. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/SUPPORT.md +0 -0
  24. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/docs/commands.md +0 -0
  25. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/__init__.py +0 -0
  26. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/budget/__init__.py +0 -0
  27. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/budget/middleware.py +0 -0
  28. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/budget/planner.py +0 -0
  29. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/budget/window.py +0 -0
  30. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/__init__.py +0 -0
  31. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/apply.py +0 -0
  32. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/caveman_optimize.py +0 -0
  33. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/diff_extract.py +0 -0
  34. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/llm.py +0 -0
  35. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/optimize.py +0 -0
  36. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/pipeline.py +0 -0
  37. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/retrieval.py +0 -0
  38. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/summarize.py +0 -0
  39. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/build/test_run.py +0 -0
  40. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/builder/__init__.py +0 -0
  41. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/builder/builder.py +0 -0
  42. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/builder/editor.py +0 -0
  43. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/builder/formatter.py +0 -0
  44. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/__init__.py +0 -0
  45. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/bootstrap.py +0 -0
  46. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/commands_auth.py +0 -0
  47. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/commands_commit.py +0 -0
  48. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/commands_graph.py +0 -0
  49. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/commands_inspect.py +0 -0
  50. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/commands_wrappers.py +0 -0
  51. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/daemon_utils.py +0 -0
  52. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/main.py +0 -0
  53. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/cli/ui.py +0 -0
  54. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/config/__init__.py +0 -0
  55. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/config/loader.py +0 -0
  56. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/config/settings.py +0 -0
  57. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/config/writer.py +0 -0
  58. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/conversation/__init__.py +0 -0
  59. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/conversation/manager.py +0 -0
  60. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/conversation/session.py +0 -0
  61. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/__init__.py +0 -0
  62. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/container.py +0 -0
  63. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/context.py +0 -0
  64. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/credentials.py +0 -0
  65. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/errors.py +0 -0
  66. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/events.py +0 -0
  67. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/logging.py +0 -0
  68. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/models.py +0 -0
  69. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/plugins.py +0 -0
  70. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/core/service.py +0 -0
  71. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/docs/__init__.py +0 -0
  72. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/__init__.py +0 -0
  73. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/context.py +0 -0
  74. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/defaults.py +0 -0
  75. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/events.py +0 -0
  76. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/execution.py +0 -0
  77. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/plugins.py +0 -0
  78. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/runner.py +0 -0
  79. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/__init__.py +0 -0
  80. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/caveman_optimizer.py +0 -0
  81. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/context_optimizer.py +0 -0
  82. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/execution_engine_stage.py +0 -0
  83. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/git_engine.py +0 -0
  84. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/intent_analyzer.py +0 -0
  85. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/model_router.py +0 -0
  86. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/planning_engine.py +0 -0
  87. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/repository_analyzer.py +0 -0
  88. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/engine/stages/validation_engine.py +0 -0
  89. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/git/__init__.py +0 -0
  90. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/git/repo.py +0 -0
  91. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/git/service.py +0 -0
  92. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/__init__.py +0 -0
  93. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/backend_forgegraph.py +0 -0
  94. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/edge.py +0 -0
  95. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/forgegraph.py +0 -0
  96. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/graph.py +0 -0
  97. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/indexer.py +0 -0
  98. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/node.py +0 -0
  99. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/graph/repository.py +0 -0
  100. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/__init__.py +0 -0
  101. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/cache.py +0 -0
  102. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/caching_middleware.py +0 -0
  103. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/history.py +0 -0
  104. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/memory_compression.py +0 -0
  105. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/middleware.py +0 -0
  106. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/memory/store.py +0 -0
  107. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/__init__.py +0 -0
  108. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/base.py +0 -0
  109. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/builder.py +0 -0
  110. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/caveman_adapter.py +0 -0
  111. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/context.py +0 -0
  112. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/decorators.py +0 -0
  113. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/defaults.py +0 -0
  114. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/exceptions.py +0 -0
  115. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/executor.py +0 -0
  116. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/graphify_adapter.py +0 -0
  117. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/middleware_manager.py +0 -0
  118. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/pipeline.py +0 -0
  119. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/ponytail_adapter.py +0 -0
  120. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/registration.py +0 -0
  121. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/request.py +0 -0
  122. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/middleware/response.py +0 -0
  123. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/negotiator/__init__.py +0 -0
  124. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/negotiator/middleware.py +0 -0
  125. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/negotiator/negotiator.py +0 -0
  126. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/observability/__init__.py +0 -0
  127. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/observability/health.py +0 -0
  128. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/observability/metrics.py +0 -0
  129. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/observability/middleware.py +0 -0
  130. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/observability/tracing.py +0 -0
  131. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/__init__.py +0 -0
  132. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/adaptive_budget.py +0 -0
  133. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ast_extractor.py +0 -0
  134. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/cache.py +0 -0
  135. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/__init__.py +0 -0
  136. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/cli.py +0 -0
  137. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/decorator.py +0 -0
  138. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/factory.py +0 -0
  139. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/ruleset.py +0 -0
  140. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/caveman/state.py +0 -0
  141. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/chunker.py +0 -0
  142. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/comment_stripper.py +0 -0
  143. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/compression.py +0 -0
  144. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/cost_estimator.py +0 -0
  145. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/embedding_cache.py +0 -0
  146. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/git_context.py +0 -0
  147. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/intelligent_retrieval.py +0 -0
  148. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/optimizer.py +0 -0
  149. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/orchestrator.py +0 -0
  150. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/output/__init__.py +0 -0
  151. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/output/optimizer.py +0 -0
  152. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/__init__.py +0 -0
  153. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/cli.py +0 -0
  154. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/decorator.py +0 -0
  155. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/factory.py +0 -0
  156. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/ruleset.py +0 -0
  157. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ponytail/state.py +0 -0
  158. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/prompt_optimizer.py +0 -0
  159. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/quality_validation.py +0 -0
  160. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/ranker.py +0 -0
  161. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/retrieval_cache.py +0 -0
  162. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/semantic_ranking.py +0 -0
  163. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/summarizer.py +0 -0
  164. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/optimizer/token_estimator.py +0 -0
  165. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/__init__.py +0 -0
  166. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/agent.py +0 -0
  167. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/plan.py +0 -0
  168. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/planner.py +0 -0
  169. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/render.py +0 -0
  170. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/serialize.py +0 -0
  171. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/planner/software.py +0 -0
  172. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/platform/__init__.py +0 -0
  173. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/platform/core.py +0 -0
  174. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/platform/deps.py +0 -0
  175. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/platform/paths.py +0 -0
  176. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/platform/shell.py +0 -0
  177. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/platform/update.py +0 -0
  178. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/plugins/__init__.py +0 -0
  179. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/plugins/hook.py +0 -0
  180. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/policy/__init__.py +0 -0
  181. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/policy/engine.py +0 -0
  182. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/policy/exceptions.py +0 -0
  183. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/policy/middleware.py +0 -0
  184. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/policy/rules.py +0 -0
  185. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/prompts/__init__.py +0 -0
  186. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/prompts/loader.py +0 -0
  187. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/prompts/registry.py +0 -0
  188. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/prompts/renderer.py +0 -0
  189. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/__init__.py +0 -0
  190. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/anthropic.py +0 -0
  191. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/base.py +0 -0
  192. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/builtin.py +0 -0
  193. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/conversation.py +0 -0
  194. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/exceptions.py +0 -0
  195. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/google.py +0 -0
  196. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/health.py +0 -0
  197. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/http_base.py +0 -0
  198. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/mock.py +0 -0
  199. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/openai.py +0 -0
  200. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/openai_compatible.py +0 -0
  201. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_capabilities.py +0 -0
  202. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_context.py +0 -0
  203. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_events.py +0 -0
  204. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_factory.py +0 -0
  205. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_manager.py +0 -0
  206. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_metadata.py +0 -0
  207. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_registry.py +0 -0
  208. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/provider_router.py +0 -0
  209. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/router.py +0 -0
  210. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/providers/router_state.py +0 -0
  211. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/registry/__init__.py +0 -0
  212. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/registry/model_registry.py +0 -0
  213. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/resilience/__init__.py +0 -0
  214. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/resilience/circuit_breaker.py +0 -0
  215. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/resilience/exceptions.py +0 -0
  216. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/resilience/middleware.py +0 -0
  217. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/resilience/retry.py +0 -0
  218. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/__init__.py +0 -0
  219. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/__init__.py +0 -0
  220. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/architecture.py +0 -0
  221. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/complexity.py +0 -0
  222. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/dead_code.py +0 -0
  223. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/duplicates.py +0 -0
  224. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/performance.py +0 -0
  225. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/analyzers/security.py +0 -0
  226. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/finding.py +0 -0
  227. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/report.py +0 -0
  228. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/repository.py +0 -0
  229. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/review/suggestions.py +0 -0
  230. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/__init__.py +0 -0
  231. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/agents.py +0 -0
  232. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/cache_store.py +0 -0
  233. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/mcp_config.py +0 -0
  234. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/pipeline_runner.py +0 -0
  235. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/prepare.py +0 -0
  236. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime/wrappers.py +0 -0
  237. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/__init__.py +0 -0
  238. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/config_manager.py +0 -0
  239. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/container.py +0 -0
  240. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/context.py +0 -0
  241. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/errors.py +0 -0
  242. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/events.py +0 -0
  243. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/factory.py +0 -0
  244. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/interfaces.py +0 -0
  245. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/lifecycle.py +0 -0
  246. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/provider_registry.py +0 -0
  247. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/request.py +0 -0
  248. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/response.py +0 -0
  249. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/runtime_core/service_registry.py +0 -0
  250. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/scheduler/__init__.py +0 -0
  251. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/scheduler/scheduler.py +0 -0
  252. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/scheduler/task.py +0 -0
  253. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/scheduler/worker.py +0 -0
  254. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/streaming/__init__.py +0 -0
  255. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/streaming/events.py +0 -0
  256. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/streaming/middleware.py +0 -0
  257. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/templates/__init__.py +0 -0
  258. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/templates/engine.py +0 -0
  259. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/templates/registry.py +0 -0
  260. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/transport/__init__.py +0 -0
  261. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/transport/daemon.py +0 -0
  262. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/transport/http_server.py +0 -0
  263. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/transport/server.py +0 -0
  264. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/utils/__init__.py +0 -0
  265. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/utils/ids.py +0 -0
  266. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/utils/io.py +0 -0
  267. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/utils/paths.py +0 -0
  268. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/forgecli/utils/timing.py +0 -0
  269. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/packaging/scoop/forgecli.json +0 -0
  270. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/packaging/winget/forgecli.ForgeCli.yaml +0 -0
  271. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/__init__.py +0 -0
  272. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/conftest.py +0 -0
  273. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_auth.py +0 -0
  274. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_budget_context.py +0 -0
  275. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_build_pipeline.py +0 -0
  276. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_caching_observability.py +0 -0
  277. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_caveman_cli.py +0 -0
  278. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_caveman_ruleset.py +0 -0
  279. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_cli.py +0 -0
  280. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_commit.py +0 -0
  281. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_config.py +0 -0
  282. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_container.py +0 -0
  283. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_conversation_optimization.py +0 -0
  284. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_diagnostics.py +0 -0
  285. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_e2e.py +0 -0
  286. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_engine.py +0 -0
  287. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_forgegraph_client.py +0 -0
  288. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_graph.py +0 -0
  289. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_mcp_config.py +0 -0
  290. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_memory.py +0 -0
  291. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_middleware.py +0 -0
  292. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_negotiator.py +0 -0
  293. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_optimizer.py +0 -0
  294. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_orchestrator.py +0 -0
  295. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_output_optimization.py +0 -0
  296. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_planner.py +0 -0
  297. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_planner_render.py +0 -0
  298. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_platform.py +0 -0
  299. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_policy.py +0 -0
  300. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_ponytail_cli.py +0 -0
  301. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_ponytail_ruleset.py +0 -0
  302. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_prompts.py +0 -0
  303. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_provider.py +0 -0
  304. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_providers.py +0 -0
  305. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_providers_http.py +0 -0
  306. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_redesign_optimizers.py +0 -0
  307. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_repository_graph.py +0 -0
  308. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_resilience.py +0 -0
  309. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_review.py +0 -0
  310. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_router.py +0 -0
  311. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_runtime.py +0 -0
  312. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_runtime_core.py +0 -0
  313. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_runtime_core_phase2.py +0 -0
  314. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_scheduler_plugins.py +0 -0
  315. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_software_planner.py +0 -0
  316. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_streaming.py +0 -0
  317. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_token_optimizations.py +0 -0
  318. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_transport.py +0 -0
  319. {forgeoptimizer-1.0.1 → forgeoptimizer-1.0.2}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgeoptimizer
3
- Version: 1.0.1
3
+ Version: 1.0.2
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
@@ -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
- for file_path in root.rglob("*"):
103
- if file_path.is_file() and file_path.name == base_name:
104
- # Ignore skip dirs
105
- skip_dirs = {".git", ".venv", "node_modules", "dist", "build", ".forge"}
106
- if not any(part in skip_dirs for part in file_path.parts):
107
- return file_path
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 = [f for f in all_files if not any(s in f.parts for s in skip)]
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 should_skip
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
- for path in sorted(root.rglob("*"), key=lambda p: str(p)):
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
- parts = path.relative_to(root).parts
126
- if should_skip(parts):
127
- continue
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
- for path in sorted(root.rglob("*.py")):
113
-
114
- if any(part.startswith(".") for part in path.parts):
115
-
116
- continue
117
-
118
- if any(part in {"__pycache__", "node_modules", ".venv", "venv"} for part in path.parts):
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
- for path in sorted(root.rglob("*.py")):
962
-
963
- if any(part.startswith(".") for part in path.parts):
964
-
965
- continue
966
-
967
- if any(part in {"__pycache__", "node_modules", ".venv", "venv"} for part in path.parts):
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
- for path in sorted(root.rglob("*")):
166
-
167
- if not path.is_file():
168
-
169
- continue
170
-
171
- if path.suffix.lower() not in extensions:
172
-
173
- continue
174
-
175
- if any(part in ignore_set for part in path.parts):
176
-
177
- continue
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)
@@ -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 p in root.rglob("*"):
44
- try:
45
- parts = p.relative_to(root).parts
46
- if should_skip(parts):
47
- continue
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 p in sorted(root.rglob("*"), key=lambda x: str(x)):
138
- try:
139
- parts = p.relative_to(root).parts
140
- if should_skip(parts):
141
- continue
142
- if p.is_file() and not p.name.startswith("."):
143
- stat = p.stat()
144
- files.append({
145
- "name": p.name,
146
- "path": str(p.relative_to(root)),
147
- "size_bytes": stat.st_size,
148
- "mtime": stat.st_mtime,
149
- })
150
- except (ValueError, OSError):
151
- continue
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
- for p in path.rglob("*"):
215
-
216
- try:
217
-
218
- parts = p.relative_to(path).parts
219
-
220
- if any(part.startswith(".") or part in ignored_dirs for part in parts[:-1]):
221
-
222
- continue
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
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "forgeoptimizer"
7
- version = "1.0.1"
7
+ version = "1.0.2"
8
8
  description = "Forge — AI optimization runtime for Claude Code, Codex, Cursor, Antigravity"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -406,7 +406,7 @@ wheels = [
406
406
 
407
407
  [[package]]
408
408
  name = "forgectx"
409
- version = "1.0.0"
409
+ version = "1.0.2"
410
410
  source = { editable = "." }
411
411
  dependencies = [
412
412
  { name = "aiofiles" },
File without changes
File without changes