forgex-cli 0.1.6__tar.gz → 0.1.8__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 (197) hide show
  1. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/PKG-INFO +1 -1
  2. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/__init__.py +1 -1
  3. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/base.py +7 -1
  4. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/repl.py +4 -4
  5. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/registry.py +7 -3
  6. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_builder_agent.py +5 -2
  7. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/.github/workflows/ci.yml +0 -0
  8. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/.github/workflows/release.yml +0 -0
  9. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/.gitignore +0 -0
  10. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/CHANGELOG.md +0 -0
  11. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/LICENSE +0 -0
  12. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/README.md +0 -0
  13. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/SECURITY.md +0 -0
  14. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/agents.md +0 -0
  15. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/architecture.md +0 -0
  16. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/configuration.md +0 -0
  17. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/decisions.md +0 -0
  18. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/providers.md +0 -0
  19. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/quickstart.md +0 -0
  20. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/sandbox.md +0 -0
  21. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/docs/security.md +0 -0
  22. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/examples/demo-project/README.md +0 -0
  23. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/examples/demo-project/pyproject.toml +0 -0
  24. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/examples/demo-project/src/demo/__init__.py +0 -0
  25. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/examples/demo-project/src/demo/calc.py +0 -0
  26. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/examples/demo-project/tests/test_calc.py +0 -0
  27. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/pyproject.toml +0 -0
  28. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/__main__.py +0 -0
  29. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/__init__.py +0 -0
  30. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/architect.py +0 -0
  31. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/builder.py +0 -0
  32. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/ensemble.py +0 -0
  33. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/expert_coder.py +0 -0
  34. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/agents/supervisor.py +0 -0
  35. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/__init__.py +0 -0
  36. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/app.py +0 -0
  37. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/build_views.py +0 -0
  38. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/__init__.py +0 -0
  39. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/build.py +0 -0
  40. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/checkpoint.py +0 -0
  41. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/config.py +0 -0
  42. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/context.py +0 -0
  43. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/diff.py +0 -0
  44. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/do_cmd.py +0 -0
  45. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/doctor.py +0 -0
  46. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/fix.py +0 -0
  47. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/init.py +0 -0
  48. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/logs.py +0 -0
  49. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/models.py +0 -0
  50. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/plan.py +0 -0
  51. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/review.py +0 -0
  52. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/rollback.py +0 -0
  53. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/run.py +0 -0
  54. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/status.py +0 -0
  55. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/supervise.py +0 -0
  56. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/task.py +0 -0
  57. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/tools.py +0 -0
  58. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/commands/verify.py +0 -0
  59. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/context_memory.py +0 -0
  60. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/intent.py +0 -0
  61. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/progress.py +0 -0
  62. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/runtime.py +0 -0
  63. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/session.py +0 -0
  64. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/cli/ui.py +0 -0
  65. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/config/__init__.py +0 -0
  66. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/config/loader.py +0 -0
  67. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/config/schema.py +0 -0
  68. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/context/__init__.py +0 -0
  69. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/context/chunker.py +0 -0
  70. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/context/dependency_graph.py +0 -0
  71. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/context/indexer.py +0 -0
  72. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/context/manager.py +0 -0
  73. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/context/retriever.py +0 -0
  74. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/__init__.py +0 -0
  75. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/base.py +0 -0
  76. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/capabilities.py +0 -0
  77. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/factory.py +0 -0
  78. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/groq.py +0 -0
  79. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/local.py +0 -0
  80. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/openai_compatible.py +0 -0
  81. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/models/router.py +0 -0
  82. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/__init__.py +0 -0
  83. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/checkpoints.py +0 -0
  84. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/engine.py +0 -0
  85. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/events.py +0 -0
  86. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/lockfile.py +0 -0
  87. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/retry.py +0 -0
  88. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/state.py +0 -0
  89. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/stores.py +0 -0
  90. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/orchestration/workflow.py +0 -0
  91. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/project.py +0 -0
  92. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/prompts/__init__.py +0 -0
  93. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/prompts/architect.md +0 -0
  94. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/prompts/builder.md +0 -0
  95. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/prompts/expert_coder.md +0 -0
  96. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/prompts/reviewer.md +0 -0
  97. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/prompts/supervisor.md +0 -0
  98. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/research/__init__.py +0 -0
  99. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/research/citations.py +0 -0
  100. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/research/engine.py +0 -0
  101. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/research/sources.py +0 -0
  102. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/sandbox/__init__.py +0 -0
  103. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/sandbox/executor.py +0 -0
  104. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/sandbox/permissions.py +0 -0
  105. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/sandbox/policies.py +0 -0
  106. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/__init__.py +0 -0
  107. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/agent.py +0 -0
  108. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/checkpoint.py +0 -0
  109. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/error.py +0 -0
  110. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/event.py +0 -0
  111. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/plan.py +0 -0
  112. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/project.py +0 -0
  113. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/research.py +0 -0
  114. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/result.py +0 -0
  115. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/schemas/task.py +0 -0
  116. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/storage/__init__.py +0 -0
  117. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/storage/database.py +0 -0
  118. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/storage/migrations.py +0 -0
  119. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/storage/repositories.py +0 -0
  120. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/__init__.py +0 -0
  121. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/base.py +0 -0
  122. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/dependencies.py +0 -0
  123. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/filesystem.py +0 -0
  124. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/git.py +0 -0
  125. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/project.py +0 -0
  126. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/search.py +0 -0
  127. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/terminal.py +0 -0
  128. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/testing.py +0 -0
  129. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/tools/verification.py +0 -0
  130. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/utils/__init__.py +0 -0
  131. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/utils/logging.py +0 -0
  132. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/utils/paths.py +0 -0
  133. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/src/forgex/utils/redact.py +0 -0
  134. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/__init__.py +0 -0
  135. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/conftest.py +0 -0
  136. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/__init__.py +0 -0
  137. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_agents_architect.py +0 -0
  138. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_checkpoints.py +0 -0
  139. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli.py +0 -0
  140. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_build.py +0 -0
  141. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_checkpoint.py +0 -0
  142. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_do.py +0 -0
  143. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_models.py +0 -0
  144. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_plan.py +0 -0
  145. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_review.py +0 -0
  146. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_surface.py +0 -0
  147. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_task.py +0 -0
  148. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_tools.py +0 -0
  149. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_cli_verify.py +0 -0
  150. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_config.py +0 -0
  151. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_config_env.py +0 -0
  152. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_config_setup.py +0 -0
  153. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_context_agents.py +0 -0
  154. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_context_manager.py +0 -0
  155. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_context_memory.py +0 -0
  156. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_engine.py +0 -0
  157. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_ensemble.py +0 -0
  158. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_events.py +0 -0
  159. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_executor.py +0 -0
  160. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_expert_coder.py +0 -0
  161. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_fix.py +0 -0
  162. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_indexer.py +0 -0
  163. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_init.py +0 -0
  164. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_intent.py +0 -0
  165. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_large_repo.py +0 -0
  166. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_offline.py +0 -0
  167. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_packaging.py +0 -0
  168. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_paths.py +0 -0
  169. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_permissions.py +0 -0
  170. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_plan_schemas.py +0 -0
  171. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_policies.py +0 -0
  172. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_project.py +0 -0
  173. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_providers.py +0 -0
  174. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_recovery.py +0 -0
  175. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_redact.py +0 -0
  176. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_registry.py +0 -0
  177. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_repl.py +0 -0
  178. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_research.py +0 -0
  179. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_retriever.py +0 -0
  180. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_retry.py +0 -0
  181. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_router.py +0 -0
  182. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_run_cli.py +0 -0
  183. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_runtime.py +0 -0
  184. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_security.py +0 -0
  185. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_session.py +0 -0
  186. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_state.py +0 -0
  187. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_storage.py +0 -0
  188. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_stores.py +0 -0
  189. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_supervisor.py +0 -0
  190. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_tasks.py +0 -0
  191. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_tools_dependencies.py +0 -0
  192. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_tools_filesystem.py +0 -0
  193. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_tools_git.py +0 -0
  194. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_tools_search.py +0 -0
  195. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_tools_terminal.py +0 -0
  196. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_verification.py +0 -0
  197. {forgex_cli-0.1.6 → forgex_cli-0.1.8}/tests/unit/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: forgex-cli
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Summary: FORGEX — multi-agent AI software engineering. Plan. Build. Refine. Verify.
5
5
  Project-URL: Homepage, https://github.com/B-max12/Forgex
6
6
  Project-URL: Repository, https://github.com/B-max12/Forgex
@@ -1,3 +1,3 @@
1
1
  """FORGEX — Plan. Build. Refine. Verify."""
2
2
 
3
- __version__ = "0.1.6"
3
+ __version__ = "0.1.8"
@@ -373,7 +373,13 @@ class BaseAgent(ABC):
373
373
 
374
374
  action = str(normalized.get("action") or "").strip().lower()
375
375
  if action == "tool":
376
- tool_name = normalized.get("tool") or normalized.get("name")
376
+ raw_tool = normalized.get("tool") or normalized.get("name")
377
+ if not raw_tool or not isinstance(raw_tool, str):
378
+ protocol_errors += 1
379
+ messages.append(Message(role="assistant", content=raw))
380
+ messages.append(Message(role="user", content="Tool name missing or invalid. Use {\"action\": \"tool\", \"tool\": \"<name>\", \"arguments\": {...}}."))
381
+ continue
382
+ tool_name: str = raw_tool.strip()
377
383
  args = normalized.get("arguments") or normalized.get("args") or {}
378
384
  if not isinstance(args, dict):
379
385
  args = {}
@@ -9,7 +9,6 @@ import sys
9
9
  from pathlib import Path
10
10
  from typing import Any
11
11
 
12
- import typer
13
12
  from prompt_toolkit import PromptSession
14
13
  from prompt_toolkit.completion import WordCompleter
15
14
  from prompt_toolkit.formatted_text import HTML
@@ -168,12 +167,13 @@ class ForgexREPL:
168
167
 
169
168
  def _run_setup_wizard(self) -> None:
170
169
  """Run the setup wizard directly (not through CliRunner) so it can read real stdin."""
171
- import click
170
+ import typer
171
+ import typer.core
172
172
  from forgex.cli.commands.config import setup_command
173
173
 
174
174
  try:
175
- # Create a plain click Context — setup_command only needs ctx.obj for ui_from()
176
- ctx = click.Context(click.Command("setup"))
175
+ # Create a typer Context — setup_command only needs ctx.obj for ui_from()
176
+ ctx = typer.Context(typer.core.TyperCommand("setup"))
177
177
  ctx.obj = {"verbose": False, "quiet": False, "json": False, "plain": False}
178
178
  setup_command(ctx)
179
179
  self.session.refresh()
@@ -53,10 +53,14 @@ _DEFAULT_CATALOG: dict[str, ModelCapabilities] = {
53
53
  known=True,
54
54
  ),
55
55
  # Meta Llama models (OpenRouter / Groq / Ollama)
56
+ # NOTE: Llama models via OpenRouter do not reliably produce native
57
+ # tool_calls in the API response — they often emit XML-style markup
58
+ # instead. Disabling native tools forces the JSON-protocol fallback
59
+ # which works far more reliably with instruction-tuned Llama models.
56
60
  "meta-llama/llama-3.3-70b-instruct": ModelCapabilities(
57
61
  model="meta-llama/llama-3.3-70b-instruct",
58
62
  context_window=131072,
59
- supports_tools=True,
63
+ supports_tools=False,
60
64
  supports_json=True,
61
65
  supports_streaming=True,
62
66
  known=True,
@@ -64,7 +68,7 @@ _DEFAULT_CATALOG: dict[str, ModelCapabilities] = {
64
68
  "meta-llama/llama-3.1-70b-instruct": ModelCapabilities(
65
69
  model="meta-llama/llama-3.1-70b-instruct",
66
70
  context_window=131072,
67
- supports_tools=True,
71
+ supports_tools=False,
68
72
  supports_json=True,
69
73
  supports_streaming=True,
70
74
  known=True,
@@ -72,7 +76,7 @@ _DEFAULT_CATALOG: dict[str, ModelCapabilities] = {
72
76
  "meta-llama/llama-3.1-8b-instruct": ModelCapabilities(
73
77
  model="meta-llama/llama-3.1-8b-instruct",
74
78
  context_window=131072,
75
- supports_tools=True,
79
+ supports_tools=False,
76
80
  supports_json=True,
77
81
  supports_streaming=True,
78
82
  known=True,
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ from typing import Any, cast
4
5
 
5
6
  from forgex.agents.builder import BuilderAgent, execute_task
6
7
  from forgex.config import load_config
@@ -50,6 +51,7 @@ async def test_builder_executes_task_and_records_events(tmp_path):
50
51
  initialize_project(ws)
51
52
  with open_stores(ws) as stores:
52
53
  state = stores.state.load()
54
+ assert state is not None
53
55
  task = Task(id="TASK-001", description="create demo file", acceptance_criteria=["exists"])
54
56
  stores.save_tasks([task], project_id=state.project_id)
55
57
 
@@ -59,7 +61,7 @@ async def test_builder_executes_task_and_records_events(tmp_path):
59
61
  ])
60
62
  ctx = create_context(ws, load_config(ws), agent=AgentRole.BUILDER, events=stores.recorder)
61
63
  tools = ToolExecutor(build_tool_registry(), permission_set_for(AgentRole.BUILDER), ctx)
62
- builder = BuilderAgent(router=router, tools=tools, events=stores.recorder)
64
+ builder = BuilderAgent(router=cast(Any, router), tools=tools, events=stores.recorder)
63
65
 
64
66
  res = await execute_task(stores=stores, task=task, config=load_config(ws), builder=builder)
65
67
  assert res.status == "completed"
@@ -72,6 +74,7 @@ async def test_builder_json_protocol_mode(tmp_path):
72
74
  initialize_project(ws)
73
75
  with open_stores(ws) as stores:
74
76
  state = stores.state.load()
77
+ assert state is not None
75
78
  task = Task(id="TASK-001", description="create demo file", acceptance_criteria=["exists"])
76
79
  stores.save_tasks([task], project_id=state.project_id)
77
80
 
@@ -88,7 +91,7 @@ async def test_builder_json_protocol_mode(tmp_path):
88
91
  ], supports_tools=False)
89
92
  ctx = create_context(ws, load_config(ws), agent=AgentRole.BUILDER, events=stores.recorder)
90
93
  tools = ToolExecutor(build_tool_registry(), permission_set_for(AgentRole.BUILDER), ctx)
91
- builder = BuilderAgent(router=router, tools=tools, events=stores.recorder)
94
+ builder = BuilderAgent(router=cast(Any, router), tools=tools, events=stores.recorder)
92
95
 
93
96
  res = await execute_task(stores=stores, task=task, config=load_config(ws), builder=builder)
94
97
  assert res.status == "completed"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes