@agentuity/cli 1.0.1 → 1.0.3

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 (331) hide show
  1. package/AGENTS.md +40 -24
  2. package/bin/cli.ts +47 -22
  3. package/dist/agent-detection.d.ts +23 -38
  4. package/dist/agent-detection.d.ts.map +1 -1
  5. package/dist/agent-detection.js +412 -153
  6. package/dist/agent-detection.js.map +1 -1
  7. package/dist/ai-help.d.ts +23 -0
  8. package/dist/ai-help.d.ts.map +1 -0
  9. package/dist/ai-help.js +328 -0
  10. package/dist/ai-help.js.map +1 -0
  11. package/dist/api.js +1 -1
  12. package/dist/api.js.map +1 -1
  13. package/dist/auth.d.ts +10 -1
  14. package/dist/auth.d.ts.map +1 -1
  15. package/dist/auth.js +176 -16
  16. package/dist/auth.js.map +1 -1
  17. package/dist/banner.d.ts.map +1 -1
  18. package/dist/banner.js +5 -0
  19. package/dist/banner.js.map +1 -1
  20. package/dist/cache/agent-intro.d.ts +13 -0
  21. package/dist/cache/agent-intro.d.ts.map +1 -0
  22. package/dist/cache/agent-intro.js +54 -0
  23. package/dist/cache/agent-intro.js.map +1 -0
  24. package/dist/cache/index.d.ts +1 -0
  25. package/dist/cache/index.d.ts.map +1 -1
  26. package/dist/cache/index.js +1 -0
  27. package/dist/cache/index.js.map +1 -1
  28. package/dist/cache/resource-region.d.ts +3 -2
  29. package/dist/cache/resource-region.d.ts.map +1 -1
  30. package/dist/cache/resource-region.js +13 -4
  31. package/dist/cache/resource-region.js.map +1 -1
  32. package/dist/catalyst.d.ts +7 -0
  33. package/dist/catalyst.d.ts.map +1 -0
  34. package/dist/catalyst.js +15 -0
  35. package/dist/catalyst.js.map +1 -0
  36. package/dist/cli.d.ts +12 -1
  37. package/dist/cli.d.ts.map +1 -1
  38. package/dist/cli.js +290 -67
  39. package/dist/cli.js.map +1 -1
  40. package/dist/cmd/ai/detect.d.ts +3 -0
  41. package/dist/cmd/ai/detect.d.ts.map +1 -0
  42. package/dist/cmd/ai/detect.js +49 -0
  43. package/dist/cmd/ai/detect.js.map +1 -0
  44. package/dist/cmd/ai/index.d.ts.map +1 -1
  45. package/dist/cmd/ai/index.js +18 -1
  46. package/dist/cmd/ai/index.js.map +1 -1
  47. package/dist/cmd/ai/intro.d.ts +7 -0
  48. package/dist/cmd/ai/intro.d.ts.map +1 -0
  49. package/dist/cmd/ai/intro.js +141 -0
  50. package/dist/cmd/ai/intro.js.map +1 -0
  51. package/dist/cmd/ai/opencode/run.d.ts.map +1 -1
  52. package/dist/cmd/ai/opencode/run.js +5 -0
  53. package/dist/cmd/ai/opencode/run.js.map +1 -1
  54. package/dist/cmd/build/ast.d.ts.map +1 -1
  55. package/dist/cmd/build/ast.js +79 -0
  56. package/dist/cmd/build/ast.js.map +1 -1
  57. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  58. package/dist/cmd/build/vite/bun-dev-server.js +2 -0
  59. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  60. package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -1
  61. package/dist/cmd/build/vite/docs-generator.js +15 -1
  62. package/dist/cmd/build/vite/docs-generator.js.map +1 -1
  63. package/dist/cmd/build/vite/env-types-generator.d.ts +26 -0
  64. package/dist/cmd/build/vite/env-types-generator.d.ts.map +1 -0
  65. package/dist/cmd/build/vite/env-types-generator.js +110 -0
  66. package/dist/cmd/build/vite/env-types-generator.js.map +1 -0
  67. package/dist/cmd/build/vite/index.d.ts +2 -0
  68. package/dist/cmd/build/vite/index.d.ts.map +1 -1
  69. package/dist/cmd/build/vite/index.js +12 -1
  70. package/dist/cmd/build/vite/index.js.map +1 -1
  71. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +1 -1
  72. package/dist/cmd/build/vite/public-asset-path-plugin.js.map +1 -1
  73. package/dist/cmd/build/vite/vite-builder.d.ts +2 -0
  74. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  75. package/dist/cmd/build/vite/vite-builder.js +10 -1
  76. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  77. package/dist/cmd/cloud/db/create.js.map +1 -1
  78. package/dist/cmd/cloud/db/delete.js.map +1 -1
  79. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  80. package/dist/cmd/cloud/db/get.js +27 -12
  81. package/dist/cmd/cloud/db/get.js.map +1 -1
  82. package/dist/cmd/cloud/deploy-fork.d.ts.map +1 -1
  83. package/dist/cmd/cloud/deploy-fork.js +2 -0
  84. package/dist/cmd/cloud/deploy-fork.js.map +1 -1
  85. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  86. package/dist/cmd/cloud/deploy.js +17 -0
  87. package/dist/cmd/cloud/deploy.js.map +1 -1
  88. package/dist/cmd/cloud/env/import.js.map +1 -1
  89. package/dist/cmd/cloud/env/list.js.map +1 -1
  90. package/dist/cmd/cloud/env/push.js.map +1 -1
  91. package/dist/cmd/cloud/keyvalue/util.d.ts.map +1 -1
  92. package/dist/cmd/cloud/keyvalue/util.js +3 -3
  93. package/dist/cmd/cloud/keyvalue/util.js.map +1 -1
  94. package/dist/cmd/cloud/machine/list.js +3 -3
  95. package/dist/cmd/cloud/machine/list.js.map +1 -1
  96. package/dist/cmd/cloud/region/index.js.map +1 -1
  97. package/dist/cmd/cloud/region-lookup.d.ts +7 -4
  98. package/dist/cmd/cloud/region-lookup.d.ts.map +1 -1
  99. package/dist/cmd/cloud/region-lookup.js +59 -14
  100. package/dist/cmd/cloud/region-lookup.js.map +1 -1
  101. package/dist/cmd/cloud/sandbox/cp.d.ts.map +1 -1
  102. package/dist/cmd/cloud/sandbox/cp.js +7 -5
  103. package/dist/cmd/cloud/sandbox/cp.js.map +1 -1
  104. package/dist/cmd/cloud/sandbox/create.js +2 -2
  105. package/dist/cmd/cloud/sandbox/create.js.map +1 -1
  106. package/dist/cmd/cloud/sandbox/delete.d.ts.map +1 -1
  107. package/dist/cmd/cloud/sandbox/delete.js +8 -7
  108. package/dist/cmd/cloud/sandbox/delete.js.map +1 -1
  109. package/dist/cmd/cloud/sandbox/download.d.ts.map +1 -1
  110. package/dist/cmd/cloud/sandbox/download.js +7 -5
  111. package/dist/cmd/cloud/sandbox/download.js.map +1 -1
  112. package/dist/cmd/cloud/sandbox/env.d.ts.map +1 -1
  113. package/dist/cmd/cloud/sandbox/env.js +7 -5
  114. package/dist/cmd/cloud/sandbox/env.js.map +1 -1
  115. package/dist/cmd/cloud/sandbox/exec.d.ts.map +1 -1
  116. package/dist/cmd/cloud/sandbox/exec.js +7 -5
  117. package/dist/cmd/cloud/sandbox/exec.js.map +1 -1
  118. package/dist/cmd/cloud/sandbox/get.d.ts.map +1 -1
  119. package/dist/cmd/cloud/sandbox/get.js +12 -7
  120. package/dist/cmd/cloud/sandbox/get.js.map +1 -1
  121. package/dist/cmd/cloud/sandbox/list.d.ts.map +1 -1
  122. package/dist/cmd/cloud/sandbox/list.js +40 -63
  123. package/dist/cmd/cloud/sandbox/list.js.map +1 -1
  124. package/dist/cmd/cloud/sandbox/ls.d.ts.map +1 -1
  125. package/dist/cmd/cloud/sandbox/ls.js +7 -5
  126. package/dist/cmd/cloud/sandbox/ls.js.map +1 -1
  127. package/dist/cmd/cloud/sandbox/mkdir.d.ts.map +1 -1
  128. package/dist/cmd/cloud/sandbox/mkdir.js +7 -5
  129. package/dist/cmd/cloud/sandbox/mkdir.js.map +1 -1
  130. package/dist/cmd/cloud/sandbox/rm.d.ts.map +1 -1
  131. package/dist/cmd/cloud/sandbox/rm.js +7 -5
  132. package/dist/cmd/cloud/sandbox/rm.js.map +1 -1
  133. package/dist/cmd/cloud/sandbox/rmdir.d.ts.map +1 -1
  134. package/dist/cmd/cloud/sandbox/rmdir.js +7 -5
  135. package/dist/cmd/cloud/sandbox/rmdir.js.map +1 -1
  136. package/dist/cmd/cloud/sandbox/run.js +1 -1
  137. package/dist/cmd/cloud/sandbox/run.js.map +1 -1
  138. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  139. package/dist/cmd/cloud/sandbox/snapshot/get.js.map +1 -1
  140. package/dist/cmd/cloud/sandbox/upload.d.ts.map +1 -1
  141. package/dist/cmd/cloud/sandbox/upload.js +7 -5
  142. package/dist/cmd/cloud/sandbox/upload.js.map +1 -1
  143. package/dist/cmd/cloud/sandbox/util.d.ts +2 -2
  144. package/dist/cmd/cloud/sandbox/util.d.ts.map +1 -1
  145. package/dist/cmd/cloud/sandbox/util.js +14 -13
  146. package/dist/cmd/cloud/sandbox/util.js.map +1 -1
  147. package/dist/cmd/cloud/ssh.d.ts.map +1 -1
  148. package/dist/cmd/cloud/ssh.js +3 -3
  149. package/dist/cmd/cloud/ssh.js.map +1 -1
  150. package/dist/cmd/cloud/storage/create.js.map +1 -1
  151. package/dist/cmd/cloud/storage/delete.js.map +1 -1
  152. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  153. package/dist/cmd/cloud/storage/get.js +5 -11
  154. package/dist/cmd/cloud/storage/get.js.map +1 -1
  155. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  156. package/dist/cmd/cloud/storage/list.js +6 -6
  157. package/dist/cmd/cloud/storage/list.js.map +1 -1
  158. package/dist/cmd/cloud/stream/create.d.ts.map +1 -1
  159. package/dist/cmd/cloud/stream/create.js +7 -4
  160. package/dist/cmd/cloud/stream/create.js.map +1 -1
  161. package/dist/cmd/cloud/stream/delete.d.ts.map +1 -1
  162. package/dist/cmd/cloud/stream/delete.js +25 -4
  163. package/dist/cmd/cloud/stream/delete.js.map +1 -1
  164. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  165. package/dist/cmd/cloud/stream/get.js +91 -62
  166. package/dist/cmd/cloud/stream/get.js.map +1 -1
  167. package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
  168. package/dist/cmd/cloud/stream/list.js +66 -38
  169. package/dist/cmd/cloud/stream/list.js.map +1 -1
  170. package/dist/cmd/cloud/stream/util.d.ts +20 -0
  171. package/dist/cmd/cloud/stream/util.d.ts.map +1 -1
  172. package/dist/cmd/cloud/stream/util.js +27 -3
  173. package/dist/cmd/cloud/stream/util.js.map +1 -1
  174. package/dist/cmd/cloud/vector/util.d.ts.map +1 -1
  175. package/dist/cmd/cloud/vector/util.js +3 -3
  176. package/dist/cmd/cloud/vector/util.js.map +1 -1
  177. package/dist/cmd/dev/index.js.map +1 -1
  178. package/dist/cmd/git/account/add.js.map +1 -1
  179. package/dist/cmd/git/list.js.map +1 -1
  180. package/dist/cmd/project/add/database.d.ts +2 -0
  181. package/dist/cmd/project/add/database.d.ts.map +1 -0
  182. package/dist/cmd/project/add/database.js +123 -0
  183. package/dist/cmd/project/add/database.js.map +1 -0
  184. package/dist/cmd/project/add/domain.d.ts +2 -0
  185. package/dist/cmd/project/add/domain.d.ts.map +1 -0
  186. package/dist/cmd/project/add/domain.js +152 -0
  187. package/dist/cmd/project/add/domain.js.map +1 -0
  188. package/dist/cmd/project/add/index.d.ts +2 -0
  189. package/dist/cmd/project/add/index.d.ts.map +1 -0
  190. package/dist/cmd/project/add/index.js +35 -0
  191. package/dist/cmd/project/add/index.js.map +1 -0
  192. package/dist/cmd/project/add/storage.d.ts +2 -0
  193. package/dist/cmd/project/add/storage.d.ts.map +1 -0
  194. package/dist/cmd/project/add/storage.js +123 -0
  195. package/dist/cmd/project/add/storage.js.map +1 -0
  196. package/dist/cmd/project/auth/init.js.map +1 -1
  197. package/dist/cmd/project/index.d.ts.map +1 -1
  198. package/dist/cmd/project/index.js +7 -0
  199. package/dist/cmd/project/index.js.map +1 -1
  200. package/dist/cmd/project/reconcile.d.ts.map +1 -1
  201. package/dist/cmd/project/reconcile.js +32 -0
  202. package/dist/cmd/project/reconcile.js.map +1 -1
  203. package/dist/cmd/support/report.js.map +1 -1
  204. package/dist/cmd/support/system.js +2 -2
  205. package/dist/cmd/support/system.js.map +1 -1
  206. package/dist/config.d.ts +6 -3
  207. package/dist/config.d.ts.map +1 -1
  208. package/dist/config.js +31 -7
  209. package/dist/config.js.map +1 -1
  210. package/dist/errors.d.ts +2 -1
  211. package/dist/errors.d.ts.map +1 -1
  212. package/dist/errors.js +5 -0
  213. package/dist/errors.js.map +1 -1
  214. package/dist/index.d.ts +4 -1
  215. package/dist/index.d.ts.map +1 -1
  216. package/dist/index.js +3 -0
  217. package/dist/index.js.map +1 -1
  218. package/dist/repl.js +2 -1
  219. package/dist/repl.js.map +1 -1
  220. package/dist/tui/box.d.ts +3 -1
  221. package/dist/tui/box.d.ts.map +1 -1
  222. package/dist/tui/box.js +22 -7
  223. package/dist/tui/box.js.map +1 -1
  224. package/dist/tui/colors.d.ts +0 -3
  225. package/dist/tui/colors.d.ts.map +1 -1
  226. package/dist/tui/colors.js +76 -23
  227. package/dist/tui/colors.js.map +1 -1
  228. package/dist/tui/prompt.d.ts +2 -0
  229. package/dist/tui/prompt.d.ts.map +1 -1
  230. package/dist/tui/prompt.js +44 -3
  231. package/dist/tui/prompt.js.map +1 -1
  232. package/dist/tui/symbols.d.ts +0 -4
  233. package/dist/tui/symbols.d.ts.map +1 -1
  234. package/dist/tui/symbols.js +5 -0
  235. package/dist/tui/symbols.js.map +1 -1
  236. package/dist/tui.d.ts +8 -0
  237. package/dist/tui.d.ts.map +1 -1
  238. package/dist/tui.js +54 -9
  239. package/dist/tui.js.map +1 -1
  240. package/dist/types.d.ts +37 -2
  241. package/dist/types.d.ts.map +1 -1
  242. package/dist/types.js +1 -0
  243. package/dist/types.js.map +1 -1
  244. package/dist/version-check.d.ts.map +1 -1
  245. package/dist/version-check.js +5 -0
  246. package/dist/version-check.js.map +1 -1
  247. package/package.json +6 -6
  248. package/src/agent-detection.ts +457 -160
  249. package/src/ai-help.ts +393 -0
  250. package/src/api.ts +1 -1
  251. package/src/auth.ts +226 -17
  252. package/src/banner.ts +5 -0
  253. package/src/cache/agent-intro.ts +62 -0
  254. package/src/cache/index.ts +2 -0
  255. package/src/cache/resource-region.ts +28 -7
  256. package/src/catalyst.ts +16 -0
  257. package/src/cli.ts +375 -93
  258. package/src/cmd/ai/detect.ts +54 -0
  259. package/src/cmd/ai/index.ts +18 -1
  260. package/src/cmd/ai/intro.ts +154 -0
  261. package/src/cmd/ai/opencode/run.ts +5 -0
  262. package/src/cmd/build/ast.ts +97 -0
  263. package/src/cmd/build/vite/bun-dev-server.ts +2 -0
  264. package/src/cmd/build/vite/docs-generator.ts +15 -1
  265. package/src/cmd/build/vite/env-types-generator.ts +145 -0
  266. package/src/cmd/build/vite/index.ts +15 -0
  267. package/src/cmd/build/vite/public-asset-path-plugin.ts +8 -2
  268. package/src/cmd/build/vite/vite-builder.ts +31 -11
  269. package/src/cmd/cloud/db/create.ts +16 -16
  270. package/src/cmd/cloud/db/delete.ts +19 -19
  271. package/src/cmd/cloud/db/get.ts +32 -17
  272. package/src/cmd/cloud/deploy-fork.ts +2 -0
  273. package/src/cmd/cloud/deploy.ts +17 -0
  274. package/src/cmd/cloud/env/import.ts +6 -6
  275. package/src/cmd/cloud/env/list.ts +11 -11
  276. package/src/cmd/cloud/env/push.ts +6 -6
  277. package/src/cmd/cloud/keyvalue/util.ts +3 -3
  278. package/src/cmd/cloud/machine/list.ts +3 -3
  279. package/src/cmd/cloud/region/index.ts +3 -3
  280. package/src/cmd/cloud/region-lookup.ts +82 -22
  281. package/src/cmd/cloud/sandbox/cp.ts +9 -4
  282. package/src/cmd/cloud/sandbox/create.ts +2 -2
  283. package/src/cmd/cloud/sandbox/delete.ts +10 -7
  284. package/src/cmd/cloud/sandbox/download.ts +8 -5
  285. package/src/cmd/cloud/sandbox/env.ts +8 -5
  286. package/src/cmd/cloud/sandbox/exec.ts +10 -5
  287. package/src/cmd/cloud/sandbox/get.ts +13 -7
  288. package/src/cmd/cloud/sandbox/list.ts +47 -73
  289. package/src/cmd/cloud/sandbox/ls.ts +9 -5
  290. package/src/cmd/cloud/sandbox/mkdir.ts +9 -5
  291. package/src/cmd/cloud/sandbox/rm.ts +9 -5
  292. package/src/cmd/cloud/sandbox/rmdir.ts +9 -5
  293. package/src/cmd/cloud/sandbox/run.ts +1 -1
  294. package/src/cmd/cloud/sandbox/snapshot/build.ts +31 -31
  295. package/src/cmd/cloud/sandbox/snapshot/get.ts +17 -17
  296. package/src/cmd/cloud/sandbox/upload.ts +8 -5
  297. package/src/cmd/cloud/sandbox/util.ts +15 -14
  298. package/src/cmd/cloud/ssh.ts +2 -4
  299. package/src/cmd/cloud/storage/create.ts +16 -16
  300. package/src/cmd/cloud/storage/delete.ts +19 -19
  301. package/src/cmd/cloud/storage/get.ts +5 -16
  302. package/src/cmd/cloud/storage/list.ts +12 -6
  303. package/src/cmd/cloud/stream/create.ts +8 -4
  304. package/src/cmd/cloud/stream/delete.ts +28 -4
  305. package/src/cmd/cloud/stream/get.ts +102 -64
  306. package/src/cmd/cloud/stream/list.ts +76 -44
  307. package/src/cmd/cloud/stream/util.ts +39 -3
  308. package/src/cmd/cloud/vector/util.ts +3 -3
  309. package/src/cmd/dev/index.ts +4 -4
  310. package/src/cmd/git/account/add.ts +5 -5
  311. package/src/cmd/git/list.ts +7 -7
  312. package/src/cmd/project/add/database.ts +145 -0
  313. package/src/cmd/project/add/domain.ts +181 -0
  314. package/src/cmd/project/add/index.ts +35 -0
  315. package/src/cmd/project/add/storage.ts +147 -0
  316. package/src/cmd/project/auth/init.ts +6 -6
  317. package/src/cmd/project/index.ts +7 -0
  318. package/src/cmd/project/reconcile.ts +40 -0
  319. package/src/cmd/support/report.ts +5 -5
  320. package/src/cmd/support/system.ts +2 -2
  321. package/src/config.ts +40 -12
  322. package/src/errors.ts +7 -0
  323. package/src/index.ts +11 -0
  324. package/src/repl.ts +4 -1
  325. package/src/tui/box.ts +24 -9
  326. package/src/tui/colors.ts +83 -26
  327. package/src/tui/prompt.ts +55 -3
  328. package/src/tui/symbols.ts +6 -0
  329. package/src/tui.ts +55 -9
  330. package/src/types.ts +46 -2
  331. package/src/version-check.ts +6 -0
package/src/tui/prompt.ts CHANGED
@@ -55,6 +55,16 @@ interface PromptState {
55
55
  export class PromptFlow {
56
56
  private states: PromptState[] = [];
57
57
 
58
+ private isInteractive(): boolean {
59
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
60
+ }
61
+
62
+ private nonInteractiveError(message: string): Error {
63
+ return new Error(
64
+ `${message} Use the appropriate --flag or environment variable to provide input.`
65
+ );
66
+ }
67
+
58
68
  /**
59
69
  * Display intro banner
60
70
  */
@@ -84,7 +94,24 @@ export class PromptFlow {
84
94
  * Text input prompt
85
95
  */
86
96
  async text(options: TextOptions): Promise<string> {
87
- const { message, initial = '', validate } = options;
97
+ const { message, validate } = options;
98
+ const initial = options.initial ?? '';
99
+ const hasDefault = options.initial !== undefined;
100
+
101
+ if (!this.isInteractive()) {
102
+ if (hasDefault) {
103
+ const validationResult = validate ? await validate(initial) : true;
104
+ if (validationResult === true) {
105
+ return initial;
106
+ }
107
+ // Validation failed - include the error message if it's a string
108
+ const errorDetail = typeof validationResult === 'string' ? `: ${validationResult}` : '';
109
+ throw this.nonInteractiveError(
110
+ `Cannot prompt for "${message}" in non-interactive mode. Validation failed for default value "${initial}"${errorDetail}.`
111
+ );
112
+ }
113
+ throw this.nonInteractiveError(`Cannot prompt for "${message}" in non-interactive mode.`);
114
+ }
88
115
 
89
116
  return new Promise((resolve, reject) => {
90
117
  const rl = readline.createInterface({
@@ -208,6 +235,10 @@ export class PromptFlow {
208
235
  async confirm(options: ConfirmOptions): Promise<boolean> {
209
236
  const { message, initial = false } = options;
210
237
 
238
+ if (!this.isInteractive()) {
239
+ return initial;
240
+ }
241
+
211
242
  return new Promise((resolve, reject) => {
212
243
  const hint = initial ? 'Y/n' : 'y/N';
213
244
 
@@ -292,6 +323,18 @@ export class PromptFlow {
292
323
  async select<T = string>(options: SelectOptions<T>): Promise<T> {
293
324
  const { message, options: choices, initial } = options;
294
325
 
326
+ if (!this.isInteractive()) {
327
+ let selectedIndex = choices.findIndex((c) => c.value === initial);
328
+ if (selectedIndex === -1) selectedIndex = 0;
329
+ const selected = choices[selectedIndex];
330
+ if (!selected) {
331
+ throw this.nonInteractiveError(
332
+ `Cannot prompt for "${message}" in non-interactive mode.`
333
+ );
334
+ }
335
+ return selected.value;
336
+ }
337
+
295
338
  return new Promise((resolve, reject) => {
296
339
  let selectedIndex = choices.findIndex((c) => c.value === initial);
297
340
  if (selectedIndex === -1) selectedIndex = 0;
@@ -397,6 +440,11 @@ export class PromptFlow {
397
440
  async multiselect<T = string>(options: MultiSelectOptions<T>): Promise<T[]> {
398
441
  const { message, options: choices, initial = [] } = options;
399
442
 
443
+ if (!this.isInteractive()) {
444
+ const choiceValues = new Set(choices.map((choice) => choice.value));
445
+ return initial.filter((value) => choiceValues.has(value));
446
+ }
447
+
400
448
  return new Promise((resolve, reject) => {
401
449
  let cursorIndex = 0;
402
450
  const selected = new Set<number>(
@@ -466,8 +514,12 @@ export class PromptFlow {
466
514
 
467
515
  // Sort indices to get consistent order for both values and labels
468
516
  const sortedIndices = Array.from(selected).sort((a, b) => a - b);
469
- const values = sortedIndices.map((i) => choices[i]?.value).filter((v) => v !== undefined);
470
- const labels = sortedIndices.map((i) => choices[i]?.label).filter((l) => l !== undefined);
517
+ const values = sortedIndices
518
+ .map((i) => choices[i]?.value)
519
+ .filter((v) => v !== undefined);
520
+ const labels = sortedIndices
521
+ .map((i) => choices[i]?.label)
522
+ .filter((l) => l !== undefined);
471
523
 
472
524
  // Clear all lines (message + all choices)
473
525
  const totalLines = choices.length + 1;
@@ -2,6 +2,7 @@
2
2
  * Box drawing and UI symbols for TUI components
3
3
  * Supports Unicode with ASCII fallbacks for non-unicode terminals
4
4
  */
5
+ import { getExecutingAgent } from '../agent-detection';
5
6
 
6
7
  // Detect unicode support
7
8
  const isUnicodeSupported = (): boolean => {
@@ -10,6 +11,11 @@ const isUnicodeSupported = (): boolean => {
10
11
  return true;
11
12
  }
12
13
 
14
+ // Use ASCII for AI coding agents (cleaner output for parsing)
15
+ if (getExecutingAgent()) {
16
+ return false;
17
+ }
18
+
13
19
  if (process.platform !== 'win32') {
14
20
  return process.env.TERM !== 'linux'; // Linux console (kernel) doesn't support Unicode
15
21
  }
package/src/tui.ts CHANGED
@@ -15,6 +15,7 @@ import type { Profile } from './types';
15
15
  import { type APIClient as APIClientType } from './api';
16
16
  import { getExitCode } from './errors';
17
17
  import { maskSecret } from './env-util';
18
+ import { getExecutingAgent } from './agent-detection';
18
19
 
19
20
  // Install global exit handler to always restore terminal cursor
20
21
  // This ensures cursor is restored even when process.exit() is called directly
@@ -28,6 +29,10 @@ function ensureCursorRestoration(): void {
28
29
  if (process.env.CI) {
29
30
  return;
30
31
  }
32
+ // Skip cursor restoration when running from an AI coding agent
33
+ if (getExecutingAgent()) {
34
+ return;
35
+ }
31
36
  // Restore cursor visibility
32
37
  process.stderr.write('\x1B[?25h');
33
38
  };
@@ -56,26 +61,63 @@ export type {
56
61
  MultiSelectOptions,
57
62
  } from './tui/prompt';
58
63
 
59
- // Icons
60
- export const ICONS = {
61
- success: '✓',
62
- error: '✗',
63
- warning: '',
64
- info: '',
65
- arrow: '',
66
- bullet: '',
67
- } as const;
64
+ // Icons - use plain text alternatives when running from an AI coding agent
65
+ function getIcons() {
66
+ if (getExecutingAgent()) {
67
+ return {
68
+ success: '[OK]',
69
+ error: '[ERROR]',
70
+ warning: '[WARN]',
71
+ info: '[INFO]',
72
+ arrow: '->',
73
+ bullet: '-',
74
+ } as const;
75
+ }
76
+ return {
77
+ success: '✓',
78
+ error: '✗',
79
+ warning: '⚠',
80
+ info: 'ℹ',
81
+ arrow: '→',
82
+ bullet: '•',
83
+ } as const;
84
+ }
85
+
86
+ // Export ICONS as a getter for backward compatibility
87
+ // Proxy with full traps for enumeration and serialization support
88
+ export const ICONS = new Proxy({} as ReturnType<typeof getIcons>, {
89
+ get(_target, prop: keyof ReturnType<typeof getIcons>) {
90
+ return getIcons()[prop];
91
+ },
92
+ has(_target, prop) {
93
+ return prop in getIcons();
94
+ },
95
+ ownKeys() {
96
+ return Object.keys(getIcons());
97
+ },
98
+ getOwnPropertyDescriptor(_target, prop) {
99
+ const icons = getIcons();
100
+ if (prop in icons) {
101
+ return { configurable: true, enumerable: true, value: icons[prop as keyof typeof icons] };
102
+ }
103
+ },
104
+ });
68
105
 
69
106
  /**
70
107
  * Check if we should treat the terminal as TTY-like for interactive output
71
108
  * (real TTY on stdout or stderr, or FORCE_COLOR set by fork wrapper).
72
109
  * Returns false in CI environments since CI terminals often don't support
73
110
  * cursor control sequences reliably.
111
+ * Returns false when running from an AI coding agent (no interactive prompts/spinners).
74
112
  */
75
113
  export function isTTYLike(): boolean {
76
114
  if (process.env.CI) {
77
115
  return false;
78
116
  }
117
+ // Disable interactive features when running from an AI coding agent
118
+ if (getExecutingAgent()) {
119
+ return false;
120
+ }
79
121
  return !!process.stdout.isTTY || !!process.stderr.isTTY || process.env.FORCE_COLOR === '1';
80
122
  }
81
123
 
@@ -100,6 +142,10 @@ export function shouldUseColors(): boolean {
100
142
  if (process.env.FORCE_COLOR === '1') {
101
143
  return true;
102
144
  }
145
+ // Disable colors when running from an AI coding agent (cleaner output for parsing)
146
+ if (getExecutingAgent()) {
147
+ return false;
148
+ }
103
149
  return (
104
150
  !process.env.NO_COLOR &&
105
151
  !process.env.CI &&
package/src/types.ts CHANGED
@@ -54,6 +54,7 @@ export const ConfigSchema = zod.object({
54
54
  last_legacy_warning: zod.number().optional().describe('Last legacy CLI warning timestamp'),
55
55
  signup_banner_shown: zod.boolean().optional().describe('If the signup banner was shown'),
56
56
  orgId: zod.string().optional().describe('Default organization ID'),
57
+ projectId: zod.string().optional().describe('Default project ID'),
57
58
  region: zod.string().optional().describe('Default cloud region'),
58
59
  project_dir: zod.string().optional().describe('Last used project directory'),
59
60
  })
@@ -284,6 +285,7 @@ export interface AuthData {
284
285
 
285
286
  export interface GlobalOptions {
286
287
  config?: string;
288
+ profile?: string;
287
289
  logLevel: LogLevel;
288
290
  logTimestamp?: boolean;
289
291
  logPrefix?: boolean;
@@ -322,6 +324,38 @@ export interface CommandSchemas {
322
324
  aliases?: Record<string, string[]>;
323
325
  }
324
326
 
327
+ /**
328
+ * Declarative resource selection rule for schema-driven testing
329
+ */
330
+ export interface ResourceSelectionRule {
331
+ /** Resource type */
332
+ resource: 'org' | 'project' | 'region';
333
+
334
+ /** Is this resource required for the command? */
335
+ required: boolean;
336
+
337
+ /** CLI flag name (e.g., 'org-id', 'region') */
338
+ flag: string;
339
+
340
+ /** Environment variable name */
341
+ envVar: string;
342
+
343
+ /** Config preference key (if applicable) */
344
+ configPref?: string;
345
+
346
+ /** Can be implied from context (e.g., project from agentuity.json) */
347
+ canBeImplied?: boolean;
348
+
349
+ /** Source file or context for implied values (e.g., 'agentuity.json') */
350
+ impliedFrom?: string;
351
+
352
+ /** Can be inferred from cache (for prefixed IDs) */
353
+ canUseCache?: boolean;
354
+
355
+ /** Operation type affects behavior */
356
+ operationType?: 'read' | 'execute' | 'mutate';
357
+ }
358
+
325
359
  export type ProjectConfig = zod.infer<typeof ProjectSchema>;
326
360
 
327
361
  export type Requires = {
@@ -428,13 +462,13 @@ export type CommandContextFromSpecs<
428
462
  *
429
463
  * @example
430
464
  * ```typescript
431
- * const agent = await ctx.isExecutingFromAgent();
465
+ * const agent = ctx.getExecutingAgent();
432
466
  * if (agent) {
433
467
  * logger.debug(`Running from agent: ${agent}`);
434
468
  * }
435
469
  * ```
436
470
  */
437
- isExecutingFromAgent: () => Promise<string | undefined>;
471
+ getExecutingAgent: () => string | undefined;
438
472
  } & AddArgs<A> &
439
473
  AddOpts<Op> &
440
474
  AddAuth<AuthMode<R, O>> &
@@ -480,6 +514,7 @@ export function createSubcommand<
480
514
  tags?: string[];
481
515
  skipSkill?: boolean;
482
516
  webUrl?: WebUrl<R, O, A, Op>;
517
+ resourceRules?: ResourceSelectionRule[];
483
518
  schema?: A extends z.ZodType
484
519
  ? Op extends z.ZodType
485
520
  ? Res extends z.ZodType
@@ -527,6 +562,7 @@ export function createCommand<
527
562
  tags?: string[];
528
563
  skipSkill?: boolean;
529
564
  webUrl?: WebUrl<R, O, A, Op>;
565
+ resourceRules?: ResourceSelectionRule[];
530
566
  schema?: A extends z.ZodType
531
567
  ? Op extends z.ZodType
532
568
  ? Res extends z.ZodType
@@ -567,6 +603,7 @@ type CommandDefBase =
567
603
  pagination?: PaginationInfo;
568
604
  tags?: string[];
569
605
  schema?: CommandSchemas;
606
+ resourceRules?: ResourceSelectionRule[];
570
607
  webUrl?: string | ((ctx: CommandContext) => string | undefined | null);
571
608
  handler(ctx: CommandContext): unknown | Promise<unknown>;
572
609
  subcommands?: SubcommandDefinition[];
@@ -587,6 +624,7 @@ type CommandDefBase =
587
624
  pagination?: PaginationInfo;
588
625
  tags?: string[];
589
626
  schema?: CommandSchemas;
627
+ resourceRules?: ResourceSelectionRule[];
590
628
  webUrl?: string | ((ctx: CommandContext) => string | undefined | null);
591
629
  handler?: undefined;
592
630
  subcommands: SubcommandDefinition[];
@@ -607,7 +645,10 @@ type SubcommandDefBase =
607
645
  pagination?: PaginationInfo;
608
646
  tags?: string[];
609
647
  schema?: CommandSchemas;
648
+ resourceRules?: ResourceSelectionRule[];
610
649
  webUrl?: string | ((ctx: CommandContext) => string | undefined | null);
650
+ requires?: Requires;
651
+ optional?: Optional;
611
652
  handler(ctx: CommandContext): unknown | Promise<unknown>;
612
653
  subcommands?: SubcommandDefinition[];
613
654
  }
@@ -625,7 +666,10 @@ type SubcommandDefBase =
625
666
  pagination?: PaginationInfo;
626
667
  tags?: string[];
627
668
  schema?: CommandSchemas;
669
+ resourceRules?: ResourceSelectionRule[];
628
670
  webUrl?: string | ((ctx: CommandContext) => string | undefined | null);
671
+ requires?: Requires;
672
+ optional?: Optional;
629
673
  handler?: undefined;
630
674
  subcommands: SubcommandDefinition[];
631
675
  };
@@ -5,6 +5,7 @@ import { getVersion, getCompareUrl, getReleaseUrl, toTag } from './version';
5
5
  import * as tui from './tui';
6
6
  import { saveConfig } from './config';
7
7
  import { $ } from 'bun';
8
+ import { getExecutingAgent } from './agent-detection';
8
9
 
9
10
  const ONE_HOUR_MS = 60 * 60 * 1000;
10
11
 
@@ -33,6 +34,11 @@ function shouldSkipCheck(
33
34
  return true;
34
35
  }
35
36
 
37
+ // Skip if running from an AI coding agent (don't interrupt with upgrade prompts)
38
+ if (getExecutingAgent()) {
39
+ return true;
40
+ }
41
+
36
42
  // Skip if no TTY (CI, redirected output, etc.)
37
43
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
38
44
  return true;