oceanbus 0.13.1 → 0.13.3
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/assets/CLAUDE.md +126 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +11 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/setup-cc.d.ts +3 -0
- package/dist/cli/commands/setup-cc.d.ts.map +1 -0
- package/dist/cli/commands/setup-cc.js +79 -0
- package/dist/cli/commands/setup-cc.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup-rules.d.ts +3 -0
- package/dist/cli/setup-rules.d.ts.map +1 -0
- package/dist/cli/setup-rules.js +83 -0
- package/dist/cli/setup-rules.js.map +1 -0
- package/package.json +2 -1
package/assets/CLAUDE.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# OceanBus Agent 启动与运维规范
|
|
2
|
+
|
|
3
|
+
**触发**:用户在 CC 窗口粘贴 `npx oceanbus@latest start --peer <uuid> --gateway-url <url>`
|
|
4
|
+
|
|
5
|
+
**关键规则:CC AI 必须用 Monitor 启动 Agent,绝不能直接运行此命令(会阻塞)。**
|
|
6
|
+
|
|
7
|
+
**核心设计**:通过读取终端标签名作为 Agent 窗口名,确保 H5 Board 上显示的名称与 CC 终端标签一致。
|
|
8
|
+
|
|
9
|
+
**步骤**(不跳步,顺序执行):
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
1. 识别命令并提取参数
|
|
13
|
+
→ 用户粘贴的命令包含 "npx oceanbus" 和 "start"
|
|
14
|
+
→ CC AI 自动判断:这是 OceanBus Agent 启动命令
|
|
15
|
+
→ 提取关键参数:
|
|
16
|
+
PEER_UUID = --peer 的值(Board 的 H5 openid,UUID 格式)
|
|
17
|
+
GW_URL = --gateway-url 的值(默认 http://127.0.0.1:3456)
|
|
18
|
+
|
|
19
|
+
2. 读取终端标题或文件夹名称(best-effort)
|
|
20
|
+
→ PowerShell: [System.Console]::Title
|
|
21
|
+
→ macOS/Linux等无法读取终端标题的环境: 读取当前文件夹名称
|
|
22
|
+
→ ⚠️ 注意:CC 工具上下文中的 PowerShell 是独立进程,其 Console Title
|
|
23
|
+
可能不等于用户终端标签。此步骤仅作为检测尝试。
|
|
24
|
+
→ 得到原始值,例如 "⠐ wechat-board-agent-registry" 或当前文件夹名称
|
|
25
|
+
|
|
26
|
+
3. 清洗标题 → 直接使用,不问用户
|
|
27
|
+
→ 去掉 spinner/emoji 前缀:⠐ ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏ ✳ ⣾ ⣽ ⣻ ⢿ ⡿ ⣟ ⣯ ⣷ 等
|
|
28
|
+
→ trim 首尾空白
|
|
29
|
+
→ 如果洗出来为空 → 不注入 --name(agent.js 自动从目录名-PID 生成)
|
|
30
|
+
→ 不为空 → 直接拼入 --name,不询问用户确认
|
|
31
|
+
|
|
32
|
+
4. Monitor 启动 Agent(persistent: true)
|
|
33
|
+
→ 使用通用的跨平台命令直接运行:
|
|
34
|
+
npx oceanbus@latest start --peer <PEER_UUID> --gateway-url <GW_URL> --name "<窗口名>"
|
|
35
|
+
→ 如果用户命令中包含 --temp-identity,透传该标志:
|
|
36
|
+
npx oceanbus@latest start --peer ... --gateway-url ... --name "..." --temp-identity
|
|
37
|
+
→ --temp-identity 使当前窗口使用独立的临时 OB 身份(仅存内存,不写磁盘),不同窗口身份隔离
|
|
38
|
+
→ --name 指定时 agent.js 直接使用(最高优先级)
|
|
39
|
+
→ OB announce → Cloud → Board 出现窗口
|
|
40
|
+
|
|
41
|
+
5. 确认
|
|
42
|
+
→ Board 上出现新窗口 ●在线
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**标题清洗详情**:
|
|
46
|
+
|
|
47
|
+
| 输入 | 输出 |
|
|
48
|
+
|------|------|
|
|
49
|
+
| `⠐ Run oceanbus start command` | `Run oceanbus start command` |
|
|
50
|
+
| `✳ Debugging agent` | `Debugging agent` |
|
|
51
|
+
| `PowerShell 7` | `PowerShell 7` |
|
|
52
|
+
|
|
53
|
+
**边界处理**:
|
|
54
|
+
|
|
55
|
+
| 场景 | 处理 |
|
|
56
|
+
|------|------|
|
|
57
|
+
| 标题为空/纯 spinner | 询问用户输入窗口名 |
|
|
58
|
+
| 标题与终端标签不一致 | 用户可纠正(步骤 4) |
|
|
59
|
+
| 标题含特殊字符(`/` `:` 等) | agent.js 内 slugify 过滤,只留中文+字母+数字+连字符 |
|
|
60
|
+
| 标题过长 | slugify 截断到 20 字符;`--name` 原值不截断,仅路由前缀截断 |
|
|
61
|
+
| 两窗口同名 | agent.js 自动加 `-2` 后缀 |
|
|
62
|
+
| 无法自动获取名称的平台 | 直接询问用户 |
|
|
63
|
+
| 用户不回复名称确认 | 回退 agent.js 目录名-PID |
|
|
64
|
+
|
|
65
|
+
**数据流**:
|
|
66
|
+
```
|
|
67
|
+
终端标题(尝试读取) → 清洗 → 用户确认/纠正 → --name 注入 → agent.js
|
|
68
|
+
→ OB announce(agent_name) → Gateway SSE → H5 Board 呈现
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**用户操作**:复制 → 粘贴 → 完成。CC AI 代劳一切。
|
|
72
|
+
|
|
73
|
+
- 多用户安全:每个 Board 生成唯一 UUID,peers 隔离
|
|
74
|
+
- 非 CC Agent:终端粘贴运行,同样流程(无标题读取,走默认命名)
|
|
75
|
+
|
|
76
|
+
### Board 消息回复(OceanBus Console)
|
|
77
|
+
|
|
78
|
+
**触发**:Monitor 推送 Board 消息事件到 CC 会话。
|
|
79
|
+
|
|
80
|
+
**关键:所有消息统一走 OB。回复使用 reply-ob.cjs 脚本通过 OB 发送,不再走 HTTP。**
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
收到 Board 消息的 Monitor 事件格式(共享身份):
|
|
84
|
+
{"type":"wechat_msg","chat_id":"h5","sender":"h5","text":"消息内容","window":"窗口名","time":"20:25:56","reply_style":"detailed","reply":{"method":"script","script":"<path>","command":"node \"<path>\" --text \"<REPLY_TEXT>\" --h5-openid \"<uuid>\" --window \"<name>\" --cloud-ob-openid \"<o>\" --gateway-url \"<url>\"","args":{...},"note":"..."}}
|
|
85
|
+
|
|
86
|
+
收到 Board 消息的 Monitor 事件格式(临时身份,含 --agent-id/--api-key/--openid):
|
|
87
|
+
{"type":"wechat_msg","chat_id":"h5","sender":"h5","text":"消息内容","window":"窗口名","time":"20:25:56","reply_style":"detailed","reply":{"method":"script","script":"<path>","command":"node \"<path>\" --text \"<REPLY_TEXT>\" --h5-openid \"<uuid>\" --window \"<name>\" --cloud-ob-openid \"<o>\" --gateway-url \"<url>\" --agent-id \"<agent_uuid>\" --api-key \"<key>\" --openid \"<openid>\"","args":{...},"note":"..."}}
|
|
88
|
+
|
|
89
|
+
⚠️ chat_id 和 sender 都是字面量 "h5",不是真实的 H5 openid。
|
|
90
|
+
|
|
91
|
+
回复步骤(不跳步):
|
|
92
|
+
|
|
93
|
+
1. 从 Monitor 事件的 reply 字段提取 command 字符串
|
|
94
|
+
→ 将 command 中的 "<REPLY_TEXT>" 替换为实际回复内容
|
|
95
|
+
→ 注意:回复文本中的双引号需要转义为 \"
|
|
96
|
+
→ 如果 command 中包含 --agent-id/--api-key/--openid,直接使用(无需凭据文件)
|
|
97
|
+
|
|
98
|
+
2. 执行 reply-ob.cjs 脚本
|
|
99
|
+
→ PowerShell 示例(共享身份):
|
|
100
|
+
node "C:\Users\xxx\AppData\Roaming\npm\node_modules\oceanbus\bin\reply-ob.cjs" --text "回复内容" --h5-openid "abc123..." --window "窗口名" --cloud-ob-openid "def456..." --gateway-url "http://127.0.0.1:3456"
|
|
101
|
+
→ PowerShell 示例(临时身份):
|
|
102
|
+
node "C:\Users\xxx\AppData\Roaming\npm\node_modules\oceanbus\bin\reply-ob.cjs" --text "回复内容" --h5-openid "abc123..." --window "窗口名" --cloud-ob-openid "def456..." --gateway-url "http://127.0.0.1:3456" --agent-id "uuid" --api-key "sk_..." --openid "xyz..."
|
|
103
|
+
→ Bash 示例:
|
|
104
|
+
node "/path/to/oceanbus/bin/reply-ob.cjs" --text "回复" --h5-openid "abc123..." --window "窗口名" --cloud-ob-openid "def456..." --gateway-url "http://127.0.0.1:3456"
|
|
105
|
+
|
|
106
|
+
3. 验证
|
|
107
|
+
→ stdout 输出 "OK" 表示成功
|
|
108
|
+
→ Board 上应出现 Agent 回复消息
|
|
109
|
+
→ 如果失败,检查 stderr 输出的错误信息
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**常见错误**:
|
|
113
|
+
|
|
114
|
+
| 错误做法 | 问题 | 正确做法 |
|
|
115
|
+
|---------|------|---------|
|
|
116
|
+
| MCP reply 工具回复 | 走 iLink → 微信,不到 Board | 用 reply-ob.cjs 走 OB |
|
|
117
|
+
| 用旧的 POST /api/reply | 端点已删除,不再可用 | 用 reply-ob.cjs 走 OB |
|
|
118
|
+
| h5_openid = "h5" | 字面量字符串,Cloud 找不到目标 | 用 reply hint 中的 --h5-openid |
|
|
119
|
+
| 忘记 window 参数 | Cloud 不知道消息属于哪个窗口 | 用 reply hint 中的 --window |
|
|
120
|
+
| reply-ob.cjs 找不到 | SDK 版本过旧 | `npm install -g oceanbus@latest` |
|
|
121
|
+
|
|
122
|
+
**数据流(已统一,全部经 OB)**:
|
|
123
|
+
```
|
|
124
|
+
Board(H5) → /api/send → Cloud(3456) → OB L0 → Agent → stdout → Monitor → CC
|
|
125
|
+
CC → reply-ob.cjs → OB L0 → Cloud OB listener → SSE → Board(H5)
|
|
126
|
+
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,eAAO,MAAM,WAAW,EAAE,aAyCzB,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.initCommand = void 0;
|
|
4
4
|
const index_1 = require("../../index");
|
|
5
|
+
const setup_rules_1 = require("../setup-rules");
|
|
5
6
|
exports.initCommand = {
|
|
6
7
|
command: 'init',
|
|
7
8
|
describe: 'Initialize OceanBus identity for this machine',
|
|
@@ -16,6 +17,16 @@ exports.initCommand = {
|
|
|
16
17
|
console.log();
|
|
17
18
|
console.log(` OB 地址: ${addr}`);
|
|
18
19
|
console.log();
|
|
20
|
+
// Auto-inject CC rules so CC AI knows how to handle oceanbus start
|
|
21
|
+
try {
|
|
22
|
+
const target = (0, setup_rules_1.defaultTargetPath)();
|
|
23
|
+
const result = (0, setup_rules_1.appendRules)(target);
|
|
24
|
+
if (result !== 'skipped') {
|
|
25
|
+
console.log(` CC 规则已写入 ${target}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch { /* best-effort */ }
|
|
29
|
+
console.log();
|
|
19
30
|
console.log(' 下一步:');
|
|
20
31
|
console.log(` 1. 打开 OceanBus Console H5`);
|
|
21
32
|
console.log(` 2. 点击「🔗 绑定新 Agent」`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":";;;AACA,uCAA6C;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":";;;AACA,uCAA6C;AAC7C,gDAAgE;AAEnD,QAAA,WAAW,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,+CAA+C;IACzD,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;YAEjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;YAEnC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,mEAAmE;YACnE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAA,+BAAiB,GAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAE7B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,qDAAqD;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-cc.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup-cc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,eAAO,MAAM,cAAc,EAAE,aAqC5B,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.setupCcCommand = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const setup_rules_1 = require("../setup-rules");
|
|
39
|
+
exports.setupCcCommand = {
|
|
40
|
+
command: 'setup-cc',
|
|
41
|
+
describe: 'Inject OceanBus rules into CLAUDE.md so CC AI knows how to handle oceanbus commands',
|
|
42
|
+
builder: (yargs) => yargs
|
|
43
|
+
.option('local', {
|
|
44
|
+
type: 'boolean',
|
|
45
|
+
describe: 'Write to ./CLAUDE.md (current project)',
|
|
46
|
+
})
|
|
47
|
+
.option('path', {
|
|
48
|
+
type: 'string',
|
|
49
|
+
describe: 'Write to a custom CLAUDE.md path',
|
|
50
|
+
}),
|
|
51
|
+
handler: async (argv) => {
|
|
52
|
+
let targetPath;
|
|
53
|
+
if (argv.local)
|
|
54
|
+
targetPath = path.join(process.cwd(), 'CLAUDE.md');
|
|
55
|
+
else if (argv.path)
|
|
56
|
+
targetPath = argv.path;
|
|
57
|
+
else
|
|
58
|
+
targetPath = (0, setup_rules_1.defaultTargetPath)();
|
|
59
|
+
try {
|
|
60
|
+
const result = (0, setup_rules_1.appendRules)(targetPath);
|
|
61
|
+
const labels = {
|
|
62
|
+
created: '已创建',
|
|
63
|
+
updated: '已更新',
|
|
64
|
+
skipped: '已跳过(已存在且无法更新)',
|
|
65
|
+
};
|
|
66
|
+
console.log(`✅ ${labels[result]}: ${targetPath}`);
|
|
67
|
+
if (result === 'updated') {
|
|
68
|
+
console.log(' OceanBus 规则已刷新为最新版本。');
|
|
69
|
+
}
|
|
70
|
+
console.log('');
|
|
71
|
+
console.log(' CC AI 现在会自动按照规则处理 oceanbus start 命令和 Board 消息回复。');
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error('setup-cc 失败:', err.message);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=setup-cc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-cc.js","sourceRoot":"","sources":["../../../src/cli/commands/setup-cc.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,gDAAgE;AAEnD,QAAA,cAAc,GAAkB;IAC3C,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,qFAAqF;IAC/F,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,wCAAwC;KACnD,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,kCAAkC;KAC7C,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;QAC3B,IAAI,UAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK;YAAE,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;aAC9D,IAAI,IAAI,CAAC,IAAI;YAAE,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;;YACtC,UAAU,GAAG,IAAA,+BAAiB,GAAE,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,UAAU,CAAC,CAAC;YACvC,MAAM,MAAM,GAA2B;gBACrC,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,eAAe;aACzB,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,cAAc,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAmBA,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,IAAI,CAyB1D"}
|
package/dist/cli/index.js
CHANGED
|
@@ -21,6 +21,7 @@ const key_revoke_1 = require("./commands/key-revoke");
|
|
|
21
21
|
const add_1 = require("./commands/add");
|
|
22
22
|
const contacts_1 = require("./commands/contacts");
|
|
23
23
|
const introduce_1 = require("./commands/introduce");
|
|
24
|
+
const setup_cc_1 = require("./commands/setup-cc");
|
|
24
25
|
function runCli(argv = process.argv) {
|
|
25
26
|
(0, yargs_1.default)((0, helpers_1.hideBin)(argv))
|
|
26
27
|
.scriptName('oceanbus')
|
|
@@ -37,6 +38,7 @@ function runCli(argv = process.argv) {
|
|
|
37
38
|
.command(add_1.addCommand)
|
|
38
39
|
.command(contacts_1.contactsCommand)
|
|
39
40
|
.command(introduce_1.introduceCommand)
|
|
41
|
+
.command(setup_cc_1.setupCcCommand)
|
|
40
42
|
.command(keygen_1.keygenCommand)
|
|
41
43
|
.command(key_new_1.keyNewCommand)
|
|
42
44
|
.command(key_revoke_1.keyRevokeCommand)
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;AAmBA,wBAyBC;AA5CD,kDAA0B;AAC1B,2CAAwC;AACxC,kDAAsD;AACtD,0CAA8C;AAC9C,4CAAgD;AAChD,8CAAkD;AAClD,8CAAkD;AAClD,sDAAyD;AACzD,0CAA8C;AAC9C,8CAAkD;AAClD,4CAAgD;AAChD,8CAAkD;AAClD,gDAAmD;AACnD,sDAAyD;AACzD,wCAA4C;AAC5C,kDAAsD;AACtD,oDAAwD;AACxD,kDAAqD;AAErD,SAAgB,MAAM,CAAC,OAAiB,OAAO,CAAC,IAAI;IAClD,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,IAAI,CAAC,CAAC;SACjB,UAAU,CAAC,UAAU,CAAC;SACtB,KAAK,CAAC,wBAAwB,CAAC;SAC/B,OAAO,CAAC,0BAAe,CAAC;SACxB,OAAO,CAAC,kBAAW,CAAC;SACpB,OAAO,CAAC,oBAAY,CAAC;SACrB,OAAO,CAAC,sBAAa,CAAC;SACtB,OAAO,CAAC,sBAAa,CAAC;SACtB,OAAO,CAAC,6BAAgB,CAAC;SACzB,OAAO,CAAC,kBAAW,CAAC;SACpB,OAAO,CAAC,sBAAa,CAAC;SACtB,OAAO,CAAC,oBAAY,CAAC;SACrB,OAAO,CAAC,gBAAU,CAAC;SACnB,OAAO,CAAC,0BAAe,CAAC;SACxB,OAAO,CAAC,4BAAgB,CAAC;SACzB,OAAO,CAAC,yBAAc,CAAC;SACvB,OAAO,CAAC,sBAAa,CAAC;SACtB,OAAO,CAAC,uBAAa,CAAC;SACtB,OAAO,CAAC,6BAAgB,CAAC;SACzB,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAC5C,IAAI,EAAE;SACN,OAAO,EAAE;SACT,MAAM,EAAE;SACR,KAAK,EAAE,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-rules.d.ts","sourceRoot":"","sources":["../../src/cli/setup-rules.ts"],"names":[],"mappings":"AA0BA,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAsBjF;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.appendRules = appendRules;
|
|
37
|
+
exports.defaultTargetPath = defaultTargetPath;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const MARKER_START = '<!-- OCEANBUS-SETUP-START -->';
|
|
42
|
+
const MARKER_END = '<!-- OCEANBUS-SETUP-END -->';
|
|
43
|
+
function readRules() {
|
|
44
|
+
const sourcePath = path.join(__dirname, '..', '..', 'assets', 'CLAUDE.md');
|
|
45
|
+
console.log(sourcePath);
|
|
46
|
+
if (!fs.existsSync(sourcePath)) {
|
|
47
|
+
throw new Error(`CLAUDE.md not found at ${sourcePath}`);
|
|
48
|
+
}
|
|
49
|
+
const content = fs.readFileSync(sourcePath, 'utf-8');
|
|
50
|
+
return '\n' + content.trim() + '\n';
|
|
51
|
+
}
|
|
52
|
+
function hasOceanBusSection(content) {
|
|
53
|
+
return content.includes(MARKER_START);
|
|
54
|
+
}
|
|
55
|
+
function ensureDir(filePath) {
|
|
56
|
+
const dir = path.dirname(filePath);
|
|
57
|
+
if (!fs.existsSync(dir))
|
|
58
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
function appendRules(targetPath) {
|
|
61
|
+
ensureDir(targetPath);
|
|
62
|
+
const exists = fs.existsSync(targetPath);
|
|
63
|
+
const content = exists ? fs.readFileSync(targetPath, 'utf-8') : '';
|
|
64
|
+
if (hasOceanBusSection(content)) {
|
|
65
|
+
const startIdx = content.indexOf(MARKER_START);
|
|
66
|
+
const endIdx = content.indexOf(MARKER_END);
|
|
67
|
+
if (startIdx !== -1 && endIdx !== -1) {
|
|
68
|
+
const before = content.slice(0, startIdx);
|
|
69
|
+
const after = content.slice(endIdx + MARKER_END.length);
|
|
70
|
+
const newContent = before + MARKER_START + readRules() + MARKER_END + after;
|
|
71
|
+
fs.writeFileSync(targetPath, newContent, 'utf-8');
|
|
72
|
+
return 'updated';
|
|
73
|
+
}
|
|
74
|
+
return 'skipped';
|
|
75
|
+
}
|
|
76
|
+
const separator = exists && content.length > 0 && !content.endsWith('\n') ? '\n' : '';
|
|
77
|
+
fs.writeFileSync(targetPath, content + separator + MARKER_START + readRules() + MARKER_END + '\n', 'utf-8');
|
|
78
|
+
return exists ? 'updated' : 'created';
|
|
79
|
+
}
|
|
80
|
+
function defaultTargetPath() {
|
|
81
|
+
return path.join(os.homedir(), '.claude', 'CLAUDE.md');
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=setup-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-rules.js","sourceRoot":"","sources":["../../src/cli/setup-rules.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oceanbus",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"description": "OceanBus AI Agent Communication & Trust Infrastructure SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"files": [
|
|
41
41
|
"dist/",
|
|
42
42
|
"bin/",
|
|
43
|
+
"assets/",
|
|
43
44
|
"README.md",
|
|
44
45
|
"LICENSE"
|
|
45
46
|
],
|