Agent skill

Chamilo Feature Test Author

by chamilo in chamilo/chamilo-lms

Turns a plain-language Chamilo feature description into a Playwright and Gherkin test suite confirmed against the live app, not just the source code.

GPL-3.0Auto-check passedTesting & QA

Install Chamilo Feature Test Author

skills CLI
$ npx skills add chamilo/chamilo-lms --skill add-feature-test -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install chamilo/chamilo-lms add-feature-test --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/chamilo/chamilo-lms.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-feature-test .claude/skills/add-feature-test && rm -rf skills-src

Use ~/.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/

Facts

Skill name
add-feature-test
GitHub stars
1k
Token cost
~3.6k tokens
SKILL.md length
1,922 words
Files
1
Skills in repo
5
Repo updated
First seen
Licence
GPL-3.0

At a glance

Turns a plain-language Chamilo feature description into a Playwright and Gherkin test suite confirmed against the live app, not just the source code.

  • Works in 9 steps: Get the feature description straight → Locate the current implementation → Check for existing coverage (don't… → …
  • Adding Playwright test coverage for an existing Chamilo feature
  • SKILL.md covers Step 0 — Get the feature…, Step 1 — Locate the current…, Step 2 — Check for existing… and Step 3 — Get a safe place to…, plus 5 more sections
  • Calls git and curl

What it does

The skill exists because reading source alone gets selectors, field names and even which page is actually live wrong often enough that every such claim must be confirmed against a running instance first. If a description could point at more than one page, such as a feature that exists both as a legacy tool and a newer Vue equivalent, it asks which one before doing any real work.

Locating the implementation means searching both possible homes, since the codebase is mid-migration: legacy PHP under public/main, or a Vue SPA under assets/vue. A course-tool link can be silently repointed to a new Vue route while the old URL still technically loads, so the skill checks the actual route target rather than assuming, and treats a dead legacy stub that only redirects as a fresh-scenario case to be written against the current page's real intent, not the old flow.

Scope is deliberately wide-ranging rather than exhaustive: cover the feature's real create, read, update and delete flows and the role-based access variants a normal user would actually hit, and skip combinatorial platform-setting states or contrived edge cases nobody would realistically trigger. A check for existing coverage comes before writing anything new, to avoid duplicating a test that already exists.

When your agent uses it

  • Adding Playwright test coverage for an existing Chamilo feature
  • Confirming a feature still works after the legacy-to-Vue migration
  • Writing tests against a feature's real create, read, update and delete flows

Example prompts

  • “Add tests for the Agenda tool using /add-feature-test.”
  • “Write test coverage for creating a session, confirmed against the live app.”
  • “Add a Playwright test for the document manager's delete flow.”

Requirements

  • A running Chamilo instance to confirm selectors and behavior against
  • Playwright

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Get the feature description straight
  2. Locate the current implementation
  3. Check for existing coverage (don't duplicate)
  4. Get a safe place to test
  5. Explore the live UI (this is the core of the skill)
  6. Known landmines (read before writing new steps)
  7. Write the feature file
  8. Verify against the live instance
  9. Report

What it can do on your machine

Read from SKILL.md and the folder at commit c3b9c05. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git and curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Chamilo Feature Test Author loads about 3.6k tokens when it runs. Until then it costs about 150 tokens; SKILL.md has 1,922 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~150
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from chamilo/chamilo-lms at commit c3b9c05, republished under its GPL-3.0 licence (© chamilo). 1,922 words, ~3,553 tokens.

Download SKILL.mdSave it as .claude/skills/add-feature-test/SKILL.md (or your agent's skills folder).
name
add-feature-test
description
Given a plain-language description of an EXISTING Chamilo feature (a tool, a form, an admin page — anything reachable in the running app), locate its current implementation (legacy PHP or Vue SPA), explore the live rendered UI to confirm real selectors/behavior, and author a complete, non-duplicating Playwright/Gherkin test suite for it in tests/playwright/features/. Use when the user describes a feature and asks for test coverage, wants to "add tests for X", asks to confirm a feature "keeps working", or runs /add-feature-test. Companion to the Playwright section of CLAUDE.md.

Add Feature Test

Turn a plain-language feature description into a Playwright/Gherkin test suite that actually reflects the live application — not assumptions from reading source code alone. Static code reading gets selectors, field names, dialog types, and even which page is actually live wrong often enough that every one of those claims must be confirmed against a running instance before it goes into a test.

Scope, per the user's own framing: wide-ranging, not exhaustive. Cover the feature's real create/read/update/delete flows and role-based access variants that a normal user would actually hit. Do not chase combinatorial platform- setting states or contrived edge cases nobody would realistically trigger.


Step 0 — Get the feature description straight

If the description could point at more than one page (a feature that exists both as a legacy tool and a parallel/newer Vue equivalent, or a name that's ambiguous inside Chamilo's domain), ask which one before doing any real work. Otherwise proceed — most descriptions ("the Agenda tool", "creating a session", "the document manager") are unambiguous enough to just go find.

Step 1 — Locate the current implementation

Search BOTH possible homes — this codebase is mid-migration and a feature can live in either, or have moved without every caller being updated:

  • Legacy PHP: public/main/<domain>/*.php, public/main/inc/lib/*.lib.php for the form-building logic.
  • Vue SPA: assets/vue/views/<domain>/*.vue, assets/vue/router/<domain>.js.

If both exist, determine which is actually reachable in the live app — course-tool links and admin-panel entries have been silently repointed to a new Vue route while the old URL still technically loads (toolAnnouncement's announcement tool is exactly this: direct URL still hits the legacy page, but the course-tool link now goes to /resources/announcement/:id). Don't assume; check src/CoreBundle/Tool/*.php / grep the link's actual href/route target.

If the legacy page is now a dead stub (header('Location: ...'); exit; or similar), this is a fresh-scenario case, not a port — write scenarios against the current Vue page's real intent, not the old page's old flow. class.feature's rewrite of the dead usergroups.php → UsergroupList.vue and toolDocument.feature's full rewrite against the Vue Document tool are the reference examples for this.

Step 2 — Check for existing coverage (don't duplicate)

  1. tests/playwright/features/*.feature — if a file for this feature already exists, this is an EXTEND task: read it fully, understand what it already covers, and only add what's missing (new scenarios, new roles, edge cases) rather than starting over or duplicating scenarios.
  2. The deleted Behat suite — the files are in git history (git show 98c77757ea6:tests/behat/features/<name>.feature; git ls-tree -r --name-only 98c77757ea6 tests/behat for the list, 84 files at that commit). If a same-topic file existed there, it's a hint of intended scenarios (what create/edit/delete flows the original author thought mattered) — never a source of truth for selectors. Every field name, button label, and dialog type it assumes must still be verified live in Step 4; those files rotted constantly (name→title renames, dead pages, changed widgets, typo'd step phrases that never even matched in the original suite).
  3. If genuinely new (nothing in either place — e.g. a feature added since then), design scenarios from CLAUDE.md's own mandatory rule (it applies here too): cover create/read/update/delete at minimum; run the full scenario set once per role if the page is reachable by more than one role; add an explicit access-denied scenario for role-restricted pages.

Step 3 — Get a safe place to test

Prefer a disposable, dedicated fresh install where creating/deleting data freely is fine — ask the user if one exists for this repo (one may already be set up as a separate vhost/DB pointed at this exact worktree). Confirm:

  • It's actually serving this worktree's code, not a shared box serving a different branch. A vhost DocumentRoot edit alone is not enough — the web server process must also be reloaded to pick it up. Verify with a plain marker file (echo x > public/marker.txt && curl .../marker.txt) before trusting ANY test result against it — a stale-server false-positive/negative wastes the rest of the session's work.
  • The one-time seed sequence has run if the feature needs course context (package.json's test:playwright:seed → :seed-course → :seed-private-course → :seed-settings, in that order — creates the test users, the TEMP/TEMPPRIVATE courses most course-tool features assume exist, and the settings some scenarios assume are enabled).

If no such environment is available and only a shared/production-like box exists, get explicit confirmation before creating or deleting ANY data there, and prefer read-only verification (log in, look, don't submit forms) until that's granted.

Step 4 — Explore the live UI (this is the core of the skill)

Log in as the relevant role(s) and physically use the feature. For anything non-trivial (a form with more than plain text inputs, any delete/confirm action, any grid), don't just eyeball it in a browser — write a short, disposable Node script using the already-installed playwright package to log in, navigate, and dump the actual DOM: field id/name attributes, button structure and title/aria-label, dialog markup, icon classes. This is dramatically faster and more reliable than reading PHP/Vue source and guessing what renders — this migration's own history is full of cases where the source looked like it would produce one thing and the live DOM showed another (QuickForm's id prefixing by form name while name stays unprefixed; a "Save" button that's actually a disabled TinyMCE toolbar button sharing the same accessible name; an icon-only button whose only identifier is a title attribute; a jqGrid "select all" checkbox that visually toggles but does nothing if data rows haven't loaded yet).

Specifically confirm, don't assume:

  • Form fields: plain input, or one of the richer widgets below?
  • Multi-value fields: a plain <select>, an AJAX/Select2 search (FormValidator::addSelectAjax), or a dual-listbox multiselect (FormValidator::addMultiSelect — two <select>s, left = available, right = <name>_to = actually submitted, empty until JS moves an option across)?
  • Rich text fields: legacy pages use TinyMCE via window.setContentFromEditor(id, content); Vue pages use BaseTinyEditor (@tinymce/tinymce-vue) which needs a change event fired after setContent() to reach v-model. Different steps in tests/playwright/steps/common.steps.ts handle each — check which applies.
  • Date/time pickers: PrimeVue's <Calendar>/<DatePicker> (BaseCalendar.vue) is genuinely readonly — no keyboard entry works at all, and its time picker is increment/decrement buttons only, impractical to drive to an exact value. If the field already defaults to a sane current value when opened, prefer relying on that default over trying to set an exact one.
  • Delete/destructive confirmation — there are at least four distinct mechanisms in this codebase; identify which one before writing the step: native browser confirm(), SweetAlert2, a PrimeVue ConfirmDialog (labels vary — "Yes"/"No", "Confirm"/plain button text — read the actual rendered buttons), or jqGrid's own built-in del dialog (its buttons are <a role="button" class="fm-button">, not real <button> elements).
  • Row actions on a table with other pre-existing data: never blind .first() a delete/edit icon unless the page is guaranteed to start with zero rows. Scope by the row's own identifying text.

Clean up any data created purely for this exploration before moving to Step 6.

Show full SKILL.md (807 more words)Show less

Step 5 — Known landmines (read before writing new steps)

Read resolveField() and pressButton() in tests/playwright/steps/common.steps.ts first — most field/button interactions are already covered by their id → name → label/role → text cascades, including hard-won fixes for: PrimeVue icon+label buttons breaking exact accessible-name matching, TinyMCE toolbar buttons sharing a label with the real submit button, jqGrid's fm-button dialogs, and app-shell chrome (e.g. a sidebar toggle) coincidentally sharing a button's label. Only add a new step when the interaction genuinely isn't covered — and when you do, document why with the same rationale-comment convention already used throughout that file (what was tried, what broke, what the live DOM actually showed), not just what the code does.

Other recurring traps to actively check for:

  • Never hardcode a numeric database ID unless it's backed by a dedicated, ordered, one-time seed step (this repo's TEMP course = cid 1, TEMPPRIVATE, the seeded test users). Anything else — a just-created group, attendance, document — capture the real ID dynamically (from a redirect URL or a lookup endpoint) and remember it for later steps, the same way already done for socialGroup's group id / toolAttendance's attendance id.
  • Transient toasts are not a valid assertion target. A flash/toast can legitimately not be in the DOM by the time an assertion polls, even when the underlying action succeeded. Assert a durable signal instead: a URL change, an inline alert with its own dismiss button, page content that only renders once the action truly landed.
  • "wait for the page to be loaded" is a no-op for dialog-based SPA actions where nothing navigates (most Vue create/edit/delete dialogs). Chaining several such actions back-to-back needs a durable "should not see X" between them, not a blind wait — otherwise the next lookup can race the previous action's still-in-flight refetch.
  • jqGrid's "select all" needs real data rows loaded first — clicking the header checkbox before the grid's own AJAX data call has rendered any rows toggles the checkbox's own visual state but selects nothing.
  • name → title field-rename drift recurs across pages migrated from 1.11.x — if a field name taken from an older test doesn't resolve, check for this exact rename before assuming something else changed.
  • Cross-file test interference on shared fixtures. Any feature touching the shared TEMP course (cid=1) can run concurrently, in a different worker, with any OTHER feature file also touching it — don't assume exclusive access to that course's data. If a cleanup/delete step in your new scenarios could plausibly race another file's read of the same resource, make it tolerate the target already being gone rather than hard-failing.

Step 6 — Write the feature file

  • Path: tests/playwright/features/<name>.feature, or under a domain subfolder (e.g. admin/) where one already exists for that area; keep the name the old Behat file used if a same-topic one existed.
  • Start with a header comment documenting what was actually verified live vs. assumed, and any real drift found from the old Behat scenario (if any) — this is a load-bearing convention in every existing file in this directory, not decoration. A future reader (including a future you) needs to know why a selector/assertion is what it is, not just what it is.
  • Reuse existing steps wherever the interaction pattern already exists; only extend common.steps.ts for genuinely new patterns (Step 5).
  • Structure scenarios per Step 2's coverage rule: create/read/update/delete at minimum, once per accessible role, plus an access-denied check for restricted pages. Skip anything that isn't a real, likely user path.
  • If a Vue form field is missing a name attribute (breaks the id→name→label cascade and violates this project's own CLAUDE.md convention), add the attribute directly — a small, safe, real fix, not a workaround.

Step 7 — Verify against the live instance

  • Regenerate after every .feature/step change: node_modules/.bin/bddgen --config=tests/playwright/playwright.config.ts
  • Run just the new feature file, not the full suite, unless the user asks for a broader regression: full-suite runs are expensive and add little once the targeted file is green.
  • Root-cause real failures from actual evidence (DOM dump, network trace) — never guess-and-retry blindly. If a fix touches shared step code (resolveField()/pressButton()/etc.), re-run at least one other already-passing feature file afterward to confirm no regression, since those helpers are used everywhere.
  • Clean up any test data left over from verification runs (the dev instance persists across sessions) before finishing.

Step 8 — Report

Summarize: scenarios added (and to which file — new or extended), any real product bugs found and fixed along the way (call these out explicitly, they're often more valuable than the tests themselves), local verification results, and — always — that local verification against a reused dev instance is not the same guarantee as a fresh CI run. A dev instance accumulates state (course subscriptions, leftover rows, prior test runs) that a genuinely fresh install never has, so a fix confirmed only locally can still be environment-specific and fail in CI. Say so plainly rather than implying local == done; the next CI run is the actual verification for anything state-sensitive.

© chamilo, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/add-feature-test of chamilo/chamilo-lms.

Open the folder on GitHubat commit c3b9c05

Compare with similar skills

Chamilo Feature Test Author 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.

Chamilo Feature Test Author compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Chamilo Feature Test Author this skillchamilo/chamilo-lms1k—~3.6kAutomated safety check: PassGPL-3.0
Write and Verify Playwright Testsappsmithorg/appsmith41k—~2.9kAutomated safety check: NotesApache-2.0
Playwright Component Testingmellowagain/gitarena1141 repos~2.6kAutomated safety check: PassMIT
Playwright Stealth Verifyliarjsdev/liarjs-skills5181 repos~1.3kAutomated safety check: NotesMIT
Site Bugfixdebs-obrien/debbie.codes142—~960Automated safety check: PassNone
Verify Debbie Codesdebs-obrien/debbie.codes142—~1.9kAutomated safety check: PassNone

Similar skills

  • Writes a Playwright end-to-end test from a prompt, runs it against a live Appsmith deployment and retries with fixes up to three times until it passes.

    41k GitHub stars~2.9k tokensUpdated today
    Testing & QAAuto-check: notes
  • Playwright Component Testing

    mellowagain/gitarena

    Set up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime.

    114 GitHub starsUsed in 1 repo~2.6k tokens
    Testing & QAAuto-check passed
  • Playwright Stealth Verify

    liarjsdev/liarjs-skills

    Check whether a Playwright, Puppeteer, Selenium or CDP-driven browser presents a coherent fingerprint, using liarjs as a library against a Page you already have - navigator.webdriver, HeadlessChrome…

    518 GitHub starsUsed in 1 repo~1.3k tokens
    Testing & QAAuto-check: notes
  • Site Bugfix

    debs-obrien/debbie.codes

    Reproduce and fix a debbie.codes site bug with browser proof and a Playwright regression when useful.

    142 GitHub stars~960 tokensUpdated 6 days ago
    Testing & QAAuto-check passed
  • Verify Debbie Codes

    debs-obrien/debbie.codes

    Drive the live debbie.codes Nuxt site (web UI) the way a user does via Playwright — launch the dev server, doctor health, exercise mapped features, capture screenshots/ARIA evidence, and clean up.

    142 GitHub stars~1.9k tokensUpdated 6 days ago
    Testing & QAAuto-check passed
  • Dev Webtest Plan

    classmethod/tsumiki

    This skill should be used when the user asks to "dev-webtest-plan", "Webテスト計画を生成", "テスト計画を作成", "webtest plan", "E2Eテスト計画", "画面テスト計画", "generate webtest plan", "create test plan from requirements"…

    974 GitHub stars~4.2k tokensUpdated 2 mo ago
    Testing & QAAuto-check passed

More from chamilo/chamilo-lms

  • Chamilo Theme From Site

    chamilo/chamilo-lms

    Creates a Chamilo color theme with a logo from a website's branding or from a logo file's dominant colors, entirely through the Chamilo REST API.

    1k GitHub stars~5.1k tokensUpdated today
    Auto-check passed
  • Chamilo Changelog Updater

    chamilo/chamilo-lms

    Adds commits for a new Chamilo release to the changelog page, classifying them into categories and skipping those already listed for that version.

    1k GitHub stars~4.2k tokensUpdated today
    Auto-check passed
  • Vue Route Breadcrumbs

    chamilo/chamilo-lms

    Gives a route in Chamilo's Vue app its breadcrumb entirely from router meta fields, without editing the Breadcrumb component or naming pages.

    1k GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Chamilo Vue Base Components

    chamilo/chamilo-lms

    Swaps native form elements in Chamilo Vue files for Base components and checks that every Base, SectionHeader and Fieldset tag has its import.

    1k GitHub stars~7.6k tokensUpdated today
    Auto-check: notes

Categories

Questions about Chamilo Feature Test Author

What does Chamilo Feature Test Author do?

Turns a plain-language Chamilo feature description into a Playwright and Gherkin test suite confirmed against the live app, not just the source code. The skill exists because reading source alone gets selectors, field names and even which page is actually live wrong often enough that every such claim must be confirmed against a running instance first. If a description could point at more than one page, such as a feature that exists both as a legacy tool and a newer Vue equivalent, it asks which one before doing any real work.

When should I use Chamilo Feature Test Author?

Chamilo Feature Test Author fits situations like: adding Playwright test coverage for an existing Chamilo feature; confirming a feature still works after the legacy-to-Vue migration; writing tests against a feature's real create, read, update and delete flows.

How do I install Chamilo Feature Test Author in Claude Code?

Run `npx skills add chamilo/chamilo-lms --skill add-feature-test -a claude-code`. Or copy the skill folder (.claude/skills/add-feature-test in chamilo/chamilo-lms) into .claude/skills/add-feature-test in your project. Claude Code loads it when a task matches its description.

How do I install Chamilo Feature Test Author in Codex?

Run `npx skills add chamilo/chamilo-lms --skill add-feature-test -a codex`. Or copy the skill folder (.claude/skills/add-feature-test in chamilo/chamilo-lms) into .agents/skills/add-feature-test in your project. Codex loads it when a task matches its description.

Can I use Chamilo Feature Test Author in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add chamilo/chamilo-lms --skill add-feature-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-feature-test, .gemini/skills/add-feature-test, .github/skills/add-feature-test and .opencode/skills/add-feature-test in your project.

What does Chamilo Feature Test Author need to run?

Going by SKILL.md and its folder, Chamilo Feature Test Author needs the command-line tools its instructions call (git and curl). Our summary lists: A running Chamilo instance to confirm selectors and behavior against; Playwright.

Does Chamilo Feature Test Author access the network?

SKILL.md contains no URLs. Its commands use git and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Chamilo Feature Test Author safe to install?

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.

What licence does Chamilo Feature Test Author use?

Chamilo Feature Test Author is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Chamilo Feature Test Author use?

About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Chamilo Feature Test Author?

Skills that share tags, products or a category with Chamilo Feature Test Author: Write and Verify Playwright Tests (appsmithorg/appsmith, 41k stars), Playwright Component Testing (mellowagain/gitarena, 114 stars), Playwright Stealth Verify (liarjsdev/liarjs-skills, 518 stars) and Site Bugfix (debs-obrien/debbie.codes, 142 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Chamilo Feature Test Author?

chamilo (a GitHub organization) maintains it in chamilo/chamilo-lms, which has 1,008 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 6, 2026.

Source: chamilo/chamilo-lms on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.