@clawos-dev/clawd 0.2.281 → 0.2.283
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/dist/cli.cjs
CHANGED
|
@@ -58124,7 +58124,7 @@ function computeMethodAccess(args) {
|
|
|
58124
58124
|
}
|
|
58125
58125
|
|
|
58126
58126
|
// src/version.ts
|
|
58127
|
-
var version = "0.2.
|
|
58127
|
+
var version = "0.2.283".length > 0 ? "0.2.283" : "dev";
|
|
58128
58128
|
|
|
58129
58129
|
// src/cli-probe/probe.ts
|
|
58130
58130
|
var fs54 = __toESM(require("fs"), 1);
|
|
@@ -30,14 +30,17 @@ node scripts/extract-signals.mjs --days 7 --out /tmp/persona-scan
|
|
|
30
30
|
**零依赖,只要有 node 就能跑**(不需要 python、不装任何包)。无 LLM、无网络、只读。
|
|
31
31
|
约 100MB session 记录 0.4 秒扫完。
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
**它产出什么**:脚本按**工作目录**归拢,给每个目录出一张**画像卡** —— 那个目录下老板干了
|
|
34
|
+
多少活、用什么工具、碰什么文件、会话标题都是什么。下面这些参数管的就是「哪些目录值得出一张」。
|
|
34
35
|
|
|
35
36
|
| 参数 | 默认 | 说明 |
|
|
36
37
|
|---|---|---|
|
|
37
38
|
| `--days` | 7 | 回溯天数。信号太少就放宽到 14 / 30 |
|
|
38
|
-
| `--min-queries` | 5 |
|
|
39
|
-
| `--min-days` | 2 |
|
|
40
|
-
|
|
39
|
+
| `--min-queries` | 5 | 一个目录里 query 数低于此值视为零散试用,不给它出画像卡 |
|
|
40
|
+
| `--min-days` | 2 | 活跃天数低于此值视为一次性任务,不给它出画像卡 |
|
|
41
|
+
|
|
42
|
+
**已有 persona 管着的目录一律略过,没有开关。** 本脚本找的是**没人管的活**——那些目录里的活
|
|
43
|
+
已经有人干了。所以你拿到的每张画像卡,都是「目前没有任何 persona 负责」的。
|
|
41
44
|
|
|
42
45
|
对 node 版本没有硬要求:`node:sqlite`(读 codex 的 threads 表拿 git 分支等元信息)
|
|
43
46
|
只在 node ≥22.5 上有,拿不到就自动降级到扫 rollout 文件,**query 提取结果完全相同**。
|
|
@@ -66,6 +69,7 @@ node scripts/extract-signals.mjs --days 7 --out /tmp/persona-scan
|
|
|
66
69
|
`session_titles` 是 Claude Code 自己给每个会话生成的标题(约九成会话有),
|
|
67
70
|
**每条就是一句已经抽象好的任务摘要**——这正是你要输出的那种「意义」,
|
|
68
71
|
不用再从原话里提炼。十来条标题排在一起,干什么活一目了然。
|
|
72
|
+
它同时是候选卡「依据」栏要原样引的材料(见 §3),读的时候顺手记下最有代表性的 2-3 条。
|
|
69
73
|
|
|
70
74
|
工具指纹是行为事实,比说的话更硬,用来交叉验证标题的判断:
|
|
71
75
|
|
|
@@ -89,21 +93,36 @@ node scripts/extract-signals.mjs --days 7 --out /tmp/persona-scan
|
|
|
89
93
|
|
|
90
94
|
**永远不自动创建。** 人格是老板的东西,你只出建议。
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
**不贴原话,但必须给依据。** 原话散、带上下文、还牵扯隐私,别往外贴;可**只给结论也不行**——
|
|
97
|
+
老板没法判断你理解得对不对,勾选就成了瞎猜。依据用 `session_titles`:那是 Claude Code 自己
|
|
98
|
+
生成的会话标题,已经抽象过一轮,既具体又不涉隐私,正好是这一栏的材料。
|
|
94
99
|
|
|
95
|
-
|
|
100
|
+
每个候选给五行,**「依据」不可省**:
|
|
96
101
|
|
|
97
102
|
```
|
|
98
103
|
候选 1 ── 论文研读助手 (slug: paper-reader)
|
|
99
104
|
在干的活 连续 5 天、8 个会话,读英文文献 → 提炼方法 → 转中文结构化摘要
|
|
105
|
+
依据 会话标题:「提炼 Transformer 论文方法部分」「对比三篇实验设置」「翻译综述第 3 节」
|
|
106
|
+
分布:~/work/papers、~/reading 两个目录 计数:8 会话 / 34 query / 活跃 5 天
|
|
100
107
|
行为特征 WebFetch/Read 为主,几乎不写代码,碰 .pdf/.bib
|
|
101
108
|
建议定位 帮老板快速消化外文论文,只做消化和提炼,不代笔写作
|
|
102
109
|
可能重叠 与现有 persona-researcher 有部分重合,researcher 偏通用网络调研
|
|
103
110
|
```
|
|
104
111
|
|
|
112
|
+
「依据」栏固定三样,缺一样老板就少一个判断维度:
|
|
113
|
+
|
|
114
|
+
| 给什么 | 让老板判断什么 |
|
|
115
|
+
|---|---|
|
|
116
|
+
| **2-3 条真实会话标题**(原样引,别再加工) | 你把这类活理解对了没有 |
|
|
117
|
+
| **活散在哪些目录**(画像卡里的 `cwd`;合并出来的候选把来源目录列全) | 是不是真的一类活,还是你硬凑的 |
|
|
118
|
+
| **硬计数**(会话数 / query 数 / 活跃天数) | 值不值得为它单开一个 persona |
|
|
119
|
+
|
|
105
120
|
给 3-5 个就够,多了老板挑不动。同一类活散在多个目录的要**合并成一个候选**,
|
|
106
|
-
|
|
121
|
+
不要一个目录报一个候选。
|
|
122
|
+
|
|
123
|
+
**「可能重叠」那行怎么填**:脚本已经把有 persona 管着的目录整个略过了,所以你手上的活
|
|
124
|
+
都是没人负责的。这行要答的是另一个问题——**这类活跟哪个既有 persona 的定位相近、边界差在哪**。
|
|
125
|
+
不确定就先 `call({ method: "persona:list" })` 看一眼现有 persona 都是干嘛的。真的谁都不沾就写「无」。
|
|
107
126
|
|
|
108
127
|
### 4. 老板勾中的,转交 `persona-authoring`
|
|
109
128
|
|
|
@@ -120,7 +139,7 @@ node scripts/extract-signals.mjs --days 7 --out /tmp/persona-scan
|
|
|
120
139
|
|
|
121
140
|
- **只读,不出网。** 脚本不修改任何 session 文件,不上传任何内容
|
|
122
141
|
- **不自动建 persona。** 只出候选,老板勾选后才落盘
|
|
123
|
-
-
|
|
124
|
-
|
|
142
|
+
- **已有 persona 管着的目录一律略过**(无开关)。那里的活已经有人干了,不用重复推荐。
|
|
143
|
+
代价是老板用 clawd 越久、能扫出的候选越少——**这是对的**,说明该建的都建了
|
|
125
144
|
- **信号不足就直说。** 如果扫完只剩零散试用,老实告诉老板「最近一周的活已经被现有
|
|
126
145
|
persona 覆盖完了,没发现新的」,不要硬凑候选
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 用法:
|
|
8
8
|
* node extract-signals.mjs --days 7 --out /tmp/persona-scan
|
|
9
|
-
* node extract-signals.mjs --days 30
|
|
9
|
+
* node extract-signals.mjs --days 30
|
|
10
10
|
*/
|
|
11
11
|
import fs from 'node:fs';
|
|
12
12
|
import path from 'node:path';
|
|
@@ -333,7 +333,7 @@ async function scanCodex(cutMs, sig, prof) {
|
|
|
333
333
|
|
|
334
334
|
// ---------- 主流程 ----------
|
|
335
335
|
function parseArgs(argv) {
|
|
336
|
-
const a = { days: 7, out: '.', samples: 12, minQueries: 5, minDays: 2
|
|
336
|
+
const a = { days: 7, out: '.', samples: 12, minQueries: 5, minDays: 2 };
|
|
337
337
|
for (let i = 0; i < argv.length; i++) {
|
|
338
338
|
const k = argv[i];
|
|
339
339
|
const next = () => argv[++i];
|
|
@@ -342,7 +342,6 @@ function parseArgs(argv) {
|
|
|
342
342
|
else if (k === '--samples') a.samples = parseInt(next(), 10);
|
|
343
343
|
else if (k === '--min-queries') a.minQueries = parseInt(next(), 10);
|
|
344
344
|
else if (k === '--min-days') a.minDays = parseInt(next(), 10);
|
|
345
|
-
else if (k === '--no-skip-known') a.skipKnown = false;
|
|
346
345
|
else if (k === '-h' || k === '--help') a.help = true;
|
|
347
346
|
}
|
|
348
347
|
return a;
|
|
@@ -355,7 +354,8 @@ const HELP = `扫描本机 Claude Code / Codex session,提取真实 query +
|
|
|
355
354
|
--samples N 每个目录保留的 query 样本数 (默认 12)
|
|
356
355
|
--min-queries N 低于此 query 数不出卡 (默认 5)
|
|
357
356
|
--min-days N 低于此活跃天数不出卡 (默认 2)
|
|
358
|
-
|
|
357
|
+
|
|
358
|
+
已有 persona 管着的目录一律略过(无开关)——本脚本找的是没人管的活。
|
|
359
359
|
`;
|
|
360
360
|
|
|
361
361
|
async function main() {
|
|
@@ -393,8 +393,10 @@ async function main() {
|
|
|
393
393
|
const qs = byProj.get(k);
|
|
394
394
|
if (!qs || !qs.length) continue;
|
|
395
395
|
|
|
396
|
+
// 已经有 persona 管着的目录整个略过:本脚本的意义是找**没人管的活**,
|
|
397
|
+
// 这里的活已经有人干了。不给开关——「要不要看已覆盖目录」不是每次运行要重想的问题。
|
|
396
398
|
const owner = coveredBy(v.cwd, known);
|
|
397
|
-
if (owner
|
|
399
|
+
if (owner) {
|
|
398
400
|
skipped.push([k, owner, qs.length]);
|
|
399
401
|
continue;
|
|
400
402
|
}
|
|
@@ -441,7 +443,7 @@ async function main() {
|
|
|
441
443
|
console.log(`真实 query : ${sig.length} 条`);
|
|
442
444
|
console.log(`画像卡 : ${cards.length} 张 (${kb.toFixed(0)} KB) → ${pp}`);
|
|
443
445
|
if (skipped.length) {
|
|
444
|
-
console.log(
|
|
446
|
+
console.log(`已略过 : ${skipped.length} 个目录(已有 persona 管着)`);
|
|
445
447
|
for (const [, owner, n] of skipped.sort((x, y) => y[2] - x[2])) {
|
|
446
448
|
console.log(` ${owner} (${n} 条)`);
|
|
447
449
|
}
|