@zincapp/znvault-cli 2.29.1 → 2.29.2

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 (266) hide show
  1. package/dist/commands/agent/direct/update-all.d.ts.map +1 -1
  2. package/dist/commands/agent/direct/update-all.js +13 -8
  3. package/dist/commands/agent/direct/update-all.js.map +1 -1
  4. package/dist/commands/agent/helpers.d.ts +3 -6
  5. package/dist/commands/agent/helpers.d.ts.map +1 -1
  6. package/dist/commands/agent/helpers.js +13 -21
  7. package/dist/commands/agent/helpers.js.map +1 -1
  8. package/dist/commands/apikey/helpers.d.ts +1 -2
  9. package/dist/commands/apikey/helpers.d.ts.map +1 -1
  10. package/dist/commands/apikey/helpers.js +2 -12
  11. package/dist/commands/apikey/helpers.js.map +1 -1
  12. package/dist/commands/backup/helpers.d.ts +1 -3
  13. package/dist/commands/backup/helpers.d.ts.map +1 -1
  14. package/dist/commands/backup/helpers.js +2 -23
  15. package/dist/commands/backup/helpers.js.map +1 -1
  16. package/dist/commands/device.d.ts.map +1 -1
  17. package/dist/commands/device.js +10 -6
  18. package/dist/commands/device.js.map +1 -1
  19. package/dist/commands/dynamic-secrets/helpers.d.ts +3 -2
  20. package/dist/commands/dynamic-secrets/helpers.d.ts.map +1 -1
  21. package/dist/commands/dynamic-secrets/helpers.js +6 -15
  22. package/dist/commands/dynamic-secrets/helpers.js.map +1 -1
  23. package/dist/commands/kms/crud.d.ts +6 -0
  24. package/dist/commands/kms/crud.d.ts.map +1 -0
  25. package/dist/commands/kms/crud.js +226 -0
  26. package/dist/commands/kms/crud.js.map +1 -0
  27. package/dist/commands/kms/crypto.d.ts +6 -0
  28. package/dist/commands/kms/crypto.d.ts.map +1 -0
  29. package/dist/commands/kms/crypto.js +190 -0
  30. package/dist/commands/kms/crypto.js.map +1 -0
  31. package/dist/commands/kms/helpers.d.ts +10 -0
  32. package/dist/commands/kms/helpers.d.ts.map +1 -0
  33. package/dist/commands/kms/helpers.js +44 -0
  34. package/dist/commands/kms/helpers.js.map +1 -0
  35. package/dist/commands/kms/index.d.ts +13 -0
  36. package/dist/commands/kms/index.d.ts.map +1 -0
  37. package/dist/commands/kms/index.js +18 -0
  38. package/dist/commands/kms/index.js.map +1 -0
  39. package/dist/commands/kms/lifecycle.d.ts +6 -0
  40. package/dist/commands/kms/lifecycle.d.ts.map +1 -0
  41. package/dist/commands/kms/lifecycle.js +124 -0
  42. package/dist/commands/kms/lifecycle.js.map +1 -0
  43. package/dist/commands/kms/types.d.ts +102 -0
  44. package/dist/commands/kms/types.d.ts.map +1 -0
  45. package/dist/commands/kms/types.js +3 -0
  46. package/dist/commands/kms/types.js.map +1 -0
  47. package/dist/commands/plugin/enable-disable.d.ts +6 -0
  48. package/dist/commands/plugin/enable-disable.d.ts.map +1 -0
  49. package/dist/commands/plugin/enable-disable.js +64 -0
  50. package/dist/commands/plugin/enable-disable.js.map +1 -0
  51. package/dist/commands/plugin/helpers.d.ts +63 -0
  52. package/dist/commands/plugin/helpers.d.ts.map +1 -0
  53. package/dist/commands/plugin/helpers.js +204 -0
  54. package/dist/commands/plugin/helpers.js.map +1 -0
  55. package/dist/commands/plugin/index.d.ts +10 -0
  56. package/dist/commands/plugin/index.d.ts.map +1 -0
  57. package/dist/commands/plugin/index.js +24 -0
  58. package/dist/commands/plugin/index.js.map +1 -0
  59. package/dist/commands/plugin/info.d.ts +6 -0
  60. package/dist/commands/plugin/info.d.ts.map +1 -0
  61. package/dist/commands/plugin/info.js +108 -0
  62. package/dist/commands/plugin/info.js.map +1 -0
  63. package/dist/commands/plugin/install.d.ts +6 -0
  64. package/dist/commands/plugin/install.d.ts.map +1 -0
  65. package/dist/commands/plugin/install.js +96 -0
  66. package/dist/commands/plugin/install.js.map +1 -0
  67. package/dist/commands/plugin/list.d.ts +6 -0
  68. package/dist/commands/plugin/list.d.ts.map +1 -0
  69. package/dist/commands/plugin/list.js +60 -0
  70. package/dist/commands/plugin/list.js.map +1 -0
  71. package/dist/commands/plugin/types.d.ts +37 -0
  72. package/dist/commands/plugin/types.d.ts.map +1 -0
  73. package/dist/commands/plugin/types.js +7 -0
  74. package/dist/commands/plugin/types.js.map +1 -0
  75. package/dist/commands/plugin/uninstall.d.ts +6 -0
  76. package/dist/commands/plugin/uninstall.d.ts.map +1 -0
  77. package/dist/commands/plugin/uninstall.js +50 -0
  78. package/dist/commands/plugin/uninstall.js.map +1 -0
  79. package/dist/commands/plugin/update.d.ts +6 -0
  80. package/dist/commands/plugin/update.d.ts.map +1 -0
  81. package/dist/commands/plugin/update.js +84 -0
  82. package/dist/commands/plugin/update.js.map +1 -0
  83. package/dist/commands/policy/attachments.d.ts.map +1 -1
  84. package/dist/commands/policy/attachments.js +14 -20
  85. package/dist/commands/policy/attachments.js.map +1 -1
  86. package/dist/commands/policy/crud.d.ts.map +1 -1
  87. package/dist/commands/policy/crud.js +13 -23
  88. package/dist/commands/policy/crud.js.map +1 -1
  89. package/dist/commands/policy/io.d.ts.map +1 -1
  90. package/dist/commands/policy/io.js +4 -5
  91. package/dist/commands/policy/io.js.map +1 -1
  92. package/dist/commands/policy/list.d.ts.map +1 -1
  93. package/dist/commands/policy/list.js +7 -8
  94. package/dist/commands/policy/list.js.map +1 -1
  95. package/dist/commands/quarantine.d.ts.map +1 -1
  96. package/dist/commands/quarantine.js +1 -9
  97. package/dist/commands/quarantine.js.map +1 -1
  98. package/dist/commands/role.d.ts.map +1 -1
  99. package/dist/commands/role.js +4 -10
  100. package/dist/commands/role.js.map +1 -1
  101. package/dist/commands/secret/helpers.d.ts +1 -2
  102. package/dist/commands/secret/helpers.d.ts.map +1 -1
  103. package/dist/commands/secret/helpers.js +2 -14
  104. package/dist/commands/secret/helpers.js.map +1 -1
  105. package/dist/commands/secret/list.d.ts.map +1 -1
  106. package/dist/commands/secret/list.js +3 -4
  107. package/dist/commands/secret/list.js.map +1 -1
  108. package/dist/commands/ssh/bookmark.d.ts +11 -0
  109. package/dist/commands/ssh/bookmark.d.ts.map +1 -0
  110. package/dist/commands/ssh/bookmark.js +210 -0
  111. package/dist/commands/ssh/bookmark.js.map +1 -0
  112. package/dist/commands/ssh/ca.d.ts +6 -0
  113. package/dist/commands/ssh/ca.d.ts.map +1 -0
  114. package/dist/commands/ssh/ca.js +162 -0
  115. package/dist/commands/ssh/ca.js.map +1 -0
  116. package/dist/commands/ssh/cert.d.ts +6 -0
  117. package/dist/commands/ssh/cert.d.ts.map +1 -0
  118. package/dist/commands/ssh/cert.js +303 -0
  119. package/dist/commands/ssh/cert.js.map +1 -0
  120. package/dist/commands/ssh/config.d.ts +6 -0
  121. package/dist/commands/ssh/config.d.ts.map +1 -0
  122. package/dist/commands/ssh/config.js +95 -0
  123. package/dist/commands/ssh/config.js.map +1 -0
  124. package/dist/commands/ssh/connect.d.ts +6 -0
  125. package/dist/commands/ssh/connect.d.ts.map +1 -0
  126. package/dist/commands/ssh/connect.js +219 -0
  127. package/dist/commands/ssh/connect.js.map +1 -0
  128. package/dist/commands/ssh/exec.d.ts +6 -0
  129. package/dist/commands/ssh/exec.d.ts.map +1 -0
  130. package/dist/commands/ssh/exec.js +218 -0
  131. package/dist/commands/ssh/exec.js.map +1 -0
  132. package/dist/commands/ssh/helpers.d.ts +46 -0
  133. package/dist/commands/ssh/helpers.d.ts.map +1 -0
  134. package/dist/commands/ssh/helpers.js +175 -0
  135. package/dist/commands/ssh/helpers.js.map +1 -0
  136. package/dist/commands/ssh/hosts.d.ts +6 -0
  137. package/dist/commands/ssh/hosts.d.ts.map +1 -0
  138. package/dist/commands/ssh/hosts.js +101 -0
  139. package/dist/commands/ssh/hosts.js.map +1 -0
  140. package/dist/commands/ssh/index.d.ts +20 -0
  141. package/dist/commands/ssh/index.d.ts.map +1 -0
  142. package/dist/commands/ssh/index.js +34 -0
  143. package/dist/commands/ssh/index.js.map +1 -0
  144. package/dist/commands/ssh/mapping.d.ts +6 -0
  145. package/dist/commands/ssh/mapping.d.ts.map +1 -0
  146. package/dist/commands/ssh/mapping.js +130 -0
  147. package/dist/commands/ssh/mapping.js.map +1 -0
  148. package/dist/commands/ssh/scp.d.ts +6 -0
  149. package/dist/commands/ssh/scp.d.ts.map +1 -0
  150. package/dist/commands/ssh/scp.js +219 -0
  151. package/dist/commands/ssh/scp.js.map +1 -0
  152. package/dist/commands/ssh/server-group.d.ts +6 -0
  153. package/dist/commands/ssh/server-group.d.ts.map +1 -0
  154. package/dist/commands/ssh/server-group.js +249 -0
  155. package/dist/commands/ssh/server-group.js.map +1 -0
  156. package/dist/commands/ssh/types.d.ts +150 -0
  157. package/dist/commands/ssh/types.d.ts.map +1 -0
  158. package/dist/commands/ssh/types.js +3 -0
  159. package/dist/commands/ssh/types.js.map +1 -0
  160. package/dist/commands/ssh-ca/helpers.d.ts +1 -8
  161. package/dist/commands/ssh-ca/helpers.d.ts.map +1 -1
  162. package/dist/commands/ssh-ca/helpers.js +2 -23
  163. package/dist/commands/ssh-ca/helpers.js.map +1 -1
  164. package/dist/commands/sso/crud.d.ts +6 -0
  165. package/dist/commands/sso/crud.d.ts.map +1 -0
  166. package/dist/commands/sso/crud.js +360 -0
  167. package/dist/commands/sso/crud.js.map +1 -0
  168. package/dist/commands/sso/helpers.d.ts +9 -0
  169. package/dist/commands/sso/helpers.d.ts.map +1 -0
  170. package/dist/commands/sso/helpers.js +13 -0
  171. package/dist/commands/sso/helpers.js.map +1 -0
  172. package/dist/commands/sso/index.d.ts +13 -0
  173. package/dist/commands/sso/index.d.ts.map +1 -0
  174. package/dist/commands/sso/index.js +16 -0
  175. package/dist/commands/sso/index.js.map +1 -0
  176. package/dist/commands/sso/types.d.ts +119 -0
  177. package/dist/commands/sso/types.d.ts.map +1 -0
  178. package/dist/commands/sso/types.js +3 -0
  179. package/dist/commands/sso/types.js.map +1 -0
  180. package/dist/commands/sso/users.d.ts +6 -0
  181. package/dist/commands/sso/users.d.ts.map +1 -0
  182. package/dist/commands/sso/users.js +128 -0
  183. package/dist/commands/sso/users.js.map +1 -0
  184. package/dist/commands/unseal.d.ts.map +1 -1
  185. package/dist/commands/unseal.js +10 -20
  186. package/dist/commands/unseal.js.map +1 -1
  187. package/dist/index.js +4 -4
  188. package/dist/index.js.map +1 -1
  189. package/dist/lib/cli-update.d.ts.map +1 -1
  190. package/dist/lib/cli-update.js +18 -14
  191. package/dist/lib/cli-update.js.map +1 -1
  192. package/dist/lib/client/http.d.ts +3 -1
  193. package/dist/lib/client/http.d.ts.map +1 -1
  194. package/dist/lib/client/http.js +41 -8
  195. package/dist/lib/client/http.js.map +1 -1
  196. package/dist/lib/config/autounseal.d.ts +4 -0
  197. package/dist/lib/config/autounseal.d.ts.map +1 -1
  198. package/dist/lib/config/autounseal.js +102 -6
  199. package/dist/lib/config/autounseal.js.map +1 -1
  200. package/dist/lib/config/credentials.d.ts.map +1 -1
  201. package/dist/lib/config/credentials.js +3 -2
  202. package/dist/lib/config/credentials.js.map +1 -1
  203. package/dist/lib/config/index.d.ts +2 -1
  204. package/dist/lib/config/index.d.ts.map +1 -1
  205. package/dist/lib/config/index.js +3 -1
  206. package/dist/lib/config/index.js.map +1 -1
  207. package/dist/lib/config/keychain.d.ts +27 -0
  208. package/dist/lib/config/keychain.d.ts.map +1 -0
  209. package/dist/lib/config/keychain.js +194 -0
  210. package/dist/lib/config/keychain.js.map +1 -0
  211. package/dist/lib/config/types.d.ts +12 -0
  212. package/dist/lib/config/types.d.ts.map +1 -1
  213. package/dist/lib/config/types.js +3 -2
  214. package/dist/lib/config/types.js.map +1 -1
  215. package/dist/lib/constants.d.ts +24 -0
  216. package/dist/lib/constants.d.ts.map +1 -1
  217. package/dist/lib/constants.js +34 -1
  218. package/dist/lib/constants.js.map +1 -1
  219. package/dist/lib/db/health.d.ts.map +1 -1
  220. package/dist/lib/db/health.js +14 -7
  221. package/dist/lib/db/health.js.map +1 -1
  222. package/dist/lib/debug.d.ts +17 -0
  223. package/dist/lib/debug.d.ts.map +1 -0
  224. package/dist/lib/debug.js +50 -0
  225. package/dist/lib/debug.js.map +1 -0
  226. package/dist/lib/format-helpers.d.ts +43 -0
  227. package/dist/lib/format-helpers.d.ts.map +1 -1
  228. package/dist/lib/format-helpers.js +85 -0
  229. package/dist/lib/format-helpers.js.map +1 -1
  230. package/dist/lib/local.d.ts.map +1 -1
  231. package/dist/lib/local.js +12 -8
  232. package/dist/lib/local.js.map +1 -1
  233. package/dist/lib/mode.d.ts.map +1 -1
  234. package/dist/lib/mode.js +2 -1
  235. package/dist/lib/mode.js.map +1 -1
  236. package/dist/lib/output.d.ts +10 -0
  237. package/dist/lib/output.d.ts.map +1 -1
  238. package/dist/lib/output.js +21 -0
  239. package/dist/lib/output.js.map +1 -1
  240. package/dist/services/auto-update-daemon.d.ts.map +1 -1
  241. package/dist/services/auto-update-daemon.js +10 -6
  242. package/dist/services/auto-update-daemon.js.map +1 -1
  243. package/dist/services/update-checker.d.ts.map +1 -1
  244. package/dist/services/update-checker.js +2 -1
  245. package/dist/services/update-checker.js.map +1 -1
  246. package/dist/services/update-installer.d.ts +8 -0
  247. package/dist/services/update-installer.d.ts.map +1 -1
  248. package/dist/services/update-installer.js +47 -18
  249. package/dist/services/update-installer.js.map +1 -1
  250. package/package.json +4 -4
  251. package/dist/commands/kms.d.ts +0 -3
  252. package/dist/commands/kms.d.ts.map +0 -1
  253. package/dist/commands/kms.js +0 -555
  254. package/dist/commands/kms.js.map +0 -1
  255. package/dist/commands/plugin.d.ts +0 -8
  256. package/dist/commands/plugin.d.ts.map +0 -1
  257. package/dist/commands/plugin.js +0 -637
  258. package/dist/commands/plugin.js.map +0 -1
  259. package/dist/commands/ssh.d.ts +0 -3
  260. package/dist/commands/ssh.d.ts.map +0 -1
  261. package/dist/commands/ssh.js +0 -814
  262. package/dist/commands/ssh.js.map +0 -1
  263. package/dist/commands/sso.d.ts +0 -3
  264. package/dist/commands/sso.d.ts.map +0 -1
  265. package/dist/commands/sso.js +0 -486
  266. package/dist/commands/sso.js.map +0 -1
@@ -1,637 +0,0 @@
1
- // Path: znvault-cli/src/commands/plugin.ts
2
- /**
3
- * Plugin Management Commands
4
- *
5
- * Commands for installing, uninstalling, and managing CLI plugins.
6
- */
7
- import { execFileSync, spawn } from 'node:child_process';
8
- import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
9
- import { join, dirname } from 'node:path';
10
- import ora from 'ora';
11
- import chalk from 'chalk';
12
- import * as output from '../lib/output.js';
13
- import { getPlugins, addPlugin, removePlugin, setPluginEnabled, getConfigPath, } from '../lib/config.js';
14
- // ZincApp plugin namespace
15
- const ZINCAPP_PREFIX = '@zincapp/znvault-plugin-';
16
- /**
17
- * Get the plugins directory path (alongside config.json)
18
- */
19
- function getPluginsDir() {
20
- const configPath = getConfigPath();
21
- return join(dirname(configPath), 'plugins');
22
- }
23
- /**
24
- * Ensure plugins directory exists with package.json
25
- */
26
- function ensurePluginsDir() {
27
- const pluginsDir = getPluginsDir();
28
- if (!existsSync(pluginsDir)) {
29
- mkdirSync(pluginsDir, { recursive: true });
30
- }
31
- const packageJsonPath = join(pluginsDir, 'package.json');
32
- if (!existsSync(packageJsonPath)) {
33
- writeFileSync(packageJsonPath, JSON.stringify({
34
- name: 'znvault-plugins',
35
- version: '1.0.0',
36
- private: true,
37
- description: 'ZNVault CLI plugins',
38
- type: 'module',
39
- }, null, 2));
40
- }
41
- return pluginsDir;
42
- }
43
- /**
44
- * Resolve plugin name to full package name
45
- * - "payara" -> "@zincapp/znvault-plugin-payara"
46
- * - "@zincapp/znvault-plugin-payara" -> "@zincapp/znvault-plugin-payara"
47
- * - "@other/plugin" -> "@other/plugin"
48
- */
49
- function resolvePluginName(name) {
50
- // Already a scoped or full package name
51
- if (name.startsWith('@') || name.includes('/')) {
52
- return name;
53
- }
54
- // Check if it's a simple name, prepend ZincApp prefix
55
- return `${ZINCAPP_PREFIX}${name}`;
56
- }
57
- /**
58
- * Get short name from full package name
59
- */
60
- function getShortName(packageName) {
61
- if (packageName.startsWith(ZINCAPP_PREFIX)) {
62
- return packageName.slice(ZINCAPP_PREFIX.length);
63
- }
64
- return packageName;
65
- }
66
- /**
67
- * Validate npm package name to prevent command injection
68
- * Valid: alphanumeric, hyphens, underscores, dots, @ for scopes, / for scoped packages
69
- */
70
- function isValidPackageName(name) {
71
- // npm package name pattern: optional @scope/ followed by package name
72
- // Scoped: @scope/package-name
73
- // Unscoped: package-name
74
- const npmPackagePattern = /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i;
75
- return npmPackagePattern.test(name) && name.length <= 214;
76
- }
77
- /**
78
- * Check if a package exists on npm
79
- */
80
- async function packageExists(packageName) {
81
- if (!isValidPackageName(packageName)) {
82
- return false;
83
- }
84
- try {
85
- // Use execFileSync with args array to avoid shell injection
86
- execFileSync('npm', ['view', packageName, 'version'], { stdio: 'pipe' });
87
- return true;
88
- }
89
- catch {
90
- return false;
91
- }
92
- }
93
- /**
94
- * Get package version from npm
95
- */
96
- function getPackageVersion(packageName) {
97
- if (!isValidPackageName(packageName)) {
98
- return null;
99
- }
100
- try {
101
- // Use execFileSync with args array to avoid shell injection
102
- const result = execFileSync('npm', ['view', packageName, 'version'], { stdio: 'pipe' });
103
- return result.toString().trim();
104
- }
105
- catch {
106
- return null;
107
- }
108
- }
109
- /**
110
- * Get installed package version
111
- */
112
- function getInstalledVersion(packageName, pluginsDir) {
113
- try {
114
- const packageJsonPath = join(pluginsDir, 'node_modules', packageName, 'package.json');
115
- if (existsSync(packageJsonPath)) {
116
- const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
117
- return pkg.version;
118
- }
119
- }
120
- catch {
121
- // Ignore
122
- }
123
- return null;
124
- }
125
- /**
126
- * Run npm command in plugins directory
127
- */
128
- function runNpm(args, pluginsDir) {
129
- return new Promise((resolve) => {
130
- const npm = spawn('npm', args, {
131
- cwd: pluginsDir,
132
- stdio: ['ignore', 'pipe', 'pipe'],
133
- });
134
- let stdout = '';
135
- let stderr = '';
136
- npm.stdout.on('data', (data) => {
137
- stdout += data.toString();
138
- });
139
- npm.stderr.on('data', (data) => {
140
- stderr += data.toString();
141
- });
142
- npm.on('close', (code) => {
143
- resolve({
144
- success: code === 0,
145
- output: stdout + stderr,
146
- });
147
- });
148
- npm.on('error', (err) => {
149
- resolve({
150
- success: false,
151
- output: err.message,
152
- });
153
- });
154
- });
155
- }
156
- /**
157
- * Validate that a package is a valid znvault CLI plugin
158
- */
159
- async function validatePlugin(packageName, pluginsDir) {
160
- try {
161
- const packageJsonPath = join(pluginsDir, 'node_modules', packageName, 'package.json');
162
- if (!existsSync(packageJsonPath)) {
163
- return { valid: false, error: 'Package not found after installation' };
164
- }
165
- const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
166
- // Check for CLI plugin export
167
- const hasCliExport = pkg.exports?.['./cli'] || pkg.main;
168
- if (!hasCliExport) {
169
- return { valid: false, error: 'Package does not export a CLI plugin' };
170
- }
171
- // Try to dynamically import and validate
172
- try {
173
- const modulePath = join(pluginsDir, 'node_modules', packageName);
174
- const cliPath = pkg.exports?.['./cli']?.import || pkg.exports?.['./cli'] || './dist/cli.js';
175
- const fullPath = join(modulePath, cliPath);
176
- // Check if the CLI module exists
177
- if (!existsSync(fullPath.replace(/\.js$/, '.js')) && !existsSync(fullPath)) {
178
- // Try without ./cli export - main export might have createPayaraCLIPlugin
179
- const mainPath = join(modulePath, pkg.exports?.['.']?.import || pkg.main || 'dist/index.js');
180
- if (!existsSync(mainPath)) {
181
- return { valid: false, error: 'CLI module not found' };
182
- }
183
- }
184
- return { valid: true };
185
- }
186
- catch (err) {
187
- return { valid: false, error: `Failed to validate plugin: ${err}` };
188
- }
189
- }
190
- catch (err) {
191
- return { valid: false, error: `Validation error: ${err}` };
192
- }
193
- }
194
- export function registerPluginCommands(program) {
195
- const plugin = program
196
- .command('plugin')
197
- .description('Manage CLI plugins');
198
- // ============================================================================
199
- // plugin install <name>
200
- // ============================================================================
201
- plugin
202
- .command('install <name>')
203
- .alias('add')
204
- .description('Install a CLI plugin')
205
- .option('-f, --force', 'Force reinstall even if already installed')
206
- .option('-g, --global', 'Install globally instead of in plugins directory')
207
- .option('--json', 'Output as JSON')
208
- .action(async (name, options) => {
209
- const spinner = ora('Resolving plugin...').start();
210
- try {
211
- // Resolve plugin name
212
- let packageName = resolvePluginName(name);
213
- let foundWithPrefix = true;
214
- // Check if @zincapp prefixed version exists
215
- if (packageName.startsWith(ZINCAPP_PREFIX)) {
216
- const exists = await packageExists(packageName);
217
- if (!exists) {
218
- // Try the original name directly
219
- const directExists = await packageExists(name);
220
- if (directExists) {
221
- packageName = name;
222
- foundWithPrefix = false;
223
- }
224
- else {
225
- spinner.fail(`Plugin not found: ${packageName}`);
226
- output.error(`Could not find '${packageName}' or '${name}' on npm.`);
227
- console.log();
228
- console.log('Available ZincApp plugins:');
229
- console.log(` ${chalk.cyan('payara')} - Payara WAR deployment`);
230
- process.exit(1);
231
- }
232
- }
233
- }
234
- spinner.text = `Installing ${packageName}...`;
235
- // Check if already configured
236
- const existingPlugins = getPlugins();
237
- const alreadyConfigured = existingPlugins.some(p => p.package === packageName);
238
- if (alreadyConfigured && !options.force) {
239
- spinner.info(`Plugin ${chalk.cyan(getShortName(packageName))} is already installed.`);
240
- if (options.json) {
241
- output.json({ success: false, name: getShortName(packageName), package: packageName, alreadyInstalled: true });
242
- return;
243
- }
244
- console.log(`Use ${chalk.cyan('--force')} to reinstall.`);
245
- return;
246
- }
247
- // Ensure plugins directory
248
- const pluginsDir = ensurePluginsDir();
249
- // Install package
250
- spinner.text = `Installing ${packageName}...`;
251
- const installResult = await runNpm(['install', packageName], pluginsDir);
252
- if (!installResult.success) {
253
- spinner.fail(`Failed to install ${packageName}`);
254
- output.error(installResult.output);
255
- process.exit(1);
256
- }
257
- // Validate it's a valid plugin
258
- spinner.text = 'Validating plugin...';
259
- const validation = await validatePlugin(packageName, pluginsDir);
260
- if (!validation.valid) {
261
- spinner.fail(`Invalid plugin: ${validation.error}`);
262
- // Uninstall the invalid package
263
- await runNpm(['uninstall', packageName], pluginsDir);
264
- output.error('The package was installed but is not a valid znvault CLI plugin.');
265
- process.exit(1);
266
- }
267
- // Add to config
268
- addPlugin({ package: packageName, enabled: true });
269
- const version = getInstalledVersion(packageName, pluginsDir);
270
- spinner.succeed(`Installed ${chalk.cyan(getShortName(packageName))}${version ? ` v${version}` : ''}`);
271
- if (options.json) {
272
- output.json({ success: true, name: getShortName(packageName), package: packageName, version: version ?? 'unknown' });
273
- return;
274
- }
275
- console.log();
276
- console.log(chalk.dim('Plugin will be loaded on next command execution.'));
277
- if (foundWithPrefix && name !== packageName) {
278
- console.log(chalk.dim(`Resolved '${name}' to '${packageName}'`));
279
- }
280
- }
281
- catch (err) {
282
- spinner.fail('Installation failed');
283
- output.error(err instanceof Error ? err.message : String(err));
284
- process.exit(1);
285
- }
286
- });
287
- // ============================================================================
288
- // plugin uninstall <name>
289
- // ============================================================================
290
- plugin
291
- .command('uninstall <name>')
292
- .alias('remove')
293
- .description('Uninstall a CLI plugin')
294
- .option('--json', 'Output as JSON')
295
- .action(async (name, options) => {
296
- const spinner = ora('Uninstalling plugin...').start();
297
- try {
298
- // Resolve plugin name
299
- const packageName = resolvePluginName(name);
300
- // Check if configured
301
- const plugins = getPlugins();
302
- const found = plugins.find(p => p.package === packageName ||
303
- p.package === name ||
304
- getShortName(p.package ?? '') === name);
305
- if (!found) {
306
- spinner.fail(`Plugin not found: ${name}`);
307
- output.error('Plugin is not installed. Use "znvault plugin list" to see installed plugins.');
308
- process.exit(1);
309
- }
310
- const actualPackage = found.package;
311
- // Remove from plugins directory
312
- const pluginsDir = getPluginsDir();
313
- if (existsSync(join(pluginsDir, 'node_modules', actualPackage))) {
314
- spinner.text = `Removing ${actualPackage}...`;
315
- const uninstallResult = await runNpm(['uninstall', actualPackage], pluginsDir);
316
- if (!uninstallResult.success) {
317
- spinner.warn('Failed to uninstall npm package, but removing from config...');
318
- }
319
- }
320
- // Remove from config
321
- removePlugin(actualPackage);
322
- spinner.succeed(`Uninstalled ${chalk.cyan(getShortName(actualPackage))}`);
323
- if (options.json) {
324
- output.json({ success: true, name: getShortName(actualPackage), package: actualPackage });
325
- }
326
- }
327
- catch (err) {
328
- spinner.fail('Uninstall failed');
329
- output.error(err instanceof Error ? err.message : String(err));
330
- process.exit(1);
331
- }
332
- });
333
- // ============================================================================
334
- // plugin list
335
- // ============================================================================
336
- plugin
337
- .command('list')
338
- .alias('ls')
339
- .description('List installed plugins')
340
- .option('--json', 'Output as JSON')
341
- .action((options) => {
342
- const plugins = getPlugins();
343
- const pluginsDir = getPluginsDir();
344
- if (plugins.length === 0) {
345
- if (options.json) {
346
- console.log(JSON.stringify([], null, 2));
347
- }
348
- else {
349
- console.log(chalk.dim('No plugins installed.'));
350
- console.log();
351
- console.log(`Install a plugin with: ${chalk.cyan('znvault plugin install <name>')}`);
352
- console.log();
353
- console.log('Available plugins:');
354
- console.log(` ${chalk.cyan('payara')} - Payara WAR deployment`);
355
- }
356
- return;
357
- }
358
- const pluginList = plugins.map(p => {
359
- const packageName = p.package || p.path || 'unknown';
360
- const shortName = getShortName(packageName);
361
- const version = p.package ? getInstalledVersion(p.package, pluginsDir) : null;
362
- const enabled = p.enabled !== false;
363
- return {
364
- name: shortName,
365
- package: packageName,
366
- version: version || 'unknown',
367
- enabled,
368
- source: p.path ? 'local' : 'npm',
369
- };
370
- });
371
- if (options.json) {
372
- console.log(JSON.stringify(pluginList, null, 2));
373
- return;
374
- }
375
- console.log(chalk.bold('Installed Plugins'));
376
- console.log();
377
- for (const p of pluginList) {
378
- const status = p.enabled ? chalk.green('●') : chalk.gray('○');
379
- const versionStr = chalk.dim(`v${p.version}`);
380
- const disabledStr = p.enabled ? '' : chalk.yellow(' (disabled)');
381
- console.log(` ${status} ${chalk.cyan(p.name)} ${versionStr}${disabledStr}`);
382
- if (p.package !== p.name) {
383
- console.log(` ${chalk.dim(p.package)}`);
384
- }
385
- }
386
- console.log();
387
- console.log(chalk.dim(`Plugins directory: ${pluginsDir}`));
388
- });
389
- // ============================================================================
390
- // plugin update [name]
391
- // ============================================================================
392
- plugin
393
- .command('update [name]')
394
- .alias('upgrade')
395
- .description('Update plugins (all or specific)')
396
- .option('--json', 'Output as JSON')
397
- .action(async (name, options) => {
398
- const plugins = getPlugins();
399
- if (plugins.length === 0) {
400
- console.log(chalk.dim('No plugins installed.'));
401
- return;
402
- }
403
- const pluginsDir = getPluginsDir();
404
- const spinner = ora('Checking for updates...').start();
405
- try {
406
- // Filter to specific plugin if name provided
407
- let toUpdate = plugins.filter(p => p.package);
408
- if (name) {
409
- const packageName = resolvePluginName(name);
410
- toUpdate = toUpdate.filter(p => p.package === packageName ||
411
- p.package === name ||
412
- getShortName(p.package ?? '') === name);
413
- if (toUpdate.length === 0) {
414
- spinner.fail(`Plugin not found: ${name}`);
415
- process.exit(1);
416
- }
417
- }
418
- const updates = [];
419
- for (const p of toUpdate) {
420
- const packageName = p.package;
421
- const currentVersion = getInstalledVersion(packageName, pluginsDir);
422
- const latestVersion = getPackageVersion(packageName);
423
- if (currentVersion && latestVersion && currentVersion !== latestVersion) {
424
- updates.push({
425
- name: getShortName(packageName),
426
- from: currentVersion,
427
- to: latestVersion,
428
- });
429
- }
430
- }
431
- if (updates.length === 0) {
432
- spinner.succeed('All plugins are up to date.');
433
- if (options.json) {
434
- output.json({ success: true, updates: [] });
435
- }
436
- return;
437
- }
438
- spinner.text = `Updating ${updates.length} plugin(s)...`;
439
- // Install latest versions explicitly (npm update respects semver ranges,
440
- // which wouldn't update e.g. ^1.0.0 to 2.0.0)
441
- const packagesToUpdate = updates.map(u => {
442
- const plugin = toUpdate.find(p => getShortName(p.package ?? '') === u.name);
443
- return `${plugin.package}@latest`;
444
- });
445
- const updateResult = await runNpm(['install', ...packagesToUpdate], pluginsDir);
446
- if (!updateResult.success) {
447
- spinner.fail('Update failed');
448
- output.error(updateResult.output);
449
- process.exit(1);
450
- }
451
- spinner.succeed('Plugins updated');
452
- if (options.json) {
453
- output.json({ success: true, updates });
454
- return;
455
- }
456
- console.log();
457
- for (const u of updates) {
458
- console.log(` ${chalk.cyan(u.name)}: ${u.from} → ${chalk.green(u.to)}`);
459
- }
460
- }
461
- catch (err) {
462
- spinner.fail('Update failed');
463
- output.error(err instanceof Error ? err.message : String(err));
464
- process.exit(1);
465
- }
466
- });
467
- // ============================================================================
468
- // plugin enable <name>
469
- // ============================================================================
470
- plugin
471
- .command('enable <name>')
472
- .description('Enable a disabled plugin')
473
- .option('--json', 'Output as JSON')
474
- .action((name, options) => {
475
- const plugins = getPlugins();
476
- const packageName = resolvePluginName(name);
477
- const found = plugins.find(p => p.package === packageName ||
478
- p.package === name ||
479
- getShortName(p.package ?? '') === name);
480
- if (!found) {
481
- output.error(`Plugin not found: ${name}`);
482
- console.log('Use "znvault plugin list" to see installed plugins.');
483
- process.exit(1);
484
- }
485
- if (found.enabled !== false) {
486
- if (options.json) {
487
- output.json({ success: true, name: getShortName(found.package ?? name), alreadyEnabled: true });
488
- return;
489
- }
490
- console.log(`Plugin ${chalk.cyan(getShortName(found.package ?? name))} is already enabled.`);
491
- return;
492
- }
493
- setPluginEnabled(found.package ?? found.path ?? '', true);
494
- if (options.json) {
495
- output.json({ success: true, name: getShortName(found.package ?? name) });
496
- return;
497
- }
498
- output.success(`Enabled plugin: ${getShortName(found.package ?? name)}`);
499
- });
500
- // ============================================================================
501
- // plugin disable <name>
502
- // ============================================================================
503
- plugin
504
- .command('disable <name>')
505
- .description('Disable a plugin without uninstalling')
506
- .option('--json', 'Output as JSON')
507
- .action((name, options) => {
508
- const plugins = getPlugins();
509
- const packageName = resolvePluginName(name);
510
- const found = plugins.find(p => p.package === packageName ||
511
- p.package === name ||
512
- getShortName(p.package ?? '') === name);
513
- if (!found) {
514
- output.error(`Plugin not found: ${name}`);
515
- console.log('Use "znvault plugin list" to see installed plugins.');
516
- process.exit(1);
517
- }
518
- if (found.enabled === false) {
519
- if (options.json) {
520
- output.json({ success: true, name: getShortName(found.package ?? name), alreadyDisabled: true });
521
- return;
522
- }
523
- console.log(`Plugin ${chalk.cyan(getShortName(found.package ?? name))} is already disabled.`);
524
- return;
525
- }
526
- setPluginEnabled(found.package ?? found.path ?? '', false);
527
- if (options.json) {
528
- output.json({ success: true, name: getShortName(found.package ?? name) });
529
- return;
530
- }
531
- output.success(`Disabled plugin: ${getShortName(found.package ?? name)}`);
532
- });
533
- // ============================================================================
534
- // plugin info <name>
535
- // ============================================================================
536
- plugin
537
- .command('info <name>')
538
- .description('Show plugin information')
539
- .option('--json', 'Output as JSON')
540
- .action(async (name, options) => {
541
- const spinner = ora('Fetching plugin info...').start();
542
- try {
543
- const packageName = resolvePluginName(name);
544
- const plugins = getPlugins();
545
- const pluginsDir = getPluginsDir();
546
- // Check if installed locally
547
- const installed = plugins.find(p => p.package === packageName ||
548
- p.package === name ||
549
- getShortName(p.package ?? '') === name);
550
- // Get npm info
551
- let npmInfo = null;
552
- try {
553
- if (isValidPackageName(packageName)) {
554
- const infoStr = execFileSync('npm', ['view', packageName, '--json'], { stdio: 'pipe' }).toString();
555
- npmInfo = JSON.parse(infoStr);
556
- }
557
- }
558
- catch {
559
- // Try without prefix
560
- if (packageName !== name && isValidPackageName(name)) {
561
- try {
562
- const infoStr = execFileSync('npm', ['view', name, '--json'], { stdio: 'pipe' }).toString();
563
- npmInfo = JSON.parse(infoStr);
564
- }
565
- catch {
566
- // Not found
567
- }
568
- }
569
- }
570
- spinner.stop();
571
- if (!installed && !npmInfo) {
572
- if (options.json) {
573
- output.json({ success: false, error: `Plugin not found: ${name}` });
574
- process.exit(1);
575
- }
576
- output.error(`Plugin not found: ${name}`);
577
- process.exit(1);
578
- }
579
- if (options.json) {
580
- const localVersion = installed?.package ? getInstalledVersion(installed.package, pluginsDir) : null;
581
- output.json({
582
- name: getShortName(packageName),
583
- package: packageName,
584
- npm: npmInfo ? {
585
- version: npmInfo.version,
586
- description: npmInfo.description,
587
- homepage: npmInfo.homepage,
588
- } : null,
589
- local: installed ? {
590
- installed: true,
591
- version: localVersion ?? 'unknown',
592
- enabled: installed.enabled !== false,
593
- updateAvailable: npmInfo && localVersion && localVersion !== npmInfo.version,
594
- } : null,
595
- });
596
- return;
597
- }
598
- console.log();
599
- console.log(chalk.bold(getShortName(packageName)));
600
- console.log();
601
- if (npmInfo) {
602
- console.log(` Package: ${chalk.cyan(packageName)}`);
603
- console.log(` Version: ${npmInfo.version}`);
604
- if (npmInfo.description) {
605
- console.log(` Description: ${npmInfo.description}`);
606
- }
607
- if (npmInfo.homepage) {
608
- console.log(` Homepage: ${chalk.blue(npmInfo.homepage)}`);
609
- }
610
- }
611
- if (installed) {
612
- const localVersion = getInstalledVersion(installed.package, pluginsDir);
613
- console.log();
614
- console.log(chalk.dim('Local Installation:'));
615
- console.log(` Installed: ${chalk.green('Yes')}`);
616
- console.log(` Version: ${localVersion || 'unknown'}`);
617
- console.log(` Enabled: ${installed.enabled !== false ? chalk.green('Yes') : chalk.yellow('No')}`);
618
- if (npmInfo && localVersion && localVersion !== npmInfo.version) {
619
- console.log();
620
- console.log(chalk.yellow(` Update available: ${localVersion} → ${npmInfo.version}`));
621
- console.log(chalk.dim(` Run: znvault plugin update ${getShortName(packageName)}`));
622
- }
623
- }
624
- else {
625
- console.log();
626
- console.log(chalk.dim('Not installed locally.'));
627
- console.log(`Install with: ${chalk.cyan(`znvault plugin install ${getShortName(packageName)}`)}`);
628
- }
629
- }
630
- catch (err) {
631
- spinner.fail('Failed to fetch info');
632
- output.error(err instanceof Error ? err.message : String(err));
633
- process.exit(1);
634
- }
635
- });
636
- }
637
- //# sourceMappingURL=plugin.js.map