proseforge-agent 0.3.1__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.1/src/proseforge_agent.egg-info → proseforge_agent-0.3.2}/PKG-INFO +18 -12
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/README.md +17 -11
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/pyproject.toml +1 -1
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/__init__.py +1 -1
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/cli.py +2 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/dotenv.py +4 -2
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/wizard.py +138 -11
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/fullscreen.py +31 -4
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2/src/proseforge_agent.egg-info}/PKG-INFO +18 -12
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/SOURCES.txt +2 -0
- proseforge_agent-0.3.2/tests/test_dotenv_workspace_env.py +24 -0
- proseforge_agent-0.3.2/tests/test_installer_first_run_ux.py +34 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_package.py +1 -1
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_pypi_first_publish_and_version_bump.py +1 -1
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/LICENSE +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/setup.cfg +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/__main__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/_bootstrap.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/artifacts.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/attachments.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/audit.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/context_window.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/control.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/degradation.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/eval.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/events.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/execution_guard.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/function_calling.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/intent_router.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/kernel.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/loop.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/middleware.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/modes.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/observability.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/offline.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/permissions.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/planner.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/profiles.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/prompt_templates.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/provider_fallback.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/reflection.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/request_cache.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/safety.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/sandbox.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/structured_output.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/subagent.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/tools.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/types.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/capabilities.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/accept.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/context.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/draft.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/lifecycle.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/review.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/rewrite.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/context.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/handoff.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/memory.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/prompts.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/repl.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/retrieval.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/session.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/slash.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/system_prompts.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/transcript.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/concurrency.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/config.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/core.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/recommend.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/workbook.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/demo.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/base.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/checkpoints.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/daytona.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/docker.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/file_sync.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/local.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/modal.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_runner.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/serverless.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/singularity.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/ssh.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/errors.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/trajectories.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/base.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/core.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/delivery.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/media.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/base.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/discord.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/email.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/mobile_email.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/signal.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/slack.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram_transport.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/whatsapp.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/poller.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/auth.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/app_dirs.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/auto_trigger.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_build.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_packaging.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/ci_matrix.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/docker_plan.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/doctor.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/first_run.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installer_scripts.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installers.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/linux.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/local_models.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/macos.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/migrations.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/package_checks.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/platform_io.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/provider_setup.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/qa_matrix.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/secrets.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/shell.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/support_bundle.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/uninstall.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/windows.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/base.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/capabilities.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/certification.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/docs_refresh.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/fake.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/http.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/openai_compatible.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/policies.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/probes.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/profiles.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/_openai_shape.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/anthropic.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/deepseek.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/doubao.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/gemini.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/glm.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/grok.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/mimo.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/minimax.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/openai.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/anthropic.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/deepseek.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/doubao.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/gemini.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/glm.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/mimo.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/minimax.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/openai.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/qwen.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/xai.yaml +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/qwen.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/router.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/streaming.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/usage.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/approval.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/client.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/credentials.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/policy.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/schema.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/compact.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/ingest.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/nudges.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/review.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/schema.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/store.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/user_model.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/core.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/desktop.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/jobs.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/webhook.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/approval_queue.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/artifacts.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/backup_verification.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/bible.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/character_arcs.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/continuity.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/draft_versioning.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/editorial_pipeline.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/exporter.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/foreshadowing.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/importer.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/literary_regression.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manifest.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manuscript_search.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/plot_threads.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/project_health.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/publishing.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reader_review.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/relationship_graph.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reorganize.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/rewrite_strategies.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/safety.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/scenes.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/storage.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/style_profile.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/timeline.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_analytics.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_quality.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_rules.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/intake.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/phase_plan.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/dependencies.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/discovery.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/harness.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/hooks.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manager.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manifest.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/permissions.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/sandbox.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/adapter.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/results.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/complete_agent_gate.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/publish.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/version_policy.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/render.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/embeddings.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evaluation.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evidence.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/hybrid.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/index.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/ingestion.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/router.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/vector_store.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/service/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/service/api.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/service/http_server.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/config_generator.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/first_run.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/modes.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/recovery.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/summary.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/audit.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/creation.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/hub.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/improvement.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/install.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/usage.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/fakes.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/cloud_browser.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/media.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/url_safety.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/web_search.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/ansi.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/app.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/keys.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/screen.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/streaming.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/__init__.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/recovery.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/state.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workspace.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/dependency_links.txt +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/entry_points.txt +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/requires.txt +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/top_level.txt +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_events_jobs.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_kernel.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_loop.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_profiles_personas.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_safety_guard.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_tools_permissions.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_app_dirs.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_attachment_ingestion.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_audit_trail_debuggability.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_binary_build.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_binary_packaging.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_capabilities.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chapter_lifecycle.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chapter_review.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_cli_repl.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_memory_preferences.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_prompt_protocol.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_retrieval_citations.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_session_store.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_workflow_handoff.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_ci_pipeline.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli_commands.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli_config_yaml_example_seed.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli_quickstart.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_community_and_agent_docs.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_complete_agent_release_gate.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_concurrency_locking.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_config.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_context_window_management.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_control_interrupt.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_conversation_lifecycle.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cross_session_search.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_daily_recommendations.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_daily_workbook.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_default_provider_resolution.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_default_tui_on_bare_command.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_docker_distribution.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_dotenv_support.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_e2e_demo.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_evidence_pack.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_execution_guard_timeout.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_extensions.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_first_run_auto_trigger.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_first_run_onboarding.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_fs_edit_and_registry_hardening.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_general_tools.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_graceful_degradation.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_injection_guard_cjk_precision.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_installation_doctor.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_intent_router.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_linux_native_support.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_llm_fake_and_routing.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_llm_response_normalization.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_local_agent_service_api.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_loud_placeholders_and_wiring.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_low_severity_review_cleanups.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_macos_native_support.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_managed_install_scripts.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_mcp_policy_enforced_in_client.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_compaction.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_ingestion.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_schema.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_store.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_middleware_hooks_trajectory_datasets.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_middleware_wiring.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_native_qa_matrix.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_native_secret_storage.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_observer_hooks_telemetry_export.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_offline_local_model_setup.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_offline_mode.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_openai_compatible_provider.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_os_installers.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_phase_plan_generator.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_platform_io.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_prompt_template_registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_proseforge_adapter.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_anthropic.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_certification.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_deepseek.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_doubao.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_fallback.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_gemini.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_glm.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_grok.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_mimo.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_minimax.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_openai.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_probes.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_profiles.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_qwen.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_registry.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_router.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_setup_wizard.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_usage_metering.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_pypi_publish.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_python_install_flows.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_readme_localization.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_release_checks.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_report_readiness_badge.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_reports.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_request_cache.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_retrieval_router.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_rewrite_accept.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_self_verification.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_service_http_server.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_session_branching.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_session_export_import.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_shell_completions_launchers.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_store_concurrency_and_idempotency.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_streaming_responses.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_streaming_tool_output.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_structured_function_calling.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_sub_agent.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_support_bundle.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_system_prompt_management.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_task_planner.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_tool_result_artifacts_output_limits.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_tool_sandbox.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_tool_timeout_rate_limit_circuit_breaker.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_unified_redaction.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_uninstall_data_retention.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_upgrade_migration_backup.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_windows_native_support.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_windows_utf8_bootstrap.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_workflow_recovery.py +0 -0
- {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_workflow_state.py +0 -0
- {proseforge_agent-0.3.1 → 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.3.
|
|
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
|
|
|
@@ -59,7 +59,7 @@ image, or a background agent with gateway integrations.
|
|
|
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
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.
|
|
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
|
---
|
|
@@ -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
|
|
@@ -99,7 +105,7 @@ want unreleased changes from `main`.
|
|
|
99
105
|
|
|
100
106
|
```bash
|
|
101
107
|
pf-agent quickstart # 60-second offline tour, no API keys needed
|
|
102
|
-
pf-agent setup
|
|
108
|
+
pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
|
|
103
109
|
pf-agent # full-screen terminal UI
|
|
104
110
|
pf-agent tui # same TUI, with explicit flags
|
|
105
111
|
pf-agent chat --message "draft an opening" --provider fake
|
|
@@ -109,13 +115,13 @@ pf-agent service serve # local HTTP API on 127.0.0.1:8765
|
|
|
109
115
|
|
|
110
116
|
The bare `pf-agent` command works like other coding agents' CLIs: the
|
|
111
117
|
first run bootstraps a workspace, then opens the full-screen terminal UI.
|
|
112
|
-
After `pf-agent setup` it talks to your configured default model. Without
|
|
118
|
+
After `pf-agent setup --quick` it talks to your configured default model. Without
|
|
113
119
|
setup, it runs against the offline fake provider so you can tour the CLI
|
|
114
120
|
with no keys.
|
|
115
121
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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.
|
|
119
125
|
|
|
120
126
|
## Project Boundary
|
|
121
127
|
|
|
@@ -127,9 +133,9 @@ workflow state, conversational agent loops, and background event handling.
|
|
|
127
133
|
|
|
128
134
|
## Release Status
|
|
129
135
|
|
|
130
|
-
`v0.3.
|
|
131
|
-
Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.
|
|
132
|
-
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.
|
|
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),
|
|
133
139
|
[GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
|
|
134
140
|
and [`CHANGELOG.md`](CHANGELOG.md).
|
|
135
141
|
|
|
@@ -323,7 +329,7 @@ requests re-checked by downstream policy, plus research-ready
|
|
|
323
329
|
`PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
|
|
324
330
|
PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
|
|
325
331
|
with injectable runner + `dry_run` for offline tests; tokens never appear
|
|
326
|
-
in the plan, report, or logs. The public `v0.3.
|
|
332
|
+
in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
|
|
327
333
|
Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
|
|
328
334
|
repository.
|
|
329
335
|
|
|
@@ -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.3.
|
|
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
|
|
|
@@ -40,7 +40,7 @@ image, or a background agent with gateway integrations.
|
|
|
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
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.
|
|
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
|
---
|
|
@@ -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
|
|
@@ -80,7 +86,7 @@ want unreleased changes from `main`.
|
|
|
80
86
|
|
|
81
87
|
```bash
|
|
82
88
|
pf-agent quickstart # 60-second offline tour, no API keys needed
|
|
83
|
-
pf-agent setup
|
|
89
|
+
pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
|
|
84
90
|
pf-agent # full-screen terminal UI
|
|
85
91
|
pf-agent tui # same TUI, with explicit flags
|
|
86
92
|
pf-agent chat --message "draft an opening" --provider fake
|
|
@@ -90,13 +96,13 @@ pf-agent service serve # local HTTP API on 127.0.0.1:8765
|
|
|
90
96
|
|
|
91
97
|
The bare `pf-agent` command works like other coding agents' CLIs: the
|
|
92
98
|
first run bootstraps a workspace, then opens the full-screen terminal UI.
|
|
93
|
-
After `pf-agent setup` it talks to your configured default model. Without
|
|
99
|
+
After `pf-agent setup --quick` it talks to your configured default model. Without
|
|
94
100
|
setup, it runs against the offline fake provider so you can tour the CLI
|
|
95
101
|
with no keys.
|
|
96
102
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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.
|
|
100
106
|
|
|
101
107
|
## Project Boundary
|
|
102
108
|
|
|
@@ -108,9 +114,9 @@ workflow state, conversational agent loops, and background event handling.
|
|
|
108
114
|
|
|
109
115
|
## Release Status
|
|
110
116
|
|
|
111
|
-
`v0.3.
|
|
112
|
-
Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.
|
|
113
|
-
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.
|
|
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),
|
|
114
120
|
[GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
|
|
115
121
|
and [`CHANGELOG.md`](CHANGELOG.md).
|
|
116
122
|
|
|
@@ -304,7 +310,7 @@ requests re-checked by downstream policy, plus research-ready
|
|
|
304
310
|
`PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
|
|
305
311
|
PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
|
|
306
312
|
with injectable runner + `dry_run` for offline tests; tokens never appear
|
|
307
|
-
in the plan, report, or logs. The public `v0.3.
|
|
313
|
+
in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
|
|
308
314
|
Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
|
|
309
315
|
repository.
|
|
310
316
|
|
|
@@ -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"
|
|
@@ -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="")
|
|
@@ -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()
|
|
@@ -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.3.
|
|
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
|
|
|
@@ -59,7 +59,7 @@ image, or a background agent with gateway integrations.
|
|
|
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
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.
|
|
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
|
---
|
|
@@ -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
|
|
@@ -99,7 +105,7 @@ want unreleased changes from `main`.
|
|
|
99
105
|
|
|
100
106
|
```bash
|
|
101
107
|
pf-agent quickstart # 60-second offline tour, no API keys needed
|
|
102
|
-
pf-agent setup
|
|
108
|
+
pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
|
|
103
109
|
pf-agent # full-screen terminal UI
|
|
104
110
|
pf-agent tui # same TUI, with explicit flags
|
|
105
111
|
pf-agent chat --message "draft an opening" --provider fake
|
|
@@ -109,13 +115,13 @@ pf-agent service serve # local HTTP API on 127.0.0.1:8765
|
|
|
109
115
|
|
|
110
116
|
The bare `pf-agent` command works like other coding agents' CLIs: the
|
|
111
117
|
first run bootstraps a workspace, then opens the full-screen terminal UI.
|
|
112
|
-
After `pf-agent setup` it talks to your configured default model. Without
|
|
118
|
+
After `pf-agent setup --quick` it talks to your configured default model. Without
|
|
113
119
|
setup, it runs against the offline fake provider so you can tour the CLI
|
|
114
120
|
with no keys.
|
|
115
121
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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.
|
|
119
125
|
|
|
120
126
|
## Project Boundary
|
|
121
127
|
|
|
@@ -127,9 +133,9 @@ workflow state, conversational agent loops, and background event handling.
|
|
|
127
133
|
|
|
128
134
|
## Release Status
|
|
129
135
|
|
|
130
|
-
`v0.3.
|
|
131
|
-
Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.
|
|
132
|
-
[GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.
|
|
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),
|
|
133
139
|
[GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
|
|
134
140
|
and [`CHANGELOG.md`](CHANGELOG.md).
|
|
135
141
|
|
|
@@ -323,7 +329,7 @@ requests re-checked by downstream policy, plus research-ready
|
|
|
323
329
|
`PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
|
|
324
330
|
PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
|
|
325
331
|
with injectable runner + `dry_run` for offline tests; tokens never appear
|
|
326
|
-
in the plan, report, or logs. The public `v0.3.
|
|
332
|
+
in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
|
|
327
333
|
Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
|
|
328
334
|
repository.
|
|
329
335
|
|
|
@@ -324,6 +324,7 @@ tests/test_default_provider_resolution.py
|
|
|
324
324
|
tests/test_default_tui_on_bare_command.py
|
|
325
325
|
tests/test_docker_distribution.py
|
|
326
326
|
tests/test_dotenv_support.py
|
|
327
|
+
tests/test_dotenv_workspace_env.py
|
|
327
328
|
tests/test_e2e_demo.py
|
|
328
329
|
tests/test_evidence_pack.py
|
|
329
330
|
tests/test_execution_guard_timeout.py
|
|
@@ -335,6 +336,7 @@ tests/test_general_tools.py
|
|
|
335
336
|
tests/test_graceful_degradation.py
|
|
336
337
|
tests/test_injection_guard_cjk_precision.py
|
|
337
338
|
tests/test_installation_doctor.py
|
|
339
|
+
tests/test_installer_first_run_ux.py
|
|
338
340
|
tests/test_intent_router.py
|
|
339
341
|
tests/test_linux_native_support.py
|
|
340
342
|
tests/test_llm_fake_and_routing.py
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Workspace .pf-agent/.env loading tests."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from proseforge_agent.dotenv import default_files, load_default_files
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_default_dotenv_files_include_workspace_env(tmp_path, monkeypatch):
|
|
9
|
+
monkeypatch.chdir(tmp_path)
|
|
10
|
+
paths = default_files()
|
|
11
|
+
|
|
12
|
+
assert tmp_path / ".pf-agent" / ".env" in paths
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_load_default_files_reads_workspace_env(tmp_path, monkeypatch):
|
|
16
|
+
monkeypatch.chdir(tmp_path)
|
|
17
|
+
monkeypatch.delenv("OPENAI_API_KEY", raising=False)
|
|
18
|
+
(tmp_path / ".pf-agent").mkdir()
|
|
19
|
+
(tmp_path / ".pf-agent" / ".env").write_text("OPENAI_API_KEY=sk-from-workspace\n", encoding="utf-8")
|
|
20
|
+
|
|
21
|
+
loaded = load_default_files()
|
|
22
|
+
|
|
23
|
+
assert loaded["OPENAI_API_KEY"] == str(tmp_path / ".pf-agent" / ".env")
|
|
24
|
+
assert __import__("os").environ["OPENAI_API_KEY"] == "sk-from-workspace"
|