Gnapi team's Claude Code plugin marketplace — shared skills, commands, and agents. Add it once and every team member gets the same house-rule tooling inside Claude Code.
In any Claude Code session:
/plugin marketplace add gnapi-tech/gnapi-ai-plugins
/plugin install gnapi-scaffolding@gnapi-ai-pluginsPull future updates with:
/plugin marketplace update gnapi-ai-plugins
/plugin update gnapi-scaffoldingCodex has no plugin marketplace — it reads AGENTS.md (and .codex/AGENTS.md)
from the repo it's working in. So install = copy the generated shims into the
target repo:
git clone https://github.com/gnapi-tech/gnapi-ai-plugins /tmp/gnapi-ai-plugins
cd /path/to/your-repo
cp /tmp/gnapi-ai-plugins/AGENTS.md . # playbook + inlined standards
cp -R /tmp/gnapi-ai-plugins/.codex . # .codex/AGENTS.md + reference config.tomlIf the repo already has an AGENTS.md, keep yours and append the Gnapi one
instead of overwriting:
cat /tmp/gnapi-ai-plugins/AGENTS.md >> AGENTS.md.codex/config.toml is a reference config (approval_policy,
sandbox_mode, web_search) — keep it project-local or copy it to
~/.codex/config.toml for every project. Start Codex in the repo root and it
picks the instructions up automatically:
codexPull updates by re-running the copy after git pull in the clone. Two caveats
off Claude: no auto-trigger (ask for the scaffold explicitly) and no PreToolUse
hook (the standards are inlined into AGENTS.md instead). Other harnesses —
Cursor, opencode, Antigravity, Gemini CLI — see
Using on other agents.
| Plugin | Description | Provides |
|---|---|---|
gnapi-scaffolding |
Bakes Gnapi house rules (TDD, gts/Google lint + prettier, husky pre-commit, zod env validation, structured logging + tracing, error catalog, i18n, CI coverage gate) into new services from day one. | skill scaffold-nestjs-service |
gnapi-standards |
Injects Gnapi coding standards into context before Claude writes source files. | PreToolUse hook |
After installing, invoke a skill directly or let Claude pick it up by task:
/gnapi-scaffolding:scaffold-nestjs-servicescaffold-nestjs-service — params service_name (kebab-case), github_org.
Scaffolds a production-grade NestJS service compliant with every house rule.
No command to run — once installed it works automatically. On the first
source-file write of a session (Write/Edit/MultiEdit/NotebookEdit on a
.ts/.js/.py/.go/... file) a PreToolUse hook injects the Gnapi coding
standards into Claude's context:
- TDD — test-first (RED → GREEN → refactor), no production code without a test; keep coverage > 85%.
- SOLID & DRY — single-responsibility, depend on abstractions, no copy-paste.
- Naming — meaningful, intent-revealing; no cryptic abbreviations.
- Comments — capture the hidden why and how, not the obvious what.
- No hard-coded literals — extract to named constants in their own files.
- Structured logging & tracing — project logger only, with trace correlation.
- Error management — error-numbered errors, no unhandled exceptions, and catch blocks that take a real action + fallback (never log-and-swallow).
The hook is non-blocking (it only injects guidance) and fires once per
session to stay quiet. It needs node on PATH; if absent it no-ops.
The machine-checkable subset (naming format, no-console, no-magic-numbers,
no-floating-promises, coverage) is additionally enforced at commit/CI by
gnapi-scaffolding's lint overlay and pre-commit hook. The review gate
(code-reviewer + QA agents before merge) is enforced server-side by branch
protection + required CI status checks, not by a local hook.
The plugin format (marketplace, Skill tool, PreToolUse hook) is Claude-specific,
but the playbook content is portable. portable/build-shims.mjs fans out the
same two sources into each harness's native config — the ECC strategy
(per-harness trees), except generated from one source of truth instead of
hand-maintained, so they never drift.
node portable/build-shims.mjs # regenerate every shim from SKILL.md + portable/STANDARDS.md| Harness | Generated artifact |
|---|---|
| Claude Code | native plugin (plugins/…) + CLAUDE.md pointer |
| OpenAI Codex | AGENTS.md, .codex/AGENTS.md, .codex/config.toml |
| Cursor | .cursor/rules/gnapi.mdc |
| opencode | .opencode/opencode.json → AGENTS.md |
| Google Antigravity | .agent/AGENTS.md |
| Gemini CLI | GEMINI.md → AGENTS.md |
| Other SKILL.md loaders | .agents/skills/<name>/SKILL.md |
Off-Claude there's no auto-trigger and no hook: the agent invokes the playbook
manually (the skill description is embedded so it recognises the intent) and
the standards are inlined instead of hook-injected. Shims are generated —
edit the sources, never the output; CI fails on drift. Per-harness install and
what does/doesn't carry over: see portable/README.md.
.
├── .claude-plugin/
│ └── marketplace.json # marketplace catalog (lists all plugins)
├── .github/workflows/
│ └── shims.yml # fails if any generated shim is out of date
├── plugins/
│ ├── gnapi-scaffolding/
│ │ ├── .claude-plugin/
│ │ │ └── plugin.json # plugin manifest
│ │ └── skills/
│ │ └── scaffold-nestjs-service/
│ │ └── SKILL.md # the skill (source of truth)
│ └── gnapi-standards/
│ ├── .claude-plugin/
│ │ └── plugin.json # plugin manifest
│ ├── hooks/
│ │ └── hooks.json # PreToolUse matchers → scripts
│ └── scripts/
│ ├── precode-standards.sh # node guard / launcher (Write/Edit)
│ └── precode-standards.js # injects standards as additionalContext
├── portable/
│ ├── STANDARDS.md # canonical standards (mirror of the hook text)
│ ├── build-shims.mjs # generator: sources → all harness shims
│ └── README.md # per-harness install + porting notes
│
│ # ── GENERATED by portable/build-shims.mjs (do not hand-edit) ──
├── AGENTS.md # universal entry (Codex/opencode/Cursor/Amp/Zed…)
├── CLAUDE.md # Claude pointer → native plugin
├── GEMINI.md # Gemini CLI pointer → AGENTS.md
├── .codex/ # Codex: AGENTS.md + config.toml
├── .cursor/rules/gnapi.mdc # Cursor always-apply rule
├── .opencode/opencode.json # opencode instructions → AGENTS.md
├── .agent/AGENTS.md # Google Antigravity
├── .agents/skills/…/SKILL.md # generic SKILL.md loaders (verbatim skill)
└── README.md
- Drop it under an existing plugin:
plugins/<plugin>/skills/<skill-name>/SKILL.md. TheSKILL.mdneeds YAML frontmatter withnameanddescription. - Or add a whole new plugin: create
plugins/<new-plugin>/.claude-plugin/plugin.jsonplus itsskills/, then append an entry to.claude-plugin/marketplace.json. - Bump the
versionin the affectedplugin.jsonand the marketplace entry so/plugin updateactually ships it to the team. - Open a PR to
develop.
Work on a branch off develop; open a PR back to develop. main is the
released marketplace state that team sessions install from.