proseforge-agent 0.3.0__tar.gz → 0.3.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.
- {proseforge_agent-0.3.0/src/proseforge_agent.egg-info → proseforge_agent-0.3.2}/PKG-INFO +28 -20
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/README.md +27 -19
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/pyproject.toml +1 -1
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/__init__.py +1 -1
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/cli.py +16 -10
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/dotenv.py +4 -2
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/wizard.py +138 -11
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/fullscreen.py +31 -4
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2/src/proseforge_agent.egg-info}/PKG-INFO +28 -20
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/SOURCES.txt +3 -1
- proseforge_agent-0.3.2/tests/test_default_tui_on_bare_command.py +103 -0
- proseforge_agent-0.3.2/tests/test_dotenv_workspace_env.py +24 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_first_run_auto_trigger.py +8 -6
- proseforge_agent-0.3.2/tests/test_installer_first_run_ux.py +34 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_package.py +1 -1
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_pypi_first_publish_and_version_bump.py +2 -2
- proseforge_agent-0.3.0/tests/test_default_chat_repl_on_bare_command.py +0 -100
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/LICENSE +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/setup.cfg +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/__main__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/_bootstrap.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/artifacts.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/attachments.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/audit.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/context_window.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/control.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/degradation.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/eval.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/events.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/execution_guard.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/function_calling.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/intent_router.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/kernel.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/loop.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/middleware.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/modes.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/observability.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/offline.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/permissions.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/planner.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/profiles.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/prompt_templates.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/provider_fallback.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/reflection.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/request_cache.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/safety.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/sandbox.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/structured_output.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/subagent.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/tools.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/types.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/capabilities.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/accept.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/context.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/draft.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/lifecycle.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/review.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/rewrite.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/context.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/handoff.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/memory.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/prompts.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/repl.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/retrieval.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/session.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/slash.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/system_prompts.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/transcript.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/concurrency.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/config.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/core.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/recommend.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/workbook.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/demo.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/base.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/checkpoints.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/daytona.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/docker.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/file_sync.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/local.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/modal.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_runner.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/serverless.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/singularity.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/ssh.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/errors.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/trajectories.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/base.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/core.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/delivery.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/media.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/base.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/discord.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/email.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/mobile_email.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/signal.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/slack.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram_transport.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/whatsapp.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/poller.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/auth.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/app_dirs.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/auto_trigger.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_build.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_packaging.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/ci_matrix.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/docker_plan.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/doctor.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/first_run.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installer_scripts.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installers.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/linux.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/local_models.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/macos.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/migrations.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/package_checks.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/platform_io.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/provider_setup.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/qa_matrix.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/secrets.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/shell.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/support_bundle.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/uninstall.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/windows.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/base.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/capabilities.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/certification.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/docs_refresh.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/fake.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/http.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/openai_compatible.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/policies.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/probes.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/profiles.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/_openai_shape.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/anthropic.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/deepseek.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/doubao.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/gemini.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/glm.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/grok.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/mimo.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/minimax.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/openai.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/anthropic.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/deepseek.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/doubao.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/gemini.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/glm.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/mimo.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/minimax.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/openai.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/qwen.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/xai.yaml +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/qwen.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/router.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/streaming.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/usage.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/approval.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/client.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/credentials.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/policy.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/schema.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/compact.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/ingest.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/nudges.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/review.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/schema.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/store.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/user_model.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/core.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/desktop.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/jobs.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/webhook.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/approval_queue.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/artifacts.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/backup_verification.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/bible.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/character_arcs.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/continuity.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/draft_versioning.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/editorial_pipeline.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/exporter.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/foreshadowing.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/importer.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/literary_regression.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manifest.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manuscript_search.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/plot_threads.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/project_health.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/publishing.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reader_review.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/relationship_graph.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reorganize.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/rewrite_strategies.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/safety.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/scenes.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/storage.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/style_profile.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/timeline.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_analytics.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_quality.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_rules.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/intake.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/phase_plan.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/dependencies.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/discovery.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/harness.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/hooks.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manager.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manifest.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/permissions.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/sandbox.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/adapter.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/results.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/complete_agent_gate.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/publish.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/version_policy.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/render.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/embeddings.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evaluation.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evidence.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/hybrid.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/index.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/ingestion.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/router.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/vector_store.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/service/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/service/api.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/service/http_server.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/config_generator.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/first_run.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/modes.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/recovery.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/summary.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/audit.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/creation.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/hub.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/improvement.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/install.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/usage.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/fakes.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/cloud_browser.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/media.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/url_safety.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/web_search.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/ansi.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/app.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/keys.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/screen.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/streaming.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/__init__.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/recovery.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/state.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workspace.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/dependency_links.txt +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/entry_points.txt +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/requires.txt +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/top_level.txt +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_events_jobs.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_kernel.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_loop.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_profiles_personas.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_safety_guard.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_tools_permissions.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_app_dirs.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_attachment_ingestion.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_audit_trail_debuggability.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_binary_build.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_binary_packaging.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_capabilities.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chapter_lifecycle.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chapter_review.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_cli_repl.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_memory_preferences.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_prompt_protocol.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_retrieval_citations.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_session_store.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_workflow_handoff.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_ci_pipeline.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli_commands.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli_config_yaml_example_seed.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli_quickstart.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_community_and_agent_docs.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_complete_agent_release_gate.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_concurrency_locking.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_config.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_context_window_management.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_control_interrupt.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_conversation_lifecycle.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cross_session_search.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_daily_recommendations.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_daily_workbook.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_default_provider_resolution.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_docker_distribution.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_dotenv_support.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_e2e_demo.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_evidence_pack.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_execution_guard_timeout.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_extensions.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_first_run_onboarding.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_fs_edit_and_registry_hardening.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_general_tools.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_graceful_degradation.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_injection_guard_cjk_precision.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_installation_doctor.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_intent_router.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_linux_native_support.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_llm_fake_and_routing.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_llm_response_normalization.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_local_agent_service_api.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_loud_placeholders_and_wiring.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_low_severity_review_cleanups.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_macos_native_support.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_managed_install_scripts.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_mcp_policy_enforced_in_client.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_compaction.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_ingestion.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_schema.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_store.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_middleware_hooks_trajectory_datasets.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_middleware_wiring.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_native_qa_matrix.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_native_secret_storage.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_observer_hooks_telemetry_export.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_offline_local_model_setup.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_offline_mode.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_openai_compatible_provider.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_os_installers.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_phase_plan_generator.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_platform_io.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_prompt_template_registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_proseforge_adapter.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_anthropic.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_certification.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_deepseek.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_doubao.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_fallback.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_gemini.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_glm.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_grok.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_mimo.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_minimax.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_openai.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_probes.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_profiles.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_qwen.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_registry.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_router.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_setup_wizard.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_usage_metering.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_pypi_publish.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_python_install_flows.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_readme_localization.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_release_checks.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_report_readiness_badge.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_reports.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_request_cache.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_retrieval_router.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_rewrite_accept.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_self_verification.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_service_http_server.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_session_branching.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_session_export_import.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_shell_completions_launchers.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_store_concurrency_and_idempotency.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_streaming_responses.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_streaming_tool_output.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_structured_function_calling.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_sub_agent.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_support_bundle.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_system_prompt_management.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_task_planner.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_tool_result_artifacts_output_limits.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_tool_sandbox.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_tool_timeout_rate_limit_circuit_breaker.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_unified_redaction.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_uninstall_data_retention.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_upgrade_migration_backup.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_windows_native_support.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_windows_utf8_bootstrap.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_workflow_recovery.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_workflow_state.py +0 -0
- {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_workspace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: proseforge-agent
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Agentic orchestration layer for long-form novel production on top of the ProseForge engine.
|
|
5
5
|
Author: ProseForge Agent
|
|
6
6
|
License: Apache-2.0
|
|
@@ -32,7 +32,7 @@ Dynamic: license-file
|
|
|
32
32
|
<p align="center">
|
|
33
33
|
<a href="README.zh-CN.md">简体中文</a> ·
|
|
34
34
|
<a href="https://pypi.org/project/proseforge-agent/">PyPI</a> ·
|
|
35
|
-
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2
|
|
35
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.2">Release v0.3.2</a> ·
|
|
36
36
|
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent">GHCR</a>
|
|
37
37
|
</p>
|
|
38
38
|
|
|
@@ -58,8 +58,8 @@ image, or a background agent with gateway integrations.
|
|
|
58
58
|
<tr><td><b>Draft with memory</b></td><td>Retrieve canon, timeline, character notes, prior scenes, and evidence packs before the model writes.</td></tr>
|
|
59
59
|
<tr><td><b>Review and revise</b></td><td>Run a chapter lifecycle from draft to review, rewrite, and accept, with quality gates and rollback-friendly artifacts.</td></tr>
|
|
60
60
|
<tr><td><b>Use the model you want</b></td><td>Profiles for OpenAI, Anthropic, Gemini, xAI/Grok, DeepSeek, Qwen, GLM, Mimo, MiniMax, Doubao, plus an offline fake provider.</td></tr>
|
|
61
|
-
<tr><td><b>Run it like a real tool</b></td><td>
|
|
62
|
-
<tr><td><b>Published now</b></td><td><code>v0.2
|
|
61
|
+
<tr><td><b>Run it like a real tool</b></td><td>Full-screen TUI by default, explicit chat command, local API, Docker image, Telegram gateway, MCP stdio, local execution, cron, and telemetry.</td></tr>
|
|
62
|
+
<tr><td><b>Published now</b></td><td><code>v0.3.2</code> is the first-run UX release: one-line install upgrades the PyPI tool, repairs PATH priority, runs doctor, and opens the guided setup/TUI flow.</td></tr>
|
|
63
63
|
</table>
|
|
64
64
|
|
|
65
65
|
---
|
|
@@ -69,7 +69,7 @@ image, or a background agent with gateway integrations.
|
|
|
69
69
|
### Python package
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
|
-
pip install proseforge-agent
|
|
72
|
+
pip install -U proseforge-agent
|
|
73
73
|
pf-agent --help
|
|
74
74
|
```
|
|
75
75
|
|
|
@@ -85,6 +85,12 @@ curl -fsSL https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent
|
|
|
85
85
|
iex (irm https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.ps1)
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
+
The one-line installer uses PyPI + `uv tool` by default. It installs or
|
|
89
|
+
upgrades `proseforge-agent`, puts the manager bin directory first on PATH,
|
|
90
|
+
runs `pf-agent doctor`, then starts `pf-agent setup --quick`. Use
|
|
91
|
+
`--no-setup`, `--no-launch`, or `--non-interactive` on POSIX, and
|
|
92
|
+
`-NoSetup`, `-NoLaunch`, or `-NonInteractive` on PowerShell, when scripting.
|
|
93
|
+
|
|
88
94
|
### Docker
|
|
89
95
|
|
|
90
96
|
```bash
|
|
@@ -98,22 +104,24 @@ want unreleased changes from `main`.
|
|
|
98
104
|
## Getting Started
|
|
99
105
|
|
|
100
106
|
```bash
|
|
101
|
-
pf-agent
|
|
102
|
-
pf-agent
|
|
103
|
-
pf-agent
|
|
107
|
+
pf-agent quickstart # 60-second offline tour, no API keys needed
|
|
108
|
+
pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
|
|
109
|
+
pf-agent # full-screen terminal UI
|
|
110
|
+
pf-agent tui # same TUI, with explicit flags
|
|
104
111
|
pf-agent chat --message "draft an opening" --provider fake
|
|
105
112
|
pf-agent run --goal "draft a one-line opening" --max-iterations 5
|
|
106
113
|
pf-agent service serve # local HTTP API on 127.0.0.1:8765
|
|
107
114
|
```
|
|
108
115
|
|
|
109
116
|
The bare `pf-agent` command works like other coding agents' CLIs: the
|
|
110
|
-
first run bootstraps a workspace,
|
|
111
|
-
your configured default model. Without
|
|
112
|
-
fake provider so you can tour the CLI
|
|
117
|
+
first run bootstraps a workspace, then opens the full-screen terminal UI.
|
|
118
|
+
After `pf-agent setup --quick` it talks to your configured default model. Without
|
|
119
|
+
setup, it runs against the offline fake provider so you can tour the CLI
|
|
120
|
+
with no keys.
|
|
113
121
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
122
|
+
The setup wizard writes API keys to `.pf-agent/.env`; `config.yaml` stores
|
|
123
|
+
only provider metadata and `api_key_ref`. Every command accepts
|
|
124
|
+
`--provider fake` for a no-key offline tour.
|
|
117
125
|
|
|
118
126
|
## Project Boundary
|
|
119
127
|
|
|
@@ -125,9 +133,9 @@ workflow state, conversational agent loops, and background event handling.
|
|
|
125
133
|
|
|
126
134
|
## Release Status
|
|
127
135
|
|
|
128
|
-
`v0.2
|
|
129
|
-
Release links: [PyPI](https://pypi.org/project/proseforge-agent/),
|
|
130
|
-
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2
|
|
136
|
+
`v0.3.2` is prepared as the first-run UX patch release for July 3, 2026.
|
|
137
|
+
Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.2/),
|
|
138
|
+
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.2),
|
|
131
139
|
[GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
|
|
132
140
|
and [`CHANGELOG.md`](CHANGELOG.md).
|
|
133
141
|
|
|
@@ -321,7 +329,7 @@ requests re-checked by downstream policy, plus research-ready
|
|
|
321
329
|
`PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
|
|
322
330
|
PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
|
|
323
331
|
with injectable runner + `dry_run` for offline tests; tokens never appear
|
|
324
|
-
in the plan, report, or logs. The public `v0.2
|
|
332
|
+
in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
|
|
325
333
|
Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
|
|
326
334
|
repository.
|
|
327
335
|
|
|
@@ -440,8 +448,8 @@ configs/ agent and provider example configs
|
|
|
440
448
|
docs/ operator, developer, implementation, and
|
|
441
449
|
task-card plans (docs/superpowers/plans/)
|
|
442
450
|
samples/ sample extensions
|
|
443
|
-
tests/ pytest suite (
|
|
444
|
-
tiers + fixtures
|
|
451
|
+
tests/ pytest suite (1358 tests: 35 integration plus
|
|
452
|
+
offline contract/golden tiers) + fixtures
|
|
445
453
|
.github/workflows/ci.yml cross-platform CI (Windows, macOS, Linux)
|
|
446
454
|
```
|
|
447
455
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="README.zh-CN.md">简体中文</a> ·
|
|
15
15
|
<a href="https://pypi.org/project/proseforge-agent/">PyPI</a> ·
|
|
16
|
-
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2
|
|
16
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.2">Release v0.3.2</a> ·
|
|
17
17
|
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent">GHCR</a>
|
|
18
18
|
</p>
|
|
19
19
|
|
|
@@ -39,8 +39,8 @@ image, or a background agent with gateway integrations.
|
|
|
39
39
|
<tr><td><b>Draft with memory</b></td><td>Retrieve canon, timeline, character notes, prior scenes, and evidence packs before the model writes.</td></tr>
|
|
40
40
|
<tr><td><b>Review and revise</b></td><td>Run a chapter lifecycle from draft to review, rewrite, and accept, with quality gates and rollback-friendly artifacts.</td></tr>
|
|
41
41
|
<tr><td><b>Use the model you want</b></td><td>Profiles for OpenAI, Anthropic, Gemini, xAI/Grok, DeepSeek, Qwen, GLM, Mimo, MiniMax, Doubao, plus an offline fake provider.</td></tr>
|
|
42
|
-
<tr><td><b>Run it like a real tool</b></td><td>
|
|
43
|
-
<tr><td><b>Published now</b></td><td><code>v0.2
|
|
42
|
+
<tr><td><b>Run it like a real tool</b></td><td>Full-screen TUI by default, explicit chat command, local API, Docker image, Telegram gateway, MCP stdio, local execution, cron, and telemetry.</td></tr>
|
|
43
|
+
<tr><td><b>Published now</b></td><td><code>v0.3.2</code> is the first-run UX release: one-line install upgrades the PyPI tool, repairs PATH priority, runs doctor, and opens the guided setup/TUI flow.</td></tr>
|
|
44
44
|
</table>
|
|
45
45
|
|
|
46
46
|
---
|
|
@@ -50,7 +50,7 @@ image, or a background agent with gateway integrations.
|
|
|
50
50
|
### Python package
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
pip install proseforge-agent
|
|
53
|
+
pip install -U proseforge-agent
|
|
54
54
|
pf-agent --help
|
|
55
55
|
```
|
|
56
56
|
|
|
@@ -66,6 +66,12 @@ curl -fsSL https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent
|
|
|
66
66
|
iex (irm https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.ps1)
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
The one-line installer uses PyPI + `uv tool` by default. It installs or
|
|
70
|
+
upgrades `proseforge-agent`, puts the manager bin directory first on PATH,
|
|
71
|
+
runs `pf-agent doctor`, then starts `pf-agent setup --quick`. Use
|
|
72
|
+
`--no-setup`, `--no-launch`, or `--non-interactive` on POSIX, and
|
|
73
|
+
`-NoSetup`, `-NoLaunch`, or `-NonInteractive` on PowerShell, when scripting.
|
|
74
|
+
|
|
69
75
|
### Docker
|
|
70
76
|
|
|
71
77
|
```bash
|
|
@@ -79,22 +85,24 @@ want unreleased changes from `main`.
|
|
|
79
85
|
## Getting Started
|
|
80
86
|
|
|
81
87
|
```bash
|
|
82
|
-
pf-agent
|
|
83
|
-
pf-agent
|
|
84
|
-
pf-agent
|
|
88
|
+
pf-agent quickstart # 60-second offline tour, no API keys needed
|
|
89
|
+
pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
|
|
90
|
+
pf-agent # full-screen terminal UI
|
|
91
|
+
pf-agent tui # same TUI, with explicit flags
|
|
85
92
|
pf-agent chat --message "draft an opening" --provider fake
|
|
86
93
|
pf-agent run --goal "draft a one-line opening" --max-iterations 5
|
|
87
94
|
pf-agent service serve # local HTTP API on 127.0.0.1:8765
|
|
88
95
|
```
|
|
89
96
|
|
|
90
97
|
The bare `pf-agent` command works like other coding agents' CLIs: the
|
|
91
|
-
first run bootstraps a workspace,
|
|
92
|
-
your configured default model. Without
|
|
93
|
-
fake provider so you can tour the CLI
|
|
98
|
+
first run bootstraps a workspace, then opens the full-screen terminal UI.
|
|
99
|
+
After `pf-agent setup --quick` it talks to your configured default model. Without
|
|
100
|
+
setup, it runs against the offline fake provider so you can tour the CLI
|
|
101
|
+
with no keys.
|
|
94
102
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
103
|
+
The setup wizard writes API keys to `.pf-agent/.env`; `config.yaml` stores
|
|
104
|
+
only provider metadata and `api_key_ref`. Every command accepts
|
|
105
|
+
`--provider fake` for a no-key offline tour.
|
|
98
106
|
|
|
99
107
|
## Project Boundary
|
|
100
108
|
|
|
@@ -106,9 +114,9 @@ workflow state, conversational agent loops, and background event handling.
|
|
|
106
114
|
|
|
107
115
|
## Release Status
|
|
108
116
|
|
|
109
|
-
`v0.2
|
|
110
|
-
Release links: [PyPI](https://pypi.org/project/proseforge-agent/),
|
|
111
|
-
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2
|
|
117
|
+
`v0.3.2` is prepared as the first-run UX patch release for July 3, 2026.
|
|
118
|
+
Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.2/),
|
|
119
|
+
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.2),
|
|
112
120
|
[GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
|
|
113
121
|
and [`CHANGELOG.md`](CHANGELOG.md).
|
|
114
122
|
|
|
@@ -302,7 +310,7 @@ requests re-checked by downstream policy, plus research-ready
|
|
|
302
310
|
`PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
|
|
303
311
|
PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
|
|
304
312
|
with injectable runner + `dry_run` for offline tests; tokens never appear
|
|
305
|
-
in the plan, report, or logs. The public `v0.2
|
|
313
|
+
in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
|
|
306
314
|
Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
|
|
307
315
|
repository.
|
|
308
316
|
|
|
@@ -421,8 +429,8 @@ configs/ agent and provider example configs
|
|
|
421
429
|
docs/ operator, developer, implementation, and
|
|
422
430
|
task-card plans (docs/superpowers/plans/)
|
|
423
431
|
samples/ sample extensions
|
|
424
|
-
tests/ pytest suite (
|
|
425
|
-
tiers + fixtures
|
|
432
|
+
tests/ pytest suite (1358 tests: 35 integration plus
|
|
433
|
+
offline contract/golden tiers) + fixtures
|
|
426
434
|
.github/workflows/ci.yml cross-platform CI (Windows, macOS, Linux)
|
|
427
435
|
```
|
|
428
436
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "proseforge-agent"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.2"
|
|
8
8
|
description = "Agentic orchestration layer for long-form novel production on top of the ProseForge engine."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -455,7 +455,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
455
455
|
parser.add_argument(
|
|
456
456
|
"--no-default",
|
|
457
457
|
action="store_true",
|
|
458
|
-
help="with no command, print help instead of launching the default
|
|
458
|
+
help="with no command, print help instead of launching the default terminal UI",
|
|
459
459
|
)
|
|
460
460
|
|
|
461
461
|
shared = _output_parser()
|
|
@@ -5536,6 +5536,8 @@ def _handle_setup(args: argparse.Namespace) -> int:
|
|
|
5536
5536
|
no_shell=args.no_shell,
|
|
5537
5537
|
repair=args.repair,
|
|
5538
5538
|
print_config=args.print_config,
|
|
5539
|
+
interactive=not args.non_interactive and not args.minimal and not args.print_config,
|
|
5540
|
+
launch=False,
|
|
5539
5541
|
)
|
|
5540
5542
|
if args.print_config:
|
|
5541
5543
|
print(result.rendered_config, end="")
|
|
@@ -6827,8 +6829,8 @@ def _handle_install(args: argparse.Namespace) -> int:
|
|
|
6827
6829
|
def _dispatch_bare_command(args: argparse.Namespace) -> int:
|
|
6828
6830
|
"""Dispatch bare ``pf-agent`` (no subcommand).
|
|
6829
6831
|
|
|
6830
|
-
When the workspace is already configured, launch the
|
|
6831
|
-
|
|
6832
|
+
When the workspace is already configured, launch the terminal UI.
|
|
6833
|
+
Otherwise run first-run guidance, then enter that same UI. Runtime failure is
|
|
6832
6834
|
reported as a one-line message, never a Python traceback.
|
|
6833
6835
|
"""
|
|
6834
6836
|
try:
|
|
@@ -6838,19 +6840,23 @@ def _dispatch_bare_command(args: argparse.Namespace) -> int:
|
|
|
6838
6840
|
decision = AutoBootstrap(root=root).decide()
|
|
6839
6841
|
if decision.verdict != SKIP:
|
|
6840
6842
|
# Auto-run the non-destructive first-run bootstrap, then stamp the
|
|
6841
|
-
# consent marker so subsequent invocations skip straight to
|
|
6843
|
+
# consent marker so subsequent invocations skip straight to the UI.
|
|
6842
6844
|
from .install.first_run import FirstRunWizard
|
|
6843
6845
|
|
|
6844
6846
|
print(f"First run: {decision.reason}. Setting up your workspace...")
|
|
6845
6847
|
FirstRunWizard(root).run({})
|
|
6846
6848
|
complete_first_run(root)
|
|
6847
6849
|
|
|
6848
|
-
|
|
6849
|
-
|
|
6850
|
-
|
|
6851
|
-
|
|
6852
|
-
|
|
6853
|
-
|
|
6850
|
+
tui_args = argparse.Namespace(
|
|
6851
|
+
provider=None,
|
|
6852
|
+
project=None,
|
|
6853
|
+
no_project=False,
|
|
6854
|
+
mode="general_chat",
|
|
6855
|
+
check=False,
|
|
6856
|
+
plain=False,
|
|
6857
|
+
format=getattr(args, "format", "terminal"),
|
|
6858
|
+
)
|
|
6859
|
+
return _handle_tui(tui_args)
|
|
6854
6860
|
except ProseForgeAgentError as exc:
|
|
6855
6861
|
print(f"error: {exc}", file=sys.stderr)
|
|
6856
6862
|
return 2
|
|
@@ -7,7 +7,8 @@ shell variables. Load precedence (higher wins):
|
|
|
7
7
|
1. existing ``os.environ`` (never overridden by default)
|
|
8
8
|
2. ``.env.local``
|
|
9
9
|
3. ``.env``
|
|
10
|
-
4.
|
|
10
|
+
4. ``.pf-agent/.env`` (workspace setup)
|
|
11
|
+
5. ``<config_dir>/proseforge-agent.env`` (machine defaults)
|
|
11
12
|
|
|
12
13
|
``DotenvLoader`` takes an ordered list of paths from LOWEST to HIGHEST
|
|
13
14
|
precedence and merges them; ``load_default_files`` builds that list.
|
|
@@ -99,10 +100,11 @@ class DotenvLoader:
|
|
|
99
100
|
|
|
100
101
|
def default_files(root: str | Path = ".", config_dir: str | Path | None = None) -> list[Path]:
|
|
101
102
|
"""Ordered low-to-high precedence file list for the default load."""
|
|
102
|
-
root_path = Path(root)
|
|
103
|
+
root_path = Path(root).resolve()
|
|
103
104
|
files: list[Path] = []
|
|
104
105
|
if config_dir is not None:
|
|
105
106
|
files.append(Path(config_dir) / _MACHINE_ENV_NAME)
|
|
107
|
+
files.append(root_path / ".pf-agent" / ".env")
|
|
106
108
|
files.append(root_path / ".env")
|
|
107
109
|
files.append(root_path / ".env.local")
|
|
108
110
|
return files
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
+
import sys
|
|
6
7
|
from dataclasses import asdict, dataclass, field
|
|
7
8
|
from pathlib import Path
|
|
8
|
-
from typing import Any, Literal
|
|
9
|
+
from typing import Any, Literal, TextIO
|
|
9
10
|
|
|
10
11
|
from .config_generator import SetupConfigGenerator, load_existing, provider_entry, redact_config_text
|
|
11
12
|
from .modes import PROVIDER_ORDER, SetupMode
|
|
@@ -58,11 +59,15 @@ class SetupWizard:
|
|
|
58
59
|
root: str | Path | None = None,
|
|
59
60
|
*,
|
|
60
61
|
env: dict[str, str] | None = None,
|
|
62
|
+
input_stream: TextIO | None = None,
|
|
63
|
+
output_stream: TextIO | None = None,
|
|
61
64
|
provider_ping=None,
|
|
62
65
|
config_generator: SetupConfigGenerator | None = None,
|
|
63
66
|
) -> None:
|
|
64
67
|
self.root = Path(root or ".pf-agent")
|
|
65
68
|
self.env = dict(os.environ if env is None else env)
|
|
69
|
+
self.input_stream = input_stream or sys.stdin
|
|
70
|
+
self.output_stream = output_stream or sys.stdout
|
|
66
71
|
self.provider_ping = provider_ping
|
|
67
72
|
self.config_generator = config_generator or SetupConfigGenerator()
|
|
68
73
|
|
|
@@ -76,10 +81,14 @@ class SetupWizard:
|
|
|
76
81
|
no_shell: bool = False,
|
|
77
82
|
repair: bool = False,
|
|
78
83
|
print_config: bool = False,
|
|
84
|
+
interactive: bool = False,
|
|
85
|
+
launch: bool = True,
|
|
79
86
|
) -> SetupResult:
|
|
80
87
|
mode = SetupMode(mode)
|
|
81
88
|
config_path = self.root / "config.yaml"
|
|
82
89
|
workspace_path = self.root / "workspace"
|
|
90
|
+
provider_models: dict[str, str] = {}
|
|
91
|
+
env_values: dict[str, str] = {}
|
|
83
92
|
|
|
84
93
|
if print_config and config_path.exists():
|
|
85
94
|
text = redact_config_text(config_path.read_text(encoding="utf-8"))
|
|
@@ -97,9 +106,26 @@ class SetupWizard:
|
|
|
97
106
|
needs_backup = bool(config_path.exists() and (reconfigure or add_provider or repair))
|
|
98
107
|
backup_path = backup_config(config_path) if needs_backup else None
|
|
99
108
|
existing = load_existing(config_path)
|
|
109
|
+
|
|
110
|
+
interactive_provider: str | None = None
|
|
111
|
+
if interactive and mode != SetupMode.MINIMAL and not add_provider:
|
|
112
|
+
payload = self._collect_interactive_setup(default_workspace=workspace_path)
|
|
113
|
+
interactive_provider = payload["provider"]
|
|
114
|
+
workspace_path = payload["workspace_path"]
|
|
115
|
+
provider_models.update(payload["provider_models"])
|
|
116
|
+
env_values.update(payload["env_values"])
|
|
117
|
+
self.env.update({key: value for key, value in env_values.items() if value})
|
|
118
|
+
existing = {
|
|
119
|
+
**existing,
|
|
120
|
+
"agent": {
|
|
121
|
+
**dict(existing.get("agent") or {}),
|
|
122
|
+
**payload["agent"],
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
|
|
100
126
|
ensure_workspace(workspace_path)
|
|
101
127
|
|
|
102
|
-
selected = self._select_providers(mode, add_provider=add_provider)
|
|
128
|
+
selected = self._select_providers(mode, add_provider=add_provider, interactive_provider=interactive_provider)
|
|
103
129
|
providers: list[ProviderSetupResult] = []
|
|
104
130
|
provider_config: dict[str, dict[str, Any]] = {}
|
|
105
131
|
for name in selected:
|
|
@@ -109,6 +135,7 @@ class SetupWizard:
|
|
|
109
135
|
name,
|
|
110
136
|
configured=result.configured,
|
|
111
137
|
key_ref=_key_ref_for(name),
|
|
138
|
+
model=provider_models.get(name),
|
|
112
139
|
status=result.status,
|
|
113
140
|
)
|
|
114
141
|
if result.status in {"warn", "fail"} and result.reason:
|
|
@@ -137,10 +164,13 @@ class SetupWizard:
|
|
|
137
164
|
self.root.mkdir(parents=True, exist_ok=True)
|
|
138
165
|
config_text = self.config_generator.render(config)
|
|
139
166
|
config_path.write_text(config_text, encoding="utf-8")
|
|
140
|
-
(self.root / ".env").write_text(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
167
|
+
(self.root / ".env").write_text(self._render_env_file(provider_config, env_values), encoding="utf-8")
|
|
168
|
+
|
|
169
|
+
next_steps = ["pf-agent doctor"]
|
|
170
|
+
if interactive and launch:
|
|
171
|
+
next_steps.append("pf-agent tui")
|
|
172
|
+
else:
|
|
173
|
+
next_steps.append('pf-agent chat --provider fake --message "hello"')
|
|
144
174
|
|
|
145
175
|
return SetupResult(
|
|
146
176
|
completed=not errors,
|
|
@@ -150,17 +180,23 @@ class SetupWizard:
|
|
|
150
180
|
providers=providers,
|
|
151
181
|
warnings=warnings,
|
|
152
182
|
errors=errors,
|
|
153
|
-
next_steps=
|
|
154
|
-
"pf-agent doctor",
|
|
155
|
-
"pf-agent chat --provider fake --message \"hello\"",
|
|
156
|
-
],
|
|
183
|
+
next_steps=next_steps,
|
|
157
184
|
backup_path=backup_path,
|
|
158
185
|
rendered_config=redact_config_text(config_text),
|
|
159
186
|
)
|
|
160
187
|
|
|
161
|
-
def _select_providers(
|
|
188
|
+
def _select_providers(
|
|
189
|
+
self,
|
|
190
|
+
mode: SetupMode,
|
|
191
|
+
*,
|
|
192
|
+
add_provider: str | None,
|
|
193
|
+
interactive_provider: str | None = None,
|
|
194
|
+
) -> list[str]:
|
|
162
195
|
if add_provider:
|
|
163
196
|
return [_normalize_provider(add_provider), "fake"]
|
|
197
|
+
if interactive_provider:
|
|
198
|
+
provider = _normalize_provider(interactive_provider)
|
|
199
|
+
return ["fake"] if provider == "fake" else [provider, "fake"]
|
|
164
200
|
if mode == SetupMode.MINIMAL:
|
|
165
201
|
return ["fake"]
|
|
166
202
|
if self.env.get("DEEPSEEK_API_KEY"):
|
|
@@ -189,6 +225,74 @@ class SetupWizard:
|
|
|
189
225
|
return ProviderSetupResult(name, True, configured, "warn", reason=str(exc))
|
|
190
226
|
return ProviderSetupResult(name, True, configured, "ok", latency_ms=int(latency or 0))
|
|
191
227
|
|
|
228
|
+
def _collect_interactive_setup(self, *, default_workspace: Path) -> dict[str, Any]:
|
|
229
|
+
self._say("ProseForge Agent setup")
|
|
230
|
+
self._say("Choose provider:")
|
|
231
|
+
choices = [
|
|
232
|
+
("openai", "OpenAI"),
|
|
233
|
+
("anthropic", "Anthropic"),
|
|
234
|
+
("deepseek", "DeepSeek"),
|
|
235
|
+
("qwen", "Qwen"),
|
|
236
|
+
("gemini", "Gemini"),
|
|
237
|
+
("fake", "Fake offline"),
|
|
238
|
+
("other", "Other bundled provider"),
|
|
239
|
+
]
|
|
240
|
+
for index, (_, label) in enumerate(choices, start=1):
|
|
241
|
+
self._say(f" {index}. {label}")
|
|
242
|
+
raw_provider = self._ask("Provider [OpenAI]", default="openai")
|
|
243
|
+
provider = _provider_choice(raw_provider, choices)
|
|
244
|
+
if provider == "other":
|
|
245
|
+
provider = _normalize_provider(self._ask("Provider id", default="deepseek"))
|
|
246
|
+
|
|
247
|
+
env_values: dict[str, str] = {}
|
|
248
|
+
provider_models: dict[str, str] = {}
|
|
249
|
+
if provider != "fake":
|
|
250
|
+
env_key = _env_key_for(provider)
|
|
251
|
+
api_key = self._ask(f"API key ({env_key}, leave blank for offline fake)")
|
|
252
|
+
env_values[env_key] = api_key
|
|
253
|
+
model = self._ask("Model", default=_default_model_for(provider))
|
|
254
|
+
provider_models[provider] = model
|
|
255
|
+
else:
|
|
256
|
+
self._say("API key: skipped for fake offline provider")
|
|
257
|
+
|
|
258
|
+
language = self._ask("Language", default="zh-CN")
|
|
259
|
+
persona = self._ask("Persona", default="default")
|
|
260
|
+
workspace_text = self._ask("Workspace path", default=str(default_workspace))
|
|
261
|
+
self._ask("ProseForge root (optional)")
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
"provider": provider,
|
|
265
|
+
"workspace_path": Path(workspace_text or default_workspace),
|
|
266
|
+
"provider_models": provider_models,
|
|
267
|
+
"env_values": env_values,
|
|
268
|
+
"agent": {"language": language or "zh-CN", "profile": persona or "default"},
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
def _ask(self, prompt: str, default: str = "") -> str:
|
|
272
|
+
suffix = f" [{default}]" if default else ""
|
|
273
|
+
self.output_stream.write(f"{prompt}{suffix}: ")
|
|
274
|
+
self.output_stream.flush()
|
|
275
|
+
line = self.input_stream.readline()
|
|
276
|
+
if line == "":
|
|
277
|
+
self.output_stream.write("\n")
|
|
278
|
+
return default
|
|
279
|
+
value = line.strip()
|
|
280
|
+
return value or default
|
|
281
|
+
|
|
282
|
+
def _say(self, text: str) -> None:
|
|
283
|
+
self.output_stream.write(text + "\n")
|
|
284
|
+
|
|
285
|
+
def _render_env_file(self, providers: dict[str, dict[str, Any]], env_values: dict[str, str]) -> str:
|
|
286
|
+
lines = ["# ProseForge Agent environment overrides. Do not commit real keys."]
|
|
287
|
+
keys: list[str] = []
|
|
288
|
+
for name in sorted(providers):
|
|
289
|
+
if name == "fake":
|
|
290
|
+
continue
|
|
291
|
+
key = _env_key_for(name)
|
|
292
|
+
keys.append(f"{key}={env_values.get(key, '')}")
|
|
293
|
+
lines.extend(keys or ["# No external provider keys required."])
|
|
294
|
+
return "\n".join(lines) + "\n"
|
|
295
|
+
|
|
192
296
|
|
|
193
297
|
def _normalize_provider(name: str) -> str:
|
|
194
298
|
return (name or "deepseek").lower().strip()
|
|
@@ -204,6 +308,29 @@ def _key_ref_for(provider: str) -> str | None:
|
|
|
204
308
|
return f"env://{_env_key_for(provider)}"
|
|
205
309
|
|
|
206
310
|
|
|
311
|
+
def _provider_choice(value: str, choices: list[tuple[str, str]]) -> str:
|
|
312
|
+
raw = (value or "openai").strip().lower()
|
|
313
|
+
if raw.isdigit():
|
|
314
|
+
index = int(raw) - 1
|
|
315
|
+
if 0 <= index < len(choices):
|
|
316
|
+
return choices[index][0]
|
|
317
|
+
for provider, label in choices:
|
|
318
|
+
if raw in {provider, label.lower()}:
|
|
319
|
+
return provider
|
|
320
|
+
return _normalize_provider(raw)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def _default_model_for(provider: str) -> str:
|
|
324
|
+
defaults = {
|
|
325
|
+
"openai": "gpt-4o-mini",
|
|
326
|
+
"anthropic": "claude-3-5-sonnet-latest",
|
|
327
|
+
"deepseek": "deepseek-chat",
|
|
328
|
+
"qwen": "qwen-plus",
|
|
329
|
+
"gemini": "gemini-1.5-flash",
|
|
330
|
+
}
|
|
331
|
+
return defaults.get(provider, f"{provider}-chat")
|
|
332
|
+
|
|
333
|
+
|
|
207
334
|
__all__ = [
|
|
208
335
|
"PROVIDER_ORDER",
|
|
209
336
|
"ProviderSetupResult",
|
|
@@ -170,12 +170,39 @@ class FullScreenApp(TerminalApp):
|
|
|
170
170
|
]
|
|
171
171
|
return self.style.meta(" · ".join(parts)[:width])
|
|
172
172
|
|
|
173
|
+
def _welcome_lines(self, width: int) -> list[str]:
|
|
174
|
+
if width < 48:
|
|
175
|
+
raw = [
|
|
176
|
+
"Ready",
|
|
177
|
+
"Try: /help",
|
|
178
|
+
"pf-agent setup",
|
|
179
|
+
"Ask for a scene, outline, or revision.",
|
|
180
|
+
]
|
|
181
|
+
else:
|
|
182
|
+
raw = [
|
|
183
|
+
"Ready to write.",
|
|
184
|
+
f"Provider: {self.state.provider} Model: {self.state.model or 'default'}",
|
|
185
|
+
"Ask for drafting, revision, planning, or project help.",
|
|
186
|
+
"",
|
|
187
|
+
"Try:",
|
|
188
|
+
" /help show commands",
|
|
189
|
+
" pf-agent setup configure a real model",
|
|
190
|
+
" pf-agent quickstart run the offline demo",
|
|
191
|
+
]
|
|
192
|
+
lines: list[str] = []
|
|
193
|
+
for line in raw:
|
|
194
|
+
wrapped = _wrap(line, max(1, width - 2))
|
|
195
|
+
lines.extend((" " + item)[:width] for item in wrapped)
|
|
196
|
+
return lines
|
|
197
|
+
|
|
173
198
|
def _render_frame(self, width: int, height: int) -> tuple[list[str], int, int]:
|
|
174
199
|
transcript_rows = max(1, height - 4)
|
|
175
200
|
wrapped: list[str] = []
|
|
176
201
|
pending_lines = self._pending.split("\n") if self._pending else []
|
|
177
202
|
for line in [*self.transcript, *pending_lines]:
|
|
178
203
|
wrapped.extend(_wrap(line, width))
|
|
204
|
+
if not wrapped:
|
|
205
|
+
wrapped = self._welcome_lines(width)
|
|
179
206
|
visible = wrapped[-transcript_rows:]
|
|
180
207
|
visible += [""] * (transcript_rows - len(visible))
|
|
181
208
|
|
|
@@ -204,7 +231,7 @@ class FullScreenApp(TerminalApp):
|
|
|
204
231
|
|
|
205
232
|
kernel = self._ensure_kernel()
|
|
206
233
|
self._ensure_session()
|
|
207
|
-
self.transcript.append(f"
|
|
234
|
+
self.transcript.append(f"You: {text}")
|
|
208
235
|
self.state = replace(self.state, chat_history=(*self.state.chat_history, text)[-20:])
|
|
209
236
|
request = AgentTurnRequest(
|
|
210
237
|
session_id=self.state.session_id,
|
|
@@ -215,7 +242,7 @@ class FullScreenApp(TerminalApp):
|
|
|
215
242
|
)
|
|
216
243
|
try:
|
|
217
244
|
if self.state.stream and hasattr(kernel, "run_turn_stream"):
|
|
218
|
-
self._pending = "
|
|
245
|
+
self._pending = "Agent: "
|
|
219
246
|
self._paint()
|
|
220
247
|
for chunk in kernel.run_turn_stream(request):
|
|
221
248
|
self._pending += chunk.text
|
|
@@ -223,13 +250,13 @@ class FullScreenApp(TerminalApp):
|
|
|
223
250
|
self.transcript.extend(self._pending.split("\n"))
|
|
224
251
|
else:
|
|
225
252
|
result = kernel.run_turn(request)
|
|
226
|
-
self.transcript.extend(f"
|
|
253
|
+
self.transcript.extend(f"Agent: {result.text}".split("\n"))
|
|
227
254
|
except KeyboardInterrupt:
|
|
228
255
|
if self._pending:
|
|
229
256
|
self.transcript.extend(self._pending.split("\n"))
|
|
230
257
|
self.transcript.append("(turn interrupted)")
|
|
231
258
|
except Exception as exc: # noqa: BLE001 - a failed turn must not kill the app
|
|
232
|
-
self.transcript.append(f"
|
|
259
|
+
self.transcript.append(f"Error: {exc}")
|
|
233
260
|
finally:
|
|
234
261
|
self._pending = ""
|
|
235
262
|
self._refresh_usage()
|