vde-layout 0.0.1

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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/bin/vde-layout +2 -0
  4. package/dist/cli.d.ts +27 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +138 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config/loader.d.ts +14 -0
  9. package/dist/config/loader.d.ts.map +1 -0
  10. package/dist/config/loader.js +117 -0
  11. package/dist/config/loader.js.map +1 -0
  12. package/dist/config/validator.d.ts +3 -0
  13. package/dist/config/validator.d.ts.map +1 -0
  14. package/dist/config/validator.js +168 -0
  15. package/dist/config/validator.js.map +1 -0
  16. package/dist/executor/dry-run-executor.d.ts +16 -0
  17. package/dist/executor/dry-run-executor.d.ts.map +1 -0
  18. package/dist/executor/dry-run-executor.js +45 -0
  19. package/dist/executor/dry-run-executor.js.map +1 -0
  20. package/dist/executor/index.d.ts +6 -0
  21. package/dist/executor/index.d.ts.map +1 -0
  22. package/dist/executor/index.js +10 -0
  23. package/dist/executor/index.js.map +1 -0
  24. package/dist/executor/mock-executor.d.ts +21 -0
  25. package/dist/executor/mock-executor.d.ts.map +1 -0
  26. package/dist/executor/mock-executor.js +73 -0
  27. package/dist/executor/mock-executor.js.map +1 -0
  28. package/dist/executor/real-executor.d.ts +16 -0
  29. package/dist/executor/real-executor.d.ts.map +1 -0
  30. package/dist/executor/real-executor.js +58 -0
  31. package/dist/executor/real-executor.js.map +1 -0
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +24 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/interfaces/command-executor.d.ts +7 -0
  37. package/dist/interfaces/command-executor.d.ts.map +1 -0
  38. package/dist/interfaces/command-executor.js +3 -0
  39. package/dist/interfaces/command-executor.js.map +1 -0
  40. package/dist/interfaces/index.d.ts +31 -0
  41. package/dist/interfaces/index.d.ts.map +1 -0
  42. package/dist/interfaces/index.js +3 -0
  43. package/dist/interfaces/index.js.map +1 -0
  44. package/dist/layout/engine.d.ts +18 -0
  45. package/dist/layout/engine.d.ts.map +1 -0
  46. package/dist/layout/engine.js +174 -0
  47. package/dist/layout/engine.js.map +1 -0
  48. package/dist/layout/preset.d.ts +13 -0
  49. package/dist/layout/preset.d.ts.map +1 -0
  50. package/dist/layout/preset.js +55 -0
  51. package/dist/layout/preset.js.map +1 -0
  52. package/dist/models/schema.d.ts +144 -0
  53. package/dist/models/schema.d.ts.map +1 -0
  54. package/dist/models/schema.js +95 -0
  55. package/dist/models/schema.js.map +1 -0
  56. package/dist/models/types.d.ts +34 -0
  57. package/dist/models/types.d.ts.map +1 -0
  58. package/dist/models/types.js +16 -0
  59. package/dist/models/types.js.map +1 -0
  60. package/dist/tmux/commands.d.ts +14 -0
  61. package/dist/tmux/commands.d.ts.map +1 -0
  62. package/dist/tmux/commands.js +59 -0
  63. package/dist/tmux/commands.js.map +1 -0
  64. package/dist/tmux/executor.d.ts +20 -0
  65. package/dist/tmux/executor.d.ts.map +1 -0
  66. package/dist/tmux/executor.js +64 -0
  67. package/dist/tmux/executor.js.map +1 -0
  68. package/dist/utils/errors.d.ts +36 -0
  69. package/dist/utils/errors.d.ts.map +1 -0
  70. package/dist/utils/errors.js +131 -0
  71. package/dist/utils/errors.js.map +1 -0
  72. package/dist/utils/logger.d.ts +25 -0
  73. package/dist/utils/logger.d.ts.map +1 -0
  74. package/dist/utils/logger.js +67 -0
  75. package/dist/utils/logger.js.map +1 -0
  76. package/dist/utils/ratio.d.ts +3 -0
  77. package/dist/utils/ratio.d.ts.map +1 -0
  78. package/dist/utils/ratio.js +44 -0
  79. package/dist/utils/ratio.js.map +1 -0
  80. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/tmux/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ITmuxExecutor } from "../interfaces";
2
+ import type { ICommandExecutor } from "../interfaces/command-executor";
3
+ export interface TmuxExecutorOptions {
4
+ verbose?: boolean;
5
+ dryRun?: boolean;
6
+ executor?: ICommandExecutor;
7
+ }
8
+ export declare class TmuxExecutor implements ITmuxExecutor {
9
+ private readonly executor;
10
+ constructor(options?: TmuxExecutorOptions);
11
+ private isTestEnvironment;
12
+ isInTmuxSession(): boolean;
13
+ verifyTmuxEnvironment(): Promise<void>;
14
+ execute(commandOrArgs: string | string[]): Promise<string>;
15
+ executeMany(commandsList: string[][]): Promise<void>;
16
+ getCommandString(args: string[]): string;
17
+ getCurrentSessionName(): Promise<string>;
18
+ getExecutor(): ICommandExecutor;
19
+ }
20
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/tmux/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAGtE,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC5B;AAMD,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;gBAE/B,OAAO,GAAE,mBAAwB;IAa7C,OAAO,CAAC,iBAAiB;IAQzB,eAAe,IAAI,OAAO;IAQpB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtC,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1D,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAQlC,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9C,WAAW,IAAI,gBAAgB;CAGhC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TmuxExecutor = void 0;
4
+ const execa_1 = require("execa");
5
+ const errors_1 = require("../utils/errors");
6
+ const executor_1 = require("../executor");
7
+ class TmuxExecutor {
8
+ executor;
9
+ constructor(options = {}) {
10
+ if (options.executor) {
11
+ this.executor = options.executor;
12
+ }
13
+ else if (options.dryRun === true) {
14
+ this.executor = new executor_1.DryRunExecutor({ verbose: options.verbose });
15
+ }
16
+ else if (this.isTestEnvironment()) {
17
+ this.executor = new executor_1.MockExecutor();
18
+ }
19
+ else {
20
+ this.executor = new executor_1.RealExecutor({ verbose: options.verbose });
21
+ }
22
+ }
23
+ isTestEnvironment() {
24
+ return process.env.VDE_TEST_MODE === "true" || process.env.NODE_ENV === "test" || process.env.VITEST === "true";
25
+ }
26
+ isInTmuxSession() {
27
+ return Boolean(process.env.TMUX);
28
+ }
29
+ async verifyTmuxEnvironment() {
30
+ if (!this.isInTmuxSession()) {
31
+ throw new errors_1.EnvironmentError("Must be run inside a tmux session", errors_1.ErrorCodes.NOT_IN_TMUX, {
32
+ hint: "Please start a tmux session and try again",
33
+ });
34
+ }
35
+ if (this.executor.isDryRun()) {
36
+ return;
37
+ }
38
+ try {
39
+ await (0, execa_1.execa)("tmux", ["-V"]);
40
+ }
41
+ catch (_error) {
42
+ throw new errors_1.EnvironmentError("tmux is not installed", errors_1.ErrorCodes.TMUX_NOT_FOUND, {
43
+ hint: "Please install tmux",
44
+ });
45
+ }
46
+ }
47
+ async execute(commandOrArgs) {
48
+ return this.executor.execute(commandOrArgs);
49
+ }
50
+ async executeMany(commandsList) {
51
+ return this.executor.executeMany(commandsList);
52
+ }
53
+ getCommandString(args) {
54
+ return ["tmux", ...args].join(" ");
55
+ }
56
+ async getCurrentSessionName() {
57
+ return this.execute(["display-message", "-p", "#{session_name}"]);
58
+ }
59
+ getExecutor() {
60
+ return this.executor;
61
+ }
62
+ }
63
+ exports.TmuxExecutor = TmuxExecutor;
64
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/tmux/executor.ts"],"names":[],"mappings":";;;AAAA,iCAA6B;AAC7B,4CAA8D;AAG9D,0CAAwE;AAYxE,MAAa,YAAY;IACN,QAAQ,CAAkB;IAE3C,YAAY,UAA+B,EAAE;QAC3C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAClC,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,CAAC;aAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAEpC,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAY,EAAE,CAAA;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAA;IACjH,CAAC;IAMD,eAAe;QACb,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAMD,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,yBAAgB,CAAC,mCAAmC,EAAE,mBAAU,CAAC,WAAW,EAAE;gBACtF,IAAI,EAAE,2CAA2C;aAClD,CAAC,CAAA;QACJ,CAAC;QAGD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B,OAAM;QACR,CAAC;QAGD,IAAI,CAAC;YACH,MAAM,IAAA,aAAK,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,yBAAgB,CAAC,uBAAuB,EAAE,mBAAU,CAAC,cAAc,EAAE;gBAC7E,IAAI,EAAE,qBAAqB;aAC5B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAQD,KAAK,CAAC,OAAO,CAAC,aAAgC;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC7C,CAAC;IAMD,KAAK,CAAC,WAAW,CAAC,YAAwB;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;IAChD,CAAC;IAOD,gBAAgB,CAAC,IAAc;QAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;IAMD,KAAK,CAAC,qBAAqB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAA;IACnE,CAAC;IAKD,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF;AA/FD,oCA+FC"}
@@ -0,0 +1,36 @@
1
+ export declare class VDELayoutError extends Error {
2
+ readonly code: string;
3
+ readonly details: Record<string, unknown>;
4
+ constructor(message: string, code: string, details?: Record<string, unknown>);
5
+ }
6
+ export declare class ConfigError extends VDELayoutError {
7
+ constructor(message: string, code: string, details?: Record<string, unknown>);
8
+ }
9
+ export declare class ValidationError extends VDELayoutError {
10
+ constructor(message: string, code: string, details?: Record<string, unknown>);
11
+ }
12
+ export declare class TmuxError extends VDELayoutError {
13
+ constructor(message: string, code: string, details?: Record<string, unknown>);
14
+ }
15
+ export declare class EnvironmentError extends VDELayoutError {
16
+ constructor(message: string, code: string, details?: Record<string, unknown>);
17
+ }
18
+ export declare const ErrorCodes: {
19
+ readonly CONFIG_NOT_FOUND: "CONFIG_NOT_FOUND";
20
+ readonly CONFIG_PARSE_ERROR: "CONFIG_PARSE_ERROR";
21
+ readonly CONFIG_PERMISSION_ERROR: "CONFIG_PERMISSION_ERROR";
22
+ readonly INVALID_PRESET: "INVALID_PRESET";
23
+ readonly PRESET_NOT_FOUND: "PRESET_NOT_FOUND";
24
+ readonly INVALID_LAYOUT: "INVALID_LAYOUT";
25
+ readonly INVALID_PANE: "INVALID_PANE";
26
+ readonly TMUX_NOT_RUNNING: "TMUX_NOT_RUNNING";
27
+ readonly TMUX_COMMAND_FAILED: "TMUX_COMMAND_FAILED";
28
+ readonly NOT_IN_TMUX_SESSION: "NOT_IN_TMUX_SESSION";
29
+ readonly NOT_IN_TMUX: "NOT_IN_TMUX";
30
+ readonly TMUX_NOT_FOUND: "TMUX_NOT_FOUND";
31
+ readonly TMUX_NOT_INSTALLED: "TMUX_NOT_INSTALLED";
32
+ readonly UNSUPPORTED_TMUX_VERSION: "UNSUPPORTED_TMUX_VERSION";
33
+ };
34
+ export declare function isVDELayoutError(error: unknown): error is VDELayoutError;
35
+ export declare function formatError(error: Error): string;
36
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAGA,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAEpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CASjF;AAKD,qBAAa,WAAY,SAAQ,cAAc;gBACjC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAKjF;AAKD,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAKjF;AAKD,qBAAa,SAAU,SAAQ,cAAc;gBAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAKjF;AAKD,qBAAa,gBAAiB,SAAQ,cAAc;gBACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAKjF;AAKD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;CAsBb,CAAA;AAKV,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAsChD"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorCodes = exports.EnvironmentError = exports.TmuxError = exports.ValidationError = exports.ConfigError = exports.VDELayoutError = void 0;
4
+ exports.isVDELayoutError = isVDELayoutError;
5
+ exports.formatError = formatError;
6
+ class VDELayoutError extends Error {
7
+ code;
8
+ details;
9
+ constructor(message, code, details = {}) {
10
+ super(message);
11
+ this.name = "VDELayoutError";
12
+ this.code = code;
13
+ this.details = details;
14
+ Object.setPrototypeOf(this, VDELayoutError.prototype);
15
+ }
16
+ }
17
+ exports.VDELayoutError = VDELayoutError;
18
+ class ConfigError extends VDELayoutError {
19
+ constructor(message, code, details = {}) {
20
+ super(message, code, details);
21
+ this.name = "ConfigError";
22
+ Object.setPrototypeOf(this, ConfigError.prototype);
23
+ }
24
+ }
25
+ exports.ConfigError = ConfigError;
26
+ class ValidationError extends VDELayoutError {
27
+ constructor(message, code, details = {}) {
28
+ super(message, code, details);
29
+ this.name = "ValidationError";
30
+ Object.setPrototypeOf(this, ValidationError.prototype);
31
+ }
32
+ }
33
+ exports.ValidationError = ValidationError;
34
+ class TmuxError extends VDELayoutError {
35
+ constructor(message, code, details = {}) {
36
+ super(message, code, details);
37
+ this.name = "TmuxError";
38
+ Object.setPrototypeOf(this, TmuxError.prototype);
39
+ }
40
+ }
41
+ exports.TmuxError = TmuxError;
42
+ class EnvironmentError extends VDELayoutError {
43
+ constructor(message, code, details = {}) {
44
+ super(message, code, details);
45
+ this.name = "EnvironmentError";
46
+ Object.setPrototypeOf(this, EnvironmentError.prototype);
47
+ }
48
+ }
49
+ exports.EnvironmentError = EnvironmentError;
50
+ exports.ErrorCodes = {
51
+ CONFIG_NOT_FOUND: "CONFIG_NOT_FOUND",
52
+ CONFIG_PARSE_ERROR: "CONFIG_PARSE_ERROR",
53
+ CONFIG_PERMISSION_ERROR: "CONFIG_PERMISSION_ERROR",
54
+ INVALID_PRESET: "INVALID_PRESET",
55
+ PRESET_NOT_FOUND: "PRESET_NOT_FOUND",
56
+ INVALID_LAYOUT: "INVALID_LAYOUT",
57
+ INVALID_PANE: "INVALID_PANE",
58
+ TMUX_NOT_RUNNING: "TMUX_NOT_RUNNING",
59
+ TMUX_COMMAND_FAILED: "TMUX_COMMAND_FAILED",
60
+ NOT_IN_TMUX_SESSION: "NOT_IN_TMUX_SESSION",
61
+ NOT_IN_TMUX: "NOT_IN_TMUX",
62
+ TMUX_NOT_FOUND: "TMUX_NOT_FOUND",
63
+ TMUX_NOT_INSTALLED: "TMUX_NOT_INSTALLED",
64
+ UNSUPPORTED_TMUX_VERSION: "UNSUPPORTED_TMUX_VERSION",
65
+ };
66
+ function isVDELayoutError(error) {
67
+ return error instanceof VDELayoutError;
68
+ }
69
+ function formatError(error) {
70
+ if (!isVDELayoutError(error)) {
71
+ return `${error.name}: ${error.message}`;
72
+ }
73
+ let message = `Error: ${error.message}\n`;
74
+ const formatter = errorFormatters[error.code];
75
+ if (formatter) {
76
+ message += formatter(error);
77
+ }
78
+ if (error.details.preset !== undefined) {
79
+ message += `\nPreset: ${error.details.preset}\n`;
80
+ }
81
+ if (error.details.command !== undefined) {
82
+ message += `\nCommand: ${error.details.command}\n`;
83
+ }
84
+ if (error.details.exitCode !== undefined) {
85
+ message += `Exit code: ${error.details.exitCode}\n`;
86
+ }
87
+ if (error.details.stderr !== undefined) {
88
+ message += `Error output: ${error.details.stderr}\n`;
89
+ }
90
+ if (error.details.errors !== undefined && Array.isArray(error.details.errors)) {
91
+ message += "\nValidation errors:\n";
92
+ error.details.errors.forEach((err) => {
93
+ message += ` - ${err}\n`;
94
+ });
95
+ }
96
+ return message;
97
+ }
98
+ const errorFormatters = {
99
+ [exports.ErrorCodes.CONFIG_NOT_FOUND]: (error) => {
100
+ let msg = "";
101
+ if (error.details.searchPaths !== undefined) {
102
+ msg += "\nSearched in the following locations:\n";
103
+ const paths = error.details.searchPaths;
104
+ paths.forEach((path) => {
105
+ msg += ` - ${path}\n`;
106
+ });
107
+ msg += "\nTo create a configuration file, run:\n";
108
+ msg += " mkdir -p ~/.config/vde\n";
109
+ msg += ' echo "presets: {}" > ~/.config/vde/layout.yml\n';
110
+ }
111
+ return msg;
112
+ },
113
+ [exports.ErrorCodes.NOT_IN_TMUX_SESSION]: () => {
114
+ return "\nThis command must be run inside a tmux session.\nStart tmux first with: tmux\n";
115
+ },
116
+ [exports.ErrorCodes.TMUX_NOT_INSTALLED]: () => {
117
+ return ("\ntmux is required but not installed.\n" +
118
+ "Install tmux using your package manager:\n" +
119
+ " - macOS: brew install tmux\n" +
120
+ " - Ubuntu/Debian: sudo apt-get install tmux\n" +
121
+ " - Fedora: sudo dnf install tmux\n");
122
+ },
123
+ [exports.ErrorCodes.UNSUPPORTED_TMUX_VERSION]: (error) => {
124
+ let msg = "";
125
+ if (error.details.requiredVersion !== undefined) {
126
+ msg += `\nRequired tmux version: ${error.details.requiredVersion} or higher\n`;
127
+ }
128
+ return msg;
129
+ },
130
+ };
131
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";;;AA4FA,4CAEC;AAKD,kCAsCC;AAtID,MAAa,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAQ;IACZ,OAAO,CAAyB;IAEhD,YAAY,OAAe,EAAE,IAAY,EAAE,UAAmC,EAAE;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAGtB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IACvD,CAAC;CACF;AAbD,wCAaC;AAKD,MAAa,WAAY,SAAQ,cAAc;IAC7C,YAAY,OAAe,EAAE,IAAY,EAAE,UAAmC,EAAE;QAC9E,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IACpD,CAAC;CACF;AAND,kCAMC;AAKD,MAAa,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe,EAAE,IAAY,EAAE,UAAmC,EAAE;QAC9E,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACxD,CAAC;CACF;AAND,0CAMC;AAKD,MAAa,SAAU,SAAQ,cAAc;IAC3C,YAAY,OAAe,EAAE,IAAY,EAAE,UAAmC,EAAE;QAC9E,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;QACvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAClD,CAAC;CACF;AAND,8BAMC;AAKD,MAAa,gBAAiB,SAAQ,cAAc;IAClD,YAAY,OAAe,EAAE,IAAY,EAAE,UAAmC,EAAE;QAC9E,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACzD,CAAC;CACF;AAND,4CAMC;AAKY,QAAA,UAAU,GAAG;IAExB,gBAAgB,EAAE,kBAAkB;IACpC,kBAAkB,EAAE,oBAAoB;IACxC,uBAAuB,EAAE,yBAAyB;IAGlD,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,cAAc;IAG5B,gBAAgB,EAAE,kBAAkB;IACpC,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAGhC,kBAAkB,EAAE,oBAAoB;IACxC,wBAAwB,EAAE,0BAA0B;CAC5C,CAAA;AAKV,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,cAAc,CAAA;AACxC,CAAC;AAKD,SAAgB,WAAW,CAAC,KAAY;IACtC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;IAC1C,CAAC;IAED,IAAI,OAAO,GAAG,UAAU,KAAK,CAAC,OAAO,IAAI,CAAA;IAGzC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAGD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,IAAI,aAAa,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAA;IAClD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,IAAI,cAAc,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,CAAA;IACpD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,IAAI,cAAc,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAA;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,IAAI,iBAAiB,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAA;IACtD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,wBAAwB,CAAA;QACnC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;YAC3C,OAAO,IAAI,OAAO,GAAG,IAAI,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAGD,MAAM,eAAe,GAAsD;IACzE,CAAC,kBAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;QACvC,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5C,GAAG,IAAI,0CAA0C,CAAA;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAuB,CAAA;YACnD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACrB,GAAG,IAAI,OAAO,IAAI,IAAI,CAAA;YACxB,CAAC,CAAC,CAAA;YACF,GAAG,IAAI,0CAA0C,CAAA;YACjD,GAAG,IAAI,4BAA4B,CAAA;YACnC,GAAG,IAAI,mDAAmD,CAAA;QAC5D,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,CAAC,kBAAU,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE;QACrC,OAAO,kFAAkF,CAAA;IAC3F,CAAC;IAED,CAAC,kBAAU,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE;QACpC,OAAO,CACL,yCAAyC;YACzC,4CAA4C;YAC5C,gCAAgC;YAChC,gDAAgD;YAChD,qCAAqC,CACtC,CAAA;IACH,CAAC;IAED,CAAC,kBAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/C,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAChD,GAAG,IAAI,4BAA4B,KAAK,CAAC,OAAO,CAAC,eAAe,cAAc,CAAA;QAChF,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;CACF,CAAA"}
@@ -0,0 +1,25 @@
1
+ export declare enum LogLevel {
2
+ ERROR = 0,
3
+ WARN = 1,
4
+ INFO = 2,
5
+ DEBUG = 3
6
+ }
7
+ export interface LoggerOptions {
8
+ level?: LogLevel;
9
+ prefix?: string;
10
+ }
11
+ export declare class Logger {
12
+ private level;
13
+ private prefix;
14
+ constructor(options?: LoggerOptions);
15
+ private getDefaultLogLevel;
16
+ private formatMessage;
17
+ error(message: string, error?: Error): void;
18
+ warn(message: string): void;
19
+ info(message: string): void;
20
+ debug(message: string): void;
21
+ success(message: string): void;
22
+ createChild(prefix: string): Logger;
23
+ }
24
+ export declare const logger: Logger;
25
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,MAAM,CAAQ;gBAEV,OAAO,GAAE,aAAkB;IAQvC,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,aAAa;IAOrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAY3C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ9B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAIpC;AAKD,eAAO,MAAM,MAAM,QAAe,CAAA"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = exports.Logger = exports.LogLevel = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ var LogLevel;
9
+ (function (LogLevel) {
10
+ LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
11
+ LogLevel[LogLevel["WARN"] = 1] = "WARN";
12
+ LogLevel[LogLevel["INFO"] = 2] = "INFO";
13
+ LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
14
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
15
+ class Logger {
16
+ level;
17
+ prefix;
18
+ constructor(options = {}) {
19
+ this.level = options.level ?? this.getDefaultLogLevel();
20
+ this.prefix = options.prefix ?? "";
21
+ }
22
+ getDefaultLogLevel() {
23
+ if (process.env.VDE_DEBUG === "true") {
24
+ return LogLevel.DEBUG;
25
+ }
26
+ if (process.env.VDE_VERBOSE === "true") {
27
+ return LogLevel.INFO;
28
+ }
29
+ return LogLevel.WARN;
30
+ }
31
+ formatMessage(message) {
32
+ return this.prefix ? `${this.prefix} ${message}` : message;
33
+ }
34
+ error(message, error) {
35
+ if (this.level >= LogLevel.ERROR) {
36
+ console.error(chalk_1.default.red(this.formatMessage(`Error: ${message}`)));
37
+ if (error && process.env.VDE_DEBUG === "true") {
38
+ console.error(chalk_1.default.gray(error.stack));
39
+ }
40
+ }
41
+ }
42
+ warn(message) {
43
+ if (this.level >= LogLevel.WARN) {
44
+ console.warn(chalk_1.default.yellow(this.formatMessage(message)));
45
+ }
46
+ }
47
+ info(message) {
48
+ if (this.level >= LogLevel.INFO) {
49
+ console.log(this.formatMessage(message));
50
+ }
51
+ }
52
+ debug(message) {
53
+ if (this.level >= LogLevel.DEBUG) {
54
+ console.log(chalk_1.default.gray(this.formatMessage(`[DEBUG] ${message}`)));
55
+ }
56
+ }
57
+ success(message) {
58
+ console.log(chalk_1.default.green(this.formatMessage(message)));
59
+ }
60
+ createChild(prefix) {
61
+ const childPrefix = this.prefix ? `${this.prefix} ${prefix}` : prefix;
62
+ return new Logger({ level: this.level, prefix: childPrefix });
63
+ }
64
+ }
65
+ exports.Logger = Logger;
66
+ exports.logger = new Logger();
67
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function normalizeRatio(ratio: number[]): number[];
2
+ export declare function isValidRatio(ratio: number[]): boolean;
3
+ //# sourceMappingURL=ratio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ratio.d.ts","sourceRoot":"","sources":["../../src/utils/ratio.ts"],"names":[],"mappings":"AAcA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwDxD;AAOD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAErD"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeRatio = normalizeRatio;
4
+ exports.isValidRatio = isValidRatio;
5
+ function normalizeRatio(ratio) {
6
+ if (ratio.length === 0) {
7
+ return [];
8
+ }
9
+ if (ratio.length === 1) {
10
+ return [100];
11
+ }
12
+ const sum = ratio.reduce((acc, val) => acc + val, 0);
13
+ if (sum === 0) {
14
+ const equalRatio = Math.floor(100 / ratio.length);
15
+ const remainder = 100 % ratio.length;
16
+ const result = ratio.map(() => equalRatio);
17
+ for (let i = 0; i < remainder; i++) {
18
+ result[result.length - 1 - i]++;
19
+ }
20
+ return result;
21
+ }
22
+ const normalized = ratio.map((val) => (val / sum) * 100);
23
+ const rounded = normalized.map((val) => Math.round(val));
24
+ const roundedSum = rounded.reduce((acc, val) => acc + val, 0);
25
+ const diff = 100 - roundedSum;
26
+ if (diff !== 0) {
27
+ const fractionalParts = normalized.map((val, index) => ({
28
+ index,
29
+ fractional: val - rounded[index],
30
+ }));
31
+ fractionalParts.sort((a, b) => (diff > 0 ? b.fractional - a.fractional : a.fractional - b.fractional));
32
+ for (let i = 0; i < Math.abs(diff); i++) {
33
+ if (i < fractionalParts.length) {
34
+ const targetIndex = fractionalParts[i].index;
35
+ rounded[targetIndex] += diff > 0 ? 1 : -1;
36
+ }
37
+ }
38
+ }
39
+ return rounded;
40
+ }
41
+ function isValidRatio(ratio) {
42
+ return ratio.length > 0 && ratio.every((val) => val > 0);
43
+ }
44
+ //# sourceMappingURL=ratio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ratio.js","sourceRoot":"","sources":["../../src/utils/ratio.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "vde-layout",
3
+ "version": "0.0.1",
4
+ "description": "Terminal multiplexer layout management tool for VDE (Vibe Coding Development Environment)",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "vde-layout": "./bin/vde-layout"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "clean": "rm -rf dist",
13
+ "compile": "tsc",
14
+ "dev": "tsc --watch",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest --watch",
17
+ "test:coverage": "vitest run --coverage",
18
+ "lint": "eslint src",
19
+ "format": "prettier --write \"src/**/*.ts\"",
20
+ "typecheck": "tsc --noEmit",
21
+ "prepublishOnly": "bun run clean && bun run build"
22
+ },
23
+ "keywords": [
24
+ "tmux",
25
+ "layout",
26
+ "terminal",
27
+ "multiplexer",
28
+ "vde",
29
+ "cli"
30
+ ],
31
+ "author": "Yuki Yano",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/yuki-yano/vde-layout.git"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/yuki-yano/vde-layout/issues"
39
+ },
40
+ "homepage": "https://github.com/yuki-yano/vde-layout#readme",
41
+ "files": [
42
+ "dist",
43
+ "bin",
44
+ "README.md",
45
+ "LICENSE"
46
+ ],
47
+ "dependencies": {
48
+ "chalk": "^5.4.1",
49
+ "commander": "^14.0.0",
50
+ "execa": "^9.6.0",
51
+ "fs-extra": "^11.2.0",
52
+ "yaml": "^2.3.4",
53
+ "zod": "^3.22.4"
54
+ },
55
+ "devDependencies": {
56
+ "@eslint/js": "^9.32.0",
57
+ "@types/fs-extra": "^11.0.4",
58
+ "@types/node": "^20.11.5",
59
+ "@vitest/coverage-v8": "^1.2.1",
60
+ "@vitest/runner": "^3.2.4",
61
+ "eslint": "^9.32.0",
62
+ "eslint-config-prettier": "^9.1.0",
63
+ "globals": "^16.3.0",
64
+ "prettier": "^3.2.4",
65
+ "typescript": "^5.3.3",
66
+ "typescript-eslint": "^8.38.0",
67
+ "vitest": "^1.2.1"
68
+ },
69
+ "engines": {
70
+ "node": ">=22.0.0"
71
+ }
72
+ }