ebade 0.2.2 → 0.4.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.
- package/CHANGELOG.md +5 -0
- package/README.md +49 -38
- package/ROADMAP.md +19 -14
- package/cli/scaffold.js +502 -186
- package/cli/simulate.js +102 -0
- package/cli/templates/feature-grid.tsx +80 -0
- package/cli/templates/footer.tsx +121 -0
- package/cli/templates/hero-section.tsx +34 -0
- package/cli/templates/login-form.tsx +124 -0
- package/cli/templates/navbar.tsx +53 -0
- package/cli/templates/pricing-table.tsx +140 -0
- package/cli/templates/signup-form.tsx +111 -0
- package/demo.tape +2 -2
- package/examples/saas-dashboard.ebade.yaml +2 -0
- package/netlify.toml +7 -0
- package/package.json +3 -1
- package/packages/mcp-server/README.md +3 -3
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/index.ts +12 -16
- package/packages/mcp-server/src/tools/scaffold.ts +153 -404
- package/packages/vscode-extension/README.md +45 -0
- package/packages/vscode-extension/ebade-0.1.0.vsix +0 -0
- package/packages/vscode-extension/ebade-0.3.0.vsix +0 -0
- package/packages/vscode-extension/ebade-0.3.1.vsix +0 -0
- package/packages/vscode-extension/ebade-0.3.2.vsix +0 -0
- package/packages/vscode-extension/images/icon.png +0 -0
- package/packages/vscode-extension/language-configuration.json +24 -0
- package/packages/vscode-extension/package.json +54 -0
- package/packages/vscode-extension/snippets/ebade.json +86 -0
- package/packages/vscode-extension/syntaxes/ebade.tmLanguage.json +54 -0
- package/www/README.md +36 -0
- package/www/app/favicon.ico +0 -0
- package/www/app/globals.css +1256 -0
- package/www/app/layout.tsx +66 -0
- package/www/app/page.tsx +374 -0
- package/www/app/playground/page.tsx +627 -0
- package/www/components/ThreeCanvas.tsx +156 -0
- package/www/next.config.ts +19 -0
- package/www/package-lock.json +1779 -0
- package/www/package.json +27 -0
- package/www/postcss.config.mjs +7 -0
- package/www/public/logo.png +0 -0
- package/www/tsconfig.json +42 -0
- package/landing/index.html +0 -237
- package/landing/main.js +0 -147
- package/landing/style.css +0 -616
- /package/{demo.gif → assets/demo.gif} +0 -0
- /package/{demo.mp4 → assets/demo.mp4} +0 -0
- /package/{landing → www/public}/_headers +0 -0
- /package/{landing → www/public}/favicon.svg +0 -0
- /package/{landing → www/public}/og-image.png +0 -0
- /package/{landing → www/public}/og-readme.png +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { Outfit, JetBrains_Mono } from "next/font/google";
|
|
3
|
+
import Script from "next/script";
|
|
4
|
+
import "./globals.css";
|
|
5
|
+
|
|
6
|
+
const outfit = Outfit({
|
|
7
|
+
subsets: ["latin"],
|
|
8
|
+
variable: "--font-sans",
|
|
9
|
+
display: "swap",
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const jetbrainsMono = JetBrains_Mono({
|
|
13
|
+
subsets: ["latin"],
|
|
14
|
+
variable: "--font-mono",
|
|
15
|
+
display: "swap",
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const metadata: Metadata = {
|
|
19
|
+
title: "ebade | The First Agent-First Framework",
|
|
20
|
+
description:
|
|
21
|
+
"ebade is The first framework designed for AI agents, readable by humans. Reduce token usage by 70% with intent-driven development.",
|
|
22
|
+
openGraph: {
|
|
23
|
+
type: "website",
|
|
24
|
+
url: "https://ebade.dev/",
|
|
25
|
+
title: "ebade | The First Agent-First Framework",
|
|
26
|
+
description:
|
|
27
|
+
"The first framework designed FOR AI agents. Reduce token usage by 70% with intent-driven development.",
|
|
28
|
+
images: [{ url: "https://ebade.dev/og-image.png" }],
|
|
29
|
+
},
|
|
30
|
+
twitter: {
|
|
31
|
+
card: "summary_large_image",
|
|
32
|
+
title: "ebade | The First Agent-First Framework",
|
|
33
|
+
description:
|
|
34
|
+
"The first framework designed FOR AI agents. Reduce token usage by 70%.",
|
|
35
|
+
images: ["https://ebade.dev/og-image.png"],
|
|
36
|
+
},
|
|
37
|
+
icons: {
|
|
38
|
+
icon: "/favicon.svg",
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default function RootLayout({
|
|
43
|
+
children,
|
|
44
|
+
}: {
|
|
45
|
+
children: React.ReactNode;
|
|
46
|
+
}) {
|
|
47
|
+
return (
|
|
48
|
+
<html lang="en" className={`${outfit.variable} ${jetbrainsMono.variable}`}>
|
|
49
|
+
<head>
|
|
50
|
+
<Script
|
|
51
|
+
src="https://www.googletagmanager.com/gtag/js?id=G-RMQ7E747ZH"
|
|
52
|
+
strategy="afterInteractive"
|
|
53
|
+
/>
|
|
54
|
+
<Script id="google-analytics" strategy="afterInteractive">
|
|
55
|
+
{`
|
|
56
|
+
window.dataLayer = window.dataLayer || [];
|
|
57
|
+
function gtag(){dataLayer.push(arguments);}
|
|
58
|
+
gtag('js', new Date());
|
|
59
|
+
gtag('config', 'G-RMQ7E747ZH');
|
|
60
|
+
`}
|
|
61
|
+
</Script>
|
|
62
|
+
</head>
|
|
63
|
+
<body>{children}</body>
|
|
64
|
+
</html>
|
|
65
|
+
);
|
|
66
|
+
}
|
package/www/app/page.tsx
ADDED
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import dynamic from "next/dynamic";
|
|
6
|
+
import {
|
|
7
|
+
Cpu,
|
|
8
|
+
Github,
|
|
9
|
+
Zap,
|
|
10
|
+
Brain,
|
|
11
|
+
Leaf,
|
|
12
|
+
Code2,
|
|
13
|
+
Layers,
|
|
14
|
+
Terminal,
|
|
15
|
+
} from "lucide-react";
|
|
16
|
+
|
|
17
|
+
// Dynamically import Three.js canvas to avoid SSR issues
|
|
18
|
+
const ThreeCanvas = dynamic(() => import("@/components/ThreeCanvas"), {
|
|
19
|
+
ssr: false,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export default function HomePage() {
|
|
23
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
24
|
+
|
|
25
|
+
const toggleMenu = () => {
|
|
26
|
+
setMenuOpen(!menuOpen);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const closeMenu = () => {
|
|
30
|
+
setMenuOpen(false);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<>
|
|
35
|
+
<div className="page-wrapper">
|
|
36
|
+
<ThreeCanvas />
|
|
37
|
+
<div className="bg-glow"></div>
|
|
38
|
+
<div
|
|
39
|
+
className={`nav-overlay ${menuOpen ? "active" : ""}`}
|
|
40
|
+
onClick={closeMenu}
|
|
41
|
+
></div>
|
|
42
|
+
|
|
43
|
+
<nav className="full-nav">
|
|
44
|
+
<div className="logo">
|
|
45
|
+
ebade<span>.dev</span>
|
|
46
|
+
</div>
|
|
47
|
+
<button
|
|
48
|
+
className={`hamburger ${menuOpen ? "active" : ""}`}
|
|
49
|
+
onClick={toggleMenu}
|
|
50
|
+
aria-label="Toggle menu"
|
|
51
|
+
aria-expanded={menuOpen}
|
|
52
|
+
>
|
|
53
|
+
<span className="hamburger-line"></span>
|
|
54
|
+
<span className="hamburger-line"></span>
|
|
55
|
+
<span className="hamburger-line"></span>
|
|
56
|
+
</button>
|
|
57
|
+
<div className={`nav-links ${menuOpen ? "open" : ""}`}>
|
|
58
|
+
<a href="#technology" onClick={closeMenu}>
|
|
59
|
+
Technology
|
|
60
|
+
</a>
|
|
61
|
+
<a href="#benchmarks" onClick={closeMenu}>
|
|
62
|
+
Benchmarks
|
|
63
|
+
</a>
|
|
64
|
+
<Link href="/playground" onClick={closeMenu}>
|
|
65
|
+
Playground
|
|
66
|
+
</Link>
|
|
67
|
+
<a
|
|
68
|
+
href="https://github.com/hasankemaldemirci/ebade"
|
|
69
|
+
target="_blank"
|
|
70
|
+
className="nav-github"
|
|
71
|
+
onClick={closeMenu}
|
|
72
|
+
>
|
|
73
|
+
<Github size={18} />
|
|
74
|
+
<span>GitHub</span>
|
|
75
|
+
</a>
|
|
76
|
+
<a
|
|
77
|
+
href="https://github.com/hasankemaldemirci/ebade#-quick-start"
|
|
78
|
+
target="_blank"
|
|
79
|
+
className="nav-cta"
|
|
80
|
+
onClick={closeMenu}
|
|
81
|
+
>
|
|
82
|
+
Get Started
|
|
83
|
+
</a>
|
|
84
|
+
</div>
|
|
85
|
+
</nav>
|
|
86
|
+
|
|
87
|
+
<main>
|
|
88
|
+
{/* Hero Section */}
|
|
89
|
+
<section className="hero-full">
|
|
90
|
+
<div className="hero-content">
|
|
91
|
+
<div className="badge-modern">
|
|
92
|
+
<Cpu className="icon-small" size={14} />
|
|
93
|
+
Protocol 0.1.0 // Alpha
|
|
94
|
+
</div>
|
|
95
|
+
<h1 className="glitch-text" data-version="1.0.1">
|
|
96
|
+
Code = f(<span>Intent</span>)
|
|
97
|
+
</h1>
|
|
98
|
+
<p className="hero-description">
|
|
99
|
+
<span className="ebade-brand">ebade</span> is an evolution in
|
|
100
|
+
abstract engineering. We don't build components; we model
|
|
101
|
+
intent. Designed for the era where <strong>Agents</strong> are
|
|
102
|
+
the primary developers.
|
|
103
|
+
</p>
|
|
104
|
+
<div className="hero-actions">
|
|
105
|
+
<a href="#technology" className="btn-glow">
|
|
106
|
+
Explore Protocol
|
|
107
|
+
</a>
|
|
108
|
+
<a
|
|
109
|
+
href="https://www.npmjs.com/package/ebade"
|
|
110
|
+
className="btn-minimal"
|
|
111
|
+
>
|
|
112
|
+
npm install ebade
|
|
113
|
+
</a>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div className="scroll-indicator">
|
|
118
|
+
<div className="line"></div>
|
|
119
|
+
<span>INTENT_STREAM</span>
|
|
120
|
+
</div>
|
|
121
|
+
</section>
|
|
122
|
+
|
|
123
|
+
{/* Technology Section */}
|
|
124
|
+
<section id="technology" className="section-dark">
|
|
125
|
+
<div className="section-container">
|
|
126
|
+
<header className="section-header">
|
|
127
|
+
<div className="badge-accent">Philosophy</div>
|
|
128
|
+
<h2>
|
|
129
|
+
Agentic <span>Intent</span>
|
|
130
|
+
</h2>
|
|
131
|
+
<p>
|
|
132
|
+
Why write 100 lines of boilerplate when an agent can infer
|
|
133
|
+
implementation from 8 lines of pure intent?
|
|
134
|
+
</p>
|
|
135
|
+
</header>
|
|
136
|
+
|
|
137
|
+
<div className="comparison-modern">
|
|
138
|
+
{/* ebade Intent (Input) */}
|
|
139
|
+
<div className="code-card ebade">
|
|
140
|
+
<div className="card-header">
|
|
141
|
+
<div className="window-controls">
|
|
142
|
+
<span className="control close"></span>
|
|
143
|
+
<span className="control minimize"></span>
|
|
144
|
+
<span className="control maximize"></span>
|
|
145
|
+
</div>
|
|
146
|
+
<div className="card-tag">ebade Protocol (Intent)</div>
|
|
147
|
+
</div>
|
|
148
|
+
<pre>
|
|
149
|
+
<code>
|
|
150
|
+
<span className="keyword">@page</span>(
|
|
151
|
+
<span className="string">'/products'</span>)
|
|
152
|
+
{"\n"}
|
|
153
|
+
<span className="keyword">@intent</span>(
|
|
154
|
+
<span className="string">
|
|
155
|
+
'product-catalog'
|
|
156
|
+
</span>
|
|
157
|
+
){"\n"}
|
|
158
|
+
<span className="keyword">@requires</span>([
|
|
159
|
+
<span className="string">'products'</span>])
|
|
160
|
+
{"\n"}
|
|
161
|
+
<span className="keyword">@compose</span>([
|
|
162
|
+
<span className="string">'grid'</span>,{" "}
|
|
163
|
+
<span className="string">'loader'</span>])
|
|
164
|
+
{"\n"}
|
|
165
|
+
<span className="keyword">export function</span>{" "}
|
|
166
|
+
<span className="function">Catalog</span>() {"{}"}
|
|
167
|
+
</code>
|
|
168
|
+
</pre>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
<div className="transform-arrow">
|
|
172
|
+
<Zap size={24} />
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
{/* React Output (Generated Code) */}
|
|
176
|
+
<div className="code-card legacy">
|
|
177
|
+
<div className="card-header">
|
|
178
|
+
<div className="window-controls">
|
|
179
|
+
<span className="control close"></span>
|
|
180
|
+
<span className="control minimize"></span>
|
|
181
|
+
<span className="control maximize"></span>
|
|
182
|
+
</div>
|
|
183
|
+
<div className="card-tag">Generated: React + Next.js</div>
|
|
184
|
+
</div>
|
|
185
|
+
<pre>
|
|
186
|
+
<code>{`export default function ProductList() {
|
|
187
|
+
const [items, setItems] = useState([]);
|
|
188
|
+
const [loading, setLoading] = useState(true);
|
|
189
|
+
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
async function load() {
|
|
192
|
+
const res = await fetch('/api/products');
|
|
193
|
+
const json = await res.json();
|
|
194
|
+
setItems(json);
|
|
195
|
+
setLoading(false);
|
|
196
|
+
}
|
|
197
|
+
load();
|
|
198
|
+
}, []);
|
|
199
|
+
|
|
200
|
+
if (loading) return <Spinner />;
|
|
201
|
+
|
|
202
|
+
return (
|
|
203
|
+
<section className="grid">
|
|
204
|
+
{items.map(p => <Card key={p.id} {...p} />)}
|
|
205
|
+
</section>
|
|
206
|
+
);
|
|
207
|
+
}`}</code>
|
|
208
|
+
</pre>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
</section>
|
|
213
|
+
|
|
214
|
+
{/* Benchmarks Section */}
|
|
215
|
+
<section id="benchmarks" className="benchmark-minimal">
|
|
216
|
+
<div className="section-container">
|
|
217
|
+
<header
|
|
218
|
+
className="section-header"
|
|
219
|
+
style={{ marginBottom: "4rem" }}
|
|
220
|
+
>
|
|
221
|
+
<div className="badge-accent">Efficiency</div>
|
|
222
|
+
<h2>
|
|
223
|
+
Proven <span>Performance</span>
|
|
224
|
+
</h2>
|
|
225
|
+
<p
|
|
226
|
+
style={{
|
|
227
|
+
margin: "0 auto",
|
|
228
|
+
color: "var(--text-dim)",
|
|
229
|
+
maxWidth: "600px",
|
|
230
|
+
}}
|
|
231
|
+
>
|
|
232
|
+
Real-world benchmarks demonstrating how ebade slashes
|
|
233
|
+
operational costs and cognitive load for AI agents.
|
|
234
|
+
</p>
|
|
235
|
+
</header>
|
|
236
|
+
<div className="stats-box">
|
|
237
|
+
<div className="stat">
|
|
238
|
+
<div className="stat-icon">
|
|
239
|
+
<Zap size={32} />
|
|
240
|
+
</div>
|
|
241
|
+
<span className="val">70%</span>
|
|
242
|
+
<span className="label">Token Reduction</span>
|
|
243
|
+
</div>
|
|
244
|
+
<div className="stat-divider"></div>
|
|
245
|
+
<div className="stat">
|
|
246
|
+
<div className="stat-icon">
|
|
247
|
+
<Brain size={32} />
|
|
248
|
+
</div>
|
|
249
|
+
<span className="val">4.1x</span>
|
|
250
|
+
<span className="label">Agent Context Efficiency</span>
|
|
251
|
+
</div>
|
|
252
|
+
<div className="stat-divider"></div>
|
|
253
|
+
<div className="stat">
|
|
254
|
+
<div
|
|
255
|
+
className="stat-icon"
|
|
256
|
+
style={{ color: "var(--accent-emerald)" }}
|
|
257
|
+
>
|
|
258
|
+
<Leaf size={32} />
|
|
259
|
+
</div>
|
|
260
|
+
<span className="val">Zero</span>
|
|
261
|
+
<span className="label">Sustainable AI Core</span>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
</section>
|
|
266
|
+
|
|
267
|
+
{/* Features Section */}
|
|
268
|
+
<section className="features-grid-section">
|
|
269
|
+
<div className="section-container">
|
|
270
|
+
<header className="section-header">
|
|
271
|
+
<div className="badge-accent">Standard</div>
|
|
272
|
+
<h2 style={{ color: "var(--text)" }}>
|
|
273
|
+
The ebade <span>Ecosystem</span>
|
|
274
|
+
</h2>
|
|
275
|
+
<p style={{ margin: "0 auto", color: "var(--text-dim)" }}>
|
|
276
|
+
Engineered for high-autonomy agents and complex product
|
|
277
|
+
lifecycles.
|
|
278
|
+
</p>
|
|
279
|
+
</header>
|
|
280
|
+
<div className="grid-3">
|
|
281
|
+
<div className="feature-item">
|
|
282
|
+
<Code2 size={40} />
|
|
283
|
+
<h3>Agent-Native</h3>
|
|
284
|
+
<p>
|
|
285
|
+
Designed as a first-class citizen for LLMs. Structured
|
|
286
|
+
intent that models understand instantly.
|
|
287
|
+
</p>
|
|
288
|
+
</div>
|
|
289
|
+
<div className="feature-item">
|
|
290
|
+
<Layers size={40} />
|
|
291
|
+
<h3>Meta-Abstraction</h3>
|
|
292
|
+
<p>
|
|
293
|
+
Platform-agnostic intent layer. Currently optimized for
|
|
294
|
+
Next.js. The same intent will power mobile, backend, and
|
|
295
|
+
beyond.
|
|
296
|
+
</p>
|
|
297
|
+
</div>
|
|
298
|
+
<div className="feature-item">
|
|
299
|
+
<Terminal size={40} />
|
|
300
|
+
<h3>Binary Scaffold</h3>
|
|
301
|
+
<p>
|
|
302
|
+
Generate full, production-ready project structures from a
|
|
303
|
+
single schema definition.
|
|
304
|
+
</p>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
</section>
|
|
309
|
+
</main>
|
|
310
|
+
|
|
311
|
+
{/* Footer */}
|
|
312
|
+
<footer className="site-footer">
|
|
313
|
+
<div className="footer-container">
|
|
314
|
+
<div className="footer-brand">
|
|
315
|
+
<div className="footer-logo">🧠 ebade</div>
|
|
316
|
+
<p className="footer-slogan">
|
|
317
|
+
Capture the essence of code.
|
|
318
|
+
<br />
|
|
319
|
+
Less tokens. Less carbon. Same result. 🌱
|
|
320
|
+
</p>
|
|
321
|
+
</div>
|
|
322
|
+
<div className="footer-links">
|
|
323
|
+
<div className="footer-column">
|
|
324
|
+
<h4>Product</h4>
|
|
325
|
+
<a href="#technology">Technology</a>
|
|
326
|
+
<a href="#benchmarks">Benchmarks</a>
|
|
327
|
+
<a
|
|
328
|
+
href="https://github.com/hasankemaldemirci/ebade/tree/main/examples"
|
|
329
|
+
target="_blank"
|
|
330
|
+
>
|
|
331
|
+
Examples
|
|
332
|
+
</a>
|
|
333
|
+
</div>
|
|
334
|
+
<div className="footer-column">
|
|
335
|
+
<h4>Resources</h4>
|
|
336
|
+
<a
|
|
337
|
+
href="https://github.com/hasankemaldemirci/ebade"
|
|
338
|
+
target="_blank"
|
|
339
|
+
>
|
|
340
|
+
GitHub
|
|
341
|
+
</a>
|
|
342
|
+
<a href="https://www.npmjs.com/package/ebade" target="_blank">
|
|
343
|
+
npm
|
|
344
|
+
</a>
|
|
345
|
+
<a
|
|
346
|
+
href="https://github.com/hasankemaldemirci/ebade/blob/main/ROADMAP.md"
|
|
347
|
+
target="_blank"
|
|
348
|
+
>
|
|
349
|
+
Roadmap
|
|
350
|
+
</a>
|
|
351
|
+
</div>
|
|
352
|
+
<div className="footer-column">
|
|
353
|
+
<h4>Contact</h4>
|
|
354
|
+
<a href="mailto:hello@ebade.dev">hello@ebade.dev</a>
|
|
355
|
+
<a
|
|
356
|
+
href="https://github.com/sponsors/hasankemaldemirci"
|
|
357
|
+
target="_blank"
|
|
358
|
+
>
|
|
359
|
+
Sponsor 💜
|
|
360
|
+
</a>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
<div className="footer-bottom">
|
|
365
|
+
<p>© 2026 ebade. The Agent-First Framework.</p>
|
|
366
|
+
<p className="footer-tagline">
|
|
367
|
+
Code = f(Intent) // Kind to Earth 🌍
|
|
368
|
+
</p>
|
|
369
|
+
</div>
|
|
370
|
+
</footer>
|
|
371
|
+
</div>
|
|
372
|
+
</>
|
|
373
|
+
);
|
|
374
|
+
}
|