@kenkaiiii/gg-boss 4.3.149 → 4.3.151
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 +168 -0
- package/dist/{chunk-ZNVFGIDI.js → chunk-JFMWBELU.js} +28 -7
- package/dist/{chunk-ZNVFGIDI.js.map → chunk-JFMWBELU.js.map} +1 -1
- package/dist/cli.js +250 -60
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
package/README.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>One chat. Many ggcoder workers. The boss runs the room.</strong>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@kenkaiiii/gg-boss"><img src="https://img.shields.io/npm/v/@kenkaiiii/gg-boss?style=for-the-badge" alt="npm version"></a>
|
|
9
|
+
<a href="../../LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
|
|
10
|
+
<a href="https://youtube.com/@kenkaidoesai"><img src="https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white" alt="YouTube"></a>
|
|
11
|
+
<a href="https://skool.com/kenkai"><img src="https://img.shields.io/badge/Skool-Community-7C3AED?style=for-the-badge" alt="Skool"></a>
|
|
12
|
+
<a href="https://github.com/KenKaiii"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white" alt="GitHub"></a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
You talk to the boss. The boss drives the workers — one per project — in parallel. Dispatch work, watch them finish, keep a backlog, swap models on the fly. All from one terminal.
|
|
16
|
+
|
|
17
|
+
Built on [`@kenkaiiii/ggcoder`](../ggcoder/README.md), [`@kenkaiiii/gg-agent`](../gg-agent/README.md) and [`@kenkaiiii/gg-ai`](../gg-ai/README.md). Part of the [GG Framework](../../README.md) monorepo.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 🚀 Run It
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Sign in once with ggcoder — gg-boss reuses the same auth
|
|
25
|
+
npm i -g @kenkaiiii/ggcoder
|
|
26
|
+
ggcoder login
|
|
27
|
+
|
|
28
|
+
# Install the boss
|
|
29
|
+
npm i -g @kenkaiiii/gg-boss
|
|
30
|
+
|
|
31
|
+
# Pick which projects the boss should drive (interactive picker —
|
|
32
|
+
# scans your ggcoder, Claude Code, and Codex session history)
|
|
33
|
+
ggboss link
|
|
34
|
+
|
|
35
|
+
# Start the orchestrator
|
|
36
|
+
ggboss
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Already linked? `ggboss continue` resumes the most recent session. `ggboss --resume <id>` resumes a specific one.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 🪄 How it works
|
|
44
|
+
|
|
45
|
+
You type one prompt. The boss decides which workers to dispatch, in parallel or serial, with `prompt_worker` (fire-and-forget) or by adding to the task plan and calling `dispatch_pending`. Each worker is a full `ggcoder` agent — read, write, edit, bash, grep, find, ls, web fetch, sub-agents — running in its own project directory.
|
|
46
|
+
|
|
47
|
+
When a worker finishes, you get a tight summary back: **Changed**, **Skipped**, **Verified**, **Notes**, and a single-letter **Status** (`DONE` / `UNVERIFIED` / `PARTIAL` / `BLOCKED` / `INFO`). The boss reads that, cross-checks it against the worker's actual tool calls, and either reports back to you or re-prompts to verify, finish, or unblock.
|
|
48
|
+
|
|
49
|
+
A few things make it feel like one conversation instead of N:
|
|
50
|
+
|
|
51
|
+
- **Live worker state** is appended to every event the boss receives. It can never forget that "B is still working" while it's reading "A finished".
|
|
52
|
+
- **Auto-chain.** If the boss leaves a project parked while pending tasks remain, the orchestrator dispatches the next task itself and tells the boss it did so.
|
|
53
|
+
- **Auto-compact.** When the boss's context crosses 80%, it compacts and starts a fresh session file so `ggboss continue` resumes the trimmed history.
|
|
54
|
+
- **Crash-resistant.** Six workers in one process can't take the boss down — uncaught throws and unhandled rejections are logged to `~/.gg/boss/debug.log` and the run loop keeps going.
|
|
55
|
+
- **Audio chimes.** A done sound on each worker finish, an all-clear chime when every worker is idle and the queue is empty.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 🎛 Models
|
|
60
|
+
|
|
61
|
+
Boss and workers run on **different models, on purpose**. Use a strong reasoning model (Opus, GPT-5) up top and a fast cheap model (Sonnet, Haiku) for the workers — or whatever combination fits the work.
|
|
62
|
+
|
|
63
|
+
Defaults: `claude-opus-4-7` for the boss, `claude-sonnet-4-6` for the workers. Anthropic, OpenAI, GLM, and Moonshot are all supported (anything `ggcoder` supports). Swap mid-session with `/model-boss` and `/model-workers` — your choice persists across restarts.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ggboss --boss-model claude-opus-4-7 --worker-model claude-sonnet-4-6
|
|
67
|
+
ggboss --project ../api --project ../web # explicit project list
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## ⌨️ Keybindings
|
|
73
|
+
|
|
74
|
+
| Key | What it does |
|
|
75
|
+
|---|---|
|
|
76
|
+
| <kbd>Tab</kbd> | Cycle the project scope pill (All / per-project) on your next message |
|
|
77
|
+
| <kbd>Shift+Tab</kbd> | Toggle the boss's extended thinking |
|
|
78
|
+
| <kbd>Esc</kbd> | Interrupt the boss mid-turn (workers keep running) |
|
|
79
|
+
| <kbd>Ctrl+T</kbd> | Open the Tasks pane |
|
|
80
|
+
| <kbd>Ctrl+C</kbd> ×2 | Exit gg-boss |
|
|
81
|
+
| <kbd>↑</kbd> / <kbd>↓</kbd> | Recall previous prompts (when input is empty) |
|
|
82
|
+
| <kbd>Enter</kbd> | Send · <kbd>Shift+Enter</kbd> newline · `/` opens the slash menu |
|
|
83
|
+
|
|
84
|
+
Inside the **Tasks pane** (<kbd>Ctrl+T</kbd>):
|
|
85
|
+
|
|
86
|
+
| Key | What it does |
|
|
87
|
+
|---|---|
|
|
88
|
+
| <kbd>↑</kbd> / <kbd>↓</kbd> (or <kbd>k</kbd> / <kbd>j</kbd>) | Navigate tasks |
|
|
89
|
+
| <kbd>Enter</kbd> | Dispatch the selected task to its worker |
|
|
90
|
+
| <kbd>r</kbd> | Run all pending and blocked tasks across idle workers |
|
|
91
|
+
| <kbd>d</kbd> | Delete the selected task |
|
|
92
|
+
| <kbd>Esc</kbd> | Close the pane |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 💬 Slash commands
|
|
97
|
+
|
|
98
|
+
| Command | What it does |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `/help` (`/?`) | Show all commands and keybindings |
|
|
101
|
+
| `/model-boss` | Switch the orchestrator's model |
|
|
102
|
+
| `/model-workers` | Switch every worker's model |
|
|
103
|
+
| `/compact` | Compact the boss's context now |
|
|
104
|
+
| `/clear` | Clear chat history and terminal |
|
|
105
|
+
| `/radio` | Stream a free internet radio station while you work |
|
|
106
|
+
| `/quit` (`/q`, `/exit`) | Exit gg-boss |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 📋 The task plan
|
|
111
|
+
|
|
112
|
+
The boss isn't just a dispatcher — it keeps a persistent backlog. Use it for tracked, reviewable, resumable work.
|
|
113
|
+
|
|
114
|
+
- The boss adds tasks via `add_task(project, title, description, fresh?)`.
|
|
115
|
+
- Tasks live in `~/.gg/boss/tasks.json` and survive restarts.
|
|
116
|
+
- Press <kbd>Ctrl+T</kbd> any time to see the plan, dispatch an item, or delete it.
|
|
117
|
+
- Worker self-reported status (`DONE` / `UNVERIFIED` / `PARTIAL` / `BLOCKED` / `INFO`) auto-updates the task, with the boss free to override based on cross-check.
|
|
118
|
+
- When a project goes idle with pending work in the plan, **auto-chain** picks up the next task without the boss having to remember.
|
|
119
|
+
|
|
120
|
+
Direct dispatch (`prompt_worker`) is for one-shot work. The plan is for batches you want to curate, review, and resume.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 📻 Radio
|
|
125
|
+
|
|
126
|
+
`/radio` streams long-running, royalty-free internet radio while you work — SomaFM Groove Salad, Drone Zone, Radio Paradise Mellow Mix, lofi beats. Pick a station or `Off`. Requires one of `mpv` (recommended), `ffplay`, `mpg123`, or `vlc/cvlc` on your `PATH`.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🗂 Project discovery
|
|
131
|
+
|
|
132
|
+
`ggboss link` is interactive. It scans:
|
|
133
|
+
|
|
134
|
+
- `~/.gg/sessions/` — your existing **ggcoder** projects
|
|
135
|
+
- `~/.claude/projects/` — your **Claude Code** projects (cwds extracted from the JSONL events themselves, not the lossy dir-name encoding)
|
|
136
|
+
- `~/.codex/sessions/` — your **Codex** projects (cwds pulled from session metadata)
|
|
137
|
+
|
|
138
|
+
Sorted most-recent first. Pick a few, save the list, and the boss starts a worker for each one.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 🛟 Auto-update
|
|
143
|
+
|
|
144
|
+
On every launch the boss installs any pending update from the prior run (effective next launch) and schedules a fresh registry check in the background. No prompts, no interruption — you just stay current.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 👥 Community
|
|
149
|
+
|
|
150
|
+
- [YouTube @kenkaidoesai](https://youtube.com/@kenkaidoesai) — tutorials and demos
|
|
151
|
+
- [Skool community](https://skool.com/kenkai) — come hang out
|
|
152
|
+
- [GitHub @KenKaiii](https://github.com/KenKaiii)
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 📄 License
|
|
157
|
+
|
|
158
|
+
MIT
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
<p align="center">
|
|
163
|
+
<strong>Talk to the boss. The workers do the rest.</strong>
|
|
164
|
+
</p>
|
|
165
|
+
|
|
166
|
+
<p align="center">
|
|
167
|
+
<a href="https://www.npmjs.com/package/@kenkaiiii/gg-boss"><img src="https://img.shields.io/badge/Install-npm%20i%20--g%20%40kenkaiiii%2Fgg--boss-blue?style=for-the-badge" alt="Install"></a>
|
|
168
|
+
</p>
|
|
@@ -88190,7 +88190,11 @@ var AssistantMessage = import_react43.default.memo(function AssistantMessage2({
|
|
|
88190
88190
|
const theme = useTheme();
|
|
88191
88191
|
const { columns } = useTerminalSize();
|
|
88192
88192
|
const contentWidth = Math.max(10, columns - PREFIX_WIDTH);
|
|
88193
|
-
|
|
88193
|
+
const trimmedText = text.trim();
|
|
88194
|
+
const hasThinking = showThinking && !!thinking;
|
|
88195
|
+
if (!trimmedText && !hasThinking)
|
|
88196
|
+
return null;
|
|
88197
|
+
return (0, import_jsx_runtime4.jsxs)(Box_default, { flexDirection: "column", marginTop: 1, children: [hasThinking && (0, import_jsx_runtime4.jsx)(ThinkingBlock, { text: thinking, durationMs: thinkingMs }), trimmedText && (0, import_jsx_runtime4.jsxs)(Box_default, { flexDirection: "row", children: [(0, import_jsx_runtime4.jsx)(Box_default, { width: PREFIX_WIDTH, flexShrink: 0, children: (0, import_jsx_runtime4.jsx)(Text, { color: planMode ? theme.planPrimary : theme.primary, children: BLACK_CIRCLE + " " }) }), (0, import_jsx_runtime4.jsx)(Box_default, { flexDirection: "column", flexGrow: 1, width: contentWidth, children: (0, import_jsx_runtime4.jsx)(Markdown, { children: trimmedText }) })] })] });
|
|
88194
88198
|
});
|
|
88195
88199
|
|
|
88196
88200
|
// ../ggcoder/dist/ui/components/ToolExecution.js
|
|
@@ -89079,11 +89083,13 @@ var StreamingArea = (0, import_react56.memo)(function StreamingArea2({ isRunning
|
|
|
89079
89083
|
const { columns } = useTerminalSize();
|
|
89080
89084
|
const contentWidth = Math.max(10, columns - PREFIX_WIDTH2);
|
|
89081
89085
|
const displayText = (0, import_react56.useMemo)(() => streamingText ? stripDoneMarkers(streamingText) : "", [streamingText]);
|
|
89082
|
-
|
|
89086
|
+
const trimmedDisplay = displayText.trim();
|
|
89087
|
+
const hasThinking = showThinking && !!streamingThinking;
|
|
89088
|
+
if (!trimmedDisplay && !hasThinking)
|
|
89083
89089
|
return null;
|
|
89084
|
-
if (!isRunning && !
|
|
89090
|
+
if (!isRunning && !trimmedDisplay)
|
|
89085
89091
|
return null;
|
|
89086
|
-
return (0, import_jsx_runtime17.jsxs)(Box_default, { flexDirection: "column", marginTop: 1, children: [
|
|
89092
|
+
return (0, import_jsx_runtime17.jsxs)(Box_default, { flexDirection: "column", marginTop: 1, children: [hasThinking && (0, import_jsx_runtime17.jsx)(ThinkingBlock, { text: streamingThinking, streaming: true, durationMs: thinkingMs }), trimmedDisplay && (0, import_jsx_runtime17.jsxs)(Box_default, { flexDirection: "row", children: [(0, import_jsx_runtime17.jsx)(Box_default, { width: PREFIX_WIDTH2, flexShrink: 0, children: (0, import_jsx_runtime17.jsx)(Text, { color: planMode ? theme.planPrimary : theme.primary, children: BLACK_CIRCLE + " " }) }), (0, import_jsx_runtime17.jsx)(Box_default, { flexDirection: "column", flexGrow: 1, width: contentWidth, children: (0, import_jsx_runtime17.jsx)(StreamingMarkdown, { width: contentWidth, children: trimmedDisplay }) })] })] });
|
|
89087
89093
|
});
|
|
89088
89094
|
|
|
89089
89095
|
// ../ggcoder/dist/ui/components/ActivityIndicator.js
|
|
@@ -90823,7 +90829,8 @@ var initialState = {
|
|
|
90823
90829
|
workers: [],
|
|
90824
90830
|
pendingUserMessages: 0,
|
|
90825
90831
|
exitPending: false,
|
|
90826
|
-
scope: "all"
|
|
90832
|
+
scope: "all",
|
|
90833
|
+
overlay: null
|
|
90827
90834
|
};
|
|
90828
90835
|
var state = initialState;
|
|
90829
90836
|
var listeners = /* @__PURE__ */ new Set();
|
|
@@ -91291,6 +91298,17 @@ var bossStore = {
|
|
|
91291
91298
|
state = { ...state, scope: next };
|
|
91292
91299
|
notify();
|
|
91293
91300
|
},
|
|
91301
|
+
/**
|
|
91302
|
+
* Set or clear the active overlay. Lives in the store (not React state)
|
|
91303
|
+
* because overlay open/close triggers an Ink unmount/remount to escape
|
|
91304
|
+
* live-area drift — the new mount reads this back to know which overlay
|
|
91305
|
+
* to render. Calling with the same value is a no-op.
|
|
91306
|
+
*/
|
|
91307
|
+
setOverlay(next) {
|
|
91308
|
+
if (state.overlay === next) return;
|
|
91309
|
+
state = { ...state, overlay: next };
|
|
91310
|
+
notify();
|
|
91311
|
+
},
|
|
91294
91312
|
setExitPending(pending) {
|
|
91295
91313
|
if (state.exitPending === pending) return;
|
|
91296
91314
|
state = { ...state, exitPending: pending };
|
|
@@ -91375,7 +91393,10 @@ var bossStore = {
|
|
|
91375
91393
|
retryInfo: null,
|
|
91376
91394
|
compaction: null,
|
|
91377
91395
|
bossInputTokens: 0,
|
|
91378
|
-
runStartMs: null
|
|
91396
|
+
runStartMs: null,
|
|
91397
|
+
// Drop any active overlay so /clear lands on the chat, not back in
|
|
91398
|
+
// the overlay it was invoked from.
|
|
91399
|
+
overlay: null
|
|
91379
91400
|
};
|
|
91380
91401
|
notify();
|
|
91381
91402
|
}
|
|
@@ -93198,4 +93219,4 @@ react/cjs/react-jsx-runtime.development.js:
|
|
|
93198
93219
|
* LICENSE file in the root directory of this source tree.
|
|
93199
93220
|
*)
|
|
93200
93221
|
*/
|
|
93201
|
-
//# sourceMappingURL=chunk-
|
|
93222
|
+
//# sourceMappingURL=chunk-JFMWBELU.js.map
|