drydock-cli 3.1.11__tar.gz → 3.1.13__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 (192) hide show
  1. {drydock_cli-3.1.11/drydock_cli.egg-info → drydock_cli-3.1.13}/PKG-INFO +4 -4
  2. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/README.md +3 -3
  3. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/config.py +15 -12
  4. {drydock_cli-3.1.11 → drydock_cli-3.1.13/drydock_cli.egg-info}/PKG-INFO +4 -4
  5. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/pyproject.toml +1 -1
  6. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_config.py +16 -14
  7. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/LICENSE +0 -0
  8. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/NOTICE +0 -0
  9. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/__init__.py +0 -0
  10. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/__main__.py +0 -0
  11. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/advisor.py +0 -0
  12. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/agent.py +0 -0
  13. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/bash_safety.py +0 -0
  14. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/budget.py +0 -0
  15. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/__init__.py +0 -0
  16. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/document-canvas.md +0 -0
  17. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-assess.md +0 -0
  18. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-cap.md +0 -0
  19. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-evidence.md +0 -0
  20. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-readiness.md +0 -0
  21. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-data.md +0 -0
  22. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-debug.md +0 -0
  23. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-finetune.md +0 -0
  24. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-metrics.md +0 -0
  25. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-rl.md +0 -0
  26. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-train.md +0 -0
  27. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/nist-ai-rmf.md +0 -0
  28. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/nist-csf.md +0 -0
  29. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-categorize.md +0 -0
  30. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-control.md +0 -0
  31. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-poam.md +0 -0
  32. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-review.md +0 -0
  33. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/stig-assess.md +0 -0
  34. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/stig-remediate.md +0 -0
  35. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/cci.py +0 -0
  36. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/cli.py +0 -0
  37. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/compaction.py +0 -0
  38. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/detect.py +0 -0
  39. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/doccanvas.py +0 -0
  40. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/events.py +0 -0
  41. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/extract.py +0 -0
  42. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/fiar.py +0 -0
  43. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/gittools.py +0 -0
  44. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/graphrag.py +0 -0
  45. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/guards.py +0 -0
  46. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/loop_detect.py +0 -0
  47. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/mcp.py +0 -0
  48. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/phases.py +0 -0
  49. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/poam.py +0 -0
  50. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/progress.py +0 -0
  51. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/providers.py +0 -0
  52. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/ratchet.py +0 -0
  53. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/recipes.py +0 -0
  54. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/recovery.py +0 -0
  55. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/resume.py +0 -0
  56. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/rmf.py +0 -0
  57. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/rmf_graph.py +0 -0
  58. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/skills.py +0 -0
  59. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/stig.py +0 -0
  60. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/subagents.py +0 -0
  61. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/suggest.py +0 -0
  62. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/task_state.py +0 -0
  63. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_policy.py +0 -0
  64. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_registry.py +0 -0
  65. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_result.py +0 -0
  66. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_select.py +0 -0
  67. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_validate.py +0 -0
  68. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tools/__init__.py +0 -0
  69. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/trajectory.py +0 -0
  70. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/__init__.py +0 -0
  71. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/app.py +0 -0
  72. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/approval.py +0 -0
  73. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/messages.py +0 -0
  74. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/widgets.py +0 -0
  75. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tuning.py +0 -0
  76. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/verification.py +0 -0
  77. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/web.py +0 -0
  78. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/SOURCES.txt +0 -0
  79. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/dependency_links.txt +0 -0
  80. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/entry_points.txt +0 -0
  81. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/requires.txt +0 -0
  82. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/top_level.txt +0 -0
  83. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/setup.cfg +0 -0
  84. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_advisor.py +0 -0
  85. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_approval.py +0 -0
  86. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_back_command.py +0 -0
  87. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_background.py +0 -0
  88. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_binary_output.py +0 -0
  89. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_crossplatform.py +0 -0
  90. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_output_bounding.py +0 -0
  91. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_process_group.py +0 -0
  92. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_safety.py +0 -0
  93. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_sanitize.py +0 -0
  94. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_shell.py +0 -0
  95. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_stdin.py +0 -0
  96. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_stop_partial.py +0 -0
  97. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_timeout_network.py +0 -0
  98. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_timeout_param.py +0 -0
  99. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_budget.py +0 -0
  100. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_cci.py +0 -0
  101. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_cli_agents.py +0 -0
  102. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_compact_command.py +0 -0
  103. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_compaction.py +0 -0
  104. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_config_migration.py +0 -0
  105. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_context_limit_config.py +0 -0
  106. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_context_limit_issue25.py +0 -0
  107. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_criteria_coverage.py +0 -0
  108. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_cycling_detection.py +0 -0
  109. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_degenerate_argument.py +0 -0
  110. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_detect.py +0 -0
  111. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_dispatch.py +0 -0
  112. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_doccanvas.py +0 -0
  113. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_e2e_connected.py +0 -0
  114. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_edit_replace_all.py +0 -0
  115. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_effort_governor.py +0 -0
  116. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_empty_response.py +0 -0
  117. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_events.py +0 -0
  118. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_extract.py +0 -0
  119. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_failure_loop.py +0 -0
  120. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_fiar.py +0 -0
  121. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_first_run_setup.py +0 -0
  122. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_gittools.py +0 -0
  123. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_glob_edit_edges.py +0 -0
  124. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphify_example.py +0 -0
  125. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphrag.py +0 -0
  126. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphrag_quoted_path.py +0 -0
  127. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphrag_sqlite.py +0 -0
  128. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_grep_and_read_robust.py +0 -0
  129. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_guards_and_tools.py +0 -0
  130. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_hallucinated_tools.py +0 -0
  131. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_leaked_tool_call.py +0 -0
  132. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_loop_detect.py +0 -0
  133. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_mcp.py +0 -0
  134. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_model_registry.py +0 -0
  135. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_oneshot_unreachable.py +0 -0
  136. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_overthink_interrupt.py +0 -0
  137. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_phases.py +0 -0
  138. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_plan_autocontinue.py +0 -0
  139. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_poam.py +0 -0
  140. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_progress.py +0 -0
  141. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_providers_unreachable.py +0 -0
  142. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_ratchet.py +0 -0
  143. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_read_index.py +0 -0
  144. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recipes.py +0 -0
  145. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recovery.py +0 -0
  146. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recovery_config.py +0 -0
  147. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recovery_integration.py +0 -0
  148. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_repeated_outcome.py +0 -0
  149. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_repetition_interrupt.py +0 -0
  150. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_resume_events.py +0 -0
  151. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_resume_restore.py +0 -0
  152. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_resume_snapshot.py +0 -0
  153. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rmf.py +0 -0
  154. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rmf_graph.py +0 -0
  155. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rmf_stig_graph.py +0 -0
  156. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rolling_plan.py +0 -0
  157. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_runaway_repetition.py +0 -0
  158. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_screenshot.py +0 -0
  159. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_server_probe.py +0 -0
  160. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_skills.py +0 -0
  161. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_sqlite_events.py +0 -0
  162. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_stall_retry.py +0 -0
  163. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_stig.py +0 -0
  164. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_stop.py +0 -0
  165. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_streaming_newlines.py +0 -0
  166. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_subagent.py +0 -0
  167. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_subagents.py +0 -0
  168. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_suggest.py +0 -0
  169. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_system_prompt_help.py +0 -0
  170. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_task_state.py +0 -0
  171. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_timeline.py +0 -0
  172. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_todo.py +0 -0
  173. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_arg_coercion.py +0 -0
  174. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_arg_coercion_more.py +0 -0
  175. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_arg_parsing.py +0 -0
  176. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_canonical.py +0 -0
  177. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_policy.py +0 -0
  178. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_result.py +0 -0
  179. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_select.py +0 -0
  180. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_validate.py +0 -0
  181. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tools_undo.py +0 -0
  182. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_trajectory.py +0 -0
  183. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tui.py +0 -0
  184. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tuning.py +0 -0
  185. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_verification_gate.py +0 -0
  186. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_viewimage.py +0 -0
  187. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_vision_input.py +0 -0
  188. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_web_tools.py +0 -0
  189. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_windows_shell.py +0 -0
  190. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_worker_subagent.py +0 -0
  191. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_write_content_coerce.py +0 -0
  192. {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_xccdf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 3.1.11
3
+ Version: 3.1.13
4
4
  Summary: Drydock — a local, provider-agnostic terminal coding agent for local LLMs
5
5
  Author: Frank Bobe III
6
6
  License-Expression: Apache-2.0
@@ -457,9 +457,9 @@ It has no effect until you add text (the template is all comments, ignored).
457
457
 
458
458
  Two scopes, most-specific wins:
459
459
 
460
- - **Per-project** — `<project>/.drydock/system_prompt.md`. Auto-created inside
461
- any **git repo** (so different projects get different standing orders, and
462
- drydock never litters `.drydock/` folders in non-project directories).
460
+ - **Per-project** — `system_prompt.md` in the folder you launch drydock from.
461
+ Auto-created there on first launch (any folder except your home directory), so
462
+ different projects get different standing orders. Overrides the global one.
463
463
  - **Global** — `~/.drydock/system_prompt.md`. Auto-created on first run; applies
464
464
  to every project. A per-project file **overrides** it.
465
465
  - **Or the config key** — `system_prompt = "..."` in `~/.drydock/config.toml`
@@ -433,9 +433,9 @@ It has no effect until you add text (the template is all comments, ignored).
433
433
 
434
434
  Two scopes, most-specific wins:
435
435
 
436
- - **Per-project** — `<project>/.drydock/system_prompt.md`. Auto-created inside
437
- any **git repo** (so different projects get different standing orders, and
438
- drydock never litters `.drydock/` folders in non-project directories).
436
+ - **Per-project** — `system_prompt.md` in the folder you launch drydock from.
437
+ Auto-created there on first launch (any folder except your home directory), so
438
+ different projects get different standing orders. Overrides the global one.
439
439
  - **Global** — `~/.drydock/system_prompt.md`. Auto-created on first run; applies
440
440
  to every project. A per-project file **overrides** it.
441
441
  - **Or the config key** — `system_prompt = "..."` in `~/.drydock/config.toml`
@@ -125,9 +125,10 @@ def system_prompt_path() -> Path:
125
125
 
126
126
 
127
127
  def project_system_prompt_path(cwd: Path | None = None) -> Path:
128
- """A PER-PROJECT custom system-prompt file: <project>/.drydock/system_prompt.md.
129
- Overrides the global one when present — different projects, different orders."""
130
- return (cwd or Path.cwd()) / ".drydock" / "system_prompt.md"
128
+ """A PER-PROJECT custom system-prompt file: system_prompt.md in the folder
129
+ drydock was started from. Overrides the global one when present — different
130
+ projects, different orders."""
131
+ return (cwd or Path.cwd()) / "system_prompt.md"
131
132
 
132
133
 
133
134
  # The template drydock drops so the file is always THERE and discoverable — the
@@ -145,9 +146,9 @@ _SYSTEM_PROMPT_TEMPLATE = """\
145
146
  - Prefer the standard library; avoid adding new dependencies.
146
147
  - State your plan in one sentence before making changes.
147
148
 
148
- SCOPE: this file is THIS PROJECT'S prompt if it lives at <project>/.drydock/
149
- system_prompt.md; the copy at ~/.drydock/system_prompt.md applies to every
150
- project. A project file OVERRIDES the global one.
149
+ SCOPE: a system_prompt.md in a project's root folder is THAT PROJECT'S prompt;
150
+ the copy at ~/.drydock/system_prompt.md applies to every project. A project
151
+ file OVERRIDES the global one.
151
152
 
152
153
  This template has NO effect until you add your own text below this comment.
153
154
  Comment blocks like this one are ignored. Capped at 8000 characters.
@@ -188,14 +189,16 @@ def ensure_system_prompt_file(config_dir: Path | None = None) -> None:
188
189
 
189
190
 
190
191
  def ensure_project_system_prompt(cwd: Path | None = None) -> None:
191
- """Create <project>/.drydock/system_prompt.md if absent — but ONLY inside a git
192
- repo, so drydock never litters `.drydock/` folders in arbitrary directories
193
- (e.g. $HOME, /tmp). A real project you `git init`'d gets a discoverable,
194
- gitignorable per-project prompt; a throwaway cwd gets nothing. Never raises."""
192
+ """Create system_prompt.md in the folder drydock was started from if absent, so
193
+ it's right there in your project after the first launch — no git repo required.
194
+ The ONE exception is the home directory itself: we don't drop a stray
195
+ ~/system_prompt.md there (the global prompt already lives in ~/.drydock/).
196
+ Never overwrites an existing file; never raises."""
195
197
  cwd = cwd or Path.cwd()
196
198
  try:
197
- if (cwd / ".git").exists(): # file OR dir — covers worktrees too
198
- _write_template(project_system_prompt_path(cwd))
199
+ if cwd.resolve() == Path.home().resolve():
200
+ return
201
+ _write_template(project_system_prompt_path(cwd))
199
202
  except OSError:
200
203
  pass
201
204
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 3.1.11
3
+ Version: 3.1.13
4
4
  Summary: Drydock — a local, provider-agnostic terminal coding agent for local LLMs
5
5
  Author: Frank Bobe III
6
6
  License-Expression: Apache-2.0
@@ -457,9 +457,9 @@ It has no effect until you add text (the template is all comments, ignored).
457
457
 
458
458
  Two scopes, most-specific wins:
459
459
 
460
- - **Per-project** — `<project>/.drydock/system_prompt.md`. Auto-created inside
461
- any **git repo** (so different projects get different standing orders, and
462
- drydock never litters `.drydock/` folders in non-project directories).
460
+ - **Per-project** — `system_prompt.md` in the folder you launch drydock from.
461
+ Auto-created there on first launch (any folder except your home directory), so
462
+ different projects get different standing orders. Overrides the global one.
463
463
  - **Global** — `~/.drydock/system_prompt.md`. Auto-created on first run; applies
464
464
  to every project. A per-project file **overrides** it.
465
465
  - **Or the config key** — `system_prompt = "..."` in `~/.drydock/config.toml`
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
  # PyPI distribution name is drydock-cli (the established install name, continued
8
8
  # from the retired v2 fork); the import package + CLI command stay `drydock`.
9
9
  name = "drydock-cli"
10
- version = "3.1.11"
10
+ version = "3.1.13"
11
11
  description = "Drydock — a local, provider-agnostic terminal coding agent for local LLMs"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.11"
@@ -167,8 +167,8 @@ def test_project_prompt_overrides_global(monkeypatch, tmp_path):
167
167
  home = tmp_path / "home"; (home / ".drydock").mkdir(parents=True)
168
168
  (home / ".drydock" / "system_prompt.md").write_text("GLOBAL RULES")
169
169
  monkeypatch.setattr(cfg.Path, "home", staticmethod(lambda: home))
170
- proj = tmp_path / "proj"; (proj / ".drydock").mkdir(parents=True)
171
- (proj / ".drydock" / "system_prompt.md").write_text("PROJECT RULES")
170
+ proj = tmp_path / "proj"; proj.mkdir()
171
+ (proj / "system_prompt.md").write_text("PROJECT RULES")
172
172
  out = cfg.load_user_system_prompt({}, cwd=proj)
173
173
  assert "PROJECT RULES" in out
174
174
  assert "GLOBAL RULES" not in out
@@ -178,25 +178,27 @@ def test_global_used_when_no_project_file(monkeypatch, tmp_path):
178
178
  home = tmp_path / "home"; (home / ".drydock").mkdir(parents=True)
179
179
  (home / ".drydock" / "system_prompt.md").write_text("GLOBAL RULES")
180
180
  monkeypatch.setattr(cfg.Path, "home", staticmethod(lambda: home))
181
- proj = tmp_path / "proj"; proj.mkdir() # no .drydock
181
+ proj = tmp_path / "proj"; proj.mkdir() # no project system_prompt.md
182
182
  out = cfg.load_user_system_prompt({}, cwd=proj)
183
183
  assert "GLOBAL RULES" in out
184
184
 
185
185
 
186
- def test_ensure_project_prompt_only_in_git_repo(tmp_path):
187
- # git repo → template created
188
- repo = tmp_path / "repo"; (repo / ".git").mkdir(parents=True)
189
- cfg.ensure_project_system_prompt(repo)
190
- assert (repo / ".drydock" / "system_prompt.md").exists()
191
- # non-git dir → nothing created (no litter)
192
- plain = tmp_path / "plain"; plain.mkdir()
186
+ def test_ensure_project_prompt_creates_in_any_dir(tmp_path):
187
+ # any launch folder (git or not) gets the template at its root
188
+ plain = tmp_path / "proj"; plain.mkdir()
193
189
  cfg.ensure_project_system_prompt(plain)
194
- assert not (plain / ".drydock").exists()
190
+ assert (plain / "system_prompt.md").exists()
191
+
192
+
193
+ def test_ensure_project_prompt_skips_home(monkeypatch, tmp_path):
194
+ # never drop a stray ~/system_prompt.md in the home root
195
+ monkeypatch.setattr(cfg.Path, "home", staticmethod(lambda: tmp_path))
196
+ cfg.ensure_project_system_prompt(tmp_path)
197
+ assert not (tmp_path / "system_prompt.md").exists()
195
198
 
196
199
 
197
200
  def test_ensure_project_prompt_never_overwrites(tmp_path):
198
201
  repo = tmp_path / "repo"; (repo / ".git").mkdir(parents=True)
199
- (repo / ".drydock").mkdir()
200
- (repo / ".drydock" / "system_prompt.md").write_text("MINE")
202
+ (repo / "system_prompt.md").write_text("MINE")
201
203
  cfg.ensure_project_system_prompt(repo)
202
- assert (repo / ".drydock" / "system_prompt.md").read_text() == "MINE"
204
+ assert (repo / "system_prompt.md").read_text() == "MINE"
File without changes
File without changes
File without changes