@coda-console/plugin-check 0.5.7 → 0.5.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/README.md +2 -0
- package/check/agent.mjs +13 -1
- package/check/coda/builtin.json +57 -8
- package/check/coda/components/plugins/plugin-rules.mjs +13 -1
- package/check/coda/components/session-config/commands.mjs +1 -1
- package/check/coda/contract.json +6 -6
- package/check/coda/domain/agent-protocol.mjs +8 -2
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ plugins/codex/ Codex:入口在同一进程里运行锁定版本的 c
|
|
|
11
11
|
plugins/claude/ Claude SDK:基于 Claude Agent SDK 的 ACP 入口(npm 依赖),面板「Claude」
|
|
12
12
|
plugins/kimi/ Kimi Code:在运行机的 kimi acp 与 Coda 之间转发,面板「Kimi」
|
|
13
13
|
plugins/grok/ Grok:转发运行机上 Grok CLI 的 ACP,并适配审批模式,面板「Grok」
|
|
14
|
+
plugins/grok-bot/ Grok Bot:把 xAI 云端 Bot 接成长期会话,Webhook 消息、定时巡检与用户审批;依赖 Coda 远端 Agent 入口
|
|
14
15
|
plugins/opencode/ OpenCode:在运行机的 opencode acp 与 Coda 之间转发,送入会话指令与所选模型服务,模型按来源分组
|
|
15
16
|
plugins/codex-accounts/ Codex 多账号:管理登录、自动续期与账号选择,接管 Codex 额度面板
|
|
16
17
|
plugins/cursor/ Cursor:在运行机的 cursor-agent acp 与 Coda 之间转发,送入会话指令
|
|
@@ -19,6 +20,7 @@ plugins/magpie/ Magpie:把本机的 Magpie 网关作为模型服务
|
|
|
19
20
|
plugins/network-log/ 网络记录:只记录不拦截,每秒读连接表记下建连卡住的连接(进程、对端、网卡、mihomo 有没有收到),每分钟分段探测常用服务
|
|
20
21
|
plugins/review/ PR 生命流程:会话开的 PR 先跑项目的检查、再交叉评审,你批准后合并、部署与发布;也是写 PR 流程的样例
|
|
21
22
|
plugins/testbed/ 测试机:长插在 Mac 上的 iPhone、iPad 只经 use-testbed 使用,排到后装 App、交给会话操作、用完切黑屏;依赖宿主资源
|
|
23
|
+
plugins/ultra/ Ultra:输入框的 Ultra 模式,主 Agent 主动把能并行的活按名单派给子会话,汇总后验证;名单与模板在模式参数和设置里
|
|
22
24
|
templates/agent/ 最小的 Agent 插件:手写 ACP 的回声 Agent,演示会话指令、插话、Agent 活动与自主轮次
|
|
23
25
|
templates/panel/ 最小的面板插件:一张卡片、一条进度条、一个按钮
|
|
24
26
|
bin/、check/ 契约检查(仓库根的 package.json 就是它,@coda-console/plugin-check);check/coda/ 是 Coda 同步来的规则副本,不要手改
|
package/check/agent.mjs
CHANGED
|
@@ -8,7 +8,7 @@ import { mkdirSync } from 'node:fs';
|
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { cleared } from './coda/components/plugins/plugin-rules.mjs';
|
|
10
10
|
import { RETRY_DELAYS, continuationPrompt, serviceFailure } from './coda/components/prompt-recovery/prompt-recovery.mjs';
|
|
11
|
-
import { NOT_STEERED, OPEN_LIMIT, SIGNED_OUT, STEERED, STEERING, STOP_LIMIT, TERM_GRACE, clientCapabilities, currentModel, steeringParams, supportsSteering, systemPrompt,
|
|
11
|
+
import { NOT_STEERED, OPEN_LIMIT, REMOTE_CODE, SIGNED_OUT, STEERED, STEERING, STOP_LIMIT, TERM_GRACE, clientCapabilities, currentModel, steeringParams, supportsSteering, systemPrompt,
|
|
12
12
|
takesInstructions } from './coda/domain/agent-protocol.mjs';
|
|
13
13
|
import { agentErrorMessage } from './coda/kernel/agent-failures.mjs';
|
|
14
14
|
import { temporary } from './leftovers.mjs';
|
|
@@ -153,6 +153,18 @@ class Session {
|
|
|
153
153
|
}
|
|
154
154
|
return;
|
|
155
155
|
}
|
|
156
|
+
// A code binding the place a remote agent works (docs/agent-protocol.md「远端入口」): Coda answers it for the agent's own
|
|
157
|
+
// session only, here with a code that binds nothing and no address, as on a machine in no tailnet.
|
|
158
|
+
if (m.method === REMOTE_CODE) {
|
|
159
|
+
if (m.params?.sessionId !== this.sessionId) {
|
|
160
|
+
this.at.fail('request.session', `绑定码请求说的会话 ${m.params?.sessionId} 不是本会话:Coda 只为本会话发绑定码`);
|
|
161
|
+
this.proc.respondError(m.id, -32603, '只能为本会话请求');
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.proc.respond(m.id, { code: randomBytes(12).toString('base64url'), expiresAt: new Date(Date.now() + 10 * 60_000).toISOString(), addresses: [] });
|
|
165
|
+
this.at.info('request.remote-code', '绑定码:检查给一个绑不上任何东西的码,没有入口地址');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
156
168
|
// Coda handles nothing else an agent asks: its ACP SDK answers that the method is not found.
|
|
157
169
|
this.proc.respondError(m.id, METHOD_NOT_FOUND, `"Method not found": ${m.method}`);
|
|
158
170
|
this.once(`request:${m.method}`, () => this.at.warn('request.unsupported', `Agent 请求了 ${m.method}:Coda 不提供(没声明 fs、terminal),回 -32601`));
|
package/check/coda/builtin.json
CHANGED
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
"id": "composer",
|
|
130
130
|
"displayName": "输入框模式",
|
|
131
131
|
"description": "输入框的三种模式:交接到新会话、新建子会话,以及打 ! 执行命令。停用后输入框里没有这几种模式。",
|
|
132
|
-
"version": "1.
|
|
132
|
+
"version": "1.1.0",
|
|
133
133
|
"category": "工作流程",
|
|
134
134
|
"source": {
|
|
135
135
|
"kind": "builtin"
|
|
@@ -154,7 +154,10 @@
|
|
|
154
154
|
"hint": "新会话承接这里的上下文,共享当前工作目录及其中的文件;这个会话保留,仍可继续使用。",
|
|
155
155
|
"placeholder": "接下来要完成什么?",
|
|
156
156
|
"sendLabel": "交接",
|
|
157
|
-
"agent": "own"
|
|
157
|
+
"agent": "own",
|
|
158
|
+
"in": [
|
|
159
|
+
"session"
|
|
160
|
+
]
|
|
158
161
|
},
|
|
159
162
|
{
|
|
160
163
|
"id": "subagent",
|
|
@@ -164,6 +167,9 @@
|
|
|
164
167
|
"placeholder": "描述交给子会话的任务…",
|
|
165
168
|
"sendLabel": "启动子会话",
|
|
166
169
|
"agent": "own",
|
|
170
|
+
"in": [
|
|
171
|
+
"session"
|
|
172
|
+
],
|
|
167
173
|
"parameters": {
|
|
168
174
|
"properties": {
|
|
169
175
|
"replyTo": {
|
|
@@ -217,7 +223,11 @@
|
|
|
217
223
|
"placeholder": "输入要执行的命令…",
|
|
218
224
|
"sendLabel": "执行",
|
|
219
225
|
"agent": "off",
|
|
220
|
-
"trigger": "!"
|
|
226
|
+
"trigger": "!",
|
|
227
|
+
"in": [
|
|
228
|
+
"session",
|
|
229
|
+
"new"
|
|
230
|
+
]
|
|
221
231
|
}
|
|
222
232
|
],
|
|
223
233
|
"agents": [],
|
|
@@ -225,10 +235,49 @@
|
|
|
225
235
|
"extensionPoints": {},
|
|
226
236
|
"extensions": []
|
|
227
237
|
},
|
|
238
|
+
{
|
|
239
|
+
"id": "diagnostics",
|
|
240
|
+
"displayName": "机器诊断",
|
|
241
|
+
"description": "给巡检会话提供只读工具,查看空间各台机器的健康状态、网络诊断与客户端性能。需要时安装,再按目录启用或用 Tag 限定。",
|
|
242
|
+
"version": "1.0.0",
|
|
243
|
+
"category": "机器与资源",
|
|
244
|
+
"source": {
|
|
245
|
+
"kind": "builtin"
|
|
246
|
+
},
|
|
247
|
+
"dir": "src/resources/plugins/diagnostics",
|
|
248
|
+
"title": "机器诊断",
|
|
249
|
+
"properties": {},
|
|
250
|
+
"workflows": [],
|
|
251
|
+
"capabilities": [],
|
|
252
|
+
"services": [],
|
|
253
|
+
"groups": [],
|
|
254
|
+
"commands": [],
|
|
255
|
+
"gitCredentials": [],
|
|
256
|
+
"endpoints": [],
|
|
257
|
+
"views": [],
|
|
258
|
+
"agents": [],
|
|
259
|
+
"dependencies": [
|
|
260
|
+
"space"
|
|
261
|
+
],
|
|
262
|
+
"extensionPoints": {},
|
|
263
|
+
"extensions": [],
|
|
264
|
+
"mcpServers": [
|
|
265
|
+
{
|
|
266
|
+
"name": "diagnostics",
|
|
267
|
+
"command": "${CODA_NODE}",
|
|
268
|
+
"args": [
|
|
269
|
+
"${CODA_PLUGIN_PATH}/mcp.mjs",
|
|
270
|
+
"--state",
|
|
271
|
+
"${CODA_PLUGIN_STATE}"
|
|
272
|
+
],
|
|
273
|
+
"env": []
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
},
|
|
228
277
|
{
|
|
229
278
|
"id": "github",
|
|
230
279
|
"displayName": "GitHub",
|
|
231
|
-
"description": "在 Coda 里登录 GitHub 账号,可以登录多个。Coda 启动的会话、流程步骤与插件安装访问 GitHub 时,按仓库的 owner 自动试出能推送的账号并记下,之后这个 owner 的仓库都用它;账号按面板上的顺序试,可以上移下移;会话里的 gh 与提交署名也跟着这个账号;gh 的只读命令遇到网络类失败会自动重试。会话里的 git 也经它交给真正的 git,Git 自己已知、重跑即好的故障(几个工作树同时创建时读到别的还没写好的 commondir)自动重跑;会话推送它开的 PR 的分支时,PR 观察立即去看,PR
|
|
280
|
+
"description": "在 Coda 里登录 GitHub 账号,可以登录多个。Coda 启动的会话、流程步骤与插件安装访问 GitHub 时,按仓库的 owner 自动试出能推送的账号并记下,之后这个 owner 的仓库都用它;账号按面板上的顺序试,可以上移下移;会话里的 gh 与提交署名也跟着这个账号;gh 的只读命令遇到网络类失败会自动重试。会话里的 git 也经它交给真正的 git,Git 自己已知、重跑即好的故障(几个工作树同时创建时读到别的还没写好的 commondir)自动重跑;会话推送它开的 PR 的分支时,PR 观察立即去看,PR 已合并或关闭就当场提醒这次推送进不了目标分支。添加目录、安装插件时可以从这些账号的仓库里挑。",
|
|
232
281
|
"version": "1.8.0",
|
|
233
282
|
"category": "模型与账号",
|
|
234
283
|
"source": {
|
|
@@ -380,14 +429,14 @@
|
|
|
380
429
|
{
|
|
381
430
|
"name": "coda",
|
|
382
431
|
"path": "src/resources/plugins/guide/skills/coda",
|
|
383
|
-
"description": "Coda 的使用指南:Coda
|
|
432
|
+
"description": "Coda 的使用指南:Coda 是什么、连接、目录、会话、卡片、流程、插件、空间各是什么、怎么配合。用户问 Coda 怎么用、某个界面、菜单、状态或标记是什么意思时,先读这里再回答。"
|
|
384
433
|
}
|
|
385
434
|
]
|
|
386
435
|
},
|
|
387
436
|
{
|
|
388
437
|
"id": "maintenance",
|
|
389
438
|
"displayName": "维护",
|
|
390
|
-
"description": "
|
|
439
|
+
"description": "按周期为每个目录做维护:把旧的工具详情移到冷文件,清掉空闲工作树的构建产物,以及已归档会话的密钥与命令输出;整台机器清一次没人引用的旧附件。",
|
|
391
440
|
"version": "1.0.0",
|
|
392
441
|
"category": "工作流程",
|
|
393
442
|
"source": {
|
|
@@ -430,7 +479,7 @@
|
|
|
430
479
|
"maintenance.uploadsAfter": {
|
|
431
480
|
"type": "string",
|
|
432
481
|
"format": "duration",
|
|
433
|
-
"description": "
|
|
482
|
+
"description": "上传后既没有发送、也没有留在草稿里的附件,过了这么久就删掉;已发送消息里的附件与消息同寿命。附件不属于任何目录,由流程 clean-uploads 按维护周期整台机器清一次。ISO 8601 时长,如 P1D。",
|
|
434
483
|
"title": "没人引用的附件多久后清掉",
|
|
435
484
|
"order": 5,
|
|
436
485
|
"default": "P1D"
|
|
@@ -622,7 +671,7 @@
|
|
|
622
671
|
{
|
|
623
672
|
"id": "space",
|
|
624
673
|
"displayName": "空间",
|
|
625
|
-
"description": "
|
|
674
|
+
"description": "把几台电脑组成一个空间:在一处看各台的目录与会话,把任务派到另一台上,在一处对各台的插件一起改。安装或卸载后,这台电脑的后端会重启一下。",
|
|
626
675
|
"version": "1.1.0",
|
|
627
676
|
"category": "机器与资源",
|
|
628
677
|
"source": {
|
|
@@ -205,8 +205,16 @@ function modelFields(fields, where) {
|
|
|
205
205
|
// what sending does, its placeholder and send button —, whom what is sent is for (`agent`: the session's agent, `own` one
|
|
206
206
|
// chosen for it, which a new session runs, `off` none shown), and its parameters, written as settings are. One entered by a
|
|
207
207
|
// character typed first (`trigger`, as `!`) is the text's: it has no parameters, and what is sent in it is the session's.
|
|
208
|
+
// Which composers offer it (`in`) is its own to say: a session's (`session`), and the one of a session not started yet
|
|
209
|
+
// (`new`, the new task's), where what is sent starts that session in it; one whose messages a new session takes is sent
|
|
210
|
+
// from a session, so only a session's.
|
|
208
211
|
export const MODE_AGENTS = ['session', 'own', 'off'];
|
|
209
|
-
|
|
212
|
+
// What a plugin tells a session's agent at once (docs/session-contracts.md「顺带告诉」): a text, at most this long.
|
|
213
|
+
const TELL_LIMIT = 4000;
|
|
214
|
+
export const checkTold = text => check(typeof text === 'string' && text.trim() && text.length <= TELL_LIMIT && !text.includes('\0'), 'invalid_input',
|
|
215
|
+
`要告诉的话须为不超过 ${TELL_LIMIT} 字的文字`);
|
|
216
|
+
export const MODE_PLACES = ['session', 'new'];
|
|
217
|
+
const MODE_KEYS = ['id', 'title', 'icon', 'hint', 'placeholder', 'sendLabel', 'agent', 'trigger', 'in', 'parameters'];
|
|
210
218
|
const oneLine = (text, most) => typeof text === 'string' && !!text.trim() && [...text].length <= most && !/[\0\r\n]/.test(text);
|
|
211
219
|
function composerModeDeclarations(value) {
|
|
212
220
|
const modes = value ?? [];
|
|
@@ -225,8 +233,12 @@ function composerModeDeclarations(value) {
|
|
|
225
233
|
check(m.trigger === undefined || (typeof m.trigger === 'string' && /^[!#$%&*+:;=?^|~]$/.test(m.trigger)), 'invalid_plugin',
|
|
226
234
|
`${where}.trigger 是一个标点:!#$%&*+:;=?^|~ 之一`);
|
|
227
235
|
check(m.trigger === undefined || (m.parameters === undefined && m.agent !== 'own'), 'invalid_plugin', `${where}:打字进入的模式(trigger)没有参数,也不另选 Agent`);
|
|
236
|
+
check(m.in === undefined || (Array.isArray(m.in) && m.in.length && m.in.every(place => MODE_PLACES.includes(place)) && new Set(m.in).size === m.in.length),
|
|
237
|
+
'invalid_plugin', `${where}.in 是它出现的输入框,取 ${MODE_PLACES.join('、')},不重复`);
|
|
238
|
+
check(m.agent !== 'own' || !m.in?.includes('new'), 'invalid_plugin', `${where}:开新会话的模式(agent: own)要从会话里发出,不能在 new 里`);
|
|
228
239
|
return { id: m.id, title: m.title.trim(), icon: m.icon, ...(m.hint ? { hint: m.hint.trim() } : {}), ...(m.placeholder ? { placeholder: m.placeholder.trim() } : {}),
|
|
229
240
|
...(m.sendLabel ? { sendLabel: m.sendLabel.trim() } : {}), agent: m.agent ?? 'session', ...(m.trigger ? { trigger: m.trigger } : {}),
|
|
241
|
+
in: m.in ? MODE_PLACES.filter(place => m.in.includes(place)) : ['session'],
|
|
230
242
|
// As read, which the clients show; as written (JSON Schema), which its hooks are given (components/composer-modes).
|
|
231
243
|
...(m.parameters !== undefined ? { parameters: modeParameters(m.parameters, `${where}.parameters`), schema: structuredClone(m.parameters) } : {}) };
|
|
232
244
|
});
|
|
@@ -98,7 +98,7 @@ export function firstMessage(value) {
|
|
|
98
98
|
...reply,
|
|
99
99
|
...outside,
|
|
100
100
|
requestId: text(value.requestId, '请求标识', 100),
|
|
101
|
-
projectId: text(value.projectId, '
|
|
101
|
+
projectId: text(value.projectId, '目录标识', 100),
|
|
102
102
|
title: text(value.title ?? message.trim().slice(0, 80), '会话标题'),
|
|
103
103
|
agent: value.agent,
|
|
104
104
|
checkout: checkout.kind === 'worktree' ? { kind: 'worktree', baseRef: checkout.baseRef } : { kind: checkout.kind },
|
package/check/coda/contract.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commit": "
|
|
2
|
+
"commit": "8cb72bb25f7be7db272feea0cd15d7c4a610834a",
|
|
3
3
|
"packages": {
|
|
4
4
|
"@0dep/piso": "5.2.0",
|
|
5
5
|
"@agentclientprotocol/sdk": "1.4.0",
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"check/coda/components/plugins/agent-plugins.mjs": "23016dd0f7350a10f71565a2c44e2c1179299a93e8c859529071099f2ce862d1",
|
|
10
10
|
"check/coda/components/plugins/model-protocols.mjs": "762244c01266cf61384377bdfbb84bef5ab157b1783f9254ddc1ae3d576a73c5",
|
|
11
11
|
"check/coda/components/plugins/plugin-extensions.mjs": "e527800a109ec9849975357f841b0c05ecfa50c9d9c34e26d828aef3cb7d3cb3",
|
|
12
|
-
"check/coda/components/plugins/plugin-rules.mjs": "
|
|
12
|
+
"check/coda/components/plugins/plugin-rules.mjs": "8cd1058fc96365f7f35451a4a75bd1c6434e0e036bb4b18f7c7fc37709e66c3e",
|
|
13
13
|
"check/coda/components/plugins/plugin-source-rules.mjs": "e03606bf3056061ee3a78494d34dae9dfbe35d6fb2f139880fab5891663cbedc",
|
|
14
14
|
"check/coda/components/plugins/skill-document.mjs": "c5b5e815c42cd836572f7b60e22a46af6ac607fd9df0170fa36f955825636ce6",
|
|
15
15
|
"check/coda/components/prompt-recovery/prompt-recovery.mjs": "f43f21d24c19a58113d3304f9248225b12080ab00ed15eab74bf7b94642732de",
|
|
16
|
-
"check/coda/components/session-config/commands.mjs": "
|
|
16
|
+
"check/coda/components/session-config/commands.mjs": "b59772a8216d8d97d0e0fb4f094c194b3e602ef3aeca2ea3eba5919f481f791c",
|
|
17
17
|
"check/coda/components/workflows/executor-labels.mjs": "dceca6ae60c0a4f3c3cc72a6c84f1489831790774c93caab96e4ddb493bc89e1",
|
|
18
|
-
"check/coda/domain/agent-protocol.mjs": "
|
|
18
|
+
"check/coda/domain/agent-protocol.mjs": "e85866b88c802de1204d4215f7c10d345d76aa9900854d5e2d615f2d1c8f30b7",
|
|
19
19
|
"check/coda/domain/duration.mjs": "15dd64ef9b02342ad521c66e5968a569432a89dc7568d11afd3e6f3fe37e104b",
|
|
20
20
|
"check/coda/domain/errors.mjs": "773c641309a0d19b93c0b3457428d74ecf636454d9fe91cacf3d944b952831dc",
|
|
21
21
|
"check/coda/domain/values.mjs": "01cc72b8d9c09e3fe16c93ec332ca01148bba859b1c672586d9d07444d7816c4",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"check/coda/resources/plugins/resources/panels/panels.mjs": "aee040febb37fd6eebaf1a1da5b3299d2b6a9dfc982e649d9a628291af298179",
|
|
25
25
|
"check/coda/resources/plugins/resources/panels/rules.mjs": "c024c5ede7c1516877128aa6d6796fbe5fd0e14642741b0745481bb1c5ca41d3",
|
|
26
26
|
"check/coda/resources/plugins/resources/panels/sign-in.mjs": "1271a24e33b1b882a1fb9bee03b8e240db8b9bee1b5208f0e1c84499cfb1be7e",
|
|
27
|
-
"check/coda/builtin.json": "
|
|
28
|
-
"docs/agent-protocol.md": "
|
|
27
|
+
"check/coda/builtin.json": "72a401da2d169559fb2fa18460dceb56f0ae219eb88b0b83caa52f7cf1bb3e9e",
|
|
28
|
+
"docs/agent-protocol.md": "322271992a6c95db24fa4f8fbddf8bec23ca9dc9e7d00e5f8bdb4258a30e1cd7"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -7,9 +7,15 @@ export const clientCapabilities = () => ({
|
|
|
7
7
|
elicitation: { form: {}, url: {} },
|
|
8
8
|
// A config option may be a switch: shown as one, its value on or off (`options`).
|
|
9
9
|
session: { compaction: {}, configOptions: { boolean: {} } },
|
|
10
|
-
// Coda takes the agent's own waits.
|
|
11
|
-
_meta: { coda: { waits: {} } },
|
|
10
|
+
// Coda takes the agent's own waits, and relays what is asked of the session from outside to an agent that takes it.
|
|
11
|
+
_meta: { coda: { waits: {}, remote: {} } },
|
|
12
12
|
});
|
|
13
|
+
// The remote entry (「远端入口」): an agent whose work is done elsewhere (a bot on its own computer) declares it; the code to
|
|
14
|
+
// bind that place to its session is asked of Coda (`REMOTE_CODE`), and what that place then asks of the session is handed
|
|
15
|
+
// to the agent (`REMOTE`) as it was asked.
|
|
16
|
+
export const REMOTE = '_coda/remote', REMOTE_CODE = '_coda/remote/code';
|
|
17
|
+
export const supportsRemote = init => init?.agentCapabilities?._meta?.coda?.remote != null
|
|
18
|
+
&& typeof init.agentCapabilities._meta.coda.remote === 'object';
|
|
13
19
|
// The agent refuses until it is signed in (ACP's auth_required).
|
|
14
20
|
export const SIGNED_OUT = -32000;
|
|
15
21
|
// Session instructions (「会话指令」): ACP's `systemPrompt`, only to an agent that declares it, the same on every open of
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coda-console/plugin-check",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9",
|
|
4
4
|
"description": "Coda 插件的契约检查:扮演 Coda 读清单、启动 Agent 讲 ACP 与 _coda/wait、读面板。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -28,5 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"feelin": "8.2.0"
|
|
31
34
|
}
|
|
32
35
|
}
|