skills
CLAUDE.md4 starsChanged 9 months agoMITView on GitHub
skills/ is the source of truth; plugins/cirra-ai-sf/skills/ is a generated mirror. scripts/sync-plugin-skills.sh copies each skill (plus shared assets/ and references/) into both the mirror and the skill's own source dir. Every workflow that commits after a sync stages plugins/ AND skills/ — staging only skills/*/assets/ used to leave skills/*/references/ uncommitted, which kept the mirror perpetually "out of sync" and broke Publish All. Two manual workflow_dispatch publish paths, both of which run the sync, commit, and cut a GitHub release v<version>…
- Installs packages
In this repository16 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .github/copilot-instructions.mdCopilot instructions
- sf-apexSkill
- sf-auditSkill
- sf-cmsSkill
- sf-connect-restSkill
- sf-dataSkill
- sf-diagramSkill
- sf-flowSkill
- sf-help-fetchSkill
- sf-kugamonSkill
- sf-lwcSkill
- sf-metadataSkill
- sf-ordersSkill
- sf-permissionsSkill
- sf-provisioningSkill
The file
We split this CLAUDE.md into the rules it gives an agent
9 rules. About 0 are common, 3 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 5
Always fix pre-existing errors: If you encounter failing tests, lint errors, or broken imports that existed before your change, fix them as …
- Very specific: line 29
After a PR merges, sync-plugins.yml also runs the sync on main and commits any mirror/asset/ reference updates automatically.
- Very specific: line 45
When a PR modifies one or more skills under skills/, before pushing:
- Very specific: line 52
Do not bump the top-level plugin version in plugins/cirra-ai-sf/.claude-plugin/plugin.json from a routine PR — that's owned by the manual …
- Distinctive: line 56
When a reviewer (human or bot, including Copilot) leaves a review comment on a PR, always post a reply explaining what was done — even when:
- Distinctive: line 69
If a comment doesn't need code changes, still reply briefly stating why (e.g.
- Very specific: line 74
Before running tests, ensure Python dev dependencies from requirements-dev.txt are installed:
- Very specific: line 90
Run npm run lint and fix any issues (npx prettier --write <files> / ruff check --fix .)
- Very specific: line 91
Run pytest tests/ -v and pytest skills/*/tests/ -v and ensure all tests pass
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CLAUDE.md
General principles
- Always fix pre-existing errors. If you encounter failing tests, lint errors, or broken imports that existed before your change, fix them as part of your work. Do not dismiss them as "pre-existing" or "not related to my change."
- Always reply to every PR review comment. When addressing PR review feedback, you are NOT DONE until every single review comment has a reply on GitHub (via
add_reply_to_pull_request_comment). Do not just fix the code — you must also post a reply to each comment explaining what you did or why no change is needed. Then resolve the threads if possible. - Always bump skill versions on any PR that modifies a skill. Any PR that adds, removes, or changes files under
skills/<skill-name>/MUST bump that skill'smetadata.versioninskills/<skill-name>/SKILL.md(patch bump by default; minor for new features; major for breaking changes). Do not editplugins/cirra-ai-sf/skills/<skill-name>/SKILL.mddirectly — it is a generated mirror andsync-plugins.ymlpropagates the bump after merge. Do this on every skill the PR touches. Thepublish-skill.ymlworkflow is manual-only (workflow_dispatch) and does not run on PR merges, so it cannot be relied on to bump versions for routine PRs.
Publishing (how a skill reaches the marketplace)
skills/ is the source of truth; plugins/cirra-ai-sf/skills/ is a generated mirror.
scripts/sync-plugin-skills.sh copies each skill (plus shared assets/ and references/)
into both the mirror and the skill's own source dir. Every workflow that commits after a
sync stages plugins/ AND skills/ — staging only skills/*/assets/ used to leave
skills/*/references/ uncommitted, which kept the mirror perpetually "out of sync" and broke
Publish All.
Two manual workflow_dispatch publish paths, both of which run the sync, commit, and cut a
GitHub release v<version> (the release event triggers package-plugins.yml to build the
.skill/.zip artifacts and deploy the production downloads site):
- Publish All (
publish-all.yml) — bumps the plugin/marketplace version and publishes the wholecirra-ai-sfplugin. It performs the sync itself, so it works even if the mirror drifted. Use this as the default "just publish everything" button. - Publish Skill (
publish-skill.yml) — bumps one skill + the plugin patch and publishes. Theskillinput is free text (any directory underskills/), validated by a step; there is no hardcoded dropdown to keep in sync.
After a PR merges, sync-plugins.yml also runs the sync on main and commits any mirror/asset/
reference updates automatically.
Skill authoring — avoid these shipped-broken mistakes
These have broken published skills. Verify every one before pushing a skill change:
SKILL.mddescriptionmust be plain text — NO XML/HTML tags or angle brackets<…>. The skill loader rejects a description containing<…>with the error "SKILL.md description cannot contain XML tags", and the downloads page then renders a blank description. Use[…]or{…}for placeholders in bothdescriptionandargument-hint(e.g.[article-url|topic-id]), never<…>. Note:scripts/validate-skills.shdoes NOT catch this today — check it by eye.- Every new skill must be added to the top-level
README.mdskills table (with a link to the skill's ownREADME.md), and must ship askills/<skill-name>/README.md. A skill missing from the README is effectively invisible to users. - Never write a bare
Object__c/Field__c/__r/__mdtin Markdown prose or tables. A pair of__is Markdown strong-emphasis, soprettier --write(which every push runs) silently rewritesAmount__c to Invoice__cintoAmount**c to Invoice**c— a wrong API name, rendered as bold. This has shipped broken API names in published docs more than once. Prefer backticks (`Invoice__c`— emphasis doesn't apply inside a code span, so prettier leaves it alone); in plain text, escape both pairs (Invoice\_\_c). Re-runnpx prettier --writeafter editing and confirm nothing turned into**. This one is enforced:scripts/validate-skills.shfails on a corrupted name anywhere underskills/, so CI catches it. Check a tree yourself withpython3 scripts/check_md_api_names.py(defaults toskills/; pass.for the whole repo). The checker reads prose only — matches inside code spans and fenced blocks are ignored, since emphasis doesn't apply there — and honors anmd-api-names: allowHTML comment on the offending line or the one above. - Every MCP tool call in a skill must match the Cirra AI MCP Server schema.
soql_queryandtooling_api_querytakesObject,fieldsandwhereClause(all required;orderBy/limit/groupByare separate parameters and there is noquery=string);sobject_dmldelete takesrecordIds, notrecords; there is noorgAliasparameter. The canonical signatures live inshared/references/cirra-mcp-tools.md— link it from the skill rather than re-describing tools. Enforced:scripts/validate-skills.shrunsscripts/check_mcp_signatures.pyon every skill (fenced blocks and inline code only); an example that shows a wrong call on purpose can carry anmcp-signatures: allowHTML comment on the line above.
(AGENTS.md carries the same authoring checklist for non-Claude agents — keep the two in sync.)
Version bumping for PRs that modify skills
When a PR modifies one or more skills under skills/, before pushing:
- For each modified skill, edit
skills/<skill-name>/SKILL.mdand bumpmetadata.versionin the YAML frontmatter:- Patch (
2.0.2→2.0.3) — bug fixes, validator improvements, documentation, new tests. - Minor (
2.0.2→2.1.0) — new functionality, new workflows, new reference docs. - Major (
2.0.2→3.0.0) — breaking changes to the public skill contract (renamed commands, removed features, incompatible input formats).
- Patch (
- Do not edit the plugin mirror at
plugins/cirra-ai-sf/skills/<skill-name>/SKILL.md. That tree is generated — thesync-plugins.ymlworkflow runs after merge tomain, executesscripts/sync-plugin-skills.sh, and propagates the version bump (and any other source changes) intoplugins/automatically. Direct edits will be overwritten and add noise to PR diffs. - Do not bump the top-level plugin version in
plugins/cirra-ai-sf/.claude-plugin/plugin.jsonfrom a routine PR — that's owned by the manualpublish-skill.yml/publish-all.ymlworkflows.
Always reply to PR review comments
When a reviewer (human or bot, including Copilot) leaves a review comment on a PR, always post a reply explaining what was done — even when:
- the comment was addressed in a follow-up commit,
- the comment was rejected with reasoning,
- the comment is a non-actionable nit and just needs acknowledgement,
- I can't resolve the thread myself.
A code change alone is not a reply. Use
mcp__github__add_reply_to_pull_request_comment (with the original comment's
ID) for every thread, before considering the review handled. Batch replies for
the same review into a single tool-call message when possible.
If a comment doesn't need code changes, still reply briefly stating why (e.g. "intentional — see X", "out of scope for this PR, tracked in #N").
Setup
Before running tests, ensure Python dev dependencies from requirements-dev.txt are installed:
python3 -m pip install -r requirements-dev.txt
uv tool install pytest --with jsonschema # alternative: adds pytest to PATH via uvRepository structure
skills/— Source of truth for all skill code (scripts, assets, references, tests).plugins/— Generated copies of skills packaged for distribution. Do NOT edit files here directly; changes will be overwritten. Always edit inskills/and let the build step copy toplugins/.tests/— Repo-root test directory for cross-skill tests (conftest.py lives here).skills/<skill-name>/tests/— Skill-specific tests. These importconftest.load_script()from the repo root.
Before every push
- Run
npm run lintand fix any issues (npx prettier --write <files>/ruff check --fix .) - Run
pytest tests/ -vandpytest skills/*/tests/ -vand ensure all tests pass
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

