mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-09 10:53:34 +08:00
feat: add gemini install target
This commit is contained in:
48
.gemini/GEMINI.md
Normal file
48
.gemini/GEMINI.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# ECC for Gemini CLI
|
||||||
|
|
||||||
|
This file provides Gemini CLI with the baseline ECC workflow, review standards, and security checks for repositories that install the Gemini target.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Everything Claude Code (ECC) is a cross-harness coding system with 36 specialized agents, 142 skills, and 68 commands.
|
||||||
|
|
||||||
|
Gemini support is currently focused on a strong project-local instruction layer via `.gemini/GEMINI.md`, plus the shared MCP catalog and package-manager setup assets shipped by the installer.
|
||||||
|
|
||||||
|
## Core Workflow
|
||||||
|
|
||||||
|
1. Plan before editing large features.
|
||||||
|
2. Prefer test-first changes for bug fixes and new functionality.
|
||||||
|
3. Review for security before shipping.
|
||||||
|
4. Keep changes self-contained, readable, and easy to revert.
|
||||||
|
|
||||||
|
## Coding Standards
|
||||||
|
|
||||||
|
- Prefer immutable updates over in-place mutation.
|
||||||
|
- Keep functions small and files focused.
|
||||||
|
- Validate user input at boundaries.
|
||||||
|
- Never hardcode secrets.
|
||||||
|
- Fail loudly with clear error messages instead of silently swallowing problems.
|
||||||
|
|
||||||
|
## Security Checklist
|
||||||
|
|
||||||
|
Before any commit:
|
||||||
|
|
||||||
|
- No hardcoded API keys, passwords, or tokens
|
||||||
|
- All external input validated
|
||||||
|
- Parameterized queries for database writes
|
||||||
|
- Sanitized HTML output where applicable
|
||||||
|
- Authz/authn checked for sensitive paths
|
||||||
|
- Error messages scrubbed of sensitive internals
|
||||||
|
|
||||||
|
## Delivery Standards
|
||||||
|
|
||||||
|
- Use conventional commits: `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `ci`
|
||||||
|
- Run targeted verification for touched areas before shipping
|
||||||
|
- Prefer contained local implementations over adding new third-party runtime dependencies
|
||||||
|
|
||||||
|
## ECC Areas To Reuse
|
||||||
|
|
||||||
|
- `AGENTS.md` for repo-wide operating rules
|
||||||
|
- `skills/` for deep workflow guidance
|
||||||
|
- `commands/` for slash-command patterns worth adapting into prompts/macros
|
||||||
|
- `mcp-configs/` for shared connector baselines
|
||||||
@@ -187,6 +187,7 @@ npm install # or: pnpm install | yarn install | bun install
|
|||||||
# ./install.sh typescript python golang swift php
|
# ./install.sh typescript python golang swift php
|
||||||
# ./install.sh --target cursor typescript
|
# ./install.sh --target cursor typescript
|
||||||
# ./install.sh --target antigravity typescript
|
# ./install.sh --target antigravity typescript
|
||||||
|
# ./install.sh --target gemini --profile full
|
||||||
```
|
```
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
@@ -200,6 +201,7 @@ npm install # or: pnpm install | yarn install | bun install
|
|||||||
# .\install.ps1 typescript python golang swift php
|
# .\install.ps1 typescript python golang swift php
|
||||||
# .\install.ps1 --target cursor typescript
|
# .\install.ps1 --target cursor typescript
|
||||||
# .\install.ps1 --target antigravity typescript
|
# .\install.ps1 --target antigravity typescript
|
||||||
|
# .\install.ps1 --target gemini --profile full
|
||||||
|
|
||||||
# npm-installed compatibility entrypoint also works cross-platform
|
# npm-installed compatibility entrypoint also works cross-platform
|
||||||
npx ecc-install typescript
|
npx ecc-install typescript
|
||||||
@@ -885,6 +887,7 @@ Each component is fully independent.
|
|||||||
|
|
||||||
Yes. ECC is cross-platform:
|
Yes. ECC is cross-platform:
|
||||||
- **Cursor**: Pre-translated configs in `.cursor/`. See [Cursor IDE Support](#cursor-ide-support).
|
- **Cursor**: Pre-translated configs in `.cursor/`. See [Cursor IDE Support](#cursor-ide-support).
|
||||||
|
- **Gemini CLI**: Experimental project-local support via `.gemini/GEMINI.md` and shared installer plumbing.
|
||||||
- **OpenCode**: Full plugin support in `.opencode/`. See [OpenCode Support](#-opencode-support).
|
- **OpenCode**: Full plugin support in `.opencode/`. See [OpenCode Support](#-opencode-support).
|
||||||
- **Codex**: First-class support for both macOS app and CLI, with adapter drift guards and SessionStart fallback. See PR [#257](https://github.com/affaan-m/everything-claude-code/pull/257).
|
- **Codex**: First-class support for both macOS app and CLI, with adapter drift guards and SessionStart fallback. See PR [#257](https://github.com/affaan-m/everything-claude-code/pull/257).
|
||||||
- **Antigravity**: Tightly integrated setup for workflows, skills, and flattened rules in `.agent/`. See [Antigravity Guide](docs/ANTIGRAVITY-GUIDE.md).
|
- **Antigravity**: Tightly integrated setup for workflows, skills, and flattened rules in `.agent/`. See [Antigravity Guide](docs/ANTIGRAVITY-GUIDE.md).
|
||||||
|
|||||||
@@ -88,6 +88,7 @@
|
|||||||
".claude-plugin",
|
".claude-plugin",
|
||||||
".codex",
|
".codex",
|
||||||
".cursor",
|
".cursor",
|
||||||
|
".gemini",
|
||||||
".opencode",
|
".opencode",
|
||||||
"mcp-configs",
|
"mcp-configs",
|
||||||
"scripts/setup-package-manager.js"
|
"scripts/setup-package-manager.js"
|
||||||
@@ -97,6 +98,7 @@
|
|||||||
"cursor",
|
"cursor",
|
||||||
"antigravity",
|
"antigravity",
|
||||||
"codex",
|
"codex",
|
||||||
|
"gemini",
|
||||||
"opencode",
|
"opencode",
|
||||||
"codebuddy"
|
"codebuddy"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"cursor",
|
"cursor",
|
||||||
"antigravity",
|
"antigravity",
|
||||||
"codex",
|
"codex",
|
||||||
|
"gemini",
|
||||||
"opencode",
|
"opencode",
|
||||||
"codebuddy"
|
"codebuddy"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const path = require('path');
|
|||||||
const { planInstallTargetScaffold } = require('./install-targets/registry');
|
const { planInstallTargetScaffold } = require('./install-targets/registry');
|
||||||
|
|
||||||
const DEFAULT_REPO_ROOT = path.join(__dirname, '../..');
|
const DEFAULT_REPO_ROOT = path.join(__dirname, '../..');
|
||||||
const SUPPORTED_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'codex', 'opencode', 'codebuddy'];
|
const SUPPORTED_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'codex', 'gemini', 'opencode', 'codebuddy'];
|
||||||
const COMPONENT_FAMILY_PREFIXES = {
|
const COMPONENT_FAMILY_PREFIXES = {
|
||||||
baseline: 'baseline:',
|
baseline: 'baseline:',
|
||||||
language: 'lang:',
|
language: 'lang:',
|
||||||
|
|||||||
10
scripts/lib/install-targets/gemini-project.js
Normal file
10
scripts/lib/install-targets/gemini-project.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
const { createInstallTargetAdapter } = require('./helpers');
|
||||||
|
|
||||||
|
module.exports = createInstallTargetAdapter({
|
||||||
|
id: 'gemini-project',
|
||||||
|
target: 'gemini',
|
||||||
|
kind: 'project',
|
||||||
|
rootSegments: ['.gemini'],
|
||||||
|
installStatePathSegments: ['ecc-install-state.json'],
|
||||||
|
nativeRootRelativePath: '.gemini',
|
||||||
|
});
|
||||||
@@ -3,6 +3,7 @@ const claudeHome = require('./claude-home');
|
|||||||
const codebuddyProject = require('./codebuddy-project');
|
const codebuddyProject = require('./codebuddy-project');
|
||||||
const codexHome = require('./codex-home');
|
const codexHome = require('./codex-home');
|
||||||
const cursorProject = require('./cursor-project');
|
const cursorProject = require('./cursor-project');
|
||||||
|
const geminiProject = require('./gemini-project');
|
||||||
const opencodeHome = require('./opencode-home');
|
const opencodeHome = require('./opencode-home');
|
||||||
|
|
||||||
const ADAPTERS = Object.freeze([
|
const ADAPTERS = Object.freeze([
|
||||||
@@ -10,6 +11,7 @@ const ADAPTERS = Object.freeze([
|
|||||||
cursorProject,
|
cursorProject,
|
||||||
antigravityProject,
|
antigravityProject,
|
||||||
codexHome,
|
codexHome,
|
||||||
|
geminiProject,
|
||||||
opencodeHome,
|
opencodeHome,
|
||||||
codebuddyProject,
|
codebuddyProject,
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ function runTests() {
|
|||||||
assert.ok(targets.includes('cursor'), 'Should include cursor target');
|
assert.ok(targets.includes('cursor'), 'Should include cursor target');
|
||||||
assert.ok(targets.includes('antigravity'), 'Should include antigravity target');
|
assert.ok(targets.includes('antigravity'), 'Should include antigravity target');
|
||||||
assert.ok(targets.includes('codex'), 'Should include codex target');
|
assert.ok(targets.includes('codex'), 'Should include codex target');
|
||||||
|
assert.ok(targets.includes('gemini'), 'Should include gemini target');
|
||||||
assert.ok(targets.includes('opencode'), 'Should include opencode target');
|
assert.ok(targets.includes('opencode'), 'Should include opencode target');
|
||||||
assert.ok(targets.includes('codebuddy'), 'Should include codebuddy target');
|
assert.ok(targets.includes('codebuddy'), 'Should include codebuddy target');
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
@@ -230,6 +231,19 @@ function runTests() {
|
|||||||
assert.strictEqual(statePath, path.join(projectRoot, '.codebuddy', 'ecc-install-state.json'));
|
assert.strictEqual(statePath, path.join(projectRoot, '.codebuddy', 'ecc-install-state.json'));
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
if (test('resolves gemini adapter root and install-state path from project root', () => {
|
||||||
|
const adapter = getInstallTargetAdapter('gemini');
|
||||||
|
const projectRoot = '/workspace/app';
|
||||||
|
const root = adapter.resolveRoot({ projectRoot });
|
||||||
|
const statePath = adapter.getInstallStatePath({ projectRoot });
|
||||||
|
|
||||||
|
assert.strictEqual(adapter.id, 'gemini-project');
|
||||||
|
assert.strictEqual(adapter.target, 'gemini');
|
||||||
|
assert.strictEqual(adapter.kind, 'project');
|
||||||
|
assert.strictEqual(root, path.join(projectRoot, '.gemini'));
|
||||||
|
assert.strictEqual(statePath, path.join(projectRoot, '.gemini', 'ecc-install-state.json'));
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
if (test('codebuddy adapter supports lookup by target and adapter id', () => {
|
if (test('codebuddy adapter supports lookup by target and adapter id', () => {
|
||||||
const byTarget = getInstallTargetAdapter('codebuddy');
|
const byTarget = getInstallTargetAdapter('codebuddy');
|
||||||
const byId = getInstallTargetAdapter('codebuddy-project');
|
const byId = getInstallTargetAdapter('codebuddy-project');
|
||||||
|
|||||||
Reference in New Issue
Block a user