antigravity-ide 4.0.5 → 4.0.6

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
@@ -2,6 +2,8 @@
2
2
 
3
3
  The First AI-Native IDE designed for Vibe Coding & Agentic Workflow. 🛰️🚀
4
4
 
5
+ **Official Website**: [antigravity-ide-cli.vercel.app](https://antigravity-ide-cli.vercel.app/)
6
+
5
7
  > [!IMPORTANT]
6
8
  > **AntiGravity IDE** is a conceptual expansion of the original Antigravity framework, optimized for senior-level engineering, security, and high-performance web development.
7
9
 
@@ -22,7 +24,7 @@ npx antigravity-ide@latest my-project --skip-prompts
22
24
  > [!TIP]
23
25
  > **New to npx?** Check our [NPX Installation Guide](file:///docs/INSTALL_NPX_GUIDE.vi.md) for a step-by-step setup.
24
26
 
25
- ### ✨ Setup Wizard Features (v4.0.5 - Modular Architecture)
27
+ ### ✨ Setup Wizard Features (v4.0.6 - Docs & CLI Upgrade)
26
28
  The new interactive CLI features a **Modular Installation Engine** that adapts to your exact needs:
27
29
 
28
30
  1. **Scale-Adaptive Architecture**:
@@ -57,9 +59,14 @@ Meet your new virtual team:
57
59
 
58
60
  ## 📈 Release History
59
61
 
62
+ #### v4.0.6 (Full Docs & Workflow Sync)
63
+ - Synchronized all 30 Workflows and 22 Specialist Agents.
64
+ - Added comprehensive FAQ, Update, and Uninstall guides.
65
+ - Improved CLI conflict resolution with `--force` flag.
66
+
60
67
  #### v4.0.5 (Final Sync)
61
68
  - Rebranded to AntiGravity IDE.
62
- - Standardized all 72 Master Skills to v4.0.5 metadata.
69
+ - Standardized all 72 Master Skills to v4.0.6 metadata.
63
70
  - Integrated Python environment awareness.
64
71
  - Unified License & Credits.
65
72
 
package/README.vi.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  IDE đầu tiên được thiết kế dành riêng cho "Vibe Coding" và Quy trình Tác chiến AI (Agentic Workflow). 🛰️🚀
4
4
 
5
+ **Trang chủ chính thức**: [antigravity-ide-cli.vercel.app](https://antigravity-ide-cli.vercel.app/)
6
+
5
7
  > [!IMPORTANT]
6
8
  > **AntiGravity IDE** là một bản mở rộng đột phá của framework Antigravity gốc, được tối ưu hóa cho kỹ thuật phần mềm cấp cao, bảo mật và phát triển web hiệu năng cao.
7
9
 
@@ -20,12 +22,13 @@ npx antigravity-ide@latest my-project --skip-prompts
20
22
  ```
21
23
 
22
24
  > [!TIP]
23
- > **Mới làm quen với npx?** Xem [Hướng dẫn Cài đặt NPX](file:///docs/INSTALL_NPX_GUIDE.vi.md) để bắt đầu từng bước.
25
+ > **Mới làm quen với npx?** Xem [Hướng dẫn Cài đặt NPX](file:///docs/INSTALL_NPX_GUIDE.vi.md) để bắt đầu.
26
+ > **Cần hỗ trợ?** Xem [FAQ](file:///docs/FAQ.vi.md) hoặc [Hướng dẫn Cập nhật](file:///docs/UPDATE_GUIDE.vi.md).
24
27
 
25
28
  > [!WARNING]
26
- > **Lưu ý quan trọng:** Không nên cài đặt Global (`npm install -g antigravity-ide`) vì sẽ gây xung đột phiên bản cũ/mới. Luôn dùng `npx ...@latest` để đảm bảo project được khởi tạo với Engine mới nhất.
29
+ > **Lưu ý quan trọng:** Không nên cài đặt Global (`npm install -g antigravity-ide`) vì sẽ gây xung đột. Xem [Hướng dẫn Gỡ cài đặt](file:///docs/UNINSTALL_GUIDE.vi.md) nếu đã lỡ cài.
27
30
 
28
- ### ✨ Tính năng Setup Wizard (v4.0.5 - Big Update)
31
+ ### ✨ Tính năng Setup Wizard (v4.0.6 - Build Update)
29
32
  Trải nghiệm dòng lệnh (CLI) đẳng cấp Premium với **Cơ chế Thích ứng theo Quy mô**:
30
33
 
31
34
  1. **Kiến trúc Thích ứng theo Quy mô (Scale-Adaptive)**:
@@ -58,11 +61,14 @@ Chúng tôi cung cấp thư viện 72 kỹ năng "Senior-Grade" được phân l
58
61
 
59
62
  ---
60
63
 
61
- ## 📈 Lịch sử Phiên bản
64
+ #### v4.0.6 (Nâng cấp tài liệu & CLI)
65
+ - Đồng bộ hóa toàn bộ 30 Workflows và 22 Agents.
66
+ - Bổ sung tài liệu FAQ, Update và Uninstall.
67
+ - Tối ưu hóa cơ chế xử lý xung đột file (--force).
62
68
 
63
69
  #### v4.0.5 (Đồng bộ cuối)
64
70
  - Đổi tên thương hiệu thành AntiGravity IDE.
65
- - Chuẩn hóa toàn bộ 72 Master Skills sang metadata v4.0.5.
71
+ - Chuẩn hóa toàn bộ 72 Master Skills sang metadata v4.0.6.
66
72
  - Tích hợp nhận diện môi trường Python.
67
73
  - Nhất quán License & Credits.
68
74
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 4.0.5
1
+ 4.0.6
Binary file
package/cli/create.js CHANGED
@@ -7,7 +7,7 @@ const path = require('path');
7
7
  const chalk = require('chalk');
8
8
  const ora = require('ora');
9
9
  const { execSync } = require('child_process');
10
- const { getProjectConfig, getSkillsForCategories } = require('./prompts');
10
+ const { getProjectConfig, getSkillsForCategories, confirmOverwrite } = require('./prompts');
11
11
  const gradient = require('gradient-string');
12
12
  const { getRulesList, getAgentsList } = require('./logic/manifest-manager');
13
13
 
@@ -19,6 +19,9 @@ async function createProject(projectName, options, predefinedConfig = null) {
19
19
 
20
20
  // Get configuration
21
21
  const config = predefinedConfig || await getProjectConfig(options.skipPrompts, isCurrentDir ? targetName : projectName);
22
+ // Merge CLI options
23
+ config.force = options.force;
24
+ config.skipPrompts = options.skipPrompts;
22
25
 
23
26
  // Resolve final project path
24
27
  const projectPath = isCurrentDir ? process.cwd() : path.resolve(process.cwd(), config.projectName);
@@ -118,7 +121,17 @@ async function createProject(projectName, options, predefinedConfig = null) {
118
121
  config.productType,
119
122
  finalProjectName
120
123
  );
121
- fs.writeFileSync(path.join(projectPath, 'GEMINI.md'), geminiContent);
124
+ const rootGeminiPath = path.join(projectPath, 'GEMINI.md');
125
+ const rootGeminiDecision = await handleCoreFileConflict(rootGeminiPath, 'GEMINI.md', config.force, config.skipPrompts);
126
+
127
+ if (rootGeminiDecision.shouldWrite) {
128
+ fs.writeFileSync(rootGeminiDecision.targetPath, geminiContent);
129
+ if (rootGeminiDecision.isBackup) {
130
+ console.log(chalk.yellow(` ℹ️ Root GEMINI.md exists, created ${path.basename(rootGeminiDecision.targetPath)}`));
131
+ } else if (rootGeminiDecision.isOverwrite) {
132
+ console.log(chalk.green(` ✓ Overwrote existing Root GEMINI.md`));
133
+ }
134
+ }
122
135
 
123
136
  const stats = {
124
137
  rules: rulesToInstall.length,
@@ -136,11 +149,23 @@ async function createProject(projectName, options, predefinedConfig = null) {
136
149
  }
137
150
 
138
151
  // Helper to handle core file conflicts (auto-create backup if exists)
139
- function handleCoreFileConflict(filePath, fileName) {
152
+ async function handleCoreFileConflict(filePath, fileName, force = false, skipPrompts = false) {
140
153
  if (!fs.existsSync(filePath)) {
141
154
  return { shouldWrite: true, targetPath: filePath };
142
155
  }
143
156
 
157
+ if (force) {
158
+ return { shouldWrite: true, targetPath: filePath, isOverwrite: true };
159
+ }
160
+
161
+ // Interactive Prompt (Only if prompts are allowed)
162
+ if (!skipPrompts) {
163
+ const shouldOverwrite = await confirmOverwrite(fileName);
164
+ if (shouldOverwrite) {
165
+ return { shouldWrite: true, targetPath: filePath, isOverwrite: true };
166
+ }
167
+ }
168
+
144
169
  // File exists - create backup with .new extension
145
170
  const dir = path.dirname(filePath);
146
171
  const ext = path.extname(fileName);
@@ -211,13 +236,15 @@ async function copyModularStructure(projectPath, config, rulesList, agentsList)
211
236
 
212
237
  // 5. Copy GEMINI.md (Core file)
213
238
  const geminiPath = path.join(destAgentDir, 'GEMINI.md');
214
- const geminiDecision = handleCoreFileConflict(geminiPath, 'GEMINI.md');
239
+ const geminiDecision = await handleCoreFileConflict(geminiPath, 'GEMINI.md', config.force, config.skipPrompts);
215
240
 
216
241
  if (geminiDecision.shouldWrite) {
217
242
  const geminiContent = generateGeminiMd(config.rules, config.language, config.industryDomain, config.agentName);
218
243
  fs.writeFileSync(geminiDecision.targetPath, geminiContent);
219
244
  if (geminiDecision.isBackup) {
220
245
  console.log(chalk.yellow(` ℹ️ GEMINI.md exists, created ${path.basename(geminiDecision.targetPath)}`));
246
+ } else if (geminiDecision.isOverwrite) {
247
+ console.log(chalk.green(` ✓ Overwrote existing GEMINI.md`));
221
248
  }
222
249
  }
223
250
 
@@ -225,27 +252,49 @@ async function copyModularStructure(projectPath, config, rulesList, agentsList)
225
252
  const startHereSource = path.join(sourceAgentDir, 'START_HERE.md');
226
253
  if (fs.existsSync(startHereSource)) {
227
254
  const startHereDest = path.join(destAgentDir, 'START_HERE.md');
228
- const decision = handleCoreFileConflict(startHereDest, 'START_HERE.md');
255
+ const decision = await handleCoreFileConflict(startHereDest, 'START_HERE.md', config.force, config.skipPrompts);
229
256
  if (decision.shouldWrite) {
230
257
  fs.copyFileSync(startHereSource, decision.targetPath);
258
+ if (decision.isOverwrite) {
259
+ console.log(chalk.green(` ✓ Overwrote existing START_HERE.md`));
260
+ }
231
261
  }
232
262
  }
233
263
 
234
264
  // 7. Copy README, .gitignore
235
265
  const files = ['README.md', '.gitignore'];
236
266
  const rootDir = path.join(__dirname, '..');
237
- files.forEach(file => {
267
+
268
+ for (const file of files) {
238
269
  const source = path.join(rootDir, file);
239
270
  const dest = path.join(projectPath, file);
240
- if (fs.existsSync(source) && !fs.existsSync(dest)) {
241
- fs.copyFileSync(source, dest);
271
+
272
+ if (fs.existsSync(source)) {
273
+ const decision = await handleCoreFileConflict(dest, file, config.force, config.skipPrompts);
274
+ if (decision.shouldWrite) {
275
+ fs.copyFileSync(source, decision.targetPath);
276
+ if (decision.isBackup) {
277
+ console.log(chalk.yellow(` ℹ️ ${file} exists, created ${path.basename(decision.targetPath)}`));
278
+ } else if (decision.isOverwrite) {
279
+ console.log(chalk.green(` ✓ Overwrote existing ${file}`));
280
+ }
281
+ }
242
282
  }
243
- });
283
+ }
244
284
 
245
285
  // 8. Copy RESOURCES.md to .agent/
246
286
  const resourcesSource = path.join(sourceAgentDir, 'RESOURCES.md');
247
287
  if (fs.existsSync(resourcesSource)) {
248
- fs.copyFileSync(resourcesSource, path.join(destAgentDir, 'RESOURCES.md'));
288
+ const resourcesDest = path.join(destAgentDir, 'RESOURCES.md');
289
+ const decision = await handleCoreFileConflict(resourcesDest, 'RESOURCES.md', config.force, config.skipPrompts);
290
+ if (decision.shouldWrite) {
291
+ fs.copyFileSync(resourcesSource, decision.targetPath);
292
+ if (decision.isBackup) {
293
+ console.log(chalk.yellow(` ℹ️ RESOURCES.md exists, created ${path.basename(decision.targetPath)}`));
294
+ } else if (decision.isOverwrite) {
295
+ console.log(chalk.green(` ✓ Overwrote existing RESOURCES.md`));
296
+ }
297
+ }
249
298
  }
250
299
  }
251
300
 
@@ -288,10 +337,11 @@ async function copyWorkflows(projectPath, workflows) {
288
337
  }
289
338
 
290
339
  async function generateConfigs(projectPath, config) {
291
- // Generate package.json only if it doesn't exist
340
+ // Generate package.json
292
341
  const packageJsonPath = path.join(projectPath, 'package.json');
342
+ const pkgDecision = await handleCoreFileConflict(packageJsonPath, 'package.json', config.force, config.skipPrompts);
293
343
 
294
- if (!fs.existsSync(packageJsonPath)) {
344
+ if (pkgDecision.shouldWrite) {
295
345
  const packageJson = {
296
346
  name: config.projectName,
297
347
  version: '1.0.0',
@@ -307,26 +357,42 @@ async function generateConfigs(projectPath, config) {
307
357
  };
308
358
 
309
359
  fs.writeFileSync(
310
- packageJsonPath,
360
+ pkgDecision.targetPath,
311
361
  JSON.stringify(packageJson, null, 2)
312
362
  );
313
- console.log(chalk.green(' ✓ Created package.json'));
363
+ if (pkgDecision.isBackup) {
364
+ console.log(chalk.yellow(` ℹ️ package.json exists, created ${path.basename(pkgDecision.targetPath)}`));
365
+ } else if (pkgDecision.isOverwrite || !fs.existsSync(packageJsonPath)) {
366
+ console.log(chalk.green(' ✓ Created package.json'));
367
+ }
314
368
  }
315
369
 
316
370
  // Generate .editorconfig
317
371
  const editorconfigPath = path.join(projectPath, '.editorconfig');
318
- if (!fs.existsSync(editorconfigPath)) {
372
+ const ecDecision = await handleCoreFileConflict(editorconfigPath, '.editorconfig', config.force, config.skipPrompts);
373
+
374
+ if (ecDecision.shouldWrite) {
319
375
  const editorConfig = `root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false\n`;
320
- fs.writeFileSync(editorconfigPath, editorConfig);
321
- console.log(chalk.green(' ✓ Created .editorconfig'));
376
+ fs.writeFileSync(ecDecision.targetPath, editorConfig);
377
+ if (ecDecision.isBackup) {
378
+ console.log(chalk.yellow(` ℹ️ .editorconfig exists, created ${path.basename(ecDecision.targetPath)}`));
379
+ } else if (ecDecision.isOverwrite || !fs.existsSync(editorconfigPath)) {
380
+ console.log(chalk.green(' ✓ Created .editorconfig'));
381
+ }
322
382
  }
323
383
 
324
384
  // Generate .gitattributes
325
385
  const gitAttributesPath = path.join(projectPath, '.gitattributes');
326
- if (!fs.existsSync(gitAttributesPath)) {
386
+ const gaDecision = await handleCoreFileConflict(gitAttributesPath, '.gitattributes', config.force, config.skipPrompts);
387
+
388
+ if (gaDecision.shouldWrite) {
327
389
  const gitAttributes = `* text=auto eol=lf\n*.js text eol=lf\n*.sh text eol=lf\nbin/* text eol=lf\n`;
328
- fs.writeFileSync(gitAttributesPath, gitAttributes);
329
- console.log(chalk.green(' ✓ Created .gitattributes'));
390
+ fs.writeFileSync(gaDecision.targetPath, gitAttributes);
391
+ if (gaDecision.isBackup) {
392
+ console.log(chalk.yellow(` ℹ️ .gitattributes exists, created ${path.basename(gaDecision.targetPath)}`));
393
+ } else if (gaDecision.isOverwrite || !fs.existsSync(gitAttributesPath)) {
394
+ console.log(chalk.green(' ✓ Created .gitattributes'));
395
+ }
330
396
  }
331
397
  }
332
398
 
package/cli/index.js CHANGED
@@ -24,6 +24,7 @@ const { checkAndApplyUpdates } = require('./lib/auto-update');
24
24
  .argument('[project-name]', 'Name of the project', '.')
25
25
  .option('-t, --template <type>', 'Project template (minimal, standard, full)', 'standard')
26
26
  .option('-s, --skip-prompts', 'Skip interactive prompts and use defaults')
27
+ .option('-f, --force', 'Overwrite existing configuration files')
27
28
  .action(async (projectName, options) => {
28
29
  await createProject(projectName, options);
29
30
  });
package/cli/prompts.js CHANGED
@@ -184,8 +184,19 @@ async function getProjectConfig(skipPrompts = false, predefinedName = null) {
184
184
  return { ...responses, ...settings, skillCategories: Array.from(allSkills) };
185
185
  }
186
186
 
187
+ async function confirmOverwrite(fileName) {
188
+ const response = await prompts({
189
+ type: 'confirm',
190
+ name: 'value',
191
+ message: chalk.yellow(`⚠️ File "${fileName}" already exists. Overwrite? / File đã tồn tại. Ghi đè?`),
192
+ initial: false
193
+ });
194
+ return response.value;
195
+ }
196
+
187
197
  module.exports = {
188
198
  getProjectConfig,
189
199
  getSkillsForCategories,
190
- skillCategories
200
+ skillCategories,
201
+ confirmOverwrite
191
202
  };
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "antigravity-ide",
3
- "version": "4.0.5",
3
+ "version": "4.0.6",
4
4
  "description": "The First AI-Native IDE designed for Vibe Coding & Agentic Workflow.",
5
+ "homepage": "https://antigravity-ide-cli.vercel.app/",
5
6
  "main": "cli/index.js",
6
7
  "bin": {
7
8
  "antigravity": "./cli/index.js",
package/setup.js CHANGED
@@ -8,6 +8,7 @@ const chalk = require('chalk');
8
8
  const gradient = require('gradient-string');
9
9
  const boxen = require('boxen');
10
10
  const prompts = require('prompts');
11
+ const packageJson = require('./package.json');
11
12
 
12
13
  const GLOBAL_DIR = path.join(os.homedir(), '.antigravity');
13
14
  const SOURCE_DIR = path.join(__dirname, '.agent');
@@ -30,7 +31,7 @@ async function setup() {
30
31
 
31
32
  console.log(gradient.rainbow.multiline(branding));
32
33
  console.log(gradient.atlas('━'.repeat(60)));
33
- console.log(chalk.gray(` Google Antigravity • Global Setup Wizard • v3.5.61`));
34
+ console.log(chalk.gray(` Google Antigravity • Global Setup Wizard • v${packageJson.version}`));
34
35
  console.log(chalk.gray(' Developed with 💡 by Dokhacgiakhoa'));
35
36
  console.log(gradient.atlas('━'.repeat(60)) + '\n');
36
37
  console.log(chalk.bold.hex('#00ffee')('🚀 Antigravity Global Setup Starting...\n'));