mu-agent 0.1.0 → 0.1.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.
@@ -0,0 +1,3199 @@
1
+ {
2
+ "version": 1,
3
+ "groups": {
4
+ "input": {
5
+ "zh": "输入",
6
+ "en": "Input"
7
+ },
8
+ "context": {
9
+ "zh": "上下文",
10
+ "en": "Context"
11
+ },
12
+ "tools": {
13
+ "zh": "工具与安全",
14
+ "en": "Tools and safety"
15
+ },
16
+ "turn": {
17
+ "zh": "回合",
18
+ "en": "Turn"
19
+ },
20
+ "team": {
21
+ "zh": "协作",
22
+ "en": "Teamwork"
23
+ }
24
+ },
25
+ "modes": [
26
+ {
27
+ "value": "active",
28
+ "label": {
29
+ "zh": "生效",
30
+ "en": "Active"
31
+ },
32
+ "help": {
33
+ "zh": "判定结果直接起作用。",
34
+ "en": "The verdict takes effect."
35
+ }
36
+ },
37
+ {
38
+ "value": "shadow",
39
+ "label": {
40
+ "zh": "影子",
41
+ "en": "Shadow"
42
+ },
43
+ "help": {
44
+ "zh": "照常提问并记录,但不改变任何行为,用来先观察判定准不准。",
45
+ "en": "Asked and recorded, but nothing changes. For watching how well it judges first."
46
+ }
47
+ },
48
+ {
49
+ "value": "off",
50
+ "label": {
51
+ "zh": "关闭",
52
+ "en": "Off"
53
+ },
54
+ "help": {
55
+ "zh": "不提问,这个判定点关闭。",
56
+ "en": "Not asked; this decision is off."
57
+ }
58
+ }
59
+ ],
60
+ "decisions": [
61
+ {
62
+ "id": "input.preflight",
63
+ "group": "input",
64
+ "feature": "preflight",
65
+ "title": {
66
+ "zh": "消息预判",
67
+ "en": "Message preflight"
68
+ },
69
+ "summary": {
70
+ "zh": "每条消息先判断是什么类型、要多深的思考,据此给出一行提示;可选按判定设定本回合的思考等级。",
71
+ "en": "Classifies each message and how much thinking it needs, then gives a one-line hint; optionally sets the turn's thinking level."
72
+ }
73
+ },
74
+ {
75
+ "id": "task.frame",
76
+ "group": "input",
77
+ "feature": "frame",
78
+ "title": {
79
+ "zh": "任务帧更新",
80
+ "en": "Task frame update"
81
+ },
82
+ "summary": {
83
+ "zh": "每条消息判断一次:它是新任务、新的硬约束、对做法的纠正、新的子目标,还是什么都没变。只有变了才让模型重写任务帧。",
84
+ "en": "Asks of each message: a new task, a new hard constraint, a correction, a new subgoal, or no change. Only a change has a model rewrite the task frame."
85
+ }
86
+ },
87
+ {
88
+ "id": "input.interjection",
89
+ "group": "input",
90
+ "feature": "interjection",
91
+ "title": {
92
+ "zh": "中途插话",
93
+ "en": "Mid-run messages"
94
+ },
95
+ "summary": {
96
+ "zh": "任务进行中你又发来一句话:判断是要立刻打断,还是等这一步做完再处理。",
97
+ "en": "A message that arrives while the agent works: interrupt now, or handle it after the current step."
98
+ }
99
+ },
100
+ {
101
+ "id": "skills.disclosure",
102
+ "group": "context",
103
+ "feature": "skills",
104
+ "title": {
105
+ "zh": "技能披露",
106
+ "en": "Skill disclosure"
107
+ },
108
+ "summary": {
109
+ "zh": "会话开始时只把与任务有关的技能说明放进提示词,其余隐藏但随时可查。",
110
+ "en": "Only skills relevant to the task go into the prompt; the rest stay hidden but findable."
111
+ }
112
+ },
113
+ {
114
+ "id": "capability.disclosure",
115
+ "group": "context",
116
+ "feature": "catalog",
117
+ "title": {
118
+ "zh": "能力披露",
119
+ "en": "Capability disclosure"
120
+ },
121
+ "summary": {
122
+ "zh": "能力包、MCP 服务器等装着但默认不露,任务需要时才打开,对应的进程也到那时才启动。",
123
+ "en": "Packs and MCP servers are installed but hidden, opened only when a task needs them; their processes start then."
124
+ }
125
+ },
126
+ {
127
+ "id": "tool.admission",
128
+ "group": "context",
129
+ "feature": "admission",
130
+ "title": {
131
+ "zh": "工具输出准入",
132
+ "en": "Tool output admission"
133
+ },
134
+ "summary": {
135
+ "zh": "很长的工具输出分块判断,只让与任务有关的部分进入上下文,其余归档并留下指针。",
136
+ "en": "Long tool output is judged in chunks; only what matters enters the context, the rest is archived with a pointer."
137
+ }
138
+ },
139
+ {
140
+ "id": "tool.admission.test-log",
141
+ "group": "context",
142
+ "feature": "admission",
143
+ "title": {
144
+ "zh": "测试日志精简",
145
+ "en": "Test log trimming"
146
+ },
147
+ "summary": {
148
+ "zh": "测试输出里完全重复的失败段落只留一份;可再让判定器挑出必要的部分。",
149
+ "en": "Exact repeats in test output are kept once; optionally the judge selects what is needed from the rest."
150
+ }
151
+ },
152
+ {
153
+ "id": "context.forget",
154
+ "group": "context",
155
+ "feature": "forgetting",
156
+ "title": {
157
+ "zh": "过期结果遗忘",
158
+ "en": "Forgetting stale results"
159
+ },
160
+ "summary": {
161
+ "zh": "上下文用量越过阈值时,把已经用不上的旧工具结果在发出的请求里换成一行占位。",
162
+ "en": "When context use crosses a threshold, stale tool results are replaced by one-line tombstones in outgoing requests."
163
+ }
164
+ },
165
+ {
166
+ "id": "context.compact",
167
+ "group": "context",
168
+ "feature": "compaction",
169
+ "title": {
170
+ "zh": "免摘要压缩",
171
+ "en": "Summary-free compaction"
172
+ },
173
+ "summary": {
174
+ "zh": "压缩时不让模型写摘要,而是逐段判断保留还是裁掉,原文保真。",
175
+ "en": "Compaction keeps or prunes passages by judgment instead of asking a model for a summary."
176
+ }
177
+ },
178
+ {
179
+ "id": "memory.recall",
180
+ "group": "context",
181
+ "feature": "memory",
182
+ "title": {
183
+ "zh": "经验召回",
184
+ "en": "Lesson recall"
185
+ },
186
+ "summary": {
187
+ "zh": "从经验库里挑出与当前任务有关的几条,带进这一回合。",
188
+ "en": "Picks the lessons relevant to the current task and brings them into the turn."
189
+ }
190
+ },
191
+ {
192
+ "id": "memory.capture",
193
+ "group": "context",
194
+ "feature": "memory",
195
+ "title": {
196
+ "zh": "经验记录",
197
+ "en": "Lesson capture"
198
+ },
199
+ "summary": {
200
+ "zh": "判断你的一句话是不是在纠正代理、或立下以后都要守的规矩;是就记成一条经验。",
201
+ "en": "Decides whether a message of yours corrects the agent or sets a rule for later; if so, it becomes a lesson."
202
+ }
203
+ },
204
+ {
205
+ "id": "memory.outcome",
206
+ "group": "context",
207
+ "feature": "memory",
208
+ "title": {
209
+ "zh": "从脱困中学",
210
+ "en": "Learning from a way out"
211
+ },
212
+ "summary": {
213
+ "zh": "代理原地打转或跑偏过、这一回合却以通过的检查或达成的目标收尾时,判断最后奏效的办法是不是换了一种;是就记下这个坑和绕过办法。每回合最多问一次。",
214
+ "en": "When the agent went in circles or off course and the turn still ended with a passing check or the goal met, judges whether what finally worked was a different approach; if so, keeps the trap and the way around it. Asked at most once a turn."
215
+ }
216
+ },
217
+ {
218
+ "id": "memory.worth",
219
+ "group": "context",
220
+ "feature": "memory",
221
+ "title": {
222
+ "zh": "值不值得记",
223
+ "en": "Worth keeping"
224
+ },
225
+ "summary": {
226
+ "zh": "模型自己想记下的经验、子代理报告里标出的经验,判断是以后还用得上、只关这一次,还是提示词或项目文件里早就有。只存以后用得上的。",
227
+ "en": "For a lesson the model keeps with the remember tool, or a Lesson: line in a sub-agent's report: useful again later, a one-off, or known already from the prompt or the project files. Only the first kind is kept."
228
+ }
229
+ },
230
+ {
231
+ "id": "memory.merge",
232
+ "group": "context",
233
+ "feature": "memory",
234
+ "title": {
235
+ "zh": "经验整理",
236
+ "en": "Lesson merging"
237
+ },
238
+ "summary": {
239
+ "zh": "新经验落盘前,和最像的几条已有经验逐一比:同一条就不重复存,说得更准的替代旧的,互相矛盾时以你最新的说法为准。",
240
+ "en": "Before a new lesson is stored, compares it with the most similar kept ones: the same lesson is not kept twice, a more precise one replaces the old, and on a contradiction your latest word wins."
241
+ }
242
+ },
243
+ {
244
+ "id": "memory.applied",
245
+ "group": "context",
246
+ "feature": "memory",
247
+ "title": {
248
+ "zh": "经验有没有用",
249
+ "en": "Lesson followed"
250
+ },
251
+ "summary": {
252
+ "zh": "回合结束时,判断带进这一回合的经验有没有被照做。召回多次却从没照做过的经验会自动退役。",
253
+ "en": "At the end of a turn, judges whether the lessons brought into it were followed. A lesson recalled many times and never followed is retired."
254
+ }
255
+ },
256
+ {
257
+ "id": "cache.warming",
258
+ "group": "context",
259
+ "feature": "warming",
260
+ "title": {
261
+ "zh": "缓存保温",
262
+ "en": "Cache warming"
263
+ },
264
+ "summary": {
265
+ "zh": "判断你是否很快会回来,以决定要不要在提示词缓存过期前续一下。",
266
+ "en": "Guesses whether you will be back soon, to decide on refreshing the prompt cache before it expires."
267
+ }
268
+ },
269
+ {
270
+ "id": "tool.risk",
271
+ "group": "tools",
272
+ "feature": "guard",
273
+ "title": {
274
+ "zh": "危险命令把关",
275
+ "en": "Risky command guard"
276
+ },
277
+ "summary": {
278
+ "zh": "规则先挑出看起来危险的命令,判定器只负责确认「这是不是你要求的」;拿不准就问你。",
279
+ "en": "Rules flag dangerous-looking commands; the judge only vouches that you asked for it. Unsure means asking you."
280
+ }
281
+ },
282
+ {
283
+ "id": "tool.approval",
284
+ "group": "tools",
285
+ "feature": "permissions",
286
+ "title": {
287
+ "zh": "Jev 替你审批",
288
+ "en": "Jev approves for you"
289
+ },
290
+ "summary": {
291
+ "zh": "在「Jev 审批」模式下,命令、项目外的改动、对外操作和子代理先交给 Jev:它确信这是任务需要、也是你会预期的做法才放行,否则在状态栏问你。",
292
+ "en": "In Jev-approves mode, commands, changes outside the project, outside actions and sub-agents go to Jev first: only what it is sure the task needs, done as you would expect, runs without you; anything else asks you in the status bar."
293
+ }
294
+ },
295
+ {
296
+ "id": "tool.constraint",
297
+ "group": "tools",
298
+ "feature": "constraints",
299
+ "title": {
300
+ "zh": "硬约束把关",
301
+ "en": "Hard constraint gate"
302
+ },
303
+ "summary": {
304
+ "zh": "你说过「先别改 X」「不要加依赖」这类话会原文记在任务帧里;每次要改动东西之前,逐条判断这次调用是否违反,确信违反才拦下,并用你的原话告诉模型。",
305
+ "en": "What you ruled out is kept word for word in the task frame; before a call that changes something, each constraint is checked, and only a confident violation is stopped, in your own words."
306
+ }
307
+ },
308
+ {
309
+ "id": "files.locate",
310
+ "group": "tools",
311
+ "feature": "locate",
312
+ "title": {
313
+ "zh": "文件定位",
314
+ "en": "File location"
315
+ },
316
+ "summary": {
317
+ "zh": "用一句话描述要找什么,判定器给候选文件排序,省去一次次搜索。",
318
+ "en": "Describe what you are looking for; the judge ranks candidate files instead of a string of greps."
319
+ }
320
+ },
321
+ {
322
+ "id": "browser.step",
323
+ "group": "tools",
324
+ "feature": "browser",
325
+ "title": {
326
+ "zh": "浏览器逐步操作",
327
+ "en": "Browser steps"
328
+ },
329
+ "summary": {
330
+ "zh": "内置浏览器每一步「观察 → 一次判定 → 动作」,由判定器选择下一步操作和目标。",
331
+ "en": "Each browser step is observe, one judgment, act: the judge picks the next operation and its target."
332
+ }
333
+ },
334
+ {
335
+ "id": "turn.drift",
336
+ "group": "turn",
337
+ "feature": "monitor",
338
+ "title": {
339
+ "zh": "跑偏监测",
340
+ "en": "Drift monitor"
341
+ },
342
+ "summary": {
343
+ "zh": "每隔几步判断当前工作是否还在为目标服务,并用规则发现原地打转。",
344
+ "en": "Every few steps, checks that the work still serves the goal; rules catch going in circles."
345
+ }
346
+ },
347
+ {
348
+ "id": "turn.rewind",
349
+ "group": "turn",
350
+ "feature": "checkpoint",
351
+ "title": {
352
+ "zh": "判断回退",
353
+ "en": "Judged rewind"
354
+ },
355
+ "summary": {
356
+ "zh": "监测发现原地打转或同一条命令连续失败时,判断这条路是不是死路;只有确信是死路且没有进展,才向你提议回到本回合开始前的检查点。它自己从不回退。",
357
+ "en": "When the monitor sees the agent going in circles, or one command failing again and again, judges whether the approach is a dead end; only a confident dead end with no progress proposes going back to the turn's checkpoint. It never rewinds by itself."
358
+ }
359
+ },
360
+ {
361
+ "id": "turn.completion",
362
+ "group": "turn",
363
+ "feature": "completion",
364
+ "title": {
365
+ "zh": "完成核对",
366
+ "en": "Completion check"
367
+ },
368
+ "summary": {
369
+ "zh": "模型说「做完了」时,判断是否真的验证过;没验证就提醒一次。",
370
+ "en": "When the model says it is done, checks whether anything verified that; one nudge if not."
371
+ }
372
+ },
373
+ {
374
+ "id": "review.triage",
375
+ "group": "tools",
376
+ "feature": "packs",
377
+ "title": {
378
+ "zh": "评审发现分级",
379
+ "en": "Review triage"
380
+ },
381
+ "summary": {
382
+ "zh": "评审子代理交回发现之后,逐条判断两件事:会不会改变程序行为,是不是这次改动引起的;再结合评审自己标的轻重,按严重程度排成四级。一条都不丢,最轻的一级折叠显示;评审坚持必须改的永远不会落到最轻一级。",
383
+ "en": "After the reviewer of /review reports, each finding gets two questions: does it change how the program behaves, and is it about this change; with the reviewer's own severity that orders them P0 to P3. None is dropped, P3 is collapsed, and a finding the reviewer insisted on never lands in P3."
384
+ }
385
+ },
386
+ {
387
+ "id": "output.drift",
388
+ "group": "turn",
389
+ "feature": "ttsr",
390
+ "title": {
391
+ "zh": "写偏即停(实验)",
392
+ "en": "Mid-stream correction (experiment)"
393
+ },
394
+ "summary": {
395
+ "zh": "模型边输出,判定器边每隔几百字对照一次你的硬约束和下面配置的规则;确信写偏了就立刻掐断输出,告诉模型是哪一条,让它从断点接着写。只有开启了「写偏即停」功能才会运行。",
396
+ "en": "While the model writes, the judge reads the tail of its output against your hard constraints and the configured rules every few hundred characters; on a confident violation the output is cut, the rule is named, and the model carries on from there. Runs only with the feature switched on."
397
+ }
398
+ },
399
+ {
400
+ "id": "diagnostics.delivery",
401
+ "group": "tools",
402
+ "feature": "lsp",
403
+ "title": {
404
+ "zh": "诊断何时告知",
405
+ "en": "When to tell diagnostics"
406
+ },
407
+ "summary": {
408
+ "zh": "改完文件后语言服务器新报的错:现在就说、等模型停下再说,还是不说(风格类警告)。回合结束时仍在的新错误一定会说。",
409
+ "en": "New language-server diagnostics after an edit: tell now, when the model pauses, or never (style warnings). New errors still there when the turn ends are always told."
410
+ }
411
+ },
412
+ {
413
+ "id": "goal.met",
414
+ "group": "turn",
415
+ "feature": "goal",
416
+ "title": {
417
+ "zh": "目标是否达成(Jev 兜底)",
418
+ "en": "Goal reached (Jev fallback)"
419
+ },
420
+ "summary": {
421
+ "zh": "目标模式默认由大模型判断;这个判定点只在选了 Jev、或大模型没答上来时用:读结束语,判断目标是否达成、是否需要你拿主意。还有没勾掉的验收条件、或改完没跑过,一律算没达成。",
422
+ "en": "Goal mode is checked by a model by default; this decision is used when Jev is chosen or the model gives no answer: it reads the closing message for whether the goal holds and whether you are needed. An open acceptance item or an unverified edit always means not yet."
423
+ }
424
+ },
425
+ {
426
+ "id": "board.read",
427
+ "group": "turn",
428
+ "feature": "board",
429
+ "title": {
430
+ "zh": "人话看板:现在在干什么",
431
+ "en": "Plain-language board: where things stand"
432
+ },
433
+ "summary": {
434
+ "zh": "打开人话看板的项目里,代理每做几步、跑完检查或勾掉一条验收条件时、以及每次停下时,用选择题读出它处在哪个阶段、在做哪条验收条件、是不是在等你,并把这段时间发生的事逐条分成「你会想知道的」和「例行步骤」。只有出现新情况,才把挑出来的要点交给会说人话的模型重写看板;一轮结束时再挑一次整轮的要点,做个总结。",
435
+ "en": "In a project with the board on, every few tool calls, after a check or a ticked acceptance item, and whenever the agent stops, multiple-choice questions read its phase, the acceptance item it works on and whether it waits for you, and sort what happened since the last board into news and routine. Only something new has a plain-speaking model write the board again, from the news picked; when a run ends, the news of the whole run is picked again for a summing up."
436
+ }
437
+ },
438
+ {
439
+ "id": "notify.routing",
440
+ "group": "turn",
441
+ "feature": "notify",
442
+ "title": {
443
+ "zh": "通知分流",
444
+ "en": "Notification routing"
445
+ },
446
+ "summary": {
447
+ "zh": "上下文预算等事件出现时,判断该现在告诉模型、稍后再说,还是不必说。",
448
+ "en": "For events such as the context budget: tell the model now, later, or not at all."
449
+ }
450
+ },
451
+ {
452
+ "id": "swarm.routing",
453
+ "group": "team",
454
+ "feature": "swarm",
455
+ "title": {
456
+ "zh": "子代理分派",
457
+ "en": "Sub-agent routing"
458
+ },
459
+ "summary": {
460
+ "zh": "为每个委派任务挑选角色,并按难度选择模型档位和思考等级。",
461
+ "en": "Picks a role for each delegated task, and a model tier and thinking level by difficulty."
462
+ }
463
+ },
464
+ {
465
+ "id": "swarm.patch",
466
+ "group": "team",
467
+ "feature": "swarm",
468
+ "title": {
469
+ "zh": "子代理补丁的范围检查",
470
+ "en": "Scope check of a sub-agent's patch"
471
+ },
472
+ "summary": {
473
+ "zh": "隔离的子代理交回补丁时,只看任务、改动的路径和行数,判断改动是否超出任务、哪些文件与任务无关;只给主代理一句提示,从不拦截。",
474
+ "en": "When an isolated sub-agent hands back a patch, judges from the task, the changed paths and the line counts whether it stays within the task and which files look unrelated. One line of advice for the main agent; it never blocks."
475
+ }
476
+ },
477
+ {
478
+ "id": "hive.publish",
479
+ "group": "team",
480
+ "feature": "hive",
481
+ "title": {
482
+ "zh": "蜂群:发布发现",
483
+ "en": "Hive: publishing findings"
484
+ },
485
+ "summary": {
486
+ "zh": "一只蜂的发现值不值得放到公告板上给其他蜂看。",
487
+ "en": "Whether a bee's finding is worth putting on the board for the others."
488
+ }
489
+ },
490
+ {
491
+ "id": "hive.deliver",
492
+ "group": "team",
493
+ "feature": "hive",
494
+ "title": {
495
+ "zh": "蜂群:投递",
496
+ "en": "Hive: delivery"
497
+ },
498
+ "summary": {
499
+ "zh": "公告板上的一条发现与某只蜂手头的工作有没有关系,有关系才送达。",
500
+ "en": "Whether a finding on the board matters to a bee's current work; only then is it delivered."
501
+ }
502
+ },
503
+ {
504
+ "id": "hive.relate",
505
+ "group": "team",
506
+ "feature": "hive",
507
+ "title": {
508
+ "zh": "蜂群:纠正",
509
+ "en": "Hive: corrections"
510
+ },
511
+ "summary": {
512
+ "zh": "一条新发现对公告板上的旧发现意味着什么:更新了它、和它冲突、佐证它,还是无关。被更新的下线,听过它的蜂收到纠正;冲突两边都留着,交给蜂去核实。",
513
+ "en": "What a new finding does to an earlier one on the board: replaces it, contradicts it, supports it, or nothing. A replaced finding goes down and whoever heard it is told; a contradiction keeps both sides for a bee to settle."
514
+ }
515
+ }
516
+ ],
517
+ "features": [
518
+ {
519
+ "name": "preflight",
520
+ "title": {
521
+ "zh": "消息预判",
522
+ "en": "Message preflight"
523
+ },
524
+ "summary": {
525
+ "zh": "发送后先判定再开工,判定结果显示在对话里。",
526
+ "en": "Judges a message before work starts and shows the verdict in the conversation."
527
+ },
528
+ "defaultEnabled": true,
529
+ "options": [
530
+ {
531
+ "key": "thinking",
532
+ "kind": "boolean",
533
+ "default": false,
534
+ "label": {
535
+ "zh": "按判定设置思考等级(切换会丢缓存)",
536
+ "en": "Set the thinking level from the verdict (a switch loses the cache)"
537
+ }
538
+ },
539
+ {
540
+ "key": "hints",
541
+ "kind": "boolean",
542
+ "default": true,
543
+ "label": {
544
+ "zh": "给模型一行提示",
545
+ "en": "Give the model a one-line hint"
546
+ }
547
+ },
548
+ {
549
+ "key": "show",
550
+ "kind": "boolean",
551
+ "default": true,
552
+ "label": {
553
+ "zh": "在界面上显示等待和结论",
554
+ "en": "Show the wait and the verdict"
555
+ }
556
+ },
557
+ {
558
+ "key": "waitMs",
559
+ "kind": "number",
560
+ "default": 4000,
561
+ "min": 500,
562
+ "max": 30000,
563
+ "unit": {
564
+ "zh": "毫秒",
565
+ "en": "ms"
566
+ },
567
+ "label": {
568
+ "zh": "最多等待",
569
+ "en": "Wait at most"
570
+ },
571
+ "help": {
572
+ "zh": "超时就不等了,按原样开始。",
573
+ "en": "After this the turn starts without the verdict."
574
+ }
575
+ }
576
+ ]
577
+ },
578
+ {
579
+ "name": "interjection",
580
+ "title": {
581
+ "zh": "中途插话",
582
+ "en": "Mid-run messages"
583
+ },
584
+ "summary": {
585
+ "zh": "处理任务进行中发来的消息。",
586
+ "en": "Handles messages sent while the agent is working."
587
+ },
588
+ "defaultEnabled": true,
589
+ "options": [
590
+ {
591
+ "key": "waitMs",
592
+ "kind": "number",
593
+ "default": 1500,
594
+ "min": 200,
595
+ "max": 10000,
596
+ "unit": {
597
+ "zh": "毫秒",
598
+ "en": "ms"
599
+ },
600
+ "label": {
601
+ "zh": "最多等待",
602
+ "en": "Wait at most"
603
+ }
604
+ }
605
+ ]
606
+ },
607
+ {
608
+ "name": "skills",
609
+ "title": {
610
+ "zh": "技能披露",
611
+ "en": "Skill disclosure"
612
+ },
613
+ "summary": {
614
+ "zh": "按任务决定提示词里带哪些技能说明。",
615
+ "en": "Chooses which skill descriptions a session carries."
616
+ },
617
+ "defaultEnabled": true,
618
+ "options": [
619
+ {
620
+ "key": "minSkills",
621
+ "kind": "number",
622
+ "default": 4,
623
+ "min": 1,
624
+ "max": 100,
625
+ "label": {
626
+ "zh": "技能少于这个数就不筛",
627
+ "en": "Do not filter below this many skills"
628
+ }
629
+ },
630
+ {
631
+ "key": "waitMs",
632
+ "kind": "number",
633
+ "default": 4000,
634
+ "min": 500,
635
+ "max": 30000,
636
+ "unit": {
637
+ "zh": "毫秒",
638
+ "en": "ms"
639
+ },
640
+ "label": {
641
+ "zh": "最多等待",
642
+ "en": "Wait at most"
643
+ }
644
+ }
645
+ ]
646
+ },
647
+ {
648
+ "name": "catalog",
649
+ "title": {
650
+ "zh": "能力目录",
651
+ "en": "Capability catalog"
652
+ },
653
+ "summary": {
654
+ "zh": "装得多、露得少:能力包和 MCP 服务器默认隐藏,按任务打开。",
655
+ "en": "Install a lot, expose little: packs and MCP servers stay hidden and open per task."
656
+ },
657
+ "defaultEnabled": true,
658
+ "options": [
659
+ {
660
+ "key": "waitMs",
661
+ "kind": "number",
662
+ "default": 4000,
663
+ "min": 500,
664
+ "max": 30000,
665
+ "unit": {
666
+ "zh": "毫秒",
667
+ "en": "ms"
668
+ },
669
+ "label": {
670
+ "zh": "最多等待",
671
+ "en": "Wait at most"
672
+ }
673
+ }
674
+ ]
675
+ },
676
+ {
677
+ "name": "frame",
678
+ "title": {
679
+ "zh": "任务帧与待办",
680
+ "en": "Task frame and to-do list"
681
+ },
682
+ "summary": {
683
+ "zh": "记住你到底要什么:目标、你的硬约束(原话加出处)、当前子目标、验收条件。验收条件就是待办清单,模型用 todo 工具勾选。所有「和目标相关吗」的判断都以它为准,回退会话时它跟着回退。",
684
+ "en": "Keeps what you actually want: the goal, your hard constraints (your own words, with their source), the current subgoal and the acceptance items. Those items are the to-do list the model ticks with the todo tool. Every goal-relevance judgment reads it, and it rewinds with the session."
685
+ },
686
+ "defaultEnabled": true,
687
+ "options": [
688
+ {
689
+ "key": "waitMs",
690
+ "kind": "number",
691
+ "default": 3000,
692
+ "min": 0,
693
+ "max": 30000,
694
+ "unit": {
695
+ "zh": "毫秒",
696
+ "en": "ms"
697
+ },
698
+ "label": {
699
+ "zh": "回合最多等任务帧多久",
700
+ "en": "A turn waits for its frame at most"
701
+ },
702
+ "help": {
703
+ "zh": "从消息到达算起。超时不丢弃:本回合先用上一版加这条原话,更新完成后照常落地。",
704
+ "en": "Counted from the arrival of the message. A late update is not dropped: the turn starts on the previous version plus the raw message, and the update lands when it is ready."
705
+ }
706
+ },
707
+ {
708
+ "key": "writerTimeoutMs",
709
+ "kind": "number",
710
+ "default": 20000,
711
+ "min": 1000,
712
+ "max": 120000,
713
+ "unit": {
714
+ "zh": "毫秒",
715
+ "en": "ms"
716
+ },
717
+ "label": {
718
+ "zh": "重写任务帧的时限",
719
+ "en": "Time limit for writing a frame"
720
+ },
721
+ "help": {
722
+ "zh": "超时或写坏了就保留上一版并标记为过期,按目标筛选上下文的功能暂停,下一条消息时重试。",
723
+ "en": "On a timeout or a malformed reply the last version stays and is marked stale, goal-based filtering holds back, and the next message retries."
724
+ }
725
+ },
726
+ {
727
+ "key": "show",
728
+ "kind": "boolean",
729
+ "default": true,
730
+ "label": {
731
+ "zh": "在对话里显示任务帧更新",
732
+ "en": "Show frame updates in the chat"
733
+ }
734
+ }
735
+ ]
736
+ },
737
+ {
738
+ "name": "memory",
739
+ "title": {
740
+ "zh": "经验库",
741
+ "en": "Lessons"
742
+ },
743
+ "summary": {
744
+ "zh": "从你的纠正、代理自己的脱困、模型和子代理的发现里学经验,存之前先和已有的合并,下次遇到相关任务时带上,没人照做的自动退役。随时可以查看、编辑或让一条退役。",
745
+ "en": "Learns from your corrections, from the agent getting itself unstuck, and from what the model and sub-agents found; merges each lesson with the kept ones before storing it, brings the relevant ones along next time, and retires those nobody follows. /lessons shows them, /forget retires one."
746
+ },
747
+ "defaultEnabled": true,
748
+ "options": [
749
+ {
750
+ "key": "path",
751
+ "kind": "text",
752
+ "default": "",
753
+ "label": {
754
+ "zh": "经验库文件",
755
+ "en": "Lessons file"
756
+ },
757
+ "help": {
758
+ "zh": "留空使用默认位置。",
759
+ "en": "Empty uses the default location."
760
+ }
761
+ },
762
+ {
763
+ "key": "maxCandidates",
764
+ "kind": "number",
765
+ "default": 24,
766
+ "min": 1,
767
+ "max": 200,
768
+ "label": {
769
+ "zh": "每次最多评估",
770
+ "en": "Judge at most"
771
+ },
772
+ "help": {
773
+ "zh": "照做次数多的、最近记下或确认过的排在前面。",
774
+ "en": "The most followed, then the most recently stored or confirmed, come first."
775
+ }
776
+ },
777
+ {
778
+ "key": "maxInjected",
779
+ "kind": "number",
780
+ "default": 5,
781
+ "min": 0,
782
+ "max": 20,
783
+ "label": {
784
+ "zh": "每回合最多带入",
785
+ "en": "Bring in at most"
786
+ }
787
+ },
788
+ {
789
+ "key": "waitMs",
790
+ "kind": "number",
791
+ "default": 4000,
792
+ "min": 0,
793
+ "max": 30000,
794
+ "unit": {
795
+ "zh": "毫秒",
796
+ "en": "ms"
797
+ },
798
+ "label": {
799
+ "zh": "最多等召回结果",
800
+ "en": "Wait for the recall at most"
801
+ },
802
+ "help": {
803
+ "zh": "从消息到达算起;给子代理挑经验也等这么久。",
804
+ "en": "Counted from the arrival of the message; picking lessons for sub-agents waits as long."
805
+ }
806
+ },
807
+ {
808
+ "key": "retireAfter",
809
+ "kind": "number",
810
+ "default": 8,
811
+ "min": 0,
812
+ "max": 100,
813
+ "label": {
814
+ "zh": "召回几次从没照做就退役",
815
+ "en": "Retire after this many recalls never followed"
816
+ },
817
+ "help": {
818
+ "zh": "0 表示从不自动退役。",
819
+ "en": "0 never retires a lesson by itself."
820
+ }
821
+ },
822
+ {
823
+ "key": "mergeNeighbours",
824
+ "kind": "number",
825
+ "default": 6,
826
+ "min": 0,
827
+ "max": 16,
828
+ "label": {
829
+ "zh": "存之前比较几条最像的",
830
+ "en": "Compare with this many similar lessons"
831
+ },
832
+ "help": {
833
+ "zh": "按字面重合挑出来,一次请求问完;0 表示不整理,直接存。",
834
+ "en": "Picked by shared words, asked in one request; 0 stores without merging."
835
+ }
836
+ },
837
+ {
838
+ "key": "outcome",
839
+ "kind": "boolean",
840
+ "default": true,
841
+ "label": {
842
+ "zh": "从代理的脱困中学",
843
+ "en": "Learn from the agent getting unstuck"
844
+ },
845
+ "help": {
846
+ "zh": "需要写作模型或当前对话模型把经验写成一句话。",
847
+ "en": "Needs the writer model or the conversation's model to put the lesson into words."
848
+ }
849
+ },
850
+ {
851
+ "key": "applied",
852
+ "kind": "boolean",
853
+ "default": true,
854
+ "label": {
855
+ "zh": "回合结束时检查经验有没有被照做",
856
+ "en": "Check at the end of a turn whether lessons were followed"
857
+ }
858
+ }
859
+ ]
860
+ },
861
+ {
862
+ "name": "guard",
863
+ "title": {
864
+ "zh": "危险命令把关",
865
+ "en": "Risky command guard"
866
+ },
867
+ "summary": {
868
+ "zh": "危险命令在执行前确认。",
869
+ "en": "Confirms dangerous commands before they run."
870
+ },
871
+ "defaultEnabled": true,
872
+ "options": []
873
+ },
874
+ {
875
+ "name": "permissions",
876
+ "title": {
877
+ "zh": "权限模式",
878
+ "en": "Permission modes"
879
+ },
880
+ "summary": {
881
+ "zh": "完全访问、Jev 审批、最小权限三种模式,用 /permissions 随时切换;需要授权时在状态栏提示你,可以只允许这一次,或这次对话都允许。开着它时,危险命令的把关也归它管。",
882
+ "en": "Full access, Jev approves, or minimal permissions, switched any time with /permissions. When a step needs your permission the status bar asks; allow it once or for the whole conversation. While it is on, it also handles the risky command guard."
883
+ },
884
+ "defaultEnabled": true,
885
+ "options": [
886
+ {
887
+ "key": "mode",
888
+ "kind": "choice",
889
+ "default": "jev",
890
+ "choices": [
891
+ {
892
+ "value": "full",
893
+ "label": {
894
+ "zh": "完全访问",
895
+ "en": "Full access"
896
+ }
897
+ },
898
+ {
899
+ "value": "jev",
900
+ "label": {
901
+ "zh": "Jev 审批",
902
+ "en": "Jev approves"
903
+ }
904
+ },
905
+ {
906
+ "value": "ask",
907
+ "label": {
908
+ "zh": "最小权限",
909
+ "en": "Minimal permissions"
910
+ }
911
+ }
912
+ ],
913
+ "label": {
914
+ "zh": "新对话的默认模式",
915
+ "en": "Mode of a new conversation"
916
+ },
917
+ "help": {
918
+ "zh": "用 /permissions 选过之后,以你最后选的为准。",
919
+ "en": "Once you pick one with /permissions, your last pick is used."
920
+ }
921
+ }
922
+ ]
923
+ },
924
+ {
925
+ "name": "constraints",
926
+ "title": {
927
+ "zh": "硬约束把关",
928
+ "en": "Hard constraint gate"
929
+ },
930
+ "summary": {
931
+ "zh": "改动文件或执行命令之前,对照你的硬约束检查一遍;子代理同样受这些约束限制。",
932
+ "en": "Checks a change or a command against your hard constraints first; sub-agents work under them too."
933
+ },
934
+ "defaultEnabled": true,
935
+ "options": [
936
+ {
937
+ "key": "maxConstraints",
938
+ "kind": "number",
939
+ "default": 6,
940
+ "min": 1,
941
+ "max": 20,
942
+ "label": {
943
+ "zh": "每次最多对照的约束条数",
944
+ "en": "Constraints checked per call at most"
945
+ },
946
+ "help": {
947
+ "zh": "取最新的几条。",
948
+ "en": "The newest ones are used."
949
+ }
950
+ },
951
+ {
952
+ "key": "waitMs",
953
+ "kind": "number",
954
+ "default": 5000,
955
+ "min": 500,
956
+ "max": 30000,
957
+ "unit": {
958
+ "zh": "毫秒",
959
+ "en": "ms"
960
+ },
961
+ "label": {
962
+ "zh": "最多等待",
963
+ "en": "Wait at most"
964
+ }
965
+ }
966
+ ]
967
+ },
968
+ {
969
+ "name": "admission",
970
+ "title": {
971
+ "zh": "工具输出准入",
972
+ "en": "Tool output admission"
973
+ },
974
+ "summary": {
975
+ "zh": "控制多长的工具输出、以什么方式进入上下文。",
976
+ "en": "Controls how long tool output enters the context."
977
+ },
978
+ "defaultEnabled": true,
979
+ "options": [
980
+ {
981
+ "key": "minChars",
982
+ "kind": "number",
983
+ "default": 4000,
984
+ "min": 500,
985
+ "max": 200000,
986
+ "unit": {
987
+ "zh": "字符",
988
+ "en": "chars"
989
+ },
990
+ "label": {
991
+ "zh": "超过这个长度才筛",
992
+ "en": "Only filter output longer than"
993
+ }
994
+ },
995
+ {
996
+ "key": "chunkChars",
997
+ "kind": "number",
998
+ "default": 1200,
999
+ "min": 200,
1000
+ "max": 20000,
1001
+ "unit": {
1002
+ "zh": "字符",
1003
+ "en": "chars"
1004
+ },
1005
+ "label": {
1006
+ "zh": "每块大小",
1007
+ "en": "Chunk size"
1008
+ }
1009
+ },
1010
+ {
1011
+ "key": "maxChunks",
1012
+ "kind": "number",
1013
+ "default": 48,
1014
+ "min": 4,
1015
+ "max": 400,
1016
+ "label": {
1017
+ "zh": "最多判断的块数",
1018
+ "en": "Judge at most this many chunks"
1019
+ }
1020
+ },
1021
+ {
1022
+ "key": "batchChunks",
1023
+ "kind": "number",
1024
+ "default": 16,
1025
+ "min": 1,
1026
+ "max": 32,
1027
+ "label": {
1028
+ "zh": "一次请求判断几块",
1029
+ "en": "Chunks per request"
1030
+ },
1031
+ "help": {
1032
+ "zh": "托管判定器把多块放进一个请求,状态只计费一次;本地判定器始终一次一块。",
1033
+ "en": "A hosted judge takes many chunks in one request, the state billed once; the local judge takes one at a time."
1034
+ }
1035
+ },
1036
+ {
1037
+ "key": "waitMs",
1038
+ "kind": "number",
1039
+ "default": 4000,
1040
+ "min": 500,
1041
+ "max": 30000,
1042
+ "unit": {
1043
+ "zh": "毫秒",
1044
+ "en": "ms"
1045
+ },
1046
+ "label": {
1047
+ "zh": "最多等待",
1048
+ "en": "Wait at most"
1049
+ },
1050
+ "help": {
1051
+ "zh": "超时就整段放行,判定只记账。",
1052
+ "en": "After this the output goes in whole; the verdict is only recorded."
1053
+ }
1054
+ },
1055
+ {
1056
+ "key": "passThrough",
1057
+ "kind": "list",
1058
+ "default": [
1059
+ "read",
1060
+ "edit",
1061
+ "write"
1062
+ ],
1063
+ "label": {
1064
+ "zh": "这些工具的输出不筛",
1065
+ "en": "Never filter these tools"
1066
+ }
1067
+ },
1068
+ {
1069
+ "key": "testLog",
1070
+ "kind": "choice",
1071
+ "default": "off",
1072
+ "label": {
1073
+ "zh": "测试日志精简",
1074
+ "en": "Test log trimming"
1075
+ },
1076
+ "choices": [
1077
+ {
1078
+ "value": "off",
1079
+ "label": {
1080
+ "zh": "关闭",
1081
+ "en": "Off"
1082
+ }
1083
+ },
1084
+ {
1085
+ "value": "rules",
1086
+ "label": {
1087
+ "zh": "只去掉完全重复的段落(无损)",
1088
+ "en": "Drop exact repeats only (lossless)"
1089
+ }
1090
+ },
1091
+ {
1092
+ "value": "jev",
1093
+ "label": {
1094
+ "zh": "再由判定器挑选剩余部分",
1095
+ "en": "Also let the judge select from the rest"
1096
+ }
1097
+ }
1098
+ ]
1099
+ },
1100
+ {
1101
+ "key": "agentEnv",
1102
+ "kind": "boolean",
1103
+ "default": true,
1104
+ "label": {
1105
+ "zh": "告诉测试工具「读者是代理」",
1106
+ "en": "Tell test runners an agent is reading"
1107
+ },
1108
+ "help": {
1109
+ "zh": "Vitest 等会因此只输出失败和汇总。",
1110
+ "en": "Vitest and others then print failures and the summary only."
1111
+ }
1112
+ }
1113
+ ]
1114
+ },
1115
+ {
1116
+ "name": "forgetting",
1117
+ "title": {
1118
+ "zh": "过期结果遗忘",
1119
+ "en": "Forgetting stale results"
1120
+ },
1121
+ "summary": {
1122
+ "zh": "上下文吃紧时,把用不上的旧结果换成占位。",
1123
+ "en": "Replaces stale results with tombstones when the context gets tight."
1124
+ },
1125
+ "defaultEnabled": true,
1126
+ "options": [
1127
+ {
1128
+ "key": "thresholds",
1129
+ "kind": "numbers",
1130
+ "default": [
1131
+ 50,
1132
+ 70,
1133
+ 85
1134
+ ],
1135
+ "label": {
1136
+ "zh": "触发阈值(上下文用量 %)",
1137
+ "en": "Trigger thresholds (context use %)"
1138
+ }
1139
+ },
1140
+ {
1141
+ "key": "minChars",
1142
+ "kind": "number",
1143
+ "default": 6000,
1144
+ "min": 500,
1145
+ "max": 200000,
1146
+ "unit": {
1147
+ "zh": "字符",
1148
+ "en": "chars"
1149
+ },
1150
+ "label": {
1151
+ "zh": "只考虑长于此的结果",
1152
+ "en": "Only results longer than"
1153
+ }
1154
+ },
1155
+ {
1156
+ "key": "minAgeTurns",
1157
+ "kind": "number",
1158
+ "default": 2,
1159
+ "min": 0,
1160
+ "max": 50,
1161
+ "label": {
1162
+ "zh": "至少过了几个回合",
1163
+ "en": "At least this many turns old"
1164
+ }
1165
+ },
1166
+ {
1167
+ "key": "maxPerBatch",
1168
+ "kind": "number",
1169
+ "default": 12,
1170
+ "min": 1,
1171
+ "max": 100,
1172
+ "label": {
1173
+ "zh": "每批最多判断",
1174
+ "en": "Judge at most per batch"
1175
+ }
1176
+ },
1177
+ {
1178
+ "key": "waitMs",
1179
+ "kind": "number",
1180
+ "default": 4000,
1181
+ "min": 500,
1182
+ "max": 30000,
1183
+ "unit": {
1184
+ "zh": "毫秒",
1185
+ "en": "ms"
1186
+ },
1187
+ "label": {
1188
+ "zh": "最多等待",
1189
+ "en": "Wait at most"
1190
+ },
1191
+ "help": {
1192
+ "zh": "这次请求最多等这么久;来晚的判定在下一次请求生效。",
1193
+ "en": "This request waits this long; verdicts that come later apply at the next request."
1194
+ }
1195
+ }
1196
+ ]
1197
+ },
1198
+ {
1199
+ "name": "compaction",
1200
+ "title": {
1201
+ "zh": "免摘要压缩",
1202
+ "en": "Summary-free compaction"
1203
+ },
1204
+ "summary": {
1205
+ "zh": "压缩时保留原文片段,不写摘要。",
1206
+ "en": "Compaction that keeps original passages instead of a summary."
1207
+ },
1208
+ "defaultEnabled": false,
1209
+ "beta": true,
1210
+ "options": [
1211
+ {
1212
+ "key": "keepThreshold",
1213
+ "kind": "number",
1214
+ "default": 0.5,
1215
+ "min": 0,
1216
+ "max": 1,
1217
+ "label": {
1218
+ "zh": "保留阈值",
1219
+ "en": "Keep threshold"
1220
+ }
1221
+ },
1222
+ {
1223
+ "key": "minChars",
1224
+ "kind": "number",
1225
+ "default": 600,
1226
+ "min": 100,
1227
+ "max": 20000,
1228
+ "unit": {
1229
+ "zh": "字符",
1230
+ "en": "chars"
1231
+ },
1232
+ "label": {
1233
+ "zh": "短于此的原样保留",
1234
+ "en": "Keep anything shorter than"
1235
+ }
1236
+ },
1237
+ {
1238
+ "key": "headChars",
1239
+ "kind": "number",
1240
+ "default": 300,
1241
+ "min": 0,
1242
+ "max": 5000,
1243
+ "unit": {
1244
+ "zh": "字符",
1245
+ "en": "chars"
1246
+ },
1247
+ "label": {
1248
+ "zh": "裁掉时保留的开头",
1249
+ "en": "Head kept when pruning"
1250
+ }
1251
+ },
1252
+ {
1253
+ "key": "targetRatio",
1254
+ "kind": "number",
1255
+ "default": 0.5,
1256
+ "min": 0.05,
1257
+ "max": 1,
1258
+ "label": {
1259
+ "zh": "压缩后占原来的比例",
1260
+ "en": "Target share of the original"
1261
+ }
1262
+ },
1263
+ {
1264
+ "key": "maxWindowShare",
1265
+ "kind": "number",
1266
+ "default": 0.25,
1267
+ "min": 0.05,
1268
+ "max": 0.9,
1269
+ "label": {
1270
+ "zh": "最多占上下文窗口的比例",
1271
+ "en": "At most this share of the window"
1272
+ }
1273
+ },
1274
+ {
1275
+ "key": "freeChars",
1276
+ "kind": "number",
1277
+ "default": 24000,
1278
+ "min": 0,
1279
+ "max": 500000,
1280
+ "unit": {
1281
+ "zh": "字符",
1282
+ "en": "chars"
1283
+ },
1284
+ "label": {
1285
+ "zh": "小于此的历史不受预算挤压",
1286
+ "en": "Histories this small are not squeezed"
1287
+ }
1288
+ },
1289
+ {
1290
+ "key": "maxJudged",
1291
+ "kind": "number",
1292
+ "default": 120,
1293
+ "min": 10,
1294
+ "max": 1000,
1295
+ "label": {
1296
+ "zh": "最多判断的片段数",
1297
+ "en": "Judge at most this many passages"
1298
+ }
1299
+ }
1300
+ ]
1301
+ },
1302
+ {
1303
+ "name": "checkpoint",
1304
+ "title": {
1305
+ "zh": "检查点与回退",
1306
+ "en": "Checkpoints and rewind"
1307
+ },
1308
+ "summary": {
1309
+ "zh": "每个会改文件的回合,在第一次改动前给工作区拍一张快照,存在 mu 自己的影子 git 目录里,不碰你的仓库。/rewind 让文件和对话一起回到那一刻,/rewind undo 撤销回退。",
1310
+ "en": "Before the first change of every turn that edits files, snapshots the working tree into mu's own shadow git directory, never touching your repository. /rewind takes files and conversation back, /rewind undo takes the rewind back."
1311
+ },
1312
+ "defaultEnabled": true,
1313
+ "options": [
1314
+ {
1315
+ "key": "dir",
1316
+ "kind": "text",
1317
+ "default": "",
1318
+ "label": {
1319
+ "zh": "快照存放目录",
1320
+ "en": "Where snapshots are kept"
1321
+ },
1322
+ "help": {
1323
+ "zh": "留空则放在 mu 主目录的 mu/checkpoints 下,每个项目一个影子仓库。",
1324
+ "en": "Empty means mu/checkpoints in the mu home, one shadow repository per project."
1325
+ }
1326
+ },
1327
+ {
1328
+ "key": "keep",
1329
+ "kind": "number",
1330
+ "default": 50,
1331
+ "min": 1,
1332
+ "max": 1000,
1333
+ "label": {
1334
+ "zh": "每个项目保留的快照数",
1335
+ "en": "Snapshots kept per project"
1336
+ }
1337
+ },
1338
+ {
1339
+ "key": "maxAgeDays",
1340
+ "kind": "number",
1341
+ "default": 14,
1342
+ "min": 1,
1343
+ "max": 365,
1344
+ "label": {
1345
+ "zh": "快照保留天数",
1346
+ "en": "Days a snapshot is kept"
1347
+ },
1348
+ "unit": {
1349
+ "zh": "天",
1350
+ "en": "days"
1351
+ }
1352
+ },
1353
+ {
1354
+ "key": "maxFileMb",
1355
+ "kind": "number",
1356
+ "default": 5,
1357
+ "min": 1,
1358
+ "max": 1024,
1359
+ "label": {
1360
+ "zh": "单个文件大小上限",
1361
+ "en": "Largest file in a snapshot"
1362
+ },
1363
+ "help": {
1364
+ "zh": "更大的文件不进快照,回退时也绝不动它。",
1365
+ "en": "Larger files stay out of snapshots, and a rewind never touches them."
1366
+ },
1367
+ "unit": {
1368
+ "zh": "MB",
1369
+ "en": "MB"
1370
+ }
1371
+ },
1372
+ {
1373
+ "key": "ignore",
1374
+ "kind": "list",
1375
+ "default": [],
1376
+ "label": {
1377
+ "zh": "额外忽略的路径",
1378
+ "en": "Extra paths to ignore"
1379
+ },
1380
+ "help": {
1381
+ "zh": "gitignore 写法,一行一条。项目自己的 .gitignore 和内置清单(node_modules、构建产物等)始终生效。",
1382
+ "en": "gitignore patterns, one per line. The project's own .gitignore and the built-in list (node_modules, build outputs and so on) always apply."
1383
+ }
1384
+ },
1385
+ {
1386
+ "key": "timeoutMs",
1387
+ "kind": "number",
1388
+ "default": 30000,
1389
+ "min": 1000,
1390
+ "max": 600000,
1391
+ "label": {
1392
+ "zh": "单次快照最长用时",
1393
+ "en": "Longest a snapshot may take"
1394
+ },
1395
+ "help": {
1396
+ "zh": "超时则本回合不拍快照,工具照常执行。",
1397
+ "en": "Past this the turn goes without a checkpoint; the tool call still runs."
1398
+ },
1399
+ "unit": {
1400
+ "zh": "毫秒",
1401
+ "en": "ms"
1402
+ }
1403
+ },
1404
+ {
1405
+ "key": "propose",
1406
+ "kind": "boolean",
1407
+ "default": true,
1408
+ "label": {
1409
+ "zh": "发现死路时提议回退",
1410
+ "en": "Propose a rewind at a dead end"
1411
+ }
1412
+ },
1413
+ {
1414
+ "key": "confirmSeconds",
1415
+ "kind": "number",
1416
+ "default": 120,
1417
+ "min": 0,
1418
+ "max": 3600,
1419
+ "label": {
1420
+ "zh": "提议等待你回答的时间",
1421
+ "en": "How long a proposal waits for you"
1422
+ },
1423
+ "help": {
1424
+ "zh": "到时未答就继续原来的工作。0 表示一直等。",
1425
+ "en": "Unanswered, the run carries on. 0 waits forever."
1426
+ },
1427
+ "unit": {
1428
+ "zh": "秒",
1429
+ "en": "s"
1430
+ }
1431
+ }
1432
+ ]
1433
+ },
1434
+ {
1435
+ "name": "monitor",
1436
+ "title": {
1437
+ "zh": "跑偏监测",
1438
+ "en": "Drift monitor"
1439
+ },
1440
+ "summary": {
1441
+ "zh": "发现偏离目标和原地打转。",
1442
+ "en": "Notices drift from the goal and going in circles."
1443
+ },
1444
+ "defaultEnabled": true,
1445
+ "options": [
1446
+ {
1447
+ "key": "every",
1448
+ "kind": "number",
1449
+ "default": 6,
1450
+ "min": 1,
1451
+ "max": 100,
1452
+ "label": {
1453
+ "zh": "每隔几次工具调用检查",
1454
+ "en": "Check every this many tool calls"
1455
+ }
1456
+ },
1457
+ {
1458
+ "key": "repeats",
1459
+ "kind": "number",
1460
+ "default": 3,
1461
+ "min": 2,
1462
+ "max": 20,
1463
+ "label": {
1464
+ "zh": "同一调用重复几次算打转",
1465
+ "en": "Repeats that count as a loop"
1466
+ }
1467
+ },
1468
+ {
1469
+ "key": "window",
1470
+ "kind": "number",
1471
+ "default": 8,
1472
+ "min": 2,
1473
+ "max": 100,
1474
+ "label": {
1475
+ "zh": "观察窗口",
1476
+ "en": "Window"
1477
+ }
1478
+ }
1479
+ ]
1480
+ },
1481
+ {
1482
+ "name": "lsp",
1483
+ "title": {
1484
+ "zh": "语言服务器诊断",
1485
+ "en": "Language server diagnostics"
1486
+ },
1487
+ "summary": {
1488
+ "zh": "接本机已装的语言服务器(不代装),只留这次改动新引入的报错,由判定器决定何时告诉模型。",
1489
+ "en": "Uses the language servers already installed here (installs none), keeps only what an edit newly introduced, and lets the judge pick the moment to tell the model."
1490
+ },
1491
+ "defaultEnabled": true,
1492
+ "options": [
1493
+ {
1494
+ "key": "builtin",
1495
+ "kind": "boolean",
1496
+ "default": true,
1497
+ "label": {
1498
+ "zh": "使用内置的常见服务器表",
1499
+ "en": "Use the built-in table of well-known servers"
1500
+ },
1501
+ "help": {
1502
+ "zh": "TypeScript、Python、Go、Rust、C/C++ 的常见服务器,只在 PATH 上查找。自定义的服务器在设置文件里添加。",
1503
+ "en": "Well-known servers for TypeScript, Python, Go, Rust and C/C++, looked up on PATH only. Your own go under features.lsp.servers in mu.json."
1504
+ }
1505
+ },
1506
+ {
1507
+ "key": "editTools",
1508
+ "kind": "list",
1509
+ "default": [
1510
+ "edit",
1511
+ "write"
1512
+ ],
1513
+ "label": {
1514
+ "zh": "算作改文件的工具",
1515
+ "en": "Tools that count as editing a file"
1516
+ }
1517
+ },
1518
+ {
1519
+ "key": "subAgents",
1520
+ "kind": "boolean",
1521
+ "default": false,
1522
+ "label": {
1523
+ "zh": "子代理也启动语言服务器",
1524
+ "en": "Sub-agents start language servers too"
1525
+ },
1526
+ "help": {
1527
+ "zh": "默认关闭:每个子代理各起一套服务器会很吃资源。",
1528
+ "en": "Off by default: one set of servers per sub-agent is heavy on the machine."
1529
+ }
1530
+ },
1531
+ {
1532
+ "key": "settleMs",
1533
+ "kind": "number",
1534
+ "default": 1500,
1535
+ "min": 0,
1536
+ "max": 10000,
1537
+ "unit": {
1538
+ "zh": "毫秒",
1539
+ "en": "ms"
1540
+ },
1541
+ "label": {
1542
+ "zh": "改完后最多等服务器多久",
1543
+ "en": "Wait for the server after an edit, at most"
1544
+ },
1545
+ "help": {
1546
+ "zh": "超时不再等:晚到的诊断在下一次改动或回合结束时处理。",
1547
+ "en": "Past this nothing waits: late diagnostics are handled at the next edit or when the turn ends."
1548
+ }
1549
+ },
1550
+ {
1551
+ "key": "turnEndSettleMs",
1552
+ "kind": "number",
1553
+ "default": 3000,
1554
+ "min": 0,
1555
+ "max": 30000,
1556
+ "unit": {
1557
+ "zh": "毫秒",
1558
+ "en": "ms"
1559
+ },
1560
+ "label": {
1561
+ "zh": "回合结束时最多等多久",
1562
+ "en": "Wait at the end of a turn, at most"
1563
+ }
1564
+ },
1565
+ {
1566
+ "key": "quietMs",
1567
+ "kind": "number",
1568
+ "default": 250,
1569
+ "min": 20,
1570
+ "max": 5000,
1571
+ "unit": {
1572
+ "zh": "毫秒",
1573
+ "en": "ms"
1574
+ },
1575
+ "label": {
1576
+ "zh": "服务器安静多久算说完",
1577
+ "en": "Silence that counts as the server being done"
1578
+ }
1579
+ },
1580
+ {
1581
+ "key": "baselineMs",
1582
+ "kind": "number",
1583
+ "default": 5000,
1584
+ "min": 100,
1585
+ "max": 60000,
1586
+ "unit": {
1587
+ "zh": "毫秒",
1588
+ "en": "ms"
1589
+ },
1590
+ "label": {
1591
+ "zh": "等改动前诊断的上限",
1592
+ "en": "Wait for the pre-edit diagnostics, at most"
1593
+ },
1594
+ "help": {
1595
+ "zh": "在后台等,不挡工具调用。过了上限就不把首份诊断当成新问题。",
1596
+ "en": "Waited for in the background, never blocking a tool. Past it, the first report is not called new."
1597
+ }
1598
+ },
1599
+ {
1600
+ "key": "maxItems",
1601
+ "kind": "number",
1602
+ "default": 10,
1603
+ "min": 1,
1604
+ "max": 100,
1605
+ "label": {
1606
+ "zh": "一次最多告知几条",
1607
+ "en": "Diagnostics told at once, at most"
1608
+ }
1609
+ },
1610
+ {
1611
+ "key": "maxServers",
1612
+ "kind": "number",
1613
+ "default": 4,
1614
+ "min": 1,
1615
+ "max": 16,
1616
+ "label": {
1617
+ "zh": "同时运行的服务器上限",
1618
+ "en": "Servers running at once, at most"
1619
+ }
1620
+ },
1621
+ {
1622
+ "key": "waitMs",
1623
+ "kind": "number",
1624
+ "default": 4000,
1625
+ "min": 500,
1626
+ "max": 30000,
1627
+ "unit": {
1628
+ "zh": "毫秒",
1629
+ "en": "ms"
1630
+ },
1631
+ "label": {
1632
+ "zh": "等判定最多多久",
1633
+ "en": "Wait for the judge, at most"
1634
+ }
1635
+ }
1636
+ ]
1637
+ },
1638
+ {
1639
+ "name": "ttsr",
1640
+ "title": {
1641
+ "zh": "写偏即停(实验)",
1642
+ "en": "Mid-stream correction (experiment)"
1643
+ },
1644
+ "summary": {
1645
+ "zh": "语义版 TTSR:不用正则,而由判定器发现模型写偏,中断输出、摆出规则、从原处继续。默认关闭;开启后每隔一段输出就会多一次判定调用。",
1646
+ "en": "Semantic TTSR: the judge, not a regular expression, notices the output going astray, cuts it, shows the rule and lets the model carry on. Off by default; when on, every stretch of output costs one more judge call."
1647
+ },
1648
+ "defaultEnabled": false,
1649
+ "options": [
1650
+ {
1651
+ "key": "rules",
1652
+ "kind": "list",
1653
+ "default": [],
1654
+ "label": {
1655
+ "zh": "一直要守的规则",
1656
+ "en": "Rules to hold at all times"
1657
+ },
1658
+ "help": {
1659
+ "zh": "一行一条,用平常的话写,例如「用中文回答」「不要写占位实现」。任务帧里你的硬约束会自动加入,不必重复。",
1660
+ "en": "One per line, in plain words, e.g. “Answer in Chinese”, “No placeholder implementations”. Your hard constraints from the task frame are added automatically."
1661
+ }
1662
+ },
1663
+ {
1664
+ "key": "segmentChars",
1665
+ "kind": "number",
1666
+ "default": 600,
1667
+ "min": 200,
1668
+ "max": 5000,
1669
+ "label": {
1670
+ "zh": "每输出多少字符判一次",
1671
+ "en": "Characters of output per check"
1672
+ }
1673
+ },
1674
+ {
1675
+ "key": "maxRules",
1676
+ "kind": "number",
1677
+ "default": 4,
1678
+ "min": 1,
1679
+ "max": 12,
1680
+ "label": {
1681
+ "zh": "每次最多对照的规则条数",
1682
+ "en": "Rules checked per call at most"
1683
+ },
1684
+ "help": {
1685
+ "zh": "超出时保留你最近说的。",
1686
+ "en": "When there are more, the ones you said last stay."
1687
+ }
1688
+ },
1689
+ {
1690
+ "key": "maxInterrupts",
1691
+ "kind": "number",
1692
+ "default": 2,
1693
+ "min": 1,
1694
+ "max": 10,
1695
+ "label": {
1696
+ "zh": "两次发言之间最多中断几次",
1697
+ "en": "Cuts at most between two of your messages"
1698
+ }
1699
+ }
1700
+ ]
1701
+ },
1702
+ {
1703
+ "name": "goal",
1704
+ "title": {
1705
+ "zh": "目标模式",
1706
+ "en": "Goal mode"
1707
+ },
1708
+ "summary": {
1709
+ "zh": "定下一个完成条件后,代理会一直干到条件成立为止。每次它想停,由大模型对照证据判断是否达成、下一步做什么。被你打断、模型调用失败、连续空转或原地打转、用完续跑次数或时间,都会自己停下;你再发一条消息就接着干。",
1710
+ "en": "After /goal <condition> the agent keeps working until the condition holds (/goal alone asks for it). Each time it wants to stop, a model reads the evidence: met, or the next step. It stops by itself when you interrupt, a model call fails, it idles or goes in circles, or its allowance runs out; your next message picks it up again."
1711
+ },
1712
+ "defaultEnabled": true,
1713
+ "options": [
1714
+ {
1715
+ "key": "checker",
1716
+ "kind": "choice",
1717
+ "default": "model",
1718
+ "label": {
1719
+ "zh": "谁来判断目标是否达成",
1720
+ "en": "Who checks whether the goal holds"
1721
+ },
1722
+ "help": {
1723
+ "zh": "大模型读目标、这一轮做了什么、最后一次测试的结果和结束语,给出结论和下一步;它没答上来时才退回 Jev。无论哪种,没勾的验收条件、改完没跑都算没达成。",
1724
+ "en": "A model reads the goal, what the run did, the last test run and the closing message, and gives a verdict and the next step; Jev only when it gives no answer. Either way an open acceptance item or an unverified edit means not yet."
1725
+ },
1726
+ "choices": [
1727
+ {
1728
+ "value": "model",
1729
+ "label": {
1730
+ "zh": "大模型(推荐)",
1731
+ "en": "A model (recommended)"
1732
+ }
1733
+ },
1734
+ {
1735
+ "value": "jev",
1736
+ "label": {
1737
+ "zh": "Jev 判定器",
1738
+ "en": "The Jev judge"
1739
+ }
1740
+ }
1741
+ ]
1742
+ },
1743
+ {
1744
+ "key": "checkModel",
1745
+ "kind": "text",
1746
+ "default": "",
1747
+ "label": {
1748
+ "zh": "判断用的模型",
1749
+ "en": "Model for the check"
1750
+ },
1751
+ "help": {
1752
+ "zh": "写成「提供商/模型」。留空就用当前会话的模型。",
1753
+ "en": "As provider/model. Empty: the session's current model."
1754
+ }
1755
+ },
1756
+ {
1757
+ "key": "checkThinking",
1758
+ "kind": "choice",
1759
+ "default": "off",
1760
+ "label": {
1761
+ "zh": "判断时的思考等级",
1762
+ "en": "Thinking level of the check"
1763
+ },
1764
+ "choices": [
1765
+ {
1766
+ "value": "off",
1767
+ "label": {
1768
+ "zh": "不思考",
1769
+ "en": "Off"
1770
+ }
1771
+ },
1772
+ {
1773
+ "value": "minimal",
1774
+ "label": {
1775
+ "zh": "极少",
1776
+ "en": "Minimal"
1777
+ }
1778
+ },
1779
+ {
1780
+ "value": "low",
1781
+ "label": {
1782
+ "zh": "低",
1783
+ "en": "Low"
1784
+ }
1785
+ },
1786
+ {
1787
+ "value": "medium",
1788
+ "label": {
1789
+ "zh": "中",
1790
+ "en": "Medium"
1791
+ }
1792
+ },
1793
+ {
1794
+ "value": "high",
1795
+ "label": {
1796
+ "zh": "高",
1797
+ "en": "High"
1798
+ }
1799
+ }
1800
+ ]
1801
+ },
1802
+ {
1803
+ "key": "checkTimeoutMs",
1804
+ "kind": "number",
1805
+ "default": 90000,
1806
+ "min": 5000,
1807
+ "max": 600000,
1808
+ "unit": {
1809
+ "zh": "毫秒",
1810
+ "en": "ms"
1811
+ },
1812
+ "label": {
1813
+ "zh": "判断最多等多久",
1814
+ "en": "Longest wait for the check"
1815
+ },
1816
+ "help": {
1817
+ "zh": "超时就退回 Jev 判定器,再退回只看事实。",
1818
+ "en": "After that, Jev decides, and failing that the facts alone."
1819
+ }
1820
+ },
1821
+ {
1822
+ "key": "stallLimit",
1823
+ "kind": "number",
1824
+ "default": 2,
1825
+ "min": 1,
1826
+ "max": 10,
1827
+ "label": {
1828
+ "zh": "连续几轮没进展就停",
1829
+ "en": "Runs without progress before it stops"
1830
+ },
1831
+ "help": {
1832
+ "zh": "判断者发现代理在重复自己、原地打转。第一次会让它换个思路,到这个次数就停下来问你。",
1833
+ "en": "The check found the agent repeating itself. The first time it is told to change course; at this count the goal pauses for you."
1834
+ }
1835
+ },
1836
+ {
1837
+ "key": "maxContinuations",
1838
+ "kind": "number",
1839
+ "default": 20,
1840
+ "min": 1,
1841
+ "max": 200,
1842
+ "label": {
1843
+ "zh": "最多自动续跑次数",
1844
+ "en": "Continuations at most"
1845
+ },
1846
+ "help": {
1847
+ "zh": "从你上一次发言算起。",
1848
+ "en": "Counted from your last message."
1849
+ }
1850
+ },
1851
+ {
1852
+ "key": "maxMinutes",
1853
+ "kind": "number",
1854
+ "default": 180,
1855
+ "min": 5,
1856
+ "max": 1440,
1857
+ "label": {
1858
+ "zh": "最长自动运行(分钟)",
1859
+ "en": "Minutes at most"
1860
+ },
1861
+ "help": {
1862
+ "zh": "从你上一次发言算起。",
1863
+ "en": "Counted from your last message."
1864
+ }
1865
+ },
1866
+ {
1867
+ "key": "idleLimit",
1868
+ "kind": "number",
1869
+ "default": 2,
1870
+ "min": 1,
1871
+ "max": 10,
1872
+ "label": {
1873
+ "zh": "连续空转几次就停",
1874
+ "en": "Idle runs before it stops"
1875
+ },
1876
+ "help": {
1877
+ "zh": "模型连续几次什么工具都没用就结束,说明它在原地打转。",
1878
+ "en": "Runs in a row that ended without a single tool call: the agent is going nowhere."
1879
+ }
1880
+ }
1881
+ ]
1882
+ },
1883
+ {
1884
+ "name": "board",
1885
+ "title": {
1886
+ "zh": "人话看板",
1887
+ "en": "Plain-language board"
1888
+ },
1889
+ "summary": {
1890
+ "zh": "用大白话告诉你项目推进到哪、现在在干什么、有什么要你确认。Jev 从发生的事里挑出要点,会说人话的模型来写;一轮做完再总结一遍。只给人看,不进模型的上下文。每个项目单独开关;第一次打开时选一个模型来讲,之后可以换。",
1891
+ "en": "Tells you in plain words how far the work is, what is happening now and what waits on you. Jev picks the news from what happened, a plain-speaking model writes, and a finished run is summed up once more. For you only, never in the model's context. Switched per project (/board on, /board off); the first time, you pick the model that writes it (/board model changes it)."
1892
+ },
1893
+ "defaultEnabled": true,
1894
+ "options": [
1895
+ {
1896
+ "key": "defaultOn",
1897
+ "kind": "boolean",
1898
+ "default": false,
1899
+ "label": {
1900
+ "zh": "没单独设置过的项目也打开",
1901
+ "en": "On for projects not switched yet"
1902
+ },
1903
+ "help": {
1904
+ "zh": "默认关闭:看板每更新一次就调用一次模型。",
1905
+ "en": "Off by default: each update of the board costs a model call."
1906
+ }
1907
+ },
1908
+ {
1909
+ "key": "model",
1910
+ "kind": "text",
1911
+ "default": "",
1912
+ "label": {
1913
+ "zh": "写看板的模型",
1914
+ "en": "Model that writes the board"
1915
+ },
1916
+ "help": {
1917
+ "zh": "写成「提供商/模型」,填了就不再问。留空:第一次打开看板时让你挑一个(推荐 Claude Opus 4.6,其次 Gemini 3.8 Flash),挑好的会记住。",
1918
+ "en": "As provider/model; set here, nobody is asked. Empty: you pick one the first time the board is switched on (Claude Opus 4.6 recommended, then Gemini 3.8 Flash), kept in mu/board.json; none picked: the writer model, else the session's."
1919
+ }
1920
+ },
1921
+ {
1922
+ "key": "language",
1923
+ "kind": "choice",
1924
+ "default": "auto",
1925
+ "label": {
1926
+ "zh": "看板的语言",
1927
+ "en": "Language of the board"
1928
+ },
1929
+ "choices": [
1930
+ {
1931
+ "value": "auto",
1932
+ "label": {
1933
+ "zh": "跟着你说的话",
1934
+ "en": "The one you write in"
1935
+ }
1936
+ },
1937
+ {
1938
+ "value": "zh",
1939
+ "label": {
1940
+ "zh": "中文",
1941
+ "en": "Chinese"
1942
+ }
1943
+ },
1944
+ {
1945
+ "value": "en",
1946
+ "label": {
1947
+ "zh": "英文",
1948
+ "en": "English"
1949
+ }
1950
+ }
1951
+ ]
1952
+ },
1953
+ {
1954
+ "key": "everyTools",
1955
+ "kind": "number",
1956
+ "default": 5,
1957
+ "min": 1,
1958
+ "max": 100,
1959
+ "label": {
1960
+ "zh": "代理每做几步看一次",
1961
+ "en": "Tool calls between two looks"
1962
+ }
1963
+ },
1964
+ {
1965
+ "key": "minIntervalMs",
1966
+ "kind": "number",
1967
+ "default": 20000,
1968
+ "min": 0,
1969
+ "max": 600000,
1970
+ "unit": {
1971
+ "zh": "毫秒",
1972
+ "en": "ms"
1973
+ },
1974
+ "label": {
1975
+ "zh": "干活时两次查看至少隔多久",
1976
+ "en": "Shortest gap between two looks while it works"
1977
+ },
1978
+ "help": {
1979
+ "zh": "代理停下时总会看一次,不受这个限制。",
1980
+ "en": "When the agent stops it always looks, whatever this says."
1981
+ }
1982
+ },
1983
+ {
1984
+ "key": "maxSteps",
1985
+ "kind": "number",
1986
+ "default": 10,
1987
+ "min": 3,
1988
+ "max": 50,
1989
+ "label": {
1990
+ "zh": "每次读最近几步",
1991
+ "en": "Latest tool calls read each time"
1992
+ }
1993
+ },
1994
+ {
1995
+ "key": "narrateTimeoutMs",
1996
+ "kind": "number",
1997
+ "default": 60000,
1998
+ "min": 5000,
1999
+ "max": 300000,
2000
+ "unit": {
2001
+ "zh": "毫秒",
2002
+ "en": "ms"
2003
+ },
2004
+ "label": {
2005
+ "zh": "写看板最多等多久",
2006
+ "en": "Longest wait for the writer"
2007
+ },
2008
+ "help": {
2009
+ "zh": "超时就用固定的句子说。",
2010
+ "en": "After that, fixed sentences are used."
2011
+ }
2012
+ }
2013
+ ]
2014
+ },
2015
+ {
2016
+ "name": "completion",
2017
+ "title": {
2018
+ "zh": "完成核对",
2019
+ "en": "Completion check"
2020
+ },
2021
+ "summary": {
2022
+ "zh": "「做完了」之前确认有没有验证过。",
2023
+ "en": "Checks that something verified the work before it is called done."
2024
+ },
2025
+ "defaultEnabled": true,
2026
+ "options": [
2027
+ {
2028
+ "key": "waitMs",
2029
+ "kind": "number",
2030
+ "default": 3000,
2031
+ "min": 500,
2032
+ "max": 30000,
2033
+ "unit": {
2034
+ "zh": "毫秒",
2035
+ "en": "ms"
2036
+ },
2037
+ "label": {
2038
+ "zh": "最多等待",
2039
+ "en": "Wait at most"
2040
+ },
2041
+ "help": {
2042
+ "zh": "超时就不催了,判定只记账。",
2043
+ "en": "After this there is no nudge; the verdict is only recorded."
2044
+ }
2045
+ }
2046
+ ]
2047
+ },
2048
+ {
2049
+ "name": "notify",
2050
+ "title": {
2051
+ "zh": "通知分流",
2052
+ "en": "Notification routing"
2053
+ },
2054
+ "summary": {
2055
+ "zh": "决定各类事件何时告诉模型。",
2056
+ "en": "Decides when events are told to the model."
2057
+ },
2058
+ "defaultEnabled": true,
2059
+ "options": [
2060
+ {
2061
+ "key": "budgetThresholds",
2062
+ "kind": "numbers",
2063
+ "default": [
2064
+ 70,
2065
+ 85
2066
+ ],
2067
+ "label": {
2068
+ "zh": "上下文预算提醒(%)",
2069
+ "en": "Context budget notices (%)"
2070
+ }
2071
+ }
2072
+ ]
2073
+ },
2074
+ {
2075
+ "name": "warming",
2076
+ "title": {
2077
+ "zh": "缓存保温",
2078
+ "en": "Cache warming"
2079
+ },
2080
+ "summary": {
2081
+ "zh": "在提示词缓存过期前视情况续一下。",
2082
+ "en": "Refreshes the prompt cache before it expires when that pays off."
2083
+ },
2084
+ "defaultEnabled": true,
2085
+ "options": []
2086
+ },
2087
+ {
2088
+ "name": "warmup",
2089
+ "title": {
2090
+ "zh": "判定连接保温",
2091
+ "en": "Judge connection warm-up"
2092
+ },
2093
+ "summary": {
2094
+ "zh": "会话在用时每隔一会儿问判定器一个小问题,让连接一直热着:一轮开始前的判定省下 1–3 秒的建连。",
2095
+ "en": "While the session is in use, one tiny question keeps the judge's connection warm: the questions before a turn skip 1-3 s of connecting."
2096
+ },
2097
+ "defaultEnabled": true,
2098
+ "options": [
2099
+ {
2100
+ "key": "intervalMs",
2101
+ "kind": "number",
2102
+ "default": 50000,
2103
+ "min": 10000,
2104
+ "max": 85000,
2105
+ "unit": {
2106
+ "zh": "毫秒",
2107
+ "en": "ms"
2108
+ },
2109
+ "label": {
2110
+ "zh": "间隔",
2111
+ "en": "Every"
2112
+ },
2113
+ "help": {
2114
+ "zh": "服务端空闲约 90 秒断开,间隔要短于它。",
2115
+ "en": "The server drops a connection idle for about 90 s; stay under that."
2116
+ }
2117
+ },
2118
+ {
2119
+ "key": "idleMs",
2120
+ "kind": "number",
2121
+ "default": 900000,
2122
+ "min": 60000,
2123
+ "max": 7200000,
2124
+ "unit": {
2125
+ "zh": "毫秒",
2126
+ "en": "ms"
2127
+ },
2128
+ "label": {
2129
+ "zh": "多久没动静就停",
2130
+ "en": "Stop after this much quiet"
2131
+ }
2132
+ }
2133
+ ]
2134
+ },
2135
+ {
2136
+ "name": "swarm",
2137
+ "title": {
2138
+ "zh": "子代理",
2139
+ "en": "Sub-agents"
2140
+ },
2141
+ "summary": {
2142
+ "zh": "把任务委派给按角色分工的子代理。",
2143
+ "en": "Delegates tasks to sub-agents with roles."
2144
+ },
2145
+ "defaultEnabled": true,
2146
+ "options": [
2147
+ {
2148
+ "key": "models",
2149
+ "kind": "list",
2150
+ "default": [],
2151
+ "label": {
2152
+ "zh": "模型梯队(从便宜到强)",
2153
+ "en": "Model ladder (cheapest to strongest)"
2154
+ },
2155
+ "help": {
2156
+ "zh": "留空则子代理都用当前会话的模型。",
2157
+ "en": "Empty means every sub-agent uses the session's model."
2158
+ }
2159
+ },
2160
+ {
2161
+ "key": "maxTasks",
2162
+ "kind": "number",
2163
+ "default": 6,
2164
+ "min": 1,
2165
+ "max": 32,
2166
+ "label": {
2167
+ "zh": "一次最多委派",
2168
+ "en": "Tasks per call at most"
2169
+ }
2170
+ },
2171
+ {
2172
+ "key": "concurrency",
2173
+ "kind": "number",
2174
+ "default": 3,
2175
+ "min": 1,
2176
+ "max": 16,
2177
+ "label": {
2178
+ "zh": "同时运行",
2179
+ "en": "Running at once"
2180
+ }
2181
+ },
2182
+ {
2183
+ "key": "defaultAgent",
2184
+ "kind": "text",
2185
+ "default": "worker",
2186
+ "label": {
2187
+ "zh": "默认角色",
2188
+ "en": "Default role"
2189
+ }
2190
+ },
2191
+ {
2192
+ "key": "agentsDir",
2193
+ "kind": "text",
2194
+ "default": "",
2195
+ "label": {
2196
+ "zh": "自定义角色目录",
2197
+ "en": "Folder with your own roles"
2198
+ },
2199
+ "help": {
2200
+ "zh": "留空使用 <agent 目录>/agents。",
2201
+ "en": "Empty uses <agent dir>/agents."
2202
+ }
2203
+ },
2204
+ {
2205
+ "key": "isolation",
2206
+ "kind": "choice",
2207
+ "default": "worktree",
2208
+ "choices": [
2209
+ {
2210
+ "value": "worktree",
2211
+ "label": {
2212
+ "zh": "在独立的 git worktree 里改",
2213
+ "en": "Edit in a git worktree of its own"
2214
+ }
2215
+ },
2216
+ {
2217
+ "value": "none",
2218
+ "label": {
2219
+ "zh": "直接在当前目录改",
2220
+ "en": "Edit in place"
2221
+ }
2222
+ }
2223
+ ],
2224
+ "label": {
2225
+ "zh": "会改文件的子代理",
2226
+ "en": "Sub-agents that edit files"
2227
+ },
2228
+ "help": {
2229
+ "zh": "隔离时改动以补丁交回,由主代理用 apply_patch_from 决定是否应用;不在 git 仓库里时自动退回原地修改。",
2230
+ "en": "Isolated changes come back as a patch that the main agent applies with apply_patch_from, or not. Outside a git repository it falls back to editing in place."
2231
+ }
2232
+ },
2233
+ {
2234
+ "key": "carryUncommitted",
2235
+ "kind": "boolean",
2236
+ "default": true,
2237
+ "label": {
2238
+ "zh": "带上未提交的改动",
2239
+ "en": "Carry uncommitted changes over"
2240
+ },
2241
+ "help": {
2242
+ "zh": "子代理从主代理当前看到的文件状态开始,而不是从上一次提交开始。",
2243
+ "en": "The sub-agent starts from the files as the main agent sees them, not from the last commit."
2244
+ }
2245
+ },
2246
+ {
2247
+ "key": "patchPreviewLines",
2248
+ "kind": "number",
2249
+ "default": 30,
2250
+ "min": 0,
2251
+ "max": 400,
2252
+ "label": {
2253
+ "zh": "补丁预览行数",
2254
+ "en": "Lines of patch preview"
2255
+ },
2256
+ "help": {
2257
+ "zh": "随子代理报告一起给主代理看的补丁开头。",
2258
+ "en": "The beginning of the patch shown with the sub-agent's report."
2259
+ }
2260
+ }
2261
+ ]
2262
+ },
2263
+ {
2264
+ "name": "hive",
2265
+ "title": {
2266
+ "zh": "蜂群",
2267
+ "en": "Hive"
2268
+ },
2269
+ "summary": {
2270
+ "zh": "多只蜂并行攻一个难题,判定器把关它们之间传什么。",
2271
+ "en": "Several bees work one hard task in parallel; the judge gates what passes between them."
2272
+ },
2273
+ "defaultEnabled": true,
2274
+ "options": [
2275
+ {
2276
+ "key": "maxNotesPerBee",
2277
+ "kind": "number",
2278
+ "default": 12,
2279
+ "min": 1,
2280
+ "max": 100,
2281
+ "label": {
2282
+ "zh": "每只蜂最多发布",
2283
+ "en": "Notes per bee at most"
2284
+ }
2285
+ },
2286
+ {
2287
+ "key": "maxDeliveriesPerBee",
2288
+ "kind": "number",
2289
+ "default": 10,
2290
+ "min": 1,
2291
+ "max": 100,
2292
+ "label": {
2293
+ "zh": "每只蜂最多收到",
2294
+ "en": "Deliveries per bee at most"
2295
+ }
2296
+ },
2297
+ {
2298
+ "key": "checkpointEvery",
2299
+ "kind": "number",
2300
+ "default": 4,
2301
+ "min": 0,
2302
+ "max": 50,
2303
+ "label": {
2304
+ "zh": "沉默几次工具调用后询问进展",
2305
+ "en": "Ask for findings after this many silent tool calls"
2306
+ },
2307
+ "help": {
2308
+ "zh": "0 表示不询问。",
2309
+ "en": "0 turns this off."
2310
+ }
2311
+ },
2312
+ {
2313
+ "key": "lastCall",
2314
+ "kind": "boolean",
2315
+ "default": true,
2316
+ "label": {
2317
+ "zh": "写报告时再听一次新消息",
2318
+ "en": "One last hearing while writing the report"
2319
+ }
2320
+ },
2321
+ {
2322
+ "key": "maxRelatedPerNote",
2323
+ "kind": "number",
2324
+ "default": 6,
2325
+ "min": 0,
2326
+ "max": 30,
2327
+ "label": {
2328
+ "zh": "一条新发现最多对照几条旧发现",
2329
+ "en": "Earlier findings a new one is held against, at most"
2330
+ },
2331
+ "help": {
2332
+ "zh": "只对照有共同词的旧发现。0 表示不做纠正。",
2333
+ "en": "Only those sharing words with it. 0 turns corrections off."
2334
+ }
2335
+ },
2336
+ {
2337
+ "key": "verifyConflicts",
2338
+ "kind": "number",
2339
+ "default": 1,
2340
+ "min": 0,
2341
+ "max": 3,
2342
+ "label": {
2343
+ "zh": "为没解决的冲突最多加派几只验证蜂",
2344
+ "en": "Verifier bees for unsettled disputes, at most"
2345
+ },
2346
+ "help": {
2347
+ "zh": "0 表示不加派,冲突两边都留在报告里。",
2348
+ "en": "0 adds none; both sides stay in the report."
2349
+ }
2350
+ },
2351
+ {
2352
+ "key": "verifyAfterSeconds",
2353
+ "kind": "number",
2354
+ "default": 60,
2355
+ "min": 0,
2356
+ "max": 600,
2357
+ "label": {
2358
+ "zh": "冲突挂多少秒没人解决才加派",
2359
+ "en": "Seconds a dispute may stand before a verifier is added"
2360
+ }
2361
+ }
2362
+ ]
2363
+ },
2364
+ {
2365
+ "name": "locate",
2366
+ "title": {
2367
+ "zh": "文件定位",
2368
+ "en": "File location"
2369
+ },
2370
+ "summary": {
2371
+ "zh": "用描述找文件的 locate 工具。",
2372
+ "en": "The locate tool: find files by description."
2373
+ },
2374
+ "defaultEnabled": true,
2375
+ "options": [
2376
+ {
2377
+ "key": "candidates",
2378
+ "kind": "number",
2379
+ "default": 40,
2380
+ "min": 5,
2381
+ "max": 400,
2382
+ "label": {
2383
+ "zh": "送判的候选数",
2384
+ "en": "Candidates judged"
2385
+ }
2386
+ },
2387
+ {
2388
+ "key": "results",
2389
+ "kind": "number",
2390
+ "default": 12,
2391
+ "min": 1,
2392
+ "max": 100,
2393
+ "label": {
2394
+ "zh": "返回条数",
2395
+ "en": "Results returned"
2396
+ }
2397
+ }
2398
+ ]
2399
+ },
2400
+ {
2401
+ "name": "browser",
2402
+ "title": {
2403
+ "zh": "内置浏览器",
2404
+ "en": "Built-in browser"
2405
+ },
2406
+ "summary": {
2407
+ "zh": "判定器驱动的浏览器,用自己独立的配置目录,从不动你的浏览器。",
2408
+ "en": "A judge-driven browser with its own profile; it never touches yours."
2409
+ },
2410
+ "defaultEnabled": true,
2411
+ "options": [
2412
+ {
2413
+ "key": "headless",
2414
+ "kind": "boolean",
2415
+ "default": true,
2416
+ "label": {
2417
+ "zh": "无界面运行",
2418
+ "en": "Run headless"
2419
+ }
2420
+ },
2421
+ {
2422
+ "key": "maxSteps",
2423
+ "kind": "number",
2424
+ "default": 40,
2425
+ "min": 1,
2426
+ "max": 200,
2427
+ "label": {
2428
+ "zh": "每次最多步数",
2429
+ "en": "Steps per run at most"
2430
+ }
2431
+ },
2432
+ {
2433
+ "key": "textChars",
2434
+ "kind": "number",
2435
+ "default": 4000,
2436
+ "min": 500,
2437
+ "max": 50000,
2438
+ "unit": {
2439
+ "zh": "字符",
2440
+ "en": "chars"
2441
+ },
2442
+ "label": {
2443
+ "zh": "每步读取的页面文字",
2444
+ "en": "Page text read per step"
2445
+ }
2446
+ },
2447
+ {
2448
+ "key": "embedded",
2449
+ "kind": "boolean",
2450
+ "default": true,
2451
+ "label": {
2452
+ "zh": "桌面端运行时使用应用内的浏览器面板",
2453
+ "en": "Use the desktop app's browser panel when it is running"
2454
+ },
2455
+ "help": {
2456
+ "zh": "这样每一步都看得见,可以随时暂停、停止或接管;应用没开时用 mu 自己的浏览器。",
2457
+ "en": "Every step is then visible and can be paused, stopped or taken over; without the app mu's own browser is used."
2458
+ }
2459
+ },
2460
+ {
2461
+ "key": "profileDir",
2462
+ "kind": "text",
2463
+ "default": "",
2464
+ "label": {
2465
+ "zh": "浏览器配置目录",
2466
+ "en": "Browser profile folder"
2467
+ },
2468
+ "help": {
2469
+ "zh": "留空使用 mu 自己的目录。",
2470
+ "en": "Empty uses mu's own folder."
2471
+ }
2472
+ }
2473
+ ]
2474
+ },
2475
+ {
2476
+ "name": "background",
2477
+ "title": {
2478
+ "zh": "后台命令",
2479
+ "en": "Background commands"
2480
+ },
2481
+ "summary": {
2482
+ "zh": "开发服务器、长时间构建放到后台跑,不占用回合;结束时是否打断交给「通知分流」;会话结束时全部终止。",
2483
+ "en": "bg_start / bg_output / bg_stop: dev servers and long builds without blocking the turn. Whether the end of a job interrupts is decided by notification routing; every job stops with the session."
2484
+ },
2485
+ "defaultEnabled": true,
2486
+ "options": [
2487
+ {
2488
+ "key": "maxJobs",
2489
+ "kind": "number",
2490
+ "default": 8,
2491
+ "min": 1,
2492
+ "max": 32,
2493
+ "label": {
2494
+ "zh": "同时运行的任务上限",
2495
+ "en": "Jobs running at the same time"
2496
+ }
2497
+ },
2498
+ {
2499
+ "key": "bufferChars",
2500
+ "kind": "number",
2501
+ "default": 262144,
2502
+ "min": 10000,
2503
+ "unit": {
2504
+ "zh": "字符",
2505
+ "en": "chars"
2506
+ },
2507
+ "label": {
2508
+ "zh": "每个任务留在内存里的输出",
2509
+ "en": "Output kept in memory per job"
2510
+ },
2511
+ "help": {
2512
+ "zh": "只留最新的;完整输出在日志文件里。",
2513
+ "en": "The newest is kept; the log file has everything."
2514
+ }
2515
+ },
2516
+ {
2517
+ "key": "maxOutputChars",
2518
+ "kind": "number",
2519
+ "default": 20000,
2520
+ "min": 1000,
2521
+ "unit": {
2522
+ "zh": "字符",
2523
+ "en": "chars"
2524
+ },
2525
+ "label": {
2526
+ "zh": "bg_output 单次返回上限",
2527
+ "en": "Most that one bg_output returns"
2528
+ }
2529
+ },
2530
+ {
2531
+ "key": "killGraceMs",
2532
+ "kind": "number",
2533
+ "default": 3000,
2534
+ "min": 0,
2535
+ "unit": {
2536
+ "zh": "毫秒",
2537
+ "en": "ms"
2538
+ },
2539
+ "label": {
2540
+ "zh": "强制终止前的等待",
2541
+ "en": "Wait before a job is killed by force"
2542
+ },
2543
+ "help": {
2544
+ "zh": "先发 SIGTERM(Windows 上是不带 /F 的 taskkill),超时后强制。",
2545
+ "en": "SIGTERM first (taskkill without /F on Windows), force after this long."
2546
+ }
2547
+ },
2548
+ {
2549
+ "key": "logDir",
2550
+ "kind": "text",
2551
+ "default": "",
2552
+ "label": {
2553
+ "zh": "日志目录",
2554
+ "en": "Log directory"
2555
+ },
2556
+ "help": {
2557
+ "zh": "留空为 ~/.mu/jobs/<会话 id>,7 天后清理。",
2558
+ "en": "Empty means ~/.mu/jobs/<session id>, cleared after 7 days."
2559
+ }
2560
+ },
2561
+ {
2562
+ "key": "inheritShell",
2563
+ "kind": "boolean",
2564
+ "default": true,
2565
+ "label": {
2566
+ "zh": "沿用前台 shell 设置",
2567
+ "en": "Use the foreground shell settings"
2568
+ },
2569
+ "help": {
2570
+ "zh": "和 bash 工具用同一套 shell 设置。",
2571
+ "en": "Reads shellPath and shellCommandPrefix from settings.json, like the bash tool."
2572
+ }
2573
+ },
2574
+ {
2575
+ "key": "wakeWhenIdle",
2576
+ "kind": "boolean",
2577
+ "default": false,
2578
+ "label": {
2579
+ "zh": "空闲时任务结束可唤醒代理",
2580
+ "en": "A finished job may wake an idle agent"
2581
+ },
2582
+ "help": {
2583
+ "zh": "只有判定为「立刻」时才会开始新回合;关闭时只留一条消息。",
2584
+ "en": "Only a verdict of \"now\" starts a turn; when off the notice is only appended."
2585
+ }
2586
+ }
2587
+ ]
2588
+ },
2589
+ {
2590
+ "name": "web",
2591
+ "title": {
2592
+ "zh": "网页读取与搜索",
2593
+ "en": "Web reading and search"
2594
+ },
2595
+ "summary": {
2596
+ "zh": "把网页读成文字(限时限量,拒绝内网地址,页面文字标为不可信);网页搜索用国内不需要密钥就能访问的搜索源。",
2597
+ "en": "web_fetch reads a page as text (time and size limits, internal addresses refused, page text labelled untrusted); web_search uses a source that answers from mainland China without a key."
2598
+ },
2599
+ "defaultEnabled": true,
2600
+ "options": [
2601
+ {
2602
+ "key": "search",
2603
+ "kind": "text",
2604
+ "default": "so",
2605
+ "label": {
2606
+ "zh": "搜索源",
2607
+ "en": "Search source"
2608
+ },
2609
+ "help": {
2610
+ "zh": "so(360)、sogou、bing-cn、searxng:<地址>,或带 {query} 的网址。",
2611
+ "en": "so (360), sogou, bing-cn, searxng:<base url>, or a URL with {query} in it."
2612
+ }
2613
+ },
2614
+ {
2615
+ "key": "searchFallback",
2616
+ "kind": "boolean",
2617
+ "default": true,
2618
+ "label": {
2619
+ "zh": "失败时换用其他内置源",
2620
+ "en": "Try the other built-in sources on failure"
2621
+ },
2622
+ "help": {
2623
+ "zh": "遇到验证页、没有结果或结果与查询无关时生效。",
2624
+ "en": "Applies to a verification page, no results, or results unrelated to the query."
2625
+ }
2626
+ },
2627
+ {
2628
+ "key": "maxChars",
2629
+ "kind": "number",
2630
+ "default": 20000,
2631
+ "min": 500,
2632
+ "unit": {
2633
+ "zh": "字符",
2634
+ "en": "chars"
2635
+ },
2636
+ "label": {
2637
+ "zh": "一次读取网页最多返回",
2638
+ "en": "Most that one web_fetch returns"
2639
+ }
2640
+ },
2641
+ {
2642
+ "key": "timeoutMs",
2643
+ "kind": "number",
2644
+ "default": 20000,
2645
+ "min": 1000,
2646
+ "unit": {
2647
+ "zh": "毫秒",
2648
+ "en": "ms"
2649
+ },
2650
+ "label": {
2651
+ "zh": "单次请求时限",
2652
+ "en": "Time limit of one request"
2653
+ }
2654
+ },
2655
+ {
2656
+ "key": "maxBytes",
2657
+ "kind": "number",
2658
+ "default": 2000000,
2659
+ "min": 10000,
2660
+ "label": {
2661
+ "zh": "下载上限(字节)",
2662
+ "en": "Download limit (bytes)"
2663
+ }
2664
+ },
2665
+ {
2666
+ "key": "maxRedirects",
2667
+ "kind": "number",
2668
+ "default": 5,
2669
+ "min": 0,
2670
+ "max": 20,
2671
+ "label": {
2672
+ "zh": "最多跟随的重定向",
2673
+ "en": "Redirects followed"
2674
+ }
2675
+ },
2676
+ {
2677
+ "key": "allowLoopback",
2678
+ "kind": "boolean",
2679
+ "default": true,
2680
+ "label": {
2681
+ "zh": "允许读取本机开发服务器",
2682
+ "en": "Allow this machine's dev servers"
2683
+ },
2684
+ "help": {
2685
+ "zh": "仅当网址直接写 localhost 或 127.0.0.1 时;从外部网页重定向过来的一律拒绝。",
2686
+ "en": "Only when the URL itself says localhost or 127.0.0.1; a redirect from the web is always refused."
2687
+ }
2688
+ },
2689
+ {
2690
+ "key": "allowPrivate",
2691
+ "kind": "boolean",
2692
+ "default": false,
2693
+ "label": {
2694
+ "zh": "允许内网地址",
2695
+ "en": "Allow private network addresses"
2696
+ },
2697
+ "help": {
2698
+ "zh": "10/8、172.16/12、192.168/16、链路本地等。默认拒绝,防止网页诱导读取内网。",
2699
+ "en": "10/8, 172.16/12, 192.168/16, link-local and the like. Refused by default so a page cannot steer the reader into the local network."
2700
+ }
2701
+ }
2702
+ ]
2703
+ },
2704
+ {
2705
+ "name": "welcome",
2706
+ "title": {
2707
+ "zh": "欢迎页",
2708
+ "en": "Welcome screen"
2709
+ },
2710
+ "summary": {
2711
+ "zh": "终端里的欢迎框和身份说明。",
2712
+ "en": "The welcome box in the terminal and the identity note."
2713
+ },
2714
+ "defaultEnabled": true,
2715
+ "options": []
2716
+ },
2717
+ {
2718
+ "name": "inherit",
2719
+ "title": {
2720
+ "zh": "沿用已有配置",
2721
+ "en": "Inherit existing setup"
2722
+ },
2723
+ "summary": {
2724
+ "zh": "首次运行就沿用你给 Claude Code、Cursor、Codex 配好的规则、技能和 MCP 服务器,只读不写。常驻规则进提示词;按文件匹配的规则只在碰到匹配文件时随工具结果交给模型一次;其余规则只列描述。项目里的内容只在项目受信任时才用。",
2725
+ "en": "Uses the rules, skills and MCP servers you already set up for Claude Code, Cursor and Codex, read-only. Always-on rules join the prompt; a rule scoped to file patterns is handed over once, with the result of the first tool that touches a matching file; the rest are listed by description. Project content is only used for a trusted project."
2726
+ },
2727
+ "defaultEnabled": true,
2728
+ "options": [
2729
+ {
2730
+ "key": "claude",
2731
+ "kind": "boolean",
2732
+ "default": true,
2733
+ "label": {
2734
+ "zh": "来自 Claude Code",
2735
+ "en": "From Claude Code"
2736
+ }
2737
+ },
2738
+ {
2739
+ "key": "cursor",
2740
+ "kind": "boolean",
2741
+ "default": true,
2742
+ "label": {
2743
+ "zh": "来自 Cursor",
2744
+ "en": "From Cursor"
2745
+ }
2746
+ },
2747
+ {
2748
+ "key": "codex",
2749
+ "kind": "boolean",
2750
+ "default": true,
2751
+ "label": {
2752
+ "zh": "来自 Codex",
2753
+ "en": "From Codex"
2754
+ }
2755
+ },
2756
+ {
2757
+ "key": "rules",
2758
+ "kind": "boolean",
2759
+ "default": true,
2760
+ "label": {
2761
+ "zh": "沿用规则",
2762
+ "en": "Inherit rules"
2763
+ }
2764
+ },
2765
+ {
2766
+ "key": "skills",
2767
+ "kind": "boolean",
2768
+ "default": true,
2769
+ "label": {
2770
+ "zh": "沿用技能",
2771
+ "en": "Inherit skills"
2772
+ }
2773
+ },
2774
+ {
2775
+ "key": "mcp",
2776
+ "kind": "boolean",
2777
+ "default": true,
2778
+ "label": {
2779
+ "zh": "沿用 MCP 服务器",
2780
+ "en": "Inherit MCP servers"
2781
+ },
2782
+ "help": {
2783
+ "zh": "关掉后只用你自己在设置文件里定义的服务器。",
2784
+ "en": "When off, only the servers under mcp.servers in mu.json are used."
2785
+ }
2786
+ },
2787
+ {
2788
+ "key": "maxRuleChars",
2789
+ "kind": "number",
2790
+ "default": 4000,
2791
+ "min": 500,
2792
+ "max": 20000,
2793
+ "unit": {
2794
+ "zh": "字符",
2795
+ "en": "chars"
2796
+ },
2797
+ "label": {
2798
+ "zh": "单条按文件规则最多交给模型",
2799
+ "en": "Most of one file-scoped rule handed over"
2800
+ },
2801
+ "help": {
2802
+ "zh": "超出的部分留在文件里,模型可以自己去读。",
2803
+ "en": "The rest stays in the file for the model to read."
2804
+ }
2805
+ },
2806
+ {
2807
+ "key": "maxAlwaysChars",
2808
+ "kind": "number",
2809
+ "default": 16000,
2810
+ "min": 0,
2811
+ "max": 100000,
2812
+ "unit": {
2813
+ "zh": "字符",
2814
+ "en": "chars"
2815
+ },
2816
+ "label": {
2817
+ "zh": "常驻规则总量上限",
2818
+ "en": "Budget for always-on rules"
2819
+ },
2820
+ "help": {
2821
+ "zh": "放不下的常驻规则改为只列描述,避免提示词被规则撑大。",
2822
+ "en": "Always-on rules that do not fit are listed by description instead, so rules cannot bloat the prompt."
2823
+ }
2824
+ }
2825
+ ]
2826
+ },
2827
+ {
2828
+ "name": "mcp",
2829
+ "title": {
2830
+ "zh": "MCP 服务器",
2831
+ "en": "MCP servers"
2832
+ },
2833
+ "summary": {
2834
+ "zh": "内置的 MCP 客户端(stdio 与 Streamable HTTP)。每个服务器是能力目录里的一项,默认隐藏:Jev 认定任务需要,或模型主动申请,才启动进程并注册它的工具。工具清单会缓存,服务器没跑过 Jev 也有描述可判。项目里定义的服务器第一次启动前要你点头,定义变了会再问。在设置文件里可以把某个服务器设为常开。",
2835
+ "en": "A built-in MCP client (stdio and Streamable HTTP). Each server is a catalog entry that stays hidden: its process starts and its tools register only when the judge finds the task needs it or the model asks through find_capability. Tool lists are cached, so the judge has a description before a server ever ran. A server defined by a project asks before its first start, and again when its definition changes. \"exposure\": \"always\" under mcp.servers in mu.json keeps a server open."
2836
+ },
2837
+ "defaultEnabled": true,
2838
+ "options": [
2839
+ {
2840
+ "key": "startTimeoutMs",
2841
+ "kind": "number",
2842
+ "default": 45000,
2843
+ "min": 1000,
2844
+ "max": 300000,
2845
+ "unit": {
2846
+ "zh": "毫秒",
2847
+ "en": "ms"
2848
+ },
2849
+ "label": {
2850
+ "zh": "启动最多等待",
2851
+ "en": "Start timeout"
2852
+ },
2853
+ "help": {
2854
+ "zh": "npx 一类的服务器第一次要先下载自己。",
2855
+ "en": "An npx-style server downloads itself first."
2856
+ }
2857
+ },
2858
+ {
2859
+ "key": "requestTimeoutMs",
2860
+ "kind": "number",
2861
+ "default": 120000,
2862
+ "min": 1000,
2863
+ "max": 3600000,
2864
+ "unit": {
2865
+ "zh": "毫秒",
2866
+ "en": "ms"
2867
+ },
2868
+ "label": {
2869
+ "zh": "单次调用最多等待",
2870
+ "en": "Call timeout"
2871
+ }
2872
+ },
2873
+ {
2874
+ "key": "waitMs",
2875
+ "kind": "number",
2876
+ "default": 8000,
2877
+ "min": 0,
2878
+ "max": 60000,
2879
+ "unit": {
2880
+ "zh": "毫秒",
2881
+ "en": "ms"
2882
+ },
2883
+ "label": {
2884
+ "zh": "回合开始前最多等常开服务器",
2885
+ "en": "Wait for pinned servers before a turn"
2886
+ }
2887
+ },
2888
+ {
2889
+ "key": "maxResultChars",
2890
+ "kind": "number",
2891
+ "default": 60000,
2892
+ "min": 2000,
2893
+ "max": 1000000,
2894
+ "unit": {
2895
+ "zh": "字符",
2896
+ "en": "chars"
2897
+ },
2898
+ "label": {
2899
+ "zh": "单个结果最多进上下文",
2900
+ "en": "Most of one result kept in context"
2901
+ },
2902
+ "help": {
2903
+ "zh": "超出的部分截掉,完整结果存到文件。",
2904
+ "en": "The rest is cut and the whole result saved to a file."
2905
+ }
2906
+ }
2907
+ ]
2908
+ },
2909
+ {
2910
+ "name": "packs",
2911
+ "title": {
2912
+ "zh": "能力包",
2913
+ "en": "Capability packs"
2914
+ },
2915
+ "summary": {
2916
+ "zh": "随 mu 装好、默认不露的工具包,任务需要时才打开;缺外部程序时给出安装提示。",
2917
+ "en": "Tool packs that ship with mu and stay hidden until a task needs them; a missing program gives an install hint."
2918
+ },
2919
+ "defaultEnabled": true,
2920
+ "options": [
2921
+ {
2922
+ "key": "astGrep",
2923
+ "kind": "boolean",
2924
+ "default": true,
2925
+ "label": {
2926
+ "zh": "ast-grep 结构化搜索与改写",
2927
+ "en": "ast-grep structural search and rewrite"
2928
+ },
2929
+ "help": {
2930
+ "zh": "按语法而不是按文字找代码、改代码。需要本机装有 ast-grep。",
2931
+ "en": "Finds and changes code by syntax, not text. Needs ast-grep on this machine."
2932
+ }
2933
+ },
2934
+ {
2935
+ "key": "maxResults",
2936
+ "kind": "number",
2937
+ "default": 50,
2938
+ "min": 1,
2939
+ "max": 500,
2940
+ "label": {
2941
+ "zh": "一次搜索最多返回",
2942
+ "en": "Matches one search returns"
2943
+ }
2944
+ },
2945
+ {
2946
+ "key": "maxDiffChars",
2947
+ "kind": "number",
2948
+ "default": 12000,
2949
+ "min": 1000,
2950
+ "max": 200000,
2951
+ "unit": {
2952
+ "zh": "字符",
2953
+ "en": "chars"
2954
+ },
2955
+ "label": {
2956
+ "zh": "单个结果最多带多少 diff",
2957
+ "en": "Most diff one result carries"
2958
+ }
2959
+ },
2960
+ {
2961
+ "key": "astGrepCommand",
2962
+ "kind": "text",
2963
+ "default": "",
2964
+ "label": {
2965
+ "zh": "ast-grep 的路径",
2966
+ "en": "Path of ast-grep"
2967
+ },
2968
+ "help": {
2969
+ "zh": "留空则依次在 PATH 里找 ast-grep 和 sg。",
2970
+ "en": "Empty: ast-grep, then sg, from PATH."
2971
+ }
2972
+ },
2973
+ {
2974
+ "key": "github",
2975
+ "kind": "boolean",
2976
+ "default": true,
2977
+ "label": {
2978
+ "zh": "GitHub(通过 gh)",
2979
+ "en": "GitHub through gh"
2980
+ },
2981
+ "help": {
2982
+ "zh": "不加工具,只带一个教模型用 gh 处理 PR、issue、检查和发布的技能。需要本机装有 gh。",
2983
+ "en": "No tools, one skill that teaches gh for PRs, issues, checks and releases. Needs gh on this machine."
2984
+ }
2985
+ },
2986
+ {
2987
+ "key": "ghCommand",
2988
+ "kind": "text",
2989
+ "default": "",
2990
+ "label": {
2991
+ "zh": "gh 的路径",
2992
+ "en": "Path of gh"
2993
+ },
2994
+ "help": {
2995
+ "zh": "留空则在 PATH 里找 gh。",
2996
+ "en": "Empty: gh from PATH."
2997
+ }
2998
+ },
2999
+ {
3000
+ "key": "commit",
3001
+ "kind": "boolean",
3002
+ "default": true,
3003
+ "label": {
3004
+ "zh": "/commit:把改动拆成多个提交",
3005
+ "en": "/commit: split the change into commits"
3006
+ },
3007
+ "help": {
3008
+ "zh": "模型提议怎么分组、怎么写提交说明,你看过计划并确认后才提交;要么全部提交成功,要么一个都不留。从不推送。",
3009
+ "en": "A model proposes the groups and the messages; commits are made only after you confirm the plan, all or none. Never pushes."
3010
+ }
3011
+ },
3012
+ {
3013
+ "key": "maxPlanChars",
3014
+ "kind": "number",
3015
+ "default": 60000,
3016
+ "min": 5000,
3017
+ "max": 400000,
3018
+ "label": {
3019
+ "zh": "提议拆分时模型最多读多少字符的改动",
3020
+ "en": "Characters of the change the model reads"
3021
+ }
3022
+ },
3023
+ {
3024
+ "key": "review",
3025
+ "kind": "boolean",
3026
+ "default": true,
3027
+ "label": {
3028
+ "zh": "评审并按严重程度分级",
3029
+ "en": "/review, with findings sorted P0 to P3"
3030
+ }
3031
+ },
3032
+ {
3033
+ "key": "conflicts",
3034
+ "kind": "boolean",
3035
+ "default": true,
3036
+ "label": {
3037
+ "zh": "冲突解决",
3038
+ "en": "Conflict resolution"
3039
+ },
3040
+ "help": {
3041
+ "zh": "合并、变基、拣选停在冲突上时,逐个文件显示双方和共同基线,按块写入解决结果并标记为已解决。从不提交,也不执行 --continue。",
3042
+ "en": "When a merge, rebase or cherry-pick stops on conflicts: both sides and their base per file, the resolution written block by block and the file marked resolved. Never commits, never runs --continue."
3043
+ }
3044
+ },
3045
+ {
3046
+ "key": "maxSideLines",
3047
+ "kind": "number",
3048
+ "default": 80,
3049
+ "min": 10,
3050
+ "max": 1000,
3051
+ "label": {
3052
+ "zh": "每块冲突每一侧最多显示几行",
3053
+ "en": "Lines shown per side of a conflict block"
3054
+ }
3055
+ },
3056
+ {
3057
+ "key": "maxConflictChars",
3058
+ "kind": "number",
3059
+ "default": 20000,
3060
+ "min": 2000,
3061
+ "max": 200000,
3062
+ "label": {
3063
+ "zh": "一个文件的冲突最多显示多少字符",
3064
+ "en": "Characters of one file's conflicts shown"
3065
+ }
3066
+ },
3067
+ {
3068
+ "key": "maxFindings",
3069
+ "kind": "number",
3070
+ "default": 40,
3071
+ "min": 5,
3072
+ "max": 200,
3073
+ "label": {
3074
+ "zh": "一次最多分级多少条发现",
3075
+ "en": "Findings sorted per triage at most"
3076
+ },
3077
+ "help": {
3078
+ "zh": "超出的照样报告,只是不参与分级。",
3079
+ "en": "The rest are still reported, just not sorted."
3080
+ }
3081
+ },
3082
+ {
3083
+ "key": "debugger",
3084
+ "kind": "boolean",
3085
+ "default": true,
3086
+ "label": {
3087
+ "zh": "调试器(断点、单步、变量)",
3088
+ "en": "Debugger: breakpoints, stepping, variables"
3089
+ },
3090
+ "help": {
3091
+ "zh": "在调试器里运行程序,停在断点或未捕获的异常处,看调用栈和变量。Python 用 debugpy,Go 用 delve,编译型程序用 lldb-dap,都要本机已装;也可以在设置文件里加自己的。一次只跑一个,随会话结束。",
3092
+ "en": "Runs a program under a debugger, stopped at breakpoints or an uncaught exception, with the call stack and variables. debugpy for Python, delve for Go, lldb-dap for compiled programs, each if installed; add your own under debugAdapters in mu.json. One run at a time, ended with the session."
3093
+ }
3094
+ },
3095
+ {
3096
+ "key": "maxFrames",
3097
+ "kind": "number",
3098
+ "default": 20,
3099
+ "min": 1,
3100
+ "max": 200,
3101
+ "label": {
3102
+ "zh": "停下时显示几层调用栈",
3103
+ "en": "Frames shown at a stop"
3104
+ }
3105
+ },
3106
+ {
3107
+ "key": "maxVariables",
3108
+ "kind": "number",
3109
+ "default": 50,
3110
+ "min": 5,
3111
+ "max": 1000,
3112
+ "label": {
3113
+ "zh": "每个作用域最多列几个变量",
3114
+ "en": "Variables listed per scope"
3115
+ }
3116
+ },
3117
+ {
3118
+ "key": "debugOutputChars",
3119
+ "kind": "number",
3120
+ "default": 4000,
3121
+ "min": 500,
3122
+ "max": 100000,
3123
+ "unit": {
3124
+ "zh": "字符",
3125
+ "en": "chars"
3126
+ },
3127
+ "label": {
3128
+ "zh": "一次结果最多带多少程序输出",
3129
+ "en": "Program output one result carries"
3130
+ },
3131
+ "help": {
3132
+ "zh": "超出时只留最后的部分。",
3133
+ "en": "Only the tail is kept when there is more."
3134
+ }
3135
+ },
3136
+ {
3137
+ "key": "debugWaitMs",
3138
+ "kind": "number",
3139
+ "default": 30000,
3140
+ "min": 1000,
3141
+ "max": 600000,
3142
+ "unit": {
3143
+ "zh": "毫秒",
3144
+ "en": "ms"
3145
+ },
3146
+ "label": {
3147
+ "zh": "等程序停下的最长时间",
3148
+ "en": "Longest wait for the program to stop"
3149
+ },
3150
+ "help": {
3151
+ "zh": "到时还没停下也没结束,就告诉模型程序还在跑;它可以暂停看看停在哪,或者接着等。",
3152
+ "en": "If it has neither stopped nor ended by then, the model is told it still runs, and can pause it to see where, or wait more."
3153
+ }
3154
+ }
3155
+ ]
3156
+ },
3157
+ {
3158
+ "name": "googleLogin",
3159
+ "title": {
3160
+ "zh": "用 Google 账号登录(实验)",
3161
+ "en": "Sign in with Google (experimental)"
3162
+ },
3163
+ "summary": {
3164
+ "zh": "在 /login 里多出两项:借 Gemini CLI 的登录用 Gemini 模型,借 Antigravity 的登录用 Gemini、Claude 和 GPT-OSS。这是 Google 给自家工具的登录,别的程序用它可能违反 Google 的条款、被限制或封号,所以登录前会先说明风险,你同意才继续。官方的方式不需要这一项:Gemini API key(提供商 google)和 Vertex AI(提供商 google-vertex,用 gcloud 登录)。",
3165
+ "en": "Adds two entries to /login: Gemini CLI's sign-in for the Gemini models, and Antigravity's for Gemini, Claude and GPT-OSS. These are Google's logins for its own tools; another program using them may break Google's terms and get the account limited or suspended, so the sign-in states the risk first and goes on only if you agree. The official routes need none of this: a Gemini API key (provider google) and Vertex AI (provider google-vertex, signed in with gcloud)."
3166
+ },
3167
+ "defaultEnabled": true,
3168
+ "beta": true,
3169
+ "options": [
3170
+ {
3171
+ "key": "geminiCli",
3172
+ "kind": "boolean",
3173
+ "default": true,
3174
+ "label": {
3175
+ "zh": "Gemini CLI 登录",
3176
+ "en": "Gemini CLI sign-in"
3177
+ },
3178
+ "help": {
3179
+ "zh": "Gemini 模型;个人账号走免费额度,有 Code Assist 许可的走许可。",
3180
+ "en": "The Gemini models, on the free tier for a personal account or on a Code Assist licence."
3181
+ }
3182
+ },
3183
+ {
3184
+ "key": "antigravity",
3185
+ "kind": "boolean",
3186
+ "default": true,
3187
+ "label": {
3188
+ "zh": "Antigravity 登录",
3189
+ "en": "Antigravity sign-in"
3190
+ },
3191
+ "help": {
3192
+ "zh": "Gemini、Claude 和 GPT-OSS;登录后按账号实际能用的模型更新列表。",
3193
+ "en": "Gemini, Claude and GPT-OSS; once signed in, the list follows what the account can use."
3194
+ }
3195
+ }
3196
+ ]
3197
+ }
3198
+ ]
3199
+ }