oh-my-opencode-cohub 1.0.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/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/cli/config-io.d.ts +21 -0
- package/dist/cli/config-io.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +211 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +745 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/chinese.d.ts +2 -0
- package/dist/instructions/chinese.d.ts.map +1 -0
- package/dist/instructions/chinese.js +9 -0
- package/dist/instructions/chinese.js.map +1 -0
- package/dist/prompts/council.d.ts +2 -0
- package/dist/prompts/council.d.ts.map +1 -0
- package/dist/prompts/council.js +63 -0
- package/dist/prompts/council.js.map +1 -0
- package/dist/prompts/designer.d.ts +2 -0
- package/dist/prompts/designer.d.ts.map +1 -0
- package/dist/prompts/designer.js +66 -0
- package/dist/prompts/designer.js.map +1 -0
- package/dist/prompts/explorer.d.ts +2 -0
- package/dist/prompts/explorer.d.ts.map +1 -0
- package/dist/prompts/explorer.js +37 -0
- package/dist/prompts/explorer.js.map +1 -0
- package/dist/prompts/fixer.d.ts +2 -0
- package/dist/prompts/fixer.d.ts.map +1 -0
- package/dist/prompts/fixer.js +52 -0
- package/dist/prompts/fixer.js.map +1 -0
- package/dist/prompts/librarian.d.ts +2 -0
- package/dist/prompts/librarian.d.ts.map +1 -0
- package/dist/prompts/librarian.js +29 -0
- package/dist/prompts/librarian.js.map +1 -0
- package/dist/prompts/observer.d.ts +2 -0
- package/dist/prompts/observer.d.ts.map +1 -0
- package/dist/prompts/observer.js +26 -0
- package/dist/prompts/observer.js.map +1 -0
- package/dist/prompts/oracle.d.ts +2 -0
- package/dist/prompts/oracle.d.ts.map +1 -0
- package/dist/prompts/oracle.js +31 -0
- package/dist/prompts/oracle.js.map +1 -0
- package/dist/prompts/orchestrator.d.ts +2 -0
- package/dist/prompts/orchestrator.d.ts.map +1 -0
- package/dist/prompts/orchestrator.js +239 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/prompts/planner.d.ts +2 -0
- package/dist/prompts/planner.d.ts.map +1 -0
- package/dist/prompts/planner.js +12 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/rule-app.d.ts +2 -0
- package/dist/prompts/rule-app.d.ts.map +1 -0
- package/dist/prompts/rule-app.js +6 -0
- package/dist/prompts/rule-app.js.map +1 -0
- package/dist/prompts/rule-project.d.ts +2 -0
- package/dist/prompts/rule-project.d.ts.map +1 -0
- package/dist/prompts/rule-project.js +6 -0
- package/dist/prompts/rule-project.js.map +1 -0
- package/dist/prompts/rule-user.d.ts +2 -0
- package/dist/prompts/rule-user.d.ts.map +1 -0
- package/dist/prompts/rule-user.js +6 -0
- package/dist/prompts/rule-user.js.map +1 -0
- package/dist/task-manager/tracker.d.ts +36 -0
- package/dist/task-manager/tracker.d.ts.map +1 -0
- package/dist/task-manager/tracker.js +117 -0
- package/dist/task-manager/tracker.js.map +1 -0
- package/dist/task-manager/types.d.ts +18 -0
- package/dist/task-manager/types.d.ts.map +1 -0
- package/dist/task-manager/types.js +2 -0
- package/dist/task-manager/types.js.map +1 -0
- package/dist/tui.d.ts +4 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +127 -0
- package/package.json +53 -0
package/dist/tui.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// src/tui.ts
|
|
2
|
+
import { jsx } from "@opentui/solid/jsx-runtime";
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import * as os from "node:os";
|
|
6
|
+
var AGENTS = [
|
|
7
|
+
{ name: "co-orchestrator", model: "deepseek-v4-pro", provider: "deepseek", desc: "纯调度者" },
|
|
8
|
+
{ name: "co-oracle", model: "deepseek-v4-pro", provider: "deepseek", desc: "战略顾问", variant: "max" },
|
|
9
|
+
{ name: "co-librarian", model: "deepseek-v4-flash", provider: "deepseek", desc: "研究员" },
|
|
10
|
+
{ name: "co-explorer", model: "deepseek-v4-flash", provider: "deepseek", desc: "代码探索者" },
|
|
11
|
+
{ name: "co-designer", model: "MiniMax-M3", provider: "minimax", desc: "设计师" },
|
|
12
|
+
{ name: "co-fixer", model: "deepseek-v4-flash", provider: "deepseek", desc: "执行者", variant: "high" },
|
|
13
|
+
{ name: "co-observer", model: "gpt-5.5", provider: "codermxtest", desc: "观察者" },
|
|
14
|
+
{ name: "co-council", model: "deepseek-v4-pro", provider: "deepseek", desc: "多模型共识", variant: "high" },
|
|
15
|
+
{ name: "co-rule-user", model: "deepseek-v4-flash", provider: "deepseek", desc: "用户规范分析" },
|
|
16
|
+
{ name: "co-rule-project", model: "deepseek-v4-flash", provider: "deepseek", desc: "项目规范分析" },
|
|
17
|
+
{ name: "co-rule-app", model: "deepseek-v4-flash", provider: "deepseek", desc: "应用规则分析" },
|
|
18
|
+
{ name: "co-planner", model: "deepseek-v4-pro", provider: "deepseek", desc: "方案制定" }
|
|
19
|
+
];
|
|
20
|
+
var STATE_FILE = path.join(os.homedir(), ".local", "share", "opencode", "storage", "oh-my-opencode-cohub", "tracker-state.json");
|
|
21
|
+
var SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
22
|
+
function readState() {
|
|
23
|
+
try {
|
|
24
|
+
if (!fs.existsSync(STATE_FILE))
|
|
25
|
+
return null;
|
|
26
|
+
return JSON.parse(fs.readFileSync(STATE_FILE, "utf-8"));
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
var plugin = {
|
|
32
|
+
id: "oh-my-opencode-cohub:tui",
|
|
33
|
+
tui: async (api, _options) => {
|
|
34
|
+
const theme = api.theme.current;
|
|
35
|
+
let spinnerIndex = 0;
|
|
36
|
+
let state = readState();
|
|
37
|
+
const timer = setInterval(() => {
|
|
38
|
+
state = readState();
|
|
39
|
+
spinnerIndex = (spinnerIndex + 1) % SPINNER_FRAMES.length;
|
|
40
|
+
api.renderer.requestRender();
|
|
41
|
+
}, 250);
|
|
42
|
+
api.slots.register({
|
|
43
|
+
order: 800,
|
|
44
|
+
slots: {
|
|
45
|
+
sidebar_content() {
|
|
46
|
+
const runningSet = new Set(state?.runningAgents ?? []);
|
|
47
|
+
const runningCount = state?.runningCount ?? 0;
|
|
48
|
+
const spinner = SPINNER_FRAMES[spinnerIndex];
|
|
49
|
+
return jsx("box", {
|
|
50
|
+
width: "100%",
|
|
51
|
+
flexDirection: "column",
|
|
52
|
+
padding: { top: 1, bottom: 1, left: 1, right: 1 },
|
|
53
|
+
children: [
|
|
54
|
+
jsx("box", {
|
|
55
|
+
width: "100%",
|
|
56
|
+
flexDirection: "row",
|
|
57
|
+
justifyContent: "space-between",
|
|
58
|
+
children: [
|
|
59
|
+
jsx("box", {
|
|
60
|
+
bg: theme.backgroundPanel,
|
|
61
|
+
border: { type: "single" },
|
|
62
|
+
borderColor: theme.accent,
|
|
63
|
+
padding: { left: 1, right: 1 },
|
|
64
|
+
children: jsx("text", { fg: theme.accent, bold: true, children: "CoHub" })
|
|
65
|
+
}),
|
|
66
|
+
jsx("text", { fg: theme.textMuted, dim: true, children: "v1.0" })
|
|
67
|
+
]
|
|
68
|
+
}),
|
|
69
|
+
jsx("box", { height: 1 }),
|
|
70
|
+
jsx("text", { fg: theme.text, bold: true, children: "Agents" }),
|
|
71
|
+
...AGENTS.map((a) => {
|
|
72
|
+
const isRunning = runningSet.has(a.name);
|
|
73
|
+
return jsx("box", {
|
|
74
|
+
width: "100%",
|
|
75
|
+
flexDirection: "column",
|
|
76
|
+
padding: { left: 1 },
|
|
77
|
+
children: [
|
|
78
|
+
jsx("box", {
|
|
79
|
+
flexDirection: "row",
|
|
80
|
+
children: [
|
|
81
|
+
jsx("text", { fg: isRunning ? theme.accent : theme.text, bold: isRunning, children: a.name }),
|
|
82
|
+
isRunning ? jsx("text", { fg: theme.accent, children: ` ${spinner}` }) : null
|
|
83
|
+
]
|
|
84
|
+
}),
|
|
85
|
+
jsx("box", {
|
|
86
|
+
flexDirection: "row",
|
|
87
|
+
padding: { left: 2 },
|
|
88
|
+
children: [
|
|
89
|
+
jsx("text", { fg: theme.textMuted, width: "30%", dim: true, children: "provider" }),
|
|
90
|
+
jsx("text", { fg: theme.textMuted, dim: true, children: a.provider })
|
|
91
|
+
]
|
|
92
|
+
}),
|
|
93
|
+
jsx("box", {
|
|
94
|
+
flexDirection: "row",
|
|
95
|
+
padding: { left: 2 },
|
|
96
|
+
children: [
|
|
97
|
+
jsx("text", { fg: theme.textMuted, width: "30%", dim: true, children: "model" }),
|
|
98
|
+
jsx("text", { fg: theme.textMuted, dim: true, children: a.model })
|
|
99
|
+
]
|
|
100
|
+
}),
|
|
101
|
+
a.variant ? jsx("box", {
|
|
102
|
+
flexDirection: "row",
|
|
103
|
+
padding: { left: 2 },
|
|
104
|
+
children: [
|
|
105
|
+
jsx("text", { fg: theme.textMuted, width: "30%", dim: true, children: "variant" }),
|
|
106
|
+
jsx("text", { fg: theme.textMuted, dim: true, children: a.variant })
|
|
107
|
+
]
|
|
108
|
+
}) : null
|
|
109
|
+
]
|
|
110
|
+
});
|
|
111
|
+
}),
|
|
112
|
+
jsx("box", { height: 1 }),
|
|
113
|
+
runningCount > 0 ? jsx("text", { fg: theme.accent, children: `${spinner} ${runningCount} 任务运行中` }) : jsx("text", { fg: theme.success, children: "✓ 已激活 · 纯调度模式" })
|
|
114
|
+
]
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
api.lifecycle.onDispose(() => {
|
|
120
|
+
clearInterval(timer);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var tui_default = plugin;
|
|
125
|
+
export {
|
|
126
|
+
tui_default as default
|
|
127
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "oh-my-opencode-cohub",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "OpenCode 中文智能体编排插件 CoHub - 纯调度模式 / 全中文提示词 / 规范分析代理 / 方案制定代理 / 独立运行",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"oh-my-opencode-cohub": "./dist/cli/index.js"
|
|
9
|
+
},
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./tui": {
|
|
17
|
+
"import": "./dist/tui.js",
|
|
18
|
+
"types": "./dist/tui.d.ts"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "bun build src/index.ts src/tui.ts --outdir dist --target node --format esm --external @opencode-ai/plugin --external @opencode-ai/plugin/* --external @opencode-ai/sdk --external @opencode-ai/sdk/* --external @opentui/core --external @opentui/solid --external zod && bun build src/cli/index.ts --outdir dist/cli --target node --format esm && tsc --emitDeclarationOnly",
|
|
26
|
+
"prepublishOnly": "npm run build"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"opencode",
|
|
30
|
+
"plugin",
|
|
31
|
+
"chinese",
|
|
32
|
+
"agent",
|
|
33
|
+
"orchestra",
|
|
34
|
+
"orchestrator"
|
|
35
|
+
],
|
|
36
|
+
"author": "",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@opencode-ai/plugin": "^1.17.0",
|
|
40
|
+
"@opencode-ai/sdk": "^1.3.17"
|
|
41
|
+
},
|
|
42
|
+
"optionalDependencies": {
|
|
43
|
+
"@opentui/solid": "^0.4.3",
|
|
44
|
+
"@opentui/core": "^0.4.3"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^26.1.1",
|
|
48
|
+
"typescript": "^5.4.0"
|
|
49
|
+
},
|
|
50
|
+
"opencode": {
|
|
51
|
+
"plugin": true
|
|
52
|
+
}
|
|
53
|
+
}
|