drydock-cli 3.0.111__tar.gz → 3.0.112__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.0.111/drydock_cli.egg-info → drydock_cli-3.0.112}/PKG-INFO +1 -1
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/graphrag.py +14 -2
- {drydock_cli-3.0.111 → drydock_cli-3.0.112/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock_cli.egg-info/SOURCES.txt +1 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/pyproject.toml +1 -1
- drydock_cli-3.0.112/tests/test_graphrag_quoted_path.py +43 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/LICENSE +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/NOTICE +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/README.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/__init__.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/advisor.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/agent.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/cci.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/cli.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/config.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/detect.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/extract.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/gittools.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/guards.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/mcp.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/poam.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/providers.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/rmf.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/skills.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/stig.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tools/__init__.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tui/app.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock/web.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/setup.cfg +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_advisor.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_cci.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_config.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_extract.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_gittools.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_mcp.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_poam.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_read_index.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_rmf.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_skills.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_stig.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_tuning.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.0.111 → drydock_cli-3.0.112}/tests/test_xccdf.py +0 -0
|
@@ -101,9 +101,20 @@ def _chunk_text(text: str, max_chars: int = 1200) -> list[str]:
|
|
|
101
101
|
return chunks
|
|
102
102
|
|
|
103
103
|
|
|
104
|
+
def _unquote(p: str) -> str:
|
|
105
|
+
"""Strip surrounding quotes a user wrapped a path in — common on Windows:
|
|
106
|
+
`/graphrag build "C:\\Users\\me\\Documents"`. Without this the quote chars
|
|
107
|
+
become part of the path, isabs() is False, it's joined under cwd, and nothing
|
|
108
|
+
is found ("No text found. Nothing was indexed.")."""
|
|
109
|
+
p = p.strip()
|
|
110
|
+
if len(p) >= 2 and p[0] == p[-1] and p[0] in "\"'":
|
|
111
|
+
p = p[1:-1]
|
|
112
|
+
return p
|
|
113
|
+
|
|
114
|
+
|
|
104
115
|
def _iter_text_files(paths: list[str]):
|
|
105
116
|
for p in paths:
|
|
106
|
-
path = Path(p)
|
|
117
|
+
path = Path(_unquote(p))
|
|
107
118
|
if path.is_file():
|
|
108
119
|
yield path
|
|
109
120
|
elif path.is_dir():
|
|
@@ -120,8 +131,9 @@ def _ingest_files(paths, cwd, chunks, entity_chunks, edges, skip_sources):
|
|
|
120
131
|
"""Chunk + extract + graph every text file under paths into the (mutable)
|
|
121
132
|
accumulators, skipping any source already present. Returns files added."""
|
|
122
133
|
added = 0
|
|
134
|
+
cleaned = [_unquote(p) for p in paths]
|
|
123
135
|
for fp in _iter_text_files([str(Path(cwd) / p) if not os.path.isabs(p) else p
|
|
124
|
-
for p in
|
|
136
|
+
for p in cleaned]):
|
|
125
137
|
rel = os.path.relpath(str(fp), cwd)
|
|
126
138
|
if rel in skip_sources:
|
|
127
139
|
continue
|
|
@@ -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.0.
|
|
10
|
+
version = "3.0.112"
|
|
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"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""A user wrapping the path in quotes — common on Windows, e.g.
|
|
2
|
+
`/graphrag build "C:\\Users\\me\\Documents"` — must still index. Before the fix
|
|
3
|
+
the quote chars became part of the path, isabs() was False, it was joined under
|
|
4
|
+
cwd, and nothing was found ('No text found. Nothing was indexed.')."""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import tempfile
|
|
9
|
+
|
|
10
|
+
from drydock import graphrag
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _make_docs():
|
|
14
|
+
src = tempfile.mkdtemp()
|
|
15
|
+
open(os.path.join(src, "notes.txt"), "w").write("Apollo landed on the Moon in 1969.")
|
|
16
|
+
open(os.path.join(src, "readme.md"), "w").write("# Project\nDrydock is a coding agent.")
|
|
17
|
+
store = os.path.join(tempfile.mkdtemp(), "kb.json") # store OUTSIDE the scanned dir
|
|
18
|
+
return src, store
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_double_quoted_path_indexes():
|
|
22
|
+
src, store = _make_docs()
|
|
23
|
+
stats = graphrag.build_index([f'"{src}"'], store)
|
|
24
|
+
assert stats["files"] == 2 and stats["chunks"] >= 2
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_single_quoted_path_indexes():
|
|
28
|
+
src, store = _make_docs()
|
|
29
|
+
stats = graphrag.build_index([f"'{src}'"], store)
|
|
30
|
+
assert stats["files"] == 2
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_unquoted_path_still_works():
|
|
34
|
+
src, store = _make_docs()
|
|
35
|
+
assert graphrag.build_index([src], store)["files"] == 2
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_unquote_helper():
|
|
39
|
+
assert graphrag._unquote('"C:\\Users\\x"') == "C:\\Users\\x"
|
|
40
|
+
assert graphrag._unquote("'/a/b'") == "/a/b"
|
|
41
|
+
assert graphrag._unquote("/plain/path") == "/plain/path"
|
|
42
|
+
assert graphrag._unquote(' "spaced" ') == "spaced"
|
|
43
|
+
assert graphrag._unquote('"') == '"' # lone quote unchanged
|
|
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
|