@zhushanwen/pi-system-prompt 1.1.0 → 1.1.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhushanwen/pi-system-prompt",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "System prompt injection extension for Pi — reads config and appends to system prompt",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -24,13 +24,16 @@
24
24
  "index.ts"
25
25
  ],
26
26
  "peerDependencies": {
27
- "@earendil-works/pi-coding-agent": "^0.84.1"
27
+ "@earendil-works/pi-coding-agent": "^0.84.4"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^24.0.0",
31
31
  "@vitest/coverage-v8": "^4.1.9",
32
32
  "vitest": "^4.1.8"
33
33
  },
34
+ "dependencies": {
35
+ "@zhushanwen/pi-extension-logger": "0.3.1"
36
+ },
34
37
  "scripts": {
35
38
  "typecheck": "npx tsc --noEmit",
36
39
  "test": "vitest run"
@@ -8,7 +8,7 @@
8
8
  * swap 注入顺序两行的 mutant 会被顺序用例 kill)
9
9
  * - -nc / --no-context-files 守卫:global 注入跳过、append 不受影响
10
10
  * - global 候选选择:候选序优先、空白内容跳过继续找、目录缺失降级
11
- * - fail-safe:handler 全程 throw → return undefined + stderr 可观测;stderr 写失败的
11
+ * - fail-safe:handler 全程 throw → return undefined + logger.error 可观测;logger 自身抛错的
12
12
  * 终极兜底 console.debug;systemPrompt 非法类型的旧 quirk 锚定
13
13
  *
14
14
  * mock 策略(参照 msg-id-mapper 测试模式):pi SDK import type 零运行时解析,
@@ -17,6 +17,14 @@
17
17
  * 运行:cd extensions/taiji/system-prompt && npx vitest run
18
18
  */
19
19
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
20
+ const { loggerMock } = vi.hoisted(() => ({
21
+ loggerMock: { debug: vi.fn(), warn: vi.fn(), error: vi.fn() },
22
+ }))
23
+ vi.mock('@zhushanwen/pi-extension-logger', () => ({
24
+ getLogger: () => loggerMock,
25
+ createLogger: () => loggerMock,
26
+ }))
27
+
20
28
  import { readFileSync, readdirSync, statSync } from 'node:fs'
21
29
  import path from 'node:path'
22
30
  import createExtension from '../index'
@@ -271,8 +279,7 @@ describe('global 候选文件选择(readGlobalAgentsFile)', () => {
271
279
  })
272
280
 
273
281
  describe('fail-safe(外层 catch return undefined,永不阻断 agent loop)', () => {
274
- it('handler 全程 throw(systemPrompt getter 抛错)→ return undefined + stderr 落盘可观测', () => {
275
- const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true)
282
+ it('handler 全程 throw(systemPrompt getter 抛错)→ return undefined + logger.error 落盘可观测', () => {
276
283
  const h = createHarness()
277
284
  const event = { type: 'before_agent_start', prompt: 'hi' } as unknown as BeforeAgentStartEvent
278
285
  Object.defineProperty(event, 'systemPrompt', {
@@ -281,16 +288,16 @@ describe('fail-safe(外层 catch return undefined,永不阻断 agent loop)
281
288
  },
282
289
  })
283
290
  expect(h.beforeAgentStart(event)).toBeUndefined()
284
- expect(stderrSpy).toHaveBeenCalledWith(
285
- expect.stringContaining('[xyz-system-prompt-extension] before_agent_start hook failed: Error: getter boom'),
291
+ expect(loggerMock.error).toHaveBeenCalledWith(
292
+ 'before_agent_start hook failed: Error: getter boom',
286
293
  )
287
294
  })
288
295
 
289
- it('stderr 写失败的终极兜底console.debug 吞掉,仍 return undefined', () => {
290
- const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => {
291
- throw new Error('stderr gone')
296
+ it('logger 自身抛错的终极兜底stderr 兜底,仍 return undefined', () => {
297
+ const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true)
298
+ loggerMock.error.mockImplementation(() => {
299
+ throw new Error('logger gone')
292
300
  })
293
- const debugSpy = vi.spyOn(console, 'debug').mockImplementation(() => {})
294
301
  const h = createHarness()
295
302
  const event = { type: 'before_agent_start', prompt: 'hi' } as unknown as BeforeAgentStartEvent
296
303
  Object.defineProperty(event, 'systemPrompt', {
@@ -299,9 +306,8 @@ describe('fail-safe(外层 catch return undefined,永不阻断 agent loop)
299
306
  },
300
307
  })
301
308
  expect(h.beforeAgentStart(event)).toBeUndefined()
302
- expect(debugSpy).toHaveBeenCalledWith(
303
- expect.stringContaining('[xyz-system-prompt-extension] stderr write also failed:'),
304
- expect.any(Error),
309
+ expect(stderrSpy).toHaveBeenCalledWith(
310
+ expect.stringContaining('logHookFailure also failed'),
305
311
  )
306
312
  })
307
313
 
package/src/index.ts CHANGED
@@ -25,6 +25,9 @@ import path from 'node:path'
25
25
  import { homedir } from 'node:os'
26
26
  import { readFileSync, readdirSync, statSync } from 'node:fs'
27
27
  import type { ExtensionAPI, BeforeAgentStartEvent } from '@earendil-works/pi-coding-agent'
28
+ import { getLogger } from '@zhushanwen/pi-extension-logger'
29
+
30
+ const logger = getLogger('xyz-system-prompt-extension')
28
31
 
29
32
  const CONFIG_FILE = 'system-prompt.json'
30
33
 
@@ -121,7 +124,7 @@ function readGlobalAgentsFile(): { path: string; content: string } | null {
121
124
  }
122
125
  } catch (err) {
123
126
  // best-effort:候选文件 stat/read 失败(如权限)→ 试下一个候选,never throw into the agent loop。
124
- console.debug('[xyz-system-prompt-extension] candidate file read failed, trying next:', err)
127
+ logger.debug('candidate file read failed, trying next', { detail: String(err) })
125
128
  }
126
129
  }
127
130
  return null
@@ -220,10 +223,15 @@ function buildSystemPrompt(event: BeforeAgentStartEvent): { systemPrompt: string
220
223
  function logHookFailure(err: unknown): void {
221
224
  try {
222
225
  const msg = err instanceof Error ? `${err.name}: ${err.message}` : String(err)
223
- process.stderr.write(`[xyz-system-prompt-extension] before_agent_start hook failed: ${msg}\n`)
226
+ logger.error(`before_agent_start hook failed: ${msg}`)
224
227
  } catch (nestedErr) {
225
228
  // best-effort:stderr 写失败的终极兜底——console 内部吞错不会抛,仍不外泄到 agent loop。
226
- console.debug('[xyz-system-prompt-extension] stderr write also failed:', nestedErr)
229
+ try {
230
+ process.stderr.write(`[xyz-system-prompt-extension] logHookFailure also failed: ${String(nestedErr)}\n`)
231
+ } catch (finalErr) {
232
+ /* 完全静默:两层兜底都失败时无处可写 */
233
+ void finalErr
234
+ }
227
235
  }
228
236
  }
229
237