jui-tools-mcp-server 2.16.0 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.github/workflows/test.yml +2 -1
  2. package/README.md +16 -1
  3. package/dist/index.js +16 -1
  4. package/dist/tools/infra/infra_check.d.ts +10 -0
  5. package/dist/tools/infra/infra_check.js +43 -0
  6. package/dist/tools/infra/infra_common.d.ts +40 -0
  7. package/dist/tools/infra/infra_common.js +44 -0
  8. package/dist/tools/infra/infra_cost.d.ts +3 -0
  9. package/dist/tools/infra/infra_cost.js +181 -0
  10. package/dist/tools/infra/infra_load_validate.d.ts +8 -0
  11. package/dist/tools/infra/infra_load_validate.js +39 -0
  12. package/dist/tools/infra/infra_prices_validate.d.ts +7 -0
  13. package/dist/tools/infra/infra_prices_validate.js +34 -0
  14. package/dist/tools/infra/infra_seed.d.ts +27 -0
  15. package/dist/tools/infra/infra_seed.js +81 -0
  16. package/dist/tools/infra/infra_validate.d.ts +3 -0
  17. package/dist/tools/infra/infra_validate.js +74 -0
  18. package/package.json +1 -1
  19. package/scripts/record-infra-fixtures.sh +143 -0
  20. package/src/index.ts +17 -1
  21. package/src/tools/infra/infra_check.ts +49 -0
  22. package/src/tools/infra/infra_common.ts +69 -0
  23. package/src/tools/infra/infra_cost.ts +177 -0
  24. package/src/tools/infra/infra_load_validate.ts +46 -0
  25. package/src/tools/infra/infra_prices_validate.ts +41 -0
  26. package/src/tools/infra/infra_seed.ts +88 -0
  27. package/src/tools/infra/infra_validate.ts +79 -0
  28. package/tests/fixtures/infra/RECORDED_FROM +1 -0
  29. package/tests/fixtures/infra/answers-without-plan.json +9 -0
  30. package/tests/fixtures/infra/check-infra.json +103 -0
  31. package/tests/fixtures/infra/cost-infra.day.json +10080 -0
  32. package/tests/fixtures/infra/cost-infra.month-by-node.json +492 -0
  33. package/tests/fixtures/infra/cost-infra.month.json +398 -0
  34. package/tests/fixtures/infra/cost-infra.plan-bad.json +16 -0
  35. package/tests/fixtures/infra/cost-infra.plan-move-account.json +167 -0
  36. package/tests/fixtures/infra/cost-infra.plan-move.json +174 -0
  37. package/tests/fixtures/infra/cost-infra.plan-none.json +16 -0
  38. package/tests/fixtures/infra/cost-infra.plan-shrink.json +162 -0
  39. package/tests/fixtures/infra/cost-infra.refused.json +5 -0
  40. package/tests/fixtures/infra/seed-infra.draft.json +233 -0
  41. package/tests/fixtures/infra/seed-infra.report.json +46 -0
  42. package/tests/fixtures/infra/validate-infra-load.errors.json +40 -0
  43. package/tests/fixtures/infra/validate-infra-load.ok.json +29 -0
  44. package/tests/fixtures/infra/validate-infra-load.unreadable.json +7 -0
  45. package/tests/fixtures/infra/validate-infra-prices.ok.json +9 -0
  46. package/tests/fixtures/infra/validate-infra.errors.json +43 -0
  47. package/tests/fixtures/infra/validate-infra.ok.json +30 -0
  48. package/tests/fixtures/infra/validate-infra.plan-both.json +504 -0
  49. package/tests/fixtures/infra/validate-infra.plan-duplicate.json +539 -0
  50. package/tests/fixtures/infra/validate-infra.plan-edge-end.json +539 -0
  51. package/tests/fixtures/infra/validate-infra.plan-half.json +49 -0
  52. package/tests/fixtures/infra/validate-infra.plan-move.json +506 -0
  53. package/tests/fixtures/infra/validate-infra.plan-none.json +49 -0
  54. package/tests/fixtures/infra/validate-infra.plan-order-unknown.json +539 -0
  55. package/tests/fixtures/infra/validate-infra.plan-remove-missing.json +539 -0
  56. package/tests/fixtures/infra/validate-infra.plans.json +506 -0
  57. package/tests/fixtures/infra/validate-infra.unreadable.json +6 -0
  58. package/tests/tool_count.test.ts +1 -1
  59. package/tests/tools_infra.test.ts +540 -0
@@ -0,0 +1,398 @@
1
+ {
2
+ "ok": true,
3
+ "dir": "docs/infra/load",
4
+ "scenario": "ordinary",
5
+ "scenarios": [
6
+ {
7
+ "id": "ordinary",
8
+ "label": "ふだんの月",
9
+ "file": "ordinary.json",
10
+ "month": "2026-11",
11
+ "environment": "production"
12
+ },
13
+ {
14
+ "id": "sale",
15
+ "label": "セールの月",
16
+ "file": "sale.json",
17
+ "month": "2026-11",
18
+ "environment": "production"
19
+ }
20
+ ],
21
+ "problems": {
22
+ "count": 0,
23
+ "errors": 0,
24
+ "first": []
25
+ },
26
+ "prices": {
27
+ "warnings": [],
28
+ "warningCount": 0
29
+ },
30
+ "month": {
31
+ "scenario": "ordinary",
32
+ "month": "2026-11",
33
+ "usd": 1018.5974779999989,
34
+ "by": "provider",
35
+ "keys": [
36
+ {
37
+ "key": "aws",
38
+ "label": "aws"
39
+ },
40
+ {
41
+ "key": "sendgrid",
42
+ "label": "sendgrid"
43
+ }
44
+ ],
45
+ "days": [
46
+ {
47
+ "date": "2026-11-01",
48
+ "usd": 33.25126966666666,
49
+ "stack": {
50
+ "aws": 33.251269666666666
51
+ },
52
+ "overflowHours": 0,
53
+ "atMaxHours": 0
54
+ },
55
+ {
56
+ "date": "2026-11-02",
57
+ "usd": 34.25409766666661,
58
+ "stack": {
59
+ "aws": 34.254097666666674
60
+ },
61
+ "overflowHours": 0,
62
+ "atMaxHours": 0
63
+ },
64
+ {
65
+ "date": "2026-11-03",
66
+ "usd": 34.25409766666661,
67
+ "stack": {
68
+ "aws": 34.254097666666674
69
+ },
70
+ "overflowHours": 0,
71
+ "atMaxHours": 0
72
+ },
73
+ {
74
+ "date": "2026-11-04",
75
+ "usd": 34.25409766666661,
76
+ "stack": {
77
+ "aws": 34.254097666666674
78
+ },
79
+ "overflowHours": 0,
80
+ "atMaxHours": 0
81
+ },
82
+ {
83
+ "date": "2026-11-05",
84
+ "usd": 34.25409766666661,
85
+ "stack": {
86
+ "aws": 34.25409766666667
87
+ },
88
+ "overflowHours": 0,
89
+ "atMaxHours": 0
90
+ },
91
+ {
92
+ "date": "2026-11-06",
93
+ "usd": 34.25409766666661,
94
+ "stack": {
95
+ "aws": 34.25409766666667
96
+ },
97
+ "overflowHours": 0,
98
+ "atMaxHours": 0
99
+ },
100
+ {
101
+ "date": "2026-11-07",
102
+ "usd": 33.25126966666666,
103
+ "stack": {
104
+ "aws": 33.25126966666667
105
+ },
106
+ "overflowHours": 0,
107
+ "atMaxHours": 0
108
+ },
109
+ {
110
+ "date": "2026-11-08",
111
+ "usd": 33.25126966666666,
112
+ "stack": {
113
+ "aws": 33.25126966666667
114
+ },
115
+ "overflowHours": 0,
116
+ "atMaxHours": 0
117
+ },
118
+ {
119
+ "date": "2026-11-09",
120
+ "usd": 34.25409766666661,
121
+ "stack": {
122
+ "aws": 34.254097666666674
123
+ },
124
+ "overflowHours": 0,
125
+ "atMaxHours": 0
126
+ },
127
+ {
128
+ "date": "2026-11-10",
129
+ "usd": 34.25409766666661,
130
+ "stack": {
131
+ "aws": 34.25409766666666
132
+ },
133
+ "overflowHours": 0,
134
+ "atMaxHours": 0
135
+ },
136
+ {
137
+ "date": "2026-11-11",
138
+ "usd": 34.25409766666661,
139
+ "stack": {
140
+ "aws": 34.25409766666663
141
+ },
142
+ "overflowHours": 0,
143
+ "atMaxHours": 0
144
+ },
145
+ {
146
+ "date": "2026-11-12",
147
+ "usd": 34.25409766666661,
148
+ "stack": {
149
+ "aws": 34.25409766666663
150
+ },
151
+ "overflowHours": 0,
152
+ "atMaxHours": 0
153
+ },
154
+ {
155
+ "date": "2026-11-13",
156
+ "usd": 34.25409766666661,
157
+ "stack": {
158
+ "aws": 34.25409766666663
159
+ },
160
+ "overflowHours": 0,
161
+ "atMaxHours": 0
162
+ },
163
+ {
164
+ "date": "2026-11-14",
165
+ "usd": 33.251269666666666,
166
+ "stack": {
167
+ "aws": 33.25126966666663
168
+ },
169
+ "overflowHours": 0,
170
+ "atMaxHours": 0
171
+ },
172
+ {
173
+ "date": "2026-11-15",
174
+ "usd": 33.25126966666667,
175
+ "stack": {
176
+ "aws": 33.25126966666664
177
+ },
178
+ "overflowHours": 0,
179
+ "atMaxHours": 0
180
+ },
181
+ {
182
+ "date": "2026-11-16",
183
+ "usd": 34.25409766666662,
184
+ "stack": {
185
+ "aws": 34.25409766666664
186
+ },
187
+ "overflowHours": 0,
188
+ "atMaxHours": 0
189
+ },
190
+ {
191
+ "date": "2026-11-17",
192
+ "usd": 34.25409766666662,
193
+ "stack": {
194
+ "aws": 34.25409766666664
195
+ },
196
+ "overflowHours": 0,
197
+ "atMaxHours": 0
198
+ },
199
+ {
200
+ "date": "2026-11-18",
201
+ "usd": 34.25409766666662,
202
+ "stack": {
203
+ "aws": 34.25409766666664
204
+ },
205
+ "overflowHours": 0,
206
+ "atMaxHours": 0
207
+ },
208
+ {
209
+ "date": "2026-11-19",
210
+ "usd": 34.25409766666662,
211
+ "stack": {
212
+ "aws": 34.25409766666664
213
+ },
214
+ "overflowHours": 0,
215
+ "atMaxHours": 0
216
+ },
217
+ {
218
+ "date": "2026-11-20",
219
+ "usd": 34.25409766666662,
220
+ "stack": {
221
+ "aws": 34.25409766666664
222
+ },
223
+ "overflowHours": 0,
224
+ "atMaxHours": 0
225
+ },
226
+ {
227
+ "date": "2026-11-21",
228
+ "usd": 33.25126966666667,
229
+ "stack": {
230
+ "aws": 33.25126966666663
231
+ },
232
+ "overflowHours": 0,
233
+ "atMaxHours": 0
234
+ },
235
+ {
236
+ "date": "2026-11-22",
237
+ "usd": 33.25126966666667,
238
+ "stack": {
239
+ "aws": 33.25126966666663
240
+ },
241
+ "overflowHours": 0,
242
+ "atMaxHours": 0
243
+ },
244
+ {
245
+ "date": "2026-11-23",
246
+ "usd": 34.25409766666662,
247
+ "stack": {
248
+ "aws": 34.25409766666664
249
+ },
250
+ "overflowHours": 0,
251
+ "atMaxHours": 0
252
+ },
253
+ {
254
+ "date": "2026-11-24",
255
+ "usd": 34.25409766666662,
256
+ "stack": {
257
+ "aws": 34.25409766666664
258
+ },
259
+ "overflowHours": 0,
260
+ "atMaxHours": 0
261
+ },
262
+ {
263
+ "date": "2026-11-25",
264
+ "usd": 34.25409766666662,
265
+ "stack": {
266
+ "aws": 34.25409766666664
267
+ },
268
+ "overflowHours": 0,
269
+ "atMaxHours": 0
270
+ },
271
+ {
272
+ "date": "2026-11-26",
273
+ "usd": 34.25409766666662,
274
+ "stack": {
275
+ "aws": 34.25409766666664
276
+ },
277
+ "overflowHours": 0,
278
+ "atMaxHours": 0
279
+ },
280
+ {
281
+ "date": "2026-11-27",
282
+ "usd": 34.25409766666662,
283
+ "stack": {
284
+ "aws": 34.25409766666664
285
+ },
286
+ "overflowHours": 0,
287
+ "atMaxHours": 0
288
+ },
289
+ {
290
+ "date": "2026-11-28",
291
+ "usd": 33.25126966666668,
292
+ "stack": {
293
+ "aws": 33.251269666666644
294
+ },
295
+ "overflowHours": 0,
296
+ "atMaxHours": 0
297
+ },
298
+ {
299
+ "date": "2026-11-29",
300
+ "usd": 33.25126966666668,
301
+ "stack": {
302
+ "aws": 33.251269666666644
303
+ },
304
+ "overflowHours": 0,
305
+ "atMaxHours": 0
306
+ },
307
+ {
308
+ "date": "2026-11-30",
309
+ "usd": 34.254097666666624,
310
+ "stack": {
311
+ "aws": 34.254097666666645
312
+ },
313
+ "overflowHours": 0,
314
+ "atMaxHours": 0
315
+ }
316
+ ],
317
+ "noPrice": [
318
+ {
319
+ "node": "mailer",
320
+ "meter": "emails",
321
+ "sku": "emails",
322
+ "unit": "email"
323
+ },
324
+ {
325
+ "node": "api-5xx",
326
+ "meter": "alarm",
327
+ "sku": "alarm",
328
+ "unit": "month"
329
+ }
330
+ ],
331
+ "noRule": [
332
+ "api-role"
333
+ ],
334
+ "loadUndefined": [
335
+ "stripe"
336
+ ],
337
+ "overflowHours": {},
338
+ "warnings": [
339
+ {
340
+ "fn": "price_meter",
341
+ "message": "no price for (no service) emails (email) in ap-northeast-1",
342
+ "detail": {
343
+ "keyword": "cost.no_price",
344
+ "service": "",
345
+ "sku": "emails",
346
+ "unit": "email",
347
+ "region": "ap-northeast-1"
348
+ },
349
+ "node": "mailer",
350
+ "hour": "2026-11-01T00",
351
+ "meter": "emails",
352
+ "short": "(service 無し) emails(email)の価格が、ap-northeast-1 にありません"
353
+ },
354
+ {
355
+ "fn": "price_meter",
356
+ "message": "no price for cloudwatch.alarm alarm (month) in no region",
357
+ "detail": {
358
+ "keyword": "cost.no_price",
359
+ "service": "cloudwatch.alarm",
360
+ "sku": "alarm",
361
+ "unit": "month",
362
+ "region": ""
363
+ },
364
+ "node": "api-5xx",
365
+ "hour": "2026-11-01T00",
366
+ "meter": "alarm",
367
+ "short": "cloudwatch.alarm alarm(month)の価格が、(region 無し) にありません"
368
+ }
369
+ ],
370
+ "warningCount": 2
371
+ },
372
+ "topNodes": [
373
+ {
374
+ "node": "cdn",
375
+ "usd": 455.4774000000002
376
+ },
377
+ {
378
+ "node": "db-prod",
379
+ "usd": 422.3999999999987
380
+ },
381
+ {
382
+ "node": "api-prod",
383
+ "usd": 64.80000000000005
384
+ },
385
+ {
386
+ "node": "assets",
387
+ "usd": 44.55927800000017
388
+ },
389
+ {
390
+ "node": "alb-prod",
391
+ "usd": 29.015999999999977
392
+ },
393
+ {
394
+ "node": "api-prod>db-prod",
395
+ "usd": 2.3447999999999984
396
+ }
397
+ ]
398
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "ok": false,
3
+ "reason": "bad_plan",
4
+ "message": "the plan 'both' has errors: jsonui-doc validate infra --migration both",
5
+ "problems": [
6
+ {
7
+ "file": "both/removals.json",
8
+ "path": "/nodes/0",
9
+ "code": "migration.both",
10
+ "message": "node 'db-prod' is in changes too: it is replaced, not removed",
11
+ "short": "docs/infra/migrations/both/removals.json: /nodes/0 のものが、changes にも書かれています(消さずに差し替えます)(migration.both)",
12
+ "severity": "error",
13
+ "node": null
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,167 @@
1
+ {
2
+ "ok": true,
3
+ "dir": "docs/infra/load",
4
+ "migration": "move",
5
+ "scenario": "sale",
6
+ "scenarios": [
7
+ {
8
+ "id": "ordinary",
9
+ "label": "ふだんの月",
10
+ "file": "ordinary.json",
11
+ "month": "2026-11",
12
+ "environment": "production"
13
+ },
14
+ {
15
+ "id": "sale",
16
+ "label": "セールの月",
17
+ "file": "sale.json",
18
+ "month": "2026-11",
19
+ "environment": "production"
20
+ },
21
+ {
22
+ "id": "staging",
23
+ "label": "staging",
24
+ "file": "staging.json",
25
+ "month": "2026-11",
26
+ "environment": "staging"
27
+ }
28
+ ],
29
+ "old": {
30
+ "usd": 2679.3521999999975,
31
+ "noRule": [
32
+ "api-role"
33
+ ],
34
+ "loadUndefined": [
35
+ "stripe",
36
+ "mailer",
37
+ "assets"
38
+ ],
39
+ "noPrice": [
40
+ "api-5xx"
41
+ ]
42
+ },
43
+ "new": {
44
+ "usd": 2798.7781999999993,
45
+ "noRule": [
46
+ "api-role"
47
+ ],
48
+ "loadUndefined": [
49
+ "stripe",
50
+ "mailer",
51
+ "assets"
52
+ ],
53
+ "noPrice": [
54
+ "api-5xx"
55
+ ]
56
+ },
57
+ "diff": {
58
+ "usd": 119.42600000000175
59
+ },
60
+ "unpricedChanged": [],
61
+ "byNode": [
62
+ {
63
+ "node": "worker-prod",
64
+ "change": "added",
65
+ "unpriced": false,
66
+ "old": 0.0,
67
+ "new": 88.13999999999996,
68
+ "diff": 88.13999999999996
69
+ },
70
+ {
71
+ "node": "db-prod",
72
+ "change": "replaced",
73
+ "unpriced": false,
74
+ "old": 598.2749999999991,
75
+ "new": 629.5609999999991,
76
+ "diff": 31.286000000000058
77
+ },
78
+ {
79
+ "node": "alb-prod",
80
+ "change": "same",
81
+ "unpriced": false,
82
+ "old": 17.496,
83
+ "new": 17.496,
84
+ "diff": 0.0
85
+ },
86
+ {
87
+ "node": "api-prod",
88
+ "change": "same",
89
+ "unpriced": false,
90
+ "old": 88.13999999999996,
91
+ "new": 88.13999999999996,
92
+ "diff": 0.0
93
+ },
94
+ {
95
+ "node": "api-stg",
96
+ "change": "removed",
97
+ "unpriced": false,
98
+ "old": 0.0,
99
+ "new": 0.0,
100
+ "diff": 0.0
101
+ },
102
+ {
103
+ "node": "cdn",
104
+ "change": "same",
105
+ "unpriced": false,
106
+ "old": 1975.4412000000011,
107
+ "new": 1975.4412000000011,
108
+ "diff": 0.0
109
+ }
110
+ ],
111
+ "byProvider": [
112
+ {
113
+ "provider": "aws",
114
+ "old": 2679.352199999997,
115
+ "new": 2798.778199999999,
116
+ "diff": 119.42600000000175
117
+ }
118
+ ],
119
+ "steps": [
120
+ {
121
+ "index": 1,
122
+ "node": "db-prod",
123
+ "usd": 2710.6381999999967,
124
+ "diff": 31.28599999999915,
125
+ "moved": [
126
+ {
127
+ "node": "db-prod",
128
+ "diff": 31.286000000000058
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "index": 2,
134
+ "node": "worker-prod",
135
+ "usd": 2798.7781999999993,
136
+ "diff": 88.1400000000026,
137
+ "moved": [
138
+ {
139
+ "node": "worker-prod",
140
+ "diff": 88.13999999999996
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "index": 3,
146
+ "node": "api-stg",
147
+ "usd": 2798.7781999999993,
148
+ "diff": 0.0,
149
+ "moved": []
150
+ }
151
+ ],
152
+ "account": {
153
+ "on": true,
154
+ "old": 2788.8881999999976,
155
+ "new": 2897.514199999999,
156
+ "diff": 108.62600000000157
157
+ },
158
+ "problems": {
159
+ "count": 0,
160
+ "errors": 0,
161
+ "first": []
162
+ },
163
+ "prices": {
164
+ "warnings": [],
165
+ "warningCount": 0
166
+ }
167
+ }