indraq_cli 1.5.8 → 1.9.1

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 (274) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1517 -1686
  3. package/cloud-api/.dockerignore +18 -0
  4. package/cloud-api/.env.example +14 -0
  5. package/cloud-api/Dockerfile +19 -0
  6. package/cloud-api/README.md +141 -0
  7. package/cloud-api/package-lock.json +2250 -0
  8. package/cloud-api/package.json +29 -0
  9. package/cloud-api/sql/001_init.sql +8 -0
  10. package/cloud-api/sql/002_user_providers_and_project_resources.sql +40 -0
  11. package/cloud-api/sql/003_environment_infrastructure.sql +19 -0
  12. package/cloud-api/sql/004_managed_aws_credentials.sql +20 -0
  13. package/cloud-api/sql/005_project_members_and_resource_grants.sql +22 -0
  14. package/cloud-api/sql/006_catalog_identity_password_security.sql +96 -0
  15. package/cloud-api/sql/007_aws_access_key_rotation.sql +16 -0
  16. package/cloud-api/src/index.ts +1254 -0
  17. package/cloud-api/tsconfig.json +18 -0
  18. package/dist/cli/create-program.d.ts.map +1 -1
  19. package/dist/cli/create-program.js +21 -3
  20. package/dist/cli/create-program.js.map +1 -1
  21. package/dist/cli/doctor.command.d.ts +1 -1
  22. package/dist/cli/doctor.command.d.ts.map +1 -1
  23. package/dist/cli/doctor.command.js +70 -12
  24. package/dist/cli/doctor.command.js.map +1 -1
  25. package/dist/cli/help-content.d.ts +1 -1
  26. package/dist/cli/help-content.d.ts.map +1 -1
  27. package/dist/cli/help-content.js +256 -177
  28. package/dist/cli/help-content.js.map +1 -1
  29. package/dist/modules/access/commands/access.command.d.ts +3 -0
  30. package/dist/modules/access/commands/access.command.d.ts.map +1 -0
  31. package/dist/modules/access/commands/access.command.js +226 -0
  32. package/dist/modules/access/commands/access.command.js.map +1 -0
  33. package/dist/modules/access/index.d.ts +3 -0
  34. package/dist/modules/access/index.d.ts.map +1 -0
  35. package/dist/modules/access/index.js +11 -0
  36. package/dist/modules/access/index.js.map +1 -0
  37. package/dist/modules/aws/commands/configure-aws.command.d.ts +2 -0
  38. package/dist/modules/aws/commands/configure-aws.command.d.ts.map +1 -0
  39. package/dist/modules/aws/commands/configure-aws.command.js +7 -0
  40. package/dist/modules/aws/commands/configure-aws.command.js.map +1 -0
  41. package/dist/modules/aws/commands/dns.command.d.ts +22 -0
  42. package/dist/modules/aws/commands/dns.command.d.ts.map +1 -0
  43. package/dist/modules/aws/commands/dns.command.js +229 -0
  44. package/dist/modules/aws/commands/dns.command.js.map +1 -0
  45. package/dist/modules/aws/commands/healthcheck.command.d.ts +22 -0
  46. package/dist/modules/aws/commands/healthcheck.command.d.ts.map +1 -0
  47. package/dist/modules/aws/commands/healthcheck.command.js +125 -0
  48. package/dist/modules/aws/commands/healthcheck.command.js.map +1 -0
  49. package/dist/modules/aws/commands/iam.command.d.ts +24 -0
  50. package/dist/modules/aws/commands/iam.command.d.ts.map +1 -0
  51. package/dist/modules/aws/commands/iam.command.js +219 -0
  52. package/dist/modules/aws/commands/iam.command.js.map +1 -0
  53. package/dist/modules/aws/config/aws-config.d.ts +23 -0
  54. package/dist/modules/aws/config/aws-config.d.ts.map +1 -0
  55. package/dist/modules/aws/config/aws-config.js +72 -0
  56. package/dist/modules/aws/config/aws-config.js.map +1 -0
  57. package/dist/modules/aws/index.d.ts +3 -0
  58. package/dist/modules/aws/index.d.ts.map +1 -0
  59. package/dist/modules/aws/index.js +54 -0
  60. package/dist/modules/aws/index.js.map +1 -0
  61. package/dist/modules/aws/services/aws-clients.d.ts +9 -0
  62. package/dist/modules/aws/services/aws-clients.d.ts.map +1 -0
  63. package/dist/modules/aws/services/aws-clients.js +43 -0
  64. package/dist/modules/aws/services/aws-clients.js.map +1 -0
  65. package/dist/modules/aws/services/route53-lookup.service.d.ts +9 -0
  66. package/dist/modules/aws/services/route53-lookup.service.d.ts.map +1 -0
  67. package/dist/modules/aws/services/route53-lookup.service.js +57 -0
  68. package/dist/modules/aws/services/route53-lookup.service.js.map +1 -0
  69. package/dist/modules/cloud/commands/cloud.command.d.ts +38 -0
  70. package/dist/modules/cloud/commands/cloud.command.d.ts.map +1 -0
  71. package/dist/modules/cloud/commands/cloud.command.js +443 -0
  72. package/dist/modules/cloud/commands/cloud.command.js.map +1 -0
  73. package/dist/modules/cloud/commands/credentials.command.d.ts +5 -0
  74. package/dist/modules/cloud/commands/credentials.command.d.ts.map +1 -0
  75. package/dist/modules/cloud/commands/credentials.command.js +25 -0
  76. package/dist/modules/cloud/commands/credentials.command.js.map +1 -0
  77. package/dist/modules/cloud/commands/environment.command.d.ts +6 -0
  78. package/dist/modules/cloud/commands/environment.command.d.ts.map +1 -0
  79. package/dist/modules/cloud/commands/environment.command.js +75 -0
  80. package/dist/modules/cloud/commands/environment.command.js.map +1 -0
  81. package/dist/modules/cloud/commands/provider.command.d.ts +3 -0
  82. package/dist/modules/cloud/commands/provider.command.d.ts.map +1 -0
  83. package/dist/modules/cloud/commands/provider.command.js +193 -0
  84. package/dist/modules/cloud/commands/provider.command.js.map +1 -0
  85. package/dist/modules/cloud/config/cloud-config.d.ts +19 -0
  86. package/dist/modules/cloud/config/cloud-config.d.ts.map +1 -0
  87. package/dist/modules/cloud/config/cloud-config.js +53 -0
  88. package/dist/modules/cloud/config/cloud-config.js.map +1 -0
  89. package/dist/modules/cloud/index.d.ts +3 -0
  90. package/dist/modules/cloud/index.d.ts.map +1 -0
  91. package/dist/modules/cloud/index.js +62 -0
  92. package/dist/modules/cloud/index.js.map +1 -0
  93. package/dist/modules/cloud/services/cloud-api.service.d.ts +17 -0
  94. package/dist/modules/cloud/services/cloud-api.service.d.ts.map +1 -0
  95. package/dist/modules/cloud/services/cloud-api.service.js +61 -0
  96. package/dist/modules/cloud/services/cloud-api.service.js.map +1 -0
  97. package/dist/modules/cloud/services/cloud-aws.service.d.ts +23 -0
  98. package/dist/modules/cloud/services/cloud-aws.service.d.ts.map +1 -0
  99. package/dist/modules/cloud/services/cloud-aws.service.js +26 -0
  100. package/dist/modules/cloud/services/cloud-aws.service.js.map +1 -0
  101. package/dist/modules/cloud/services/cloud-ghcr.service.d.ts +12 -0
  102. package/dist/modules/cloud/services/cloud-ghcr.service.d.ts.map +1 -0
  103. package/dist/modules/cloud/services/cloud-ghcr.service.js +31 -0
  104. package/dist/modules/cloud/services/cloud-ghcr.service.js.map +1 -0
  105. package/dist/modules/cloud/services/cloud-jenkins.service.d.ts +29 -0
  106. package/dist/modules/cloud/services/cloud-jenkins.service.d.ts.map +1 -0
  107. package/dist/modules/cloud/services/cloud-jenkins.service.js +236 -0
  108. package/dist/modules/cloud/services/cloud-jenkins.service.js.map +1 -0
  109. package/dist/modules/cloud/services/cloud-npm.service.d.ts +3 -0
  110. package/dist/modules/cloud/services/cloud-npm.service.d.ts.map +1 -0
  111. package/dist/modules/cloud/services/cloud-npm.service.js +13 -0
  112. package/dist/modules/cloud/services/cloud-npm.service.js.map +1 -0
  113. package/dist/modules/cloud/services/environment.service.d.ts +25 -0
  114. package/dist/modules/cloud/services/environment.service.d.ts.map +1 -0
  115. package/dist/modules/cloud/services/environment.service.js +21 -0
  116. package/dist/modules/cloud/services/environment.service.js.map +1 -0
  117. package/dist/modules/cloud/services/managed-aws-credential.service.d.ts +36 -0
  118. package/dist/modules/cloud/services/managed-aws-credential.service.d.ts.map +1 -0
  119. package/dist/modules/cloud/services/managed-aws-credential.service.js +35 -0
  120. package/dist/modules/cloud/services/managed-aws-credential.service.js.map +1 -0
  121. package/dist/modules/cloud/services/project-cloud.service.d.ts +28 -0
  122. package/dist/modules/cloud/services/project-cloud.service.d.ts.map +1 -0
  123. package/dist/modules/cloud/services/project-cloud.service.js +50 -0
  124. package/dist/modules/cloud/services/project-cloud.service.js.map +1 -0
  125. package/dist/modules/cloud/services/user-provider.service.d.ts +17 -0
  126. package/dist/modules/cloud/services/user-provider.service.d.ts.map +1 -0
  127. package/dist/modules/cloud/services/user-provider.service.js +25 -0
  128. package/dist/modules/cloud/services/user-provider.service.js.map +1 -0
  129. package/dist/modules/configure/configure.command.d.ts.map +1 -1
  130. package/dist/modules/configure/configure.command.js +17 -94
  131. package/dist/modules/configure/configure.command.js.map +1 -1
  132. package/dist/modules/deploy/commands/build.command.d.ts +1 -2
  133. package/dist/modules/deploy/commands/build.command.d.ts.map +1 -1
  134. package/dist/modules/deploy/commands/build.command.js +82 -124
  135. package/dist/modules/deploy/commands/build.command.js.map +1 -1
  136. package/dist/modules/deploy/index.d.ts.map +1 -1
  137. package/dist/modules/deploy/index.js +10 -30
  138. package/dist/modules/deploy/index.js.map +1 -1
  139. package/dist/modules/deploy/services/docker.service.d.ts +6 -3
  140. package/dist/modules/deploy/services/docker.service.d.ts.map +1 -1
  141. package/dist/modules/deploy/services/docker.service.js +8 -11
  142. package/dist/modules/deploy/services/docker.service.js.map +1 -1
  143. package/dist/modules/dockerfile/commands/create-dockerfile.command.d.ts +13 -0
  144. package/dist/modules/dockerfile/commands/create-dockerfile.command.d.ts.map +1 -0
  145. package/dist/modules/dockerfile/commands/create-dockerfile.command.js +39 -0
  146. package/dist/modules/dockerfile/commands/create-dockerfile.command.js.map +1 -0
  147. package/dist/modules/dockerfile/index.d.ts +3 -0
  148. package/dist/modules/dockerfile/index.d.ts.map +1 -0
  149. package/dist/modules/dockerfile/index.js +7 -0
  150. package/dist/modules/dockerfile/index.js.map +1 -0
  151. package/dist/modules/jenkins/commands/admin.command.d.ts +22 -0
  152. package/dist/modules/jenkins/commands/admin.command.d.ts.map +1 -0
  153. package/dist/modules/jenkins/commands/admin.command.js +128 -0
  154. package/dist/modules/jenkins/commands/admin.command.js.map +1 -0
  155. package/dist/modules/jenkins/commands/create-deployment.command.d.ts +13 -0
  156. package/dist/modules/jenkins/commands/create-deployment.command.d.ts.map +1 -0
  157. package/dist/modules/jenkins/commands/create-deployment.command.js +115 -0
  158. package/dist/modules/jenkins/commands/create-deployment.command.js.map +1 -0
  159. package/dist/modules/jenkins/index.d.ts +3 -0
  160. package/dist/modules/jenkins/index.d.ts.map +1 -0
  161. package/dist/modules/jenkins/index.js +28 -0
  162. package/dist/modules/jenkins/index.js.map +1 -0
  163. package/dist/modules/mobile/commands/build-mobile.command.d.ts.map +1 -1
  164. package/dist/modules/mobile/commands/build-mobile.command.js +4 -22
  165. package/dist/modules/mobile/commands/build-mobile.command.js.map +1 -1
  166. package/dist/modules/mobile/commands/configure-mobile.command.d.ts +1 -1
  167. package/dist/modules/mobile/commands/configure-mobile.command.d.ts.map +1 -1
  168. package/dist/modules/mobile/commands/configure-mobile.command.js +11 -9
  169. package/dist/modules/mobile/commands/configure-mobile.command.js.map +1 -1
  170. package/dist/modules/mobile/services/jenkins-mobile.service.d.ts +2 -2
  171. package/dist/modules/mobile/services/jenkins-mobile.service.d.ts.map +1 -1
  172. package/dist/modules/mobile/services/jenkins-mobile.service.js +1 -2
  173. package/dist/modules/mobile/services/jenkins-mobile.service.js.map +1 -1
  174. package/dist/modules/mobile/services/project.service.d.ts +2 -2
  175. package/dist/modules/mobile/services/project.service.d.ts.map +1 -1
  176. package/dist/modules/prebuild/commands/prebuild.command.d.ts +13 -0
  177. package/dist/modules/prebuild/commands/prebuild.command.d.ts.map +1 -0
  178. package/dist/modules/prebuild/commands/prebuild.command.js +507 -0
  179. package/dist/modules/prebuild/commands/prebuild.command.js.map +1 -0
  180. package/dist/modules/prebuild/index.d.ts +3 -0
  181. package/dist/modules/prebuild/index.d.ts.map +1 -0
  182. package/dist/modules/prebuild/index.js +19 -0
  183. package/dist/modules/prebuild/index.js.map +1 -0
  184. package/dist/modules/proxy/commands/configure-proxy.command.d.ts +2 -0
  185. package/dist/modules/proxy/commands/configure-proxy.command.d.ts.map +1 -0
  186. package/dist/modules/proxy/commands/configure-proxy.command.js +7 -0
  187. package/dist/modules/proxy/commands/configure-proxy.command.js.map +1 -0
  188. package/dist/modules/proxy/commands/npm-user.command.d.ts +28 -0
  189. package/dist/modules/proxy/commands/npm-user.command.d.ts.map +1 -0
  190. package/dist/modules/proxy/commands/npm-user.command.js +77 -0
  191. package/dist/modules/proxy/commands/npm-user.command.js.map +1 -0
  192. package/dist/modules/proxy/commands/proxy.command.d.ts +22 -0
  193. package/dist/modules/proxy/commands/proxy.command.d.ts.map +1 -0
  194. package/dist/modules/proxy/commands/proxy.command.js +173 -0
  195. package/dist/modules/proxy/commands/proxy.command.js.map +1 -0
  196. package/dist/modules/proxy/config/npm-config.d.ts +17 -0
  197. package/dist/modules/proxy/config/npm-config.d.ts.map +1 -0
  198. package/dist/modules/proxy/config/npm-config.js +50 -0
  199. package/dist/modules/proxy/config/npm-config.js.map +1 -0
  200. package/dist/modules/proxy/index.d.ts +3 -0
  201. package/dist/modules/proxy/index.d.ts.map +1 -0
  202. package/dist/modules/proxy/index.js +21 -0
  203. package/dist/modules/proxy/index.js.map +1 -0
  204. package/dist/modules/proxy/services/npm-api.service.d.ts +76 -0
  205. package/dist/modules/proxy/services/npm-api.service.d.ts.map +1 -0
  206. package/dist/modules/proxy/services/npm-api.service.js +82 -0
  207. package/dist/modules/proxy/services/npm-api.service.js.map +1 -0
  208. package/dist/modules/scaffold/commands/init.command.d.ts +6 -0
  209. package/dist/modules/scaffold/commands/init.command.d.ts.map +1 -0
  210. package/dist/modules/scaffold/commands/init.command.js +193 -0
  211. package/dist/modules/scaffold/commands/init.command.js.map +1 -0
  212. package/dist/modules/scaffold/config/project-metadata.d.ts +9 -0
  213. package/dist/modules/scaffold/config/project-metadata.d.ts.map +1 -0
  214. package/dist/modules/scaffold/config/project-metadata.js +75 -0
  215. package/dist/modules/scaffold/config/project-metadata.js.map +1 -0
  216. package/dist/modules/scaffold/index.d.ts +3 -0
  217. package/dist/modules/scaffold/index.d.ts.map +1 -0
  218. package/dist/modules/scaffold/index.js +7 -0
  219. package/dist/modules/scaffold/index.js.map +1 -0
  220. package/dist/modules/scaffold/services/docker-template.service.d.ts +3 -0
  221. package/dist/modules/scaffold/services/docker-template.service.d.ts.map +1 -0
  222. package/dist/modules/scaffold/services/docker-template.service.js +131 -0
  223. package/dist/modules/scaffold/services/docker-template.service.js.map +1 -0
  224. package/dist/modules/scaffold/services/filesystem.service.d.ts +7 -0
  225. package/dist/modules/scaffold/services/filesystem.service.d.ts.map +1 -0
  226. package/dist/modules/scaffold/services/filesystem.service.js +97 -0
  227. package/dist/modules/scaffold/services/filesystem.service.js.map +1 -0
  228. package/dist/modules/scaffold/services/project-template.service.d.ts +4 -0
  229. package/dist/modules/scaffold/services/project-template.service.d.ts.map +1 -0
  230. package/dist/modules/scaffold/services/project-template.service.js +82 -0
  231. package/dist/modules/scaffold/services/project-template.service.js.map +1 -0
  232. package/dist/modules/scaffold/types.d.ts +65 -0
  233. package/dist/modules/scaffold/types.d.ts.map +1 -0
  234. package/dist/modules/scaffold/types.js +3 -0
  235. package/dist/modules/scaffold/types.js.map +1 -0
  236. package/dist/modules/users/commands/user.command.d.ts +22 -0
  237. package/dist/modules/users/commands/user.command.d.ts.map +1 -0
  238. package/dist/modules/users/commands/user.command.js +350 -0
  239. package/dist/modules/users/commands/user.command.js.map +1 -0
  240. package/dist/modules/users/index.d.ts +3 -0
  241. package/dist/modules/users/index.d.ts.map +1 -0
  242. package/dist/modules/users/index.js +34 -0
  243. package/dist/modules/users/index.js.map +1 -0
  244. package/dist/modules/users/providers/aws-user.provider.d.ts +11 -0
  245. package/dist/modules/users/providers/aws-user.provider.d.ts.map +1 -0
  246. package/dist/modules/users/providers/aws-user.provider.js +129 -0
  247. package/dist/modules/users/providers/aws-user.provider.js.map +1 -0
  248. package/dist/modules/users/providers/jenkins-user.provider.d.ts +6 -0
  249. package/dist/modules/users/providers/jenkins-user.provider.d.ts.map +1 -0
  250. package/dist/modules/users/providers/jenkins-user.provider.js +97 -0
  251. package/dist/modules/users/providers/jenkins-user.provider.js.map +1 -0
  252. package/dist/modules/users/providers/npm-user.provider.d.ts +4 -0
  253. package/dist/modules/users/providers/npm-user.provider.d.ts.map +1 -0
  254. package/dist/modules/users/providers/npm-user.provider.js +47 -0
  255. package/dist/modules/users/providers/npm-user.provider.js.map +1 -0
  256. package/dist/shared/config/config-files.d.ts.map +1 -1
  257. package/dist/shared/config/config-files.js +14 -10
  258. package/dist/shared/config/config-files.js.map +1 -1
  259. package/dist/shared/github/github-api.service.d.ts.map +1 -1
  260. package/dist/shared/github/github-api.service.js +25 -37
  261. package/dist/shared/github/github-api.service.js.map +1 -1
  262. package/dist/shared/jenkins/jenkins.service.d.ts +2 -0
  263. package/dist/shared/jenkins/jenkins.service.d.ts.map +1 -1
  264. package/dist/shared/jenkins/jenkins.service.js +30 -1
  265. package/dist/shared/jenkins/jenkins.service.js.map +1 -1
  266. package/dist/shared/listing.d.ts +9 -0
  267. package/dist/shared/listing.d.ts.map +1 -0
  268. package/dist/shared/listing.js +29 -0
  269. package/dist/shared/listing.js.map +1 -0
  270. package/docs/ARCHITECTURE.md +29 -0
  271. package/docs/CREATE-DEPLOYMENT-reference.groovy +1105 -0
  272. package/package.json +76 -59
  273. package/templates/jenkins/CREATE-DEPLOYMENT.groovy +1105 -0
  274. package/templates/jenkins/Jenkinsfile-Mobile-App +759 -759
package/README.md CHANGED
@@ -1,1686 +1,1517 @@
1
- <p align="center">
2
- <img src="docs/assets/indraq-logo.png" alt="IndraQ Innovations" width="620" />
3
- </p>
4
-
5
- <h1 align="center">IndraQ CLI</h1>
6
-
7
- <p align="center">
8
- <strong>One command-line tool for IndraQ engineering operations.</strong>
9
- </p>
10
-
11
- <p align="center">
12
- Docker & GHCR deployments · Jenkins automation · Expo / React Native Android builds · Live terminal logs
13
- </p>
14
-
15
- <p align="center">
16
- <img alt="npm" src="https://img.shields.io/npm/v/indraq_cli?logo=npm&label=npm" />
17
- <img alt="Node 22+" src="https://img.shields.io/badge/Node.js-22%2B-339933?logo=node.js&logoColor=white" />
18
- <img alt="Java 21" src="https://img.shields.io/badge/Java-21%20recommended-ED8B00?logo=openjdk&logoColor=white" />
19
- <img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white" />
20
- <img alt="License" src="https://img.shields.io/npm/l/indraq_cli" />
21
- <img alt="Version" src="https://img.shields.io/badge/version-1.5.8-264B63" />
22
- </p>
23
-
24
- > [!IMPORTANT]
25
- > **IndraQ CLI is an engineering operations CLI created by IndraQ Innovations.** It is publicly installable from npm. The tool is designed so new internal capabilities can be added as separate modules instead of growing into one giant script.
26
-
27
- ---
28
-
29
- ## Index
30
-
31
- 1. [What is IndraQ CLI?](#what-is-indraq-cli)
32
- 2. [Explain it like I am new](#explain-it-like-i-am-new)
33
- 3. [What changed in v1.5.8?](#what-changed-in-v158)
34
- 4. [Requirements](#requirements)
35
- 5. [Install Java 21](#install-java-21)
36
- 6. [Install IndraQ CLI](#install-indraq-cli)
37
- 7. [Run the doctor](#run-the-doctor)
38
- 8. [Configuration home](#configuration-home)
39
- 9. [Configure Jenkins](#configure-jenkins)
40
- 10. [Configure Docker / GHCR](#configure-docker--ghcr)
41
- 11. [Configure Mobile App](#configure-mobile-app)
42
- 12. [Docker deployment](#docker-deployment)
43
- 13. [Mobile build overview](#mobile-build-overview)
44
- 14. [Mobile build matrix](#mobile-build-matrix)
45
- 15. [Mobile build commands](#mobile-build-commands)
46
- 16. [Mobile build flags](#mobile-build-flags)
47
- 17. [Android versioning and artifact names](#android-versioning-and-artifact-names)
48
- 18. [How local source reaches Jenkins](#how-local-source-reaches-jenkins)
49
- 19. [Root .env behavior](#root-env-behavior)
50
- 20. [Mobile Jenkins setup](#mobile-jenkins-setup)
51
- 21. [Configuration and secret storage](#configuration-and-secret-storage)
52
- 22. [Upgrade from v1.4 / v1.5](#upgrade-from-v14--v15)
53
- 23. [Command reference](#command-reference)
54
- 24. [Troubleshooting](#troubleshooting)
55
- 25. [Frequently asked questions](#frequently-asked-questions)
56
- 26. [Project architecture](#project-architecture)
57
- 27. [Final checklist](#final-checklist)
58
- 28. [License](#license)
59
-
60
- ---
61
-
62
- ## v1.5.8 — Git-safe shared configuration
63
-
64
- Project configuration is now intentionally shareable without exposing Jenkins credentials:
65
-
66
- ```text
67
- COMMIT / SHARE
68
- .indraq/jenkins.json
69
- .indraq/docker.json
70
- .indraq/mobile.json
71
-
72
- LOCAL ONLY / IGNORE
73
- .indraq/jenkins.local.json
74
- ```
75
-
76
- IndraQ reuses an existing project `.gitignore`, adds `.indraq/jenkins.local.json` only when the exact rule is missing, and does not add an ignore-all `.indraq/` rule. Re-running configuration is idempotent, so the same ignore entry is never appended repeatedly. Actual Jenkins username/token/password data stays outside the repository under the user's home directory.
77
-
78
- Docker deployments also continue to preserve Docker's existing GHCR credential store; IndraQ does not run `docker login ghcr.io` during deployment.
79
-
80
- ---
81
-
82
- ## What is IndraQ CLI?
83
-
84
- IndraQ CLI is a program you install once on a developer computer and then use from **any project folder**.
85
-
86
- Instead of remembering many Docker, GitHub, Jenkins, Android, and build commands, you run a small IndraQ command such as:
87
-
88
- ```bash
89
- indraq deploy:dev
90
- ```
91
-
92
- or:
93
-
94
- ```bash
95
- indraq build mobile:staging
96
- ```
97
-
98
- The CLI validates the request, uses the saved configuration for the current project, performs the work, and shows failures directly in the same VS Code terminal.
99
-
100
- ### One installation, many projects
101
-
102
- Install globally once:
103
-
104
- ```bash
105
- npm install -g indraq_cli
106
- ```
107
-
108
- Then use it anywhere:
109
-
110
- ```text
111
- C:\Projects\accounting-service> indraq deploy:dev
112
- C:\Projects\mobile-app> indraq build mobile:dev
113
- C:\Projects\another-app> indraq configure
114
- ```
115
-
116
- Each project keeps its own `.indraq/` configuration. The CLI itself is not installed separately in every project.
117
-
118
- ---
119
-
120
- ## Explain it like I am new
121
-
122
- Imagine you built a school project.
123
-
124
- You have the project files on your computer. You want another computer called **Jenkins** to build or deploy them for you.
125
-
126
- Without IndraQ CLI, you may need to:
127
-
128
- 1. remember many commands;
129
- 2. open Jenkins in the browser;
130
- 3. choose the correct job;
131
- 4. fill many parameters;
132
- 5. copy environment variables;
133
- 6. wait for the build;
134
- 7. keep refreshing logs.
135
-
136
- With IndraQ CLI, you configure the project once and later type one command.
137
-
138
- For a mobile app:
139
-
140
- ```text
141
- Your VS Code project
142
-
143
- │ indraq build mobile:prod
144
-
145
- IndraQ CLI
146
-
147
- ├── checks you are at the project root
148
- ├── validates Expo / React Native
149
- ├── reads the saved Production settings
150
- ├── reads root .env automatically
151
- ├── creates a clean source snapshot
152
- ├── sends it to Production Jenkins
153
- └── shows Jenkins logs here
154
-
155
-
156
- Production Jenkins
157
-
158
- ├── installs dependencies
159
- ├── prepares Android
160
- ├── builds APK/AAB
161
- └── publishes the artifact
162
- ```
163
-
164
- You do **not** need to give Jenkins a Git URL, Git branch, app subdirectory, or pasted `.env` content for this mobile workflow.
165
-
166
- ---
167
-
168
- ## What changed in v1.5.8?
169
-
170
- v1.5.8 keeps the working Jenkins, mobile-build, GHCR, and complete-help behavior from v1.5.7 and tightens project configuration sharing.
171
-
172
- ### Git-safe project configuration in v1.5.8
173
-
174
- - IndraQ no longer adds `.indraq/` to the project `.gitignore`.
175
- - Only `.indraq/jenkins.local.json` is added at the project root as the machine-local Jenkins binding.
176
- - Existing `.gitignore` files are reused rather than replaced.
177
- - Existing exact ignore entries are detected, so repeated configuration does not duplicate them.
178
- - `.indraq/jenkins.json`, `.indraq/docker.json`, and `.indraq/mobile.json` remain available to Git and can be shared with another developer.
179
- - Jenkins username/token/password remain outside the repo under `~/.indraq/jenkins/...`; another developer receives server/config metadata but not your login credential.
180
- - Known old IndraQ-generated ignore-all rules are migrated carefully; unrelated user-authored Git rules are preserved.
181
-
182
-
183
- ### Jenkins-console-quality logs and server Gradle reuse in v1.5.8
184
-
185
- - The terminal log streamer now reads Jenkins **`logText/progressiveHtml`**, the same progressive endpoint used by the classic Jenkins web console. Jenkins therefore removes/renders hidden `ConsoleNote` annotations before the CLI displays the text, so internal `ha:////...` payloads no longer pollute VS Code output.
186
- - HTML markup is converted back to plain terminal text while preserving usernames, timestamps, Pipeline lines, errors, and normal line spacing. `progressiveText` remains only as a compatibility fallback with explicit ConsoleNote filtering.
187
- - Failed mobile builds now end with a short **Key Jenkins error lines** summary plus the direct Jenkins build URL.
188
- - The mobile Jenkinsfile still normalizes Windows CRLF in `android/gradlew`, but v1.5.8 also restores the Jenkins server's shared Gradle cache at `$HOME/.gradle` instead of creating an empty per-project Gradle cache.
189
- - Gradle execution prefers the exact cached project-wrapper distribution. If no exact wrapper distribution is cached, an installed Jenkins-server Gradle from the same major version can be reused. The project wrapper remains the final fallback.
190
- - If a wrapper download is genuinely necessary, the temporary Jenkins copy of `gradle-wrapper.properties` gets `networkTimeout=120000` (120 seconds) instead of failing at Gradle's short default timeout.
191
- - `FULL_RESET` no longer deletes Jenkins' shared Gradle cache. It clears project-local npm/Expo caches and generated Android state only.
192
- - Jenkins queue updates are printed as normal lines instead of carriage-return cursor updates.
193
-
194
- ### Jenkins/Git behavior hardened in v1.5.x
195
-
196
- - Mobile always targets the Jenkins job **`Mobile app Cli build`**. The job name is no longer configurable per project.
197
- - The mobile Jenkinsfile no longer contains the Groovy-invalid escaped-dot expression that caused `unexpected char: '\'` during pipeline compilation.
198
- - Mobile Jenkins HTTP uploads now preserve the Jenkins web-session cookie together with the CSRF crumb, fixing HTTP 403 responses when Jenkins is configured with username/password authentication. API-token authentication remains supported.
199
- - Mobile build output now says explicitly that `.env` is excluded only from the source archive and is uploaded separately to Jenkins.
200
- - `.indraq/mobile.json`, `.indraq/docker.json`, and `.indraq/jenkins.json` are intended to be committed to Git.
201
- - `.indraq/jenkins.local.json`, Jenkins username/token/password, `.env`, and `jenkins-cli.jar` are machine-local and never meant to be committed.
202
- - Docker CLI deployments now start Jenkins with `ACTION=DEPLOY`, `IMAGE_TAG`, optional `IMAGE_DIGEST`, and `DEPLOYMENT_SOURCE=INDRAQ_CLI`.
203
- - Expo versions are synchronized to `app.json` when possible. React Native CLI versions are synchronized to `android/app/build.gradle` / `build.gradle.kts` when those values are simple literals. Jenkins still enforces the requested version during the actual Android build.
204
-
205
- ### App name is now part of Mobile configuration
206
-
207
- Every mobile project stores an app name. IndraQ uses this name when it creates the final APK/AAB filename.
208
-
209
- ### Android Version and versionCode
210
-
211
- New projects start with:
212
-
213
- ```text
214
- Version: 0.1
215
- versionCode: 1
216
- ```
217
-
218
- Both counters auto-increment **after a successful Jenkins build** by default. Failed or cancelled builds do not consume a version.
219
-
220
- The version rule is simple: the final numeric part increases by one.
221
-
222
- ```text
223
- 0.1 → 0.2
224
- 0.9 → 0.10
225
- 1.2.3 → 1.2.4
226
- ```
227
-
228
- `versionCode` increments by one:
229
-
230
- ```text
231
- 1 → 2 → 3 → 4
232
- ```
233
-
234
- You can change either value or turn either auto-increment switch off from:
235
-
236
- ```text
237
- indraq configure
238
- Mobile App
239
- → Version & versionCode
240
- ```
241
-
242
- When auto-increment is disabled, IndraQ does not block the build. It prints a soft warning reminding you that the same value will be reused.
243
-
244
- ### Predictable Android artifact names
245
-
246
- APK/AAB files produced by the IndraQ mobile Jenkinsfile now follow:
247
-
248
- ```text
249
- <AppName>_<Version>_<versionCode>_<YYYY-MM-DD>_<HHmm>.<apk|aab>
250
- ```
251
-
252
- Example:
253
-
254
- ```text
255
- Nefazo_0.1_1_2026-08-30_2051.apk
256
- ```
257
-
258
- The date/time is always generated in **Asia/Kolkata (IST)**. Time contains hours and minutes only.
259
-
260
- ### Mobile still always uses Production Jenkins
261
-
262
- The Jenkins rule remains intentionally simple:
263
-
264
- ```text
265
- indraq build mobile:dev → Production Jenkins
266
- indraq build mobile:staging Production Jenkins
267
- indraq build mobile:prod → Production Jenkins
268
- ```
269
-
270
- Docker continues to support both Development and Production Jenkins:
271
-
272
- ```text
273
- indraq deploy:dev → Development Jenkins
274
- indraq deploy:prod → Production Jenkins
275
- ```
276
-
277
- ### Existing v1.4 mobile projects migrate automatically
278
-
279
- Existing `.indraq/mobile.json` files are upgraded automatically. Project type, app name, version/versionCode, auto-increment settings, and environment defaults are preserved when present. Older configurable mobile Jenkins job names are removed because mobile now always targets **`Mobile app Cli build`**.
280
-
281
- ---
282
-
283
- ## Requirements
284
-
285
- ### Developer computer
286
-
287
- | Requirement | Why | Check |
288
- |---|---|---|
289
- | **Node.js 22+** | Runs IndraQ CLI | `node --version` |
290
- | **npm** | Installs / updates the CLI | `npm --version` |
291
- | **Git** | GitHub identity/org discovery and optional source revision metadata | `git --version` |
292
- | **Docker GHCR login** | Registry authentication used for image push | `docker login ghcr.io` (one-time, when needed) |
293
- | **Docker** | Docker deployment module | `docker --version` |
294
- | **Java** | Runs Jenkins CLI | `java -version` |
295
- | **tar** | Packages the local mobile source snapshot | `tar --version` |
296
- | **Jenkins account** | Starts Jenkins jobs | Jenkins username + API token |
297
-
298
- > [!TIP]
299
- > Node.js **24** is recommended for IndraQ developer machines, but v1.5.8 supports Node.js **22 and newer**.
300
-
301
- ### Jenkins mobile build machine
302
-
303
- The provided mobile Jenkinsfile expects the Jenkins agent to have:
304
-
305
- - Java;
306
- - Node.js and npm;
307
- - Android SDK;
308
- - `sdkmanager`;
309
- - Bash;
310
- - `tar` / `sha256sum`;
311
- - Jenkins **File Parameter** plugin;
312
- - writable `/opt/mobile-builder`;
313
- - Android SDK at `/opt/android-sdk` unless you edit the Jenkinsfile;
314
- - the Jenkins account should have a writable `$HOME/.gradle` cache (normally `/var/jenkins_home/.gradle`);
315
- - optionally, a system `gradle` executable may be installed. IndraQ uses it only when its major version matches the project wrapper.
316
-
317
- ---
318
-
319
- ## Install Java 21
320
-
321
- Java is required because Jenkins distributes its CLI as `jenkins-cli.jar`.
322
-
323
- ### Windows
324
-
325
- Open PowerShell:
326
-
327
- ```powershell
328
- winget install EclipseAdoptium.Temurin.21.JDK
329
- ```
330
-
331
- Then **fully close and reopen VS Code**.
332
-
333
- Verify:
334
-
335
- ```powershell
336
- java -version
337
- where.exe java
338
- ```
339
-
340
- ### Ubuntu / Debian
341
-
342
- ```bash
343
- sudo apt update
344
- sudo apt install -y openjdk-21-jdk
345
- java -version
346
- ```
347
-
348
- ### macOS
349
-
350
- Using Homebrew:
351
-
352
- ```bash
353
- brew install --cask temurin@21
354
- java -version
355
- ```
356
-
357
- > [!IMPORTANT]
358
- > If `java -version` fails, fix Java before running Jenkins configuration.
359
-
360
- ---
361
-
362
- ## Install IndraQ CLI
363
-
364
- Install globally:
365
-
366
- ```bash
367
- npm install -g indraq_cli
368
- ```
369
-
370
- Verify:
371
-
372
- ```bash
373
- indraq --version
374
- ```
375
-
376
- Expected for this release:
377
-
378
- ```text
379
- 1.5.3
380
- ```
381
-
382
- Update later:
383
-
384
- ```bash
385
- npm install -g indraq_cli@latest
386
- ```
387
-
388
- Uninstall:
389
-
390
- ```bash
391
- npm uninstall -g indraq_cli
392
- ```
393
-
394
- ---
395
-
396
- ## Run the doctor
397
-
398
- Before debugging a mysterious machine problem, run:
399
-
400
- ```bash
401
- indraq doctor
402
- ```
403
-
404
- It checks:
405
-
406
- - Node.js version;
407
- - Java;
408
- - Git;
409
- - `tar`;
410
- - how the `indraq` command resolves on your machine.
411
-
412
- This is especially useful on Windows if another file named `IndraQ` is shadowing the npm executable.
413
-
414
- ---
415
-
416
- ## Configuration home
417
-
418
- Run from the project you want to configure:
419
-
420
- ```bash
421
- indraq configure
422
- ```
423
-
424
- You will see:
425
-
426
- ```text
427
- IndraQ CLI Configuration
428
-
429
- ? What do you want to configure?
430
- > Jenkins
431
- Docker / GHCR
432
- Mobile App
433
- ------------------------------
434
- Review current project configuration
435
- Exit
436
- ```
437
-
438
- The rule is simple:
439
-
440
- > **Persistent settings are changed with `indraq configure`. One-time build changes are supplied as flags.**
441
-
442
- ---
443
-
444
- ## Configure Jenkins
445
-
446
- Choose:
447
-
448
- ```text
449
- Configure
450
- └── Jenkins
451
- ```
452
-
453
- The Jenkins menu is:
454
-
455
- ```text
456
- > Development
457
- Production — used by all mobile builds
458
- ------------------
459
- Review Jenkins connections
460
- Back
461
- ```
462
-
463
- There are only **two Jenkins infrastructure environments** in a project.
464
-
465
- | Jenkins connection | Used by |
466
- |---|---|
467
- | **Development** | `indraq deploy:dev` |
468
- | **Production** | `indraq deploy:prod` **and every mobile build** |
469
-
470
- This means:
471
-
472
- ```text
473
- Mobile Development ┐
474
- Mobile Staging ├──→ Production Jenkins
475
- Mobile Production ┘
476
- ```
477
-
478
- A command such as `indraq build mobile:dev` means **build the app using its Development mobile settings on Production Jenkins**. It does not mean “use Development Jenkins.”
479
-
480
- For each Jenkins connection, IndraQ asks for:
481
-
482
- ```text
483
- Jenkins URL/domain
484
- Jenkins username
485
- Jenkins API token or password
486
- ```
487
-
488
- It then:
489
-
490
- 1. downloads `<jenkins>/jnlpJars/jenkins-cli.jar`;
491
- 2. stores the secret outside the project;
492
- 3. runs Jenkins `who-am-i`;
493
- 4. rejects wrong credentials immediately;
494
- 5. saves the verified non-secret connection metadata in `.indraq/jenkins.json`.
495
-
496
- Configure Jenkins once per project. Normal Docker/mobile build commands reuse the saved connection and credentials.
497
-
498
- Use a Jenkins API token instead of an account password whenever possible.
499
-
500
- ---
501
-
502
- ## Configure Docker / GHCR
503
-
504
- Choose:
505
-
506
- ```text
507
- Configure
508
- └── Docker / GHCR
509
- ```
510
-
511
- The menu lets you independently change:
512
-
513
- ```text
514
- Development
515
- Production
516
- GitHub / GHCR destination
517
- Review
518
- Back
519
- ```
520
-
521
- Development and Production each store:
522
-
523
- - image name;
524
- - Dockerfile path.
525
-
526
- GitHub/GHCR stores:
527
-
528
- - personal account or organization;
529
- - selected GHCR owner.
530
-
531
- The Docker deployment Jenkins connection is configured separately under **Jenkins**.
532
-
533
- When `indraq deploy:dev` or `indraq deploy:prod` has built and pushed the image, the CLI starts the Jenkins job whose name matches the image repository name (for example `ghcr.io/indraq-innovations/immortality-accounting-service` maps to Jenkins job `immortality-accounting-service`) and supplies exactly:
534
-
535
- ```text
536
- ACTION=DEPLOY
537
- IMAGE_TAG=<primary pushed tag>
538
- IMAGE_DIGEST=<sha256 digest, when available>
539
- DEPLOYMENT_SOURCE=INDRAQ_CLI
540
- ```
541
-
542
- This is the CLI path; the Jenkinsfile may still keep its Generic Webhook Trigger for other deployment sources if you want it.
543
-
544
- ---
545
-
546
- ## Configure Mobile App
547
-
548
- Choose:
549
-
550
- ```text
551
- Configure
552
- └── Mobile App
553
- ```
554
-
555
- The menu is:
556
-
557
- ```text
558
- > Project settings
559
- Version & versionCode
560
- Development
561
- Staging
562
- Production
563
- ------------------
564
- Review Mobile App configuration
565
- Back
566
- ```
567
-
568
- ### Project settings
569
-
570
- IndraQ asks for:
571
-
572
- ```text
573
- Mobile app name
574
- Project type
575
- - Expo
576
- - React Native CLI
577
- ```
578
-
579
- The app name is saved per project and is used in the final APK/AAB filename.
580
-
581
- The mobile Jenkins job is **not configurable**. Every mobile build targets exactly:
582
-
583
- ```text
584
- Mobile app Cli build
585
- ```
586
-
587
- All mobile Development, Staging, and Production builds use the project's **Production Jenkins** connection. The CLI verifies that `Mobile app Cli build` exists before uploading source.
588
-
589
- ### Version & versionCode settings
590
-
591
- Choose:
592
-
593
- ```text
594
- Mobile App
595
- Version & versionCode
596
- ```
597
-
598
- You can configure these independently:
599
-
600
- ```text
601
- Version
602
- versionCode
603
- Auto-increment Version
604
- Auto-increment versionCode
605
- ```
606
-
607
- Defaults:
608
-
609
- ```text
610
- Version: 0.1
611
- versionCode: 1
612
- Auto-increment Version: ON
613
- Auto-increment versionCode: ON
614
- ```
615
-
616
- Auto-increment happens only after Jenkins reports `SUCCESS`. A failed build leaves both saved values unchanged.
617
-
618
- If you manually change Version/versionCode while a Jenkins build is still running, IndraQ will not overwrite your newer values when that build finishes.
619
-
620
- ### Version values survive Git clones
621
-
622
- `.indraq/mobile.json` is project configuration and should be committed. That means another developer who clones/pulls the repository receives the same next Version/versionCode.
623
-
624
- IndraQ also synchronizes the configured values into the Android-facing project file when it can do so safely:
625
-
626
- ```text
627
- Expo → app.json → expo.version + expo.android.versionCode
628
- React Native CLI → android/app/build.gradle(.kts) → versionName + versionCode
629
- ```
630
-
631
- Before a remote build, Jenkins applies the requested values again after Expo prebuild / before Gradle, so the artifact uses the values shown in the CLI build plan.
632
-
633
- After a successful build with auto-increment enabled, commit the changed `.indraq/mobile.json` and synced app-version file(s). Failed builds do not increment the shared values.
634
-
635
- ### Environment settings
636
-
637
- Each mobile environment stores:
638
-
639
- - default build output;
640
- - default build profile.
641
-
642
- Profiles:
643
-
644
- | Profile | Meaning |
645
- |---|---|
646
- | **FAST** | Fresh source snapshot; reuse project npm cache plus the Jenkins server shared Gradle cache |
647
- | **CLEAN** | Clean generated project build state before building |
648
- | **FULL_RESET** | Clear project npm/Expo/generated Android state while preserving the Jenkins server shared Gradle cache |
649
-
650
- After saving one environment you return to the Mobile App menu, so you can configure another environment without rerunning the command.
651
-
652
- ---
653
-
654
- ## Docker deployment
655
-
656
- Development:
657
-
658
- ```bash
659
- indraq deploy:dev
660
- ```
661
-
662
- Alias:
663
-
664
- ```bash
665
- indraq deploy:development
666
- ```
667
-
668
- Production:
669
-
670
- ```bash
671
- indraq deploy:prod
672
- ```
673
-
674
- Alias:
675
-
676
- ```bash
677
- indraq deploy:production
678
- ```
679
-
680
- Docker deployment still follows this flow:
681
-
682
- ```text
683
- validate Docker / GitHub / Java / Jenkins
684
-
685
- build Docker image
686
-
687
- push image to GHCR
688
-
689
- find Jenkins job with same name as image
690
-
691
- run Jenkins pipeline
692
-
693
- stream logs into terminal
694
- ```
695
-
696
- ---
697
-
698
- ## Mobile build overview
699
-
700
- > [!IMPORTANT]
701
- > **Every mobile build runs on the saved Production Jenkins connection.** `mobile:dev`, `mobile:staging`, and `mobile:prod` are mobile application environments, not Jenkins environments.
702
-
703
-
704
- The mobile module deliberately does **not** ask for:
705
-
706
- - Git repository URL;
707
- - Git branch;
708
- - app subdirectory;
709
- - pasted env text;
710
- - "save env" checkbox.
711
-
712
- Why? Because the CLI is already running inside the developer's project.
713
-
714
- ### Root directory rule
715
-
716
- Run mobile builds from the directory containing the mobile app's `package.json`.
717
-
718
- Correct:
719
-
720
- ```text
721
- my-mobile-app/
722
- ├── package.json ← run command here
723
- ├── .env
724
- ├── src/
725
- ├── android/ ← React Native CLI
726
- └── ...
727
- ```
728
-
729
- Wrong:
730
-
731
- ```text
732
- my-mobile-app/android/ ← do not run it here
733
- ```
734
-
735
- IndraQ does not silently search parent folders. If `package.json` is not in the current directory, the build stops.
736
-
737
- ---
738
-
739
- ## Mobile build matrix
740
-
741
- Invalid combinations are blocked both by the CLI **and** by the Jenkinsfile.
742
-
743
- | Project type | Environment | Allowed output |
744
- |---|---|---|
745
- | Expo | Development | **Development Client only** |
746
- | Expo | Staging | **Release APK** or **Release AAB** |
747
- | Expo | Production | **Release APK** or **Release AAB** |
748
- | React Native CLI | Development | **Debug APK only** |
749
- | React Native CLI | Staging | **Release APK** or **Release AAB** |
750
- | React Native CLI | Production | **Release APK** or **Release AAB** |
751
-
752
- The CLI does not show impossible choices during configuration.
753
-
754
- For example, Expo Development automatically becomes:
755
-
756
- ```text
757
- Build output: Development Client
758
- ```
759
-
760
- There is no pointless APK/AAB menu for that combination.
761
-
762
- ---
763
-
764
- ## Mobile build commands
765
-
766
- Development:
767
-
768
- ```bash
769
- indraq build mobile:dev
770
- ```
771
-
772
- Alias:
773
-
774
- ```bash
775
- indraq build mobile:development
776
- ```
777
-
778
- Staging:
779
-
780
- ```bash
781
- indraq build mobile:staging
782
- ```
783
-
784
- Production:
785
-
786
- ```bash
787
- indraq build mobile:prod
788
- ```
789
-
790
- Alias:
791
-
792
- ```bash
793
- indraq build mobile:production
794
- ```
795
-
796
- ### First build
797
-
798
- If required mobile configuration is missing, the CLI asks only for the missing settings and saves them.
799
-
800
- ### Later builds
801
-
802
- Once configured:
803
-
804
- ```bash
805
- indraq build mobile:staging
806
- ```
807
-
808
- uses the saved Staging output/profile without asking the same questions again.
809
-
810
- Before uploading anything, IndraQ prints a build plan and asks for confirmation.
811
-
812
- ---
813
-
814
- ## Mobile build flags
815
-
816
- Flags override saved defaults **for one build only**.
817
-
818
- They do not permanently change `mobile.json`.
819
-
820
- ### Output override
821
-
822
- ```bash
823
- indraq build mobile:staging --output aab
824
- ```
825
-
826
- Accepted output aliases:
827
-
828
- ```text
829
- dev-client / development-client
830
- debug / debug-apk
831
- apk / release-apk
832
- aab / release-aab
833
- ```
834
-
835
- The matrix is still enforced. For example, this is rejected:
836
-
837
- ```bash
838
- indraq build mobile:dev --output aab
839
- ```
840
-
841
- for an Expo Development project.
842
-
843
- ### Profile override
844
-
845
- ```bash
846
- indraq build mobile:prod --profile clean
847
- ```
848
-
849
- Available profiles:
850
-
851
- ```text
852
- fast
853
- clean
854
- full-reset
855
- ```
856
-
857
- ### Verbose Gradle logs
858
-
859
- ```bash
860
- indraq build mobile:prod --verbose
861
- ```
862
-
863
- ### Dry run
864
-
865
- Validate everything and print the plan without uploading source or starting Jenkins:
866
-
867
- ```bash
868
- indraq build mobile:staging --dry-run
869
- ```
870
-
871
- ### Skip final confirmation
872
-
873
- Useful for a developer who already knows exactly what will run:
874
-
875
- ```bash
876
- indraq build mobile:prod --yes
877
- ```
878
-
879
- Example combination:
880
-
881
- ```bash
882
- indraq build mobile:prod --output aab --profile clean --verbose --yes
883
- ```
884
-
885
- ---
886
-
887
- ## Android versioning and artifact names
888
-
889
- IndraQ v1.5.8 currently manages **Android** versioning only. iOS version/build-number management is intentionally out of scope for now.
890
-
891
- ### What value does a build use?
892
-
893
- A build uses the values currently stored in `.indraq/mobile.json`.
894
-
895
- Example before the build:
896
-
897
- ```text
898
- Version: 0.1
899
- versionCode: 1
900
- ```
901
-
902
- The Jenkins build receives exactly `0.1` and `1`, applies them to the generated/native Android Gradle project, and produces the APK/AAB with those values.
903
-
904
- Only after Jenkins finishes successfully are enabled counters advanced for the next build.
905
-
906
- ### Auto-increment examples
907
-
908
- With both switches ON:
909
-
910
- ```text
911
- Build 1 uses: 0.1 / 1
912
- Success
913
- Next saved: 0.2 / 2
914
-
915
- Build 2 uses: 0.2 / 2
916
- Success
917
- Next saved: 0.3 / 3
918
- ```
919
-
920
- If `Auto-increment Version` is OFF:
921
-
922
- ```text
923
- Version stays 0.1
924
- versionCode may still move 1 → 2 → 3
925
- ```
926
-
927
- If `Auto-increment versionCode` is OFF, IndraQ prints a warning before every mobile build because Android release stores normally expect a higher versionCode for upgrades.
928
-
929
- ### Artifact filename
930
-
931
- The Jenkins mobile pipeline renames the primary APK/AAB to:
932
-
933
- ```text
934
- <AppName>_<Version>_<versionCode>_<YYYY-MM-DD>_<HHmm>.<extension>
935
- ```
936
-
937
- Example:
938
-
939
- ```text
940
- Nefazo_User_1.4_27_2026-08-30_2051.aab
941
- ```
942
-
943
- Rules:
944
-
945
- - timezone: `Asia/Kolkata` (IST);
946
- - date: `YYYY-MM-DD`;
947
- - time: 24-hour `HHmm`;
948
- - seconds are intentionally omitted;
949
- - unsafe filename characters in the configured app name are replaced with `_`.
950
-
951
- ---
952
-
953
- ## How local source reaches Jenkins
954
-
955
- This is the mobile source-upload design.
956
-
957
- The old mobile Jenkins pipeline cloned a Git URL. The new flow builds the files that are **actually on the developer's computer right now**.
958
-
959
- ```mermaid
960
- flowchart TD
961
- A[Developer runs indraq build mobile:prod] --> B[Verify current directory is project root]
962
- B --> C[Validate Expo / React Native project]
963
- C --> D[Create clean temporary source snapshot]
964
- D --> E[Calculate SHA-256]
965
- E --> F[Upload snapshot to Jenkins]
966
- F --> G[Jenkins verifies SHA-256]
967
- G --> H[Extract source]
968
- H --> I[Build Android]
969
- I --> J[Archive APK / AAB]
970
- J --> K[Stream logs + artifact URL to terminal]
971
- ```
972
-
973
- ### What is excluded from the source snapshot?
974
-
975
- IndraQ excludes common generated/sensitive files such as:
976
-
977
- ```text
978
- .git/
979
- .indraq/
980
- node_modules/
981
- coverage/
982
- dist/
983
- build/
984
- .vscode/
985
- .idea/
986
- .env
987
- .env.*
988
- *.apk
989
- *.aab
990
- android/.gradle/
991
- android/app/build/
992
- ios/Pods/
993
- ```
994
-
995
- The source archive is created in the system temporary directory, uploaded, then deleted locally.
996
-
997
- ### Why SHA-256?
998
-
999
- The CLI calculates a SHA-256 hash before upload. Jenkins calculates it again before extraction.
1000
-
1001
- If they do not match, the build stops.
1002
-
1003
- ---
1004
-
1005
- ## Root .env behavior
1006
-
1007
- You no longer paste `.env` into Jenkins.
1008
-
1009
- For build outputs that need an environment file, IndraQ automatically uses:
1010
-
1011
- ```text
1012
- <mobile-project-root>/.env
1013
- ```
1014
-
1015
- The `.env` file is:
1016
-
1017
- 1. **not included** inside the source archive;
1018
- 2. uploaded separately as a Jenkins file parameter;
1019
- 3. copied into the temporary build source;
1020
- 4. never printed in logs;
1021
- 5. removed from the Jenkins workspace in `post { always { ... } }`.
1022
-
1023
- > [!CAUTION]
1024
- > Jenkins file parameters can remain in Jenkins build data according to your controller/plugin retention behavior. The workspace copy is deleted, but highly sensitive production secrets should still follow your normal Jenkins retention and secret-management policy.
1025
-
1026
- If a required `.env` is missing, the build stops before source upload.
1027
-
1028
- Expo Development Client does not require `.env`, but if a root `.env` exists IndraQ still supplies it automatically.
1029
-
1030
- ---
1031
-
1032
- ## Mobile Jenkins setup
1033
-
1034
- The mobile source-upload workflow requires the Jenkins **File Parameter** plugin.
1035
-
1036
- ### Step 1 — install the plugin
1037
-
1038
- In Jenkins:
1039
-
1040
- ```text
1041
- Manage Jenkins
1042
- → Plugins
1043
- Available plugins
1044
- → search: File Parameter
1045
- install "File Parameter"
1046
- ```
1047
-
1048
- Plugin ID:
1049
-
1050
- ```text
1051
- file-parameters
1052
- ```
1053
-
1054
- ### Step 2 use the IndraQ v1.5 mobile Jenkinsfile
1055
-
1056
- This repository includes:
1057
-
1058
- ```text
1059
- templates/jenkins/Jenkinsfile-Mobile-App
1060
- ```
1061
-
1062
- Use that pipeline for the Jenkins mobile build job.
1063
-
1064
- It declares two large file parameters:
1065
-
1066
- ```text
1067
- SOURCE_BUNDLE
1068
- ENV_FILE
1069
- ```
1070
-
1071
- plus normal metadata/build parameters supplied automatically by the CLI.
1072
-
1073
- > [!IMPORTANT]
1074
- > If you replace an existing Pipeline Jenkinsfile with this one, run/save the job once if Jenkins needs an initial run to register the new parameter definitions. After that the CLI uses `buildWithParameters` automatically.
1075
-
1076
- ### Step 3 — Jenkins agent paths
1077
-
1078
- Default paths in the template:
1079
-
1080
- ```text
1081
- ANDROID_HOME=/opt/android-sdk
1082
- ANDROID_SDK_ROOT=/opt/android-sdk
1083
- MOBILE_BUILDER_HOME=/opt/mobile-builder
1084
- ```
1085
-
1086
- Change the Jenkinsfile if your Jenkins agent uses different paths.
1087
-
1088
- ### Step 4 — configure the CLI
1089
-
1090
- ```bash
1091
- indraq configure
1092
- ```
1093
-
1094
- Configure the Jenkins connection once:
1095
-
1096
- ```text
1097
- Jenkins
1098
- Production
1099
- ```
1100
-
1101
- Enter the Production Jenkins URL, username, and API token. **All mobile Development, Staging, and Production builds use this Production Jenkins connection.**
1102
-
1103
- Then configure the mobile project:
1104
-
1105
- ```text
1106
- Mobile App
1107
- → Project settings
1108
- ```
1109
-
1110
- Set the app name and project type. On Jenkins, create/rename the mobile Pipeline job to exactly:
1111
-
1112
- ```text
1113
- Mobile app Cli build
1114
- ```
1115
-
1116
- The CLI checks this exact job on Production Jenkins before every mobile build.
1117
-
1118
- ### Live logs
1119
-
1120
- Mobile source upload is triggered through Jenkins HTTP `buildWithParameters`, then IndraQ follows the queue item, discovers the build number, and streams Jenkins **`logText/progressiveHtml`** into VS Code. This is the same progressive console endpoint used by the classic Jenkins browser console, so Jenkins' hidden `ConsoleNote` metadata is rendered/removed before IndraQ converts the remaining HTML to readable terminal text.
1121
-
1122
- If Jenkins fails, the CLI exits with failure, prints a short **Key Jenkins error lines** summary, and prints the direct Jenkins build URL. The complete live output remains above it.
1123
-
1124
- ---
1125
-
1126
- ## Configuration and secret storage
1127
-
1128
- Project-local configuration:
1129
-
1130
- ```text
1131
- <project>/.indraq/
1132
- ├── jenkins.json # shared — commit
1133
- ├── docker.json # shared commit
1134
- ├── mobile.json # shared — commit
1135
- ├── jenkins.local.json # machine-local ignored
1136
- └── .gitignore
1137
- ```
1138
-
1139
- The generated `.indraq/.gitignore` ignores **only machine-local files** such as `jenkins.local.json`. Shared project configuration is intentionally visible to Git.
1140
-
1141
- > [!IMPORTANT]
1142
- > v1.5.8 never adds `.indraq/` as an ignore-all rule. If a project already has a root `.gitignore`, IndraQ reuses that same file and adds `.indraq/jenkins.local.json` only when that exact rule is missing. Re-running `indraq configure` does not duplicate the entry. Known ignore-all rules created by older IndraQ versions are migrated while unrelated user ignore rules are preserved.
1143
-
1144
- ### `jenkins.json`
1145
-
1146
- Stores non-secret Jenkins metadata:
1147
-
1148
- ```text
1149
- Development Jenkins connection
1150
- Production Jenkins connection
1151
- ```
1152
-
1153
- Usage is fixed and easy to remember:
1154
-
1155
- ```text
1156
- Docker DEV → Development Jenkins
1157
- Docker PROD → Production Jenkins
1158
- Mobile DEV / STAGING / PROD → Production Jenkins
1159
- ```
1160
-
1161
- It stores Jenkins URL/transport only. It does **not** store Jenkins username, token, or password.
1162
-
1163
- The local `jenkins.local.json` contains only the machine's credential binding ID and is ignored by Git. The actual username + API token/password remain under the user's home directory.
1164
-
1165
- ### `docker.json`
1166
-
1167
- Stores:
1168
-
1169
- ```text
1170
- GitHub / GHCR owner
1171
- Development image + Dockerfile
1172
- Production image + Dockerfile
1173
- ```
1174
-
1175
- ### `mobile.json`
1176
-
1177
- Stores:
1178
-
1179
- ```text
1180
- stable project ID
1181
- app name
1182
- project type
1183
- Android Version + versionCode
1184
- auto-increment switches for Version + versionCode
1185
- Development output/profile
1186
- Staging output/profile
1187
- Production output/profile
1188
- ```
1189
-
1190
- It does **not** store `.env` values.
1191
-
1192
- ### Jenkins secret location
1193
-
1194
- Jenkins login credentials live outside the repository and never survive a Git clone:
1195
-
1196
- ```text
1197
- ~/.indraq/
1198
- └── jenkins/
1199
- └── <server-account-id>/
1200
- ├── jenkins-cli.jar
1201
- └── auth
1202
- ```
1203
-
1204
- Never commit this directory.
1205
-
1206
- ---
1207
-
1208
- ## Upgrade from v1.4 / v1.5
1209
-
1210
- Update the public package:
1211
-
1212
- ```bash
1213
- npm install -g indraq_cli@latest
1214
- ```
1215
-
1216
- Verify:
1217
-
1218
- ```bash
1219
- indraq --version
1220
- ```
1221
-
1222
- Expected for this release:
1223
-
1224
- ```text
1225
- 1.5.3
1226
- ```
1227
-
1228
- v1.5.8 automatically migrates older `.indraq/mobile.json` and Jenkins config layouts. Existing mobile environment/version settings are preserved. Older Jenkins username/server binding fields are split so only non-secret server metadata remains in tracked `jenkins.json`; the current machine binding is written to ignored `jenkins.local.json`.
1229
-
1230
- For projects coming from pre-versioning releases, Android version settings initialize as:
1231
-
1232
- ```text
1233
- Version: 0.1
1234
- versionCode: 1
1235
- Auto Version: ON
1236
- Auto versionCode: ON
1237
- ```
1238
-
1239
- Because v1.5 did not store the configured app name, open:
1240
-
1241
- ```text
1242
- indraq configure
1243
- → Mobile App
1244
- Project settings
1245
- ```
1246
-
1247
- and confirm the app name once.
1248
-
1249
- Docker/GHCR and Jenkins configuration remain compatible.
1250
-
1251
- ---
1252
-
1253
- ## Command reference
1254
-
1255
- The CLI now has a complete built-in help system, so developers do not need to open this README just to remember syntax.
1256
-
1257
- ```bash
1258
- indraq --help
1259
- indraq help
1260
- indraq help configure
1261
- indraq help docker
1262
- indraq help mobile
1263
- indraq help doctor
1264
- ```
1265
-
1266
- ### Core commands
1267
-
1268
- | Command | Purpose |
1269
- |---|---|
1270
- | `indraq --version` | Show installed CLI version |
1271
- | `indraq --help` | Show the complete command catalog, aliases, flags, mappings and examples |
1272
- | `indraq help` | Same complete command catalog |
1273
- | `indraq help <topic>` | Focused help for `configure`, `docker`, `mobile`, or `doctor` |
1274
- | `indraq doctor` | Diagnose runtime / PATH prerequisites |
1275
- | `indraq configure` | Open configuration home |
1276
-
1277
- ### Docker commands
1278
-
1279
- | Command | Purpose |
1280
- |---|---|
1281
- | `indraq deploy:dev` | Docker Development build/push/deploy |
1282
- | `indraq deploy:development` | Alias of `deploy:dev` |
1283
- | `indraq deploy:prod` | Docker Production build/push/deploy |
1284
- | `indraq deploy:production` | Alias of `deploy:prod` |
1285
- | `indraq deploy build --env dev` | Long-form Development command |
1286
- | `indraq deploy build --env development` | Long-form Development alias |
1287
- | `indraq deploy build --env prod` | Long-form Production command |
1288
- | `indraq deploy build --env production` | Long-form Production alias |
1289
- | `indraq deploy configure` | Open configuration home |
1290
- | `indraq deploy:configure` | Alias for `indraq configure` |
1291
-
1292
- ### Mobile commands
1293
-
1294
- | Command | Purpose |
1295
- |---|---|
1296
- | `indraq build mobile:dev` | Mobile Development build |
1297
- | `indraq build mobile:development` | Alias of `mobile:dev` |
1298
- | `indraq build mobile:staging` | Mobile Staging build |
1299
- | `indraq build mobile:prod` | Mobile Production build |
1300
- | `indraq build mobile:production` | Alias of `mobile:prod` |
1301
-
1302
- Mobile flags:
1303
-
1304
- ```text
1305
- --output <dev-client|development-client|client|debug|debug-apk|apk|release-apk|aab|release-aab>
1306
- --profile <fast|clean|full-reset>
1307
- --verbose
1308
- --dry-run
1309
- -y, --yes
1310
- ```
1311
-
1312
- ### Jenkins routing reminder
1313
-
1314
- ```text
1315
- Docker Development → Development Jenkins
1316
- Docker Production → Production Jenkins
1317
- Mobile Development → Production Jenkins
1318
- Mobile Staging → Production Jenkins
1319
- Mobile Production → Production Jenkins
1320
- ```
1321
-
1322
- ---
1323
-
1324
- ## Troubleshooting
1325
-
1326
- ### `Java is required for Jenkins CLI`
1327
-
1328
- Check:
1329
-
1330
- ```bash
1331
- java -version
1332
- ```
1333
-
1334
- Install Java 21 and reopen VS Code.
1335
-
1336
- ---
1337
-
1338
- ### `tar is required`
1339
-
1340
- Check:
1341
-
1342
- ```bash
1343
- tar --version
1344
- ```
1345
-
1346
- Modern Windows 10/11, macOS, and most Linux distributions already provide `tar`.
1347
-
1348
- Ubuntu/Debian:
1349
-
1350
- ```bash
1351
- sudo apt install -y tar
1352
- ```
1353
-
1354
- ---
1355
-
1356
- ### `You are not in a mobile project root`
1357
-
1358
- Run:
1359
-
1360
- ```bash
1361
- ls
1362
- ```
1363
-
1364
- or on PowerShell:
1365
-
1366
- ```powershell
1367
- Get-ChildItem
1368
- ```
1369
-
1370
- The current directory must contain:
1371
-
1372
- ```text
1373
- package.json
1374
- ```
1375
-
1376
- For React Native CLI it must also contain:
1377
-
1378
- ```text
1379
- android/
1380
- android/gradlew
1381
- ```
1382
-
1383
- ---
1384
-
1385
- ### `expo-dev-client is not installed`
1386
-
1387
- For Expo Development Client:
1388
-
1389
- ```bash
1390
- npx expo install expo-dev-client
1391
- ```
1392
-
1393
- Then retry.
1394
-
1395
- ---
1396
-
1397
- ### `.env was not found`
1398
-
1399
- Create:
1400
-
1401
- ```text
1402
- <project-root>/.env
1403
- ```
1404
-
1405
- Do not paste it into Jenkins.
1406
-
1407
- ---
1408
-
1409
- ### Jenkins HTTP 400 / file parameter error
1410
-
1411
- Make sure:
1412
-
1413
- 1. Jenkins **File Parameter** plugin is installed;
1414
- 2. the job uses `templates/jenkins/Jenkinsfile-Mobile-App` from v1.5.8;
1415
- 3. Jenkins has registered the parameters;
1416
- 4. the Jenkins job is named exactly `Mobile app Cli build`.
1417
-
1418
- ---
1419
-
1420
- ### Jenkins job not found
1421
-
1422
- For mobile, the job name is fixed. In Jenkins, create or rename the Pipeline to exactly:
1423
-
1424
- ```text
1425
- Mobile app Cli build
1426
- ```
1427
-
1428
- Then make sure `indraq configure → Jenkins → Production` points at that Jenkins controller and that this computer has valid Jenkins credentials.
1429
-
1430
- For Docker, the Jenkins job name must match the configured image name.
1431
-
1432
- ---
1433
-
1434
- ### `indraq` opens another Windows file/application
1435
-
1436
- Run:
1437
-
1438
- ```powershell
1439
- where.exe indraq
1440
- indraq doctor
1441
- ```
1442
-
1443
- The npm launcher should be the first `indraq` result.
1444
-
1445
- ---
1446
-
1447
- ### npm shows `EEXIST` for `indraq.ps1`
1448
-
1449
- This usually means an old `npm link` launcher is still present.
1450
-
1451
- Remove the old global development link/package, then reinstall:
1452
-
1453
- ```powershell
1454
- npm unlink -g indraq_cli
1455
- npm uninstall -g indraq_cli
1456
- npm install -g indraq_cli
1457
- ```
1458
-
1459
- ---
1460
-
1461
-
1462
- ### `./gradlew: cannot execute: required file not found`
1463
-
1464
- This normally means the mobile source snapshot came from Windows and `android/gradlew` contains CRLF line endings. IndraQ normalizes the wrapper automatically on Jenkins before the build and invokes it through Bash.
1465
-
1466
- The Jenkins server provides the Android toolchain:
1467
-
1468
- ```text
1469
- Java → Jenkins server
1470
- ANDROID_HOME → /opt/android-sdk
1471
- Android NDKs → /opt/android-sdk/ndk/*
1472
- Shared Gradle cache → $HOME/.gradle (normally /var/jenkins_home/.gradle)
1473
- Preferred Gradle → exact cached wrapper distribution
1474
- Server fallback → installed Gradle when it is the same major version
1475
- Final fallback → project wrapper with 120-second download timeout
1476
- ```
1477
-
1478
- This restores the shared Gradle-cache behavior used by the earlier Git-checkout mobile pipeline. `FULL_RESET` deliberately preserves the server's `$HOME/.gradle` cache.
1479
-
1480
- ### Gradle wrapper tries to download and times out
1481
-
1482
- v1.5.8 first checks the Jenkins server's shared wrapper cache. If the requested distribution is already cached, the wrapper uses it without internet access. If there is no exact cached wrapper but Jenkins has a system Gradle from the same major version, IndraQ reuses the server Gradle. Only when neither option exists does the project wrapper attempt a download, with `networkTimeout=120000` applied to the temporary Jenkins copy of `gradle-wrapper.properties`.
1483
-
1484
- If the Jenkins machine has neither a compatible installed Gradle nor the requested wrapper cached and it has no outbound access to Gradle distributions, install/cache the required Gradle version on that Jenkins machine once.
1485
-
1486
- ### Jenkins logs contain `ha:////...`, look diagonal, or are unreadable in VS Code
1487
-
1488
- The `ha:////...` strings are Jenkins `ConsoleNote` annotations embedded in raw `progressiveText`. The Jenkins browser UI renders/hides those annotations. v1.5.8 now consumes Jenkins `logText/progressiveHtml`—the same progressive endpoint used by the classic web console—and converts the rendered output back to plain terminal text.
1489
-
1490
- The CLI also normalizes line endings and strips terminal control sequences. Upgrade to v1.5.8 or newer if you see raw `ha:////...` payloads or staircase/right-shifted output.
1491
-
1492
- ---
1493
-
1494
- ## Frequently asked questions
1495
-
1496
- ### Do I install IndraQ CLI in every project?
1497
-
1498
- No. Install globally once per computer:
1499
-
1500
- ```bash
1501
- npm install -g indraq_cli
1502
- ```
1503
-
1504
- Each project only gets its own `.indraq/` configuration.
1505
-
1506
- ### Does the mobile build require me to push my latest code to Git first?
1507
-
1508
- No. The mobile builder snapshots the files currently on disk. Uncommitted changes are included.
1509
-
1510
- ### Does Jenkins need access to my GitHub repository for mobile builds?
1511
-
1512
- Not for the v1.5 source-upload pipeline. The CLI sends the source snapshot directly.
1513
-
1514
- ### Does Docker deployment still use GitHub/GHCR?
1515
-
1516
- Yes. Docker builds continue to push images to GHCR and then run the configured Jenkins deployment job.
1517
-
1518
- ### Can Staging and Production have different mobile outputs?
1519
-
1520
- Yes. Example:
1521
-
1522
- ```text
1523
- Staging: Release APK / FAST
1524
- Production: Release AAB / CLEAN
1525
- ```
1526
-
1527
- ### Can I build an APK once without changing my saved Production AAB default?
1528
-
1529
- Yes:
1530
-
1531
- ```bash
1532
- indraq build mobile:prod --output apk
1533
- ```
1534
-
1535
- The saved default remains unchanged.
1536
-
1537
- ### Does IndraQ save `.env`?
1538
-
1539
- No. It reads the root `.env` at build time and uploads it separately when required.
1540
-
1541
- ### When does Version/versionCode increment?
1542
-
1543
- After a **successful** Jenkins mobile build. The build uses the currently saved values first, then enabled counters advance for the next build. Failed/cancelled builds do not consume values.
1544
-
1545
- ### Can I turn auto-increment off?
1546
-
1547
- Yes:
1548
-
1549
- ```text
1550
- indraq configure
1551
- → Mobile App
1552
- → Version & versionCode
1553
- ```
1554
-
1555
- Version and versionCode have separate switches. When either is OFF, the build continues but IndraQ prints a reminder warning.
1556
-
1557
- ### What timezone is used in APK/AAB filenames?
1558
-
1559
- Always `Asia/Kolkata` (IST), using `YYYY-MM-DD_HHmm`.
1560
-
1561
- ### Which Jenkins does Mobile use?
1562
-
1563
- **Production Jenkins only.** This is intentional.
1564
-
1565
- ```text
1566
- mobile:dev → Production Jenkins
1567
- mobile:staging → Production Jenkins
1568
- mobile:prod → Production Jenkins
1569
- ```
1570
-
1571
- The mobile Development/Staging/Production selection controls the app build environment and allowed output. It does not select a Jenkins controller.
1572
-
1573
- ### Why can Docker use Development and Production Jenkins?
1574
-
1575
- Docker deployments represent infrastructure environments. `indraq deploy:dev` can deploy through Development Jenkins while `indraq deploy:prod` can use Production Jenkins. Mobile builds are build jobs rather than Docker environment deployments, so they always use the single Production Jenkins path.
1576
-
1577
- ---
1578
-
1579
- ## Project architecture
1580
-
1581
- ```text
1582
- src/
1583
- ├── cli/
1584
- │ ├── create-program.ts
1585
- │ └── doctor.command.ts
1586
-
1587
- ├── modules/
1588
- │ ├── configure/
1589
- │ │ └── configure.command.ts
1590
- │ │
1591
- │ ├── deploy/
1592
- │ │ ├── commands/
1593
- │ │ ├── config/
1594
- │ │ └── services/
1595
- │ │
1596
- │ └── mobile/
1597
- │ ├── commands/
1598
- │ │ ├── configure-mobile.command.ts
1599
- │ │ └── build-mobile.command.ts
1600
- │ ├── config/
1601
- │ │ └── mobile-config.ts
1602
- │ └── services/
1603
- │ ├── project.service.ts
1604
- │ ├── source-bundle.service.ts
1605
- │ └── jenkins-mobile.service.ts
1606
-
1607
- └── shared/
1608
- ├── config/
1609
- ├── git/
1610
- ├── github/
1611
- ├── jenkins/
1612
- └── runtime/
1613
-
1614
- templates/
1615
- └── jenkins/
1616
- └── Jenkinsfile-Mobile-App
1617
- ```
1618
-
1619
- This is intentional. Future modules can be added without dumping unrelated logic into the deployment module.
1620
-
1621
- Possible future commands:
1622
-
1623
- ```text
1624
- indraq database ...
1625
- indraq backup ...
1626
- indraq server ...
1627
- indraq secrets ...
1628
- indraq diagnostics ...
1629
- ```
1630
-
1631
- ---
1632
-
1633
- ## Final checklist
1634
-
1635
- ### Developer machine
1636
-
1637
- - [ ] Node.js 22+ installed
1638
- - [ ] npm installed
1639
- - [ ] Java available with `java -version`
1640
- - [ ] Git installed
1641
- - [ ] `tar` available
1642
- - [ ] Docker installed if using Docker deployment
1643
- - [ ] `npm install -g indraq_cli` completed
1644
- - [ ] `indraq doctor` passes
1645
-
1646
- ### Docker deployment project
1647
-
1648
- - [ ] `indraq configure → Jenkins → Development/Production`
1649
- - [ ] `indraq configure → Docker / GHCR`
1650
- - [ ] Dockerfile exists
1651
- - [ ] GitHub/GHCR authentication works
1652
- - [ ] Jenkins deployment job names match image names
1653
-
1654
- ### Mobile project
1655
-
1656
- - [ ] command is run from package.json root
1657
- - [ ] Production Jenkins connection configured (`indraq configure → Jenkins → Production`)
1658
- - [ ] Jenkins File Parameter plugin installed
1659
- - [ ] Jenkins job uses the v1.5.8 mobile Jenkinsfile
1660
- - [ ] Mobile project type configured
1661
- - [ ] Jenkins job is named exactly `Mobile app Cli build` and exists on Production Jenkins
1662
- - [ ] Development / Staging / Production defaults configured as needed
1663
- - [ ] root `.env` exists for APK/AAB/debug builds
1664
- - [ ] Expo Development Client has `expo-dev-client`
1665
- - [ ] `.indraq/mobile.json` is not ignored and is committed so Version/versionCode survive across developers
1666
-
1667
- ---
1668
-
1669
- ## License
1670
-
1671
- MIT License. See [`LICENSE`](LICENSE).
1672
-
1673
- <p align="center">
1674
- <img src="docs/assets/indraq-mark.png" alt="IndraQ" width="72" />
1675
- </p>
1676
-
1677
- <p align="center">
1678
- <strong>Built and maintained by IndraQ Innovations.</strong>
1679
- </p>
1680
-
1681
-
1682
- ### Jenkins mobile upload returns HTTP 403
1683
-
1684
- IndraQ CLI v1.5.8 preserves the Jenkins web-session cookie together with the CSRF crumb when a Jenkins username/password is used. Jenkins ties crumbs to the session that created them, so both values must travel together. API-token authentication is exempt from the crumb requirement.
1685
-
1686
- If a mobile build still returns HTTP 403, v1.5.8 prints Jenkins' own response message. A permission error means the configured Jenkins user needs **Job/Read** and **Job/Build** on the `Mobile app Cli build` job. A CSRF error means the Jenkins controller or reverse proxy is rejecting the crumb/session and the printed Jenkins message should be used for diagnosis.
1
+ # IndraQ CLI
2
+
3
+ IndraQ CLI is a cloud-first developer and DevOps command-line platform for creating projects, configuring reusable infrastructure credentials, managing users, and reconciling deployments across GHCR, Jenkins, AWS Route53, and Nginx Proxy Manager.
4
+
5
+ The goal is simple: developers should work with understandable names such as `production`, `staging`, `api.example.com`, and `order-service` instead of remembering server IP addresses, Jenkins details, registry paths, or provider credentials for every project.
6
+
7
+ ## What IndraQ manages
8
+
9
+ IndraQ has two kinds of configuration:
10
+
11
+ ### User-level reusable credentials
12
+
13
+ Each IndraQ user owns their own provider credentials. They can reuse the same credentials across all projects they can access.
14
+
15
+ Supported reusable providers:
16
+
17
+ - AWS
18
+ - Nginx Proxy Manager (NPM)
19
+ - Jenkins Development
20
+ - Jenkins Production
21
+ - GitHub Container Registry (GHCR)
22
+
23
+ Credentials are stored in IndraQ Cloud. They are not copied into every project.
24
+
25
+ ### Project-level infrastructure
26
+
27
+ Each project stores only the infrastructure associated with that project, for example:
28
+
29
+ - GHCR image repository
30
+ - Jenkins deployment job
31
+ - Route53 record
32
+ - Route53 routing policy
33
+ - Route53 health checks
34
+ - NPM proxy host
35
+ - selected shared environment
36
+ - host/container ports
37
+
38
+ A local IndraQ project keeps the Cloud project ID in `.indraq/project.json`. Provider secrets are not stored in the project folder.
39
+
40
+ ---
41
+
42
+ # 1. Roles and permissions
43
+
44
+ IndraQ Cloud supports three roles.
45
+
46
+ | Role | Main access |
47
+ | --- | --- |
48
+ | `user` | View the organization project catalog, create projects, configure their own provider credentials, use shared environments, run prebuild/deploy only on projects where they have WRITE access, retrieve/rotate their own managed AWS IAM credential |
49
+ | `manager` | Everything a user can do, plus create/manage normal users, rotate managed users' AWS keys, update/delete Cloud projects with a reason, manage project membership/resource access, and view audit logs |
50
+ | `admin` | Full access, including create managers/admins, change roles, rotate any managed AWS key, manage projects/members/resource access, manage shared environments and Route53 health checks, configure AWS policy mappings, and view audit logs |
51
+
52
+ Important rules:
53
+
54
+ - Managers can create normal users only.
55
+ - Only admins can create another manager or admin.
56
+ - Only admins can change a user's IndraQ role.
57
+ - Only admins can create/update/delete shared environments.
58
+ - Every user has their own AWS/NPM/Jenkins/GHCR provider credentials.
59
+ - Shared environments are visible to authenticated users, but only admins manage them.
60
+ - Route53 health checks can be listed/selected by users and managers, but only admins create/delete them.
61
+ - Organization projects are visible to every authenticated user; VIEW vs WRITE controls whether infrastructure can be changed.
62
+
63
+ ---
64
+
65
+ # 2. System architecture
66
+
67
+ A typical installation looks like this:
68
+
69
+ ```text
70
+ Developer workstation
71
+ |
72
+ | indraq CLI
73
+ v
74
+ IndraQ Cloud API
75
+ |
76
+ +-- PostgreSQL
77
+ |
78
+ +-- user credentials
79
+ | +-- AWS
80
+ | +-- NPM
81
+ | +-- Jenkins DEV
82
+ | +-- Jenkins PROD
83
+ | +-- GHCR
84
+ |
85
+ +-- shared environments
86
+ |
87
+ +-- projects
88
+ +-- GHCR image
89
+ +-- Jenkins job
90
+ +-- Route53 record / health checks
91
+ +-- NPM proxy
92
+ ```
93
+
94
+ Example shared environments:
95
+
96
+ ```text
97
+ production-api -> 10.0.0.10
98
+ production-backup -> 10.0.0.11
99
+ staging -> 10.0.1.10
100
+ qa -> 10.0.2.20
101
+ client-a -> 192.0.2.25
102
+ ```
103
+
104
+ Environment names are completely arbitrary. There is no fixed `PRIMARY` or `SECONDARY` environment type.
105
+
106
+ For a Route53 FAILOVER record, the user chooses which environment acts as PRIMARY and which acts as SECONDARY for that particular DNS record.
107
+
108
+ ---
109
+
110
+ # 3. Requirements
111
+
112
+ ## CLI workstation
113
+
114
+ Required:
115
+
116
+ - Node.js 22 or newer
117
+ - npm
118
+ - Git
119
+
120
+ Recommended/required depending on the workflow:
121
+
122
+ - Docker, for GHCR image login/build/push
123
+ - network access to IndraQ Cloud API
124
+ - network access to Jenkins/NPM/AWS/GitHub used by that user
125
+
126
+ ## Cloud server
127
+
128
+ Required:
129
+
130
+ - Node.js 22 or newer
131
+ - PostgreSQL
132
+ - a persistent `MASTER_KEY`
133
+ - a strong `JWT_SECRET`
134
+
135
+ ## Jenkins
136
+
137
+ For deployment creation and unified Jenkins user management, Jenkins must allow the account configured in IndraQ to perform the required administrative operations.
138
+
139
+ The included reference pipeline is:
140
+
141
+ ```text
142
+ docs/CREATE-DEPLOYMENT-reference.groovy
143
+ ```
144
+
145
+ For its live parameter UI, Jenkins Active Choices is required. Role assignment for Jenkins users requires the Jenkins Role Strategy setup expected by your Jenkins instance.
146
+
147
+ IndraQ handles Jenkins CSRF crumbs together with the Jenkins web session when `/scriptText` administration is required.
148
+
149
+ ---
150
+
151
+ # 4. Install and start IndraQ Cloud API
152
+
153
+ Open the Cloud API folder:
154
+
155
+ ```powershell
156
+ cd cloud-api
157
+ npm install
158
+ ```
159
+
160
+ Copy the example environment file:
161
+
162
+ ```powershell
163
+ Copy-Item .env.example .env
164
+ ```
165
+
166
+ Edit `.env`:
167
+
168
+ ```env
169
+ PORT=4010
170
+ DATABASE_URL=postgresql://indraq:change-me@127.0.0.1:5432/indraq_cloud
171
+ JWT_SECRET=replace-with-at-least-32-random-characters
172
+ MASTER_KEY=replace-with-exactly-64-hex-characters
173
+ BOOTSTRAP_ADMIN_EMAIL=admin@example.com
174
+ BOOTSTRAP_ADMIN_PASSWORD=use-a-strong-password
175
+ ```
176
+
177
+ Requirements:
178
+
179
+ - `JWT_SECRET`: at least 32 characters
180
+ - `MASTER_KEY`: exactly 64 hexadecimal characters (32 bytes)
181
+ - `BOOTSTRAP_ADMIN_PASSWORD`: at least 12 characters
182
+
183
+ Generate a valid master key with Node:
184
+
185
+ ```powershell
186
+ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
187
+ ```
188
+
189
+ Generate a JWT secret:
190
+
191
+ ```powershell
192
+ node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"
193
+ ```
194
+
195
+ Build and start:
196
+
197
+ ```powershell
198
+ npm run build
199
+ npm run dev
200
+ ```
201
+
202
+ Production start:
203
+
204
+ ```powershell
205
+ npm run build
206
+ npm start
207
+ ```
208
+
209
+ Expected startup message:
210
+
211
+ ```text
212
+ IndraQ Cloud API listening on 4010
213
+ ```
214
+
215
+ ## Database migrations
216
+
217
+ SQL migrations in `cloud-api/sql/` are applied automatically when the Cloud API starts.
218
+
219
+ You do not normally need to run migration files manually.
220
+
221
+ ## Bootstrap administrator
222
+
223
+ If no admin exists, the Cloud API creates the first administrator from:
224
+
225
+ ```env
226
+ BOOTSTRAP_ADMIN_EMAIL=...
227
+ BOOTSTRAP_ADMIN_PASSWORD=...
228
+ ```
229
+
230
+ After the first administrator is created, remove the bootstrap password from the long-running production environment if your deployment process allows it.
231
+
232
+ Do not change or lose `MASTER_KEY` after secrets have been stored. The same key is required to decrypt provider credentials later.
233
+
234
+ ---
235
+
236
+ # 5. Build and install the CLI
237
+
238
+ From the repository root:
239
+
240
+ ```powershell
241
+ npm install
242
+ npm run build
243
+ npm test
244
+ npm link
245
+ ```
246
+
247
+ Confirm installation:
248
+
249
+ ```powershell
250
+ indraq --version
251
+ indraq --help
252
+ ```
253
+
254
+ Run diagnostics:
255
+
256
+ ```powershell
257
+ indraq doctor
258
+ ```
259
+
260
+ ---
261
+
262
+ # 6. Login to IndraQ Cloud
263
+
264
+ The official IndraQ Cloud API URL is built into the CLI (`https://api.indraq.com`). Users do not configure a backend URL.
265
+
266
+ After installing the npm package, login directly:
267
+
268
+ ```powershell
269
+ indraq login
270
+ ```
271
+
272
+ Check the active identity:
273
+
274
+ ```powershell
275
+ indraq whoami
276
+ ```
277
+
278
+ Logout:
279
+
280
+ ```powershell
281
+ indraq logout
282
+ ```
283
+
284
+ The aliases below also work:
285
+
286
+ ```powershell
287
+ indraq cloud login
288
+ indraq cloud whoami
289
+ indraq cloud logout
290
+ ```
291
+
292
+ ---
293
+
294
+ # 7. Shared environments
295
+
296
+ An environment is a friendly name bound to a reusable server IP.
297
+
298
+ Examples:
299
+
300
+ ```text
301
+ production
302
+ production-backup
303
+ staging
304
+ qa
305
+ client-a
306
+ mumbai-app-01
307
+ ```
308
+
309
+ There is no limit such as one primary and one secondary environment. Admins can create as many environments as required and name them freely.
310
+
311
+ ## Create an environment
312
+
313
+ Admin only:
314
+
315
+ ```powershell
316
+ indraq environment create
317
+ ```
318
+
319
+ The wizard asks for values such as:
320
+
321
+ - environment name
322
+ - description
323
+ - server IPv4 address
324
+ - region (optional/useful for latency routing)
325
+ - audit reason
326
+
327
+ ## List environments
328
+
329
+ ```powershell
330
+ indraq environment list
331
+ ```
332
+
333
+ ## Update an environment
334
+
335
+ ```powershell
336
+ indraq environment update production
337
+ ```
338
+
339
+ ## Delete an environment
340
+
341
+ ```powershell
342
+ indraq environment delete production
343
+ ```
344
+
345
+ Environments are shared infrastructure shortcuts. Provider credentials are still private per IndraQ user.
346
+
347
+ ---
348
+
349
+ # 8. Configure reusable provider credentials
350
+
351
+ The easiest entry point is:
352
+
353
+ ```powershell
354
+ indraq configure
355
+ ```
356
+
357
+ Or configure one provider directly:
358
+
359
+ ```powershell
360
+ indraq provider configure aws
361
+ indraq provider configure npm
362
+ indraq provider configure jenkins-dev
363
+ indraq provider configure jenkins-prod
364
+ indraq provider configure ghcr
365
+ ```
366
+
367
+ List configured provider profiles:
368
+
369
+ ```powershell
370
+ indraq provider list
371
+ ```
372
+
373
+ Secrets are never printed by `provider list`.
374
+
375
+ ## AWS provider
376
+
377
+ ```powershell
378
+ indraq provider configure aws
379
+ ```
380
+
381
+ The wizard validates AWS access and can configure:
382
+
383
+ - AWS region
384
+ - access key ID
385
+ - secret access key
386
+ - optional session token
387
+ - default hosted zone
388
+ - default managed IAM policies by IndraQ role
389
+
390
+ ### AWS policy mapping
391
+
392
+ Admins can define managed policy ARNs for:
393
+
394
+ ```text
395
+ USER
396
+ MANAGER
397
+ ADMIN
398
+ ```
399
+
400
+ Managers can configure the policy mapping needed for normal users but cannot elevate users to manager/admin.
401
+
402
+ When unified AWS user creation is used, IndraQ applies the policies for the selected Cloud role. If the role changes later, IndraQ removes old IndraQ-managed role policies before applying the new role mapping so stale elevated access is not intentionally retained by the CLI.
403
+
404
+ You can still explicitly provide policies when using low-level IAM commands if required.
405
+
406
+ ## Nginx Proxy Manager provider
407
+
408
+ ```powershell
409
+ indraq provider configure npm
410
+ ```
411
+
412
+ Enter:
413
+
414
+ - NPM URL
415
+ - NPM administrator email
416
+ - NPM administrator password
417
+
418
+ IndraQ validates the credentials before storing them.
419
+
420
+ ## Jenkins provider
421
+
422
+ Development Jenkins:
423
+
424
+ ```powershell
425
+ indraq provider configure jenkins-dev
426
+ ```
427
+
428
+ Production Jenkins:
429
+
430
+ ```powershell
431
+ indraq provider configure jenkins-prod
432
+ ```
433
+
434
+ Enter:
435
+
436
+ - Jenkins URL
437
+ - Jenkins username
438
+ - Jenkins API token/password
439
+
440
+ IndraQ validates authentication before storing the profile.
441
+
442
+ ## GHCR provider
443
+
444
+ ```powershell
445
+ indraq provider configure ghcr
446
+ ```
447
+
448
+ Enter:
449
+
450
+ - registry host, normally `ghcr.io`
451
+ - GitHub token with the package permissions needed by your workflow
452
+
453
+ After authentication, IndraQ fetches:
454
+
455
+ - the authenticated GitHub account
456
+ - organizations visible to that token
457
+
458
+ The user selects the owner instead of typing a hardcoded organization name.
459
+
460
+ Example generated image path:
461
+
462
+ ```text
463
+ ghcr.io/acme-platform/order-service
464
+ ```
465
+
466
+ No organization name is hardcoded into IndraQ.
467
+
468
+ If GitHub cannot enumerate the required organization for the supplied token, manual owner entry remains available as a fallback.
469
+
470
+ ---
471
+
472
+ # 9. User management
473
+
474
+ Use unified user management when the same person needs accounts across IndraQ Cloud, AWS, NPM, and Jenkins.
475
+
476
+ ## Create a user
477
+
478
+ ```powershell
479
+ indraq user create
480
+ ```
481
+
482
+ The wizard asks for:
483
+
484
+ - username
485
+ - providers to create/manage
486
+ - Cloud role (`user`, `manager`, `admin`) when permitted
487
+ - email
488
+ - temporary first-login password generated by IndraQ (shown once to the operator)
489
+ - provider-specific settings where required
490
+
491
+ You can also use flags:
492
+
493
+ ```powershell
494
+ indraq user create hk --providers cloud,aws,npm,jenkins --role user
495
+ ```
496
+
497
+ Provider-selection flags also exist:
498
+
499
+ ```powershell
500
+ --cloud
501
+ --aws
502
+ --npm
503
+ --jenkins
504
+ ```
505
+
506
+ ### Role rules
507
+
508
+ Manager creating a user:
509
+
510
+ ```text
511
+ allowed role: user
512
+ ```
513
+
514
+ Admin creating a user:
515
+
516
+ ```text
517
+ allowed roles: user, manager, admin
518
+ ```
519
+
520
+ ### Unified creation safety
521
+
522
+ Before creating accounts in multiple providers, IndraQ preflights Jenkins administration when Jenkins is selected.
523
+
524
+ If a later provider fails after creation has started, IndraQ performs best-effort rollback of providers created by that command.
525
+
526
+ Always review the provider result summary after a failed operation.
527
+
528
+ ## Update a user
529
+
530
+ ```powershell
531
+ indraq user update hk
532
+ ```
533
+
534
+ Examples:
535
+
536
+ ```powershell
537
+ indraq user update hk --role manager
538
+ indraq user update hk --providers cloud,aws
539
+ ```
540
+
541
+ Only an admin can change Cloud roles.
542
+
543
+ ## Delete a user
544
+
545
+ ```powershell
546
+ indraq user delete hk
547
+ ```
548
+
549
+ Skip the confirmation only when you intentionally want non-interactive deletion:
550
+
551
+ ```powershell
552
+ indraq user delete hk --yes
553
+ ```
554
+
555
+
556
+ ## First login and password reset
557
+
558
+ When a manager/admin creates a Cloud user, IndraQ generates a temporary password. It is intended only for the first login. On first `indraq login`, the user must choose a new password before other Cloud commands are allowed. Managed NPM/Jenkins identities created by the unified user workflow are rotated to the same new password.
559
+
560
+ Self-service password recovery uses an email OTP:
561
+
562
+ ```powershell
563
+ indraq password reset
564
+ indraq password reset --email user@example.com --cloud
565
+ indraq password reset --email user@example.com --npm
566
+ indraq password reset --email user@example.com --jenkins
567
+ indraq password reset --email user@example.com --all
568
+ ```
569
+
570
+ `--all` means Cloud + NPM + Jenkins. AWS is intentionally excluded because IndraQ AWS users use access keys rather than console passwords. The Cloud API requires SMTP configuration (`SMTP_HOST`, `SMTP_PORT`, `SMTP_SECURE`, `SMTP_USER`, `SMTP_PASS`, `SMTP_FROM`).
571
+
572
+ List/update/delete workflows are searchable and selectable rather than requiring users to remember exact identities. By default list commands return 10 rows; use `--search`, `--limit`, or `--all` where available. This applies to organization users, AWS IAM users/records, NPM users/proxies, Jenkins users/jobs, projects, environments, health checks, and logs.
573
+
574
+ ---
575
+
576
+ # 10. AWS IAM CLI users and recoverable access keys
577
+
578
+ AWS does not provide the original secret access key again after access-key creation.
579
+
580
+ When IndraQ creates an AWS IAM user through the unified user workflow, IndraQ stores the generated AWS secret encrypted in IndraQ Cloud and links it to that Cloud user.
581
+ IndraQ also attaches an `IndraQBaseRole` inline IAM policy automatically according to the selected IndraQ `user`, `manager`, or `admin` role. Optional AWS managed-policy mappings configured by an operator are reconciled on top of that base role.
582
+
583
+
584
+ The user sees the key at creation time and can retrieve their own stored credential later after logging into their IndraQ account. Access keys can also be rotated through IndraQ without losing the encrypted recovery copy.
585
+
586
+ Create an IAM CLI user directly:
587
+
588
+ ```powershell
589
+ indraq iam user:create hk
590
+ ```
591
+
592
+ Delete:
593
+
594
+ ```powershell
595
+ indraq iam user:delete hk
596
+ ```
597
+
598
+ Retrieve the current logged-in user's stored unified AWS credential:
599
+
600
+ ```powershell
601
+ indraq iam credentials hk
602
+ ```
603
+
604
+ Rotate an access key:
605
+
606
+ ```powershell
607
+ indraq iam access-key rotate
608
+ ```
609
+
610
+ A normal user can rotate only their own IndraQ-managed AWS key. Managers/admins can select managed organization users across the organization. IndraQ creates the replacement key, stores it encrypted, updates the target user's reusable AWS provider credential, and only then deletes the previous managed key. Rotation is audited. If the IAM user already has two keys, IndraQ stops rather than deleting an unknown/unmanaged key.
611
+
612
+ Important security behavior:
613
+
614
+ - the target Cloud user can retrieve their own stored AWS secret
615
+ - normal users cannot resolve another user's provider credentials
616
+ - retrieval is audited
617
+ - provider-resolution responses use `Cache-Control: no-store`
618
+ - AWS console login profiles are intentionally not created by these IAM CLI-user flows
619
+
620
+ If an AWS key is exposed publicly, rotate/delete it immediately even if IndraQ has an encrypted copy.
621
+
622
+ ---
623
+
624
+ # 11. Create a project with `indraq init`
625
+
626
+ The recommended project entry point is:
627
+
628
+ ```powershell
629
+ indraq init
630
+ ```
631
+
632
+ Or initialize another directory:
633
+
634
+ ```powershell
635
+ indraq init my-app
636
+ ```
637
+
638
+ ## Login check
639
+
640
+ `init` verifies that the user is connected and authenticated to IndraQ Cloud. If required, it guides the user through Cloud configuration/login.
641
+
642
+ ## New project
643
+
644
+ The wizard supports:
645
+
646
+ - Frontend
647
+ - Backend
648
+ - Frontend + Backend
649
+ - Mobile App
650
+
651
+ Web/frontend options include supported project templates such as Vite/React/Next/vanilla depending on the selected flow.
652
+
653
+ Backend scaffolding includes Express and optional integrations selected in the wizard.
654
+
655
+ ## Dependency installation
656
+
657
+ For web projects, IndraQ links the project to Cloud **before** dependency installation.
658
+
659
+ This is deliberate. If npm is unavailable, a registry is temporarily unreachable, or installation fails, the Cloud project is not lost.
660
+
661
+ IndraQ:
662
+
663
+ 1. creates the project files
664
+ 2. creates/links the Cloud project
665
+ 3. runs npm installation
666
+ 4. retries compatible npm execution paths where appropriate
667
+ 5. reports any component where installation is still pending
668
+ 6. continues the project/infrastructure workflow
669
+
670
+ If npm still cannot install dependencies, the CLI prints the exact folders where you should run:
671
+
672
+ ```powershell
673
+ npm install
674
+ ```
675
+
676
+ You can intentionally skip installation:
677
+
678
+ ```powershell
679
+ indraq init --skip-install
680
+ ```
681
+
682
+ Generated npm package names are sanitized so display names containing spaces or uppercase characters do not create invalid package names.
683
+
684
+ ## Full setup vs project only
685
+
686
+ After project creation, choose:
687
+
688
+ ```text
689
+ Full setup now GHCR + Jenkins + Route53 + NPM
690
+ ```
691
+
692
+ or:
693
+
694
+ ```text
695
+ Project only — I will run prebuild later
696
+ ```
697
+
698
+ Choosing project-only still leaves a valid Cloud-linked project.
699
+
700
+ Run infrastructure setup later with:
701
+
702
+ ```powershell
703
+ indraq prebuild
704
+ ```
705
+
706
+ ## Existing IndraQ project
707
+
708
+ If `.indraq/project.json` already exists, `init` does not blindly recreate the application.
709
+
710
+ It checks the existing Cloud project and offers to reconcile pending:
711
+
712
+ - GHCR
713
+ - Jenkins
714
+ - Route53
715
+ - NPM
716
+
717
+ This means rerunning `indraq init` is useful when a previous setup was intentionally skipped or interrupted.
718
+
719
+ ## Existing non-IndraQ project
720
+
721
+ If files already exist but the folder was not initialized by IndraQ, the CLI warns that generated files may be overwritten.
722
+
723
+ It requires two confirmations, including typing:
724
+
725
+ ```text
726
+ OVERWRITE
727
+ ```
728
+
729
+ No existing project should be overwritten silently.
730
+
731
+ ---
732
+
733
+ # 12. Project Cloud registration and linking
734
+
735
+ ## Register an existing application without running `init`
736
+
737
+ If you already have a project and only want IndraQ to manage its Cloud identity/infrastructure, run this from the existing project folder:
738
+
739
+ ```powershell
740
+ indraq project create
741
+ ```
742
+
743
+ This command is intentionally non-destructive. It:
744
+
745
+ - verifies your IndraQ Cloud login
746
+ - detects sensible defaults from `package.json` when possible
747
+ - asks for project type/framework/port metadata where needed
748
+ - creates the Cloud project
749
+ - creates only `.indraq/project.json` locally
750
+
751
+ It does **not** scaffold source code, run `npm install`, generate a Dockerfile, create AWS records, create NPM proxies, create Jenkins jobs, configure GHCR, run prebuild, or deploy anything.
752
+
753
+ Example for an existing Express API:
754
+
755
+ ```powershell
756
+ cd cloud-api
757
+ indraq project create cloud-api --kind backend --framework express --port 4010 --health /health
758
+ ```
759
+
760
+ After that you can run infrastructure commands independently:
761
+
762
+ ```powershell
763
+ indraq dockerfile create
764
+ indraq jenkins create-deployment
765
+ indraq healthcheck list
766
+ indraq healthcheck create
767
+ indraq healthcheck delete
768
+
769
+ indraq dns create
770
+ indraq proxy create
771
+ ```
772
+
773
+ Or reconcile everything later:
774
+
775
+ ```powershell
776
+ indraq prebuild
777
+ ```
778
+
779
+ If an accessible Cloud project with the same name already exists, IndraQ offers to link the folder to it instead of silently creating a duplicate.
780
+
781
+ ## Sync older IndraQ project metadata
782
+
783
+ For folders already initialized by an older IndraQ metadata format, create/update the Cloud project with:
784
+
785
+ ```powershell
786
+ indraq project sync
787
+ ```
788
+
789
+ Check infrastructure associations:
790
+
791
+ ```powershell
792
+ indraq project status
793
+ ```
794
+
795
+ The local project file becomes Cloud-oriented and primarily stores the project ID.
796
+
797
+ Example:
798
+
799
+ ```json
800
+ {
801
+ "schemaVersion": 3,
802
+ "projectId": "..."
803
+ }
804
+ ```
805
+
806
+ Provider passwords/tokens are not supposed to live in that file.
807
+
808
+ ## Re-link a folder when `.indraq/project.json` is missing
809
+
810
+ If the local project reference is deleted accidentally, do **not** recreate the project. Run:
811
+
812
+ ```powershell
813
+ indraq project link
814
+ ```
815
+
816
+ IndraQ lists the Cloud projects the logged-in user is allowed to access. Selecting one recreates only `.indraq/project.json`; application files are not modified.
817
+
818
+ Every authenticated organization user can discover and view the project catalog. `indraq project list` shows whether the current account has `VIEW` or `WRITE` access. Managers/admins can manage project membership with audited reasons:
819
+
820
+ ```powershell
821
+ indraq project add user
822
+ indraq project delete user
823
+ ```
824
+
825
+ VIEW access allows discovery/linking/inspection. WRITE access is required for infrastructure-changing commands such as prebuild. Cloud project update/delete remains manager/admin controlled and audited.
826
+
827
+ ## Project resource access
828
+
829
+ Project membership and provider-resource access are separate. Managers/admins can grant or revoke access to AWS, NPM, Jenkins, or all supported project resources:
830
+
831
+ ```powershell
832
+ indraq access add user
833
+ indraq access delete user
834
+ ```
835
+
836
+ For AWS, IndraQ generates record-name/record-type/action conditions for granted Route53 records and exact health-check ARN permissions. AWS cannot safely hide individual records if `ListResourceRecordSets` is granted, so normal-user workflows rely on the IndraQ project inventory rather than broad hosted-zone listing.
837
+
838
+ For Jenkins, IndraQ synchronizes Role Strategy item roles for the selected deployment jobs.
839
+
840
+ For NPM, normal users retain NPM's creator-owned `visibility=user` model. IndraQ records project/resource grants but does not switch accounts to `visibility=all`, because that would expose proxy hosts created by other users.
841
+
842
+ ---
843
+
844
+ # 13. Prebuild: reconcile the complete web deployment
845
+
846
+ For a Cloud-linked web project, run:
847
+
848
+ ```powershell
849
+ indraq prebuild
850
+ ```
851
+
852
+ Prebuild is an infrastructure reconciler. It checks what already exists, creates missing resources, and repairs supported stale associations instead of assuming every run starts from zero.
853
+
854
+ Typical order:
855
+
856
+ ```text
857
+ User provider credentials
858
+ |
859
+ v
860
+ GHCR project image
861
+ |
862
+ v
863
+ Jenkins host-port validation
864
+ |
865
+ v
866
+ Jenkins deployment job
867
+ |
868
+ v
869
+ Route53 record + selected existing health checks
870
+ |
871
+ v
872
+ Verify Route53 prerequisite
873
+ |
874
+ v
875
+ NPM proxy + SSL
876
+ ```
877
+
878
+ ## Missing provider configuration
879
+
880
+ If required reusable credentials are missing, IndraQ warns and offers to configure them instead of immediately failing with an unexplained configuration error.
881
+
882
+ ## Shared environment or custom target
883
+
884
+ For infrastructure targets, users can select an admin-created shared environment.
885
+
886
+ Where supported, a custom IP/hostname option remains available for exceptional cases.
887
+
888
+ ---
889
+
890
+ # 14. Route53 DNS
891
+
892
+ Standalone DNS wizard:
893
+
894
+ ```powershell
895
+ indraq dns create
896
+ ```
897
+
898
+ Other useful commands:
899
+
900
+ ```powershell
901
+ indraq dns zones
902
+ indraq dns records
903
+ indraq dns update
904
+ indraq dns delete
905
+ ```
906
+
907
+ Supported routing choices for managed A-record flows:
908
+
909
+ ```text
910
+ SIMPLE
911
+ FAILOVER
912
+ WEIGHTED
913
+ LATENCY
914
+ ```
915
+
916
+ ## FAILOVER
917
+
918
+ For FAILOVER, the user chooses any two environments:
919
+
920
+ ```text
921
+ PRIMARY target -> production
922
+ SECONDARY target -> production-backup
923
+ ```
924
+
925
+ The environments themselves are not permanently primary/secondary.
926
+
927
+ The same environment can play a different role for another DNS record.
928
+
929
+ ## Route53 health checks
930
+
931
+ DNS creation does **not** create health checks automatically. Users and managers select from health checks that already exist in Route53. Only an IndraQ admin can create or delete health checks:
932
+
933
+ ```powershell
934
+ indraq healthcheck list
935
+ indraq healthcheck create
936
+ indraq healthcheck delete
937
+ ```
938
+
939
+ `healthcheck list` is available for selection/search. `healthcheck create` asks for the real AWS endpoint settings (IP/FQDN, protocol, port, path where applicable, request interval, failure threshold, and latency measurement).
940
+
941
+ Routing behavior is enforced:
942
+
943
+ - `SIMPLE`: no health check is attached.
944
+ - `FAILOVER`: select existing PRIMARY and SECONDARY health checks.
945
+ - `WEIGHTED` / `LATENCY`: attaching an existing health check is optional.
946
+
947
+ ## WEIGHTED
948
+
949
+ IndraQ asks for primary/secondary weights.
950
+
951
+ ## LATENCY
952
+
953
+ IndraQ asks for the AWS regions associated with the selected targets when required.
954
+
955
+ ## SIMPLE
956
+
957
+ Only one target is required.
958
+
959
+ ---
960
+
961
+ # 15. Nginx Proxy Manager proxy and SSL
962
+
963
+ Standalone proxy creation:
964
+
965
+ ```powershell
966
+ indraq proxy create api.example.com
967
+ ```
968
+
969
+ Update/delete:
970
+
971
+ ```powershell
972
+ indraq proxy update api.example.com
973
+ indraq proxy delete api.example.com
974
+ ```
975
+
976
+ ## Route53 prerequisite
977
+
978
+ IndraQ verifies that the exact Route53 record exists before creating a new NPM proxy host.
979
+
980
+ If the DNS record is missing, proxy creation stops before NPM creation. This avoids creating a proxy/certificate flow for a domain that has not been routed yet.
981
+
982
+ ## Forward target
983
+
984
+ The user can select a shared environment, for example:
985
+
986
+ ```text
987
+ production — 10.0.0.10
988
+ staging — 10.0.1.10
989
+ ```
990
+
991
+ or choose a custom IP/hostname.
992
+
993
+ ## SSL choices
994
+
995
+ NPM creation includes explicit SSL selection:
996
+
997
+ ```text
998
+ Request Let's Encrypt certificate
999
+ Use an existing NPM certificate
1000
+ No SSL
1001
+ ```
1002
+
1003
+ For Let's Encrypt, IndraQ asks for the required email and certificate options.
1004
+
1005
+ For an existing certificate, IndraQ lists available NPM certificates when possible so users do not have to remember a certificate ID.
1006
+
1007
+ ---
1008
+
1009
+ # 16. Jenkins deployment and port validation
1010
+
1011
+ IndraQ checks the requested host port before final deployment creation.
1012
+
1013
+ If the port is busy, the CLI reports it immediately and suggests available alternatives instead of waiting for a pipeline failure.
1014
+
1015
+ Conceptually:
1016
+
1017
+ ```text
1018
+ Requested port: 6200
1019
+ |
1020
+ +-- free -> continue
1021
+ |
1022
+ +-- busy -> show suggested free ports -> ask again
1023
+ ```
1024
+
1025
+ Jenkins remains the final authority and should still validate the port during the pipeline/deployment itself.
1026
+
1027
+ ## Create only the Jenkins deployment
1028
+
1029
+ If DNS/NPM setup is not wanted yet, trigger only the Jenkins seed job:
1030
+
1031
+ ```powershell
1032
+ indraq jenkins create-deployment
1033
+ ```
1034
+
1035
+ This performs the aggressive host-port check, uses the selected user's GHCR owner/image, invokes `CREATE-DEPLOYMENT`, records the Jenkins project resource, and does **not** modify Route53 or NPM.
1036
+
1037
+ Create/reconcile deployment infrastructure:
1038
+
1039
+ ```powershell
1040
+ indraq deployment create
1041
+ ```
1042
+
1043
+ This is backed by the same prebuild reconciliation flow.
1044
+
1045
+ Run an existing configured deployment:
1046
+
1047
+ ```powershell
1048
+ indraq deployment run --env production
1049
+ ```
1050
+
1051
+ Build/push/deploy:
1052
+
1053
+ ```powershell
1054
+ indraq deploy build --env production
1055
+ ```
1056
+
1057
+ The shared environment name is not restricted to `dev` or `prod`.
1058
+
1059
+ ---
1060
+
1061
+ # 17. GHCR image naming
1062
+
1063
+ The image path is built from the authenticated user's selected registry owner.
1064
+
1065
+ Example provider configuration:
1066
+
1067
+ ```text
1068
+ Registry: ghcr.io
1069
+ Owner: acme-platform
1070
+ ```
1071
+
1072
+ Project:
1073
+
1074
+ ```text
1075
+ order-service
1076
+ ```
1077
+
1078
+ Generated repository:
1079
+
1080
+ ```text
1081
+ ghcr.io/acme-platform/order-service
1082
+ ```
1083
+
1084
+ For full-stack projects, components can use separate image names, for example:
1085
+
1086
+ ```text
1087
+ ghcr.io/acme-platform/order-service-frontend
1088
+ ghcr.io/acme-platform/order-service-backend
1089
+ ```
1090
+
1091
+ ---
1092
+
1093
+ # 18. NPM user management
1094
+
1095
+ Create:
1096
+
1097
+ ```powershell
1098
+ indraq npm-user create
1099
+ ```
1100
+
1101
+ Update:
1102
+
1103
+ ```powershell
1104
+ indraq npm-user update user@example.com
1105
+ ```
1106
+
1107
+ Delete:
1108
+
1109
+ ```powershell
1110
+ indraq npm-user delete user@example.com
1111
+ ```
1112
+
1113
+ These commands use the current logged-in user's reusable NPM provider credential.
1114
+
1115
+ ---
1116
+
1117
+ # 19. Dockerfile generation
1118
+
1119
+ For an existing project:
1120
+
1121
+ ```powershell
1122
+ indraq dockerfile create
1123
+ ```
1124
+
1125
+ IndraQ does not try to guess which source/configuration files your application needs. Generated Dockerfiles copy the complete Docker build context with `COPY . .`; `.dockerignore` is the source of truth for files that must stay out of the image.
1126
+
1127
+ Generated Alpine runtime images install `curl`, and Docker health checks use `curl -fsS`. This keeps container health validation available for Node and Nginx images without relying on whichever BusyBox utilities happen to be present.
1128
+
1129
+ The generated `.dockerignore` excludes local dependencies, Git/IndraQ metadata, logs, coverage, caches, and previous build output. IndraQ intentionally does **not** ignore `.env` or `.env.*` files, so environment files present in the project directory are included in the Docker build context and baked into the resulting image according to the company's deployment policy.
1130
+
1131
+ For Node backends and Next.js applications, the runtime stage copies the complete filtered build tree from the build stage, including generated output and production dependencies. For Vite/React static frontends, the build stage receives the complete filtered project context and Nginx serves only the compiled output directory.
1132
+
1133
+ Dependency installation also works whether the project has a `package-lock.json` or not: IndraQ uses `npm ci` when a lockfile exists and falls back to `npm install` otherwise.
1134
+
1135
+ Optional flags include framework, Node version, port, health endpoint, Compose generation, output directory, and force overwrite.
1136
+
1137
+ Use command help for the current options:
1138
+
1139
+ ```powershell
1140
+ indraq dockerfile create --help
1141
+ ```
1142
+
1143
+ ---
1144
+
1145
+ # 20. Mobile projects
1146
+
1147
+ IndraQ also includes mobile project configuration/build commands.
1148
+
1149
+ See:
1150
+
1151
+ ```powershell
1152
+ indraq help mobile
1153
+ ```
1154
+
1155
+ or:
1156
+
1157
+ ```powershell
1158
+ indraq build --help
1159
+ ```
1160
+
1161
+ Web deployment reconciliation through Route53/NPM is intended for web frontend/backend components. Mobile build behavior is separate.
1162
+
1163
+ ---
1164
+
1165
+ # 21. Audit logs
1166
+
1167
+ Managers and admins can view audit logs:
1168
+
1169
+ ```powershell
1170
+ indraq logs
1171
+ ```
1172
+
1173
+ Sensitive Cloud/provider actions use audit reasons so administrative changes can be traced.
1174
+
1175
+ Examples include:
1176
+
1177
+ - user creation/deletion
1178
+ - provider credential changes
1179
+ - AWS credential storage/resolution
1180
+ - environment changes
1181
+ - project resource reconciliation
1182
+
1183
+ ---
1184
+
1185
+ # 22. Doctor
1186
+
1187
+ Run:
1188
+
1189
+ ```powershell
1190
+ indraq doctor
1191
+ ```
1192
+
1193
+ Doctor checks the local IndraQ/Node environment and useful project/provider conditions.
1194
+
1195
+ Use it when setup feels inconsistent before manually editing local configuration files.
1196
+
1197
+ ---
1198
+
1199
+ # 23. Recommended first-time setup
1200
+
1201
+ ## Administrator
1202
+
1203
+ 1. Start IndraQ Cloud API.
1204
+ 2. Login as bootstrap admin.
1205
+ 3. Create shared environments.
1206
+ 4. Configure your own provider credentials.
1207
+ 5. Configure AWS role-policy mappings if unified AWS user creation will be used.
1208
+ 6. Create managers/users as required.
1209
+
1210
+ Example:
1211
+
1212
+ ```powershell
1213
+ indraq login
1214
+ indraq environment create
1215
+ indraq environment create
1216
+ indraq provider configure aws
1217
+ indraq provider configure npm
1218
+ indraq provider configure jenkins-dev
1219
+ indraq provider configure jenkins-prod
1220
+ indraq provider configure ghcr
1221
+ indraq user create
1222
+ ```
1223
+
1224
+ ## Developer
1225
+
1226
+ 1. Login to IndraQ Cloud.
1227
+ 2. Configure the provider credentials that belong to you.
1228
+ 3. Run `indraq init`.
1229
+ 4. Select full infrastructure setup, or skip it and run `indraq prebuild` later.
1230
+ 5. Start coding.
1231
+
1232
+ Example:
1233
+
1234
+ ```powershell
1235
+ indraq login
1236
+ indraq configure
1237
+ indraq init my-service
1238
+ ```
1239
+
1240
+ ---
1241
+
1242
+ # 24. Recommended daily workflow
1243
+
1244
+ Inside an existing project:
1245
+
1246
+ ```powershell
1247
+ indraq whoami
1248
+ indraq project status
1249
+ indraq prebuild
1250
+ indraq deploy build --env production
1251
+ ```
1252
+
1253
+ You do not need to re-enter AWS/NPM/Jenkins/GHCR credentials for every project.
1254
+
1255
+ ---
1256
+
1257
+ # 25. Common troubleshooting
1258
+
1259
+ ## `npm install` fails during `indraq init`
1260
+
1261
+ IndraQ links the Cloud project before dependency installation and should preserve setup even when installation fails.
1262
+
1263
+ Look for the component paths printed by the CLI, then run:
1264
+
1265
+ ```powershell
1266
+ cd <component-folder>
1267
+ npm install
1268
+ ```
1269
+
1270
+ Also verify:
1271
+
1272
+ ```powershell
1273
+ node --version
1274
+ npm --version
1275
+ npm config get registry
1276
+ ```
1277
+
1278
+ Use Node.js 22 or newer.
1279
+
1280
+ ## Jenkins returns `403 No valid crumb was included`
1281
+
1282
+ The current Jenkins administration client fetches the Jenkins crumb together with its session cookies and sends them together to `/scriptText`.
1283
+
1284
+ If a 403 continues:
1285
+
1286
+ - verify the configured Jenkins account can access the required administration endpoint
1287
+ - verify reverse proxies are not stripping session cookies/headers
1288
+ - verify Jenkins security settings/plugins expected by your setup
1289
+ - prefer a Jenkins API token where appropriate
1290
+
1291
+ Run the provider configuration again if credentials changed:
1292
+
1293
+ ```powershell
1294
+ indraq provider configure jenkins-dev
1295
+ ```
1296
+
1297
+ or:
1298
+
1299
+ ```powershell
1300
+ indraq provider configure jenkins-prod
1301
+ ```
1302
+
1303
+ ## Port is already in use
1304
+
1305
+ IndraQ should detect the busy Jenkins host port before creating the deployment and offer suggested alternatives.
1306
+
1307
+ Choose another suggested port and continue.
1308
+
1309
+ ## NPM proxy creation says Route53 is missing
1310
+
1311
+ Create/reconcile DNS first:
1312
+
1313
+ ```powershell
1314
+ indraq dns create
1315
+ ```
1316
+
1317
+ or run:
1318
+
1319
+ ```powershell
1320
+ indraq prebuild
1321
+ ```
1322
+
1323
+ Then retry the proxy.
1324
+
1325
+ ## GHCR organization is missing from the selection
1326
+
1327
+ The organization list is based on what the GitHub token can see.
1328
+
1329
+ Check token access. If the required owner still cannot be enumerated, use the manual-owner fallback in the GHCR provider wizard.
1330
+
1331
+ ## AWS secret is not visible in AWS anymore
1332
+
1333
+ AWS does not re-display an existing secret access key.
1334
+
1335
+ If the AWS user was created through IndraQ's unified user workflow and the encrypted credential was stored successfully, the logged-in target user can run:
1336
+
1337
+ ```powershell
1338
+ indraq iam credentials <aws-username>
1339
+ ```
1340
+
1341
+ Otherwise rotate/create a new AWS access key rather than attempting to recover an unavailable secret from AWS.
1342
+
1343
+ ## Cloud API refuses to start because of `MASTER_KEY`
1344
+
1345
+ `MASTER_KEY` must be exactly 64 hexadecimal characters.
1346
+
1347
+ Generate one with:
1348
+
1349
+ ```powershell
1350
+ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
1351
+ ```
1352
+
1353
+ Do not replace an existing production master key if encrypted credentials already exist.
1354
+
1355
+ ---
1356
+
1357
+ # 26. Security model
1358
+
1359
+ ## Passwords
1360
+
1361
+ IndraQ Cloud account passwords are hashed with bcrypt.
1362
+
1363
+ ## Reusable provider secrets
1364
+
1365
+ Provider secrets must be usable again for AWS/Jenkins/NPM/GHCR API calls, so they cannot be stored as one-way password hashes.
1366
+
1367
+ They are encrypted at rest using AES-256-GCM with the Cloud API `MASTER_KEY`.
1368
+
1369
+ ## Project files
1370
+
1371
+ Project folders should not contain reusable provider secrets.
1372
+
1373
+ The normal design is:
1374
+
1375
+ ```text
1376
+ local project -> project ID
1377
+ Cloud user -> reusable encrypted provider credentials
1378
+ Cloud project -> infrastructure associations
1379
+ ```
1380
+
1381
+ ## AWS IAM users
1382
+
1383
+ IndraQ's IAM-user flow is intended for CLI/API users. AWS console login profiles are intentionally not created.
1384
+
1385
+ ## Exposed credentials
1386
+
1387
+ If any AWS key, GitHub token, Jenkins token, NPM password, or other credential is pasted into logs/chat/tickets or otherwise exposed, rotate it immediately. Encryption in IndraQ Cloud does not make a publicly exposed credential safe.
1388
+
1389
+ ---
1390
+
1391
+ # 27. Main command reference
1392
+
1393
+ Use `--help` on any command for the authoritative current flags.
1394
+
1395
+ ```text
1396
+ indraq configure
1397
+ indraq doctor
1398
+
1399
+ indraq login
1400
+ indraq logout
1401
+ indraq whoami
1402
+
1403
+ indraq environment create
1404
+ indraq environment list
1405
+ indraq environment update
1406
+ indraq environment delete
1407
+
1408
+ indraq provider configure
1409
+ indraq provider list
1410
+
1411
+ indraq user list
1412
+ indraq user create
1413
+ indraq user update
1414
+ indraq user delete
1415
+ indraq password reset
1416
+
1417
+ indraq iam user:create
1418
+ indraq iam user:delete
1419
+ indraq iam credentials
1420
+
1421
+ indraq dns zones
1422
+ indraq dns records
1423
+ indraq dns create
1424
+ indraq dns update
1425
+ indraq dns delete
1426
+
1427
+ indraq proxy create
1428
+ indraq proxy update
1429
+ indraq proxy delete
1430
+
1431
+ indraq npm-user create
1432
+ indraq npm-user update
1433
+ indraq npm-user delete
1434
+
1435
+ indraq init
1436
+ indraq project create
1437
+ indraq project link
1438
+ indraq project sync
1439
+ indraq project status
1440
+ indraq prebuild
1441
+
1442
+ indraq deployment create
1443
+ indraq deployment run
1444
+ indraq deploy build
1445
+
1446
+ indraq dockerfile create
1447
+ indraq logs
1448
+ ```
1449
+
1450
+ For the complete live command reference:
1451
+
1452
+ ```powershell
1453
+ indraq --help
1454
+ ```
1455
+
1456
+ ---
1457
+
1458
+ # 28. Legacy compatibility commands
1459
+
1460
+ Provider credentials now live directly in IndraQ Cloud.
1461
+
1462
+ The old-style credential commands remain only for compatibility:
1463
+
1464
+ ```powershell
1465
+ indraq credentials sync
1466
+ indraq credentials restore
1467
+ ```
1468
+
1469
+ They do not represent the recommended local-file-to-Cloud workflow.
1470
+
1471
+ Use instead:
1472
+
1473
+ ```powershell
1474
+ indraq provider configure <provider>
1475
+ indraq provider list
1476
+ ```
1477
+
1478
+ ---
1479
+
1480
+ # 29. Release verification
1481
+
1482
+ Before deploying or distributing the CLI, run:
1483
+
1484
+ ```powershell
1485
+ npm install
1486
+ npm run build
1487
+ npm test
1488
+ ```
1489
+
1490
+ Cloud API:
1491
+
1492
+ ```powershell
1493
+ cd cloud-api
1494
+ npm install
1495
+ npm run build
1496
+ ```
1497
+
1498
+ Then perform a real integration test in your own environment because mocked regression tests cannot verify private AWS, Jenkins, NPM, GHCR, DNS, firewall, or server configuration.
1499
+
1500
+ A useful end-to-end test is:
1501
+
1502
+ 1. login
1503
+ 2. create/list environments
1504
+ 3. configure provider credentials
1505
+ 4. create a disposable project with `indraq init`
1506
+ 5. choose full setup
1507
+ 6. verify Jenkins port validation
1508
+ 7. verify Route53 routing and AWS health checks
1509
+ 8. verify NPM SSL/proxy
1510
+ 9. verify GHCR image owner/path
1511
+ 10. rerun `indraq prebuild` and confirm resources are reconciled rather than duplicated
1512
+
1513
+ ---
1514
+
1515
+ # License
1516
+
1517
+ MIT. See `LICENSE`.