@myclaw163/clawclaw-cli 0.6.69 → 0.6.71

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.
Files changed (39) hide show
  1. package/bin/clawclaw-cli.mjs +3 -3
  2. package/package.json +1 -1
  3. package/scripts/sync-bundled-skill.mjs +1 -1
  4. package/skills/clawclaw/references/STRATEGIES.md +5 -3
  5. package/src/commands/config.ts +30 -30
  6. package/src/commands/game.ts +8 -3
  7. package/src/commands/setup/hermes.test.ts +96 -96
  8. package/src/commands/setup/hermes.ts +76 -76
  9. package/src/commands/setup/index.ts +13 -13
  10. package/src/commands/setup/openclaw.test.ts +114 -114
  11. package/src/commands/setup/openclaw.ts +147 -147
  12. package/src/commands/strategy.test.ts +10 -0
  13. package/src/commands/strategy.ts +11 -10
  14. package/src/lib/host-config-patcher.test.ts +130 -130
  15. package/src/lib/host-config-patcher.ts +151 -151
  16. package/src/lib/hub-reminder.ts +19 -19
  17. package/src/strategies/avoid-lone.ts +1 -0
  18. package/src/strategies/avoid-players.ts +1 -0
  19. package/src/strategies/corpse-patrol.ts +1 -0
  20. package/src/strategies/crab-sabotage.ts +1 -0
  21. package/src/strategies/custom-module.test.ts +1 -0
  22. package/src/strategies/find-player.ts +1 -0
  23. package/src/strategies/hide.ts +1 -0
  24. package/src/strategies/kill-frenzy.ts +1 -0
  25. package/src/strategies/kill-lone.ts +1 -0
  26. package/src/strategies/kill-target.ts +1 -0
  27. package/src/strategies/loader.ts +9 -2
  28. package/src/strategies/lone-kill-task.ts +1 -0
  29. package/src/strategies/move-room.ts +1 -0
  30. package/src/strategies/paradise-fish.ts +1 -0
  31. package/src/strategies/patrol.ts +1 -0
  32. package/src/strategies/report-patrol.ts +1 -0
  33. package/src/strategies/shrimp-memory.ts +1 -0
  34. package/src/strategies/social-task.ts +1 -0
  35. package/src/strategies/task-kill-report.ts +1 -0
  36. package/src/strategies/task-only.ts +1 -0
  37. package/src/strategies/task-report.ts +1 -0
  38. package/src/strategies/types.ts +7 -0
  39. package/src/strategies/warrior-memory.ts +1 -0
@@ -6,6 +6,7 @@ import { SpeechModule, getSpeechConfigForRole } from './speech-module.js';
6
6
 
7
7
  export const strategy: StrategyEntry = {
8
8
  id: 'crab-sabotage',
9
+ name: '破坏蟹',
9
10
  description: '优先完成蟹的真实破坏任务(破坏点紧挨已知尸体时会跳过);做完立刻触发紧急警报;警报期照样会被举报、不乱杀,只清真正落单的目标。有紧急事件时跳过破坏流程。视野里只有一个非队友且冷却可用就靠近,进入50距离就立刻出刀,即使正在做破坏任务;刀在冷却时不追不等、改做低优先级任务伪装,冷却好且目标仍落单可见再出刀;正在做任务时不会撇下任务去追猎(贴脸且刀好仍会立刻出刀)。发现尸体且附近有非队友、但当前不能原地出刀时,会靠近并报告尸体。视野里出现两人以上时,暂停攻击10秒并做任务伪装,先做真实任务再做虾的伪装任务;选任务时会跳过紧挨已知尸体(含看见过、已离开视野的)的任务。没有可做任务时按房间巡逻,绝不停在原地。(普通蟹默认)',
10
11
  create(args?: string[]) {
11
12
  const role = args?.[0] ?? 'crab_generic';
@@ -73,6 +73,7 @@ class TestCustomModuleStrategy implements Strategy {
73
73
 
74
74
  const testEntry: StrategyEntry = {
75
75
  id: 'test-custom-module',
76
+ name: 'test-custom-module',
76
77
  description: 'Internal test strategy for CustomModule verification.',
77
78
  create() {
78
79
  return new TestCustomModuleStrategy();
@@ -5,6 +5,7 @@ import { parseTargetArgs } from './player-targets.js';
5
5
 
6
6
  export const strategy: StrategyEntry = {
7
7
  id: 'find-player',
8
+ name: '盯人',
8
9
  description: '全力寻找并贴身跟踪一个指定目标(座位号或名字,单个)。看到就贴上去近距离尾随(约40距离);跟丢就先奔向最后出现的位置,再按房间顺序不停巡逻直到目标重新出现,绝不放弃。只跟踪、不出刀、不做任务、不报告;目标死亡即停。',
9
10
  create(args?: string[]) {
10
11
  const targets = args ? parseTargetArgs(args) : [];
@@ -14,6 +14,7 @@ export function parseHideKillArg(args?: string[]): boolean | null {
14
14
 
15
15
  export const strategy: StrategyEntry = {
16
16
  id: 'hide',
17
+ name: '躲藏',
17
18
  description:
18
19
  '躲藏策略:在离线从地图算好的若干「非走廊、≥2 出口可逃、远离任务点/出生点」的藏身角落里,选测地最近且不挨威胁的一个潜伏不动;视野里一出现非队友,就像 shrimp-memory 那样保持距离甩开(KeepAway),并边逃边重算排除该威胁的新藏点,逃完落到新点继续潜伏。蟹不躲队友。可选参数 kill / nokill 控制「被单个对手逼进出刀距离且无路可逃时是否出刀自保」——缺省按角色:蟹/章鱼默认开,武士虾/枪虾(及无刀角色)默认关。',
19
20
  create(args?: string[]) {
@@ -4,6 +4,7 @@ import { KillFrenzyTop } from './goals/kill-frenzy-top.js';
4
4
 
5
5
  export const strategy: StrategyEntry = {
6
6
  id: 'kill-frenzy',
7
+ name: '屠夫',
7
8
  description:
8
9
  '疯狂砍人:见谁杀谁(除队友外所有可见玩家),多人在场也照杀。按房间顺序巡逻,视野里只要有非队友就冲向最近的那个,50内且冷却好就出刀,冷却中保持10距离贴身跟随等冷却。与 kill-lone 不同,不会因为周围人多而暂停攻击。永不停手。',
9
10
  create() {
@@ -5,6 +5,7 @@ import { parseTargetArgs } from './player-targets.js';
5
5
 
6
6
  export const strategy: StrategyEntry = {
7
7
  id: 'kill-lone',
8
+ name: '猎独',
8
9
  description: '按照房间顺序进行巡逻,巡逻时遇到人会判断。可传入避免击杀的座位号或名字列表。视野里只有一个非队友且不在避免名单内就靠近,进入50距离就出刀;冷却中贴在10距离附近等。视野里出现两人以上时,暂停攻击10秒并继续巡逻。',
9
10
  create(args?: string[]) {
10
11
  const protectedTargets = args ? parseTargetArgs(args) : [];
@@ -5,6 +5,7 @@ import { parseTargetArgs } from './player-targets.js';
5
5
 
6
6
  export const strategy: StrategyEntry = {
7
7
  id: 'kill-target',
8
+ name: '追杀',
8
9
  description: '专门追杀指定目标(传入座位号或名字,可多人)。按照房间顺序进行巡逻,目标进入视野就冲上去,50内且冷却好就出刀;冷却中保持10距离贴身跟随等待。找目标时路过其他玩家不会停步。所有目标死亡后停止。',
9
10
  create(args?: string[]) {
10
11
  const targets = args ? parseTargetArgs(args) : [];
@@ -136,9 +136,16 @@ async function ensureLoaded(): Promise<void> {
136
136
  if (userDir) await loadFromDir(userDir, false);
137
137
  }
138
138
 
139
- export async function getStrategyEntry(id: string): Promise<StrategyEntry | undefined> {
139
+ export async function getStrategyEntry(idOrName: string): Promise<StrategyEntry | undefined> {
140
140
  await ensureLoaded();
141
- return strategyMap.get(id);
141
+ const byId = strategyMap.get(idOrName);
142
+ if (byId) return byId;
143
+ // Fall back to the Chinese display name (StrategyEntry.name). id always wins,
144
+ // so this only resolves an alias when no id matched.
145
+ for (const entry of strategyMap.values()) {
146
+ if (entry.name === idOrName) return entry;
147
+ }
148
+ return undefined;
142
149
  }
143
150
 
144
151
  export async function listStrategyEntries(): Promise<StrategyEntry[]> {
@@ -6,6 +6,7 @@ import { SpeechModule, getSpeechConfigForRole } from './speech-module.js';
6
6
 
7
7
  export const strategy: StrategyEntry = {
8
8
  id: 'lone-kill-task',
9
+ name: '潜伏猎手',
9
10
  description: '视野里只有一个非队友且冷却可用就靠近,进入50距离就立刻出刀;刀在冷却时不追不等、改做低优先级任务伪装,冷却好且目标仍落单可见再出刀(贴脸且刀好仍会立刻出刀)。发现尸体且附近有非队友、但当前不能原地出刀时,会靠近并报告尸体。视野里出现两人以上时,暂停攻击10秒并做任意阵营的真实任务伪装;选任务时会跳过紧挨已知尸体(含看见过、已离开视野的)的任务,不在命案现场做任务。没有可做任务时按房间巡逻,绝不停在原地。残局(已知存活≤6)出现紧急维修任务时,会高优先级抢着去做(仍低于击杀落单),阻止蟹靠破坏倒计时取胜。(章鱼默认)',
10
11
  create(args?: string[]) {
11
12
  const role = args?.[0] ?? 'neutral_octopus';
@@ -4,6 +4,7 @@ import { MoveRoomGoal } from './goals/move-room-goal.js';
4
4
 
5
5
  export const strategy: StrategyEntry = {
6
6
  id: 'move-room',
7
+ name: '前往',
7
8
  description: '前往指定房间,到达后停下。参数为目标房间名(如 酒吧)。单纯走位,不做任务、不打人、不报告。',
8
9
  create(args?: string[]) {
9
10
  const targetRoom = args?.join(' ').trim() ?? '';
@@ -17,6 +17,7 @@ class ParadiseFishStrategy extends GoalRootStrategy {
17
17
 
18
18
  export const strategy: StrategyEntry = {
19
19
  id: 'paradise-fish',
20
+ name: '天堂鱼',
20
21
  description:
21
22
  '天堂鱼·进阶版(中立,不报警、不做任务,靠被投票出局取胜;corpse-patrol 的带记忆升级)。读取 ccl knowledge 两档标记(hostile=坏人 / trusted=好人),未标记的一律默认被怀疑:hostile 视为危险硬寻路远离,被怀疑者按目击者规则保持距离,trusted 视为可抱团的可信同伴。发现尸体绝不报警,贴着尸体游走制造嫌疑;附近有人时远离那人但仍在尸体附近活动。残局(已知存活≤6)出现紧急维修任务时,会在没有带刀坏人需要躲避时优先抢着去做(先于对陌生人保持距离/贴尸/抱团),阻止蟹靠破坏倒计时取胜。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。',
22
23
  create(args?: string[]) {
@@ -4,6 +4,7 @@ import { PatrolTop } from './goals/patrol-top.js';
4
4
 
5
5
  export const strategy: StrategyEntry = {
6
6
  id: 'patrol',
7
+ name: '巡逻',
7
8
  description: '按地图房间顺序依次游走,到达一个房间后自动前往下一个,循环往复。卡路时会跳过当前目标换下一个房间。纯游走,不做任务、不打人、不报告尸体。',
8
9
  create() {
9
10
  return new GoalRootStrategy('patrol', () => new PatrolTop(), { resetOnMeetingResume: false });
@@ -4,6 +4,7 @@ import { ReportPatrolTop } from './goals/report-patrol-top.js';
4
4
 
5
5
  export const strategy: StrategyEntry = {
6
6
  id: 'report-patrol',
7
+ name: '报警',
7
8
  description: '专门找尸体:达到报告距离立刻报告,看到尸体就靠近;没有尸体就巡逻各房间。不做任何任务,不打人,目标是让会议尽快开起来。',
8
9
  create() {
9
10
  return new GoalRootStrategy('report-patrol', () => new ReportPatrolTop(), { resetOnMeetingResume: false });
@@ -17,6 +17,7 @@ class ShrimpMemoryStrategy extends GoalRootStrategy {
17
17
 
18
18
  export const strategy: StrategyEntry = {
19
19
  id: 'shrimp-memory',
20
+ name: '精英虾',
20
21
  description:
21
22
  '普通虾·记忆进阶版(好人、不带刀;task-report 的带记忆升级)。读取 ccl knowledge 两档标记(hostile=坏人 / trusted=好人),未标记的一律默认被怀疑:hostile 硬寻路远离,trusted 视为可信同伴,被怀疑者按目击者规则保持距离。发现尸体最优先报警,并提示复核尸体旁身份不明者;无可信同伴且单个被怀疑者贴近270内时先拉开距离到300再做任务;再处理紧急任务,最后做任务/巡逻(选测地最近、跳过威胁旁或必经威胁的任务)。永不出刀。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。',
22
23
  create(args?: string[]) {
@@ -33,6 +33,7 @@ export function parseSocialArgs(args: string[]): SocialTarget[] {
33
33
 
34
34
  export const strategy: StrategyEntry = {
35
35
  id: 'social-task',
36
+ name: '社交',
36
37
  description: '针对指定玩家社交(参数格式 座位=话术 或纯座位,可多人)。视野内出现目标就靠近,没打过招呼先发一次招呼;对方说话就停下等你回复,10秒没回应就转去做任务。全程见到可报告的尸体就报、见到尸体就靠近。不打人。参数:座位=话术 / 座位(可多人)。',
37
38
  create(args?: string[]) {
38
39
  if (!args || args.length === 0) {
@@ -4,6 +4,7 @@ import { TaskKillReportTop } from './goals/task-kill-report-top.js';
4
4
 
5
5
  export const strategy: StrategyEntry = {
6
6
  id: 'task-kill-report',
7
+ name: '任务刺客',
7
8
  description: '需传入嫌疑目标(座位号或名字,可多人)。看到目标且冷却好,50内就出刀,否则追上去;冷却中贴身跟随。目标不在视野时,遇到尸体就报告;没尸体就做普通任务。',
8
9
  create(args?: string[]) {
9
10
  if (!args || args.length === 0) {
@@ -4,6 +4,7 @@ import { TaskOnlyTop } from './goals/task-only-top.js';
4
4
 
5
5
  export const strategy: StrategyEntry = {
6
6
  id: 'task-only',
7
+ name: '纯任务',
7
8
  description: '专心做任务。紧急任务出现时优先处理,其次按顺序完成普通任务,如果是蟹,则蟹的伪装任务也会做。没有尸体报告和战斗行为。',
8
9
  create() {
9
10
  return new GoalRootStrategy('task-only', () => new TaskOnlyTop(), { resetOnMeetingResume: false });
@@ -15,6 +15,7 @@ class TaskReportStrategy extends GoalRootStrategy {
15
15
 
16
16
  export const strategy: StrategyEntry = {
17
17
  id: 'task-report',
18
+ name: '尽责虾',
18
19
  description: '遇尸体最优先:达到报告距离立刻报告,没达到距离就靠近准备报告。紧急任务出现时优先处理,其次按顺序完成普通任务。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。(普通虾默认;进阶版见 shrimp-memory)参数:可选:1~3 条打招呼话术。',
19
20
  create(args?: string[]) {
20
21
  return new TaskReportStrategy(parseGreetingArgs(args, 'task-report'));
@@ -45,6 +45,13 @@ export interface Strategy {
45
45
 
46
46
  export interface StrategyEntry {
47
47
  readonly id: string;
48
+ /**
49
+ * 中文展示名/代词,玩家与 agent 沟通时使用(如「守尸」「武士虾」)。会出现在
50
+ * `ccl strategy --list`/`--info` 输出里,并可作为 `ccl strategy <名>` 的输入。
51
+ * 注意:这与 `Strategy.name`(`create()` 返回对象的内部 id 名)不是一回事。
52
+ * 须全局唯一。
53
+ */
54
+ readonly name: string;
48
55
  readonly description: string;
49
56
  create(args?: string[]): Strategy;
50
57
  }
@@ -5,6 +5,7 @@ import { parseTargetArgs } from './player-targets.js';
5
5
 
6
6
  export const strategy: StrategyEntry = {
7
7
  id: 'warrior-memory',
8
+ name: '武士虾',
8
9
  description:
9
10
  '带刀虾·记忆进阶版(武士虾/枪虾通用,好人带刀;kill-lone 的带记忆升级)。读取 ccl knowledge 两档标记(hostile=坏人 / trusted=好人),未标记的一律默认被怀疑:hostile 刀好时主动追杀、刀不好时硬回避,trusted 视为可信同伴且绝不攻击。**只对【已确认 hostile / 启动猎杀目标】出刀**——被怀疑者一律只回避、绝不出刀(无可信同伴且单个被怀疑者贴近270内时先拉开到300再做任务,多人互为目击者则照常做任务);不再有任何贴身追击判定/诱饵试探/绝境自卫(几何上分不开"贴身跟我观察的好人"和"贴身追我的凶手",自卫迟早误杀同阵营好人触发武士虾自爆,整套已删除)。发现尸体优先报警;尸体旁若是 hostile/启动猎杀目标且刀可用会现场先手击杀,但绝不会因尸体旁有未报警的身份不明者就灭口(已根治该误杀);无危险时优先紧急任务,否则做任务/巡逻。枪虾会尊重剩余出刀次数。',
10
11
  create(args?: string[]) {