@event4u/agent-config 8.2.0 → 8.4.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/.claude-plugin/marketplace.json +4 -426
- package/.claude-plugin/skills/install-agent-config/SKILL.md +32 -0
- package/CHANGELOG.md +57 -0
- package/MIGRATION.md +18 -0
- package/README.md +86 -3
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +1 -1
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +1 -1
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +1 -1
- package/dist/install/install.mjs +586 -386
- package/dist/mcp/registry-manifest.json +2 -2
- package/docs/contracts/CHANGELOG-conventions.md +8 -5
- package/docs/contracts/branch-protection-policy.md +14 -5
- package/docs/contracts/mcp-phase-1-scope.md +75 -0
- package/docs/contracts/mcp-tool-inventory.md +22 -15
- package/docs/contracts/release-pr-gating.md +22 -11
- package/docs/contracts/surface-matrix.md +103 -0
- package/docs/decisions/ADR-111-canonical-glama-listing.md +97 -0
- package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +92 -0
- package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +201 -0
- package/docs/decisions/INDEX.md +3 -0
- package/docs/distribution/registry-submissions.md +1 -1
- package/docs/getting-started.md +8 -6
- package/docs/installation.md +13 -14
- package/docs/mcp-server.md +32 -20
- package/docs/setup/mcp-cloud-endpoints.md +9 -2
- package/package.json +2 -2
- package/src/config/surface-matrix.yml +213 -0
- package/src/scripts/_cli/cmd_converge.ts +399 -0
- package/src/scripts/_cli/cmd_doctor.ts +203 -9
- package/src/scripts/_cli/cmd_uninstall.ts +22 -0
- package/src/scripts/_cli/cmd_upgrade.ts +101 -16
- package/src/scripts/_dispatch.bash +13 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +251 -0
- package/src/scripts/condense.ts +74 -65
- package/src/scripts/hook_manifest.yaml +16 -7
- package/src/scripts/install +23 -4
- package/src/scripts/install.ts +30 -0
- package/src/scripts/lint_glama_drift.ts +75 -0
- package/src/scripts/lint_marketplace.ts +54 -56
- package/src/scripts/lint_surface_matrix.ts +200 -0
- package/src/scripts/mcp_exec/safety_envelope.ts +105 -0
- package/src/scripts/mcp_registry_submit.sh +14 -3
- package/src/scripts/mcp_server/__main__.ts +6 -8
- package/src/scripts/mcp_server/consumer_tool_catalog.json +78 -3
- package/src/scripts/mcp_server/tools.ts +731 -0
- package/src/scripts/release.ts +203 -39
- package/src/scripts/surface_probe_hook.ts +231 -0
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
"artefact_count": 527,
|
|
4
4
|
"scanner_version": "6f13c4a07cc0"
|
|
5
5
|
},
|
|
6
|
-
"generated_at": "2026-07-
|
|
6
|
+
"generated_at": "2026-07-08",
|
|
7
7
|
"package": {
|
|
8
8
|
"description": "Universal AI Agent OS \u2014 audited skills, governance rules, commands, and templates for AI coding tools (Claude Code, Cursor, Windsurf, Copilot).",
|
|
9
9
|
"homepage": "https://github.com/event4u-app/agent-config#readme",
|
|
10
10
|
"name": "@event4u/agent-config",
|
|
11
11
|
"repository": "https://github.com/event4u-app/agent-config",
|
|
12
|
-
"version": "8.
|
|
12
|
+
"version": "8.4.0"
|
|
13
13
|
},
|
|
14
14
|
"registries": [
|
|
15
15
|
{
|
|
@@ -110,17 +110,20 @@ pre-X.Y.x` commit — never bundled with a feature release.
|
|
|
110
110
|
|
|
111
111
|
### Gate-vs-script contract
|
|
112
112
|
|
|
113
|
-
- **Canonical splitter** — `scripts/release.
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
- **Canonical splitter** — `src/scripts/release.ts`, run via `task release`
|
|
114
|
+
or the `release`-labeled-PR CI path
|
|
115
|
+
(`.github/workflows/release.yml`, see
|
|
116
|
+
[`ADR-113`](../decisions/ADR-113-ci-native-release-label-trigger.md)).
|
|
117
|
+
When a release crosses a minor/major boundary and the current era body
|
|
118
|
+
is at or over the 250-line cap, the release pipeline writes the
|
|
116
119
|
`chore(changelog): split era …` commit **first**, then the
|
|
117
120
|
`release: X.Y.Z` commit. The maintainer does not run the split by
|
|
118
121
|
hand for the release path.
|
|
119
|
-
- **Backstop** — `tests/
|
|
122
|
+
- **Backstop** — `tests/lib/changelog_eras.test.ts` (`test_current_era_body_under_cap`)
|
|
120
123
|
catches entries written **outside** the release script (hand-edited
|
|
121
124
|
Unreleased section, agent-authored hotfix entries, doc patches). The
|
|
122
125
|
failure message names `task release` as the auto-split path.
|
|
123
|
-
- **Shared cap constant** — `scripts/_lib/changelog_eras.
|
|
126
|
+
- **Shared cap constant** — `src/scripts/_lib/changelog_eras.ts` owns
|
|
124
127
|
`CURRENT_ERA_BODY_CAP` and the era-header regex. Both the test and
|
|
125
128
|
the release script import from there; no parallel copies.
|
|
126
129
|
- **Patch-release overflow** — a `patch` bump cannot cross an era
|
|
@@ -54,7 +54,14 @@ per branch name.
|
|
|
54
54
|
- **Feature PR** — head branch does not match `release/X.Y.Z` (the default).
|
|
55
55
|
- **Release PR** — head branch matches `^release/\d+\.\d+\.\d+$` AND the
|
|
56
56
|
diff stays within the version-bump allowlist (see `release-pr-gating.md`).
|
|
57
|
-
Either condition failing falls the PR back to feature-PR mode.
|
|
57
|
+
Either condition failing falls the PR back to feature-PR mode. Author is
|
|
58
|
+
either a maintainer (`task release`) or `github-actions[bot]` (the
|
|
59
|
+
`release`-labeled-PR CI path, `.github/workflows/release.yml`) — the
|
|
60
|
+
shape checks are author-agnostic. Verified live: this repo's branch
|
|
61
|
+
protection requires zero approving reviews and exactly one status check
|
|
62
|
+
(`Sync + Generate Tools Consistency`); the bot path's real friction is
|
|
63
|
+
GitHub's separate bot-created-PR approval gate, not a review requirement
|
|
64
|
+
— see [`ADR-113`](../decisions/ADR-113-ci-native-release-label-trigger.md).
|
|
58
65
|
- **Docs-only PR** — diff is entirely inside `docs/**` or matches only
|
|
59
66
|
top-level Markdown (`README.md`, `CHANGELOG.md`, `CONTRIBUTING.md`,
|
|
60
67
|
`AGENTS.md`). No code, tests, workflows, or scripts. This shape is
|
|
@@ -65,7 +72,7 @@ per branch name.
|
|
|
65
72
|
## Failure mode — the cut never silently lifts
|
|
66
73
|
|
|
67
74
|
If a release-PR's diff exits the allowlist mid-stream (e.g. a last-minute
|
|
68
|
-
CHANGELOG fixup that also touches `scripts/release.
|
|
75
|
+
CHANGELOG fixup that also touches `src/scripts/release.ts`):
|
|
69
76
|
|
|
70
77
|
1. `Release Validation / release-shape` exits non-zero.
|
|
71
78
|
2. The required-check set for the PR effectively flips back to the
|
|
@@ -125,6 +132,8 @@ its own protection rules:
|
|
|
125
132
|
- [`ci-cost-budget.md`](ci-cost-budget.md) — measured baseline durations
|
|
126
133
|
per job + quarterly review cadence (Phase C).
|
|
127
134
|
- `.github/workflows/release-validation.yml` — the three release-PR jobs.
|
|
128
|
-
- `scripts/check_release_pr_shape.
|
|
129
|
-
- `scripts/release.
|
|
130
|
-
by Conventional Commits, not CI cost.
|
|
135
|
+
- `src/scripts/check_release_pr_shape.ts` — the shape detector.
|
|
136
|
+
- `src/scripts/release.ts` — emits release PRs (both entry points); release
|
|
137
|
+
cadence stays driven by Conventional Commits, not CI cost.
|
|
138
|
+
- [`ADR-113`](../decisions/ADR-113-ci-native-release-label-trigger.md) — the
|
|
139
|
+
CI-native (`release`-label) entry point and the bot-PR-approval finding.
|
|
@@ -181,6 +181,81 @@ does not introduce a new tool, resource type, or protocol surface.
|
|
|
181
181
|
process per stdio session. Multi-tenancy lives with the future
|
|
182
182
|
bridge, not the kernel.
|
|
183
183
|
|
|
184
|
+
## Amendment — MCP Full Power (accepted 2026-07-07)
|
|
185
|
+
|
|
186
|
+
> **Status: Accepted.** Recorded by `road-to-mcp-full-power.md` Phase 3.
|
|
187
|
+
> User signoff on the `a0-amendment-signoff` blocker plus the council
|
|
188
|
+
> verdict in `agents/decisions/mcp-write-exec-cut-2026-07-07.md` both
|
|
189
|
+
> landed 2026-07-07. Existing Phase 1–6 sections above predate the TS
|
|
190
|
+
> migration (they still reference `scripts/mcp_server/*.py` and a
|
|
191
|
+
> two-tool allowlist) and are known-stale beyond what this amendment
|
|
192
|
+
> covers; a full contract refresh is a separate follow-up, out of scope
|
|
193
|
+
> here.
|
|
194
|
+
|
|
195
|
+
**Named consumer ask.** Operator, 2026-07-07: expose the CLI/script long
|
|
196
|
+
tail (roadmap, telemetry, capabilities, doctor, council, memory, …) through
|
|
197
|
+
MCP in safety tiers, not just the current 9-tool read-only/single-write set.
|
|
198
|
+
|
|
199
|
+
**Safety-tier model** (full classification:
|
|
200
|
+
[`agents/settings/contexts/mcp-tool-tier-map.md`](../../agents/settings/contexts/mcp-tool-tier-map.md)):
|
|
201
|
+
|
|
202
|
+
| Tier | Contract treatment |
|
|
203
|
+
|---|---|
|
|
204
|
+
| `read-only` | May be implemented without further gate — same bar as the existing 9 tools. |
|
|
205
|
+
| `fs-write-in-tree` | May be implemented once path-guarded via `_validateInTreePath` — same pattern as `chat_history_append`. |
|
|
206
|
+
| `shell-exec` | Requires the safety envelope: fixed argv (no shell interpolation of caller-supplied strings), timeout, output truncation, no network access from the spawned process. Implementation requires the Phase 3 council verdict naming it in the cut list. |
|
|
207
|
+
| `network` | Never silent-default. Every call surfaces cost/consequence before executing; billable calls (e.g. `council:run`) require the caller to pass an explicit confirmation flag echoed back in the tool result, not just be callable. |
|
|
208
|
+
| `long-running` | Structurally excluded — not tool-call-shaped (blocks or starts a server). |
|
|
209
|
+
| `hard-floor-never` | **Permanently excluded.** Secrets (`keys:install-*`), the global/outside-repo install (`upgrade`, `global`, `refresh`, `settings:migrate`), and bulk-destructive commands (`uninstall`, `prune`) are never reachable via any MCP tool, bridge, or allowlist entry, under any settings value. This list only grows, never shrinks, without a fresh A0 amendment of its own. |
|
|
210
|
+
|
|
211
|
+
**Deny-by-default, build-time only.** No consumer-settings allowlist ships
|
|
212
|
+
(a `mcp.tools.allow` runtime setting was considered and **rejected** by
|
|
213
|
+
the Phase 3 council — see below). A tool is reachable if and only if it
|
|
214
|
+
was generated into the build from an approved tier-map entry. Enabling a
|
|
215
|
+
new tool is a code change (add the entry, rebuild), never a settings
|
|
216
|
+
edit. `hard-floor-never` tier entries are never generated — the
|
|
217
|
+
exclusion is structural (the tool does not exist in `tools/list`), not a
|
|
218
|
+
runtime rejection.
|
|
219
|
+
|
|
220
|
+
**Bridge shape (Phase 5) — decided: pure build-time codegen.** Every
|
|
221
|
+
approved tool, in every tier including `shell-exec`, is generated at
|
|
222
|
+
build time from `src/cli/registry.ts` metadata plus the tier map — one
|
|
223
|
+
MCP tool per approved command, each with its own JSON Schema. A generic
|
|
224
|
+
`agent_config_cli` tool with a runtime-validated `subcommand` argument
|
|
225
|
+
was considered and rejected: the package's existing `chat_history_append`
|
|
226
|
+
pattern is already a compiled tool with a hardcoded path guard, not a
|
|
227
|
+
generic bridge gated by an editable setting, and the council verdict
|
|
228
|
+
(`agents/decisions/mcp-write-exec-cut-2026-07-07.md`) found the
|
|
229
|
+
runtime-allowlist approach strictly weaker on security grounds for no
|
|
230
|
+
countervailing benefit. Shell-exec tools additionally compile in their
|
|
231
|
+
safety envelope (fixed argv, timeout, output cap, no network) as
|
|
232
|
+
constants, not configuration.
|
|
233
|
+
|
|
234
|
+
**Shell-exec safety review (Phase 5, shipped pilot: `run_tests`).**
|
|
235
|
+
Lethal-trifecta pass for the one approved exec-tier tool:
|
|
236
|
+
|
|
237
|
+
- *Untrusted-content ingestion:* the tool's inputs (`filter`, `path`) come
|
|
238
|
+
from the MCP caller — the same principal that already holds the chat
|
|
239
|
+
surface; no fetched/external content selects what runs. Caller strings
|
|
240
|
+
become literal argv elements via
|
|
241
|
+
`src/scripts/mcp_exec/safety_envelope.ts` (`execFile`, no shell) — a
|
|
242
|
+
hostile string cannot become a second command.
|
|
243
|
+
- *Private-data access:* the spawned vitest run sees the consumer tree,
|
|
244
|
+
same as every fs tool; no credential paths are added to its env.
|
|
245
|
+
- *Egress:* the envelope adds no network I/O of its own. Arbitrary test
|
|
246
|
+
code MAY use the network — that is a property of the project's tests,
|
|
247
|
+
not of the tool; the envelope's guarantees are spawn-surface guarantees
|
|
248
|
+
(no shell, `SIGKILL` timeout, per-stream byte caps), stated as such and
|
|
249
|
+
never marketed as network isolation.
|
|
250
|
+
- *Compiled constants:* 120s timeout, 64KB per-stream cap — code-review
|
|
251
|
+
events, not settings.
|
|
252
|
+
|
|
253
|
+
**Long-running policy (Phase 5) — decided: synchronous truncation.** No
|
|
254
|
+
async job/poll pattern ships: an exec call that exceeds its compiled
|
|
255
|
+
timeout returns `timed_out: true` with the captured, capped output.
|
|
256
|
+
Revisit only if a council-approved tool genuinely cannot fit a
|
|
257
|
+
synchronous budget (e.g. a future `council:run`).
|
|
258
|
+
|
|
184
259
|
## Revision policy
|
|
185
260
|
|
|
186
261
|
This contract is **experimental** — breaking changes are allowed in any
|
|
@@ -14,21 +14,21 @@ keep-beta-until: 2026-08-14
|
|
|
14
14
|
|
|
15
15
|
## Summary
|
|
16
16
|
|
|
17
|
-
- **Total tools:**
|
|
18
|
-
- **By transport:** stdio=
|
|
19
|
-
- **By side-effect:** fs-write=
|
|
20
|
-
- **Discovery-only stubs (no implementation):**
|
|
17
|
+
- **Total tools:** 27
|
|
18
|
+
- **By transport:** stdio=18
|
|
19
|
+
- **By side-effect:** fs-write=8, ro=16, shell=3
|
|
20
|
+
- **Discovery-only stubs (no implementation):** 9
|
|
21
21
|
|
|
22
22
|
## Tools
|
|
23
23
|
|
|
24
24
|
| Tool | Side-effect | Transports | Catalog | Handler |
|
|
25
25
|
|---|---|---|---|---|
|
|
26
|
-
| `lint_skills` | `ro` | stdio | [`consumer_tool_catalog.json:7`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L7) | [`tools.ts:
|
|
27
|
-
| `chat_history_append` | `fs-write` | stdio | [`consumer_tool_catalog.json:24`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L24) | [`tools.ts:
|
|
28
|
-
| `chat_history_read` | `ro` | stdio | [`consumer_tool_catalog.json:43`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L43) | [`tools.ts:
|
|
29
|
-
| `memory_lookup` | `ro` | stdio | [`consumer_tool_catalog.json:59`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L59) | [`tools.ts:
|
|
30
|
-
| `memory_signal` | `fs-write` |
|
|
31
|
-
| `memory_status` | `ro` | stdio | [`consumer_tool_catalog.json:91`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L91) | [`tools.ts:
|
|
26
|
+
| `lint_skills` | `ro` | stdio | [`consumer_tool_catalog.json:7`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L7) | [`tools.ts:1102`](../../src/scripts/mcp_server/tools.ts#L1102) |
|
|
27
|
+
| `chat_history_append` | `fs-write` | stdio | [`consumer_tool_catalog.json:24`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L24) | [`tools.ts:1130`](../../src/scripts/mcp_server/tools.ts#L1130) |
|
|
28
|
+
| `chat_history_read` | `ro` | stdio | [`consumer_tool_catalog.json:43`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L43) | [`tools.ts:1191`](../../src/scripts/mcp_server/tools.ts#L1191) |
|
|
29
|
+
| `memory_lookup` | `ro` | stdio | [`consumer_tool_catalog.json:59`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L59) | [`tools.ts:1233`](../../src/scripts/mcp_server/tools.ts#L1233) |
|
|
30
|
+
| `memory_signal` | `fs-write` | stdio | [`consumer_tool_catalog.json:75`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L75) | [`tools.ts:1360`](../../src/scripts/mcp_server/tools.ts#L1360) |
|
|
31
|
+
| `memory_status` | `ro` | stdio | [`consumer_tool_catalog.json:91`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L91) | [`tools.ts:1275`](../../src/scripts/mcp_server/tools.ts#L1275) |
|
|
32
32
|
| `skill_trigger_eval` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:98`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L98) | _stub-only_ |
|
|
33
33
|
| `suggest_command` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:114`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L114) | _stub-only_ |
|
|
34
34
|
| `suggest_skill_for_task` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:129`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L129) | _stub-only_ |
|
|
@@ -36,13 +36,20 @@ keep-beta-until: 2026-08-14
|
|
|
36
36
|
| `update_form_request_messages` | `fs-write` | _(stub)_ | [`consumer_tool_catalog.json:158`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L158) | _stub-only_ |
|
|
37
37
|
| `sync_gitignore` | `fs-write` | _(stub)_ | [`consumer_tool_catalog.json:173`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L173) | _stub-only_ |
|
|
38
38
|
| `sync_agent_settings` | `fs-write` | _(stub)_ | [`consumer_tool_catalog.json:186`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L186) | _stub-only_ |
|
|
39
|
-
| `run_tests` | `shell` |
|
|
39
|
+
| `run_tests` | `shell` | stdio | [`consumer_tool_catalog.json:200`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L200) | [`tools.ts:1535`](../../src/scripts/mcp_server/tools.ts#L1535) |
|
|
40
40
|
| `run_quality_checks` | `shell` | _(stub)_ | [`consumer_tool_catalog.json:214`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L214) | _stub-only_ |
|
|
41
|
-
| `list_skills` | `ro` | stdio | [`consumer_tool_catalog.json:227`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L227) | [`tools.ts:
|
|
42
|
-
| `list_commands` | `ro` | stdio | [`consumer_tool_catalog.json:234`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L234) | [`tools.ts:
|
|
43
|
-
| `list_rules` | `ro` | stdio | [`consumer_tool_catalog.json:241`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L241) | [`tools.ts:
|
|
41
|
+
| `list_skills` | `ro` | stdio | [`consumer_tool_catalog.json:227`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L227) | [`tools.ts:1289`](../../src/scripts/mcp_server/tools.ts#L1289) |
|
|
42
|
+
| `list_commands` | `ro` | stdio | [`consumer_tool_catalog.json:234`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L234) | [`tools.ts:1304`](../../src/scripts/mcp_server/tools.ts#L1304) |
|
|
43
|
+
| `list_rules` | `ro` | stdio | [`consumer_tool_catalog.json:241`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L241) | [`tools.ts:1319`](../../src/scripts/mcp_server/tools.ts#L1319) |
|
|
44
44
|
| `compile_router` | `shell` | _(stub)_ | [`consumer_tool_catalog.json:248`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L248) | _stub-only_ |
|
|
45
|
-
| `read_resource_body` | `ro` | stdio | [`consumer_tool_catalog.json:261`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L261) | [`tools.ts:
|
|
45
|
+
| `read_resource_body` | `ro` | stdio | [`consumer_tool_catalog.json:261`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L261) | [`tools.ts:1335`](../../src/scripts/mcp_server/tools.ts#L1335) |
|
|
46
|
+
| `roadmap_progress` | `fs-write` | stdio | [`consumer_tool_catalog.json:275`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L275) | [`tools.ts:1394`](../../src/scripts/mcp_server/tools.ts#L1394) |
|
|
47
|
+
| `roadmap_archive` | `fs-write` | stdio | [`consumer_tool_catalog.json:288`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L288) | [`tools.ts:1417`](../../src/scripts/mcp_server/tools.ts#L1417) |
|
|
48
|
+
| `capabilities_index` | `fs-write` | stdio | [`consumer_tool_catalog.json:295`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L295) | [`tools.ts:1433`](../../src/scripts/mcp_server/tools.ts#L1433) |
|
|
49
|
+
| `doctor_report` | `ro` | stdio | [`consumer_tool_catalog.json:308`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L308) | [`tools.ts:1456`](../../src/scripts/mcp_server/tools.ts#L1456) |
|
|
50
|
+
| `conformance_check` | `ro` | stdio | [`consumer_tool_catalog.json:315`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L315) | [`tools.ts:1470`](../../src/scripts/mcp_server/tools.ts#L1470) |
|
|
51
|
+
| `telemetry_report` | `ro` | stdio | [`consumer_tool_catalog.json:322`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L322) | [`tools.ts:1484`](../../src/scripts/mcp_server/tools.ts#L1484) |
|
|
52
|
+
| `council_estimate` | `ro` | stdio | [`consumer_tool_catalog.json:335`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L335) | [`tools.ts:1506`](../../src/scripts/mcp_server/tools.ts#L1506) |
|
|
46
53
|
|
|
47
54
|
## Glossary
|
|
48
55
|
|
|
@@ -5,7 +5,14 @@ keep-beta-until: 2026-09-04
|
|
|
5
5
|
|
|
6
6
|
# Release-PR Gating Contract
|
|
7
7
|
|
|
8
|
-
> **Status:** active · **Owner:** maintainer (`scripts/release.
|
|
8
|
+
> **Status:** active · **Owner:** maintainer (`src/scripts/release.ts`) · **Opened:** 2026-05-26
|
|
9
|
+
>
|
|
10
|
+
> Release PRs are opened by either entry point into `release.ts`: `task
|
|
11
|
+
> release` (interactive, local) or `.github/workflows/release.yml` (the
|
|
12
|
+
> `release`-labeled-PR CI path, author `github-actions[bot]`) — see
|
|
13
|
+
> [`ADR-113`](../decisions/ADR-113-ci-native-release-label-trigger.md).
|
|
14
|
+
> This contract's shape checks are author-agnostic by design; both entry
|
|
15
|
+
> points produce the identical PR shape below.
|
|
9
16
|
>
|
|
10
17
|
> Source: `road-to-optimized-ci-and-release-gates.md` Phase A Step 1. Measured
|
|
11
18
|
> baseline (`gh run list --branch main --limit 50`): `Public Install Smoke`
|
|
@@ -22,21 +29,23 @@ A pull request qualifies as a **release PR** when **both** of the following
|
|
|
22
29
|
hold:
|
|
23
30
|
|
|
24
31
|
1. **Head branch matches** `^release/\d+\.\d+\.\d+$` — same regex as
|
|
25
|
-
`scripts/release.
|
|
32
|
+
`src/scripts/release.ts` § `_RELEASE_BRANCH_RE`.
|
|
26
33
|
2. **Diff file set is a subset of the version-bump allowlist:**
|
|
27
34
|
- `package.json`
|
|
28
35
|
- `CHANGELOG.md`
|
|
29
36
|
- `.claude-plugin/marketplace.json`
|
|
30
37
|
- `packages/*/pack.yaml`
|
|
31
38
|
- `packages/*/README.md`
|
|
32
|
-
- `docs/archive/CHANGELOG-pre-*.md` — emitted by `
|
|
39
|
+
- `docs/archive/CHANGELOG-pre-*.md` — emitted by `release.ts`'s
|
|
33
40
|
automatic CHANGELOG era split (see `docs/contracts/CHANGELOG-conventions.md`
|
|
34
41
|
§ Era splits) when the current era crosses its line cap on an
|
|
35
42
|
era-boundary release.
|
|
36
43
|
|
|
37
|
-
Both predicates are enforced by `scripts/check_release_pr_shape.
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
Both predicates are enforced by `src/scripts/check_release_pr_shape.ts`.
|
|
45
|
+
The script exits 0 when both hold; non-zero with a per-file diff naming any
|
|
46
|
+
out-of-allowlist entry otherwise. It reads the diff shape only — it does
|
|
47
|
+
not check the PR author, so it passes identically for a `task
|
|
48
|
+
release`-opened PR and a `release.yml`-opened one.
|
|
40
49
|
|
|
41
50
|
## Cut surface — heavy jobs that skip on release PRs
|
|
42
51
|
|
|
@@ -76,10 +85,10 @@ the feature-PR floor by adding:
|
|
|
76
85
|
|
|
77
86
|
The optimisation is **opt-in by shape, not by branch name**. A release-PR
|
|
78
87
|
whose diff contains a stray file outside the allowlist (e.g. a last-minute
|
|
79
|
-
CHANGELOG fixup that also touches `scripts/release.
|
|
88
|
+
CHANGELOG fixup that also touches `src/scripts/release.ts`) trips the shape
|
|
80
89
|
detector:
|
|
81
90
|
|
|
82
|
-
1. `check_release_pr_shape.
|
|
91
|
+
1. `check_release_pr_shape.ts` exits non-zero with a per-file diff.
|
|
83
92
|
2. The CI dashboard surfaces "release-shape" red.
|
|
84
93
|
3. The maintainer either narrows the diff (move the script edit to a
|
|
85
94
|
separate PR) or accepts the heavy matrix re-running on the next push.
|
|
@@ -95,7 +104,7 @@ name alone never bypasses the heavy matrix.
|
|
|
95
104
|
- **Not a coverage-reduction contract.** The release-validation jobs are
|
|
96
105
|
additive, not substitutive.
|
|
97
106
|
- **Not a release-velocity contract.** Release cadence is driven by
|
|
98
|
-
Conventional Commits in `scripts/release.
|
|
107
|
+
Conventional Commits in `src/scripts/release.ts`, not by CI cost.
|
|
99
108
|
- **Not a Hard-Floor lift.** No security check is removed.
|
|
100
109
|
`release-guard.yml`'s `assert-version-matches-tag` job is independent of
|
|
101
110
|
`Tests` / `Public Install Smoke` and stays mandatory on every tag.
|
|
@@ -108,6 +117,8 @@ name alone never bypasses the heavy matrix.
|
|
|
108
117
|
cadence (Phase C).
|
|
109
118
|
- `.github/workflows/release-validation.yml` — the tight release-shape
|
|
110
119
|
validation workflow (Phase B).
|
|
111
|
-
- `scripts/check_release_pr_shape.
|
|
112
|
-
- `scripts/release.
|
|
120
|
+
- `src/scripts/check_release_pr_shape.ts` — the shape detector (Phase A).
|
|
121
|
+
- `src/scripts/release.ts` § `_RELEASE_BRANCH_RE` — source of truth for the
|
|
113
122
|
release-branch naming convention.
|
|
123
|
+
- [`ADR-113`](../decisions/ADR-113-ci-native-release-label-trigger.md) — the
|
|
124
|
+
CI-native (`release`-label) entry point into the same script.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Surface Matrix — per-tool canonical-surface contract
|
|
2
|
+
|
|
3
|
+
> Machine-checked inventory of which install surface is canonical per tool,
|
|
4
|
+
> which alternates are legitimate, what counts as a duplicate surface, and
|
|
5
|
+
> how a duplicate converges. One data file replaces 23 hand-maintained
|
|
6
|
+
> special cases (council Q3, 2026-07-07 — see
|
|
7
|
+
> `agents/settings/contexts/claude-code-single-surface-decision.md` for the
|
|
8
|
+
> parent decision).
|
|
9
|
+
|
|
10
|
+
## The file
|
|
11
|
+
|
|
12
|
+
`src/config/surface-matrix.yml` — ships in the npm package, resolved at
|
|
13
|
+
runtime relative to the package root (works from both the tsx dev path and
|
|
14
|
+
the bundled CLI).
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
schema_version: 1
|
|
18
|
+
tools:
|
|
19
|
+
<tool-id>: # must exist in install.ts::USER_SCOPE_PATHS
|
|
20
|
+
surface: projection | plugin | bundles | export-only
|
|
21
|
+
scope_path: "~/..." # must equal USER_SCOPE_PATHS[tool-id]
|
|
22
|
+
hooks: managed-settings-block | settings-hooks-opt-in | plugin | none
|
|
23
|
+
alternates: # optional — legitimate secondary surfaces
|
|
24
|
+
- id: <slug>
|
|
25
|
+
role: <why it is legitimate>
|
|
26
|
+
detail: <prose>
|
|
27
|
+
duplicate: # optional — the duplicate-surface class
|
|
28
|
+
description: <prose>
|
|
29
|
+
detect:
|
|
30
|
+
all_of: [<path>, …] # ~/ = user scope, ./ = package-relative;
|
|
31
|
+
# ALL present ⇒ duplicate surface exists
|
|
32
|
+
# OR, when suspected but unverified:
|
|
33
|
+
pending_evidence: <prose + pointer to the evidence gate>
|
|
34
|
+
converge: # required when detect is defined
|
|
35
|
+
action: <slug>
|
|
36
|
+
command: "<copy-paste fix>"
|
|
37
|
+
reaps: [<path>, …] # package-tagged locations converge may remove
|
|
38
|
+
notes: <provenance>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Semantics
|
|
42
|
+
|
|
43
|
+
- **`surface`** — `projection` (installer writes content into the user
|
|
44
|
+
scope path; that projection is canonical), `plugin` (the tool's own
|
|
45
|
+
plugin channel is canonical — e.g. Copilot, where no user-scope
|
|
46
|
+
projection exists), `bundles` (manual import artifacts, e.g.
|
|
47
|
+
Claude Desktop ZIPs), `export-only` (config/marker export, no content
|
|
48
|
+
tree).
|
|
49
|
+
- **`duplicate.detect.all_of`** — existence checks only, never content
|
|
50
|
+
reads. All paths present ⇒ the duplicate class is live. Tools without a
|
|
51
|
+
`detect` block are never flagged.
|
|
52
|
+
- **`pending_evidence`** — documents a *suspected* class that MUST NOT be
|
|
53
|
+
acted on (doctor ignores it, converge refuses it) until an evidence gate
|
|
54
|
+
defines real detect paths. Current example: Augment
|
|
55
|
+
(`agents/settings/contexts/augment-surface-parity.md`).
|
|
56
|
+
- **`converge`** — the consented cleanup. `converge.reaps` is the
|
|
57
|
+
exhaustive allowlist of what `agent-config converge` may remove for this
|
|
58
|
+
tool; anything outside it is refused (hard floor: never user-authored
|
|
59
|
+
files).
|
|
60
|
+
|
|
61
|
+
## Consumers
|
|
62
|
+
|
|
63
|
+
| Consumer | What it reads | Behavior |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `agent-config doctor` (`surface-state` check) | `duplicate.detect.all_of` | Existence-checks every declared duplicate class; `fail` names the tool + the `converge.command` as copy-paste remedy. The legacy `claude-plugin` check stays as the named first consumer with richer version diagnostics. |
|
|
66
|
+
| `agent-config converge` (+ `upgrade --converge`) | `converge.*` | Performs the per-tool cleanup, only on matrix-declared, package-tagged paths (`converge.reaps`), after consent (`install.auto_converge` or interactive y/N). |
|
|
67
|
+
| `dispatch:hook` `surface-probe` concern | `duplicate.detect.all_of` | Once-per-day SessionStart existence probe; one-line nudge naming the duplicate + the converge command. Fail-open, never blocking. |
|
|
68
|
+
| CI (`task lint-surface-matrix` → `src/scripts/lint_surface_matrix.ts`) | whole file | Set equality with `USER_SCOPE_PATHS`, scope-path drift, enum validity, detect-path resolution, converge-command presence, plugin-id drift guard. |
|
|
69
|
+
|
|
70
|
+
## Onboarding a new tool
|
|
71
|
+
|
|
72
|
+
1. Add the tool to `install.ts::USER_SCOPE_PATHS` (and `SCOPE_SUPPORT`,
|
|
73
|
+
deploy sources) as usual.
|
|
74
|
+
2. Add the matrix entry in the same commit — `lint-surface-matrix` fails
|
|
75
|
+
the build on a missing entry (that is the point: no tool ships without
|
|
76
|
+
a declared canonical surface).
|
|
77
|
+
3. Default shape for a plain projection with no plugin channel:
|
|
78
|
+
`surface: projection`, `hooks: none`, no `duplicate` block.
|
|
79
|
+
4. Only add a `duplicate` block when a second install channel actually
|
|
80
|
+
exists for the tool — and only add `detect.all_of` once the class has
|
|
81
|
+
been reproduced on a real setup (evidence gate; until then use
|
|
82
|
+
`pending_evidence`).
|
|
83
|
+
|
|
84
|
+
## Consent model (converge)
|
|
85
|
+
|
|
86
|
+
- First `agent-config converge` run persists `install.auto_converge: true`
|
|
87
|
+
into the **global** settings file
|
|
88
|
+
(`~/.event4u/agent-config/agent-settings.yml`). The key is read directly
|
|
89
|
+
by the CLI (converge/upgrade); it is intentionally NOT part of the
|
|
90
|
+
`MERGEABLE_KEYS` whitelist — it never merges into project-level agent
|
|
91
|
+
settings and never reaches session context.
|
|
92
|
+
- Plain `upgrade` without the key keeps the print-only prompt (no silent
|
|
93
|
+
mutation of a user-owned surface — council Q2, 2026-07-07).
|
|
94
|
+
- `converge --dry-run` prints the exact actions without touching anything.
|
|
95
|
+
|
|
96
|
+
## See also
|
|
97
|
+
|
|
98
|
+
- `agents/settings/contexts/claude-code-single-surface-decision.md` —
|
|
99
|
+
parent decision (single surface for Claude Code).
|
|
100
|
+
- `agents/settings/contexts/augment-surface-parity.md` — the Augment
|
|
101
|
+
evidence gate that keeps its duplicate class `pending_evidence`.
|
|
102
|
+
- `docs/contracts/skill-distribution-channels.md` — canonical-channel
|
|
103
|
+
contract the matrix operationalizes.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
adr: 111
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-07-07
|
|
5
|
+
decision: canonical-glama-listing
|
|
6
|
+
supersedes: —
|
|
7
|
+
superseded_by: —
|
|
8
|
+
phase: road-to-mcp-full-power
|
|
9
|
+
type: standing
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-111 — the kernel stdio server is the canonical Glama listing; the turnkey server stays unlisted
|
|
13
|
+
|
|
14
|
+
## Status
|
|
15
|
+
|
|
16
|
+
**Accepted** · 2026-07-07 · maintainer decision, Phase 2 of
|
|
17
|
+
`road-to-mcp-full-power.md`.
|
|
18
|
+
|
|
19
|
+
## Context
|
|
20
|
+
|
|
21
|
+
The package now ships two distinct stdio MCP servers with different
|
|
22
|
+
audiences and capability shapes:
|
|
23
|
+
|
|
24
|
+
1. **Kernel stdio server** (`src/scripts/mcp_server/`, started via
|
|
25
|
+
`agent-config mcp:run`) — requires a repo checkout (or the glama build
|
|
26
|
+
step), exposes 430 prompts / 232 resources / 27 catalogued tools (9
|
|
27
|
+
implemented as of Phase 1/4 of this roadmap). This is the server glama.ai
|
|
28
|
+
currently indexes and lists at
|
|
29
|
+
`glama.ai/mcp/servers/event4u-app/agent-config`.
|
|
30
|
+
2. **Turnkey stdio-lite server** (`src/cli/mcp/`, started via
|
|
31
|
+
`agent-config mcp-server`) — zero-setup, reads the bundled
|
|
32
|
+
`dist/agent-src/` + `docs/guidelines/` directly from the installed npm
|
|
33
|
+
package, no repo clone required. Read-only by design (ADR-085): zero
|
|
34
|
+
tools, prompts/resources only.
|
|
35
|
+
|
|
36
|
+
`road-to-glama-registry-listing.md` (archived) already converged on listing
|
|
37
|
+
only the stdio server for a contributor/agent-developer audience, before the
|
|
38
|
+
turnkey server existed in its current form. This ADR re-confirms that choice
|
|
39
|
+
now that both servers are live, and records why a second listing is not
|
|
40
|
+
added.
|
|
41
|
+
|
|
42
|
+
## Decision
|
|
43
|
+
|
|
44
|
+
1. **Glama lists the kernel server only.** `glama.json` and the committed
|
|
45
|
+
`internal/glama/{build,run}` scripts continue to target
|
|
46
|
+
`src/scripts/mcp_server/__main__.ts`. No change to the glama admin
|
|
47
|
+
configuration.
|
|
48
|
+
2. **The turnkey server is not submitted to glama.** Rationale:
|
|
49
|
+
- Glama's value proposition (repo-aware introspection, contributor
|
|
50
|
+
discovery) matches the kernel server's audience — people extending or
|
|
51
|
+
debugging the package itself.
|
|
52
|
+
- The turnkey server's audience (end users who `npx @event4u/agent-config
|
|
53
|
+
mcp-server` for zero-setup client config) is served better by direct
|
|
54
|
+
per-IDE config snippets (`docs/setup/mcp-client-config.md`,
|
|
55
|
+
`docs/getting-started-local-stdio.md`) than by a registry listing that
|
|
56
|
+
would advertise a read-only, tool-less server next to the fuller
|
|
57
|
+
kernel listing under the same package name — a likely source of
|
|
58
|
+
consumer confusion ("why does the glama listing show tools I don't
|
|
59
|
+
get?").
|
|
60
|
+
- Glama's schema (`glama.ai/mcp/schemas/server.json`) supports exactly one
|
|
61
|
+
manifest field (`maintainers`); there is no per-listing scoping
|
|
62
|
+
mechanism to distinguish two servers from the same repo without a
|
|
63
|
+
second, separately-hosted manifest — not worth the maintenance surface
|
|
64
|
+
for a zero-tool server.
|
|
65
|
+
3. **Revisit trigger.** Reopen this decision if either: (a) the turnkey
|
|
66
|
+
server gains tools (Phase 6 of this roadmap may bundle the kernel tool
|
|
67
|
+
surface into the npm package, per the ADR-085 revisit), making its
|
|
68
|
+
capability shape worth discovering separately; or (b) a named consumer
|
|
69
|
+
asks to discover the turnkey server via a registry specifically (not
|
|
70
|
+
just via npm/README).
|
|
71
|
+
|
|
72
|
+
## Consequences
|
|
73
|
+
|
|
74
|
+
- No glama configuration change required by this roadmap.
|
|
75
|
+
- `docs/mcp-registries.md` and `docs/setup/mcp-client-config.md` document
|
|
76
|
+
both entry points, but only one (the kernel server) appears in the glama
|
|
77
|
+
registry — this asymmetry is intentional, not an oversight.
|
|
78
|
+
- Official MCP-registry submission (Phase 2 Step 5 of this roadmap) is
|
|
79
|
+
free to list either or both servers, since that registry's schema is not
|
|
80
|
+
glama's single-manifest-per-repo constraint — evaluated separately.
|
|
81
|
+
|
|
82
|
+
## Alternatives
|
|
83
|
+
|
|
84
|
+
- **List both as separate glama entries.** Rejected — no such thing as
|
|
85
|
+
"the second manifest field" in glama's schema for this repo; would need a
|
|
86
|
+
second cloned/forked registration, disproportionate for a read-only
|
|
87
|
+
zero-tool server.
|
|
88
|
+
- **Drop the kernel listing, list only turnkey.** Rejected — the kernel
|
|
89
|
+
server's tool surface is the entire reason glama's introspection is
|
|
90
|
+
valuable here; a tool-less listing loses that value.
|
|
91
|
+
|
|
92
|
+
## References
|
|
93
|
+
|
|
94
|
+
- `road-to-glama-registry-listing.md` (archived) — original listing decision.
|
|
95
|
+
- `road-to-mcp-stdio-end-user-packaging.md` (archived) — turnkey server origin, ADR-085.
|
|
96
|
+
- `agents/settings/contexts/mcp-tool-tier-map.md` — capability-shape evidence for both servers.
|
|
97
|
+
- `internal/glama/README.md` — the build/run scripts this decision keeps unchanged.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
adr: 112
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-07-07
|
|
5
|
+
decision: stdio-lite-stays-read-only
|
|
6
|
+
supersedes: —
|
|
7
|
+
superseded_by: —
|
|
8
|
+
phase: road-to-mcp-full-power
|
|
9
|
+
type: standing
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-112 — the turnkey stdio-lite server stays read-only; tool users route to the kernel server
|
|
13
|
+
|
|
14
|
+
## Status
|
|
15
|
+
|
|
16
|
+
**Accepted** · 2026-07-07 · maintainer decision, Phase 6 of
|
|
17
|
+
`road-to-mcp-full-power.md`. Resolves the ADR-085 revisit trigger
|
|
18
|
+
("full-kernel bundling deferred — no demand"), which fired via this
|
|
19
|
+
roadmap's named consumer ask.
|
|
20
|
+
|
|
21
|
+
## Context
|
|
22
|
+
|
|
23
|
+
ADR-085 shipped `agent-config mcp-server` (stdio-lite, `src/cli/mcp/`) as
|
|
24
|
+
a read-only, zero-setup surface: prompts + resources from the bundled
|
|
25
|
+
`dist/agent-src/` + `docs/guidelines/`, `tools/list` empty, execution
|
|
26
|
+
deferred until demand existed. Demand now exists — but for the *kernel*
|
|
27
|
+
server: Phases 4–5 of this roadmap shipped 18 implemented tools
|
|
28
|
+
(write-tier + one shell-exec pilot) on `src/scripts/mcp_server/`, all
|
|
29
|
+
requiring a repo checkout and the full script tree
|
|
30
|
+
(`src/agent-src/scripts/`, `src/scripts/_cli/`, the council pricing
|
|
31
|
+
stack, the exec safety envelope).
|
|
32
|
+
|
|
33
|
+
The A1 option (bundle the kernel tool surface into the npm package so
|
|
34
|
+
`agent-config mcp-server` gains tools) was re-evaluated against that
|
|
35
|
+
shipped reality.
|
|
36
|
+
|
|
37
|
+
## Decision
|
|
38
|
+
|
|
39
|
+
1. **Stdio-lite stays read-only.** `agent-config mcp-server` keeps its
|
|
40
|
+
ADR-085 shape: prompts + resources, zero tools, zero setup. No kernel
|
|
41
|
+
bundling.
|
|
42
|
+
2. **Tool users route to the kernel server** (`agent-config mcp:run` on a
|
|
43
|
+
repo checkout). The per-IDE docs present this as the explicit
|
|
44
|
+
trade-off: zero-setup content surface vs. checkout-required execution
|
|
45
|
+
surface.
|
|
46
|
+
3. **Rationale:**
|
|
47
|
+
- The Phase 4/5 handlers import live repo modules (dashboard
|
|
48
|
+
regenerator, archival sweep, doctor/conformance internals, council
|
|
49
|
+
pricing, the exec envelope). Bundling them means shipping and
|
|
50
|
+
version-locking effectively the whole `src/` tree inside the npm
|
|
51
|
+
tarball — the "turnkey" story would inherit the kernel's full
|
|
52
|
+
dependency and drift surface while losing its one virtue:
|
|
53
|
+
nothing-to-break simplicity.
|
|
54
|
+
- The tools mutate the consumer's `agents/` tree and spawn vitest.
|
|
55
|
+
A zero-setup binary that writes and executes on first contact is
|
|
56
|
+
the wrong default posture for the entry-level surface; the kernel
|
|
57
|
+
path's checkout requirement is a natural consent step.
|
|
58
|
+
- Maintaining one execution surface (kernel) instead of two keeps the
|
|
59
|
+
A0 contract, the test suite, and the telemetry story single-homed.
|
|
60
|
+
4. **Revisit trigger:** a named end-user ask for MCP tools *without* a
|
|
61
|
+
repo checkout (e.g. a Claude Desktop user who wants `memory_signal`
|
|
62
|
+
but will not clone). That reopens A1 as its own roadmap with a fresh
|
|
63
|
+
council round — not a silent scope creep on this ADR.
|
|
64
|
+
|
|
65
|
+
## Consequences
|
|
66
|
+
|
|
67
|
+
- `docs/setup/mcp-client-config.md`'s two-entry-point table stays
|
|
68
|
+
accurate as written (local turnkey = read-only content; tools =
|
|
69
|
+
kernel).
|
|
70
|
+
- ADR-111 (Glama lists the kernel only) is reinforced — the listed
|
|
71
|
+
server is also the only tool-bearing one.
|
|
72
|
+
- The Worker remains read-only per `docs/contracts/mcp-cloud-scope.md`;
|
|
73
|
+
nothing in this ADR changes cloud scope.
|
|
74
|
+
|
|
75
|
+
## Alternatives
|
|
76
|
+
|
|
77
|
+
- **A1 full-kernel bundling** — rejected above (dependency surface,
|
|
78
|
+
write/exec-by-default posture, dual maintenance).
|
|
79
|
+
- **Partial bundling (read-only tools only in stdio-lite)** — rejected:
|
|
80
|
+
splits the tool catalog across two servers with different subsets,
|
|
81
|
+
making `implemented_on` client-visible behaviour diverge per entry
|
|
82
|
+
point; the discovery-first catalog would need a third transport
|
|
83
|
+
dimension for marginal gain.
|
|
84
|
+
|
|
85
|
+
## References
|
|
86
|
+
|
|
87
|
+
- ADR-085 — original stdio-lite shape (read-only, execution deferred).
|
|
88
|
+
- ADR-111 — canonical Glama listing (kernel only).
|
|
89
|
+
- `agents/decisions/mcp-write-exec-cut-2026-07-07.md` — the tool cut that
|
|
90
|
+
created the demand this ADR routes.
|
|
91
|
+
- `docs/contracts/mcp-phase-1-scope.md` § Amendment — the execution
|
|
92
|
+
surface this decision keeps single-homed.
|