@costgate/momentum-mcp 0.1.26 → 0.1.28
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 +2 -2
- package/momentum-mcp.mjs +26 -29
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ MOMENTUM_TOKEN=mom_agent_xxx \
|
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
整条命令不用自己拼 —— 在 Momentum 的「设置 › Agent」里签发令牌时会直接给出,
|
|
12
|
-
默认用 `@latest`,发新版不用改配置;想固定某一版时把 latest 换成版本号(当前是 0.1.
|
|
12
|
+
默认用 `@latest`,发新版不用改配置;想固定某一版时把 latest 换成版本号(当前是 0.1.28)。
|
|
13
13
|
|
|
14
14
|
| 环境变量 | 必填 | 说明 |
|
|
15
15
|
|---|---|---|
|
|
@@ -18,4 +18,4 @@ MOMENTUM_TOKEN=mom_agent_xxx \
|
|
|
18
18
|
| `MOMENTUM_CF_ACCESS_CLIENT_ID` | 否 | 部署在 Cloudflare Access 后面时才需要 |
|
|
19
19
|
| `MOMENTUM_CF_ACCESS_CLIENT_SECRET` | 否 | 同上 |
|
|
20
20
|
|
|
21
|
-
版本 0.1.
|
|
21
|
+
版本 0.1.28。客户端和服务端版本不一致时,启动日志(stderr)会明确警告。
|
package/momentum-mcp.mjs
CHANGED
|
@@ -15339,7 +15339,7 @@ var allowErrorProps = SuperJSON.allowErrorProps;
|
|
|
15339
15339
|
|
|
15340
15340
|
// src/version.ts
|
|
15341
15341
|
var UNKNOWN = "unknown";
|
|
15342
|
-
var MCP_VERSION = true ? "0.1.
|
|
15342
|
+
var MCP_VERSION = true ? "0.1.28" : versionFromRepo();
|
|
15343
15343
|
var CLIENT_HEADER = `momentum-mcp/${MCP_VERSION}`;
|
|
15344
15344
|
function compareVersions(a, b) {
|
|
15345
15345
|
const parse4 = (v) => {
|
|
@@ -23847,6 +23847,7 @@ function reportWrite(done, res) {
|
|
|
23847
23847
|
|
|
23848
23848
|
${JSON.stringify(compactReceipt(res.result))}`);
|
|
23849
23849
|
}
|
|
23850
|
+
var RELATION_KIND = external_exports.enum(["blocks", "blocked_by", "relates", "duplicates"]);
|
|
23850
23851
|
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
23851
23852
|
function matchStatus(candidates, wanted) {
|
|
23852
23853
|
const needle = wanted.trim().toLowerCase();
|
|
@@ -23861,6 +23862,9 @@ var WORK_TOOL_NAMES = /* @__PURE__ */ new Set([
|
|
|
23861
23862
|
"list_task_deliveries",
|
|
23862
23863
|
// 干活时写的是执行细化;改人的意图(update_task)只是提建议,留在 full 档
|
|
23863
23864
|
"update_task_plan",
|
|
23865
|
+
// 理清依赖是 Agent 擅长的事,默认授权里也直接放行(IMMO-182);从前只在 full 档,模型根本看不到
|
|
23866
|
+
"add_task_relation",
|
|
23867
|
+
"remove_task_relation",
|
|
23864
23868
|
// 建任务(含带 parent 建子任务)是人最常顺口提的要求。从前它只在 full 档,
|
|
23865
23869
|
// 授权里明明有 task.create,模型却看不到这个工具 —— 用户得先知道
|
|
23866
23870
|
// MOMENTUM_TOOL_PROFILE=full 这个开关才能建卡(IMMO-82)。不传 project 时的报错
|
|
@@ -23949,6 +23953,17 @@ ${options2}`
|
|
|
23949
23953
|
if (!found) throw new Error(`\u627E\u4E0D\u5230\u4EFB\u52A1 '${ref}'`);
|
|
23950
23954
|
return { id: found.id, key: found.key, projectId: found.projectId };
|
|
23951
23955
|
}
|
|
23956
|
+
async function changeRelation(op, args) {
|
|
23957
|
+
const [task, related] = await Promise.all([resolveTaskRef(args.task), resolveTaskRef(args.related)]);
|
|
23958
|
+
const reverse = args.kind === "blocked_by";
|
|
23959
|
+
const input = {
|
|
23960
|
+
taskId: reverse ? related.id : task.id,
|
|
23961
|
+
relatedTaskId: reverse ? task.id : related.id,
|
|
23962
|
+
kind: reverse ? "blocks" : args.kind
|
|
23963
|
+
};
|
|
23964
|
+
const res = op === "add" ? await client.task.addRelation.mutate(input) : await client.task.removeRelation.mutate(input);
|
|
23965
|
+
return { task, related, res };
|
|
23966
|
+
}
|
|
23952
23967
|
async function resolveCycle(projectId, ref, preloaded) {
|
|
23953
23968
|
const data = preloaded ?? await client.cycle.list.query({ projectId });
|
|
23954
23969
|
if (!data.config) {
|
|
@@ -24656,43 +24671,23 @@ ${JSON.stringify(receipt)}`);
|
|
|
24656
24671
|
}),
|
|
24657
24672
|
defineTool({
|
|
24658
24673
|
name: "add_task_relation",
|
|
24659
|
-
description: "\
|
|
24674
|
+
description: "\u7ED9\u4E24\u6761\u4EFB\u52A1\u52A0\u4F9D\u8D56\u6216\u5173\u8054\uFF1B\u4E24\u8FB9\u53EF\u4EE5\u5728\u4E0D\u540C\u9879\u76EE\uFF0C\u7F16\u53F7\u6216 uuid \u90FD\u884C\u3002kind \u4ECE task \u7684\u89D2\u5EA6\u8BFB\uFF1Ablocks\uFF1Dtask \u505A\u5B8C related \u624D\u80FD\u5F00\u5DE5\uFF1Bblocked_by\uFF1Dtask \u8981\u7B49 related \u505A\u5B8C\uFF1Brelates\uFF1D\u76F8\u5173\uFF1Bduplicates\uFF1D\u91CD\u590D\u3002\u4F8B\uFF1AB \u8981\u7B49 A \u2192 {task:B, related:A, kind:blocked_by}\u3002\u963B\u585E\u6210\u73AF\u4F1A\u88AB\u62D2\uFF1B\u7ED3\u679C\u5728 get_task_context \u7684 relations \u91CC\u770B\u3002",
|
|
24660
24675
|
inputSchema: {
|
|
24661
|
-
task: external_exports.string().describe("\u4EFB\u52A1\u7F16\u53F7\u6216 uuid"),
|
|
24662
|
-
related: external_exports.string().describe("\u53E6\u4E00\u6761\u4EFB\u52A1\u7F16\u53F7\u6216 uuid"),
|
|
24663
|
-
kind:
|
|
24676
|
+
task: external_exports.string().describe("\u4EFB\u52A1\u7F16\u53F7\uFF08\u5982 IMMO-12\uFF09\u6216 uuid"),
|
|
24677
|
+
related: external_exports.string().describe("\u53E6\u4E00\u6761\u4EFB\u52A1\u7684\u7F16\u53F7\u6216 uuid\uFF0C\u53EF\u4EE5\u662F\u522B\u7684\u9879\u76EE"),
|
|
24678
|
+
kind: RELATION_KIND
|
|
24664
24679
|
},
|
|
24665
24680
|
async handler(args) {
|
|
24666
|
-
const task = await
|
|
24667
|
-
const related = await resolveTask(args.related);
|
|
24668
|
-
const reverse = args.kind === "blocked_by";
|
|
24669
|
-
const kind = args.kind === "blocked_by" ? "blocks" : args.kind;
|
|
24670
|
-
const res = await client.task.addRelation.mutate({
|
|
24671
|
-
taskId: reverse ? related.id : task.id,
|
|
24672
|
-
relatedTaskId: reverse ? task.id : related.id,
|
|
24673
|
-
kind
|
|
24674
|
-
});
|
|
24681
|
+
const { task, related, res } = await changeRelation("add", args);
|
|
24675
24682
|
return reportWrite(`\u5DF2\u4E3A ${task.key} \u548C ${related.key} \u6DFB\u52A0 ${args.kind} \u5173\u7CFB`, res);
|
|
24676
24683
|
}
|
|
24677
24684
|
}),
|
|
24678
24685
|
defineTool({
|
|
24679
24686
|
name: "remove_task_relation",
|
|
24680
|
-
description: "\u79FB\u9664\
|
|
24681
|
-
inputSchema: {
|
|
24682
|
-
task: external_exports.string().describe("\u4EFB\u52A1\u7F16\u53F7\u6216 uuid"),
|
|
24683
|
-
related: external_exports.string().describe("\u53E6\u4E00\u6761\u4EFB\u52A1\u7F16\u53F7\u6216 uuid"),
|
|
24684
|
-
kind: external_exports.enum(["blocks", "blocked_by", "relates", "duplicates"])
|
|
24685
|
-
},
|
|
24687
|
+
description: "\u79FB\u9664 add_task_relation \u52A0\u7684\u5173\u7CFB\uFF0C\u53C2\u6570\u5199\u6CD5\u548C\u5B83\u5B8C\u5168\u4E00\u6837\u3002",
|
|
24688
|
+
inputSchema: { task: external_exports.string(), related: external_exports.string(), kind: RELATION_KIND },
|
|
24686
24689
|
async handler(args) {
|
|
24687
|
-
const task = await
|
|
24688
|
-
const related = await resolveTask(args.related);
|
|
24689
|
-
const reverse = args.kind === "blocked_by";
|
|
24690
|
-
const kind = args.kind === "blocked_by" ? "blocks" : args.kind;
|
|
24691
|
-
const res = await client.task.removeRelation.mutate({
|
|
24692
|
-
taskId: reverse ? related.id : task.id,
|
|
24693
|
-
relatedTaskId: reverse ? task.id : related.id,
|
|
24694
|
-
kind
|
|
24695
|
-
});
|
|
24690
|
+
const { task, related, res } = await changeRelation("remove", args);
|
|
24696
24691
|
return reportWrite(`\u5DF2\u79FB\u9664 ${task.key} \u548C ${related.key} \u7684 ${args.kind} \u5173\u7CFB`, res);
|
|
24697
24692
|
}
|
|
24698
24693
|
}),
|
|
@@ -24934,6 +24929,8 @@ var SERVER_INSTRUCTIONS = [
|
|
|
24934
24929
|
"\u7F3A\u4FE1\u606F\u5148\u770B\u7528\u6237\u5728\u4E0D\u5728\uFF1A\u6B63\u548C\u4F60\u5BF9\u8BDD\u5C31\u76F4\u63A5\u95EE\u7528\u6237\uFF1B\u7528\u6237\u7B54\u4E0D\u4E86\u3001\u8981\u56E2\u961F\u62CD\u677F\u7684\u624D\u7528 ask_question\u3002",
|
|
24935
24930
|
"\u6709\u4E9B\u52A8\u4F5C\u4F1A\u56E0\u4E3A\u80FD\u529B\u6388\u6743\u800C\u53D8\u6210\u5F85\u4EBA\u6279\u51C6\u7684\u63D0\u6848 \u2014\u2014 \u90A3\u65F6\u4EFB\u52A1\u5E76\u6CA1\u6709\u771F\u7684\u6539\u52A8\uFF0C",
|
|
24936
24931
|
"\u4E0D\u8981\u63A5\u7740\u5F80\u4E0B\u5047\u8BBE\u5B83\u5DF2\u7ECF\u751F\u6548\u3002",
|
|
24932
|
+
"\u53D1\u73B0\u4EFB\u52A1\u4E4B\u95F4\u6709\u5148\u540E\u4F9D\u8D56\uFF08\u8FD9\u6761\u8981\u7B49\u90A3\u6761\u505A\u5B8C\uFF09\uFF0C\u76F4\u63A5\u7528 add_task_relation \u8BB0\u4E0B\u6765\uFF0C\u53EF\u4EE5\u8DE8\u9879\u76EE\uFF1B",
|
|
24933
|
+
"\u8BB0\u4E0B\u7684\u4F9D\u8D56\u4F1A\u8FDB\u770B\u677F\u548C\u603B\u89C8\u7684\u4F9D\u8D56\u56FE\uFF0C\u9886\u6D3B\u65F6\u4E5F\u4F1A\u907F\u5F00\u88AB\u5361\u4F4F\u7684\u4EFB\u52A1\u3002",
|
|
24937
24934
|
"\u5199\u7ED9\u4EBA\u770B\u7684\u6B63\u6587\uFF08\u6267\u884C\u7EC6\u5316 notes\u3001\u4EA4\u4ED8 summary\u3001\u8BC4\u8BBA\uFF09\u5148\u7528\u4EBA\u542C\u5F97\u61C2\u7684\u5927\u767D\u8BDD\u8BB2\u6E05\u601D\u8DEF\u548C\u53D6\u820D\uFF0C",
|
|
24938
24935
|
"\u5C11\u5806\u672F\u8BED\u548C\u4EE3\u7801\u7EC6\u8282\uFF1B\u6D41\u7A0B\u3001\u6B65\u9AA4\u3001\u6A21\u5757\u5173\u7CFB\u7528 mermaid \u56F4\u680F\u753B\u51FA\u6765\uFF08flowchart \u6D41\u7A0B\u56FE\u3001",
|
|
24939
24936
|
"mindmap \u8111\u56FE\u3001sequenceDiagram \u65F6\u5E8F\u56FE\uFF09\uFF0CMomentum \u754C\u9762\u4F1A\u76F4\u63A5\u6E32\u67D3\u6210\u56FE\u3002",
|