forgex-cli 0.1.6__tar.gz → 0.1.7__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.
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/PKG-INFO +1 -1
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/__init__.py +1 -1
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/base.py +7 -1
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/repl.py +3 -3
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_builder_agent.py +5 -2
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/.github/workflows/ci.yml +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/.github/workflows/release.yml +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/.gitignore +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/CHANGELOG.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/LICENSE +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/README.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/SECURITY.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/agents.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/architecture.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/configuration.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/decisions.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/providers.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/quickstart.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/sandbox.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/docs/security.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/examples/demo-project/README.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/examples/demo-project/pyproject.toml +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/examples/demo-project/src/demo/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/examples/demo-project/src/demo/calc.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/examples/demo-project/tests/test_calc.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/pyproject.toml +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/__main__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/architect.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/builder.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/ensemble.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/expert_coder.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/agents/supervisor.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/app.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/build_views.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/build.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/checkpoint.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/config.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/context.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/diff.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/do_cmd.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/doctor.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/fix.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/init.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/logs.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/models.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/plan.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/review.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/rollback.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/run.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/status.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/supervise.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/task.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/tools.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/commands/verify.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/context_memory.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/intent.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/progress.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/runtime.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/session.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/cli/ui.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/config/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/config/loader.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/config/schema.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/context/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/context/chunker.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/context/dependency_graph.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/context/indexer.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/context/manager.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/context/retriever.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/base.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/capabilities.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/factory.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/groq.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/local.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/openai_compatible.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/registry.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/models/router.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/checkpoints.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/engine.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/events.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/lockfile.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/retry.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/state.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/stores.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/orchestration/workflow.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/project.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/prompts/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/prompts/architect.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/prompts/builder.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/prompts/expert_coder.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/prompts/reviewer.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/prompts/supervisor.md +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/research/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/research/citations.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/research/engine.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/research/sources.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/sandbox/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/sandbox/executor.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/sandbox/permissions.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/sandbox/policies.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/agent.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/checkpoint.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/error.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/event.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/plan.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/project.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/research.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/result.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/schemas/task.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/storage/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/storage/database.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/storage/migrations.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/storage/repositories.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/base.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/dependencies.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/filesystem.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/git.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/project.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/search.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/terminal.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/testing.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/tools/verification.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/utils/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/utils/logging.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/utils/paths.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/src/forgex/utils/redact.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/conftest.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/__init__.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_agents_architect.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_checkpoints.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_build.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_checkpoint.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_do.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_models.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_plan.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_review.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_surface.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_task.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_tools.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_cli_verify.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_config.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_config_env.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_config_setup.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_context_agents.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_context_manager.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_context_memory.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_engine.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_ensemble.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_events.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_executor.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_expert_coder.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_fix.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_indexer.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_init.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_intent.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_large_repo.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_offline.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_packaging.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_paths.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_permissions.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_plan_schemas.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_policies.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_project.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_providers.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_recovery.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_redact.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_registry.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_repl.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_research.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_retriever.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_retry.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_router.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_run_cli.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_runtime.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_security.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_session.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_state.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_storage.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_stores.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_supervisor.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_tasks.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_tools_dependencies.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_tools_filesystem.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_tools_git.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_tools_search.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_tools_terminal.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/tests/unit/test_verification.py +0 -0
- {forgex_cli-0.1.6 → forgex_cli-0.1.7}/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.
|
|
3
|
+
Version: 0.1.7
|
|
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
|
|
@@ -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
|
-
|
|
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
|
|
@@ -169,11 +168,12 @@ class ForgexREPL:
|
|
|
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
170
|
import click
|
|
171
|
+
import typer
|
|
172
172
|
from forgex.cli.commands.config import setup_command
|
|
173
173
|
|
|
174
174
|
try:
|
|
175
|
-
# Create a
|
|
176
|
-
ctx =
|
|
175
|
+
# Create a typer Context — setup_command only needs ctx.obj for ui_from()
|
|
176
|
+
ctx = typer.Context(click.Command("setup"))
|
|
177
177
|
ctx.obj = {"verbose": False, "quiet": False, "json": False, "plain": False}
|
|
178
178
|
setup_command(ctx)
|
|
179
179
|
self.session.refresh()
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|