@pickle-pee/genesis-cli 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +39 -0
  2. package/dist/bootstrap.d.ts +18 -0
  3. package/dist/bootstrap.js +89 -0
  4. package/dist/bootstrap.js.map +1 -0
  5. package/dist/index.d.ts +9 -0
  6. package/dist/index.js +14 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/input-loop.d.ts +42 -0
  9. package/dist/input-loop.js +344 -0
  10. package/dist/input-loop.js.map +1 -0
  11. package/dist/main.d.ts +35 -0
  12. package/dist/main.js +321 -0
  13. package/dist/main.js.map +1 -0
  14. package/dist/mode-dispatch.d.ts +100 -0
  15. package/dist/mode-dispatch.js +1830 -0
  16. package/dist/mode-dispatch.js.map +1 -0
  17. package/dist/rpc-server.d.ts +16 -0
  18. package/dist/rpc-server.js +339 -0
  19. package/dist/rpc-server.js.map +1 -0
  20. package/dist/session-store.d.ts +12 -0
  21. package/dist/session-store.js +48 -0
  22. package/dist/session-store.js.map +1 -0
  23. package/dist/terminal-display-width.d.ts +1 -0
  24. package/dist/terminal-display-width.js +33 -0
  25. package/dist/terminal-display-width.js.map +1 -0
  26. package/dist/test/bootstrap.test.d.ts +1 -0
  27. package/dist/test/bootstrap.test.js +50 -0
  28. package/dist/test/bootstrap.test.js.map +1 -0
  29. package/dist/test/input-loop-raw.test.d.ts +1 -0
  30. package/dist/test/input-loop-raw.test.js +204 -0
  31. package/dist/test/input-loop-raw.test.js.map +1 -0
  32. package/dist/test/interactive-tty-workbench.test.d.ts +1 -0
  33. package/dist/test/interactive-tty-workbench.test.js +647 -0
  34. package/dist/test/interactive-tty-workbench.test.js.map +1 -0
  35. package/dist/test/main.test.d.ts +1 -0
  36. package/dist/test/main.test.js +42 -0
  37. package/dist/test/main.test.js.map +1 -0
  38. package/dist/test/mode-dispatch.test.d.ts +1 -0
  39. package/dist/test/mode-dispatch.test.js +315 -0
  40. package/dist/test/mode-dispatch.test.js.map +1 -0
  41. package/dist/test/permission-flow.test.d.ts +7 -0
  42. package/dist/test/permission-flow.test.js +191 -0
  43. package/dist/test/permission-flow.test.js.map +1 -0
  44. package/dist/test/rpc-server.test.d.ts +7 -0
  45. package/dist/test/rpc-server.test.js +285 -0
  46. package/dist/test/rpc-server.test.js.map +1 -0
  47. package/dist/test/session-store.test.d.ts +1 -0
  48. package/dist/test/session-store.test.js +57 -0
  49. package/dist/test/session-store.test.js.map +1 -0
  50. package/dist/test/terminal-display-width.test.d.ts +1 -0
  51. package/dist/test/terminal-display-width.test.js +25 -0
  52. package/dist/test/terminal-display-width.test.js.map +1 -0
  53. package/dist/test/tty-session.test.d.ts +1 -0
  54. package/dist/test/tty-session.test.js +114 -0
  55. package/dist/test/tty-session.test.js.map +1 -0
  56. package/dist/theme.d.ts +16 -0
  57. package/dist/theme.js +20 -0
  58. package/dist/theme.js.map +1 -0
  59. package/dist/tty-session.d.ts +26 -0
  60. package/dist/tty-session.js +116 -0
  61. package/dist/tty-session.js.map +1 -0
  62. package/dist/types/index.d.ts +8 -0
  63. package/dist/types/index.js +3 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/package.json +26 -0
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_stream_1 = require("node:stream");
4
+ const vitest_1 = require("vitest");
5
+ const tty_session_js_1 = require("../tty-session.js");
6
+ function createTtyInput() {
7
+ const stream = new node_stream_1.PassThrough();
8
+ stream.isTTY = true;
9
+ stream.setRawMode = vitest_1.vi.fn();
10
+ stream.pause = vitest_1.vi.fn();
11
+ return stream;
12
+ }
13
+ function createTtyOutput() {
14
+ const stream = new node_stream_1.PassThrough();
15
+ stream.isTTY = true;
16
+ return stream;
17
+ }
18
+ (0, vitest_1.describe)("createTtySession", () => {
19
+ (0, vitest_1.it)("enters alt screen with mouse tracking and restores terminal state", () => {
20
+ const input = createTtyInput();
21
+ const output = createTtyOutput();
22
+ const restoreTermios = vitest_1.vi.fn();
23
+ let written = "";
24
+ output.on("data", (chunk) => {
25
+ written += chunk.toString("utf8");
26
+ });
27
+ const session = (0, tty_session_js_1.createTtySession)({ input, output, restoreTermios });
28
+ session.enter();
29
+ session.restore();
30
+ (0, vitest_1.expect)(written).toContain("\x1b[?1049h");
31
+ (0, vitest_1.expect)(written).toContain("\x1b[?1004h");
32
+ (0, vitest_1.expect)(written).toContain("\x1b[?1000h");
33
+ (0, vitest_1.expect)(written).toContain("\x1b[?1002h");
34
+ (0, vitest_1.expect)(written).toContain("\x1b[?1006h");
35
+ (0, vitest_1.expect)(written).toContain("\x1b[?1004l");
36
+ (0, vitest_1.expect)(written).toContain("\x1b[?1006l");
37
+ (0, vitest_1.expect)(written).toContain("\x1b[?1002l");
38
+ (0, vitest_1.expect)(written).toContain("\x1b[?1000l");
39
+ (0, vitest_1.expect)(written).toContain("\x1b[?1049l");
40
+ (0, vitest_1.expect)(input.setRawMode).toHaveBeenCalledWith(false);
41
+ (0, vitest_1.expect)(input.pause).toHaveBeenCalled();
42
+ (0, vitest_1.expect)(restoreTermios).toHaveBeenCalledTimes(1);
43
+ });
44
+ (0, vitest_1.it)("restores only once", () => {
45
+ const input = createTtyInput();
46
+ const output = createTtyOutput();
47
+ const restoreTermios = vitest_1.vi.fn();
48
+ const session = (0, tty_session_js_1.createTtySession)({ input, output, restoreTermios });
49
+ session.enter();
50
+ session.restore();
51
+ session.restore();
52
+ (0, vitest_1.expect)(restoreTermios).toHaveBeenCalledTimes(1);
53
+ });
54
+ (0, vitest_1.it)("refresh re-enables raw mode and focus reporting", () => {
55
+ const input = createTtyInput();
56
+ const output = createTtyOutput();
57
+ let written = "";
58
+ output.on("data", (chunk) => {
59
+ written += chunk.toString("utf8");
60
+ });
61
+ const session = (0, tty_session_js_1.createTtySession)({ input, output, restoreTermios: vitest_1.vi.fn() });
62
+ session.enter();
63
+ session.refresh();
64
+ (0, vitest_1.expect)(input.setRawMode).toHaveBeenCalledWith(true);
65
+ (0, vitest_1.expect)(written.match(new RegExp(`${String.fromCharCode(27)}\\[\\?1004h`, "g"))?.length).toBeGreaterThanOrEqual(2);
66
+ });
67
+ (0, vitest_1.it)("can stay on the primary buffer without mouse tracking", () => {
68
+ const input = createTtyInput();
69
+ const output = createTtyOutput();
70
+ let written = "";
71
+ output.on("data", (chunk) => {
72
+ written += chunk.toString("utf8");
73
+ });
74
+ const session = (0, tty_session_js_1.createTtySession)({
75
+ input,
76
+ output,
77
+ restoreTermios: vitest_1.vi.fn(),
78
+ useAlternateScreen: false,
79
+ enableMouseTracking: false,
80
+ });
81
+ session.enter();
82
+ session.restore();
83
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1049h");
84
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1000h");
85
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1002h");
86
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1006h");
87
+ (0, vitest_1.expect)(written).toContain("\x1b[?1004h");
88
+ (0, vitest_1.expect)(written).toContain("\x1b[?1004l");
89
+ });
90
+ (0, vitest_1.it)("refresh on the primary buffer does not re-enter alt screen or mouse tracking", () => {
91
+ const input = createTtyInput();
92
+ const output = createTtyOutput();
93
+ let written = "";
94
+ output.on("data", (chunk) => {
95
+ written += chunk.toString("utf8");
96
+ });
97
+ const session = (0, tty_session_js_1.createTtySession)({
98
+ input,
99
+ output,
100
+ restoreTermios: vitest_1.vi.fn(),
101
+ useAlternateScreen: false,
102
+ enableMouseTracking: false,
103
+ });
104
+ session.enter();
105
+ session.refresh({ reenterAlternateScreen: true });
106
+ (0, vitest_1.expect)(input.setRawMode).toHaveBeenCalledWith(true);
107
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1049h");
108
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1000h");
109
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1002h");
110
+ (0, vitest_1.expect)(written).not.toContain("\x1b[?1006h");
111
+ (0, vitest_1.expect)(written.match(new RegExp(`${String.fromCharCode(27)}\\[\\?1004h`, "g"))?.length).toBeGreaterThanOrEqual(2);
112
+ });
113
+ });
114
+ //# sourceMappingURL=tty-session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty-session.test.js","sourceRoot":"","sources":["../../src/test/tty-session.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const INTERACTIVE_THEME: {
2
+ readonly brand: "\u001B[38;5;111m";
3
+ readonly accent: "\u001B[38;5;153m";
4
+ readonly success: "\u001B[38;5;114m";
5
+ readonly muted: "\u001B[2m";
6
+ readonly bold: "\u001B[1m";
7
+ readonly reset: "\u001B[0m";
8
+ readonly welcomeBorder: "\u001B[38;5;236m";
9
+ readonly welcomeTitle: "\u001B[38;5;111m";
10
+ readonly promptBg: "\u001B[48;5;252m";
11
+ readonly promptFg: "\u001B[38;5;235m";
12
+ readonly userTranscriptFg: "\u001B[38;5;235m";
13
+ readonly selectedBg: "\u001B[48;5;111m";
14
+ readonly selectedFg: "\u001B[38;5;16m";
15
+ readonly assistantBullet: "\u001B[38;5;111m";
16
+ };
package/dist/theme.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INTERACTIVE_THEME = void 0;
4
+ exports.INTERACTIVE_THEME = {
5
+ brand: "\x1b[38;5;111m",
6
+ accent: "\x1b[38;5;153m",
7
+ success: "\x1b[38;5;114m",
8
+ muted: "\x1b[2m",
9
+ bold: "\x1b[1m",
10
+ reset: "\x1b[0m",
11
+ welcomeBorder: "\x1b[38;5;236m",
12
+ welcomeTitle: "\x1b[38;5;111m",
13
+ promptBg: "\x1b[48;5;252m",
14
+ promptFg: "\x1b[38;5;235m",
15
+ userTranscriptFg: "\x1b[38;5;235m",
16
+ selectedBg: "\x1b[48;5;111m",
17
+ selectedFg: "\x1b[38;5;16m",
18
+ assistantBullet: "\x1b[38;5;111m",
19
+ };
20
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG;IAChC,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,gBAAgB;IAC9B,QAAQ,EAAE,gBAAgB;IAC1B,QAAQ,EAAE,gBAAgB;IAC1B,gBAAgB,EAAE,gBAAgB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,eAAe;IAC3B,eAAe,EAAE,gBAAgB;CACxB,CAAC"}
@@ -0,0 +1,26 @@
1
+ type TtyInput = NodeJS.ReadableStream & {
2
+ isTTY?: boolean;
3
+ setRawMode?: (enabled: boolean) => void;
4
+ pause?: () => void;
5
+ };
6
+ type TtyOutput = NodeJS.WritableStream & {
7
+ isTTY?: boolean;
8
+ write(chunk: string): boolean;
9
+ };
10
+ interface TtySessionOptions {
11
+ readonly input?: TtyInput;
12
+ readonly output?: TtyOutput;
13
+ readonly restoreTermios?: () => void;
14
+ readonly onResume?: () => void;
15
+ readonly useAlternateScreen?: boolean;
16
+ readonly enableMouseTracking?: boolean;
17
+ }
18
+ export interface TtySession {
19
+ enter(): void;
20
+ refresh(options?: {
21
+ readonly reenterAlternateScreen?: boolean;
22
+ }): void;
23
+ restore(): void;
24
+ }
25
+ export declare function createTtySession(options?: TtySessionOptions): TtySession;
26
+ export {};
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTtySession = createTtySession;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const ui_1 = require("@pickle-pee/ui");
6
+ function createTtySession(options = {}) {
7
+ const input = options.input ?? process.stdin;
8
+ const output = options.output ?? process.stdout;
9
+ const restoreTermios = options.restoreTermios ?? defaultRestoreTermios;
10
+ const onResume = options.onResume;
11
+ const useAlternateScreen = options.useAlternateScreen ?? true;
12
+ const enableMouseTracking = options.enableMouseTracking ?? true;
13
+ let active = false;
14
+ let restored = false;
15
+ const signalHandlers = new Map();
16
+ const removeSignalHandlers = () => {
17
+ for (const [signal, listener] of signalHandlers) {
18
+ process.off(signal, listener);
19
+ }
20
+ signalHandlers.clear();
21
+ };
22
+ const writeActiveModes = (reenterAlternateScreen) => {
23
+ if (useAlternateScreen && reenterAlternateScreen) {
24
+ output.write((0, ui_1.ansiEnterAlternateScreen)());
25
+ }
26
+ output.write((0, ui_1.ansiEnableFocusReporting)());
27
+ if (enableMouseTracking) {
28
+ output.write((0, ui_1.ansiEnableMouseTracking)());
29
+ }
30
+ output.write((0, ui_1.ansiHideCursor)());
31
+ };
32
+ return {
33
+ enter() {
34
+ if (active || restored) {
35
+ return;
36
+ }
37
+ active = true;
38
+ if (useAlternateScreen) {
39
+ output.write((0, ui_1.ansiEnterAlternateScreen)());
40
+ }
41
+ writeActiveModes(false);
42
+ for (const signal of ["SIGINT", "SIGTERM", "SIGCONT"]) {
43
+ const listener = () => {
44
+ if (signal === "SIGCONT") {
45
+ this.refresh({ reenterAlternateScreen: true });
46
+ onResume?.();
47
+ return;
48
+ }
49
+ this.restore();
50
+ };
51
+ signalHandlers.set(signal, listener);
52
+ if (signal === "SIGCONT") {
53
+ process.on(signal, listener);
54
+ }
55
+ else {
56
+ process.once(signal, listener);
57
+ }
58
+ }
59
+ },
60
+ refresh({ reenterAlternateScreen = false } = {}) {
61
+ if (restored) {
62
+ return;
63
+ }
64
+ active = true;
65
+ try {
66
+ input.resume?.();
67
+ }
68
+ catch { }
69
+ try {
70
+ input.setRawMode?.(true);
71
+ }
72
+ catch { }
73
+ writeActiveModes(reenterAlternateScreen);
74
+ },
75
+ restore() {
76
+ if (restored) {
77
+ return;
78
+ }
79
+ restored = true;
80
+ active = false;
81
+ removeSignalHandlers();
82
+ try {
83
+ input.setRawMode?.(false);
84
+ }
85
+ catch { }
86
+ try {
87
+ input.pause?.();
88
+ }
89
+ catch { }
90
+ try {
91
+ output.write((0, ui_1.ansiShowCursor)());
92
+ output.write((0, ui_1.ansiDisableFocusReporting)());
93
+ if (enableMouseTracking) {
94
+ output.write((0, ui_1.ansiDisableMouseTracking)());
95
+ }
96
+ if (useAlternateScreen) {
97
+ output.write((0, ui_1.ansiExitAlternateScreen)());
98
+ }
99
+ }
100
+ catch { }
101
+ try {
102
+ restoreTermios();
103
+ }
104
+ catch { }
105
+ },
106
+ };
107
+ }
108
+ function defaultRestoreTermios() {
109
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
110
+ return;
111
+ }
112
+ (0, node_child_process_1.spawnSync)("stty", ["sane"], {
113
+ stdio: ["inherit", "ignore", "ignore"],
114
+ });
115
+ }
116
+ //# sourceMappingURL=tty-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty-session.js","sourceRoot":"","sources":["../src/tty-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CLI mode identifiers.
3
+ *
4
+ * The canonical definition lives in @pickle-pee/runtime
5
+ * to avoid circular dependencies (app-cli depends on app-runtime).
6
+ * This file re-exports for convenience.
7
+ */
8
+ export type { CliMode } from "@pickle-pee/runtime";
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@pickle-pee/genesis-cli",
3
+ "version": "0.0.0",
4
+ "description": "CLI entry point, argument parsing, and mode routing",
5
+ "bin": {
6
+ "genesis": "./dist/main.js"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "scripts": {
11
+ "build": "node -e \"const fs = require('node:fs'); fs.rmSync('dist', { recursive: true, force: true }); fs.rmSync('tsconfig.build.tsbuildinfo', { force: true });\" && tsc -p tsconfig.build.json && node -e \"require('node:fs').chmodSync('dist/main.js', 0o755)\"",
12
+ "test": "vitest run"
13
+ },
14
+ "dependencies": {
15
+ "@pickle-pee/config": "0.0.0",
16
+ "@pickle-pee/runtime": "0.0.0",
17
+ "@pickle-pee/ui": "0.0.0"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md"
25
+ ]
26
+ }