envmatic 1.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 (102) hide show
  1. package/README.md +567 -0
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +203 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/add.d.ts +11 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +77 -0
  9. package/dist/commands/add.js.map +1 -0
  10. package/dist/commands/delete.d.ts +6 -0
  11. package/dist/commands/delete.d.ts.map +1 -0
  12. package/dist/commands/delete.js +78 -0
  13. package/dist/commands/delete.js.map +1 -0
  14. package/dist/commands/edit.d.ts +13 -0
  15. package/dist/commands/edit.d.ts.map +1 -0
  16. package/dist/commands/edit.js +364 -0
  17. package/dist/commands/edit.js.map +1 -0
  18. package/dist/commands/import.d.ts +11 -0
  19. package/dist/commands/import.d.ts.map +1 -0
  20. package/dist/commands/import.js +103 -0
  21. package/dist/commands/import.js.map +1 -0
  22. package/dist/commands/init.d.ts +8 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +237 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/link.d.ts +16 -0
  27. package/dist/commands/link.d.ts.map +1 -0
  28. package/dist/commands/link.js +157 -0
  29. package/dist/commands/link.js.map +1 -0
  30. package/dist/commands/list.d.ts +9 -0
  31. package/dist/commands/list.d.ts.map +1 -0
  32. package/dist/commands/list.js +73 -0
  33. package/dist/commands/list.js.map +1 -0
  34. package/dist/commands/lock.d.ts +16 -0
  35. package/dist/commands/lock.d.ts.map +1 -0
  36. package/dist/commands/lock.js +245 -0
  37. package/dist/commands/lock.js.map +1 -0
  38. package/dist/commands/rotate.d.ts +15 -0
  39. package/dist/commands/rotate.d.ts.map +1 -0
  40. package/dist/commands/rotate.js +406 -0
  41. package/dist/commands/rotate.js.map +1 -0
  42. package/dist/commands/show.d.ts +9 -0
  43. package/dist/commands/show.d.ts.map +1 -0
  44. package/dist/commands/show.js +72 -0
  45. package/dist/commands/show.js.map +1 -0
  46. package/dist/commands/sync.d.ts +13 -0
  47. package/dist/commands/sync.d.ts.map +1 -0
  48. package/dist/commands/sync.js +174 -0
  49. package/dist/commands/sync.js.map +1 -0
  50. package/dist/commands/use.d.ts +19 -0
  51. package/dist/commands/use.d.ts.map +1 -0
  52. package/dist/commands/use.js +238 -0
  53. package/dist/commands/use.js.map +1 -0
  54. package/dist/constants.d.ts +20 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +47 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/index.d.ts +15 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +21 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/services/config.d.ts +64 -0
  63. package/dist/services/config.d.ts.map +1 -0
  64. package/dist/services/config.js +133 -0
  65. package/dist/services/config.js.map +1 -0
  66. package/dist/services/encryption.d.ts +30 -0
  67. package/dist/services/encryption.d.ts.map +1 -0
  68. package/dist/services/encryption.js +146 -0
  69. package/dist/services/encryption.js.map +1 -0
  70. package/dist/services/envfile.d.ts +76 -0
  71. package/dist/services/envfile.d.ts.map +1 -0
  72. package/dist/services/envfile.js +247 -0
  73. package/dist/services/envfile.js.map +1 -0
  74. package/dist/services/git.d.ts +60 -0
  75. package/dist/services/git.d.ts.map +1 -0
  76. package/dist/services/git.js +239 -0
  77. package/dist/services/git.js.map +1 -0
  78. package/dist/services/linker.d.ts +46 -0
  79. package/dist/services/linker.d.ts.map +1 -0
  80. package/dist/services/linker.js +222 -0
  81. package/dist/services/linker.js.map +1 -0
  82. package/dist/services/protection.d.ts +32 -0
  83. package/dist/services/protection.d.ts.map +1 -0
  84. package/dist/services/protection.js +190 -0
  85. package/dist/services/protection.js.map +1 -0
  86. package/dist/types/index.d.ts +73 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +5 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/utils/display.d.ts +74 -0
  91. package/dist/utils/display.d.ts.map +1 -0
  92. package/dist/utils/display.js +138 -0
  93. package/dist/utils/display.js.map +1 -0
  94. package/dist/utils/editor.d.ts +22 -0
  95. package/dist/utils/editor.d.ts.map +1 -0
  96. package/dist/utils/editor.js +159 -0
  97. package/dist/utils/editor.js.map +1 -0
  98. package/dist/utils/prompts.d.ts +41 -0
  99. package/dist/utils/prompts.d.ts.map +1 -0
  100. package/dist/utils/prompts.js +222 -0
  101. package/dist/utils/prompts.js.map +1 -0
  102. package/package.json +69 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Display Utilities
3
+ * Console styling and formatting for CLI output
4
+ */
5
+ import chalk from 'chalk';
6
+ import { BRAND } from '../constants.js';
7
+ /**
8
+ * Brand colors
9
+ */
10
+ export const colors = {
11
+ primary: chalk.hex('#7C3AED'), // Purple
12
+ secondary: chalk.hex('#10B981'), // Emerald
13
+ accent: chalk.hex('#F59E0B'), // Amber
14
+ muted: chalk.gray,
15
+ error: chalk.hex('#EF4444'),
16
+ success: chalk.hex('#10B981'),
17
+ warning: chalk.hex('#F59E0B'),
18
+ info: chalk.hex('#3B82F6'),
19
+ };
20
+ /**
21
+ * Print the envmatic banner
22
+ */
23
+ export function printBanner() {
24
+ console.log();
25
+ console.log(colors.primary.bold(` ${BRAND.prefix} ${BRAND.name}`));
26
+ console.log(colors.muted(` ${BRAND.tagline}`));
27
+ console.log();
28
+ }
29
+ /**
30
+ * Print a success message
31
+ */
32
+ export function success(message) {
33
+ console.log(colors.success(`${BRAND.prefix} ${message}`));
34
+ }
35
+ /**
36
+ * Print an error message
37
+ */
38
+ export function error(message) {
39
+ console.log(colors.error(`✖ ${message}`));
40
+ }
41
+ /**
42
+ * Print a warning message
43
+ */
44
+ export function warning(message) {
45
+ console.log(colors.warning(`⚠ ${message}`));
46
+ }
47
+ /**
48
+ * Print an info message
49
+ */
50
+ export function info(message) {
51
+ console.log(colors.info(`ℹ ${message}`));
52
+ }
53
+ /**
54
+ * Print a dimmed/muted message
55
+ */
56
+ export function dim(message) {
57
+ console.log(colors.muted(message));
58
+ }
59
+ /**
60
+ * Print a key-value pair
61
+ */
62
+ export function keyValue(key, value, indent = 0) {
63
+ const spaces = ' '.repeat(indent);
64
+ console.log(`${spaces}${colors.muted(key + ':')} ${value}`);
65
+ }
66
+ /**
67
+ * Print a table header
68
+ */
69
+ export function tableHeader(...columns) {
70
+ console.log(colors.muted(columns.join(' ')));
71
+ console.log(colors.muted('─'.repeat(60)));
72
+ }
73
+ /**
74
+ * Print a tree item
75
+ */
76
+ export function treeItem(label, isLast = false, depth = 0) {
77
+ const indent = ' '.repeat(depth);
78
+ const connector = isLast ? '└─' : '├─';
79
+ console.log(`${indent}${colors.muted(connector)} ${label}`);
80
+ }
81
+ /**
82
+ * Format a file ID for display
83
+ */
84
+ export function formatFileId(fileId) {
85
+ const parts = fileId.split('/');
86
+ if (parts.length >= 3) {
87
+ const [project, env, ...rest] = parts;
88
+ return `${colors.primary(project)}${colors.muted('/')}${colors.secondary(env)}${colors.muted('/')}${rest.join('/')}`;
89
+ }
90
+ return fileId;
91
+ }
92
+ /**
93
+ * Format a date for display
94
+ */
95
+ export function formatDate(isoDate) {
96
+ const date = new Date(isoDate);
97
+ return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
98
+ }
99
+ /**
100
+ * Format bytes for display
101
+ */
102
+ export function formatBytes(bytes) {
103
+ if (bytes === 0)
104
+ return '0 B';
105
+ const k = 1024;
106
+ const sizes = ['B', 'KB', 'MB', 'GB'];
107
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
108
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
109
+ }
110
+ /**
111
+ * Create a box around text
112
+ */
113
+ export function box(lines, title) {
114
+ const maxLength = Math.max(...lines.map(l => l.length), (title?.length || 0) + 4);
115
+ const width = maxLength + 4;
116
+ const top = title
117
+ ? `╭─ ${title} ${'─'.repeat(width - title.length - 5)}╮`
118
+ : `╭${'─'.repeat(width - 2)}╮`;
119
+ console.log(colors.muted(top));
120
+ for (const line of lines) {
121
+ const padding = ' '.repeat(width - line.length - 4);
122
+ console.log(colors.muted('│') + ` ${line}${padding} ` + colors.muted('│'));
123
+ }
124
+ console.log(colors.muted(`╰${'─'.repeat(width - 2)}╯`));
125
+ }
126
+ /**
127
+ * Mask sensitive values
128
+ */
129
+ export function maskValue(value, showChars = 4) {
130
+ if (value.length <= showChars * 2) {
131
+ return '*'.repeat(value.length);
132
+ }
133
+ const start = value.substring(0, showChars);
134
+ const end = value.substring(value.length - showChars);
135
+ const middle = '*'.repeat(Math.min(value.length - showChars * 2, 8));
136
+ return start + middle + end;
137
+ }
138
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAK,SAAS;IAC3C,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAG,UAAU;IAC5C,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAM,QAAQ;IAC1C,KAAK,EAAE,KAAK,CAAC,IAAI;IACjB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC7B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,KAAa,EAAE,SAAiB,CAAC;IACrE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,OAAiB;IAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,SAAkB,KAAK,EAAE,QAAgB,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;QACtC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACvH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,kBAAkB,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,KAAc;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC;IAE5B,MAAM,GAAG,GAAG,KAAK;QACf,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;QACxD,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,OAAO,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,YAAoB,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,KAAK,GAAG,MAAM,GAAG,GAAG,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Editor Utilities
3
+ * Detection and launching of external editors
4
+ */
5
+ export interface EditorInfo {
6
+ name: string;
7
+ command: string;
8
+ available: boolean;
9
+ }
10
+ /**
11
+ * Detect available editors on the system
12
+ */
13
+ export declare function detectEditors(): Promise<EditorInfo[]>;
14
+ /**
15
+ * Open a file in an external editor and wait for it to close
16
+ */
17
+ export declare function openInEditor(filePath: string, editorCommand: string): Promise<void>;
18
+ /**
19
+ * Check if an editor is a terminal-based editor
20
+ */
21
+ export declare function isTerminalEditor(editorCommand: string): boolean;
22
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAwBD;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAoG3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BzF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAG/D"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Editor Utilities
3
+ * Detection and launching of external editors
4
+ */
5
+ import { exec, spawn } from 'child_process';
6
+ import { promisify } from 'util';
7
+ import os from 'os';
8
+ const execAsync = promisify(exec);
9
+ /**
10
+ * Check if a command exists in PATH
11
+ */
12
+ async function commandExists(command) {
13
+ try {
14
+ const isWindows = os.platform() === 'win32';
15
+ const checkCmd = isWindows ? `where ${command}` : `which ${command}`;
16
+ await execAsync(checkCmd);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ /**
24
+ * Get the system default editor
25
+ */
26
+ function getSystemEditor() {
27
+ // Check common environment variables
28
+ return process.env.VISUAL || process.env.EDITOR;
29
+ }
30
+ /**
31
+ * Detect available editors on the system
32
+ */
33
+ export async function detectEditors() {
34
+ const isWindows = os.platform() === 'win32';
35
+ const isMac = os.platform() === 'darwin';
36
+ const editors = [];
37
+ // System default editor
38
+ const systemEditor = getSystemEditor();
39
+ if (systemEditor) {
40
+ editors.push({
41
+ name: `System Default (${systemEditor})`,
42
+ command: systemEditor,
43
+ available: true,
44
+ });
45
+ }
46
+ // Neovim
47
+ if (await commandExists('nvim')) {
48
+ editors.push({
49
+ name: 'Neovim',
50
+ command: 'nvim',
51
+ available: true,
52
+ });
53
+ }
54
+ // Vim
55
+ if (await commandExists('vim')) {
56
+ editors.push({
57
+ name: 'Vim',
58
+ command: 'vim',
59
+ available: true,
60
+ });
61
+ }
62
+ // VS Code
63
+ if (await commandExists('code')) {
64
+ editors.push({
65
+ name: 'VS Code',
66
+ command: 'code --wait',
67
+ available: true,
68
+ });
69
+ }
70
+ // Platform-specific editors
71
+ if (isWindows) {
72
+ // Notepad is always available on Windows
73
+ editors.push({
74
+ name: 'Notepad',
75
+ command: 'notepad',
76
+ available: true,
77
+ });
78
+ // Notepad++
79
+ if (await commandExists('notepad++')) {
80
+ editors.push({
81
+ name: 'Notepad++',
82
+ command: 'notepad++',
83
+ available: true,
84
+ });
85
+ }
86
+ }
87
+ if (isMac) {
88
+ // nano is usually available
89
+ if (await commandExists('nano')) {
90
+ editors.push({
91
+ name: 'Nano',
92
+ command: 'nano',
93
+ available: true,
94
+ });
95
+ }
96
+ // TextEdit via open command
97
+ editors.push({
98
+ name: 'TextEdit',
99
+ command: 'open -e -W',
100
+ available: true,
101
+ });
102
+ }
103
+ // Linux common editors
104
+ if (!isWindows && !isMac) {
105
+ if (await commandExists('nano')) {
106
+ editors.push({
107
+ name: 'Nano',
108
+ command: 'nano',
109
+ available: true,
110
+ });
111
+ }
112
+ if (await commandExists('gedit')) {
113
+ editors.push({
114
+ name: 'Gedit',
115
+ command: 'gedit',
116
+ available: true,
117
+ });
118
+ }
119
+ }
120
+ return editors;
121
+ }
122
+ /**
123
+ * Open a file in an external editor and wait for it to close
124
+ */
125
+ export async function openInEditor(filePath, editorCommand) {
126
+ return new Promise((resolve, reject) => {
127
+ const isWindows = os.platform() === 'win32';
128
+ // Parse command (handle commands with arguments like "code --wait")
129
+ const parts = editorCommand.split(' ');
130
+ const command = parts[0];
131
+ const args = [...parts.slice(1), filePath];
132
+ // For terminal-based editors (vim, nvim, nano), we need to inherit stdio
133
+ const isTerminalEditor = ['vim', 'nvim', 'nano', 'vi'].includes(command);
134
+ const child = spawn(command, args, {
135
+ stdio: isTerminalEditor ? 'inherit' : 'ignore',
136
+ shell: isWindows,
137
+ detached: false,
138
+ });
139
+ child.on('error', (err) => {
140
+ reject(new Error(`Failed to open editor: ${err.message}`));
141
+ });
142
+ child.on('close', (code) => {
143
+ if (code === 0 || code === null) {
144
+ resolve();
145
+ }
146
+ else {
147
+ reject(new Error(`Editor exited with code ${code}`));
148
+ }
149
+ });
150
+ });
151
+ }
152
+ /**
153
+ * Check if an editor is a terminal-based editor
154
+ */
155
+ export function isTerminalEditor(editorCommand) {
156
+ const command = editorCommand.split(' ')[0];
157
+ return ['vim', 'nvim', 'nano', 'vi', 'emacs'].includes(command);
158
+ }
159
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Prompt Utilities
3
+ * Interactive prompts for CLI
4
+ */
5
+ import type { EncryptionOptions } from '../types/index.js';
6
+ /**
7
+ * Prompt for encryption password
8
+ */
9
+ export declare function promptPassword(confirm?: boolean): Promise<string>;
10
+ /**
11
+ * Prompt for SSH key path
12
+ */
13
+ export declare function promptSSHKey(): Promise<string>;
14
+ /**
15
+ * Get encryption options based on config and prompts
16
+ */
17
+ export declare function getEncryptionOptions(): Promise<EncryptionOptions | undefined>;
18
+ /**
19
+ * Prompt for project name
20
+ */
21
+ export declare function promptProject(existing?: string[]): Promise<string>;
22
+ /**
23
+ * Prompt for environment
24
+ */
25
+ export declare function promptEnvironment(): Promise<string>;
26
+ /**
27
+ * Prompt for variable key-value pairs
28
+ */
29
+ export declare function promptVariables(): Promise<Record<string, string>>;
30
+ /**
31
+ * Confirm action
32
+ */
33
+ export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
34
+ /**
35
+ * Select from a list
36
+ */
37
+ export declare function select<T>(message: string, choices: Array<{
38
+ name: string;
39
+ value: T;
40
+ }>): Promise<T>;
41
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC9E;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBpD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAuBnF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAqCzD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA8BvE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAW9F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Prompt Utilities
3
+ * Interactive prompts for CLI
4
+ */
5
+ import inquirer from 'inquirer';
6
+ import { getConfig } from '../services/config.js';
7
+ import { validateSSHKey } from '../services/encryption.js';
8
+ /**
9
+ * Prompt for encryption password
10
+ */
11
+ export async function promptPassword(confirm = false) {
12
+ const { password } = await inquirer.prompt([
13
+ {
14
+ type: 'password',
15
+ name: 'password',
16
+ message: 'Enter your encryption password:',
17
+ mask: '*',
18
+ validate: (input) => {
19
+ if (!input || input.length < 8) {
20
+ return 'Password must be at least 8 characters';
21
+ }
22
+ return true;
23
+ },
24
+ },
25
+ ]);
26
+ if (confirm) {
27
+ const { confirmPassword } = await inquirer.prompt([
28
+ {
29
+ type: 'password',
30
+ name: 'confirmPassword',
31
+ message: 'Confirm your password:',
32
+ mask: '*',
33
+ validate: (input) => {
34
+ if (input !== password) {
35
+ return 'Passwords do not match';
36
+ }
37
+ return true;
38
+ },
39
+ },
40
+ ]);
41
+ }
42
+ return password;
43
+ }
44
+ /**
45
+ * Prompt for SSH key path
46
+ */
47
+ export async function promptSSHKey() {
48
+ const { sshKeyPath } = await inquirer.prompt([
49
+ {
50
+ type: 'input',
51
+ name: 'sshKeyPath',
52
+ message: 'Enter path to your SSH private key:',
53
+ default: '~/.ssh/id_rsa',
54
+ validate: async (input) => {
55
+ const expanded = input.replace(/^~/, process.env.HOME || '');
56
+ const valid = await validateSSHKey(expanded);
57
+ if (!valid) {
58
+ return 'Invalid SSH private key file';
59
+ }
60
+ return true;
61
+ },
62
+ },
63
+ ]);
64
+ return sshKeyPath.replace(/^~/, process.env.HOME || '');
65
+ }
66
+ /**
67
+ * Get encryption options based on config and prompts
68
+ */
69
+ export async function getEncryptionOptions() {
70
+ const config = await getConfig();
71
+ if (!config || !config.encryptionEnabled) {
72
+ return undefined;
73
+ }
74
+ if (config.encryptionMethod === 'ssh' && config.sshKeyPath) {
75
+ return {
76
+ method: 'ssh',
77
+ sshKeyPath: config.sshKeyPath,
78
+ };
79
+ }
80
+ if (config.encryptionMethod === 'password') {
81
+ const password = await promptPassword();
82
+ return {
83
+ method: 'password',
84
+ password,
85
+ };
86
+ }
87
+ return undefined;
88
+ }
89
+ /**
90
+ * Prompt for project name
91
+ */
92
+ export async function promptProject(existing) {
93
+ if (existing && existing.length > 0) {
94
+ const { choice } = await inquirer.prompt([
95
+ {
96
+ type: 'list',
97
+ name: 'choice',
98
+ message: 'Select or create a project:',
99
+ choices: [
100
+ ...existing.map(p => ({ name: p, value: p })),
101
+ new inquirer.Separator(),
102
+ { name: '+ Create new project', value: '__new__' },
103
+ ],
104
+ },
105
+ ]);
106
+ if (choice !== '__new__') {
107
+ return choice;
108
+ }
109
+ }
110
+ const { project } = await inquirer.prompt([
111
+ {
112
+ type: 'input',
113
+ name: 'project',
114
+ message: 'Enter project name:',
115
+ validate: (input) => {
116
+ if (!input || input.trim().length === 0) {
117
+ return 'Project name is required';
118
+ }
119
+ if (!/^[a-zA-Z0-9_-]+$/.test(input)) {
120
+ return 'Project name can only contain letters, numbers, dashes, and underscores';
121
+ }
122
+ return true;
123
+ },
124
+ },
125
+ ]);
126
+ return project;
127
+ }
128
+ /**
129
+ * Prompt for environment
130
+ */
131
+ export async function promptEnvironment() {
132
+ const presets = ['development', 'staging', 'production', 'test', 'local', 'ci'];
133
+ const { environment } = await inquirer.prompt([
134
+ {
135
+ type: 'list',
136
+ name: 'environment',
137
+ message: 'Select environment:',
138
+ choices: [
139
+ ...presets.map(e => ({ name: e, value: e })),
140
+ new inquirer.Separator(),
141
+ { name: '+ Custom environment', value: '__custom__' },
142
+ ],
143
+ },
144
+ ]);
145
+ if (environment === '__custom__') {
146
+ const { customEnv } = await inquirer.prompt([
147
+ {
148
+ type: 'input',
149
+ name: 'customEnv',
150
+ message: 'Enter environment name:',
151
+ validate: (input) => {
152
+ if (!input || input.trim().length === 0) {
153
+ return 'Environment name is required';
154
+ }
155
+ if (!/^[a-zA-Z0-9_-]+$/.test(input)) {
156
+ return 'Environment name can only contain letters, numbers, dashes, and underscores';
157
+ }
158
+ return true;
159
+ },
160
+ },
161
+ ]);
162
+ return customEnv;
163
+ }
164
+ return environment;
165
+ }
166
+ /**
167
+ * Prompt for variable key-value pairs
168
+ */
169
+ export async function promptVariables() {
170
+ const variables = {};
171
+ console.log('\nEnter environment variables (empty key to finish):');
172
+ while (true) {
173
+ const { key } = await inquirer.prompt([
174
+ {
175
+ type: 'input',
176
+ name: 'key',
177
+ message: 'Variable name:',
178
+ },
179
+ ]);
180
+ if (!key || key.trim().length === 0) {
181
+ break;
182
+ }
183
+ const { value } = await inquirer.prompt([
184
+ {
185
+ type: 'input',
186
+ name: 'value',
187
+ message: `Value for ${key}:`,
188
+ },
189
+ ]);
190
+ variables[key.trim()] = value;
191
+ }
192
+ return variables;
193
+ }
194
+ /**
195
+ * Confirm action
196
+ */
197
+ export async function confirm(message, defaultValue = false) {
198
+ const { confirmed } = await inquirer.prompt([
199
+ {
200
+ type: 'confirm',
201
+ name: 'confirmed',
202
+ message,
203
+ default: defaultValue,
204
+ },
205
+ ]);
206
+ return confirmed;
207
+ }
208
+ /**
209
+ * Select from a list
210
+ */
211
+ export async function select(message, choices) {
212
+ const { selected } = await inquirer.prompt([
213
+ {
214
+ type: 'list',
215
+ name: 'selected',
216
+ message,
217
+ choices,
218
+ },
219
+ ]);
220
+ return selected;
221
+ }
222
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}