agentless-mcp 0.1.0__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.
- agentless_mcp-0.1.0/LICENSE +21 -0
- agentless_mcp-0.1.0/NOTICE +53 -0
- agentless_mcp-0.1.0/PKG-INFO +162 -0
- agentless_mcp-0.1.0/README.md +133 -0
- agentless_mcp-0.1.0/pyproject.toml +320 -0
- agentless_mcp-0.1.0/src/agentless_mcp/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/__main__.py +6 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/cli/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/cli/formatting.py +78 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/cli/main.py +1424 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/mcp/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/mcp/annotations.py +31 -0
- agentless_mcp-0.1.0/src/agentless_mcp/adapters/mcp/server.py +605 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/envelope.py +241 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/graph_service.py +528 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/lint_service.py +181 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/map_service.py +383 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/patch_service.py +409 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/render.py +791 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/repo_context.py +108 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/symbol_service.py +595 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/validate_service.py +826 -0
- agentless_mcp-0.1.0/src/agentless_mcp/application/view_service.py +207 -0
- agentless_mcp-0.1.0/src/agentless_mcp/bootstrap.py +153 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/cache.py +1086 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/communities.py +339 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/extractor.py +1993 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/gitinfo.py +147 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/grammars.py +314 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/graph.py +301 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/imports.py +20 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/locs.py +307 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/mermaid.py +357 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/normalize.py +237 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/patches.py +588 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/patchlint.py +1761 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/projectconfig.py +334 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/refs.py +246 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/resolve.py +776 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/sandbox.py +436 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/skeleton.py +304 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/slices.py +164 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/symbols.py +279 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/treewalk.py +245 -0
- agentless_mcp-0.1.0/src/agentless_mcp/core/vote.py +295 -0
- agentless_mcp-0.1.0/src/agentless_mcp/prompts/__init__.py +107 -0
- agentless_mcp-0.1.0/src/agentless_mcp/prompts/envelope.json +13 -0
- agentless_mcp-0.1.0/src/agentless_mcp/prompts/loader.py +94 -0
- agentless_mcp-0.1.0/src/agentless_mcp/prompts/messages.json +16 -0
- agentless_mcp-0.1.0/src/agentless_mcp/prompts/tool_descriptions.json +13 -0
- agentless_mcp-0.1.0/src/agentless_mcp/util/__init__.py +1 -0
- agentless_mcp-0.1.0/src/agentless_mcp/util/errors.py +43 -0
- agentless_mcp-0.1.0/src/agentless_mcp/util/filelock.py +104 -0
- agentless_mcp-0.1.0/src/agentless_mcp/util/fslimits.py +211 -0
- agentless_mcp-0.1.0/src/agentless_mcp/util/platforms.py +21 -0
- agentless_mcp-0.1.0/src/agentless_mcp/util/tokens.py +44 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Dallas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
agentless-mcp
|
|
2
|
+
Copyright (c) 2026 Dallas
|
|
3
|
+
|
|
4
|
+
This product includes software derived from Agentless
|
|
5
|
+
(https://github.com/OpenAutoCoder/Agentless), which is distributed under the
|
|
6
|
+
MIT License.
|
|
7
|
+
|
|
8
|
+
The following parts of this package are ports or adaptations of Agentless
|
|
9
|
+
code, rewritten for this package's value objects and error handling but
|
|
10
|
+
keeping the upstream semantics:
|
|
11
|
+
|
|
12
|
+
* src/agentless_mcp/core/slices.py
|
|
13
|
+
line wrapping and interval merging, from Agentless
|
|
14
|
+
agentless/util/preprocess_data.py
|
|
15
|
+
|
|
16
|
+
* src/agentless_mcp/core/locs.py
|
|
17
|
+
the location grammar and its transfer onto extracted symbols, from
|
|
18
|
+
Agentless agentless/util/preprocess_data.py
|
|
19
|
+
(transfer_arb_locs_to_locs)
|
|
20
|
+
|
|
21
|
+
* src/agentless_mcp/core/patches.py
|
|
22
|
+
the SEARCH/REPLACE edit format and its parser, from Agentless
|
|
23
|
+
agentless/util/postprocess_data.py
|
|
24
|
+
|
|
25
|
+
* src/agentless_mcp/core/vote.py
|
|
26
|
+
the candidate filter ladder and the majority-vote ranking key, from
|
|
27
|
+
Agentless agentless/repair/rerank.py
|
|
28
|
+
|
|
29
|
+
Upstream license, reproduced in full:
|
|
30
|
+
|
|
31
|
+
------------------------------------------------------------------------------
|
|
32
|
+
MIT License
|
|
33
|
+
|
|
34
|
+
Copyright (c) 2024 OpenAutoCoder
|
|
35
|
+
|
|
36
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
37
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
38
|
+
in the Software without restriction, including without limitation the rights
|
|
39
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
40
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
41
|
+
furnished to do so, subject to the following conditions:
|
|
42
|
+
|
|
43
|
+
The above copyright notice and this permission notice shall be included in all
|
|
44
|
+
copies or substantial portions of the Software.
|
|
45
|
+
|
|
46
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
47
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
48
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
49
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
50
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
51
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
52
|
+
SOFTWARE.
|
|
53
|
+
------------------------------------------------------------------------------
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentless-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Model-free tree-sitter repo-map, localization and patch-validation machinery for agents
|
|
5
|
+
Author: Dallas
|
|
6
|
+
Author-email: Dallas <dmarlow@tuta.io>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
License-File: NOTICE
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Software Development
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Requires-Dist: tree-sitter>=0.25,<0.27
|
|
20
|
+
Requires-Dist: tree-sitter-language-pack==1.14.3
|
|
21
|
+
Requires-Dist: fastmcp>=2.14 ; extra == 'mcp'
|
|
22
|
+
Requires-Dist: mcp>=1.29 ; extra == 'mcp'
|
|
23
|
+
Requires-Dist: tiktoken>=0.9 ; extra == 'tokens'
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Project-URL: Repository, https://github.com/dmarlow-personal/agentless-mcp
|
|
26
|
+
Provides-Extra: mcp
|
|
27
|
+
Provides-Extra: tokens
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# agentless-mcp
|
|
31
|
+
|
|
32
|
+
`agentless-mcp` is model-free structural machinery for coding agents: an
|
|
33
|
+
on-demand tree-sitter repo map at any zoom level (directory tree, skeleton,
|
|
34
|
+
line slice), symbol and reference lookup for bug localization, and
|
|
35
|
+
deterministic patch parsing, syntax-checking and candidate validation. It
|
|
36
|
+
never calls a language model — the calling agent supplies all the reasoning,
|
|
37
|
+
and this tool supplies the parsing, ranking, containment and verification it
|
|
38
|
+
would otherwise improvise. It ships as a CLI any agent can invoke over Bash and
|
|
39
|
+
as a thin stdio MCP server over the same core.
|
|
40
|
+
|
|
41
|
+
## Install
|
|
42
|
+
|
|
43
|
+
Today, from git:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
uv tool install git+https://github.com/dmarlow-personal/agentless-mcp
|
|
47
|
+
agentless-mcp warmup
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Add the `mcp` extra for the stdio server
|
|
51
|
+
(`uv tool install "agentless-mcp[mcp] @ git+..."`). A PyPI release will follow;
|
|
52
|
+
until then the git URL is the install route.
|
|
53
|
+
|
|
54
|
+
## Status
|
|
55
|
+
|
|
56
|
+
Phases 1 through 6 are in. The CLI and the stdio MCP server are both live over
|
|
57
|
+
one set of application services: repository map, directory tree, skeleton,
|
|
58
|
+
slice, symbol lookup, symbol expansion, fan-in, location resolution, and the
|
|
59
|
+
resolved-graph views — `explain` (one symbol's tiered fan-in and fan-out),
|
|
60
|
+
`path` (shortest resolved path between two symbols) and `cycles` (module-level
|
|
61
|
+
import cycles). The write side — SEARCH/REPLACE patch parsing, syntax
|
|
62
|
+
checking, worktree-isolated apply, candidate validation and the
|
|
63
|
+
equivalence-clustered vote — is CLI-only and never exposed over MCP.
|
|
64
|
+
|
|
65
|
+
Reference resolution is deterministic and model-free: a name is bound to its
|
|
66
|
+
candidate definitions through the file's own imports and its own definitions,
|
|
67
|
+
and every edge carries the discrete evidence tier behind it (same-file,
|
|
68
|
+
resolved-via-import, unique, name-only-ambiguous). The graph is assembled in
|
|
69
|
+
memory on every call from the current tree — nothing about it is stored, and
|
|
70
|
+
there is no watcher.
|
|
71
|
+
|
|
72
|
+
Parsing happens on demand by default; `agentless-mcp index` builds a
|
|
73
|
+
per-repository SQLite cache under `$XDG_CACHE_HOME/agentless-mcp/` (never
|
|
74
|
+
inside the analyzed repository) holding symbols, imports and references for
|
|
75
|
+
files whose sha256 has not moved. Every answer's receipt names the cache
|
|
76
|
+
generation and whether it is still the repository's own, and `--no-cache` /
|
|
77
|
+
`no_cache: true` forces on-demand parsing.
|
|
78
|
+
|
|
79
|
+
A repository may declare its own defaults in an optional `.agentless-mcp.json`
|
|
80
|
+
at its root (map budget, max files, granularity, docstrings, stoplist
|
|
81
|
+
additions, and a `test_cmd` that only the CLI's `validate` will use, only when
|
|
82
|
+
the invocation named none of its own, and only after printing it). The file is
|
|
83
|
+
repository content: every value is schema-checked and bounded, no key is
|
|
84
|
+
path-typed, and unknown keys are warnings in the response envelope rather than
|
|
85
|
+
errors.
|
|
86
|
+
|
|
87
|
+
Start with [docs/agent-guide.md](docs/agent-guide.md): it is the usage guide
|
|
88
|
+
written for the agent that will call this.
|
|
89
|
+
|
|
90
|
+
## Development
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
uv sync --extra mcp
|
|
94
|
+
uv run agentless-mcp warmup
|
|
95
|
+
uv run pre-commit run --all-files
|
|
96
|
+
uv run pytest
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`uv run pre-commit run --all-files` is the gate — it is a strict superset of
|
|
100
|
+
running ruff by hand (it adds ruff-format, mypy strict, codespell,
|
|
101
|
+
import-linter and deptry).
|
|
102
|
+
|
|
103
|
+
## Windows support
|
|
104
|
+
|
|
105
|
+
Linux and macOS are the supported platforms: they are what the test suite runs
|
|
106
|
+
on, and every guarantee below is asserted there. Windows is **documented best
|
|
107
|
+
effort** — the POSIX-only calls have Windows paths, there is no Windows CI, and
|
|
108
|
+
nothing here has been executed on Windows.
|
|
109
|
+
|
|
110
|
+
Covered:
|
|
111
|
+
|
|
112
|
+
- The whole read surface. Map, tree, skeleton, slice, symbol lookup, fan-in and
|
|
113
|
+
location resolution are pure parsing and path arithmetic, and paths go
|
|
114
|
+
through `pathlib` with repository-relative results normalized to forward
|
|
115
|
+
slashes.
|
|
116
|
+
- The tag cache, including its single-writer discipline. The index lock is
|
|
117
|
+
`fcntl.flock` on POSIX and `msvcrt.locking` on Windows, selected in
|
|
118
|
+
`util/filelock.py`; both are non-blocking, so a second concurrent index run
|
|
119
|
+
is refused rather than queued on either platform.
|
|
120
|
+
- Patch parsing, syntax checking and the equivalence key.
|
|
121
|
+
|
|
122
|
+
Not covered, and the difference is real:
|
|
123
|
+
|
|
124
|
+
- **The timeout guarantee is weaker.** On POSIX a timed-out test command has
|
|
125
|
+
its whole process group killed (SIGTERM, then SIGKILL), so anything it
|
|
126
|
+
spawned dies with it. On Windows the child is created with
|
|
127
|
+
`CREATE_NEW_PROCESS_GROUP` and then `terminate()`/`kill()` is sent to the
|
|
128
|
+
leader only: **grandchildren can survive a timeout**. If your test command
|
|
129
|
+
starts a server, expect to clean it up yourself.
|
|
130
|
+
- **No Windows CI.** The platform dispatch is unit-tested on Linux; the
|
|
131
|
+
Windows system calls themselves are not exercised anywhere.
|
|
132
|
+
- Anything depending on `git worktree` behaves as the local git does; it has
|
|
133
|
+
not been exercised on Windows filesystems.
|
|
134
|
+
|
|
135
|
+
## Security
|
|
136
|
+
|
|
137
|
+
The tool's posture toward an analyzed repository is **read-only and
|
|
138
|
+
path-confined**: the MCP surface exposes read tools only, patch application and
|
|
139
|
+
test execution are CLI-side and default to an isolated git worktree, and no
|
|
140
|
+
cache or scratch state is written inside the repository under analysis.
|
|
141
|
+
|
|
142
|
+
One supply-chain caveat is worth stating up front. Grammars come from
|
|
143
|
+
`tree-sitter-language-pack`, which downloads a prebuilt platform bundle on first
|
|
144
|
+
use. Those bundles are SHA-256 verified against a release manifest, and a
|
|
145
|
+
mismatch is a hard failure — but the manifest itself (`parsers.json`) is
|
|
146
|
+
HTTPS-trusted rather than cryptographically signed. We accept that risk under
|
|
147
|
+
exact release-version pinning: `tree-sitter` and `tree-sitter-language-pack` are
|
|
148
|
+
pinned as a unit and move only through a reviewed bump. Fetching is confined to
|
|
149
|
+
an explicit warmup step, and both the manifest URL and the cache directory are
|
|
150
|
+
overridable for mirrored or air-gapped installs. See
|
|
151
|
+
[docs/supply-chain-audit.md](docs/supply-chain-audit.md) for the full audit.
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
MIT — see [LICENSE](LICENSE).
|
|
156
|
+
|
|
157
|
+
Parts of this package are derived from
|
|
158
|
+
[Agentless](https://github.com/OpenAutoCoder/Agentless) (MIT, Copyright (c)
|
|
159
|
+
2024 OpenAutoCoder): the line-slice primitives, the location grammar, the
|
|
160
|
+
SEARCH/REPLACE edit format and its parser, and the candidate filter ladder and
|
|
161
|
+
vote key. [NOTICE](NOTICE) names each file and reproduces the upstream
|
|
162
|
+
license.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# agentless-mcp
|
|
2
|
+
|
|
3
|
+
`agentless-mcp` is model-free structural machinery for coding agents: an
|
|
4
|
+
on-demand tree-sitter repo map at any zoom level (directory tree, skeleton,
|
|
5
|
+
line slice), symbol and reference lookup for bug localization, and
|
|
6
|
+
deterministic patch parsing, syntax-checking and candidate validation. It
|
|
7
|
+
never calls a language model — the calling agent supplies all the reasoning,
|
|
8
|
+
and this tool supplies the parsing, ranking, containment and verification it
|
|
9
|
+
would otherwise improvise. It ships as a CLI any agent can invoke over Bash and
|
|
10
|
+
as a thin stdio MCP server over the same core.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
Today, from git:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
uv tool install git+https://github.com/dmarlow-personal/agentless-mcp
|
|
18
|
+
agentless-mcp warmup
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Add the `mcp` extra for the stdio server
|
|
22
|
+
(`uv tool install "agentless-mcp[mcp] @ git+..."`). A PyPI release will follow;
|
|
23
|
+
until then the git URL is the install route.
|
|
24
|
+
|
|
25
|
+
## Status
|
|
26
|
+
|
|
27
|
+
Phases 1 through 6 are in. The CLI and the stdio MCP server are both live over
|
|
28
|
+
one set of application services: repository map, directory tree, skeleton,
|
|
29
|
+
slice, symbol lookup, symbol expansion, fan-in, location resolution, and the
|
|
30
|
+
resolved-graph views — `explain` (one symbol's tiered fan-in and fan-out),
|
|
31
|
+
`path` (shortest resolved path between two symbols) and `cycles` (module-level
|
|
32
|
+
import cycles). The write side — SEARCH/REPLACE patch parsing, syntax
|
|
33
|
+
checking, worktree-isolated apply, candidate validation and the
|
|
34
|
+
equivalence-clustered vote — is CLI-only and never exposed over MCP.
|
|
35
|
+
|
|
36
|
+
Reference resolution is deterministic and model-free: a name is bound to its
|
|
37
|
+
candidate definitions through the file's own imports and its own definitions,
|
|
38
|
+
and every edge carries the discrete evidence tier behind it (same-file,
|
|
39
|
+
resolved-via-import, unique, name-only-ambiguous). The graph is assembled in
|
|
40
|
+
memory on every call from the current tree — nothing about it is stored, and
|
|
41
|
+
there is no watcher.
|
|
42
|
+
|
|
43
|
+
Parsing happens on demand by default; `agentless-mcp index` builds a
|
|
44
|
+
per-repository SQLite cache under `$XDG_CACHE_HOME/agentless-mcp/` (never
|
|
45
|
+
inside the analyzed repository) holding symbols, imports and references for
|
|
46
|
+
files whose sha256 has not moved. Every answer's receipt names the cache
|
|
47
|
+
generation and whether it is still the repository's own, and `--no-cache` /
|
|
48
|
+
`no_cache: true` forces on-demand parsing.
|
|
49
|
+
|
|
50
|
+
A repository may declare its own defaults in an optional `.agentless-mcp.json`
|
|
51
|
+
at its root (map budget, max files, granularity, docstrings, stoplist
|
|
52
|
+
additions, and a `test_cmd` that only the CLI's `validate` will use, only when
|
|
53
|
+
the invocation named none of its own, and only after printing it). The file is
|
|
54
|
+
repository content: every value is schema-checked and bounded, no key is
|
|
55
|
+
path-typed, and unknown keys are warnings in the response envelope rather than
|
|
56
|
+
errors.
|
|
57
|
+
|
|
58
|
+
Start with [docs/agent-guide.md](docs/agent-guide.md): it is the usage guide
|
|
59
|
+
written for the agent that will call this.
|
|
60
|
+
|
|
61
|
+
## Development
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
uv sync --extra mcp
|
|
65
|
+
uv run agentless-mcp warmup
|
|
66
|
+
uv run pre-commit run --all-files
|
|
67
|
+
uv run pytest
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`uv run pre-commit run --all-files` is the gate — it is a strict superset of
|
|
71
|
+
running ruff by hand (it adds ruff-format, mypy strict, codespell,
|
|
72
|
+
import-linter and deptry).
|
|
73
|
+
|
|
74
|
+
## Windows support
|
|
75
|
+
|
|
76
|
+
Linux and macOS are the supported platforms: they are what the test suite runs
|
|
77
|
+
on, and every guarantee below is asserted there. Windows is **documented best
|
|
78
|
+
effort** — the POSIX-only calls have Windows paths, there is no Windows CI, and
|
|
79
|
+
nothing here has been executed on Windows.
|
|
80
|
+
|
|
81
|
+
Covered:
|
|
82
|
+
|
|
83
|
+
- The whole read surface. Map, tree, skeleton, slice, symbol lookup, fan-in and
|
|
84
|
+
location resolution are pure parsing and path arithmetic, and paths go
|
|
85
|
+
through `pathlib` with repository-relative results normalized to forward
|
|
86
|
+
slashes.
|
|
87
|
+
- The tag cache, including its single-writer discipline. The index lock is
|
|
88
|
+
`fcntl.flock` on POSIX and `msvcrt.locking` on Windows, selected in
|
|
89
|
+
`util/filelock.py`; both are non-blocking, so a second concurrent index run
|
|
90
|
+
is refused rather than queued on either platform.
|
|
91
|
+
- Patch parsing, syntax checking and the equivalence key.
|
|
92
|
+
|
|
93
|
+
Not covered, and the difference is real:
|
|
94
|
+
|
|
95
|
+
- **The timeout guarantee is weaker.** On POSIX a timed-out test command has
|
|
96
|
+
its whole process group killed (SIGTERM, then SIGKILL), so anything it
|
|
97
|
+
spawned dies with it. On Windows the child is created with
|
|
98
|
+
`CREATE_NEW_PROCESS_GROUP` and then `terminate()`/`kill()` is sent to the
|
|
99
|
+
leader only: **grandchildren can survive a timeout**. If your test command
|
|
100
|
+
starts a server, expect to clean it up yourself.
|
|
101
|
+
- **No Windows CI.** The platform dispatch is unit-tested on Linux; the
|
|
102
|
+
Windows system calls themselves are not exercised anywhere.
|
|
103
|
+
- Anything depending on `git worktree` behaves as the local git does; it has
|
|
104
|
+
not been exercised on Windows filesystems.
|
|
105
|
+
|
|
106
|
+
## Security
|
|
107
|
+
|
|
108
|
+
The tool's posture toward an analyzed repository is **read-only and
|
|
109
|
+
path-confined**: the MCP surface exposes read tools only, patch application and
|
|
110
|
+
test execution are CLI-side and default to an isolated git worktree, and no
|
|
111
|
+
cache or scratch state is written inside the repository under analysis.
|
|
112
|
+
|
|
113
|
+
One supply-chain caveat is worth stating up front. Grammars come from
|
|
114
|
+
`tree-sitter-language-pack`, which downloads a prebuilt platform bundle on first
|
|
115
|
+
use. Those bundles are SHA-256 verified against a release manifest, and a
|
|
116
|
+
mismatch is a hard failure — but the manifest itself (`parsers.json`) is
|
|
117
|
+
HTTPS-trusted rather than cryptographically signed. We accept that risk under
|
|
118
|
+
exact release-version pinning: `tree-sitter` and `tree-sitter-language-pack` are
|
|
119
|
+
pinned as a unit and move only through a reviewed bump. Fetching is confined to
|
|
120
|
+
an explicit warmup step, and both the manifest URL and the cache directory are
|
|
121
|
+
overridable for mirrored or air-gapped installs. See
|
|
122
|
+
[docs/supply-chain-audit.md](docs/supply-chain-audit.md) for the full audit.
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
MIT — see [LICENSE](LICENSE).
|
|
127
|
+
|
|
128
|
+
Parts of this package are derived from
|
|
129
|
+
[Agentless](https://github.com/OpenAutoCoder/Agentless) (MIT, Copyright (c)
|
|
130
|
+
2024 OpenAutoCoder): the line-slice primitives, the location grammar, the
|
|
131
|
+
SEARCH/REPLACE edit format and its parser, and the candidate filter ladder and
|
|
132
|
+
vote key. [NOTICE](NOTICE) names each file and reproduces the upstream
|
|
133
|
+
license.
|