@kenkaiiii/gg-boss 4.3.96

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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/banner.d.ts +11 -0
  3. package/dist/banner.d.ts.map +1 -0
  4. package/dist/banner.js +25 -0
  5. package/dist/banner.js.map +1 -0
  6. package/dist/boot-banner.d.ts +15 -0
  7. package/dist/boot-banner.d.ts.map +1 -0
  8. package/dist/boot-banner.js +61 -0
  9. package/dist/boot-banner.js.map +1 -0
  10. package/dist/boss-footer.d.ts +16 -0
  11. package/dist/boss-footer.d.ts.map +1 -0
  12. package/dist/boss-footer.js +60 -0
  13. package/dist/boss-footer.js.map +1 -0
  14. package/dist/boss-store.d.ts +202 -0
  15. package/dist/boss-store.d.ts.map +1 -0
  16. package/dist/boss-store.js +560 -0
  17. package/dist/boss-store.js.map +1 -0
  18. package/dist/boss-system-prompt.d.ts +3 -0
  19. package/dist/boss-system-prompt.d.ts.map +1 -0
  20. package/dist/boss-system-prompt.js +52 -0
  21. package/dist/boss-system-prompt.js.map +1 -0
  22. package/dist/branding.d.ts +18 -0
  23. package/dist/branding.d.ts.map +1 -0
  24. package/dist/branding.js +33 -0
  25. package/dist/branding.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +163 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/discover.d.ts +13 -0
  31. package/dist/discover.d.ts.map +1 -0
  32. package/dist/discover.js +92 -0
  33. package/dist/discover.js.map +1 -0
  34. package/dist/event-queue.d.ts +16 -0
  35. package/dist/event-queue.d.ts.map +1 -0
  36. package/dist/event-queue.js +39 -0
  37. package/dist/event-queue.js.map +1 -0
  38. package/dist/index.d.ts +6 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +5 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/link-command.d.ts +2 -0
  43. package/dist/link-command.d.ts.map +1 -0
  44. package/dist/link-command.js +120 -0
  45. package/dist/link-command.js.map +1 -0
  46. package/dist/links.d.ts +11 -0
  47. package/dist/links.d.ts.map +1 -0
  48. package/dist/links.js +22 -0
  49. package/dist/links.js.map +1 -0
  50. package/dist/orchestrator-app.d.ts +15 -0
  51. package/dist/orchestrator-app.d.ts.map +1 -0
  52. package/dist/orchestrator-app.js +248 -0
  53. package/dist/orchestrator-app.js.map +1 -0
  54. package/dist/orchestrator.d.ts +79 -0
  55. package/dist/orchestrator.d.ts.map +1 -0
  56. package/dist/orchestrator.js +405 -0
  57. package/dist/orchestrator.js.map +1 -0
  58. package/dist/sessions.d.ts +21 -0
  59. package/dist/sessions.d.ts.map +1 -0
  60. package/dist/sessions.js +122 -0
  61. package/dist/sessions.js.map +1 -0
  62. package/dist/slash-commands.d.ts +19 -0
  63. package/dist/slash-commands.d.ts.map +1 -0
  64. package/dist/slash-commands.js +54 -0
  65. package/dist/slash-commands.js.map +1 -0
  66. package/dist/tools.d.ts +10 -0
  67. package/dist/tools.d.ts.map +1 -0
  68. package/dist/tools.js +81 -0
  69. package/dist/tools.js.map +1 -0
  70. package/dist/types.d.ts +32 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/worker.d.ts +40 -0
  75. package/dist/worker.d.ts.map +1 -0
  76. package/dist/worker.js +113 -0
  77. package/dist/worker.js.map +1 -0
  78. package/package.json +47 -0
@@ -0,0 +1,33 @@
1
+ export const VERSION = "0.1.0";
2
+ export const BRAND = "GG Boss";
3
+ export const AUTHOR = "Ken Kai";
4
+ export const LOGO_LINES = [" ▄▀▀▀ ▄▀▀▀", " █ ▀█ █ ▀█", " ▀▄▄▀ ▀▄▄▀"];
5
+ export const LOGO_GAP = " ";
6
+ export const GRADIENT = [
7
+ "#60a5fa",
8
+ "#6da1f9",
9
+ "#7a9df7",
10
+ "#8799f5",
11
+ "#9495f3",
12
+ "#a18ff1",
13
+ "#a78bfa",
14
+ "#a18ff1",
15
+ "#9495f3",
16
+ "#8799f5",
17
+ "#7a9df7",
18
+ "#6da1f9",
19
+ ];
20
+ export const COLORS = {
21
+ primary: "#60a5fa",
22
+ accent: "#a78bfa",
23
+ text: "#e2e8f0",
24
+ textDim: "#6b7280",
25
+ success: "#4ade80",
26
+ warning: "#fbbf24",
27
+ error: "#f87171",
28
+ };
29
+ /** Clear the entire scrollback + visible screen and reset cursor to home. */
30
+ export function clearScreen() {
31
+ process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
32
+ }
33
+ //# sourceMappingURL=branding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAE9B,MAAM,CAAC,MAAM,QAAQ,GAAsB;IACzC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;CACR,CAAC;AAEX,6EAA6E;AAC7E,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC/C,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { GGBoss } from "./orchestrator.js";
5
+ import { loadLinks } from "./links.js";
6
+ import { runLinkCommand } from "./link-command.js";
7
+ import { COLORS, clearScreen } from "./branding.js";
8
+ import { renderBossApp } from "./orchestrator-app.js";
9
+ function parseProjectSpec(raw) {
10
+ const eq = raw.indexOf("=");
11
+ if (eq > 0) {
12
+ const name = raw.slice(0, eq);
13
+ const cwd = path.resolve(raw.slice(eq + 1));
14
+ return { name, cwd };
15
+ }
16
+ const cwd = path.resolve(raw);
17
+ return { name: path.basename(cwd), cwd };
18
+ }
19
+ function parseArgs(argv) {
20
+ const args = {
21
+ bossProvider: "anthropic",
22
+ bossModel: "claude-opus-4-7",
23
+ workerProvider: "anthropic",
24
+ workerModel: "claude-sonnet-4-6",
25
+ projects: [],
26
+ };
27
+ for (let i = 0; i < argv.length; i++) {
28
+ const a = argv[i];
29
+ if (a === "--project" || a === "-p") {
30
+ const v = argv[++i];
31
+ if (!v)
32
+ throw new Error("--project requires a value");
33
+ args.projects.push(parseProjectSpec(v));
34
+ }
35
+ else if (a === "--boss-model") {
36
+ const v = argv[++i];
37
+ if (!v)
38
+ throw new Error("--boss-model requires a value");
39
+ args.bossModel = v;
40
+ }
41
+ else if (a === "--worker-model") {
42
+ const v = argv[++i];
43
+ if (!v)
44
+ throw new Error("--worker-model requires a value");
45
+ args.workerModel = v;
46
+ }
47
+ else if (a === "--resume") {
48
+ const v = argv[++i];
49
+ if (!v)
50
+ throw new Error("--resume requires a session id");
51
+ args.resumeSessionId = v;
52
+ }
53
+ else if (a === "--help" || a === "-h") {
54
+ printHelpAndExit();
55
+ }
56
+ else {
57
+ throw new Error(`Unknown argument: ${a}`);
58
+ }
59
+ }
60
+ return args;
61
+ }
62
+ function printHelpAndExit() {
63
+ const c = (color, text) => chalk.hex(color)(text);
64
+ process.stdout.write("\n" +
65
+ c(COLORS.primary, "GG Boss") +
66
+ c(COLORS.textDim, " — orchestrator that drives multiple ggcoder workers from one chat.\n\n") +
67
+ c(COLORS.text, "Usage\n") +
68
+ " " +
69
+ c(COLORS.accent, "ggboss") +
70
+ c(COLORS.textDim, " start orchestrator using linked projects\n") +
71
+ " " +
72
+ c(COLORS.accent, "ggboss link") +
73
+ c(COLORS.textDim, " pick which projects to link (interactive)\n") +
74
+ " " +
75
+ c(COLORS.accent, "ggboss continue") +
76
+ c(COLORS.textDim, " resume the most recent boss session\n") +
77
+ " " +
78
+ c(COLORS.accent, "ggboss --resume <id>") +
79
+ c(COLORS.textDim, " resume a specific boss session\n") +
80
+ " " +
81
+ c(COLORS.accent, "ggboss --project <spec> [...]") +
82
+ c(COLORS.textDim, " override links with explicit project(s)\n\n") +
83
+ c(COLORS.text, "Options\n") +
84
+ " " +
85
+ c(COLORS.primary, "--project, -p <spec>") +
86
+ c(COLORS.textDim, ' project to manage. spec is "cwd" or "name=cwd". repeatable.\n') +
87
+ " " +
88
+ c(COLORS.primary, "--boss-model <id>") +
89
+ c(COLORS.textDim, " model for the orchestrator (default: claude-opus-4-7)\n") +
90
+ " " +
91
+ c(COLORS.primary, "--worker-model <id>") +
92
+ c(COLORS.textDim, " model for workers (default: claude-sonnet-4-6)\n") +
93
+ " " +
94
+ c(COLORS.primary, "--help, -h") +
95
+ c(COLORS.textDim, " show this help\n\n") +
96
+ c(COLORS.textDim, "Talk to the boss at the prompt. Press ") +
97
+ c(COLORS.accent, "Ctrl+C") +
98
+ c(COLORS.textDim, " twice to exit.\n\n"));
99
+ process.exit(0);
100
+ }
101
+ async function runOrchestrator(args) {
102
+ if (args.projects.length === 0) {
103
+ const links = await loadLinks();
104
+ if (links.projects.length === 0) {
105
+ process.stderr.write("\n" +
106
+ chalk.hex(COLORS.warning)("No linked projects.") +
107
+ chalk.hex(COLORS.textDim)(" Run ") +
108
+ chalk.hex(COLORS.accent)("ggboss link") +
109
+ chalk.hex(COLORS.textDim)(" to choose, or pass ") +
110
+ chalk.hex(COLORS.accent)("--project") +
111
+ chalk.hex(COLORS.textDim)(".\n\n"));
112
+ process.exit(1);
113
+ }
114
+ args.projects = links.projects.map((p) => ({ name: p.name, cwd: p.cwd }));
115
+ }
116
+ clearScreen();
117
+ process.stdout.write(chalk.hex(COLORS.textDim)(" Initializing ") +
118
+ chalk.hex(COLORS.primary)("GG Boss") +
119
+ chalk.hex(COLORS.textDim)(`…\n Spinning up ${args.projects.length} worker${args.projects.length === 1 ? "" : "s"}.\n`));
120
+ const boss = new GGBoss({
121
+ bossProvider: args.bossProvider,
122
+ bossModel: args.bossModel,
123
+ workerProvider: args.workerProvider,
124
+ workerModel: args.workerModel,
125
+ projects: args.projects,
126
+ continueRecent: args.continueRecent,
127
+ resumeSessionId: args.resumeSessionId,
128
+ });
129
+ await boss.initialize();
130
+ clearScreen();
131
+ const ink = renderBossApp({ boss });
132
+ // Don't register process.on("SIGINT") here. Ink puts stdin in raw mode, so
133
+ // Ctrl+C is delivered as a byte (0x03) to InputArea — not as a process
134
+ // signal. Registering SIGINT would race InputArea's onAbort and exit
135
+ // immediately on the first press, breaking the double-press exit flow.
136
+ // Run boss in background; await Ink unmount (triggered by useApp().exit()
137
+ // in BossApp when the user double-presses Ctrl+C).
138
+ const runPromise = boss.run();
139
+ await ink.waitUntilExit();
140
+ await boss.dispose();
141
+ await runPromise.catch(() => { });
142
+ process.exit(0);
143
+ }
144
+ async function main() {
145
+ const argv = process.argv.slice(2);
146
+ if (argv[0] === "link") {
147
+ await runLinkCommand();
148
+ process.exit(0);
149
+ }
150
+ // `ggboss continue` is a subcommand alias for "resume the most recent session".
151
+ // Accept any flags after `continue` as normal flag args.
152
+ const isContinue = argv[0] === "continue";
153
+ const args = parseArgs(isContinue ? argv.slice(1) : argv);
154
+ if (isContinue)
155
+ args.continueRecent = true;
156
+ await runOrchestrator(args);
157
+ }
158
+ main().catch((err) => {
159
+ const message = err instanceof Error ? err.message : String(err);
160
+ process.stderr.write(chalk.hex(COLORS.error)(`\ngg-boss failed: ${message}\n`));
161
+ process.exit(1);
162
+ });
163
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface DiscoveredProject {
2
+ name: string;
3
+ path: string;
4
+ lastActiveMs: number;
5
+ lastActiveDisplay: string;
6
+ }
7
+ /**
8
+ * Scan ~/.gg/sessions/ and return projects sorted most-recent first.
9
+ * Each session directory's name is the encoded cwd (slashes → underscores);
10
+ * we decode it back and verify the directory still exists on disk.
11
+ */
12
+ export declare function discoverProjects(): Promise<DiscoveredProject[]>;
13
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2DrE"}
@@ -0,0 +1,92 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getAppPaths } from "@kenkaiiii/ggcoder";
4
+ /**
5
+ * Scan ~/.gg/sessions/ and return projects sorted most-recent first.
6
+ * Each session directory's name is the encoded cwd (slashes → underscores);
7
+ * we decode it back and verify the directory still exists on disk.
8
+ */
9
+ export async function discoverProjects() {
10
+ const sessionsDir = getAppPaths().sessionsDir;
11
+ let entries;
12
+ try {
13
+ entries = await fs.readdir(sessionsDir);
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ const results = [];
19
+ for (const entry of entries) {
20
+ const dir = path.join(sessionsDir, entry);
21
+ let stat;
22
+ try {
23
+ stat = await fs.stat(dir);
24
+ }
25
+ catch {
26
+ continue;
27
+ }
28
+ if (!stat.isDirectory())
29
+ continue;
30
+ let files;
31
+ try {
32
+ files = await fs.readdir(dir);
33
+ }
34
+ catch {
35
+ continue;
36
+ }
37
+ const sessionFiles = files.filter((f) => f.endsWith(".jsonl"));
38
+ if (sessionFiles.length === 0)
39
+ continue;
40
+ let maxMtime = 0;
41
+ for (const f of sessionFiles) {
42
+ try {
43
+ const s = await fs.stat(path.join(dir, f));
44
+ if (s.mtimeMs > maxMtime)
45
+ maxMtime = s.mtimeMs;
46
+ }
47
+ catch {
48
+ // skip unreadable files
49
+ }
50
+ }
51
+ const decoded = "/" + entry.replace(/_/g, "/");
52
+ // Verify the decoded path still exists — drop dead entries from the list.
53
+ try {
54
+ const pathStat = await fs.stat(decoded);
55
+ if (!pathStat.isDirectory())
56
+ continue;
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ results.push({
62
+ name: path.basename(decoded),
63
+ path: decoded,
64
+ lastActiveMs: maxMtime,
65
+ lastActiveDisplay: formatRelativeTime(maxMtime),
66
+ });
67
+ }
68
+ results.sort((a, b) => b.lastActiveMs - a.lastActiveMs);
69
+ return results;
70
+ }
71
+ function formatRelativeTime(ms) {
72
+ if (ms === 0)
73
+ return "—";
74
+ const diff = Date.now() - ms;
75
+ if (diff < 60_000)
76
+ return "just now";
77
+ const min = 60_000;
78
+ const hour = 60 * min;
79
+ const day = 24 * hour;
80
+ const week = 7 * day;
81
+ const month = 30 * day;
82
+ if (diff < hour)
83
+ return `${Math.floor(diff / min)}m ago`;
84
+ if (diff < day)
85
+ return `${Math.floor(diff / hour)}h ago`;
86
+ if (diff < week)
87
+ return `${Math.floor(diff / day)}d ago`;
88
+ if (diff < month)
89
+ return `${Math.floor(diff / week)}w ago`;
90
+ return `${Math.floor(diff / month)}mo ago`;
91
+ }
92
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { BossEvent } from "./types.js";
2
+ /**
3
+ * Single-consumer queue with user-preempt semantics:
4
+ * user_message events jump ahead of worker events but stay FIFO among themselves.
5
+ * Worker events stay FIFO among themselves.
6
+ */
7
+ export declare class EventQueue {
8
+ private user;
9
+ private rest;
10
+ private waiters;
11
+ push(event: BossEvent): void;
12
+ private deliverIfWaiting;
13
+ next(): Promise<BossEvent>;
14
+ size(): number;
15
+ }
16
+ //# sourceMappingURL=event-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../src/event-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,OAAO,CAAqC;IAEpD,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAM5B,OAAO,CAAC,gBAAgB;IAQxB,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC;IAQ1B,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Single-consumer queue with user-preempt semantics:
3
+ * user_message events jump ahead of worker events but stay FIFO among themselves.
4
+ * Worker events stay FIFO among themselves.
5
+ */
6
+ export class EventQueue {
7
+ user = [];
8
+ rest = [];
9
+ waiters = [];
10
+ push(event) {
11
+ if (event.kind === "user_message")
12
+ this.user.push(event);
13
+ else
14
+ this.rest.push(event);
15
+ this.deliverIfWaiting();
16
+ }
17
+ deliverIfWaiting() {
18
+ if (this.waiters.length === 0)
19
+ return;
20
+ const next = this.user.shift() ?? this.rest.shift();
21
+ if (!next)
22
+ return;
23
+ const waiter = this.waiters.shift();
24
+ if (waiter)
25
+ waiter(next);
26
+ }
27
+ next() {
28
+ const ready = this.user.shift() ?? this.rest.shift();
29
+ if (ready)
30
+ return Promise.resolve(ready);
31
+ return new Promise((resolve) => {
32
+ this.waiters.push(resolve);
33
+ });
34
+ }
35
+ size() {
36
+ return this.user.length + this.rest.length;
37
+ }
38
+ }
39
+ //# sourceMappingURL=event-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../src/event-queue.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACb,IAAI,GAAgB,EAAE,CAAC;IACvB,IAAI,GAAgB,EAAE,CAAC;IACvB,OAAO,GAAkC,EAAE,CAAC;IAEpD,IAAI,CAAC,KAAgB;QACnB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACrD,IAAI,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export { GGBoss } from "./orchestrator.js";
2
+ export { EventQueue } from "./event-queue.js";
3
+ export { Worker } from "./worker.js";
4
+ export { buildBossSystemPrompt } from "./boss-system-prompt.js";
5
+ export type { WorkerStatus, ProjectSpec, ToolUseSummary, WorkerTurnSummary, BossEvent, } from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,SAAS,GACV,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { GGBoss } from "./orchestrator.js";
2
+ export { EventQueue } from "./event-queue.js";
3
+ export { Worker } from "./worker.js";
4
+ export { buildBossSystemPrompt } from "./boss-system-prompt.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runLinkCommand(): Promise<void>;
2
+ //# sourceMappingURL=link-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-command.d.ts","sourceRoot":"","sources":["../src/link-command.tsx"],"names":[],"mappings":"AA+IA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+CpD"}
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Box, Text, useApp, useInput, render } from "ink";
4
+ import chalk from "chalk";
5
+ import { discoverProjects } from "./discover.js";
6
+ import { loadLinks, saveLinks } from "./links.js";
7
+ import { BossBanner } from "./banner.js";
8
+ import { COLORS, clearScreen } from "./branding.js";
9
+ const VISIBLE_ROWS = 12;
10
+ function LinkScreen({ projects, initialSelected, onDone }) {
11
+ const [cursor, setCursor] = useState(0);
12
+ const [selected, setSelected] = useState(new Set(initialSelected));
13
+ const [scrollOffset, setScrollOffset] = useState(0);
14
+ const visible = projects.slice(scrollOffset, scrollOffset + VISIBLE_ROWS);
15
+ useInput((input, key) => {
16
+ // Ctrl+C — cancel cleanly.
17
+ if (key.ctrl && input === "c") {
18
+ onDone([], true);
19
+ return;
20
+ }
21
+ if (projects.length === 0) {
22
+ if (key.return || key.escape || input === "q")
23
+ onDone([], true);
24
+ return;
25
+ }
26
+ if (key.upArrow) {
27
+ const next = Math.max(0, cursor - 1);
28
+ setCursor(next);
29
+ if (next < scrollOffset)
30
+ setScrollOffset(next);
31
+ }
32
+ else if (key.downArrow) {
33
+ const next = Math.min(projects.length - 1, cursor + 1);
34
+ setCursor(next);
35
+ if (next >= scrollOffset + VISIBLE_ROWS)
36
+ setScrollOffset(next - VISIBLE_ROWS + 1);
37
+ }
38
+ else if (input === " ") {
39
+ const p = projects[cursor];
40
+ if (!p)
41
+ return;
42
+ const nextSet = new Set(selected);
43
+ if (nextSet.has(p.path))
44
+ nextSet.delete(p.path);
45
+ else
46
+ nextSet.add(p.path);
47
+ setSelected(nextSet);
48
+ }
49
+ else if (input === "a") {
50
+ const allSelected = projects.every((p) => selected.has(p.path));
51
+ setSelected(allSelected ? new Set() : new Set(projects.map((p) => p.path)));
52
+ }
53
+ else if (key.return) {
54
+ onDone(projects.filter((p) => selected.has(p.path)).map((p) => p.path), false);
55
+ }
56
+ else if (key.escape || input === "q") {
57
+ onDone([], true);
58
+ }
59
+ });
60
+ const subtitle = projects.length === 0
61
+ ? "Link projects"
62
+ : `Link projects · ${projects.length} discovered · ${selected.size} selected`;
63
+ const hint = "↑↓ navigate · space toggle · a all · enter save · esc cancel";
64
+ if (projects.length === 0) {
65
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, children: [_jsx(BossBanner, { subtitle: "Link projects", hint: "No projects yet" }), _jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsx(Text, { color: COLORS.textDim, children: "No ggcoder projects found in ~/.gg/sessions/." }), _jsxs(Text, { color: COLORS.textDim, children: ["Run ggcoder in a project at least once, then re-run", " ", _jsx(Text, { color: COLORS.accent, children: "ggboss link" }), "."] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: COLORS.textDim, children: "Press any key to exit." }) })] })] }));
66
+ }
67
+ const showingTop = scrollOffset > 0;
68
+ const showingBottom = scrollOffset + VISIBLE_ROWS < projects.length;
69
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, children: [_jsx(BossBanner, { subtitle: subtitle, hint: hint }), _jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [showingTop && _jsx(Text, { color: COLORS.textDim, children: " ↑ more above" }), visible.map((p, i) => {
70
+ const realIndex = scrollOffset + i;
71
+ const isCursor = realIndex === cursor;
72
+ const isSelected = selected.has(p.path);
73
+ const checkbox = isSelected ? "[✓]" : "[ ]";
74
+ const arrow = isCursor ? "❯" : " ";
75
+ const nameColor = isCursor ? COLORS.primary : isSelected ? COLORS.success : COLORS.text;
76
+ const checkboxColor = isSelected ? COLORS.success : COLORS.textDim;
77
+ return (_jsxs(Box, { children: [_jsx(Text, { color: COLORS.primary, children: arrow }), _jsx(Text, { children: " " }), _jsx(Text, { color: checkboxColor, children: checkbox }), _jsx(Text, { children: " " }), _jsx(Text, { color: nameColor, bold: isCursor, children: p.name }), _jsx(Text, { color: COLORS.textDim, children: " " }), _jsx(Text, { color: COLORS.textDim, children: p.lastActiveDisplay })] }, p.path));
78
+ }), showingBottom && _jsx(Text, { color: COLORS.textDim, children: " ↓ more below" })] })] }));
79
+ }
80
+ function LinkApp({ projects, initialSelected, resolve }) {
81
+ const { exit } = useApp();
82
+ return (_jsx(LinkScreen, { projects: projects, initialSelected: initialSelected, onDone: (selected, cancelled) => {
83
+ resolve({ selected, cancelled });
84
+ exit();
85
+ } }));
86
+ }
87
+ export async function runLinkCommand() {
88
+ const projects = await discoverProjects();
89
+ const links = await loadLinks();
90
+ const initialSelected = new Set(links.projects.map((p) => p.cwd));
91
+ clearScreen();
92
+ const result = await new Promise((resolve) => {
93
+ const { waitUntilExit } = render(_jsx(LinkApp, { projects: projects, initialSelected: initialSelected, resolve: resolve }));
94
+ void waitUntilExit();
95
+ });
96
+ if (result.cancelled) {
97
+ process.stdout.write(chalk.hex(COLORS.textDim)("\nCancelled. No changes saved.\n"));
98
+ return;
99
+ }
100
+ const linked = result.selected
101
+ .map((path) => projects.find((p) => p.path === path))
102
+ .filter((p) => Boolean(p))
103
+ .map((p) => ({ name: p.name, cwd: p.path }));
104
+ await saveLinks({ projects: linked });
105
+ process.stdout.write("\n");
106
+ if (linked.length === 0) {
107
+ process.stdout.write(chalk.hex(COLORS.warning)("Cleared linked projects.\n"));
108
+ }
109
+ else {
110
+ process.stdout.write(chalk.hex(COLORS.success)(`Linked ${linked.length} project${linked.length === 1 ? "" : "s"}:\n`));
111
+ for (const p of linked) {
112
+ process.stdout.write(" " + chalk.hex(COLORS.primary)("·") + " " + chalk.hex(COLORS.text)(p.name) + "\n");
113
+ }
114
+ process.stdout.write("\n");
115
+ process.stdout.write(chalk.hex(COLORS.textDim)(`Run `) +
116
+ chalk.hex(COLORS.accent)("ggboss") +
117
+ chalk.hex(COLORS.textDim)(` to start the orchestrator.\n`));
118
+ }
119
+ }
120
+ //# sourceMappingURL=link-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-command.js","sourceRoot":"","sources":["../src/link-command.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface LinkedProject {
2
+ name: string;
3
+ cwd: string;
4
+ }
5
+ export interface LinksFile {
6
+ projects: LinkedProject[];
7
+ }
8
+ export declare function getLinksPath(): string;
9
+ export declare function loadLinks(): Promise<LinksFile>;
10
+ export declare function saveLinks(links: LinksFile): Promise<void>;
11
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAQpD;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D"}
package/dist/links.js ADDED
@@ -0,0 +1,22 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getAppPaths } from "@kenkaiiii/ggcoder";
4
+ export function getLinksPath() {
5
+ return path.join(getAppPaths().agentDir, "boss", "links.json");
6
+ }
7
+ export async function loadLinks() {
8
+ try {
9
+ const content = await fs.readFile(getLinksPath(), "utf-8");
10
+ const parsed = JSON.parse(content);
11
+ return { projects: parsed.projects ?? [] };
12
+ }
13
+ catch {
14
+ return { projects: [] };
15
+ }
16
+ }
17
+ export async function saveLinks(links) {
18
+ const p = getLinksPath();
19
+ await fs.mkdir(path.dirname(p), { recursive: true, mode: 0o700 });
20
+ await fs.writeFile(p, JSON.stringify(links, null, 2), "utf-8");
21
+ }
22
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWjD,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAgB;IAC9C,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import type { GGBoss } from "./orchestrator.js";
3
+ interface BossAppProps {
4
+ boss: GGBoss;
5
+ }
6
+ export declare function BossApp({ boss }: BossAppProps): React.ReactElement;
7
+ export interface RenderBossAppOptions {
8
+ boss: GGBoss;
9
+ }
10
+ export declare function renderBossApp(opts: RenderBossAppOptions): {
11
+ waitUntilExit: () => Promise<void>;
12
+ unmount: () => void;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=orchestrator-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-app.d.ts","sourceRoot":"","sources":["../src/orchestrator-app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAgCpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAQhD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,GAAG,KAAK,CAAC,YAAY,CAWlE;AAwaD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG;IACzD,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAYA"}