pageqa 0.5.1 → 0.7.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/dist/bsk/tools.js CHANGED
@@ -1,4 +1,4 @@
1
- import { execFileSync, spawn } from "node:child_process";
1
+ import { execFile, execFileSync, spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { debugLog, info, timer } from "../log.js";
4
4
  /**
@@ -6,6 +6,11 @@ import { debugLog, info, timer } from "../log.js";
6
6
  *
7
7
  * bsk 连接一个已运行的真实浏览器,每个命令都需要 --session <id>。
8
8
  * 所有命令以 --quiet 抑制进度输出,仅返回结构化/可读结果。
9
+ *
10
+ * 分两层:
11
+ * - `createBskOps`(操作层):每次浏览器操作 = 一条 bsk 命令,返回可读结果。
12
+ * - `createBskTools`(工具层):把操作层包成 agent 可调用的工具,并上报每次执行为录制提供素材。
13
+ * 回放(replay.ts)直接用操作层,因此「录制时怎么操作」与「回放时怎么操作」是同一条命令路径。
9
14
  */
10
15
  const BSK_TIMEOUT_MS = 60_000;
11
16
  function bsk(args) {
@@ -35,23 +40,37 @@ function bsk(args) {
35
40
  throw err;
36
41
  }
37
42
  }
38
- /** 运行 `bsk status --json`,成功返回解析后的对象;daemon 未运行/其他错误返回 null。
39
- * 注意:bsk 未安装(ENOENT)是致命错误,会向上抛出。 */
40
- function bskStatusJson() {
41
- try {
42
- const out = bsk(["status", "--json"]);
43
- return JSON.parse(out);
44
- }
45
- catch (err) {
46
- const e = err;
47
- if (e.code === "ENOENT")
48
- throw err;
49
- return null;
50
- }
43
+ /**
44
+ * `bsk status --json` 的异步版本。
45
+ *
46
+ * 与同步版返回语义一致:daemon 未运行/解析失败返回 null;bsk 未安装(ENOENT)抛出致命错误。
47
+ * 用于 daemon 启动轮询:轮询期间必须让出事件循环,否则同步子进程调用会阻塞
48
+ * 整个进程,导致启动等待期(最长 30s)无法响应 Ctrl+C 等信号。
49
+ */
50
+ function bskStatusJsonAsync() {
51
+ return new Promise((resolve, reject) => {
52
+ execFile("bsk", ["status", "--json"], { encoding: "utf-8", timeout: BSK_TIMEOUT_MS, windowsHide: true }, (err, stdout) => {
53
+ if (err) {
54
+ const e = err;
55
+ if (e.code === "ENOENT") {
56
+ reject(new Error("未找到 bsk 命令:请先安装 browserskill 并确认 bsk 在 PATH 中"));
57
+ return;
58
+ }
59
+ resolve(null);
60
+ return;
61
+ }
62
+ try {
63
+ resolve(JSON.parse(stdout));
64
+ }
65
+ catch {
66
+ resolve(null);
67
+ }
68
+ });
69
+ });
51
70
  }
52
- /** 当前是否已连接至少一个浏览器(从 status 解析)。 */
53
- function connectedBrowserCount() {
54
- const status = bskStatusJson();
71
+ /** 当前是否已连接至少一个浏览器(从 status 解析,异步)。 */
72
+ async function connectedBrowserCount() {
73
+ const status = (await bskStatusJsonAsync());
55
74
  if (!status || !Array.isArray(status.browsers))
56
75
  return 0;
57
76
  return status.browsers.length;
@@ -67,7 +86,7 @@ function startDaemon() {
67
86
  });
68
87
  child.unref();
69
88
  const deadline = Date.now() + 30_000;
70
- const poll = () => {
89
+ const poll = async () => {
71
90
  try {
72
91
  if (child.exitCode !== null && child.exitCode !== 0) {
73
92
  reject(new Error(`bsk daemon 启动失败,退出码 ${child.exitCode}`));
@@ -77,7 +96,16 @@ function startDaemon() {
77
96
  catch {
78
97
  // 子进程状态读取失败,继续轮询
79
98
  }
80
- if (bskStatusJson() !== null) {
99
+ let status;
100
+ try {
101
+ status = await bskStatusJsonAsync();
102
+ }
103
+ catch (err) {
104
+ // bsk 未安装(ENOENT):致命错误,直接失败而不是空等 30s
105
+ reject(err instanceof Error ? err : new Error(String(err)));
106
+ return;
107
+ }
108
+ if (status !== null) {
81
109
  info(`[pageqa] bsk daemon 已就绪(${((Date.now() - started) / 1000).toFixed(1)}s)`);
82
110
  resolve();
83
111
  return;
@@ -102,13 +130,13 @@ export function ensureBskReady() {
102
130
  return readyPromise;
103
131
  readyPromise = (async () => {
104
132
  debugLog("[bsk] 查询 daemon 状态…");
105
- if (bskStatusJson() === null) {
133
+ if ((await bskStatusJsonAsync()) === null) {
106
134
  await startDaemon();
107
135
  }
108
136
  else {
109
137
  debugLog("[bsk] daemon 已在运行,跳过启动");
110
138
  }
111
- const n = connectedBrowserCount();
139
+ const n = await connectedBrowserCount();
112
140
  if (n === 0) {
113
141
  throw new Error("bsk 未连接任何浏览器:pageqa 无法自动连接物理浏览器。\n" +
114
142
  "请在浏览器中安装 bsk 扩展并完成连接(或运行 `bsk session start` 按其提示连接),再重试。");
@@ -121,84 +149,179 @@ export function ensureBskReady() {
121
149
  function ok(text) {
122
150
  return { content: [{ type: "text", text }], details: {} };
123
151
  }
152
+ /**
153
+ * 构造 AgentTool 的 parameters 声明。
154
+ * pi-agent-core 的 parameters 类型与 JSON Schema 子集不完全兼容,
155
+ * 这里集中做一次类型断言,避免在每个工具定义里重复 `as unknown as ...`。
156
+ */
157
+ function paramsOf(properties, required = []) {
158
+ // SAFETY: pi-agent-core 的 AgentTool["parameters"] 类型是 JSON Schema 的受限子集,
159
+ // 与这里构造的 {type, properties, required} 结构在运行时兼容,但静态类型无法推导,
160
+ // 因此集中在此处断言一次(工具定义处不再重复断言)。
161
+ return {
162
+ type: "object",
163
+ properties,
164
+ required,
165
+ };
166
+ }
167
+ export function createBskOps(session, jevClient) {
168
+ const quiet = ["--session", session, "--quiet"];
169
+ let snapshotText = "";
170
+ return {
171
+ session,
172
+ lastSnapshot: () => snapshotText,
173
+ navigate(url) {
174
+ const out = bsk([
175
+ "navigate",
176
+ url,
177
+ ...quiet,
178
+ "--wait-until",
179
+ "domcontentloaded",
180
+ ]);
181
+ return `已导航到 ${url}\n${out}`;
182
+ },
183
+ snapshot() {
184
+ const out = bsk(["snapshot", ...quiet]);
185
+ snapshotText = out;
186
+ // 快照体积直接决定上下文压力(长流程易因上下文超限被中断)
187
+ debugLog("[bsk] snapshot 字符数=" + out.length);
188
+ return out;
189
+ },
190
+ click(target) {
191
+ const out = bsk(["click", target, ...quiet]);
192
+ return `已点击 ${target}\n${out}`;
193
+ },
194
+ fill(target, value) {
195
+ const out = bsk(["fill", target, "--value", value, ...quiet]);
196
+ return `已在 ${target} 填入文本\n${out}`;
197
+ },
198
+ upload(target, file) {
199
+ if (!existsSync(file)) {
200
+ throw new Error(`待上传文件不存在:${file}`);
201
+ }
202
+ const args = ["upload"];
203
+ if (target)
204
+ args.push(target);
205
+ args.push("--file", file, ...quiet);
206
+ const out = bsk(args);
207
+ return `已上传文件 ${file}\n${out}`;
208
+ },
209
+ hover(target) {
210
+ const out = bsk(["hover", target, ...quiet]);
211
+ return `已悬停 ${target}\n${out}`;
212
+ },
213
+ scroll(target) {
214
+ // scroll-to 同时支持 @eN 引用与 CSS 选择器。
215
+ // (早期实现用 evaluate + querySelector,遇到 @eN 会静默返回 element-not-found。)
216
+ const out = bsk(["scroll-to", target, ...quiet]);
217
+ return `已滚动到 ${target}\n${out}`;
218
+ },
219
+ wait(ms) {
220
+ // wait-ms 是 daemon 端 sleep,不接受 --session
221
+ bsk(["wait-ms", String(ms)]);
222
+ return `已等待 ${ms}ms`;
223
+ },
224
+ async assertText(expectation) {
225
+ const snap = bsk(["snapshot", ...quiet]);
226
+ snapshotText = snap;
227
+ const evidence = (verdict, why) => `断言「${expectation}」:${verdict}。${why}`;
228
+ // 防御:快照为空或明显不是已加载页面 → 断言不成立。
229
+ // 浏览器页面还没打开时,bsk 返回的是空串/about:blank/错误信息,
230
+ // 此时不应信任 Jev 或直接判定「成立」(空页面不可能包含断言文本)。
231
+ const snapLen = snap.trim().length;
232
+ const SNAP_MIN_LEN = 30;
233
+ if (snapLen < SNAP_MIN_LEN) {
234
+ return evidence("不成立", `证据:页面快照为空或过短(${snapLen} 字符),页面可能尚未打开或未导航`);
235
+ }
236
+ // 当 Jev 客户端可用时,使用语义判断替代字符串包含匹配
237
+ if (jevClient?.enabled) {
238
+ try {
239
+ const prob = await jevClient.assertText(snap, expectation);
240
+ const pass = prob >= jevClient.threshold;
241
+ const verdict = pass ? "成立" : "不成立";
242
+ const why = pass
243
+ ? `语义匹配度 ${(prob * 100).toFixed(1)}%,超过阈值 ${(jevClient.threshold * 100).toFixed(0)}%`
244
+ : `语义匹配度 ${(prob * 100).toFixed(1)}%,未达到阈值 ${(jevClient.threshold * 100).toFixed(0)}%`;
245
+ return evidence(verdict, why);
246
+ }
247
+ catch (err) {
248
+ // Jev 调用失败:回退到原有的字符串包含逻辑。
249
+ // 必须记录失败原因(超时/鉴权/网络等),否则用户只看到「Jev 不可用,已回退」,
250
+ // 却无法从 --debug 日志判断到底是哪一类故障。
251
+ debugLog("[bsk] Jev 断言失败,回退到字符串匹配:" +
252
+ (err instanceof Error ? err.message : String(err)));
253
+ return stringAssert(snap, expectation) + "(Jev 不可用,已回退)";
254
+ }
255
+ }
256
+ // 默认:字符串包含匹配
257
+ return stringAssert(snap, expectation);
258
+ },
259
+ };
260
+ }
261
+ /** 字符串包含匹配(默认断言路径,也是 Jev 不可用时的回退)。 */
262
+ function stringAssert(snapshotText, expectation) {
263
+ const hit = snapshotText.includes(expectation);
264
+ return `断言「${expectation}」:${hit ? "成立" : "不成立"}。${hit ? `页面中包含「${expectation}」` : `页面中未找到「${expectation}」`}`;
265
+ }
124
266
  /** 构造一组浏览器操作工具,供 page-test agent 调用。 */
125
267
  export function createBskTools(opts) {
126
- const s = opts.session;
127
- const jevClient = opts.jevClient;
128
- const quiet = ["--session", s, "--quiet"];
268
+ const ops = createBskOps(opts.session, opts.jevClient);
269
+ /**
270
+ * 统一包装一次工具执行:拿到结果后上报给录制器,失败时先上报再抛出
271
+ * (抛出让 pi-agent-core 把该工具标记为错误,模型会据此重试)。
272
+ */
273
+ const exec = async (name, params, fn) => {
274
+ const before = ops.lastSnapshot();
275
+ try {
276
+ const text = await fn();
277
+ opts.onExec?.({ name, params, ok: true, lastSnapshot: before });
278
+ return ok(text);
279
+ }
280
+ catch (err) {
281
+ opts.onExec?.({ name, params, ok: false, lastSnapshot: before });
282
+ throw err;
283
+ }
284
+ };
129
285
  const navigate = {
130
286
  name: "navigate",
131
287
  label: "Navigate",
132
288
  description: "在浏览器标签页打开一个 URL(支持 http/https/about: 等)。导航完成后页面 DOM 就绪。",
133
- // SAFETY: AgentTool["parameters"] 在此上下文中与 {type, properties, required} 结构兼容
134
- parameters: {
135
- type: "object",
136
- properties: { url: { type: "string", description: "目标 URL" } },
137
- required: ["url"],
138
- },
289
+ parameters: paramsOf({ url: { type: "string", description: "目标 URL" } }, [
290
+ "url",
291
+ ]),
139
292
  execute: async (_id, params) => {
140
293
  const p = params;
141
- const out = bsk([
142
- "navigate",
143
- p.url,
144
- ...quiet,
145
- "--wait-until",
146
- "domcontentloaded",
147
- ]);
148
- return ok(`已导航到 ${p.url}\n${out}`);
294
+ return exec("navigate", { url: p.url }, () => ops.navigate(p.url));
149
295
  },
150
296
  };
151
297
  const snapshot = {
152
298
  name: "snapshot",
153
299
  label: "Snapshot",
154
300
  description: "读取当前页面的 aria 语义树与可见文本(标题、段落、链接、按钮等)。用于读取内容、标题、文本并定位元素。",
155
- // SAFETY: 空对象在此上下文中与 AgentTool["parameters"] 兼容
156
- parameters: {
157
- type: "object",
158
- properties: {},
159
- },
160
- execute: async () => {
161
- const out = bsk(["snapshot", ...quiet]);
162
- // 快照体积直接决定上下文压力(长流程易因上下文超限被中断)
163
- debugLog("[bsk] snapshot 字符数=" + out.length);
164
- return ok(out);
165
- },
301
+ parameters: paramsOf({}),
302
+ execute: async () => exec("snapshot", {}, () => ops.snapshot()),
166
303
  };
167
304
  const click = {
168
305
  name: "click",
169
306
  label: "Click",
170
307
  description: "点击一个元素。可用快照里的 @eN 引用或 CSS 选择器。",
171
- // SAFETY: 结构匹配 AgentTool["parameters"]
172
- parameters: {
173
- type: "object",
174
- properties: {
175
- target: { type: "string", description: "@eN 引用或 CSS 选择器" },
176
- },
177
- required: ["target"],
178
- },
308
+ parameters: paramsOf({ target: { type: "string", description: "@eN 引用或 CSS 选择器" } }, ["target"]),
179
309
  execute: async (_id, params) => {
180
310
  const p = params;
181
- const out = bsk(["click", p.target, ...quiet]);
182
- return ok(`已点击 ${p.target}\n${out}`);
311
+ return exec("click", { target: p.target }, () => ops.click(p.target));
183
312
  },
184
313
  };
185
314
  const fill = {
186
315
  name: "fill",
187
316
  label: "Fill",
188
317
  description: "在输入框/文本域中填入文本(会先清空原有内容)。",
189
- // SAFETY: 结构匹配 AgentTool["parameters"]
190
- parameters: {
191
- type: "object",
192
- properties: {
193
- target: { type: "string", description: "@eN 引用或 CSS 选择器" },
194
- value: { type: "string", description: "要输入的文本" },
195
- },
196
- required: ["target", "value"],
197
- },
318
+ parameters: paramsOf({
319
+ target: { type: "string", description: "@eN 引用或 CSS 选择器" },
320
+ value: { type: "string", description: "要输入的文本" },
321
+ }, ["target", "value"]),
198
322
  execute: async (_id, params) => {
199
323
  const p = params;
200
- const out = bsk(["fill", p.target, "--value", p.value, ...quiet]);
201
- return ok(`已在 ${p.target} 填入文本\n${out}`);
324
+ return exec("fill", { target: p.target, value: p.value }, () => ops.fill(p.target, p.value));
202
325
  },
203
326
  };
204
327
  const upload = {
@@ -209,137 +332,59 @@ export function createBskTools(opts) {
209
332
  "不传 target 时 bsk 自动在页面中查找文件输入框。" +
210
333
  "注意:原生文件选择框无法被自动化点击,因此不要先 click 触发按钮再调用本工具," +
211
334
  "直接调用 upload 并指定该按钮为 target 即可。",
212
- // SAFETY: 结构匹配 AgentTool["parameters"]
213
- parameters: {
214
- type: "object",
215
- properties: {
216
- target: {
217
- type: "string",
218
- description: "触发文件选择器的元素(@eN 引用或 CSS 选择器),或 file input 本身",
219
- },
220
- file: { type: "string", description: "待上传的本地文件绝对路径" },
335
+ parameters: paramsOf({
336
+ target: {
337
+ type: "string",
338
+ description: "触发文件选择器的元素(@eN 引用或 CSS 选择器),或 file input 本身",
221
339
  },
222
- required: ["file"],
223
- },
340
+ file: { type: "string", description: "待上传的本地文件绝对路径" },
341
+ }, ["file"]),
224
342
  execute: async (_id, params) => {
225
343
  const p = params;
226
- if (!existsSync(p.file)) {
227
- throw new Error(`待上传文件不存在:${p.file}`);
228
- }
229
- const args = ["upload"];
230
- if (p.target)
231
- args.push(p.target);
232
- args.push("--file", p.file, ...quiet);
233
- const out = bsk(args);
234
- return ok(`已上传文件 ${p.file}\n${out}`);
344
+ return exec("upload", p.target ? { target: p.target, file: p.file } : { file: p.file }, () => ops.upload(p.target, p.file));
235
345
  },
236
346
  };
237
347
  const hover = {
238
348
  name: "hover",
239
349
  label: "Hover",
240
350
  description: "悬停在一个元素上,用于触发悬停菜单/提示。",
241
- // SAFETY: 结构匹配 AgentTool["parameters"]
242
- parameters: {
243
- type: "object",
244
- properties: {
245
- target: { type: "string", description: "@eN 引用或 CSS 选择器" },
246
- },
247
- required: ["target"],
248
- },
351
+ parameters: paramsOf({ target: { type: "string", description: "@eN 引用或 CSS 选择器" } }, ["target"]),
249
352
  execute: async (_id, params) => {
250
353
  const p = params;
251
- const out = bsk(["hover", p.target, ...quiet]);
252
- return ok(`已悬停 ${p.target}\n${out}`);
354
+ return exec("hover", { target: p.target }, () => ops.hover(p.target));
253
355
  },
254
356
  };
255
357
  const scroll = {
256
358
  name: "scroll",
257
359
  label: "Scroll",
258
360
  description: "滚动到指定元素使其进入视口。",
259
- // SAFETY: 结构匹配 AgentTool["parameters"]
260
- parameters: {
261
- type: "object",
262
- properties: {
263
- target: { type: "string", description: "@eN 引用或 CSS 选择器" },
264
- },
265
- required: ["target"],
266
- },
361
+ parameters: paramsOf({ target: { type: "string", description: "@eN 引用或 CSS 选择器" } }, ["target"]),
267
362
  execute: async (_id, params) => {
268
363
  const p = params;
269
- const js = `(() => { const el = document.querySelector(${JSON.stringify(p.target)}); if (el) el.scrollIntoView({block:'center'}); return el ? 'scrolled' : 'element-not-found'; })()`;
270
- const res = bsk(["evaluate", js, ...quiet]);
271
- return ok(res);
364
+ return exec("scroll", { target: p.target }, () => ops.scroll(p.target));
272
365
  },
273
366
  };
274
367
  const wait = {
275
368
  name: "wait",
276
369
  label: "Wait",
277
370
  description: "等待一段时间(毫秒)或等待页面导航完成。",
278
- // SAFETY: 结构匹配 AgentTool["parameters"]
279
- parameters: {
280
- type: "object",
281
- properties: { ms: { type: "number", description: "等待毫秒数" } },
282
- required: [],
283
- },
371
+ parameters: paramsOf({ ms: { type: "number", description: "等待毫秒数" } }),
284
372
  execute: async (_id, params) => {
285
373
  const p = params ?? {};
286
374
  const ms = p.ms ?? 1000;
287
- // wait-ms daemon sleep,不接受 --session
288
- bsk(["wait-ms", String(ms)]);
289
- return ok(`已等待 ${ms}ms`);
375
+ return exec("wait", { ms }, () => ops.wait(ms));
290
376
  },
291
377
  };
292
378
  const assertText = {
293
379
  name: "assert_text",
294
380
  label: "Assert Text",
295
381
  description: "断言当前页面是否包含指定文本。返回「成立」或「不成立」并附上证据(命中片段)。用于校验测试结果。",
296
- // SAFETY: 结构匹配 AgentTool["parameters"]
297
- parameters: {
298
- type: "object",
299
- properties: {
300
- expectation: { type: "string", description: "期望在页面中出现的文本" },
301
- },
302
- required: ["expectation"],
303
- },
382
+ parameters: paramsOf({
383
+ expectation: { type: "string", description: "期望在页面中出现的文本" },
384
+ }, ["expectation"]),
304
385
  execute: async (_id, params) => {
305
386
  const p = params;
306
- const snap = bsk(["snapshot", ...quiet]);
307
- // 防御:快照为空或明显不是已加载页面 → 断言不成立。
308
- // 浏览器页面还没打开时,bsk 返回的是空串/about:blank/错误信息,
309
- // 此时不应信任 Jev 或直接判定「成立」(空页面不可能包含断言文本)。
310
- const snapLen = snap.trim().length;
311
- const SNAP_MIN_LEN = 30;
312
- if (snapLen < SNAP_MIN_LEN) {
313
- return ok(`断言「${p.expectation}」:不成立。证据:页面快照为空或过短(${snapLen} 字符),页面可能尚未打开或未导航`);
314
- }
315
- // 当 Jev 客户端可用时,使用语义判断替代字符串包含匹配
316
- if (jevClient?.enabled) {
317
- try {
318
- const prob = await jevClient.assertText(snap, p.expectation);
319
- const pass = prob >= jevClient.threshold;
320
- const verdict = pass ? "成立" : "不成立";
321
- const evidence = pass
322
- ? `语义匹配度 ${(prob * 100).toFixed(1)}%,超过阈值 ${(jevClient.threshold * 100).toFixed(0)}%`
323
- : `语义匹配度 ${(prob * 100).toFixed(1)}%,未达到阈值 ${(jevClient.threshold * 100).toFixed(0)}%`;
324
- return ok(`断言「${p.expectation}」:${verdict}。${evidence}`);
325
- }
326
- catch {
327
- // Jev 调用失败:回退到原有的字符串包含逻辑
328
- const hit = snap.includes(p.expectation);
329
- const verdict = hit ? "成立" : "不成立";
330
- const evidence = hit
331
- ? `页面中包含「${p.expectation}」`
332
- : `页面中未找到「${p.expectation}」`;
333
- return ok(`断言「${p.expectation}」:${verdict}。${evidence}(Jev 不可用,已回退)`);
334
- }
335
- }
336
- // 默认:字符串包含匹配
337
- const hit = snap.includes(p.expectation);
338
- const verdict = hit ? "成立" : "不成立";
339
- const evidence = hit
340
- ? `页面中包含「${p.expectation}」`
341
- : `页面中未找到「${p.expectation}」`;
342
- return ok(`断言「${p.expectation}」:${verdict}。${evidence}`);
387
+ return exec("assert_text", { expectation: p.expectation }, () => ops.assertText(p.expectation));
343
388
  },
344
389
  };
345
390
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/bsk/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/bsk/tools.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -46,9 +46,7 @@ export function loadConfig() {
46
46
  /** 读取用户配置文件;不存在则创建默认文件并返回默认值。 */
47
47
  function readConfigFile() {
48
48
  if (!existsSync(CONFIG_PATH)) {
49
- ensureConfigDir();
50
- writeFileSync(CONFIG_PATH, JSON.stringify(DEFAULTS, null, 2), "utf8");
51
- return { ...DEFAULTS };
49
+ return createDefaultConfigFile();
52
50
  }
53
51
  try {
54
52
  const raw = readFileSync(CONFIG_PATH, "utf8");
@@ -64,6 +62,17 @@ function readConfigFile() {
64
62
  return { ...DEFAULTS };
65
63
  }
66
64
  }
65
+ /**
66
+ * 写出带默认值的配置文件(首次运行时调用)。
67
+ *
68
+ * 从 readConfigFile 中拆出,使“读配置的副作用会在磁盘上建文件”这件事显式可见,
69
+ * 而不是隐藏在名为“读取”的函数里。
70
+ */
71
+ function createDefaultConfigFile() {
72
+ ensureConfigDir();
73
+ writeFileSync(CONFIG_PATH, JSON.stringify(DEFAULTS, null, 2), "utf8");
74
+ return { ...DEFAULTS };
75
+ }
67
76
  /** 确保配置目录存在(首次运行时创建 ~/.pageqa)。 */
68
77
  export function ensureConfigDir() {
69
78
  if (!existsSync(CONFIG_DIR)) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}