GitHub Workflows
amirisback/automated-build-android-app-with-github-action
Manage and automate Android CI/CD workflows using GitHub Actions in this repository.
A skill your agent uses to set up a CI gate that fails the build when Compose stability silently regresses, using the skydoves/compose-stability-analyzer Gradle plugin (primary) or the…
$ npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rosuH/EasyWatermark enforcing-stability-in-ci --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/enforcing-stability-in-ci .claude/skills/enforcing-stability-in-ci && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "enforcing-stability-in-ci" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ci into .claude/skills/enforcing-stability-in-ci/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "enforcing-stability-in-ci", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ciType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rosuH/EasyWatermark enforcing-stability-in-ci --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/enforcing-stability-in-ci .agents/skills/enforcing-stability-in-ci && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "enforcing-stability-in-ci" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ci into .agents/skills/enforcing-stability-in-ci/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "enforcing-stability-in-ci", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rosuH/EasyWatermark enforcing-stability-in-ci --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/enforcing-stability-in-ci .cursor/skills/enforcing-stability-in-ci && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "enforcing-stability-in-ci" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ci into .cursor/skills/enforcing-stability-in-ci/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "enforcing-stability-in-ci", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/rosuH/EasyWatermark.git --path .agents/skills/enforcing-stability-in-ci--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rosuH/EasyWatermark enforcing-stability-in-ci --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/enforcing-stability-in-ci .gemini/skills/enforcing-stability-in-ci && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "enforcing-stability-in-ci" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ci into .gemini/skills/enforcing-stability-in-ci/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "enforcing-stability-in-ci", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install rosuH/EasyWatermark enforcing-stability-in-ciInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/enforcing-stability-in-ci .github/skills/enforcing-stability-in-ci && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "enforcing-stability-in-ci" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ci into .github/skills/enforcing-stability-in-ci/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "enforcing-stability-in-ci", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rosuH/EasyWatermark enforcing-stability-in-ci --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/enforcing-stability-in-ci .opencode/skills/enforcing-stability-in-ci && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "enforcing-stability-in-ci" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/enforcing-stability-in-ci into .opencode/skills/enforcing-stability-in-ci/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "enforcing-stability-in-ci", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
enforcing-stability-in-ciA skill your agent uses to set up a CI gate that fails the build when Compose stability silently regresses, using the skydoves/compose-stability-analyzer Gradle plugin (primary) or the…
Enforcing Stability In CI is an agent skill from rosuH/EasyWatermark. Use this skill to set up a CI gate that fails the build when Compose stability silently regresses, using the skydoves/compose-stability-analyzer Gradle plugin (primary) or the j-roskopf/ComposeGuard plugin (alternative for non-Android multiplatform). Covers applying com.github.skydoves.compose.stability.analyzer, configuring the composeStabilityAnalyzer { stabilityValidation { ... } } DSL, generating a .stability baseline with :stabilityDump, committing it to version control, and wiring :stabilityCheck into a…
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud, covering Git workflow, Site reliability engineering and Mobile performance. It works with Gradle, Android, GitHub and GitHub Actions. The repository describes itself as: 🔒 🖼 Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印,防止被人泄露、利用. The licence is Apache-2.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 61223db. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comdeveloper.android.commedium.comchrisbanes.meFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Enforcing Stability In CI loads about 4k tokens when it runs. Until then it costs about 228 tokens; SKILL.md has 1,324 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from rosuH/EasyWatermark at commit 61223db, republished under its Apache-2.0 licence (© rosuH). 1,324 words, ~4,035 tokens.
.claude/skills/enforcing-stability-in-ci/SKILL.md (or your agent's skills folder).Stability is a property that silently regresses. A new var in a shared data class can disable skipping across dozens of screens, and nothing in the build output complains. Treat stability like binary compatibility: commit a baseline, diff it on every PR, fail the build when the diff goes the wrong way. This skill sets that gate up using the skydoves/compose-stability-analyzer Gradle plugin and points to j-roskopf/ComposeGuard for non-Android multiplatform projects.
stabilityCheck, stabilityDump, baseline drift, ComposeGuard, or "fail the build on stability regression".../diagnosing-compose-stability/SKILL.md first to make sure the current state is acceptable; baselining a broken state just locks the brokenness in.../understanding-stability-inference/SKILL.md.org.jetbrains.kotlin.plugin.compose). Strong skipping is default on../gradlew assemble or equivalent.../diagnosing-compose-stability/SKILL.md first)..stability baseline must be checked in).Add the plugin to the version catalog and apply it to every module that ships UI composables.
# gradle/libs.versions.toml
[versions]
compose-stability-analyzer = "0.7.3"
[plugins]
compose-stability-analyzer = { id = "com.github.skydoves.compose.stability.analyzer", version.ref = "compose-stability-analyzer" }// app/build.gradle.kts (and every UI feature module)
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.compose.stability.analyzer)
}The plugin must be applied after the Compose compiler plugin so it can read the same compiler output.
// app/build.gradle.kts
composeStabilityAnalyzer {
enabled.set(true)
stabilityValidation {
enabled.set(true)
outputDir.set(layout.projectDirectory.dir("stability"))
failOnStabilityChange.set(true)
ignoredPackages.set(
listOf(
"com.example.preview", // @Preview-only composables
"com.example.benchmark", // microbenchmark fixtures
)
)
ignoredClasses.set(
listOf(
"com.example.testing.FakeRepository",
)
)
stabilityConfigurationFiles.add(
rootProject.layout.projectDirectory.file("stability_config.conf")
)
}
}Key settings:
outputDir — where .stability baseline files are written. Pick a path inside the module so it is naturally co-located with the source. Do not write to build/; that directory is gitignored and the baseline must be committed.failOnStabilityChange — set to true for CI. Locally, developers may toggle this to false for iteration speed, but the committed value must be true.ignoredPackages / ignoredClasses — exclude @Preview composables, benchmark fixtures, and test doubles that intentionally violate stability rules.stabilityConfigurationFiles — point at the same stability_config.conf the Compose compiler uses, so the plugin's verdict matches the compiler's../gradlew :app:stabilityDump
# or, for a specific variant:
./gradlew :app:debugStabilityDumpThe plugin writes one .stability file per module per variant under outputDir. Commit them.
git add app/stability/
git commit -m "chore(stability): seed baseline"A single .stability entry looks like this:
@Composable
public fun com.example.CounterDisplay(count: com.example.MainViewModel): kotlin.Unit
skippable: false
restartable: true
params:
- count: RUNTIME (requires runtime check)Each entry records the composable signature, skippable / restartable flags, and the per-parameter stability classification. The diff format is line-stable across runs, so PR reviewers see a meaningful change set.
stabilityCheck into CIAdd a Gradle task invocation to the same job that compiles. Earlier signal beats a separate stage.
# .github/workflows/ci.yml
name: CI
on:
pull_request:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- uses: gradle/actions/setup-gradle@v4
- name: Assemble and check stability
run: ./gradlew assemble :app:stabilityCheck
- name: Upload stability diff on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: stability-diff
path: app/build/reports/stability/stabilityCheck reads the committed baseline, regenerates the current snapshot in build/, diffs them, and fails the task if any composable became less skippable or any class became less stable. The PR check turns red and the developer sees exactly which composable regressed and why.
When stabilityCheck fails, the task output names the regressed composables and the new unstable parameter or class. The developer has two valid responses:
var → val, List → ImmutableList, Flow parameter → collectAsStateWithLifecycle upstream). Re-run :stabilityDump locally to confirm the baseline is unchanged, then push.:stabilityDump to update the baseline, commit it, and add a note in the PR description explaining why the regression is intentional. Code review enforces the justification — the diff is plain text and reviewable.Treat baseline updates the same way the team treats binary-compatibility baseline updates: visible in code review, requires explanation.
ignoredPackages and ignoredClasses exist for legitimate exemptions: previews, benchmarks, test doubles, generated code. Do not use them to silence regressions in production code. Every ignore entry needs a comment explaining why; reviewers should reject ignore additions that lack a rationale.
// RIGHT
ignoredPackages.set(
listOf(
"com.example.preview", // @Preview composables intentionally use mutable state for tooling
"com.example.benchmark" // microbenchmark fixtures need fresh allocations per iteration
)
)// WRONG
ignoredPackages.set(listOf("com.example.feature.cart"))
// WRONG because: silencing an entire production package hides real regressions in cart.
// The team will rediscover the lost skipping as field jank weeks later.If the project is Compose Multiplatform (desktop, iOS via KMP) or otherwise outside the Android Gradle plugin's reach, use j-roskopf/ComposeGuard. It implements the same idea (commit a baseline, diff in CI, fail on regression) and exposes <variant>ComposeCompilerGenerate and <variant>ComposeCompilerCheck tasks. Wire it the same way as stabilityDump / stabilityCheck above. The skydoves plugin is the primary recommendation for Android-only projects because it integrates with @TraceRecomposition for runtime correlation.
# RIGHT
app/stability/
app-debug.stability <-- committed
app-release.stability <-- committed
# CI runs:
./gradlew :app:stabilityCheck # diffs current vs committed baseline; fails on regression# WRONG
app/build/stability/ <-- in build/, gitignored, never committed
# WRONG because: every CI run starts from a fresh build/, the baseline does not exist,
# stabilityCheck either no-ops or always passes. The gate is theater.// RIGHT — committed default
composeStabilityAnalyzer {
stabilityValidation {
failOnStabilityChange.set(true)
}
}// WRONG — committed default
composeStabilityAnalyzer {
stabilityValidation {
failOnStabilityChange.set(false)
}
}
// WRONG because: turns the gate into an informational warning. Developers learn to ignore
// the warning. Stability regresses anyway. Set true and let CI block the merge.Local override is fine via a Gradle property the developer can pass:
failOnStabilityChange.set(
providers.gradleProperty("composeStabilityStrict").orNull?.toBoolean() ?: true
)# Local fast iteration — opt out explicitly per invocation
./gradlew :app:stabilityCheck -PcomposeStabilityStrict=false# RIGHT — earlier signal, single workflow run
- run: ./gradlew assemble :app:stabilityCheck# WRONG — separate jobs split signal
jobs:
assemble:
steps: [./gradlew assemble]
stability:
needs: assemble
steps: [./gradlew :app:stabilityCheck]# WRONG because: the stability job re-resolves dependencies and re-runs Compose compilation
# from scratch, doubling CI time and delaying the failure signal. Same job, single Gradle daemon.@TraceRecomposition at runtimeThe plugin proves a class is classified stable. It does not prove the running app actually recomposes less. Pair the CI gate with runtime tracing (see ../../measurement/tracing-recompositions-at-runtime/SKILL.md) so the team has both signals: compile-time classification stability and runtime recomposition counts. A green CI gate with rising recomposition counts means a runtime-only invalidation source (e.g. a misplaced mutableStateOf read) that classification cannot catch.
.stability baseline file(s) to version control. A baseline that lives in build/ is not a baseline.failOnStabilityChange.set(true) in the committed Gradle config so CI blocks merges on regression. Local opt-out via a Gradle property is acceptable; committing false is not.ignoredPackages / ignoredClasses without a one-line comment explaining why. Unjustified ignores are how stability silently rots back in.../diagnosing-compose-stability/SKILL.md and ../stabilizing-compose-types/SKILL.md first; baseline only what the team is willing to defend.:app. A regression in a feature module is invisible to a :app-only check until the feature is wired into the main graph.:stabilityCheck in the same CI job as compile, behind assemble. Earlier signal, one Gradle daemon, half the wall-clock time.stabilityConfigurationFiles at the same stability_config.conf the Compose compiler reads, so the plugin and the compiler agree on classifications.Stability is a contract, not a magic spell — and the CI gate is the contract enforcer. Skippability is a diagnostic, not a KPI: the goal is "no regressions from the baseline the team agreed on", not "100% skippable".
composeStabilityAnalyzer plugin block present in every UI module's build.gradle.kts.app/stability/ (or the configured outputDir) is committed to the repo and contains at least one .stability file per shipping variant.failOnStabilityChange.set(true) is the committed default../gradlew :app:stabilityCheck (or the equivalent module path) on every pull request.val to var in a shared data class on a throwaway branch, push, and confirm the PR check turns red with the regressed composable named in the failure output. Revert the test change.ignoredPackages and ignoredClasses has a comment explaining why it is exempt../gradlew :app:stabilityDump locally, the only changes (if any) are in the .stability files and are reviewable as plain text.For runtime correlation of CI-green stability with actual recomposition counts, see ../../measurement/tracing-recompositions-at-runtime/SKILL.md. For the conceptual classification model that determines what stabilityCheck is checking, see ../understanding-stability-inference/SKILL.md. For the upstream type fixes that resolve regressions surfaced by the gate, see ../stabilizing-compose-types/SKILL.md.
© rosuH, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/enforcing-stability-in-ci of rosuH/EasyWatermark.
Open the folder on GitHubat commit 61223db
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in rosuH/EasyWatermark, which our catalogue first saw on October 7, 2026.
Enforcing Stability In CI next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Enforcing Stability In CI this skillrosuH/EasyWatermark | 1.9k | 1 repos | ~4k | Automated safety check: Pass | Apache-2.0 | |
| GitHub Workflowsamirisback/automated-build-android-app-with-github-action | 346 | — | ~550 | Automated safety check: Pass | Apache-2.0 | |
| Capturing Preview Screenshots In CIskydoves/android-testing-skills | 334 | — | ~4.5k | Automated safety check: Notes | Apache-2.0 | |
| GitHub Actionscallstackincubator/agent-skills | 1.7k | 1 repos | ~703 | Automated safety check: Pass | MIT | |
| Review Dependenciestobihagemann/turbo | 408 | — | ~1.5k | Automated safety check: Pass | MIT | |
| npm Package Publisherklaudworks/universal-skills | 181 | — | ~923 | Automated safety check: Pass | MIT |
amirisback/automated-build-android-app-with-github-action
Manage and automate Android CI/CD workflows using GitHub Actions in this repository.
skydoves/android-testing-skills
A skill your agent uses to render every Jetpack Compose @Preview as a screenshot on a real Android device or emulator and publish a browsable HTML catalog from CI.
callstackincubator/agent-skills
GitHub Actions workflow patterns for React Native iOS simulator and Android emulator cloud builds with downloadable artifacts.
tobihagemann/turbo
Detect package managers and CI action pins, then discover outdated or vulnerable dependencies.
klaudworks/universal-skills
Releases an npm package by committing changes, bumping the version with npm version, pushing the tag and checking the GitHub Actions publish.
liaohch3/claude-tap
Pushes the current work to GitHub and, when pending commits change code, bumps the version in pyproject.toml so CI publishes a new PyPI release.
rosuH/EasyWatermark
A skill your agent uses to push frequently-changing Jetpack Compose state reads (scroll position, animation values, drag offsets) out of the Composition phase and down into Layout or Draw using…
rosuH/EasyWatermark
A skill your agent uses to diagnose Jetpack Compose stability problems by enabling and reading the Compose Compiler Reports (classes.txt, composables.txt, composables.csv, module.json).
rosuH/EasyWatermark
A skill your agent uses to generate and measure Jetpack Compose Baseline Profiles end-to-end with the AGP 8.2+ Baseline Profile Generator module and the Macrobenchmark harness.
rosuH/EasyWatermark
A skill your agent uses to author new custom Jetpack Compose modifiers and migrate legacy ones from Modifier.composed { } to Modifier.Node + ModifierNodeElement<T.
rosuH/EasyWatermark
A skill your agent uses to fix unstable Jetpack Compose types once a stability diagnosis has identified them.
rosuH/EasyWatermark
A skill your agent uses to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable.
Works with
Categories
A skill your agent uses to set up a CI gate that fails the build when Compose stability silently regresses, using the skydoves/compose-stability-analyzer Gradle plugin (primary) or the…. Enforcing Stability In CI is an agent skill from rosuH/EasyWatermark. Use this skill to set up a CI gate that fails the build when Compose stability silently regresses, using the skydoves/compose-stability-analyzer Gradle plugin (primary) or the j-roskopf/ComposeGuard plugin (alternative for non-Android multiplatform).
Enforcing Stability In CI fits situations like: set up a CI gate that fails the build when Compose stability silently regresses; using the skydoves/compose-stability-analyzer Gradle plugin (primary); the j-roskopf/ComposeGuard plugin (alternative for non-Android multiplatform); the team wants a stability SLO.
Run `npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a claude-code`. Or copy the skill folder (.agents/skills/enforcing-stability-in-ci in rosuH/EasyWatermark) into .claude/skills/enforcing-stability-in-ci in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a codex`. Or copy the skill folder (.agents/skills/enforcing-stability-in-ci in rosuH/EasyWatermark) into .agents/skills/enforcing-stability-in-ci in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rosuH/EasyWatermark --skill enforcing-stability-in-ci -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/enforcing-stability-in-ci, .gemini/skills/enforcing-stability-in-ci, .github/skills/enforcing-stability-in-ci and .opencode/skills/enforcing-stability-in-ci in your project.
Going by SKILL.md and its folder, Enforcing Stability In CI needs the command-line tools its instructions call (git).
SKILL.md names 4 domains. As links in the text: github.com, developer.android.com, medium.com and chrisbanes.me. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Enforcing Stability In CI is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Enforcing Stability In CI: GitHub Workflows (amirisback/automated-build-android-app-with-github-action, 346 stars), Capturing Preview Screenshots In CI (skydoves/android-testing-skills, 334 stars), GitHub Actions (callstackincubator/agent-skills, 1.7k stars) and Review Dependencies (tobihagemann/turbo, 408 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rosuH (a GitHub user) maintains it in rosuH/EasyWatermark, which has 1,895 GitHub stars. The repository holds 28 skills in this directory. The repository was last updated on October 10, 2026.
Source: rosuH/EasyWatermark on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.