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.
Files changed (49) hide show
  1. package/dist/commands/ack-cli.d.ts +4 -0
  2. package/dist/commands/ack-cli.d.ts.map +1 -0
  3. package/dist/commands/ack-cli.js +105 -0
  4. package/dist/commands/ack-cli.js.map +1 -0
  5. package/dist/commands/checkback-cli.d.ts.map +1 -1
  6. package/dist/commands/checkback-cli.js +6 -0
  7. package/dist/commands/checkback-cli.js.map +1 -1
  8. package/dist/commands/notify-cli.d.ts.map +1 -1
  9. package/dist/commands/notify-cli.js +69 -10
  10. package/dist/commands/notify-cli.js.map +1 -1
  11. package/dist/commands/target-cli.d.ts +4 -0
  12. package/dist/commands/target-cli.d.ts.map +1 -0
  13. package/dist/commands/target-cli.js +146 -0
  14. package/dist/commands/target-cli.js.map +1 -0
  15. package/dist/main.js +241 -77
  16. package/dist/main.js.map +1 -1
  17. package/dist/setup/agent-context-init.d.ts.map +1 -1
  18. package/dist/setup/agent-context-init.js +11 -5
  19. package/dist/setup/agent-context-init.js.map +1 -1
  20. package/dist/setup/init.d.ts +23 -3
  21. package/dist/setup/init.d.ts.map +1 -1
  22. package/dist/setup/init.js +71 -3
  23. package/dist/setup/init.js.map +1 -1
  24. package/dist/setup/update.d.ts.map +1 -1
  25. package/dist/setup/update.js +17 -11
  26. package/dist/setup/update.js.map +1 -1
  27. package/dist/ui/banner.d.ts +17 -2
  28. package/dist/ui/banner.d.ts.map +1 -1
  29. package/dist/ui/banner.js +76 -2
  30. package/dist/ui/banner.js.map +1 -1
  31. package/dist/ui/banner.test.d.ts +2 -0
  32. package/dist/ui/banner.test.d.ts.map +1 -0
  33. package/dist/ui/banner.test.js +47 -0
  34. package/dist/ui/banner.test.js.map +1 -0
  35. package/dist/ui/version-nudge.d.ts +16 -2
  36. package/dist/ui/version-nudge.d.ts.map +1 -1
  37. package/dist/ui/version-nudge.js +80 -3
  38. package/dist/ui/version-nudge.js.map +1 -1
  39. package/dist/ui/version-nudge.test.js +31 -3
  40. package/dist/ui/version-nudge.test.js.map +1 -1
  41. package/package.json +6 -6
  42. package/profiles/minimal/roles/common.yaml +3 -0
  43. package/templates/init/AGENTS.md +87 -0
  44. package/templates/init/mesh.config.yaml +4 -4
  45. package/templates/init/roles/common.yaml +4 -1
  46. package/templates/init/roles/manager.yaml +3 -3
  47. package/templates/init/roles/mini.yaml +4 -4
  48. package/templates/init/roles/secretary.yaml +2 -2
  49. package/templates/init/roles/worker.yaml +5 -5
@@ -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
- /** Brand header: logo + title + optional centered tagline. */
8
- export declare function printSeatmeshBanner(opts?: string | BannerOpts): void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAKA,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;CAC5B,CAAC;AA0EF,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAyCpE"}
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
- /** Brand header: logo + title + optional centered tagline. */
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 { subtitle, tagline: taglineOpt } = resolveBannerOpts(opts);
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
@@ -1 +1 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=banner.test.d.ts.map
@@ -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
- /** Public npm release track (shown in upgrade hint). */
2
- export declare const SEATMESH_RELEASE_NOTE = "Latest: seatmesh@1.0.2 (2026-09-14).";
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,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAE5E,wBAAgB,uBAAuB,IAAI,MAAM,CAKhD;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,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAS5E"}
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"}
@@ -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
- /** Public npm release track (shown in upgrade hint). */
9
- export const SEATMESH_RELEASE_NOTE = "Latest: seatmesh@1.0.2 (2026-09-14).";
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: installed ${installed}; npm latest ${latest}. ${SEATMESH_RELEASE_NOTE} ` +
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":"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"}
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 { describe, expect, it } from "vitest";
2
- import { formatVersionUpgradeHint, semverLess } from "./version-nudge.js";
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("2026-09-14");
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;AAC9C,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,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.2",
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.2",
28
- "@seat-mesh/core": "1.0.2",
29
- "@seat-mesh/daemon": "1.0.2",
30
- "@seat-mesh/providers": "1.0.2",
31
- "@seat-mesh/tmux": "1.0.2",
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: .sm/mesh-agents.json
62
- agentsJson: .sm/agents.json
61
+ meshAgentsJson: mesh-agents.json
62
+ agentsJson: mesh-agents.json
63
63
  autoScrapeIntervalMs: 600000
64
64
 
65
65
  data:
66
- root: .sm/runtime
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: .sm/chat-rooms
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=./sm.sh whoami first; later peer is a task"
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=./sm.sh whoami --validate | coordination; spawn/review minis; PROPOSAL gate"
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: ./sm.sh peer <target> "<msg>"
21
+ cmd: 'seatmesh --profile .sm agent peer <target> "<msg>"'
22
22
  - id: minis
23
- cmd: ./sm.sh mini list
23
+ cmd: "seatmesh --profile .sm agent mini list"