codex-dev-mcp-suite 1.6.0 → 1.8.0
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.
- package/CHANGELOG.md +39 -0
- package/context-pack/server.js +173 -1
- package/devjournal/server.js +38 -0
- package/docs/ROADMAP.md +74 -0
- package/docs/clients/antigravity.md +52 -0
- package/docs/clients/hermes.md +48 -0
- package/docs/providers.md +13 -0
- package/docs/superpowers/plans/2026-06-15-hardening-v1-2-implementation.md +60 -0
- package/docs/superpowers/plans/2026-06-15-provider-chain-v1-1-implementation.md +65 -0
- package/docs/superpowers/plans/2026-06-15-provider-client-agnostic-config.md +41 -0
- package/docs/superpowers/plans/2026-06-15-trust-release-implementation.md +62 -0
- package/docs/superpowers/plans/2026-06-18-v1-5-0-knowledge-graph.md +792 -0
- package/docs/superpowers/specs/2026-06-15-provider-chain-v1-1-design.md +89 -0
- package/docs/superpowers/specs/2026-06-15-trust-release-design.md +164 -0
- package/docs/superpowers/specs/2026-06-18-dev-mcp-suite-v1-5-0-knowledge-graph-design.md +386 -0
- package/package.json +5 -18
- package/project-memory/embedding.js +23 -8
- package/project-memory/graph.js +8 -1
- package/project-memory/local-embed.js +92 -0
- package/project-memory/server.js +162 -4
- package/run-tests.mjs +54 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Provider Chain v1.1 Design
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Add built-in optional provider fallback for `project-memory` and `devjournal` model calls while keeping local-first privacy guarantees and deterministic no-network override.
|
|
6
|
+
|
|
7
|
+
## User-facing config
|
|
8
|
+
|
|
9
|
+
Use numbered provider slots so users can configure one provider or many without learning router syntax.
|
|
10
|
+
|
|
11
|
+
Recommended slots:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
MCP_PROVIDER_PRIMARY=groq
|
|
15
|
+
MCP_PROVIDER_PRIMARY_BASE_URL=https://api.groq.com/openai/v1
|
|
16
|
+
MCP_PROVIDER_PRIMARY_API_KEY=<groq-key>
|
|
17
|
+
MCP_PROVIDER_PRIMARY_MODEL=llama-3.3-70b-versatile
|
|
18
|
+
|
|
19
|
+
MCP_PROVIDER_CHAIN2=cerebras
|
|
20
|
+
MCP_PROVIDER_CHAIN2_BASE_URL=https://api.cerebras.ai/v1
|
|
21
|
+
MCP_PROVIDER_CHAIN2_API_KEY=<cerebras-key>
|
|
22
|
+
MCP_PROVIDER_CHAIN2_MODEL=llama-3.3-70b
|
|
23
|
+
|
|
24
|
+
MCP_PROVIDER_CHAIN3=openrouter
|
|
25
|
+
MCP_PROVIDER_CHAIN3_BASE_URL=https://openrouter.ai/api/v1
|
|
26
|
+
MCP_PROVIDER_CHAIN3_API_KEY=<openrouter-key>
|
|
27
|
+
MCP_PROVIDER_CHAIN3_MODEL=openai/gpt-4o-mini
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Rules:
|
|
31
|
+
|
|
32
|
+
- `MCP_PROVIDER_PRIMARY` is slot 1.
|
|
33
|
+
- `MCP_PROVIDER_CHAIN2`, `MCP_PROVIDER_CHAIN3`, ... are fallback slots.
|
|
34
|
+
- If only primary exists, use only primary.
|
|
35
|
+
- If users want more, they can add `MCP_PROVIDER_CHAIN4_*`, etc.
|
|
36
|
+
- Provider name is a label for logs/docs, not a lock-in. Any OpenAI-compatible provider works if `BASE_URL`, `API_KEY`, and `MODEL` are set.
|
|
37
|
+
- Existing `MCP_LLM_*`, `MCP_RERANK_*`, and `MCP_EMBED_*` remain supported as compatibility fallback.
|
|
38
|
+
|
|
39
|
+
## Recommended providers
|
|
40
|
+
|
|
41
|
+
Docs recommend Groq, Cerebras, and OpenRouter because they commonly offer free/low-friction tiers and solid model quality. Users may use any provider/model ID.
|
|
42
|
+
|
|
43
|
+
## Runtime behavior
|
|
44
|
+
|
|
45
|
+
For chat/rerank calls:
|
|
46
|
+
|
|
47
|
+
1. If `MCP_DETERMINISTIC_FALLBACK=true`, make no network calls and return keyword/deterministic mode.
|
|
48
|
+
2. Build provider list from numbered slots.
|
|
49
|
+
3. Try providers in order with the existing timeout.
|
|
50
|
+
4. On timeout, 429, 5xx, network error, or invalid JSON: try next provider.
|
|
51
|
+
5. On auth error 401/403: log provider label as unavailable and try next provider, without printing key.
|
|
52
|
+
6. If all fail: return `null` and let existing keyword fallback handle results.
|
|
53
|
+
|
|
54
|
+
For embeddings:
|
|
55
|
+
|
|
56
|
+
- Keep current explicit embedding config in v1.1 unless a provider slot declares an embedding model later.
|
|
57
|
+
- Do not guess embedding model from chat model.
|
|
58
|
+
|
|
59
|
+
## Auto-import/probe
|
|
60
|
+
|
|
61
|
+
MVP probe is read-only and optional:
|
|
62
|
+
|
|
63
|
+
- Validate `/chat/completions` compatibility with a tiny low-token request.
|
|
64
|
+
- Detect model availability only if provider exposes a safe model list endpoint.
|
|
65
|
+
- Never store keys outside the user's MCP client env/config.
|
|
66
|
+
- Never send project content during probe.
|
|
67
|
+
|
|
68
|
+
Future CLI/import helper can generate `.env` snippets, but v1.1 runtime only reads env.
|
|
69
|
+
|
|
70
|
+
## Privacy and observability
|
|
71
|
+
|
|
72
|
+
- Default remains offline keyword mode if no provider is configured.
|
|
73
|
+
- Deterministic mode overrides provider chain.
|
|
74
|
+
- Logs may show provider label and status, never prompts, snippets, API keys, or full response bodies.
|
|
75
|
+
- Docs must explain that query text/candidate snippets leave the machine only when provider slots or legacy model envs are configured.
|
|
76
|
+
|
|
77
|
+
## Compatibility
|
|
78
|
+
|
|
79
|
+
- Existing installs using `MCP_LLM_BASE_URL`/`MCP_LLM_API_KEY` keep working.
|
|
80
|
+
- Existing `MCP_RERANK_*` continues to override generic LLM config for rerank if no numbered provider slots exist.
|
|
81
|
+
- Legacy `NINEROUTER_*`, `LLM_*`, `RERANK_*`, and `EMBED_*` aliases remain supported.
|
|
82
|
+
|
|
83
|
+
## Out of scope for v1.1
|
|
84
|
+
|
|
85
|
+
- Hosted auth/dashboard.
|
|
86
|
+
- Persisted provider credentials.
|
|
87
|
+
- Automatic remote model selection based on benchmarks.
|
|
88
|
+
- Embedding provider chain.
|
|
89
|
+
- Publishing any telemetry.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Trust Release Design
|
|
2
|
+
|
|
3
|
+
**Project:** Dev MCP Suite (`codex-dev-mcp-suite`)
|
|
4
|
+
**Target release:** `v1.0.1` trust release
|
|
5
|
+
**Future release:** `v1.1` built-in provider chain
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Make Dev MCP Suite safe and understandable for new users by making privacy, local storage, optional model providers, and deterministic no-network behavior explicit.
|
|
10
|
+
|
|
11
|
+
## Problem
|
|
12
|
+
|
|
13
|
+
Calon pengguna punya kegelisahan wajar:
|
|
14
|
+
|
|
15
|
+
1. Mereka takut data proyek/memory/journal dikirim ke author/package owner.
|
|
16
|
+
2. Mereka tidak selalu pakai Codex; client bisa Claude Code, Cursor, Gemini-compatible launcher, Hermes, atau MCP host lain.
|
|
17
|
+
3. Mereka perlu rekomendasi provider model yang jelas kalau ingin recall/rerank lebih bagus.
|
|
18
|
+
4. Mereka perlu mode deterministic/no-network yang eksplisit, bukan sekadar fallback implisit.
|
|
19
|
+
|
|
20
|
+
## Principles
|
|
21
|
+
|
|
22
|
+
- **Local-first by default:** fresh install works without model provider or network calls.
|
|
23
|
+
- **No hidden telemetry:** package has no hosted backend and no built-in telemetry.
|
|
24
|
+
- **Opt-in remote model calls:** data leaves machine only if user configures external embedding/rerank provider.
|
|
25
|
+
- **Precise privacy claims:** avoid overclaiming; document exact data flow.
|
|
26
|
+
- **Client-agnostic:** docs refer to MCP clients/agents generally; Codex is one supported client, not the product identity.
|
|
27
|
+
- **Deterministic means no network:** if enabled, LLM/embedding/rerank calls are hard-disabled.
|
|
28
|
+
|
|
29
|
+
## v1.0.1 Scope
|
|
30
|
+
|
|
31
|
+
### Privacy documentation
|
|
32
|
+
|
|
33
|
+
Add `docs/privacy.md` with this core statement:
|
|
34
|
+
|
|
35
|
+
> Dev MCP Suite has no built-in telemetry and no hosted backend. Your project memory, journal, and checkpoints are stored as local files on your machine. Data leaves your machine only if you configure an external embedding or rerank provider.
|
|
36
|
+
|
|
37
|
+
The doc must explain:
|
|
38
|
+
|
|
39
|
+
- What is stored locally:
|
|
40
|
+
- project-memory notes
|
|
41
|
+
- devjournal entries/handoffs
|
|
42
|
+
- checkpoints
|
|
43
|
+
- context-pack reads only; it does not persist project files
|
|
44
|
+
- Who can access it:
|
|
45
|
+
- local OS user and tools with filesystem permission
|
|
46
|
+
- not the package author/owner
|
|
47
|
+
- When data leaves the machine:
|
|
48
|
+
- only external `MCP_*` model endpoints for embedding/rerank
|
|
49
|
+
- only the text sent for that feature call
|
|
50
|
+
- What never happens by default:
|
|
51
|
+
- no telemetry
|
|
52
|
+
- no hosted backend
|
|
53
|
+
- no automatic upload to repo/npm/author
|
|
54
|
+
- Security caveats:
|
|
55
|
+
- vault/journal/checkpoints are plaintext local files
|
|
56
|
+
- do not store secrets unless intentionally desired
|
|
57
|
+
- if using remote model providers, review their privacy policies
|
|
58
|
+
|
|
59
|
+
### Deterministic mode
|
|
60
|
+
|
|
61
|
+
Add `MCP_DETERMINISTIC_FALLBACK=true`.
|
|
62
|
+
|
|
63
|
+
Behavior:
|
|
64
|
+
|
|
65
|
+
- In `project-memory`:
|
|
66
|
+
- `memory_recall` does not call embeddings.
|
|
67
|
+
- `memory_recall` does not call rerank LLM.
|
|
68
|
+
- `memory_reindex` should report deterministic/no-network mode instead of attempting embeddings.
|
|
69
|
+
- recall output uses `[deterministic]` label.
|
|
70
|
+
- In `devjournal`:
|
|
71
|
+
- `journal_search` does not call rerank LLM.
|
|
72
|
+
- search output uses `[deterministic]` label.
|
|
73
|
+
- Existing fallback behavior remains:
|
|
74
|
+
- if env is not true and no provider is configured, fallback remains `[keyword]`.
|
|
75
|
+
- if env is not true and provider fails, fallback remains `[keyword]`.
|
|
76
|
+
|
|
77
|
+
Accepted true values: `true`, `1`, `yes`, `on` case-insensitive.
|
|
78
|
+
|
|
79
|
+
### Provider recommendation docs
|
|
80
|
+
|
|
81
|
+
Add provider setup section in `docs/configuration.md`:
|
|
82
|
+
|
|
83
|
+
Recommended external provider strategy for users who want better recall/rerank:
|
|
84
|
+
|
|
85
|
+
1. **Groq** as primary fast rerank provider.
|
|
86
|
+
2. **Cerebras** as secondary fast fallback.
|
|
87
|
+
3. **OpenRouter** as broad model fallback.
|
|
88
|
+
|
|
89
|
+
For `v1.0.1`, this is docs-only. Users should wire the chain through an OpenAI-compatible gateway they control, such as LiteLLM or 9router, then point Dev MCP Suite at that gateway with:
|
|
90
|
+
|
|
91
|
+
```env
|
|
92
|
+
MCP_LLM_BASE_URL=http://localhost:4000/v1
|
|
93
|
+
MCP_LLM_API_KEY=...
|
|
94
|
+
MCP_RERANK_MODEL=...
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Docs must say this chain is optional and disabled by default.
|
|
98
|
+
|
|
99
|
+
### README updates
|
|
100
|
+
|
|
101
|
+
README must include:
|
|
102
|
+
|
|
103
|
+
- one local-first privacy paragraph
|
|
104
|
+
- link to `docs/privacy.md`
|
|
105
|
+
- link to provider config docs
|
|
106
|
+
- clear deterministic example:
|
|
107
|
+
|
|
108
|
+
```env
|
|
109
|
+
MCP_DETERMINISTIC_FALLBACK=true
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Tests
|
|
113
|
+
|
|
114
|
+
Add tests for:
|
|
115
|
+
|
|
116
|
+
- `MCP_DETERMINISTIC_FALLBACK=true` disables project-memory embedding/rerank and labels recall `[deterministic]`.
|
|
117
|
+
- `MCP_DETERMINISTIC_FALLBACK=true` disables devjournal rerank and labels search `[deterministic]`.
|
|
118
|
+
- env parsing accepts `true`, `1`, `yes`, `on`.
|
|
119
|
+
|
|
120
|
+
## v1.1 Future Scope: Built-In Provider Chain
|
|
121
|
+
|
|
122
|
+
Built-in chain is attractive but out of scope for `v1.0.1` because it expands the trust/security surface.
|
|
123
|
+
|
|
124
|
+
Future opt-in design:
|
|
125
|
+
|
|
126
|
+
```env
|
|
127
|
+
MCP_PROVIDER_CHAIN=groq,cerebras,openrouter
|
|
128
|
+
GROQ_API_KEY=...
|
|
129
|
+
CEREBRAS_API_KEY=...
|
|
130
|
+
OPENROUTER_API_KEY=...
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Behavior:
|
|
134
|
+
|
|
135
|
+
1. Try Groq.
|
|
136
|
+
2. On rate limit/error/timeout, try Cerebras.
|
|
137
|
+
3. On failure, try OpenRouter.
|
|
138
|
+
4. On total failure, fallback deterministic local.
|
|
139
|
+
|
|
140
|
+
Requirements before v1.1 implementation:
|
|
141
|
+
|
|
142
|
+
- provider-specific default models
|
|
143
|
+
- retry/backoff and timeout policy
|
|
144
|
+
- redacted logging
|
|
145
|
+
- tests with mocked HTTP endpoints
|
|
146
|
+
- docs explaining exactly what text is sent to which provider
|
|
147
|
+
- opt-in only; no built-in chain unless `MCP_PROVIDER_CHAIN` is set
|
|
148
|
+
|
|
149
|
+
## Non-Goals
|
|
150
|
+
|
|
151
|
+
- Do not publish under a new package name in `v1.0.1`.
|
|
152
|
+
- Do not add telemetry.
|
|
153
|
+
- Do not add a hosted backend.
|
|
154
|
+
- Do not implement built-in Groq/Cerebras/OpenRouter chain in `v1.0.1`.
|
|
155
|
+
- Do not make remote model calls by default.
|
|
156
|
+
|
|
157
|
+
## Acceptance Criteria
|
|
158
|
+
|
|
159
|
+
- Fresh install works offline with deterministic/keyword local recall.
|
|
160
|
+
- Users can read a privacy doc and understand exactly where data is stored and when it leaves their machine.
|
|
161
|
+
- `MCP_DETERMINISTIC_FALLBACK=true` hard-disables all model network calls in suite recall/search paths.
|
|
162
|
+
- Tests pass.
|
|
163
|
+
- `npm pack --dry-run` includes public docs and excludes internal planning docs.
|
|
164
|
+
- Secret scan finds no real secrets.
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
# Dev MCP Suite v1.5.0 Knowledge Graph Design
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
`v1.5.0` introduces the first knowledge-graph layer for Dev MCP Suite. The release is intentionally narrow and focuses on three capabilities only:
|
|
6
|
+
|
|
7
|
+
- `memory_link`
|
|
8
|
+
- `memory_global_recall`
|
|
9
|
+
- `memory_dedup`
|
|
10
|
+
|
|
11
|
+
The goal is to improve note connectivity, cross-project discovery, and duplicate detection without making embeddings mandatory and without forcing existing users through a hard migration.
|
|
12
|
+
|
|
13
|
+
This release must remain backward-compatible with existing vaults and must degrade gracefully when semantic retrieval is unavailable.
|
|
14
|
+
|
|
15
|
+
## Goals
|
|
16
|
+
|
|
17
|
+
- Add explicit note-to-note linking with resolvable references and backlinks.
|
|
18
|
+
- Add cross-project recall that still prefers the active project first.
|
|
19
|
+
- Add duplicate-note discovery with safe, reviewable suggestions.
|
|
20
|
+
- Keep retrieval useful even when no embeddings provider is configured.
|
|
21
|
+
- Avoid destructive automation in any dedup flow.
|
|
22
|
+
- Create a foundation that later releases can observe, score, and maintain.
|
|
23
|
+
|
|
24
|
+
## Non-Goals
|
|
25
|
+
|
|
26
|
+
- Auto-merging or auto-deleting notes.
|
|
27
|
+
- Introducing a monolithic graph subsystem with many unrelated features.
|
|
28
|
+
- Requiring embeddings as a prerequisite for graph features.
|
|
29
|
+
- Shipping observability, lifecycle cleanup, or automated repair workflows in this release.
|
|
30
|
+
- Changing the existing public tool surface outside the three scoped tools unless strictly required for compatibility.
|
|
31
|
+
|
|
32
|
+
## Release Scope
|
|
33
|
+
|
|
34
|
+
`v1.5.0` includes exactly these tools and behaviors:
|
|
35
|
+
|
|
36
|
+
1. `memory_link`
|
|
37
|
+
2. `memory_global_recall`
|
|
38
|
+
3. `memory_dedup`
|
|
39
|
+
|
|
40
|
+
Future work is explicitly deferred:
|
|
41
|
+
|
|
42
|
+
- `v1.5.1`: Observability
|
|
43
|
+
- `v1.5.2`: Lifecycle
|
|
44
|
+
|
|
45
|
+
## User Problems
|
|
46
|
+
|
|
47
|
+
Current retrieval is strong within a single project, but the suite still lacks a first-class model for relationships between notes. The main pain points are:
|
|
48
|
+
|
|
49
|
+
- users cannot explicitly connect notes and traverse those connections reliably;
|
|
50
|
+
- similarly named notes across projects are hard to distinguish and reuse safely;
|
|
51
|
+
- duplicate notes accumulate over time with no guided cleanup path;
|
|
52
|
+
- semantic recall quality depends too heavily on whether embeddings are configured.
|
|
53
|
+
|
|
54
|
+
The knowledge-graph release solves these by adding link awareness, global lookup, and safe dedup suggestions while keeping the existing retrieval architecture intact.
|
|
55
|
+
|
|
56
|
+
## Design Principles
|
|
57
|
+
|
|
58
|
+
### Backward-compatible first
|
|
59
|
+
|
|
60
|
+
Existing vaults must continue to function without manual migration. Graph metadata can be introduced lazily and rebuilt later if needed.
|
|
61
|
+
|
|
62
|
+
### Safe by default
|
|
63
|
+
|
|
64
|
+
No destructive actions happen automatically. When ambiguity exists, the system should return candidates rather than silently guessing.
|
|
65
|
+
|
|
66
|
+
### Embeddings are optional, not required
|
|
67
|
+
|
|
68
|
+
Graph features must still provide value with keyword and deterministic retrieval only. Semantic enhancements improve quality but are not a hard dependency.
|
|
69
|
+
|
|
70
|
+
### Same-project bias
|
|
71
|
+
|
|
72
|
+
When resolving links or ranking recall results, the active project has priority. Global behavior is additive, not a replacement for project locality.
|
|
73
|
+
|
|
74
|
+
### Rebuildable state
|
|
75
|
+
|
|
76
|
+
Any derived graph or link index must be reconstructible from note content and note metadata.
|
|
77
|
+
|
|
78
|
+
## Capability 1: `memory_link`
|
|
79
|
+
|
|
80
|
+
### Purpose
|
|
81
|
+
|
|
82
|
+
`memory_link` provides explicit note-link parsing, resolution, and backlink support.
|
|
83
|
+
|
|
84
|
+
### Supported Link Syntax
|
|
85
|
+
|
|
86
|
+
The tool supports both:
|
|
87
|
+
|
|
88
|
+
- `[[id]]`
|
|
89
|
+
- `[[title]]`
|
|
90
|
+
|
|
91
|
+
It also supports explicit cross-project override syntax:
|
|
92
|
+
|
|
93
|
+
- `[[project:id]]`
|
|
94
|
+
- `[[project:title]]`
|
|
95
|
+
|
|
96
|
+
### Resolution Rules
|
|
97
|
+
|
|
98
|
+
Link resolution follows this order:
|
|
99
|
+
|
|
100
|
+
1. If the link contains an explicit project prefix, resolve within that target project.
|
|
101
|
+
2. Otherwise, search the active project first.
|
|
102
|
+
3. If no same-project match exists, fall back to global search.
|
|
103
|
+
4. If multiple valid matches remain, return ambiguity information and candidate matches.
|
|
104
|
+
5. If no match exists, return an unresolved-link result rather than fabricating one.
|
|
105
|
+
|
|
106
|
+
### Backlinks
|
|
107
|
+
|
|
108
|
+
The tool must expose backlink information for a note so users can inspect inbound relationships. Backlinks are derived data and should not require separate manual authoring.
|
|
109
|
+
|
|
110
|
+
### Expected Behavior
|
|
111
|
+
|
|
112
|
+
- Same-project linking should feel local and predictable.
|
|
113
|
+
- Title-based linking should remain ergonomic.
|
|
114
|
+
- Cross-project references should be explicit when needed.
|
|
115
|
+
- Ambiguous links should be surfaced clearly.
|
|
116
|
+
|
|
117
|
+
## Capability 2: `memory_global_recall`
|
|
118
|
+
|
|
119
|
+
### Purpose
|
|
120
|
+
|
|
121
|
+
`memory_global_recall` retrieves relevant notes across multiple projects while preserving a strong active-project bias.
|
|
122
|
+
|
|
123
|
+
### Retrieval Strategy
|
|
124
|
+
|
|
125
|
+
Global recall should be layered rather than all-or-nothing:
|
|
126
|
+
|
|
127
|
+
1. Search/rank the active project first.
|
|
128
|
+
2. Expand to global candidates only as a fallback or augmentation layer.
|
|
129
|
+
3. Apply graph-aware boost after candidate generation.
|
|
130
|
+
4. Return results with enough metadata to explain where they came from.
|
|
131
|
+
|
|
132
|
+
### Ranking Model
|
|
133
|
+
|
|
134
|
+
The ranking model should use a soft graph boost. Graph connectivity helps reorder candidates, but it must not act as a hard filter that hides otherwise relevant notes.
|
|
135
|
+
|
|
136
|
+
Possible ranking inputs:
|
|
137
|
+
|
|
138
|
+
- lexical/keyword match
|
|
139
|
+
- semantic similarity, if embeddings are available
|
|
140
|
+
- graph/link proximity
|
|
141
|
+
- same-project prior
|
|
142
|
+
- note freshness or other existing recall signals if already available in the current architecture
|
|
143
|
+
|
|
144
|
+
### Behavior Without Embeddings
|
|
145
|
+
|
|
146
|
+
If no embeddings model is configured, `memory_global_recall` must still work by combining:
|
|
147
|
+
|
|
148
|
+
- keyword/deterministic candidate retrieval
|
|
149
|
+
- same-project prioritization
|
|
150
|
+
- graph-based soft boosting
|
|
151
|
+
|
|
152
|
+
This ensures cross-project recall remains usable in “zero semantic config” environments.
|
|
153
|
+
|
|
154
|
+
### Output Expectations
|
|
155
|
+
|
|
156
|
+
The tool should make it clear whether a result came primarily from:
|
|
157
|
+
|
|
158
|
+
- active-project recall
|
|
159
|
+
- global fallback
|
|
160
|
+
- graph-supported re-ranking
|
|
161
|
+
- semantic retrieval, if enabled
|
|
162
|
+
|
|
163
|
+
That transparency matters for debugging user trust later, especially in `v1.5.1` observability.
|
|
164
|
+
|
|
165
|
+
## Capability 3: `memory_dedup`
|
|
166
|
+
|
|
167
|
+
### Purpose
|
|
168
|
+
|
|
169
|
+
`memory_dedup` identifies likely duplicate notes and suggests merge candidates.
|
|
170
|
+
|
|
171
|
+
### Safety Policy
|
|
172
|
+
|
|
173
|
+
This tool is advisory only in `v1.5.0`.
|
|
174
|
+
|
|
175
|
+
It must:
|
|
176
|
+
|
|
177
|
+
- suggest possible duplicates;
|
|
178
|
+
- explain why the pair/group was flagged;
|
|
179
|
+
- avoid deleting or merging anything automatically.
|
|
180
|
+
|
|
181
|
+
It must not:
|
|
182
|
+
|
|
183
|
+
- auto-delete notes;
|
|
184
|
+
- auto-merge notes;
|
|
185
|
+
- rewrite content without an explicit future tool designed for that purpose.
|
|
186
|
+
|
|
187
|
+
### Default Threshold
|
|
188
|
+
|
|
189
|
+
The default duplicate threshold is `0.90`.
|
|
190
|
+
|
|
191
|
+
That threshold should be overridable, but the default should favor precision over aggressive cleanup.
|
|
192
|
+
|
|
193
|
+
### Matching Signals
|
|
194
|
+
|
|
195
|
+
Dedup suggestions may consider:
|
|
196
|
+
|
|
197
|
+
- normalized title similarity
|
|
198
|
+
- content overlap
|
|
199
|
+
- link neighborhood similarity
|
|
200
|
+
- semantic similarity if embeddings are available
|
|
201
|
+
- metadata similarity if cheap and already available
|
|
202
|
+
|
|
203
|
+
### Output Expectations
|
|
204
|
+
|
|
205
|
+
The output should contain enough information for manual review, such as:
|
|
206
|
+
|
|
207
|
+
- note identifiers
|
|
208
|
+
- titles
|
|
209
|
+
- project locations
|
|
210
|
+
- similarity score or confidence
|
|
211
|
+
- a short explanation of why the pair was flagged
|
|
212
|
+
|
|
213
|
+
## Backfill and Migration Strategy
|
|
214
|
+
|
|
215
|
+
### Chosen Strategy
|
|
216
|
+
|
|
217
|
+
The backfill strategy is hybrid:
|
|
218
|
+
|
|
219
|
+
- lazy auto-backfill on first graph-tool use;
|
|
220
|
+
- explicit rebuild/backfill path available for repair and mass reindexing.
|
|
221
|
+
|
|
222
|
+
### Why Hybrid
|
|
223
|
+
|
|
224
|
+
Pure manual backfill adds friction for existing users. Purely automatic migration hides too much state change and makes repair harder.
|
|
225
|
+
|
|
226
|
+
Hybrid gives the best trade-off:
|
|
227
|
+
|
|
228
|
+
- old vaults keep working immediately;
|
|
229
|
+
- derived graph state appears when needed;
|
|
230
|
+
- operators still have a deterministic rebuild path if state gets stale or corrupted.
|
|
231
|
+
|
|
232
|
+
### Requirements
|
|
233
|
+
|
|
234
|
+
- First-time graph access must not require a full blocking migration unless unavoidable.
|
|
235
|
+
- Backfill must be resumable or rebuildable.
|
|
236
|
+
- Any rebuild path should produce the same derived state from the same note corpus.
|
|
237
|
+
|
|
238
|
+
## Storage Model
|
|
239
|
+
|
|
240
|
+
### Chosen Model
|
|
241
|
+
|
|
242
|
+
Storage is hybrid.
|
|
243
|
+
|
|
244
|
+
### Intent
|
|
245
|
+
|
|
246
|
+
Per-note and per-project source data stays close to existing storage boundaries, while link/global lookup indexes may be maintained in a derived structure optimized for recall and traversal.
|
|
247
|
+
|
|
248
|
+
### Requirements
|
|
249
|
+
|
|
250
|
+
- Graph state must be derived from canonical note content and metadata.
|
|
251
|
+
- Rebuilding graph state must be possible without manual note editing.
|
|
252
|
+
- Storage decisions should not break existing project isolation assumptions.
|
|
253
|
+
- Global lookup structures must still preserve project attribution for every note.
|
|
254
|
+
|
|
255
|
+
## Tool Surface
|
|
256
|
+
|
|
257
|
+
The MCP surface remains separated into three tools:
|
|
258
|
+
|
|
259
|
+
- `memory_link`
|
|
260
|
+
- `memory_global_recall`
|
|
261
|
+
- `memory_dedup`
|
|
262
|
+
|
|
263
|
+
### Why Separate Tools
|
|
264
|
+
|
|
265
|
+
Separate tools are easier to reason about, easier to test, and easier to evolve independently.
|
|
266
|
+
|
|
267
|
+
They also map cleanly to user intent:
|
|
268
|
+
|
|
269
|
+
- linking/traversal
|
|
270
|
+
- cross-project search
|
|
271
|
+
- duplicate analysis
|
|
272
|
+
|
|
273
|
+
A monolithic graph tool would complicate input/output contracts too early.
|
|
274
|
+
|
|
275
|
+
## Fallback Behavior Matrix
|
|
276
|
+
|
|
277
|
+
### Fully configured environment
|
|
278
|
+
|
|
279
|
+
If keyword, embeddings, and graph metadata are all available:
|
|
280
|
+
|
|
281
|
+
- use standard retrieval candidate generation;
|
|
282
|
+
- use semantic similarity where supported;
|
|
283
|
+
- apply graph-aware soft boosting;
|
|
284
|
+
- return explanatory provenance.
|
|
285
|
+
|
|
286
|
+
### No embeddings configured
|
|
287
|
+
|
|
288
|
+
If embeddings are unavailable:
|
|
289
|
+
|
|
290
|
+
- use keyword/deterministic candidate generation;
|
|
291
|
+
- still use same-project bias and graph-aware boosting;
|
|
292
|
+
- maintain tool usability without surfacing provider errors as hard blockers.
|
|
293
|
+
|
|
294
|
+
### No graph-derived state yet
|
|
295
|
+
|
|
296
|
+
If graph state is missing:
|
|
297
|
+
|
|
298
|
+
- trigger lazy backfill where appropriate;
|
|
299
|
+
- if backfill cannot complete immediately, fall back to non-graph retrieval behavior and explain that graph augmentation is incomplete.
|
|
300
|
+
|
|
301
|
+
## Error Handling Expectations
|
|
302
|
+
|
|
303
|
+
### Ambiguous links
|
|
304
|
+
|
|
305
|
+
Return candidate matches and ambiguity metadata.
|
|
306
|
+
|
|
307
|
+
### Missing project target
|
|
308
|
+
|
|
309
|
+
Return a clear unresolved-reference result.
|
|
310
|
+
|
|
311
|
+
### Missing embeddings provider
|
|
312
|
+
|
|
313
|
+
Do not fail the request if semantic retrieval is optional for that path.
|
|
314
|
+
|
|
315
|
+
### Derived-state drift
|
|
316
|
+
|
|
317
|
+
Expose enough information for future rebuild/repair tooling rather than silently masking corruption.
|
|
318
|
+
|
|
319
|
+
## Testing Implications
|
|
320
|
+
|
|
321
|
+
`v1.5.0` should add tests for at least:
|
|
322
|
+
|
|
323
|
+
- same-project `[[title]]` resolution
|
|
324
|
+
- same-project `[[id]]` resolution
|
|
325
|
+
- explicit cross-project override resolution
|
|
326
|
+
- ambiguous title resolution behavior
|
|
327
|
+
- unresolved link behavior
|
|
328
|
+
- global recall preferring same-project hits
|
|
329
|
+
- global recall fallback to other projects
|
|
330
|
+
- dedup suggestions with default threshold `0.90`
|
|
331
|
+
- dedup non-destructive behavior
|
|
332
|
+
- recall fallback behavior when embeddings are unavailable
|
|
333
|
+
- lazy backfill behavior for pre-existing vault state
|
|
334
|
+
|
|
335
|
+
## Open Implementation Notes
|
|
336
|
+
|
|
337
|
+
These are implementation notes, not unresolved design questions:
|
|
338
|
+
|
|
339
|
+
- The graph layer should reuse as much existing note indexing infrastructure as practical.
|
|
340
|
+
- Derived state should be cheap to invalidate and rebuild.
|
|
341
|
+
- Output shapes should be designed for future observability fields, even if `v1.5.0` does not yet expose all diagnostics.
|
|
342
|
+
- Existing recall-mode behavior introduced in `v1.4.0` should remain conceptually compatible with the new global recall path.
|
|
343
|
+
|
|
344
|
+
## Risks
|
|
345
|
+
|
|
346
|
+
### Scope creep
|
|
347
|
+
|
|
348
|
+
Knowledge graph features can expand very quickly. The release avoids that by limiting scope to three tools only.
|
|
349
|
+
|
|
350
|
+
### Ambiguity explosion
|
|
351
|
+
|
|
352
|
+
Title-based linking across projects can create ambiguity. This is handled with same-project bias and explicit project override syntax.
|
|
353
|
+
|
|
354
|
+
### Over-dependence on semantic infrastructure
|
|
355
|
+
|
|
356
|
+
If graph quality depends too much on embeddings, many users lose value. This is mitigated by requiring a strong keyword/deterministic fallback path.
|
|
357
|
+
|
|
358
|
+
### Hidden state issues
|
|
359
|
+
|
|
360
|
+
Any lazy derived-state system can drift or fail partially. This is mitigated by keeping state rebuildable and by preserving an explicit rebuild path.
|
|
361
|
+
|
|
362
|
+
## Out of Scope for Later Releases
|
|
363
|
+
|
|
364
|
+
### `v1.5.1` Observability
|
|
365
|
+
|
|
366
|
+
Likely follow-up concerns:
|
|
367
|
+
|
|
368
|
+
- graph/index health visibility
|
|
369
|
+
- recall provenance inspection
|
|
370
|
+
- stats/watch-style diagnostics
|
|
371
|
+
- duplicate trend metrics
|
|
372
|
+
|
|
373
|
+
### `v1.5.2` Lifecycle
|
|
374
|
+
|
|
375
|
+
Likely follow-up concerns:
|
|
376
|
+
|
|
377
|
+
- cleanup workflows
|
|
378
|
+
- archival guidance
|
|
379
|
+
- merge-assist flows
|
|
380
|
+
- stale-link repair flows
|
|
381
|
+
|
|
382
|
+
## Final Recommendation
|
|
383
|
+
|
|
384
|
+
Ship `v1.5.0` as a focused knowledge-graph release with three separate tools, hybrid backfill, safe dedup suggestions, and graph-aware recall that still works without embeddings.
|
|
385
|
+
|
|
386
|
+
This gives Dev MCP Suite a meaningful relationship layer without overcommitting the release to automation, destructive behavior, or provider-specific assumptions.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codex-dev-mcp-suite",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Four local, file-based MCP servers for solo devs/vibecoders: persistent project memory, session handoff/resume, git-independent file checkpoints, and token-efficient project briefings. Works with any MCP client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,35 +46,22 @@
|
|
|
46
46
|
},
|
|
47
47
|
"files": [
|
|
48
48
|
"bin/*.mjs",
|
|
49
|
-
"bin/_meta.mjs",
|
|
50
49
|
"project-memory/*.js",
|
|
51
|
-
"project-memory/server.js",
|
|
52
|
-
"project-memory/embedding.js",
|
|
53
|
-
"project-memory/env.js",
|
|
54
|
-
"project-memory/provider-chain.js",
|
|
55
|
-
"project-memory/rerank.js",
|
|
56
50
|
"project-memory/package.json",
|
|
57
51
|
"devjournal/*.js",
|
|
58
|
-
"devjournal/server.js",
|
|
59
|
-
"devjournal/env.js",
|
|
60
|
-
"devjournal/provider-chain.js",
|
|
61
|
-
"devjournal/rerank.js",
|
|
62
52
|
"devjournal/package.json",
|
|
63
53
|
"checkpoint/*.js",
|
|
64
|
-
"checkpoint/server.js",
|
|
65
54
|
"checkpoint/package.json",
|
|
66
55
|
"context-pack/*.js",
|
|
67
|
-
"context-pack/server.js",
|
|
68
56
|
"context-pack/package.json",
|
|
57
|
+
"lib/*.js",
|
|
69
58
|
"backfill-sessions-v2.mjs",
|
|
70
|
-
"
|
|
71
|
-
"docs
|
|
72
|
-
"docs/clients/*.md",
|
|
59
|
+
"run-tests.mjs",
|
|
60
|
+
"docs/**/*.md",
|
|
73
61
|
"CODEX_DEV_MCP_GUIDE.md",
|
|
74
62
|
"CHANGELOG.md",
|
|
75
63
|
"README.md",
|
|
76
64
|
"LICENSE",
|
|
77
|
-
".env.example"
|
|
78
|
-
"lib/*.js"
|
|
65
|
+
".env.example"
|
|
79
66
|
]
|
|
80
67
|
}
|