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 +9 -2
- package/README.vi.md +11 -5
- package/VERSION +1 -1
- package/antigravity-ide-4.0.5.tgz +0 -0
- package/cli/create.js +86 -20
- package/cli/index.js +1 -0
- package/cli/prompts.js +12 -1
- package/package.json +2 -1
- package/setup.js +2 -1
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.
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
267
|
+
|
|
268
|
+
for (const file of files) {
|
|
238
269
|
const source = path.join(rootDir, file);
|
|
239
270
|
const dest = path.join(projectPath, file);
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
360
|
+
pkgDecision.targetPath,
|
|
311
361
|
JSON.stringify(packageJson, null, 2)
|
|
312
362
|
);
|
|
313
|
-
|
|
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
|
-
|
|
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(
|
|
321
|
-
|
|
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
|
-
|
|
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(
|
|
329
|
-
|
|
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.
|
|
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 •
|
|
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'));
|