@tulipes/cli 0.2.0 → 0.3.0-rc.2

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 (110) hide show
  1. package/dist/config-check.js +1 -1
  2. package/dist/env-check.d.ts +5 -3
  3. package/dist/env-check.js +26 -19
  4. package/dist/env-check.js.map +1 -1
  5. package/dist/main.js +83 -19
  6. package/dist/main.js.map +1 -1
  7. package/dist/migrate-0.12-env.d.ts +36 -0
  8. package/dist/migrate-0.12-env.js +250 -0
  9. package/dist/migrate-0.12-env.js.map +1 -0
  10. package/dist/migrate-0.12-scaffold.d.ts +1 -0
  11. package/dist/migrate-0.12-scaffold.js +197 -0
  12. package/dist/migrate-0.12-scaffold.js.map +1 -0
  13. package/dist/migrate-0.12.d.ts +47 -0
  14. package/dist/migrate-0.12.js +210 -0
  15. package/dist/migrate-0.12.js.map +1 -0
  16. package/dist/migrate.d.ts +3 -1
  17. package/dist/migrate.js +11 -5
  18. package/dist/migrate.js.map +1 -1
  19. package/dist/new-module.d.ts +7 -0
  20. package/dist/new-module.js +35 -16
  21. package/dist/new-module.js.map +1 -1
  22. package/dist/roles.d.ts +15 -0
  23. package/dist/roles.js +54 -0
  24. package/dist/roles.js.map +1 -0
  25. package/dist/routes.d.ts +7 -2
  26. package/dist/routes.js +19 -10
  27. package/dist/routes.js.map +1 -1
  28. package/dist/spec.d.ts +2 -0
  29. package/dist/spec.js +13 -11
  30. package/dist/spec.js.map +1 -1
  31. package/dist/sync.js +66 -53
  32. package/dist/sync.js.map +1 -1
  33. package/package.json +4 -4
  34. package/templates/AGENTS.md +35 -23
  35. package/templates/app/.envs/.env.development +2 -1
  36. package/templates/app/.envs/.env.production +2 -2
  37. package/templates/app/.envs/.env.staging +2 -2
  38. package/templates/app/README.md +44 -29
  39. package/templates/app/config/app.config.ts +60 -7
  40. package/templates/app/docs/agent-manifest.json +8 -681
  41. package/templates/app/modules/agent/controllers/{agent.controllers.ts → web.agent.controllers.ts} +1 -1
  42. package/templates/app/modules/agent/routes/{agent.routes.ts → web.agent.routes.ts} +4 -4
  43. package/templates/app/modules/auth/bootstrap/credentials.bootstrap.ts +20 -12
  44. package/templates/app/modules/auth/bootstrap/seed-admin.bootstrap.ts +4 -2
  45. package/templates/app/modules/auth/controllers/{auth.controllers.ts → web.auth.controllers.ts} +1 -1
  46. package/templates/app/modules/auth/helpers/passport.ts +1 -1
  47. package/templates/app/modules/auth/helpers/session-cache.ts +3 -3
  48. package/templates/app/modules/auth/helpers/tokens.ts +3 -5
  49. package/templates/app/modules/auth/module.acl.ts +31 -9
  50. package/templates/app/modules/auth/module.config.ts +5 -3
  51. package/templates/app/modules/auth/package.json +10 -10
  52. package/templates/app/modules/auth/routes/{auth.routes.ts → web.auth.routes.ts} +15 -10
  53. package/templates/app/modules/auth/tests/auth.test.ts +1 -1
  54. package/templates/app/modules/config/controllers/{config.controllers.ts → bo.config.controllers.ts} +3 -2
  55. package/templates/app/modules/config/helpers/audit.ts +1 -1
  56. package/templates/app/modules/config/helpers/describe.ts +35 -26
  57. package/templates/app/modules/config/module.acl.ts +1 -1
  58. package/templates/app/modules/config/routes/{config.routes.ts → bo.config.routes.ts} +5 -5
  59. package/templates/app/modules/config/tests/config.test.ts +14 -6
  60. package/templates/app/modules/core/helpers/cache/index.ts +8 -7
  61. package/templates/app/modules/core/helpers/lazy.ts +3 -3
  62. package/templates/app/modules/core/helpers/logger/index.ts +24 -16
  63. package/templates/app/modules/core/module.config.ts +5 -3
  64. package/templates/app/modules/core/package.json +46 -19
  65. package/templates/app/modules/core/routes/core.routes.ts +4 -4
  66. package/templates/app/modules/hello/agent/hello.agent.ts +2 -2
  67. package/templates/app/modules/hello/controllers/{hello.controllers.ts → web/hello.controllers.ts} +1 -1
  68. package/templates/app/modules/hello/controllers/{greetings.controllers.ts → web/hello.greetings.controllers.ts} +2 -2
  69. package/templates/app/modules/hello/module.acl.ts +12 -7
  70. package/templates/app/modules/hello/queues/hello.queues.ts +1 -1
  71. package/templates/app/modules/hello/routes/{greetings.routes.ts → web/hello.greetings.routes.ts} +4 -4
  72. package/templates/app/modules/hello/routes/{hello.routes.ts → web/hello.routes.ts} +14 -8
  73. package/templates/app/modules/security/helpers/rate-limit.ts +3 -2
  74. package/templates/app/modules/security/routes/security.routes.ts +4 -4
  75. package/templates/app/modules/settings/bootstrap/log-streams.bootstrap.ts +2 -2
  76. package/templates/app/modules/settings/controllers/{settings.controllers.ts → bo.settings.controllers.ts} +7 -6
  77. package/templates/app/modules/settings/helpers/log-stream.ts +6 -5
  78. package/templates/app/modules/settings/routes/{settings.routes.ts → bo.settings.routes.ts} +3 -3
  79. package/templates/app/modules/settings/tests/settings.test.ts +21 -25
  80. package/templates/app/modules/users/controllers/{users.controllers.ts → bo.users.controllers.ts} +5 -55
  81. package/templates/{overlays/no-queues/modules/users/controllers/users.controllers.ts → app/modules/users/controllers/web.users.controllers.ts} +4 -42
  82. package/templates/app/modules/users/module.acl.ts +4 -4
  83. package/templates/app/modules/users/queues/users.queues.ts +1 -1
  84. package/templates/app/modules/users/routes/bo.users.routes.ts +39 -0
  85. package/templates/app/modules/users/routes/web.users.routes.ts +45 -0
  86. package/templates/app/nginx/production.conf +1 -1
  87. package/templates/app/scripts/deploy-nginx.ts +3 -2
  88. package/templates/app/tests/support.ts +4 -3
  89. package/templates/claude/skills/tulipes-agent-tool/SKILL.md +6 -4
  90. package/templates/claude/skills/tulipes-boot-errors/SKILL.md +13 -7
  91. package/templates/claude/skills/tulipes-config/SKILL.md +6 -4
  92. package/templates/claude/skills/tulipes-endpoint/SKILL.md +34 -15
  93. package/templates/claude/skills/tulipes-env-variable/SKILL.md +62 -37
  94. package/templates/claude/skills/tulipes-i18n/SKILL.md +20 -1
  95. package/templates/claude/skills/tulipes-module/SKILL.md +10 -5
  96. package/templates/claude/skills/tulipes-permissions/SKILL.md +123 -35
  97. package/templates/claude/skills/tulipes-queue/SKILL.md +3 -2
  98. package/templates/claude/skills/tulipes-settings/SKILL.md +9 -8
  99. package/templates/claude/skills/tulipes-spec/SKILL.md +12 -2
  100. package/templates/minimal/config/app.config.ts +13 -3
  101. package/templates/minimal/modules/agent/routes/{agent.routes.ts → web.agent.routes.ts} +2 -2
  102. package/templates/minimal/modules/core/module.acl.ts +7 -1
  103. package/templates/minimal/modules/core/package.json +4 -4
  104. package/templates/minimal/modules/hello/module.acl.ts +1 -1
  105. package/templates/minimal/modules/hello/routes/{health.routes.ts → web.hello.health.routes.ts} +1 -1
  106. package/templates/minimal/modules/hello/routes/{hello.routes.ts → web.hello.routes.ts} +1 -1
  107. package/templates/overlays/no-queues/modules/hello/controllers/{greetings.controllers.ts → web/hello.greetings.controllers.ts} +1 -1
  108. package/templates/overlays/no-queues/modules/users/controllers/bo.users.controllers.ts +57 -0
  109. package/templates/versions.json +8 -8
  110. package/templates/app/modules/users/routes/users.routes.ts +0 -60
@@ -4,591 +4,32 @@
4
4
  },
5
5
  "authorization": "acl",
6
6
  "modules": [
7
- {
8
- "name": "auth",
9
- "tools": [
10
- "auth_register",
11
- "auth_login",
12
- "auth_refresh",
13
- "auth_logout",
14
- "auth_me",
15
- "auth_sessions",
16
- "auth_session-end",
17
- "auth_password"
18
- ]
19
- },
20
- {
21
- "name": "users",
22
- "tools": [
23
- "users_read",
24
- "users_delete",
25
- "users_read-deleted",
26
- "users_create",
27
- "users_ping",
28
- "users_demo-missing",
29
- "users_demo-boom"
30
- ]
31
- },
32
7
  {
33
8
  "name": "hello",
34
9
  "summary": "Greets callers and counts how often each greeting is used.",
35
10
  "tools": [
36
- "hello_greet",
37
- "hello_greet-name",
38
- "hello_list-greetings",
39
- "hello_use-greeting",
40
- "hello_reset-counts"
41
- ]
42
- },
43
- {
44
- "name": "config",
45
- "tools": [
46
- "config_read",
47
- "config_describe",
48
- "config_write"
11
+ "hello_web_greetings",
12
+ "hello_bo_greetings_reset"
49
13
  ]
50
14
  }
51
15
  ],
52
16
  "tools": [
53
17
  {
54
- "name": "auth_register",
55
- "module": "auth",
56
- "permission": "auth:register",
57
- "title": "Register",
58
- "description": "Create an account and its credential",
59
- "input_schema": {
60
- "type": "object",
61
- "properties": {
62
- "body": {
63
- "type": "object",
64
- "properties": {
65
- "email": {
66
- "type": "string",
67
- "format": "email",
68
- "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
69
- },
70
- "password": {
71
- "type": "string",
72
- "minLength": 8
73
- }
74
- },
75
- "required": [
76
- "email",
77
- "password"
78
- ],
79
- "additionalProperties": false
80
- }
81
- },
82
- "required": [
83
- "body"
84
- ],
85
- "additionalProperties": false
86
- },
87
- "read_only": false,
88
- "transport": {
89
- "kind": "http",
90
- "method": "POST",
91
- "path": "/api/v1/auth/register"
92
- }
93
- },
94
- {
95
- "name": "auth_login",
96
- "module": "auth",
97
- "permission": "auth:login",
98
- "title": "Log in",
99
- "description": "Exchange email and password for a token pair",
100
- "input_schema": {
101
- "type": "object",
102
- "properties": {
103
- "body": {
104
- "type": "object",
105
- "properties": {
106
- "email": {
107
- "type": "string",
108
- "format": "email",
109
- "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
110
- },
111
- "password": {
112
- "type": "string",
113
- "minLength": 1
114
- }
115
- },
116
- "required": [
117
- "email",
118
- "password"
119
- ],
120
- "additionalProperties": false
121
- }
122
- },
123
- "required": [
124
- "body"
125
- ],
126
- "additionalProperties": false
127
- },
128
- "read_only": false,
129
- "transport": {
130
- "kind": "http",
131
- "method": "POST",
132
- "path": "/api/v1/auth/login"
133
- }
134
- },
135
- {
136
- "name": "auth_refresh",
137
- "module": "auth",
138
- "permission": "auth:refresh",
139
- "title": "Refresh tokens",
140
- "description": "Rotate a refresh token for a new pair",
141
- "input_schema": {
142
- "type": "object",
143
- "properties": {
144
- "body": {
145
- "type": "object",
146
- "properties": {
147
- "refresh_token": {
148
- "type": "string",
149
- "minLength": 1
150
- }
151
- },
152
- "required": [
153
- "refresh_token"
154
- ],
155
- "additionalProperties": false
156
- }
157
- },
158
- "required": [
159
- "body"
160
- ],
161
- "additionalProperties": false
162
- },
163
- "read_only": false,
164
- "transport": {
165
- "kind": "http",
166
- "method": "POST",
167
- "path": "/api/v1/auth/refresh"
168
- }
169
- },
170
- {
171
- "name": "auth_logout",
172
- "module": "auth",
173
- "permission": "auth:logout",
174
- "title": "Log out",
175
- "description": "Revoke this session immediately",
176
- "input_schema": {
177
- "type": "object",
178
- "properties": {},
179
- "required": [],
180
- "additionalProperties": false
181
- },
182
- "read_only": false,
183
- "transport": {
184
- "kind": "http",
185
- "method": "POST",
186
- "path": "/api/v1/auth/logout"
187
- }
188
- },
189
- {
190
- "name": "auth_me",
191
- "module": "auth",
192
- "permission": "auth:me",
193
- "title": "Who am I",
194
- "description": "The caller and the session behind this request",
195
- "input_schema": {
196
- "type": "object",
197
- "properties": {},
198
- "required": [],
199
- "additionalProperties": false
200
- },
201
- "read_only": true,
202
- "transport": {
203
- "kind": "http",
204
- "method": "GET",
205
- "path": "/api/v1/auth/me"
206
- }
207
- },
208
- {
209
- "name": "auth_sessions",
210
- "module": "auth",
211
- "permission": "auth:sessions",
212
- "title": "List sessions",
213
- "description": "Every device this account is signed in on",
214
- "input_schema": {
215
- "type": "object",
216
- "properties": {},
217
- "required": [],
218
- "additionalProperties": false
219
- },
220
- "read_only": true,
221
- "transport": {
222
- "kind": "http",
223
- "method": "GET",
224
- "path": "/api/v1/auth/sessions"
225
- }
226
- },
227
- {
228
- "name": "auth_session-end",
229
- "module": "auth",
230
- "permission": "auth:session-end",
231
- "title": "End a session",
232
- "description": "Sign one other device out",
233
- "input_schema": {
234
- "type": "object",
235
- "properties": {
236
- "params": {
237
- "type": "object",
238
- "properties": {
239
- "sid": {
240
- "type": "string",
241
- "format": "uuid",
242
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$"
243
- }
244
- },
245
- "required": [
246
- "sid"
247
- ],
248
- "additionalProperties": false
249
- }
250
- },
251
- "required": [
252
- "params"
253
- ],
254
- "additionalProperties": false
255
- },
256
- "read_only": false,
257
- "transport": {
258
- "kind": "http",
259
- "method": "DELETE",
260
- "path": "/api/v1/auth/sessions/:sid"
261
- }
262
- },
263
- {
264
- "name": "auth_password",
265
- "module": "auth",
266
- "permission": "auth:password",
267
- "title": "Change password",
268
- "description": "Set a new password and end every other session",
269
- "input_schema": {
270
- "type": "object",
271
- "properties": {
272
- "body": {
273
- "type": "object",
274
- "properties": {
275
- "password": {
276
- "type": "string",
277
- "minLength": 8
278
- }
279
- },
280
- "required": [
281
- "password"
282
- ],
283
- "additionalProperties": false
284
- }
285
- },
286
- "required": [
287
- "body"
288
- ],
289
- "additionalProperties": false
290
- },
291
- "read_only": false,
292
- "transport": {
293
- "kind": "http",
294
- "method": "POST",
295
- "path": "/api/v1/auth/password"
296
- }
297
- },
298
- {
299
- "name": "users_read",
300
- "module": "users",
301
- "permission": "users:read",
302
- "title": "List users",
303
- "description": "Page through accounts, clamped by the shared bounds",
304
- "input_schema": {
305
- "type": "object",
306
- "properties": {
307
- "query": {
308
- "type": "object",
309
- "properties": {
310
- "page": {
311
- "type": "integer",
312
- "minimum": 1,
313
- "maximum": 9007199254740991
314
- },
315
- "per_page": {
316
- "type": "integer",
317
- "minimum": 1,
318
- "maximum": 100
319
- }
320
- },
321
- "additionalProperties": false
322
- }
323
- },
324
- "required": [],
325
- "additionalProperties": false
326
- },
327
- "read_only": true,
328
- "transport": {
329
- "kind": "http",
330
- "method": "GET",
331
- "path": "/users/"
332
- }
333
- },
334
- {
335
- "name": "users_delete",
336
- "module": "users",
337
- "permission": "users:delete",
338
- "title": "Soft-delete a user",
339
- "description": "Flags the account; ordinary queries stop returning it",
340
- "input_schema": {
341
- "type": "object",
342
- "properties": {
343
- "params": {
344
- "type": "object",
345
- "properties": {
346
- "email": {
347
- "type": "string",
348
- "format": "email",
349
- "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
350
- }
351
- },
352
- "required": [
353
- "email"
354
- ],
355
- "additionalProperties": false
356
- }
357
- },
358
- "required": [
359
- "params"
360
- ],
361
- "additionalProperties": false
362
- },
363
- "read_only": false,
364
- "transport": {
365
- "kind": "http",
366
- "method": "DELETE",
367
- "path": "/users/:email"
368
- }
369
- },
370
- {
371
- "name": "users_read-deleted",
372
- "module": "users",
373
- "permission": "users:read-deleted",
374
- "title": "List soft-deleted users",
375
- "description": "List soft-deleted users",
376
- "input_schema": {
377
- "type": "object",
378
- "properties": {},
379
- "required": [],
380
- "additionalProperties": false
381
- },
382
- "read_only": true,
383
- "transport": {
384
- "kind": "http",
385
- "method": "GET",
386
- "path": "/users/deleted"
387
- }
388
- },
389
- {
390
- "name": "users_create",
391
- "module": "users",
392
- "permission": "users:create",
393
- "title": "Create a user",
394
- "description": "Adds the account and queues its welcome email",
395
- "input_schema": {
396
- "type": "object",
397
- "properties": {
398
- "body": {
399
- "type": "object",
400
- "properties": {
401
- "email": {
402
- "type": "string",
403
- "format": "email",
404
- "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
405
- }
406
- },
407
- "required": [
408
- "email"
409
- ],
410
- "additionalProperties": false
411
- }
412
- },
413
- "required": [
414
- "body"
415
- ],
416
- "additionalProperties": false
417
- },
418
- "read_only": false,
419
- "transport": {
420
- "kind": "http",
421
- "method": "POST",
422
- "path": "/users/"
423
- }
424
- },
425
- {
426
- "name": "users_ping",
427
- "module": "users",
428
- "permission": "users:ping",
429
- "title": "Users module status",
430
- "description": "Users module status",
431
- "input_schema": {
432
- "type": "object",
433
- "properties": {},
434
- "required": [],
435
- "additionalProperties": false
436
- },
437
- "read_only": true,
438
- "transport": {
439
- "kind": "http",
440
- "method": "GET",
441
- "path": "/users/ping"
442
- }
443
- },
444
- {
445
- "name": "users_demo-missing",
446
- "module": "users",
447
- "permission": "users:demo-missing",
448
- "title": "HttpError demo",
449
- "description": "HttpError demo",
450
- "input_schema": {
451
- "type": "object",
452
- "properties": {},
453
- "required": [],
454
- "additionalProperties": false
455
- },
456
- "read_only": true,
457
- "transport": {
458
- "kind": "http",
459
- "method": "GET",
460
- "path": "/users/missing"
461
- }
462
- },
463
- {
464
- "name": "users_demo-boom",
465
- "module": "users",
466
- "permission": "users:demo-boom",
467
- "title": "Unhandled error demo",
468
- "description": "Unhandled error demo",
469
- "input_schema": {
470
- "type": "object",
471
- "properties": {},
472
- "required": [],
473
- "additionalProperties": false
474
- },
475
- "read_only": true,
476
- "transport": {
477
- "kind": "http",
478
- "method": "GET",
479
- "path": "/users/boom"
480
- }
481
- },
482
- {
483
- "name": "hello_greet",
484
- "module": "hello",
485
- "permission": "hello:greet",
486
- "title": "Greet",
487
- "description": "A greeting in the caller's language",
488
- "input_schema": {
489
- "type": "object",
490
- "properties": {},
491
- "required": [],
492
- "additionalProperties": false
493
- },
494
- "read_only": true,
495
- "transport": {
496
- "kind": "http",
497
- "method": "GET",
498
- "path": "/api/v1/hello"
499
- }
500
- },
501
- {
502
- "name": "hello_greet-name",
503
- "module": "hello",
504
- "permission": "hello:greet-name",
505
- "title": "Greet by name",
506
- "description": "Greet by name",
507
- "input_schema": {
508
- "type": "object",
509
- "properties": {
510
- "params": {
511
- "type": "object",
512
- "properties": {
513
- "name": {
514
- "type": "string"
515
- }
516
- },
517
- "required": [
518
- "name"
519
- ],
520
- "additionalProperties": false
521
- }
522
- },
523
- "required": [
524
- "params"
525
- ],
526
- "additionalProperties": false
527
- },
528
- "read_only": true,
529
- "transport": {
530
- "kind": "http",
531
- "method": "GET",
532
- "path": "/api/v1/hello/:name"
533
- }
534
- },
535
- {
536
- "name": "hello_list-greetings",
18
+ "name": "hello_web_greetings",
537
19
  "module": "hello",
538
- "permission": "hello:list-greetings",
539
- "title": "List greetings",
20
+ "permission": "hello:web:greetings",
540
21
  "description": "The stored greetings, with how often each was used",
541
22
  "input_schema": {
542
23
  "type": "object",
543
24
  "properties": {},
544
- "required": [],
545
- "additionalProperties": false
546
- },
547
- "read_only": true,
548
- "transport": {
549
- "kind": "http",
550
- "method": "GET",
551
- "path": "/api/v1/greetings"
552
- }
553
- },
554
- {
555
- "name": "hello_use-greeting",
556
- "module": "hello",
557
- "permission": "hello:use-greeting",
558
- "title": "Use a greeting",
559
- "description": "Queues a job that counts the use",
560
- "input_schema": {
561
- "type": "object",
562
- "properties": {
563
- "params": {
564
- "type": "object",
565
- "properties": {
566
- "name": {
567
- "type": "string"
568
- }
569
- },
570
- "required": [
571
- "name"
572
- ],
573
- "additionalProperties": false
574
- }
575
- },
576
- "required": [
577
- "params"
578
- ],
579
25
  "additionalProperties": false
580
26
  },
581
- "read_only": false,
582
- "transport": {
583
- "kind": "http",
584
- "method": "POST",
585
- "path": "/api/v1/greetings/:name/use"
586
- }
27
+ "read_only": true
587
28
  },
588
29
  {
589
- "name": "hello_reset-counts",
30
+ "name": "hello_bo_greetings_reset",
590
31
  "module": "hello",
591
- "permission": "hello:reset-counts",
32
+ "permission": "hello:bo:greetings:reset",
592
33
  "description": "Reset the usage counter of every greeting to zero",
593
34
  "input_schema": {
594
35
  "type": "object",
@@ -604,121 +45,7 @@
604
45
  ],
605
46
  "additionalProperties": false
606
47
  },
607
- "read_only": false,
608
- "transport": {
609
- "kind": "action"
610
- }
611
- },
612
- {
613
- "name": "config_read",
614
- "module": "config",
615
- "permission": "config:read",
616
- "title": "Describe the app",
617
- "description": "Every module in load order: manifest, declared variables (names, types, sources; secrets never), settings with schema, live values and stored version, endpoints with the roles that reach them",
618
- "input_schema": {
619
- "type": "object",
620
- "properties": {},
621
- "required": [],
622
- "additionalProperties": false
623
- },
624
- "read_only": true,
625
- "transport": {
626
- "kind": "http",
627
- "method": "GET",
628
- "path": "/api/v1/config/"
629
- }
630
- },
631
- {
632
- "name": "config_describe",
633
- "module": "config",
634
- "permission": "config:describe",
635
- "title": "Describe one module",
636
- "description": "The same description for one module",
637
- "input_schema": {
638
- "type": "object",
639
- "properties": {
640
- "params": {
641
- "type": "object",
642
- "properties": {
643
- "module": {
644
- "type": "string",
645
- "pattern": "^[a-z][a-z0-9-]*$"
646
- }
647
- },
648
- "required": [
649
- "module"
650
- ],
651
- "additionalProperties": false
652
- }
653
- },
654
- "required": [
655
- "params"
656
- ],
657
- "additionalProperties": false
658
- },
659
- "read_only": true,
660
- "transport": {
661
- "kind": "http",
662
- "method": "GET",
663
- "path": "/api/v1/config/:module"
664
- }
665
- },
666
- {
667
- "name": "config_write",
668
- "module": "config",
669
- "permission": "config:write",
670
- "title": "Change a module's settings",
671
- "description": "A patch over the stored values, validated by the module's schema; a stale version is refused; applied at once in every replica, except fields tagged restart, which apply on the next boot",
672
- "input_schema": {
673
- "type": "object",
674
- "properties": {
675
- "params": {
676
- "type": "object",
677
- "properties": {
678
- "module": {
679
- "type": "string",
680
- "pattern": "^[a-z][a-z0-9-]*$"
681
- }
682
- },
683
- "required": [
684
- "module"
685
- ],
686
- "additionalProperties": false
687
- },
688
- "body": {
689
- "type": "object",
690
- "properties": {
691
- "values": {
692
- "type": "object",
693
- "propertyNames": {
694
- "type": "string"
695
- },
696
- "additionalProperties": {}
697
- },
698
- "version": {
699
- "type": "integer",
700
- "exclusiveMinimum": 0,
701
- "maximum": 9007199254740991
702
- }
703
- },
704
- "required": [
705
- "values"
706
- ],
707
- "additionalProperties": false
708
- }
709
- },
710
- "required": [
711
- "params",
712
- "body"
713
- ],
714
- "additionalProperties": false
715
- },
716
- "read_only": false,
717
- "transport": {
718
- "kind": "http",
719
- "method": "PATCH",
720
- "path": "/api/v1/config/:module"
721
- }
48
+ "read_only": false
722
49
  }
723
50
  ]
724
51
  }