dctracker 1.3.0__tar.gz → 1.4.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.
- {dctracker-1.3.0/dctracker.egg-info → dctracker-1.4.0}/PKG-INFO +7 -7
- {dctracker-1.3.0 → dctracker-1.4.0}/README.md +4 -4
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/__init__.py +1 -1
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/cli.py +1 -1
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/db.py +6 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/mcp/__init__.py +1 -1
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/mcp/server.py +88 -105
- {dctracker-1.3.0 → dctracker-1.4.0/dctracker.egg-info}/PKG-INFO +7 -7
- {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/SOURCES.txt +2 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/requires.txt +2 -2
- {dctracker-1.3.0 → dctracker-1.4.0}/pyproject.toml +3 -3
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_engine.py +25 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_acks.py +1 -1
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_alwaysload.py +19 -5
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_handoff_view.py +1 -1
- dctracker-1.4.0/tests/test_server_protocol.py +99 -0
- dctracker-1.4.0/tests/test_server_wire.py +99 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_workflow_ops.py +1 -1
- {dctracker-1.3.0 → dctracker-1.4.0}/LICENSE +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/MANIFEST.in +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/assets/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/config.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/analytics.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/changelog.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/checkpoints.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/decisions.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/engine.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/handoff.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/ids.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/items.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/classify.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/crud.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/ingest.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/parser.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/projects.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/provenance.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/sprint.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/sprints.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/version.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/export.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/check-changelog-on-stop.sh +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/check-changelog.sh +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/dct-plan-autoscan.sh +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/dct-task-mirror.sh +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/integrations/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/integrations/claude.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/migrate.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/paths.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/server.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/services/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/setup.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/clog/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/commit/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/dct-import/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/dct-init/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/handoff/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/pickup/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/plan-resolve-uncertain/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/plan-status/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/release/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track-list/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track-resolve/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track-update/SKILL.md +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/update.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/app.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/analytics.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/changelog.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/decisions.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/events.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/handoffs.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/home.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/items.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/plans.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/projects.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/sprints.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/changes.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/serializers.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/app.css +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/app.js +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/SOURCES.txt +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/htmx.min.js +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/uPlot.iife.min.js +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/uPlot.min.css +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/analytics.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/base.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/changelog/list.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/decisions/list.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/handoffs/list.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/home.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/item_detail.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/items_list.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_bars.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_checkpoint_steps.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_items_table.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_plan_section.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_project_card.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/plans/detail.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/plans/list.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/project_home.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/sprints/detail.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/sprints/list.html +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/workflows/__init__.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dct/workflows/session.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/dependency_links.txt +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/entry_points.txt +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/top_level.txt +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/setup.cfg +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_adversarial.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_analytics.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_changelog.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_changes.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_check_numbers.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_checkpoints.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_prompts.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_sprints.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_web.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_workflows.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_config.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_decisions_crud.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_export.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_handoff.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_bypass.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_changelog_stop.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_plan_autoscan.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_task_mirror.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_ids.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_ingest_dogfood.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_items.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_migrate.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_migration.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_packaging.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_paths.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plan_classify.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plan_ingest.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plan_parser.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plans_crud.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_projects.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_provenance.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_restructure.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_setup.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_setup_wiring.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_sprint.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_sprints_crud.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_update.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_version.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_analytics.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_app.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_items.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_structural.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_views.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_windows_support.py +0 -0
- {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_workflows.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dctracker
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Deterministic Context Tracker (dct) — cross-project tracking, changelog, and release tooling for Claude Code.
|
|
5
5
|
Author-email: fotodeveloper <dev@fotodeveloper.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -25,7 +25,7 @@ Requires-Dist: platformdirs>=4.9.6; sys_platform == "win32"
|
|
|
25
25
|
Provides-Extra: pg
|
|
26
26
|
Requires-Dist: psycopg[binary]; extra == "pg"
|
|
27
27
|
Provides-Extra: mcp
|
|
28
|
-
Requires-Dist: mcp
|
|
28
|
+
Requires-Dist: mcp<3,>=2; extra == "mcp"
|
|
29
29
|
Provides-Extra: web
|
|
30
30
|
Requires-Dist: flask>=3.0; extra == "web"
|
|
31
31
|
Requires-Dist: markdown>=3.5; extra == "web"
|
|
@@ -34,7 +34,7 @@ Requires-Dist: pytest; extra == "dev"
|
|
|
34
34
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
35
35
|
Provides-Extra: all
|
|
36
36
|
Requires-Dist: psycopg[binary]; extra == "all"
|
|
37
|
-
Requires-Dist: mcp
|
|
37
|
+
Requires-Dist: mcp<3,>=2; extra == "all"
|
|
38
38
|
Requires-Dist: flask>=3.0; extra == "all"
|
|
39
39
|
Requires-Dist: markdown>=3.5; extra == "all"
|
|
40
40
|
Requires-Dist: pytest; extra == "all"
|
|
@@ -122,7 +122,7 @@ markdown, and makes the release commit.
|
|
|
122
122
|
- **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
|
|
123
123
|
- **LLM-assisted classification** — uncertain plan sections auto-resolved via `claude --print` (haiku by default)
|
|
124
124
|
- **Passive autoscan hook** — PostToolUse hook re-scans plan-like files in background on every edit
|
|
125
|
-
- **MCP server** — native Claude Code integration via
|
|
125
|
+
- **MCP server** — native Claude Code integration via the official MCP SDK
|
|
126
126
|
- **CLI** — fast `dct` command for hooks and scripts
|
|
127
127
|
- **Skills** — Claude Code slash commands (`/track`, `/clog`, `/dct-import`, `/plan-status`, …)
|
|
128
128
|
- **Soft deletes** — ledger pattern, nothing is ever lost
|
|
@@ -134,9 +134,9 @@ Pick one — whichever matches your Python workflow. The distribution is named *
|
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
136
|
# Option A: uv tool (recommended — isolated, upgradable, editable for dev)
|
|
137
|
-
uv tool install dctracker --with 'mcp
|
|
137
|
+
uv tool install dctracker --with 'mcp' --with 'psycopg[binary]'
|
|
138
138
|
# Or from source (dev):
|
|
139
|
-
uv tool install --editable /path/to/dct --with 'mcp
|
|
139
|
+
uv tool install --editable /path/to/dct --with 'mcp' --with 'psycopg[binary]'
|
|
140
140
|
# Or straight from GitHub, no clone (e.g. to try main before a release):
|
|
141
141
|
uv tool install 'dctracker[mcp,pg] @ git+https://github.com/fotodeveloper/dct'
|
|
142
142
|
|
|
@@ -370,7 +370,7 @@ The `DCT_DATABASE_URL` environment variable overrides `[database].url`. For the
|
|
|
370
370
|
.venv/bin/pytest tests/test_plan_ingest.py -v # Ingest + sticky-resolved semantics
|
|
371
371
|
|
|
372
372
|
# MCP server smoke (boot + tool list)
|
|
373
|
-
uv run --no-project --with 'mcp
|
|
373
|
+
uv run --no-project --with 'mcp' --with sqlalchemy --with 'psycopg[binary]' \
|
|
374
374
|
python -c "import asyncio; from dct.mcp.server import mcp; \
|
|
375
375
|
print(len(asyncio.run(mcp.list_tools())), 'tools')"
|
|
376
376
|
```
|
|
@@ -79,7 +79,7 @@ markdown, and makes the release commit.
|
|
|
79
79
|
- **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
|
|
80
80
|
- **LLM-assisted classification** — uncertain plan sections auto-resolved via `claude --print` (haiku by default)
|
|
81
81
|
- **Passive autoscan hook** — PostToolUse hook re-scans plan-like files in background on every edit
|
|
82
|
-
- **MCP server** — native Claude Code integration via
|
|
82
|
+
- **MCP server** — native Claude Code integration via the official MCP SDK
|
|
83
83
|
- **CLI** — fast `dct` command for hooks and scripts
|
|
84
84
|
- **Skills** — Claude Code slash commands (`/track`, `/clog`, `/dct-import`, `/plan-status`, …)
|
|
85
85
|
- **Soft deletes** — ledger pattern, nothing is ever lost
|
|
@@ -91,9 +91,9 @@ Pick one — whichever matches your Python workflow. The distribution is named *
|
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
93
|
# Option A: uv tool (recommended — isolated, upgradable, editable for dev)
|
|
94
|
-
uv tool install dctracker --with 'mcp
|
|
94
|
+
uv tool install dctracker --with 'mcp' --with 'psycopg[binary]'
|
|
95
95
|
# Or from source (dev):
|
|
96
|
-
uv tool install --editable /path/to/dct --with 'mcp
|
|
96
|
+
uv tool install --editable /path/to/dct --with 'mcp' --with 'psycopg[binary]'
|
|
97
97
|
# Or straight from GitHub, no clone (e.g. to try main before a release):
|
|
98
98
|
uv tool install 'dctracker[mcp,pg] @ git+https://github.com/fotodeveloper/dct'
|
|
99
99
|
|
|
@@ -327,7 +327,7 @@ The `DCT_DATABASE_URL` environment variable overrides `[database].url`. For the
|
|
|
327
327
|
.venv/bin/pytest tests/test_plan_ingest.py -v # Ingest + sticky-resolved semantics
|
|
328
328
|
|
|
329
329
|
# MCP server smoke (boot + tool list)
|
|
330
|
-
uv run --no-project --with 'mcp
|
|
330
|
+
uv run --no-project --with 'mcp' --with sqlalchemy --with 'psycopg[binary]' \
|
|
331
331
|
python -c "import asyncio; from dct.mcp.server import mcp; \
|
|
332
332
|
print(len(asyncio.run(mcp.list_tools())), 'tools')"
|
|
333
333
|
```
|
|
@@ -1345,7 +1345,7 @@ def cmd_server(args):
|
|
|
1345
1345
|
from dct.mcp.server import mcp
|
|
1346
1346
|
except ImportError as e:
|
|
1347
1347
|
print(
|
|
1348
|
-
f"MCP server requires extras. Install with: pip install 'dct[mcp]'\n (or reinstall: uv tool install --editable . --with 'mcp
|
|
1348
|
+
f"MCP server requires extras. Install with: pip install 'dct[mcp]'\n (or reinstall: uv tool install --editable . --with 'mcp')\nOriginal error: {e}",
|
|
1349
1349
|
file=sys.stderr,
|
|
1350
1350
|
)
|
|
1351
1351
|
sys.exit(1)
|
|
@@ -389,6 +389,12 @@ def get_engine(database_url: str) -> sa.Engine:
|
|
|
389
389
|
kwargs = {}
|
|
390
390
|
if database_url.startswith("sqlite"):
|
|
391
391
|
kwargs["connect_args"] = {"check_same_thread": False}
|
|
392
|
+
if database_url in ("sqlite://", "sqlite:///:memory:"):
|
|
393
|
+
# In-memory sqlite must share ONE connection (StaticPool): the
|
|
394
|
+
# default per-thread pool hands every new thread its own empty
|
|
395
|
+
# database, and the MCP SDK (2.0) runs sync tools in worker
|
|
396
|
+
# threads — tools would see "no such table" (#429).
|
|
397
|
+
kwargs["poolclass"] = sa.pool.StaticPool
|
|
392
398
|
|
|
393
399
|
engine = sa.create_engine(database_url, **kwargs)
|
|
394
400
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"""MCP layer — the
|
|
1
|
+
"""MCP layer — the MCPServer (SDK 2.0) exposing dct over the Model Context
|
|
2
2
|
Protocol. Client-neutral: nothing here may know a specific host's name
|
|
3
3
|
(ADR #51 §6.1); host specifics live in dct.integrations."""
|