paseo-agy-acp 2.2.1 → 2.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/CHANGELOG.md +32 -0
- package/README.md +29 -16
- package/README.zh-CN.md +28 -16
- package/dist/ACP Connector/official-kernel/context.d.ts +1 -0
- package/dist/ACP Connector/official-kernel/context.js +7 -0
- package/dist/ACP Connector/official-kernel/context.js.map +1 -1
- package/dist/ACP Connector/official-kernel/proxy.js +67 -1
- package/dist/ACP Connector/official-kernel/proxy.js.map +1 -1
- package/dist/ACP Connector/official-kernel/skill-commands.d.ts +12 -0
- package/dist/ACP Connector/official-kernel/skill-commands.js +219 -0
- package/dist/ACP Connector/official-kernel/skill-commands.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `paseo-agy-acp` are recorded here.
|
|
4
4
|
|
|
5
|
+
## 2.3.0 - 2026-08-30
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Discover user and workspace `SKILL.md` files from Gemini, Agents, Codex, and
|
|
10
|
+
configured skill roots, then expose user-invocable skills through standard
|
|
11
|
+
ACP slash command hints while preserving native commands.
|
|
12
|
+
- Add a tag-triggered npm Trusted Publishing workflow. A matching `vX.Y.Z` tag
|
|
13
|
+
on `main` now validates, packs, records, and publishes the public npm tarball
|
|
14
|
+
automatically with GitHub OIDC provenance and no long-lived npm token.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Scope workspace skill discovery to each ACP session cwd, serialize concurrent
|
|
19
|
+
`session/new` setup, and prevent command hints from leaking between
|
|
20
|
+
workspaces.
|
|
21
|
+
- Hide skills marked `user-invocable: false`, preserve workspace-over-global
|
|
22
|
+
precedence, and parse common quoted and multiline frontmatter forms.
|
|
23
|
+
|
|
24
|
+
### Verification
|
|
25
|
+
|
|
26
|
+
- Complete validation: 37 test files, 216 passed, 1 skipped; architecture and
|
|
27
|
+
secret checks passed.
|
|
28
|
+
- Official-kernel smoke and a live command-update canary preserved native
|
|
29
|
+
commands, exposed the visible workspace skill, and hid the non-invocable
|
|
30
|
+
skill.
|
|
31
|
+
|
|
32
|
+
### Contributors
|
|
33
|
+
|
|
34
|
+
- Thanks to [@zwmmm](https://github.com/zwmmm) for the initial implementation
|
|
35
|
+
and review follow-up in [#9](https://github.com/tiezbro/paseo-agy-acp/pull/9).
|
|
36
|
+
|
|
5
37
|
## 2.2.1 - 2026-08-29
|
|
6
38
|
|
|
7
39
|
### Changed
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
**Paseo adapter in front of Google's official Antigravity ACP kernel**
|
|
6
6
|
|
|
7
7
|
[](./LICENSE)
|
|
8
|
-
[](./package.json)
|
|
9
9
|
[](https://www.npmjs.com/package/paseo-agy-acp)
|
|
10
10
|
[](#)
|
|
11
11
|
[](https://agentclientprotocol.com)
|
|
@@ -33,9 +33,10 @@ a startup stampede.
|
|
|
33
33
|
complete turns on this path. If you do not opt in, the official path supports
|
|
34
34
|
Gemini-family models only by default.
|
|
35
35
|
|
|
36
|
-
**2.
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
**2.3.0** adds slash command hints for user-invocable skills discovered from
|
|
37
|
+
Gemini, Agents, Codex, configured, and workspace roots. Native ACP commands stay
|
|
38
|
+
intact, workspace skills remain scoped to their session cwd, and concurrent
|
|
39
|
+
session creation cannot mix command hints between workspaces.
|
|
39
40
|
|
|
40
41
|
> **Not official Paseo support. Not official Google support.**
|
|
41
42
|
> Community-maintained product. Use at your own risk.
|
|
@@ -51,6 +52,7 @@ Generic ACP bridge does not provide:
|
|
|
51
52
|
- session mode mapping
|
|
52
53
|
- MCP `http` to official `sse` rewrite
|
|
53
54
|
- stable product identity
|
|
55
|
+
- local and workspace skill discovery for ACP slash command hints
|
|
54
56
|
- burst-safe account-wide Admission queue for multi-agent delegation
|
|
55
57
|
- local opt-in for Claude 4.6 and GPT-OSS 120B; without it, Gemini-family only
|
|
56
58
|
|
|
@@ -78,16 +80,16 @@ Antigravity ACP kernel (this package does **not** install Google's `.par`).
|
|
|
78
80
|
`PASEO_AGY_ACP_OFFICIAL_BIN` to your kernel wrapper or `.par` (required unless
|
|
79
81
|
it already sits at the maintainer-host default pin).
|
|
80
82
|
|
|
81
|
-
The npm package `paseo-agy-acp@2.
|
|
83
|
+
The npm package `paseo-agy-acp@2.3.0` is the **proxy**. `npx` launches that
|
|
82
84
|
proxy; it does not replace Antigravity or Paseo.
|
|
83
85
|
|
|
84
86
|
```bash
|
|
85
87
|
export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy_acp_server.par-or-wrapper"
|
|
86
|
-
npx -y paseo-agy-acp@2.
|
|
88
|
+
npx -y paseo-agy-acp@2.3.0 --login
|
|
87
89
|
|
|
88
90
|
export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/default"
|
|
89
91
|
install -d -m 700 "$AGY_ACP_STATE_DIR"
|
|
90
|
-
npx -y --package=paseo-agy-acp@2.
|
|
92
|
+
npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
|
|
91
93
|
export AGY_ACP_ADMISSION_ENABLED=true
|
|
92
94
|
```
|
|
93
95
|
|
|
@@ -96,7 +98,7 @@ Then point Paseo's Generic ACP `command` at npx (see
|
|
|
96
98
|
line as a standalone chat app: it is the stdio ACP server Paseo spawns.
|
|
97
99
|
|
|
98
100
|
```bash
|
|
99
|
-
npx -y paseo-agy-acp@2.
|
|
101
|
+
npx -y paseo-agy-acp@2.3.0
|
|
100
102
|
```
|
|
101
103
|
|
|
102
104
|
Claude / GPT-OSS: [§1](#1-official-agy-acp-kernel-capabilities) and the
|
|
@@ -209,6 +211,17 @@ Maintainer-host checks with live entitlement: `claude-sonnet-4-6`,
|
|
|
209
211
|
`claude-opus-4-6-thinking`, `gpt-oss-120b-medium` — text, sequential tools,
|
|
210
212
|
warm resume. Your account must still list those ids in raw CCPA.
|
|
211
213
|
|
|
214
|
+
Live Paseo turns on that host after local opt-in (Yolo). Same official kernel;
|
|
215
|
+
npm still does **not** ship Google's `.par`.
|
|
216
|
+
|
|
217
|
+
**Claude Opus 4.6 (Thinking)** — hello turn, 5s:
|
|
218
|
+
|
|
219
|
+

|
|
220
|
+
|
|
221
|
+
**GPT-OSS 120B (Medium)** — hello turn, 4s:
|
|
222
|
+
|
|
223
|
+

|
|
224
|
+
|
|
212
225
|
Please test Claude and GPT-OSS on your machine (one agent and several). If a
|
|
213
226
|
model is missing, a turn fails, or tools misbehave,
|
|
214
227
|
[open an Issue](https://github.com/tiezbro/paseo-agy-acp/issues). We will use
|
|
@@ -398,7 +411,7 @@ kernel. Prefer npm over `git clone` for the adapter only.
|
|
|
398
411
|
|
|
399
412
|
```bash
|
|
400
413
|
# Official OAuth through the proxy (kernel must already be on this machine)
|
|
401
|
-
npx -y paseo-agy-acp@2.
|
|
414
|
+
npx -y paseo-agy-acp@2.3.0 --login
|
|
402
415
|
```
|
|
403
416
|
|
|
404
417
|
Bins: `paseo-agy-acp` / `agy-acp` (ACP proxy), `agy-acp-prepare-state`,
|
|
@@ -418,13 +431,13 @@ npm test
|
|
|
418
431
|
```bash
|
|
419
432
|
# ACP initialize smoke (requires the official binary)
|
|
420
433
|
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
|
|
421
|
-
| npx -y paseo-agy-acp@2.
|
|
434
|
+
| npx -y paseo-agy-acp@2.3.0
|
|
422
435
|
```
|
|
423
436
|
|
|
424
437
|
Login (official kernel OAuth):
|
|
425
438
|
|
|
426
439
|
```bash
|
|
427
|
-
npx -y paseo-agy-acp@2.
|
|
440
|
+
npx -y paseo-agy-acp@2.3.0 --login
|
|
428
441
|
```
|
|
429
442
|
|
|
430
443
|
## Environment
|
|
@@ -465,7 +478,7 @@ One official kernel child per connector process. Admission coordinates
|
|
|
465
478
|
"providers": {
|
|
466
479
|
"antigravity": {
|
|
467
480
|
"type": "acp",
|
|
468
|
-
"command": ["npx", "-y", "paseo-agy-acp@2.
|
|
481
|
+
"command": ["npx", "-y", "paseo-agy-acp@2.3.0"],
|
|
469
482
|
"env": {
|
|
470
483
|
"PASEO_AGY_ACP_OFFICIAL_BIN": "/home/YOU/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary",
|
|
471
484
|
"AGY_ACP_ADMISSION_ENABLED": "true",
|
|
@@ -495,12 +508,12 @@ Configure the Paseo daemon to add an ACP provider for Google Antigravity.
|
|
|
495
508
|
2. Read Paseo config ($PASEO_HOME/config.json or ~/.paseo/config.json).
|
|
496
509
|
3. Add or update providers.antigravity:
|
|
497
510
|
- type: "acp"
|
|
498
|
-
- command: ["npx", "-y", "paseo-agy-acp@2.
|
|
511
|
+
- command: ["npx", "-y", "paseo-agy-acp@2.3.0"] (spawns the proxy, not the Google kernel)
|
|
499
512
|
- env.PASEO_AGY_ACP_OFFICIAL_BIN: local official kernel wrapper (agy-acp-server-canary or agy_acp_server.par)
|
|
500
513
|
- env.AGY_ACP_ADMISSION_ENABLED: "true"
|
|
501
514
|
- env.AGY_ACP_STATE_DIR: absolute owner-only directory (mode 0700)
|
|
502
|
-
4. Prepare Admission state: npx -y --package=paseo-agy-acp@2.
|
|
503
|
-
5. Login once: npx -y paseo-agy-acp@2.
|
|
515
|
+
4. Prepare Admission state: npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
|
|
516
|
+
5. Login once: npx -y paseo-agy-acp@2.3.0 --login
|
|
504
517
|
6. Restart the Paseo daemon.
|
|
505
518
|
7. Verify: create a test agent with provider "antigravity", send a simple prompt.
|
|
506
519
|
~~~
|
|
@@ -548,7 +561,7 @@ env -u PASEO_AGENT_ID -u PASEO_HOME npm test
|
|
|
548
561
|
## Upgrade / Rollback
|
|
549
562
|
|
|
550
563
|
If Paseo `command` uses npx, bump or pin the npm tag (for example
|
|
551
|
-
`paseo-agy-acp@2.
|
|
564
|
+
`paseo-agy-acp@2.3.0`) and restart the daemon. That is the upgrade/rollback
|
|
552
565
|
path for packaged installs.
|
|
553
566
|
|
|
554
567
|
Source checkout:
|
package/README.zh-CN.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
**面向 Paseo 的适配器,跑在 Google 官方 Antigravity ACP 内核前面**
|
|
6
6
|
|
|
7
7
|
[](./LICENSE)
|
|
8
|
-
[](./package.json)
|
|
9
9
|
[](https://www.npmjs.com/package/paseo-agy-acp)
|
|
10
10
|
[](#)
|
|
11
11
|
[](https://agentclientprotocol.com)
|
|
@@ -30,9 +30,9 @@ daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账
|
|
|
30
30
|
兼容:有资格的 Claude 4.6 与 GPT-OSS 120B 可以在这条路径上跑完回合。
|
|
31
31
|
如果未 opt-in,官方路径默认只支持 Gemini 系模型。
|
|
32
32
|
|
|
33
|
-
**2.
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
**2.3.0** 新增可由用户调用的 skill slash command 提示,支持 Gemini、Agents、
|
|
34
|
+
Codex、用户配置和 workspace roots。原生 ACP 命令保持不变,workspace skills
|
|
35
|
+
按 session cwd 隔离,并发创建 session 时不会跨 workspace 混入命令提示。
|
|
36
36
|
|
|
37
37
|
> **非 Paseo 官方支持。非 Google 官方支持。** 社区维护产品,使用风险自负。
|
|
38
38
|
|
|
@@ -46,6 +46,7 @@ daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账
|
|
|
46
46
|
- session 模式映射
|
|
47
47
|
- MCP `http` 到官方 `sse` 的改写
|
|
48
48
|
- 稳定产品身份
|
|
49
|
+
- 面向 ACP slash command 提示的本地与 workspace skill discovery
|
|
49
50
|
- 面向多 agent 委派的账户级 Admission 队列
|
|
50
51
|
- 本机 opt-in 后可跑 Claude 4.6 与 GPT-OSS 120B;未 opt-in 则只支持 Gemini 系
|
|
51
52
|
|
|
@@ -72,16 +73,16 @@ daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账
|
|
|
72
73
|
(`authenticate` / `oauth-personal`)。把 `PASEO_AGY_ACP_OFFICIAL_BIN` 指到你的
|
|
73
74
|
内核 wrapper 或 `.par`(除非已在维护者主机默认 pin 路径,否则必填)。
|
|
74
75
|
|
|
75
|
-
npm 包 `paseo-agy-acp@2.
|
|
76
|
+
npm 包 `paseo-agy-acp@2.3.0` 是 **代理**。`npx` 只拉起这个代理,**不能**代替
|
|
76
77
|
Antigravity 或 Paseo。
|
|
77
78
|
|
|
78
79
|
```bash
|
|
79
80
|
export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy_acp_server.par-or-wrapper"
|
|
80
|
-
npx -y paseo-agy-acp@2.
|
|
81
|
+
npx -y paseo-agy-acp@2.3.0 --login
|
|
81
82
|
|
|
82
83
|
export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/default"
|
|
83
84
|
install -d -m 700 "$AGY_ACP_STATE_DIR"
|
|
84
|
-
npx -y --package=paseo-agy-acp@2.
|
|
85
|
+
npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
|
|
85
86
|
export AGY_ACP_ADMISSION_ENABLED=true
|
|
86
87
|
```
|
|
87
88
|
|
|
@@ -90,7 +91,7 @@ export AGY_ACP_ADMISSION_ENABLED=true
|
|
|
90
91
|
而是 Paseo spawn 的 stdio ACP 服务:
|
|
91
92
|
|
|
92
93
|
```bash
|
|
93
|
-
npx -y paseo-agy-acp@2.
|
|
94
|
+
npx -y paseo-agy-acp@2.3.0
|
|
94
95
|
```
|
|
95
96
|
|
|
96
97
|
Claude / GPT-OSS 见 [§1](#1-官方-agy-acp-内核能力) 和
|
|
@@ -204,6 +205,17 @@ opt-in 是 **本机、显式** 的:
|
|
|
204
205
|
`claude-opus-4-6-thinking`、`gpt-oss-120b-medium` —— 文本、顺序工具、warm
|
|
205
206
|
resume。你的账号仍须在 raw CCPA 目录里拥有这些 id。
|
|
206
207
|
|
|
208
|
+
本机 opt-in 之后,同一台主机上的 Paseo 活回合(Yolo)。仍是同一套官方内核;
|
|
209
|
+
npm **不**分发 Google 的 `.par`。
|
|
210
|
+
|
|
211
|
+
**Claude Opus 4.6 (Thinking)** — hello 回合,5s:
|
|
212
|
+
|
|
213
|
+

|
|
214
|
+
|
|
215
|
+
**GPT-OSS 120B (Medium)** — hello 回合,4s:
|
|
216
|
+
|
|
217
|
+

|
|
218
|
+
|
|
207
219
|
请在自己的环境测试 Claude 与 GPT-OSS(单个 agent 和一次开多个)。模型缺失、
|
|
208
220
|
回合失败或工具异常,请 [开 Issue](https://github.com/tiezbro/paseo-agy-acp/issues)。
|
|
209
221
|
我们会按反馈做优化和修复。
|
|
@@ -374,7 +386,7 @@ paseo-agy-acp/
|
|
|
374
386
|
|
|
375
387
|
```bash
|
|
376
388
|
# 经代理做官方 OAuth(本机必须已有官方内核)
|
|
377
|
-
npx -y paseo-agy-acp@2.
|
|
389
|
+
npx -y paseo-agy-acp@2.3.0 --login
|
|
378
390
|
```
|
|
379
391
|
|
|
380
392
|
命令:`paseo-agy-acp` / `agy-acp`(ACP 代理)、`agy-acp-prepare-state`、
|
|
@@ -394,13 +406,13 @@ npm test
|
|
|
394
406
|
```bash
|
|
395
407
|
# ACP initialize 冒烟(需要官方二进制)
|
|
396
408
|
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
|
|
397
|
-
| npx -y paseo-agy-acp@2.
|
|
409
|
+
| npx -y paseo-agy-acp@2.3.0
|
|
398
410
|
```
|
|
399
411
|
|
|
400
412
|
登录(官方内核 OAuth):
|
|
401
413
|
|
|
402
414
|
```bash
|
|
403
|
-
npx -y paseo-agy-acp@2.
|
|
415
|
+
npx -y paseo-agy-acp@2.3.0 --login
|
|
404
416
|
```
|
|
405
417
|
|
|
406
418
|
## 环境变量
|
|
@@ -441,7 +453,7 @@ Paseo / Generic ACP 客户端
|
|
|
441
453
|
"providers": {
|
|
442
454
|
"antigravity": {
|
|
443
455
|
"type": "acp",
|
|
444
|
-
"command": ["npx", "-y", "paseo-agy-acp@2.
|
|
456
|
+
"command": ["npx", "-y", "paseo-agy-acp@2.3.0"],
|
|
445
457
|
"env": {
|
|
446
458
|
"PASEO_AGY_ACP_OFFICIAL_BIN": "/home/YOU/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary",
|
|
447
459
|
"AGY_ACP_ADMISSION_ENABLED": "true",
|
|
@@ -470,12 +482,12 @@ Configure the Paseo daemon to add an ACP provider for Google Antigravity.
|
|
|
470
482
|
2. Read Paseo config ($PASEO_HOME/config.json or ~/.paseo/config.json).
|
|
471
483
|
3. Add or update providers.antigravity:
|
|
472
484
|
- type: "acp"
|
|
473
|
-
- command: ["npx", "-y", "paseo-agy-acp@2.
|
|
485
|
+
- command: ["npx", "-y", "paseo-agy-acp@2.3.0"] (spawns the proxy, not the Google kernel)
|
|
474
486
|
- env.PASEO_AGY_ACP_OFFICIAL_BIN: local official kernel wrapper (agy-acp-server-canary or agy_acp_server.par)
|
|
475
487
|
- env.AGY_ACP_ADMISSION_ENABLED: "true"
|
|
476
488
|
- env.AGY_ACP_STATE_DIR: absolute owner-only directory (mode 0700)
|
|
477
|
-
4. Prepare Admission state: npx -y --package=paseo-agy-acp@2.
|
|
478
|
-
5. Login once: npx -y paseo-agy-acp@2.
|
|
489
|
+
4. Prepare Admission state: npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
|
|
490
|
+
5. Login once: npx -y paseo-agy-acp@2.3.0 --login
|
|
479
491
|
6. Restart the Paseo daemon.
|
|
480
492
|
7. Verify: create a test agent with provider "antigravity", send a simple prompt.
|
|
481
493
|
~~~
|
|
@@ -518,7 +530,7 @@ env -u PASEO_AGENT_ID -u PASEO_HOME npm test
|
|
|
518
530
|
|
|
519
531
|
## 升级 / 回滚
|
|
520
532
|
|
|
521
|
-
若 Paseo `command` 走 npx,改 npm 版本钉(例如 `paseo-agy-acp@2.
|
|
533
|
+
若 Paseo `command` 走 npx,改 npm 版本钉(例如 `paseo-agy-acp@2.3.0`)并重启
|
|
522
534
|
daemon。这是打包安装的升级/回滚路径。
|
|
523
535
|
|
|
524
536
|
源码 checkout:
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare function injectPaseoContext(params: unknown, environment?: NodeJS.ProcessEnv): Promise<unknown>;
|
|
2
2
|
export declare function extractPromptText(params: unknown): string;
|
|
3
3
|
export declare function extractSessionId(params: unknown): string | undefined;
|
|
4
|
+
export declare function extractCwd(params: unknown): string | undefined;
|
|
@@ -49,4 +49,11 @@ export function extractSessionId(params) {
|
|
|
49
49
|
? params.session_id
|
|
50
50
|
: undefined;
|
|
51
51
|
}
|
|
52
|
+
export function extractCwd(params) {
|
|
53
|
+
if (!isRecord(params))
|
|
54
|
+
return undefined;
|
|
55
|
+
return typeof params.cwd === "string" && params.cwd.trim().length > 0
|
|
56
|
+
? params.cwd.trim()
|
|
57
|
+
: undefined;
|
|
58
|
+
}
|
|
52
59
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,iCAAiC,EACjC,2BAA2B,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,SAAS,gBAAgB,CAAC,MAAe,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IACrD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,OAAO,MAAM,EAAE,CAAC;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAe,EACf,WAAW,GAAsB,OAAO,CAAC,GAAG;IAE5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,iCAAiC,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACjG,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACzC,CAAC,CAAC,MAAM,CAAC,SAAS;QAClB,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,CAAC,CAAC,MAAM,CAAC,UAAU;YACnB,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,iCAAiC,EACjC,2BAA2B,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,SAAS,gBAAgB,CAAC,MAAe,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IACrD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,OAAO,MAAM,EAAE,CAAC;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAe,EACf,WAAW,GAAsB,OAAO,CAAC,GAAG;IAE5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,iCAAiC,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACjG,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACzC,CAAC,CAAC,MAAM,CAAC,SAAS;QAClB,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,CAAC,CAAC,MAAM,CAAC,UAAU;YACnB,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACnE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;QACnB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { TurnClaim } from "../acp/session/turn-scheduler.js";
|
|
2
2
|
import { createOfficialAdmission, issueAdmittedOfficialPromptWrite } from "./admission-fence.js";
|
|
3
|
-
import { extractPromptText, extractSessionId, injectPaseoContext } from "./context.js";
|
|
3
|
+
import { extractCwd, extractPromptText, extractSessionId, injectPaseoContext } from "./context.js";
|
|
4
4
|
import { blankTurnError, sessionUpdateShowsVisibleOutput, shouldRejectBlankTurn } from "./errors.js";
|
|
5
5
|
import { overlayProductIdentity } from "./identity.js";
|
|
6
6
|
import { isJsonRpcFailure, isJsonRpcNotification, isJsonRpcRequest, isJsonRpcSuccess, jsonRpcError } from "./json-rpc.js";
|
|
7
7
|
import { rewriteMcpServers } from "./mcp-rewrite.js";
|
|
8
8
|
import { rewriteModeFields } from "./mode-map.js";
|
|
9
9
|
import { createNdjsonParser, encodeNdjson } from "./ndjson.js";
|
|
10
|
+
import { augmentAvailableCommands } from "./skill-commands.js";
|
|
10
11
|
const INITIALIZE_METHOD = "initialize";
|
|
11
12
|
const SESSION_NEW_METHOD = "session/new";
|
|
13
|
+
const SESSION_LOAD_METHOD = "session/load";
|
|
14
|
+
const SESSION_RESUME_METHOD = "session/resume";
|
|
12
15
|
const SESSION_PROMPT_METHOD = "session/prompt";
|
|
13
16
|
const SESSION_SET_MODE_METHOD = "session/set_mode";
|
|
14
17
|
const SESSION_SET_CONFIG_METHOD = "session/set_config_option";
|
|
@@ -21,8 +24,10 @@ export class OfficialKernelProxy {
|
|
|
21
24
|
#version;
|
|
22
25
|
#pending = new Map();
|
|
23
26
|
#claims = new Map();
|
|
27
|
+
#sessionCwds = new Map();
|
|
24
28
|
#env;
|
|
25
29
|
#admission;
|
|
30
|
+
#sessionNewTail = Promise.resolve();
|
|
26
31
|
#closed = false;
|
|
27
32
|
constructor(options) {
|
|
28
33
|
this.#child = options.child;
|
|
@@ -91,6 +96,16 @@ export class OfficialKernelProxy {
|
|
|
91
96
|
let params = request.params;
|
|
92
97
|
if (request.method === SESSION_NEW_METHOD) {
|
|
93
98
|
params = rewriteMcpServers(rewriteModeFields(params));
|
|
99
|
+
await this.#forwardSessionNew(request, params);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
else if (request.method === SESSION_LOAD_METHOD ||
|
|
103
|
+
request.method === SESSION_RESUME_METHOD) {
|
|
104
|
+
const sessionId = extractSessionId(params);
|
|
105
|
+
const cwd = extractCwd(params);
|
|
106
|
+
if (sessionId && cwd) {
|
|
107
|
+
this.#sessionCwds.set(sessionId, cwd);
|
|
108
|
+
}
|
|
94
109
|
}
|
|
95
110
|
else if (request.method === SESSION_SET_MODE_METHOD || request.method === SESSION_SET_CONFIG_METHOD) {
|
|
96
111
|
params = rewriteModeFields(params);
|
|
@@ -103,6 +118,23 @@ export class OfficialKernelProxy {
|
|
|
103
118
|
this.#track(request.id, request.method, params);
|
|
104
119
|
this.#writeChild({ ...request, jsonrpc: "2.0", params });
|
|
105
120
|
}
|
|
121
|
+
// Early session updates have no request id, so keep only one unbound cwd in flight.
|
|
122
|
+
async #forwardSessionNew(request, params) {
|
|
123
|
+
const previous = this.#sessionNewTail;
|
|
124
|
+
let release;
|
|
125
|
+
this.#sessionNewTail = new Promise((resolve) => {
|
|
126
|
+
release = resolve;
|
|
127
|
+
});
|
|
128
|
+
await previous;
|
|
129
|
+
try {
|
|
130
|
+
const response = this.#track(request.id, request.method, params);
|
|
131
|
+
this.#writeChild({ ...request, jsonrpc: "2.0", params });
|
|
132
|
+
await response;
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
release();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
106
138
|
async #handlePrompt(request, params) {
|
|
107
139
|
const sessionId = extractSessionId(params);
|
|
108
140
|
const promptText = extractPromptText(params) || "prompt";
|
|
@@ -152,6 +184,7 @@ export class OfficialKernelProxy {
|
|
|
152
184
|
this.#pending.set(id, {
|
|
153
185
|
method,
|
|
154
186
|
sessionId: extractSessionId(params),
|
|
187
|
+
cwd: extractCwd(params),
|
|
155
188
|
sawVisibleOutput: false,
|
|
156
189
|
resolve
|
|
157
190
|
});
|
|
@@ -168,6 +201,30 @@ export class OfficialKernelProxy {
|
|
|
168
201
|
}
|
|
169
202
|
}
|
|
170
203
|
}
|
|
204
|
+
const params = message.params;
|
|
205
|
+
if (params?.update?.sessionUpdate === "available_commands_update") {
|
|
206
|
+
let cwd = sessionId ? this.#sessionCwds.get(sessionId) : undefined;
|
|
207
|
+
if (!cwd) {
|
|
208
|
+
const pendingSessionNews = Array.from(this.#pending.values()).filter((pending) => pending.method === SESSION_NEW_METHOD && pending.cwd !== undefined);
|
|
209
|
+
if (pendingSessionNews.length === 1) {
|
|
210
|
+
cwd = pendingSessionNews[0].cwd;
|
|
211
|
+
if (sessionId) {
|
|
212
|
+
this.#sessionCwds.set(sessionId, cwd);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const augmented = augmentAvailableCommands(params.update.availableCommands, cwd);
|
|
217
|
+
message = {
|
|
218
|
+
...message,
|
|
219
|
+
params: {
|
|
220
|
+
...params,
|
|
221
|
+
update: {
|
|
222
|
+
...params.update,
|
|
223
|
+
availableCommands: augmented
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
171
228
|
this.#writeClient(message);
|
|
172
229
|
return;
|
|
173
230
|
}
|
|
@@ -182,6 +239,15 @@ export class OfficialKernelProxy {
|
|
|
182
239
|
if (pending.method === INITIALIZE_METHOD && isJsonRpcSuccess(message)) {
|
|
183
240
|
outbound = { ...message, result: overlayProductIdentity(message.result, this.#version) };
|
|
184
241
|
}
|
|
242
|
+
else if ((pending.method === SESSION_NEW_METHOD ||
|
|
243
|
+
pending.method === SESSION_LOAD_METHOD ||
|
|
244
|
+
pending.method === SESSION_RESUME_METHOD) &&
|
|
245
|
+
isJsonRpcSuccess(message)) {
|
|
246
|
+
const sessionId = extractSessionId(message.result) ?? pending.sessionId;
|
|
247
|
+
if (sessionId && pending.cwd) {
|
|
248
|
+
this.#sessionCwds.set(sessionId, pending.cwd);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
185
251
|
else if (pending.method === SESSION_PROMPT_METHOD &&
|
|
186
252
|
isJsonRpcSuccess(message) &&
|
|
187
253
|
shouldRejectBlankTurn(message.result, pending.sawVisibleOutput)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/proxy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AvailableCommand {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseFrontmatter(content: string): {
|
|
6
|
+
name?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
userInvocable?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function resolveSkillRoots(cwd?: string): string[];
|
|
11
|
+
export declare function discoverSkillCommands(cwd?: string): AvailableCommand[];
|
|
12
|
+
export declare function augmentAvailableCommands(existingCommands: AvailableCommand[] | undefined, cwd?: string): AvailableCommand[];
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
function parseYamlScalar(raw) {
|
|
5
|
+
const trimmed = raw.trim();
|
|
6
|
+
if (trimmed.length === 0)
|
|
7
|
+
return "";
|
|
8
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length >= 2) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(trimmed);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return trimmed
|
|
14
|
+
.slice(1, -1)
|
|
15
|
+
.replace(/\\"/g, '"')
|
|
16
|
+
.replace(/\\\\/g, "\\")
|
|
17
|
+
.replace(/\\n/g, "\n")
|
|
18
|
+
.replace(/\\r/g, "\r")
|
|
19
|
+
.replace(/\\t/g, "\t");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2) {
|
|
23
|
+
return trimmed.slice(1, -1).replace(/''/g, "'");
|
|
24
|
+
}
|
|
25
|
+
const commentIdx = trimmed.search(/\s+#/);
|
|
26
|
+
const withoutComment = commentIdx !== -1 ? trimmed.slice(0, commentIdx).trim() : trimmed;
|
|
27
|
+
return withoutComment;
|
|
28
|
+
}
|
|
29
|
+
function parseYamlBoolean(raw, defaultValue = true) {
|
|
30
|
+
if (raw === undefined)
|
|
31
|
+
return defaultValue;
|
|
32
|
+
const scalar = parseYamlScalar(raw).toLowerCase();
|
|
33
|
+
if (scalar === "false" || scalar === "no" || scalar === "off" || scalar === "0") {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (scalar === "true" || scalar === "yes" || scalar === "on" || scalar === "1") {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return defaultValue;
|
|
40
|
+
}
|
|
41
|
+
export function parseFrontmatter(content) {
|
|
42
|
+
if (!content.startsWith("---"))
|
|
43
|
+
return {};
|
|
44
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n(?:---|\.\.\.)(?:\r?\n|$)/);
|
|
45
|
+
if (!match)
|
|
46
|
+
return {};
|
|
47
|
+
const frontmatter = match[1];
|
|
48
|
+
const lines = frontmatter.split(/\r?\n/);
|
|
49
|
+
let name;
|
|
50
|
+
let description;
|
|
51
|
+
let userInvocable;
|
|
52
|
+
for (let i = 0; i < lines.length; i++) {
|
|
53
|
+
const line = lines[i];
|
|
54
|
+
const nameMatch = line.match(/^name:\s*(.*)$/);
|
|
55
|
+
if (nameMatch) {
|
|
56
|
+
name = parseYamlScalar(nameMatch[1]);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const invocableMatch = line.match(/^(?:user-invocable|user_invocable):\s*(.*)$/);
|
|
60
|
+
if (invocableMatch) {
|
|
61
|
+
userInvocable = parseYamlBoolean(invocableMatch[1], true);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const descMatch = line.match(/^description:\s*(.*)$/);
|
|
65
|
+
if (descMatch) {
|
|
66
|
+
const rest = descMatch[1].trim();
|
|
67
|
+
if (rest === ">" || rest === ">-" || rest === "|" || rest === "|-") {
|
|
68
|
+
const isFolded = rest.startsWith(">");
|
|
69
|
+
const blockLines = [];
|
|
70
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
71
|
+
if (/^\s+/.test(lines[j]) || lines[j].trim().length === 0) {
|
|
72
|
+
blockLines.push(lines[j].trim());
|
|
73
|
+
i = j;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (isFolded) {
|
|
80
|
+
description = blockLines.filter((l) => l.length > 0).join(" ");
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
description = blockLines.join("\n").trim();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
description = parseYamlScalar(rest);
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { name, description, userInvocable };
|
|
93
|
+
}
|
|
94
|
+
export function resolveSkillRoots(cwd) {
|
|
95
|
+
const roots = new Set();
|
|
96
|
+
const home = homedir();
|
|
97
|
+
const readSkillsJson = (filePath, baseDir) => {
|
|
98
|
+
if (!existsSync(filePath))
|
|
99
|
+
return;
|
|
100
|
+
try {
|
|
101
|
+
const parsed = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
102
|
+
if (Array.isArray(parsed.entries)) {
|
|
103
|
+
for (const entry of parsed.entries) {
|
|
104
|
+
if (entry && typeof entry.path === "string" && entry.path.trim().length > 0) {
|
|
105
|
+
const trimmed = entry.path.trim();
|
|
106
|
+
let resolved;
|
|
107
|
+
if (trimmed.startsWith("/")) {
|
|
108
|
+
resolved = trimmed;
|
|
109
|
+
}
|
|
110
|
+
else if (trimmed.startsWith("~/")) {
|
|
111
|
+
resolved = path.join(home, trimmed.slice(2));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
resolved = path.resolve(baseDir, trimmed);
|
|
115
|
+
}
|
|
116
|
+
if (existsSync(resolved)) {
|
|
117
|
+
roots.add(resolved);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Ignore JSON parse errors
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
// 1. Workspace declared configs in skills.json
|
|
128
|
+
if (cwd && existsSync(cwd)) {
|
|
129
|
+
readSkillsJson(path.join(cwd, ".agents/skills.json"), cwd);
|
|
130
|
+
readSkillsJson(path.join(cwd, "skills.json"), cwd);
|
|
131
|
+
readSkillsJson(path.join(cwd, ".codex/skills.json"), cwd);
|
|
132
|
+
readSkillsJson(path.join(cwd, ".gemini/config/skills.json"), cwd);
|
|
133
|
+
}
|
|
134
|
+
// 2. Workspace default skill directories
|
|
135
|
+
if (cwd && existsSync(cwd)) {
|
|
136
|
+
const wsDefaults = [
|
|
137
|
+
path.join(cwd, ".agents/skills"),
|
|
138
|
+
path.join(cwd, ".codex/skills"),
|
|
139
|
+
path.join(cwd, "skills")
|
|
140
|
+
];
|
|
141
|
+
for (const dir of wsDefaults) {
|
|
142
|
+
if (existsSync(dir))
|
|
143
|
+
roots.add(dir);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 3. Global declared configs in skills.json
|
|
147
|
+
readSkillsJson(path.join(home, ".gemini/config/skills.json"), home);
|
|
148
|
+
readSkillsJson(path.join(home, ".agents/skills.json"), home);
|
|
149
|
+
readSkillsJson(path.join(home, ".codex/skills.json"), home);
|
|
150
|
+
// 4. Global default skill directories
|
|
151
|
+
const globalDefaults = [
|
|
152
|
+
path.join(home, ".gemini/config/skills"),
|
|
153
|
+
path.join(home, ".agents/skills"),
|
|
154
|
+
path.join(home, ".codex/skills")
|
|
155
|
+
];
|
|
156
|
+
for (const dir of globalDefaults) {
|
|
157
|
+
if (existsSync(dir))
|
|
158
|
+
roots.add(dir);
|
|
159
|
+
}
|
|
160
|
+
return Array.from(roots);
|
|
161
|
+
}
|
|
162
|
+
export function discoverSkillCommands(cwd) {
|
|
163
|
+
const roots = resolveSkillRoots(cwd);
|
|
164
|
+
const commands = new Map();
|
|
165
|
+
for (const root of roots) {
|
|
166
|
+
try {
|
|
167
|
+
const entries = readdirSync(root, { withFileTypes: true });
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (entry.isDirectory() || entry.isSymbolicLink()) {
|
|
170
|
+
const skillDir = path.join(root, entry.name);
|
|
171
|
+
const skillFile = path.join(skillDir, "SKILL.md");
|
|
172
|
+
if (existsSync(skillFile)) {
|
|
173
|
+
try {
|
|
174
|
+
const content = readFileSync(skillFile, "utf-8");
|
|
175
|
+
const { name, description, userInvocable } = parseFrontmatter(content);
|
|
176
|
+
if (userInvocable === false) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const commandName = name && name.length > 0 ? name : entry.name;
|
|
180
|
+
if (!commands.has(commandName)) {
|
|
181
|
+
commands.set(commandName, {
|
|
182
|
+
name: commandName,
|
|
183
|
+
description: description && description.length > 0
|
|
184
|
+
? description
|
|
185
|
+
: `Skill: ${commandName}`
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Ignore file read errors
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Ignore readdir errors
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return Array.from(commands.values());
|
|
201
|
+
}
|
|
202
|
+
export function augmentAvailableCommands(existingCommands, cwd) {
|
|
203
|
+
const result = new Map();
|
|
204
|
+
if (Array.isArray(existingCommands)) {
|
|
205
|
+
for (const cmd of existingCommands) {
|
|
206
|
+
if (cmd && typeof cmd.name === "string") {
|
|
207
|
+
result.set(cmd.name, cmd);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const skills = discoverSkillCommands(cwd);
|
|
212
|
+
for (const skill of skills) {
|
|
213
|
+
if (!result.has(skill.name)) {
|
|
214
|
+
result.set(skill.name, skill);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return Array.from(result.values());
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=skill-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/skill-commands.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED