@principles/workbuddy-adapter 0.2.6 → 0.2.9
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/explicit-owner-statement.js +9 -2
- package/dist/pd-hook.js +5 -2
- package/package.json +3 -3
- package/plugin/.codebuddy-plugin/plugin.json +1 -1
- package/plugin/skills/pd-cli-operator/SKILL.md +32 -0
- package/plugin/skills/pd-control/SKILL.md +31 -0
- package/plugin/skills/pd-pain-signal/SKILL.md +35 -0
- package/plugin/skills/pd-review/SKILL.md +22 -8
- package/plugin/skills/pd-disable/SKILL.md +0 -18
- package/plugin/skills/pd-record-pain/SKILL.md +0 -21
- package/plugin/skills/pd-status/SKILL.md +0 -17
|
@@ -3,10 +3,17 @@ import { admitGovernanceSignals, ensureGovernanceDiagnosticianTask, parseOwnerSt
|
|
|
3
3
|
export async function recordWorkbuddyOwnerStatement(event, workspaceDir) {
|
|
4
4
|
if (event.kind !== 'before_prompt_build')
|
|
5
5
|
return undefined;
|
|
6
|
+
const rejected = (reason, nextAction) => `[PD] host=workbuddy status=rejected reason=owner_statement_${reason} nextAction=${nextAction}`;
|
|
6
7
|
const parsed = parseOwnerStatementPrefix(event.context.promptContent);
|
|
7
|
-
if (!parsed.matched)
|
|
8
|
+
if (!parsed.matched) {
|
|
9
|
+
// Near-miss prefixes (e.g. half-width colon, leading whitespace) must not
|
|
10
|
+
// vanish silently: the Owner clearly intended the explicit channel, so
|
|
11
|
+
// return an actionable format notice instead of no feedback at all.
|
|
12
|
+
if (typeof event.context.promptContent === 'string' && event.context.promptContent.trimStart().startsWith('PD记录痛苦')) {
|
|
13
|
+
return rejected('prefix_format', 'Use the exact prefix PD记录痛苦: (full-width colon) at the very start, followed by the Owner statement of 1–500 characters; nothing was recorded.');
|
|
14
|
+
}
|
|
8
15
|
return undefined;
|
|
9
|
-
|
|
16
|
+
}
|
|
10
17
|
if (parsed.text === null)
|
|
11
18
|
return rejected(parsed.reason ?? 'statement_empty', 'Resubmit PD记录痛苦:<Owner statement of 1–500 characters>; nothing was recorded.');
|
|
12
19
|
const raw = event.rawPayload;
|
package/dist/pd-hook.js
CHANGED
|
@@ -37,7 +37,7 @@ import path from 'node:path';
|
|
|
37
37
|
import process from 'node:process';
|
|
38
38
|
import { pathToFileURL, fileURLToPath } from 'node:url';
|
|
39
39
|
import { appendEventLogLine, redactTelemetryString, isRuleHostEvaluatedEventData } from '@principles/core/runtime-v2';
|
|
40
|
-
import { createProductionHostRuntime, loadPdConfigForPlugin, parseOwnerStatementPrefix, assessWorkbuddyLiveKeyword, admitTrustedWorkbuddyLiveCorrection, ensureGovernanceDiagnosticianTask } from '@principles/host-runtime';
|
|
40
|
+
import { createProductionHostRuntime, loadPdConfigForPlugin, parseOwnerStatementPrefix, assessWorkbuddyLiveKeyword, resolveSharedCorrectionKeywordStoreForDetection, admitTrustedWorkbuddyLiveCorrection, ensureGovernanceDiagnosticianTask } from '@principles/host-runtime';
|
|
41
41
|
import { computeFeatureFlagsFromConfig } from '@principles/core/runtime-v2';
|
|
42
42
|
import { WorkBuddyHooksHostAdapter } from './host-adapter.js';
|
|
43
43
|
import { WORKBUDDY_TOOL_SEMANTICS } from './tool-semantics.js';
|
|
@@ -270,7 +270,10 @@ export async function processWorkbuddyHookInvocation(rawStdin, channelEventName,
|
|
|
270
270
|
const explicitReserved = typeof prompt === 'string' && prompt.trimStart().startsWith('PD记录痛苦');
|
|
271
271
|
if (fromOwner && nativeId !== undefined && nativeId.trim().length > 0 &&
|
|
272
272
|
typeof prompt === 'string' && !explicitReserved) {
|
|
273
|
-
|
|
273
|
+
// AUDIT-P3-01: 预检与 admitTrustedWorkbuddyLiveCorrection 内部使用同一份
|
|
274
|
+
// 共享 live 词库(seed ∪ learned)——预检不会漏掉学习词,也不会比准入
|
|
275
|
+
// 更宽。startsWith 预过滤与 matched 判据不变(无 LLM、无 transcript)。
|
|
276
|
+
const matched = assessWorkbuddyLiveKeyword(prompt, event.context.sessionId, resolveSharedCorrectionKeywordStoreForDetection(resolution.workspaceDir));
|
|
274
277
|
if (matched.matched) {
|
|
275
278
|
const admitted = admitTrustedWorkbuddyLiveCorrection({
|
|
276
279
|
workspaceDir: resolution.workspaceDir,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@principles/workbuddy-adapter",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"description": "WorkBuddy host adapter for Principles Disciple — implements the HostAdapter interface for WorkBuddy's Git Bash command-hook model (ADR-0020 third host, SPEC workbuddy-host-adapter v0.3.0).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"lint": "eslint \"src/**/*.ts\""
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@principles/core": "^1.295.
|
|
46
|
-
"@principles/host-runtime": "^0.12.
|
|
45
|
+
"@principles/core": "^1.295.2",
|
|
46
|
+
"@principles/host-runtime": "^0.12.1",
|
|
47
47
|
"@principles/install-layout": "^0.4.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "principles-disciple",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Principles Disciple — Owner-governed behavior internalization for AI agents (WorkBuddy host adapter, ADR-0020 third host). Requires explicit setup and host.workbuddy feature enablement; inactive until then.",
|
|
5
5
|
"defaultEnabled": false
|
|
6
6
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pd-cli-operator
|
|
3
|
+
description: 检查 WorkBuddy 中 PD 的运行状态、治理开关、worker 活性,或只读查询痛苦、任务和证据链。使用 WorkBuddy 固定治理工作区,不负责登记痛苦、Owner 审阅或启停操作。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PD CLI Operator(WorkBuddy)
|
|
7
|
+
|
|
8
|
+
## 工作区
|
|
9
|
+
|
|
10
|
+
始终使用 WorkBuddy 固定治理工作区 `~/.workbuddy/pd-workspace`,先将 `~` 解析为当前用户主目录的绝对路径。不得切换到当前项目目录、Codex 工作区或 OpenClaw 工作区。
|
|
11
|
+
|
|
12
|
+
## 检查步骤
|
|
13
|
+
|
|
14
|
+
1. 先运行以下只读命令,确认 Runtime 功能和 worker 状态:
|
|
15
|
+
|
|
16
|
+
pd runtime features --workspace "<用户主目录>/.workbuddy/pd-workspace" --json
|
|
17
|
+
pd workbuddy worker --status --workspace "<用户主目录>/.workbuddy/pd-workspace" --json
|
|
18
|
+
|
|
19
|
+
2. 按需使用 CLI 帮助确认其他只读命令的可用性,再查询痛苦、任务、运行记录、候选或证据链,例如 `pd pain list --workspace "<workspace>" --json`、`pd task show "<taskId>" --workspace "<workspace>" --json`、`pd run show "<runId>" --workspace "<workspace>"`、`pd runtime trace show --pain-id "<painId>" --workspace "<workspace>" --json`。其中 `<workspace>` 必须替换为上面的 WorkBuddy 固定治理工作区,不能换成当前项目目录。
|
|
20
|
+
3. 报告真实输出中的 `host.workbuddy` 开关、worker 模式和错误原因。worker 已注册不等于 worker 正在运行;插件存在不等于技能已加载;健康检查通过不等于某条痛苦已经完成诊断。
|
|
21
|
+
4. 追踪具体问题时使用登记回执中的真实 ID,逐段核实登记、诊断、候选准入和治理状态。
|
|
22
|
+
|
|
23
|
+
## 失败处理
|
|
24
|
+
|
|
25
|
+
命令缺失、安装不完整或状态不可读取时,保留真实错误和下一步建议。需要停用时使用 `pd-control`;需要审阅候选时使用 `pd-review`;需要登记 Owner 反馈时使用 `pd-pain-signal`。
|
|
26
|
+
|
|
27
|
+
## 禁止
|
|
28
|
+
|
|
29
|
+
- 不初始化项目目录或切换到其他宿主的治理库。
|
|
30
|
+
- 不手工修改配置、数据库或内部工件。
|
|
31
|
+
- 不将 worker 注册/插件存在描述为真实运行或行为生效。
|
|
32
|
+
- 不通过 CLI 或脚本批准、拒绝或激活原则。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pd-control
|
|
3
|
+
description: 当 Owner 明确要求管理 WorkBuddy 的 PD 接入、停用或修复时使用。当前随插件交付的控制脚本只提供停用操作;不得猜测启用命令或手工修改配置。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PD Control(WorkBuddy)
|
|
7
|
+
|
|
8
|
+
## 前提
|
|
9
|
+
|
|
10
|
+
只在 Owner 明确要求停用 WorkBuddy PD 时执行操作。WorkBuddy 的固定治理工作区是 `~/.workbuddy/pd-workspace`;安装/注册插件不等于启用治理,插件默认状态为关闭。
|
|
11
|
+
|
|
12
|
+
## 停用
|
|
13
|
+
|
|
14
|
+
根据当前技能文件所在位置定位同一插件根目录,运行随插件交付的控制脚本:
|
|
15
|
+
|
|
16
|
+
node "<plugin-root>/scripts/pd-control.cjs" disable
|
|
17
|
+
|
|
18
|
+
不要搜索任意 npm 缓存,也不要使用其他宿主的脚本。
|
|
19
|
+
|
|
20
|
+
只有退出码为 0 且 JSON 回执确认 `ok=true`、`enabled=false`、`host=workbuddy` 时,才能报告停用成功。报告真实回执中的工作区与状态。新 Hook 调用读取该开关;已运行中的任务是否停止必须另行核验。
|
|
21
|
+
|
|
22
|
+
## 安装、启用与修复
|
|
23
|
+
|
|
24
|
+
当前插件内的 `pd-control.cjs` 只实现停用。安装/注册、启用或修复必须使用正式 WorkBuddy 插件安装器/宿主管理流程。若该流程没有提供可验证的启用操作,明确报告不支持;不得猜测命令、手工修改配置或调用私有安装器函数。
|
|
25
|
+
|
|
26
|
+
## 禁止
|
|
27
|
+
|
|
28
|
+
- 不直接编辑配置、数据库、Runtime 或业务状态文件。
|
|
29
|
+
- 不删除数据来实现停用。
|
|
30
|
+
- 不将安装、注册或配置存在描述为 PD 已实际启用。
|
|
31
|
+
- 不批准、拒绝或激活原则。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pd-pain-signal
|
|
3
|
+
description: 当 Owner 要求记录 WorkBuddy 智能体的行为错误、痛苦反馈或行为改进证据时使用。只使用 Owner 当前明确提交的原文和 WorkBuddy 原生 Hook 回执。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PD Pain Signal(WorkBuddy)
|
|
7
|
+
|
|
8
|
+
## 唯一的正常入口
|
|
9
|
+
|
|
10
|
+
Owner 在当前 WorkBuddy 会话中提交:
|
|
11
|
+
|
|
12
|
+
PD记录痛苦:<Owner 原文>
|
|
13
|
+
|
|
14
|
+
- 前缀必须位于 Owner 消息开头,使用全角冒号;正文为 1–500 个字符。
|
|
15
|
+
- 超长输入必须拒绝并请 Owner 精简,不能静默截断。
|
|
16
|
+
- 只记录 Owner 明确提供的原文,不补写根因、评分或模型自述。
|
|
17
|
+
- 代理生成的文本、引用和工具输出不构成新的 Owner 提交。不要代发或模拟宿主事件。
|
|
18
|
+
- 如果当前消息没有此前缀,只提供格式示例,请 Owner 在当前会话中提交;不要绕过 Hook 直接调用 CLI。
|
|
19
|
+
|
|
20
|
+
## 回执
|
|
21
|
+
|
|
22
|
+
若当前消息已触发 UserPromptSubmit Hook,读取本次 Hook 的真实回执。只有回执包含真实 `painId`、`taskId`、`host=workbuddy` 和状态时,才能报告登记成功;否则明确说明尚未确认,并保留实际拒绝原因。
|
|
23
|
+
|
|
24
|
+
WorkBuddy 的治理工作区固定为 `~/.workbuddy/pd-workspace`。不得猜测或扫描 session/turn 标识,不得使用 OpenClaw 的 `/pd-pain`,也不得用通用 CLI 手工重建 WorkBuddy 的宿主 lineage 来代替原生入口。
|
|
25
|
+
|
|
26
|
+
## 下游结果
|
|
27
|
+
|
|
28
|
+
Owner 陈述是未经独立验证的 `owner_statement`。登记成功只证明痛苦和任务已登记;诊断、候选准入、原则审批和生效必须分别查证。需要检查状态时使用 `pd-cli-operator`;需要 Owner 审阅时使用 `pd-review`。
|
|
29
|
+
|
|
30
|
+
## 禁止
|
|
31
|
+
|
|
32
|
+
- 不改写 Owner 原话,不伪造宿主身份或行为轨迹。
|
|
33
|
+
- 不重复提交已确认登记的同一事件。
|
|
34
|
+
- 不直接写痛苦数据库、候选账本或准入状态。
|
|
35
|
+
- 不自动批准或激活原则。
|
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pd-review
|
|
3
|
-
description: 打开 WorkBuddy 的 PD Owner
|
|
3
|
+
description: 打开 WorkBuddy 的 PD Owner Console,审阅痛苦、诊断、候选或原则治理状态。所有批准、拒绝和激活决定必须由 Owner 在正式 Web Console 中完成。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# WorkBuddy
|
|
6
|
+
# PD Review(WorkBuddy)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 固定治理工作区
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
pd console open --workspace "<用户主目录>/.workbuddy/pd-workspace"
|
|
12
|
-
```
|
|
10
|
+
WorkBuddy 的治理工作区固定为 `~/.workbuddy/pd-workspace`,与 WorkBuddy Hook 和 worker 使用的数据库一致。将 `~` 解析为当前用户主目录的绝对路径;不得用当前项目目录或其他宿主的工作区替代。
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
## 打开 Console
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
运行正式 CLI:
|
|
15
|
+
|
|
16
|
+
pd console open --workspace "<用户主目录>/.workbuddy/pd-workspace"
|
|
17
|
+
|
|
18
|
+
只报告命令真实返回的 Console 地址和状态。失败时保留错误原因,不声称已打开;需要排查安装/运行状态时使用 `pd-cli-operator`,需要修复宿主接入时使用 `pd-control`。
|
|
19
|
+
|
|
20
|
+
## Owner 治理
|
|
21
|
+
|
|
22
|
+
帮助 Owner 区分原始反馈、宿主证据、模型诊断和准入决定。Owner 在 Console 中审阅证据并亲自批准、拒绝或完成其他治理动作。
|
|
23
|
+
|
|
24
|
+
打开 Console 不构成审批;候选存在不代表已批准;批准不自动证明原则已激活或后续行为已改变。
|
|
25
|
+
|
|
26
|
+
## 强制禁止
|
|
27
|
+
|
|
28
|
+
- 不通过 CLI、脚本、数据库或文件批准、拒绝或激活原则。
|
|
29
|
+
- Console 不可用时,不得切换到 CLI 审批。
|
|
30
|
+
- 不伪造 Owner 已经作出的决定。
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pd-disable
|
|
3
|
-
description: 当 Owner 要求停止或关闭 WorkBuddy 的 Principles Disciple 行为时,关闭此宿主治理开关并保留数据。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 关闭 WorkBuddy PD
|
|
7
|
-
|
|
8
|
-
Owner 的关闭请求已经授权这次操作。根据本技能文件的路径定位同一插件根目录(`skills/pd-disable/SKILL.md` 的上三级目录),运行随插件交付的控制脚本:
|
|
9
|
-
|
|
10
|
-
```text
|
|
11
|
-
node "<插件根目录>/scripts/pd-control.cjs" disable
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
脚本调用正式安装器的 `setWorkbuddyGovernanceFlag` API,在用户固定工作区 `~/.workbuddy/pd-workspace` 关闭 `host.workbuddy` 并读回验证。它保留治理数据和其他宿主配置,不手工修改数据库或已安装运行时代码。
|
|
15
|
-
|
|
16
|
-
只有退出码为 0 且 JSON 回执 `ok=true`、`enabled=false`、`host=workbuddy` 时才确认开关已关闭。报告回执中的工作区和状态;新 Hook 调用将读取该配置。已运行中的任务是否停止须另查证。
|
|
17
|
-
|
|
18
|
-
如果正式安装器 API 或工作区缺失,脚本明确失败;按回执使用官方安装/修复流程恢复能力。不要搜索 npm 缓存、拼装第二套写开关逻辑或用删除文件替代关闭。
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pd-record-pain
|
|
3
|
-
description: 记录 WorkBuddy 行为失误或痛苦反馈。当 Owner 要求登记痛苦、记录错误或留下行为改进证据时使用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WorkBuddy 痛苦登记
|
|
7
|
-
|
|
8
|
-
入口是 Owner 在当前 WorkBuddy 会话提交的一条消息:
|
|
9
|
-
|
|
10
|
-
```text
|
|
11
|
-
PD记录痛苦:<Owner 原文>
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
1. 仅使用当前 Owner 明确提供的陈述,正文须为 1–500 个字符。保留原文,不补写技术根因、评分或模型自述;超长时请 Owner 提供较短原文,不静默截断。
|
|
15
|
-
2. 若当前消息已以 `PD记录痛苦:` 开头,检查本次 UserPromptSubmit Hook 的真实回执。Hook 使用宿主的会话标识登记到 `~/.workbuddy/pd-workspace`。
|
|
16
|
-
3. 若 Owner 仅要求登记而消息没有该前缀,给出带前缀和 Owner 原文的完整消息,请 Owner 在当前会话提交。代理输出、引用和工具输出不构成新的 Owner 提交。不要代发或模拟宿主事件。
|
|
17
|
-
4. 只有回执包含真实 `painId`、`taskId`、`host=workbuddy` 和状态时才报告登记成功;原样呈现这些字段。缺失回执或返回拒绝时,说明尚未确认登记并报告真实原因,使用 `pd-status` 检查运行状态。
|
|
18
|
-
|
|
19
|
-
Owner 陈述是未经独立验证的 `owner_statement`。登记成功只证明痛苦和任务已登记;诊断、准入、原则审批和生效须分别查证。Owner 审批沿用 `pd-review`,不得自动批准或激活。
|
|
20
|
-
|
|
21
|
-
此入口不要求模型猜测 session/turn 标识或扫描最新会话。不要改用 OpenClaw `/pd-pain` 或 CLI `pd pain record --host workbuddy`,也不要通过省略宿主参数绕过限制。
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pd-status
|
|
3
|
-
description: 检查 WorkBuddy 的 Principles Disciple 运行状态、治理开关或诊断 worker 状态。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WorkBuddy PD 状态
|
|
7
|
-
|
|
8
|
-
使用当前用户固定治理工作区 `~/.workbuddy/pd-workspace`,将 `~` 解析为操作系统用户主目录的绝对路径,再运行:
|
|
9
|
-
|
|
10
|
-
```text
|
|
11
|
-
pd runtime features --workspace "<用户主目录>/.workbuddy/pd-workspace" --json
|
|
12
|
-
pd workbuddy worker --status --workspace "<用户主目录>/.workbuddy/pd-workspace" --json
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
报告实际命令结果、`host.workbuddy` 有效开关和 worker 模式;命令失败或安装缺失时如实报告错误,建议通过正式安装器修复。不要初始化项目目录或切换到其他宿主的治理库。
|
|
16
|
-
|
|
17
|
-
worker 状态不证明当前痛苦已完成诊断,插件存在也不证明技能已加载或原则已生效。核对具体任务应使用真实登记回执中的 ID,在 `pd-review` 指向的同一工作区审阅。
|