ebade 0.1.0 β†’ 0.2.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.
@@ -0,0 +1,2 @@
1
+ github: [hasankemaldemirci]
2
+ # custom: ["https://www.buymeacoffee.com/hasankemal", "https://patreon.com/ebade"]
package/README.md CHANGED
@@ -1,11 +1,16 @@
1
1
  # ebade 🧠
2
2
 
3
+ ![ebade - The First Agent-First Framework](https://ebade.dev/og-readme.png)
4
+
5
+ [![npm version](https://img.shields.io/npm/v/ebade.svg)](https://www.npmjs.com/package/ebade)
6
+ [![Website](https://img.shields.io/badge/Website-ebade.dev-4F46E5)](https://ebade.dev)
3
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
4
8
  [![MCP Server](https://img.shields.io/badge/MCP-Ready-green.svg)](./packages/mcp-server)
5
9
  [![Status](https://img.shields.io/badge/Status-Alpha-orange.svg)](./ROADMAP.md)
6
- [![Green AI](https://img.shields.io/badge/🌱_Green_AI-66%25_Less_Tokens-brightgreen)](./docs/GREEN-AI.md)
10
+ [![Green AI](https://img.shields.io/badge/🌱_Green_AI-70%25_Less_Tokens-brightgreen)](./docs/GREEN-AI.md)
11
+ [![Sponsor](https://img.shields.io/badge/Sponsor-ebade-pink.svg?logo=github-sponsors)](https://github.com/sponsors/hasankemaldemirci)
7
12
 
8
- > **The first framework designed FOR AI agents, readable by humans.**
13
+ > **The first framework designed for AI agents, readable by humans.**
9
14
  >
10
15
  > `Code = f(ebade)`
11
16
  >
@@ -72,16 +77,17 @@ npx ebade dev
72
77
 
73
78
  ---
74
79
 
75
- ## πŸ“Š Benchmark: ~66% Fewer Tokens (Tested)
80
+ ## πŸ“Š Benchmark: ~70% Fewer Tokens (Tested)
76
81
 
77
82
  We measured token usage across common development tasks:
78
83
 
79
84
  | Task | Next.js | ebade | Savings | Efficiency |
80
- |------|---------|-------|---------|------------|
85
+ | :--- | :--- | :--- | :--- | :--- |
81
86
  | Checkout Page | 258 tokens | 66 tokens | **74.4%** | 3.9x |
82
87
  | Product Listing | 133 tokens | 63 tokens | **52.6%** | 2.1x |
83
88
  | User Auth | 148 tokens | 56 tokens | **62.2%** | 2.6x |
84
- | **Average** | | | **65.7%** | **2.9x** |
89
+ | SaaS Dashboard ⭐ | 1,850 tokens | 245 tokens | **86.8%** | 7.6x |
90
+ | **Average** | | | **68.8%** | **4.1x** |
85
91
 
86
92
  > *For full project scaffolding, savings can reach 75-92%.*
87
93
 
@@ -90,7 +96,7 @@ We measured token usage across common development tasks:
90
96
  At scale (1M AI coding sessions):
91
97
 
92
98
  | Framework | Token Cost | Savings |
93
- |-----------|------------|---------|
99
+ | :--- | :--- | :--- |
94
100
  | Next.js | $5,390 | - |
95
101
  | **ebade** | **$1,850** | **$3,540** |
96
102
 
@@ -104,8 +110,9 @@ At scale (1M AI coding sessions):
104
110
 
105
111
  AI agents (Cursor, Copilot, Claude) write code for **human-designed frameworks**:
106
112
 
107
- ```
113
+ ```text
108
114
  AI: "Is this a server or client component?"
115
+
109
116
  AI: "App router or pages router?"
110
117
  AI: "useState or useReducer?"
111
118
  AI: "Where does this file go?"
@@ -117,7 +124,7 @@ Every decision is **ambiguous**. AI guesses. Sometimes wrong.
117
124
 
118
125
  **ebade** - A framework where AI expresses **intent**, not implementation.
119
126
 
120
- ```
127
+ ```text
121
128
  Human describes β†’ AI writes intent β†’ ebade compiles β†’ Working code
122
129
  ↑
123
130
  No ambiguity here
@@ -128,11 +135,11 @@ Human describes β†’ AI writes intent β†’ ebade compiles β†’ Working code
128
135
  ## πŸ“¦ Packages
129
136
 
130
137
  | Package | Description | Status |
131
- |---------|-------------|--------|
138
+ | :--- | :--- | :--- |
139
+ | **`ebade`** | Core Framework & CLI | βœ… Alpha |
132
140
  | [@ebade/mcp-server](./packages/mcp-server) | MCP Server for AI agents | βœ… Alpha |
133
- | @ebade/cli | Command-line interface | 🚧 Coming |
134
- | @ebade/compiler | Intent β†’ Code compiler | 🚧 Coming |
135
- | @ebade/vscode | VS Code extension | πŸ“‹ Planned |
141
+ | `@ebade/compiler` | Advanced Intent Compiler | 🚧 Planning |
142
+ | `@ebade/vscode` | VS Code extension | πŸ“‹ Planned |
136
143
 
137
144
  ---
138
145
 
@@ -215,7 +222,7 @@ pages:
215
222
  ## 🎭 The Paradigm Shift
216
223
 
217
224
  | Era | Paradigm | Core Question |
218
- |-----|----------|---------------|
225
+ | :--- | :--- | :--- |
219
226
  | 2000s | jQuery | "How do I manipulate DOM?" |
220
227
  | 2013 | React | "What if UI = f(state)?" |
221
228
  | 2024 | AI Coding | "AI writes code, but for humans" |
@@ -247,17 +254,23 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
247
254
 
248
255
  ---
249
256
 
257
+ ## πŸ’Ž Support the Movement
258
+
259
+ **ebade** is an ambitious project aiming to redefine how we build software in the age of AI. Your support helps us move faster, maintain high-quality documentation, and build a more sustainable "Green AI" future.
260
+
261
+ - **[Become a GitHub Sponsor](https://github.com/sponsors/hasankemaldemirci)** πŸ’–
262
+ - **Star the repo** to show your support ⭐
263
+ - **Share the project** with other AI enthusiasts πŸš€
264
+
265
+ ---
266
+
250
267
  ## πŸ“„ License
251
268
 
252
269
  MIT Β© ebade Contributors β€” Made with ❀️ in TΓΌrkiye πŸ‡ΉπŸ‡·
253
270
 
254
271
  ---
255
272
 
256
- <p align="center">
257
- <strong>Built for AI. Readable by humans. Revolutionary by design.</strong>
258
- </p>
273
+ **Built for AI. Readable by humans. Revolutionary by design.**
259
274
 
260
- <p align="center">
261
- <i>TypeScript made JavaScript better for humans.<br/>
262
- ebade makes frameworks better for AI.</i>
263
- </p>
275
+ *TypeScript made JavaScript better for humans.*
276
+ *ebade makes frameworks better for AI.*
package/ROADMAP.md CHANGED
@@ -12,9 +12,9 @@ It's more efficient, deterministic, and KIND TO EARTH. 🌱
12
12
 
13
13
  ---
14
14
 
15
- ## Phase 1: Foundation (Week 1-2) βœ… IN PROGRESS
15
+ ## Phase 1: Foundation (Week 1-2) βœ… COMPLETE
16
16
 
17
- ### 1.1 MCP Server
17
+ ### 1.1 MCP Server βœ…
18
18
 
19
19
  Make ebade usable by AI agents RIGHT NOW.
20
20
 
@@ -24,7 +24,19 @@ Make ebade usable by AI agents RIGHT NOW.
24
24
  - [x] `ebade_compile` tool - compile single ebade to code
25
25
  - [x] `ebade_generate` tool - infer ebade from natural language
26
26
 
27
- ### 1.2 Real Compiler
27
+ ### 1.2 CLI Premium Experience βœ…
28
+
29
+ - [x] ASCII Art logo on startup
30
+ - [x] Spinner animations for progress
31
+ - [x] Statistics summary (files, token savings, time)
32
+ - [x] "Generated via ebade" headers in all output files
33
+
34
+ ### 1.3 Examples & Templates βœ…
35
+
36
+ - [x] E-commerce template (193 lines)
37
+ - [x] SaaS Dashboard template (300 lines, multi-tenant, billing, team management)
38
+
39
+ ### 1.4 Real Compiler (In Progress)
28
40
 
29
41
  Replace string templates with actual AST-based compilation.
30
42
 
@@ -32,7 +44,7 @@ Replace string templates with actual AST-based compilation.
32
44
  - [ ] Code generator (AST β†’ React/Next.js)
33
45
  - [ ] Support for multiple framework targets
34
46
 
35
- ### 1.3 CLI Improvements
47
+ ### 1.5 CLI Improvements
36
48
 
37
49
  - [ ] `ebade init` - interactive project setup
38
50
  - [ ] `ebade dev` - watch mode with local agent sync
@@ -71,7 +83,7 @@ Replace string templates with actual AST-based compilation.
71
83
 
72
84
  ### 3.2 Framework Targets
73
85
 
74
- - [ ] Next.js App Router βœ… (v0.1)
86
+ - [x] Next.js App Router βœ… (v0.1)
75
87
  - [ ] Vue 3 + Nuxt
76
88
  - [ ] Svelte + SvelteKit
77
89
  - [ ] Mobile (React Native / Flutter)
@@ -99,20 +111,20 @@ Replace string templates with actual AST-based compilation.
99
111
 
100
112
  ## Success Metrics (3 Months)
101
113
 
102
- | Metric | Target | Mission |
103
- | :--- | :--- | :--- |
104
- | Token Savings | >70% | Efficiency |
105
- | Carbon Saved | >100kg | Sustainability |
106
- | Framework Targets | 3 | Accessibility |
107
- | Community Size | 1,000 "Badiks" | Impact |
114
+ | Metric | Target | Current | Status |
115
+ | :--- | :--- | :--- | :--- |
116
+ | Token Savings | >70% | ~70% | βœ… |
117
+ | Carbon Saved | >100kg | TBD | πŸ”„ |
118
+ | Framework Targets | 3 | 1 | πŸ”„ |
119
+ | Community Size | 1,000 "Badiks" | 0 | πŸ”œ |
108
120
 
109
121
  ---
110
122
 
111
123
  ## Current Status
112
124
 
113
- **Phase 1.1 - MCP Server** ← WE ARE HERE
125
+ **Phase 1 - Foundation** ← NEARLY COMPLETE
114
126
 
115
- The MCP server is live. AI agents can now use ebade to scaffold full Next.js apps with 65% fewer tokens.
127
+ The MCP server is live. CLI has premium UX. Two comprehensive examples (E-commerce + SaaS Dashboard) are ready. AI agents can now use ebade to scaffold full Next.js apps with **~70% fewer tokens**.
116
128
 
117
129
  ---
118
130
 
@@ -1,6 +1,6 @@
1
1
  # ebade Benchmark Results πŸ“Š
2
2
 
3
- > **The first framework designed FOR AI agents, readable by humans.**
3
+ > **The first framework designed for AI agents, readable by humans.**
4
4
 
5
5
  ---
6
6
 
package/cli/scaffold.js CHANGED
@@ -10,6 +10,7 @@
10
10
  import fs from "fs";
11
11
  import path from "path";
12
12
  import yaml from "yaml";
13
+ import ora from "ora";
13
14
 
14
15
  // ============================================
15
16
  // ANSI Renk KodlarΔ± (Terminal Γ§Δ±ktΔ±sΔ± iΓ§in)
@@ -23,8 +24,22 @@ const colors = {
23
24
  yellow: "\x1b[33m",
24
25
  cyan: "\x1b[36m",
25
26
  magenta: "\x1b[35m",
27
+ red: "\x1b[31m",
28
+ gray: "\x1b[90m",
26
29
  };
27
30
 
31
+ // ASCII Art Logo
32
+ const LOGO = `
33
+ ${colors.magenta} β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—${colors.cyan}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— ${colors.magenta}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— ${colors.cyan}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— ${colors.magenta}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
34
+ ${colors.magenta} β–ˆβ–ˆβ•”β•β•β•β•β•${colors.cyan}β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—${colors.magenta}β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—${colors.cyan}β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—${colors.magenta}β–ˆβ–ˆβ•”β•β•β•β•β•
35
+ ${colors.magenta} β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— ${colors.cyan}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•${colors.magenta}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘${colors.cyan}β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘${colors.magenta}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
36
+ ${colors.magenta} β–ˆβ–ˆβ•”β•β•β• ${colors.cyan}β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—${colors.magenta}β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘${colors.cyan}β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘${colors.magenta}β–ˆβ–ˆβ•”β•β•β•
37
+ ${colors.magenta} β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—${colors.cyan}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•${colors.magenta}β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘${colors.cyan}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•${colors.magenta}β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
38
+ ${colors.magenta} β•šβ•β•β•β•β•β•β•${colors.cyan}β•šβ•β•β•β•β•β• ${colors.magenta}β•šβ•β• β•šβ•β•${colors.cyan}β•šβ•β•β•β•β•β• ${colors.magenta}β•šβ•β•β•β•β•β•β•${colors.reset}
39
+
40
+ ${colors.dim}✨ Agent-First Framework ${colors.yellow}v0.1.0${colors.reset}
41
+ `;
42
+
28
43
  const log = {
29
44
  info: (msg) => console.log(`${colors.blue}β„Ή${colors.reset} ${msg}`),
30
45
  success: (msg) => console.log(`${colors.green}βœ“${colors.reset} ${msg}`),
@@ -115,13 +130,16 @@ function generatePage(page, design) {
115
130
 
116
131
  return `
117
132
  /**
133
+ * 🧠 Generated via ebade - The Agent-First Framework
134
+ * https://github.com/hasankemaldemirci/ebade
135
+ *
118
136
  * @page('${page.path}')
119
- * @ebade('${page.intent}')
120
- * Built with ebade
137
+ * @intent('${page.intent}')
121
138
  */
122
139
 
123
140
  ${componentImports}
124
141
 
142
+
125
143
  export default function ${toPascalCase(page.intent)}Page() {
126
144
  return (
127
145
  <main className="page ${page.intent}">
@@ -141,10 +159,13 @@ function generateApiRoute(endpoint) {
141
159
  const handlers = endpoint.methods
142
160
  .map(
143
161
  (method) => `
162
+ /**
163
+ * 🧠 Generated via ebade - The Agent-First Framework
164
+ * ${method} ${endpoint.path}
165
+ * Auth: ${endpoint.auth || "none"}
166
+ */
144
167
  export async function ${method}(request) {
145
- // TODO: Implement ${method} handler for ${endpoint.path}
146
- // Auth: ${endpoint.auth || "none"}
147
- // Built with ebade
168
+ // TODO: Implement ${method} handler
148
169
 
149
170
  return Response.json({
150
171
  message: "${method} ${endpoint.path} - Not implemented"
@@ -494,12 +515,10 @@ function ensureDir(dir) {
494
515
  // Main Scaffold Function
495
516
  // ============================================
496
517
  function scaffold(ebadePath, outputDir) {
497
- console.log(`
498
- ${colors.bright}${colors.magenta}╔════════════════════════════════════════╗
499
- ε‘½ ebade Scaffold CLI ε‘½
500
- ε‘½ πŸ€– Agent-First Framework Generator ε‘½
501
- β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${colors.reset}
502
- `);
518
+ const startTime = Date.now();
519
+ let stats = { pages: 0, components: 0, apiRoutes: 0, files: 0 };
520
+
521
+ console.log(LOGO);
503
522
 
504
523
  // Parse ebade file
505
524
  log.info(`Reading ebade file: ${ebadePath}`);
@@ -534,6 +553,7 @@ ${colors.bright}${colors.magenta}╔══════════════
534
553
  log.section("Generating pages");
535
554
 
536
555
  if (config.pages) {
556
+ const spinner = ora("Generating pages...").start();
537
557
  config.pages.forEach((page) => {
538
558
  const pagePath =
539
559
  page.path === "/"
@@ -545,8 +565,12 @@ ${colors.bright}${colors.magenta}╔══════════════
545
565
 
546
566
  const pageContent = generatePage(page, config.design);
547
567
  fs.writeFileSync(path.join(projectDir, pagePath), pageContent.trim());
548
- log.file(`${pagePath} (${page.intent})`);
568
+ stats.pages++;
569
+ stats.files++;
549
570
  });
571
+ spinner.succeed(
572
+ `Generated ${colors.bright}${stats.pages}${colors.reset} pages`
573
+ );
550
574
  }
551
575
 
552
576
  // ========== Generate Components ==========
@@ -557,6 +581,7 @@ ${colors.bright}${colors.magenta}╔══════════════
557
581
  page.components?.forEach((c) => allComponents.add(c));
558
582
  });
559
583
 
584
+ const spinner2 = ora("Generating components...").start();
560
585
  allComponents.forEach((component) => {
561
586
  const componentPath = `components/${component}.tsx`;
562
587
  const template = componentTemplates[component];
@@ -569,13 +594,18 @@ ${colors.bright}${colors.magenta}╔══════════════
569
594
  )}() {\n return <div>${component}</div>;\n}\n`;
570
595
 
571
596
  fs.writeFileSync(path.join(projectDir, componentPath), content.trim());
572
- log.file(componentPath);
597
+ stats.components++;
598
+ stats.files++;
573
599
  });
600
+ spinner2.succeed(
601
+ `Generated ${colors.bright}${stats.components}${colors.reset} components`
602
+ );
574
603
 
575
604
  // ========== Generate API Routes ==========
576
605
  log.section("Generating API routes");
577
606
 
578
607
  if (config.api) {
608
+ const spinner3 = ora("Generating API routes...").start();
579
609
  config.api.forEach((endpoint) => {
580
610
  const apiPath = `app/api${endpoint.path}/route.ts`;
581
611
  const apiDir = path.dirname(path.join(projectDir, apiPath));
@@ -583,8 +613,12 @@ ${colors.bright}${colors.magenta}╔══════════════
583
613
 
584
614
  const routeContent = generateApiRoute(endpoint);
585
615
  fs.writeFileSync(path.join(projectDir, apiPath), routeContent.trim());
586
- log.file(`${apiPath} [${endpoint.methods.join(", ")}]`);
616
+ stats.apiRoutes++;
617
+ stats.files++;
587
618
  });
619
+ spinner3.succeed(
620
+ `Generated ${colors.bright}${stats.apiRoutes}${colors.reset} API routes`
621
+ );
588
622
  }
589
623
 
590
624
  // ========== Generate Design System ==========
@@ -651,23 +685,44 @@ ${colors.bright}${colors.magenta}╔══════════════
651
685
  log.file("project.ebade.yaml (for agent reference)");
652
686
 
653
687
  // ========== Summary ==========
654
- console.log(`
655
- ${colors.bright}${colors.green}════════════════════════════════════════${colors.reset}
656
- ${colors.green}βœ“${colors.reset} ebade scaffold complete!
688
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
689
+ const estimatedTokenSavings = Math.round(stats.files * 35); // ~35 tokens saved per file
657
690
 
658
- ${colors.dim}Project:${colors.reset} ${config.name}
659
- ${colors.dim}Type:${colors.reset} ${config.type}
660
- ${colors.dim}Output:${colors.reset} ${projectDir}
691
+ console.log(`
692
+ ${colors.bright}${colors.green} β”Œ${"─".repeat(41)}┐${colors.reset}
693
+ ${colors.green} β”‚${colors.reset} ${colors.bright}βœ… ebade scaffold complete!${
694
+ colors.reset
695
+ } ${colors.green}β”‚${colors.reset}
696
+ ${colors.green} β”œ${"─".repeat(41)}─${colors.reset}
697
+ ${colors.green} β”‚${colors.reset} ${colors.dim}Project:${
698
+ colors.reset
699
+ } ${config.name.padEnd(26)} ${colors.green}β”‚${colors.reset}
700
+ ${colors.green} β”‚${colors.reset} ${colors.dim}Type:${
701
+ colors.reset
702
+ } ${config.type.padEnd(26)} ${colors.green}β”‚${colors.reset}
703
+ ${colors.green} β”œ${"─".repeat(41)}─${colors.reset}
704
+ ${colors.green} β”‚${colors.reset} ${colors.cyan}πŸ“ Files Created:${
705
+ colors.reset
706
+ } ${String(stats.files).padEnd(18)} ${colors.green}β”‚${colors.reset}
707
+ ${colors.green} β”‚${colors.reset} ${colors.cyan}πŸ“Š Token Savings:${
708
+ colors.reset
709
+ } ~${String(estimatedTokenSavings).padEnd(17)} ${colors.green}β”‚${
710
+ colors.reset
711
+ }
712
+ ${colors.green} β”‚${colors.reset} ${colors.cyan}⏱ Completed in:${
713
+ colors.reset
714
+ } ${String(duration + "s").padEnd(18)} ${colors.green}β”‚${colors.reset}
715
+ ${colors.green} β””${"─".repeat(41)}β”˜${colors.reset}
661
716
 
662
717
  ${colors.dim}Next steps:${colors.reset}
663
- 1. cd ${projectDir}
664
- 2. npm install
665
- 3. npm run dev
666
-
667
- ${colors.yellow}Note:${colors.reset} The generated code is a starting point.
668
- An AI Agent can now read project.ebade.yaml
669
- to understand and iterate on this project.
670
- ${colors.bright}${colors.green}════════════════════════════════════════${colors.reset}
718
+ ${colors.gray}1.${colors.reset} cd ${colors.cyan}${projectDir}${colors.reset}
719
+ ${colors.gray}2.${colors.reset} npm install
720
+ ${colors.gray}3.${colors.reset} npm run dev
721
+
722
+ ${colors.yellow}πŸ’‘ Tip:${colors.reset} AI Agents can read ${
723
+ colors.cyan
724
+ }project.ebade.yaml${colors.reset}
725
+ to understand and iterate on this project.
671
726
  `);
672
727
  }
673
728
 
package/demo.gif ADDED
Binary file
package/docs/GREEN-AI.md CHANGED
@@ -25,7 +25,7 @@ Every token an AI generates requires:
25
25
  | Vue.js | 420,000,000 | ~78% | ~21.0 kg |
26
26
  | **ebade** | **185,000,000** | **34%** | **~9.2 kg** |
27
27
 
28
- **ebade uses 66% less compute for the same output.** 🌱
28
+ **ebade uses 70% less compute for the same output.** 🌱
29
29
 
30
30
  ---
31
31
 
@@ -70,7 +70,7 @@ Add this to your repository to show your commitment to sustainable AI developmen
70
70
  [![Green AI](https://img.shields.io/badge/Green_AI-ebade-brightgreen)](https://github.com/ebade)
71
71
  ```
72
72
 
73
- > 🌱 **Built with ebade β€” saving 66% of AI compute.**
73
+ > 🌱 **Built with ebade β€” saving 70% of AI compute.**
74
74
 
75
75
  ---
76
76
 
@@ -0,0 +1,299 @@
1
+ # ebade Project Definition File
2
+ # SaaS Dashboard - Subscription-based analytics platform
3
+ # -----------------------------------------------------------
4
+
5
+ name: "AnalyticsHQ"
6
+ type: "saas-dashboard"
7
+ description: "Modern SaaS dashboard with subscriptions, team management, and analytics"
8
+
9
+ # Core features of this SaaS
10
+ features:
11
+ - user-auth
12
+ - team-management
13
+ - subscription-billing
14
+ - analytics-dashboard
15
+ - notifications
16
+ - api-keys
17
+ - audit-logs
18
+ - dark-mode
19
+ - multi-tenant
20
+
21
+ # Page structure
22
+ pages:
23
+ - path: "/"
24
+ intent: "landing-page"
25
+ auth: none
26
+ components:
27
+ - hero-section
28
+ - feature-grid
29
+ - pricing-table
30
+ - testimonials
31
+ - faq-accordion
32
+ - cta-banner
33
+
34
+ - path: "/login"
35
+ intent: "auth-login"
36
+ components:
37
+ - login-form
38
+ - social-auth-buttons
39
+ - forgot-password-link
40
+
41
+ - path: "/signup"
42
+ intent: "auth-register"
43
+ components:
44
+ - signup-form
45
+ - plan-selector
46
+ - social-auth-buttons
47
+
48
+ - path: "/dashboard"
49
+ intent: "main-dashboard"
50
+ auth: required
51
+ layout: "dashboard-shell"
52
+ components:
53
+ - stats-grid
54
+ - activity-chart
55
+ - recent-events
56
+ - quick-actions
57
+
58
+ - path: "/dashboard/analytics"
59
+ intent: "analytics-view"
60
+ auth: required
61
+ layout: "dashboard-shell"
62
+ components:
63
+ - date-range-picker
64
+ - metrics-cards
65
+ - line-chart
66
+ - bar-chart
67
+ - data-table
68
+
69
+ - path: "/dashboard/team"
70
+ intent: "team-management"
71
+ auth: required
72
+ roles: ["admin", "owner"]
73
+ layout: "dashboard-shell"
74
+ components:
75
+ - team-members-list
76
+ - invite-member-modal
77
+ - role-selector
78
+ - pending-invites
79
+
80
+ - path: "/dashboard/settings"
81
+ intent: "user-settings"
82
+ auth: required
83
+ layout: "dashboard-shell"
84
+ components:
85
+ - profile-form
86
+ - password-change
87
+ - notification-preferences
88
+ - connected-accounts
89
+
90
+ - path: "/dashboard/billing"
91
+ intent: "billing-management"
92
+ auth: required
93
+ roles: ["owner"]
94
+ layout: "dashboard-shell"
95
+ components:
96
+ - current-plan-card
97
+ - usage-meter
98
+ - upgrade-modal
99
+ - invoice-history
100
+
101
+ - path: "/dashboard/api-keys"
102
+ intent: "api-key-management"
103
+ auth: required
104
+ roles: ["admin", "owner"]
105
+ layout: "dashboard-shell"
106
+ components:
107
+ - api-keys-table
108
+ - create-key-modal
109
+ - key-permissions
110
+
111
+ # Layouts
112
+ layouts:
113
+ dashboard-shell:
114
+ components:
115
+ - sidebar-navigation
116
+ - topbar
117
+ - user-menu
118
+ - notification-bell
119
+
120
+ # Design system
121
+ design:
122
+ style: "modern-glassmorphism"
123
+ colors:
124
+ primary: "#6366f1" # Indigo
125
+ secondary: "#8b5cf6" # Violet
126
+ accent: "#06b6d4" # Cyan
127
+ success: "#10b981" # Emerald
128
+ warning: "#f59e0b" # Amber
129
+ error: "#ef4444" # Red
130
+ background: "#0f172a" # Slate 900
131
+ surface: "#1e293b" # Slate 800
132
+ font: "Inter"
133
+ borderRadius: "xl"
134
+ shadows: true
135
+ glassmorphism: true
136
+
137
+ # Integrations
138
+ integrations:
139
+ database: "supabase"
140
+ auth: "clerk"
141
+ payments: "stripe"
142
+ analytics: "posthog"
143
+ email: "resend"
144
+ notifications: "knock"
145
+
146
+ # Subscription plans
147
+ plans:
148
+ - name: "Starter"
149
+ price: 0
150
+ limits:
151
+ events: 1000
152
+ team_members: 1
153
+ retention_days: 7
154
+ features:
155
+ - basic-analytics
156
+ - email-support
157
+
158
+ - name: "Pro"
159
+ price: 29
160
+ limits:
161
+ events: 50000
162
+ team_members: 5
163
+ retention_days: 90
164
+ features:
165
+ - advanced-analytics
166
+ - api-access
167
+ - priority-support
168
+ - custom-dashboards
169
+
170
+ - name: "Enterprise"
171
+ price: 99
172
+ limits:
173
+ events: unlimited
174
+ team_members: unlimited
175
+ retention_days: 365
176
+ features:
177
+ - all-pro-features
178
+ - sso
179
+ - audit-logs
180
+ - dedicated-support
181
+ - sla
182
+
183
+ # API Endpoints
184
+ api:
185
+ - path: "/api/events"
186
+ methods: ["GET", "POST"]
187
+ auth: api-key
188
+ description: "Track and query analytics events"
189
+
190
+ - path: "/api/team"
191
+ methods: ["GET", "POST", "DELETE"]
192
+ auth: required
193
+ roles: ["admin", "owner"]
194
+ description: "Team member management"
195
+
196
+ - path: "/api/team/invite"
197
+ methods: ["POST"]
198
+ auth: required
199
+ roles: ["admin", "owner"]
200
+ description: "Send team invitation"
201
+
202
+ - path: "/api/billing/subscription"
203
+ methods: ["GET", "POST", "PUT"]
204
+ auth: required
205
+ roles: ["owner"]
206
+ description: "Subscription management"
207
+
208
+ - path: "/api/billing/portal"
209
+ methods: ["POST"]
210
+ auth: required
211
+ description: "Generate Stripe billing portal URL"
212
+
213
+ - path: "/api/api-keys"
214
+ methods: ["GET", "POST", "DELETE"]
215
+ auth: required
216
+ roles: ["admin", "owner"]
217
+ description: "API key CRUD operations"
218
+
219
+ - path: "/api/webhooks/stripe"
220
+ methods: ["POST"]
221
+ auth: webhook
222
+ description: "Handle Stripe webhook events"
223
+
224
+ # Data models
225
+ data:
226
+ Organization:
227
+ fields:
228
+ id: { type: "uuid", required: true, unique: true }
229
+ name: { type: "string", required: true }
230
+ slug: { type: "string", required: true, unique: true }
231
+ plan: { type: "enum", required: true } # starter, pro, enterprise
232
+ stripeCustomerId: { type: "string", required: false }
233
+ stripeSubscriptionId: { type: "string", required: false }
234
+ createdAt: { type: "timestamp", required: true }
235
+ relations:
236
+ - "has_many: User"
237
+ - "has_many: Event"
238
+ - "has_many: ApiKey"
239
+
240
+ User:
241
+ fields:
242
+ id: { type: "uuid", required: true, unique: true }
243
+ email: { type: "string", required: true, unique: true }
244
+ name: { type: "string", required: true }
245
+ avatar: { type: "string", required: false }
246
+ role: { type: "enum", required: true } # owner, admin, member
247
+ organizationId: { type: "uuid", required: true }
248
+ createdAt: { type: "timestamp", required: true }
249
+ relations:
250
+ - "belongs_to: Organization"
251
+
252
+ Event:
253
+ fields:
254
+ id: { type: "uuid", required: true, unique: true }
255
+ organizationId: { type: "uuid", required: true }
256
+ name: { type: "string", required: true }
257
+ properties: { type: "json", required: false }
258
+ timestamp: { type: "timestamp", required: true }
259
+ relations:
260
+ - "belongs_to: Organization"
261
+
262
+ ApiKey:
263
+ fields:
264
+ id: { type: "uuid", required: true, unique: true }
265
+ organizationId: { type: "uuid", required: true }
266
+ name: { type: "string", required: true }
267
+ keyHash: { type: "string", required: true }
268
+ permissions: { type: "array", required: true }
269
+ lastUsedAt: { type: "timestamp", required: false }
270
+ expiresAt: { type: "timestamp", required: false }
271
+ createdAt: { type: "timestamp", required: true }
272
+ relations:
273
+ - "belongs_to: Organization"
274
+
275
+ Invitation:
276
+ fields:
277
+ id: { type: "uuid", required: true, unique: true }
278
+ email: { type: "string", required: true }
279
+ organizationId: { type: "uuid", required: true }
280
+ role: { type: "enum", required: true }
281
+ token: { type: "string", required: true, unique: true }
282
+ expiresAt: { type: "timestamp", required: true }
283
+ acceptedAt: { type: "timestamp", required: false }
284
+ relations:
285
+ - "belongs_to: Organization"
286
+
287
+ AuditLog:
288
+ fields:
289
+ id: { type: "uuid", required: true, unique: true }
290
+ organizationId: { type: "uuid", required: true }
291
+ userId: { type: "uuid", required: true }
292
+ action: { type: "string", required: true }
293
+ resourceType: { type: "string", required: true }
294
+ resourceId: { type: "uuid", required: true }
295
+ metadata: { type: "json", required: false }
296
+ createdAt: { type: "timestamp", required: true }
297
+ relations:
298
+ - "belongs_to: Organization"
299
+ - "belongs_to: User"
@@ -0,0 +1,6 @@
1
+ /*
2
+ X-Frame-Options: DENY
3
+ X-Content-Type-Options: nosniff
4
+ X-XSS-Protection: 1; mode=block
5
+ Referrer-Policy: strict-origin-when-cross-origin
6
+ Permissions-Policy: camera=(), microphone=(), geolocation=()
@@ -6,7 +6,7 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>ebade | The First Agent-First Framework</title>
8
8
  <meta name="description"
9
- content="ebade is the first framework designed FOR AI agents, readable by humans. Reduce token usage by 66% with intent-driven development." />
9
+ content="ebade is The first framework designed for AI agents, readable by humans. Reduce token usage by 70% with intent-driven development." />
10
10
 
11
11
  <!-- Favicon -->
12
12
  <link rel="icon" type="image/svg+xml" href="favicon.svg" />
@@ -16,14 +16,24 @@
16
16
  <meta property="og:url" content="https://ebade.dev/" />
17
17
  <meta property="og:title" content="ebade | The First Agent-First Framework" />
18
18
  <meta property="og:description"
19
- content="The first framework designed FOR AI agents. Reduce token usage by 66% with intent-driven development." />
19
+ content="The first framework designed FOR AI agents. Reduce token usage by 70% with intent-driven development." />
20
20
  <meta property="og:image" content="https://ebade.dev/og-image.png" />
21
21
 
22
22
  <!-- Twitter -->
23
23
  <meta name="twitter:card" content="summary_large_image" />
24
24
  <meta name="twitter:title" content="ebade | The First Agent-First Framework" />
25
- <meta name="twitter:description" content="The first framework designed FOR AI agents. Reduce token usage by 66%." />
25
+ <meta name="twitter:description" content="The first framework designed FOR AI agents. Reduce token usage by 70%." />
26
26
  <meta name="twitter:image" content="https://ebade.dev/og-image.png" />
27
+
28
+ <!-- Google tag (gtag.js) -->
29
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-RMQ7E747ZH"></script>
30
+ <script>
31
+ window.dataLayer = window.dataLayer || [];
32
+ function gtag() { dataLayer.push(arguments); }
33
+ gtag('js', new Date());
34
+
35
+ gtag('config', 'G-RMQ7E747ZH');
36
+ </script>
27
37
  <link rel="preconnect" href="https://fonts.googleapis.com" />
28
38
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
29
39
  <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;600;800;900&family=JetBrains+Mono&display=swap"
@@ -45,7 +55,7 @@
45
55
  <i data-lucide="github"></i>
46
56
  <span>GitHub</span>
47
57
  </a>
48
- <a href="https://github.com/hasankemaldemirci/ebade#quick-start" target="_blank" class="nav-cta">Get Started</a>
58
+ <a href="https://github.com/hasankemaldemirci/ebade#-quick-start" target="_blank" class="nav-cta">Get Started</a>
49
59
  </div>
50
60
  </nav>
51
61
 
@@ -55,7 +65,7 @@
55
65
  <div class="badge-modern">
56
66
  <i data-lucide="cpu" class="icon-small"></i> Protocol 0.1.0 // Alpha
57
67
  </div>
58
- <h1 class="glitch-text">The Essence of <span>Code</span></h1>
68
+ <h1 class="glitch-text">Code = f(<span>Intent</span>)</h1>
59
69
  <p class="hero-description">
60
70
  <span class="ebade-brand">ebade</span> is an evolution in abstract
61
71
  engineering. We don't build components; we model intent. Designed
@@ -155,13 +165,13 @@
155
165
  <div class="stats-box">
156
166
  <div class="stat">
157
167
  <div class="stat-icon"><i data-lucide="zap"></i></div>
158
- <span class="val">66%</span>
168
+ <span class="val">70%</span>
159
169
  <span class="label">Token Reduction</span>
160
170
  </div>
161
171
  <div class="stat-divider"></div>
162
172
  <div class="stat">
163
173
  <div class="stat-icon"><i data-lucide="brain"></i></div>
164
- <span class="val">2.9x</span>
174
+ <span class="val">4.1x</span>
165
175
  <span class="label">Agent Context Efficiency</span>
166
176
  </div>
167
177
  <div class="stat-divider"></div>
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ebade",
3
- "version": "0.1.0",
4
- "description": "ebade - Agent-First Framework. The first framework designed FOR AI agents, readable by humans.",
3
+ "version": "0.2.0",
4
+ "description": "ebade - Agent-First Framework. The first framework designed for AI agents, readable by humans.",
5
5
  "type": "module",
6
6
  "main": "cli/scaffold.js",
7
7
  "bin": {
@@ -30,11 +30,12 @@
30
30
  "type": "git",
31
31
  "url": "git+https://github.com/hasankemaldemirci/ebade.git"
32
32
  },
33
- "homepage": "https://github.com/hasankemaldemirci/ebade#readme",
33
+ "homepage": "https://ebade.dev",
34
34
  "bugs": {
35
35
  "url": "https://github.com/hasankemaldemirci/ebade/issues"
36
36
  },
37
37
  "dependencies": {
38
+ "ora": "^9.0.0",
38
39
  "yaml": "^2.3.4"
39
40
  },
40
41
  "engines": {