@gethmy/mcp 2.5.4 → 2.5.5

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/README.md CHANGED
@@ -6,9 +6,8 @@ Enables AI coding agents (Claude Code, OpenAI Codex, Cursor) to interact with yo
6
6
  ## Features
7
7
 
8
8
  - **56 MCP Tools** for full board control, knowledge graph, and workflow plans
9
- - **Knowledge Graph Memory** - persistent memory with entity types, tiers, scopes, and typed relations
10
- - **Active Learning** - auto-extracts lessons, solutions, and error patterns from completed work sessions
11
- - **Context Assembly** - token-budget-aware memory injection into AI prompts
9
+ - **4 Global Skills** — `/hmy`, `/hmy-plan`, `/hmy-cleanup`, `/hmy-standup`, served from the DB-backed [skill hub](../../docs/skills.md) with auto-update and admin-managed versioning
10
+ - **Knowledge Graph Memory** Phase 1 surface: hybrid retrieval (vector + lexical + RRF), session-scoped working memory, activity feed. See [docs/memory.md](../../docs/memory.md)
12
11
  - **GSD Workflow Plans** - plan/execute/verify/done lifecycle with auto card creation
13
12
  - **Card Linking** - create relationships between cards (blocks, relates_to, duplicates, is_part_of)
14
13
  - **Prompt Builder** - generate AI-ready prompts from cards with context
@@ -16,7 +15,7 @@ Enables AI coding agents (Claude Code, OpenAI Codex, Cursor) to interact with yo
16
15
  - **Auto-Session Detection** - automatically starts/ends sessions when agents interact with cards
17
16
  - **Auto-Assignment** - automatically assign cards to you when starting agent sessions
18
17
  - **Memory Sync** - bidirectional sync between local markdown files and remote database
19
- - **Multi-Agent Support** - works with Claude Code, Codex, Cursor
18
+ - **Multi-Agent Support** - works with Claude Code, Codex, Cursor, Claude.ai
20
19
  - **Smart Setup** - one command configures everything
21
20
  - **API Key Authentication** - no database credentials required
22
21
 
@@ -155,6 +154,10 @@ npx @gethmy/mcp serve # Start MCP server
155
154
 
156
155
  ## Skills
157
156
 
157
+ Four global skills ship with the MCP server and are installed automatically by `npx @gethmy/mcp setup`. They live in the `skill_resource` Postgres table, are fetched via `GET /v1/skills/<name>`, and render-time composed with a shared auto-update preamble.
158
+
159
+ For the full skill hub architecture (storage, versioning, auto-update, admin management), see [docs/skills.md](../../docs/skills.md).
160
+
158
161
  ### `/hmy` — Card Workflow
159
162
 
160
163
  When you start working on a card (e.g., `/hmy #42`):
@@ -191,6 +194,18 @@ A single command for both creating and executing plans. It auto-detects intent b
191
194
  3. Offers options: create single card, create multiple cards, analyze only, or skip
192
195
  4. Creates cards and advances the plan phase
193
196
 
197
+ ### `/hmy-cleanup` — Board Audit
198
+
199
+ Scans the board for stale cards — long-idle, missing owners, or stuck in review — and proposes cleanup actions. Read-only by default; opt-in to apply suggestions.
200
+
201
+ ### `/hmy-standup` — Daily Summary
202
+
203
+ Generates a structured standup summary: what shipped, what's in progress, what's blocked, and where agents need input. Pulls from card activity, plan progress, and the memory activity feed.
204
+
205
+ ### Auto-Update
206
+
207
+ Every skill ships with an `hmy-update-check` preamble that fires on invocation. It compares local versions against `/v1/skills/version` and prompts (or silently auto-installs, if `~/.hmy/config.yaml` has `auto_upgrade: true`). Snooze levels: 24h / 48h / 7d.
208
+
194
209
  ## Available Tools
195
210
 
196
211
  ### Card Operations
package/dist/cli.js CHANGED
@@ -1321,11 +1321,6 @@ class HarmonyApiClient {
1321
1321
  async fetchSkill(name) {
1322
1322
  return this.request("GET", `/skills/${encodeURIComponent(name)}`);
1323
1323
  }
1324
- async recordSkillInvocation(name) {
1325
- try {
1326
- await this.request("POST", "/skills/telemetry", { name });
1327
- } catch {}
1328
- }
1329
1324
  async listWorkspaces() {
1330
1325
  return this.request("GET", "/workspaces");
1331
1326
  }
@@ -3667,7 +3662,6 @@ function registerHandlers(server, deps) {
3667
3662
  throw new Error(`Cannot read skill "${name}": Harmony MCP server is not configured. Run \`hmy-mcp setup\`.`);
3668
3663
  }
3669
3664
  const client3 = deps.getClient();
3670
- client3.recordSkillInvocation(name);
3671
3665
  const fetched = await client3.fetchSkill(name);
3672
3666
  return {
3673
3667
  contents: [
package/dist/index.js CHANGED
@@ -1317,11 +1317,6 @@ class HarmonyApiClient {
1317
1317
  async fetchSkill(name) {
1318
1318
  return this.request("GET", `/skills/${encodeURIComponent(name)}`);
1319
1319
  }
1320
- async recordSkillInvocation(name) {
1321
- try {
1322
- await this.request("POST", "/skills/telemetry", { name });
1323
- } catch {}
1324
- }
1325
1320
  async listWorkspaces() {
1326
1321
  return this.request("GET", "/workspaces");
1327
1322
  }
@@ -3663,7 +3658,6 @@ function registerHandlers(server, deps) {
3663
3658
  throw new Error(`Cannot read skill "${name}": Harmony MCP server is not configured. Run \`hmy-mcp setup\`.`);
3664
3659
  }
3665
3660
  const client3 = deps.getClient();
3666
- client3.recordSkillInvocation(name);
3667
3661
  const fetched = await client3.fetchSkill(name);
3668
3662
  return {
3669
3663
  contents: [
@@ -924,11 +924,6 @@ class HarmonyApiClient {
924
924
  async fetchSkill(name) {
925
925
  return this.request("GET", `/skills/${encodeURIComponent(name)}`);
926
926
  }
927
- async recordSkillInvocation(name) {
928
- try {
929
- await this.request("POST", "/skills/telemetry", { name });
930
- } catch {}
931
- }
932
927
  async listWorkspaces() {
933
928
  return this.request("GET", "/workspaces");
934
929
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gethmy/mcp",
3
- "version": "2.5.4",
3
+ "version": "2.5.5",
4
4
  "description": "MCP server for Harmony Kanban board - enables AI coding agents to manage your boards",
5
5
  "publishConfig": {
6
6
  "access": "public"
package/src/api-client.ts CHANGED
@@ -358,27 +358,6 @@ export class HarmonyApiClient {
358
358
  return this.request("GET", `/skills/${encodeURIComponent(name)}`);
359
359
  }
360
360
 
361
- /**
362
- * POST /v1/skills/telemetry — fire-and-forget activation signal.
363
- * Called from the ReadResourceRequest handler when an agent reads
364
- * a harmony://skills/<name> resource. Increments invocation_count +
365
- * sets last_used = now() on the matching skill_resource row.
366
- *
367
- * Best-effort: returns void; never throws. If the endpoint doesn't
368
- * exist yet (pre-Phase-2 backend), or the network is flaky, the
369
- * activation is dropped silently. The skill content read itself
370
- * is NOT gated on this call succeeding.
371
- */
372
- async recordSkillInvocation(name: string): Promise<void> {
373
- try {
374
- await this.request("POST", "/skills/telemetry", { name });
375
- } catch {
376
- // Fire-and-forget: any failure (404 if endpoint not deployed yet,
377
- // 401 if API key rotated, network timeout) is swallowed so the
378
- // caller can proceed with serving content.
379
- }
380
- }
381
-
382
361
  // ============ WORKSPACE OPERATIONS ============
383
362
 
384
363
  async listWorkspaces(): Promise<{ workspaces: unknown[] }> {
package/src/server.ts CHANGED
@@ -1533,9 +1533,7 @@ export const RESOURCES = [
1533
1533
  /**
1534
1534
  * Build the dynamic resource list. Skill resources (harmony://skills/<name>)
1535
1535
  * are derived at request time from /v1/skills/version so the list always
1536
- * matches what the agent will get on read. Phase 1 of card #162 — the
1537
- * ReadResourceRequest on harmony://skills/<name> is the activation signal
1538
- * for skill telemetry.
1536
+ * matches what the agent will get on read.
1539
1537
  *
1540
1538
  * Offline / unauthenticated → returns just the static RESOURCES. Agents
1541
1539
  * that can't reach the API still see the context resource and any error
@@ -1716,11 +1714,7 @@ export function registerHandlers(server: Server, deps: ToolDeps): void {
1716
1714
  };
1717
1715
  }
1718
1716
 
1719
- // harmony://skills/<name> — Phase 1 of card #162. This read IS the
1720
- // activation event: agent matched the skill's description, harness
1721
- // calls ReadResource, we fire fire-and-forget telemetry before
1722
- // returning the body. recordSkillInvocation() swallows all errors
1723
- // so a telemetry outage never blocks skill delivery.
1717
+ // harmony://skills/<name> — serve the rendered SKILL.md.
1724
1718
  const SKILL_URI_RE = /^harmony:\/\/skills\/([a-z0-9][a-z0-9-]*[a-z0-9])$/;
1725
1719
  const skillMatch = uri.match(SKILL_URI_RE);
1726
1720
  if (skillMatch) {
@@ -1731,10 +1725,6 @@ export function registerHandlers(server: Server, deps: ToolDeps): void {
1731
1725
  );
1732
1726
  }
1733
1727
  const client = deps.getClient();
1734
- // Fire-and-forget BEFORE awaiting the content fetch so a slow
1735
- // telemetry endpoint never delays skill delivery. The promise
1736
- // is intentionally dropped (caught inside recordSkillInvocation).
1737
- void client.recordSkillInvocation(name);
1738
1728
  const fetched = await client.fetchSkill(name);
1739
1729
  return {
1740
1730
  contents: [