pi 0.1.13
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.
- data/README +402 -0
- data/Rakefile +17 -0
- data/bin/pi +6 -0
- data/lib/cli.rb +25 -0
- data/lib/cli/commands/base.rb +47 -0
- data/lib/cli/commands/misc.rb +17 -0
- data/lib/cli/commands/projects.rb +294 -0
- data/lib/cli/commands/user.rb +153 -0
- data/lib/cli/config.rb +96 -0
- data/lib/cli/core_ext.rb +118 -0
- data/lib/cli/errors.rb +19 -0
- data/lib/cli/runner.rb +269 -0
- data/lib/cli/usage.rb +53 -0
- data/lib/cli/version.rb +5 -0
- data/lib/pi.rb +3 -0
- data/lib/pi/client.rb +250 -0
- data/lib/pi/const.rb +15 -0
- metadata +198 -0
data/README
ADDED
@@ -0,0 +1,402 @@
|
|
1
|
+
PI
|
2
|
+
|
3
|
+
This is the command line interface to CloudPi Cloud Application Platform
|
4
|
+
|
5
|
+
_Copyright 2010-2012, Samsung.
|
6
|
+
|
7
|
+
1. For Users
|
8
|
+
|
9
|
+
1.1 Prerequisite: Installing Ruby and RubyGems
|
10
|
+
|
11
|
+
Currently support Ruby version v1.8.7 and v1.9.2
|
12
|
+
Installing Ruby and RubyGems on Windows and Linux computers(If you have already installed Ruby and RubyGems, then you can skip to Installing pi Steps):
|
13
|
+
Windows:
|
14
|
+
Download and install Ruby Installer for Windows from http://www.rubyinstaller.org. The installer already includes RubyGems.
|
15
|
+
Linux:
|
16
|
+
Install the full Ruby package and RubyGems:
|
17
|
+
$ apt-get install ruby-full rubygems
|
18
|
+
|
19
|
+
1.2 Installing pi
|
20
|
+
|
21
|
+
$ gem install pi
|
22
|
+
$ pi version
|
23
|
+
|
24
|
+
1.3 Quick Start
|
25
|
+
|
26
|
+
To get full help for pi command line, run:
|
27
|
+
$ pi help
|
28
|
+
To get info for pi command line, run:
|
29
|
+
$ pi info
|
30
|
+
To login, run:
|
31
|
+
$ pi login
|
32
|
+
|
33
|
+
2. For Developers
|
34
|
+
|
35
|
+
2.1 Dependency
|
36
|
+
|
37
|
+
"json_pure", "~> 1.5.1"
|
38
|
+
"highline", "~> 1.6.1"
|
39
|
+
"rest-client", ">= 1.6.1", "< 1.7.0"
|
40
|
+
"terminal-table", "~> 1.4.2"
|
41
|
+
|
42
|
+
2.2 Creating Your Own Gem
|
43
|
+
|
44
|
+
If you want to use your own pi command line based on currently pi command line, you can rewrite your own code, then create a gem. You can refer to RubyGems Manuals (http://docs.rubygems.org/read/chapter/5). Here are simple steps:
|
45
|
+
a.create a gem specification(for example, you can define my_pi.gemspec)
|
46
|
+
b.$ gem build my_pi.gemspec, after that my_pi.gem is created.
|
47
|
+
c.$ gem push my_pi-1.0.0.gem, that will instantly deploy your gem to the rubygems.org servers, and other users will be able to install it using gem install.
|
48
|
+
d.$ gem install my_pi.gem
|
49
|
+
|
50
|
+
3. Help
|
51
|
+
|
52
|
+
"Usage: pi [options] command [<args>] [command_options]\n" +
|
53
|
+
"Try 'pi help [command]' or 'pi help options' for more information."
|
54
|
+
|
55
|
+
Currently available pi commands are:
|
56
|
+
|
57
|
+
User
|
58
|
+
pi login [url] Login
|
59
|
+
pi logout Logs current user out of the system
|
60
|
+
pi info List system information
|
61
|
+
pi user Display user information
|
62
|
+
pi targets List available targets infomation
|
63
|
+
pi password [newpassword] Change the password for the current user
|
64
|
+
pi github [name] Bind to the github account
|
65
|
+
pi runtimes Display the supported runtimes of the system
|
66
|
+
pi frameworks Display the supported frameworks of the system
|
67
|
+
pi version Display version information
|
68
|
+
pi help [command] Get general help or help on a specific command
|
69
|
+
pi help options Get help on available options
|
70
|
+
|
71
|
+
Project
|
72
|
+
projects List created projects
|
73
|
+
create-project [projectname] Create a new project
|
74
|
+
delete-project [projectname] Delete the project
|
75
|
+
project-events [projectname] List the event info for the project
|
76
|
+
project-tags [projectname] List the tags for the project
|
77
|
+
project-commits [projectname] List the commit log for the project
|
78
|
+
project-apps [projectname] List the applications for the project
|
79
|
+
upload [projectname] Upload the war package for java project
|
80
|
+
|
81
|
+
4. Example
|
82
|
+
|
83
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi login
|
84
|
+
URL: 'http://api.staging.samsungcloud.org'? y
|
85
|
+
User: wangjing
|
86
|
+
Password: *******
|
87
|
+
Successfully logged into [http://api.staging.samsungcloud.org]
|
88
|
+
|
89
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi info
|
90
|
+
|
91
|
+
Name: api
|
92
|
+
Description: CloudPi API Component
|
93
|
+
Build: continuously-20120709034655
|
94
|
+
Version: coulibiac-f85849
|
95
|
+
|
96
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi user
|
97
|
+
|
98
|
+
UserName: wangjing
|
99
|
+
DomainName: bst
|
100
|
+
RoleName: user
|
101
|
+
State: Active
|
102
|
+
Github Account Name: null
|
103
|
+
Github Account Email: null
|
104
|
+
|
105
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi targets
|
106
|
+
|
107
|
+
+-----------------+-----------------------------------------+
|
108
|
+
| Name | URL |
|
109
|
+
+-----------------+-----------------------------------------+
|
110
|
+
| us-east-staging | http://us-east-staging.samsungcloud.org |
|
111
|
+
| ap-ne-test | http://ap-ne-test.samsungcloud.org |
|
112
|
+
+-----------------+-----------------------------------------+
|
113
|
+
|
114
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi password
|
115
|
+
New Password: ****
|
116
|
+
Verify Password: ****
|
117
|
+
ok
|
118
|
+
|
119
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi github
|
120
|
+
Please input your name: ruanzhimin
|
121
|
+
Please input your email: ruanzhimin@gmail.com
|
122
|
+
Please input your password: ****************
|
123
|
+
ok
|
124
|
+
|
125
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi user
|
126
|
+
|
127
|
+
UserName: wangjing
|
128
|
+
DomainName: bst
|
129
|
+
RoleName: user
|
130
|
+
State: Active
|
131
|
+
Github Account Name: ruanzhimin
|
132
|
+
Github Account Email: ruanzhimin@gmail.com
|
133
|
+
|
134
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi runtimes
|
135
|
+
|
136
|
+
+--------+
|
137
|
+
| Name |
|
138
|
+
+--------+
|
139
|
+
| java |
|
140
|
+
| ruby18 |
|
141
|
+
+--------+
|
142
|
+
|
143
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi runtimes --json
|
144
|
+
[
|
145
|
+
"java",
|
146
|
+
"ruby18"
|
147
|
+
]
|
148
|
+
|
149
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi runtimes --trace
|
150
|
+
>>>
|
151
|
+
REQUEST: get http://api.staging.samsungcloud.org/info/runtimes
|
152
|
+
RESPONSE_HEADERS:
|
153
|
+
set_cookie : PLAY_FLASH=;Expires=Mon, 9-Jul-12 09:16:40 GMT;Path=/PLAY_ERRORS=;Expires=Mon, 9-Jul-12 09:16:40 GMT;Path=/PLAY_SESSION=;Expires=M
|
154
|
+
on, 9-Jul-12 09:16:40 GMT;Path=/
|
155
|
+
cache_control : no-cache
|
156
|
+
connection : keep-alive
|
157
|
+
server : Play! Framework;1.2.3;prod
|
158
|
+
content_length : 17
|
159
|
+
content_type : application/json
|
160
|
+
RESPONSE: [200]
|
161
|
+
[
|
162
|
+
"java",
|
163
|
+
"ruby18"
|
164
|
+
]
|
165
|
+
<<<
|
166
|
+
|
167
|
+
+--------+
|
168
|
+
| Name |
|
169
|
+
+--------+
|
170
|
+
| java |
|
171
|
+
| ruby18 |
|
172
|
+
+--------+
|
173
|
+
|
174
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi frameworks
|
175
|
+
|
176
|
+
+----------+
|
177
|
+
| Name |
|
178
|
+
+----------+
|
179
|
+
| lift |
|
180
|
+
| spring |
|
181
|
+
| grails |
|
182
|
+
| java_web |
|
183
|
+
| rails3 |
|
184
|
+
| sinatra |
|
185
|
+
+----------+
|
186
|
+
|
187
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi version
|
188
|
+
pi 0.1.13 Coulibiac
|
189
|
+
|
190
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi v
|
191
|
+
pi 0.1.13 Coulibiac
|
192
|
+
|
193
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi -v
|
194
|
+
pi 0.1.13 Coulibiac
|
195
|
+
|
196
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi --version
|
197
|
+
pi 0.1.13 Coulibiac
|
198
|
+
|
199
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi help
|
200
|
+
|
201
|
+
Usage: pi [options] command [<args>] [command_options]
|
202
|
+
Try 'pi help [command]' or 'pi help options' for more information.
|
203
|
+
|
204
|
+
Currently available pi commands are:
|
205
|
+
|
206
|
+
User
|
207
|
+
pi login [url] Login
|
208
|
+
pi logout Logs current user out of the system
|
209
|
+
pi info List system information
|
210
|
+
pi user Display user information
|
211
|
+
pi targets List available targets infomation
|
212
|
+
pi password [newpassword] Change the password for the current user
|
213
|
+
pi github [name] Bind to the github account
|
214
|
+
pi runtimes Display the supported runtimes of the system
|
215
|
+
pi frameworks Display the supported frameworks of the system
|
216
|
+
pi version Display version information
|
217
|
+
pi help [command] Get general help or help on a specific command
|
218
|
+
pi help options Get help on available options
|
219
|
+
|
220
|
+
Project
|
221
|
+
projects List created projects
|
222
|
+
create-project [projectname] Create a new project
|
223
|
+
delete-project [projectname] Delete the project
|
224
|
+
project-events [projectname] List the event info for the project
|
225
|
+
project-tags [projectname] List the tags for the project
|
226
|
+
project-commits [projectname] List the commit log for the project
|
227
|
+
project-apps [projectname] List the applications for the project
|
228
|
+
upload [projectname] Upload the war package for java project
|
229
|
+
|
230
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi help options
|
231
|
+
|
232
|
+
Available options:
|
233
|
+
|
234
|
+
-t [TKEY]
|
235
|
+
--trace [TKEY]
|
236
|
+
-q, --quiet
|
237
|
+
--verbose
|
238
|
+
--json
|
239
|
+
-v, --version
|
240
|
+
-h, --help
|
241
|
+
--options
|
242
|
+
|
243
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi projects
|
244
|
+
|
245
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
246
|
+
| Name | Runtime | Framework | GitUrl | Description |
|
247
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
248
|
+
| javatmp1 | Java | Spring | http://wangjing@git-staging.samsungcloud.org/wangjing/javatmp1.git | test |
|
249
|
+
| railstmp3 | Ruby | Rails | http://wangjing@git-staging.samsungcloud.org/wangjing/railstmp3.git | test |
|
250
|
+
| testdemowj1 | Ruby | Rails3 | http://wangjing@git-staging.samsungcloud.org/wangjing/testdemowj1.git | test |
|
251
|
+
| testdemowj2 | JVM | Spring | http://wangjing@git-staging.samsungcloud.org/wangjing/testdemowj2.git | test |
|
252
|
+
| tmp1 | ruby18 | rails | http://wangjing@git-staging.samsungcloud.org/wangjing/tmp1.git | test |
|
253
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
254
|
+
|
255
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi create-project
|
256
|
+
Project Name: javatmp1
|
257
|
+
Project 'javatmp1' already exists.
|
258
|
+
Project Name: javademo
|
259
|
+
=============Runtime============
|
260
|
+
1. java
|
261
|
+
2. ruby18
|
262
|
+
Select Runtime: 1
|
263
|
+
Selected Runtime: java
|
264
|
+
=============Frameworks============
|
265
|
+
1. lift
|
266
|
+
2. spring
|
267
|
+
3. grails
|
268
|
+
4. java_web
|
269
|
+
Select Framework: 2
|
270
|
+
Selected Framework: spring
|
271
|
+
Please enter in the description: test
|
272
|
+
Creating project javademo: OK
|
273
|
+
|
274
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi projects
|
275
|
+
|
276
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
277
|
+
| Name | Runtime | Framework | GitUrl | Description |
|
278
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
279
|
+
| javademo | java | spring | http://wangjing@git-staging.samsungcloud.org/wangjing/javademo.git | test |
|
280
|
+
| javatmp1 | Java | Spring | http://wangjing@git-staging.samsungcloud.org/wangjing/javatmp1.git | test |
|
281
|
+
| railstmp3 | Ruby | Rails | http://wangjing@git-staging.samsungcloud.org/wangjing/railstmp3.git | test |
|
282
|
+
| testdemowj1 | Ruby | Rails3 | http://wangjing@git-staging.samsungcloud.org/wangjing/testdemowj1.git | test |
|
283
|
+
| testdemowj2 | JVM | Spring | http://wangjing@git-staging.samsungcloud.org/wangjing/testdemowj2.git | test |
|
284
|
+
| tmp1 | ruby18 | rails | http://wangjing@git-staging.samsungcloud.org/wangjing/tmp1.git | test |
|
285
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
286
|
+
|
287
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi delete-project
|
288
|
+
=============Project Name=======
|
289
|
+
1. javademo
|
290
|
+
2. javatmp1
|
291
|
+
3. railstmp3
|
292
|
+
4. testdemowj1
|
293
|
+
5. testdemowj2
|
294
|
+
6. tmp1
|
295
|
+
Select Project: 1
|
296
|
+
Selected Project: javademo
|
297
|
+
Deleting project [javademo]: OK
|
298
|
+
|
299
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi projects
|
300
|
+
|
301
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
302
|
+
| Name | Runtime | Framework | GitUrl | Description |
|
303
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
304
|
+
| javatmp1 | Java | Spring | http://wangjing@git-staging.samsungcloud.org/wangjing/javatmp1.git | test |
|
305
|
+
| railstmp3 | Ruby | Rails | http://wangjing@git-staging.samsungcloud.org/wangjing/railstmp3.git | test |
|
306
|
+
| testdemowj1 | Ruby | Rails3 | http://wangjing@git-staging.samsungcloud.org/wangjing/testdemowj1.git | test |
|
307
|
+
| testdemowj2 | JVM | Spring | http://wangjing@git-staging.samsungcloud.org/wangjing/testdemowj2.git | test |
|
308
|
+
| tmp1 | ruby18 | rails | http://wangjing@git-staging.samsungcloud.org/wangjing/tmp1.git | test |
|
309
|
+
+-------------+---------+-----------+-----------------------------------------------------------------------+-------------+
|
310
|
+
|
311
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi project-apps
|
312
|
+
=============Project Name=======
|
313
|
+
1. javatmp1
|
314
|
+
2. railstmp3
|
315
|
+
3. testdemowj1
|
316
|
+
4. testdemowj2
|
317
|
+
5. tmp1
|
318
|
+
Select Project: 5
|
319
|
+
Selected Project: tmp1
|
320
|
+
No applications
|
321
|
+
|
322
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi project-events
|
323
|
+
=============Project Name=======
|
324
|
+
1. javatmp1
|
325
|
+
2. railstmp3
|
326
|
+
3. testdemowj1
|
327
|
+
4. testdemowj2
|
328
|
+
5. tmp1
|
329
|
+
Select Project: 5
|
330
|
+
Selected Project: tmp1
|
331
|
+
No Events.
|
332
|
+
|
333
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi project-tags
|
334
|
+
=============Project Name=======
|
335
|
+
1. javatmp1
|
336
|
+
2. railstmp3
|
337
|
+
3. testdemowj1
|
338
|
+
4. testdemowj2
|
339
|
+
5. tmp1
|
340
|
+
Select Project: 5
|
341
|
+
Selected Project: tmp1
|
342
|
+
|
343
|
+
+--------+
|
344
|
+
| Tag |
|
345
|
+
+--------+
|
346
|
+
| v0.0.0 |
|
347
|
+
+--------+
|
348
|
+
|
349
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi project-commits
|
350
|
+
=============Project Name=======
|
351
|
+
1. javatmp1
|
352
|
+
2. railstmp3
|
353
|
+
3. testdemowj1
|
354
|
+
4. testdemowj2
|
355
|
+
5. tmp1
|
356
|
+
Select Project: 5
|
357
|
+
Selected Project: tmp1
|
358
|
+
|
359
|
+
=============Tag=======
|
360
|
+
1. v0.0.0
|
361
|
+
Select Tag: 1
|
362
|
+
Selected Tag: v0.0.0
|
363
|
+
+------------------------------------------+---------------------------+--------------+
|
364
|
+
| CommitId | Date | Comment |
|
365
|
+
+------------------------------------------+---------------------------+--------------+
|
366
|
+
| b3d90cb9d692f7a01d0043509557c54a6a8903e4 | 2012-07-03 08:50:50 +0000 | init project |
|
367
|
+
+------------------------------------------+---------------------------+--------------+
|
368
|
+
|
369
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi upload
|
370
|
+
=============Project Name=======
|
371
|
+
1. javatmp1
|
372
|
+
2. railstmp3
|
373
|
+
3. testdemowj1
|
374
|
+
4. testdemowj2
|
375
|
+
5. tmp1
|
376
|
+
Select Project: 1
|
377
|
+
Selected Project: javatmp1
|
378
|
+
Please enter in the description: test
|
379
|
+
Please enter the version: test version
|
380
|
+
Please enter the path of upload war file: /home/wangjing/workspace/sample.war
|
381
|
+
Deployment path does not exist!
|
382
|
+
Please enter the path of upload war file: /home/wangjing/workspace/project/sample
|
383
|
+
Please enter the path of upload war file:
|
384
|
+
? /home/wangjing/workspace/project/sample.war
|
385
|
+
Uploading OK
|
386
|
+
|
387
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi logout
|
388
|
+
Successfully logged out of [http://api.staging.samsungcloud.org]
|
389
|
+
|
390
|
+
5. Common Exception
|
391
|
+
|
392
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi login
|
393
|
+
URL: 'http://api.staging.samsungcloud.org'? n
|
394
|
+
URL: http://test.org
|
395
|
+
User: wangjing
|
396
|
+
Password: *******
|
397
|
+
Problem with login, Cannot access target (getaddrinfo: Name or service not known), try again or register for an account.
|
398
|
+
|
399
|
+
wangjing@wangjing-samsung-Desktop-System:~/git/pi/bin$ ./pi project-events tmp4--trace
|
400
|
+
Error (HTTP 500): {"httpCode":500,"errorCode":3004,"httpDescription":"Internal Server Error","errorDescription":"The project is
|
401
|
+
not belongs to current account.Project name : tmp4--trace"}
|
402
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc "Run specs"
|
5
|
+
task :spec do
|
6
|
+
sh('bundle install')
|
7
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
8
|
+
t.spec_opts = %w(-fs -c)
|
9
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Synonym for spec"
|
14
|
+
task :test => :spec
|
15
|
+
desc "Synonym for spec"
|
16
|
+
task :tests => :spec
|
17
|
+
task :default => :spec
|
data/bin/pi
ADDED
data/lib/cli.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
ROOT = File.expand_path(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
module PI
|
5
|
+
|
6
|
+
autoload :Client, "#{ROOT}/pi/client"
|
7
|
+
|
8
|
+
module Cli
|
9
|
+
|
10
|
+
autoload :Config, "#{ROOT}/cli/config"
|
11
|
+
autoload :Runner, "#{ROOT}/cli/runner"
|
12
|
+
|
13
|
+
module Command
|
14
|
+
autoload :Base, "#{ROOT}/cli/commands/base"
|
15
|
+
autoload :Projects, "#{ROOT}/cli/commands/projects"
|
16
|
+
autoload :Misc, "#{ROOT}/cli/commands/misc"
|
17
|
+
autoload :User, "#{ROOT}/cli/commands/user"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
require "#{ROOT}/cli/version"
|
24
|
+
require "#{ROOT}/cli/core_ext"
|
25
|
+
require "#{ROOT}/cli/errors"
|