devtime-ei 0.1.1__tar.gz → 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/PKG-INFO +55 -8
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/README.md +50 -6
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/pyproject.toml +7 -2
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/__init__.py +1 -1
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/cli.py +20 -7
- devtime_ei-0.1.2/src/devtime/mcp/server.py +42 -0
- devtime_ei-0.1.2/src/devtime/mcp/transport.py +99 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/PKG-INFO +55 -8
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/SOURCES.txt +1 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/requires.txt +4 -0
- devtime_ei-0.1.1/src/devtime/mcp/server.py +0 -35
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/LICENSE +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/setup.cfg +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/local.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/prompts.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/providers.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/assets/devtimeignore.starter +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/config.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/connection.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/migrations.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/repository.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/schema.sql +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/demo.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/assertions.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/loader.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/runner.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/claims.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/concepts.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/context_pack.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/evidence.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/lineage.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/risk.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/scoring.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/mcp/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/mcp/schemas.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/mcp/tools.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/json_export.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/markdown.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/terminal.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/paths.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/privacy.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/.devtimeignore +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/README.md +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/docs/decisions/0001-use-jwt.md +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/package.json +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/admin/permissions.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/login.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/middleware.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/tokens.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/billing/stripe-webhook.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/billing/subscription-service.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/export/export-csv.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/jobs/email-worker.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/jobs/queues.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/tests/auth-login.test.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/tests/stripe-signature.test.ts +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/__init__.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/base.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/config_files.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/docs.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/nextjs.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/python.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/tests.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/typescript.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/file_walker.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/ignore.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/language.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/signals.py +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/dependency_links.txt +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/entry_points.txt +0 -0
- {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devtime-ei
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Local-first Engineering Intelligence for software repositories
|
|
5
5
|
Author-email: Aviad Shakargi <aviad94@gmail.com>
|
|
6
6
|
Maintainer-email: Aviad Shakargi <aviad94@gmail.com>
|
|
@@ -8,7 +8,7 @@ License: Apache-2.0
|
|
|
8
8
|
Project-URL: Homepage, https://github.com/Shakargy/devtime
|
|
9
9
|
Project-URL: Repository, https://github.com/Shakargy/devtime
|
|
10
10
|
Project-URL: Issues, https://github.com/Shakargy/devtime/issues
|
|
11
|
-
Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.
|
|
11
|
+
Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.2
|
|
12
12
|
Project-URL: Demo, https://youtu.be/1Hiu3Y9J_SI
|
|
13
13
|
Keywords: devtools,cli,static-analysis,repository-analysis,engineering-intelligence,local-first
|
|
14
14
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -30,8 +30,11 @@ Requires-Dist: pydantic>=2.7
|
|
|
30
30
|
Requires-Dist: sqlalchemy>=2.0
|
|
31
31
|
Requires-Dist: pyyaml>=6.0
|
|
32
32
|
Requires-Dist: pathspec>=0.12
|
|
33
|
+
Provides-Extra: mcp
|
|
34
|
+
Requires-Dist: mcp>=1.2; extra == "mcp"
|
|
33
35
|
Provides-Extra: dev
|
|
34
36
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
37
|
+
Requires-Dist: mcp>=1.2; extra == "dev"
|
|
35
38
|
Dynamic: license-file
|
|
36
39
|
|
|
37
40
|
# DevTime
|
|
@@ -46,11 +49,11 @@ risky changes.
|
|
|
46
49
|
|
|
47
50
|
> No cloud. No telemetry. No code execution. No AI required.
|
|
48
51
|
|
|
49
|
-
|
|
52
|
+

|
|
50
53
|
|
|
51
|
-
Watch the 2-minute demo: DevTime scans
|
|
52
|
-
|
|
53
|
-
decision improves understanding.
|
|
54
|
+
Prefer video? [Watch the 2-minute demo](https://youtu.be/1Hiu3Y9J_SI): DevTime scans
|
|
55
|
+
a repo locally, explains concepts from evidence, surfaces uncertainty, catches a
|
|
56
|
+
risky diff, and shows how a corroborated decision improves understanding.
|
|
54
57
|
|
|
55
58
|
---
|
|
56
59
|
|
|
@@ -203,11 +206,55 @@ Anything outside these six is out of scope for V0. See [LIMITATIONS.md](LIMITATI
|
|
|
203
206
|
| `dtc decision add` | Add a local decision record that can reduce uncertainty. |
|
|
204
207
|
|
|
205
208
|
(Also available: `dtc evidence`, `dtc debt`, `dtc status`, `dtc doctor --privacy`,
|
|
206
|
-
`dtc export`, `dtc reset`.)
|
|
209
|
+
`dtc export`, `dtc reset`, `dtc mcp start`.)
|
|
207
210
|
|
|
208
211
|
Requires **Python >= 3.11** and git. See **[QUICKSTART.md](QUICKSTART.md)** for a
|
|
209
212
|
step-by-step first run and troubleshooting.
|
|
210
213
|
|
|
214
|
+
## Use with coding agents (MCP)
|
|
215
|
+
|
|
216
|
+
Your coding agent starts every session amnesiac about your repository and then
|
|
217
|
+
guesses, confidently. DevTime gives it memory it can trust: a local, read-only MCP
|
|
218
|
+
server that answers only with claims the repository can prove, plus explicit
|
|
219
|
+
uncertainty for what it cannot.
|
|
220
|
+
|
|
221
|
+
Install with MCP support and scan your repo:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
pipx install "devtime-ei[mcp]"
|
|
225
|
+
cd your-repo
|
|
226
|
+
dtc init
|
|
227
|
+
dtc scan
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Add DevTime to Claude Code:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
claude mcp add devtime -- dtc mcp start
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Or in any MCP client that reads `.mcp.json`:
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"mcpServers": {
|
|
241
|
+
"devtime": {
|
|
242
|
+
"command": "dtc",
|
|
243
|
+
"args": ["mcp", "start"]
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
The agent gets three read-only tools: `list_concepts`, `explain_concept`, and
|
|
250
|
+
`get_context_pack` (governed context with do-not-change-without-review paths, tests
|
|
251
|
+
to run, and agent guidance). Local stdio only - no network listener, no write tools,
|
|
252
|
+
no source code returned, only evidence file paths.
|
|
253
|
+
|
|
254
|
+
DevTime is listed in the official MCP Registry as `io.github.shakargy/devtime`.
|
|
255
|
+
|
|
256
|
+
<!-- mcp-name: io.github.shakargy/devtime -->
|
|
257
|
+
|
|
211
258
|
## Installation
|
|
212
259
|
|
|
213
260
|
Recommended: install from PyPI with [pipx](https://pipx.pypa.io/) so the `dtc`
|
|
@@ -310,7 +357,7 @@ intentionally not built yet - in **[LIMITATIONS.md](LIMITATIONS.md)**.
|
|
|
310
357
|
## Roadmap
|
|
311
358
|
|
|
312
359
|
This is an early, local-first V0 focused on being trustworthy before being large.
|
|
313
|
-
Not yet built (intentionally): git-history signals,
|
|
360
|
+
Not yet built (intentionally): git-history signals, write-enabled MCP tools, an AI
|
|
314
361
|
provider, a UI, and any cloud/team/enterprise features. See **[ROADMAP.md](ROADMAP.md)**.
|
|
315
362
|
|
|
316
363
|
## Contributing
|
|
@@ -10,11 +10,11 @@ risky changes.
|
|
|
10
10
|
|
|
11
11
|
> No cloud. No telemetry. No code execution. No AI required.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+

|
|
14
14
|
|
|
15
|
-
Watch the 2-minute demo: DevTime scans
|
|
16
|
-
|
|
17
|
-
decision improves understanding.
|
|
15
|
+
Prefer video? [Watch the 2-minute demo](https://youtu.be/1Hiu3Y9J_SI): DevTime scans
|
|
16
|
+
a repo locally, explains concepts from evidence, surfaces uncertainty, catches a
|
|
17
|
+
risky diff, and shows how a corroborated decision improves understanding.
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
@@ -167,11 +167,55 @@ Anything outside these six is out of scope for V0. See [LIMITATIONS.md](LIMITATI
|
|
|
167
167
|
| `dtc decision add` | Add a local decision record that can reduce uncertainty. |
|
|
168
168
|
|
|
169
169
|
(Also available: `dtc evidence`, `dtc debt`, `dtc status`, `dtc doctor --privacy`,
|
|
170
|
-
`dtc export`, `dtc reset`.)
|
|
170
|
+
`dtc export`, `dtc reset`, `dtc mcp start`.)
|
|
171
171
|
|
|
172
172
|
Requires **Python >= 3.11** and git. See **[QUICKSTART.md](QUICKSTART.md)** for a
|
|
173
173
|
step-by-step first run and troubleshooting.
|
|
174
174
|
|
|
175
|
+
## Use with coding agents (MCP)
|
|
176
|
+
|
|
177
|
+
Your coding agent starts every session amnesiac about your repository and then
|
|
178
|
+
guesses, confidently. DevTime gives it memory it can trust: a local, read-only MCP
|
|
179
|
+
server that answers only with claims the repository can prove, plus explicit
|
|
180
|
+
uncertainty for what it cannot.
|
|
181
|
+
|
|
182
|
+
Install with MCP support and scan your repo:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
pipx install "devtime-ei[mcp]"
|
|
186
|
+
cd your-repo
|
|
187
|
+
dtc init
|
|
188
|
+
dtc scan
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Add DevTime to Claude Code:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
claude mcp add devtime -- dtc mcp start
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Or in any MCP client that reads `.mcp.json`:
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"mcpServers": {
|
|
202
|
+
"devtime": {
|
|
203
|
+
"command": "dtc",
|
|
204
|
+
"args": ["mcp", "start"]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
The agent gets three read-only tools: `list_concepts`, `explain_concept`, and
|
|
211
|
+
`get_context_pack` (governed context with do-not-change-without-review paths, tests
|
|
212
|
+
to run, and agent guidance). Local stdio only - no network listener, no write tools,
|
|
213
|
+
no source code returned, only evidence file paths.
|
|
214
|
+
|
|
215
|
+
DevTime is listed in the official MCP Registry as `io.github.shakargy/devtime`.
|
|
216
|
+
|
|
217
|
+
<!-- mcp-name: io.github.shakargy/devtime -->
|
|
218
|
+
|
|
175
219
|
## Installation
|
|
176
220
|
|
|
177
221
|
Recommended: install from PyPI with [pipx](https://pipx.pypa.io/) so the `dtc`
|
|
@@ -274,7 +318,7 @@ intentionally not built yet - in **[LIMITATIONS.md](LIMITATIONS.md)**.
|
|
|
274
318
|
## Roadmap
|
|
275
319
|
|
|
276
320
|
This is an early, local-first V0 focused on being trustworthy before being large.
|
|
277
|
-
Not yet built (intentionally): git-history signals,
|
|
321
|
+
Not yet built (intentionally): git-history signals, write-enabled MCP tools, an AI
|
|
278
322
|
provider, a UI, and any cloud/team/enterprise features. See **[ROADMAP.md](ROADMAP.md)**.
|
|
279
323
|
|
|
280
324
|
## Contributing
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "devtime-ei"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.2"
|
|
4
4
|
description = "Local-first Engineering Intelligence for software repositories"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -37,15 +37,20 @@ dependencies = [
|
|
|
37
37
|
]
|
|
38
38
|
|
|
39
39
|
[project.optional-dependencies]
|
|
40
|
+
# Read-only MCP stdio server for coding agents (dtc mcp start).
|
|
41
|
+
mcp = [
|
|
42
|
+
"mcp>=1.2",
|
|
43
|
+
]
|
|
40
44
|
dev = [
|
|
41
45
|
"pytest>=8.0",
|
|
46
|
+
"mcp>=1.2",
|
|
42
47
|
]
|
|
43
48
|
|
|
44
49
|
[project.urls]
|
|
45
50
|
Homepage = "https://github.com/Shakargy/devtime"
|
|
46
51
|
Repository = "https://github.com/Shakargy/devtime"
|
|
47
52
|
Issues = "https://github.com/Shakargy/devtime/issues"
|
|
48
|
-
"Release Notes" = "https://github.com/Shakargy/devtime/releases/tag/v0.1.
|
|
53
|
+
"Release Notes" = "https://github.com/Shakargy/devtime/releases/tag/v0.1.2"
|
|
49
54
|
Demo = "https://youtu.be/1Hiu3Y9J_SI"
|
|
50
55
|
|
|
51
56
|
[project.scripts]
|
|
@@ -341,20 +341,33 @@ def decision_add(
|
|
|
341
341
|
|
|
342
342
|
@mcp_app.command("start")
|
|
343
343
|
def mcp_start() -> None:
|
|
344
|
-
"""
|
|
345
|
-
|
|
344
|
+
"""Start the local read-only MCP server over stdio (for coding agents)."""
|
|
345
|
+
# stdout belongs to the JSON-RPC stream: all diagnostics go to stderr.
|
|
346
|
+
err = Console(stderr=True)
|
|
347
|
+
|
|
348
|
+
if not paths.is_initialized():
|
|
349
|
+
err.print("[red]DevTime is not initialized here.[/red]")
|
|
350
|
+
err.print("Run [bold]dtc init[/bold] and [bold]dtc scan[/bold] in the repository first.")
|
|
351
|
+
raise typer.Exit(code=2)
|
|
346
352
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
353
|
+
from devtime.mcp.transport import McpDependencyMissing, run_stdio
|
|
354
|
+
|
|
355
|
+
err.print("DevTime MCP server: stdio, read-only, local only. Ctrl+C to stop.")
|
|
356
|
+
try:
|
|
357
|
+
run_stdio()
|
|
358
|
+
except McpDependencyMissing as exc:
|
|
359
|
+
# markup=False: the hint contains [mcp], which rich would eat as a tag.
|
|
360
|
+
err.print(str(exc), markup=False, style="red")
|
|
361
|
+
raise typer.Exit(code=1)
|
|
350
362
|
|
|
351
363
|
|
|
352
364
|
@mcp_app.command("preview")
|
|
353
365
|
def mcp_preview() -> None:
|
|
354
|
-
"""
|
|
366
|
+
"""Show implemented and planned read-only MCP tools."""
|
|
355
367
|
from devtime.mcp.server import describe_server
|
|
356
368
|
|
|
357
|
-
|
|
369
|
+
# markup=False: the text contains [mcp], which rich would eat as a tag.
|
|
370
|
+
console.print(describe_server(), markup=False)
|
|
358
371
|
|
|
359
372
|
|
|
360
373
|
@mcp_app.command("status")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""MCP server description (Builder Edition, Chapter 16).
|
|
2
|
+
|
|
3
|
+
v0.1.2: the stdio transport is implemented for the read-only tool subset in
|
|
4
|
+
devtime.mcp.transport. The remaining planned tools stay listed as planned so
|
|
5
|
+
the preview output never overclaims.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
|
|
12
|
+
from devtime.mcp import schemas
|
|
13
|
+
from devtime.mcp.transport import IMPLEMENTED_TOOLS
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def describe_server() -> str:
|
|
17
|
+
"""Honest preview: implemented tools are separated from planned ones."""
|
|
18
|
+
planned_read = [t for t in schemas.TOOLS["read"] if t not in IMPLEMENTED_TOOLS]
|
|
19
|
+
planned_context = [t for t in schemas.TOOLS["context"] if t not in IMPLEMENTED_TOOLS]
|
|
20
|
+
lines = [
|
|
21
|
+
"MCP transport: stdio, read-only, local only.",
|
|
22
|
+
'Requires the optional dependency: pip install "devtime-ei[mcp]"',
|
|
23
|
+
"Start with: dtc mcp start (stdout is the protocol stream).",
|
|
24
|
+
"",
|
|
25
|
+
"Implemented tools:",
|
|
26
|
+
]
|
|
27
|
+
lines += [f" - {t}" for t in IMPLEMENTED_TOOLS]
|
|
28
|
+
lines += ["Planned read tools (not implemented yet):"]
|
|
29
|
+
lines += [f" - {t}" for t in planned_read]
|
|
30
|
+
lines += ["Planned context tools (not implemented yet):"]
|
|
31
|
+
lines += [f" - {t}" for t in planned_context]
|
|
32
|
+
lines += ["Planned review tools (not implemented yet):"]
|
|
33
|
+
lines += [f" - {t}" for t in schemas.TOOLS["review"]]
|
|
34
|
+
lines += [
|
|
35
|
+
"",
|
|
36
|
+
"Write tools are not exposed. No network listener. No source code is returned.",
|
|
37
|
+
]
|
|
38
|
+
return "\n".join(lines)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def describe_permissions() -> str:
|
|
42
|
+
return json.dumps(schemas.DEFAULT_PERMISSIONS, indent=2)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Read-only MCP stdio transport (v0.1.2).
|
|
2
|
+
|
|
3
|
+
Wires the three implemented read tools to a real MCP server over stdio so
|
|
4
|
+
coding agents (Claude Code, Cursor, and other MCP clients) can query local
|
|
5
|
+
DevTime memory.
|
|
6
|
+
|
|
7
|
+
Trust model, unchanged:
|
|
8
|
+
- read-only: no write tools are exposed
|
|
9
|
+
- local only: stdio transport, no network listener
|
|
10
|
+
- no source code is returned, only claims, evidence paths, and uncertainty
|
|
11
|
+
- requires the optional dependency: pip install "devtime-ei[mcp]"
|
|
12
|
+
|
|
13
|
+
IMPORTANT: stdout belongs to the JSON-RPC stream. Nothing here may print to
|
|
14
|
+
stdout; diagnostics go to stderr.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from devtime import paths
|
|
20
|
+
from devtime.mcp import tools
|
|
21
|
+
|
|
22
|
+
SERVER_NAME = "devtime"
|
|
23
|
+
|
|
24
|
+
SERVER_INSTRUCTIONS = (
|
|
25
|
+
"DevTime is local, evidence-backed repository memory. "
|
|
26
|
+
"Every claim links to evidence files; weak evidence is reported as "
|
|
27
|
+
"uncertainty, not confidence. Use list_concepts to discover what the "
|
|
28
|
+
"scanned repository supports, explain_concept for claims and evidence "
|
|
29
|
+
"behind one concept, and get_context_pack for a governed context bundle "
|
|
30
|
+
"before changing code related to a concept. If results are empty, the "
|
|
31
|
+
"repository has not been scanned: run `dtc init` and `dtc scan` there first."
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# The subset of the planned tool surface that is implemented and exposed.
|
|
35
|
+
IMPLEMENTED_TOOLS = ("list_concepts", "explain_concept", "get_context_pack")
|
|
36
|
+
|
|
37
|
+
_NOT_INITIALIZED = {
|
|
38
|
+
"error": "not_initialized",
|
|
39
|
+
"hint": "No .devtime memory found in the current directory. "
|
|
40
|
+
"Run `dtc init` then `dtc scan` in the repository first.",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class McpDependencyMissing(RuntimeError):
|
|
45
|
+
"""Raised when the optional MCP SDK is not installed."""
|
|
46
|
+
|
|
47
|
+
INSTALL_HINT = 'MCP support needs the optional dependency: pip install "devtime-ei[mcp]"'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def build_server():
|
|
51
|
+
"""Build the FastMCP server with the read-only tool surface registered."""
|
|
52
|
+
try:
|
|
53
|
+
from mcp.server.fastmcp import FastMCP
|
|
54
|
+
except ImportError as exc: # pragma: no cover - exercised via CLI test
|
|
55
|
+
raise McpDependencyMissing(McpDependencyMissing.INSTALL_HINT) from exc
|
|
56
|
+
|
|
57
|
+
server = FastMCP(SERVER_NAME, instructions=SERVER_INSTRUCTIONS)
|
|
58
|
+
|
|
59
|
+
@server.tool()
|
|
60
|
+
def list_concepts(limit: int = 50) -> list[dict] | dict:
|
|
61
|
+
"""List concepts detected in the scanned repository with confidence labels.
|
|
62
|
+
|
|
63
|
+
Start here to discover what the repository memory contains. Returns
|
|
64
|
+
concept names, slugs, and confidence labels. No source code.
|
|
65
|
+
"""
|
|
66
|
+
if not paths.is_initialized():
|
|
67
|
+
return _NOT_INITIALIZED
|
|
68
|
+
return tools.list_concepts(limit=limit)
|
|
69
|
+
|
|
70
|
+
@server.tool()
|
|
71
|
+
def explain_concept(concept: str) -> dict:
|
|
72
|
+
"""Explain one concept from evidence: claims, evidence file paths, uncertainty, and Understanding Score.
|
|
73
|
+
|
|
74
|
+
Claims are evidence-linked; uncertainty lists what the repository
|
|
75
|
+
cannot prove yet. human_review_required is true when uncertainty
|
|
76
|
+
exists. No source code is returned, only file paths.
|
|
77
|
+
"""
|
|
78
|
+
if not paths.is_initialized():
|
|
79
|
+
return _NOT_INITIALIZED
|
|
80
|
+
return tools.explain_concept(concept)
|
|
81
|
+
|
|
82
|
+
@server.tool()
|
|
83
|
+
def get_context_pack(concept: str, mode: str = "risk") -> dict:
|
|
84
|
+
"""Get a governed context pack for a concept before changing related code.
|
|
85
|
+
|
|
86
|
+
Includes supported claims, corroborated decisions, uncertainty,
|
|
87
|
+
do-not-change-without-review paths, tests to run, and agent guidance.
|
|
88
|
+
Modes: risk (default), onboarding.
|
|
89
|
+
"""
|
|
90
|
+
if not paths.is_initialized():
|
|
91
|
+
return _NOT_INITIALIZED
|
|
92
|
+
return tools.get_context_pack(concept, mode=mode)
|
|
93
|
+
|
|
94
|
+
return server
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def run_stdio() -> None:
|
|
98
|
+
"""Run the read-only MCP server over stdio (blocks until the client disconnects)."""
|
|
99
|
+
build_server().run()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devtime-ei
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Local-first Engineering Intelligence for software repositories
|
|
5
5
|
Author-email: Aviad Shakargi <aviad94@gmail.com>
|
|
6
6
|
Maintainer-email: Aviad Shakargi <aviad94@gmail.com>
|
|
@@ -8,7 +8,7 @@ License: Apache-2.0
|
|
|
8
8
|
Project-URL: Homepage, https://github.com/Shakargy/devtime
|
|
9
9
|
Project-URL: Repository, https://github.com/Shakargy/devtime
|
|
10
10
|
Project-URL: Issues, https://github.com/Shakargy/devtime/issues
|
|
11
|
-
Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.
|
|
11
|
+
Project-URL: Release Notes, https://github.com/Shakargy/devtime/releases/tag/v0.1.2
|
|
12
12
|
Project-URL: Demo, https://youtu.be/1Hiu3Y9J_SI
|
|
13
13
|
Keywords: devtools,cli,static-analysis,repository-analysis,engineering-intelligence,local-first
|
|
14
14
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -30,8 +30,11 @@ Requires-Dist: pydantic>=2.7
|
|
|
30
30
|
Requires-Dist: sqlalchemy>=2.0
|
|
31
31
|
Requires-Dist: pyyaml>=6.0
|
|
32
32
|
Requires-Dist: pathspec>=0.12
|
|
33
|
+
Provides-Extra: mcp
|
|
34
|
+
Requires-Dist: mcp>=1.2; extra == "mcp"
|
|
33
35
|
Provides-Extra: dev
|
|
34
36
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
37
|
+
Requires-Dist: mcp>=1.2; extra == "dev"
|
|
35
38
|
Dynamic: license-file
|
|
36
39
|
|
|
37
40
|
# DevTime
|
|
@@ -46,11 +49,11 @@ risky changes.
|
|
|
46
49
|
|
|
47
50
|
> No cloud. No telemetry. No code execution. No AI required.
|
|
48
51
|
|
|
49
|
-
|
|
52
|
+

|
|
50
53
|
|
|
51
|
-
Watch the 2-minute demo: DevTime scans
|
|
52
|
-
|
|
53
|
-
decision improves understanding.
|
|
54
|
+
Prefer video? [Watch the 2-minute demo](https://youtu.be/1Hiu3Y9J_SI): DevTime scans
|
|
55
|
+
a repo locally, explains concepts from evidence, surfaces uncertainty, catches a
|
|
56
|
+
risky diff, and shows how a corroborated decision improves understanding.
|
|
54
57
|
|
|
55
58
|
---
|
|
56
59
|
|
|
@@ -203,11 +206,55 @@ Anything outside these six is out of scope for V0. See [LIMITATIONS.md](LIMITATI
|
|
|
203
206
|
| `dtc decision add` | Add a local decision record that can reduce uncertainty. |
|
|
204
207
|
|
|
205
208
|
(Also available: `dtc evidence`, `dtc debt`, `dtc status`, `dtc doctor --privacy`,
|
|
206
|
-
`dtc export`, `dtc reset`.)
|
|
209
|
+
`dtc export`, `dtc reset`, `dtc mcp start`.)
|
|
207
210
|
|
|
208
211
|
Requires **Python >= 3.11** and git. See **[QUICKSTART.md](QUICKSTART.md)** for a
|
|
209
212
|
step-by-step first run and troubleshooting.
|
|
210
213
|
|
|
214
|
+
## Use with coding agents (MCP)
|
|
215
|
+
|
|
216
|
+
Your coding agent starts every session amnesiac about your repository and then
|
|
217
|
+
guesses, confidently. DevTime gives it memory it can trust: a local, read-only MCP
|
|
218
|
+
server that answers only with claims the repository can prove, plus explicit
|
|
219
|
+
uncertainty for what it cannot.
|
|
220
|
+
|
|
221
|
+
Install with MCP support and scan your repo:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
pipx install "devtime-ei[mcp]"
|
|
225
|
+
cd your-repo
|
|
226
|
+
dtc init
|
|
227
|
+
dtc scan
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Add DevTime to Claude Code:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
claude mcp add devtime -- dtc mcp start
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Or in any MCP client that reads `.mcp.json`:
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"mcpServers": {
|
|
241
|
+
"devtime": {
|
|
242
|
+
"command": "dtc",
|
|
243
|
+
"args": ["mcp", "start"]
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
The agent gets three read-only tools: `list_concepts`, `explain_concept`, and
|
|
250
|
+
`get_context_pack` (governed context with do-not-change-without-review paths, tests
|
|
251
|
+
to run, and agent guidance). Local stdio only - no network listener, no write tools,
|
|
252
|
+
no source code returned, only evidence file paths.
|
|
253
|
+
|
|
254
|
+
DevTime is listed in the official MCP Registry as `io.github.shakargy/devtime`.
|
|
255
|
+
|
|
256
|
+
<!-- mcp-name: io.github.shakargy/devtime -->
|
|
257
|
+
|
|
211
258
|
## Installation
|
|
212
259
|
|
|
213
260
|
Recommended: install from PyPI with [pipx](https://pipx.pypa.io/) so the `dtc`
|
|
@@ -310,7 +357,7 @@ intentionally not built yet - in **[LIMITATIONS.md](LIMITATIONS.md)**.
|
|
|
310
357
|
## Roadmap
|
|
311
358
|
|
|
312
359
|
This is an early, local-first V0 focused on being trustworthy before being large.
|
|
313
|
-
Not yet built (intentionally): git-history signals,
|
|
360
|
+
Not yet built (intentionally): git-history signals, write-enabled MCP tools, an AI
|
|
314
361
|
provider, a UI, and any cloud/team/enterprise features. See **[ROADMAP.md](ROADMAP.md)**.
|
|
315
362
|
|
|
316
363
|
## Contributing
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"""MCP server description (Builder Edition, Chapter 16).
|
|
2
|
-
|
|
3
|
-
V0 ships the tool surface, schemas, and permission model. The actual transport
|
|
4
|
-
(stdio/socket via an MCP SDK) is wired in a later milestone; this module makes
|
|
5
|
-
the read-only contract inspectable today.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import json
|
|
11
|
-
|
|
12
|
-
from devtime.intelligence.context_pack import generate_context_pack # noqa: F401
|
|
13
|
-
from devtime.mcp import schemas
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def describe_server() -> str:
|
|
17
|
-
"""Honest preview output (Trust Repair v0.0.6): no server is started, and no
|
|
18
|
-
bind address is shown, because the MCP transport is not implemented in V0."""
|
|
19
|
-
lines = [
|
|
20
|
-
"MCP transport is not implemented in V0.",
|
|
21
|
-
"No server was started.",
|
|
22
|
-
"This command is a preview of planned read-only MCP tools.",
|
|
23
|
-
"",
|
|
24
|
-
"Planned read tools:",
|
|
25
|
-
]
|
|
26
|
-
lines += [f" - {t}" for t in schemas.TOOLS["read"]]
|
|
27
|
-
lines += ["Planned context tools:"]
|
|
28
|
-
lines += [f" - {t}" for t in schemas.TOOLS["context"]]
|
|
29
|
-
lines += ["Planned review tools:"]
|
|
30
|
-
lines += [f" - {t}" for t in schemas.TOOLS["review"]]
|
|
31
|
-
return "\n".join(lines)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def describe_permissions() -> str:
|
|
35
|
-
return json.dumps(schemas.DEFAULT_PERMISSIONS, indent=2)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/docs/decisions/0001-use-jwt.md
RENAMED
|
File without changes
|
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/admin/permissions.ts
RENAMED
|
File without changes
|
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/middleware.ts
RENAMED
|
File without changes
|
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/billing/stripe-webhook.ts
RENAMED
|
File without changes
|
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/export/export-csv.ts
RENAMED
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/jobs/email-worker.ts
RENAMED
|
File without changes
|
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/tests/auth-login.test.ts
RENAMED
|
File without changes
|
{devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/tests/stripe-signature.test.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|