Skill: tobewin/reply-styles (version 1.0.0)

--- name: reply-styles description: Draft high-EQ, style-controlled replies for chat, email, DMs, customer support, community operations, sales, and difficult conversations. Use when the user wants a reply rewritten in a specific tone without prompt-tuning. Model-agnostic, preset-style driven, no API key required. version: 1.0.0 license: MIT-0 metadata: openclaw: emoji: "💬" --- # Reply Styles 为用户生成高情商、风格化、可直接发送的回复文案。 核心定位： - 模型无关 - 预置风格，不靠用户反复调教 - 同时支持高情商和明确边界 - 可用于私聊、邮件、客服、销售、社群、管理沟通 ## 何时使用 - 用户说“帮我高情商回复一下” - 用户要“委婉一点、坚定一点、像高管一点、像客服一点” - 用户要回复客户、老板、同事、朋友、社群成员 - 用户要拒绝、安抚、催促、解释、道歉、成交、收口 ## 工作方式 主 `SKILL.md` 只保留路由与规则。按需读取： - 风格总览：`references/style-catalog.md` - 场景映射：`references/scenario-map.md` - 强度系统：`references/intensity-system.md` - 渠道映射：`references/channel-map.md` - 人格包：`references/persona-packs.md` - 回复模式：`references/mode-packs.md` - 通用原则：`references/core-rules.md` - 风格示例：`references/style-examples.md` - 效果验收：`references/effect-rubric.md` 如果要快速定位风格或场景，优先运行： - `node scripts/get-style-bundle.mjs --list` - `node scripts/get-style-bundle.mjs --style warm-professional` - `node scripts/get-style-bundle.mjs --list-personas` - `node scripts/get-style-bundle.mjs --list-modes` - `node scripts/get-style-bundle.mjs --style warm-professional --intensity balanced --channel wechat` - `node scripts/recommend-style.mjs --scene angry-customer --goal deescalate --channel support-ticket --persona calm-operator --mode soothe-first` - `node scripts/scaffold-reply.mjs --style firm-boundary --scene reject-request --intensity soft --channel wechat --persona trusted-advisor --mode clear-reject` - `node scripts/showcase-replies.mjs --scene reject-request --intent "礼貌拒绝继续无偿帮忙" --persona trusted-advisor --mode clear-reject` ## 生成原则 1. 先判断关系，再判断情绪温度，再判断风格、强度和渠道。 2. 高情商不等于软弱，不要为了“礼貌”牺牲边界。 3. 先保留用户真实意图，再做语气优化。 4. 默认输出一版可以直接发的正文；只有用户要求时再给多个版本。 5. 不要解释“我为什么这样写”，除非用户明确要分析。 6. 风格要稳定，不要一条回复里又像客服又像朋友。 ## 最小决策流程 ### Step 1：识别场景 从用户输入中提取： - 对象：客户 / 老板 / 同事 / 朋友 / 社群成员 / 陌生人 - 目标：安抚 / 拒绝 / 催促 / 成交 / 道歉 / 解释 / 推进 / 收口 - 风险：对方生气 / 关系脆弱 / 场合正式 / 需要边界 / 需要成交 - 调性：温暖 / 专业 / 坚定 / 高级 / 轻松 / 干练 ### Step 2：选风格 优先先跑脚本拿最小推荐结果，再读 `references/style-catalog.md`。 如果用户明确指定风格，再直接读取对应风格说明： - `warm-professional` - `high-eq-soft` - `firm-boundary` - `de-escalation` - `executive-crisp` - `founder-direct` - `luxury-concierge` - `community-manager` - `premium-sales` - `supportive-coach` - `playful-friendly` - `relationship-repair` - `consultant-polished` - `partner-diplomatic` - `pr-safe` - `recruiter-polite` - `operations-push` - `customer-success` - `elder-respectful` - `cool-minimal` - `bookish-gentle` - `service-recovery` - `brand-host` - `legal-clean` ### Step 3：选强度和渠道 优先读： - `references/intensity-system.md` - `references/channel-map.md` - `references/persona-packs.md` - `references/mode-packs.md` 默认： - 强度：`balanced` - 渠道：`wechat` - 人格包：留空 - 回复模式：留空 ### Step 4：按结构写回复 默认结构： 1. 开场先接住情绪或意图 2. 中段表达核心信息 3. 结尾给下一步或收口 ### Step 5：对照原则自检 读 `references/core-rules.md` 和 `references/effect-rubric.md`，确保： - 不油腻 - 不虚伪 - 不啰嗦 - 不失边界 - 适合实际发送 - 风格稳定 - 像真人会发的话 ## 输出偏好 默认输出： - 1 个成稿版本 - 直接可发送 - 不带多余解释 - 保持用户原意 用户如果要求，可额外提供： - 更软一版 - 更硬一版 - 更短一版 - 更高级一版 - 邮件版 / 微信版 / 评论区版 ## 不要这样做 - 不要一味加“哈哈”“呀”“呢”制造假高情商 - 不要把简单回复写成鸡汤 - 不要过度道歉 - 不要把坚定边界写成攻击 - 不要把销售感写成油腻推销 - 不要让风格压过信息本身 ## 成功标准 这项 skill 的目标不是“变得更礼貌”，而是让用户觉得： - 这句话像我想说的，只是更高级 - 既体面又有效 - 有风格，但不做作 - 不需要再自己手动调语气 当前系统支持： - `24` 套主风格 - `6` 个人格包 - `6` 个回复模式 - `3` 档强度：`soft / balanced / sharp` - `6` 个渠道：`wechat / email / dm / group / comment / support-ticket` - 共 `24 × 6 × 6 × 3 × 6 = 15552` 种组合方式

path: agents/openai.yaml
content: interface:
  display_name: "Reply Styles"
  short_description: "High-EQ, preset-style reply drafting"
  icon_small: "./assets/reply-styles-small.svg"
  icon_large: "./assets/reply-styles-large.svg"
  brand_color: "#F59E0B"
  default_prompt: "Use $reply-styles to rewrite this message in a polished high-EQ tone."


path: assets/reply-styles-large.svg
content: <svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
  <rect width="512" height="512" rx="96" fill="url(#bg)"/>
  <path d="M108 146C108 114.52 133.52 89 165 89H347C378.48 89 404 114.52 404 146V281C404 312.48 378.48 338 347 338H246L165 406V338C133.52 338 108 312.48 108 281V146Z" fill="#1D2939" stroke="#F59E0B" stroke-opacity="0.55" stroke-width="10"/>
  <path d="M170 184H342" stroke="#F8FAFC" stroke-width="24" stroke-linecap="round"/>
  <path d="M170 240H298" stroke="#FDBA74" stroke-width="24" stroke-linecap="round"/>
  <path d="M170 296H260" stroke="#FBBF24" stroke-width="24" stroke-linecap="round"/>
  <defs>
    <linearGradient id="bg" x1="60" y1="42" x2="452" y2="470" gradientUnits="userSpaceOnUse">
      <stop stop-color="#0F172A"/>
      <stop offset="1" stop-color="#1F2937"/>
    </linearGradient>
  </defs>
</svg>


path: assets/reply-styles-small.svg
content: <svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
  <rect width="128" height="128" rx="28" fill="#101828"/>
  <path d="M30 38C30 31.3726 35.3726 26 42 26H86C92.6274 26 98 31.3726 98 38V72C98 78.6274 92.6274 84 86 84H59L42 98V84C35.3726 84 30 78.6274 30 72V38Z" fill="#1D2939" stroke="#F59E0B" stroke-opacity="0.55" stroke-width="3"/>
  <path d="M45 48H83" stroke="#F8FAFC" stroke-width="6" stroke-linecap="round"/>
  <path d="M45 61H73" stroke="#FDBA74" stroke-width="6" stroke-linecap="round"/>
</svg>


path: examples/scenarios.md
content: # Example Scenarios

- 帮我高情商拒绝一个总来借人情但我不想继续帮忙的朋友
- 用高端一点的口吻回复一个 VIP 客户的预约确认
- 帮我写一条给老板的简短进度更新，要干练一点
- 对方在群里有点情绪化，帮我用社群运营口吻安抚一下
- 帮我把这句话改得更像高级销售，而不是推销

## 风格 × 强度 × 渠道示例

- `firm-boundary + soft + wechat`
  场景：礼貌拒绝继续无偿帮忙

- `de-escalation + soft + support-ticket`
  场景：用户投诉产品出错，先安抚再给处理动作

- `executive-crisp + sharp + wechat`
  场景：给老板回项目进度，短而清楚

- `luxury-concierge + balanced + email`
  场景：高端客户预约确认与细节说明

- `community-manager + balanced + group`
  场景：群公告、规则提醒、活动通知

## 风格 × 人格 × 模式 示例

- `consultant-polished + trusted-advisor + clear-reject`
  场景：体面拒绝一个不合适的合作方案，但仍保留合作空间

- `brand-host + premium-host + public-safe`
  场景：公开回应用户对品牌体验的不满，既有温度又稳妥

- `de-escalation + calm-operator + soothe-first`
  场景：用户投诉升级，先降火再给明确处理动作

- `executive-crisp + sharp-founder + concise-update`
  场景：给老板回一句短进度，结论先行


path: references/channel-map.md
content: # Channel Map

## Goal

同一句话在不同渠道里，长度、格式、压迫感都不同。

## Supported Channels

### `wechat`

适合：

- 私聊
- 熟悉关系
- 轻商务沟通

特点：

- 句子短
- 口语感更自然
- 不要太像公文

### `email`

适合：

- 正式商务
- 跨团队协作
- 客户与管理层沟通

特点：

- 结构完整
- 开头称呼明确
- 结尾收口更正式

### `dm`

适合：

- 平台私信
- 陌生关系沟通

特点：

- 更快进入主题
- 少铺垫
- 减少冗长寒暄

### `group`

适合：

- 群消息
- 社群运营
- 公告 / 提醒 / 规则说明

特点：

- 更清楚
- 少个人情绪
- 信息组织感强

### `comment`

适合：

- 评论区
- 公开互动

特点：

- 更短
- 不宜解释过长
- 注意公开场合体面

### `support-ticket`

适合：

- 客服处理
- 工单回复

特点：

- 清楚回应问题
- 动作和承诺更明确
- 降温优先

## Practical Rule

- 默认私聊用 `wechat`
- 正式商务优先 `email`
- 投诉与客服优先 `support-ticket`
- 群体沟通优先 `group`


path: references/core-rules.md
content: # Core Rules

## Universal Principles

### 1. 先接住，再表达

如果对方有明显情绪或期待，先让对方感到“被听见”。

### 2. 高情商不等于没立场

需要拒绝、收口、划边界时，语气可以柔和，结论不能含糊。

### 3. 直接发得出去

输出应该像真实消息，不像写作练习。

### 4. 少一点解释，多一点结果

回复不是论文。优先清楚、可执行、有下一步。

### 5. 保留身份感

老板、客户、朋友、品牌方，说话方式不能一样。

## Default Structure

### 开场

- 接住情绪
- 认可对方时间 / 反馈 / 关切
- 或简洁进入主题

### 中段

- 表达立场或信息
- 给原因，但不过度辩解
- 需要时给可执行下一步

### 结尾

- 收束
- 提供下一步
- 保留体面

## Anti-Patterns

- 假热情
- 过度客套
- 空泛鸡汤
- 没重点
- 软到看不出结论
- 硬到破坏关系


path: references/effect-rubric.md
content: # Effect Rubric

高情商回复的目标不是“更礼貌”，而是“更像真人高手说的话”。

## 过稿标准

一条回复至少要同时满足下面 6 条里的 5 条：

1. 像人说话
   - 读起来像真实的人会发出去的话
   - 不是拼接式模板，不是客服腔，不是鸡汤腔

2. 风格稳定
   - 同一条回复只保留一个主风格
   - 不要一半像朋友，一半像客服，一半又像公文

3. 关系拿捏对
   - 对老板不能太碎
   - 对客户不能太冷
   - 对敏感关系不能过硬
   - 对公开场合不能失控

4. 有结论有动作
   - 不要只是“情绪价值”
   - 要么给结论，要么给下一步，要么给边界

5. 高级但不端
   - 可以精致，但不能悬浮
   - 可以温柔，但不能做作
   - 可以坚定，但不能冒犯

6. 短而有密度
   - 少废话
   - 句子不要拖泥带水
   - 每一句都应该有作用

## 常见翻车点

- 太像模板：全是套话，像复制粘贴
- 太软没骨头：看起来礼貌，其实没表达清楚立场
- 太硬没情商：只剩结论，没有缓冲
- 太长：用户不可能真的发出去
- 太装：为了显高级，写得不自然

## 最后一眼检查

交付前快速问自己：

- 这句话像不像用户自己会发出去？
- 这句话是不是既保住体面，又达成目的？
- 如果去掉风格名，只看内容，依然成立吗？


path: references/intensity-system.md
content: # Intensity System

## Goal

同一种风格也需要不同力度。

推荐统一支持 3 档：

- `soft`
- `balanced`
- `sharp`

## `soft`

适合：

- 关系脆弱
- 对方情绪高
- 需要委婉
- 先保关系

特点：

- 缓冲更多
- 直接词更少
- 留余地
- 句子更顺

风险：

- 太软会显得没结论

## `balanced`

适合：

- 默认大多数场景
- 既要体面也要有效

特点：

- 礼貌和结论平衡
- 不拖沓
- 不失边界

## `sharp`

适合：

- 需要推进
- 需要收口
- 需要明确决策
- 需要减少来回沟通

特点：

- 结论更前置
- 句子更短
- 边界更清楚

风险：

- 对敏感关系容易显得冷

## Practical Rule

- 不确定时默认 `balanced`
- 拒绝类先从 `balanced` 开始
- 投诉安抚类优先 `soft`
- 管理推进、老板沟通、销售推进可用 `sharp`


path: references/mode-packs.md
content: # Mode Packs

回复模式决定一句话的行进方式，不只是语气。

## 推荐模式

| Mode | 中文定位 | 适合场景 | 结构 |
|---|---|---|---|
| `soothe-first` | 先安抚后回应 | 投诉、情绪高、敏感反馈 | 先接情绪，再说事实，最后给动作 |
| `clear-reject` | 清楚拒绝 | 礼貌拒绝、划边界、止损 | 轻接一下，明确结论，礼貌收口 |
| `push-forward` | 推进落地 | 催进度、压节点、推进执行 | 对齐节点，说明目标，压实下一步 |
| `repair-trust` | 修复信任 | 道歉、售后补救、关系修复 | 先认影响，再讲责任，最后给修复动作 |
| `public-safe` | 公开稳妥 | 评论区、社媒、品牌公开说明 | 确认已收到，谨慎表态，留正式出口 |
| `concise-update` | 结论先行 | 给老板、管理同步、简短更新 | 先给结论，补充状态，收在节点 |

## 什么时候一定要用模式

- 用户说“不要太软，要把话说清楚”：优先 `clear-reject`
- 用户说“对方现在很炸”：优先 `soothe-first`
- 用户说“帮我催一下但别太冲”：优先 `push-forward`
- 用户说“要公开发出去”：优先 `public-safe`
- 用户说“给老板回一句就行”：优先 `concise-update`


path: references/persona-packs.md
content: # Persona Packs

在主风格之外，再叠加一层“像谁在说话”，让回复更有辨识度。

## 推荐人格包

| Persona | 中文定位 | 适合场景 | 说话质感 |
|---|---|---|---|
| `trusted-advisor` | 靠谱顾问 | 提案、商务建议、策略回复 | 有判断、有方法论 |
| `premium-host` | 高端主理人 | 品牌沟通、VIP 回复、公开互动 | 有气质、有温度 |
| `calm-operator` | 成熟操盘手 | 投诉安抚、推进执行、售后处理 | 稳住局面、给动作 |
| `warm-senior` | 有分寸的前辈 | 安慰、提醒、关系脆弱场景 | 温和、成熟、不说教 |
| `sharp-founder` | 高判断力创始人 | 快速决策、推进执行、短回复 | 直给、克制、有效率 |
| `thoughtful-friend` | 聪明温柔的朋友 | 熟人、敏感关系、轻安抚 | 有理解、有陪伴感 |

## 使用方式

- 只用主风格时：已经够通用
- 要提升“像真人在说话”的感觉时：叠加 `persona`
- 默认建议：
  - 商务高级感：`trusted-advisor`
  - 品牌温度感：`premium-host`
  - 处理问题感：`calm-operator`
  - 温柔成熟感：`warm-senior`
  - 直接高效感：`sharp-founder`
  - 轻柔陪伴感：`thoughtful-friend`


path: references/scenario-map.md
content: # Scenario Map

## Scene To Style

| Scene | Recommended Style | Backup Style |
|---|---|---|
| 常规商务回复 | `warm-professional` | `executive-crisp` |
| 用户投诉 | `de-escalation` | `relationship-repair` |
| 委婉拒绝 | `firm-boundary` | `high-eq-soft` |
| 老板问进度 | `executive-crisp` | `founder-direct` |
| 创始人式短回复 | `founder-direct` | `executive-crisp` |
| 高端客户接待 | `luxury-concierge` | `warm-professional` |
| 销售跟进 | `premium-sales` | `warm-professional` |
| 社群公告 | `community-manager` | `warm-professional` |
| 鼓励同事 / 成员 | `supportive-coach` | `high-eq-soft` |
| 朋友式轻松回复 | `playful-friendly` | `high-eq-soft` |
| 修复误会 / 道歉 | `relationship-repair` | `de-escalation` |
| 敏感关系缓和 | `high-eq-soft` | `relationship-repair` |
| 方案建议 / 提案回复 | `consultant-polished` | `warm-professional` |
| 商务合作回复 | `partner-diplomatic` | `consultant-polished` |
| 公开场合回应 | `pr-safe` | `brand-host` |
| 招聘沟通 / 面试进展 | `recruiter-polite` | `warm-professional` |
| 催进度 / 推项目 | `operations-push` | `executive-crisp` |
| 续费挽留 / 客户陪跑 | `customer-success` | `service-recovery` |
| 给长辈 / 前辈回复 | `elder-respectful` | `bookish-gentle` |
| 极简高级短回复 | `cool-minimal` | `executive-crisp` |
| 温柔知性表达 | `bookish-gentle` | `high-eq-soft` |
| 售后补救 / 服务修复 | `service-recovery` | `de-escalation` |
| 品牌主理人式表达 | `brand-host` | `luxury-concierge` |
| 合规稳妥回复 | `legal-clean` | `pr-safe` |

## Goal To Style

- `deescalate` → `de-escalation`
- `reject` → `firm-boundary`
- `convert` → `premium-sales`
- `comfort` → `supportive-coach`
- `repair` → `relationship-repair`
- `reassure` → `service-recovery`
- `persuade` → `consultant-polished`
- `escalate-safe` → `pr-safe`
- `update` → `executive-crisp`
- `maintain` → `warm-professional`

## 高级感优先选择

如果用户没有指定具体风格，但明确要求“高级”“精致”“别太像模板话术”，优先从下面这些风格里选：

- `consultant-polished`
- `warm-professional`
- `luxury-concierge`
- `brand-host`
- `cool-minimal`
- `bookish-gentle`


path: references/style-catalog.md
content: # Style Catalog

## Usage

先根据场景和关系选风格，再写回复。

优先选择一个主风格，不要混太多。

## 24 Preset Styles

| Style | 中文定位 | Best For | Tone |
|---|---|---|---|
| `warm-professional` | 温暖专业 | 常规客户、商务沟通、正式但不冷 | 稳、礼貌、可信 |
| `high-eq-soft` | 柔和高情商 | 敏感关系、委婉表达、缓冲语气 | 软、顺、细腻 |
| `firm-boundary` | 坚定边界 | 拒绝、止损、明确规则 | 稳硬、不冒犯 |
| `de-escalation` | 降温安抚 | 对方不满、投诉、生气 | 先接住，再降火 |
| `executive-crisp` | 高管干练 | 老板回复、管理沟通、正式推进 | 短、稳、清晰 |
| `founder-direct` | 创始人直给 | 创业团队、快速决策、短消息 | 直接、克制、有判断 |
| `luxury-concierge` | 高端服务 | VIP 客户、高端品牌、精致服务 | 高级、体面、照顾感 |
| `community-manager` | 社群运营 | 公告、群消息、用户互动 | 友好、有组织感 |
| `premium-sales` | 高级成交 | 跟进客户、推进转化、邀约成交 | 专业、有推动力 |
| `supportive-coach` | 支持教练 | 鼓励、反馈、带人、陪伴感 | 温柔、支持、不说教 |
| `playful-friendly` | 轻松有趣 | 熟人、朋友、轻社交场景 | 轻盈、有亲和力 |
| `relationship-repair` | 修复关系 | 道歉、缓和误会、恢复关系 | 真诚、克制、向前看 |
| `consultant-polished` | 咨询顾问 | 提案、策略沟通、客户建议 | 有方法论、条理清楚 |
| `partner-diplomatic` | 商务外交 | 合作伙伴沟通、BD往来 | 圆融、成熟、不失边界 |
| `pr-safe` | 公关稳妥 | 公开回应、敏感场景回复 | 谨慎、低风险、可公开 |
| `recruiter-polite` | 招聘沟通 | 候选人跟进、面试安排、结果同步 | 体面、职业、效率好 |
| `operations-push` | 推进催办 | 催进度、压节点、落执行 | 推进感强、但不过火 |
| `customer-success` | 客户成功 | 售后陪跑、续约维护、使用推动 | 站在客户结果上 |
| `elder-respectful` | 敬长有礼 | 长辈、前辈、导师沟通 | 有礼、稳妥、不顶撞 |
| `cool-minimal` | 冷静高级 | 少字高质感、极简回复 | 克制、干净、利落 |
| `bookish-gentle` | 知性温柔 | 敏感关系、慢节奏沟通 | 温柔、知性、不酸 |
| `service-recovery` | 售后补救 | 服务失误、补救回复 | 先承担，再修复 |
| `brand-host` | 主理人风 | 品牌主理人、主理人式社群互动 | 有气质、有温度 |
| `legal-clean` | 理性合规 | 风险回复、边界说明、正式限制 | 低风险、少歧义 |

## Quick Guidance

- 不确定时默认：`warm-professional`
- 对方情绪高时优先：`de-escalation`
- 需要拒绝但不撕破脸：`firm-boundary`
- 想显得更高级更贵：`luxury-concierge`
- 想显得更利落：`executive-crisp`
- 想拉近关系：`high-eq-soft` 或 `playful-friendly`
- 想更像顾问：`consultant-polished`
- 想更像品牌 / 主理人：`brand-host`
- 想更稳妥低风险：`pr-safe` 或 `legal-clean`

## Recommended Intensities

- 更稳妥：`soft`
- 默认通用：`balanced`
- 更利落：`sharp`


path: references/style-examples.md
content: # Style Examples

## Goal

让风格差异不是抽象标签，而是能感知到的说话方式。

## Example 1: 委婉拒绝

原意：

`最近真的没办法再继续免费帮你做这件事了。`

### `firm-boundary`

`这件事我这边这次就先不继续接了，也想和你说清楚，后面类似的内容我可能没办法再无偿帮忙处理。还请你理解。`

### `high-eq-soft`

`我其实也考虑了一下，这件事如果后面还继续按现在的方式帮下去，我这边会有点吃力，所以想提前和你说一声，之后我可能没办法再像之前那样无偿支持了。`

## Example 2: 投诉安抚

原意：

`这个问题我们会处理。`

### `de-escalation`

`理解你现在会着急，这次确实给你带来困扰了。我这边已经先接手跟进这个问题，会尽快帮你核实处理进度，稍后第一时间同步你。`

### `service-recovery`

`这次的体验确实受影响了，这边先和你说声抱歉。我会直接跟进这次问题的处理，今天内先把当前进度和补救方案同步给你。`

## Example 3: 老板问进度

原意：

`还在做。`

### `executive-crisp`

`还在推进中。目前已完成主体部分，剩余收尾和联调，今天下班前给你完整版本。`

### `founder-direct`

`在做，主体已经过半。今天把核心版本先交出来，细节项我再补。`

## Example 4: 高端客户确认

原意：

`好的，我们帮您安排。`

### `luxury-concierge`

`好的，这边已经为您优先安排。相关细节我会继续替您确认，确定后第一时间与您同步，您放心。`

### `warm-professional`

`好的，这边已经开始安排了。确认完具体细节后，我会第一时间同步给您。`

## Example 5: 销售推进

原意：

`如果您有兴趣可以约时间聊。`

### `premium-sales`

`如果你方便，我们可以约一个 20 分钟的时间，把最关心的几个问题和实际落地方式快速对齐一下。这样你会更容易判断这件事是不是适合现在推进。`

### `consultant-polished`

`如果你愿意，我们可以找个短时间快速对齐一下当前最关键的判断点，我也可以基于你的实际情况给出更清晰的建议路径。`

## Example 6: 合作方分歧

原意：

`这个方案我们现在接受不了。`

### `partner-diplomatic`

`这个方向我们认真看过了，现阶段和我们这边的节奏还不完全匹配。为了不影响双方后续合作，我建议我们先把几个关键前提再对齐一下，再判断什么方案会更顺。`

### `legal-clean`

`基于目前的合作边界和现有安排，这个方案我们这边暂时无法直接接受。后续如有正式调整，以双方确认的信息为准。`

## Example 7: 品牌公开回应

原意：

`我们知道这个事情了，会处理。`

### `pr-safe`

`感谢大家的反馈，我们已经关注到这次问题，并在同步核实相关情况。后续有明确进展后，会第一时间统一说明。`

### `brand-host`

`谢谢你把这个问题直接说出来，我们也很重视这次体验上的落差。相关情况已经在跟进确认，后续我们会把处理结果认真和大家说明。`

## Example 8: 短而高级

原意：

`行，我来处理。`

### `cool-minimal`

`可以，这件事我来处理。`

### `executive-crisp`

`收到，这件事我今天内处理完。`

## Example 9: 售后补救

原意：

`不好意思，给您添麻烦了。`

### `service-recovery`

`这次确实影响到你了，这边先和你说声抱歉。我会直接跟进这次问题的处理，今天内先把进度和补救方案同步给你。`

### `customer-success`

`这次确实影响了你的使用体验，先和你说声抱歉。我这边会把这次问题跟进到底，也会一起把后续更顺畅的处理方式梳理出来，尽量不再让你重复受影响。`

## Example 10: 知性温柔

原意：

`你不用太担心。`

### `bookish-gentle`

`你先别太着急，这件事未必有现在感受到的那么糟。我们可以慢一点，把关键信息一项项看清楚。`

### `supportive-coach`

`你先别急，这件事还有空间。我们先把眼前最关键的一步拆出来，你会更容易重新找回节奏。`


path: scripts/get-style-bundle.mjs
content: #!/usr/bin/env node

import {
  buildReplyBundle,
  getStyle,
  listStyles,
  recommendStyle,
  PERSONAS,
  MODES,
} from "./style-bundles.mjs";

function parseArgs(argv) {
  const args = {
    list: false,
    listPersonas: false,
    listModes: false,
    style: "",
    scene: "",
    goal: "",
    intensity: "",
    channel: "wechat",
    persona: "",
    mode: "",
  };
  for (let i = 2; i < argv.length; i += 1) {
    const part = argv[i];
    if (part === "--list") args.list = true;
    if (part === "--list-personas") args.listPersonas = true;
    if (part === "--list-modes") args.listModes = true;
    if (part === "--style") args.style = argv[i + 1] ?? "";
    if (part === "--scene") args.scene = argv[i + 1] ?? "";
    if (part === "--goal") args.goal = argv[i + 1] ?? "";
    if (part === "--intensity") args.intensity = argv[i + 1] ?? "";
    if (part === "--channel") args.channel = argv[i + 1] ?? "wechat";
    if (part === "--persona") args.persona = argv[i + 1] ?? "";
    if (part === "--mode") args.mode = argv[i + 1] ?? "";
  }
  return args;
}

const args = parseArgs(process.argv);

if (args.list) {
  console.log(JSON.stringify(listStyles(), null, 2));
  process.exit(0);
}

if (args.listPersonas) {
  console.log(JSON.stringify(Object.keys(PERSONAS).sort(), null, 2));
  process.exit(0);
}

if (args.listModes) {
  console.log(JSON.stringify(Object.keys(MODES).sort(), null, 2));
  process.exit(0);
}

if (args.style) {
  const style = getStyle(args.style);
  if (!style) {
    console.error(`unknown style: ${args.style}`);
    process.exit(1);
  }
  console.log(JSON.stringify(buildReplyBundle(args), null, 2));
  process.exit(0);
}

if (args.scene || args.goal) {
  const styleName = recommendStyle(args);
  console.log(JSON.stringify(buildReplyBundle({ ...args, style: styleName }), null, 2));
  process.exit(0);
}

console.log("Usage: node scripts/get-style-bundle.mjs --list | --list-personas | --list-modes | --style <name> [--persona <name>] [--mode <name>] [--intensity <level>] [--channel <name>] | --scene <scene> [--goal <goal>]");


path: scripts/recommend-style.mjs
content: #!/usr/bin/env node

import { buildReplyBundle, recommendStyle } from "./style-bundles.mjs";

function parseArgs(argv) {
  const args = {
    scene: "",
    goal: "",
    relationship: "",
    intensity: "",
    channel: "wechat",
    persona: "",
    mode: "",
  };
  for (let i = 2; i < argv.length; i += 1) {
    const part = argv[i];
    if (part === "--scene") args.scene = argv[i + 1] ?? "";
    if (part === "--goal") args.goal = argv[i + 1] ?? "";
    if (part === "--relationship") args.relationship = argv[i + 1] ?? "";
    if (part === "--intensity") args.intensity = argv[i + 1] ?? "";
    if (part === "--channel") args.channel = argv[i + 1] ?? "wechat";
    if (part === "--persona") args.persona = argv[i + 1] ?? "";
    if (part === "--mode") args.mode = argv[i + 1] ?? "";
  }
  return args;
}

const args = parseArgs(process.argv);
const styleName = recommendStyle(args);
const bundle = buildReplyBundle({ ...args, style: styleName });

console.log(JSON.stringify({
  scene: args.scene,
  goal: args.goal,
  relationship: args.relationship,
  recommendedStyle: styleName,
  summary: bundle.styleCn,
  intensity: bundle.intensity,
  channel: bundle.channel,
  persona: bundle.persona,
  personaSummary: bundle.personaCn,
  mode: bundle.mode,
  modeSummary: bundle.modeCn,
  signature: bundle.compositeSignature,
  opening: bundle.opening,
  body: bundle.body,
  closing: bundle.closing,
}, null, 2));


path: scripts/scaffold-reply.mjs
content: #!/usr/bin/env node

import { buildReplyBundle, recommendStyle } from "./style-bundles.mjs";

function parseArgs(argv) {
  const args = {
    style: "",
    scene: "",
    goal: "",
    intent: "",
    intensity: "",
    channel: "wechat",
    persona: "",
    mode: "",
  };
  for (let i = 2; i < argv.length; i += 1) {
    const part = argv[i];
    if (part === "--style") args.style = argv[i + 1] ?? "";
    if (part === "--scene") args.scene = argv[i + 1] ?? "";
    if (part === "--goal") args.goal = argv[i + 1] ?? "";
    if (part === "--intent") args.intent = argv[i + 1] ?? "";
    if (part === "--intensity") args.intensity = argv[i + 1] ?? "";
    if (part === "--channel") args.channel = argv[i + 1] ?? "wechat";
    if (part === "--persona") args.persona = argv[i + 1] ?? "";
    if (part === "--mode") args.mode = argv[i + 1] ?? "";
  }
  return args;
}

const args = parseArgs(process.argv);
const styleName = args.style || recommendStyle(args);
const bundle = buildReplyBundle({ ...args, style: styleName });

if (!bundle) {
  console.error(`unknown style: ${styleName}`);
  process.exit(1);
}

console.log(JSON.stringify({
  style: styleName,
  cn: bundle.styleCn,
  intensity: bundle.intensity,
  channel: bundle.channel,
  persona: bundle.persona,
  personaCn: bundle.personaCn,
  mode: bundle.mode,
  modeCn: bundle.modeCn,
  signature: bundle.compositeSignature,
  outline: [
    `Opening: ${bundle.opening}`,
    `Body: ${bundle.body}`,
    `Closing: ${bundle.closing}`,
  ],
  modeStructure: bundle.modeStructure,
  personaBias: bundle.personaBias,
  channelRules: bundle.channelRules,
  intensityRules: bundle.intensityRules,
  do: bundle.do,
  avoid: bundle.avoid,
  intent: args.intent || "",
}, null, 2));


path: scripts/showcase-replies.mjs
content: import { buildReplyBundle } from "./style-bundles.mjs";

function parseArgs(argv) {
  const result = {};
  for (let i = 2; i < argv.length; i += 1) {
    const arg = argv[i];
    if (!arg.startsWith("--")) continue;
    const key = arg.slice(2);
    const next = argv[i + 1];
    if (!next || next.startsWith("--")) {
      result[key] = "true";
      continue;
    }
    result[key] = next;
    i += 1;
  }
  return result;
}

function buildDemoReply({ bundle, intent, audience }) {
  const opening =
    bundle.sampleOpening || `${bundle.styleCn}风格建议先用一句自然开场接住对方。`;
  const closing =
    bundle.sampleClosing || `${bundle.styleCn}风格建议用一句体面收口并给出下一步。`;
  const modeBodies = {
    "clear-reject": "就这件事来说，我这边这次先不继续按现在的方式处理了，也想提前和你说清楚。",
    "soothe-first": "就这件事来说，我先接手跟进，也会尽快把能确认的进展同步给你。",
    "push-forward": "就这件事来说，我们先按当前节点往前推进，关键事项我会继续盯住并同步。",
    "repair-trust": "就这件事来说，这次确实没有处理到位，我会把后续修复动作补上。",
    "public-safe": "就这件事来说，相关情况我们已经收到，也在进一步确认中。",
    "concise-update": "就这件事来说，结论先说：目前在推进中，会按节点给出明确结果。",
  };
  const body =
    modeBodies[bundle.mode] ||
    `就这件事来说，${audience ? `面对${audience}时，` : ""}${intent}。`;

  return [
    opening,
    body,
    closing,
  ].join("");
}

const args = parseArgs(process.argv);
const intent = args.intent || "礼貌拒绝继续无偿帮忙";
const scene = args.scene || "reject-request";
const channel = args.channel || "wechat";
const intensity = args.intensity || "balanced";
const audience = args.audience || "";
const persona = args.persona || "";
const mode = args.mode || "";
const styles = (args.styles || "firm-boundary,high-eq-soft,warm-professional,consultant-polished")
  .split(",")
  .map((item) => item.trim())
  .filter(Boolean);

const showcase = styles
  .map((style) => {
    const bundle = buildReplyBundle({ style, scene, intensity, channel, persona, mode });
    if (!bundle) return null;
    return {
      style: bundle.style,
      styleCn: bundle.styleCn,
      signature: bundle.signature,
      compositeSignature: bundle.compositeSignature,
      tone: bundle.tone,
      channel: bundle.channelCn,
      intensity: bundle.intensityCn,
      persona: bundle.personaCn,
      mode: bundle.modeCn,
      preferredWords: bundle.preferredWords,
      avoidWords: bundle.avoidWords,
      reply: buildDemoReply({ bundle, intent, audience }),
    };
  })
  .filter(Boolean);

process.stdout.write(
  `${JSON.stringify(
    {
      scene,
      intent,
      channel,
      intensity,
      audience,
      persona,
      mode,
      count: showcase.length,
      showcase,
    },
    null,
    2,
  )}\n`,
);


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)