@pelotto-tech/bellwether 0.0.0-stage → 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.
- package/LICENSE +202 -0
- package/README.md +229 -2
- package/dist/agents/claude.d.ts +8 -0
- package/dist/agents/claude.js +63 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/copilot.d.ts +7 -0
- package/dist/agents/copilot.js +39 -0
- package/dist/agents/copilot.js.map +1 -0
- package/dist/agents/index.d.ts +5 -0
- package/dist/agents/index.js +8 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/paths.d.ts +2 -0
- package/dist/agents/paths.js +5 -0
- package/dist/agents/paths.js.map +1 -0
- package/dist/agents/types.d.ts +29 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +38 -0
- package/dist/install.js +104 -0
- package/dist/install.js.map +1 -0
- package/dist/json-file.d.ts +12 -0
- package/dist/json-file.js +33 -0
- package/dist/json-file.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +75 -0
- package/dist/main.js.map +1 -0
- package/dist/roles.d.ts +3 -0
- package/dist/roles.js +13 -0
- package/dist/roles.js.map +1 -0
- package/dist/run.d.ts +9 -0
- package/dist/run.js +41 -0
- package/dist/run.js.map +1 -0
- package/dist/skill.d.ts +9 -0
- package/dist/skill.js +65 -0
- package/dist/skill.js.map +1 -0
- package/package.json +52 -3
- package/runtime/adapter/dist/actions.d.ts +15 -0
- package/runtime/adapter/dist/actions.js +7 -0
- package/runtime/adapter/dist/actions.js.map +1 -0
- package/runtime/adapter/dist/bin.d.ts +2 -0
- package/runtime/adapter/dist/bin.js +121 -0
- package/runtime/adapter/dist/bin.js.map +1 -0
- package/runtime/adapter/dist/config.d.ts +41 -0
- package/runtime/adapter/dist/config.js +71 -0
- package/runtime/adapter/dist/config.js.map +1 -0
- package/runtime/adapter/dist/core.d.ts +8 -0
- package/runtime/adapter/dist/core.js +10 -0
- package/runtime/adapter/dist/core.js.map +1 -0
- package/runtime/adapter/dist/herdr/connection.d.ts +34 -0
- package/runtime/adapter/dist/herdr/connection.js +137 -0
- package/runtime/adapter/dist/herdr/connection.js.map +1 -0
- package/runtime/adapter/dist/herdr/index.d.ts +5 -0
- package/runtime/adapter/dist/herdr/index.js +5 -0
- package/runtime/adapter/dist/herdr/index.js.map +1 -0
- package/runtime/adapter/dist/herdr/mapper.d.ts +27 -0
- package/runtime/adapter/dist/herdr/mapper.js +141 -0
- package/runtime/adapter/dist/herdr/mapper.js.map +1 -0
- package/runtime/adapter/dist/herdr/paths.d.ts +29 -0
- package/runtime/adapter/dist/herdr/paths.js +89 -0
- package/runtime/adapter/dist/herdr/paths.js.map +1 -0
- package/runtime/adapter/dist/herdr/protocol.d.ts +102 -0
- package/runtime/adapter/dist/herdr/protocol.js +19 -0
- package/runtime/adapter/dist/herdr/protocol.js.map +1 -0
- package/runtime/adapter/dist/herdr/source.d.ts +99 -0
- package/runtime/adapter/dist/herdr/source.js +316 -0
- package/runtime/adapter/dist/herdr/source.js.map +1 -0
- package/runtime/adapter/dist/index.d.ts +6 -0
- package/runtime/adapter/dist/index.js +7 -0
- package/runtime/adapter/dist/index.js.map +1 -0
- package/runtime/adapter/dist/mock.d.ts +33 -0
- package/runtime/adapter/dist/mock.js +130 -0
- package/runtime/adapter/dist/mock.js.map +1 -0
- package/runtime/adapter/dist/random.d.ts +3 -0
- package/runtime/adapter/dist/random.js +18 -0
- package/runtime/adapter/dist/random.js.map +1 -0
- package/runtime/adapter/dist/recording.d.ts +22 -0
- package/runtime/adapter/dist/recording.js +52 -0
- package/runtime/adapter/dist/recording.js.map +1 -0
- package/runtime/adapter/dist/roles.d.ts +16 -0
- package/runtime/adapter/dist/roles.js +21 -0
- package/runtime/adapter/dist/roles.js.map +1 -0
- package/runtime/adapter/dist/rollup.d.ts +5 -0
- package/runtime/adapter/dist/rollup.js +18 -0
- package/runtime/adapter/dist/rollup.js.map +1 -0
- package/runtime/adapter/dist/scrub.d.ts +9 -0
- package/runtime/adapter/dist/scrub.js +56 -0
- package/runtime/adapter/dist/scrub.js.map +1 -0
- package/runtime/adapter/dist/server.d.ts +47 -0
- package/runtime/adapter/dist/server.js +119 -0
- package/runtime/adapter/dist/server.js.map +1 -0
- package/runtime/adapter/dist/source.d.ts +20 -0
- package/runtime/adapter/dist/source.js +14 -0
- package/runtime/adapter/dist/source.js.map +1 -0
- package/runtime/adapter/dist/types.d.ts +66 -0
- package/runtime/adapter/dist/types.js +23 -0
- package/runtime/adapter/dist/types.js.map +1 -0
- package/runtime/adapter/dist/world.d.ts +9 -0
- package/runtime/adapter/dist/world.js +64 -0
- package/runtime/adapter/dist/world.js.map +1 -0
- package/runtime/adapter/package.json +37 -0
- package/runtime/renderer/dist/assets/BitmapFont-CrMu5gVf.js +6 -0
- package/runtime/renderer/dist/assets/CanvasRenderer-BJUwGe2K.js +1 -0
- package/runtime/renderer/dist/assets/Filter-CYMWP98C.js +1 -0
- package/runtime/renderer/dist/assets/RenderTargetSystem-CUv6yCH8.js +184 -0
- package/runtime/renderer/dist/assets/WebGLRenderer-DT-aSeEc.js +156 -0
- package/runtime/renderer/dist/assets/WebGPURenderer-CV0poHB6.js +75 -0
- package/runtime/renderer/dist/assets/browserAll-BpE2Jy31.js +14 -0
- package/runtime/renderer/dist/assets/getTexelRangeRects-BCdgu8cV.js +195 -0
- package/runtime/renderer/dist/assets/index-BgIYSiaY.js +296 -0
- package/runtime/renderer/dist/assets/webworkerAll-DEtPMT-J.js +83 -0
- package/runtime/renderer/dist/index.html +36 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type AgentContext, type AgentTarget } from './agents/index.js';
|
|
2
|
+
export interface TargetPaths {
|
|
3
|
+
configDir: string;
|
|
4
|
+
settings: string;
|
|
5
|
+
skill: string;
|
|
6
|
+
hookSh: string;
|
|
7
|
+
hookPs1: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DetectResult {
|
|
10
|
+
id: string;
|
|
11
|
+
displayName: string;
|
|
12
|
+
configDir: string;
|
|
13
|
+
configDirExists: boolean;
|
|
14
|
+
onPath: boolean;
|
|
15
|
+
}
|
|
16
|
+
export type Outcome = {
|
|
17
|
+
id: string;
|
|
18
|
+
displayName: string;
|
|
19
|
+
status: 'installed' | 'uninstalled';
|
|
20
|
+
paths: TargetPaths;
|
|
21
|
+
} | {
|
|
22
|
+
id: string;
|
|
23
|
+
displayName: string;
|
|
24
|
+
status: 'skipped';
|
|
25
|
+
reason: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function pathsFor(target: AgentTarget, ctx: AgentContext): TargetPaths;
|
|
28
|
+
export declare function detect(ctx: AgentContext, targets?: readonly AgentTarget[]): DetectResult[];
|
|
29
|
+
/**
|
|
30
|
+
* Install the skill pack and SessionStart role hook for each target whose config dir
|
|
31
|
+
* exists. Idempotent: an existing Bellwether entry is replaced, never duplicated.
|
|
32
|
+
* Entries written by Herdr or the user are left alone.
|
|
33
|
+
*/
|
|
34
|
+
export declare function install(ctx: AgentContext, targets?: readonly AgentTarget[]): Outcome[];
|
|
35
|
+
/** Remove only what `install` wrote. Safe to run when nothing is installed. */
|
|
36
|
+
export declare function uninstall(ctx: AgentContext, targets?: readonly AgentTarget[]): Outcome[];
|
|
37
|
+
/** Context for the real machine. */
|
|
38
|
+
export declare function systemContext(): AgentContext;
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync, chmodSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { delimiter, join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { AGENT_TARGETS } from './agents/index.js';
|
|
5
|
+
import { readJsonObject, writeJsonObject } from './json-file.js';
|
|
6
|
+
import { HOOK_BASENAME, hookPs1, hookSh, skillMarkdown } from './skill.js';
|
|
7
|
+
export function pathsFor(target, ctx) {
|
|
8
|
+
const configDir = target.configDir(ctx);
|
|
9
|
+
return {
|
|
10
|
+
configDir,
|
|
11
|
+
settings: join(configDir, 'settings.json'),
|
|
12
|
+
skill: join(configDir, 'skills', 'bellwether', 'SKILL.md'),
|
|
13
|
+
hookSh: join(configDir, 'hooks', `${HOOK_BASENAME}.sh`),
|
|
14
|
+
hookPs1: join(configDir, 'hooks', `${HOOK_BASENAME}.ps1`),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function detect(ctx, targets = AGENT_TARGETS) {
|
|
18
|
+
return targets.map((t) => {
|
|
19
|
+
const configDir = t.configDir(ctx);
|
|
20
|
+
return {
|
|
21
|
+
id: t.id,
|
|
22
|
+
displayName: t.displayName,
|
|
23
|
+
configDir,
|
|
24
|
+
configDirExists: existsSync(configDir),
|
|
25
|
+
onPath: ctx.onPath(t.binary),
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Install the skill pack and SessionStart role hook for each target whose config dir
|
|
31
|
+
* exists. Idempotent: an existing Bellwether entry is replaced, never duplicated.
|
|
32
|
+
* Entries written by Herdr or the user are left alone.
|
|
33
|
+
*/
|
|
34
|
+
export function install(ctx, targets = AGENT_TARGETS) {
|
|
35
|
+
return targets.map((t) => {
|
|
36
|
+
const p = pathsFor(t, ctx);
|
|
37
|
+
if (!existsSync(p.configDir)) {
|
|
38
|
+
return { id: t.id, displayName: t.displayName, status: 'skipped', reason: `${p.configDir} does not exist` };
|
|
39
|
+
}
|
|
40
|
+
writeFile(p.skill, skillMarkdown());
|
|
41
|
+
writeFile(p.hookSh, hookSh());
|
|
42
|
+
try {
|
|
43
|
+
chmodSync(p.hookSh, 0o755);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// chmod is a no-op on Windows; the hook is invoked through `sh` anyway.
|
|
47
|
+
}
|
|
48
|
+
writeFile(p.hookPs1, hookPs1());
|
|
49
|
+
const clean = t.removeSessionStartHook(readJsonObject(p.settings));
|
|
50
|
+
writeJsonObject(p.settings, t.addSessionStartHook(clean, { sh: p.hookSh, ps1: p.hookPs1 }));
|
|
51
|
+
return { id: t.id, displayName: t.displayName, status: 'installed', paths: p };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** Remove only what `install` wrote. Safe to run when nothing is installed. */
|
|
55
|
+
export function uninstall(ctx, targets = AGENT_TARGETS) {
|
|
56
|
+
return targets.map((t) => {
|
|
57
|
+
const p = pathsFor(t, ctx);
|
|
58
|
+
if (!existsSync(p.configDir)) {
|
|
59
|
+
return { id: t.id, displayName: t.displayName, status: 'skipped', reason: `${p.configDir} does not exist` };
|
|
60
|
+
}
|
|
61
|
+
if (existsSync(p.settings)) {
|
|
62
|
+
const before = readJsonObject(p.settings);
|
|
63
|
+
const after = t.removeSessionStartHook(before);
|
|
64
|
+
if (after !== before)
|
|
65
|
+
writeJsonObject(p.settings, after);
|
|
66
|
+
}
|
|
67
|
+
rmSync(join(p.configDir, 'skills', 'bellwether'), { recursive: true, force: true });
|
|
68
|
+
rmSync(p.hookSh, { force: true });
|
|
69
|
+
rmSync(p.hookPs1, { force: true });
|
|
70
|
+
return { id: t.id, displayName: t.displayName, status: 'uninstalled', paths: p };
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function writeFile(path, content) {
|
|
74
|
+
mkdirSync(join(path, '..'), { recursive: true });
|
|
75
|
+
writeFileSync(path, content, 'utf8');
|
|
76
|
+
}
|
|
77
|
+
/** Context for the real machine. */
|
|
78
|
+
export function systemContext() {
|
|
79
|
+
const env = process.env;
|
|
80
|
+
const exts = process.platform === 'win32' ? (env.PATHEXT ?? '.EXE;.CMD;.BAT;.PS1').split(';') : [''];
|
|
81
|
+
return {
|
|
82
|
+
env,
|
|
83
|
+
home: homedir(),
|
|
84
|
+
platform: process.platform,
|
|
85
|
+
onPath(binary) {
|
|
86
|
+
for (const dir of (env.PATH ?? '').split(delimiter)) {
|
|
87
|
+
if (!dir)
|
|
88
|
+
continue;
|
|
89
|
+
let names;
|
|
90
|
+
try {
|
|
91
|
+
names = readdirSync(dir);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const lower = new Set(names.map((n) => n.toLowerCase()));
|
|
97
|
+
if (exts.some((e) => lower.has((binary + e).toLowerCase())))
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Json = null | boolean | number | string | Json[] | {
|
|
2
|
+
[k: string]: Json;
|
|
3
|
+
};
|
|
4
|
+
export type JsonObject = {
|
|
5
|
+
[k: string]: Json;
|
|
6
|
+
};
|
|
7
|
+
export declare function readJsonObject(path: string): JsonObject;
|
|
8
|
+
export declare function writeJsonObject(path: string, value: JsonObject): void;
|
|
9
|
+
export declare function asObject(v: Json | undefined): JsonObject;
|
|
10
|
+
export declare function asArray(v: Json | undefined): Json[];
|
|
11
|
+
/** True when any string anywhere inside v contains needle. */
|
|
12
|
+
export declare function mentions(v: Json, needle: string): boolean;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
export function readJsonObject(path) {
|
|
3
|
+
if (!existsSync(path))
|
|
4
|
+
return {};
|
|
5
|
+
const text = readFileSync(path, 'utf8').trim();
|
|
6
|
+
if (text === '')
|
|
7
|
+
return {};
|
|
8
|
+
const parsed = JSON.parse(text);
|
|
9
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
10
|
+
throw new Error(`${path} is not a JSON object`);
|
|
11
|
+
}
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
export function writeJsonObject(path, value) {
|
|
15
|
+
writeFileSync(path, JSON.stringify(value, null, 2) + '\n', 'utf8');
|
|
16
|
+
}
|
|
17
|
+
export function asObject(v) {
|
|
18
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v) ? v : {};
|
|
19
|
+
}
|
|
20
|
+
export function asArray(v) {
|
|
21
|
+
return Array.isArray(v) ? v : [];
|
|
22
|
+
}
|
|
23
|
+
/** True when any string anywhere inside v contains needle. */
|
|
24
|
+
export function mentions(v, needle) {
|
|
25
|
+
if (typeof v === 'string')
|
|
26
|
+
return v.includes(needle);
|
|
27
|
+
if (Array.isArray(v))
|
|
28
|
+
return v.some((x) => mentions(x, needle));
|
|
29
|
+
if (v !== null && typeof v === 'object')
|
|
30
|
+
return Object.values(v).some((x) => mentions(x, needle));
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=json-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-file.js","sourceRoot":"","sources":["../src/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAKlE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAS,CAAC;IACxC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAiB;IAC7D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAmB;IAC1C,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAmB;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,QAAQ,CAAC,CAAO,EAAE,MAAc;IAC9C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAClG,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { AGENT_TARGETS, findTarget } from './agents/index.js';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { adapterArgs, locateRuntime, RUN_COMMANDS } from './run.js';
|
|
5
|
+
import { detect, install, systemContext, uninstall } from './install.js';
|
|
6
|
+
const USAGE = `usage: bellwether <command> [--agent <id>]...
|
|
7
|
+
|
|
8
|
+
commands:
|
|
9
|
+
agents show which coding agents are present
|
|
10
|
+
install write the skill pack and SessionStart role hook for each present agent
|
|
11
|
+
uninstall remove only what install wrote
|
|
12
|
+
run serve the overlay from live Herdr (adapter flags pass through)
|
|
13
|
+
record F run live and append deltas to F (add --scrub for a shareable file)
|
|
14
|
+
replay F serve the overlay from a recording
|
|
15
|
+
scrub I O rewrite a recording with repo, branch and label names hashed
|
|
16
|
+
|
|
17
|
+
agents: ${AGENT_TARGETS.map((t) => t.id).join(', ')} (default: all present)`;
|
|
18
|
+
function selectTargets(args) {
|
|
19
|
+
const ids = [];
|
|
20
|
+
for (let i = 0; i < args.length; i++) {
|
|
21
|
+
if (args[i] === '--agent' && args[i + 1])
|
|
22
|
+
ids.push(args[++i]);
|
|
23
|
+
}
|
|
24
|
+
if (ids.length === 0)
|
|
25
|
+
return [...AGENT_TARGETS];
|
|
26
|
+
return ids.map((id) => {
|
|
27
|
+
const t = findTarget(id);
|
|
28
|
+
if (!t)
|
|
29
|
+
throw new Error(`unknown agent "${id}"\n\n${USAGE}`);
|
|
30
|
+
return t;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function report(outcomes) {
|
|
34
|
+
for (const o of outcomes) {
|
|
35
|
+
if (o.status === 'skipped')
|
|
36
|
+
console.log(`- ${o.displayName}: skipped (${o.reason})`);
|
|
37
|
+
else
|
|
38
|
+
console.log(`- ${o.displayName}: ${o.status} in ${o.paths.configDir}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function main(argv) {
|
|
42
|
+
const [cmd, ...rest] = argv;
|
|
43
|
+
if (cmd && RUN_COMMANDS.includes(cmd)) {
|
|
44
|
+
const rt = locateRuntime();
|
|
45
|
+
const args = adapterArgs(cmd, rest, cmd === 'scrub' ? undefined : rt.rendererDist);
|
|
46
|
+
return spawnSync(process.execPath, [rt.adapterBin, ...args], { stdio: 'inherit' }).status ?? 1;
|
|
47
|
+
}
|
|
48
|
+
const ctx = systemContext();
|
|
49
|
+
const targets = selectTargets(rest);
|
|
50
|
+
switch (cmd) {
|
|
51
|
+
case 'agents':
|
|
52
|
+
for (const d of detect(ctx, targets)) {
|
|
53
|
+
const where = d.configDirExists ? d.configDir : `${d.configDir} (missing)`;
|
|
54
|
+
console.log(`- ${d.displayName} [${d.id}]: ${d.onPath ? 'on PATH' : 'not on PATH'}, config ${where}`);
|
|
55
|
+
}
|
|
56
|
+
return 0;
|
|
57
|
+
case 'install':
|
|
58
|
+
report(install(ctx, targets));
|
|
59
|
+
return 0;
|
|
60
|
+
case 'uninstall':
|
|
61
|
+
report(uninstall(ctx, targets));
|
|
62
|
+
return 0;
|
|
63
|
+
default:
|
|
64
|
+
console.error(USAGE);
|
|
65
|
+
return cmd === undefined || cmd === '--help' || cmd === '-h' ? 0 : 2;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
process.exitCode = main(process.argv.slice(2));
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error(err.message);
|
|
73
|
+
process.exitCode = 2;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/roles.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Generic role vocabulary. Theme packs map these to sprites; the core never names characters. */
|
|
2
|
+
export declare const ROLES: readonly ["orchestrator", "coordinator", "architect", "implementer", "reviewer", "researcher", "writer", "ops", "generic"];
|
|
3
|
+
export type Role = (typeof ROLES)[number];
|
package/dist/roles.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Generic role vocabulary. Theme packs map these to sprites; the core never names characters. */
|
|
2
|
+
export const ROLES = [
|
|
3
|
+
'orchestrator',
|
|
4
|
+
'coordinator',
|
|
5
|
+
'architect',
|
|
6
|
+
'implementer',
|
|
7
|
+
'reviewer',
|
|
8
|
+
'researcher',
|
|
9
|
+
'writer',
|
|
10
|
+
'ops',
|
|
11
|
+
'generic',
|
|
12
|
+
];
|
|
13
|
+
//# sourceMappingURL=roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,KAAK;IACL,SAAS;CACD,CAAC"}
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type RunCommand = 'run' | 'record' | 'replay' | 'scrub';
|
|
2
|
+
export declare const RUN_COMMANDS: RunCommand[];
|
|
3
|
+
/** Maps `bellwether <cmd> ...` onto adapter flags. Pure, so it is easy to test. */
|
|
4
|
+
export declare function adapterArgs(cmd: RunCommand, rest: string[], serveDir?: string): string[];
|
|
5
|
+
/** Finds the built adapter bin and renderer dist inside the published package (runtime/), or next to this package in the workspace or a release bundle. */
|
|
6
|
+
export declare function locateRuntime(here?: string): {
|
|
7
|
+
adapterBin: string;
|
|
8
|
+
rendererDist?: string;
|
|
9
|
+
};
|
package/dist/run.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
export const RUN_COMMANDS = ['run', 'record', 'replay', 'scrub'];
|
|
5
|
+
/** Maps `bellwether <cmd> ...` onto adapter flags. Pure, so it is easy to test. */
|
|
6
|
+
export function adapterArgs(cmd, rest, serveDir) {
|
|
7
|
+
const serve = serveDir ? ['--serve', serveDir] : [];
|
|
8
|
+
switch (cmd) {
|
|
9
|
+
case 'run':
|
|
10
|
+
// Live Herdr unless the user chose a source themselves.
|
|
11
|
+
return [...(rest.some((a) => a === '--mock' || a === '--live' || a === '--replay') ? [] : ['--live', '--all']), ...serve, ...rest];
|
|
12
|
+
case 'record': {
|
|
13
|
+
const [file, ...more] = rest;
|
|
14
|
+
if (!file || file.startsWith('-'))
|
|
15
|
+
throw new Error('usage: bellwether record <file.jsonl> [--scrub] [adapter flags]');
|
|
16
|
+
return ['--live', '--all', ...serve, '--record', file, ...more];
|
|
17
|
+
}
|
|
18
|
+
case 'replay': {
|
|
19
|
+
const [file, ...more] = rest;
|
|
20
|
+
if (!file || file.startsWith('-'))
|
|
21
|
+
throw new Error('usage: bellwether replay <file.jsonl> [--speed n] [adapter flags]');
|
|
22
|
+
return [...serve, '--replay', file, ...more];
|
|
23
|
+
}
|
|
24
|
+
case 'scrub': {
|
|
25
|
+
const [input, output] = rest;
|
|
26
|
+
if (!input || !output)
|
|
27
|
+
throw new Error('usage: bellwether scrub <in.jsonl> <out.jsonl>');
|
|
28
|
+
return ['--scrub-file', input, output];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Finds the built adapter bin and renderer dist inside the published package (runtime/), or next to this package in the workspace or a release bundle. */
|
|
33
|
+
export function locateRuntime(here = dirname(fileURLToPath(import.meta.url))) {
|
|
34
|
+
const candidates = [join(here, '..', 'runtime', 'adapter', 'dist', 'bin.js'), join(here, '..', '..', 'adapter', 'dist', 'bin.js'), join(here, '..', '..', '..', 'adapter', 'dist', 'bin.js')];
|
|
35
|
+
const adapterBin = candidates.find(existsSync);
|
|
36
|
+
if (!adapterBin)
|
|
37
|
+
throw new Error('adapter is not built; run pnpm build');
|
|
38
|
+
const dist = join(dirname(dirname(dirname(adapterBin))), 'renderer', 'dist');
|
|
39
|
+
return { adapterBin, rendererDist: existsSync(dist) ? dist : undefined };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=run.js.map
|
package/dist/run.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/dist/skill.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Marker that identifies files and entries Bellwether wrote, so uninstall removes only its own. */
|
|
2
|
+
export declare const MARKER = "bellwether";
|
|
3
|
+
export declare const HOOK_BASENAME = "bellwether-role";
|
|
4
|
+
/** Theme-neutral skill pack. Identical for every agent target. */
|
|
5
|
+
export declare function skillMarkdown(): string;
|
|
6
|
+
/** POSIX hook: reports HERDR_ROLE as the pane's role token. Silent and non-fatal. */
|
|
7
|
+
export declare function hookSh(): string;
|
|
8
|
+
/** PowerShell variant for agents that run hooks natively on Windows. */
|
|
9
|
+
export declare function hookPs1(): string;
|
package/dist/skill.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ROLES } from './roles.js';
|
|
2
|
+
/** Marker that identifies files and entries Bellwether wrote, so uninstall removes only its own. */
|
|
3
|
+
export const MARKER = 'bellwether';
|
|
4
|
+
export const HOOK_BASENAME = 'bellwether-role';
|
|
5
|
+
/** Theme-neutral skill pack. Identical for every agent target. */
|
|
6
|
+
export function skillMarkdown() {
|
|
7
|
+
return `---
|
|
8
|
+
name: bellwether
|
|
9
|
+
description: Tag your Herdr pane with a Bellwether role so the overlay can show you. Use when running inside Herdr (HERDR_ENV=1) as a coordinator spawning members or as a member starting work.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Bellwether role tagging
|
|
13
|
+
|
|
14
|
+
Bellwether draws each Herdr pane that runs an agent as a character. It needs to know
|
|
15
|
+
which role the pane plays. Roles: ${ROLES.map((r) => `\`${r}\``).join(', ')}.
|
|
16
|
+
|
|
17
|
+
Only do any of this when \`HERDR_ENV=1\`. Outside Herdr, do nothing.
|
|
18
|
+
|
|
19
|
+
## If you are a member
|
|
20
|
+
|
|
21
|
+
On start, tag your own pane once:
|
|
22
|
+
|
|
23
|
+
\`\`\`sh
|
|
24
|
+
"\${HERDR_BIN_PATH:-herdr}" pane report-metadata "$HERDR_PANE_ID" --source bellwether --token role=<role>
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
## If you coordinate other agents
|
|
28
|
+
|
|
29
|
+
When you start a member in a pane, tag that pane with its role, or split the pane with
|
|
30
|
+
\`HERDR_ROLE=<role>\` in its environment and the installed hook tags it for you.
|
|
31
|
+
|
|
32
|
+
When you hand a member work, you may set a short speech line (under 60 characters,
|
|
33
|
+
never secrets, paths or customer data):
|
|
34
|
+
|
|
35
|
+
\`\`\`sh
|
|
36
|
+
"\${HERDR_BIN_PATH:-herdr}" pane report-metadata <pane> --source bellwether --token say="<one short line>" --ttl-ms 15000
|
|
37
|
+
\`\`\`
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
/** POSIX hook: reports HERDR_ROLE as the pane's role token. Silent and non-fatal. */
|
|
41
|
+
export function hookSh() {
|
|
42
|
+
return `#!/bin/sh
|
|
43
|
+
# ${MARKER}: report HERDR_ROLE as this pane's role token. Written by \`bellwether install\`.
|
|
44
|
+
[ "$HERDR_ENV" = "1" ] || exit 0
|
|
45
|
+
[ -n "$HERDR_PANE_ID" ] || exit 0
|
|
46
|
+
case "$HERDR_ROLE" in
|
|
47
|
+
${ROLES.join('|')}) ;;
|
|
48
|
+
*) exit 0 ;;
|
|
49
|
+
esac
|
|
50
|
+
"\${HERDR_BIN_PATH:-herdr}" pane report-metadata "$HERDR_PANE_ID" --source ${MARKER} --token "role=$HERDR_ROLE" >/dev/null 2>&1
|
|
51
|
+
exit 0
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
/** PowerShell variant for agents that run hooks natively on Windows. */
|
|
55
|
+
export function hookPs1() {
|
|
56
|
+
const list = ROLES.map((r) => `'${r}'`).join(',');
|
|
57
|
+
return `# ${MARKER}: report HERDR_ROLE as this pane's role token. Written by \`bellwether install\`.
|
|
58
|
+
if ($env:HERDR_ENV -ne '1' -or -not $env:HERDR_PANE_ID) { exit 0 }
|
|
59
|
+
if (@(${list}) -notcontains $env:HERDR_ROLE) { exit 0 }
|
|
60
|
+
$herdr = if ($env:HERDR_BIN_PATH) { $env:HERDR_BIN_PATH } else { 'herdr' }
|
|
61
|
+
try { & $herdr pane report-metadata $env:HERDR_PANE_ID --source ${MARKER} --token "role=$($env:HERDR_ROLE)" *> $null } catch {}
|
|
62
|
+
exit 0
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,oGAAoG;AACpG,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE/C,kEAAkE;AAClE,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;oCAQ2B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1E,CAAC;AACF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,MAAM;IACpB,OAAO;IACL,MAAM;;;;IAIN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;;6EAG0D,MAAM;;CAElF,CAAC;AACF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,OAAO;IACrB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,KAAK,MAAM;;QAEZ,IAAI;;kEAEsD,MAAM;;CAEvE,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pelotto-tech/bellwether",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pixel stream overlay for Herdr agent workspaces: CLI, adapter and overlay page in one package",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Pelotto-Technologies/bellwether.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/Pelotto-Technologies/bellwether#readme",
|
|
13
|
+
"bugs": "https://github.com/Pelotto-Technologies/bellwether/issues",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"herdr",
|
|
16
|
+
"overlay",
|
|
17
|
+
"pixel",
|
|
18
|
+
"agents",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"copilot"
|
|
21
|
+
],
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=20"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"bin": {
|
|
29
|
+
"bellwether": "dist/main.js"
|
|
30
|
+
},
|
|
31
|
+
"main": "dist/index.js",
|
|
32
|
+
"types": "dist/index.d.ts",
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"runtime",
|
|
36
|
+
"LICENSE",
|
|
37
|
+
"NOTICE",
|
|
38
|
+
"README.md"
|
|
39
|
+
],
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"smol-toml": "^1.9.1",
|
|
42
|
+
"ws": "^8.18.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^20.17.0",
|
|
46
|
+
"typescript": "^5.6.3",
|
|
47
|
+
"vitest": "^2.1.9"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -p tsconfig.json",
|
|
51
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"stage-runtime": "node ../../tools/stage-runtime.mjs"
|
|
54
|
+
}
|
|
6
55
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Things the overlay can ask a source to do back to the world. Live sources
|
|
3
|
+
* map these to Herdr `pane.focus`, `agent.prompt` and `agent.send_keys`;
|
|
4
|
+
* mock and replay sources do nothing.
|
|
5
|
+
*/
|
|
6
|
+
export interface Action {
|
|
7
|
+
/** Focus a pane (Herdr `pane.focus`). */
|
|
8
|
+
focus(paneId: string): Promise<void>;
|
|
9
|
+
/** Type a prompt into an agent pane (Herdr `agent.prompt`). */
|
|
10
|
+
prompt(paneId: string, text: string): Promise<void>;
|
|
11
|
+
/** Send key names to an agent pane (Herdr `agent.send_keys`). */
|
|
12
|
+
sendKeys(paneId: string, keys: string[]): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Used by sources that have nothing to act on (mock, replay). */
|
|
15
|
+
export declare const NOOP_ACTION: Action;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAcA,kEAAkE;AAClE,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC,KAAK,CAAC,KAAK,KAAI,CAAC;IAChB,KAAK,CAAC,MAAM,KAAI,CAAC;IACjB,KAAK,CAAC,QAAQ,KAAI,CAAC;CACpB,CAAC"}
|