proseforge-agent 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {proseforge_agent-0.3.0/src/proseforge_agent.egg-info → proseforge_agent-0.3.2}/PKG-INFO +28 -20
  2. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/README.md +27 -19
  3. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/pyproject.toml +1 -1
  4. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/__init__.py +1 -1
  5. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/cli.py +16 -10
  6. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/dotenv.py +4 -2
  7. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/wizard.py +138 -11
  8. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/fullscreen.py +31 -4
  9. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2/src/proseforge_agent.egg-info}/PKG-INFO +28 -20
  10. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/SOURCES.txt +3 -1
  11. proseforge_agent-0.3.2/tests/test_default_tui_on_bare_command.py +103 -0
  12. proseforge_agent-0.3.2/tests/test_dotenv_workspace_env.py +24 -0
  13. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_first_run_auto_trigger.py +8 -6
  14. proseforge_agent-0.3.2/tests/test_installer_first_run_ux.py +34 -0
  15. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_package.py +1 -1
  16. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_pypi_first_publish_and_version_bump.py +2 -2
  17. proseforge_agent-0.3.0/tests/test_default_chat_repl_on_bare_command.py +0 -100
  18. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/LICENSE +0 -0
  19. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/setup.cfg +0 -0
  20. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/__main__.py +0 -0
  21. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/_bootstrap.py +0 -0
  22. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/__init__.py +0 -0
  23. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/artifacts.py +0 -0
  24. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/attachments.py +0 -0
  25. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/audit.py +0 -0
  26. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/context_window.py +0 -0
  27. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/control.py +0 -0
  28. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/degradation.py +0 -0
  29. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/eval.py +0 -0
  30. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/events.py +0 -0
  31. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/execution_guard.py +0 -0
  32. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/function_calling.py +0 -0
  33. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/intent_router.py +0 -0
  34. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/kernel.py +0 -0
  35. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/loop.py +0 -0
  36. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/middleware.py +0 -0
  37. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/modes.py +0 -0
  38. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/observability.py +0 -0
  39. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/offline.py +0 -0
  40. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/permissions.py +0 -0
  41. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/planner.py +0 -0
  42. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/profiles.py +0 -0
  43. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/prompt_templates.py +0 -0
  44. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/provider_fallback.py +0 -0
  45. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/reflection.py +0 -0
  46. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/request_cache.py +0 -0
  47. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/safety.py +0 -0
  48. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/sandbox.py +0 -0
  49. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/structured_output.py +0 -0
  50. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/subagent.py +0 -0
  51. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/tools.py +0 -0
  52. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/agent/types.py +0 -0
  53. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/capabilities.py +0 -0
  54. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/__init__.py +0 -0
  55. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/accept.py +0 -0
  56. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/context.py +0 -0
  57. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/draft.py +0 -0
  58. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/lifecycle.py +0 -0
  59. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/review.py +0 -0
  60. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chapter/rewrite.py +0 -0
  61. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/__init__.py +0 -0
  62. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/context.py +0 -0
  63. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/handoff.py +0 -0
  64. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/memory.py +0 -0
  65. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/prompts.py +0 -0
  66. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/repl.py +0 -0
  67. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/retrieval.py +0 -0
  68. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/session.py +0 -0
  69. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/slash.py +0 -0
  70. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/system_prompts.py +0 -0
  71. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/chat/transcript.py +0 -0
  72. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/concurrency.py +0 -0
  73. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/config.py +0 -0
  74. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/__init__.py +0 -0
  75. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/cron/core.py +0 -0
  76. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/__init__.py +0 -0
  77. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/recommend.py +0 -0
  78. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/daily/workbook.py +0 -0
  79. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/demo.py +0 -0
  80. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/__init__.py +0 -0
  81. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/base.py +0 -0
  82. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/checkpoints.py +0 -0
  83. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/daytona.py +0 -0
  84. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/docker.py +0 -0
  85. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/file_sync.py +0 -0
  86. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/local.py +0 -0
  87. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/modal.py +0 -0
  88. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_registry.py +0 -0
  89. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/process_runner.py +0 -0
  90. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/serverless.py +0 -0
  91. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/singularity.py +0 -0
  92. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/environments/ssh.py +0 -0
  93. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/errors.py +0 -0
  94. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/__init__.py +0 -0
  95. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/eval/trajectories.py +0 -0
  96. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/__init__.py +0 -0
  97. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/base.py +0 -0
  98. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/extensions/registry.py +0 -0
  99. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/__init__.py +0 -0
  100. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/core.py +0 -0
  101. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/delivery.py +0 -0
  102. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/media.py +0 -0
  103. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/__init__.py +0 -0
  104. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/base.py +0 -0
  105. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/discord.py +0 -0
  106. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/email.py +0 -0
  107. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/mobile_email.py +0 -0
  108. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/signal.py +0 -0
  109. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/slack.py +0 -0
  110. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram.py +0 -0
  111. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/telegram_transport.py +0 -0
  112. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/platforms/whatsapp.py +0 -0
  113. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/poller.py +0 -0
  114. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/__init__.py +0 -0
  115. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/gateway/relay/auth.py +0 -0
  116. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/__init__.py +0 -0
  117. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/app_dirs.py +0 -0
  118. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/auto_trigger.py +0 -0
  119. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_build.py +0 -0
  120. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/binary_packaging.py +0 -0
  121. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/ci_matrix.py +0 -0
  122. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/docker_plan.py +0 -0
  123. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/doctor.py +0 -0
  124. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/first_run.py +0 -0
  125. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installer_scripts.py +0 -0
  126. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/installers.py +0 -0
  127. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/linux.py +0 -0
  128. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/local_models.py +0 -0
  129. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/macos.py +0 -0
  130. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/migrations.py +0 -0
  131. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/package_checks.py +0 -0
  132. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/platform_io.py +0 -0
  133. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/provider_setup.py +0 -0
  134. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/qa_matrix.py +0 -0
  135. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/secrets.py +0 -0
  136. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/shell.py +0 -0
  137. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/support_bundle.py +0 -0
  138. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/uninstall.py +0 -0
  139. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/install/windows.py +0 -0
  140. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/__init__.py +0 -0
  141. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/base.py +0 -0
  142. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/capabilities.py +0 -0
  143. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/certification.py +0 -0
  144. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/docs_refresh.py +0 -0
  145. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/fake.py +0 -0
  146. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/http.py +0 -0
  147. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/openai_compatible.py +0 -0
  148. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/policies.py +0 -0
  149. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/probes.py +0 -0
  150. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/profiles.py +0 -0
  151. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/__init__.py +0 -0
  152. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/_openai_shape.py +0 -0
  153. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/anthropic.py +0 -0
  154. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/deepseek.py +0 -0
  155. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/doubao.py +0 -0
  156. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/gemini.py +0 -0
  157. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/glm.py +0 -0
  158. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/grok.py +0 -0
  159. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/mimo.py +0 -0
  160. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/minimax.py +0 -0
  161. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/openai.py +0 -0
  162. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/anthropic.yaml +0 -0
  163. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/deepseek.yaml +0 -0
  164. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/doubao.yaml +0 -0
  165. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/gemini.yaml +0 -0
  166. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/glm.yaml +0 -0
  167. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/mimo.yaml +0 -0
  168. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/minimax.yaml +0 -0
  169. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/openai.yaml +0 -0
  170. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/qwen.yaml +0 -0
  171. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/profiles/xai.yaml +0 -0
  172. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/providers/qwen.py +0 -0
  173. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/registry.py +0 -0
  174. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/router.py +0 -0
  175. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/streaming.py +0 -0
  176. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/llm/usage.py +0 -0
  177. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/__init__.py +0 -0
  178. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/approval.py +0 -0
  179. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/client.py +0 -0
  180. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/credentials.py +0 -0
  181. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/policy.py +0 -0
  182. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/registry.py +0 -0
  183. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/mcp/schema.py +0 -0
  184. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/__init__.py +0 -0
  185. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/compact.py +0 -0
  186. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/ingest.py +0 -0
  187. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/nudges.py +0 -0
  188. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/review.py +0 -0
  189. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/schema.py +0 -0
  190. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/store.py +0 -0
  191. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/memory/user_model.py +0 -0
  192. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/__init__.py +0 -0
  193. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/core.py +0 -0
  194. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/desktop.py +0 -0
  195. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/jobs.py +0 -0
  196. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/notifications/webhook.py +0 -0
  197. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/__init__.py +0 -0
  198. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/approval_queue.py +0 -0
  199. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/artifacts.py +0 -0
  200. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/backup_verification.py +0 -0
  201. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/bible.py +0 -0
  202. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/character_arcs.py +0 -0
  203. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/continuity.py +0 -0
  204. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/draft_versioning.py +0 -0
  205. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/editorial_pipeline.py +0 -0
  206. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/exporter.py +0 -0
  207. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/foreshadowing.py +0 -0
  208. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/importer.py +0 -0
  209. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/literary_regression.py +0 -0
  210. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manifest.py +0 -0
  211. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/manuscript_search.py +0 -0
  212. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/plot_threads.py +0 -0
  213. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/project_health.py +0 -0
  214. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/publishing.py +0 -0
  215. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reader_review.py +0 -0
  216. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/relationship_graph.py +0 -0
  217. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/reorganize.py +0 -0
  218. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/rewrite_strategies.py +0 -0
  219. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/safety.py +0 -0
  220. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/scenes.py +0 -0
  221. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/storage.py +0 -0
  222. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/style_profile.py +0 -0
  223. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/timeline.py +0 -0
  224. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_analytics.py +0 -0
  225. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_quality.py +0 -0
  226. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/novel/writing_rules.py +0 -0
  227. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/__init__.py +0 -0
  228. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/intake.py +0 -0
  229. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/planning/phase_plan.py +0 -0
  230. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/__init__.py +0 -0
  231. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/dependencies.py +0 -0
  232. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/discovery.py +0 -0
  233. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/harness.py +0 -0
  234. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/hooks.py +0 -0
  235. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manager.py +0 -0
  236. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/manifest.py +0 -0
  237. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/permissions.py +0 -0
  238. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/plugins/sandbox.py +0 -0
  239. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/__init__.py +0 -0
  240. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/adapter.py +0 -0
  241. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/proseforge/results.py +0 -0
  242. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/__init__.py +0 -0
  243. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/complete_agent_gate.py +0 -0
  244. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/publish.py +0 -0
  245. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/release/version_policy.py +0 -0
  246. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/__init__.py +0 -0
  247. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/registry.py +0 -0
  248. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/reports/render.py +0 -0
  249. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/__init__.py +0 -0
  250. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/embeddings.py +0 -0
  251. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evaluation.py +0 -0
  252. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/evidence.py +0 -0
  253. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/hybrid.py +0 -0
  254. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/index.py +0 -0
  255. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/ingestion.py +0 -0
  256. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/router.py +0 -0
  257. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/retrieval/vector_store.py +0 -0
  258. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/service/__init__.py +0 -0
  259. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/service/api.py +0 -0
  260. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/service/http_server.py +0 -0
  261. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/__init__.py +0 -0
  262. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/config_generator.py +0 -0
  263. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/first_run.py +0 -0
  264. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/modes.py +0 -0
  265. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/recovery.py +0 -0
  266. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/setup/summary.py +0 -0
  267. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/__init__.py +0 -0
  268. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/audit.py +0 -0
  269. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/creation.py +0 -0
  270. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/hub.py +0 -0
  271. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/improvement.py +0 -0
  272. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/install.py +0 -0
  273. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/registry.py +0 -0
  274. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/skills/usage.py +0 -0
  275. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/__init__.py +0 -0
  276. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/testing/fakes.py +0 -0
  277. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/__init__.py +0 -0
  278. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/__init__.py +0 -0
  279. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/cloud_browser.py +0 -0
  280. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/media.py +0 -0
  281. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/url_safety.py +0 -0
  282. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tools/managed/web_search.py +0 -0
  283. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/__init__.py +0 -0
  284. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/ansi.py +0 -0
  285. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/app.py +0 -0
  286. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/keys.py +0 -0
  287. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/screen.py +0 -0
  288. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/tui/streaming.py +0 -0
  289. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/__init__.py +0 -0
  290. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/recovery.py +0 -0
  291. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workflow/state.py +0 -0
  292. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent/workspace.py +0 -0
  293. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/dependency_links.txt +0 -0
  294. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/entry_points.txt +0 -0
  295. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/requires.txt +0 -0
  296. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/src/proseforge_agent.egg-info/top_level.txt +0 -0
  297. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_events_jobs.py +0 -0
  298. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_kernel.py +0 -0
  299. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_loop.py +0 -0
  300. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_profiles_personas.py +0 -0
  301. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_safety_guard.py +0 -0
  302. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_agent_tools_permissions.py +0 -0
  303. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_app_dirs.py +0 -0
  304. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_attachment_ingestion.py +0 -0
  305. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_audit_trail_debuggability.py +0 -0
  306. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_binary_build.py +0 -0
  307. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_binary_packaging.py +0 -0
  308. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_capabilities.py +0 -0
  309. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chapter_lifecycle.py +0 -0
  310. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chapter_review.py +0 -0
  311. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_cli_repl.py +0 -0
  312. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_memory_preferences.py +0 -0
  313. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_prompt_protocol.py +0 -0
  314. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_retrieval_citations.py +0 -0
  315. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_session_store.py +0 -0
  316. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_chat_workflow_handoff.py +0 -0
  317. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_ci_pipeline.py +0 -0
  318. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli.py +0 -0
  319. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli_commands.py +0 -0
  320. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli_config_yaml_example_seed.py +0 -0
  321. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cli_quickstart.py +0 -0
  322. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_community_and_agent_docs.py +0 -0
  323. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_complete_agent_release_gate.py +0 -0
  324. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_concurrency_locking.py +0 -0
  325. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_config.py +0 -0
  326. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_context_window_management.py +0 -0
  327. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_control_interrupt.py +0 -0
  328. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_conversation_lifecycle.py +0 -0
  329. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_cross_session_search.py +0 -0
  330. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_daily_recommendations.py +0 -0
  331. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_daily_workbook.py +0 -0
  332. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_default_provider_resolution.py +0 -0
  333. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_docker_distribution.py +0 -0
  334. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_dotenv_support.py +0 -0
  335. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_e2e_demo.py +0 -0
  336. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_evidence_pack.py +0 -0
  337. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_execution_guard_timeout.py +0 -0
  338. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_extensions.py +0 -0
  339. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_first_run_onboarding.py +0 -0
  340. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_fs_edit_and_registry_hardening.py +0 -0
  341. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_general_tools.py +0 -0
  342. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_graceful_degradation.py +0 -0
  343. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_injection_guard_cjk_precision.py +0 -0
  344. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_installation_doctor.py +0 -0
  345. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_intent_router.py +0 -0
  346. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_linux_native_support.py +0 -0
  347. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_llm_fake_and_routing.py +0 -0
  348. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_llm_response_normalization.py +0 -0
  349. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_local_agent_service_api.py +0 -0
  350. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_loud_placeholders_and_wiring.py +0 -0
  351. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_low_severity_review_cleanups.py +0 -0
  352. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_macos_native_support.py +0 -0
  353. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_managed_install_scripts.py +0 -0
  354. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_mcp_policy_enforced_in_client.py +0 -0
  355. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_compaction.py +0 -0
  356. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_ingestion.py +0 -0
  357. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_schema.py +0 -0
  358. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_memory_store.py +0 -0
  359. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_middleware_hooks_trajectory_datasets.py +0 -0
  360. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_middleware_wiring.py +0 -0
  361. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_native_qa_matrix.py +0 -0
  362. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_native_secret_storage.py +0 -0
  363. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_observer_hooks_telemetry_export.py +0 -0
  364. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_offline_local_model_setup.py +0 -0
  365. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_offline_mode.py +0 -0
  366. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_openai_compatible_provider.py +0 -0
  367. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_os_installers.py +0 -0
  368. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_phase_plan_generator.py +0 -0
  369. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_platform_io.py +0 -0
  370. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_prompt_template_registry.py +0 -0
  371. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_proseforge_adapter.py +0 -0
  372. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_anthropic.py +0 -0
  373. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_certification.py +0 -0
  374. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_deepseek.py +0 -0
  375. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_doubao.py +0 -0
  376. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_fallback.py +0 -0
  377. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_gemini.py +0 -0
  378. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_glm.py +0 -0
  379. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_grok.py +0 -0
  380. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_mimo.py +0 -0
  381. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_minimax.py +0 -0
  382. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_openai.py +0 -0
  383. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_probes.py +0 -0
  384. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_profiles.py +0 -0
  385. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_qwen.py +0 -0
  386. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_registry.py +0 -0
  387. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_router.py +0 -0
  388. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_setup_wizard.py +0 -0
  389. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_provider_usage_metering.py +0 -0
  390. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_pypi_publish.py +0 -0
  391. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_python_install_flows.py +0 -0
  392. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_readme_localization.py +0 -0
  393. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_release_checks.py +0 -0
  394. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_report_readiness_badge.py +0 -0
  395. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_reports.py +0 -0
  396. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_request_cache.py +0 -0
  397. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_retrieval_router.py +0 -0
  398. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_rewrite_accept.py +0 -0
  399. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_self_verification.py +0 -0
  400. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_service_http_server.py +0 -0
  401. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_session_branching.py +0 -0
  402. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_session_export_import.py +0 -0
  403. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_shell_completions_launchers.py +0 -0
  404. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_store_concurrency_and_idempotency.py +0 -0
  405. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_streaming_responses.py +0 -0
  406. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_streaming_tool_output.py +0 -0
  407. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_structured_function_calling.py +0 -0
  408. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_sub_agent.py +0 -0
  409. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_support_bundle.py +0 -0
  410. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_system_prompt_management.py +0 -0
  411. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_task_planner.py +0 -0
  412. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_tool_result_artifacts_output_limits.py +0 -0
  413. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_tool_sandbox.py +0 -0
  414. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_tool_timeout_rate_limit_circuit_breaker.py +0 -0
  415. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_unified_redaction.py +0 -0
  416. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_uninstall_data_retention.py +0 -0
  417. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_upgrade_migration_backup.py +0 -0
  418. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_windows_native_support.py +0 -0
  419. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_windows_utf8_bootstrap.py +0 -0
  420. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_workflow_recovery.py +0 -0
  421. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_workflow_state.py +0 -0
  422. {proseforge_agent-0.3.0 → proseforge_agent-0.3.2}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proseforge-agent
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Agentic orchestration layer for long-form novel production on top of the ProseForge engine.
5
5
  Author: ProseForge Agent
6
6
  License: Apache-2.0
@@ -32,7 +32,7 @@ Dynamic: license-file
32
32
  <p align="center">
33
33
  <a href="README.zh-CN.md">简体中文</a> ·
34
34
  <a href="https://pypi.org/project/proseforge-agent/">PyPI</a> ·
35
- <a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2.0">Release v0.2.0</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
 
@@ -58,8 +58,8 @@ image, or a background agent with gateway integrations.
58
58
  <tr><td><b>Draft with memory</b></td><td>Retrieve canon, timeline, character notes, prior scenes, and evidence packs before the model writes.</td></tr>
59
59
  <tr><td><b>Review and revise</b></td><td>Run a chapter lifecycle from draft to review, rewrite, and accept, with quality gates and rollback-friendly artifacts.</td></tr>
60
60
  <tr><td><b>Use the model you want</b></td><td>Profiles for OpenAI, Anthropic, Gemini, xAI/Grok, DeepSeek, Qwen, GLM, Mimo, MiniMax, Doubao, plus an offline fake provider.</td></tr>
61
- <tr><td><b>Run it like a real tool</b></td><td>Interactive REPL, full-screen TUI, 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.2.0</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>
61
+ <tr><td><b>Run it like a real tool</b></td><td>Full-screen TUI by default, explicit chat command, local API, Docker image, Telegram gateway, MCP stdio, local execution, cron, and telemetry.</td></tr>
62
+ <tr><td><b>Published now</b></td><td><code>v0.3.2</code> is the first-run UX release: one-line install upgrades the PyPI tool, repairs PATH priority, runs doctor, and opens the guided setup/TUI flow.</td></tr>
63
63
  </table>
64
64
 
65
65
  ---
@@ -69,7 +69,7 @@ image, or a background agent with gateway integrations.
69
69
  ### Python package
70
70
 
71
71
  ```bash
72
- pip install proseforge-agent
72
+ pip install -U proseforge-agent
73
73
  pf-agent --help
74
74
  ```
75
75
 
@@ -85,6 +85,12 @@ curl -fsSL https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent
85
85
  iex (irm https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.ps1)
86
86
  ```
87
87
 
88
+ The one-line installer uses PyPI + `uv tool` by default. It installs or
89
+ upgrades `proseforge-agent`, puts the manager bin directory first on PATH,
90
+ runs `pf-agent doctor`, then starts `pf-agent setup --quick`. Use
91
+ `--no-setup`, `--no-launch`, or `--non-interactive` on POSIX, and
92
+ `-NoSetup`, `-NoLaunch`, or `-NonInteractive` on PowerShell, when scripting.
93
+
88
94
  ### Docker
89
95
 
90
96
  ```bash
@@ -98,22 +104,24 @@ want unreleased changes from `main`.
98
104
  ## Getting Started
99
105
 
100
106
  ```bash
101
- pf-agent setup # guided wizard: providers, keys, workspace
102
- pf-agent # interactive chat REPL
103
- pf-agent tui # full-screen terminal UI
107
+ pf-agent quickstart # 60-second offline tour, no API keys needed
108
+ pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
109
+ pf-agent # full-screen terminal UI
110
+ pf-agent tui # same TUI, with explicit flags
104
111
  pf-agent chat --message "draft an opening" --provider fake
105
112
  pf-agent run --goal "draft a one-line opening" --max-iterations 5
106
113
  pf-agent service serve # local HTTP API on 127.0.0.1:8765
107
114
  ```
108
115
 
109
116
  The bare `pf-agent` command works like other coding agents' CLIs: the
110
- first run bootstraps a workspace, and after `pf-agent setup` it talks to
111
- your configured default model. Without setup, it runs against the offline
112
- fake provider so you can tour the CLI with no keys.
117
+ first run bootstraps a workspace, then opens the full-screen terminal UI.
118
+ After `pf-agent setup --quick` it talks to your configured default model. Without
119
+ setup, it runs against the offline fake provider so you can tour the CLI
120
+ with no keys.
113
121
 
114
- Set provider API keys in your environment (or `.env`, see
115
- `.env.example`): `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and friends.
116
- 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.
117
125
 
118
126
  ## Project Boundary
119
127
 
@@ -125,9 +133,9 @@ workflow state, conversational agent loops, and background event handling.
125
133
 
126
134
  ## Release Status
127
135
 
128
- `v0.2.0` was published on July 3, 2026 through PyPI Trusted Publishing.
129
- Release links: [PyPI](https://pypi.org/project/proseforge-agent/),
130
- [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2.0),
136
+ `v0.3.2` is prepared as the first-run UX patch release for July 3, 2026.
137
+ Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.2/),
138
+ [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.2),
131
139
  [GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
132
140
  and [`CHANGELOG.md`](CHANGELOG.md).
133
141
 
@@ -321,7 +329,7 @@ requests re-checked by downstream policy, plus research-ready
321
329
  `PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
322
330
  PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
323
331
  with injectable runner + `dry_run` for offline tests; tokens never appear
324
- in the plan, report, or logs. The public `v0.2.0` release path uses PyPI
332
+ in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
325
333
  Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
326
334
  repository.
327
335
 
@@ -440,8 +448,8 @@ configs/ agent and provider example configs
440
448
  docs/ operator, developer, implementation, and
441
449
  task-card plans (docs/superpowers/plans/)
442
450
  samples/ sample extensions
443
- tests/ pytest suite (1338 tests) + contract / golden
444
- tiers + fixtures
451
+ tests/ pytest suite (1358 tests: 35 integration plus
452
+ offline contract/golden tiers) + fixtures
445
453
  .github/workflows/ci.yml cross-platform CI (Windows, macOS, Linux)
446
454
  ```
447
455
 
@@ -13,7 +13,7 @@
13
13
  <p align="center">
14
14
  <a href="README.zh-CN.md">简体中文</a> ·
15
15
  <a href="https://pypi.org/project/proseforge-agent/">PyPI</a> ·
16
- <a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2.0">Release v0.2.0</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
 
@@ -39,8 +39,8 @@ image, or a background agent with gateway integrations.
39
39
  <tr><td><b>Draft with memory</b></td><td>Retrieve canon, timeline, character notes, prior scenes, and evidence packs before the model writes.</td></tr>
40
40
  <tr><td><b>Review and revise</b></td><td>Run a chapter lifecycle from draft to review, rewrite, and accept, with quality gates and rollback-friendly artifacts.</td></tr>
41
41
  <tr><td><b>Use the model you want</b></td><td>Profiles for OpenAI, Anthropic, Gemini, xAI/Grok, DeepSeek, Qwen, GLM, Mimo, MiniMax, Doubao, plus an offline fake provider.</td></tr>
42
- <tr><td><b>Run it like a real tool</b></td><td>Interactive REPL, full-screen TUI, 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.2.0</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>
42
+ <tr><td><b>Run it like a real tool</b></td><td>Full-screen TUI by default, explicit chat command, local API, Docker image, Telegram gateway, MCP stdio, local execution, cron, and telemetry.</td></tr>
43
+ <tr><td><b>Published now</b></td><td><code>v0.3.2</code> is the first-run UX release: one-line install upgrades the PyPI tool, repairs PATH priority, runs doctor, and opens the guided setup/TUI flow.</td></tr>
44
44
  </table>
45
45
 
46
46
  ---
@@ -50,7 +50,7 @@ image, or a background agent with gateway integrations.
50
50
  ### Python package
51
51
 
52
52
  ```bash
53
- pip install proseforge-agent
53
+ pip install -U proseforge-agent
54
54
  pf-agent --help
55
55
  ```
56
56
 
@@ -66,6 +66,12 @@ curl -fsSL https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent
66
66
  iex (irm https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.ps1)
67
67
  ```
68
68
 
69
+ The one-line installer uses PyPI + `uv tool` by default. It installs or
70
+ upgrades `proseforge-agent`, puts the manager bin directory first on PATH,
71
+ runs `pf-agent doctor`, then starts `pf-agent setup --quick`. Use
72
+ `--no-setup`, `--no-launch`, or `--non-interactive` on POSIX, and
73
+ `-NoSetup`, `-NoLaunch`, or `-NonInteractive` on PowerShell, when scripting.
74
+
69
75
  ### Docker
70
76
 
71
77
  ```bash
@@ -79,22 +85,24 @@ want unreleased changes from `main`.
79
85
  ## Getting Started
80
86
 
81
87
  ```bash
82
- pf-agent setup # guided wizard: providers, keys, workspace
83
- pf-agent # interactive chat REPL
84
- pf-agent tui # full-screen terminal UI
88
+ pf-agent quickstart # 60-second offline tour, no API keys needed
89
+ pf-agent setup --quick # guided wizard: provider, API key, model, language, workspace
90
+ pf-agent # full-screen terminal UI
91
+ pf-agent tui # same TUI, with explicit flags
85
92
  pf-agent chat --message "draft an opening" --provider fake
86
93
  pf-agent run --goal "draft a one-line opening" --max-iterations 5
87
94
  pf-agent service serve # local HTTP API on 127.0.0.1:8765
88
95
  ```
89
96
 
90
97
  The bare `pf-agent` command works like other coding agents' CLIs: the
91
- first run bootstraps a workspace, and after `pf-agent setup` it talks to
92
- your configured default model. Without setup, it runs against the offline
93
- fake provider so you can tour the CLI with no keys.
98
+ first run bootstraps a workspace, then opens the full-screen terminal UI.
99
+ After `pf-agent setup --quick` it talks to your configured default model. Without
100
+ setup, it runs against the offline fake provider so you can tour the CLI
101
+ with no keys.
94
102
 
95
- Set provider API keys in your environment (or `.env`, see
96
- `.env.example`): `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and friends.
97
- 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.
98
106
 
99
107
  ## Project Boundary
100
108
 
@@ -106,9 +114,9 @@ workflow state, conversational agent loops, and background event handling.
106
114
 
107
115
  ## Release Status
108
116
 
109
- `v0.2.0` was published on July 3, 2026 through PyPI Trusted Publishing.
110
- Release links: [PyPI](https://pypi.org/project/proseforge-agent/),
111
- [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.2.0),
117
+ `v0.3.2` is prepared as the first-run UX patch release for July 3, 2026.
118
+ Release links: [PyPI](https://pypi.org/project/proseforge-agent/0.3.2/),
119
+ [GitHub Release](https://github.com/remacheybn408-boop/ProseForge-Agent/releases/tag/v0.3.2),
112
120
  [GHCR image](https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent),
113
121
  and [`CHANGELOG.md`](CHANGELOG.md).
114
122
 
@@ -302,7 +310,7 @@ requests re-checked by downstream policy, plus research-ready
302
310
  `PyPIPublisher` — real `python -m build` + `twine upload` for TestPyPI /
303
311
  PyPI, gated by the Task 47 `PackageChecker` and duplicate-version refusal,
304
312
  with injectable runner + `dry_run` for offline tests; tokens never appear
305
- in the plan, report, or logs. The public `v0.2.0` release path uses PyPI
313
+ in the plan, report, or logs. The public `v0.3.2` release path uses PyPI
306
314
  Trusted Publishing / OIDC, so no long-lived PyPI token is stored in the
307
315
  repository.
308
316
 
@@ -421,8 +429,8 @@ configs/ agent and provider example configs
421
429
  docs/ operator, developer, implementation, and
422
430
  task-card plans (docs/superpowers/plans/)
423
431
  samples/ sample extensions
424
- tests/ pytest suite (1338 tests) + contract / golden
425
- tiers + fixtures
432
+ tests/ pytest suite (1358 tests: 35 integration plus
433
+ offline contract/golden tiers) + fixtures
426
434
  .github/workflows/ci.yml cross-platform CI (Windows, macOS, Linux)
427
435
  ```
428
436
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "proseforge-agent"
7
- version = "0.3.0"
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.0"
8
+ __version__ = "0.3.2"
9
9
 
10
10
  __all__ = ["__version__"]
@@ -455,7 +455,7 @@ def build_parser() -> argparse.ArgumentParser:
455
455
  parser.add_argument(
456
456
  "--no-default",
457
457
  action="store_true",
458
- help="with no command, print help instead of launching the default chat REPL",
458
+ help="with no command, print help instead of launching the default terminal UI",
459
459
  )
460
460
 
461
461
  shared = _output_parser()
@@ -5536,6 +5536,8 @@ def _handle_setup(args: argparse.Namespace) -> int:
5536
5536
  no_shell=args.no_shell,
5537
5537
  repair=args.repair,
5538
5538
  print_config=args.print_config,
5539
+ interactive=not args.non_interactive and not args.minimal and not args.print_config,
5540
+ launch=False,
5539
5541
  )
5540
5542
  if args.print_config:
5541
5543
  print(result.rendered_config, end="")
@@ -6827,8 +6829,8 @@ def _handle_install(args: argparse.Namespace) -> int:
6827
6829
  def _dispatch_bare_command(args: argparse.Namespace) -> int:
6828
6830
  """Dispatch bare ``pf-agent`` (no subcommand).
6829
6831
 
6830
- When the workspace is already configured, launch the interactive chat
6831
- REPL. Otherwise route to first-run guidance. Any runtime failure is
6832
+ When the workspace is already configured, launch the terminal UI.
6833
+ Otherwise run first-run guidance, then enter that same UI. Runtime failure is
6832
6834
  reported as a one-line message, never a Python traceback.
6833
6835
  """
6834
6836
  try:
@@ -6838,19 +6840,23 @@ def _dispatch_bare_command(args: argparse.Namespace) -> int:
6838
6840
  decision = AutoBootstrap(root=root).decide()
6839
6841
  if decision.verdict != SKIP:
6840
6842
  # Auto-run the non-destructive first-run bootstrap, then stamp the
6841
- # consent marker so subsequent invocations skip straight to chat.
6843
+ # consent marker so subsequent invocations skip straight to the UI.
6842
6844
  from .install.first_run import FirstRunWizard
6843
6845
 
6844
6846
  print(f"First run: {decision.reason}. Setting up your workspace...")
6845
6847
  FirstRunWizard(root).run({})
6846
6848
  complete_first_run(root)
6847
6849
 
6848
- from .chat import repl as chat_repl
6849
-
6850
- # provider=None resolves the workspace's configured default_provider
6851
- # (set by `pf-agent setup`), so the bare command talks to a real model
6852
- # once the user has completed setup — offline fake until then.
6853
- return chat_repl.run_repl(provider=None, root=str(root))
6850
+ tui_args = argparse.Namespace(
6851
+ provider=None,
6852
+ project=None,
6853
+ no_project=False,
6854
+ mode="general_chat",
6855
+ check=False,
6856
+ plain=False,
6857
+ format=getattr(args, "format", "terminal"),
6858
+ )
6859
+ return _handle_tui(tui_args)
6854
6860
  except ProseForgeAgentError as exc:
6855
6861
  print(f"error: {exc}", file=sys.stderr)
6856
6862
  return 2
@@ -7,7 +7,8 @@ shell variables. Load precedence (higher wins):
7
7
  1. existing ``os.environ`` (never overridden by default)
8
8
  2. ``.env.local``
9
9
  3. ``.env``
10
- 4. ``<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()