@jahia/jahia-cli 0.1.4 → 0.2.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 (292) hide show
  1. package/README.md +271 -56
  2. package/bin/dev.js +5 -1
  3. package/dist/commands/config/init.d.ts +12 -0
  4. package/dist/commands/config/init.d.ts.map +1 -0
  5. package/dist/commands/config/init.js +76 -0
  6. package/dist/commands/config/init.js.map +1 -0
  7. package/dist/commands/environment/create.d.ts +27 -0
  8. package/dist/commands/environment/create.d.ts.map +1 -0
  9. package/dist/commands/environment/create.js +192 -0
  10. package/dist/commands/environment/create.js.map +1 -0
  11. package/dist/commands/environment/delete.d.ts +12 -0
  12. package/dist/commands/environment/delete.d.ts.map +1 -0
  13. package/dist/commands/environment/delete.js +69 -0
  14. package/dist/commands/environment/delete.js.map +1 -0
  15. package/dist/commands/environment/doctor.d.ts +13 -0
  16. package/dist/commands/environment/doctor.d.ts.map +1 -0
  17. package/dist/commands/environment/doctor.js +63 -0
  18. package/dist/commands/environment/doctor.js.map +1 -0
  19. package/dist/commands/environment/export.d.ts +35 -0
  20. package/dist/commands/environment/export.d.ts.map +1 -0
  21. package/dist/commands/environment/export.js +127 -0
  22. package/dist/commands/environment/export.js.map +1 -0
  23. package/dist/commands/environment/list.d.ts +11 -0
  24. package/dist/commands/environment/list.d.ts.map +1 -0
  25. package/dist/commands/environment/list.js +70 -0
  26. package/dist/commands/environment/list.js.map +1 -0
  27. package/dist/commands/environment/logs.d.ts +13 -0
  28. package/dist/commands/environment/logs.d.ts.map +1 -0
  29. package/dist/commands/environment/logs.js +77 -0
  30. package/dist/commands/environment/logs.js.map +1 -0
  31. package/dist/commands/environment/start.d.ts +12 -0
  32. package/dist/commands/environment/start.d.ts.map +1 -0
  33. package/dist/commands/environment/start.js +71 -0
  34. package/dist/commands/environment/start.js.map +1 -0
  35. package/dist/commands/environment/stop.d.ts +12 -0
  36. package/dist/commands/environment/stop.d.ts.map +1 -0
  37. package/dist/commands/environment/stop.js +71 -0
  38. package/dist/commands/environment/stop.js.map +1 -0
  39. package/dist/commands/init.d.ts +39 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +178 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/jahia/alive.d.ts +18 -0
  44. package/dist/commands/jahia/alive.d.ts.map +1 -0
  45. package/dist/commands/jahia/alive.js +118 -0
  46. package/dist/commands/jahia/alive.js.map +1 -0
  47. package/dist/commands/jahia/provision.d.ts +33 -0
  48. package/dist/commands/jahia/provision.d.ts.map +1 -0
  49. package/dist/commands/jahia/provision.js +164 -0
  50. package/dist/commands/jahia/provision.js.map +1 -0
  51. package/dist/commands/tests/init.d.ts +56 -0
  52. package/dist/commands/tests/init.d.ts.map +1 -0
  53. package/dist/commands/tests/init.js +195 -0
  54. package/dist/commands/tests/init.js.map +1 -0
  55. package/dist/commands/workflow/init.d.ts +21 -0
  56. package/dist/commands/workflow/init.d.ts.map +1 -0
  57. package/dist/commands/workflow/init.js +83 -0
  58. package/dist/commands/workflow/init.js.map +1 -0
  59. package/dist/commands/workflow/run.d.ts +21 -0
  60. package/dist/commands/workflow/run.d.ts.map +1 -0
  61. package/dist/commands/workflow/run.js +97 -0
  62. package/dist/commands/workflow/run.js.map +1 -0
  63. package/dist/lib/components/index.d.ts +59 -0
  64. package/dist/lib/components/index.d.ts.map +1 -0
  65. package/dist/lib/components/index.js +111 -0
  66. package/dist/lib/components/index.js.map +1 -0
  67. package/dist/lib/components/jahia.d.ts +3 -0
  68. package/dist/lib/components/jahia.d.ts.map +1 -0
  69. package/dist/lib/components/jahia.js +37 -0
  70. package/dist/lib/components/jahia.js.map +1 -0
  71. package/dist/lib/components/smtp-server.d.ts +3 -0
  72. package/dist/lib/components/smtp-server.d.ts.map +1 -0
  73. package/dist/lib/components/smtp-server.js +29 -0
  74. package/dist/lib/components/smtp-server.js.map +1 -0
  75. package/dist/lib/components/types.d.ts +89 -0
  76. package/dist/lib/components/types.d.ts.map +1 -0
  77. package/dist/lib/components/types.js +2 -0
  78. package/dist/lib/components/types.js.map +1 -0
  79. package/dist/lib/components/victorialogs.d.ts +3 -0
  80. package/dist/lib/components/victorialogs.d.ts.map +1 -0
  81. package/dist/lib/components/victorialogs.js +29 -0
  82. package/dist/lib/components/victorialogs.js.map +1 -0
  83. package/dist/lib/config/build-blank-config.d.ts +6 -0
  84. package/dist/lib/config/build-blank-config.d.ts.map +1 -0
  85. package/dist/lib/config/build-blank-config.js +19 -0
  86. package/dist/lib/config/build-blank-config.js.map +1 -0
  87. package/dist/lib/config/config-to-yaml-with-comments.d.ts +11 -0
  88. package/dist/lib/config/config-to-yaml-with-comments.d.ts.map +1 -0
  89. package/dist/lib/config/config-to-yaml-with-comments.js +75 -0
  90. package/dist/lib/config/config-to-yaml-with-comments.js.map +1 -0
  91. package/dist/lib/config/config-to-yaml.d.ts +7 -0
  92. package/dist/lib/config/config-to-yaml.d.ts.map +1 -0
  93. package/dist/lib/config/config-to-yaml.js +26 -0
  94. package/dist/lib/config/config-to-yaml.js.map +1 -0
  95. package/dist/lib/config/defaults.d.ts +15 -0
  96. package/dist/lib/config/defaults.d.ts.map +1 -0
  97. package/dist/lib/config/defaults.js +19 -0
  98. package/dist/lib/config/defaults.js.map +1 -0
  99. package/dist/lib/config/export-config.d.ts +15 -0
  100. package/dist/lib/config/export-config.d.ts.map +1 -0
  101. package/dist/lib/config/export-config.js +27 -0
  102. package/dist/lib/config/export-config.js.map +1 -0
  103. package/dist/lib/config/initialize-config-file.d.ts +12 -0
  104. package/dist/lib/config/initialize-config-file.d.ts.map +1 -0
  105. package/dist/lib/config/initialize-config-file.js +16 -0
  106. package/dist/lib/config/initialize-config-file.js.map +1 -0
  107. package/dist/lib/config/parser.d.ts +46 -0
  108. package/dist/lib/config/parser.d.ts.map +1 -0
  109. package/dist/lib/config/parser.js +196 -0
  110. package/dist/lib/config/parser.js.map +1 -0
  111. package/dist/lib/config/resolve-env-vars.d.ts +29 -0
  112. package/dist/lib/config/resolve-env-vars.d.ts.map +1 -0
  113. package/dist/lib/config/resolve-env-vars.js +47 -0
  114. package/dist/lib/config/resolve-env-vars.js.map +1 -0
  115. package/dist/lib/config/types.d.ts +74 -0
  116. package/dist/lib/config/types.d.ts.map +1 -0
  117. package/dist/lib/config/types.js +2 -0
  118. package/dist/lib/config/types.js.map +1 -0
  119. package/dist/lib/config/with-tests-version.d.ts +6 -0
  120. package/dist/lib/config/with-tests-version.d.ts.map +1 -0
  121. package/dist/lib/config/with-tests-version.js +11 -0
  122. package/dist/lib/config/with-tests-version.js.map +1 -0
  123. package/dist/lib/output/formatter.d.ts +38 -0
  124. package/dist/lib/output/formatter.d.ts.map +1 -0
  125. package/dist/lib/output/formatter.js +172 -0
  126. package/dist/lib/output/formatter.js.map +1 -0
  127. package/dist/lib/providers/docker/container.d.ts +61 -0
  128. package/dist/lib/providers/docker/container.d.ts.map +1 -0
  129. package/dist/lib/providers/docker/container.js +101 -0
  130. package/dist/lib/providers/docker/container.js.map +1 -0
  131. package/dist/lib/providers/docker/get-container-logs.d.ts +5 -0
  132. package/dist/lib/providers/docker/get-container-logs.d.ts.map +1 -0
  133. package/dist/lib/providers/docker/get-container-logs.js +17 -0
  134. package/dist/lib/providers/docker/get-container-logs.js.map +1 -0
  135. package/dist/lib/providers/docker/index.d.ts +8 -0
  136. package/dist/lib/providers/docker/index.d.ts.map +1 -0
  137. package/dist/lib/providers/docker/index.js +424 -0
  138. package/dist/lib/providers/docker/index.js.map +1 -0
  139. package/dist/lib/providers/docker/network.d.ts +17 -0
  140. package/dist/lib/providers/docker/network.d.ts.map +1 -0
  141. package/dist/lib/providers/docker/network.js +36 -0
  142. package/dist/lib/providers/docker/network.js.map +1 -0
  143. package/dist/lib/providers/docker/start-container.d.ts +5 -0
  144. package/dist/lib/providers/docker/start-container.d.ts.map +1 -0
  145. package/dist/lib/providers/docker/start-container.js +10 -0
  146. package/dist/lib/providers/docker/start-container.js.map +1 -0
  147. package/dist/lib/providers/docker/stop-container.d.ts +5 -0
  148. package/dist/lib/providers/docker/stop-container.d.ts.map +1 -0
  149. package/dist/lib/providers/docker/stop-container.js +10 -0
  150. package/dist/lib/providers/docker/stop-container.js.map +1 -0
  151. package/dist/lib/providers/docker/volume.d.ts +13 -0
  152. package/dist/lib/providers/docker/volume.d.ts.map +1 -0
  153. package/dist/lib/providers/docker/volume.js +23 -0
  154. package/dist/lib/providers/docker/volume.js.map +1 -0
  155. package/dist/lib/providers/index.d.ts +13 -0
  156. package/dist/lib/providers/index.d.ts.map +1 -0
  157. package/dist/lib/providers/index.js +22 -0
  158. package/dist/lib/providers/index.js.map +1 -0
  159. package/dist/lib/providers/jahiacloudv1/index.d.ts +7 -0
  160. package/dist/lib/providers/jahiacloudv1/index.d.ts.map +1 -0
  161. package/dist/lib/providers/jahiacloudv1/index.js +16 -0
  162. package/dist/lib/providers/jahiacloudv1/index.js.map +1 -0
  163. package/dist/lib/providers/types.d.ts +84 -0
  164. package/dist/lib/providers/types.d.ts.map +1 -0
  165. package/dist/lib/providers/types.js +2 -0
  166. package/dist/lib/providers/types.js.map +1 -0
  167. package/dist/lib/provisioning/detect-manifest-source.d.ts +7 -0
  168. package/dist/lib/provisioning/detect-manifest-source.d.ts.map +1 -0
  169. package/dist/lib/provisioning/detect-manifest-source.js +6 -0
  170. package/dist/lib/provisioning/detect-manifest-source.js.map +1 -0
  171. package/dist/lib/provisioning/fetch-manifest.d.ts +9 -0
  172. package/dist/lib/provisioning/fetch-manifest.d.ts.map +1 -0
  173. package/dist/lib/provisioning/fetch-manifest.js +17 -0
  174. package/dist/lib/provisioning/fetch-manifest.js.map +1 -0
  175. package/dist/lib/provisioning/read-manifest.d.ts +9 -0
  176. package/dist/lib/provisioning/read-manifest.d.ts.map +1 -0
  177. package/dist/lib/provisioning/read-manifest.js +12 -0
  178. package/dist/lib/provisioning/read-manifest.js.map +1 -0
  179. package/dist/lib/provisioning/resolve-asset-paths.d.ts +7 -0
  180. package/dist/lib/provisioning/resolve-asset-paths.d.ts.map +1 -0
  181. package/dist/lib/provisioning/resolve-asset-paths.js +22 -0
  182. package/dist/lib/provisioning/resolve-asset-paths.js.map +1 -0
  183. package/dist/lib/provisioning/submit-provisioning.d.ts +12 -0
  184. package/dist/lib/provisioning/submit-provisioning.d.ts.map +1 -0
  185. package/dist/lib/provisioning/submit-provisioning.js +70 -0
  186. package/dist/lib/provisioning/submit-provisioning.js.map +1 -0
  187. package/dist/lib/provisioning/types.d.ts +34 -0
  188. package/dist/lib/provisioning/types.d.ts.map +1 -0
  189. package/dist/lib/provisioning/types.js +2 -0
  190. package/dist/lib/provisioning/types.js.map +1 -0
  191. package/dist/lib/sam/index.d.ts +4 -0
  192. package/dist/lib/sam/index.d.ts.map +1 -0
  193. package/dist/lib/sam/index.js +3 -0
  194. package/dist/lib/sam/index.js.map +1 -0
  195. package/dist/lib/sam/query-sam-status.d.ts +6 -0
  196. package/dist/lib/sam/query-sam-status.d.ts.map +1 -0
  197. package/dist/lib/sam/query-sam-status.js +54 -0
  198. package/dist/lib/sam/query-sam-status.js.map +1 -0
  199. package/dist/lib/sam/types.d.ts +41 -0
  200. package/dist/lib/sam/types.d.ts.map +1 -0
  201. package/dist/lib/sam/types.js +2 -0
  202. package/dist/lib/sam/types.js.map +1 -0
  203. package/dist/lib/sam/wait-for-sam.d.ts +7 -0
  204. package/dist/lib/sam/wait-for-sam.d.ts.map +1 -0
  205. package/dist/lib/sam/wait-for-sam.js +31 -0
  206. package/dist/lib/sam/wait-for-sam.js.map +1 -0
  207. package/dist/lib/state/delete-state.d.ts +6 -0
  208. package/dist/lib/state/delete-state.d.ts.map +1 -0
  209. package/dist/lib/state/delete-state.js +16 -0
  210. package/dist/lib/state/delete-state.js.map +1 -0
  211. package/dist/lib/state/get-active-environment.d.ts +6 -0
  212. package/dist/lib/state/get-active-environment.d.ts.map +1 -0
  213. package/dist/lib/state/get-active-environment.js +9 -0
  214. package/dist/lib/state/get-active-environment.js.map +1 -0
  215. package/dist/lib/state/get-jahia-connection-defaults.d.ts +16 -0
  216. package/dist/lib/state/get-jahia-connection-defaults.d.ts.map +1 -0
  217. package/dist/lib/state/get-jahia-connection-defaults.js +28 -0
  218. package/dist/lib/state/get-jahia-connection-defaults.js.map +1 -0
  219. package/dist/lib/state/has-active-environment.d.ts +5 -0
  220. package/dist/lib/state/has-active-environment.d.ts.map +1 -0
  221. package/dist/lib/state/has-active-environment.js +9 -0
  222. package/dist/lib/state/has-active-environment.js.map +1 -0
  223. package/dist/lib/state/index.d.ts +11 -0
  224. package/dist/lib/state/index.d.ts.map +1 -0
  225. package/dist/lib/state/index.js +9 -0
  226. package/dist/lib/state/index.js.map +1 -0
  227. package/dist/lib/state/load-state.d.ts +7 -0
  228. package/dist/lib/state/load-state.d.ts.map +1 -0
  229. package/dist/lib/state/load-state.js +17 -0
  230. package/dist/lib/state/load-state.js.map +1 -0
  231. package/dist/lib/state/reconcile-with-docker.d.ts +19 -0
  232. package/dist/lib/state/reconcile-with-docker.d.ts.map +1 -0
  233. package/dist/lib/state/reconcile-with-docker.js +36 -0
  234. package/dist/lib/state/reconcile-with-docker.js.map +1 -0
  235. package/dist/lib/state/save-state.d.ts +7 -0
  236. package/dist/lib/state/save-state.d.ts.map +1 -0
  237. package/dist/lib/state/save-state.js +13 -0
  238. package/dist/lib/state/save-state.js.map +1 -0
  239. package/dist/lib/state/state-file-path.d.ts +8 -0
  240. package/dist/lib/state/state-file-path.d.ts.map +1 -0
  241. package/dist/lib/state/state-file-path.js +14 -0
  242. package/dist/lib/state/state-file-path.js.map +1 -0
  243. package/dist/lib/state/state-flag.d.ts +6 -0
  244. package/dist/lib/state/state-flag.d.ts.map +1 -0
  245. package/dist/lib/state/state-flag.js +12 -0
  246. package/dist/lib/state/state-flag.js.map +1 -0
  247. package/dist/lib/state/types.d.ts +30 -0
  248. package/dist/lib/state/types.d.ts.map +1 -0
  249. package/dist/lib/state/types.js +2 -0
  250. package/dist/lib/state/types.js.map +1 -0
  251. package/dist/lib/tests/clone-scaffolding.d.ts +16 -0
  252. package/dist/lib/tests/clone-scaffolding.d.ts.map +1 -0
  253. package/dist/lib/tests/clone-scaffolding.js +64 -0
  254. package/dist/lib/tests/clone-scaffolding.js.map +1 -0
  255. package/dist/lib/tests/exclusion-list.d.ts +11 -0
  256. package/dist/lib/tests/exclusion-list.d.ts.map +1 -0
  257. package/dist/lib/tests/exclusion-list.js +19 -0
  258. package/dist/lib/tests/exclusion-list.js.map +1 -0
  259. package/dist/lib/tests/gitignore-manager.d.ts +21 -0
  260. package/dist/lib/tests/gitignore-manager.d.ts.map +1 -0
  261. package/dist/lib/tests/gitignore-manager.js +47 -0
  262. package/dist/lib/tests/gitignore-manager.js.map +1 -0
  263. package/dist/lib/tests/index.d.ts +6 -0
  264. package/dist/lib/tests/index.d.ts.map +1 -0
  265. package/dist/lib/tests/index.js +5 -0
  266. package/dist/lib/tests/index.js.map +1 -0
  267. package/dist/lib/tests/sync-missing-files.d.ts +3 -0
  268. package/dist/lib/tests/sync-missing-files.d.ts.map +1 -0
  269. package/dist/lib/tests/sync-missing-files.js +65 -0
  270. package/dist/lib/tests/sync-missing-files.js.map +1 -0
  271. package/dist/lib/tests/types.d.ts +26 -0
  272. package/dist/lib/tests/types.d.ts.map +1 -0
  273. package/dist/lib/tests/types.js +2 -0
  274. package/dist/lib/tests/types.js.map +1 -0
  275. package/dist/lib/workflow/build-sample-workflow.d.ts +7 -0
  276. package/dist/lib/workflow/build-sample-workflow.d.ts.map +1 -0
  277. package/dist/lib/workflow/build-sample-workflow.js +35 -0
  278. package/dist/lib/workflow/build-sample-workflow.js.map +1 -0
  279. package/dist/lib/workflow/executor.d.ts +21 -0
  280. package/dist/lib/workflow/executor.d.ts.map +1 -0
  281. package/dist/lib/workflow/executor.js +100 -0
  282. package/dist/lib/workflow/executor.js.map +1 -0
  283. package/dist/lib/workflow/merge-workflow-into-config.d.ts +7 -0
  284. package/dist/lib/workflow/merge-workflow-into-config.d.ts.map +1 -0
  285. package/dist/lib/workflow/merge-workflow-into-config.js +9 -0
  286. package/dist/lib/workflow/merge-workflow-into-config.js.map +1 -0
  287. package/dist/lib/workflow/types.d.ts +30 -0
  288. package/dist/lib/workflow/types.d.ts.map +1 -0
  289. package/dist/lib/workflow/types.js +25 -0
  290. package/dist/lib/workflow/types.js.map +1 -0
  291. package/oclif.manifest.json +856 -1
  292. package/package.json +9 -4
@@ -0,0 +1,118 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
3
+ import { getJahiaConnectionDefaults } from '../../lib/state/get-jahia-connection-defaults.js';
4
+ import { stateFilePath } from '../../lib/state/state-file-path.js';
5
+ import { stateFlag } from '../../lib/state/state-flag.js';
6
+ import { waitForSam } from '../../lib/sam/wait-for-sam.js';
7
+ const DEFAULT_INTERVAL = 2;
8
+ const DEFAULT_TIMEOUT = 300;
9
+ const DEFAULT_COUNT = 5;
10
+ const DEFAULT_SEVERITY = 'MEDIUM';
11
+ export default class JahiaAlive extends Command {
12
+ static description = 'Wait until the Jahia environment is fully alive and responding GREEN. ' +
13
+ 'Polls the Server Availability Manager (SAM) healthcheck endpoint and requires ' +
14
+ 'N consecutive GREEN responses before declaring the environment ready.';
15
+ static examples = [
16
+ '<%= config.bin %> jahia alive',
17
+ '<%= config.bin %> jahia alive --count 10 --timeout 600',
18
+ '<%= config.bin %> jahia alive --url http://localhost:8080 --json',
19
+ '<%= config.bin %> jahia alive --state /ci/workspace/state.json',
20
+ ];
21
+ static flags = {
22
+ state: stateFlag,
23
+ url: Flags.string({
24
+ description: 'Jahia base URL (default: from state, or http://localhost:8080)',
25
+ }),
26
+ username: Flags.string({
27
+ char: 'u',
28
+ description: 'Jahia username for SAM authentication (default: from state, or root)',
29
+ }),
30
+ password: Flags.string({
31
+ char: 'P',
32
+ description: 'Jahia password for SAM authentication (default: from state, or root1234)',
33
+ }),
34
+ severity: Flags.string({
35
+ char: 's',
36
+ description: 'SAM probe severity to evaluate (LOW, MEDIUM, HIGH, CRITICAL)',
37
+ default: DEFAULT_SEVERITY,
38
+ }),
39
+ interval: Flags.integer({
40
+ char: 'i',
41
+ description: 'Seconds between health checks',
42
+ default: DEFAULT_INTERVAL,
43
+ }),
44
+ timeout: Flags.integer({
45
+ char: 't',
46
+ description: 'Maximum seconds to wait before failing',
47
+ default: DEFAULT_TIMEOUT,
48
+ }),
49
+ count: Flags.integer({
50
+ char: 'c',
51
+ description: 'Number of consecutive GREEN responses required',
52
+ default: DEFAULT_COUNT,
53
+ }),
54
+ json: Flags.boolean({
55
+ description: 'Output result as structured JSON (for AI agents and scripting)',
56
+ default: false,
57
+ }),
58
+ };
59
+ async run() {
60
+ const { flags } = await this.parse(JahiaAlive);
61
+ const stateOverride = flags.state;
62
+ const statePath = stateFilePath(stateOverride);
63
+ const env = await getActiveEnvironment(stateOverride);
64
+ const envName = env?.name ?? 'unknown';
65
+ const defaults = getJahiaConnectionDefaults(env);
66
+ const url = flags.url ?? defaults.url;
67
+ const username = flags.username ?? defaults.username;
68
+ const password = flags.password ?? defaults.password;
69
+ if (!flags.json) {
70
+ this.log(`Waiting for Jahia environment "${envName}" to become alive...`);
71
+ this.log(` URL: ${url}`);
72
+ this.log(` Requires: ${String(flags.count)} consecutive GREEN at ${String(flags.interval)}s interval`);
73
+ this.log(` Timeout: ${String(flags.timeout)}s`);
74
+ this.log(` State: ${statePath}`);
75
+ this.log('');
76
+ }
77
+ const onPoll = (event) => {
78
+ if (flags.json)
79
+ return;
80
+ const icon = event.health === 'GREEN' ? '●' : '○';
81
+ const progress = event.health === 'GREEN' ? ` (${String(event.consecutiveGreen)}/${String(flags.count)})` : '';
82
+ const detail = event.message ? ` — ${event.message}` : '';
83
+ this.log(` ${icon} [${String(event.elapsedSeconds).padStart(4)}s] ${event.health}${progress}${detail}`);
84
+ };
85
+ try {
86
+ const result = await waitForSam({
87
+ url,
88
+ username,
89
+ password,
90
+ severity: flags.severity,
91
+ intervalSeconds: flags.interval,
92
+ timeoutSeconds: flags.timeout,
93
+ consecutiveCount: flags.count,
94
+ onPoll,
95
+ });
96
+ if (flags.json) {
97
+ this.log(JSON.stringify({ ...result, environment: envName, stateFile: statePath }, null, 2));
98
+ }
99
+ else {
100
+ this.log('');
101
+ this.log(`✓ Environment "${envName}" is alive and responding GREEN`);
102
+ this.log(` Confirmed in ${String(result.elapsedSeconds)}s with ${String(result.consecutiveGreen)} consecutive checks`);
103
+ }
104
+ }
105
+ catch (error) {
106
+ const message = error instanceof Error ? error.message : String(error);
107
+ if (flags.json) {
108
+ this.log(JSON.stringify({ success: false, environment: envName, stateFile: statePath, error: 'timeout', message }, null, 2));
109
+ }
110
+ else {
111
+ this.log('');
112
+ this.log(`✗ ${message}`);
113
+ }
114
+ this.exit(1);
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=alive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alive.js","sourceRoot":"","sources":["../../../src/commands/jahia/alive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { ProvisioningAttachment } from '../../lib/provisioning/types.js';
3
+ /**
4
+ * Reads file attachments from disk and returns them as ProvisioningAttachment objects.
5
+ */
6
+ export declare const loadAttachments: (filePaths: readonly string[]) => Promise<readonly ProvisioningAttachment[]>;
7
+ /**
8
+ * Formats a provisioning result for human-readable output.
9
+ */
10
+ export declare const formatProvisioningResultHuman: (result: {
11
+ readonly success: boolean;
12
+ readonly statusCode: number;
13
+ readonly message: string;
14
+ readonly responseBody: unknown;
15
+ readonly manifest: string;
16
+ readonly durationMs: number;
17
+ }) => string;
18
+ export default class JahiaProvision extends Command {
19
+ static description: string;
20
+ static examples: string[];
21
+ static flags: {
22
+ state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ manifest: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
24
+ url: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ username: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ password: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
27
+ file: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ assets: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
29
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
30
+ };
31
+ run(): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../../src/commands/jahia/provision.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAO7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAM9E;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,SAAS,MAAM,EAAE,KAC3B,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAQ3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,GAAI,QAAQ;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,KAAG,MAkBH,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,OAAgB,WAAW,SAG2D;IAEtF,OAAgB,QAAQ,WAOtB;IAEF,OAAgB,KAAK;;;;;;;;;MA+BnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgGlC"}
@@ -0,0 +1,164 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename } from 'node:path';
3
+ import { Command, Flags } from '@oclif/core';
4
+ import { detectManifestSource } from '../../lib/provisioning/detect-manifest-source.js';
5
+ import { fetchManifest } from '../../lib/provisioning/fetch-manifest.js';
6
+ import { readManifest } from '../../lib/provisioning/read-manifest.js';
7
+ import { resolveAssetPaths } from '../../lib/provisioning/resolve-asset-paths.js';
8
+ import { submitProvisioning } from '../../lib/provisioning/submit-provisioning.js';
9
+ import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
10
+ import { getJahiaConnectionDefaults } from '../../lib/state/get-jahia-connection-defaults.js';
11
+ import { stateFilePath } from '../../lib/state/state-file-path.js';
12
+ import { stateFlag } from '../../lib/state/state-flag.js';
13
+ /**
14
+ * Reads file attachments from disk and returns them as ProvisioningAttachment objects.
15
+ */
16
+ export const loadAttachments = async (filePaths) => {
17
+ const results = await Promise.all(filePaths.map(async (filePath) => {
18
+ const content = await readFile(filePath);
19
+ return { filename: basename(filePath), content };
20
+ }));
21
+ return results;
22
+ };
23
+ /**
24
+ * Formats a provisioning result for human-readable output.
25
+ */
26
+ export const formatProvisioningResultHuman = (result) => {
27
+ const icon = result.success ? '✓' : '✗';
28
+ const status = result.success ? 'Provisioning succeeded' : 'Provisioning failed';
29
+ const lines = [
30
+ `${icon} ${status}`,
31
+ ` Manifest: ${result.manifest}`,
32
+ ` Status: HTTP ${String(result.statusCode)}`,
33
+ ` Duration: ${String(result.durationMs)}ms`,
34
+ ];
35
+ if (result.responseBody !== undefined) {
36
+ lines.push('');
37
+ lines.push(JSON.stringify(result.responseBody, null, 2));
38
+ }
39
+ else if (!result.success && result.message) {
40
+ lines.push(` Error: ${result.message}`);
41
+ }
42
+ return lines.join('\n');
43
+ };
44
+ export default class JahiaProvision extends Command {
45
+ static description = 'Execute a provisioning script against a running Jahia instance. ' +
46
+ 'The manifest can be a local YAML file or a public URL (auto-detected). ' +
47
+ 'Optional file attachments can be included via --file flags or --assets directory.';
48
+ static examples = [
49
+ '<%= config.bin %> jahia provision --manifest ./provisioning/setup.yaml',
50
+ '<%= config.bin %> jahia provision --manifest https://raw.githubusercontent.com/org/repo/main/provisioning.yaml',
51
+ '<%= config.bin %> jahia provision --manifest ./setup.yaml --file ./modules/mymodule.jar',
52
+ '<%= config.bin %> jahia provision --manifest ./setup.yaml --assets ./artifacts',
53
+ '<%= config.bin %> jahia provision --manifest ./setup.yaml --file ./mod1.jar --file ./mod2.jar --json',
54
+ '<%= config.bin %> jahia provision --manifest ./setup.yaml --url http://localhost:8080 --username root --password secret',
55
+ ];
56
+ static flags = {
57
+ state: stateFlag,
58
+ manifest: Flags.string({
59
+ char: 'm',
60
+ description: 'Path to a local YAML file or a public URL of the provisioning manifest',
61
+ required: true,
62
+ }),
63
+ url: Flags.string({
64
+ description: 'Jahia base URL (default: from state, or http://localhost:8080)',
65
+ }),
66
+ username: Flags.string({
67
+ char: 'u',
68
+ description: 'Jahia admin username (default: from state, or root)',
69
+ }),
70
+ password: Flags.string({
71
+ char: 'P',
72
+ description: 'Jahia admin password (default: from state, or root1234)',
73
+ }),
74
+ file: Flags.string({
75
+ char: 'f',
76
+ description: 'File attachment to include (can be specified multiple times)',
77
+ multiple: true,
78
+ }),
79
+ assets: Flags.string({
80
+ char: 'a',
81
+ description: 'Directory whose files are attached to the provisioning request (recursive)',
82
+ }),
83
+ json: Flags.boolean({
84
+ description: 'Output result as structured JSON (for AI agents and scripting)',
85
+ default: false,
86
+ }),
87
+ };
88
+ async run() {
89
+ const { flags } = await this.parse(JahiaProvision);
90
+ const stateOverride = flags.state;
91
+ const statePath = stateFilePath(stateOverride);
92
+ const env = await getActiveEnvironment(stateOverride);
93
+ const envName = env?.name ?? 'unknown';
94
+ const defaults = getJahiaConnectionDefaults(env);
95
+ const url = flags.url ?? defaults.url;
96
+ const username = flags.username ?? defaults.username;
97
+ const password = flags.password ?? defaults.password;
98
+ const manifest = flags.manifest;
99
+ const source = detectManifestSource(manifest);
100
+ if (!flags.json) {
101
+ this.log(`Provisioning Jahia environment "${envName}"...`);
102
+ this.log(` Manifest: ${manifest} (${source})`);
103
+ this.log(` URL: ${url}`);
104
+ this.log(` State: ${statePath}`);
105
+ if (flags.file && flags.file.length > 0) {
106
+ this.log(` Files: ${flags.file.join(', ')}`);
107
+ }
108
+ if (flags.assets) {
109
+ this.log(` Assets: ${flags.assets}`);
110
+ }
111
+ this.log('');
112
+ }
113
+ try {
114
+ // Load manifest
115
+ if (!flags.json) {
116
+ this.log(source === 'url' ? 'Downloading manifest...' : 'Reading manifest...');
117
+ }
118
+ const { content: manifestContent, filename: manifestFilename } = source === 'url'
119
+ ? await fetchManifest(manifest)
120
+ : await readManifest(manifest);
121
+ // Load file attachments from --file flags and --assets directory
122
+ const filePaths = flags.file ?? [];
123
+ const assetPaths = flags.assets ? await resolveAssetPaths(flags.assets) : [];
124
+ const allPaths = [...filePaths, ...assetPaths];
125
+ const attachments = await loadAttachments(allPaths);
126
+ if (!flags.json && attachments.length > 0) {
127
+ this.log(`Attaching ${String(attachments.length)} file(s)...`);
128
+ }
129
+ if (!flags.json) {
130
+ this.log('Submitting provisioning script...');
131
+ }
132
+ const result = await submitProvisioning({
133
+ url,
134
+ username,
135
+ password,
136
+ manifestContent,
137
+ manifestFilename,
138
+ attachments,
139
+ });
140
+ if (flags.json) {
141
+ this.log(JSON.stringify({ ...result, environment: envName, stateFile: statePath, source }, null, 2));
142
+ }
143
+ else {
144
+ this.log('');
145
+ this.log(formatProvisioningResultHuman(result));
146
+ }
147
+ if (!result.success) {
148
+ this.exit(1);
149
+ }
150
+ }
151
+ catch (error) {
152
+ const message = error instanceof Error ? error.message : String(error);
153
+ if (flags.json) {
154
+ this.log(JSON.stringify({ success: false, environment: envName, stateFile: statePath, error: message }, null, 2));
155
+ }
156
+ else {
157
+ this.log('');
158
+ this.log(`✗ ${message}`);
159
+ }
160
+ this.exit(1);
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../../src/commands/jahia/provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { ScaffoldingConfig } from '../../lib/config/types.js';
3
+ import type { SyncAction, SyncMissingFilesResult } from '../../lib/tests/types.js';
4
+ /**
5
+ * Resolves ScaffoldingConfig from the loaded config, falling back to defaults.
6
+ */
7
+ export declare const resolveScaffoldingConfig: (scaffolding: ScaffoldingConfig | undefined) => ScaffoldingConfig;
8
+ /**
9
+ * Formats a single sync action line for human-readable output.
10
+ */
11
+ export declare const formatSyncLine: (action: SyncAction, path: string, reason: string) => string;
12
+ /**
13
+ * Builds human-readable output for the tests init command.
14
+ */
15
+ export declare const formatTestsInitHuman: (params: {
16
+ readonly version: string;
17
+ readonly destinationPath: string;
18
+ readonly repositoryUrl: string;
19
+ readonly scaffoldingPath: string;
20
+ readonly result: SyncMissingFilesResult;
21
+ readonly configFile: string;
22
+ readonly configCreated: boolean;
23
+ readonly gitignoreEntriesAdded: number;
24
+ readonly logLines: readonly string[];
25
+ }) => string;
26
+ /**
27
+ * Builds structured JSON output for AI agents and scripting.
28
+ */
29
+ export declare const buildTestsInitSuccessJson: (params: {
30
+ readonly version: string;
31
+ readonly destinationPath: string;
32
+ readonly repositoryUrl: string;
33
+ readonly scaffoldingPath: string;
34
+ readonly result: SyncMissingFilesResult;
35
+ readonly configFile: string;
36
+ readonly configCreated: boolean;
37
+ readonly gitignoreEntriesAdded: number;
38
+ }) => string;
39
+ /**
40
+ * Builds structured JSON failure output.
41
+ */
42
+ export declare const buildTestsInitFailureJson: (params: {
43
+ readonly destinationPath: string;
44
+ readonly message: string;
45
+ }) => string;
46
+ export default class TestsInit extends Command {
47
+ static description: string;
48
+ static examples: string[];
49
+ static flags: {
50
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
51
+ path: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
52
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
53
+ };
54
+ run(): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/tests/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAU7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,aAAa,iBAAiB,GAAG,SAAS,KACzC,iBAID,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,UAAU,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,MAOjF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,KAAG,MAWH,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC,KAAG,MAkBD,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,KAAG,MAUD,CAAC;AAEJ,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,OAAgB,WAAW,SAGwC;IAEnE,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;MAcnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA+GlC"}
@@ -0,0 +1,195 @@
1
+ import { access, mkdtemp, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { Command, Flags } from '@oclif/core';
5
+ import { buildBlankConfig } from '../../lib/config/build-blank-config.js';
6
+ import { DEFAULT_SCAFFOLDING_PATH, DEFAULT_SCAFFOLDING_REPOSITORY, DEFAULT_SCAFFOLDING_VERSION, } from '../../lib/config/defaults.js';
7
+ import { initializeConfigFile } from '../../lib/config/initialize-config-file.js';
8
+ import { loadConfigFile } from '../../lib/config/parser.js';
9
+ import { cloneScaffolding } from '../../lib/tests/clone-scaffolding.js';
10
+ import { updateGitignore } from '../../lib/tests/gitignore-manager.js';
11
+ import { syncMissingFiles } from '../../lib/tests/sync-missing-files.js';
12
+ const DEFAULT_CONFIG_FILE = 'jahia-cli.config.yml';
13
+ /**
14
+ * Resolves ScaffoldingConfig from the loaded config, falling back to defaults.
15
+ */
16
+ export const resolveScaffoldingConfig = (scaffolding) => ({
17
+ repository: scaffolding?.repository ?? DEFAULT_SCAFFOLDING_REPOSITORY,
18
+ path: scaffolding?.path ?? DEFAULT_SCAFFOLDING_PATH,
19
+ version: scaffolding?.version ?? DEFAULT_SCAFFOLDING_VERSION,
20
+ });
21
+ /**
22
+ * Formats a single sync action line for human-readable output.
23
+ */
24
+ export const formatSyncLine = (action, path, reason) => {
25
+ const labels = {
26
+ copied: ' SYNC: ',
27
+ kept: ' SKIP: ',
28
+ ignored: ' IGNORED:',
29
+ };
30
+ return `${labels[action]} ${path} (${reason})`;
31
+ };
32
+ /**
33
+ * Builds human-readable output for the tests init command.
34
+ */
35
+ export const formatTestsInitHuman = (params) => {
36
+ const lines = [
37
+ ...params.logLines,
38
+ '',
39
+ `Summary: ${String(params.result.copied.length)} synced, ${String(params.result.kept.length)} skipped, ${String(params.result.ignored.length)} ignored`,
40
+ params.gitignoreEntriesAdded > 0
41
+ ? `.gitignore updated: ${String(params.gitignoreEntriesAdded)} entries in managed section`
42
+ : '.gitignore: no new entries needed',
43
+ `✓ Test scaffolding initialized (${params.version})`,
44
+ ];
45
+ return lines.join('\n');
46
+ };
47
+ /**
48
+ * Builds structured JSON output for AI agents and scripting.
49
+ */
50
+ export const buildTestsInitSuccessJson = (params) => JSON.stringify({
51
+ success: true,
52
+ version: params.version,
53
+ repository: params.repositoryUrl,
54
+ scaffoldingPath: params.scaffoldingPath,
55
+ destination: params.destinationPath,
56
+ synced: params.result.copied,
57
+ skipped: params.result.kept,
58
+ ignored: params.result.ignored,
59
+ gitignoreUpdated: params.gitignoreEntriesAdded > 0,
60
+ gitignoreEntriesAdded: params.gitignoreEntriesAdded,
61
+ configFile: params.configFile,
62
+ configCreated: params.configCreated,
63
+ }, null, 2);
64
+ /**
65
+ * Builds structured JSON failure output.
66
+ */
67
+ export const buildTestsInitFailureJson = (params) => JSON.stringify({
68
+ success: false,
69
+ error: 'tests_init_failed',
70
+ destination: params.destinationPath,
71
+ message: params.message,
72
+ }, null, 2);
73
+ export default class TestsInit extends Command {
74
+ static description = 'Initialize local test scaffolding from a remote repository. ' +
75
+ 'Syncs missing files from the configured scaffolding source and manages .gitignore ' +
76
+ 'so that remotely-sourced files are not accidentally committed.';
77
+ static examples = [
78
+ '<%= config.bin %> tests init',
79
+ '<%= config.bin %> tests init --config ./my-config.yml',
80
+ '<%= config.bin %> tests init --path ./tests --json',
81
+ ];
82
+ static flags = {
83
+ config: Flags.string({
84
+ char: 'c',
85
+ description: `Path to config file (default: ${DEFAULT_CONFIG_FILE})`,
86
+ env: 'JAHIA_CLI_CONFIG',
87
+ }),
88
+ path: Flags.string({
89
+ char: 'p',
90
+ description: 'Override destination directory for scaffolding files',
91
+ }),
92
+ json: Flags.boolean({
93
+ description: 'Output result as structured JSON (for AI agents and scripting)',
94
+ default: false,
95
+ }),
96
+ };
97
+ async run() {
98
+ const { flags } = await this.parse(TestsInit);
99
+ const configFile = resolve(flags.config ?? DEFAULT_CONFIG_FILE);
100
+ const destinationPath = resolve(flags.path ?? '.');
101
+ const gitignorePath = join(destinationPath, '.gitignore');
102
+ const tempDir = await mkdtemp(join(tmpdir(), 'jahia-cli-tests-init-'));
103
+ const logLines = [];
104
+ try {
105
+ // Load or generate config
106
+ const configExists = await access(configFile).then(() => true).catch(() => false);
107
+ const configCreated = !configExists;
108
+ if (!configExists) {
109
+ this.log(`Config not found at ${configFile}, generating blank...`);
110
+ logLines.push(`Config not found at ${configFile}, generating blank...`);
111
+ const blank = buildBlankConfig();
112
+ await initializeConfigFile({ outputFile: configFile, config: blank, force: false });
113
+ }
114
+ const config = await loadConfigFile(configFile);
115
+ const scaffolding = resolveScaffoldingConfig(config.tests?.scaffolding);
116
+ logLines.push(`Loading config from ${configFile}...`);
117
+ logLines.push(`Repository: ${scaffolding.repository}`);
118
+ logLines.push(`Scaffolding path: ${scaffolding.path}`);
119
+ logLines.push(`Version: ${scaffolding.version}`);
120
+ // Resolve version and clone
121
+ const resolvedVersion = scaffolding.version === 'latest' ? undefined : scaffolding.version;
122
+ logLines.push(scaffolding.version === 'latest'
123
+ ? `Resolving latest tag for ${scaffolding.repository}...`
124
+ : `Using version: ${scaffolding.version}`);
125
+ const cloned = await cloneScaffolding({
126
+ version: resolvedVersion,
127
+ workDir: tempDir,
128
+ repositoryUrl: scaffolding.repository.endsWith('.git')
129
+ ? scaffolding.repository
130
+ : `${scaffolding.repository}.git`,
131
+ scaffoldingPath: scaffolding.path.replace(/\/$/, ''),
132
+ });
133
+ logLines.push(`Resolved version: ${cloned.version}`);
134
+ logLines.push(`Cloning ${scaffolding.repository}@${cloned.version}...`);
135
+ logLines.push(`Syncing ${scaffolding.path} → ${destinationPath}`);
136
+ logLines.push('');
137
+ // Sync files with per-file logging
138
+ const result = await syncMissingFiles({
139
+ sourceDir: cloned.scaffoldingDir,
140
+ destinationDir: destinationPath,
141
+ logger: (action, relativePath, reason) => {
142
+ logLines.push(formatSyncLine(action, relativePath, reason));
143
+ },
144
+ });
145
+ // Update .gitignore with all remote-sourced files (copied + kept).
146
+ // This ensures the managed section persists across re-runs — files stay
147
+ // gitignored until the user manually removes the entry to "own" that file.
148
+ const gitignoreResult = await updateGitignore(gitignorePath, [...result.copied, ...result.kept]);
149
+ if (gitignoreResult.entriesAdded > 0) {
150
+ logLines.push('');
151
+ logLines.push(`.gitignore updated: ${String(gitignoreResult.entriesAdded)} entries added to managed section`);
152
+ }
153
+ // Output
154
+ if (flags.json) {
155
+ this.log(buildTestsInitSuccessJson({
156
+ version: cloned.version,
157
+ destinationPath,
158
+ repositoryUrl: scaffolding.repository,
159
+ scaffoldingPath: scaffolding.path,
160
+ result,
161
+ configFile,
162
+ configCreated,
163
+ gitignoreEntriesAdded: gitignoreResult.entriesAdded,
164
+ }));
165
+ }
166
+ else {
167
+ this.log(formatTestsInitHuman({
168
+ version: cloned.version,
169
+ destinationPath,
170
+ repositoryUrl: scaffolding.repository,
171
+ scaffoldingPath: scaffolding.path,
172
+ result,
173
+ configFile,
174
+ configCreated,
175
+ gitignoreEntriesAdded: gitignoreResult.entriesAdded,
176
+ logLines,
177
+ }));
178
+ }
179
+ }
180
+ catch (error) {
181
+ const message = error instanceof Error ? error.message : String(error);
182
+ if (flags.json) {
183
+ this.log(buildTestsInitFailureJson({ destinationPath, message }));
184
+ }
185
+ else {
186
+ this.error(message);
187
+ }
188
+ this.exit(1);
189
+ }
190
+ finally {
191
+ await rm(tempDir, { recursive: true, force: true });
192
+ }
193
+ }
194
+ }
195
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/tests/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { JahiaCliConfig } from '../../lib/config/types.js';
3
+ /**
4
+ * Loads an existing config file if it exists, returning an empty config if not found.
5
+ */
6
+ export declare const loadExistingConfigForWorkflow: (filePath: string) => Promise<JahiaCliConfig>;
7
+ /**
8
+ * Builds a human-readable success message for the workflow init command.
9
+ */
10
+ export declare const buildWorkflowInitSuccessMessage: (outputPath: string) => string;
11
+ export default class WorkflowInit extends Command {
12
+ static description: string;
13
+ static examples: string[];
14
+ static flags: {
15
+ config: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,2BAA2B,CAAC;AAM3E;;GAEG;AACH,eAAO,MAAM,6BAA6B,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,cAAc,CAQ5F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,YAAY,MAAM,KAAG,MAGlB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,OAAgB,WAAW,SAGiD;IAE5E,OAAgB,QAAQ,WAKtB;IAEF,OAAgB,KAAK;;;;MAenB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoClC"}