Work with AI
Artemis ships a set of agent skills: packaged procedures that teach an AI coding agent how this repository actually works. Which Playwright specs a change needs. Why a build went red. Which architectural rules a new service is subject to, and the command that proves each one.
They live in skills/ and work with
Claude Code, Cursor, Codex, GitHub Copilot, opencode, Zed, and around seventy other agents.
Why skills and not just CLAUDE.md
CLAUDE.md is loaded into the agent's context on every request, so it has to stay short. That makes
it a good place for facts and rules and a bad place for procedures.
A skill is the opposite. Only its one-line description stays resident; the body loads when the agent
decides the skill is relevant. So a skill can afford to be long, and can carry the things that never
fit into CLAUDE.md: the steps, the exact commands, the reason behind a rule, and the failure modes
that look like something else.
The division is:
CLAUDE.md: what is true about this repository.skills/: how to do a particular job in it.
Installing
Any agent
npx skills add ls1intum/Artemis
This installs the skills into the agent's own skills directory for this project. It supports Claude Code, Cursor, Codex, Copilot, Cline, opencode, Zed, Windsurf, Gemini CLI, and many more.
Claude Code
Claude Code can install them as a versioned plugin, which namespaces the skills and lets you update them with a single command:
/plugin marketplace add ls1intum/Artemis
/plugin install artemis@artemis
The skills then appear as /artemis:e2e-pr-check, /artemis:ci-triage, and so on. Claude also
invokes them on its own when a task matches a skill's description; you do not have to name them.
Working on the skills themselves
claude --plugin-dir .
This loads your working copy directly, with no install step, so you can edit a SKILL.md and try it
immediately.
The skills
| Skill | Use it when |
|---|---|
e2e-pr-check | You want the E2E tests a change affects, not all 400-plus of them |
ci-triage | A pull request is red, or a check never appeared |
server-arch-gates | You changed Java under src/main/java and want the gates to pass first time |
liquibase-migration | You are adding, changing, or dropping anything in the database schema |
client-conventions | You are writing or migrating Angular code |
write-tests | You are adding a JUnit test or a Vitest spec |
local-setup | You are setting up from a fresh clone, or something will not start |
Example prompts
Run the E2E tests my branch affects
Why is PR 13652 red?
Add a NOT NULL constraint on complaint.result_id
Migrate this component to signal inputs
Which architecture tests does this new service need to pass?
You do not need to name a skill. The agent selects one from its description, the same way it picks
any other tool. Naming it explicitly (/artemis:ci-triage) forces the choice when you want to.
What each skill covers
e2e-pr-check resolves the affected specs with
.ci/E2E-tests/determine-relevant-tests.sh,
the same resolver CI uses, so local and CI selection cannot disagree. It then picks between the
single-node and multi-node runner, runs with --specs, and interprets the outcome: whether the
failure already exists on develop, whether the client under test is really your branch, and why an
assertion on a shared counter must be a lower bound.
ci-triage classifies a failure before anyone edits code. Server Tests reporting no failures
next to a timeout is a healthy run killed by the backstop. One ArchUnit violation reds two jobs. A
conflicting pull request starts no CI at all, which looks exactly like a dropped event.
server-arch-gates maps a change to the rules it must satisfy: no transaction boundaries in
services, no direct EntityManager or JDBC, all cross-node state through DistributedDataProvider,
no Hibernate second-level cache, and the counted gates that sit at their limit.
liquibase-migration covers how migrations are deployed (the cluster is stopped, the first
instance migrates, the rest follow), the guarded pattern for adding a NOT NULL constraint, expand and
contract for a column the previous version still reads or writes, the rollback invariant that a new
required column or a tightened constraint also breaks, and why triggers are not an option here.
client-conventions covers signal APIs, the ngOnChanges ban, @if and @for, deepClone
rather than spread or structuredClone, and TUM UI with semantic colour tokens.
write-tests covers base class selection, the admin naming rule that forces a shared
@ResourceLock, and the Vitest invocations that quietly do the wrong thing.
local-setup takes a fresh clone to a running server and client.
Contributing a skill
A skill is a directory under skills/ with a SKILL.md and optional reference/ files:
skills/
my-skill/
SKILL.md
reference/background.md
---
name: my-skill
description: What it does and when to use it, key use case first.
---
# Title
The procedure.
The description is the only part always in context, and it is what the agent selects on. Write it
as "what it does and when to use it", not as a title.
Four rules for this repository:
- Every factual claim cites a repository path.
supporting_scripts/check_skill_references.pyruns as theAgent SkillsCI job and fails if a cited path no longer exists. It reads both inline code spans and fenced code blocks, so example commands are checked too. - Keep the body a procedure. Background goes in a
reference/file, which costs nothing until the agent reads it. - Say why, not just what. A rule without its reason gets worked around instead of followed.
- Do not restate
CLAUDE.md. Add the part that does not fit there.
Before opening a pull request:
claude --plugin-dir .
python3 supporting_scripts/check_skill_references.py
python3 supporting_scripts/check_skill_references.py --self-test
claude plugin validate .