Repository navigation
Expand file tree
/
Copy pathdocs.html
More file actions
717 lines (599 loc) · 45 KB
/
Copy pathdocs.html
File metadata and controls
717 lines (599 loc) · 45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documentation — DevForge</title>
<meta name="description" content="Quickstart guides, installation instructions, and example commands for all DevForge CLI tools: API Contract Guardian, json2sql, DeployDiff, ConfigDrift, APIAuth, APIGhost, Envault, SchemaForge, click-to-mcp, and DeadCode.">
<meta name="keywords" content="CLI tools documentation, OpenAPI diff, JSON to SQL, infrastructure diff, config drift, devops CLI">
<meta property="og:title" content="DevForge — Documentation">
<meta property="og:description" content="Quickstart guides and installation for all 11 developer CLI tools.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://coding-dev-tools.github.io/devforge/docs.html">
<meta name="twitter:site" content="@DevForge">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="DevForge — Documentation">
<meta name="twitter:description" content="Quickstart guides and installation for all 11 developer CLI tools.">
<meta name="twitter:image" content="https://coding-dev-tools.github.io/devforge/og-image.svg">
<meta property="og:image" content="https://coding-dev-tools.github.io/devforge/og-image.svg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<link rel="canonical" href="https://coding-dev-tools.github.io/devforge/docs.html">
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%20100%20100%27%3E%3Ctext%20y%3D%27.9em%27%20font-size%3D%2790%27%3E%C3%A2%C5%A1%27%3C%2Ftext%3E%3C%2Fsvg%3E">
<meta name="twitter:title" content="DevForge — Documentation">
<meta name="twitter:description" content="Quickstart guides and installation for all 10 developer CLI tools.">
<meta name="twitter:image" content="https://coding-dev-tools.github.io/devforge.dev/og-image.svg">
<meta property="og:image" content="https://coding-dev-tools.github.io/devforge.dev/og-image.svg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%20100%20100%27%3E%3Ctext%20y%3D%27.9em%27%20font-size%3D%2790%27%3E%E2%9B%81%3C%2Ftext%3E%3C%2Fsvg%3E">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', -apple-system, sans-serif; background: #0a0a0b; color: #e1e1e3; line-height: 1.6; }
/* Navigation */
nav { position: fixed; top: 0; width: 100%; z-index: 100; background: rgba(10,10,11,0.85); backdrop-filter: blur(12px); border-bottom: 1px solid #1e1e20; }
nav .inner { max-width: 1100px; margin: 0 auto; padding: 14px 24px; display: flex; align-items: center; justify-content: space-between; }
nav .logo { font-weight: 700; font-size: 1.15rem; color: #fff; letter-spacing: -0.02em; }
nav .logo span { color: #6366f1; }
nav .links a { color: #888; text-decoration: none; font-size: 0.85rem; margin-left: 28px; transition: color .15s; }
nav .links a:hover { color: #fff; }
nav .links a.active { color: #fff; }
/* Hero */
.hero { max-width: 1100px; margin: 0 auto; padding: 140px 24px 60px; text-align: center; }
.hero h1 { font-size: 3rem; font-weight: 800; line-height: 1.15; letter-spacing: -0.04em; color: #fff; }
.hero h1 span { background: linear-gradient(135deg, #6366f1, #a78bfa); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1.05rem; color: #888; max-width: 650px; margin: 16px auto 0; }
.hero .badge { display: inline-block; padding: 6px 16px; border-radius: 32px; font-size: 0.75rem; font-weight: 600; background: rgba(99,102,241,0.12); color: #a78bfa; border: 1px solid rgba(99,102,241,0.2); margin-bottom: 20px; letter-spacing: 0.3px; text-transform: uppercase; }
/* Quick Jump */
.quick-jump { max-width: 1100px; margin: 0 auto; padding: 0 24px 40px; display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; }
.quick-jump a { padding: 8px 18px; border-radius: 8px; font-size: 0.82rem; font-weight: 500; text-decoration: none; background: #121213; color: #888; border: 1px solid #1e1e20; transition: all .15s; }
.quick-jump a:hover { border-color: #6366f1; color: #fff; }
/* Content */
.content { max-width: 850px; margin: 0 auto; padding: 0 24px 80px; }
/* Tool Section */
.tool-section { background: #121213; border: 1px solid #1e1e20; border-radius: 14px; padding: 32px; margin-bottom: 24px; scroll-margin-top: 80px; }
.tool-section h2 { font-size: 1.5rem; font-weight: 700; color: #fff; letter-spacing: -0.03em; margin-bottom: 4px; display: flex; align-items: center; gap: 10px; }
.tool-section h2 .icon { width: 32px; height: 32px; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; font-size: 1rem; }
.tool-section .subtitle { font-size: 0.85rem; color: #888; margin-bottom: 16px; }
.tool-section .desc { font-size: 0.88rem; color: #999; line-height: 1.65; margin-bottom: 20px; }
.tool-section .gh-link { display: inline-block; font-size: 0.78rem; color: #6366f1; text-decoration: none; font-weight: 500; margin-bottom: 18px; }
.tool-section .gh-link:hover { color: #a78bfa; text-decoration: underline; }
.icon-acg { background: rgba(99,102,241,0.15); }
.icon-j2s { background: rgba(16,185,129,0.15); }
.icon-dd { background: rgba(245,158,11,0.15); }
.icon-cd { background: rgba(239,68,68,0.15); }
.icon-aa { background: rgba(236,72,153,0.15); }
.icon-ag { background: rgba(6,182,212,0.15); }
.icon-ev { background: rgba(34,197,94,0.15); }
.icon-sf { background: rgba(251,146,60,0.15); }
.icon-rh { background: rgba(139,92,246,0.15); }
/* Install Block */
.install-block { background: #0a0a0b; border: 1px solid #1e1e20; border-radius: 10px; padding: 14px 18px; margin-bottom: 18px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.install-block code { font-family: 'Fira Code', 'JetBrains Mono', monospace; font-size: 0.82rem; color: #a78bfa; }
.install-block .note { font-size: 0.75rem; color: #666; }
/* Notice banner */
.notice-banner { max-width: 780px; margin: 0 auto 24px; padding: 12px 20px; background: rgba(99,102,241,0.06); border: 1px solid rgba(99,102,241,0.15); border-radius: 10px; font-size: 0.82rem; color: #a78bfa; }
.notice-banner code { color: #34d399; background: rgba(16,185,129,0.1); padding: 1px 6px; border-radius: 4px; font-size: 0.8rem; }
.notice-banner strong { color: #c4b5fd; }
/* Code blocks */
pre { background: #0a0a0b !important; border: 1px solid #1e1e20; border-radius: 10px; padding: 16px 20px !important; margin-bottom: 18px !important; font-size: 0.8rem; }
pre code { font-family: 'Fira Code', 'JetBrains Mono', monospace; }
code { font-family: 'Fira Code', 'JetBrains Mono', monospace; }
/* Feature Lists */
.features { list-style: none; display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 16px; }
.features li { font-size: 0.82rem; color: #aaa; padding: 4px 0; display: flex; align-items: center; gap: 8px; }
.features li::before { content: '✓'; color: #6366f1; font-weight: 700; }
.features li.single-col { grid-column: 1 / -1; }
/* Insight box */
.insight { background: rgba(99,102,241,0.06); border: 1px solid rgba(99,102,241,0.15); border-radius: 10px; padding: 16px 20px; margin-bottom: 18px; }
.insight p { font-size: 0.82rem; color: #999; line-height: 1.6; }
.insight strong { color: #a78bfa; }
/* Workflow example */
.workflow { background: rgba(16,185,129,0.06); border: 1px solid rgba(16,185,129,0.15); border-radius: 10px; padding: 16px 20px; margin-bottom: 18px; }
.workflow p { font-size: 0.82rem; color: #999; line-height: 1.6; }
/* Footer */
footer { max-width: 1100px; margin: 0 auto; padding: 40px 24px; border-top: 1px solid #1e1e20; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; }
footer span { font-size: 0.8rem; color: #555; }
footer a { color: #888; text-decoration: none; font-size: 0.8rem; }
footer a:hover { color: #fff; }
@media (max-width: 640px) {
.hero h1 { font-size: 2.2rem; }
.features { grid-template-columns: 1fr; }
.tool-section { padding: 24px; }
nav .links a { margin-left: 12px; font-size: 0.75rem; }
}
</style>
<!-- Plausible Analytics -->
<script defer data-domain="devforge" src="https://plausible.io/js/script.js"></script>
</head>
<body>
<nav>
<div class="inner">
<div class="logo"><a href=""><span>âš'</span> DevForge</a></div>
<div class="links">
<a href="start-here.html">Start Here</a>
<a href="quickstart.html">Get Started</a>
<a href="index.html#products">Products</a>
<a href="docs.html" style="font-weight:700">Docs</a>
<a href="quickstart.html">Get Started</a>
<a href="index.html">Home</a>
<a href="docs.html" class="active">Docs</a>
<a href="pricing.html">Pricing</a>
<a href="alternatives.html">Alternatives</a>
<a href="releases.html">Changelog</a>
<a href="blog.html">Blog</a>
<a href="about.html">About</a>
<a href="https://github.com/Coding-Dev-Tools" target="_blank">GitHub</a>
</div>
</div>
</nav>
<!-- Hero -->
<section class="hero">
<div class="badge">Documentation</div>
<h1>Quickstart & <span>Usage Guide</span></h1>
<p>Install any tool in seconds and see it in action. Every CLI command below is a real, working example — copy, paste, and run.</p>
<div style="margin-top:20px;padding:12px 20px;background:rgba(16,185,129,0.08);border:1px solid rgba(16,185,129,0.2);border-radius:8px;max-width:600px;margin-left:auto;margin-right:auto;">
<p style="color:#10b981;font-weight:600;font-size:0.8rem;margin:0 0 4px;">✅ API Contract Guardian via GitHub</p>
<code style="color:#d1d5db;font-size:0.78rem;">pip install git+https://github.com/Coding-Dev-Tools/api-contract-guardian.git</code>
</div>
</section>
<!-- Quick Jump -->
<div class="quick-jump">
<a href="#api-contract-guardian">? API Contract Guardian</a>
<a href="#json2sql">??? json2sql</a>
<a href="#deploydiff">?? DeployDiff</a>
<a href="#configdrift">? ConfigDrift</a>
<a href="#apighost">?? APIGhost</a>
<a href="#apiauth">?? APIAuth</a>
<a href="#envault">??? Envault</a>
<a href="#schemaforge">?? SchemaForge</a>
<a href="#click-to-mcp">?? click-to-mcp</a>
<a href="#datamorph">?? DataMorph</a>
<a href="#deadcode">?? DeadCode</a>
<a href="#meta-package">?? DevForge Suite</a>
<a href="#ci-pipeline">?? CI Pipeline</a>
<a href="#license">?? License</a>
</div>
<div class="notice-banner">
<strong>📦</strong> Install via GitHub, npm, Homebrew, or Scoop. PyPI publishing is pending platform resolution — all tools install directly from <code>pip install git+https://...</code> with no account or token needed.
<a href="#api-contract-guardian">âš¡ API Contract Guardian</a>
<a href="#json2sql">↻ json2sql</a>
<a href="#deploydiff">☁ DeployDiff</a>
<a href="#configdrift">⌘ ConfigDrift</a>
<a href="#apighost">👻 APIGhost</a>
<a href="#apiauth">🔑 APIAuth</a>
<a href="#envault">🛡 Envault</a>
<a href="#schemaforge">âš— SchemaForge</a>
<a href="#click-to-mcp">🔌 click-to-mcp</a>
<a href="#deadcode">🧹 DeadCode</a>
<a href="#meta-package">⛁ DevForge Suite</a>
<a href="#ci-pipeline">🔁 CI Pipeline</a>
</div>
<div class="content">
<!-- ==================== API CONTRACT GUARDIAN ==================== -->
<div class="tool-section" id="api-contract-guardian">
<h2><span class="icon icon-acg">âš¡</span> API Contract Guardian</h2>
<div class="subtitle">v0.1.0 — OpenAPI diff scanner & contract enforcement</div>
<p class="desc">Monitors OpenAPI schema diffs across git branches, detects breaking changes, generates migration guides, and gates CI pipelines on contract violations. Works with OpenAPI 3.0 and 3.1 specs in YAML or JSON.</p>
<a href="https://github.com/Coding-Dev-Tools/api-contract-guardian" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/api-contract-guardian.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Breaking change detection</li>
<li>Auto-generated migration guide</li>
<li>Git branch diff comparison</li>
<li>CI pipeline integration</li>
<li>JSON + YAML spec support</li>
<li>Configurable rule severity</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Compare two spec files</p>
<pre><code class="language-bash">api-contract-guardian check spec-v1.yaml spec-v2.yaml</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Compare git branches</p>
<pre><code class="language-bash">baseline="$(mktemp -d)/openapi-base.yaml"
git show main:openapi.yaml > "$baseline"
api-contract-guardian check "$baseline" openapi.yaml</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Generate migration guide</p>
<pre><code class="language-bash">api-contract-guardian migrate spec-v1.yaml spec-v2.yaml --output MIGRATION.md</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> API breaking changes in production cost teams hours of debugging and incident response. ACG catches them in CI before they merge — the same way a linter catches syntax errors before runtime.</p>
</div>
</div>
<!-- ==================== JSON2SQL ==================== -->
<div class="tool-section" id="json2sql">
<h2><span class="icon icon-j2s">🗃️</span> json2sql</h2>
<div class="subtitle">v0.1.0 — JSON to SQL converter with smart type inference</div>
<p class="desc">Convert JSON files and datasets to SQL INSERT statements instantly. Supports PostgreSQL, MySQL, SQLite, and generic SQL dialects with automatic type inference — no schema definition required.</p>
<a href="https://github.com/Coding-Dev-Tools/json2sql" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/json2sql.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>4 SQL dialects (pg, mysql, sqlite, generic)</li>
<li>Automatic type inference</li>
<li>Large file streaming support</li>
<li>Nested JSON flattening</li>
<li>Pretty-print output</li>
<li>Stdin pipe support</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Basic conversion</p>
<pre><code class="language-bash">json2sql convert data.json</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Specify output dialect</p>
<pre><code class="language-bash">json2sql convert data.json --dialect postgres
json2sql convert data.json --dialect mysql
json2sql convert data.json --dialect sqlite</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Pipe from stdin</p>
<pre><code class="language-bash">curl -s https://api.example.com/users | json2sql convert --dialect postgres</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> Writing SQL seed data by hand is error-prone and tedious. json2sql turns hours of manual INSERT statement construction into a one-liner — especially useful for ETL pipelines, database seeding, and test data generation.</p>
</div>
<a href="blog/json-to-sql-one-command.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the json2sql tutorial →</a>
</div>
<!-- ==================== DEPLOYDIFF ==================== -->
<div class="tool-section" id="deploydiff">
<h2><span class="icon icon-dd">☁️</span> DeployDiff</h2>
<div class="subtitle">v0.1.0 — Infrastructure change preview & cost estimator</div>
<p class="desc">Preview infrastructure changes with human-readable diffs, cost impact estimation, and pre-generated rollback commands — before you hit deploy. Supports Terraform plan JSON, CloudFormation change sets, and Pulumi previews.</p>
<a href="https://github.com/Coding-Dev-Tools/deploydiff" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/deploydiff.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Terraform plan analysis</li>
<li>CloudFormation change sets</li>
<li>Pulumi preview support</li>
<li>Cost impact estimation</li>
<li>Auto-generated rollback commands</li>
<li>Blast radius visualization</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Preview infrastructure changes</p>
<pre><code class="language-bash">deploydiff preview --tf plan.json</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">CloudFormation change set</p>
<pre><code class="language-bash">deploydiff preview --cf change-set.json</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Pulumi diff</p>
<pre><code class="language-bash">deploydiff preview --pulumi pulumi-preview.json</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> Every infrastructure change carries risk — wrong config, unexpected cost, unreachable state. DeployDiff gives you a clear preview <em>before</em> your IaC tool applies it, with rollback commands pre-generated so recovery isn't panic-mode.</p>
</div>
<a href="blog/preview-infra-cost-before-deploy.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the DeployDiff tutorial →</a>
</div>
<!-- ==================== CONFIGDRIFT ==================== -->
<div class="tool-section" id="configdrift">
<h2><span class="icon icon-cd">⌘</span> ConfigDrift</h2>
<div class="subtitle">v0.1.0 — Configuration drift detection & compliance</div>
<p class="desc">Catch config drift before it breaks production. Compare configs across dev, staging, and prod — flag missing keys, deprecated values, value mismatches, and compliance issues instantly. Supports YAML, JSON, TOML, and .env files.</p>
<a href="https://github.com/Coding-Dev-Tools/configdrift" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/configdrift.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>YAML / JSON / TOML / .env support</li>
<li>Multi-environment comparison</li>
<li>Missing key detection</li>
<li>Value mismatch highlighting</li>
<li>Deprecated value flagging</li>
<li>Table, JSON, and silent output modes</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Compare two config files</p>
<pre><code class="language-bash">configdrift check dev.yaml prod.yaml</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Environment-style comparison</p>
<pre><code class="language-bash">configdrift check --baseline dev --target prod configs/</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">JSON output for CI</p>
<pre><code class="language-bash">configdrift check dev.yaml prod.yaml --output json</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> Config drift is the silent killer of deployments — a missing key in prod that exists in staging, a deprecated value that's still in dev. ConfigDrift automates the comparison so you catch it in CI, not in an incident post-mortem.</p>
</div>
<a href="blog/catch-config-drift-before-production.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the ConfigDrift tutorial →</a>
</div>
<div class="tool-section" id="apighost">
<h2><span class="icon icon-ag">👻</span> APIGhost</h2>
<div class="subtitle">v0.1.0 — OpenAPI mock server with VCR recording</div>
<p class="desc">Turn any OpenAPI 3.0/3.1 spec into a running mock API server with realistic fake data, scenario-based response overrides, and VCR-style cassette recording/replay. Perfect for frontend teams, integration testing, and contract-first development.</p>
<a href="https://github.com/Coding-Dev-Tools/apighost" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/apighost.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>OpenAPI 3.0/3.1 spec → mock server in one command</li>
<li>Realistic fake data generation from schemas</li>
<li>Scenario-based response overrides (success, error, timeout)</li>
<li>VCR cassette record & replay for deterministic tests</li>
<li>Remote spec support (URLs, not just local files)</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Start a mock server from a spec</p>
<pre><code class="language-bash">apighost serve petstore.yaml</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Record real interactions & replay deterministically</p>
<pre><code class="language-bash">apighost record petstore.yaml --output my-cassette
apighost replay my-cassette</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> Frontend teams shouldn't wait for backend APIs. APIGhost spins up a working mock from your OpenAPI spec instantly — with realistic data, error scenarios, and record/replay for integration tests. Ship UI against a stable mock, swap in the real API when ready.</p>
</div>
<a href="blog/api-mock-server-from-openapi-spec.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the APIGhost tutorial →</a>
</div>
<div class="tool-section" id="apiauth">
<h2><span class="icon icon-aa">🔑</span> APIAuth</h2>
<div class="subtitle">v0.1.0 — API key & JWT lifecycle management</div>
<p class="desc">Generate, import, verify, rotate, and revoke API keys and JWTs from the terminal. Encrypted local keystore with AES-256-GCM, CI/CD export formats, and audit trail for compliance. No more secrets scattered in .env files.</p>
<a href="https://github.com/Coding-Dev-Tools/apiauth" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/apiauth.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Generate API keys & JWTs with expiry & custom claims</li>
<li>Encrypted keystore (AES-256-GCM, master key in ~/.apiauth/)</li>
<li>Verify keys against stored hashes — no plaintext stored</li>
<li>Safe rotation — previous values hashed out</li>
<li>Instant revocation for compromised keys</li>
<li>Export as env, dotenv, JSON, or GitHub Actions format</li>
<li>Audit trail: expired, expiring, revoked key detection</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Generate and manage keys</p>
<pre><code class="language-bash">apiauth generate api-key --name "Gateway Key" --service api-gateway --expiry-days 90
apiauth list --service api-gateway
apiauth rotate <key-id></code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Export for CI/CD pipelines</p>
<pre><code class="language-bash">apiauth export --format github-actions --service api-gateway</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> API keys in .env files are a security incident waiting to happen. APIAuth gives you a proper keystore — encrypted, auditable, rotatable — with one-command CI/CD export. Stop copying secrets into config files and start managing them like infrastructure.</p>
</div>
<a href="blog/api-key-management-from-terminal.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the APIAuth tutorial →</a>
</div>
<div class="tool-section" id="envault">
<h2><span class="icon icon-ev">🛡️</span> Envault</h2>
<div class="subtitle">v0.1.0 — Environment variable syncing, diffing & secret rotation</div>
<p class="desc">Compare .env files across environments, sync variables with conflict resolution, and rotate secrets with auto-generated cryptographically secure values. Integrates with AWS SSM, HashiCorp Vault, Doppler, and 1Password — one tool for all your secret stores.</p>
<a href="https://github.com/Coding-Dev-Tools/envault" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/envault.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Diff .env files across dev, staging, prod</li>
<li>Sync with conflict resolution strategies (source wins, target wins)</li>
<li>Smart secret rotation (DB passwords, API keys, JWT secrets, webhook keys)</li>
<li>AWS SSM, Vault, Doppler, 1Password integrations</li>
<li>Audit trail for all operations</li>
<li>Dry-run mode for safe previews</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Diff environments</p>
<pre><code class="language-bash">rh-envault diff dev prod</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Rotate a secret (smart type inference)</p>
<pre><code class="language-bash">rh-envault rotate DB_PASSWORD # database-safe password
rh-envault rotate API_KEY # prefixed API key
rh-envault rotate JWT_SECRET # 256-bit base64 secret</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> .env drift is how staging works but prod doesn't — a missing variable, a different value, a stale secret. Envault catches the diff, syncs safely, and rotates secrets with one command. Connect it to your secret store and stop managing .env files by hand.</p>
</div>
<a href="blog/sync-env-variables-across-environments.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the Envault tutorial →</a>
</div>
<div class="tool-section" id="schemaforge">
<h2><span class="icon icon-sf">🔄</span> SchemaForge</h2>
<div class="subtitle">v1.7.0 — Bidirectional ORM schema converter (11 formats) + VS Code extension</div>
<p class="desc">Convert between SQL DDL, Prisma, Drizzle, TypeORM, Django, SQLAlchemy, GraphQL SDL, JSON Schema, EF Core, Scala, and Alembic with roundtrip verification of supported schema elements. 100 conversion directions (Alembic export only). Now with a full VS Code extension for live preview, quick convert, and format detection.</p>
<a href="https://github.com/Coding-Dev-Tools/schemaforge" class="gh-link" target="_blank">View on GitHub →</a>
<a href="https://github.com/Coding-Dev-Tools/vscode-schemaforge" class="gh-link" target="_blank" style="margin-left:16px;">VS Code Extension →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/schemaforge.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>SQL DDL ↔ Prisma ↔ Drizzle ↔ TypeORM ↔ Django ↔ SQLAlchemy ↔ GraphQL SDL ↔ JSON Schema ↔ EF Core ↔ Scala; Alembic export only</li>
<li>100 conversion directions; Alembic is export only</li>
<li>Foreign keys and ORM relationships are not preserved; review every converted schema</li>
<li>VS Code extension: live preview, quick convert (Ctrl+Alt+S), format detection (Ctrl+Alt+D), two-file diff</li>
<li>Schema diff between any two formats</li>
<li>Custom type mappings for edge cases</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Convert Prisma ↔ Drizzle</p>
<pre><code class="language-bash">schemaforge convert --from prisma --to drizzle --input schema.prisma</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Diff two schemas</p>
<pre><code class="language-bash">schemaforge diff schema.prisma schema.drizzle.ts</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> Every ORM migration is a one-way street — Prisma introspects SQL but can't export back, Drizzle users manually rewrite schemas when switching. SchemaForge is the only tool that goes both ways across 11 formats. Stop rewriting schemas by hand and start converting them.</p>
</div>
<a href="blog/schemaforge-v1-7-0-vscode-extension.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 Read the v1.7.0 release (VS Code + 11 formats) →</a>
<a href="blog/schemaforge-v0-5-0-sqlalchemy.html" style="display:inline-block;margin-top:12px;margin-left:16px;color:#888;font-size:0.82rem;text-decoration:none;">v0.5.0: SQLAlchemy →</a>
</div>
<!-- ==================== CLICK-TO-MCP ==================== -->
<div class="tool-section" id="click-to-mcp">
<h2><span class="icon" style="background:rgba(139,92,246,.15)">🔌</span> click-to-mcp</h2>
<div class="subtitle">v0.2.1 — Auto-wrap Click/Typer CLIs as MCP servers</div>
<p class="desc">Turn any Click or Typer CLI into an MCP server with a single command. Expose your tools to Claude, GPT, Cursor, and any MCP-compatible AI — no code changes needed. Auto-discovers commands, generates tool schemas, and handles stdio/SSE transport.</p>
<a href="https://github.com/Coding-Dev-Tools/click-to-mcp" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/click-to-mcp.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Auto-discovery of Click/Typer commands and options</li>
<li>One-command MCP server generation</li>
<li>Stdio & SSE transport support</li>
<li>Multi-server orchestration</li>
<li>Zero code changes to existing CLIs</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Wrap a CLI as MCP server</p>
<pre><code class="language-bash">click-to-mcp wrap mycli --transport stdio</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Auto-discover Click apps</p>
<pre><code class="language-bash">click-to-mcp discover --dir ./src</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> MCP is the standard for AI-tool integration, but wrapping CLIs as MCP servers is manual boilerplate. click-to-mcp eliminates that — point it at any Click/Typer app and get a fully compatible MCP server in seconds. The only tool that does Click→MCP conversion (mcp2cli does the reverse).</p>
</div>
</div>
<!-- ==================== DATAMORPH ==================== -->
<div class="tool-section" id="datamorph">
<h2><span class="icon" style="background:rgba(59,130,246,.15)">??</span> DataMorph</h2>
<div class="subtitle">v0.1.0 � Convert between CSV, JSON, YAML, Parquet, Avro & Protobuf</div>
<p class="desc">Convert data files between CSV, JSON, YAML, Parquet, Avro, and Protobuf with a single command. Auto-detects input format, preserves schemas, handles batch conversions, and outputs clean structured data � no manual parsing scripts needed.</p>
<a href="https://github.com/Coding-Dev-Tools/datamorph" class="gh-link" target="_blank">View on GitHub ?</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/datamorph.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Auto-detect input format from file extension</li>
<li>Convert between CSV, JSON, YAML, Parquet, Avro, Protobuf</li>
<li>Batch conversion across multiple files</li>
<li>Schema inference and preservation</li>
<li>Streaming support for large datasets</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Convert JSON to CSV</p>
<pre><code class="language-bash">datamorph convert data.json data.csv</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Batch convert a directory</p>
<pre><code class="language-bash">datamorph batch ./input/ --format csv --output ./output/</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> Data format conversion is a recurring chore � parsing CSV into JSON, flattening YAML, converting Parquet for analysis. Writing one-off scripts is error-prone and time-wasting. DataMorph handles all common formats with a single command, auto-detecting types and preserving schemas so you never lose data in translation.</p>
</div>
</div>
<!-- ==================== DEADCODE ==================== -->
<div class="tool-section" id="deadcode">
<h2><span class="icon" style="background:rgba(239,68,68,.15)">🧹</span> DeadCode</h2>
<div class="subtitle">v0.1.0 — Unused export & dead route detector for TypeScript/React</div>
<p class="desc">Detect and remove unused exports, dead routes, orphaned CSS, and unreferenced components in TypeScript/React/Next.js projects. Uses regex-based scanning to identify potential unused exports, routes, CSS classes and components. Review findings before removal.</p>
<a href="https://github.com/Coding-Dev-Tools/deadcode" class="gh-link" target="_blank">View on GitHub →</a>
<div class="install-block">
<code>pip install git+https://github.com/Coding-Dev-Tools/deadcode.git</code>
<span class="note">Requires Python 3.10+</span>
</div>
<ul class="features">
<li>Unused export detection across entire project</li>
<li>Dead route identification (React Router, Next.js)</li>
<li>Orphaned CSS class scanning</li>
<li>Unreferenced component detection</li>
<li>Dry-run removal preview — never delete something you need</li>
</ul>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Scan current project</p>
<pre><code class="language-bash">deadcode scan</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Preview what can be removed</p>
<pre><code class="language-bash">deadcode remove --dry-run</code></pre>
<div class="insight">
<p><strong>Why you need it:</strong> ESLint catches unused variables but misses structural decay — orphaned exports bloat bundles, stale routes confuse teammates, orphaned CSS silently accumulates. DeadCode scans source patterns across the project and reports possible cleanup candidates. Scan, preview, then clean with confidence.</p>
</div>
</div>
<!-- ==================== META PACKAGE ==================== -->
<div class="tool-section" id="meta-package">
<h2><span class="icon icon-rh">⚒️</span> DevForge Suite</h2>
<div class="subtitle">One install. All eleven tools.</div>
<p class="desc">Install every tool in the DevForge ecosystem with a single command. Perfect for CI/CD pipelines, dev workstations, or teams that want the full safety net across API contracts, SQL, infrastructure, configs, API mocking, key management, env syncing, schema conversion, data format conversion, MCP wrapping, and dead code cleanup.</p>
<a href="https://github.com/Coding-Dev-Tools/devforge" class="gh-link" target="_blank">View on GitHub ?</a>
<pre><code class="language-bash">pip install git+https://github.com/Coding-Dev-Tools/api-contract-guardian.git git+https://github.com/Coding-Dev-Tools/json2sql.git git+https://github.com/Coding-Dev-Tools/deploydiff.git git+https://github.com/Coding-Dev-Tools/configdrift.git git+https://github.com/Coding-Dev-Tools/apiauth.git git+https://github.com/Coding-Dev-Tools/apighost.git git+https://github.com/Coding-Dev-Tools/envault.git git+https://github.com/Coding-Dev-Tools/schemaforge.git git+https://github.com/Coding-Dev-Tools/datamorph.git git+https://github.com/Coding-Dev-Tools/click-to-mcp.git git+https://github.com/Coding-Dev-Tools/deadcode.git</code></pre>
<p class="note">Installs all eleven tool repositories directly. Requires Git and Python 3.10+.</p>
<div class="workflow">
<p><strong>CI Pipeline Example</strong> — A single script runs all four checks in sequence. If any check fails, the pipeline stops and the developer gets a clear error message telling them exactly what broke and where.</p>
</div>
<pre><code class="language-yaml"># .github/workflows/ci-safety-net.yml
name: CI Safety Net
on: [pull_request]
jobs:
checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: >-
pip install
git+https://github.com/Coding-Dev-Tools/api-contract-guardian.git
git+https://github.com/Coding-Dev-Tools/json2sql.git
git+https://github.com/Coding-Dev-Tools/deploydiff.git
git+https://github.com/Coding-Dev-Tools/configdrift.git
# 1. API Contract Guardian — detect breaking schema changes
- env:
BASE_REF: ${{ github.base_ref }}
run: |
git fetch origin "$BASE_REF"
baseline="$(mktemp -d)/openapi-base.yaml"
git show "origin/$BASE_REF:openapi.yaml" > "$baseline"
api-contract-guardian check "$baseline" openapi.yaml
# 2. json2sql — validate SQL output from seed data
- run: json2sql convert --dialect postgres data/seed.json
# 3. DeployDiff — preview infra changes
- run: deploydiff preview --tf plan.json
# 4. ConfigDrift — catch environment drift
- run: configdrift check dev.yaml prod.yaml --output json</code></pre>
<div class="insight">
<p><strong>Pro tip:</strong> Install only the tools your CI pipeline uses. Pin each Git URL to a reviewed commit or release tag for reproducible builds.</p>
</div>
</div>
<!-- ==================== CI PIPELINE ==================== -->
<div class="tool-section" id="ci-pipeline">
<h2>⚙️ CI & Integration Guide</h2>
<div class="subtitle">Adding safety checks to your existing pipeline</div>
<p class="desc">All eleven tools are designed as stateless CLI commands that fit naturally into CI pipelines. Each returns a non-zero exit code on failure, so they integrate with any CI system that supports shell commands — GitHub Actions, GitLab CI, CircleCI, Jenkins, or raw bash scripts.</p>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Per-tool install for minimal dependencies</p>
<pre><code class="language-bash"># Install only what you need
pip install git+https://github.com/Coding-Dev-Tools/api-contract-guardian.git # API contract checks
pip install git+https://github.com/Coding-Dev-Tools/deploydiff.git # Infra change previews
pip install git+https://github.com/Coding-Dev-Tools/json2sql.git # SQL validation
pip install git+https://github.com/Coding-Dev-Tools/configdrift.git # Config drift detection
pip install git+https://github.com/Coding-Dev-Tools/apighost.git # OpenAPI mock server
pip install git+https://github.com/Coding-Dev-Tools/apiauth.git # API key & JWT management
pip install git+https://github.com/Coding-Dev-Tools/envault.git # .env syncing & secret rotation
pip install git+https://github.com/Coding-Dev-Tools/schemaforge.git # ORM schema converter
pip install git+https://github.com/Coding-Dev-Tools/click-to-mcp.git # MCP server wrapper
pip install git+https://github.com/Coding-Dev-Tools/deadcode.git # Dead code detector
pip install git+https://github.com/Coding-Dev-Tools/datamorph.git # Data format converter</code></pre>
<p class="desc">All ten tools are designed as stateless CLI commands that fit naturally into CI pipelines. Each returns a non-zero exit code on failure, so they integrate with any CI system that supports shell commands — GitHub Actions, GitLab CI, CircleCI, Jenkins, or raw bash scripts.</p>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Per-tool install for minimal dependencies</p>
<pre><code class="language-bash"># Install only what you need
pip install git+https://github.com/Coding-Dev-Tools/api-contract-guardian.git # API contract checks
pip install git+https://github.com/Coding-Dev-Tools/deploydiff.git # Infra change previews
pip install git+https://github.com/Coding-Dev-Tools/json2sql.git # SQL validation
pip install git+https://github.com/Coding-Dev-Tools/configdrift.git # Config drift detection
pip install git+https://github.com/Coding-Dev-Tools/apighost.git # OpenAPI mock server
pip install git+https://github.com/Coding-Dev-Tools/apiauth.git # API key & JWT management
pip install git+https://github.com/Coding-Dev-Tools/envault.git # .env syncing & secret rotation
pip install git+https://github.com/Coding-Dev-Tools/schemaforge.git # ORM schema converter</code></pre>
<p style="font-size:0.82rem;color:#888;font-weight:600;margin-bottom:8px;">Exit codes (all tools)</p>
<pre><code class="language-text">0 — Success (no issues found)
1 — Issues found (breaking change, drift, mismatch)
2 — Error (invalid input, file not found)</code></pre>
<div class="insight">
<p><strong>CI best practice:</strong> Start with <code>--output json</code> or <code>--output silent</code> mode on all tools to keep CI logs clean. Gate merges only on breaking changes — use warning-level violations as advisory feedback in PR comments instead of blocking the pipeline.</p>
</div>
</div>
<!-- ==================== LICENSE ==================== -->
<div class="tool-section" id="license">
<h2><span class="icon" style="width:40px;height:40px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:rgba(99,102,241,0.15);margin-bottom:14px;">🔑</span> License Key Setup</h2>
<p class="desc">Each tool checks a license key on startup to determine your tier. Free tier works out of the box (50 uses/day per tool). Set a license key to unlock unlimited Pro access.</p>
<div class="install-block">
<code>devforge license activate YOUR_LICENSE_KEY</code>
<span class="note">Or set DEVFORGE_LICENSE_KEY env var</span>
</div>
<ul class="features">
<li><strong>devforge license activate <key></strong> — Activate a new license key (stores in ~/.devforge/)</li>
<li><strong>devforge license status</strong> — Show current tier, usage counts, and remaining rate limit</li>
<li><strong>devforge license deactivate</strong> — Remove the current license (reverts to free tier)</li>
<li>Works offline for up to 7 days between automatic verifications</li>
<li>Free tier: 50 uses/day per tool. Pro tier: unlimited, all features.</li>
</ul>
<div class="insight">
<p><strong>Get a license key:</strong> Free keys available on the <a href="pricing.html" style="color:#a78bfa;">pricing page</a> — no credit card needed. Set the <code>DEVFORGE_LICENSE_KEY</code> environment variable for automated CI/CD deployments.</p>
</div>
<a href="pricing.html" style="display:inline-block;margin-top:12px;color:#a78bfa;font-size:0.85rem;font-weight:500;text-decoration:none;">📖 View pricing & get your key →</a>
</div>
<p style="text-align:center;margin-top:40px;font-size:0.85rem;color:#555;">
Something missing? <a href="https://github.com/Coding-Dev-Tools/devforge/issues/new" style="color:#6366f1;text-decoration:none;">Open an issue</a> or <a href="mailto:support@devforge" style="color:#6366f1;text-decoration:none;">email us</a>.
</p>
</div>
<footer>
<span>© 2026 DevForge. Open-source developer tools.</span>
<a href="">Home</a>
<a href="pricing.html">Pricing</a>
<a href="docs.html">Docs</a>
<a href="blog.html">Blog</a>
<a href="https://github.com/Coding-Dev-Tools" target="_blank">GitHub</a>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/prism.min.js"></script>
</body>
</html>