@gethmy/mcp 2.5.4 → 2.5.6
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 +19 -4
- package/dist/cli.js +1 -7
- package/dist/index.js +0 -6
- package/dist/lib/api-client.js +0 -5
- package/package.json +1 -1
- package/src/api-client.ts +0 -21
- package/src/server.ts +2 -12
- package/src/tui/theme.ts +1 -1
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
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
- **Context Assembly** - token-budget-aware memory injection into AI prompts
|
|
9
|
+
- **5 Global Skills** — `/hmy`, `/hmy-plan`, `/hmy-cleanup`, `/hmy-standup`, `/hmy-memory-prune`, 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
|
+
Five 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: [
|
|
@@ -5034,7 +5028,7 @@ import { isAbsolute, join as join4, resolve, sep as sep2 } from "node:path";
|
|
|
5034
5028
|
import * as p from "@clack/prompts";
|
|
5035
5029
|
|
|
5036
5030
|
// src/tui/theme.ts
|
|
5037
|
-
import
|
|
5031
|
+
import pc from "picocolors";
|
|
5038
5032
|
var symbols = {
|
|
5039
5033
|
harmony: "▲",
|
|
5040
5034
|
check: "✓",
|
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: [
|
package/dist/lib/api-client.js
CHANGED
|
@@ -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
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.
|
|
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> —
|
|
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: [
|
package/src/tui/theme.ts
CHANGED