@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
package/README.md CHANGED
@@ -17,36 +17,266 @@ npm install -g @jahia/jahia-cli
17
17
  ### Via npx (no installation)
18
18
 
19
19
  ```bash
20
- npx @jahia/jahia-cli hello
20
+ npx @jahia/jahia-cli environment create --component jahia --component pgsql
21
21
  ```
22
22
 
23
- ## Usage
23
+ ### Via Docker
24
24
 
25
25
  ```bash
26
- # Display help
27
- jahia --help
26
+ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/jahia/jahia-cli environment list
27
+ ```
28
+
29
+ ## Quick Start
30
+
31
+ ```bash
32
+ # Create a Jahia environment with PostgreSQL
33
+ jahia-cli environment create --component jahia --component pgsql
34
+
35
+ # Check environment health
36
+ jahia-cli environment doctor
37
+
38
+ # View logs from a component
39
+ jahia-cli environment logs --component jahia
40
+
41
+ # List all components and their status
42
+ jahia-cli environment list
28
43
 
29
- # Run the hello command
30
- jahia hello
44
+ # Stop the environment (preserves containers)
45
+ jahia-cli environment stop
31
46
 
32
- # Greet someone by name
33
- jahia hello YourName
47
+ # Restart the environment
48
+ jahia-cli environment start
34
49
 
35
- # Uppercase greeting
36
- jahia hello --uppercase
50
+ # Destroy everything
51
+ jahia-cli environment delete
37
52
  ```
38
53
 
39
54
  ## Commands
40
55
 
41
- ### `jahia hello [NAME]`
56
+ ### `config init`
57
+
58
+ Generate an initialized Jahia CLI configuration file.
59
+
60
+ ```bash
61
+ # Derive config from active state
62
+ jahia-cli config init
63
+
64
+ # Generate a blank scaffold
65
+ jahia-cli config init --blank
66
+
67
+ # Use custom state file and output path
68
+ jahia-cli config init --state ~/.jahia-cli/state.json --output ./my-config.yml
69
+
70
+ # Overwrite existing file
71
+ jahia-cli config init --force
72
+ ```
73
+
74
+ **Flags:**
75
+ - `--state` - Path to state JSON file used for state-derived config
76
+ - `-o, --output` - Output YAML file path (default: `jahia-cli.config.yml`)
77
+ - `--blank` - Generate a blank scaffold instead of deriving from state
78
+ - `-f, --force` - Overwrite output file if it already exists
79
+ - `--json` - Structured JSON output
80
+
81
+ ### `tests init`
82
+
83
+ Initialize local test scaffolding from `Jahia/jahia-cypress`.
84
+
85
+ This command clones `jahia-cypress` at the specified version (branch/tag), or the latest tag
86
+ when version is omitted, reads `scaffolding/`, and recursively copies only missing files into
87
+ your local tests folder. Existing local files are kept as-is.
88
+
89
+ If `<tests-folder>/config.yml` does not exist, it is initialized and seeded with:
90
+
91
+ ```yaml
92
+ tests:
93
+ jahia-cypress: <resolved-version>
94
+ ```
95
+
96
+ ```bash
97
+ # Initialize from latest jahia-cypress tag
98
+ jahia-cli tests init
99
+
100
+ # Initialize tests folder from a working branch
101
+ jahia-cli tests init test-jahia-cli
102
+
103
+ # Use a release tag and a custom destination
104
+ jahia-cli tests init v1.2.3 ./tests
42
105
 
43
- Say hello from Jahia CLI.
106
+ # Use custom destination without specifying version
107
+ jahia-cli tests init --path ./tests
108
+
109
+ # JSON output for CI/AI
110
+ jahia-cli tests init main tests --json
111
+ ```
44
112
 
45
113
  **Arguments:**
46
- - `NAME` Name to greet (default: `world`)
114
+ - `[version]` - Branch or tag to fetch from `Jahia/jahia-cypress` (default: latest tag)
115
+ - `[path]` - Local tests folder path (default: `tests`)
116
+
117
+ **Flags:**
118
+ - `-p, --path` - Local tests folder path (overrides positional path)
119
+ - `--json` - Structured JSON output
120
+
121
+ ### `environment create`
122
+
123
+ Create a new Jahia environment from predefined components.
124
+
125
+ ```bash
126
+ # Interactive mode (prompts for component selection)
127
+ jahia-cli environment create
128
+
129
+ # Specify components directly
130
+ jahia-cli environment create --component jahia --component pgsql --component elasticsearch
131
+
132
+ # Use a YAML config file
133
+ jahia-cli environment create --config ./my-environment.yml
134
+
135
+ # Named environment with JSON output (for AI agents)
136
+ jahia-cli environment create --name my-env --component jahia --component pgsql --json
137
+
138
+ # Force-replace an existing environment
139
+ jahia-cli environment create --component jahia --force
140
+ ```
47
141
 
48
142
  **Flags:**
49
- - `-u, --uppercase` — Transform the greeting to uppercase
143
+ - `-C, --component` — Component to include (repeatable)
144
+ - `-c, --config` — Path to a YAML configuration file
145
+ - `-n, --name` — Environment name (auto-generated if omitted)
146
+ - `-p, --provider` — Provider to use (default: `docker`)
147
+ - `-f, --force` — Delete existing environment before creating
148
+ - `--json` — Structured JSON output
149
+
150
+ ### `environment stop`
151
+
152
+ Stop a running environment without destroying it.
153
+
154
+ ```bash
155
+ jahia-cli environment stop
156
+ jahia-cli environment stop --json
157
+ ```
158
+
159
+ ### `environment start`
160
+
161
+ Restart a previously stopped environment.
162
+
163
+ ```bash
164
+ jahia-cli environment start
165
+ jahia-cli environment start --json
166
+ ```
167
+
168
+ ### `environment delete`
169
+
170
+ Destroy an environment completely (containers, networks, volumes).
171
+
172
+ ```bash
173
+ jahia-cli environment delete
174
+ jahia-cli environment delete --json
175
+ ```
176
+
177
+ ### `environment doctor`
178
+
179
+ Check health status of the active environment.
180
+
181
+ ```bash
182
+ jahia-cli environment doctor
183
+ jahia-cli environment doctor --name my-env --json
184
+ ```
185
+
186
+ ### `environment logs`
187
+
188
+ View logs from a specific component.
189
+
190
+ ```bash
191
+ jahia-cli environment logs --component jahia
192
+ jahia-cli environment logs --component pgsql --tail 50
193
+ jahia-cli environment logs --component jahia --json
194
+ ```
195
+
196
+ **Flags:**
197
+ - `-C, --component` — Component to show logs for (required)
198
+ - `-t, --tail` — Number of lines from the end (default: 100)
199
+ - `--json` — Structured JSON output
200
+
201
+ ### `environment list`
202
+
203
+ Show all components and their live status.
204
+
205
+ ```bash
206
+ jahia-cli environment list
207
+ jahia-cli environment list --json
208
+ ```
209
+
210
+ ## Available Components
211
+
212
+ | Component | Description |
213
+ |-----------|-------------|
214
+ | `jahia` | Jahia DXM processing node |
215
+ | `jahia-browsing` | Jahia browsing (read-only) node |
216
+ | `pgsql` | PostgreSQL database |
217
+ | `elasticsearch` | Elasticsearch search engine |
218
+
219
+ ## YAML Configuration
220
+
221
+ Create a `environment.yml` file to define complex environments:
222
+
223
+ ```yaml
224
+ name: my-jahia-env
225
+ provider: docker
226
+ components:
227
+ - jahia
228
+ - pgsql
229
+ - name: elasticsearch
230
+ overrides:
231
+ tag: "8.11.0"
232
+ tests:
233
+ jahia-cypress: "v1.2.3"
234
+ ```
235
+
236
+ ### `jahia provision`
237
+
238
+ Execute a Jahia provisioning script (YAML manifest) against a running Jahia instance. The manifest can be a local file or a public URL — the CLI detects the source automatically.
239
+
240
+ ```bash
241
+ # Provision from a local file
242
+ jahia-cli jahia provision --manifest ./provisioning.yaml
243
+
244
+ # Provision from a URL
245
+ jahia-cli jahia provision --manifest https://raw.githubusercontent.com/org/repo/main/provisioning.yaml
246
+
247
+ # Custom target URL and credentials
248
+ jahia-cli jahia provision --manifest ./setup.yaml --url http://jahia.example.com:8080 --username root --password secret
249
+
250
+ # Attach additional files referenced by the manifest
251
+ jahia-cli jahia provision --manifest ./setup.yaml -f ./settings.properties -f ./license.xml
252
+
253
+ # Use state to target the active environment
254
+ jahia-cli jahia provision --manifest ./setup.yaml --state
255
+
256
+ # JSON output for CI/AI
257
+ jahia-cli jahia provision --manifest ./setup.yaml --json
258
+ ```
259
+
260
+ **Flags:**
261
+ - `-m, --manifest` (required) - Path to a local YAML file or a public URL
262
+
263
+ **Flags:**
264
+ - `--url` - Jahia base URL (default: `http://localhost:8080`)
265
+ - `-u, --username` - Jahia admin username (default: `root`)
266
+ - `-P, --password` - Jahia admin password (default: `root1234`)
267
+ - `-f, --file` - Additional files to attach (repeatable)
268
+ - `-a, --assets` - Directory whose files are attached recursively
269
+ - `--state` - Optional state file path to target the active environment
270
+ - `--json` - Structured JSON output
271
+
272
+ ## AI Agent Usage
273
+
274
+ All commands support `--json` for structured output. AI agents should:
275
+
276
+ 1. Use `--json` on every command for parseable responses
277
+ 2. Check `success` field in JSON output
278
+ 3. Use `environment doctor --json` to verify health before running tests
279
+ 4. Use `environment logs --component <name> --json` for debugging
50
280
 
51
281
  ## Development
52
282
 
@@ -54,6 +284,7 @@ Say hello from Jahia CLI.
54
284
 
55
285
  - Node.js >= 20.0.0
56
286
  - npm >= 10
287
+ - Docker (for environment commands)
57
288
 
58
289
  ### Setup
59
290
 
@@ -66,69 +297,53 @@ npm install
66
297
  ### Run in development
67
298
 
68
299
  ```bash
69
- ./bin/dev.js hello
70
- ```
71
-
72
- ### Build
73
-
74
- ```bash
75
- npm run build
76
- ```
77
-
78
- ### Test
79
-
80
- ```bash
81
- npm test # Run tests once
82
- npm run test:watch # Run tests in watch mode
83
- npm run test:coverage # Run tests with coverage
300
+ ./bin/dev.js environment create --component jahia --component pgsql
84
301
  ```
85
302
 
86
- ### Lint & Format
303
+ ### Build & Test
87
304
 
88
305
  ```bash
89
- npm run lint # Check for linting errors
90
- npm run lint:fix # Auto-fix linting errors
91
- npm run format # Format code with Prettier
306
+ npm run build # TypeScript compilation + OCLIF manifest
307
+ npm run lint # ESLint check
308
+ npm test # Run all tests
309
+ npm run test:coverage # Tests with coverage
310
+ npm run format # Prettier formatting
92
311
  ```
93
312
 
94
- ## Project Structure
313
+ ## Architecture
95
314
 
96
315
  ```
97
316
  src/
98
- └── commands/ # CLI commands (one file per command)
99
- └── hello.ts # Hello world command
100
- test/
101
- └── commands/ # Test files mirror src structure
102
- └── hello.test.ts
103
- bin/
104
- ├── dev.js # Dev entry point (uses tsx)
105
- └── run.js # Production entry point
317
+ ├── commands/
318
+ │ ├── config/ # Configuration commands (init)
319
+ │ ├── environment/ # Environment lifecycle commands
320
+ └── tests/ # Test bootstrap commands (init)
321
+ ├── lib/
322
+ │ ├── components/ # Component library (jahia, pgsql, elasticsearch, etc.)
323
+ ├── config/ # YAML config parser and defaults
324
+ │ ├── tests/ # Test scaffolding bootstrap helpers
325
+ │ ├── output/ # Dual human/JSON output formatters
326
+ │ ├── providers/ # Provider abstraction (docker, jahiacloudv1 placeholder)
327
+ │ │ └── docker/ # Native Docker CLI integration
328
+ │ └── state/ # Local JSON state persistence
329
+ test/ # Mirror of src/ with .test.ts files
106
330
  ```
107
331
 
108
332
  ## Contributing
109
333
 
110
334
  1. Create a feature branch from `main`
111
- 2. Make your changes following the functional programming style
112
- 3. Ensure all tests pass: `npm test`
113
- 4. Ensure linting passes: `npm run lint`
335
+ 2. Follow functional programming style (arrow functions, `const`, no mutations)
336
+ 3. One function per `.ts` file
337
+ 4. Ensure `npm run lint && npm test` passes
114
338
  5. Submit a pull request
115
339
 
116
- ### Coding Conventions
117
-
118
- - **Functional programming**: Use arrow functions, prefer `const`, avoid mutations
119
- - **TypeScript strict mode**: All types must be explicit, no `any`
120
- - **Command classes**: OCLIF requires classes for commands, but extract logic into pure functions
121
-
122
340
  ## Releasing
123
341
 
124
342
  Releases are managed via GitHub Releases:
125
343
 
126
- 1. Create a new release on GitHub with a semver tag (e.g., `v1.0.0`)
127
- 2. The release workflow automatically publishes to npm
128
-
129
- > **Note:** The repository requires an `NPM_TOKEN` secret for npm publishing.
344
+ 1. Create a new release with a semver tag (e.g., `v1.0.0`)
345
+ 2. The release workflow automatically publishes to npm and builds a multi-arch Docker image
130
346
 
131
347
  ## License
132
348
 
133
349
  [Apache License 2.0](LICENSE)
134
- A CLI to accelerate developing and testing Jahia in the Agentic era
package/bin/dev.js CHANGED
@@ -2,4 +2,8 @@
2
2
 
3
3
  import { execute } from '@oclif/core';
4
4
 
5
- await execute({ development: true, dir: import.meta.url });
5
+ // Use development mode for dev plugins/ts-node, but disable debug
6
+ // to suppress stack traces in error output
7
+ process.env.NODE_ENV = 'development';
8
+
9
+ await execute({ dir: import.meta.url });
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ConfigInit extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/config/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAO7C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,OAAgB,WAAW,SAEuC;IAElE,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;MAenB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgElC"}
@@ -0,0 +1,76 @@
1
+ import { resolve } from 'node:path';
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { buildBlankConfig } from '../../lib/config/build-blank-config.js';
4
+ import { initializeConfigFile } from '../../lib/config/initialize-config-file.js';
5
+ const DEFAULT_OUTPUT = 'jahia-cli.config.yml';
6
+ export default class ConfigInit extends Command {
7
+ static description = 'Generate an initialized Jahia CLI configuration file. ' +
8
+ 'Creates a blank scaffold with environment and tests sections.';
9
+ static examples = [
10
+ '<%= config.bin %> config init',
11
+ '<%= config.bin %> config init --output ./my-config.yml',
12
+ '<%= config.bin %> config init --force --json',
13
+ ];
14
+ static flags = {
15
+ output: Flags.string({
16
+ char: 'o',
17
+ description: 'Path to write the configuration YAML file',
18
+ default: DEFAULT_OUTPUT,
19
+ }),
20
+ force: Flags.boolean({
21
+ char: 'f',
22
+ description: 'Overwrite output file if it already exists',
23
+ default: false,
24
+ }),
25
+ json: Flags.boolean({
26
+ description: 'Output result as structured JSON (for AI agents and scripting)',
27
+ default: false,
28
+ }),
29
+ };
30
+ async run() {
31
+ const { flags } = await this.parse(ConfigInit);
32
+ const outputFile = resolve(flags.output);
33
+ try {
34
+ const config = buildBlankConfig();
35
+ const initialized = await initializeConfigFile({
36
+ outputFile,
37
+ config,
38
+ force: flags.force,
39
+ });
40
+ if (!initialized.written) {
41
+ const message = `Configuration file already exists at "${outputFile}". Use --force to overwrite.`;
42
+ if (flags.json) {
43
+ this.log(JSON.stringify({ success: false, error: 'file_exists', message, outputFile }, null, 2));
44
+ this.exit(1);
45
+ }
46
+ this.error(message);
47
+ return;
48
+ }
49
+ if (flags.json) {
50
+ this.log(JSON.stringify({
51
+ success: true,
52
+ outputFile,
53
+ }, null, 2));
54
+ }
55
+ else {
56
+ this.log(`✓ Configuration initialized at ${outputFile}`);
57
+ }
58
+ }
59
+ catch (error) {
60
+ const message = error instanceof Error ? error.message : String(error);
61
+ if (flags.json) {
62
+ this.log(JSON.stringify({
63
+ success: false,
64
+ error: 'config_init_failed',
65
+ message,
66
+ outputFile,
67
+ }, null, 2));
68
+ }
69
+ else {
70
+ this.error(message);
71
+ }
72
+ this.exit(1);
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/config/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAElF,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAU,WAAW,GACzB,wDAAwD;QACxD,+DAA+D,CAAC;IAElE,MAAM,CAAU,QAAQ,GAAG;QACzB,+BAA+B;QAC/B,wDAAwD;QACxD,8CAA8C;KAC/C,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,2CAA2C;YACxD,OAAO,EAAE,cAAc;SACxB,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,4CAA4C;YACzD,OAAO,EAAE,KAAK;SACf,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,gEAAgE;YAC7E,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAElC,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC;gBAC7C,UAAU;gBACV,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,yCAAyC,UAAU,8BAA8B,CAAC;gBAClG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,SAAS,CACZ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,EAC7D,IAAI,EACJ,CAAC,CACF,CACF,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,SAAS,CACZ;oBACE,OAAO,EAAE,IAAI;oBACb,UAAU;iBACX,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,SAAS,CACZ;oBACE,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,oBAAoB;oBAC3B,OAAO;oBACP,UAAU;iBACX,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { ConfigComponent } from '../../lib/config/types.js';
3
+ /**
4
+ * Prompts the user interactively for Jahia image and builds a minimal config.
5
+ */
6
+ export declare const promptForJahiaConfig: () => Promise<{
7
+ readonly image: string;
8
+ }>;
9
+ /**
10
+ * Prompts the user for optional utility components (e.g., SMTP server).
11
+ * Returns an array of ConfigComponent entries to add to the environment.
12
+ */
13
+ export declare const promptForOptionalComponents: () => Promise<readonly ConfigComponent[]>;
14
+ export default class EnvironmentCreate extends Command {
15
+ static description: string;
16
+ static examples: string[];
17
+ static flags: {
18
+ state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
+ 'export-config': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
+ };
24
+ run(): Promise<void>;
25
+ private resolveConfig;
26
+ }
27
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/environment/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAQ7C,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,2BAA2B,CAAC;AAYpF;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAOA,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAAa,OAAO,CAAC,SAAS,eAAe,EAAE,CAYtF,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,OAAgB,WAAW,SAG4C;IAEvE,OAAgB,QAAQ,WAOtB;IAEF,OAAgB,KAAK;;;;;;MAoBnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAwGnB,aAAa;CAyB5B"}