@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 ADDED
@@ -0,0 +1,168 @@
1
+ ![gg-boss](screenshots/ggboss.png)
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
- return (0, import_jsx_runtime4.jsxs)(Box_default, { flexDirection: "column", marginTop: 1, children: [showThinking && thinking && (0, import_jsx_runtime4.jsx)(ThinkingBlock, { text: thinking, durationMs: thinkingMs }), text && (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: text.trimStart() }) })] })] });
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
- if (!streamingText && !streamingThinking)
89086
+ const trimmedDisplay = displayText.trim();
89087
+ const hasThinking = showThinking && !!streamingThinking;
89088
+ if (!trimmedDisplay && !hasThinking)
89083
89089
  return null;
89084
- if (!isRunning && !streamingText)
89090
+ if (!isRunning && !trimmedDisplay)
89085
89091
  return null;
89086
- return (0, import_jsx_runtime17.jsxs)(Box_default, { flexDirection: "column", marginTop: 1, children: [showThinking && streamingThinking && (0, import_jsx_runtime17.jsx)(ThinkingBlock, { text: streamingThinking, streaming: true, durationMs: thinkingMs }), displayText && (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: displayText.trimStart() }) })] })] });
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-ZNVFGIDI.js.map
93222
+ //# sourceMappingURL=chunk-JFMWBELU.js.map