@shgroup/opencode-serenity-plugin 0.2.2 → 0.3.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 +78 -150
- package/dist/activation.js +6 -6
- package/dist/activation.js.map +1 -1
- package/dist/ccc-status.d.ts +13 -0
- package/dist/ccc-status.d.ts.map +1 -0
- package/dist/ccc-status.js +70 -0
- package/dist/ccc-status.js.map +1 -0
- package/dist/config-schema.d.ts +1 -1
- package/dist/errors.d.ts +3 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -7
- package/dist/errors.js.map +1 -1
- package/dist/fs/file-system-tool.d.ts.map +1 -1
- package/dist/fs/file-system-tool.js +98 -8
- package/dist/fs/file-system-tool.js.map +1 -1
- package/dist/fs/resolve-path.d.ts +8 -8
- package/dist/fs/resolve-path.d.ts.map +1 -1
- package/dist/fs/resolve-path.js +9 -9
- package/dist/fs/resolve-path.js.map +1 -1
- package/dist/hooks/compacting.js +5 -5
- package/dist/hooks/compacting.js.map +1 -1
- package/dist/hooks/shell-env.d.ts +6 -6
- package/dist/hooks/shell-env.d.ts.map +1 -1
- package/dist/hooks/shell-env.js +12 -10
- package/dist/hooks/shell-env.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/init/init-wizard.d.ts +1 -1
- package/dist/init/init-wizard.js +9 -9
- package/dist/init/init-wizard.js.map +1 -1
- package/dist/msm.d.ts +3 -3
- package/dist/msm.d.ts.map +1 -1
- package/dist/msm.js +24 -22
- package/dist/msm.js.map +1 -1
- package/dist/session/session-tool.js +2 -2
- package/dist/session/session-tool.js.map +1 -1
- package/dist/skills/install-skill.js +4 -4
- package/dist/skills/install-skill.js.map +1 -1
- package/dist/skills/template-loader.d.ts +2 -2
- package/dist/skills/template-loader.d.ts.map +1 -1
- package/dist/skills/template-loader.js +4 -3
- package/dist/skills/template-loader.js.map +1 -1
- package/dist/tui.js +5 -5
- package/dist/tui.js.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/util/init.d.ts +6 -6
- package/dist/util/init.d.ts.map +1 -1
- package/dist/util/init.js +9 -9
- package/dist/util/init.js.map +1 -1
- package/dist/util/msm-call.js +3 -3
- package/dist/util/msm-call.js.map +1 -1
- package/dist/util/msm-exec-runtime.d.ts.map +1 -1
- package/dist/util/msm-exec-runtime.js +11 -0
- package/dist/util/msm-exec-runtime.js.map +1 -1
- package/dist/util/path.d.ts +4 -4
- package/dist/util/path.d.ts.map +1 -1
- package/dist/util/path.js +6 -6
- package/dist/util/path.js.map +1 -1
- package/dist/util/serenity-file.d.ts +6 -6
- package/dist/util/serenity-file.d.ts.map +1 -1
- package/dist/util/serenity-file.js +7 -7
- package/dist/util/serenity-file.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,199 +1,127 @@
|
|
|
1
1
|
# @shgroup/opencode-serenity-plugin
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **Serenity(宁静号)** — 为 OpenCode Agent 提供受控工作空间的插件。
|
|
4
4
|
>
|
|
5
|
-
>
|
|
6
|
-
>
|
|
7
|
-
> 以及 TUI slash command(`/serenity-init`、bash 开关)。
|
|
8
|
-
>
|
|
9
|
-
> 源码:[github.com/tellmewhattodo/opencode-serenity-plugin](https://github.com/tellmewhattodo/opencode-serenity-plugin)
|
|
5
|
+
> 安装后,Agent 自动获得安全文件操作、可审计命令执行、工作会话追踪等能力。
|
|
6
|
+
> 所有这些能力被限定在一个有明确边界的"认知容器"内——根内自由,根外隔离。
|
|
10
7
|
|
|
11
8
|
---
|
|
12
9
|
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
### 前置条件
|
|
10
|
+
## 这是什么
|
|
16
11
|
|
|
17
|
-
|
|
18
|
-
|------|------|
|
|
19
|
-
| Node.js | >= 20 |
|
|
20
|
-
| 包管理器 | pnpm |
|
|
21
|
-
| OpenCode 版本 | >= 1.16 |
|
|
12
|
+
Serenity 是一个 [OpenCode](https://github.com/open-code-ai/opencode) 平台插件。它的核心资产是**认知容器**(Cognitive Container):
|
|
22
13
|
|
|
23
|
-
|
|
14
|
+
| 概念 | 是什么 | 怎么用 |
|
|
15
|
+
|------|--------|--------|
|
|
16
|
+
| 认知容器 | 一个 `.serenity` 标记的 git 目录。Agent 在该目录内拥有受控的工作权限。 | 每个项目创建一个。`home-serenity/` 是家庭管理用,`my-project-serenity/` 是开发用。 |
|
|
17
|
+
| 本插件 | 认知容器的"蓝图"。定义了容器有什么能力、遵守什么约束。 | `npm install` + `install`,一次配置,所有容器共用。 |
|
|
24
18
|
|
|
25
|
-
|
|
26
|
-
npm install @shgroup/opencode-serenity-plugin
|
|
27
|
-
npx opencode-serenity-plugin install
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 从源码构建(贡献者用)
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
git clone git@github.com:tellmewhattodo/opencode-serenity-plugin.git
|
|
34
|
-
cd opencode-serenity-plugin
|
|
35
|
-
pnpm install
|
|
36
|
-
pnpm build
|
|
37
|
-
npx opencode-serenity-plugin install
|
|
38
|
-
```
|
|
19
|
+
类比:插件是操作系统,认知容器是用户目录——装一次 OS,在各个目录下工作。
|
|
39
20
|
|
|
40
|
-
|
|
21
|
+
### 为什么需要认知容器
|
|
41
22
|
|
|
42
|
-
|
|
43
|
-
|---------|----------|------|
|
|
44
|
-
| 项目级 | 当前目录 `opencode.json` | 注册 5 个自定义工具(`msm_list` / `msm_exec` / `msm_admin` / `file_system` / `session_tool`) |
|
|
45
|
-
| 全局级 | `~/.config/opencode/tui.json` | 注册 slash command(`/serenity-init`、`/serenity-bash-on/off/status`) |
|
|
23
|
+
OpenCode Agent 原生的 `bash`、`read`、`edit`、`write` 可以访问整个文件系统。Serenity 加上一层边界:
|
|
46
24
|
|
|
47
|
-
|
|
25
|
+
| 无 Serenity | 有 Serenity |
|
|
26
|
+
|-------------|------------|
|
|
27
|
+
| Agent 可以读写任何路径 | 读写限制在容器根内(P3 权限二分) |
|
|
28
|
+
| `bash` 执行不可审计 | `msm_exec` 执行可追踪、可审查 |
|
|
29
|
+
| 没有工作记录 | 每次多步工作自动创建 SESSION |
|
|
30
|
+
| 没有上下文持久化 | SKILL.md 自动注入 Agent 对话 |
|
|
48
31
|
|
|
49
|
-
|
|
32
|
+
---
|
|
50
33
|
|
|
51
|
-
|
|
52
|
-
// opencode.json(项目根)
|
|
53
|
-
{
|
|
54
|
-
"plugin": [
|
|
55
|
-
"file:///absolute/path/to/opencode-serenity-plugin/dist/index.js"
|
|
56
|
-
]
|
|
57
|
-
}
|
|
34
|
+
## 三个硬约束
|
|
58
35
|
|
|
59
|
-
|
|
60
|
-
{
|
|
61
|
-
"plugin": [
|
|
62
|
-
"file:///absolute/path/to/opencode-serenity-plugin/dist/tui.js"
|
|
63
|
-
]
|
|
64
|
-
}
|
|
65
|
-
```
|
|
36
|
+
每个认知容器遵守三条原则,由插件自动执行:
|
|
66
37
|
|
|
67
|
-
|
|
38
|
+
| # | 原则 | 含义 | 谁执行 |
|
|
39
|
+
|---|------|------|--------|
|
|
40
|
+
| P1 | **有根** | 容器有且仅有一个 `.serenity` 标记的根目录 | `file_system` 工具 |
|
|
41
|
+
| P2 | **git 管** | 根目录必须在 git 管理下,所有变更可追溯 | 激活检查 + `msm_admin` 自动 commit |
|
|
42
|
+
| P3 | **权限二分** | 根内完全读写,根外零权限 | `permission-guards` hook(RR5) |
|
|
68
43
|
|
|
69
|
-
|
|
44
|
+
---
|
|
70
45
|
|
|
71
|
-
|
|
72
|
-
msm_list
|
|
73
|
-
```
|
|
46
|
+
## 6 个工具
|
|
74
47
|
|
|
75
|
-
|
|
48
|
+
安装后 Agent 获得以下工具,替代裸 bash 和原生文件操作:
|
|
76
49
|
|
|
77
|
-
|
|
|
78
|
-
|
|
79
|
-
| `msm_list` |
|
|
80
|
-
| `msm_exec` |
|
|
81
|
-
| `msm_admin` |
|
|
82
|
-
| `file_system` |
|
|
83
|
-
| `session_tool` |
|
|
50
|
+
| 工具 | 作用 |
|
|
51
|
+
|------|------|
|
|
52
|
+
| `msm_list` | 查看当前容器已注册的可执行操作(MSM)。**任何 shell 操作前先调这个。** |
|
|
53
|
+
| `msm_exec` | 容器唯一标准执行路径。替代裸 bash。自动注入 `SERENITY_ROOT` / `SERENITY_CCC` / `SERENITY_VERSION` 到子进程。 |
|
|
54
|
+
| `msm_admin` | 向容器注册新的 MSM。注册表变更自动 git commit。 |
|
|
55
|
+
| `file_system` | 安全文件操作。12 个子命令:`root` / `resolve` / `exists` / `list` / `tree` / `relative` / `mkdir` / `rm` / `mv` / `cp` / `touch` / `append`。写操作限定在容器根内。 |
|
|
56
|
+
| `session_tool` | 工作会话全周期管理。`create` / `list` / `show` / `health` / `qa` / `archive` / `summary`。 |
|
|
57
|
+
| `ccc_status` | 容器健康检查。验证 P1(`.serenity` 存在)、P2(git 仓库)、P3(`opencode.json` 配置完整)。 |
|
|
84
58
|
|
|
85
|
-
|
|
59
|
+
---
|
|
86
60
|
|
|
87
|
-
|
|
61
|
+
## 安装
|
|
88
62
|
|
|
89
63
|
```bash
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
64
|
+
# 前置:Node >= 20,OpenCode >= 1.16
|
|
65
|
+
npm install @shgroup/opencode-serenity-plugin
|
|
66
|
+
npx opencode-serenity-plugin install
|
|
93
67
|
```
|
|
94
68
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
## 功能清单
|
|
98
|
-
|
|
99
|
-
### 5 个 OpenCode 自定义工具
|
|
100
|
-
|
|
101
|
-
| 工具名 | 类别 | 职责 |
|
|
102
|
-
|--------|------|------|
|
|
103
|
-
| `msm_list` | mech | 查询 `mech-registry.json`,列出所有已注册 MSM 及其描述。`msm_exec` 的前置查询步骤。 |
|
|
104
|
-
| `msm_exec` | mech | 执行已注册 MSM。参数 `msm_name` + `args: string[]`。替代裸 bash 的安全命令入口。 |
|
|
105
|
-
| `msm_admin` | mech | 注册/注销 MSM。单 tool + `action` enum(`register` / `deregister`)。注册表变更自动 git commit。 |
|
|
106
|
-
| `file_system` | mech | 安全文件系统操作。10 个子命令:`root` / `resolve` / `exists` / `list` / `relative` / `mkdir` / `rm` / `mv` / `cp` / `touch`。所有写操作限制在 `.serenity` 根目录内,保护 `.serenity` 标记文件和根目录自身不被删除。 |
|
|
107
|
-
| `session_tool` | semi-mech | 会话生命周期管理。7 个子命令:`list` / `show` / `create` / `health` / `archive` / `summary` / `qa`。管理 `AGENT_SESSIONS/` 目录下的会话记录。 |
|
|
108
|
-
|
|
109
|
-
### 系统 Hook
|
|
69
|
+
`install` 写入两处配置:
|
|
110
70
|
|
|
111
|
-
|
|
|
112
|
-
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
| `experimental.session.compacting` | 压缩事件 | 注入 serenity 关键状态(实例名、路径、激活状态)。 |
|
|
116
|
-
| `experimental.tool.definition` | 工具定义阶段 | 向 `task` 工具描述注入精简 serenity context(使 subagent 也能感知 serenity 环境)。 |
|
|
117
|
-
| `shell.env` | shell 执行前 | 注入环境变量 `HOME_SERENITY_ROOT`(实例根路径)、`SERENITY_INSTANCE`(实例名)。 |
|
|
118
|
-
| `event: permission.asked` | 权限弹窗触发时 | cwdRoot 内文件操作自动回复 `always`。 |
|
|
119
|
-
|
|
120
|
-
### TUI Slash Command
|
|
121
|
-
|
|
122
|
-
| 命令 | 作用 |
|
|
123
|
-
|------|------|
|
|
124
|
-
| `/serenity-init` | 将当前 git 仓库初始化为 serenity 实例:创建 `/.serenity` + `git commit -m "chore: initialize serenity (instance: <name>)"`。 |
|
|
125
|
-
| `/serenity-bash-on` | 启用 bash 工具。 |
|
|
126
|
-
| `/serenity-bash-off` | 禁用 bash 工具。AI 对 bash 的任何调用收到 `"bash is disabled by user, use msm instead"` 错误。 |
|
|
127
|
-
| `/serenity-bash-status` | 显示当前 bash 启用/禁用状态。 |
|
|
71
|
+
| 目标 | 路径 | 作用 |
|
|
72
|
+
|------|------|------|
|
|
73
|
+
| 项目级 | 当前目录 `opencode.json` | 注册 6 个工具 |
|
|
74
|
+
| 全局级 | `~/.config/opencode/tui.json` | 注册 `/serenity-init` slash command |
|
|
128
75
|
|
|
129
76
|
---
|
|
130
77
|
|
|
131
|
-
##
|
|
132
|
-
|
|
133
|
-
### 标准开发循环
|
|
78
|
+
## 创建认知容器
|
|
134
79
|
|
|
135
80
|
```bash
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
pnpm build # 编译到 dist/
|
|
139
|
-
pnpm opencode-serenity-plugin install # 安装到当前 project
|
|
140
|
-
```
|
|
81
|
+
# 1. 进入 git 管理的目录
|
|
82
|
+
mkdir my-project && cd my-project && git init
|
|
141
83
|
|
|
142
|
-
|
|
84
|
+
# 2. 在 OpenCode 中输入
|
|
85
|
+
/serenity-init
|
|
86
|
+
```
|
|
143
87
|
|
|
144
|
-
|
|
88
|
+
TUI 会询问容器前缀(如 `my-project`)和一句话描述。确认后自动创建:
|
|
145
89
|
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
90
|
+
```
|
|
91
|
+
my-project-serenity/
|
|
92
|
+
├── .serenity ← 容器标记文件
|
|
93
|
+
├── AGENT_SESSIONS/ ← 工作会话记录
|
|
94
|
+
├── .opencode/skills/
|
|
95
|
+
│ └── my-project-serenity/
|
|
96
|
+
│ ├── SKILL.md ← 容器主入口文档
|
|
97
|
+
│ └── references/
|
|
98
|
+
│ └── mech-registry.json
|
|
150
99
|
```
|
|
151
100
|
|
|
152
|
-
|
|
101
|
+
初始化后立即可用:
|
|
153
102
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
| `tests/hooks/*.test.ts` | — | Hook 行为(permission-guards / compacting /
|
|
161
|
-
tool-definition / auto-reply) |
|
|
162
|
-
| `tests/tui*.test.ts` | — | TUI slash command |
|
|
163
|
-
| `tests/errors.test.ts` | — | 错误类层级 |
|
|
103
|
+
```
|
|
104
|
+
msm_list # 查看已注册 MSM
|
|
105
|
+
ccc_status # 验证容器健康状态
|
|
106
|
+
session_tool create --desc "my-first-task"
|
|
107
|
+
file_system tree --path src/
|
|
108
|
+
```
|
|
164
109
|
|
|
165
110
|
---
|
|
166
111
|
|
|
167
|
-
##
|
|
112
|
+
## 概念模型(深入阅读)
|
|
113
|
+
|
|
114
|
+
如果你关心"为什么这样设计",Serenity 的底层模型是 **ACC/CCC 分层**:
|
|
168
115
|
|
|
169
116
|
```
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
serenity 实例目录(如 home-serenity/) ← instance(可重建的下游 artifact)
|
|
117
|
+
ACC (Abstract Cognitive Container) → 本插件(持久源,定义"什么是容器")
|
|
118
|
+
└── CCC (Concrete Cognitive Container) → 每个 `xxx-serenity/` 目录(可操作实例,可从 ACC 重建)
|
|
173
119
|
```
|
|
174
120
|
|
|
175
|
-
|
|
176
|
-
|------|------|
|
|
177
|
-
| **template**(plugin 仓) | durable,不可替代,GitHub 发布源 |
|
|
178
|
-
| **instance**(serenity 目录) | replicable,可删除后重新 build + install |
|
|
179
|
-
| **关系** | 单向模板→实例。不存在"双真源防漂移"。修改 plugin 后必须重新 build + install。 |
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## 关联文档
|
|
121
|
+
关系:ACC 是蓝图,CCC 是建筑。修改插件(ACC) → build + install → 所有 CCC 自动获得新能力。
|
|
184
122
|
|
|
185
|
-
|
|
186
|
-
|------|---------|
|
|
187
|
-
| 范围层(RR1-RR7,终版) | [`docs/requirements-v0-scope.md`](docs/requirements-v0-scope.md) |
|
|
188
|
-
| 架构设计(两阶段 init + 模块分解) | [`docs/architecture-v0.md`](docs/architecture-v0.md) |
|
|
189
|
-
| 接口契约(6 契约 + 13 错误类) | [`docs/contract-v0.md`](docs/contract-v0.md) |
|
|
190
|
-
| RR7 Init 实施记录 | [`docs/rr7-init-design.md`](docs/rr7-init-design.md) |
|
|
191
|
-
| 重构方向(v1.11-v1.17) | [`docs/refactor-direction-v1.11.md`](docs/refactor-direction-v1.11.md) |
|
|
192
|
-
| v0.1 候选实施(3/3 实施) | [`docs/v0.1-candidates.md`](docs/v0.1-candidates.md) |
|
|
193
|
-
| MSM 自包含 RFC(S028) | [`docs/plugin-self-contained-msm-v1.md`](docs/plugin-self-contained-msm-v1.md) |
|
|
194
|
-
| 设计方案索引(S031) | `AGENT_SESSIONS/2026-05-17--S031--plugin-next-round-requirements/SESSION.md` |
|
|
123
|
+
日常使用时不需要这些术语——"Serenity" 或"认知容器"就够了。
|
|
195
124
|
|
|
196
125
|
---
|
|
197
126
|
|
|
198
|
-
|
|
199
|
-
> **作者**: yh + 宁静号 Agent
|
|
127
|
+
**版本**: v0.2.2
|
package/dist/activation.js
CHANGED
|
@@ -60,9 +60,9 @@ export function tryActivateSync(input, getClient) {
|
|
|
60
60
|
*/
|
|
61
61
|
async function activateAsync(cwdRoot, getClient) {
|
|
62
62
|
// RR1 — 读 /.serenity
|
|
63
|
-
let
|
|
63
|
+
let cccName;
|
|
64
64
|
try {
|
|
65
|
-
|
|
65
|
+
cccName = readSerenityFile(cwdRoot);
|
|
66
66
|
}
|
|
67
67
|
catch (err) {
|
|
68
68
|
const detail = err instanceof Error ? err.message : String(err);
|
|
@@ -71,8 +71,8 @@ async function activateAsync(cwdRoot, getClient) {
|
|
|
71
71
|
// RR2 — 验证 SKILL.md
|
|
72
72
|
let skillPath;
|
|
73
73
|
try {
|
|
74
|
-
skillPath = buildSkillPath(cwdRoot,
|
|
75
|
-
validateSkillExists(skillPath, cwdRoot,
|
|
74
|
+
skillPath = buildSkillPath(cwdRoot, cccName);
|
|
75
|
+
validateSkillExists(skillPath, cwdRoot, cccName);
|
|
76
76
|
}
|
|
77
77
|
catch (err) {
|
|
78
78
|
const detail = err instanceof Error ? err.message : String(err);
|
|
@@ -93,7 +93,7 @@ async function activateAsync(cwdRoot, getClient) {
|
|
|
93
93
|
const state = Object.freeze({
|
|
94
94
|
activated: true,
|
|
95
95
|
cwdRoot,
|
|
96
|
-
|
|
96
|
+
cccName,
|
|
97
97
|
skillPath,
|
|
98
98
|
skillContent,
|
|
99
99
|
});
|
|
@@ -101,7 +101,7 @@ async function activateAsync(cwdRoot, getClient) {
|
|
|
101
101
|
markReady();
|
|
102
102
|
// v1.5 init-check:plugin 启动时自检 opencode.json 关键配置
|
|
103
103
|
// 只 warn,不 patch
|
|
104
|
-
checkSerenityConfig(cwdRoot,
|
|
104
|
+
checkSerenityConfig(cwdRoot, cccName);
|
|
105
105
|
// v1.7 config-patch:自动改主仓 opencode.json 让 cwdRoot 内 read/edit = allow
|
|
106
106
|
// 用户 m0649 决定"全自动"——plugin 启动即生效(用户需重启 opencode 应用改动)
|
|
107
107
|
if (getClient) {
|
package/dist/activation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activation.js","sourceRoot":"","sources":["../src/activation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,yBAAyB,GAE1B,MAAM,wBAAwB,CAAC;AAahC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,SAAqB;IACvE,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAErD,qBAAqB;IACrB,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,YAAY,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED,qCAAqC;IACrC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;QAC5B,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,2BAA2B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAE,kDAAkD;QAC5F,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,SAAqB;IACjE,qBAAqB;IACrB,IAAI,
|
|
1
|
+
{"version":3,"file":"activation.js","sourceRoot":"","sources":["../src/activation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ccc-status.ts — CCC status check tool (v0.3)
|
|
3
|
+
*
|
|
4
|
+
* Validates the three CCC principles:
|
|
5
|
+
* P1: .serenity file exists and is non-empty
|
|
6
|
+
* P2: root is inside a git repository
|
|
7
|
+
* P3: opencode.json plugin configuration is present
|
|
8
|
+
*
|
|
9
|
+
* Output is a JSON status report.
|
|
10
|
+
*/
|
|
11
|
+
import { type ToolDefinition } from '@opencode-ai/plugin';
|
|
12
|
+
export declare const cccStatusTool: ToolDefinition;
|
|
13
|
+
//# sourceMappingURL=ccc-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ccc-status.d.ts","sourceRoot":"","sources":["../src/ccc-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOhE,eAAO,MAAM,aAAa,EAAE,cA0D1B,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ccc-status.ts — CCC status check tool (v0.3)
|
|
3
|
+
*
|
|
4
|
+
* Validates the three CCC principles:
|
|
5
|
+
* P1: .serenity file exists and is non-empty
|
|
6
|
+
* P2: root is inside a git repository
|
|
7
|
+
* P3: opencode.json plugin configuration is present
|
|
8
|
+
*
|
|
9
|
+
* Output is a JSON status report.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { resolve } from 'node:path';
|
|
13
|
+
import { tool } from '@opencode-ai/plugin';
|
|
14
|
+
import { findSerenityRoot } from './fs/resolve-path.js';
|
|
15
|
+
import { getState, ensureReady } from './state.js';
|
|
16
|
+
import pkg from '../package.json' with { type: 'json' };
|
|
17
|
+
const VERSION = pkg.version;
|
|
18
|
+
export const cccStatusTool = tool({
|
|
19
|
+
description: `CCC status health check (v${VERSION}). Validates three CCC principles: ` +
|
|
20
|
+
'P1 (rooted — .serenity exists), P2 (git-managed), P3 (binary permissions — opencode.json present). ' +
|
|
21
|
+
'Returns a JSON status report with pass/fail per principle.',
|
|
22
|
+
args: {},
|
|
23
|
+
execute: async (_input, ctx) => {
|
|
24
|
+
await ensureReady();
|
|
25
|
+
const state = getState();
|
|
26
|
+
const root = findSerenityRoot(ctx.directory);
|
|
27
|
+
// P1: .serenity file exists and is non-empty
|
|
28
|
+
const serenityPath = resolve(root, '.serenity');
|
|
29
|
+
const p1Pass = existsSync(serenityPath);
|
|
30
|
+
// Note: .serenity content is already validated during activation
|
|
31
|
+
// P2: git-managed — the state.activated implies git check passed
|
|
32
|
+
// (RR6 in activation.ts verifies git repo)
|
|
33
|
+
const p2Pass = state.activated;
|
|
34
|
+
// P3: opencode.json with plugin config
|
|
35
|
+
const opencodeJsonPath = resolve(root, 'opencode.json');
|
|
36
|
+
let p3Pass = false;
|
|
37
|
+
let p3Detail = '';
|
|
38
|
+
if (existsSync(opencodeJsonPath)) {
|
|
39
|
+
// Simple check: file exists. Full parse is done by activation.
|
|
40
|
+
p3Pass = true;
|
|
41
|
+
p3Detail = 'opencode.json found';
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
p3Detail = 'opencode.json not found at CCC root';
|
|
45
|
+
}
|
|
46
|
+
const allPass = p1Pass && p2Pass && p3Pass;
|
|
47
|
+
const report = {
|
|
48
|
+
ccc: state.cccName,
|
|
49
|
+
root,
|
|
50
|
+
version: VERSION,
|
|
51
|
+
status: allPass ? 'healthy' : 'degraded',
|
|
52
|
+
principles: {
|
|
53
|
+
P1_rooted: {
|
|
54
|
+
pass: p1Pass,
|
|
55
|
+
detail: p1Pass ? '.serenity marker found' : '.serenity marker missing',
|
|
56
|
+
},
|
|
57
|
+
P2_git_managed: {
|
|
58
|
+
pass: p2Pass,
|
|
59
|
+
detail: p2Pass ? 'git repository verified' : 'not in a git repository',
|
|
60
|
+
},
|
|
61
|
+
P3_binary_permissions: {
|
|
62
|
+
pass: p3Pass,
|
|
63
|
+
detail: p3Detail,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
return JSON.stringify(report, null, 2);
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=ccc-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ccc-status.js","sourceRoot":"","sources":["../src/ccc-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAuB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAE5B,MAAM,CAAC,MAAM,aAAa,GAAmB,IAAI,CAAC;IAChD,WAAW,EACT,6BAA6B,OAAO,qCAAqC;QACzE,qGAAqG;QACrG,4DAA4D;IAC9D,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QAEzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE7C,6CAA6C;QAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACxC,iEAAiE;QAEjE,iEAAiE;QACjE,2CAA2C;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;QAE/B,uCAAuC;QACvC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACxD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjC,+DAA+D;YAC/D,MAAM,GAAG,IAAI,CAAC;YACd,QAAQ,GAAG,qBAAqB,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,qCAAqC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC;QAE3C,MAAM,MAAM,GAAG;YACb,GAAG,EAAE,KAAK,CAAC,OAAO;YAClB,IAAI;YACJ,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;YACxC,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,0BAA0B;iBACvE;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,yBAAyB;iBACvE;gBACD,qBAAqB,EAAE;oBACrB,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;iBACjB;aACF;SACF,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;CACF,CAAC,CAAC"}
|
package/dist/config-schema.d.ts
CHANGED
|
@@ -253,8 +253,8 @@ export declare const pluginConfigSchema: z.ZodObject<{
|
|
|
253
253
|
disabled_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
254
254
|
disabled_msms: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
255
255
|
msm_exec_format: z.ZodOptional<z.ZodEnum<{
|
|
256
|
-
text: "text";
|
|
257
256
|
json: "json";
|
|
257
|
+
text: "text";
|
|
258
258
|
}>>;
|
|
259
259
|
msm_exec_log: z.ZodOptional<z.ZodString>;
|
|
260
260
|
msm_exec_timeout_ms: z.ZodOptional<z.ZodNumber>;
|
package/dist/errors.d.ts
CHANGED
|
@@ -26,9 +26,9 @@ export declare class SerenityFileNotFoundError extends SerenityError {
|
|
|
26
26
|
export declare class SerenityFileEmptyError extends SerenityError {
|
|
27
27
|
constructor(path: string);
|
|
28
28
|
}
|
|
29
|
-
/** RR2 违反:.opencode/skills/<
|
|
29
|
+
/** RR2 违反:.opencode/skills/<cccName>/SKILL.md 不存在 */
|
|
30
30
|
export declare class SkillNotFoundError extends SerenityError {
|
|
31
|
-
constructor(cwdRoot: string,
|
|
31
|
+
constructor(cwdRoot: string, cccName: string);
|
|
32
32
|
}
|
|
33
33
|
/** msm_exec 失败:MSM 不在注册表中 */
|
|
34
34
|
export declare class MsmNotRegisteredError extends SerenityError {
|
|
@@ -68,7 +68,7 @@ export declare class InitGitCommitError extends SerenityError {
|
|
|
68
68
|
constructor(reason: string);
|
|
69
69
|
}
|
|
70
70
|
/** v1.10 RR7:用户输入的 prefix 不是 kebab-case */
|
|
71
|
-
export declare class
|
|
71
|
+
export declare class InvalidCccNameError extends SerenityError {
|
|
72
72
|
constructor(name: string);
|
|
73
73
|
}
|
|
74
74
|
/** msm_exec 失败:path-arg 解析为 cwdRoot 之外的路径(v0.1-2 path escape guard)*/
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,+BAA+B;AAC/B,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,GAAG,EAAE,MAAM;CAIxB;AAED,8BAA8B;AAC9B,qBAAa,yBAA0B,SAAQ,aAAa;gBAC9C,OAAO,EAAE,MAAM;CAI5B;AAED,8BAA8B;AAC9B,qBAAa,sBAAuB,SAAQ,aAAa;gBAC3C,IAAI,EAAE,MAAM;CAIzB;AAED,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,+BAA+B;AAC/B,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,GAAG,EAAE,MAAM;CAIxB;AAED,8BAA8B;AAC9B,qBAAa,yBAA0B,SAAQ,aAAa;gBAC9C,OAAO,EAAE,MAAM;CAI5B;AAED,8BAA8B;AAC9B,qBAAa,sBAAuB,SAAQ,aAAa;gBAC3C,IAAI,EAAE,MAAM;CAIzB;AAED,qDAAqD;AACrD,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI7C;AAED,6BAA6B;AAC7B,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAED,4BAA4B;AAC5B,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAI/C;AAED,gCAAgC;AAChC,qBAAa,yBAA0B,SAAQ,aAAa;gBAC9C,OAAO,EAAE,MAAM;CAI5B;AAED,sCAAsC;AACtC,qBAAa,sBAAuB,SAAQ,aAAa;gBAC3C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAIhD;AAED,yCAAyC;AACzC,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAW9E;AAED,+CAA+C;AAC/C,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,MAAM,EAAE,MAAM;CAI3B;AAED,2CAA2C;AAC3C,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,IAAI,EAAE,MAAM;CAOzB;AAED,sEAAsE;AACtE,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAO9E;AAED,kEAAkE;AAClE,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAO9F;AAED,iCAAiC;AACjC,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,6BAA6B;AAC7B,qBAAa,YAAa,SAAQ,aAAa;gBACjC,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/errors.js
CHANGED
|
@@ -34,14 +34,14 @@ export class SerenityFileNotFoundError extends SerenityError {
|
|
|
34
34
|
/** /.serenity 文件存在但内容为空或无效 */
|
|
35
35
|
export class SerenityFileEmptyError extends SerenityError {
|
|
36
36
|
constructor(path) {
|
|
37
|
-
super(`/.serenity file at "${path}" is empty or contains only whitespace; expected a non-empty
|
|
37
|
+
super(`/.serenity file at "${path}" is empty or contains only whitespace; expected a non-empty CCC name`);
|
|
38
38
|
this.name = 'SerenityFileEmptyError';
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
/** RR2 违反:.opencode/skills/<
|
|
41
|
+
/** RR2 违反:.opencode/skills/<cccName>/SKILL.md 不存在 */
|
|
42
42
|
export class SkillNotFoundError extends SerenityError {
|
|
43
|
-
constructor(cwdRoot,
|
|
44
|
-
super(`SKILL.md not found at "${cwdRoot}/.opencode/skills/${
|
|
43
|
+
constructor(cwdRoot, cccName) {
|
|
44
|
+
super(`SKILL.md not found at "${cwdRoot}/.opencode/skills/${cccName}/SKILL.md"; serenity plugin requires RR2 (the CCC skill must exist)`);
|
|
45
45
|
this.name = 'SkillNotFoundError';
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -111,11 +111,11 @@ export class InitGitCommitError extends SerenityError {
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
/** v1.10 RR7:用户输入的 prefix 不是 kebab-case */
|
|
114
|
-
export class
|
|
114
|
+
export class InvalidCccNameError extends SerenityError {
|
|
115
115
|
constructor(name) {
|
|
116
|
-
super(`Invalid
|
|
116
|
+
super(`Invalid CCC prefix "${name}"; must be kebab-case ` +
|
|
117
117
|
`(lowercase a-z, 0-9, dashes; no leading or trailing dash)`);
|
|
118
|
-
this.name = '
|
|
118
|
+
this.name = 'InvalidCccNameError';
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
/** msm_exec 失败:path-arg 解析为 cwdRoot 之外的路径(v0.1-2 path escape guard)*/
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,GAAW;QACrB,KAAK,CAAC,QAAQ,GAAG,4FAA4F,CAAC,CAAC;QAC/G,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,8BAA8B;AAC9B,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,iCAAiC,OAAO,qEAAqE,CAAC,CAAC;QACrH,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,8BAA8B;AAC9B,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,IAAY;QACtB,KAAK,CAAC,uBAAuB,IAAI,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system-tool.d.ts","sourceRoot":"","sources":["../../src/fs/file-system-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAsFhE,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"file-system-tool.d.ts","sourceRoot":"","sources":["../../src/fs/file-system-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAsFhE,eAAO,MAAM,cAAc,EAAE,cA4W3B,CAAC"}
|