seatmesh 1.0.2 → 1.0.4
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/dist/commands/ack-cli.d.ts +4 -0
- package/dist/commands/ack-cli.d.ts.map +1 -0
- package/dist/commands/ack-cli.js +105 -0
- package/dist/commands/ack-cli.js.map +1 -0
- package/dist/commands/checkback-cli.d.ts.map +1 -1
- package/dist/commands/checkback-cli.js +6 -0
- package/dist/commands/checkback-cli.js.map +1 -1
- package/dist/commands/notify-cli.d.ts.map +1 -1
- package/dist/commands/notify-cli.js +69 -10
- package/dist/commands/notify-cli.js.map +1 -1
- package/dist/commands/target-cli.d.ts +4 -0
- package/dist/commands/target-cli.d.ts.map +1 -0
- package/dist/commands/target-cli.js +146 -0
- package/dist/commands/target-cli.js.map +1 -0
- package/dist/main.js +241 -77
- package/dist/main.js.map +1 -1
- package/dist/setup/agent-context-init.d.ts.map +1 -1
- package/dist/setup/agent-context-init.js +11 -5
- package/dist/setup/agent-context-init.js.map +1 -1
- package/dist/setup/init.d.ts +23 -3
- package/dist/setup/init.d.ts.map +1 -1
- package/dist/setup/init.js +71 -3
- package/dist/setup/init.js.map +1 -1
- package/dist/setup/update.d.ts.map +1 -1
- package/dist/setup/update.js +17 -11
- package/dist/setup/update.js.map +1 -1
- package/dist/ui/banner.d.ts +17 -2
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +76 -2
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/banner.test.d.ts +2 -0
- package/dist/ui/banner.test.d.ts.map +1 -0
- package/dist/ui/banner.test.js +47 -0
- package/dist/ui/banner.test.js.map +1 -0
- package/dist/ui/version-nudge.d.ts +16 -2
- package/dist/ui/version-nudge.d.ts.map +1 -1
- package/dist/ui/version-nudge.js +80 -3
- package/dist/ui/version-nudge.js.map +1 -1
- package/dist/ui/version-nudge.test.js +31 -3
- package/dist/ui/version-nudge.test.js.map +1 -1
- package/package.json +6 -6
- package/profiles/minimal/roles/common.yaml +3 -0
- package/templates/init/AGENTS.md +87 -0
- package/templates/init/mesh.config.yaml +4 -4
- package/templates/init/roles/common.yaml +4 -1
- package/templates/init/roles/manager.yaml +3 -3
- package/templates/init/roles/mini.yaml +4 -4
- package/templates/init/roles/secretary.yaml +2 -2
- package/templates/init/roles/worker.yaml +5 -5
package/dist/ui/banner.d.ts
CHANGED
|
@@ -3,7 +3,22 @@ export type BannerOpts = {
|
|
|
3
3
|
subtitle?: string;
|
|
4
4
|
/** Shown centered under the title block (default text: SEATMESH_TAGLINE). */
|
|
5
5
|
tagline?: boolean | string;
|
|
6
|
+
/** Print even if this terminal already saw the logo. */
|
|
7
|
+
force?: boolean;
|
|
6
8
|
};
|
|
7
|
-
/**
|
|
8
|
-
export declare function
|
|
9
|
+
/** Stable id for this terminal: tmux pane, else tty device. */
|
|
10
|
+
export declare function terminalBannerKey(): string;
|
|
11
|
+
/**
|
|
12
|
+
* First call in this terminal → true (and marks shown). Later calls → false.
|
|
13
|
+
* SEATMESH_BANNER=1 force show; =0 force skip. Empty key (no tty) → false.
|
|
14
|
+
*/
|
|
15
|
+
export declare function consumeTerminalBannerSlot(): boolean;
|
|
16
|
+
/** Whether this invocation should print the brand logo (once per terminal). */
|
|
17
|
+
export declare function shouldPrintSeatmeshBanner(force?: boolean): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Brand header: logo + title + optional centered tagline.
|
|
20
|
+
* Once per terminal (TTY / tmux pane) unless `force` or SEATMESH_BANNER=1.
|
|
21
|
+
* Returns true if the logo was printed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function printSeatmeshBanner(opts?: string | BannerOpts): boolean;
|
|
9
24
|
//# sourceMappingURL=banner.d.ts.map
|
package/dist/ui/banner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAgB7D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAqFF,+DAA+D;AAC/D,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAOD;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAsBnD;AAED,+EAA+E;AAC/E,wBAAgB,yBAAyB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAGhE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CA6CvE"}
|
package/dist/ui/banner.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import boxen from "boxen";
|
|
2
2
|
import cfonts from "cfonts";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
3
7
|
import { renderLogoMark } from "./logo-art.js";
|
|
4
8
|
import { terminalStyleEnabled, tintBrandBlueGradient } from "./logo-color.js";
|
|
5
9
|
export const SEATMESH_TAGLINE = "tmux multi-agent workbench";
|
|
6
10
|
const TITLE_FONT = "block";
|
|
11
|
+
/** Stamp TTL — new login / long-lived pts still get a fresh logo occasionally. */
|
|
12
|
+
const BANNER_STAMP_TTL_MS = 12 * 60 * 60 * 1000;
|
|
7
13
|
function stripAnsi(text) {
|
|
8
14
|
return text.replace(/\x1b\[[0-9;]*m/g, "");
|
|
9
15
|
}
|
|
@@ -69,9 +75,76 @@ function resolveBannerOpts(opts) {
|
|
|
69
75
|
return { subtitle: opts };
|
|
70
76
|
return opts ?? {};
|
|
71
77
|
}
|
|
72
|
-
|
|
78
|
+
function bannerCacheDir() {
|
|
79
|
+
if (process.env.SEATMESH_BANNER_CACHE_DIR?.trim()) {
|
|
80
|
+
return process.env.SEATMESH_BANNER_CACHE_DIR.trim();
|
|
81
|
+
}
|
|
82
|
+
const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), ".cache");
|
|
83
|
+
return path.join(base, "seatmesh", "banner-once");
|
|
84
|
+
}
|
|
85
|
+
/** Stable id for this terminal: tmux pane, else tty device. */
|
|
86
|
+
export function terminalBannerKey() {
|
|
87
|
+
const pane = process.env.TMUX_PANE?.trim();
|
|
88
|
+
if (pane)
|
|
89
|
+
return `tmux:${pane}`;
|
|
90
|
+
const r = spawnSync("tty", { encoding: "utf8" });
|
|
91
|
+
const tty = (r.stdout ?? "").trim();
|
|
92
|
+
if (r.status === 0 && tty && tty !== "not a tty")
|
|
93
|
+
return `tty:${tty}`;
|
|
94
|
+
// Non-interactive / piped — treat as always-plain (no logo spam in scripts).
|
|
95
|
+
return "";
|
|
96
|
+
}
|
|
97
|
+
function bannerStampPath(key) {
|
|
98
|
+
const safe = key.replace(/[^a-zA-Z0-9._+-]/g, "_");
|
|
99
|
+
return path.join(bannerCacheDir(), `${safe}.stamp`);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* First call in this terminal → true (and marks shown). Later calls → false.
|
|
103
|
+
* SEATMESH_BANNER=1 force show; =0 force skip. Empty key (no tty) → false.
|
|
104
|
+
*/
|
|
105
|
+
export function consumeTerminalBannerSlot() {
|
|
106
|
+
const force = process.env.SEATMESH_BANNER?.trim();
|
|
107
|
+
if (force === "0" || force === "false" || force === "off")
|
|
108
|
+
return false;
|
|
109
|
+
if (force === "1" || force === "true" || force === "always")
|
|
110
|
+
return true;
|
|
111
|
+
const key = terminalBannerKey();
|
|
112
|
+
if (!key)
|
|
113
|
+
return false;
|
|
114
|
+
const stamp = bannerStampPath(key);
|
|
115
|
+
try {
|
|
116
|
+
const st = fs.statSync(stamp);
|
|
117
|
+
if (Date.now() - st.mtimeMs < BANNER_STAMP_TTL_MS)
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
/* missing — first show */
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
fs.mkdirSync(path.dirname(stamp), { recursive: true });
|
|
125
|
+
fs.writeFileSync(stamp, `${new Date().toISOString()}\n`);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
/* still show once even if stamp fails */
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
/** Whether this invocation should print the brand logo (once per terminal). */
|
|
133
|
+
export function shouldPrintSeatmeshBanner(force = false) {
|
|
134
|
+
if (force)
|
|
135
|
+
return true;
|
|
136
|
+
return consumeTerminalBannerSlot();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Brand header: logo + title + optional centered tagline.
|
|
140
|
+
* Once per terminal (TTY / tmux pane) unless `force` or SEATMESH_BANNER=1.
|
|
141
|
+
* Returns true if the logo was printed.
|
|
142
|
+
*/
|
|
73
143
|
export function printSeatmeshBanner(opts) {
|
|
74
|
-
const
|
|
144
|
+
const resolved = resolveBannerOpts(opts);
|
|
145
|
+
if (!shouldPrintSeatmeshBanner(Boolean(resolved.force)))
|
|
146
|
+
return false;
|
|
147
|
+
const { subtitle, tagline: taglineOpt } = resolved;
|
|
75
148
|
const tagline = taglineOpt === true
|
|
76
149
|
? SEATMESH_TAGLINE
|
|
77
150
|
: typeof taglineOpt === "string"
|
|
@@ -109,5 +182,6 @@ export function printSeatmeshBanner(opts) {
|
|
|
109
182
|
if (subtitle)
|
|
110
183
|
console.log(frameSubtitle(subtitle));
|
|
111
184
|
console.log("");
|
|
185
|
+
return true;
|
|
112
186
|
}
|
|
113
187
|
//# sourceMappingURL=banner.js.map
|
package/dist/ui/banner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.test.d.ts","sourceRoot":"","sources":["../../src/ui/banner.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { consumeTerminalBannerSlot } from "./banner.js";
|
|
6
|
+
describe("consumeTerminalBannerSlot", () => {
|
|
7
|
+
let tmp = "";
|
|
8
|
+
const prevCache = process.env.SEATMESH_BANNER_CACHE_DIR;
|
|
9
|
+
const prevBanner = process.env.SEATMESH_BANNER;
|
|
10
|
+
const prevPane = process.env.TMUX_PANE;
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
if (tmp)
|
|
13
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
14
|
+
if (prevCache === undefined)
|
|
15
|
+
delete process.env.SEATMESH_BANNER_CACHE_DIR;
|
|
16
|
+
else
|
|
17
|
+
process.env.SEATMESH_BANNER_CACHE_DIR = prevCache;
|
|
18
|
+
if (prevBanner === undefined)
|
|
19
|
+
delete process.env.SEATMESH_BANNER;
|
|
20
|
+
else
|
|
21
|
+
process.env.SEATMESH_BANNER = prevBanner;
|
|
22
|
+
if (prevPane === undefined)
|
|
23
|
+
delete process.env.TMUX_PANE;
|
|
24
|
+
else
|
|
25
|
+
process.env.TMUX_PANE = prevPane;
|
|
26
|
+
});
|
|
27
|
+
it("shows once per terminal then skips", () => {
|
|
28
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sm-banner-"));
|
|
29
|
+
process.env.SEATMESH_BANNER_CACHE_DIR = tmp;
|
|
30
|
+
delete process.env.SEATMESH_BANNER;
|
|
31
|
+
process.env.TMUX_PANE = "%test-banner-once";
|
|
32
|
+
expect(consumeTerminalBannerSlot()).toBe(true);
|
|
33
|
+
expect(consumeTerminalBannerSlot()).toBe(false);
|
|
34
|
+
expect(consumeTerminalBannerSlot()).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
it("SEATMESH_BANNER=1 always shows; =0 never", () => {
|
|
37
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sm-banner-"));
|
|
38
|
+
process.env.SEATMESH_BANNER_CACHE_DIR = tmp;
|
|
39
|
+
process.env.TMUX_PANE = "%test-banner-force";
|
|
40
|
+
process.env.SEATMESH_BANNER = "0";
|
|
41
|
+
expect(consumeTerminalBannerSlot()).toBe(false);
|
|
42
|
+
process.env.SEATMESH_BANNER = "1";
|
|
43
|
+
expect(consumeTerminalBannerSlot()).toBe(true);
|
|
44
|
+
expect(consumeTerminalBannerSlot()).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=banner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.test.js","sourceRoot":"","sources":["../../src/ui/banner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;;YACrE,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,SAAS,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,UAAU,CAAC;QAC9C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;;YACpD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,mBAAmB,CAAC;QAE5C,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC;QAClC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC;QAClC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export declare const SEATMESH_RELEASE_NOTE = "
|
|
1
|
+
/** @deprecated Prefer dynamic registry check via {@link formatHelpVersionBlock}. */
|
|
2
|
+
export declare const SEATMESH_RELEASE_NOTE = "See: seatmesh version --check-registry";
|
|
3
3
|
export declare function readInstalledCliVersion(): string;
|
|
4
|
+
/** Last `seatmesh update` stamp in a profile dir — not the running CLI version. */
|
|
5
|
+
export declare function readProfileSeatmeshVersion(profileDir: string): string | null;
|
|
6
|
+
export declare function installKindLabel(): "dev checkout" | "npx cache" | "global/npm";
|
|
4
7
|
/** True for global / npx installs — skip git monorepo `packages/cli/dist` dev path. */
|
|
5
8
|
export declare function isRegistrySeatmeshInstall(): boolean;
|
|
6
9
|
/**
|
|
@@ -13,6 +16,17 @@ export declare function formatInstallStatusLine(installed: string, latest: strin
|
|
|
13
16
|
export declare function semverLess(a: string, b: string): boolean;
|
|
14
17
|
export declare function resolveLatestRegistryVersion(force?: boolean): string | null;
|
|
15
18
|
export declare function formatVersionUpgradeHint(installed: string, latest: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Lines under the bare `npx seatmesh` / `--help` logo: installed vs registry + how to update.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatHelpVersionBlock(installed: string, latest: string | null, kind?: ReturnType<typeof installKindLabel>): string[];
|
|
23
|
+
export interface VersionInfoOptions {
|
|
24
|
+
profileDir?: string;
|
|
25
|
+
json?: boolean;
|
|
26
|
+
forceRegistryCheck?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** `seatmesh version` — installed CLI vs npm latest vs profile stamp. */
|
|
29
|
+
export declare function printVersionInfo(opts?: VersionInfoOptions): void;
|
|
16
30
|
/** stderr hint when registry has a newer seatmesh (registry/npx/global installs only). */
|
|
17
31
|
export declare function maybePrintVersionNudge(opts?: {
|
|
18
32
|
forceCheck?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-nudge.d.ts","sourceRoot":"","sources":["../../src/ui/version-nudge.ts"],"names":[],"mappings":"AASA,
|
|
1
|
+
{"version":3,"file":"version-nudge.d.ts","sourceRoot":"","sources":["../../src/ui/version-nudge.ts"],"names":[],"mappings":"AASA,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,2CAA2C,CAAC;AAE9E,wBAAgB,uBAAuB,IAAI,MAAM,CAKhD;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5E;AAED,wBAAgB,gBAAgB,IAAI,cAAc,GAAG,WAAW,GAAG,YAAY,CAI9E;AAED,uFAAuF;AACvF,wBAAgB,yBAAyB,IAAI,OAAO,CAGnD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQxF;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAUxD;AA2CD,wBAAgB,4BAA4B,CAAC,KAAK,UAAQ,GAAG,MAAM,GAAG,IAAI,CAUzE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,GAAE,UAAU,CAAC,OAAO,gBAAgB,CAAsB,GAC7D,MAAM,EAAE,CA2BV;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,kBAAuB,GAAG,IAAI,CA+BpE;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAS5E"}
|
package/dist/ui/version-nudge.js
CHANGED
|
@@ -5,14 +5,29 @@ import path from "node:path";
|
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
const CACHE_TTL_MS = 6 * 60 * 60 * 1000;
|
|
7
7
|
const NPM_REGISTRY = "https://registry.npmjs.org";
|
|
8
|
-
/**
|
|
9
|
-
export const SEATMESH_RELEASE_NOTE = "
|
|
8
|
+
/** @deprecated Prefer dynamic registry check via {@link formatHelpVersionBlock}. */
|
|
9
|
+
export const SEATMESH_RELEASE_NOTE = "See: seatmesh version --check-registry";
|
|
10
10
|
export function readInstalledCliVersion() {
|
|
11
11
|
// version-nudge.ts lives in src/ui/ (dist/ui/); package.json is at the package root.
|
|
12
12
|
const pkgPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
|
|
13
13
|
const raw = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
14
14
|
return raw.version?.trim() || "0.0.0";
|
|
15
15
|
}
|
|
16
|
+
/** Last `seatmesh update` stamp in a profile dir — not the running CLI version. */
|
|
17
|
+
export function readProfileSeatmeshVersion(profileDir) {
|
|
18
|
+
const p = path.join(profileDir, ".seatmesh-version");
|
|
19
|
+
if (!fs.existsSync(p))
|
|
20
|
+
return null;
|
|
21
|
+
const v = fs.readFileSync(p, "utf8").trim();
|
|
22
|
+
return v || null;
|
|
23
|
+
}
|
|
24
|
+
export function installKindLabel() {
|
|
25
|
+
if (!isRegistrySeatmeshInstall())
|
|
26
|
+
return "dev checkout";
|
|
27
|
+
if (isNpxEphemeralInstall())
|
|
28
|
+
return "npx cache";
|
|
29
|
+
return "global/npm";
|
|
30
|
+
}
|
|
16
31
|
/** True for global / npx installs — skip git monorepo `packages/cli/dist` dev path. */
|
|
17
32
|
export function isRegistrySeatmeshInstall() {
|
|
18
33
|
const dir = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -90,9 +105,71 @@ export function resolveLatestRegistryVersion(force = false) {
|
|
|
90
105
|
return latest;
|
|
91
106
|
}
|
|
92
107
|
export function formatVersionUpgradeHint(installed, latest) {
|
|
93
|
-
return (`seatmesh:
|
|
108
|
+
return (`seatmesh: this ${installed}; npm latest ${latest}. ` +
|
|
94
109
|
`Upgrade: npm install -g seatmesh@latest or npx seatmesh@latest <cmd…>`);
|
|
95
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Lines under the bare `npx seatmesh` / `--help` logo: installed vs registry + how to update.
|
|
113
|
+
*/
|
|
114
|
+
export function formatHelpVersionBlock(installed, latest, kind = installKindLabel()) {
|
|
115
|
+
const lines = [];
|
|
116
|
+
if (latest) {
|
|
117
|
+
if (semverLess(installed, latest)) {
|
|
118
|
+
lines.push(`version ${installed} · npm latest ${latest} · update available`);
|
|
119
|
+
}
|
|
120
|
+
else if (semverLess(latest, installed)) {
|
|
121
|
+
lines.push(`version ${installed} · npm latest ${latest} · ahead of npm`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
lines.push(`version ${installed} · npm latest ${latest} · up to date`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
lines.push(`version ${installed} · npm latest (offline / check failed)`);
|
|
129
|
+
}
|
|
130
|
+
if (kind === "dev checkout") {
|
|
131
|
+
lines.push(`install: dev checkout`);
|
|
132
|
+
}
|
|
133
|
+
else if (kind === "npx cache") {
|
|
134
|
+
lines.push(`install: npx cache (ephemeral) — prefer: npm install -g seatmesh@latest`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
lines.push(`install: global/npm`);
|
|
138
|
+
}
|
|
139
|
+
if (latest && semverLess(installed, latest)) {
|
|
140
|
+
lines.push(`update: npm install -g seatmesh@latest`);
|
|
141
|
+
lines.push(` or: npx seatmesh@latest update`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
lines.push(`update: npm install -g seatmesh@latest · npx seatmesh@latest update`);
|
|
145
|
+
}
|
|
146
|
+
return lines;
|
|
147
|
+
}
|
|
148
|
+
/** `seatmesh version` — installed CLI vs npm latest vs profile stamp. */
|
|
149
|
+
export function printVersionInfo(opts = {}) {
|
|
150
|
+
const installed = readInstalledCliVersion();
|
|
151
|
+
const latest = resolveLatestRegistryVersion(Boolean(opts.forceRegistryCheck));
|
|
152
|
+
const kind = installKindLabel();
|
|
153
|
+
const profileStamp = opts.profileDir ? readProfileSeatmeshVersion(opts.profileDir) : null;
|
|
154
|
+
if (opts.json) {
|
|
155
|
+
console.log(JSON.stringify({
|
|
156
|
+
cli: installed,
|
|
157
|
+
npmLatest: latest,
|
|
158
|
+
install: kind,
|
|
159
|
+
profileSeatmeshVersion: profileStamp,
|
|
160
|
+
upToDate: !latest || !semverLess(installed, latest),
|
|
161
|
+
}, null, 2));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
console.log(formatInstallStatusLine(installed, latest));
|
|
165
|
+
console.log(` install: ${kind}`);
|
|
166
|
+
if (profileStamp != null) {
|
|
167
|
+
console.log(` profile .seatmesh-version: ${profileStamp} (last profile update, not this CLI)`);
|
|
168
|
+
}
|
|
169
|
+
if (kind === "npx cache") {
|
|
170
|
+
console.log(" hint: npm install -g seatmesh@latest for a pinned CLI on PATH");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
96
173
|
/** stderr hint when registry has a newer seatmesh (registry/npx/global installs only). */
|
|
97
174
|
export function maybePrintVersionNudge(opts) {
|
|
98
175
|
if (process.env.SEATMESH_SKIP_VERSION_CHECK === "1")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-nudge.js","sourceRoot":"","sources":["../../src/ui/version-nudge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACxC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"version-nudge.js","sourceRoot":"","sources":["../../src/ui/version-nudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { formatHelpVersionBlock, formatVersionUpgradeHint, readProfileSeatmeshVersion, semverLess, } from "./version-nudge.js";
|
|
3
6
|
describe("version-nudge", () => {
|
|
4
7
|
it("semverLess compares patch releases", () => {
|
|
5
8
|
expect(semverLess("0.1.19", "0.1.20")).toBe(true);
|
|
@@ -10,7 +13,32 @@ describe("version-nudge", () => {
|
|
|
10
13
|
const line = formatVersionUpgradeHint("0.1.18", "0.1.20");
|
|
11
14
|
expect(line).toContain("npm install -g seatmesh@latest");
|
|
12
15
|
expect(line).toContain("npx seatmesh@latest");
|
|
13
|
-
expect(line).toContain("
|
|
16
|
+
expect(line).toContain("this 0.1.18");
|
|
17
|
+
expect(line).toContain("npm latest 0.1.20");
|
|
18
|
+
});
|
|
19
|
+
it("help version block shows installed, latest, and update howto", () => {
|
|
20
|
+
const behind = formatHelpVersionBlock("1.0.2", "1.0.3", "global/npm");
|
|
21
|
+
expect(behind.some((l) => l.includes("version 1.0.2"))).toBe(true);
|
|
22
|
+
expect(behind.some((l) => l.includes("npm latest 1.0.3"))).toBe(true);
|
|
23
|
+
expect(behind.some((l) => l.includes("update available"))).toBe(true);
|
|
24
|
+
expect(behind.some((l) => l.includes("npm install -g seatmesh@latest"))).toBe(true);
|
|
25
|
+
const current = formatHelpVersionBlock("1.0.3", "1.0.3", "dev checkout");
|
|
26
|
+
expect(current.some((l) => l.includes("up to date"))).toBe(true);
|
|
27
|
+
expect(current.some((l) => l.includes("dev checkout"))).toBe(true);
|
|
28
|
+
const ahead = formatHelpVersionBlock("1.0.3", "1.0.2", "dev checkout");
|
|
29
|
+
expect(ahead.some((l) => l.includes("ahead of npm"))).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
describe("readProfileSeatmeshVersion", () => {
|
|
32
|
+
let tmp = "";
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
if (tmp)
|
|
35
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
36
|
+
});
|
|
37
|
+
it("reads profile stamp file", () => {
|
|
38
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sm-ver-"));
|
|
39
|
+
fs.writeFileSync(path.join(tmp, ".seatmesh-version"), "1.0.1\n");
|
|
40
|
+
expect(readProfileSeatmeshVersion(tmp)).toBe("1.0.1");
|
|
41
|
+
});
|
|
14
42
|
});
|
|
15
43
|
});
|
|
16
44
|
//# sourceMappingURL=version-nudge.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-nudge.test.js","sourceRoot":"","sources":["../../src/ui/version-nudge.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"version-nudge.test.js","sourceRoot":"","sources":["../../src/ui/version-nudge.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "seatmesh",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=22"
|
|
6
6
|
},
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@clack/prompts": "^1.8.0",
|
|
27
|
-
"@seat-mesh/connectivity": "1.0.
|
|
28
|
-
"@seat-mesh/core": "1.0.
|
|
29
|
-
"@seat-mesh/daemon": "1.0.
|
|
30
|
-
"@seat-mesh/providers": "1.0.
|
|
31
|
-
"@seat-mesh/tmux": "1.0.
|
|
27
|
+
"@seat-mesh/connectivity": "1.0.4",
|
|
28
|
+
"@seat-mesh/core": "1.0.4",
|
|
29
|
+
"@seat-mesh/daemon": "1.0.4",
|
|
30
|
+
"@seat-mesh/providers": "1.0.4",
|
|
31
|
+
"@seat-mesh/tmux": "1.0.4",
|
|
32
32
|
"boxen": "^8.0.1",
|
|
33
33
|
"cfonts": "^3.3.1",
|
|
34
34
|
"commander": "^15.0.0"
|
|
@@ -5,7 +5,10 @@ banner:
|
|
|
5
5
|
- "comms=enqueue only; inbox daemon injects — no raw tmux send-keys"
|
|
6
6
|
- "inbox_inject_not_dan=[mesh-inbox] lines are daemon steering — shell/seat files only; not a new user task"
|
|
7
7
|
- "slot_vs_mini=slot-N = worker seat; mini-N = minis window only — NOT the same pane"
|
|
8
|
+
- "operator_eyes=beta: seatmesh agent notify \"…\" \"…\" --url <link> | notify yesno \"<title>\" \"<body>\""
|
|
8
9
|
read_first:
|
|
10
|
+
- path: .sm/AGENTS.md
|
|
11
|
+
note: seatmesh CLI gateway — agent <cmd>; notify for operator eyes + --url
|
|
9
12
|
- path: .sm/README.md
|
|
10
13
|
note: dotdir layout + seats.root
|
|
11
14
|
- path: docs/ONE-PATH.md
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Seatmesh CLI (default for every agent)
|
|
2
|
+
|
|
3
|
+
**Engine-owned.** Do not invent alternate CLIs. Discover with `agent`, then run only what it lists.
|
|
4
|
+
|
|
5
|
+
## Every turn
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
seatmesh agent whoami
|
|
9
|
+
seatmesh agent # can / cannot for THIS pane
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Default config is workspace `.sm/` (walk-up). No `--profile` needed.
|
|
13
|
+
|
|
14
|
+
Multi-config (rare): `seatmesh --profile .sm-<name> agent …` after `seatmesh session init <sm-name>`.
|
|
15
|
+
|
|
16
|
+
Run work through the gateway:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
seatmesh agent <cmd> …
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Unknown or not allowed for your seat → console `UNAUTHORIZED` (exit 2). Fix: run `agent` and pick from **can**.
|
|
23
|
+
|
|
24
|
+
## When you need the operator's eyes (beta)
|
|
25
|
+
|
|
26
|
+
**Beta** — use notify; fall back to peer/room if toast fails.
|
|
27
|
+
|
|
28
|
+
Do **not** ask the operator in chat to “look”. Prefer **notify**.
|
|
29
|
+
|
|
30
|
+
### Craft an Info link (local UI — markdown + actionables)
|
|
31
|
+
|
|
32
|
+
Agents write **simple markdown** (or richer md + images). Info opens the **seatmesh UI card** (`/act/card/…`) — not mdview — so the same page can hold **Yes/No**.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Info only (markdown on local UI)
|
|
36
|
+
seatmesh agent notify info "Landing CTA" --body "## Options\n\n- A terracotta\n- B black"
|
|
37
|
+
|
|
38
|
+
# Info + Yes/No on the same UI card
|
|
39
|
+
seatmesh agent notify yesno "Ship terracotta?" "Quick call" \
|
|
40
|
+
--md ./brief.md --image shot.png --target manager
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Aliases: `notify info` · `notify md` · `notify details`
|
|
44
|
+
|
|
45
|
+
### Eyes-only (existing link)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
seatmesh agent notify "<session>" "<check>" --url "<link>"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Piece | Agent crafts | Operator gets |
|
|
52
|
+
|-------|----------------|---------------|
|
|
53
|
+
| **Info** | `--md` / `--body` / `--image` → local `/act/card` UI | Rendered markdown + Yes/No on same page |
|
|
54
|
+
| **Yes / No** | (built-in) | Peer to reply seat as `PRIORITY [operator-decide]` |
|
|
55
|
+
|
|
56
|
+
Never: “please check my pane” without notify.
|
|
57
|
+
|
|
58
|
+
## Common cmds (still via `agent`)
|
|
59
|
+
|
|
60
|
+
| Job | Command |
|
|
61
|
+
|-----|---------|
|
|
62
|
+
| Craft Info link | `agent notify info\|md "<title>" --md <file>\|--body "…"` |
|
|
63
|
+
| Info + Yes/No | `agent notify yesno "<title>" "<blurb>" [--md file]` |
|
|
64
|
+
| Eyes + URL | `agent notify "<session>" "<check>" [--url <link>]` |
|
|
65
|
+
| Reply / ask | `agent peer <target> "<msg>" [--ended <ack-id>]` |
|
|
66
|
+
| Close ask | `agent ack <id> "<note>"` |
|
|
67
|
+
| List / stop checkback | `agent cb list` · `agent cb cancel <id>` |
|
|
68
|
+
| Room | `agent room tail [-r slug]` · `agent room say …` |
|
|
69
|
+
| Peek | `agent peek <target> status\|full` |
|
|
70
|
+
| Agent vs terminal | `agent kind <target>` (aliases: `what`, `typeof`) |
|
|
71
|
+
| Seats snapshot | `agent contexts` |
|
|
72
|
+
|
|
73
|
+
Lead-only extras (manager/secretary) appear on your `agent` card — spawn/assign/inbox restart are not universal.
|
|
74
|
+
|
|
75
|
+
## Outside `agent` (operator / shared)
|
|
76
|
+
|
|
77
|
+
Humans and session ops only — not the pane default path:
|
|
78
|
+
|
|
79
|
+
`session` · `session init <sm-name>` · `update` · `init` · `report` · `layout` · `save` · `inbox restart` · `target`
|
|
80
|
+
|
|
81
|
+
## Hard rules
|
|
82
|
+
|
|
83
|
+
- Enqueue only — no raw `tmux send-keys` for mesh mail.
|
|
84
|
+
- `[mesh-inbox]` / DIGEST lines are daemon steering, not a new human task.
|
|
85
|
+
- Inject copy = mesh-copy consts. Never paste `patterns.md` into a pane.
|
|
86
|
+
- Chat prose does not clear ACK or cancel checkback — use `ack` / `cb cancel`.
|
|
87
|
+
- Operator eyeball/approve/prove/decide → **notify (beta)** first; do not ask chat for a toast.
|
|
@@ -58,12 +58,12 @@ seats:
|
|
|
58
58
|
mini: "mini-{n}"
|
|
59
59
|
|
|
60
60
|
state:
|
|
61
|
-
meshAgentsJson:
|
|
62
|
-
agentsJson:
|
|
61
|
+
meshAgentsJson: mesh-agents.json
|
|
62
|
+
agentsJson: mesh-agents.json
|
|
63
63
|
autoScrapeIntervalMs: 600000
|
|
64
64
|
|
|
65
65
|
data:
|
|
66
|
-
root:
|
|
66
|
+
root: runtime
|
|
67
67
|
|
|
68
68
|
roles:
|
|
69
69
|
dir: roles
|
|
@@ -87,7 +87,7 @@ ports:
|
|
|
87
87
|
worker: "30{n}0/30{n}1"
|
|
88
88
|
|
|
89
89
|
chatRooms:
|
|
90
|
-
root:
|
|
90
|
+
root: chat-rooms
|
|
91
91
|
globalSlug: global
|
|
92
92
|
checkback:
|
|
93
93
|
duration: 5m
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# Whoami-only. Standing rules live in always-on host dots, not this file.
|
|
2
2
|
banner:
|
|
3
3
|
- "prompts=mesh-copy.ts consts only — never paste patterns.md into a pane"
|
|
4
|
-
- "fresh_summon
|
|
4
|
+
- "fresh_summon=seatmesh agent whoami first; later peer is a task"
|
|
5
5
|
- "no_reconfirm=finish open TODOs; do not ask operator to continue"
|
|
6
|
+
- "operator_eyes=beta: seatmesh agent notify \"…\" \"…\" --url <link> | notify yesno \"<title>\" \"<body>\""
|
|
6
7
|
read_first:
|
|
8
|
+
- path: .sm/AGENTS.md
|
|
9
|
+
note: seatmesh CLI gateway — agent <cmd>; notify for operator eyes + --url
|
|
7
10
|
- path: docs/ONE-PATH.md
|
|
8
11
|
note: one command per job
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
kind: manager
|
|
2
2
|
extends: common
|
|
3
3
|
banner:
|
|
4
|
-
- "cold_start
|
|
4
|
+
- "cold_start=seatmesh --profile .sm agent whoami --validate | coordination; spawn/review minis; PROPOSAL gate"
|
|
5
5
|
read_first:
|
|
6
6
|
- path: .sm/mesh.config.yaml
|
|
7
7
|
note: layout + daemon port + seats.root
|
|
@@ -18,6 +18,6 @@ policies:
|
|
|
18
18
|
- id: manager_throughput
|
|
19
19
|
text: spawn minis for long generate; master stays coordination + PROPOSAL gate
|
|
20
20
|
- id: peer
|
|
21
|
-
cmd:
|
|
21
|
+
cmd: 'seatmesh --profile .sm agent peer <target> "<msg>"'
|
|
22
22
|
- id: minis
|
|
23
|
-
cmd:
|
|
23
|
+
cmd: "seatmesh --profile .sm agent mini list"
|