@ziamana/bruine 0.1.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +315 -0
  3. package/THIRD_PARTY_NOTICES.md +24 -0
  4. package/cordis.patch.yml +166 -0
  5. package/dist/bin.js +5358 -0
  6. package/dist/compat.js +40 -0
  7. package/dist/plugins/approval.js +147 -0
  8. package/dist/plugins/headless.js +236 -0
  9. package/dist/plugins/herdr.js +470 -0
  10. package/dist/plugins/mcp.js +275 -0
  11. package/dist/plugins/modes.js +850 -0
  12. package/dist/plugins/render.js +3723 -0
  13. package/dist/plugins/repl.js +9589 -0
  14. package/dist/plugins/silence.js +234 -0
  15. package/dist/plugins/startup.js +42 -0
  16. package/dist/plugins/web-search.js +138 -0
  17. package/package.json +93 -0
  18. package/skills/code-review/SKILL.md +30 -0
  19. package/skills/git-workflow/SKILL.md +31 -0
  20. package/skills/impeccable/LICENSE +191 -0
  21. package/skills/impeccable/NOTICE.md +11 -0
  22. package/skills/impeccable/SKILL.md +87 -0
  23. package/skills/impeccable/reference/adapt.md +318 -0
  24. package/skills/impeccable/reference/adapt.native.md +58 -0
  25. package/skills/impeccable/reference/android.md +46 -0
  26. package/skills/impeccable/reference/animate.md +89 -0
  27. package/skills/impeccable/reference/audit.md +137 -0
  28. package/skills/impeccable/reference/audit.native.md +139 -0
  29. package/skills/impeccable/reference/bolder.md +33 -0
  30. package/skills/impeccable/reference/clarify.md +94 -0
  31. package/skills/impeccable/reference/colorize.md +86 -0
  32. package/skills/impeccable/reference/component-review.md +63 -0
  33. package/skills/impeccable/reference/craft-floor.md +44 -0
  34. package/skills/impeccable/reference/craft.md +5 -0
  35. package/skills/impeccable/reference/critique.md +806 -0
  36. package/skills/impeccable/reference/degraded/asset-producer.md +42 -0
  37. package/skills/impeccable/reference/degraded/documenter.md +24 -0
  38. package/skills/impeccable/reference/degraded/finish-reviewer.md +38 -0
  39. package/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  40. package/skills/impeccable/reference/delight.md +70 -0
  41. package/skills/impeccable/reference/distill.md +111 -0
  42. package/skills/impeccable/reference/doctor.md +54 -0
  43. package/skills/impeccable/reference/document.md +416 -0
  44. package/skills/impeccable/reference/extract.md +69 -0
  45. package/skills/impeccable/reference/generate.md +101 -0
  46. package/skills/impeccable/reference/harden.md +345 -0
  47. package/skills/impeccable/reference/hooks.md +113 -0
  48. package/skills/impeccable/reference/init.md +131 -0
  49. package/skills/impeccable/reference/ios.md +51 -0
  50. package/skills/impeccable/reference/layout.md +84 -0
  51. package/skills/impeccable/reference/live-setup.md +104 -0
  52. package/skills/impeccable/reference/live.md +325 -0
  53. package/skills/impeccable/reference/mode-operate.md +21 -0
  54. package/skills/impeccable/reference/mode-persuade.md +19 -0
  55. package/skills/impeccable/reference/mode-read.md +21 -0
  56. package/skills/impeccable/reference/new-work.md +154 -0
  57. package/skills/impeccable/reference/onboard.md +234 -0
  58. package/skills/impeccable/reference/operate.md +61 -0
  59. package/skills/impeccable/reference/optimize.md +258 -0
  60. package/skills/impeccable/reference/overdrive.md +127 -0
  61. package/skills/impeccable/reference/polish.md +105 -0
  62. package/skills/impeccable/reference/quieter.md +99 -0
  63. package/skills/impeccable/reference/region-map.md +26 -0
  64. package/skills/impeccable/reference/routing.md +24 -0
  65. package/skills/impeccable/reference/shape.md +59 -0
  66. package/skills/impeccable/reference/typeset.md +80 -0
  67. package/skills/impeccable/reference/visualize.md +46 -0
  68. package/skills/impeccable/scripts/VERSION +1 -0
  69. package/skills/impeccable/scripts/command-metadata.json +98 -0
  70. package/skills/impeccable/scripts/data/font-index-failures.json +121 -0
  71. package/skills/impeccable/scripts/data/font-index.json +1 -0
  72. package/skills/impeccable/scripts/impeccable +206 -0
  73. package/skills/impeccable/scripts/impeccable.cmd +214 -0
  74. package/skills/impeccable/scripts/live-browser-dom.js +167 -0
  75. package/skills/impeccable/scripts/live-browser-ignores.js +242 -0
  76. package/skills/impeccable/scripts/live-browser-session.js +148 -0
  77. package/skills/impeccable/scripts/live-browser.js +13510 -0
  78. package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  79. package/skills/make-interfaces-feel-better/LICENSE +21 -0
  80. package/skills/make-interfaces-feel-better/SKILL.md +187 -0
  81. package/skills/make-interfaces-feel-better/agents/openai.yaml +3 -0
  82. package/skills/make-interfaces-feel-better/animations.md +403 -0
  83. package/skills/make-interfaces-feel-better/icons.md +63 -0
  84. package/skills/make-interfaces-feel-better/performance.md +88 -0
  85. package/skills/make-interfaces-feel-better/surfaces.md +256 -0
  86. package/skills/make-interfaces-feel-better/typography.md +157 -0
  87. package/skills/playwright-cli/LICENSE +201 -0
  88. package/skills/playwright-cli/SKILL.md +489 -0
  89. package/skills/playwright-cli/references/element-attributes.md +23 -0
  90. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  91. package/skills/playwright-cli/references/pr-attachments.md +60 -0
  92. package/skills/playwright-cli/references/request-mocking.md +87 -0
  93. package/skills/playwright-cli/references/running-code.md +245 -0
  94. package/skills/playwright-cli/references/session-management.md +227 -0
  95. package/skills/playwright-cli/references/storage-state.md +275 -0
  96. package/skills/playwright-cli/references/test-generation.md +433 -0
  97. package/skills/playwright-cli/references/tracing.md +139 -0
  98. package/skills/playwright-cli/references/video-recording.md +216 -0
  99. package/skills/remotion/SKILL.md +42 -0
  100. package/skills/systematic-debugging/SKILL.md +26 -0
  101. package/skills/thermo-nuclear-code-quality-review/LICENSE +21 -0
  102. package/skills/thermo-nuclear-code-quality-review/SKILL.md +192 -0
  103. package/skills/write-tests/SKILL.md +35 -0
  104. package/skills/youtube-transcript/LICENSE +21 -0
  105. package/skills/youtube-transcript/SKILL.md +41 -0
  106. package/skills/youtube-transcript/package.json +8 -0
  107. package/skills/youtube-transcript/transcript.js +44 -0
@@ -0,0 +1,470 @@
1
+ // src/compat.ts
2
+ import { existsSync } from "fs";
3
+ import { homedir } from "os";
4
+ import path from "path";
5
+ function appEnv(suffix, env = process.env) {
6
+ return env[`BRUINE_${suffix}`] ?? env[`KUMO_${suffix}`];
7
+ }
8
+
9
+ // src/plugins/herdr.ts
10
+ import net from "net";
11
+ var name = "bruine-herdr";
12
+ var REQUEST_TIMEOUT_MS = 500;
13
+ function readHerdrEnv(env = process.env) {
14
+ try {
15
+ if (env.HERDR_ENV !== "1") return void 0;
16
+ const socketPath = env.HERDR_SOCKET_PATH;
17
+ const paneId = env.HERDR_PANE_ID;
18
+ if (socketPath === void 0 || socketPath === "" || paneId === void 0 || paneId === "") {
19
+ return void 0;
20
+ }
21
+ return { socketPath, paneId };
22
+ } catch {
23
+ return void 0;
24
+ }
25
+ }
26
+ function endpointFor(socketPath, platform = process.platform) {
27
+ return platform === "win32" ? `\\\\.\\pipe\\${socketPath}` : socketPath;
28
+ }
29
+ function netConnect(endpoint, line, timeoutMs = REQUEST_TIMEOUT_MS) {
30
+ return new Promise((resolve, reject) => {
31
+ let settled = false;
32
+ let socket;
33
+ try {
34
+ socket = net.createConnection({ path: endpoint });
35
+ } catch (err) {
36
+ reject(err instanceof Error ? err : new Error(String(err)));
37
+ return;
38
+ }
39
+ const timer = setTimeout(() => {
40
+ if (settled) return;
41
+ settled = true;
42
+ try {
43
+ socket.destroy();
44
+ } catch {
45
+ }
46
+ reject(new Error("herdr: request timed out"));
47
+ }, timeoutMs);
48
+ if (typeof timer.unref === "function") timer.unref();
49
+ const finish = (fn) => {
50
+ if (settled) return;
51
+ settled = true;
52
+ clearTimeout(timer);
53
+ fn();
54
+ };
55
+ let buf = "";
56
+ socket.on("connect", () => {
57
+ try {
58
+ socket.write(`${line}
59
+ `);
60
+ } catch (err) {
61
+ finish(() => reject(err instanceof Error ? err : new Error(String(err))));
62
+ }
63
+ });
64
+ socket.on("data", (chunk) => {
65
+ buf += chunk.toString("utf8");
66
+ const nl = buf.indexOf("\n");
67
+ if (nl >= 0) {
68
+ const reply = buf.slice(0, nl);
69
+ finish(() => {
70
+ try {
71
+ socket.destroy();
72
+ } catch {
73
+ }
74
+ resolve(reply);
75
+ });
76
+ }
77
+ });
78
+ socket.on("error", (err) => {
79
+ finish(() => {
80
+ try {
81
+ socket.destroy();
82
+ } catch {
83
+ }
84
+ reject(err);
85
+ });
86
+ });
87
+ socket.on("close", () => {
88
+ finish(() => reject(new Error("herdr: connection closed")));
89
+ });
90
+ });
91
+ }
92
+ function randomSuffix() {
93
+ try {
94
+ const s = Math.random().toString(36).slice(2, 10);
95
+ return s === "" ? "0" : s;
96
+ } catch {
97
+ return "0";
98
+ }
99
+ }
100
+ var HerdrReporter = class {
101
+ paneId;
102
+ endpoint;
103
+ #sessionId;
104
+ #connect;
105
+ #timeoutMs;
106
+ #seq;
107
+ #tail = Promise.resolve();
108
+ constructor(opts) {
109
+ this.paneId = opts.paneId;
110
+ this.endpoint = opts.endpoint;
111
+ this.#sessionId = opts.sessionId;
112
+ this.#timeoutMs = opts.timeoutMs ?? REQUEST_TIMEOUT_MS;
113
+ const timeoutMs = this.#timeoutMs;
114
+ this.#connect = opts.connect ?? ((endpoint, line) => netConnect(endpoint, line, timeoutMs));
115
+ this.#seq = Date.now() * 1e3;
116
+ }
117
+ currentSession() {
118
+ try {
119
+ return this.#sessionId();
120
+ } catch {
121
+ return void 0;
122
+ }
123
+ }
124
+ #enqueue(method, params) {
125
+ const seq = this.#seq;
126
+ this.#seq += 1;
127
+ let line;
128
+ try {
129
+ line = JSON.stringify({
130
+ id: `bruine:${String(Date.now())}:${randomSuffix()}`,
131
+ method,
132
+ params: { ...params, seq }
133
+ });
134
+ } catch {
135
+ return;
136
+ }
137
+ const endpoint = this.endpoint;
138
+ const connect = this.#connect;
139
+ const timeoutMs = this.#timeoutMs;
140
+ this.#tail = this.#tail.then(
141
+ () => Promise.race([
142
+ Promise.resolve().then(() => connect(endpoint, line)).then(() => void 0),
143
+ new Promise((_resolve, reject) => {
144
+ const t = setTimeout(() => reject(new Error("herdr: request timed out")), timeoutMs);
145
+ if (typeof t.unref === "function") t.unref();
146
+ })
147
+ ]).then(
148
+ () => void 0,
149
+ () => void 0
150
+ )
151
+ );
152
+ }
153
+ /** `pane.report_agent` with the current (or given) session id. */
154
+ reportState(state, sessionId) {
155
+ try {
156
+ const sid = sessionId ?? this.currentSession();
157
+ if (sid === void 0) return;
158
+ this.#enqueue("pane.report_agent", {
159
+ pane_id: this.paneId,
160
+ source: "bruine",
161
+ agent: "bruine",
162
+ state,
163
+ agent_session_id: sid
164
+ });
165
+ } catch {
166
+ }
167
+ }
168
+ /** `pane.report_agent_session` on /new (a new dsh session took over). */
169
+ reportSession(sessionId) {
170
+ try {
171
+ this.#enqueue("pane.report_agent_session", {
172
+ pane_id: this.paneId,
173
+ source: "bruine",
174
+ agent: "bruine",
175
+ agent_session_id: sessionId,
176
+ session_start_source: "new"
177
+ });
178
+ } catch {
179
+ }
180
+ }
181
+ /** `pane.release_agent` on exit. Fire and forget. */
182
+ release() {
183
+ try {
184
+ this.#enqueue("pane.release_agent", {
185
+ pane_id: this.paneId,
186
+ source: "bruine",
187
+ agent: "bruine"
188
+ });
189
+ } catch {
190
+ }
191
+ }
192
+ /**
193
+ * Enqueue a release after everything before it and wait for the queue,
194
+ * never longer than the request timeout. Never throws. The exit path.
195
+ */
196
+ async close() {
197
+ this.release();
198
+ try {
199
+ await Promise.race([
200
+ this.#tail,
201
+ new Promise((resolve) => {
202
+ const t = setTimeout(resolve, this.#timeoutMs);
203
+ if (typeof t.unref === "function") t.unref();
204
+ })
205
+ ]);
206
+ } catch {
207
+ }
208
+ }
209
+ /** Settle the queue (tests). Never throws. */
210
+ async settled(timeoutMs = 1e4) {
211
+ try {
212
+ await Promise.race([
213
+ this.#tail,
214
+ new Promise((resolve) => {
215
+ const t = setTimeout(resolve, timeoutMs);
216
+ if (typeof t.unref === "function") t.unref();
217
+ })
218
+ ]);
219
+ } catch {
220
+ }
221
+ }
222
+ };
223
+ function sessionIdOf(agent) {
224
+ try {
225
+ const id = agent?.session?.id;
226
+ return id === void 0 || id === null ? void 0 : String(id);
227
+ } catch {
228
+ return void 0;
229
+ }
230
+ }
231
+ function apply(ctx, opts) {
232
+ const noop = () => {
233
+ };
234
+ let env;
235
+ try {
236
+ env = readHerdrEnv();
237
+ } catch {
238
+ return noop;
239
+ }
240
+ if (env === void 0 || appEnv("HEADLESS") === "1") return noop;
241
+ const paneId = env.paneId;
242
+ const endpoint = endpointFor(env.socketPath);
243
+ let repl;
244
+ const reporter = new HerdrReporter({
245
+ paneId,
246
+ endpoint,
247
+ sessionId: () => repl === void 0 ? void 0 : sessionIdOf(repl.agent),
248
+ ...opts?.connect !== void 0 ? { connect: opts.connect } : {}
249
+ });
250
+ let lastSessionId;
251
+ let disposed = false;
252
+ const offs = [];
253
+ const liveAgent = () => {
254
+ try {
255
+ return repl?.agent;
256
+ } catch {
257
+ return void 0;
258
+ }
259
+ };
260
+ const isOurs = (agent) => {
261
+ try {
262
+ if (repl === void 0 || agent === void 0) return false;
263
+ if (agent === liveAgent()) return true;
264
+ const modes = ctx.get("bruineModes");
265
+ if (modes !== void 0 && typeof modes.governs === "function") {
266
+ try {
267
+ return modes.governs(agent) === true;
268
+ } catch {
269
+ return false;
270
+ }
271
+ }
272
+ return false;
273
+ } catch {
274
+ return false;
275
+ }
276
+ };
277
+ const liveAgentSession = () => {
278
+ try {
279
+ return liveAgent()?.session;
280
+ } catch {
281
+ return void 0;
282
+ }
283
+ };
284
+ try {
285
+ offs.push(
286
+ ctx.on("session/event", (session, event) => {
287
+ try {
288
+ if (disposed || repl === void 0) return;
289
+ if (session !== liveAgentSession()) return;
290
+ const type = event?.type;
291
+ if (type === "turn/start") {
292
+ const sid = sessionIdOf(liveAgent());
293
+ if (sid !== void 0) reporter.reportState("working", sid);
294
+ } else if (type === "turn/end") {
295
+ const sid = sessionIdOf(liveAgent());
296
+ if (sid === void 0) return;
297
+ reporter.reportState(event?.data?.reason?.kind === "error" ? "blocked" : "idle", sid);
298
+ }
299
+ } catch {
300
+ }
301
+ })
302
+ );
303
+ } catch {
304
+ }
305
+ const trackWait = (req, next) => {
306
+ let ours = false;
307
+ try {
308
+ ours = isOurs(req?.agent);
309
+ } catch {
310
+ ours = false;
311
+ }
312
+ if (!ours) return next();
313
+ const opened = sessionIdOf(liveAgent());
314
+ if (opened !== void 0) reporter.reportState("blocked", opened);
315
+ let result;
316
+ try {
317
+ result = next();
318
+ } catch (err) {
319
+ const sid2 = sessionIdOf(liveAgent());
320
+ if (sid2 !== void 0) reporter.reportState("working", sid2);
321
+ throw err;
322
+ }
323
+ if (result !== void 0 && result !== null && typeof result.then === "function") {
324
+ return result.then(
325
+ (value) => {
326
+ const sid2 = sessionIdOf(liveAgent());
327
+ if (sid2 !== void 0) reporter.reportState("working", sid2);
328
+ return value;
329
+ },
330
+ (err) => {
331
+ const sid2 = sessionIdOf(liveAgent());
332
+ if (sid2 !== void 0) reporter.reportState("working", sid2);
333
+ throw err;
334
+ }
335
+ );
336
+ }
337
+ const sid = sessionIdOf(liveAgent());
338
+ if (sid !== void 0) reporter.reportState("working", sid);
339
+ return result;
340
+ };
341
+ try {
342
+ offs.push(ctx.on("approval/request", trackWait));
343
+ } catch {
344
+ }
345
+ try {
346
+ offs.push(ctx.on("user-questions/request", trackWait));
347
+ } catch {
348
+ }
349
+ try {
350
+ ctx.inject(["bruineRepl"], (c) => {
351
+ try {
352
+ if (disposed) return;
353
+ const service = c?.bruineRepl;
354
+ if (service === void 0 || service === null || service.agent === void 0) return;
355
+ if (repl === service) return;
356
+ repl = service;
357
+ const sid = sessionIdOf(service.agent);
358
+ lastSessionId = sid;
359
+ if (sid !== void 0) reporter.reportState("idle", sid);
360
+ try {
361
+ let current = service.agent;
362
+ Object.defineProperty(service, "agent", {
363
+ configurable: true,
364
+ enumerable: true,
365
+ get: () => current,
366
+ set: (next) => {
367
+ current = next;
368
+ try {
369
+ if (disposed) return;
370
+ const nid = sessionIdOf(next);
371
+ if (nid === void 0 || nid === lastSessionId) return;
372
+ lastSessionId = nid;
373
+ reporter.reportSession(nid);
374
+ reporter.reportState("idle", nid);
375
+ } catch {
376
+ }
377
+ }
378
+ });
379
+ } catch {
380
+ }
381
+ } catch {
382
+ }
383
+ });
384
+ } catch {
385
+ }
386
+ let restoreExit;
387
+ if (opts?.installExitHooks !== false) {
388
+ try {
389
+ const origExit = process.exit;
390
+ let exiting = false;
391
+ const patched = ((code) => {
392
+ if (disposed || exiting) return origExit(code);
393
+ exiting = true;
394
+ void reporter.close().finally(() => origExit(code));
395
+ });
396
+ process.exit = patched;
397
+ const onBeforeExit = () => {
398
+ if (!disposed) void reporter.close();
399
+ };
400
+ const resignal = (sig) => {
401
+ void reporter.close().finally(() => {
402
+ try {
403
+ process.removeListener("SIGTERM", onSigTerm);
404
+ process.removeListener("SIGINT", onSigInt);
405
+ } catch {
406
+ }
407
+ try {
408
+ process.kill(process.pid, sig);
409
+ } catch {
410
+ }
411
+ });
412
+ };
413
+ const onSigTerm = () => {
414
+ if (!disposed) resignal("SIGTERM");
415
+ };
416
+ const onSigInt = () => {
417
+ if (!disposed) resignal("SIGINT");
418
+ };
419
+ process.once("beforeExit", onBeforeExit);
420
+ process.once("SIGTERM", onSigTerm);
421
+ process.once("SIGINT", onSigInt);
422
+ restoreExit = () => {
423
+ try {
424
+ if (process.exit === patched) process.exit = origExit;
425
+ } catch {
426
+ }
427
+ try {
428
+ process.removeListener("beforeExit", onBeforeExit);
429
+ } catch {
430
+ }
431
+ try {
432
+ process.removeListener("SIGTERM", onSigTerm);
433
+ } catch {
434
+ }
435
+ try {
436
+ process.removeListener("SIGINT", onSigInt);
437
+ } catch {
438
+ }
439
+ };
440
+ } catch {
441
+ }
442
+ }
443
+ return () => {
444
+ if (disposed) return;
445
+ disposed = true;
446
+ for (const off of offs) {
447
+ try {
448
+ off();
449
+ } catch {
450
+ }
451
+ }
452
+ try {
453
+ restoreExit?.();
454
+ } catch {
455
+ }
456
+ try {
457
+ reporter.release();
458
+ } catch {
459
+ }
460
+ };
461
+ }
462
+ export {
463
+ HerdrReporter,
464
+ REQUEST_TIMEOUT_MS,
465
+ apply,
466
+ endpointFor,
467
+ name,
468
+ netConnect,
469
+ readHerdrEnv
470
+ };