Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
"name": "context-engineering-kit",
"version": "3.8.0",
"version": "3.8.1",
"description": "Hand-crafted collection of advanced context engineering techniques and patterns with minimal token footprint focused on improving agent result quality.",
"owner": {
"name": "NeoLabHQ",
Expand Down Expand Up @@ -55,7 +55,7 @@
{
"name": "sadd",
"description": "Introduces skills for subagent-driven development, dispatches fresh subagent for each task with code review between tasks, enabling fast iteration with quality gates.",
"version": "3.3.0",
"version": "3.3.1",
"author": {
"name": "Vlad Goncharov",
"email": "vlad.goncharov@neolab.finance"
Expand All @@ -77,7 +77,7 @@
{
"name": "sdd",
"description": "Specification Driven Development workflow commands and agents, based on Github Spec Kit and OpenSpec. Uses specialized agents for effective context management and quality review.",
"version": "3.4.0",
"version": "3.4.1",
"author": {
"name": "Vlad Goncharov",
"email": "vlad.goncharov@neolab.finance"
Expand Down
100 changes: 100 additions & 0 deletions .github/workflows/sync-provider-formats.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Keeps the root-level Gemini CLI / Antigravity CLI provider bundle
# (skills/, agents/, gemini-extension.json, plugin.json) in sync with
# plugins/*/skills, plugins/*/agents, and the marketplace manifest.
#
# `just sync-provider-formats` (see justfile) fully regenerates those four
# paths from the current plugin content. This workflow runs it on every PR
# that could change the bundle and reacts to exactly four outcomes:
# 1. Sync ran fine, no drift -> pass, nothing to do.
# 2. Sync ran fine, drift found, same-repo -> commit + push the fix back.
# 3. Sync ran fine, drift found, fork PR -> fail with instructions
# (the default GITHUB_TOKEN cannot push to a fork's branch).
# 4. Sync itself errored (e.g. a skill/agent name collision) -> fail and
# surface the script's own error message, without touching git state.
name: Sync provider formats

on:
pull_request:
paths:
- "plugins/**/skills/**"
- "plugins/**/agents/**"
- ".claude-plugin/marketplace.json"

# Only the push-back path (outcome 2) needs write access; everything else
# only reads the checked-out tree.
permissions:
contents: write

# A fresh push to the same PR should supersede an in-flight run rather than
# race it for the push-back step.
concurrency:
group: sync-provider-formats-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
sync:
name: Sync provider formats
runs-on: ubuntu-latest
steps:
# `ref: head.sha` (rather than the branch name) works for both
# same-repo and fork PRs: GitHub exposes the PR head commit on the
# base repo's refs even when the branch itself only exists in a fork.
- name: Checkout PR head commit
uses: actions/checkout@v7
with:
ref: ${{ github.event.pull_request.head.sha }}

- name: Install just
uses: extractions/setup-just@v4

# Captures the recipe's own exit code as a step output instead of
# letting it fail the step directly, so "script errored" and "script
# succeeded but produced a diff" stay two distinct, separately
# branchable signals (handled by the two steps below).
- name: Run sync-provider-formats
id: sync
run: |
if just sync-provider-formats > sync-provider-formats.log 2>&1; then
echo "outcome=ok" >> "$GITHUB_OUTPUT"
else
echo "outcome=error" >> "$GITHUB_OUTPUT"
fi
cat sync-provider-formats.log

# `git add -A` (not `git diff` alone) is required here: the recipe
# deletes and recreates these paths from scratch, so a newly added
# plugin skill/agent is untracked, not merely modified, and plain
# `git diff` would miss it entirely.
- name: Check for drift against the committed bundle
id: diff
run: |
git add -A -- skills agents gemini-extension.json plugin.json
if git diff --cached --quiet; then
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "changed=true" >> "$GITHUB_OUTPUT"
git diff --cached --stat
fi

- name: Fail with instructions (fork PR is out of sync)
if: steps.diff.outputs.changed == 'true' && github.event.pull_request.head.repo.fork == true
run: |
echo "::error::The provider bundle (skills/, agents/, gemini-extension.json, plugin.json) is out of date. Run 'just sync-provider-formats' locally and commit the result, then push again. Automatic push-back is unavailable for pull requests from forks because the default GITHUB_TOKEN cannot push to fork branches."
exit 1

# Files are already staged by the diff-check step above, so this only
# needs to commit and push - no separate `git add`.
#
# HEAD_REF is passed through an env var rather than interpolated
# directly into the script, since branch names come from the PR
# payload and are attacker-controlled input (security hardening
# guidance for GitHub Actions inline scripts).
- name: Commit and push regenerated bundle
if: steps.diff.outputs.changed == 'true' && github.event.pull_request.head.repo.fork == false
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git commit -m "chore: sync provider formats (gemini/antigravity bundle)"
git push origin "HEAD:$HEAD_REF"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,6 @@ vite.config.ts.timestamp-*

#Ignore cursor AI rules
.cursor/rules/codacy.mdc
.specs/scratchpad/*.md
.specs/analysis/*.md
.specs/reports/*.md
122 changes: 122 additions & 0 deletions .specs/tasks/done/add-gemini-antigravity-cli-support.feature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
---
title: Add support for Gemini and Antigravity CLI
---

## Initial User Prompt

add support for gemini and antigravity cli

### Context

Currently used in README.md approach with isntallation through `vercel-labs/skills` not works well with majority of providers due to lack of support for agents installation from vercel-labs/skills cli.

But gemini have own standard for extensions, that uses gemini-extension.json and antigravity cli uses plugin.json

#### Gemini CLI: use an extension

Gemini CLI extensions can bundle both Agent Skills and subagents:

```
my-gemini-extension/
├── gemini-extension.json
├── skills/
│ └── code-review/
│ ├── SKILL.md
│ └── scripts/
└── agents/
├── reviewer.md
└── researcher.md
```
Minimal manifest:

```json
{
"name": "my-plugin",
"version": "1.0.0",
"description": "My skills and specialized agents"
}
```
Install it with:

```bash
gemini extensions install https://github.com/your-org/my-gemini-extension
```

#### Antigravity CLI: use a native plugin

Antigravity CLI has a plugin system specifically designed to package skills, agents, rules, MCP servers, and hooks:

```
my-antigravity-plugin/
├── plugin.json
├── skills/
│ └── code-review/
│ └── SKILL.md
├── agents/
│ ├── reviewer.md
│ └── researcher.md
├── mcp_config.json
├── hooks.json
└── rules/
```
Manifest:

```json
{
"$schema": "https://antigravity.google/schemas/v1/plugin.json",
"name": "my-plugin",
"description": "My skills and specialized subagents"
}
```

### Requirements

Key constraint driving this design: neither Gemini CLI nor Antigravity CLI has a marketplace/registry concept (unlike Claude Code's `marketplace.json`) — each install command installs exactly one extension/plugin, and a remote/URL-based `gemini extensions install` clones the whole repo and requires the manifest at the **repo root**, with no subdirectory support. So per-plugin selective install (like `/plugin install reflexion@...`) isn't achievable for Gemini/Antigravity; instead, all plugins' `skills/`/`agents/` content is merged into one root-level bundle installable as a single extension/plugin.

#### 1. Repo structure & build output (generated, committed by CI)

- At the repo root: `gemini-extension.json` (`name`/`version`/`description` sourced from `.claude-plugin/marketplace.json`'s top-level fields) and `plugin.json` (Antigravity schema, same source fields; only used by the antigravity-only fallback install, not the primary flow).
- At the repo root: `skills/` and `agents/` — union of every `plugins/<name>/skills/*` and `plugins/<name>/agents/*` folder, copied as-is with original names preserved (no prefixing, no nesting).
- Collision policy: if two plugins define a same-named skill/agent folder, the sync must hard-fail with an error naming both source plugins. Names are currently unique across all plugins.
- Per-plugin outcome: every plugin merges whatever `skills/`/`agents/` it has (including `reflexion`'s `skills/`). `reflexion`'s `hooks/` folder is left out of the merge — not a skip of the plugin, hooks were never a sync target. `ddd` and `tech-stack` are `rules/`-only today so they contribute nothing to the merge (not a special-case exclusion — if they ever add `skills/`/`agents/`, it merges automatically). Other plugins' non-skills/agents folders (`scripts/`, `tasks/`, `prompts/` in `mcp`/`sadd`/`sdd`/`fpf`) stay untouched in place.

#### 2. justfile: `sync-provider-formats`

- Plain bash in the justfile (matching `sync-docs-to-plugins`/`sync-plugins-to-docs` style), using `jq` for manifest generation — no external script files.
- Full regeneration every run: delete and rebuild `skills/`, `agents/`, `gemini-extension.json`, `plugin.json` from scratch (no incremental patching), so removed plugin content disappears from the bundle automatically.
- Idempotent: re-running with no plugin changes produces an identical output (no git diff).

#### 3. GitHub Action (CI)

- Triggers on `pull_request`, scoped with a path filter to `plugins/**/skills/**`, `plugins/**/agents/**`, and `.claude-plugin/marketplace.json` (avoids running on unrelated PRs, e.g. docs-only changes).
- Runs `just sync-provider-formats`, then diffs the result against what's committed.
- If different and the PR branch is same-repo (not a fork): commit and push the regenerated files back onto the PR branch.
- If different and the PR is from a fork: fail the check with an instructive message (run `just sync-provider-formats` locally and commit) — GitHub Actions' default token can't push to fork branches.
- If the sync script itself errors (name collision): fail the check without committing anything, surfacing the conflict directly.

#### 4. README installation instructions

Convert `### Step 1: Install Marketplace and Plugins` to four sibling `<details><summary>` spoilers (not subheadings):

1. **Claude Code** — unchanged (`/plugin marketplace add`, `/plugin install <name>@...`).
2. **Gemini CLI or Antigravity CLI** (new) — primary flow:
```bash
gemini extensions install https://github.com/NeoLabHQ/context-engineering-kit
agy plugin import gemini
```
Antigravity-only fallback (no Gemini CLI installed):
```bash
git clone https://github.com/NeoLabHQ/context-engineering-kit
cd context-engineering-kit
agy plugin install .
```
Note inline: installs every plugin's skills/agents as one bundle — no per-plugin selection like Claude Code's `/plugin install`; content from `rules/`-only plugins (`ddd`, `tech-stack`) and `reflexion`'s `hooks/` isn't included.
3. **Cursor, Codex, OpenCode and others** — existing `npx skills add` flow (Antigravity removed from this heading, since it now has its own native spoiler above). Add caveat: each provider uses its own agent format, so this path won't give subagent-using plugins the full experience — only skills transfer cleanly.
4. **Alternative installation methods** (OpenSkills) — existing content, promoted from a nested spoiler to a top-level sibling spoiler.




## Description

// Will be filled in future stages by business analyst
47 changes: 43 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ Updates from key releases:

### Step 1: Install Marketplace and Plugins

#### Claude Code
<details>
<summary>Claude Code</summary>

Open Claude Code and add the Context Engineering Kit marketplace
Open Claude Code and add the Context Engineering Kit marketplace:

```bash
/plugin marketplace add NeoLabHQ/context-engineering-kit
Expand All @@ -61,14 +62,52 @@ Install any plugin — for example, reflexion:

Each installed plugin loads only its specific agents, commands, and skills into Claude's context.

#### Cursor, Antigravity, Codex, OpenCode and others
</details>

<details>
<summary>Gemini CLI or Antigravity CLI</summary>

**Gemini CLI installation**

```bash
gemini extensions install https://github.com/NeoLabHQ/context-engineering-kit
```

**Antigravity CLI installation:**

**Important**: This command requires Gemini CLI to be installed.

```bash
gemini extensions install https://github.com/NeoLabHQ/context-engineering-kit
agy plugin import gemini
```

**Antigravity CLI installation without Gemini CLI:**

```bash
git clone https://github.com/NeoLabHQ/context-engineering-kit
cd context-engineering-kit
agy plugin install .
```

**Note:** This installs every plugin's skills and agents as a single bundle — there's no per-plugin selection like Claude Code's. Unfortunately, Gemini and Antigravity CLI does not support per-plugin selection. But you can delete skills and agents that you don't need, after installation.

</details>

<details>
<summary>Cursor, Codex, OpenCode and others</summary>

Run the [vercel-labs/skills](https://github.com/vercel-labs/skills) command in your terminal:

```bash
npx skills add NeoLabHQ/context-engineering-kit
```
You can pick which skills and agents to install.

You can pick which skills to install.

**Note:** Each provider uses its own agent format and `npx skills` does not support subagents, so this installation method won't provide the full experience.

</details>

<details>
<summary>Alternative installation methods</summary>
Expand Down
Loading