@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 CHANGED
@@ -9,7 +9,7 @@ MOMENTUM_TOKEN=mom_agent_xxx \
9
9
  ```
10
10
 
11
11
  整条命令不用自己拼 —— 在 Momentum 的「设置 › Agent」里签发令牌时会直接给出,
12
- 默认用 `@latest`,发新版不用改配置;想固定某一版时把 latest 换成版本号(当前是 0.1.26)。
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.26。客户端和服务端版本不一致时,启动日志(stderr)会明确警告。
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.26" : versionFromRepo();
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: "\u6DFB\u52A0\u4EFB\u52A1\u4F9D\u8D56\u6216\u5173\u8054\u3002blocks \u8868\u793A task \u963B\u585E related\uFF1Bblocked_by \u8868\u793A task \u88AB related \u963B\u585E\u3002\u963B\u585E\u5173\u7CFB\u5982\u679C\u5F62\u6210\u5FAA\u73AF\u4F1A\u88AB\u62D2\u7EDD\u3002",
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: external_exports.enum(["blocks", "blocked_by", "relates", "duplicates"])
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 resolveTask(args.task);
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\u4EFB\u52A1\u4F9D\u8D56\u6216\u5173\u8054\u3002kind \u7684\u65B9\u5411\u548C add_task_relation \u76F8\u540C\u3002",
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 resolveTask(args.task);
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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@costgate/momentum-mcp",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
4
4
  "description": "Momentum MCP Server —— 把 Momentum 的任务、领取与交付接进任意 MCP 客户端",
5
5
  "type": "module",
6
6
  "bin": {