harmony-mcp 1.5.0 → 1.5.2
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 +120 -141
- package/dist/cli.js +19 -18
- package/dist/index.js +10 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# harmony-mcp
|
|
2
2
|
|
|
3
|
-
MCP (Model Context Protocol) server for Harmony
|
|
3
|
+
MCP (Model Context Protocol) server for [Harmony](https://gethmy.com).
|
|
4
|
+
Enables AI coding agents (Claude Code, OpenAI Codex, Cursor, Windsurf) to interact with your Harmony boards.
|
|
4
5
|
|
|
5
6
|
## Features
|
|
6
7
|
|
|
@@ -10,69 +11,84 @@ MCP (Model Context Protocol) server for Harmony Kanban board. Enables AI coding
|
|
|
10
11
|
- **Agent Session Tracking** - track work progress with timer badges
|
|
11
12
|
- **Auto-Assignment** - automatically assign cards to you when starting agent sessions
|
|
12
13
|
- **Multi-Agent Support** - works with Claude Code, Codex, Cursor, Windsurf
|
|
13
|
-
- **
|
|
14
|
+
- **Smart Setup** - one command configures everything
|
|
14
15
|
- **Natural Language Processing** via voice-nlu edge function
|
|
15
16
|
- **API Key Authentication** - no database credentials required
|
|
16
17
|
|
|
17
18
|
## Quick Start
|
|
18
19
|
|
|
19
|
-
### 1.
|
|
20
|
+
### 1. Get an API Key
|
|
20
21
|
|
|
21
22
|
1. Log into [Harmony](https://gethmy.com)
|
|
22
|
-
2. Go to **
|
|
23
|
+
2. Go to **[API Keys](https://gethmy.com/user/keys)**
|
|
23
24
|
3. Click **"Generate New Key"**
|
|
24
|
-
4. Copy the key (
|
|
25
|
+
4. Copy the key (starts with `hmy_`)
|
|
25
26
|
|
|
26
|
-
### 2. Run Setup
|
|
27
|
+
### 2. Run Setup
|
|
27
28
|
|
|
28
29
|
```bash
|
|
29
30
|
npx harmony-mcp setup
|
|
30
31
|
```
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
- Prompt for your API key
|
|
34
|
-
- Auto-detect your installed AI agents (Claude Code, Cursor, Windsurf, Codex)
|
|
35
|
-
- Configure all detected agents automatically
|
|
36
|
-
- Optionally install globally for faster startup
|
|
33
|
+
The smart setup wizard will:
|
|
37
34
|
|
|
38
|
-
|
|
35
|
+
- Validate your API key
|
|
36
|
+
- Detect installed AI agents (Claude Code, Cursor, Windsurf, Codex)
|
|
37
|
+
- Install skills globally (recommended) or locally
|
|
38
|
+
- Let you select your workspace and project
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
That's it! You're ready to use Harmony with your AI agent.
|
|
41
|
+
|
|
42
|
+
### Adding to a New Project
|
|
43
|
+
|
|
44
|
+
Just run setup again in the new project directory:
|
|
41
45
|
|
|
42
46
|
```bash
|
|
43
|
-
|
|
44
|
-
harmony-mcp setup
|
|
47
|
+
cd my-new-project
|
|
48
|
+
npx harmony-mcp setup
|
|
45
49
|
```
|
|
46
50
|
|
|
47
|
-
|
|
51
|
+
It detects your existing configuration and only asks for the project context.
|
|
48
52
|
|
|
49
|
-
|
|
53
|
+
## CLI Commands
|
|
50
54
|
|
|
51
55
|
```bash
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
# Setup (recommended)
|
|
57
|
+
npx harmony-mcp setup # Smart setup wizard
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
# Setup with flags (non-interactive)
|
|
60
|
+
npx harmony-mcp setup --api-key KEY --global --workspace ID --project ID
|
|
56
61
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
62
|
+
# Status and management
|
|
63
|
+
npx harmony-mcp status # Show current configuration
|
|
64
|
+
npx harmony-mcp reset # Clear all configuration
|
|
65
|
+
|
|
66
|
+
# Server (called by agents automatically)
|
|
67
|
+
npx harmony-mcp serve # Start MCP server
|
|
66
68
|
```
|
|
67
69
|
|
|
70
|
+
### Setup Options
|
|
71
|
+
|
|
72
|
+
| Flag | Description |
|
|
73
|
+
| -------------------------- | ---------------------------------------------------- |
|
|
74
|
+
| `-k, --api-key <key>` | API key (skips prompt) |
|
|
75
|
+
| `-e, --email <email>` | Your email for auto-assignment |
|
|
76
|
+
| `-a, --agents <agents...>` | Agents to configure: claude, codex, cursor, windsurf |
|
|
77
|
+
| `-g, --global` | Install skills globally (recommended) |
|
|
78
|
+
| `-l, --local` | Install skills locally in project directory |
|
|
79
|
+
| `-w, --workspace <id>` | Set workspace context |
|
|
80
|
+
| `-p, --project <id>` | Set project context |
|
|
81
|
+
| `--skip-context` | Skip workspace/project selection |
|
|
82
|
+
| `-f, --force` | Overwrite existing configuration |
|
|
83
|
+
|
|
68
84
|
## Supported AI Agents
|
|
69
85
|
|
|
70
|
-
| Agent |
|
|
71
|
-
| ---------------- |
|
|
72
|
-
| **Claude Code** | `~/.claude/settings.json` |
|
|
73
|
-
| **OpenAI Codex** |
|
|
74
|
-
| **Cursor** | `.cursor/mcp.json` |
|
|
75
|
-
| **Windsurf** | `~/.codeium/windsurf/mcp_config.json` |
|
|
86
|
+
| Agent | Workflow Command | Config Location |
|
|
87
|
+
| ---------------- | ------------------------ | ------------------------------------- |
|
|
88
|
+
| **Claude Code** | `/hmy #42` | `~/.claude/settings.json` |
|
|
89
|
+
| **OpenAI Codex** | `/prompts:hmy #42` | `~/.codex/config.toml` |
|
|
90
|
+
| **Cursor** | MCP tools auto-available | `.cursor/mcp.json` |
|
|
91
|
+
| **Windsurf** | MCP tools auto-available | `~/.codeium/windsurf/mcp_config.json` |
|
|
76
92
|
|
|
77
93
|
## Card Workflow
|
|
78
94
|
|
|
@@ -81,40 +97,11 @@ When you start working on a card (e.g., `/hmy #42`):
|
|
|
81
97
|
1. **Find** - Locates the card by short ID, UUID, or name
|
|
82
98
|
2. **Move** - Moves the card to "In Progress" column
|
|
83
99
|
3. **Label** - Adds the "agent" label to indicate AI is working
|
|
84
|
-
4. **Assign** - Auto-assigns the card to you (if
|
|
100
|
+
4. **Assign** - Auto-assigns the card to you (if email is configured)
|
|
85
101
|
5. **Track** - Starts a session timer visible in the UI
|
|
86
102
|
6. **Implement** - Work on the task with progress updates
|
|
87
103
|
7. **Complete** - Move to "Review" when done
|
|
88
104
|
|
|
89
|
-
## CLI Commands
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
# Setup (recommended)
|
|
93
|
-
harmony-mcp setup # Interactive setup wizard (recommended)
|
|
94
|
-
|
|
95
|
-
# Legacy configuration commands
|
|
96
|
-
harmony-mcp configure # Set up API key (interactive)
|
|
97
|
-
harmony-mcp configure -k KEY -e EMAIL # Set up with API key and email
|
|
98
|
-
harmony-mcp init # Initialize for AI agents (interactive)
|
|
99
|
-
harmony-mcp init --all # Configure all supported agents
|
|
100
|
-
harmony-mcp init --detect # Auto-detect and configure installed agents
|
|
101
|
-
harmony-mcp init --agent X Y # Configure specific agents
|
|
102
|
-
harmony-mcp init -w WS -p PROJ # Initialize with local workspace/project context
|
|
103
|
-
|
|
104
|
-
# Status and management
|
|
105
|
-
harmony-mcp status # Show current config (global and local)
|
|
106
|
-
harmony-mcp reset # Clear configuration
|
|
107
|
-
harmony-mcp set-workspace ID # Set active workspace (global)
|
|
108
|
-
harmony-mcp set-workspace ID -l # Set active workspace (local project)
|
|
109
|
-
harmony-mcp set-project ID # Set active project (global)
|
|
110
|
-
harmony-mcp set-project ID -l # Set active project (local project)
|
|
111
|
-
harmony-mcp set-user-email EMAIL # Set email for auto-assignment
|
|
112
|
-
harmony-mcp clear-user-email # Disable auto-assignment
|
|
113
|
-
|
|
114
|
-
# Server
|
|
115
|
-
harmony-mcp serve # Start MCP server
|
|
116
|
-
```
|
|
117
|
-
|
|
118
105
|
## Available Tools
|
|
119
106
|
|
|
120
107
|
### Card Operations
|
|
@@ -197,6 +184,7 @@ harmony-mcp serve # Start MCP server
|
|
|
197
184
|
| `customConstraints` | Additional instructions to append |
|
|
198
185
|
|
|
199
186
|
**Variants:**
|
|
187
|
+
|
|
200
188
|
- `analysis` - Understand the problem and create a plan
|
|
201
189
|
- `draft` - Design a solution approach
|
|
202
190
|
- `execute` - Full implementation (default)
|
|
@@ -208,74 +196,58 @@ The prompt builder automatically infers the agent role based on card labels (bug
|
|
|
208
196
|
You can also call the Harmony API directly from any HTTP client:
|
|
209
197
|
|
|
210
198
|
```bash
|
|
211
|
-
curl -X GET "https://gethmy.com/api/workspaces" \
|
|
199
|
+
curl -X GET "https://gethmy.com/api/v1/workspaces" \
|
|
212
200
|
-H "X-API-Key: hmy_your_key_here"
|
|
213
201
|
```
|
|
214
202
|
|
|
215
203
|
### API Endpoints
|
|
216
204
|
|
|
217
|
-
| Endpoint
|
|
218
|
-
|
|
|
219
|
-
| `/workspaces` | GET | List workspaces |
|
|
220
|
-
| `/workspaces/:id/projects` | GET | List projects in workspace |
|
|
221
|
-
| `/workspaces/:id/members` | GET | Get workspace members |
|
|
222
|
-
| `/board/:projectId` | GET | Get full board state |
|
|
223
|
-
| `/cards` | POST | Create card |
|
|
224
|
-
| `/cards/:id` | GET | Get card |
|
|
225
|
-
| `/cards/:id` | PATCH | Update card |
|
|
226
|
-
| `/cards/:id` | DELETE | Delete card |
|
|
227
|
-
| `/cards/:id/move` | POST | Move card |
|
|
228
|
-
| `/search?q=query` | GET | Search cards |
|
|
229
|
-
| `/columns` | POST | Create column |
|
|
230
|
-
| `/columns/:id` | PATCH | Update column |
|
|
231
|
-
| `/columns/:id` | DELETE | Delete column |
|
|
232
|
-
| `/labels` | POST | Create label |
|
|
233
|
-
| `/cards/:id/labels` | POST | Add label to card |
|
|
234
|
-
| `/cards/:id/labels/:labelId` | DELETE | Remove label |
|
|
235
|
-
| `/subtasks` | POST | Create subtask |
|
|
236
|
-
| `/subtasks/:id/toggle` | POST | Toggle subtask |
|
|
237
|
-
| `/subtasks/:id` | DELETE | Delete subtask |
|
|
238
|
-
| `/cards/:id/links` | GET | Get card links |
|
|
239
|
-
| `/cards/:id/links` | POST | Create card link |
|
|
240
|
-
| `/links/:id` | DELETE | Delete card link |
|
|
241
|
-
| `/cards/:id/prompt` | GET | Generate prompt from card |
|
|
242
|
-
| `/nlu` | POST | Process natural language |
|
|
205
|
+
| Endpoint | Method | Description |
|
|
206
|
+
| ------------------------------- | ------ | -------------------------- |
|
|
207
|
+
| `/v1/workspaces` | GET | List workspaces |
|
|
208
|
+
| `/v1/workspaces/:id/projects` | GET | List projects in workspace |
|
|
209
|
+
| `/v1/workspaces/:id/members` | GET | Get workspace members |
|
|
210
|
+
| `/v1/board/:projectId` | GET | Get full board state |
|
|
211
|
+
| `/v1/cards` | POST | Create card |
|
|
212
|
+
| `/v1/cards/:id` | GET | Get card |
|
|
213
|
+
| `/v1/cards/:id` | PATCH | Update card |
|
|
214
|
+
| `/v1/cards/:id` | DELETE | Delete card |
|
|
215
|
+
| `/v1/cards/:id/move` | POST | Move card |
|
|
216
|
+
| `/v1/search?q=query` | GET | Search cards |
|
|
217
|
+
| `/v1/columns` | POST | Create column |
|
|
218
|
+
| `/v1/columns/:id` | PATCH | Update column |
|
|
219
|
+
| `/v1/columns/:id` | DELETE | Delete column |
|
|
220
|
+
| `/v1/labels` | POST | Create label |
|
|
221
|
+
| `/v1/cards/:id/labels` | POST | Add label to card |
|
|
222
|
+
| `/v1/cards/:id/labels/:labelId` | DELETE | Remove label |
|
|
223
|
+
| `/v1/subtasks` | POST | Create subtask |
|
|
224
|
+
| `/v1/subtasks/:id/toggle` | POST | Toggle subtask |
|
|
225
|
+
| `/v1/subtasks/:id` | DELETE | Delete subtask |
|
|
226
|
+
| `/v1/cards/:id/links` | GET | Get card links |
|
|
227
|
+
| `/v1/cards/:id/links` | POST | Create card link |
|
|
228
|
+
| `/v1/links/:id` | DELETE | Delete card link |
|
|
229
|
+
| `/v1/cards/:id/prompt` | GET | Generate prompt from card |
|
|
230
|
+
| `/v1/nlu` | POST | Process natural language |
|
|
243
231
|
|
|
244
232
|
## Configuration
|
|
245
233
|
|
|
246
234
|
### Global Configuration
|
|
247
235
|
|
|
248
|
-
|
|
236
|
+
Stored in `~/.harmony-mcp/config.json`:
|
|
249
237
|
|
|
250
238
|
```json
|
|
251
239
|
{
|
|
252
240
|
"apiKey": "hmy_...",
|
|
253
241
|
"apiUrl": "https://gethmy.com/api",
|
|
242
|
+
"userEmail": "you@example.com",
|
|
254
243
|
"activeWorkspaceId": null,
|
|
255
|
-
"activeProjectId": null
|
|
256
|
-
"userEmail": "you@example.com"
|
|
244
|
+
"activeProjectId": null
|
|
257
245
|
}
|
|
258
246
|
```
|
|
259
247
|
|
|
260
|
-
### Auto-Assignment
|
|
261
|
-
|
|
262
|
-
When `userEmail` is configured, cards are automatically assigned to you when you start an agent session (e.g., via `/hmy #42`). This helps track who is working on what.
|
|
263
|
-
|
|
264
|
-
To enable auto-assignment:
|
|
265
|
-
```bash
|
|
266
|
-
harmony-mcp set-user-email you@example.com
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
To disable auto-assignment:
|
|
270
|
-
```bash
|
|
271
|
-
harmony-mcp clear-user-email
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
The email must match your Harmony account email to work correctly.
|
|
275
|
-
|
|
276
248
|
### Local Project Configuration
|
|
277
249
|
|
|
278
|
-
|
|
250
|
+
Stored in `.harmony-mcp.json` in your project root:
|
|
279
251
|
|
|
280
252
|
```json
|
|
281
253
|
{
|
|
@@ -288,45 +260,52 @@ For multi-project workflows, you can set project-specific context using local co
|
|
|
288
260
|
|
|
289
261
|
**Security**: API key is never stored locally (only in global config) to prevent accidental commits.
|
|
290
262
|
|
|
291
|
-
|
|
263
|
+
### Auto-Assignment
|
|
292
264
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
265
|
+
When your email is configured during setup, cards are automatically assigned to you when you start an agent session (e.g., via `/hmy #42`). This helps track who is working on what.
|
|
266
|
+
|
|
267
|
+
To update your email:
|
|
296
268
|
|
|
297
|
-
|
|
298
|
-
harmony-mcp
|
|
299
|
-
harmony-mcp set-project <id> --local
|
|
269
|
+
```bash
|
|
270
|
+
npx harmony-mcp setup --email you@example.com
|
|
300
271
|
```
|
|
301
272
|
|
|
302
|
-
|
|
273
|
+
The email must match your Harmony account email to work correctly.
|
|
274
|
+
|
|
275
|
+
### Viewing Configuration
|
|
303
276
|
|
|
304
277
|
```bash
|
|
305
|
-
harmony-mcp status
|
|
278
|
+
npx harmony-mcp status
|
|
306
279
|
```
|
|
307
280
|
|
|
308
281
|
Example output:
|
|
309
282
|
|
|
310
283
|
```
|
|
311
284
|
Status: Configured
|
|
312
|
-
API Key: hmy_abc1...
|
|
313
|
-
API URL: https://gethmy.com/api
|
|
314
|
-
User Email: y***@example.com
|
|
315
|
-
|
|
316
|
-
Global Context:
|
|
317
|
-
Workspace: <global-ws-id>
|
|
318
|
-
Project: <global-proj-id>
|
|
319
|
-
|
|
320
|
-
Local Context (.harmony-mcp.json):
|
|
321
|
-
Workspace: <local-ws-id>
|
|
322
|
-
Project: <local-proj-id>
|
|
323
285
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
286
|
+
API:
|
|
287
|
+
Key: hmy_abc1...
|
|
288
|
+
URL: https://gethmy.com/api
|
|
289
|
+
Email: y***@example.com
|
|
290
|
+
|
|
291
|
+
Skills:
|
|
292
|
+
Installed: Yes (global)
|
|
293
|
+
~/.agents/skills/hmy/SKILL.md
|
|
294
|
+
|
|
295
|
+
Context:
|
|
296
|
+
Local config: .harmony-mcp.json
|
|
297
|
+
Workspace: my-team-id
|
|
298
|
+
Project: my-project-id
|
|
299
|
+
Global config: ~/.harmony-mcp/config.json
|
|
300
|
+
Workspace: (not set)
|
|
301
|
+
Project: (not set)
|
|
302
|
+
|
|
303
|
+
Active (effective):
|
|
304
|
+
Workspace: my-team-id ← local
|
|
305
|
+
Project: my-project-id ← local
|
|
327
306
|
```
|
|
328
307
|
|
|
329
|
-
|
|
308
|
+
### Recommended .gitignore
|
|
330
309
|
|
|
331
310
|
Add this to prevent accidentally committing local config:
|
|
332
311
|
|
|
@@ -339,10 +318,10 @@ Add this to prevent accidentally committing local config:
|
|
|
339
318
|
```
|
|
340
319
|
┌─────────────────┐ MCP Protocol ┌──────────────────┐
|
|
341
320
|
│ Claude Code │ ───────────────────────▶│ harmony-mcp │
|
|
342
|
-
│
|
|
343
|
-
│
|
|
344
|
-
|
|
345
|
-
|
|
321
|
+
│ Cursor │ │ (local server) │
|
|
322
|
+
│ Windsurf │ └────────┬─────────┘
|
|
323
|
+
│ Codex │ │
|
|
324
|
+
└─────────────────┘ │ API Key Auth
|
|
346
325
|
▼
|
|
347
326
|
┌──────────────────┐
|
|
348
327
|
│ Harmony API │
|
|
@@ -358,7 +337,7 @@ Add this to prevent accidentally committing local config:
|
|
|
358
337
|
|
|
359
338
|
**Key Benefits:**
|
|
360
339
|
|
|
361
|
-
- No
|
|
340
|
+
- No database credentials needed - just a Harmony API key
|
|
362
341
|
- Any Harmony user can use it
|
|
363
342
|
- Business logic stays in Harmony
|
|
364
343
|
- Centralized security and rate limiting
|
package/dist/cli.js
CHANGED
|
@@ -29478,24 +29478,24 @@ function areSkillsInstalled(cwd) {
|
|
|
29478
29478
|
foundPaths.push(globalSkillPath);
|
|
29479
29479
|
return { installed: true, location: "global", paths: foundPaths };
|
|
29480
29480
|
}
|
|
29481
|
-
const
|
|
29482
|
-
if (existsSync(claudeGlobalCommand)) {
|
|
29483
|
-
foundPaths.push(claudeGlobalCommand);
|
|
29484
|
-
return { installed: true, location: "global", paths: foundPaths };
|
|
29485
|
-
}
|
|
29486
|
-
const claudeGlobalSkill = join(home, ".claude", "skills", "hmy", "SKILL.md");
|
|
29481
|
+
const claudeGlobalSkill = join(home, ".claude", "skills", "hmy.md");
|
|
29487
29482
|
if (existsSync(claudeGlobalSkill)) {
|
|
29488
29483
|
foundPaths.push(claudeGlobalSkill);
|
|
29489
29484
|
return { installed: true, location: "global", paths: foundPaths };
|
|
29490
29485
|
}
|
|
29491
|
-
const
|
|
29486
|
+
const claudeGlobalSkillAlt = join(home, ".claude", "skills", "hmy", "SKILL.md");
|
|
29487
|
+
if (existsSync(claudeGlobalSkillAlt)) {
|
|
29488
|
+
foundPaths.push(claudeGlobalSkillAlt);
|
|
29489
|
+
return { installed: true, location: "global", paths: foundPaths };
|
|
29490
|
+
}
|
|
29491
|
+
const localSkillPath = join(workingDir, ".claude", "skills", "hmy.md");
|
|
29492
29492
|
if (existsSync(localSkillPath)) {
|
|
29493
29493
|
foundPaths.push(localSkillPath);
|
|
29494
29494
|
return { installed: true, location: "local", paths: foundPaths };
|
|
29495
29495
|
}
|
|
29496
|
-
const
|
|
29497
|
-
if (existsSync(
|
|
29498
|
-
foundPaths.push(
|
|
29496
|
+
const localSkillPathAlt = join(workingDir, ".claude", "skills", "hmy", "SKILL.md");
|
|
29497
|
+
if (existsSync(localSkillPathAlt)) {
|
|
29498
|
+
foundPaths.push(localSkillPathAlt);
|
|
29499
29499
|
return { installed: true, location: "local", paths: foundPaths };
|
|
29500
29500
|
}
|
|
29501
29501
|
return { installed: false, location: null, paths: [] };
|
|
@@ -31864,8 +31864,9 @@ function getAgentFiles(agentId, cwd, installMode = "global") {
|
|
|
31864
31864
|
const symlinks = [];
|
|
31865
31865
|
switch (agentId) {
|
|
31866
31866
|
case "claude": {
|
|
31867
|
-
const
|
|
31868
|
-
|
|
31867
|
+
const skillContent = `---
|
|
31868
|
+
name: hmy
|
|
31869
|
+
description: Start working on a Harmony card. Use when given a card reference like #42, UUID, or card name to implement.
|
|
31869
31870
|
argument-hint: <card-reference>
|
|
31870
31871
|
---
|
|
31871
31872
|
|
|
@@ -31873,18 +31874,18 @@ ${HARMONY_WORKFLOW_PROMPT.replace("Your agent identifier", "claude-code").replac
|
|
|
31873
31874
|
`;
|
|
31874
31875
|
if (installMode === "global") {
|
|
31875
31876
|
files.push({
|
|
31876
|
-
path: join3(GLOBAL_SKILLS_DIR, "
|
|
31877
|
-
content:
|
|
31877
|
+
path: join3(GLOBAL_SKILLS_DIR, "hmy", "SKILL.md"),
|
|
31878
|
+
content: skillContent,
|
|
31878
31879
|
type: "text"
|
|
31879
31880
|
});
|
|
31880
31881
|
symlinks.push({
|
|
31881
|
-
target: join3(GLOBAL_SKILLS_DIR, "
|
|
31882
|
-
link: join3(home, ".claude", "
|
|
31882
|
+
target: join3(GLOBAL_SKILLS_DIR, "hmy"),
|
|
31883
|
+
link: join3(home, ".claude", "skills", "hmy")
|
|
31883
31884
|
});
|
|
31884
31885
|
} else {
|
|
31885
31886
|
files.push({
|
|
31886
|
-
path: join3(cwd, ".claude", "
|
|
31887
|
-
content:
|
|
31887
|
+
path: join3(cwd, ".claude", "skills", "hmy", "SKILL.md"),
|
|
31888
|
+
content: skillContent,
|
|
31888
31889
|
type: "text"
|
|
31889
31890
|
});
|
|
31890
31891
|
}
|
package/dist/index.js
CHANGED
|
@@ -27241,24 +27241,24 @@ function areSkillsInstalled(cwd) {
|
|
|
27241
27241
|
foundPaths.push(globalSkillPath);
|
|
27242
27242
|
return { installed: true, location: "global", paths: foundPaths };
|
|
27243
27243
|
}
|
|
27244
|
-
const
|
|
27245
|
-
if (existsSync(claudeGlobalCommand)) {
|
|
27246
|
-
foundPaths.push(claudeGlobalCommand);
|
|
27247
|
-
return { installed: true, location: "global", paths: foundPaths };
|
|
27248
|
-
}
|
|
27249
|
-
const claudeGlobalSkill = join(home, ".claude", "skills", "hmy", "SKILL.md");
|
|
27244
|
+
const claudeGlobalSkill = join(home, ".claude", "skills", "hmy.md");
|
|
27250
27245
|
if (existsSync(claudeGlobalSkill)) {
|
|
27251
27246
|
foundPaths.push(claudeGlobalSkill);
|
|
27252
27247
|
return { installed: true, location: "global", paths: foundPaths };
|
|
27253
27248
|
}
|
|
27254
|
-
const
|
|
27249
|
+
const claudeGlobalSkillAlt = join(home, ".claude", "skills", "hmy", "SKILL.md");
|
|
27250
|
+
if (existsSync(claudeGlobalSkillAlt)) {
|
|
27251
|
+
foundPaths.push(claudeGlobalSkillAlt);
|
|
27252
|
+
return { installed: true, location: "global", paths: foundPaths };
|
|
27253
|
+
}
|
|
27254
|
+
const localSkillPath = join(workingDir, ".claude", "skills", "hmy.md");
|
|
27255
27255
|
if (existsSync(localSkillPath)) {
|
|
27256
27256
|
foundPaths.push(localSkillPath);
|
|
27257
27257
|
return { installed: true, location: "local", paths: foundPaths };
|
|
27258
27258
|
}
|
|
27259
|
-
const
|
|
27260
|
-
if (existsSync(
|
|
27261
|
-
foundPaths.push(
|
|
27259
|
+
const localSkillPathAlt = join(workingDir, ".claude", "skills", "hmy", "SKILL.md");
|
|
27260
|
+
if (existsSync(localSkillPathAlt)) {
|
|
27261
|
+
foundPaths.push(localSkillPathAlt);
|
|
27262
27262
|
return { installed: true, location: "local", paths: foundPaths };
|
|
27263
27263
|
}
|
|
27264
27264
|
return { installed: false, location: null, paths: [] };
|