@event4u/agent-config 1.40.0 → 1.41.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.
@@ -41,6 +41,7 @@ from typing import Any
41
41
  _SCRIPTS_DIR = Path(__file__).resolve().parent
42
42
  sys.path.insert(0, str(_SCRIPTS_DIR))
43
43
 
44
+ from mcp_server.catalog import load_raw as load_tool_catalog_raw # noqa: E402
44
45
  from mcp_server.prompts import scan_commands, scan_skills # noqa: E402
45
46
  from mcp_server.resources import scan_contexts, scan_guidelines, scan_rules # noqa: E402
46
47
 
@@ -130,11 +131,15 @@ def _collect_entries(root: Path) -> tuple[dict[str, dict[str, Any]], list[str]]:
130
131
  return uris, errors
131
132
 
132
133
 
133
- def _content_signature(uris: dict[str, dict[str, Any]]) -> tuple[str, str]:
134
- """SHA-256 over sorted (uri, body) pairs.
134
+ def _content_signature(
135
+ uris: dict[str, dict[str, Any]],
136
+ tool_catalog: dict[str, Any],
137
+ ) -> tuple[str, str]:
138
+ """SHA-256 over sorted (uri, body) pairs plus the tool catalog JSON.
135
139
 
136
140
  Returns (full_hex, 12-char prefix). The prefix is the wire-surface
137
141
  `skillSetSignature`; the full hex is the diagnostic `content_hash_sha256`.
142
+ Including the catalog ensures a stub edit produces a new release_key.
138
143
  """
139
144
  hasher = hashlib.sha256()
140
145
  for uri in sorted(uris):
@@ -142,6 +147,10 @@ def _content_signature(uris: dict[str, dict[str, Any]]) -> tuple[str, str]:
142
147
  hasher.update(b"\x00")
143
148
  hasher.update(uris[uri]["body"].encode("utf-8"))
144
149
  hasher.update(b"\x1e")
150
+ hasher.update(b"\x1d")
151
+ hasher.update(
152
+ json.dumps(tool_catalog, ensure_ascii=False, sort_keys=True).encode("utf-8")
153
+ )
145
154
  digest = hasher.hexdigest()
146
155
  return digest, digest[:12]
147
156
 
@@ -164,6 +173,7 @@ def _build_manifest(
164
173
  git_sha: str,
165
174
  built_at: str,
166
175
  counts: dict[str, int],
176
+ tool_count: int,
167
177
  ) -> dict[str, Any]:
168
178
  short = git_sha[:7] if git_sha and git_sha != "0" * 40 else "unknown"
169
179
  return {
@@ -176,6 +186,7 @@ def _build_manifest(
176
186
  "built_at": built_at,
177
187
  "packer_version": PACKER_VERSION,
178
188
  "content_uri_count": counts,
189
+ "tool_count": tool_count,
179
190
  }
180
191
 
181
192
 
@@ -188,7 +199,8 @@ def pack(root: Path, out_dir: Path) -> dict[str, Any]:
188
199
  sys.stderr.write(f" - {line}\n")
189
200
  raise SystemExit(2)
190
201
 
191
- content_hash, signature = _content_signature(uris)
202
+ tool_catalog = load_tool_catalog_raw()
203
+ content_hash, signature = _content_signature(uris, tool_catalog)
192
204
  counts = _count_kinds(uris)
193
205
  built_at = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
194
206
  manifest = _build_manifest(
@@ -198,11 +210,13 @@ def pack(root: Path, out_dir: Path) -> dict[str, Any]:
198
210
  git_sha=_git_sha(root),
199
211
  built_at=built_at,
200
212
  counts=counts,
213
+ tool_count=len(tool_catalog.get("tools", [])),
201
214
  )
202
215
 
203
216
  blob = {
204
217
  "schema_version": SCHEMA_VERSION,
205
218
  "uris": uris,
219
+ "tool_catalog": tool_catalog,
206
220
  "manifest": manifest,
207
221
  }
208
222
  # Compact JSON for the bundle (saves ~20 KB vs indent=2). The R2
@@ -265,7 +279,7 @@ def main(argv: list[str] | None = None) -> int:
265
279
  f"release={manifest['release_key']} "
266
280
  f"skills={c['skill']} commands={c['command']} "
267
281
  f"rules={c['rule']} guidelines={c['guideline']} "
268
- f"contexts={c['context']}\n"
282
+ f"contexts={c['context']} tools={manifest['tool_count']}\n"
269
283
  )
270
284
  return 0
271
285
 
@@ -5,8 +5,9 @@
5
5
  "//3": " Windows %APPDATA%\\Claude\\claude_desktop_config.json",
6
6
  "//4": " Linux ~/.config/Claude/claude_desktop_config.json",
7
7
  "//5": "Strip the leading '_disabled_' prefix on the mcpServers entry below to enable the MCP connector.",
8
- "//6": "Hosted endpoint is read-only and identity-stable per release; full client setup details in docs/setup/mcp-client-config.md.",
9
- "//7": "Restart Claude Desktop fully (Cmd+Q on macOS) after editing the menubar process keeps the old config cached otherwise.",
8
+ "//6": "Replace https://your-worker.workers.dev with the URL of your own deployed Cloudflare Worker (see docs/setup/mcp-cloud-setup.md). The Worker is read-only and identity-stable per release; full client setup details in docs/setup/mcp-client-config.md.",
9
+ "//7": "If your Worker has MCP-Token set (recommended), uncomment the --header / env lines below and paste the token. Otherwise drop them.",
10
+ "//8": "Restart Claude Desktop fully (Cmd+Q on macOS) after editing — the menubar process keeps the old config cached otherwise.",
10
11
 
11
12
  "_disabled_mcpServers": {
12
13
  "agent-config": {
@@ -14,7 +15,7 @@
14
15
  "args": [
15
16
  "-y",
16
17
  "mcp-remote",
17
- "https://agent-config-mcp.event4u.workers.dev"
18
+ "https://your-worker.workers.dev"
18
19
  ]
19
20
  }
20
21
  }