forgex-cli 0.1.0__tar.gz → 0.1.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.
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/PKG-INFO +1 -1
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/__init__.py +1 -1
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/repl.py +34 -16
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/.github/workflows/ci.yml +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/.github/workflows/release.yml +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/.gitignore +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/CHANGELOG.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/LICENSE +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/README.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/SECURITY.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/agents.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/architecture.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/configuration.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/decisions.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/providers.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/quickstart.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/sandbox.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/docs/security.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/examples/demo-project/README.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/examples/demo-project/pyproject.toml +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/examples/demo-project/src/demo/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/examples/demo-project/src/demo/calc.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/examples/demo-project/tests/test_calc.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/pyproject.toml +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/__main__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/architect.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/base.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/builder.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/ensemble.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/expert_coder.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/agents/supervisor.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/app.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/build_views.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/build.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/checkpoint.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/config.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/context.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/diff.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/do_cmd.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/doctor.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/fix.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/init.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/logs.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/models.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/plan.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/review.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/rollback.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/run.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/status.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/supervise.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/task.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/tools.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/commands/verify.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/context_memory.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/intent.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/progress.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/runtime.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/session.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/cli/ui.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/config/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/config/loader.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/config/schema.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/context/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/context/chunker.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/context/dependency_graph.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/context/indexer.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/context/manager.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/context/retriever.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/base.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/capabilities.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/factory.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/groq.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/local.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/openai_compatible.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/registry.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/models/router.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/checkpoints.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/engine.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/events.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/lockfile.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/retry.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/state.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/stores.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/orchestration/workflow.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/project.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/prompts/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/prompts/architect.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/prompts/builder.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/prompts/expert_coder.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/prompts/reviewer.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/prompts/supervisor.md +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/research/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/research/citations.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/research/engine.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/research/sources.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/sandbox/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/sandbox/executor.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/sandbox/permissions.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/sandbox/policies.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/agent.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/checkpoint.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/error.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/event.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/plan.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/project.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/research.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/result.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/schemas/task.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/storage/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/storage/database.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/storage/migrations.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/storage/repositories.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/base.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/dependencies.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/filesystem.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/git.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/project.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/search.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/terminal.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/testing.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/tools/verification.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/utils/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/utils/logging.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/utils/paths.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/src/forgex/utils/redact.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/conftest.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/__init__.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_agents_architect.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_builder_agent.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_checkpoints.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_build.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_checkpoint.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_do.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_models.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_plan.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_review.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_surface.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_task.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_tools.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_cli_verify.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_config.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_config_env.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_config_setup.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_context_agents.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_context_manager.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_context_memory.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_engine.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_ensemble.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_events.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_executor.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_expert_coder.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_fix.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_indexer.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_init.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_intent.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_large_repo.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_offline.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_packaging.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_paths.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_permissions.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_plan_schemas.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_policies.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_project.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_providers.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_recovery.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_redact.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_registry.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_repl.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_research.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_retriever.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_retry.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_router.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_run_cli.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_runtime.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_security.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_session.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_state.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_storage.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_stores.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_supervisor.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_tasks.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_tools_dependencies.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_tools_filesystem.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_tools_git.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_tools_search.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_tools_terminal.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/tests/unit/test_verification.py +0 -0
- {forgex_cli-0.1.0 → forgex_cli-0.1.2}/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.2
|
|
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
|
|
@@ -9,6 +9,7 @@ import sys
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
|
+
import typer
|
|
12
13
|
from prompt_toolkit import PromptSession
|
|
13
14
|
from prompt_toolkit.completion import WordCompleter
|
|
14
15
|
from prompt_toolkit.formatted_text import HTML
|
|
@@ -163,7 +164,23 @@ class ForgexREPL:
|
|
|
163
164
|
if sys.stdin.isatty():
|
|
164
165
|
from rich.prompt import Confirm
|
|
165
166
|
if Confirm.ask("Launch the guided setup wizard now?", default=True):
|
|
166
|
-
self.
|
|
167
|
+
self._run_setup_wizard()
|
|
168
|
+
|
|
169
|
+
def _run_setup_wizard(self) -> None:
|
|
170
|
+
"""Run the setup wizard directly (not through CliRunner) so it can read real stdin."""
|
|
171
|
+
import click
|
|
172
|
+
from forgex.cli.commands.config import setup_command
|
|
173
|
+
|
|
174
|
+
try:
|
|
175
|
+
# Create a plain click Context — setup_command only needs ctx.obj for ui_from()
|
|
176
|
+
ctx = click.Context(click.Command("setup"))
|
|
177
|
+
ctx.obj = {"verbose": False, "quiet": False, "json": False, "plain": False}
|
|
178
|
+
setup_command(ctx)
|
|
179
|
+
self.session.refresh()
|
|
180
|
+
except (KeyboardInterrupt, EOFError):
|
|
181
|
+
self.console.print("\n[yellow]Setup cancelled.[/yellow]")
|
|
182
|
+
except Exception as exc:
|
|
183
|
+
self.console.print(f"[red]Setup error:[/red] {exc}")
|
|
167
184
|
|
|
168
185
|
def print_help(self) -> None:
|
|
169
186
|
"""Display help table for natural language usage and power user commands."""
|
|
@@ -325,25 +342,26 @@ class ForgexREPL:
|
|
|
325
342
|
break
|
|
326
343
|
|
|
327
344
|
def _run_cli_command(self, args: list[str]) -> bool:
|
|
328
|
-
"""Invoke a Typer CLI command within the REPL session.
|
|
329
|
-
|
|
345
|
+
"""Invoke a Typer CLI command within the REPL session.
|
|
346
|
+
|
|
347
|
+
Uses subprocess to run each command so that:
|
|
348
|
+
1. Each command gets a fresh event loop (fixes 'Event loop is closed')
|
|
349
|
+
2. Interactive prompts can read real stdin
|
|
350
|
+
3. Rich output goes directly to the terminal
|
|
351
|
+
"""
|
|
352
|
+
# Interactive commands that need real stdin must bypass CliRunner
|
|
353
|
+
if args == ["config", "setup"]:
|
|
354
|
+
self._run_setup_wizard()
|
|
355
|
+
return True
|
|
330
356
|
|
|
331
|
-
|
|
357
|
+
import subprocess
|
|
332
358
|
|
|
333
|
-
runner = CliRunner()
|
|
334
359
|
success = False
|
|
335
360
|
try:
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
sys.stdout.flush()
|
|
341
|
-
if result.exit_code != 0 and result.exception:
|
|
342
|
-
if isinstance(result.exception, ForgexError):
|
|
343
|
-
self.console.print(f"[red]✗[/red] {result.exception}")
|
|
344
|
-
elif not isinstance(result.exception, SystemExit):
|
|
345
|
-
self.console.print(f"[red]Error:[/red] {result.exception}")
|
|
346
|
-
success = result.exit_code == 0
|
|
361
|
+
# Run as a subprocess so each command gets a fresh Python/asyncio state
|
|
362
|
+
cmd = [sys.executable, "-m", "forgex", *args]
|
|
363
|
+
result = subprocess.run(cmd, cwd=os.getcwd())
|
|
364
|
+
success = result.returncode == 0
|
|
347
365
|
except ForgexError as exc:
|
|
348
366
|
self.console.print(f"[red]✗[/red] {exc}")
|
|
349
367
|
except KeyboardInterrupt:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|