team-money
Skills and tools for the Money team at Personio.
Installation
claude plugin install team-money@personio-claude-code-marketplace
What does this plugin do?
A home for Claude Code skills contributed by the Money team. Each skill names the repo, service, or product area it applies to — open any SKILL.md or read the per-skill sections below to see the scope.
money-new-gofer
Walks you through creating a new sealed GraphQL operation and the matching generated hooks, types, mocks, and handlers in the compensation-management area of personio-web.
What you need:
- Both
personio-webanddata-registryrepos cloned locally - Backend API deployed in
dev - The
./fmlCLI available inpersonio-web
Quick Start:
"Walk me through adding a new sealed query for the salary tab"
Example:
You want a new query that returns an employee's salary history. The skill will:
- Direct you to prototype the operation in GraphiQL (Dev).
- Tell you the exact
data-registrypath:src/graphql/queries/compensation-management/<OperationName>.query. - Run
./fml generate -sop <absolute-path>frompersonio-webto generate the hook, types, mocks, and handlers. - Remind you that two PRs are needed — one in
data-registry, one inpersonio-web— and that sealed operations are immutable once deployed.
Why would you want this?
- Skip the documentation hunt — every step, path, and constraint pre-loaded in one place.
- Avoid the legacy trap — the skill steers you away from
data/graphql/(old manual codegen). - Fewer review round-trips — the two-PR flow and immutability constraint are surfaced upfront.
money-routing
Client-side routing and navigation for compensation-management routes in personio-web. Covers navigation hooks, search params, and the whiteListedRoutes.ts gotcha when adding new orchestrator routes.
What you need:
- Running from the
personio-webrepo - Access to
libs/orchestrator-common/src/hooks/whiteListedRoutes.tswhen adding new routes
Quick Start:
"I'm adding a new orchestrator route under /compensation/reports — what do I need to know?"
Example:
You add a new route and everything works when you visit it directly, but SPA navigation from another page triggers a full reload. The skill immediately points to whiteListedRoutes.ts as the fix, and tells you which navigation hook package serves your route (compensation-management/hooks/routing/ for /salary/employee-salary/*, etc.).
Why would you want this?
- Stop forgetting
whiteListedRoutes.ts— the single most common Money-team routing bug, pre-flagged every time. - Hook-package map at a glance — no more guessing whether navigation logic belongs in
hooks/navigation/,hooks/routing/, orhooks/settings-compensation-types-navigation/. - Orchestrator authoring rules linked —
.cursor/rules/orchestrator.mdcis surfaced so you don't missFederatedLoader/PersonioPageconventions.
money-unit-test-context
Pre-loads compensation-management-specific unit testing context: translation namespaces constant, gofer handler/mock paths (generated + custom), and canonical example files to copy patterns from.
What you need:
- Running from the
personio-webrepo - Familiarity with MSW,
renderWithWrapper, and Testing Library
Quick Start:
"Write a unit test for my new compensation-management form that calls a gofer mutation"
Example:
You need a test for a form + mutation. The skill tells you:
- Read
.cursor/rules/testing.mdcand.cursor/rules/testing-with-apis.mdcfirst. - Use
COMPENSATION_MANAGEMENT_TRANSLATION_NAMESPACES(don't list namespaces by hand). - Copy the pattern from
features/extra-pay-form/src/__tests__/ExtraPayForm.test.tsx. - Override a handler with
server.use(...)from@personio-web/compensation-management-gofer/test-utilswhen testing error flows.
Why would you want this?
- Zero pattern-discovery — canonical examples for form+mutation, complex rendering, and hook tests are named upfront.
- No translation-setup flakiness — the shared namespaces constant prevents missing-key test failures.
- Handlers and mocks mapped — generated vs custom, gofer vs legacy
data/graphql/— all the right paths.
money-pre-pr-review
Pre-PR self-review for Money team changes. Runs a four-principle behavioural check on your staged/committed diff (scope, simplicity, surgical changes, goal-driven) and flags what a human reviewer would nitpick — before you push.
Shipped here to validate team value. May graduate to a general-tier plugin once we've confirmed the content is broadly useful outside Money.
What you need:
- A branch with staged or committed changes, diverged from
origin/main gitCLI access
Quick Start:
"Review my diff before I open the PR"
Example:
You've finished a ticket and are about to push. The skill runs git diff origin/main...HEAD, then reports one block per principle:
### Scope
- ✅ Clean — all changes in features/extra-pay-form/ tie to SAL-1234
- ⚠️ utils/date-helpers.ts:42 — quote-style change unrelated to ticket
### Simplicity
- ⚠️ features/extra-pay-form/ExtraPayForm.tsx:88 — FormFieldFactory has one caller; inline would be simpler
### Surgical changes
- ✅ Clean
### Goal-driven
- ⚠️ useSalaryBand.ts:24 bug fix has no regression test
It ends by asking whether to revert or simplify any of the findings — it never auto-fixes. Some warnings are intentional trade-offs you want to keep.
Why would you want this?
- Catches what reviewers nitpick — drive-by refactors, speculative abstractions, missing regression tests.
- Based on Karpathy's four principles — proven framework for spotting LLM-coding pitfalls.
- You stay in control — findings are reported, never silently reverted.
money-add-translations
End-to-end workflow for adding missing translations in compensation-management (and the legacy employee-salary-tab mFE) in personio-web. Scans for hardcoded strings and translation markers, replaces them with the correct t() / useTranslation hooks, generates a Phrase-ready upload JSON, and then guides you through Phrase import and translation job creation step by step.
What you need:
- Running from the
personio-webrepo with a clean git working tree (the skill hard-stops on uncommitted changes) - Atlassian MCP authenticated (
claude.ai Atlassian) — used to fetch the live Phrase workflow steps from Confluence. A built-in fallback is provided if the MCP is unavailable.
Quick Start:
"Add translations for SAL-1234"
"Set up i18n for the new base-pay form"
"I already have a JSON uploaded — just walk me through the Phrase job"
"money-add-translations --help"
Example:
You're implementing a new base-pay editing form (SAL-1234) and have added several hardcoded English strings with // SAL-1234 markers. The skill will:
- Run
git status --porcelain— refuses if uncommitted changes are present. - Delegate a read-only scan to an Explore subagent, classifying every match: ticket-tagged strings (auto-included), generic markers, bare TODOs near UI strings, untagged hardcoded literals, and existing
t()calls with missing keys. - Present the scan summary and ask you to confirm which flagged entries to include.
- Propose translation keys following existing namespace conventions — shows you a tree-slice preview of where each key lands, deduplicates identical strings, and asks before assigning shared keys.
- Show a unified diff preview and apply edits: imports
useTranslation/useMFETranslation, replaces literals witht()calls or<Translate>for HTML strings, cleans up markers, checkspackage.jsondeps. - Run lint and type-check; rolls back all edits automatically if either fails.
- Generate
/tmp/money-add-translations-SAL-1234.json, open it in Finder, and walk you through uploading it to Phrase (Section A from the Confluence workflow page). - Guide you through creating and starting the translation job (Section B/C).
Why would you want this?
- No documentation hunting — the full seven-phase workflow, namespace rules, hook patterns for both comp-management and legacy mFE, and Phrase import steps are loaded in one place.
- Legacy mFE detection is automatic — files under
apps/employee-salary-tab/frontend/switch touseMFETranslation/getMFETranslation/ localTranslatewithout any flags. - Key reuse prevents fragmentation — before creating a new key the skill checks
translations.jsonfor an exact match. If the match is in a directly usable namespace (compensation,compensation-management,employee-salary-tab) the key is reused as-is and never re-uploaded. If the match is in a read-only or foreign namespace (e.g.design-system,benefits-deductions), the skill surfaces a Phrase-duplicate suggestion so existing translations carry over to the new key automatically. - Safe by default — dirty-tree hard stop, lint/type-check gate with automatic rollback, and an explicit "safe to commit?" checkpoint before Phase 5 ensure you can't accidentally push broken code.
Contributing a skill to team-money
Anyone on the Money team can add a skill to this plugin. To keep it coherent as it grows across repos and disciplines:
- Prefix skill names with
money-to avoid global collisions with other plugins' skills. - The skill's
descriptionfrontmatter must name the repo, service, or product area it applies to (e.g. "... in thepersonio-webrepo", "... incompensation-service"). This is what lets Claude route prompts correctly when skills cover different contexts. - Add trigger and output evals under
skills/<skill-name>/evals/— see the evals README for format and thresholds. - Don't restrict to a single discipline — BE, FE, data, design-system, and QA skills are all welcome as long as they serve the Money team.