@intecoag/inteco-cli 1.11.8 → 1.12.0-beta.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 (272) hide show
  1. package/README.md +13 -1
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +158 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/modules/adbBridge.d.ts +2 -0
  7. package/dist/modules/adbBridge.d.ts.map +1 -0
  8. package/dist/modules/adbBridge.js +40 -0
  9. package/dist/modules/adbBridge.js.map +1 -0
  10. package/dist/modules/adbBridge.test.d.ts +2 -0
  11. package/dist/modules/adbBridge.test.d.ts.map +1 -0
  12. package/dist/modules/adbBridge.test.js +39 -0
  13. package/dist/modules/adbBridge.test.js.map +1 -0
  14. package/dist/modules/adbIntentSender.d.ts +2 -0
  15. package/dist/modules/adbIntentSender.d.ts.map +1 -0
  16. package/dist/modules/adbIntentSender.js +67 -0
  17. package/dist/modules/adbIntentSender.js.map +1 -0
  18. package/dist/modules/adbIntentSender.test.d.ts +2 -0
  19. package/dist/modules/adbIntentSender.test.d.ts.map +1 -0
  20. package/dist/modules/adbIntentSender.test.js +48 -0
  21. package/dist/modules/adbIntentSender.test.js.map +1 -0
  22. package/dist/modules/azureSync.d.ts +16 -0
  23. package/dist/modules/azureSync.d.ts.map +1 -0
  24. package/{src → dist}/modules/azureSync.js +55 -136
  25. package/dist/modules/azureSync.js.map +1 -0
  26. package/dist/modules/azureSync.test.d.ts +2 -0
  27. package/dist/modules/azureSync.test.d.ts.map +1 -0
  28. package/dist/modules/azureSync.test.js +69 -0
  29. package/dist/modules/azureSync.test.js.map +1 -0
  30. package/dist/modules/bundleProduct.d.ts +2 -0
  31. package/dist/modules/bundleProduct.d.ts.map +1 -0
  32. package/{src → dist}/modules/bundleProduct.js +41 -80
  33. package/dist/modules/bundleProduct.js.map +1 -0
  34. package/dist/modules/bundleProduct.test.d.ts +2 -0
  35. package/dist/modules/bundleProduct.test.d.ts.map +1 -0
  36. package/dist/modules/bundleProduct.test.js +75 -0
  37. package/dist/modules/bundleProduct.test.js.map +1 -0
  38. package/dist/modules/changelog.d.ts +3 -0
  39. package/dist/modules/changelog.d.ts.map +1 -0
  40. package/dist/modules/changelog.js +45 -0
  41. package/dist/modules/changelog.js.map +1 -0
  42. package/dist/modules/changelog.test.d.ts +2 -0
  43. package/dist/modules/changelog.test.d.ts.map +1 -0
  44. package/dist/modules/changelog.test.js +33 -0
  45. package/dist/modules/changelog.test.js.map +1 -0
  46. package/dist/modules/configMutation.d.ts +5 -0
  47. package/dist/modules/configMutation.d.ts.map +1 -0
  48. package/{src → dist}/modules/configMutation.js +57 -104
  49. package/dist/modules/configMutation.js.map +1 -0
  50. package/dist/modules/configMutation.test.d.ts +2 -0
  51. package/dist/modules/configMutation.test.d.ts.map +1 -0
  52. package/dist/modules/configMutation.test.js +28 -0
  53. package/dist/modules/configMutation.test.js.map +1 -0
  54. package/dist/modules/csvMerger.d.ts +2 -0
  55. package/dist/modules/csvMerger.d.ts.map +1 -0
  56. package/dist/modules/csvMerger.js +104 -0
  57. package/dist/modules/csvMerger.js.map +1 -0
  58. package/dist/modules/csvMerger.test.d.ts +2 -0
  59. package/dist/modules/csvMerger.test.d.ts.map +1 -0
  60. package/dist/modules/csvMerger.test.js +76 -0
  61. package/dist/modules/csvMerger.test.js.map +1 -0
  62. package/dist/modules/deleteDB.d.ts +2 -0
  63. package/dist/modules/deleteDB.d.ts.map +1 -0
  64. package/dist/modules/deleteDB.js +75 -0
  65. package/dist/modules/deleteDB.js.map +1 -0
  66. package/dist/modules/deleteDB.test.d.ts +2 -0
  67. package/dist/modules/deleteDB.test.d.ts.map +1 -0
  68. package/dist/modules/deleteDB.test.js +78 -0
  69. package/dist/modules/deleteDB.test.js.map +1 -0
  70. package/dist/modules/dumpDB.d.ts +3 -0
  71. package/dist/modules/dumpDB.d.ts.map +1 -0
  72. package/{src → dist}/modules/dumpDB.js +64 -89
  73. package/dist/modules/dumpDB.js.map +1 -0
  74. package/dist/modules/dumpDB.test.d.ts +2 -0
  75. package/dist/modules/dumpDB.test.d.ts.map +1 -0
  76. package/dist/modules/dumpDB.test.js +104 -0
  77. package/dist/modules/dumpDB.test.js.map +1 -0
  78. package/dist/modules/dumpTableToCSV.d.ts +4 -0
  79. package/dist/modules/dumpTableToCSV.d.ts.map +1 -0
  80. package/dist/modules/dumpTableToCSV.js +135 -0
  81. package/dist/modules/dumpTableToCSV.js.map +1 -0
  82. package/dist/modules/dumpTableToCSV.test.d.ts +2 -0
  83. package/dist/modules/dumpTableToCSV.test.d.ts.map +1 -0
  84. package/dist/modules/dumpTableToCSV.test.js +15 -0
  85. package/dist/modules/dumpTableToCSV.test.js.map +1 -0
  86. package/dist/modules/extdSearch.d.ts +2 -0
  87. package/dist/modules/extdSearch.d.ts.map +1 -0
  88. package/{src → dist}/modules/extdSearch.js +60 -60
  89. package/dist/modules/extdSearch.js.map +1 -0
  90. package/dist/modules/extdSearch.test.d.ts +2 -0
  91. package/dist/modules/extdSearch.test.d.ts.map +1 -0
  92. package/dist/modules/extdSearch.test.js +114 -0
  93. package/dist/modules/extdSearch.test.js.map +1 -0
  94. package/dist/modules/githubDeploymentKey.d.ts +3 -0
  95. package/dist/modules/githubDeploymentKey.d.ts.map +1 -0
  96. package/dist/modules/githubDeploymentKey.js +241 -0
  97. package/dist/modules/githubDeploymentKey.js.map +1 -0
  98. package/dist/modules/githubDeploymentKey.test.d.ts +2 -0
  99. package/dist/modules/githubDeploymentKey.test.d.ts.map +1 -0
  100. package/dist/modules/githubDeploymentKey.test.js +50 -0
  101. package/dist/modules/githubDeploymentKey.test.js.map +1 -0
  102. package/dist/modules/githubDeploymentKeysList.d.ts +6 -0
  103. package/dist/modules/githubDeploymentKeysList.d.ts.map +1 -0
  104. package/dist/modules/githubDeploymentKeysList.js +185 -0
  105. package/dist/modules/githubDeploymentKeysList.js.map +1 -0
  106. package/dist/modules/githubDeploymentKeysList.test.d.ts +2 -0
  107. package/dist/modules/githubDeploymentKeysList.test.d.ts.map +1 -0
  108. package/dist/modules/githubDeploymentKeysList.test.js +70 -0
  109. package/dist/modules/githubDeploymentKeysList.test.js.map +1 -0
  110. package/dist/modules/githubSecurityAdvisories.d.ts +3 -0
  111. package/dist/modules/githubSecurityAdvisories.d.ts.map +1 -0
  112. package/dist/modules/githubSecurityAdvisories.js +145 -0
  113. package/dist/modules/githubSecurityAdvisories.js.map +1 -0
  114. package/dist/modules/githubSecurityAdvisories.test.d.ts +2 -0
  115. package/dist/modules/githubSecurityAdvisories.test.d.ts.map +1 -0
  116. package/dist/modules/githubSecurityAdvisories.test.js +67 -0
  117. package/dist/modules/githubSecurityAdvisories.test.js.map +1 -0
  118. package/dist/modules/graphqlSchemaExport.d.ts +2 -0
  119. package/dist/modules/graphqlSchemaExport.d.ts.map +1 -0
  120. package/dist/modules/graphqlSchemaExport.js +59 -0
  121. package/dist/modules/graphqlSchemaExport.js.map +1 -0
  122. package/dist/modules/graphqlSchemaExport.test.d.ts +2 -0
  123. package/dist/modules/graphqlSchemaExport.test.d.ts.map +1 -0
  124. package/dist/modules/graphqlSchemaExport.test.js +61 -0
  125. package/dist/modules/graphqlSchemaExport.test.js.map +1 -0
  126. package/dist/modules/importDB.d.ts +2 -0
  127. package/dist/modules/importDB.d.ts.map +1 -0
  128. package/{src → dist}/modules/importDB.js +48 -66
  129. package/dist/modules/importDB.js.map +1 -0
  130. package/dist/modules/importDB.test.d.ts +2 -0
  131. package/dist/modules/importDB.test.d.ts.map +1 -0
  132. package/dist/modules/importDB.test.js +65 -0
  133. package/dist/modules/importDB.test.js.map +1 -0
  134. package/dist/modules/rewriteConfig.d.ts +3 -0
  135. package/dist/modules/rewriteConfig.d.ts.map +1 -0
  136. package/dist/modules/rewriteConfig.js +75 -0
  137. package/dist/modules/rewriteConfig.js.map +1 -0
  138. package/dist/modules/rewriteConfig.test.d.ts +2 -0
  139. package/dist/modules/rewriteConfig.test.d.ts.map +1 -0
  140. package/dist/modules/rewriteConfig.test.js +62 -0
  141. package/dist/modules/rewriteConfig.test.js.map +1 -0
  142. package/dist/modules/setCLIConfig.d.ts +2 -0
  143. package/dist/modules/setCLIConfig.d.ts.map +1 -0
  144. package/dist/modules/setCLIConfig.js +29 -0
  145. package/dist/modules/setCLIConfig.js.map +1 -0
  146. package/dist/modules/setCLIConfig.test.d.ts +2 -0
  147. package/dist/modules/setCLIConfig.test.d.ts.map +1 -0
  148. package/dist/modules/setCLIConfig.test.js +40 -0
  149. package/dist/modules/setCLIConfig.test.js.map +1 -0
  150. package/dist/modules/syncConfig.d.ts +4 -0
  151. package/dist/modules/syncConfig.d.ts.map +1 -0
  152. package/{src → dist}/modules/syncConfig.js +76 -129
  153. package/dist/modules/syncConfig.js.map +1 -0
  154. package/dist/modules/syncConfig.test.d.ts +2 -0
  155. package/dist/modules/syncConfig.test.d.ts.map +1 -0
  156. package/dist/modules/syncConfig.test.js +71 -0
  157. package/dist/modules/syncConfig.test.js.map +1 -0
  158. package/dist/modules/t003Rewrite.d.ts +2 -0
  159. package/dist/modules/t003Rewrite.d.ts.map +1 -0
  160. package/dist/modules/t003Rewrite.js +53 -0
  161. package/dist/modules/t003Rewrite.js.map +1 -0
  162. package/dist/modules/t003Rewrite.test.d.ts +2 -0
  163. package/dist/modules/t003Rewrite.test.d.ts.map +1 -0
  164. package/dist/modules/t003Rewrite.test.js +43 -0
  165. package/dist/modules/t003Rewrite.test.js.map +1 -0
  166. package/dist/modules/t009Search.d.ts +2 -0
  167. package/dist/modules/t009Search.d.ts.map +1 -0
  168. package/dist/modules/t009Search.js +30 -0
  169. package/dist/modules/t009Search.js.map +1 -0
  170. package/dist/modules/t009Search.test.d.ts +2 -0
  171. package/dist/modules/t009Search.test.d.ts.map +1 -0
  172. package/dist/modules/t009Search.test.js +83 -0
  173. package/dist/modules/t009Search.test.js.map +1 -0
  174. package/{src → dist}/ressources/cmds.json +3 -0
  175. package/dist/utils/azure/azure.d.ts +24 -0
  176. package/dist/utils/azure/azure.d.ts.map +1 -0
  177. package/{src → dist}/utils/azure/azure.js +14 -21
  178. package/dist/utils/azure/azure.js.map +1 -0
  179. package/dist/utils/azure/azure.test.d.ts +2 -0
  180. package/dist/utils/azure/azure.test.d.ts.map +1 -0
  181. package/dist/utils/azure/azure.test.js +98 -0
  182. package/dist/utils/azure/azure.test.js.map +1 -0
  183. package/dist/utils/config/config.d.ts +27 -0
  184. package/dist/utils/config/config.d.ts.map +1 -0
  185. package/dist/utils/config/config.js +74 -0
  186. package/dist/utils/config/config.js.map +1 -0
  187. package/dist/utils/config/config.test.d.ts +2 -0
  188. package/dist/utils/config/config.test.d.ts.map +1 -0
  189. package/dist/utils/config/config.test.js +64 -0
  190. package/dist/utils/config/config.test.js.map +1 -0
  191. package/dist/utils/db/DB.d.ts +14 -0
  192. package/dist/utils/db/DB.d.ts.map +1 -0
  193. package/dist/utils/db/DB.js +61 -0
  194. package/dist/utils/db/DB.js.map +1 -0
  195. package/dist/utils/db/DB.test.d.ts +2 -0
  196. package/dist/utils/db/DB.test.d.ts.map +1 -0
  197. package/dist/utils/db/DB.test.js +73 -0
  198. package/dist/utils/db/DB.test.js.map +1 -0
  199. package/dist/utils/fs/FS.d.ts +15 -0
  200. package/dist/utils/fs/FS.d.ts.map +1 -0
  201. package/{src → dist}/utils/fs/FS.js +31 -45
  202. package/dist/utils/fs/FS.js.map +1 -0
  203. package/dist/utils/fs/FS.test.d.ts +2 -0
  204. package/dist/utils/fs/FS.test.d.ts.map +1 -0
  205. package/dist/utils/fs/FS.test.js +124 -0
  206. package/dist/utils/fs/FS.test.js.map +1 -0
  207. package/dist/utils/github/github.d.ts +29 -0
  208. package/dist/utils/github/github.d.ts.map +1 -0
  209. package/dist/utils/github/github.js +96 -0
  210. package/dist/utils/github/github.js.map +1 -0
  211. package/dist/utils/github/github.test.d.ts +2 -0
  212. package/dist/utils/github/github.test.d.ts.map +1 -0
  213. package/dist/utils/github/github.test.js +83 -0
  214. package/dist/utils/github/github.test.js.map +1 -0
  215. package/dist/utils/shell/DatabaseShell.d.ts +77 -0
  216. package/dist/utils/shell/DatabaseShell.d.ts.map +1 -0
  217. package/{src → dist}/utils/shell/DatabaseShell.js +73 -87
  218. package/dist/utils/shell/DatabaseShell.js.map +1 -0
  219. package/dist/utils/shell/DatabaseShell.test.d.ts +2 -0
  220. package/dist/utils/shell/DatabaseShell.test.d.ts.map +1 -0
  221. package/dist/utils/shell/DatabaseShell.test.js +78 -0
  222. package/dist/utils/shell/DatabaseShell.test.js.map +1 -0
  223. package/dist/utils/shell/DatabaseShellBuilder.d.ts +67 -0
  224. package/dist/utils/shell/DatabaseShellBuilder.d.ts.map +1 -0
  225. package/{src → dist}/utils/shell/DatabaseShellBuilder.js +50 -59
  226. package/dist/utils/shell/DatabaseShellBuilder.js.map +1 -0
  227. package/dist/utils/shell/DatabaseShellBuilder.test.d.ts +2 -0
  228. package/dist/utils/shell/DatabaseShellBuilder.test.d.ts.map +1 -0
  229. package/dist/utils/shell/DatabaseShellBuilder.test.js +55 -0
  230. package/dist/utils/shell/DatabaseShellBuilder.test.js.map +1 -0
  231. package/dist/utils/shell/Shell.d.ts +30 -0
  232. package/dist/utils/shell/Shell.d.ts.map +1 -0
  233. package/{src → dist}/utils/shell/Shell.js +14 -19
  234. package/dist/utils/shell/Shell.js.map +1 -0
  235. package/dist/utils/shell/Shell.test.d.ts +2 -0
  236. package/dist/utils/shell/Shell.test.d.ts.map +1 -0
  237. package/dist/utils/shell/Shell.test.js +65 -0
  238. package/dist/utils/shell/Shell.test.js.map +1 -0
  239. package/dist/utils/shell/ShellBuilder.d.ts +60 -0
  240. package/dist/utils/shell/ShellBuilder.d.ts.map +1 -0
  241. package/{src → dist}/utils/shell/ShellBuilder.js +23 -44
  242. package/dist/utils/shell/ShellBuilder.js.map +1 -0
  243. package/dist/utils/shell/ShellBuilder.test.d.ts +2 -0
  244. package/dist/utils/shell/ShellBuilder.test.d.ts.map +1 -0
  245. package/dist/utils/shell/ShellBuilder.test.js +39 -0
  246. package/dist/utils/shell/ShellBuilder.test.js.map +1 -0
  247. package/package.json +39 -11
  248. package/.github/dependabot.yml +0 -28
  249. package/.github/workflows/publish.yml +0 -31
  250. package/.husky/commit-msg +0 -1
  251. package/.vscode/settings.json +0 -6
  252. package/commitlint.config.mjs +0 -4
  253. package/src/index.js +0 -130
  254. package/src/modules/adbBridge.js +0 -52
  255. package/src/modules/adbIntentSender.js +0 -82
  256. package/src/modules/changelog.js +0 -60
  257. package/src/modules/csvMerger.js +0 -118
  258. package/src/modules/deleteDB.js +0 -84
  259. package/src/modules/dumpTableToCSV.js +0 -154
  260. package/src/modules/githubDeploymentKey.js +0 -265
  261. package/src/modules/githubDeploymentKeysList.js +0 -199
  262. package/src/modules/githubSecurityAdvisories.js +0 -162
  263. package/src/modules/graphqlSchemaExport.js +0 -61
  264. package/src/modules/rewriteConfig.js +0 -93
  265. package/src/modules/setCLIConfig.js +0 -33
  266. package/src/modules/t003Rewrite.js +0 -64
  267. package/src/modules/t009Search.js +0 -34
  268. package/src/utils/config/config.js +0 -70
  269. package/src/utils/db/DB.js +0 -54
  270. package/src/utils/github/github.js +0 -102
  271. /package/{src → dist}/ressources/wegas_p.ico +0 -0
  272. /package/{src → dist}/utils/config/default.json +0 -0
@@ -0,0 +1,241 @@
1
+ import prompts from 'prompts';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { execSync } from 'child_process';
5
+ import { getGithubToken, fetchPaginatedGithubAPI } from '../utils/github/github.js';
6
+ export async function addGithubDeploymentKey() {
7
+ console.log();
8
+ // Get GitHub authentication token
9
+ let token = "";
10
+ let authMethod = "";
11
+ try {
12
+ ({ token, authMethod } = await getGithubToken());
13
+ }
14
+ catch (error) {
15
+ const message = error instanceof Error ? error.message : String(error);
16
+ console.log();
17
+ console.error(chalk.red(`x ${message}`));
18
+ console.log(chalk.yellow('\nAuthentication setup:'));
19
+ console.log(chalk.gray(' Option 1: Install GitHub CLI and run: gh auth login'));
20
+ console.log(chalk.gray(' Option 2: Set GITHUB_TOKEN environment variable'));
21
+ console.log();
22
+ process.exit(1);
23
+ }
24
+ console.log(chalk.green(`Authenticated via: ${authMethod}`));
25
+ console.log();
26
+ // Step 1: Select Organization
27
+ const orgResponse = await prompts([
28
+ {
29
+ type: 'text',
30
+ name: 'organization',
31
+ message: 'GitHub Organization Name?',
32
+ initial: 'intecoag',
33
+ validate: (value) => value.length > 0 || 'Organization name is required'
34
+ }
35
+ ], {
36
+ onCancel: () => {
37
+ console.log();
38
+ console.log(chalk.red('Cancelled GitHub Deployment Key setup!'));
39
+ console.log();
40
+ process.exit(0);
41
+ }
42
+ });
43
+ const { organization } = orgResponse;
44
+ const spinner = ora('Fetching repositories...').start();
45
+ try {
46
+ // Fetch all repositories for the organization
47
+ const baseUrl = `https://api.github.com/orgs/${organization}/repos`;
48
+ const repos = await fetchPaginatedGithubAPI(baseUrl, token);
49
+ if (repos.length === 0) {
50
+ spinner.warn(`No repositories found in organization "${organization}"`);
51
+ console.log();
52
+ return;
53
+ }
54
+ spinner.succeed(`Found ${repos.length} repositories`);
55
+ console.log();
56
+ // Step 2: Select Repository
57
+ const repoResponse = await prompts([
58
+ {
59
+ type: 'autocomplete',
60
+ name: 'repository',
61
+ message: 'Select repository:',
62
+ choices: repos.map((repo) => ({
63
+ title: repo.name,
64
+ value: repo.name,
65
+ description: repo.description || 'No description'
66
+ })),
67
+ hint: 'Start typing to filter',
68
+ validate: (value) => {
69
+ const exists = repos.some((repo) => repo.name === value);
70
+ return exists || 'Repository does not exist in this organization';
71
+ }
72
+ }
73
+ ], {
74
+ onCancel: () => {
75
+ console.log();
76
+ console.log(chalk.red('Cancelled GitHub Deployment Key setup!'));
77
+ console.log();
78
+ process.exit(0);
79
+ }
80
+ });
81
+ const { repository } = repoResponse;
82
+ // Step 3: Generate and display setup script
83
+ displayDeploymentKeyScript(organization, repository);
84
+ // Step 4: Prompt for public key and create deployment key
85
+ const publicKeyResponse = await prompts([
86
+ {
87
+ type: 'text',
88
+ name: 'publicKey',
89
+ message: 'Paste the public key content here:',
90
+ validate: (value) => {
91
+ if (!value.trim().length)
92
+ return 'Public key is required';
93
+ if (!value.includes('ssh-ed25519') && !value.includes('ssh-rsa') && !value.includes('ecdsa-sha2')) {
94
+ return 'Invalid SSH public key format';
95
+ }
96
+ return true;
97
+ }
98
+ },
99
+ {
100
+ type: 'text',
101
+ name: 'keyName',
102
+ message: 'Deployment key name:',
103
+ validate: (value) => value.length > 0 || 'Key name is required'
104
+ }
105
+ ], {
106
+ onCancel: () => {
107
+ console.log();
108
+ console.log(chalk.yellow('Skipped creating deployment key on GitHub. You can add it manually later.'));
109
+ console.log();
110
+ process.exit(0);
111
+ }
112
+ });
113
+ const { publicKey, keyName } = publicKeyResponse;
114
+ // Create deployment key on GitHub
115
+ await createDeploymentKey(organization, repository, publicKey, keyName);
116
+ // Step 5: Show clone command
117
+ displayCloneCommand(organization, repository);
118
+ }
119
+ catch (error) {
120
+ const message = error instanceof Error ? error.message : String(error);
121
+ console.log();
122
+ spinner.fail('Error fetching repositories');
123
+ if (message.startsWith('401')) {
124
+ console.error(chalk.red(`x ${message}`));
125
+ console.log(chalk.yellow('\nAuthentication setup:'));
126
+ console.log(chalk.gray(' Option 1: Install GitHub CLI and run: gh auth login'));
127
+ console.log(chalk.gray(' Option 2: Set GITHUB_TOKEN environment variable'));
128
+ }
129
+ else if (message.startsWith('404')) {
130
+ console.error(chalk.red(`x ${message} - Organization not found`));
131
+ }
132
+ else {
133
+ console.error(chalk.red(`Error: ${message}`));
134
+ }
135
+ console.log();
136
+ process.exit(1);
137
+ }
138
+ }
139
+ function displayDeploymentKeyScript(organization, repository) {
140
+ // Use organization and repository in the key name to avoid collisions
141
+ const keyPath = `~/.ssh/id_ed25519_github_${organization}_${repository}`;
142
+ const deploymentKeyName = `${repository}-deployment-key`;
143
+ console.log();
144
+ console.log(chalk.bold.cyan('=============================================================='));
145
+ console.log(chalk.bold.cyan(`Deployment Key Setup for: ${organization}/${repository}`));
146
+ console.log(chalk.bold.cyan('=============================================================='));
147
+ console.log();
148
+ console.log(chalk.bold.yellow('STEP 1: Copy and paste the script below on your server'));
149
+ console.log(chalk.gray('--------------------------------------------------------------'));
150
+ console.log();
151
+ const linuxScript = generateBashScript(keyPath, deploymentKeyName, organization, repository);
152
+ console.log(chalk.bold('Linux/macOS Setup Script:'));
153
+ console.log(chalk.blue('--------------------------------------------------------------'));
154
+ console.log(linuxScript);
155
+ console.log();
156
+ }
157
+ function generateBashScript(keyPath, keyName, organization, repository) {
158
+ // Convert ~ to $HOME for proper expansion in bash
159
+ const expandedKeyPath = keyPath.replace(/^~/, '$HOME');
160
+ return `
161
+ # Create SSH directory if it doesn't exist
162
+ mkdir -p ~/.ssh
163
+ chmod 700 ~/.ssh
164
+
165
+ # Generate ED25519 SSH key (secure and modern)
166
+ ssh-keygen -t ed25519 -C "${keyName}" -f "${expandedKeyPath}" -N ""
167
+
168
+ # Set proper permissions
169
+ chmod 600 "${expandedKeyPath}"
170
+ chmod 644 "${expandedKeyPath}.pub"
171
+
172
+ # Add to SSH config for easy usage
173
+ if ! grep -q "Host github-${organization}-${repository}" ~/.ssh/config 2>/dev/null; then
174
+ cat >> ~/.ssh/config << 'EOF'
175
+
176
+ Host github-${organization}-${repository}
177
+ HostName github.com
178
+ User git
179
+ IdentityFile ${keyPath}
180
+ IdentitiesOnly yes
181
+ EOF
182
+ fi
183
+
184
+ # Display public key for GitHub setup
185
+ echo ""
186
+ echo "========================================"
187
+ echo "Public Key (copy this to Inteco CLI):"
188
+ echo "========================================"
189
+ cat "${expandedKeyPath}.pub"
190
+ echo ""
191
+ echo "========================================"
192
+ echo "Private key saved to: ${expandedKeyPath}"
193
+ echo "SSH config updated for: github-${organization}-${repository}"
194
+ echo "========================================"
195
+ echo ""`;
196
+ }
197
+ async function createDeploymentKey(organization, repository, publicKey, keyName) {
198
+ const spinner = ora('Creating deployment key on GitHub...').start();
199
+ try {
200
+ // Use GitHub CLI to add the deployment key
201
+ execSync(`gh repo deploy-key add --repo ${organization}/${repository} --title "${keyName}" -`, {
202
+ input: publicKey,
203
+ encoding: 'utf-8'
204
+ });
205
+ spinner.succeed(`Deployment key "${keyName}" created successfully`);
206
+ console.log();
207
+ }
208
+ catch (error) {
209
+ const message = error instanceof Error ? error.message : String(error);
210
+ spinner.fail('Failed to create deployment key');
211
+ if (message.includes('not found')) {
212
+ console.error(chalk.red(`x Repository not found: ${organization}/${repository}`));
213
+ }
214
+ else if (message.includes('already exists')) {
215
+ console.error(chalk.red(`x A key with this name already exists`));
216
+ }
217
+ else if (message.includes('Permission denied')) {
218
+ console.error(chalk.red(`x Permission denied. You may not have write access to this repository`));
219
+ }
220
+ else {
221
+ console.error(chalk.red(`x Error: ${message}`));
222
+ }
223
+ console.log();
224
+ process.exit(1);
225
+ }
226
+ }
227
+ function displayCloneCommand(organization, repository) {
228
+ console.log(chalk.bold.yellow('Clone Command'));
229
+ console.log(chalk.gray('--------------------------------------------------------------'));
230
+ console.log('Use this command to clone the repository with the deployment key:');
231
+ console.log();
232
+ console.log(chalk.cyan(`git clone git@github-${organization}-${repository}:${organization}/${repository}.git`));
233
+ console.log();
234
+ console.log(chalk.bold.yellow('Deployment Setup Complete!'));
235
+ console.log(chalk.green(`ok SSH key generated and stored locally`));
236
+ console.log(chalk.green(`ok Deployment key added to ${organization}/${repository}`));
237
+ console.log(chalk.green(`ok SSH config configured for easy access`));
238
+ console.log();
239
+ }
240
+ export default addGithubDeploymentKey;
241
+ //# sourceMappingURL=githubDeploymentKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKey.js","sourceRoot":"","sources":["../../src/modules/githubDeploymentKey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=githubDeploymentKey.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKey.test.d.ts","sourceRoot":"","sources":["../../src/modules/githubDeploymentKey.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ const mocks = vi.hoisted(() => {
3
+ const spinner = {
4
+ start: vi.fn(),
5
+ warn: vi.fn(),
6
+ fail: vi.fn(),
7
+ succeed: vi.fn(),
8
+ text: ""
9
+ };
10
+ spinner.start.mockReturnValue(spinner);
11
+ return {
12
+ prompts: vi.fn(),
13
+ ora: vi.fn(() => spinner),
14
+ execSync: vi.fn(),
15
+ getGithubToken: vi.fn(),
16
+ fetchPaginatedGithubAPI: vi.fn(),
17
+ spinner
18
+ };
19
+ });
20
+ vi.mock("prompts", () => ({ default: mocks.prompts }));
21
+ vi.mock("ora", () => ({ default: mocks.ora }));
22
+ vi.mock("child_process", () => ({ execSync: mocks.execSync }));
23
+ vi.mock("../utils/github/github.js", () => ({
24
+ getGithubToken: mocks.getGithubToken,
25
+ fetchPaginatedGithubAPI: mocks.fetchPaginatedGithubAPI
26
+ }));
27
+ import addGithubDeploymentKey from "./githubDeploymentKey.js";
28
+ describe("addGithubDeploymentKey", () => {
29
+ beforeEach(() => {
30
+ vi.clearAllMocks();
31
+ mocks.spinner.start.mockReturnValue(mocks.spinner);
32
+ mocks.getGithubToken.mockResolvedValue({ token: "t", authMethod: "env" });
33
+ });
34
+ it("warns and returns when no repos are found", async () => {
35
+ mocks.prompts.mockResolvedValue({ organization: "intecoag" });
36
+ mocks.fetchPaginatedGithubAPI.mockResolvedValue([]);
37
+ await addGithubDeploymentKey();
38
+ expect(mocks.spinner.warn).toHaveBeenCalledWith('No repositories found in organization "intecoag"');
39
+ });
40
+ it("creates deployment key with gh cli on success", async () => {
41
+ mocks.prompts
42
+ .mockResolvedValueOnce({ organization: "intecoag" })
43
+ .mockResolvedValueOnce({ repository: "repo1" })
44
+ .mockResolvedValueOnce({ publicKey: "ssh-ed25519 AAAA...", keyName: "repo1-key" });
45
+ mocks.fetchPaginatedGithubAPI.mockResolvedValue([{ name: "repo1", description: "r1" }]);
46
+ await addGithubDeploymentKey();
47
+ expect(mocks.execSync).toHaveBeenCalledWith('gh repo deploy-key add --repo intecoag/repo1 --title "repo1-key" -', expect.objectContaining({ input: "ssh-ed25519 AAAA...", encoding: "utf-8" }));
48
+ });
49
+ });
50
+ //# sourceMappingURL=githubDeploymentKey.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKey.test.js","sourceRoot":"","sources":["../../src/modules/githubDeploymentKey.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * List all deployment keys across all repositories in an organization
3
+ */
4
+ export declare function listGithubDeploymentKeys(): Promise<void>;
5
+ export default listGithubDeploymentKeys;
6
+ //# sourceMappingURL=githubDeploymentKeysList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKeysList.d.ts","sourceRoot":"","sources":["../../src/modules/githubDeploymentKeysList.ts"],"names":[],"mappings":"AAgEA;;GAEG;AACH,wBAAsB,wBAAwB,kBAwJ7C;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,185 @@
1
+ import prompts from 'prompts';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import Table from 'cli-table3';
5
+ import { getGithubToken, fetchPaginatedGithubAPI } from '../utils/github/github.js';
6
+ /**
7
+ * Format a date string to a readable format, or show "Never" if null
8
+ * @param {string|null} dateString - ISO date string or null
9
+ * @returns {string} Formatted date or "Never"
10
+ */
11
+ function formatDate(dateString) {
12
+ if (!dateString)
13
+ return chalk.gray('Never');
14
+ const date = new Date(dateString);
15
+ const now = new Date();
16
+ const diffMs = now.getTime() - date.getTime();
17
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
18
+ if (diffDays === 0)
19
+ return chalk.green('Today');
20
+ if (diffDays === 1)
21
+ return chalk.green('Yesterday');
22
+ if (diffDays < 7)
23
+ return chalk.green(`${diffDays} days ago`);
24
+ if (diffDays < 30)
25
+ return chalk.yellow(`${Math.floor(diffDays / 7)} weeks ago`);
26
+ if (diffDays < 365)
27
+ return chalk.yellow(`${Math.floor(diffDays / 30)} months ago`);
28
+ return chalk.red(`${Math.floor(diffDays / 365)} years ago`);
29
+ }
30
+ /**
31
+ * Fetch all deployment keys for a repository
32
+ * @param {string} baseUrl - Base API URL for the repository keys
33
+ * @param {string} token - GitHub authentication token
34
+ * @returns {Promise<Array>} Array of deployment keys
35
+ */
36
+ async function fetchDeploymentKeys(baseUrl, token) {
37
+ try {
38
+ return await fetchPaginatedGithubAPI(baseUrl, token);
39
+ }
40
+ catch {
41
+ // Return empty array if there's an error fetching keys for this repo
42
+ return [];
43
+ }
44
+ }
45
+ /**
46
+ * List all deployment keys across all repositories in an organization
47
+ */
48
+ export async function listGithubDeploymentKeys() {
49
+ console.log();
50
+ // Get GitHub authentication token
51
+ let token = "";
52
+ let authMethod = "";
53
+ try {
54
+ ({ token, authMethod } = await getGithubToken());
55
+ }
56
+ catch (error) {
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ console.log();
59
+ console.error(chalk.red(`x ${message}`));
60
+ console.log(chalk.yellow('\nAuthentication setup:'));
61
+ console.log(chalk.gray(' Option 1: Install GitHub CLI and run: gh auth login'));
62
+ console.log(chalk.gray(' Option 2: Set GITHUB_TOKEN environment variable'));
63
+ console.log();
64
+ process.exit(1);
65
+ }
66
+ console.log(chalk.green(`Authenticated via: ${authMethod}`));
67
+ console.log();
68
+ // Get organization name
69
+ const orgResponse = await prompts([
70
+ {
71
+ type: 'text',
72
+ name: 'organization',
73
+ message: 'GitHub Organization Name?',
74
+ initial: 'intecoag',
75
+ validate: (value) => value.length > 0 || 'Organization name is required'
76
+ }
77
+ ], {
78
+ onCancel: () => {
79
+ console.log();
80
+ console.log(chalk.red('Cancelled deployment keys listing!'));
81
+ console.log();
82
+ process.exit(0);
83
+ }
84
+ });
85
+ const { organization } = orgResponse;
86
+ let mainSpinner = ora('Fetching repositories...').start();
87
+ try {
88
+ // Fetch all repositories for the organization
89
+ const baseReposUrl = `https://api.github.com/orgs/${organization}/repos`;
90
+ const repos = await fetchPaginatedGithubAPI(baseReposUrl, token);
91
+ if (repos.length === 0) {
92
+ mainSpinner.warn(`No repositories found in organization "${organization}"`);
93
+ console.log();
94
+ return;
95
+ }
96
+ // Fetch deployment keys for all repositories
97
+ const allKeys = [];
98
+ for (let i = 0; i < repos.length; i++) {
99
+ const repo = repos[i];
100
+ const progress = `[${i + 1}/${repos.length}]`;
101
+ mainSpinner.text = `${progress} Fetching deployment keys from: ${chalk.blue(repo.name)}...`;
102
+ const keysUrl = `https://api.github.com/repos/${organization}/${repo.name}/keys`;
103
+ const keys = await fetchDeploymentKeys(keysUrl, token);
104
+ keys.forEach((key) => {
105
+ allKeys.push({
106
+ repository: repo.name,
107
+ keyId: key.id,
108
+ title: key.title,
109
+ createdAt: key.created_at,
110
+ lastUsedAt: key.last_used,
111
+ readOnly: key.read_only
112
+ });
113
+ });
114
+ }
115
+ mainSpinner.succeed(`Found ${allKeys.length} deployment keys across ${repos.length} repositories`);
116
+ console.log();
117
+ if (allKeys.length === 0) {
118
+ console.log(chalk.yellow('No deployment keys found in this organization.'));
119
+ console.log();
120
+ return;
121
+ }
122
+ // Display keys in a table
123
+ const table = new Table({
124
+ head: [
125
+ chalk.cyan('Repository'),
126
+ chalk.cyan('Key Title'),
127
+ chalk.cyan('Created'),
128
+ chalk.cyan('Last Used'),
129
+ chalk.cyan('Read-Only')
130
+ ].map(h => h),
131
+ style: { head: [], border: ['cyan'] },
132
+ colWidths: [25, 30, 20, 20, 12],
133
+ wordWrap: true
134
+ });
135
+ // Sort by repository name and then by last used date (newest first)
136
+ allKeys.sort((a, b) => {
137
+ if (a.repository !== b.repository) {
138
+ return a.repository.localeCompare(b.repository);
139
+ }
140
+ return new Date(b.lastUsedAt || 0).getTime() - new Date(a.lastUsedAt || 0).getTime();
141
+ });
142
+ allKeys.forEach((key) => {
143
+ table.push([
144
+ chalk.blue(key.repository),
145
+ key.title,
146
+ new Date(key.createdAt).toLocaleDateString(),
147
+ formatDate(key.lastUsedAt),
148
+ key.readOnly ? chalk.green('Yes') : chalk.yellow('No')
149
+ ]);
150
+ });
151
+ console.log(table.toString());
152
+ console.log();
153
+ // Show statistics
154
+ const keysNeverUsed = allKeys.filter(k => !k.lastUsedAt).length;
155
+ const readOnlyKeys = allKeys.filter(k => k.readOnly).length;
156
+ const readWriteKeys = allKeys.filter(k => !k.readOnly).length;
157
+ console.log(chalk.bold('Summary:'));
158
+ console.log(` Total deployment keys: ${chalk.cyan(allKeys.length)}`);
159
+ console.log(` Never used: ${chalk.yellow(keysNeverUsed)}`);
160
+ console.log(` Read-only keys: ${chalk.green(readOnlyKeys)}`);
161
+ console.log(` Read-write keys: ${chalk.yellow(readWriteKeys)}`);
162
+ console.log();
163
+ }
164
+ catch (error) {
165
+ const message = error instanceof Error ? error.message : String(error);
166
+ console.log();
167
+ mainSpinner.fail('Error fetching deployment keys');
168
+ if (message.startsWith('401')) {
169
+ console.error(chalk.red(`x ${message}`));
170
+ console.log(chalk.yellow('\nAuthentication setup:'));
171
+ console.log(chalk.gray(' Option 1: Install GitHub CLI and run: gh auth login'));
172
+ console.log(chalk.gray(' Option 2: Set GITHUB_TOKEN environment variable'));
173
+ }
174
+ else if (message.startsWith('404')) {
175
+ console.error(chalk.red(`x ${message} - Organization not found`));
176
+ }
177
+ else {
178
+ console.error(chalk.red(`Error: ${message}`));
179
+ }
180
+ console.log();
181
+ process.exit(1);
182
+ }
183
+ }
184
+ export default listGithubDeploymentKeys;
185
+ //# sourceMappingURL=githubDeploymentKeysList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKeysList.js","sourceRoot":"","sources":["../../src/modules/githubDeploymentKeysList.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAuBpF;;;;GAIG;AACH,SAAS,UAAU,CAAC,UAAyB;IAC3C,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE5D,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAC;IAC7D,IAAI,QAAQ,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAChF,IAAI,QAAQ,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;IAEnF,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,KAAa;IAC/D,IAAI,CAAC;QACH,OAAO,MAAM,uBAAuB,CAAgB,OAAO,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,kCAAkC;IAClC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC;QACH,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,wBAAwB;IACxB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;QAChC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,+BAA+B;SACjF;KACF,EAAE;QACD,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;KACF,CAA6B,CAAC;IAE/B,MAAM,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;IAErC,IAAI,WAAW,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1D,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,YAAY,GAAG,+BAA+B,YAAY,QAAQ,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAW,YAAY,EAAE,KAAK,CAAC,CAAC;QAE3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,WAAW,CAAC,IAAI,CAAC,0CAA0C,YAAY,GAAG,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,6CAA6C;QAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAC9C,WAAW,CAAC,IAAI,GAAG,GAAG,QAAQ,mCAAmC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAE5F,MAAM,OAAO,GAAG,gCAAgC,YAAY,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC;YACjF,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEvD,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,IAAI,CAAC,IAAI;oBACrB,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,SAAS,EAAE,GAAG,CAAC,UAAU;oBACzB,UAAU,EAAE,GAAG,CAAC,SAAS;oBACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;iBACxB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,WAAW,CAAC,OAAO,CAAC,SAAS,OAAO,CAAC,MAAM,2BAA2B,KAAK,CAAC,MAAM,eAAe,CAAC,CAAC;QACnG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE;gBACJ,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;aACxB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACb,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;YACrC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC/B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,oEAAoE;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;gBAClC,OAAO,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC1B,GAAG,CAAC,KAAK;gBACT,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE;gBAC5C,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC1B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;aACvD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,kBAAkB;QAClB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAChE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC5D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAEnD,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,2BAA2B,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=githubDeploymentKeysList.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKeysList.test.d.ts","sourceRoot":"","sources":["../../src/modules/githubDeploymentKeysList.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ const mocks = vi.hoisted(() => {
3
+ const spinner = {
4
+ text: "",
5
+ start: vi.fn(),
6
+ warn: vi.fn(),
7
+ fail: vi.fn(),
8
+ succeed: vi.fn()
9
+ };
10
+ spinner.start.mockReturnValue(spinner);
11
+ class TableMock {
12
+ rows = [];
13
+ push(row) {
14
+ this.rows.push(row);
15
+ }
16
+ toString() {
17
+ return `rows:${this.rows.length}`;
18
+ }
19
+ }
20
+ return {
21
+ prompts: vi.fn(),
22
+ ora: vi.fn(() => spinner),
23
+ getGithubToken: vi.fn(),
24
+ fetchPaginatedGithubAPI: vi.fn(),
25
+ spinner,
26
+ TableMock
27
+ };
28
+ });
29
+ vi.mock("prompts", () => ({ default: mocks.prompts }));
30
+ vi.mock("ora", () => ({ default: mocks.ora }));
31
+ vi.mock("cli-table3", () => ({ default: mocks.TableMock }));
32
+ vi.mock("../utils/github/github.js", () => ({
33
+ getGithubToken: mocks.getGithubToken,
34
+ fetchPaginatedGithubAPI: mocks.fetchPaginatedGithubAPI
35
+ }));
36
+ import listGithubDeploymentKeys from "./githubDeploymentKeysList.js";
37
+ describe("listGithubDeploymentKeys", () => {
38
+ beforeEach(() => {
39
+ vi.clearAllMocks();
40
+ mocks.spinner.start.mockReturnValue(mocks.spinner);
41
+ mocks.getGithubToken.mockResolvedValue({ token: "t", authMethod: "env" });
42
+ mocks.prompts.mockResolvedValue({ organization: "intecoag" });
43
+ });
44
+ it("warns when organization has no repos", async () => {
45
+ mocks.fetchPaginatedGithubAPI.mockResolvedValue([]);
46
+ await listGithubDeploymentKeys();
47
+ expect(mocks.spinner.warn).toHaveBeenCalledWith('No repositories found in organization "intecoag"');
48
+ });
49
+ it("lists deployment keys across repositories", async () => {
50
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
51
+ mocks.fetchPaginatedGithubAPI.mockImplementation(async (url) => {
52
+ if (url.includes("/orgs/")) {
53
+ return [{ name: "repo1" }, { name: "repo2" }];
54
+ }
55
+ if (url.includes("repo1/keys")) {
56
+ return [{ id: 1, title: "k1", created_at: "2025-01-01", last_used: null, read_only: true }];
57
+ }
58
+ if (url.includes("repo2/keys")) {
59
+ return [{ id: 2, title: "k2", created_at: "2025-01-02", last_used: "2025-01-03", read_only: false }];
60
+ }
61
+ return [];
62
+ });
63
+ await listGithubDeploymentKeys();
64
+ expect(mocks.spinner.succeed).toHaveBeenCalledWith("Found 2 deployment keys across 2 repositories");
65
+ const output = logSpy.mock.calls.map((c) => String(c[0] ?? "")).join("\n");
66
+ expect(output).toContain("rows:2");
67
+ expect(output).toContain("Total deployment keys");
68
+ });
69
+ });
70
+ //# sourceMappingURL=githubDeploymentKeysList.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubDeploymentKeysList.test.js","sourceRoot":"","sources":["../../src/modules/githubDeploymentKeysList.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare function githubSecurityAdvisories(): Promise<void>;
2
+ export default githubSecurityAdvisories;
3
+ //# sourceMappingURL=githubSecurityAdvisories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubSecurityAdvisories.d.ts","sourceRoot":"","sources":["../../src/modules/githubSecurityAdvisories.ts"],"names":[],"mappings":"AAqBA,iBAAe,wBAAwB,kBAqItC;AAyBD,eAAe,wBAAwB,CAAC"}