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.
Files changed (77) hide show
  1. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/PKG-INFO +55 -8
  2. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/README.md +50 -6
  3. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/pyproject.toml +7 -2
  4. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/__init__.py +1 -1
  5. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/cli.py +20 -7
  6. devtime_ei-0.1.2/src/devtime/mcp/server.py +42 -0
  7. devtime_ei-0.1.2/src/devtime/mcp/transport.py +99 -0
  8. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/PKG-INFO +55 -8
  9. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/SOURCES.txt +1 -0
  10. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/requires.txt +4 -0
  11. devtime_ei-0.1.1/src/devtime/mcp/server.py +0 -35
  12. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/LICENSE +0 -0
  13. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/setup.cfg +0 -0
  14. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/__init__.py +0 -0
  15. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/local.py +0 -0
  16. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/prompts.py +0 -0
  17. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/ai/providers.py +0 -0
  18. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/assets/devtimeignore.starter +0 -0
  19. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/config.py +0 -0
  20. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/__init__.py +0 -0
  21. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/connection.py +0 -0
  22. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/migrations.py +0 -0
  23. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/repository.py +0 -0
  24. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/db/schema.sql +0 -0
  25. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/demo.py +0 -0
  26. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/__init__.py +0 -0
  27. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/assertions.py +0 -0
  28. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/loader.py +0 -0
  29. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/fixtures/runner.py +0 -0
  30. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/__init__.py +0 -0
  31. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/claims.py +0 -0
  32. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/concepts.py +0 -0
  33. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/context_pack.py +0 -0
  34. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/evidence.py +0 -0
  35. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/lineage.py +0 -0
  36. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/risk.py +0 -0
  37. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/intelligence/scoring.py +0 -0
  38. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/mcp/__init__.py +0 -0
  39. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/mcp/schemas.py +0 -0
  40. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/mcp/tools.py +0 -0
  41. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/__init__.py +0 -0
  42. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/json_export.py +0 -0
  43. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/markdown.py +0 -0
  44. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/output/terminal.py +0 -0
  45. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/paths.py +0 -0
  46. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/privacy.py +0 -0
  47. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/.devtimeignore +0 -0
  48. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/README.md +0 -0
  49. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/docs/decisions/0001-use-jwt.md +0 -0
  50. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/package.json +0 -0
  51. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/admin/permissions.ts +0 -0
  52. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/login.ts +0 -0
  53. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/middleware.ts +0 -0
  54. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/auth/tokens.ts +0 -0
  55. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/billing/stripe-webhook.ts +0 -0
  56. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/billing/subscription-service.ts +0 -0
  57. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/export/export-csv.ts +0 -0
  58. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/jobs/email-worker.ts +0 -0
  59. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/src/jobs/queues.ts +0 -0
  60. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/tests/auth-login.test.ts +0 -0
  61. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/resources/demo-saas/tests/stripe-signature.test.ts +0 -0
  62. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/__init__.py +0 -0
  63. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/__init__.py +0 -0
  64. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/base.py +0 -0
  65. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/config_files.py +0 -0
  66. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/docs.py +0 -0
  67. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/nextjs.py +0 -0
  68. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/python.py +0 -0
  69. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/tests.py +0 -0
  70. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/extractors/typescript.py +0 -0
  71. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/file_walker.py +0 -0
  72. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/ignore.py +0 -0
  73. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/language.py +0 -0
  74. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime/scanner/signals.py +0 -0
  75. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/dependency_links.txt +0 -0
  76. {devtime_ei-0.1.1 → devtime_ei-0.1.2}/src/devtime_ei.egg-info/entry_points.txt +0 -0
  77. {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.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.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
- [![DevTime demo - Repository memory from evidence](assets/devtime-demo-thumbnail-v0.1.0.png)](https://youtu.be/1Hiu3Y9J_SI)
52
+ ![DevTime terminal demo - install, scan, and explain a repo from evidence](assets/devtime-terminal-demo.svg)
50
53
 
51
- Watch the 2-minute demo: DevTime scans a repo locally, explains concepts from
52
- evidence, surfaces uncertainty, catches a risky diff, and shows how a corroborated
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, wired MCP transport, an AI
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
- [![DevTime demo - Repository memory from evidence](assets/devtime-demo-thumbnail-v0.1.0.png)](https://youtu.be/1Hiu3Y9J_SI)
13
+ ![DevTime terminal demo - install, scan, and explain a repo from evidence](assets/devtime-terminal-demo.svg)
14
14
 
15
- Watch the 2-minute demo: DevTime scans a repo locally, explains concepts from
16
- evidence, surfaces uncertainty, catches a risky diff, and shows how a corroborated
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, wired MCP transport, an AI
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.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.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]
@@ -1,6 +1,6 @@
1
1
  """DevTime - local-first Engineering Intelligence for repository memory."""
2
2
 
3
- __version__ = "0.1.1"
3
+ __version__ = "0.1.2"
4
4
 
5
5
  # Version metadata (Builder Edition, Chapter 20).
6
6
  EVIDENCE_MODEL = "2026.06.1"
@@ -341,20 +341,33 @@ def decision_add(
341
341
 
342
342
  @mcp_app.command("start")
343
343
  def mcp_start() -> None:
344
- """Preview planned read-only MCP tools. Does NOT start a server in V0."""
345
- from devtime.mcp.server import describe_server
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
- console.print(describe_server())
348
- # Honest exit: nothing was started, so a command named "start" returns nonzero.
349
- raise typer.Exit(code=1)
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
- """Preview planned read-only MCP tools (transport not implemented in V0)."""
366
+ """Show implemented and planned read-only MCP tools."""
355
367
  from devtime.mcp.server import describe_server
356
368
 
357
- console.print(describe_server())
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.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.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
- [![DevTime demo - Repository memory from evidence](assets/devtime-demo-thumbnail-v0.1.0.png)](https://youtu.be/1Hiu3Y9J_SI)
52
+ ![DevTime terminal demo - install, scan, and explain a repo from evidence](assets/devtime-terminal-demo.svg)
50
53
 
51
- Watch the 2-minute demo: DevTime scans a repo locally, explains concepts from
52
- evidence, surfaces uncertainty, catches a risky diff, and shows how a corroborated
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, wired MCP transport, an AI
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
@@ -33,6 +33,7 @@ src/devtime/mcp/__init__.py
33
33
  src/devtime/mcp/schemas.py
34
34
  src/devtime/mcp/server.py
35
35
  src/devtime/mcp/tools.py
36
+ src/devtime/mcp/transport.py
36
37
  src/devtime/output/__init__.py
37
38
  src/devtime/output/json_export.py
38
39
  src/devtime/output/markdown.py
@@ -7,3 +7,7 @@ pathspec>=0.12
7
7
 
8
8
  [dev]
9
9
  pytest>=8.0
10
+ mcp>=1.2
11
+
12
+ [mcp]
13
+ mcp>=1.2
@@ -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