@yoooclaw/cli 0.1.9 → 0.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -305
- package/bin/yc.js +43 -0
- package/package.json +25 -55
- package/LICENSE +0 -21
- package/dist/bin.cjs +0 -14836
- package/dist/bin.cjs.map +0 -115
- package/dist/command-tree.d.ts +0 -40
- package/dist/context.d.ts +0 -19
- package/dist/errors.d.ts +0 -71
- package/dist/index.cjs +0 -14833
- package/dist/index.cjs.map +0 -114
- package/dist/index.d.ts +0 -8
- package/dist/output/format.d.ts +0 -18
- package/dist/paths.d.ts +0 -30
- package/dist/program.d.ts +0 -14
- package/dist/version.d.ts +0 -3
- package/skills/yoooclaw-lightrule-create/SKILL.md +0 -63
- package/skills/yoooclaw-notification-query/SKILL.md +0 -71
- package/skills/yoooclaw-recording-entity-extraction/SKILL.md +0 -121
- package/skills/yoooclaw-recording-interview/SKILL.md +0 -112
- package/skills/yoooclaw-recording-meeting-minutes/SKILL.md +0 -92
- package/skills/yoooclaw-recording-mindmap/SKILL.md +0 -142
- package/skills/yoooclaw-recording-query/SKILL.md +0 -145
- package/skills/yoooclaw-recording-translation/SKILL.md +0 -130
- package/skills/yoooclaw-tunnel-debug/SKILL.md +0 -63
package/dist/index.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export declare function run(argv?: string[]): Promise<void>;
|
|
2
|
-
export { buildProgram } from "./program.js";
|
|
3
|
-
export { COMMAND_TREE } from "./command-tree.js";
|
|
4
|
-
export { CLI_VERSION } from "./version.js";
|
|
5
|
-
export { ErrorCode, YoooclawError } from "./errors.js";
|
|
6
|
-
export { renderResult, renderError, resolveFormat, type OutputFormat, } from "./output/format.js";
|
|
7
|
-
export { buildContext, resolveActiveProfile, type CliContext, type GlobalFlags, } from "./context.js";
|
|
8
|
-
export * as paths from "./paths.js";
|
package/dist/output/format.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export type OutputFormat = "json" | "pretty" | "table" | "ndjson";
|
|
2
|
-
export declare const OUTPUT_FORMATS: OutputFormat[];
|
|
3
|
-
/** 解析用户传入的 --format;`auto` / 缺省时按 TTY 判定。 */
|
|
4
|
-
export declare function resolveFormat(requested: string | undefined, isTty?: boolean): OutputFormat;
|
|
5
|
-
interface RenderOptions {
|
|
6
|
-
format: OutputFormat;
|
|
7
|
-
/** 写出目标,默认 process.stdout。便于测试。 */
|
|
8
|
-
stream?: NodeJS.WritableStream;
|
|
9
|
-
}
|
|
10
|
-
/** 渲染一次成功结果。data 任意结构;table/ndjson 在数组时逐行展开。 */
|
|
11
|
-
export declare function renderResult(data: unknown, opts: RenderOptions): void;
|
|
12
|
-
/**
|
|
13
|
-
* 渲染错误。统一 schema:{ ok: false, error: {...} }。
|
|
14
|
-
* 默认写 stdout —— 与正常输出同一通道,让 `--format json | jq` 等 Agent 管道能读到错误体;
|
|
15
|
-
* 失败由非零退出码表达。
|
|
16
|
-
*/
|
|
17
|
-
export declare function renderError(err: unknown, opts: RenderOptions): void;
|
|
18
|
-
export {};
|
package/dist/paths.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_PROFILE = "default";
|
|
2
|
-
/** CLI 根数据目录。可用 `YOOOCLAW_HOME` 覆盖(测试 / 多实例隔离)。 */
|
|
3
|
-
export declare function rootDir(): string;
|
|
4
|
-
/** account 级共享凭据文件(顶层,跨 profile + 插件共享)。 */
|
|
5
|
-
export declare function sharedCredentialsPath(): string;
|
|
6
|
-
/** 记录当前 active profile 的文本文件。 */
|
|
7
|
-
export declare function activeProfilePath(): string;
|
|
8
|
-
/** 某个 profile 的目录。 */
|
|
9
|
-
export declare function profileDir(profile: string): string;
|
|
10
|
-
export interface ProfilePaths {
|
|
11
|
-
profile: string;
|
|
12
|
-
dir: string;
|
|
13
|
-
config: string;
|
|
14
|
-
credentials: string;
|
|
15
|
-
daemonLock: string;
|
|
16
|
-
daemonLog: string;
|
|
17
|
-
notifications: string;
|
|
18
|
-
recordings: string;
|
|
19
|
-
images: string;
|
|
20
|
-
lightRules: string;
|
|
21
|
-
state: string;
|
|
22
|
-
}
|
|
23
|
-
/** profiles/ 根目录。 */
|
|
24
|
-
export declare function profilesRoot(): string;
|
|
25
|
-
/** 列出已存在的 profile 名(profiles/ 下的目录)。 */
|
|
26
|
-
export declare function listProfileNames(): string[];
|
|
27
|
-
/** 读取 active-profile 文件内容(不存在返回 undefined)。 */
|
|
28
|
-
export declare function readActiveProfile(): string | undefined;
|
|
29
|
-
/** 解析某个 profile 下的全部关键路径。 */
|
|
30
|
-
export declare function profilePaths(profile: string): ProfilePaths;
|
package/dist/program.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 构建 yoooclaw 的 commander 程序。
|
|
3
|
-
*
|
|
4
|
-
* 命令树结构(service / subcommand / shortcut / options)来自 command-tree.ts;
|
|
5
|
-
* 实现体由 commands/registry.ts 按 path(如 `config init`)提供,未注册则回落 notImplemented。
|
|
6
|
-
*/
|
|
7
|
-
import { Command } from "commander";
|
|
8
|
-
import { type CliContext } from "./context.js";
|
|
9
|
-
/** 命令处理器签名:拿到上下文 + commander 解析后的参数/选项,返回可序列化结果。 */
|
|
10
|
-
export type CommandHandler = (ctx: CliContext, args: unknown[], opts: Record<string, unknown>) => unknown;
|
|
11
|
-
/** 注册表的 path key:去掉子命令名里的位置参数占位(`show <id>` → `show`)。 */
|
|
12
|
-
export declare function handlerKey(service: string, subName: string): string;
|
|
13
|
-
/** 构建并返回顶层 commander 程序。 */
|
|
14
|
-
export declare function buildProgram(): Command;
|
package/dist/version.d.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: yoooclaw-lightrule-create
|
|
3
|
-
description: 用 yoooclaw CLI 创建/管理"通知→灯效"规则。当用户表达"收到/当/如果某类通知或消息时,亮灯/闪灯/变成某种灯效"这类**持久规则**诉求时激活。规则由 daemon 在通知 ingest 后评估命中并触发灯效。需要 daemon 在运行(🟡)。从 stdin 用 --from-file - 提交规则定义最稳妥。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# yoooclaw 灯效规则创建(从 stdin)
|
|
7
|
-
|
|
8
|
-
灯效规则是**持久**的:通知到达后 daemon 评估是否命中,命中则播放灯效。
|
|
9
|
-
和"立即放一次灯效测试"不同(那是 `yoooclaw light send`)。
|
|
10
|
-
|
|
11
|
-
> 需要 daemon 在跑:先 `yoooclaw daemon status`,未运行则 `yoooclaw daemon start`。
|
|
12
|
-
|
|
13
|
-
## 何时激活
|
|
14
|
-
|
|
15
|
-
- "微信群里有人@我时红灯闪三下"
|
|
16
|
-
- "收到老板的消息就亮黄灯"
|
|
17
|
-
- "飞书有新消息时呼吸绿灯"
|
|
18
|
-
- 任何"当 X 通知 → 播放 Y 灯效"的持久化诉求。
|
|
19
|
-
|
|
20
|
-
不要为这类诉求调用 `light send`(那只用于一次性测试/预览)。
|
|
21
|
-
|
|
22
|
-
## 创建规则(首选 --from-file - 从 stdin)
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
cat <<'JSON' | yoooclaw lightrule create --from-file - --format json
|
|
26
|
-
{
|
|
27
|
-
"name": "wechat-at-me",
|
|
28
|
-
"title": "微信@我",
|
|
29
|
-
"description": "微信群里有人@我时红灯快闪",
|
|
30
|
-
"segments": [
|
|
31
|
-
{ "mode": "strobe", "duration_s": 2, "brightness": 255,
|
|
32
|
-
"color": { "r": 255, "g": 0, "b": 0 }, "interval_ms": 200 }
|
|
33
|
-
]
|
|
34
|
-
}
|
|
35
|
-
JSON
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
字段说明:
|
|
39
|
-
|
|
40
|
-
- `name`(必填):规则唯一标识。
|
|
41
|
-
- `description`(必填):自然语言意图,daemon 的 webhook 评估器据此判断通知是否命中。
|
|
42
|
-
- `segments`(必填):命中后播放的灯效,遵循 light protocol(mode/duration_s/brightness/color/interval_ms 等)。
|
|
43
|
-
- 也可用 flag 形式:`--name --intent <描述> --light-action <segments JSON> --match-rules <硬过滤 JSON>`。
|
|
44
|
-
|
|
45
|
-
## 管理
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
yoooclaw lightrule list --format json # 列出全部规则及 enabled 状态
|
|
49
|
-
yoooclaw lightrule show <name> --format json # 单条详情
|
|
50
|
-
yoooclaw lightrule disable <name> # 停用(不删除)
|
|
51
|
-
yoooclaw lightrule enable <name> # 启用
|
|
52
|
-
yoooclaw lightrule +off # 停用所有
|
|
53
|
-
yoooclaw lightrule +on # 启用所有
|
|
54
|
-
yoooclaw lightrule delete <name> --yes # 删除
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## 错误处理
|
|
58
|
-
|
|
59
|
-
- `YOOOCLAW_DAEMON_NOT_RUNNING`:先 `yoooclaw daemon start` 再重试。
|
|
60
|
-
- 创建失败通常表现为 `YOOOCLAW_INVALID_ARGUMENT`,`error.message` 中会带底层
|
|
61
|
-
`VALIDATION_FAILED`(segments 不合法)或 `INVALID_PARAMS`(缺 name/description);
|
|
62
|
-
按具体校验项修正 JSON 后重新提交。
|
|
63
|
-
- 规则名重复:换 `name` 或先 `delete`。
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: yoooclaw-notification-query
|
|
3
|
-
description: 用 yoooclaw CLI 直接、流式地查询手机通知原始数据。当用户说"看看最近的通知""谁找过我""总结今天的消息""某 App 有什么通知""昨天有什么消息"或任何通知查询/筛选/汇总诉求时,激活本 Skill,基于当前磁盘最新数据查询,不要依赖先前轮次或记忆。yoooclaw 是 openclaw 手机通知插件的独立 CLI 形态,数据在 ~/.yoooclaw 下,纯读磁盘、不需要 daemon 在跑。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# yoooclaw 通知查询(Agent-Native,流式)
|
|
7
|
-
|
|
8
|
-
`yoooclaw` CLI 自身就是工具表:所有命令都支持 `--format json|pretty|table|ndjson`。
|
|
9
|
-
**Agent 消费首选 `--format ndjson`**——每条通知一行 JSON、无包裹数组,便于流式逐条处理大批量结果。
|
|
10
|
-
|
|
11
|
-
> 命令名 `yoooclaw`,短别名 `yc` 完全等价。下文用 `yoooclaw`。
|
|
12
|
-
|
|
13
|
-
## 何时激活
|
|
14
|
-
|
|
15
|
-
- "最近收到什么消息 / 谁找过我 / 某某给我发过什么"
|
|
16
|
-
- "总结今天 / 昨天 / 最近一小时的通知"
|
|
17
|
-
- "微信 / 飞书 有什么通知"
|
|
18
|
-
- 任何按 时间 / 应用 / 发送人 / 关键词 筛选通知的诉求
|
|
19
|
-
|
|
20
|
-
## 先确认存储路径(不要假设目录)
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
yoooclaw notification storage-path --format json
|
|
24
|
-
# → {"ok":true,"path":"/abs/path/to/profiles/<profile>/notifications"}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## 查询(按需选参数)
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
# 今日全部(快捷命令,等价 search --from 今日00:00 --to 今日23:59)
|
|
31
|
-
yoooclaw notification +today --format ndjson
|
|
32
|
-
|
|
33
|
-
# 最近一小时
|
|
34
|
-
yoooclaw notification +recent --format ndjson
|
|
35
|
-
|
|
36
|
-
# 精确筛选:时间范围 + 应用 + 关键词
|
|
37
|
-
yoooclaw notification search \
|
|
38
|
-
--from 2026-05-01T00:00:00+08:00 --to 2026-05-21T23:59:59+08:00 \
|
|
39
|
-
--app 微信 --keyword 开会 --limit 200 --format ndjson
|
|
40
|
-
|
|
41
|
-
# 聚合摘要(topApps / topSenders / 最近样例),适合"帮我总结"
|
|
42
|
-
yoooclaw notification summary --top 10 --sample 30 --format json
|
|
43
|
-
|
|
44
|
-
# 维度统计(date|app|sender|hour|client|all)
|
|
45
|
-
yoooclaw notification stats --from 2026-05-14 --to 2026-05-21 --dim all --format json
|
|
46
|
-
yoooclaw notification stats --from 2026-05-21T00:00:00+08:00 --to 2026-05-21T23:59:59+08:00 --sender 张三 --dim sender --format json
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
- `--app` 支持中英文别名:`微信/wechat`、`飞书/feishu/lark`、`钉钉/dingtalk`、`企业微信/wecom` 等。
|
|
50
|
-
- `search` / `summary` 的 `--from/--to` 用 ISO 8601 含时区(`2026-05-01T09:00:00+08:00`)。`stats` 的 `--from/--to` 支持 `YYYY-MM-DD` 或 ISO 8601。
|
|
51
|
-
|
|
52
|
-
## 流式处理 ndjson 的样板
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
yoooclaw notification search --app 微信 --format ndjson | while IFS= read -r line; do
|
|
56
|
-
# 每行是一条 StoredNotification:{appName,appDisplayName,title,content,timestamp,senderName,conversationType,...}
|
|
57
|
-
echo "$line" | jq -r '"\(.timestamp) \(.appDisplayName // .appName) | \(.senderName // .title): \(.content)"'
|
|
58
|
-
done
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## 错误处理
|
|
62
|
-
|
|
63
|
-
所有命令失败都输出统一 schema 并以非零退出码结束:
|
|
64
|
-
|
|
65
|
-
```json
|
|
66
|
-
{ "ok": false, "error": { "code": "YOOOCLAW_...", "message": "...", "hint": "..." } }
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
- `YOOOCLAW_INVALID_ARGUMENT`:时间格式 / `--conversation-type`(只能 group|private)/ `--limit` 非正整数 → 按 `message` 修正参数。
|
|
70
|
-
- 通知目录尚不存在或当天无数据:`search` 返回 `[]`、`+today` 返回 `[]`,**不是错误**——直接据此回复"暂无通知"。
|
|
71
|
-
- 多 profile:加 `--profile <name>` 查指定 profile 的数据。
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: yoooclaw-recording-entity-extraction
|
|
3
|
-
description: 从文本文件或录音转写中提取特定实体(人名、联系方式、机构、术语等)。支持自定义提取需求或通用提取,输出 sidecar JSON 文件。当用户要求"提取信息""找联系方式""有哪些人名""关键信息""从文件提取"时激活。基于录音时用 yoooclaw CLI 定位文件;yoooclaw 是 openclaw 手机录音插件的独立 CLI 形态,数据在 ~/.yoooclaw 下。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# yoooclaw 实体提取(Agent-Native)
|
|
7
|
-
|
|
8
|
-
> 命令名 `yoooclaw`,短别名 `yc` 完全等价。所有命令支持 `--format json|pretty|table|ndjson`,本 Skill 取结构化对象用 `--format json`。
|
|
9
|
-
> 录音数据在 `~/.yoooclaw` 下,查询纯读磁盘、不需要 daemon 在跑;定位/读写文件用你自己的文件工具,不要假设目录。
|
|
10
|
-
|
|
11
|
-
## 1. 初始化与定位
|
|
12
|
-
|
|
13
|
-
**若用户请求中包含明确文件路径**:
|
|
14
|
-
|
|
15
|
-
- 直接记录该路径,跳至 Step 3。
|
|
16
|
-
|
|
17
|
-
**若未提供文件路径**:
|
|
18
|
-
|
|
19
|
-
不要假设录音目录。调用以下命令获取存储路径:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
yoooclaw recording storage-path --format json
|
|
23
|
-
# → {"ok":true,"path":"/abs/path/to/profiles/<profile>/recordings"}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
后续所有文件操作以返回的 `path` 为根目录:
|
|
27
|
-
|
|
28
|
-
- 转写文件:来自 `recording status` 的 `transcriptFile`,即 `<path>/<transcriptFile>`。
|
|
29
|
-
- 实体输出:`<path>/entity/<date>_<brief_summary>_entities.json`
|
|
30
|
-
|
|
31
|
-
## 2. 意图解析与列表定位
|
|
32
|
-
|
|
33
|
-
> **若已在 Step 1 获得明确文件路径,跳过本节,直接进入 Step 3。**
|
|
34
|
-
|
|
35
|
-
### 2.1 确定范围与实体类型
|
|
36
|
-
|
|
37
|
-
从用户请求中识别以下信息:
|
|
38
|
-
|
|
39
|
-
**目标录音范围**:
|
|
40
|
-
- 具体 ID/名称 -> 精确匹配。
|
|
41
|
-
- "刚才"、"最新" -> 取最近 1 条(可直接用 `yoooclaw recording +latest --format json`)。
|
|
42
|
-
- "最近 N 条" -> 取最近 N 条。
|
|
43
|
-
- "全部" -> 全量处理。
|
|
44
|
-
- **若未提及**:执行 2.2 展示列表。
|
|
45
|
-
|
|
46
|
-
**实体类型**:
|
|
47
|
-
- 用户指定(如"手机号"、"品牌")-> 仅提取指定类型。
|
|
48
|
-
- **若未指定**:执行通用提取(人名、联系方式、机构/公司、产品/品牌、日期时间、专业术语)。
|
|
49
|
-
|
|
50
|
-
### 2.2 获取列表与交互选择
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
yoooclaw recording list --status transcribed --format json
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**过滤与排序**:
|
|
57
|
-
- 只保留 `status = "transcribed"` 且 `has_transcript = true` 的录音。
|
|
58
|
-
- 按 `created_at` 倒序。
|
|
59
|
-
|
|
60
|
-
**交互选择**:
|
|
61
|
-
若范围不明确,按序号展示过滤后的列表:
|
|
62
|
-
`1. [名称] ([时间], [时长])`
|
|
63
|
-
等待用户输入序号(支持 `1,3` 或 `1-3` 或 `all`)。
|
|
64
|
-
|
|
65
|
-
若用户表示找不到某条录音,说明该录音可能仍在转录中,告知用户稍后再试。
|
|
66
|
-
|
|
67
|
-
## 3. 读取文件内容
|
|
68
|
-
|
|
69
|
-
**来自录音系统(recording list 流程)**:根据选定的 `recording_id` 获取具体路径:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
yoooclaw recording status <recording_id> --format json
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
读取返回 `recording.transcriptFile` 对应的 `<path>/<transcriptFile>`。
|
|
76
|
-
|
|
77
|
-
若文件不存在或读取失败,告知用户:「转写文件尚未生成,对应的音频可能正在转写中,请稍后再试。」
|
|
78
|
-
- 单条录音:终止处理。
|
|
79
|
-
- 批量处理:跳过该条,继续处理其余录音。
|
|
80
|
-
|
|
81
|
-
**来自用户指定路径**:直接读取该文件。若文件不存在,告知用户该文件未找到,对应的音频可能仍在转写中,请稍后再试。
|
|
82
|
-
|
|
83
|
-
保留所有文本内容及时间戳标记。
|
|
84
|
-
|
|
85
|
-
## 4. 实体提取流程 (LLM)
|
|
86
|
-
|
|
87
|
-
使用 LLM 从转写文本中提取实体。
|
|
88
|
-
|
|
89
|
-
**提取规则**:
|
|
90
|
-
1. **语义推断**:根据用户需求调整提取侧重点。
|
|
91
|
-
2. **去重**:同一实体多次出现仅保留一条,`context` 记录最典型的语境。
|
|
92
|
-
3. **语言一致性**:输出值应与转写文本语言一致。
|
|
93
|
-
4. **语境要求**:每个实体需配有 ≤30 字的出现背景。
|
|
94
|
-
|
|
95
|
-
## 5. 写入与反馈
|
|
96
|
-
|
|
97
|
-
### 5.1 写入 Sidecar 文件
|
|
98
|
-
|
|
99
|
-
用你自己的文件写入工具直接写出:
|
|
100
|
-
|
|
101
|
-
**来自录音系统**:写入 `<path>/entity/<date>_<brief_summary>_entities.json`
|
|
102
|
-
|
|
103
|
-
**来自用户指定文件**:同时写入以下两个位置:
|
|
104
|
-
|
|
105
|
-
1. **源文件同目录**:`/path/to/<basename>_entities.json`
|
|
106
|
-
2. **转录系统 entity 目录**:用 `yoooclaw recording storage-path --format json` 获取存储根路径,写入 `<storage_path>/entity/<basename>_entities.json`
|
|
107
|
-
- 若该命令失败或返回路径无效,则跳过此步骤,仅保留源文件同目录的副本,无需报错。
|
|
108
|
-
- 两份文件内容完全相同。
|
|
109
|
-
|
|
110
|
-
包含字段:`source_file`, `extracted_at`, `user_request`, `entity_types_extracted`, `entities`。
|
|
111
|
-
|
|
112
|
-
### 5.2 任务汇报
|
|
113
|
-
|
|
114
|
-
告知用户处理完成,并列出所有实际写入的文件完整路径(来自用户指定文件时可能为 1 或 2 个),供用户直接查阅。若处理了多条录音,逐条列出。
|
|
115
|
-
|
|
116
|
-
## 边界处理
|
|
117
|
-
|
|
118
|
-
- **无已转写录音**:提示用户并终止(仅适用于走 recording list 流程时)。
|
|
119
|
-
- **存储路径无效**:若用户未指定文件路径,告知录音功能不可用;若已指定路径则不受影响。
|
|
120
|
-
- **需求不明确**:默认进行全品类通用提取。
|
|
121
|
-
- **文件冲突**:若 sidecar 已存在,直接覆盖并在汇报中注明。
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: yoooclaw-recording-interview
|
|
3
|
-
description: 用 yoooclaw CLI 定位采访录音转写并整理结构化采访稿。当用户说"整理采访内容""提取核心观点""整理成问答""帮我梳理采访录音""输出采访 Q&A"等表达时激活,一律优先使用本 Skill;必须通过 yoooclaw recording 命令获得转写文件的真实存储位置,严禁假设录音目录。yoooclaw 是 openclaw 手机录音插件的独立 CLI 形态,数据在 ~/.yoooclaw 下。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# yoooclaw 采访稿整理(Agent-Native)
|
|
7
|
-
|
|
8
|
-
> 命令名 `yoooclaw`,短别名 `yc` 完全等价。所有命令支持 `--format json|pretty|table|ndjson`,本 Skill 取结构化对象用 `--format json`。
|
|
9
|
-
> 录音数据在 `~/.yoooclaw` 下,查询纯读磁盘、不需要 daemon 在跑;定位到转写文件后用文件读取工具直接读,不要假设目录。
|
|
10
|
-
|
|
11
|
-
## 🛠 核心执行链路 (Smart Workflow)
|
|
12
|
-
|
|
13
|
-
### Phase 0: 目录检索
|
|
14
|
-
|
|
15
|
-
不要假设固定目录。先执行:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
yoooclaw recording storage-path --format json
|
|
19
|
-
# → {"ok":true,"path":"/abs/path/to/profiles/<profile>/recordings"}
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
后续所有文件操作以返回的 `path` 为根目录,优先读取 `<path>/<transcriptFile>`。
|
|
23
|
-
|
|
24
|
-
### Phase 1: 列表定位与交互选择
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
yoooclaw recording list --status transcribed --format json
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
**过滤与排序**:
|
|
31
|
-
|
|
32
|
-
- 只保留 `status = "transcribed"` 且 `has_transcript = true` 的录音。
|
|
33
|
-
- 按 `created_at` 倒序。
|
|
34
|
-
|
|
35
|
-
**交互选择**:
|
|
36
|
-
|
|
37
|
-
- 若没有符合条件的录音,立即回复:"当前未检测到已完成转写的采访录音。对应录音可能仍在转录中,请稍后再试。" ➡️ **[终止执行]**
|
|
38
|
-
- 若用户明确指定具体 ID/名称/时间,按过滤后的列表匹配;只有唯一匹配时才锁定。
|
|
39
|
-
- 若用户说"刚才""最新""最近一次",取排序后的第 1 条(可直接用 `yoooclaw recording +latest --format json`)。
|
|
40
|
-
- 若用户说"最近 N 条",取排序后的前 N 条。
|
|
41
|
-
- 若用户说"全部",处理过滤后的全部录音。
|
|
42
|
-
- 若范围不明确,按序号展示过滤后的列表:
|
|
43
|
-
`1. [名称] ([时间], [时长])`
|
|
44
|
-
等待用户输入序号(支持 `1,3` 或 `1-3` 或 `all`)。
|
|
45
|
-
- 若用户表示找不到某条录音,说明该录音可能仍在转录中,告知用户稍后再试。
|
|
46
|
-
|
|
47
|
-
锁定录音后,对每条选中的录音执行:
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
yoooclaw recording status <recording_id> --format json
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
读取返回 `recording.transcriptFile` 对应的 `<path>/<transcriptFile>`。若 `transcriptFile` 为空、文件不存在或读取失败,告知用户:「转写文件尚未生成,对应的音频可能正在转写中,请稍后再试。」
|
|
54
|
-
|
|
55
|
-
### Phase 2: 内容解析与信息提取
|
|
56
|
-
|
|
57
|
-
1. **精准读取**:仅读取锁定录音的转写文件。
|
|
58
|
-
2. **语义清洗**:将零散口语整理为通顺书面表达,剔除冗余口头禅、重复确认、跑题插话等噪音。
|
|
59
|
-
3. **角色识别**:优先区分采访者与受访者;若存在多个发言人,结合上下文识别提问方与回答方。
|
|
60
|
-
4. **问答配对**:自动识别连续提问与回答内容,按语义归并为清晰的 Q&A 对,不要机械按每一句切分。
|
|
61
|
-
5. **信息提炼**:重点提取核心观点、代表性金句、话题脉络,以及受访者表达中的立场、判断、经历和案例。
|
|
62
|
-
|
|
63
|
-
### Phase 3: 结构化输出 (Standard Format),以下列格式直接回复用户,避免写入文件
|
|
64
|
-
|
|
65
|
-
# 采访整理:[主题]
|
|
66
|
-
|
|
67
|
-
> **📌 采访概览**
|
|
68
|
-
> - **关联文件**:`文件名.md`
|
|
69
|
-
> - **识别时间**:[从文本或文件名中提取]
|
|
70
|
-
> - **采访对象**:[如可识别则填写]
|
|
71
|
-
> - **采访者**:[如可识别则填写]
|
|
72
|
-
> - **核心主题**:[一句话概括]
|
|
73
|
-
|
|
74
|
-
### 核心观点
|
|
75
|
-
- 提炼采访中最重要的 3-5 条观点,使用完整、清晰的陈述句表达。
|
|
76
|
-
|
|
77
|
-
### 金句摘录
|
|
78
|
-
- 摘取最有代表性的表达,优先保留原意与语言风格。
|
|
79
|
-
- 若原文过长,可适度压缩,但不得改变意思。
|
|
80
|
-
|
|
81
|
-
### 话题脉络
|
|
82
|
-
1. 按采访推进顺序梳理主要话题。
|
|
83
|
-
2. 说明每个话题如何过渡到下一个话题。
|
|
84
|
-
3. 若出现明显追问、补充说明或观点转折,需要标注出来。
|
|
85
|
-
|
|
86
|
-
### Q&A
|
|
87
|
-
**Q1:** [整理后的问题]
|
|
88
|
-
**A1:** [整理后的回答]
|
|
89
|
-
|
|
90
|
-
**Q2:** [整理后的问题]
|
|
91
|
-
**A2:** [整理后的回答]
|
|
92
|
-
|
|
93
|
-
> 持续补充,直到覆盖采访中的主要有效问答。
|
|
94
|
-
|
|
95
|
-
### 补充观察
|
|
96
|
-
- 标注采访中未展开但值得关注的线索、潜在后续追问方向,或表达中存在的模糊点。
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 🚫 行为约束
|
|
101
|
-
|
|
102
|
-
- **严禁臆造**:若转写中未明确提及采访对象、采访者、时间、背景信息,则填写"未明确提及",不得自行补全。
|
|
103
|
-
- **问答优先语义配对**:必须按语义整理 Q&A,不得简单按说话轮次机械拼接。
|
|
104
|
-
- **保留原意**:允许润色口语,但不得改变受访者的真实观点、语气倾向或事实表述。
|
|
105
|
-
- **主次分明**:优先保留真正有信息量的问答,寒暄、客套、重复确认可省略。
|
|
106
|
-
- **多文件冲突**:若用户要求"整理最近两次采访",则分别整理或按其要求合并。
|
|
107
|
-
- **确认优先**:除非用户明确说"最近一个",否则严禁随意挑选文件开始整理。
|
|
108
|
-
|
|
109
|
-
## 💬 响应示例
|
|
110
|
-
|
|
111
|
-
- **场景A(模糊请求)**:"我找到了以下 3 份最近的采访转写,请问整理哪一份?"
|
|
112
|
-
- **场景B(指定最近)**:"好的,正在为您整理最近一份采访录音(`2026-03-31_创始人采访.md`)的内容,稍后将输出核心观点、金句、话题脉络和 Q&A。"
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: yoooclaw-recording-meeting-minutes
|
|
3
|
-
description: 用 yoooclaw CLI 定位会议录音转写并整理结构化会议纪要。当用户说"整理一下会议纪要""总结这次会议""会议有哪些待办""帮我整理会议纪要"等表达时激活,一律优先使用本 Skill;必须通过 yoooclaw recording 命令获得转写文件的真实存储位置,严禁使用记忆搜索或文档搜索工具,否则会造成严重遗漏。yoooclaw 是 openclaw 手机录音插件的独立 CLI 形态,数据在 ~/.yoooclaw 下。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# yoooclaw 会议纪要整理(Agent-Native)
|
|
7
|
-
|
|
8
|
-
> 命令名 `yoooclaw`,短别名 `yc` 完全等价。所有命令支持 `--format json|pretty|table|ndjson`,本 Skill 取结构化对象用 `--format json`。
|
|
9
|
-
> 录音数据在 `~/.yoooclaw` 下,查询纯读磁盘、不需要 daemon 在跑;定位到转写文件后用文件读取工具直接读,不要假设目录。
|
|
10
|
-
|
|
11
|
-
## 🛠 核心执行链路 (Smart Workflow)
|
|
12
|
-
|
|
13
|
-
### Phase 0: 目录检索
|
|
14
|
-
|
|
15
|
-
不要假设固定目录。先执行:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
yoooclaw recording storage-path --format json
|
|
19
|
-
# → {"ok":true,"path":"/abs/path/to/profiles/<profile>/recordings"}
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
后续所有文件操作以返回的 `path` 为根目录,优先读取 `<path>/<transcriptFile>`。
|
|
23
|
-
|
|
24
|
-
### Phase 1: 列表定位与交互选择
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
yoooclaw recording list --status transcribed --format json
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
**过滤与排序**:
|
|
31
|
-
|
|
32
|
-
- 只保留 `status = "transcribed"` 且 `has_transcript = true` 的录音。
|
|
33
|
-
- 按 `created_at` 倒序。
|
|
34
|
-
|
|
35
|
-
**交互选择**:
|
|
36
|
-
|
|
37
|
-
- 若没有符合条件的录音,立即回复:"当前未检测到已完成转写的会议录音。对应录音可能仍在转录中,请稍后再试。" ➡️ **[终止执行]**
|
|
38
|
-
- 若用户明确指定具体 ID/名称/时间,按过滤后的列表匹配;只有唯一匹配时才锁定。
|
|
39
|
-
- 若用户说"刚才""最新""最近一次",取排序后的第 1 条(可直接用 `yoooclaw recording +latest --format json`)。
|
|
40
|
-
- 若用户说"最近 N 条",取排序后的前 N 条。
|
|
41
|
-
- 若用户说"全部",处理过滤后的全部录音。
|
|
42
|
-
- 若范围不明确,按序号展示过滤后的列表:
|
|
43
|
-
`1. [名称] ([时间], [时长])`
|
|
44
|
-
等待用户输入序号(支持 `1,3` 或 `1-3` 或 `all`)。
|
|
45
|
-
- 若用户表示找不到某条录音,说明该录音可能仍在转录中,告知用户稍后再试。
|
|
46
|
-
|
|
47
|
-
锁定录音后,对每条选中的录音执行:
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
yoooclaw recording status <recording_id> --format json
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
读取返回 `recording.transcriptFile` 对应的 `<path>/<transcriptFile>`。若 `transcriptFile` 为空、文件不存在或读取失败,告知用户:「转写文件尚未生成,对应的音频可能正在转写中,请稍后再试。」
|
|
54
|
-
|
|
55
|
-
### Phase 2: 内容解析与信息提取
|
|
56
|
-
|
|
57
|
-
1. **精准读取**:仅读取锁定录音的转写文件。
|
|
58
|
-
2. **智能重组**:将零散口语转化为专业书面语,剔除冗余(如"嗯"、"那个"、重复确认等)。
|
|
59
|
-
3. **要素识别**:重点提取议题、结论、行动项(Action Items)。
|
|
60
|
-
|
|
61
|
-
### Phase 3: 结构化输出 (Standard Format)
|
|
62
|
-
|
|
63
|
-
# 📝 会议纪要:[主题/文件名]
|
|
64
|
-
|
|
65
|
-
> **📅 会议概览**
|
|
66
|
-
> - **关联文件**:`文件名.md`
|
|
67
|
-
> - **识别时间**:[从文本或文件名中提取]
|
|
68
|
-
> - **参会人员**:[识别发言人角色]
|
|
69
|
-
|
|
70
|
-
### 🎯 议题与决策
|
|
71
|
-
<格式化输出,突出议题、讨论内容和最终结论>
|
|
72
|
-
|
|
73
|
-
### ✅ 待办事项 (Action Items)
|
|
74
|
-
| 事项 | 责任人 | 截止时间 | 状态 |
|
|
75
|
-
| :--- | :--- | :--- | :--- |
|
|
76
|
-
| 任务描述 | [姓名] | [日期/待定] | 待办 |
|
|
77
|
-
|
|
78
|
-
### ⚠️ 风险与未决事项
|
|
79
|
-
- 标注会议中提及的潜在问题或未达成一致的悬而未决事项。
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## 🚫 行为约束
|
|
84
|
-
|
|
85
|
-
- **严禁臆造**:若转写中未提及责任人或日期,表格对应项填入"未明确提及",不得自行推测。
|
|
86
|
-
- **多文件冲突**:若用户要求"处理最近两次会议",则分别整理或按其要求合并。
|
|
87
|
-
- **确认优先**:除非用户明确说"最近一个",否则严禁随意挑选文件开始总结。
|
|
88
|
-
|
|
89
|
-
## 💬 响应示例
|
|
90
|
-
|
|
91
|
-
- **场景A(模糊请求)**:"我找到了以下 3 份最近的转写,请问整理哪一份?"
|
|
92
|
-
- **场景B(指定最近)**:"好的,正在为您整理最近一份会议录音(`2023-10-27_项目周会.md`)的纪要..."
|