ebade 0.2.2 → 0.3.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/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
  [![MCP Server](https://img.shields.io/badge/MCP-Ready-green.svg)](./packages/mcp-server)
9
9
  [![Status](https://img.shields.io/badge/Status-Alpha-orange.svg)](./ROADMAP.md)
10
10
  [![Green AI](https://img.shields.io/badge/🌱_Green_AI-70%25_Less_Tokens-brightgreen)](./docs/GREEN-AI.md)
11
+ [![Agent-Native](https://img.shields.io/badge/Agent--Native-Universal_AI_Support-black)](./SYNTAX.md)
11
12
  [![Sponsor](https://img.shields.io/badge/Sponsor-ebade-pink.svg?logo=github-sponsors)](https://github.com/sponsors/hasankemaldemirci)
12
13
 
13
14
  > **The first framework designed for AI agents, readable by humans.**
@@ -70,18 +71,27 @@ Then AI agents can use:
70
71
  ### For Humans (CLI)
71
72
 
72
73
  ```bash
73
- # Scaffold a new project
74
- npx ebade scaffold --type e-commerce --name my-store
74
+ # Scaffold a new project from an ebade file
75
+ npx ebade scaffold examples/saas-dashboard.ebade.yaml ./my-app
75
76
 
76
- # Compile intents to code
77
- npx ebade build
78
-
79
- # Watch mode
80
- npx ebade dev
77
+ # See all commands
78
+ npx ebade --help
81
79
  ```
82
80
 
83
81
  ---
84
82
 
83
+ ## 🤖 Integrated AI Synergy
84
+
85
+ **ebade** projects automatically configure themselves for AI collaboration. When you scaffold a project, it generates specialized instruction files for major AI agents:
86
+
87
+ - **Cursor**: `.cursorrules`
88
+ - **Claude / Windsurf**: `.clauderules`
89
+ - **GitHub Copilot**: `.github/copilot-instructions.md`
90
+
91
+ These files teach the AI agents exactly how to work with ebade intents, ensuring they never "hallucinate" boilerplate and always stay token-efficient.
92
+
93
+ ---
94
+
85
95
  ## 📊 Benchmark: ~70% Fewer Tokens (Tested)
86
96
 
87
97
  We measured token usage across common development tasks:
@@ -211,8 +221,9 @@ pages:
211
221
  - search-bar
212
222
  - product-grid
213
223
  - pagination
214
-
224
+
215
225
  - path: /checkout
226
+
216
227
  intent: checkout-flow
217
228
  auth: required
218
229
  components:
package/ROADMAP.md CHANGED
@@ -44,10 +44,10 @@ Replace string templates with actual AST-based compilation.
44
44
  - [ ] Code generator (AST → React/Next.js)
45
45
  - [ ] Support for multiple framework targets
46
46
 
47
- ### 1.5 CLI Improvements
47
+ ### 1.5 CLI Improvements
48
48
 
49
- - [ ] `ebade init` - interactive project setup
50
- - [ ] `ebade dev` - watch mode with local agent sync
49
+ - [x] `ebade init` - interactive project setup
50
+ - [x] `ebade dev` - watch mode with local agent sync
51
51
 
52
52
  ---
53
53
 
@@ -122,7 +122,7 @@ Replace string templates with actual AST-based compilation.
122
122
 
123
123
  ## Current Status
124
124
 
125
- **Phase 1 - Foundation** NEARLY COMPLETE
125
+ ### Phase 1 - Foundation (Nearly Complete)
126
126
 
127
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**.
128
128
 
package/cli/scaffold.js CHANGED
@@ -11,6 +11,8 @@ import fs from "fs";
11
11
  import path from "path";
12
12
  import yaml from "yaml";
13
13
  import ora from "ora";
14
+ import prompts from "prompts";
15
+ import chokidar from "chokidar";
14
16
 
15
17
  // ============================================
16
18
  // ANSI Renk Kodları (Terminal çıktısı için)
@@ -791,17 +793,175 @@ ${colors.dim}Usage:${colors.reset}
791
793
  npx ebade <command> [options]
792
794
 
793
795
  ${colors.dim}Commands:${colors.reset}
796
+ init Create a new ebade project interactively
794
797
  scaffold <file> [output] Scaffold a project from ebade file
798
+ dev <file> [output] Watch ebade file and re-scaffold on changes
795
799
 
796
800
  ${colors.dim}Examples:${colors.reset}
797
- npx ebade scaffold examples/ecommerce.ebade.yaml ./output
798
- npx ebade scaffold my-project.ebade.yaml
801
+ npx ebade init
802
+ npx ebade scaffold examples/saas-dashboard.ebade.yaml ./output
803
+ npx ebade dev my-project.ebade.yaml ./my-app
799
804
 
800
805
  ${colors.dim}Learn more:${colors.reset}
801
806
  https://ebade.dev
802
807
  `);
803
808
  }
804
809
 
810
+ // ============================================
811
+ // Init Command (Interactive Setup)
812
+ // ============================================
813
+ async function init() {
814
+ console.log(`
815
+ ${LOGO}
816
+ `);
817
+
818
+ const response = await prompts([
819
+ {
820
+ type: "text",
821
+ name: "projectName",
822
+ message: "Project name:",
823
+ initial: "my-ebade-app",
824
+ },
825
+ {
826
+ type: "select",
827
+ name: "template",
828
+ message: "Choose a template:",
829
+ choices: [
830
+ { title: "SaaS Dashboard", value: "saas-dashboard" },
831
+ { title: "E-commerce", value: "ecommerce" },
832
+ { title: "Landing Page", value: "landing" },
833
+ { title: "Empty Project", value: "empty" },
834
+ ],
835
+ },
836
+ {
837
+ type: "text",
838
+ name: "primaryColor",
839
+ message: "Primary color (hex):",
840
+ initial: "#6366f1",
841
+ },
842
+ {
843
+ type: "confirm",
844
+ name: "autoScaffold",
845
+ message: "Scaffold project now?",
846
+ initial: true,
847
+ },
848
+ ]);
849
+
850
+ if (!response.projectName) {
851
+ console.log(`${colors.yellow}Cancelled.${colors.reset}`);
852
+ process.exit(0);
853
+ }
854
+
855
+ const outputDir = `./${response.projectName}`;
856
+ ensureDir(outputDir);
857
+
858
+ let yamlContent;
859
+ if (response.template === "empty") {
860
+ yamlContent = `# ebade Project Configuration
861
+ # Generated by ebade init
862
+
863
+ project:
864
+ name: ${response.projectName}
865
+ type: custom
866
+ version: "1.0.0"
867
+
868
+ design:
869
+ style: minimal-modern
870
+ colors:
871
+ primary: "${response.primaryColor}"
872
+ secondary: "#f59e0b"
873
+ font: Inter
874
+ borderRadius: md
875
+
876
+ pages:
877
+ - path: /
878
+ intent: landing-page
879
+ components:
880
+ - hero-section
881
+
882
+ api: []
883
+ data: []
884
+ `;
885
+ } else {
886
+ // Get the directory of the current script (cli/scaffold.js)
887
+ const scriptDir = path.dirname(new URL(import.meta.url).pathname);
888
+ const templatePath = path.join(
889
+ scriptDir,
890
+ "..",
891
+ "examples",
892
+ response.template === "saas-dashboard"
893
+ ? "saas-dashboard.ebade.yaml"
894
+ : "ecommerce.ebade.yaml"
895
+ );
896
+ if (fs.existsSync(templatePath)) {
897
+ yamlContent = fs.readFileSync(templatePath, "utf-8");
898
+ yamlContent = yamlContent.replace(
899
+ /name: .*/,
900
+ `name: ${response.projectName}`
901
+ );
902
+ } else {
903
+ console.error(
904
+ `${colors.red}Error:${colors.reset} Template not found. Using empty template.`
905
+ );
906
+ yamlContent = `project:\n name: ${response.projectName}\n type: custom\n`;
907
+ }
908
+ }
909
+
910
+ const ebadeFilePath = path.join(outputDir, "project.ebade.yaml");
911
+ fs.writeFileSync(ebadeFilePath, yamlContent);
912
+
913
+ console.log(`
914
+ ${colors.green}✓${colors.reset} Created ${colors.cyan}${ebadeFilePath}${colors.reset}
915
+ `);
916
+
917
+ if (response.autoScaffold) {
918
+ scaffold(ebadeFilePath, outputDir);
919
+ } else {
920
+ console.log(`
921
+ ${colors.dim}Next steps:${colors.reset}
922
+ ${colors.gray}1.${colors.reset} Edit ${colors.cyan}${ebadeFilePath}${colors.reset}
923
+ ${colors.gray}2.${colors.reset} Run ${colors.cyan}npx ebade scaffold ${ebadeFilePath} ${outputDir}${colors.reset}
924
+ `);
925
+ }
926
+ }
927
+
928
+ // ============================================
929
+ // Dev Command (Watch Mode)
930
+ // ============================================
931
+ function dev(ebadeFile, outputDir) {
932
+ console.log(`
933
+ ${LOGO}
934
+ `);
935
+
936
+ console.log(
937
+ `${colors.cyan}👀 Watching${colors.reset} ${colors.bright}${ebadeFile}${colors.reset} for changes...\n`
938
+ );
939
+ console.log(`${colors.dim}Press Ctrl+C to stop.${colors.reset}\n`);
940
+
941
+ // Initial scaffold
942
+ scaffold(ebadeFile, outputDir);
943
+
944
+ // Watch for changes
945
+ const watcher = chokidar.watch(ebadeFile, {
946
+ persistent: true,
947
+ ignoreInitial: true,
948
+ });
949
+
950
+ watcher.on("change", () => {
951
+ console.log(
952
+ `\n${colors.yellow}⚡ Change detected!${colors.reset} Re-scaffolding...\n`
953
+ );
954
+ scaffold(ebadeFile, outputDir);
955
+ });
956
+
957
+ watcher.on("error", (error) => {
958
+ console.error(`${colors.red}Watcher error:${colors.reset}`, error);
959
+ });
960
+ }
961
+
962
+ // ============================================
963
+ // Command Router
964
+ // ============================================
805
965
  if (
806
966
  args.length === 0 ||
807
967
  command === "help" ||
@@ -812,7 +972,9 @@ if (
812
972
  process.exit(0);
813
973
  }
814
974
 
815
- if (command === "scaffold") {
975
+ if (command === "init") {
976
+ await init();
977
+ } else if (command === "scaffold") {
816
978
  const ebadeFile = args[1];
817
979
  const outputDir = args[2] || "./output";
818
980
 
@@ -834,6 +996,28 @@ if (command === "scaffold") {
834
996
  }
835
997
 
836
998
  scaffold(ebadeFile, outputDir);
999
+ } else if (command === "dev") {
1000
+ const ebadeFile = args[1];
1001
+ const outputDir = args[2] || "./output";
1002
+
1003
+ if (!ebadeFile) {
1004
+ console.error(
1005
+ `${colors.red}Error:${colors.reset} Please provide an ebade file path.`
1006
+ );
1007
+ console.log(
1008
+ `\n${colors.dim}Usage:${colors.reset} npx ebade dev <file.ebade.yaml> [output-dir]\n`
1009
+ );
1010
+ process.exit(1);
1011
+ }
1012
+
1013
+ if (!fs.existsSync(ebadeFile)) {
1014
+ console.error(
1015
+ `${colors.red}Error:${colors.reset} ebade file not found: ${ebadeFile}`
1016
+ );
1017
+ process.exit(1);
1018
+ }
1019
+
1020
+ dev(ebadeFile, outputDir);
837
1021
  } else {
838
1022
  console.error(
839
1023
  `${colors.red}Error:${colors.reset} Unknown command: ${command}`
@@ -226,6 +226,37 @@
226
226
  </section>
227
227
  </main>
228
228
 
229
+ <footer class="site-footer">
230
+ <div class="footer-container">
231
+ <div class="footer-brand">
232
+ <div class="footer-logo">🧠 ebade</div>
233
+ <p class="footer-slogan">Capture the essence of code.<br>Less tokens. Less carbon. Same result. 🌱</p>
234
+ </div>
235
+ <div class="footer-links">
236
+ <div class="footer-column">
237
+ <h4>Product</h4>
238
+ <a href="#technology">Technology</a>
239
+ <a href="#benchmarks">Benchmarks</a>
240
+ <a href="https://github.com/hasankemaldemirci/ebade/tree/main/examples" target="_blank">Examples</a>
241
+ </div>
242
+ <div class="footer-column">
243
+ <h4>Resources</h4>
244
+ <a href="https://github.com/hasankemaldemirci/ebade" target="_blank">GitHub</a>
245
+ <a href="https://www.npmjs.com/package/ebade" target="_blank">npm</a>
246
+ <a href="https://github.com/hasankemaldemirci/ebade/blob/main/ROADMAP.md" target="_blank">Roadmap</a>
247
+ </div>
248
+ <div class="footer-column">
249
+ <h4>Contact</h4>
250
+ <a href="mailto:hello@ebade.dev">hello@ebade.dev</a>
251
+ <a href="https://github.com/sponsors/hasankemaldemirci" target="_blank">Sponsor 💜</a>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ <div class="footer-bottom">
256
+ <p>© 2026 ebade. The Agent-First Framework.</p>
257
+ <p class="footer-tagline">Code = f(Intent) // Kind to Earth 🌍</p>
258
+ </div>
259
+ </footer>
229
260
 
230
261
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
231
262
  <script src="main.js"></script>
package/landing/style.css CHANGED
@@ -111,22 +111,13 @@ body {
111
111
  .nav-github {
112
112
  display: flex;
113
113
  align-items: center;
114
- gap: 0.5rem;
115
- padding: 0.3rem 0.6rem;
116
- border-radius: 6px;
117
- transition: all 0.2s ease;
118
- border: 1px solid transparent;
119
- }
120
-
121
- .nav-github:hover {
122
- background: rgba(0, 0, 0, 0.03);
123
- border-color: rgba(0, 0, 0, 0.05);
114
+ gap: 0.4rem;
124
115
  }
125
116
 
126
117
  .nav-github i,
127
118
  .nav-github svg {
128
- width: 14px;
129
- height: 14px;
119
+ width: 16px;
120
+ height: 16px;
130
121
  }
131
122
 
132
123
  .star-icon-nav {
@@ -577,40 +568,318 @@ h1 span {
577
568
  }
578
569
 
579
570
  /* Footer */
580
- .minimal-footer {
581
- padding: 4rem 3rem;
582
- border-top: 1px solid var(--border);
571
+ .site-footer {
572
+ background: #000;
573
+ color: #fff;
574
+ padding: 6rem 3rem 2rem;
575
+ position: relative;
576
+ z-index: 10;
583
577
  }
584
578
 
585
- .footer-content {
579
+ .footer-container {
580
+ max-width: 1400px;
581
+ margin: 0 auto;
586
582
  display: flex;
587
583
  justify-content: space-between;
588
- font-family: var(--font-mono);
589
- font-size: 0.75rem;
590
- color: var(--text-dim);
584
+ gap: 4rem;
585
+ flex-wrap: wrap;
586
+ }
587
+
588
+ .footer-brand {
589
+ max-width: 300px;
590
+ }
591
+
592
+ .footer-logo {
593
+ font-size: 1.5rem;
594
+ font-weight: 900;
595
+ margin-bottom: 1rem;
596
+ }
597
+
598
+ .footer-slogan {
599
+ color: rgba(255, 255, 255, 0.5);
600
+ font-size: 0.95rem;
601
+ line-height: 1.6;
602
+ }
603
+
604
+ .footer-links {
605
+ display: flex;
606
+ gap: 5rem;
607
+ }
608
+
609
+ .footer-column {
610
+ display: flex;
611
+ flex-direction: column;
612
+ gap: 0.75rem;
613
+ }
614
+
615
+ .footer-column h4 {
616
+ font-size: 0.8rem;
617
+ text-transform: uppercase;
618
+ letter-spacing: 1px;
619
+ color: rgba(255, 255, 255, 0.4);
620
+ margin-bottom: 0.5rem;
591
621
  }
592
622
 
593
- .socials a {
594
- margin-left: 2rem;
623
+ .footer-column a {
624
+ color: rgba(255, 255, 255, 0.7);
595
625
  text-decoration: none;
596
- color: var(--text);
626
+ font-size: 0.95rem;
627
+ transition: color 0.2s;
628
+ }
629
+
630
+ .footer-column a:hover {
631
+ color: var(--primary);
632
+ }
633
+
634
+ .footer-bottom {
635
+ max-width: 1400px;
636
+ margin: 4rem auto 0;
637
+ padding-top: 2rem;
638
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
639
+ display: flex;
640
+ justify-content: space-between;
641
+ font-size: 0.85rem;
642
+ color: rgba(255, 255, 255, 0.4);
643
+ }
644
+
645
+ .footer-tagline {
646
+ font-family: var(--font-mono);
647
+ color: var(--accent-emerald);
597
648
  }
598
649
 
599
650
  @media (max-width: 1024px) {
600
651
  h1 {
601
652
  font-size: 4rem;
602
653
  }
654
+
603
655
  .grid-3 {
604
656
  grid-template-columns: 1fr;
605
657
  }
658
+
606
659
  .comparison-modern {
607
- flex-direction: column;
660
+ grid-template-columns: 1fr;
661
+ gap: 1rem;
608
662
  }
663
+
664
+ .transform-arrow {
665
+ padding: 1rem 0;
666
+ }
667
+
609
668
  .stats-box {
610
669
  flex-direction: column;
611
- gap: 4rem;
670
+ gap: 3rem;
671
+ padding: 3rem 2rem;
612
672
  }
673
+
613
674
  .stat-divider {
614
675
  display: none;
615
676
  }
616
677
  }
678
+
679
+ @media (max-width: 768px) {
680
+ /* Nav - Simplified for mobile */
681
+ .full-nav {
682
+ padding: 1rem 1.5rem;
683
+ flex-direction: column;
684
+ gap: 0.75rem;
685
+ }
686
+
687
+ .logo {
688
+ font-size: 1.3rem;
689
+ }
690
+
691
+ .nav-links {
692
+ width: 100%;
693
+ justify-content: center;
694
+ gap: 0.75rem;
695
+ flex-wrap: wrap;
696
+ }
697
+
698
+ .nav-links a {
699
+ font-size: 0.8rem;
700
+ padding: 0.4rem 0.6rem;
701
+ }
702
+
703
+ .nav-github span {
704
+ display: none; /* Hide "GitHub" text, show only icon */
705
+ }
706
+
707
+ .nav-cta {
708
+ padding: 0.5rem 1rem;
709
+ font-size: 0.8rem;
710
+ }
711
+
712
+ /* Hero */
713
+ .hero-full {
714
+ padding: 0 1.5rem;
715
+ padding-top: 120px; /* Account for stacked nav */
716
+ }
717
+
718
+ h1 {
719
+ font-size: 2.5rem;
720
+ margin-bottom: 1.5rem;
721
+ }
722
+
723
+ .hero-description {
724
+ font-size: 1rem;
725
+ margin-bottom: 2.5rem;
726
+ }
727
+
728
+ .hero-actions {
729
+ flex-direction: column;
730
+ gap: 1rem;
731
+ }
732
+
733
+ .btn-glow,
734
+ .btn-minimal {
735
+ width: 100%;
736
+ justify-content: center;
737
+ padding: 1rem 2rem;
738
+ }
739
+
740
+ .scroll-indicator {
741
+ display: none;
742
+ }
743
+
744
+ /* Sections */
745
+ .section-dark {
746
+ border-radius: 30px 30px 0 0;
747
+ }
748
+
749
+ .section-container {
750
+ padding: 4rem 1.5rem;
751
+ }
752
+
753
+ .section-header h2 {
754
+ font-size: 2.5rem;
755
+ }
756
+
757
+ .section-header p {
758
+ font-size: 1rem;
759
+ }
760
+
761
+ /* Transform Arrow - Vertical connecting both cards */
762
+ .transform-arrow {
763
+ padding: 1.5rem 0;
764
+ height: auto;
765
+ margin: 0;
766
+ z-index: 0;
767
+ }
768
+
769
+ .transform-arrow::after {
770
+ /* Reset horizontal positioning */
771
+ top: -100px;
772
+ bottom: -100px;
773
+ left: 50%;
774
+ right: auto;
775
+ /* Make it vertical */
776
+ width: 2px;
777
+ height: 300px;
778
+ /* Center and position behind cards */
779
+ transform: translateX(-50%);
780
+ z-index: -1;
781
+ /* Vertical gradient */
782
+ background: linear-gradient(
783
+ to bottom,
784
+ transparent,
785
+ rgba(79, 70, 229, 0.5),
786
+ transparent
787
+ );
788
+ background-size: 100% 100%;
789
+ animation: none;
790
+ }
791
+
792
+ .transform-arrow i,
793
+ .transform-arrow svg {
794
+ width: 32px;
795
+ height: 32px;
796
+ transform: rotate(90deg);
797
+ animation: none;
798
+ z-index: 5;
799
+ position: relative;
800
+ background: #0d1117;
801
+ border-radius: 50%;
802
+ padding: 6px;
803
+ }
804
+
805
+ /* Code Cards - ensure they're above the line */
806
+ .code-card {
807
+ position: relative;
808
+ z-index: 2;
809
+ }
810
+
811
+ /* Code Cards */
812
+ .code-card pre {
813
+ padding: 1rem;
814
+ font-size: 0.75rem;
815
+ overflow-x: auto;
816
+ }
817
+
818
+ /* Stats */
819
+ .stat .val {
820
+ font-size: 3rem;
821
+ }
822
+
823
+ /* Features */
824
+ .feature-item {
825
+ padding: 2rem;
826
+ }
827
+
828
+ .feature-item h3 {
829
+ font-size: 1.4rem;
830
+ }
831
+
832
+ /* Footer */
833
+ .site-footer {
834
+ padding: 4rem 1.5rem 2rem;
835
+ }
836
+
837
+ .footer-container {
838
+ flex-direction: column;
839
+ }
840
+
841
+ .footer-brand {
842
+ max-width: 100%;
843
+ text-align: center;
844
+ }
845
+
846
+ .footer-links {
847
+ flex-wrap: wrap;
848
+ gap: 2rem;
849
+ justify-content: center;
850
+ }
851
+
852
+ .footer-column {
853
+ text-align: center;
854
+ min-width: 120px;
855
+ }
856
+
857
+ .footer-bottom {
858
+ flex-direction: column;
859
+ gap: 0.5rem;
860
+ text-align: center;
861
+ }
862
+ }
863
+
864
+ @media (max-width: 480px) {
865
+ .logo {
866
+ font-size: 1.25rem;
867
+ }
868
+
869
+ h1 {
870
+ font-size: 2rem;
871
+ }
872
+
873
+ .badge-modern {
874
+ font-size: 0.65rem;
875
+ padding: 0.4rem 0.75rem;
876
+ }
877
+
878
+ .section-header h2 {
879
+ font-size: 2rem;
880
+ }
881
+
882
+ .stat .val {
883
+ font-size: 2.5rem;
884
+ }
885
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ebade",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
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",
@@ -35,7 +35,9 @@
35
35
  "url": "https://github.com/hasankemaldemirci/ebade/issues"
36
36
  },
37
37
  "dependencies": {
38
+ "chokidar": "^5.0.0",
38
39
  "ora": "^9.0.0",
40
+ "prompts": "^2.4.2",
39
41
  "yaml": "^2.3.4"
40
42
  },
41
43
  "engines": {
@@ -0,0 +1,42 @@
1
+ # ebade VS Code Extension
2
+
3
+ Syntax highlighting, snippets, and language support for `.ebade.yaml` files.
4
+
5
+ ## Features
6
+
7
+ ### 🎨 Syntax Highlighting
8
+ - Keywords: `project`, `pages`, `api`, `data`, `design`
9
+ - Decorators: `@page`, `@intent`, `@requires`
10
+ - Strings, numbers, booleans
11
+ - Comments
12
+
13
+ ### ✨ Snippets
14
+ | Prefix | Description |
15
+ |--------|-------------|
16
+ | `ebade-project` | Full project template |
17
+ | `ebade-page` | New page definition |
18
+ | `ebade-api` | New API endpoint |
19
+ | `ebade-data` | New data model |
20
+ | `ebade-component` | Component reference |
21
+
22
+ ## Installation
23
+
24
+ ### From VSIX (Local)
25
+ ```bash
26
+ cd packages/vscode-extension
27
+ npx vsce package
28
+ code --install-extension ebade-*.vsix
29
+ ```
30
+
31
+ ### From Marketplace (Coming Soon)
32
+ Search for "ebade" in VS Code Extensions.
33
+
34
+ ## Usage
35
+
36
+ 1. Create a file with `.ebade.yaml` extension
37
+ 2. Start typing `ebade-` to see available snippets
38
+ 3. Enjoy syntax highlighting! 🎉
39
+
40
+ ---
41
+
42
+ Built with 💜 by the ebade team.
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <rect width="32" height="32" rx="6" fill="#4F46E5"/>
3
+ <text x="50%" y="52%" dominant-baseline="middle" text-anchor="middle"
4
+ font-family="system-ui, -apple-system, sans-serif"
5
+ font-size="22" font-weight="900" fill="white">e</text>
6
+ </svg>
@@ -0,0 +1,24 @@
1
+ {
2
+ "comments": {
3
+ "lineComment": "#"
4
+ },
5
+ "brackets": [
6
+ ["{", "}"],
7
+ ["[", "]"]
8
+ ],
9
+ "autoClosingPairs": [
10
+ { "open": "{", "close": "}" },
11
+ { "open": "[", "close": "]" },
12
+ { "open": "\"", "close": "\"" },
13
+ { "open": "'", "close": "'" }
14
+ ],
15
+ "surroundingPairs": [
16
+ ["{", "}"],
17
+ ["[", "]"],
18
+ ["\"", "\""],
19
+ ["'", "'"]
20
+ ],
21
+ "folding": {
22
+ "offSide": true
23
+ }
24
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "ebade",
3
+ "displayName": "ebade - Agent-First Framework",
4
+ "description": "Syntax highlighting and snippets for ebade (.ebade.yaml) files",
5
+ "version": "0.1.0",
6
+ "publisher": "hasankemaldemirci",
7
+ "engines": {
8
+ "vscode": "^1.85.0"
9
+ },
10
+ "categories": [
11
+ "Programming Languages",
12
+ "Snippets"
13
+ ],
14
+ "keywords": [
15
+ "ebade",
16
+ "agent-first",
17
+ "ai",
18
+ "yaml",
19
+ "framework"
20
+ ],
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/hasankemaldemirci/ebade"
24
+ },
25
+ "contributes": {
26
+ "languages": [
27
+ {
28
+ "id": "ebade",
29
+ "aliases": [
30
+ "ebade",
31
+ "ebade-yaml"
32
+ ],
33
+ "extensions": [
34
+ ".ebade.yaml"
35
+ ],
36
+ "configuration": "./language-configuration.json"
37
+ }
38
+ ],
39
+ "grammars": [
40
+ {
41
+ "language": "ebade",
42
+ "scopeName": "source.ebade",
43
+ "path": "./syntaxes/ebade.tmLanguage.json"
44
+ }
45
+ ],
46
+ "snippets": [
47
+ {
48
+ "language": "ebade",
49
+ "path": "./snippets/ebade.json"
50
+ }
51
+ ]
52
+ }
53
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "ebade",
3
+ "scopeName": "source.ebade",
4
+ "fileTypes": ["ebade.yaml"],
5
+ "patterns": [
6
+ { "include": "#comments" },
7
+ { "include": "#keywords" },
8
+ { "include": "#decorators" },
9
+ { "include": "#strings" },
10
+ { "include": "#numbers" },
11
+ { "include": "#booleans" },
12
+ { "include": "#keys" }
13
+ ],
14
+ "repository": {
15
+ "comments": {
16
+ "match": "#.*$",
17
+ "name": "comment.line.number-sign.ebade"
18
+ },
19
+ "keywords": {
20
+ "match": "\\b(project|pages|api|data|design|auth|components|intent|path|methods|outcomes|requires|style|colors|font|borderRadius|type|version|name)\\b",
21
+ "name": "keyword.control.ebade"
22
+ },
23
+ "decorators": {
24
+ "match": "@(page|intent|requires|outcomes|data|validate|style|compose|on|expects)\\b",
25
+ "name": "entity.name.function.decorator.ebade"
26
+ },
27
+ "strings": {
28
+ "patterns": [
29
+ {
30
+ "match": "'[^']*'",
31
+ "name": "string.quoted.single.ebade"
32
+ },
33
+ {
34
+ "match": "\"[^\"]*\"",
35
+ "name": "string.quoted.double.ebade"
36
+ }
37
+ ]
38
+ },
39
+ "numbers": {
40
+ "match": "\\b[0-9]+\\.?[0-9]*\\b",
41
+ "name": "constant.numeric.ebade"
42
+ },
43
+ "booleans": {
44
+ "match": "\\b(true|false|required|optional|public|private)\\b",
45
+ "name": "constant.language.ebade"
46
+ },
47
+ "keys": {
48
+ "match": "^\\s*-?\\s*([a-zA-Z_][a-zA-Z0-9_-]*)\\s*:",
49
+ "captures": {
50
+ "1": { "name": "variable.other.key.ebade" }
51
+ }
52
+ }
53
+ }
54
+ }