harmony-mcp 1.3.2 → 1.3.3
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 +24 -25
- package/dist/cli.js +1601 -72
- package/dist/index.js +1 -65
- package/dist/init.js +112 -0
- package/package.json +3 -1
package/dist/index.js
CHANGED
|
@@ -23966,23 +23966,11 @@ var RESOURCES = [
|
|
|
23966
23966
|
mimeType: "application/json"
|
|
23967
23967
|
}
|
|
23968
23968
|
];
|
|
23969
|
-
var PROMPTS = {
|
|
23970
|
-
harmony_daily_standup: {
|
|
23971
|
-
name: "Daily Standup Summary",
|
|
23972
|
-
description: "Generate a summary of recent activity and current work items",
|
|
23973
|
-
arguments: [{ name: "projectId", description: "Project to summarize", required: false }]
|
|
23974
|
-
},
|
|
23975
|
-
harmony_board_cleanup: {
|
|
23976
|
-
name: "Board Cleanup Suggestions",
|
|
23977
|
-
description: "Identify stale cards and suggest cleanup actions",
|
|
23978
|
-
arguments: []
|
|
23979
|
-
}
|
|
23980
|
-
};
|
|
23981
23969
|
|
|
23982
23970
|
class HarmonyMCPServer {
|
|
23983
23971
|
server;
|
|
23984
23972
|
constructor() {
|
|
23985
|
-
this.server = new Server({ name: "harmony-mcp", version: "1.0.0" }, { capabilities: { tools: {}, resources: {}
|
|
23973
|
+
this.server = new Server({ name: "harmony-mcp", version: "1.0.0" }, { capabilities: { tools: {}, resources: {} } });
|
|
23986
23974
|
this.setupHandlers();
|
|
23987
23975
|
}
|
|
23988
23976
|
setupHandlers() {
|
|
@@ -24030,58 +24018,6 @@ class HarmonyMCPServer {
|
|
|
24030
24018
|
}
|
|
24031
24019
|
throw new Error(`Unknown resource: ${uri}`);
|
|
24032
24020
|
});
|
|
24033
|
-
this.server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
24034
|
-
prompts: Object.entries(PROMPTS).map(([name, prompt]) => ({
|
|
24035
|
-
name,
|
|
24036
|
-
description: prompt.description,
|
|
24037
|
-
arguments: prompt.arguments
|
|
24038
|
-
}))
|
|
24039
|
-
}));
|
|
24040
|
-
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
24041
|
-
const { name, arguments: args } = request.params;
|
|
24042
|
-
if (name === "harmony_daily_standup") {
|
|
24043
|
-
const projectId = args?.projectId || getActiveProjectId();
|
|
24044
|
-
if (!projectId) {
|
|
24045
|
-
return {
|
|
24046
|
-
messages: [
|
|
24047
|
-
{
|
|
24048
|
-
role: "user",
|
|
24049
|
-
content: { type: "text", text: "No project context. Please set a project first using harmony_set_project_context." }
|
|
24050
|
-
}
|
|
24051
|
-
]
|
|
24052
|
-
};
|
|
24053
|
-
}
|
|
24054
|
-
try {
|
|
24055
|
-
const client2 = getClient();
|
|
24056
|
-
const board = await client2.getBoard(projectId);
|
|
24057
|
-
return {
|
|
24058
|
-
messages: [
|
|
24059
|
-
{
|
|
24060
|
-
role: "user",
|
|
24061
|
-
content: {
|
|
24062
|
-
type: "text",
|
|
24063
|
-
text: `Generate a daily standup summary for this Harmony project board:
|
|
24064
|
-
|
|
24065
|
-
${JSON.stringify(board, null, 2)}
|
|
24066
|
-
|
|
24067
|
-
Include: cards moved recently, current in-progress items, blocked or high-priority items, and upcoming due dates.`
|
|
24068
|
-
}
|
|
24069
|
-
}
|
|
24070
|
-
]
|
|
24071
|
-
};
|
|
24072
|
-
} catch (error2) {
|
|
24073
|
-
return {
|
|
24074
|
-
messages: [
|
|
24075
|
-
{
|
|
24076
|
-
role: "user",
|
|
24077
|
-
content: { type: "text", text: `Error: ${error2 instanceof Error ? error2.message : String(error2)}` }
|
|
24078
|
-
}
|
|
24079
|
-
]
|
|
24080
|
-
};
|
|
24081
|
-
}
|
|
24082
|
-
}
|
|
24083
|
-
throw new Error(`Unknown prompt: ${name}`);
|
|
24084
|
-
});
|
|
24085
24021
|
}
|
|
24086
24022
|
async handleToolCall(name, args) {
|
|
24087
24023
|
if (!isConfigured()) {
|
package/dist/init.js
CHANGED
|
@@ -106,6 +106,94 @@ If pausing: \`harmony_end_agent_session\` with \`status: "paused"\`
|
|
|
106
106
|
|
|
107
107
|
**AI:** \`harmony_generate_prompt\`, \`harmony_process_command\`
|
|
108
108
|
`;
|
|
109
|
+
var HARMONY_STANDUP_PROMPT = `# Harmony Daily Standup
|
|
110
|
+
|
|
111
|
+
Generate a daily standup summary for the current project.
|
|
112
|
+
|
|
113
|
+
## 1. Get Board State
|
|
114
|
+
|
|
115
|
+
Call \`harmony_get_board\` to get the full board state including:
|
|
116
|
+
- All columns and their cards
|
|
117
|
+
- Card priorities, assignees, and due dates
|
|
118
|
+
- Active agent sessions
|
|
119
|
+
|
|
120
|
+
## 2. Analyze Board
|
|
121
|
+
|
|
122
|
+
Organize the information into standup categories:
|
|
123
|
+
|
|
124
|
+
### What was completed recently
|
|
125
|
+
- Cards in "Done" or "Review" columns
|
|
126
|
+
- Cards with recent activity (moved, updated)
|
|
127
|
+
|
|
128
|
+
### What's in progress
|
|
129
|
+
- Cards in "In Progress" column
|
|
130
|
+
- Cards with active agent sessions (show progress %)
|
|
131
|
+
- Who's working on what
|
|
132
|
+
|
|
133
|
+
### What's blocked or at risk
|
|
134
|
+
- High-priority cards not in progress
|
|
135
|
+
- Overdue cards
|
|
136
|
+
- Cards with blockers
|
|
137
|
+
|
|
138
|
+
### What's coming up
|
|
139
|
+
- Cards in "To Do" column
|
|
140
|
+
- Upcoming due dates
|
|
141
|
+
|
|
142
|
+
## 3. Present Summary
|
|
143
|
+
|
|
144
|
+
Format the summary as a clean, readable standup report:
|
|
145
|
+
- Use bullet points for easy scanning
|
|
146
|
+
- Highlight priorities and blockers
|
|
147
|
+
- Include card short IDs for easy reference (e.g., #42)
|
|
148
|
+
- Note any agent work in progress
|
|
149
|
+
`;
|
|
150
|
+
var HARMONY_CLEANUP_PROMPT = `# Harmony Board Cleanup
|
|
151
|
+
|
|
152
|
+
Analyze the board and suggest cleanup actions.
|
|
153
|
+
|
|
154
|
+
## 1. Get Board State
|
|
155
|
+
|
|
156
|
+
Call \`harmony_get_board\` to get the full board state.
|
|
157
|
+
|
|
158
|
+
## 2. Identify Issues
|
|
159
|
+
|
|
160
|
+
Look for:
|
|
161
|
+
|
|
162
|
+
### Stale cards
|
|
163
|
+
- Cards in "In Progress" for too long without updates
|
|
164
|
+
- Cards with past due dates
|
|
165
|
+
- Cards with no recent activity
|
|
166
|
+
|
|
167
|
+
### Organizational issues
|
|
168
|
+
- Cards missing priorities
|
|
169
|
+
- Cards missing assignees in active columns
|
|
170
|
+
- Empty descriptions on complex cards
|
|
171
|
+
|
|
172
|
+
### Potential duplicates
|
|
173
|
+
- Cards with similar titles
|
|
174
|
+
- Use \`harmony_search_cards\` if needed to find related cards
|
|
175
|
+
|
|
176
|
+
## 3. Suggest Actions
|
|
177
|
+
|
|
178
|
+
For each issue found, suggest a specific action:
|
|
179
|
+
- Move stale cards back to backlog
|
|
180
|
+
- Archive completed cards
|
|
181
|
+
- Update missing information
|
|
182
|
+
- Merge or link duplicates
|
|
183
|
+
|
|
184
|
+
Present suggestions as a prioritized list with:
|
|
185
|
+
- Card reference (#ID)
|
|
186
|
+
- Current state
|
|
187
|
+
- Suggested action
|
|
188
|
+
- Why it matters
|
|
189
|
+
|
|
190
|
+
## 4. Optional: Execute Cleanup
|
|
191
|
+
|
|
192
|
+
If the user approves, execute the suggested actions:
|
|
193
|
+
- Use \`harmony_move_card\` to reorganize
|
|
194
|
+
- Use \`harmony_update_card\` to add missing info
|
|
195
|
+
- Use \`harmony_add_link_to_card\` to link related cards
|
|
196
|
+
`;
|
|
109
197
|
function ensureDir(dirPath) {
|
|
110
198
|
if (!existsSync(dirPath)) {
|
|
111
199
|
mkdirSync(dirPath, { recursive: true });
|
|
@@ -164,6 +252,30 @@ ${HARMONY_WORKFLOW_PROMPT.replace("Your agent identifier", "claude-code").replac
|
|
|
164
252
|
result.filesCreated.push(commandPath);
|
|
165
253
|
if (skipped)
|
|
166
254
|
result.filesSkipped.push(commandPath);
|
|
255
|
+
const standupContent = `---
|
|
256
|
+
description: Generate a daily standup summary for the current Harmony project
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
${HARMONY_STANDUP_PROMPT}
|
|
260
|
+
`;
|
|
261
|
+
const standupPath = join(cwd, ".claude", "commands", "hmy-standup.md");
|
|
262
|
+
const standupResult = writeFileIfNotExists(standupPath, standupContent, force);
|
|
263
|
+
if (standupResult.created)
|
|
264
|
+
result.filesCreated.push(standupPath);
|
|
265
|
+
if (standupResult.skipped)
|
|
266
|
+
result.filesSkipped.push(standupPath);
|
|
267
|
+
const cleanupContent = `---
|
|
268
|
+
description: Analyze the Harmony board and suggest cleanup actions for stale cards
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
${HARMONY_CLEANUP_PROMPT}
|
|
272
|
+
`;
|
|
273
|
+
const cleanupPath = join(cwd, ".claude", "commands", "hmy-cleanup.md");
|
|
274
|
+
const cleanupResult = writeFileIfNotExists(cleanupPath, cleanupContent, force);
|
|
275
|
+
if (cleanupResult.created)
|
|
276
|
+
result.filesCreated.push(cleanupPath);
|
|
277
|
+
if (cleanupResult.skipped)
|
|
278
|
+
result.filesSkipped.push(cleanupPath);
|
|
167
279
|
const globalConfigPath = join(homedir(), ".claude", "settings.json");
|
|
168
280
|
const mcpConfig = {
|
|
169
281
|
mcpServers: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harmony-mcp",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"description": "MCP server for Harmony Kanban board - enables AI coding agents to manage your boards",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -44,9 +44,11 @@
|
|
|
44
44
|
"prepublishOnly": "bun run build"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
+
"@clack/prompts": "^0.9.1",
|
|
47
48
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
48
49
|
"commander": "^12.0.0",
|
|
49
50
|
"hono": "^4.0.0",
|
|
51
|
+
"picocolors": "^1.1.1",
|
|
50
52
|
"zod": "^3.23.0"
|
|
51
53
|
},
|
|
52
54
|
"devDependencies": {
|