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.
- {drydock_cli-3.1.11/drydock_cli.egg-info → drydock_cli-3.1.13}/PKG-INFO +4 -4
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/README.md +3 -3
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/config.py +15 -12
- {drydock_cli-3.1.11 → drydock_cli-3.1.13/drydock_cli.egg-info}/PKG-INFO +4 -4
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/pyproject.toml +1 -1
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_config.py +16 -14
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/LICENSE +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/NOTICE +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/__init__.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/__main__.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/advisor.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/agent.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/budget.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/document-canvas.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-assess.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-cap.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-evidence.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/fiar-readiness.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-data.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-debug.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-finetune.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-metrics.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-rl.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/ml-train.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/nist-ai-rmf.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/nist-csf.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/cci.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/cli.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/compaction.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/detect.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/doccanvas.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/events.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/extract.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/fiar.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/gittools.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/graphrag.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/guards.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/mcp.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/phases.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/poam.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/progress.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/providers.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/ratchet.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/recipes.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/recovery.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/resume.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/rmf.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/skills.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/stig.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/subagents.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/suggest.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/task_state.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_policy.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_result.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_select.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tool_validate.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tools/__init__.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/trajectory.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/app.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/tuning.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/verification.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock/web.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/setup.cfg +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_advisor.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_approval.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_back_command.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_budget.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_cci.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_compaction.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_context_limit_issue25.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_criteria_coverage.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_cycling_detection.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_degenerate_argument.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_detect.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_doccanvas.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_effort_governor.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_events.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_extract.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_fiar.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_gittools.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_graphrag_sqlite.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_mcp.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_model_registry.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_phases.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_poam.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_progress.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_ratchet.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_read_index.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recipes.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recovery.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recovery_config.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_recovery_integration.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_repeated_outcome.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_resume_events.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_resume_restore.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_resume_snapshot.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rmf.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_rolling_plan.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_screenshot.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_skills.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_sqlite_events.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_stig.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_stop.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_subagent.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_subagents.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_suggest.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_task_state.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_timeline.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_todo.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_canonical.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_policy.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_result.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_select.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tool_validate.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_trajectory.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tui.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_tuning.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_verification_gate.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_worker_subagent.py +0 -0
- {drydock_cli-3.1.11 → drydock_cli-3.1.13}/tests/test_write_content_coerce.py +0 -0
- {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.
|
|
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** —
|
|
461
|
-
|
|
462
|
-
|
|
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** —
|
|
437
|
-
|
|
438
|
-
|
|
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:
|
|
129
|
-
Overrides the global one when present — different
|
|
130
|
-
|
|
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:
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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 (
|
|
198
|
-
|
|
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.
|
|
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** —
|
|
461
|
-
|
|
462
|
-
|
|
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.
|
|
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";
|
|
171
|
-
(proj / "
|
|
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 .
|
|
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
|
|
187
|
-
# git
|
|
188
|
-
|
|
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
|
|
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 / ".
|
|
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 / "
|
|
204
|
+
assert (repo / "system_prompt.md").read_text() == "MINE"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|