@matteoaliano/forest-ui 0.2.6 → 0.2.8

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/bin/sync.mjs CHANGED
@@ -10,6 +10,8 @@
10
10
  * Supported targets:
11
11
  * .claude/<name>.md — Claude Code
12
12
  * .cursor/rules/<name>.mdc — Cursor
13
+ * .gemini/<name>.md — Gemini CLI
14
+ * .antigravity/rules.md — Antigravity
13
15
  *
14
16
  * Guideline categories:
15
17
  * - FOREST_AI_GUIDELINES.md — Design system components, tokens, patterns
@@ -32,12 +34,14 @@ const staticEntries = [
32
34
  {
33
35
  source: resolve(guidelinesDir, "FOREST_AI_GUIDELINES.md"),
34
36
  claudeName: "forest-ui.md",
37
+ geminiName: "forest-ui.md",
35
38
  cursorName: "forest-ui.mdc",
36
39
  cursorDescription: "Forest UI Design System guidelines — components, tokens, and patterns",
37
40
  },
38
41
  {
39
42
  source: resolve(guidelinesDir, "FOREST_DEV_GUIDELINES.md"),
40
43
  claudeName: "forest-dev.md",
44
+ geminiName: "forest-dev.md",
41
45
  cursorName: "forest-dev.mdc",
42
46
  cursorDescription: "Forest UI development best practices",
43
47
  },
@@ -58,6 +62,7 @@ function discoverThemeEntries() {
58
62
  return {
59
63
  source: resolve(themesDir, f),
60
64
  claudeName: `forest-theme-${themeName}.md`,
65
+ geminiName: `forest-theme-${themeName}.md`,
61
66
  cursorName: `forest-theme-${themeName}.mdc`,
62
67
  cursorDescription: `Forest UI theme guidelines — ${themeName}`,
63
68
  };
@@ -112,6 +117,45 @@ for (const entry of entries) {
112
117
  console.log(` ⚠️ Claude Code — .claude/${entry.claudeName} skipped (${err.message})`);
113
118
  }
114
119
 
120
+ // Gemini target
121
+ const geminiDir = resolve(projectRoot, ".gemini");
122
+ const geminiPath = resolve(geminiDir, entry.geminiName);
123
+ total++;
124
+ try {
125
+ mkdirSync(geminiDir, { recursive: true });
126
+ writeFileSync(geminiPath, content, "utf-8");
127
+ console.log(` ✅ Gemini → .gemini/${entry.geminiName}`);
128
+
129
+ // Update .gemini/GEMINI.md to import all synced files
130
+ const geminiMainPath = resolve(geminiDir, "GEMINI.md");
131
+ const geminiMainContent = entries
132
+ .map(e => `@${e.geminiName}`)
133
+ .join("\n");
134
+ writeFileSync(geminiMainPath, `# Forest UI Guidelines\n\n${geminiMainContent}\n`, "utf-8");
135
+
136
+ synced++;
137
+ } catch (err) {
138
+ console.log(` ⚠️ Gemini — .gemini/${entry.geminiName} skipped (${err.message})`);
139
+ }
140
+
141
+ // Antigravity target
142
+ const antiDir = resolve(projectRoot, ".antigravity");
143
+ const antiPath = resolve(antiDir, "rules.md");
144
+ total++;
145
+ try {
146
+ mkdirSync(antiDir, { recursive: true });
147
+ // Concatenate all content into rules.md or use imports if supported.
148
+ // Using imports to keep it clean, pointing to the .gemini folder.
149
+ const antiContent = entries
150
+ .map(e => `@../.gemini/${e.geminiName}`)
151
+ .join("\n");
152
+ writeFileSync(antiPath, `# Forest UI — Antigravity Rules\n\n${antiContent}\n`, "utf-8");
153
+ console.log(` ✅ Antigravity → .antigravity/rules.md`);
154
+ synced++;
155
+ } catch (err) {
156
+ console.log(` ⚠️ Antigravity — .antigravity/rules.md skipped (${err.message})`);
157
+ }
158
+
115
159
  // Cursor target
116
160
  const cursorDir = resolve(projectRoot, ".cursor", "rules");
117
161
  const cursorPath = resolve(cursorDir, entry.cursorName);