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.
Files changed (421) hide show
  1. {proseforge_agent-0.3.1/src/proseforge_agent.egg-info → proseforge_agent-0.3.2}/PKG-INFO +18 -12
  2. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/README.md +17 -11
  3. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/pyproject.toml +1 -1
  4. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/__init__.py +1 -1
  5. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/cli.py +2 -0
  6. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/dotenv.py +4 -2
  7. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/wizard.py +138 -11
  8. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/fullscreen.py +31 -4
  9. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2/src/proseforge_agent.egg-info}/PKG-INFO +18 -12
  10. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/SOURCES.txt +2 -0
  11. proseforge_agent-0.3.2/tests/test_dotenv_workspace_env.py +24 -0
  12. proseforge_agent-0.3.2/tests/test_installer_first_run_ux.py +34 -0
  13. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_package.py +1 -1
  14. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_pypi_first_publish_and_version_bump.py +1 -1
  15. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/LICENSE +0 -0
  16. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/setup.cfg +0 -0
  17. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/__main__.py +0 -0
  18. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/_bootstrap.py +0 -0
  19. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/__init__.py +0 -0
  20. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/artifacts.py +0 -0
  21. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/attachments.py +0 -0
  22. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/audit.py +0 -0
  23. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/context_window.py +0 -0
  24. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/control.py +0 -0
  25. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/degradation.py +0 -0
  26. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/eval.py +0 -0
  27. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/events.py +0 -0
  28. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/execution_guard.py +0 -0
  29. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/function_calling.py +0 -0
  30. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/intent_router.py +0 -0
  31. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/kernel.py +0 -0
  32. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/loop.py +0 -0
  33. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/middleware.py +0 -0
  34. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/modes.py +0 -0
  35. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/observability.py +0 -0
  36. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/offline.py +0 -0
  37. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/permissions.py +0 -0
  38. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/planner.py +0 -0
  39. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/profiles.py +0 -0
  40. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/prompt_templates.py +0 -0
  41. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/provider_fallback.py +0 -0
  42. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/reflection.py +0 -0
  43. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/request_cache.py +0 -0
  44. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/safety.py +0 -0
  45. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/sandbox.py +0 -0
  46. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/structured_output.py +0 -0
  47. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/subagent.py +0 -0
  48. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/tools.py +0 -0
  49. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/types.py +0 -0
  50. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/capabilities.py +0 -0
  51. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/__init__.py +0 -0
  52. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/accept.py +0 -0
  53. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/context.py +0 -0
  54. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/draft.py +0 -0
  55. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/lifecycle.py +0 -0
  56. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/review.py +0 -0
  57. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/rewrite.py +0 -0
  58. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/__init__.py +0 -0
  59. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/context.py +0 -0
  60. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/handoff.py +0 -0
  61. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/memory.py +0 -0
  62. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/prompts.py +0 -0
  63. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/repl.py +0 -0
  64. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/retrieval.py +0 -0
  65. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/session.py +0 -0
  66. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/slash.py +0 -0
  67. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/system_prompts.py +0 -0
  68. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/transcript.py +0 -0
  69. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/concurrency.py +0 -0
  70. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/config.py +0 -0
  71. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/__init__.py +0 -0
  72. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/core.py +0 -0
  73. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/__init__.py +0 -0
  74. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/recommend.py +0 -0
  75. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/workbook.py +0 -0
  76. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/demo.py +0 -0
  77. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/__init__.py +0 -0
  78. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/base.py +0 -0
  79. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/checkpoints.py +0 -0
  80. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/daytona.py +0 -0
  81. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/docker.py +0 -0
  82. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/file_sync.py +0 -0
  83. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/local.py +0 -0
  84. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/modal.py +0 -0
  85. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_registry.py +0 -0
  86. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_runner.py +0 -0
  87. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/serverless.py +0 -0
  88. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/singularity.py +0 -0
  89. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/ssh.py +0 -0
  90. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/errors.py +0 -0
  91. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/__init__.py +0 -0
  92. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/trajectories.py +0 -0
  93. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/__init__.py +0 -0
  94. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/base.py +0 -0
  95. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/registry.py +0 -0
  96. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/__init__.py +0 -0
  97. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/core.py +0 -0
  98. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/delivery.py +0 -0
  99. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/media.py +0 -0
  100. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/__init__.py +0 -0
  101. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/base.py +0 -0
  102. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/discord.py +0 -0
  103. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/email.py +0 -0
  104. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/mobile_email.py +0 -0
  105. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/signal.py +0 -0
  106. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/slack.py +0 -0
  107. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram.py +0 -0
  108. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram_transport.py +0 -0
  109. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/whatsapp.py +0 -0
  110. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/poller.py +0 -0
  111. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/__init__.py +0 -0
  112. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/auth.py +0 -0
  113. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/__init__.py +0 -0
  114. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/app_dirs.py +0 -0
  115. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/auto_trigger.py +0 -0
  116. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_build.py +0 -0
  117. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_packaging.py +0 -0
  118. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/ci_matrix.py +0 -0
  119. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/docker_plan.py +0 -0
  120. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/doctor.py +0 -0
  121. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/first_run.py +0 -0
  122. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installer_scripts.py +0 -0
  123. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installers.py +0 -0
  124. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/linux.py +0 -0
  125. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/local_models.py +0 -0
  126. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/macos.py +0 -0
  127. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/migrations.py +0 -0
  128. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/package_checks.py +0 -0
  129. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/platform_io.py +0 -0
  130. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/provider_setup.py +0 -0
  131. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/qa_matrix.py +0 -0
  132. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/secrets.py +0 -0
  133. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/shell.py +0 -0
  134. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/support_bundle.py +0 -0
  135. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/uninstall.py +0 -0
  136. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/install/windows.py +0 -0
  137. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/__init__.py +0 -0
  138. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/base.py +0 -0
  139. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/capabilities.py +0 -0
  140. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/certification.py +0 -0
  141. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/docs_refresh.py +0 -0
  142. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/fake.py +0 -0
  143. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/http.py +0 -0
  144. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/openai_compatible.py +0 -0
  145. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/policies.py +0 -0
  146. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/probes.py +0 -0
  147. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/profiles.py +0 -0
  148. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/__init__.py +0 -0
  149. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/_openai_shape.py +0 -0
  150. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/anthropic.py +0 -0
  151. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/deepseek.py +0 -0
  152. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/doubao.py +0 -0
  153. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/gemini.py +0 -0
  154. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/glm.py +0 -0
  155. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/grok.py +0 -0
  156. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/mimo.py +0 -0
  157. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/minimax.py +0 -0
  158. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/openai.py +0 -0
  159. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/anthropic.yaml +0 -0
  160. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/deepseek.yaml +0 -0
  161. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/doubao.yaml +0 -0
  162. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/gemini.yaml +0 -0
  163. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/glm.yaml +0 -0
  164. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/mimo.yaml +0 -0
  165. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/minimax.yaml +0 -0
  166. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/openai.yaml +0 -0
  167. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/qwen.yaml +0 -0
  168. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/xai.yaml +0 -0
  169. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/qwen.py +0 -0
  170. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/registry.py +0 -0
  171. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/router.py +0 -0
  172. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/streaming.py +0 -0
  173. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/usage.py +0 -0
  174. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/__init__.py +0 -0
  175. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/approval.py +0 -0
  176. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/client.py +0 -0
  177. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/credentials.py +0 -0
  178. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/policy.py +0 -0
  179. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/registry.py +0 -0
  180. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/schema.py +0 -0
  181. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/__init__.py +0 -0
  182. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/compact.py +0 -0
  183. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/ingest.py +0 -0
  184. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/nudges.py +0 -0
  185. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/review.py +0 -0
  186. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/schema.py +0 -0
  187. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/store.py +0 -0
  188. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/user_model.py +0 -0
  189. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/__init__.py +0 -0
  190. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/core.py +0 -0
  191. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/desktop.py +0 -0
  192. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/jobs.py +0 -0
  193. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/webhook.py +0 -0
  194. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/__init__.py +0 -0
  195. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/approval_queue.py +0 -0
  196. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/artifacts.py +0 -0
  197. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/backup_verification.py +0 -0
  198. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/bible.py +0 -0
  199. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/character_arcs.py +0 -0
  200. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/continuity.py +0 -0
  201. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/draft_versioning.py +0 -0
  202. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/editorial_pipeline.py +0 -0
  203. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/exporter.py +0 -0
  204. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/foreshadowing.py +0 -0
  205. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/importer.py +0 -0
  206. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/literary_regression.py +0 -0
  207. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manifest.py +0 -0
  208. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manuscript_search.py +0 -0
  209. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/plot_threads.py +0 -0
  210. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/project_health.py +0 -0
  211. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/publishing.py +0 -0
  212. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reader_review.py +0 -0
  213. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/relationship_graph.py +0 -0
  214. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reorganize.py +0 -0
  215. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/rewrite_strategies.py +0 -0
  216. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/safety.py +0 -0
  217. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/scenes.py +0 -0
  218. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/storage.py +0 -0
  219. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/style_profile.py +0 -0
  220. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/timeline.py +0 -0
  221. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_analytics.py +0 -0
  222. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_quality.py +0 -0
  223. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_rules.py +0 -0
  224. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/__init__.py +0 -0
  225. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/intake.py +0 -0
  226. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/phase_plan.py +0 -0
  227. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/__init__.py +0 -0
  228. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/dependencies.py +0 -0
  229. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/discovery.py +0 -0
  230. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/harness.py +0 -0
  231. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/hooks.py +0 -0
  232. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manager.py +0 -0
  233. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manifest.py +0 -0
  234. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/permissions.py +0 -0
  235. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/sandbox.py +0 -0
  236. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/__init__.py +0 -0
  237. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/adapter.py +0 -0
  238. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/results.py +0 -0
  239. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/__init__.py +0 -0
  240. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/complete_agent_gate.py +0 -0
  241. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/publish.py +0 -0
  242. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/release/version_policy.py +0 -0
  243. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/__init__.py +0 -0
  244. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/registry.py +0 -0
  245. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/render.py +0 -0
  246. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/__init__.py +0 -0
  247. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/embeddings.py +0 -0
  248. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evaluation.py +0 -0
  249. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evidence.py +0 -0
  250. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/hybrid.py +0 -0
  251. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/index.py +0 -0
  252. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/ingestion.py +0 -0
  253. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/router.py +0 -0
  254. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/vector_store.py +0 -0
  255. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/service/__init__.py +0 -0
  256. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/service/api.py +0 -0
  257. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/service/http_server.py +0 -0
  258. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/__init__.py +0 -0
  259. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/config_generator.py +0 -0
  260. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/first_run.py +0 -0
  261. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/modes.py +0 -0
  262. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/recovery.py +0 -0
  263. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/summary.py +0 -0
  264. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/__init__.py +0 -0
  265. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/audit.py +0 -0
  266. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/creation.py +0 -0
  267. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/hub.py +0 -0
  268. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/improvement.py +0 -0
  269. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/install.py +0 -0
  270. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/registry.py +0 -0
  271. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/usage.py +0 -0
  272. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/__init__.py +0 -0
  273. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/fakes.py +0 -0
  274. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/__init__.py +0 -0
  275. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/__init__.py +0 -0
  276. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/cloud_browser.py +0 -0
  277. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/media.py +0 -0
  278. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/url_safety.py +0 -0
  279. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/web_search.py +0 -0
  280. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/__init__.py +0 -0
  281. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/ansi.py +0 -0
  282. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/app.py +0 -0
  283. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/keys.py +0 -0
  284. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/screen.py +0 -0
  285. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/streaming.py +0 -0
  286. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/__init__.py +0 -0
  287. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/recovery.py +0 -0
  288. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/state.py +0 -0
  289. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent/workspace.py +0 -0
  290. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/dependency_links.txt +0 -0
  291. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/entry_points.txt +0 -0
  292. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/requires.txt +0 -0
  293. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/top_level.txt +0 -0
  294. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_events_jobs.py +0 -0
  295. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_kernel.py +0 -0
  296. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_loop.py +0 -0
  297. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_profiles_personas.py +0 -0
  298. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_safety_guard.py +0 -0
  299. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_agent_tools_permissions.py +0 -0
  300. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_app_dirs.py +0 -0
  301. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_attachment_ingestion.py +0 -0
  302. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_audit_trail_debuggability.py +0 -0
  303. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_binary_build.py +0 -0
  304. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_binary_packaging.py +0 -0
  305. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_capabilities.py +0 -0
  306. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chapter_lifecycle.py +0 -0
  307. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chapter_review.py +0 -0
  308. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_cli_repl.py +0 -0
  309. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_memory_preferences.py +0 -0
  310. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_prompt_protocol.py +0 -0
  311. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_retrieval_citations.py +0 -0
  312. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_session_store.py +0 -0
  313. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_chat_workflow_handoff.py +0 -0
  314. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_ci_pipeline.py +0 -0
  315. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli.py +0 -0
  316. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli_commands.py +0 -0
  317. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli_config_yaml_example_seed.py +0 -0
  318. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cli_quickstart.py +0 -0
  319. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_community_and_agent_docs.py +0 -0
  320. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_complete_agent_release_gate.py +0 -0
  321. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_concurrency_locking.py +0 -0
  322. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_config.py +0 -0
  323. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_context_window_management.py +0 -0
  324. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_control_interrupt.py +0 -0
  325. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_conversation_lifecycle.py +0 -0
  326. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_cross_session_search.py +0 -0
  327. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_daily_recommendations.py +0 -0
  328. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_daily_workbook.py +0 -0
  329. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_default_provider_resolution.py +0 -0
  330. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_default_tui_on_bare_command.py +0 -0
  331. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_docker_distribution.py +0 -0
  332. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_dotenv_support.py +0 -0
  333. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_e2e_demo.py +0 -0
  334. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_evidence_pack.py +0 -0
  335. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_execution_guard_timeout.py +0 -0
  336. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_extensions.py +0 -0
  337. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_first_run_auto_trigger.py +0 -0
  338. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_first_run_onboarding.py +0 -0
  339. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_fs_edit_and_registry_hardening.py +0 -0
  340. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_general_tools.py +0 -0
  341. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_graceful_degradation.py +0 -0
  342. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_injection_guard_cjk_precision.py +0 -0
  343. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_installation_doctor.py +0 -0
  344. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_intent_router.py +0 -0
  345. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_linux_native_support.py +0 -0
  346. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_llm_fake_and_routing.py +0 -0
  347. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_llm_response_normalization.py +0 -0
  348. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_local_agent_service_api.py +0 -0
  349. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_loud_placeholders_and_wiring.py +0 -0
  350. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_low_severity_review_cleanups.py +0 -0
  351. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_macos_native_support.py +0 -0
  352. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_managed_install_scripts.py +0 -0
  353. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_mcp_policy_enforced_in_client.py +0 -0
  354. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_compaction.py +0 -0
  355. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_ingestion.py +0 -0
  356. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_schema.py +0 -0
  357. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_memory_store.py +0 -0
  358. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_middleware_hooks_trajectory_datasets.py +0 -0
  359. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_middleware_wiring.py +0 -0
  360. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_native_qa_matrix.py +0 -0
  361. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_native_secret_storage.py +0 -0
  362. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_observer_hooks_telemetry_export.py +0 -0
  363. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_offline_local_model_setup.py +0 -0
  364. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_offline_mode.py +0 -0
  365. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_openai_compatible_provider.py +0 -0
  366. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_os_installers.py +0 -0
  367. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_phase_plan_generator.py +0 -0
  368. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_platform_io.py +0 -0
  369. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_prompt_template_registry.py +0 -0
  370. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_proseforge_adapter.py +0 -0
  371. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_anthropic.py +0 -0
  372. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_certification.py +0 -0
  373. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_deepseek.py +0 -0
  374. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_doubao.py +0 -0
  375. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_fallback.py +0 -0
  376. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_gemini.py +0 -0
  377. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_glm.py +0 -0
  378. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_grok.py +0 -0
  379. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_mimo.py +0 -0
  380. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_minimax.py +0 -0
  381. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_openai.py +0 -0
  382. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_probes.py +0 -0
  383. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_profiles.py +0 -0
  384. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_qwen.py +0 -0
  385. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_registry.py +0 -0
  386. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_router.py +0 -0
  387. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_setup_wizard.py +0 -0
  388. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_provider_usage_metering.py +0 -0
  389. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_pypi_publish.py +0 -0
  390. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_python_install_flows.py +0 -0
  391. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_readme_localization.py +0 -0
  392. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_release_checks.py +0 -0
  393. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_report_readiness_badge.py +0 -0
  394. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_reports.py +0 -0
  395. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_request_cache.py +0 -0
  396. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_retrieval_router.py +0 -0
  397. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_rewrite_accept.py +0 -0
  398. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_self_verification.py +0 -0
  399. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_service_http_server.py +0 -0
  400. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_session_branching.py +0 -0
  401. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_session_export_import.py +0 -0
  402. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_shell_completions_launchers.py +0 -0
  403. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_store_concurrency_and_idempotency.py +0 -0
  404. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_streaming_responses.py +0 -0
  405. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_streaming_tool_output.py +0 -0
  406. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_structured_function_calling.py +0 -0
  407. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_sub_agent.py +0 -0
  408. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_support_bundle.py +0 -0
  409. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_system_prompt_management.py +0 -0
  410. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_task_planner.py +0 -0
  411. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_tool_result_artifacts_output_limits.py +0 -0
  412. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_tool_sandbox.py +0 -0
  413. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_tool_timeout_rate_limit_circuit_breaker.py +0 -0
  414. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_unified_redaction.py +0 -0
  415. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_uninstall_data_retention.py +0 -0
  416. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_upgrade_migration_backup.py +0 -0
  417. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_windows_native_support.py +0 -0
  418. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_windows_utf8_bootstrap.py +0 -0
  419. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_workflow_recovery.py +0 -0
  420. {proseforge_agent-0.3.1 → proseforge_agent-0.3.2}/tests/test_workflow_state.py +0 -0
  421. {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.1
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.1">Release v0.3.1</a> ·
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.1</code> is live on PyPI, GHCR, and GitHub Releases. Release gate: <code>1358 tests passing</code> 35 integration (real subprocess / HTTP / SQLite), the rest offline fakes.</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
  ---
@@ -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 # guided wizard: providers, keys, workspace
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
- Set provider API keys in your environment (or `.env`, see
117
- `.env.example`): `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and friends.
118
- Every command accepts `--provider fake` for a no-key offline tour.
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.1` was published on July 3, 2026 through PyPI Trusted Publishing.
131
- Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.1/),
132
- [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.1),
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.1` release path uses PyPI
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.1">Release v0.3.1</a> ·
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.1</code> is live on PyPI, GHCR, and GitHub Releases. Release gate: <code>1358 tests passing</code> 35 integration (real subprocess / HTTP / SQLite), the rest offline fakes.</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
  ---
@@ -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 # guided wizard: providers, keys, workspace
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
- Set provider API keys in your environment (or `.env`, see
98
- `.env.example`): `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and friends.
99
- Every command accepts `--provider fake` for a no-key offline tour.
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.1` was published on July 3, 2026 through PyPI Trusted Publishing.
112
- Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.1/),
113
- [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.1),
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.1` release path uses PyPI
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.1"
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"
@@ -5,6 +5,6 @@ or require API keys. Subsystem behavior lives behind dedicated submodules
5
5
  that are imported explicitly by their callers.
6
6
  """
7
7
 
8
- __version__ = "0.3.1"
8
+ __version__ = "0.3.2"
9
9
 
10
10
  __all__ = ["__version__"]
@@ -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. ``<config_dir>/proseforge-agent.env`` (machine defaults)
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
- self.config_generator.render_env_template(provider_config),
142
- encoding="utf-8",
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(self, mode: SetupMode, *, add_provider: str | None) -> list[str]:
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"you: {text}")
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 = "agent: "
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"agent: {result.text}".split("\n"))
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"error: {exc}")
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.1
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.1">Release v0.3.1</a> ·
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.1</code> is live on PyPI, GHCR, and GitHub Releases. Release gate: <code>1358 tests passing</code> 35 integration (real subprocess / HTTP / SQLite), the rest offline fakes.</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
  ---
@@ -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 # guided wizard: providers, keys, workspace
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
- Set provider API keys in your environment (or `.env`, see
117
- `.env.example`): `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and friends.
118
- Every command accepts `--provider fake` for a no-key offline tour.
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.1` was published on July 3, 2026 through PyPI Trusted Publishing.
131
- Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.1/),
132
- [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.1),
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.1` release path uses PyPI
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"