revxl-devtools 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/auth.js +7 -6
- package/dist/index.js +1 -1
- package/docs/index.html +495 -0
- package/landing/index.html +495 -0
- package/package.json +1 -1
- package/dist/auth.d.ts +0 -3
- package/dist/codegen/cron-codegen.d.ts +0 -1
- package/dist/codegen/regex-codegen.d.ts +0 -1
- package/dist/index.d.ts +0 -22
- package/dist/registry.d.ts +0 -10
- package/dist/tools/base64.d.ts +0 -1
- package/dist/tools/batch.d.ts +0 -1
- package/dist/tools/chmod.d.ts +0 -1
- package/dist/tools/cron.d.ts +0 -1
- package/dist/tools/hash.d.ts +0 -1
- package/dist/tools/http-status.d.ts +0 -1
- package/dist/tools/json-diff.d.ts +0 -1
- package/dist/tools/json-format.d.ts +0 -1
- package/dist/tools/json-query.d.ts +0 -1
- package/dist/tools/jwt.d.ts +0 -1
- package/dist/tools/regex.d.ts +0 -1
- package/dist/tools/secrets-scan.d.ts +0 -1
- package/dist/tools/sql-format.d.ts +0 -1
- package/dist/tools/timestamp.d.ts +0 -1
- package/dist/tools/url-encode.d.ts +0 -1
- package/dist/tools/uuid.d.ts +0 -1
- package/dist/tools/yaml-convert.d.ts +0 -1
- package/src/auth.ts +0 -99
- package/src/codegen/cron-codegen.ts +0 -66
- package/src/codegen/regex-codegen.ts +0 -132
- package/src/index.ts +0 -134
- package/src/registry.ts +0 -25
- package/src/tools/base64.ts +0 -32
- package/src/tools/batch.ts +0 -69
- package/src/tools/chmod.ts +0 -133
- package/src/tools/cron.ts +0 -365
- package/src/tools/hash.ts +0 -26
- package/src/tools/http-status.ts +0 -63
- package/src/tools/json-diff.ts +0 -153
- package/src/tools/json-format.ts +0 -43
- package/src/tools/json-query.ts +0 -126
- package/src/tools/jwt.ts +0 -193
- package/src/tools/regex.ts +0 -131
- package/src/tools/secrets-scan.ts +0 -212
- package/src/tools/sql-format.ts +0 -178
- package/src/tools/timestamp.ts +0 -74
- package/src/tools/url-encode.ts +0 -29
- package/src/tools/uuid.ts +0 -25
- package/src/tools/yaml-convert.ts +0 -383
- package/tsconfig.json +0 -14
package/README.md
CHANGED
|
@@ -61,8 +61,8 @@ Each Pro tool has 3 free trials before purchase.
|
|
|
61
61
|
|
|
62
62
|
## Get Pro
|
|
63
63
|
|
|
64
|
-
1. Purchase at [https://
|
|
65
|
-
2.
|
|
64
|
+
1. Purchase at [https://buy.stripe.com/28E14pfy1g5X1nz9HHgbm0s](https://buy.stripe.com/28E14pfy1g5X1nz9HHgbm0s) — **$7 one-time**
|
|
65
|
+
2. Email your receipt to john@revxl.net and you'll receive your license key (format: `REVXL-XXXX-XXXX-XXXX`)
|
|
66
66
|
3. Add it to your MCP config:
|
|
67
67
|
|
|
68
68
|
```json
|
package/dist/auth.js
CHANGED
|
@@ -21,12 +21,13 @@ function saveCache(cache) {
|
|
|
21
21
|
// Silently fail — cache is best-effort
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
const PRO_KEY_PATTERN = /^REVXL-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/;
|
|
24
25
|
async function validateKeyWithSupabase(key) {
|
|
25
26
|
const supabaseUrl = process.env.SUPABASE_URL;
|
|
26
27
|
const supabaseAnonKey = process.env.SUPABASE_ANON_KEY;
|
|
27
28
|
if (!supabaseUrl || !supabaseAnonKey) {
|
|
28
|
-
// Dev mode: accept any
|
|
29
|
-
return
|
|
29
|
+
// Dev mode: accept any key matching the REVXL- pattern
|
|
30
|
+
return PRO_KEY_PATTERN.test(key);
|
|
30
31
|
}
|
|
31
32
|
try {
|
|
32
33
|
const res = await fetch(`${supabaseUrl}/rest/v1/pro_keys?key=eq.${encodeURIComponent(key)}&select=active`, {
|
|
@@ -37,19 +38,19 @@ async function validateKeyWithSupabase(key) {
|
|
|
37
38
|
});
|
|
38
39
|
if (!res.ok) {
|
|
39
40
|
// Supabase down — fall back to format check
|
|
40
|
-
return
|
|
41
|
+
return PRO_KEY_PATTERN.test(key);
|
|
41
42
|
}
|
|
42
43
|
const rows = (await res.json());
|
|
43
44
|
return rows.length > 0 && rows[0].active === true;
|
|
44
45
|
}
|
|
45
46
|
catch {
|
|
46
47
|
// Network error — fall back to format check
|
|
47
|
-
return
|
|
48
|
+
return PRO_KEY_PATTERN.test(key);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
export async function checkProAccess() {
|
|
51
|
-
const key = process.env.
|
|
52
|
-
if (!key || !
|
|
52
|
+
const key = process.env.REVXL_PRO_KEY;
|
|
53
|
+
if (!key || !PRO_KEY_PATTERN.test(key)) {
|
|
53
54
|
return false;
|
|
54
55
|
}
|
|
55
56
|
const cache = loadCache();
|
package/dist/index.js
CHANGED
|
@@ -42,7 +42,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
42
42
|
content: [
|
|
43
43
|
{
|
|
44
44
|
type: "text",
|
|
45
|
-
text: `⚡ ${name} is a Pro tool and you've used all 3 free trials.\n\nUpgrade for $7 one-time at ${PURCHASE_URL}
|
|
45
|
+
text: `⚡ ${name} is a Pro tool and you've used all 3 free trials.\n\nUpgrade for $7 one-time at ${PURCHASE_URL}\n\nAfter purchase, email john@revxl.net with your receipt to receive your Pro key. Then add it to your MCP config as REVXL_PRO_KEY.`,
|
|
46
46
|
},
|
|
47
47
|
],
|
|
48
48
|
isError: false,
|
package/docs/index.html
ADDED
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>revxl-devtools — 17 MCP Dev Tools for AI Agents</title>
|
|
7
|
+
<meta name="description" content="17 developer tools for AI agents. JSON, JWT, regex with code gen, cron from English, secrets scanner, batch ops. 7 free, 10 Pro.">
|
|
8
|
+
<meta property="og:title" content="revxl-devtools — 17 MCP Dev Tools for AI Agents">
|
|
9
|
+
<meta property="og:description" content="Secrets scanning, regex-to-code in 5 languages, cron from plain English, batch ops on 500 items. 17 tools, zero bloat.">
|
|
10
|
+
<meta property="og:type" content="website">
|
|
11
|
+
<meta property="og:url" content="https://revxl-devtools.vercel.app">
|
|
12
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
13
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
14
|
+
<style>
|
|
15
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
16
|
+
|
|
17
|
+
:root {
|
|
18
|
+
--bg: #0a0a0b;
|
|
19
|
+
--surface: #141416;
|
|
20
|
+
--surface-2: #1c1c20;
|
|
21
|
+
--border: #2a2a30;
|
|
22
|
+
--text: #e8e8ed;
|
|
23
|
+
--text-muted: #8b8b96;
|
|
24
|
+
--accent: #f97316;
|
|
25
|
+
--accent-hover: #fb923c;
|
|
26
|
+
--green: #22c55e;
|
|
27
|
+
--green-bg: rgba(34,197,94,0.1);
|
|
28
|
+
--green-border: rgba(34,197,94,0.2);
|
|
29
|
+
--purple: #a78bfa;
|
|
30
|
+
--purple-bg: rgba(167,139,250,0.1);
|
|
31
|
+
--purple-border: rgba(167,139,250,0.2);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
body {
|
|
35
|
+
font-family: 'Inter', -apple-system, sans-serif;
|
|
36
|
+
background: var(--bg);
|
|
37
|
+
color: var(--text);
|
|
38
|
+
line-height: 1.6;
|
|
39
|
+
-webkit-font-smoothing: antialiased;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
code, .mono { font-family: 'JetBrains Mono', monospace; }
|
|
43
|
+
|
|
44
|
+
.container { max-width: 1080px; margin: 0 auto; padding: 0 24px; }
|
|
45
|
+
|
|
46
|
+
/* Nav */
|
|
47
|
+
nav {
|
|
48
|
+
position: sticky; top: 0; z-index: 100;
|
|
49
|
+
background: rgba(10,10,11,0.85);
|
|
50
|
+
backdrop-filter: blur(12px);
|
|
51
|
+
border-bottom: 1px solid var(--border);
|
|
52
|
+
padding: 16px 0;
|
|
53
|
+
}
|
|
54
|
+
nav .container { display: flex; justify-content: space-between; align-items: center; }
|
|
55
|
+
nav .logo { font-weight: 700; font-size: 18px; color: var(--text); text-decoration: none; }
|
|
56
|
+
nav .logo span { color: var(--accent); }
|
|
57
|
+
nav .links { display: flex; gap: 24px; align-items: center; }
|
|
58
|
+
nav .links a { color: var(--text-muted); text-decoration: none; font-size: 14px; font-weight: 500; transition: color 0.2s; }
|
|
59
|
+
nav .links a:hover { color: var(--text); }
|
|
60
|
+
|
|
61
|
+
/* Hero */
|
|
62
|
+
.hero { padding: 100px 0 80px; text-align: center; }
|
|
63
|
+
.hero .badge {
|
|
64
|
+
display: inline-flex; align-items: center; gap: 8px;
|
|
65
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
66
|
+
border-radius: 100px; padding: 6px 16px; font-size: 13px;
|
|
67
|
+
color: var(--text-muted); margin-bottom: 24px;
|
|
68
|
+
}
|
|
69
|
+
.hero .badge .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); animation: pulse 2s infinite; }
|
|
70
|
+
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
|
|
71
|
+
.hero h1 { font-size: clamp(36px, 5vw, 56px); font-weight: 800; line-height: 1.1; margin-bottom: 20px; letter-spacing: -0.02em; }
|
|
72
|
+
.hero h1 .highlight { color: var(--accent); }
|
|
73
|
+
.hero p { font-size: 18px; color: var(--text-muted); max-width: 600px; margin: 0 auto 36px; line-height: 1.7; }
|
|
74
|
+
|
|
75
|
+
/* Install block */
|
|
76
|
+
.install-block {
|
|
77
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
78
|
+
border-radius: 12px; padding: 20px 24px;
|
|
79
|
+
max-width: 520px; margin: 0 auto 20px;
|
|
80
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
81
|
+
gap: 12px;
|
|
82
|
+
}
|
|
83
|
+
.install-block code { font-size: 15px; color: var(--green); }
|
|
84
|
+
.install-block button {
|
|
85
|
+
background: var(--surface-2); border: 1px solid var(--border);
|
|
86
|
+
color: var(--text-muted); padding: 8px 16px; border-radius: 8px;
|
|
87
|
+
font-size: 13px; cursor: pointer; transition: all 0.2s; white-space: nowrap;
|
|
88
|
+
}
|
|
89
|
+
.install-block button:hover { background: var(--border); color: var(--text); }
|
|
90
|
+
|
|
91
|
+
.hero-cta { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; margin-top: 24px; }
|
|
92
|
+
.btn {
|
|
93
|
+
display: inline-flex; align-items: center; gap: 8px;
|
|
94
|
+
padding: 14px 28px; border-radius: 10px; font-size: 15px;
|
|
95
|
+
font-weight: 600; text-decoration: none; transition: all 0.2s; border: none; cursor: pointer;
|
|
96
|
+
}
|
|
97
|
+
.btn-primary { background: var(--accent); color: #fff; }
|
|
98
|
+
.btn-primary:hover { background: var(--accent-hover); transform: translateY(-1px); }
|
|
99
|
+
.btn-secondary { background: var(--surface); border: 1px solid var(--border); color: var(--text); }
|
|
100
|
+
.btn-secondary:hover { border-color: var(--text-muted); }
|
|
101
|
+
|
|
102
|
+
/* Stats */
|
|
103
|
+
.stats {
|
|
104
|
+
display: flex; justify-content: center; gap: 48px; padding: 40px 0;
|
|
105
|
+
border-bottom: 1px solid var(--border);
|
|
106
|
+
flex-wrap: wrap;
|
|
107
|
+
}
|
|
108
|
+
.stat { text-align: center; }
|
|
109
|
+
.stat .num { font-size: 28px; font-weight: 700; color: var(--text); }
|
|
110
|
+
.stat .label { font-size: 13px; color: var(--text-muted); margin-top: 4px; }
|
|
111
|
+
|
|
112
|
+
/* Section */
|
|
113
|
+
section { padding: 80px 0; }
|
|
114
|
+
.section-label { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--accent); margin-bottom: 12px; }
|
|
115
|
+
.section-title { font-size: 32px; font-weight: 700; margin-bottom: 16px; letter-spacing: -0.01em; }
|
|
116
|
+
.section-desc { color: var(--text-muted); font-size: 16px; max-width: 600px; margin-bottom: 48px; }
|
|
117
|
+
|
|
118
|
+
/* Tool grid */
|
|
119
|
+
.tools-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }
|
|
120
|
+
.tool-card {
|
|
121
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
122
|
+
border-radius: 12px; padding: 24px;
|
|
123
|
+
transition: border-color 0.2s;
|
|
124
|
+
}
|
|
125
|
+
.tool-card:hover { border-color: var(--text-muted); }
|
|
126
|
+
.tool-card .tool-header { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
|
|
127
|
+
.tool-card .tool-name { font-family: 'JetBrains Mono', monospace; font-size: 15px; font-weight: 600; }
|
|
128
|
+
.tool-card .tool-badge {
|
|
129
|
+
font-size: 11px; font-weight: 600; padding: 3px 8px; border-radius: 6px; text-transform: uppercase; letter-spacing: 0.04em;
|
|
130
|
+
}
|
|
131
|
+
.tool-badge.free { background: var(--green-bg); color: var(--green); border: 1px solid var(--green-border); }
|
|
132
|
+
.tool-badge.pro { background: var(--purple-bg); color: var(--purple); border: 1px solid var(--purple-border); }
|
|
133
|
+
.tool-card .tool-desc { color: var(--text-muted); font-size: 14px; line-height: 1.6; }
|
|
134
|
+
|
|
135
|
+
/* Showcase */
|
|
136
|
+
.showcase { background: var(--surface); border: 1px solid var(--border); border-radius: 16px; padding: 32px; margin-bottom: 48px; }
|
|
137
|
+
.showcase h3 { font-size: 20px; font-weight: 700; margin-bottom: 8px; }
|
|
138
|
+
.showcase .subtitle { color: var(--text-muted); font-size: 14px; margin-bottom: 20px; }
|
|
139
|
+
.showcase pre {
|
|
140
|
+
background: var(--bg); border: 1px solid var(--border);
|
|
141
|
+
border-radius: 10px; padding: 20px; overflow-x: auto;
|
|
142
|
+
font-size: 13px; line-height: 1.7; color: var(--text-muted);
|
|
143
|
+
}
|
|
144
|
+
.showcase pre .key { color: var(--purple); }
|
|
145
|
+
.showcase pre .str { color: var(--green); }
|
|
146
|
+
.showcase pre .comment { color: #555; }
|
|
147
|
+
|
|
148
|
+
/* Pricing */
|
|
149
|
+
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 24px; max-width: 720px; }
|
|
150
|
+
.price-card {
|
|
151
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
152
|
+
border-radius: 16px; padding: 36px; position: relative;
|
|
153
|
+
}
|
|
154
|
+
.price-card.featured { border-color: var(--accent); }
|
|
155
|
+
.price-card.featured::before {
|
|
156
|
+
content: 'BEST VALUE'; position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
|
|
157
|
+
background: var(--accent); color: #fff; font-size: 11px; font-weight: 700;
|
|
158
|
+
padding: 4px 12px; border-radius: 6px; letter-spacing: 0.06em;
|
|
159
|
+
}
|
|
160
|
+
.price-card h3 { font-size: 22px; font-weight: 700; margin-bottom: 4px; }
|
|
161
|
+
.price-card .price { font-size: 40px; font-weight: 800; margin: 16px 0 4px; }
|
|
162
|
+
.price-card .price-note { font-size: 13px; color: var(--text-muted); margin-bottom: 24px; }
|
|
163
|
+
.price-card ul { list-style: none; margin-bottom: 28px; }
|
|
164
|
+
.price-card li { padding: 8px 0; font-size: 14px; color: var(--text-muted); display: flex; align-items: center; gap: 10px; }
|
|
165
|
+
.price-card li::before { content: '\2713'; color: var(--green); font-weight: 700; }
|
|
166
|
+
.price-card .btn { width: 100%; justify-content: center; }
|
|
167
|
+
|
|
168
|
+
/* Comparison */
|
|
169
|
+
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; }
|
|
170
|
+
.comparison-table th, .comparison-table td { padding: 14px 20px; text-align: left; border-bottom: 1px solid var(--border); font-size: 14px; }
|
|
171
|
+
.comparison-table th { color: var(--text-muted); font-weight: 500; font-size: 13px; }
|
|
172
|
+
.comparison-table td:first-child { font-weight: 500; }
|
|
173
|
+
.comparison-table .check { color: var(--green); }
|
|
174
|
+
.comparison-table .cross { color: #555; }
|
|
175
|
+
|
|
176
|
+
/* CTA */
|
|
177
|
+
.final-cta {
|
|
178
|
+
text-align: center; padding: 80px 0;
|
|
179
|
+
border-top: 1px solid var(--border);
|
|
180
|
+
}
|
|
181
|
+
.final-cta h2 { font-size: 36px; font-weight: 800; margin-bottom: 16px; }
|
|
182
|
+
.final-cta p { color: var(--text-muted); font-size: 16px; margin-bottom: 32px; }
|
|
183
|
+
|
|
184
|
+
/* Footer */
|
|
185
|
+
footer {
|
|
186
|
+
border-top: 1px solid var(--border);
|
|
187
|
+
padding: 32px 0; text-align: center;
|
|
188
|
+
color: var(--text-muted); font-size: 13px;
|
|
189
|
+
}
|
|
190
|
+
footer a { color: var(--text-muted); text-decoration: none; }
|
|
191
|
+
footer a:hover { color: var(--text); }
|
|
192
|
+
|
|
193
|
+
/* Compatibility */
|
|
194
|
+
.compat { display: flex; gap: 24px; justify-content: center; flex-wrap: wrap; margin-top: 32px; }
|
|
195
|
+
.compat-item { display: flex; align-items: center; gap: 8px; color: var(--text-muted); font-size: 14px; font-weight: 500; }
|
|
196
|
+
|
|
197
|
+
@media (max-width: 640px) {
|
|
198
|
+
.hero h1 { font-size: 32px; }
|
|
199
|
+
.stats { gap: 32px; }
|
|
200
|
+
.pricing-grid { grid-template-columns: 1fr; }
|
|
201
|
+
.tools-grid { grid-template-columns: 1fr; }
|
|
202
|
+
}
|
|
203
|
+
</style>
|
|
204
|
+
</head>
|
|
205
|
+
<body>
|
|
206
|
+
|
|
207
|
+
<nav>
|
|
208
|
+
<div class="container">
|
|
209
|
+
<a href="/" class="logo">revxl-<span>devtools</span></a>
|
|
210
|
+
<div class="links">
|
|
211
|
+
<a href="#tools">Tools</a>
|
|
212
|
+
<a href="#pricing">Pricing</a>
|
|
213
|
+
<a href="https://www.npmjs.com/package/revxl-devtools" target="_blank">npm</a>
|
|
214
|
+
<a href="https://buy.stripe.com/28E14pfy1g5X1nz9HHgbm0s" class="btn btn-primary" style="padding:10px 20px; font-size:13px;">Get Pro — $7</a>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
</nav>
|
|
218
|
+
|
|
219
|
+
<section class="hero">
|
|
220
|
+
<div class="container">
|
|
221
|
+
<div class="badge"><span class="dot"></span> MCP Server · Works with any AI agent</div>
|
|
222
|
+
<h1>17 dev tools your AI <span class="highlight">actually needs</span></h1>
|
|
223
|
+
<p>Secrets scanning, regex-to-code in 5 languages, cron from plain English, batch ops on 500 items. Zero bloat. Structured output. One install.</p>
|
|
224
|
+
|
|
225
|
+
<div class="install-block">
|
|
226
|
+
<code>npx -y revxl-devtools</code>
|
|
227
|
+
<button onclick="navigator.clipboard.writeText('npx -y revxl-devtools');this.textContent='Copied!';setTimeout(()=>this.textContent='Copy',2000)">Copy</button>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
<div class="hero-cta">
|
|
231
|
+
<a href="https://buy.stripe.com/28E14pfy1g5X1nz9HHgbm0s" class="btn btn-primary">Get Pro — $7 one-time</a>
|
|
232
|
+
<a href="#tools" class="btn btn-secondary">See all tools</a>
|
|
233
|
+
</div>
|
|
234
|
+
|
|
235
|
+
<div class="compat">
|
|
236
|
+
<span class="compat-item">Claude Desktop</span>
|
|
237
|
+
<span class="compat-item">Cursor</span>
|
|
238
|
+
<span class="compat-item">Windsurf</span>
|
|
239
|
+
<span class="compat-item">VS Code</span>
|
|
240
|
+
<span class="compat-item">Any MCP client</span>
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
</section>
|
|
244
|
+
|
|
245
|
+
<div class="container">
|
|
246
|
+
<div class="stats">
|
|
247
|
+
<div class="stat"><div class="num">17</div><div class="label">Tools</div></div>
|
|
248
|
+
<div class="stat"><div class="num">7</div><div class="label">Free forever</div></div>
|
|
249
|
+
<div class="stat"><div class="num">5</div><div class="label">Code gen languages</div></div>
|
|
250
|
+
<div class="stat"><div class="num">500</div><div class="label">Items per batch</div></div>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<section>
|
|
255
|
+
<div class="container">
|
|
256
|
+
<div class="section-label">Why this exists</div>
|
|
257
|
+
<div class="section-title">Tools your agent thinks it can do but actually butchers</div>
|
|
258
|
+
<div class="section-desc">Agents hallucinate regex, miss leaked secrets, and waste 500 round-trips on batch jobs. These tools give them structured, correct output every time.</div>
|
|
259
|
+
|
|
260
|
+
<div class="showcase">
|
|
261
|
+
<h3>secrets_scan</h3>
|
|
262
|
+
<div class="subtitle">Find leaked API keys before they cost you $50K</div>
|
|
263
|
+
<pre><span class="comment">// Input: any text, config, or code block</span>
|
|
264
|
+
<span class="key">"findings"</span>: [
|
|
265
|
+
{ <span class="key">"type"</span>: <span class="str">"AWS Access Key"</span>, <span class="key">"severity"</span>: <span class="str">"critical"</span>,
|
|
266
|
+
<span class="key">"recommendation"</span>: <span class="str">"Rotate immediately in AWS IAM"</span> },
|
|
267
|
+
{ <span class="key">"type"</span>: <span class="str">"Anthropic API Key"</span>, <span class="key">"severity"</span>: <span class="str">"critical"</span>,
|
|
268
|
+
<span class="key">"recommendation"</span>: <span class="str">"Revoke at console.anthropic.com"</span> }
|
|
269
|
+
]</pre>
|
|
270
|
+
</div>
|
|
271
|
+
|
|
272
|
+
<div class="showcase">
|
|
273
|
+
<h3>regex</h3>
|
|
274
|
+
<div class="subtitle">Test + generate production code in Python, JS, Go, Rust, Java</div>
|
|
275
|
+
<pre><span class="comment">// One call: test the pattern AND get copy-paste code</span>
|
|
276
|
+
<span class="key">"matches"</span>: [<span class="str">"user@example.com"</span>, <span class="str">"test.user+tag@company.co.uk"</span>],
|
|
277
|
+
<span class="key">"code"</span>: {
|
|
278
|
+
<span class="key">"python"</span>: <span class="str">"pattern = re.compile(r'^[\\w.+-]+@[\\w-]+\\.[\\w.]+$')"</span>,
|
|
279
|
+
<span class="key">"go"</span>: <span class="str">"re := regexp.MustCompile(`^[\\w.+-]+@[\\w-]+\\.[\\w.]+$`)"</span>,
|
|
280
|
+
<span class="key">"rust"</span>: <span class="str">"let re = Regex::new(r\"...\").unwrap();"</span>
|
|
281
|
+
}</pre>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
<div class="showcase">
|
|
285
|
+
<h3>cron</h3>
|
|
286
|
+
<div class="subtitle">Plain English to crontab, systemd, and node-cron</div>
|
|
287
|
+
<pre><span class="comment">// Input: "every weekday at 9am"</span>
|
|
288
|
+
<span class="key">"expression"</span>: <span class="str">"0 9 * * 1-5"</span>,
|
|
289
|
+
<span class="key">"description"</span>: <span class="str">"At 09:00, Monday through Friday"</span>,
|
|
290
|
+
<span class="key">"code"</span>: {
|
|
291
|
+
<span class="key">"crontab"</span>: <span class="str">"0 9 * * 1-5 /path/to/script.sh"</span>,
|
|
292
|
+
<span class="key">"systemd"</span>: <span class="str">"OnCalendar=Mon..Fri *-*-* 09:00:00"</span>,
|
|
293
|
+
<span class="key">"node_cron"</span>: <span class="str">"cron.schedule('0 9 * * 1-5', () => {})"</span>
|
|
294
|
+
}</pre>
|
|
295
|
+
</div>
|
|
296
|
+
</div>
|
|
297
|
+
</section>
|
|
298
|
+
|
|
299
|
+
<section id="tools" style="border-top: 1px solid var(--border);">
|
|
300
|
+
<div class="container">
|
|
301
|
+
<div class="section-label">All 17 tools</div>
|
|
302
|
+
<div class="section-title">Free tools — unlimited, forever</div>
|
|
303
|
+
<div class="section-desc">No sign-up, no limits. Just install and use.</div>
|
|
304
|
+
|
|
305
|
+
<div class="tools-grid">
|
|
306
|
+
<div class="tool-card">
|
|
307
|
+
<div class="tool-header"><span class="tool-name">json_format</span><span class="tool-badge free">Free</span></div>
|
|
308
|
+
<div class="tool-desc">Pretty-print, minify, and validate JSON. Fix trailing commas and common syntax errors automatically.</div>
|
|
309
|
+
</div>
|
|
310
|
+
<div class="tool-card">
|
|
311
|
+
<div class="tool-header"><span class="tool-name">base64</span><span class="tool-badge free">Free</span></div>
|
|
312
|
+
<div class="tool-desc">Encode and decode base64 strings. Handles UTF-8 and binary data correctly.</div>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="tool-card">
|
|
315
|
+
<div class="tool-header"><span class="tool-name">url_encode</span><span class="tool-badge free">Free</span></div>
|
|
316
|
+
<div class="tool-desc">URL encode/decode strings. Handles special characters, query parameters, and full URLs.</div>
|
|
317
|
+
</div>
|
|
318
|
+
<div class="tool-card">
|
|
319
|
+
<div class="tool-header"><span class="tool-name">uuid_generate</span><span class="tool-badge free">Free</span></div>
|
|
320
|
+
<div class="tool-desc">Generate v4 UUIDs. Batch generate up to 100 at once. Validate existing UUIDs.</div>
|
|
321
|
+
</div>
|
|
322
|
+
<div class="tool-card">
|
|
323
|
+
<div class="tool-header"><span class="tool-name">hash_text</span><span class="tool-badge free">Free</span></div>
|
|
324
|
+
<div class="tool-desc">Hash text with MD5, SHA-1, SHA-256, SHA-512. Compare hashes for integrity checks.</div>
|
|
325
|
+
</div>
|
|
326
|
+
<div class="tool-card">
|
|
327
|
+
<div class="tool-header"><span class="tool-name">timestamp</span><span class="tool-badge free">Free</span></div>
|
|
328
|
+
<div class="tool-desc">Convert between Unix timestamps, ISO 8601, and human-readable dates. Timezone-aware.</div>
|
|
329
|
+
</div>
|
|
330
|
+
<div class="tool-card">
|
|
331
|
+
<div class="tool-header"><span class="tool-name">http_status</span><span class="tool-badge free">Free</span></div>
|
|
332
|
+
<div class="tool-desc">Look up HTTP status codes with descriptions, common causes, and fix suggestions.</div>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
|
|
336
|
+
<div class="section-title" style="margin-top: 64px;">Pro tools — 3 free trials each</div>
|
|
337
|
+
<div class="section-desc">Try before you buy. Every Pro tool comes with 3 free uses. No credit card needed.</div>
|
|
338
|
+
|
|
339
|
+
<div class="tools-grid">
|
|
340
|
+
<div class="tool-card">
|
|
341
|
+
<div class="tool-header"><span class="tool-name">secrets_scan</span><span class="tool-badge pro">Pro</span></div>
|
|
342
|
+
<div class="tool-desc">Scan text for leaked API keys, tokens, and credentials. Catches AWS, GitHub, Stripe, OpenAI, Anthropic keys and more.</div>
|
|
343
|
+
</div>
|
|
344
|
+
<div class="tool-card">
|
|
345
|
+
<div class="tool-header"><span class="tool-name">regex</span><span class="tool-badge pro">Pro</span></div>
|
|
346
|
+
<div class="tool-desc">Test regex patterns and generate production code in Python, JavaScript, Go, Rust, and Java.</div>
|
|
347
|
+
</div>
|
|
348
|
+
<div class="tool-card">
|
|
349
|
+
<div class="tool-header"><span class="tool-name">cron</span><span class="tool-badge pro">Pro</span></div>
|
|
350
|
+
<div class="tool-desc">Convert plain English to cron expressions. Output for crontab, systemd, and node-cron. Shows next 5 run times.</div>
|
|
351
|
+
</div>
|
|
352
|
+
<div class="tool-card">
|
|
353
|
+
<div class="tool-header"><span class="tool-name">jwt</span><span class="tool-badge pro">Pro</span></div>
|
|
354
|
+
<div class="tool-desc">Decode JWT tokens. Inspect headers, payloads, expiration, and claims without external tools.</div>
|
|
355
|
+
</div>
|
|
356
|
+
<div class="tool-card">
|
|
357
|
+
<div class="tool-header"><span class="tool-name">json_diff</span><span class="tool-badge pro">Pro</span></div>
|
|
358
|
+
<div class="tool-desc">Deep-diff two JSON objects. Shows exact path-level additions, deletions, and changes.</div>
|
|
359
|
+
</div>
|
|
360
|
+
<div class="tool-card">
|
|
361
|
+
<div class="tool-header"><span class="tool-name">json_query</span><span class="tool-badge pro">Pro</span></div>
|
|
362
|
+
<div class="tool-desc">Query JSON with JSONPath expressions. Extract nested data without writing parsing code.</div>
|
|
363
|
+
</div>
|
|
364
|
+
<div class="tool-card">
|
|
365
|
+
<div class="tool-header"><span class="tool-name">batch</span><span class="tool-badge pro">Pro</span></div>
|
|
366
|
+
<div class="tool-desc">Process up to 500 items in a single call. Apply any tool operation in batch — no more round-trip waste.</div>
|
|
367
|
+
</div>
|
|
368
|
+
<div class="tool-card">
|
|
369
|
+
<div class="tool-header"><span class="tool-name">sql_format</span><span class="tool-badge pro">Pro</span></div>
|
|
370
|
+
<div class="tool-desc">Format and beautify SQL queries. Supports MySQL, PostgreSQL, SQLite, and standard SQL.</div>
|
|
371
|
+
</div>
|
|
372
|
+
<div class="tool-card">
|
|
373
|
+
<div class="tool-header"><span class="tool-name">yaml_convert</span><span class="tool-badge pro">Pro</span></div>
|
|
374
|
+
<div class="tool-desc">Convert between YAML and JSON. Validate YAML syntax and fix common formatting issues.</div>
|
|
375
|
+
</div>
|
|
376
|
+
<div class="tool-card">
|
|
377
|
+
<div class="tool-header"><span class="tool-name">chmod</span><span class="tool-badge pro">Pro</span></div>
|
|
378
|
+
<div class="tool-desc">Convert between symbolic and octal file permissions. Explain what any chmod value means.</div>
|
|
379
|
+
</div>
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
</section>
|
|
383
|
+
|
|
384
|
+
<section id="pricing" style="border-top: 1px solid var(--border);">
|
|
385
|
+
<div class="container">
|
|
386
|
+
<div class="section-label">Pricing</div>
|
|
387
|
+
<div class="section-title">Simple. One-time. No subscriptions.</div>
|
|
388
|
+
<div class="section-desc">Pay once, use forever. Every Pro tool comes with 3 free trials so you can try before you buy.</div>
|
|
389
|
+
|
|
390
|
+
<div class="pricing-grid">
|
|
391
|
+
<div class="price-card">
|
|
392
|
+
<h3>Free</h3>
|
|
393
|
+
<div class="price">$0</div>
|
|
394
|
+
<div class="price-note">7 tools, unlimited use, forever</div>
|
|
395
|
+
<ul>
|
|
396
|
+
<li>json_format, base64, url_encode</li>
|
|
397
|
+
<li>uuid_generate, hash_text</li>
|
|
398
|
+
<li>timestamp, http_status</li>
|
|
399
|
+
<li>No sign-up required</li>
|
|
400
|
+
<li>No usage limits</li>
|
|
401
|
+
</ul>
|
|
402
|
+
<a href="https://www.npmjs.com/package/revxl-devtools" class="btn btn-secondary" target="_blank">Install Free</a>
|
|
403
|
+
</div>
|
|
404
|
+
|
|
405
|
+
<div class="price-card featured">
|
|
406
|
+
<h3>Pro</h3>
|
|
407
|
+
<div class="price">$7</div>
|
|
408
|
+
<div class="price-note">One-time payment · All 17 tools</div>
|
|
409
|
+
<ul>
|
|
410
|
+
<li>Everything in Free</li>
|
|
411
|
+
<li>secrets_scan, regex, cron</li>
|
|
412
|
+
<li>jwt, json_diff, json_query</li>
|
|
413
|
+
<li>batch (500 items/call)</li>
|
|
414
|
+
<li>sql_format, yaml_convert, chmod</li>
|
|
415
|
+
<li>3 free trials per tool — no card needed</li>
|
|
416
|
+
</ul>
|
|
417
|
+
<a href="https://buy.stripe.com/28E14pfy1g5X1nz9HHgbm0s" class="btn btn-primary">Get Pro — $7</a>
|
|
418
|
+
</div>
|
|
419
|
+
</div>
|
|
420
|
+
|
|
421
|
+
<div class="section-title" style="margin-top: 80px;">How we compare</div>
|
|
422
|
+
<table class="comparison-table">
|
|
423
|
+
<thead>
|
|
424
|
+
<tr><th></th><th>mcp-devutils</th><th style="color:var(--accent)">revxl-devtools</th></tr>
|
|
425
|
+
</thead>
|
|
426
|
+
<tbody>
|
|
427
|
+
<tr><td>Price</td><td>$5 one-time</td><td>$7 one-time</td></tr>
|
|
428
|
+
<tr><td>Total tools</td><td>44</td><td>17</td></tr>
|
|
429
|
+
<tr><td>Free tools</td><td>15</td><td>7 (unlimited)</td></tr>
|
|
430
|
+
<tr><td>Regex to code gen</td><td class="cross">No</td><td class="check">Yes — 5 languages</td></tr>
|
|
431
|
+
<tr><td>Batch operations</td><td class="cross">No</td><td class="check">Yes — 500 items/call</td></tr>
|
|
432
|
+
<tr><td>Secrets scanner</td><td class="cross">No</td><td class="check">Yes</td></tr>
|
|
433
|
+
<tr><td>Cron from English</td><td class="cross">No</td><td class="check">Yes</td></tr>
|
|
434
|
+
<tr><td>Context tokens used</td><td>~44 tool definitions</td><td>~17 tool definitions</td></tr>
|
|
435
|
+
</tbody>
|
|
436
|
+
</table>
|
|
437
|
+
<p style="color: var(--text-muted); font-size: 13px; margin-top: 16px;">Fewer tools that do more > more tools that duplicate your agent's native abilities.</p>
|
|
438
|
+
</div>
|
|
439
|
+
</section>
|
|
440
|
+
|
|
441
|
+
<section style="border-top: 1px solid var(--border);">
|
|
442
|
+
<div class="container">
|
|
443
|
+
<div class="section-label">Setup</div>
|
|
444
|
+
<div class="section-title">Add to your MCP config in 30 seconds</div>
|
|
445
|
+
|
|
446
|
+
<div class="showcase">
|
|
447
|
+
<h3>Free (all 7 tools)</h3>
|
|
448
|
+
<pre>{
|
|
449
|
+
<span class="key">"mcpServers"</span>: {
|
|
450
|
+
<span class="key">"devtools"</span>: {
|
|
451
|
+
<span class="key">"command"</span>: <span class="str">"npx"</span>,
|
|
452
|
+
<span class="key">"args"</span>: [<span class="str">"-y"</span>, <span class="str">"revxl-devtools"</span>]
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}</pre>
|
|
456
|
+
</div>
|
|
457
|
+
|
|
458
|
+
<div class="showcase">
|
|
459
|
+
<h3>With Pro license</h3>
|
|
460
|
+
<pre>{
|
|
461
|
+
<span class="key">"mcpServers"</span>: {
|
|
462
|
+
<span class="key">"devtools"</span>: {
|
|
463
|
+
<span class="key">"command"</span>: <span class="str">"npx"</span>,
|
|
464
|
+
<span class="key">"args"</span>: [<span class="str">"-y"</span>, <span class="str">"revxl-devtools"</span>],
|
|
465
|
+
<span class="key">"env"</span>: {
|
|
466
|
+
<span class="key">"REVXL_PRO_KEY"</span>: <span class="str">"REVXL-XXXX-XXXX-XXXX"</span>
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}</pre>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
</section>
|
|
474
|
+
|
|
475
|
+
<section class="final-cta">
|
|
476
|
+
<div class="container">
|
|
477
|
+
<h2>Stop your agent from butchering dev tasks</h2>
|
|
478
|
+
<p>Install in 30 seconds. 7 free tools work immediately. Pro unlocks all 17 for a one-time $7.</p>
|
|
479
|
+
<div class="install-block" style="margin: 0 auto 24px;">
|
|
480
|
+
<code>npx -y revxl-devtools</code>
|
|
481
|
+
<button onclick="navigator.clipboard.writeText('npx -y revxl-devtools');this.textContent='Copied!';setTimeout(()=>this.textContent='Copy',2000)">Copy</button>
|
|
482
|
+
</div>
|
|
483
|
+
<a href="https://buy.stripe.com/28E14pfy1g5X1nz9HHgbm0s" class="btn btn-primary" style="font-size:17px; padding:16px 36px;">Get Pro — $7</a>
|
|
484
|
+
</div>
|
|
485
|
+
</section>
|
|
486
|
+
|
|
487
|
+
<footer>
|
|
488
|
+
<div class="container">
|
|
489
|
+
<p>Built by <a href="https://revxl.net">RevXL</a> · <a href="mailto:john@revxl.net">john@revxl.net</a> · <a href="https://www.npmjs.com/package/revxl-devtools" target="_blank">npm</a></p>
|
|
490
|
+
</div>
|
|
491
|
+
</footer>
|
|
492
|
+
|
|
493
|
+
<script defer data-domain="johnmives.github.io/revxl-devtools" src="https://analytics.ahrefs.com/js/script.js" data-key="pU20o5mLVx82hORB+5v2qw"></script>
|
|
494
|
+
</body>
|
|
495
|
+
</html>
|