Bun
galfrevn/apollo
A skill your agent uses when building, running, testing, or bundling JavaScript/TypeScript applications.
Migrate a TypeScript/JavaScript codebase from @cashu/cashu-ts v2 to v4.
$ npx skills add shopstr-eng/shopstr --skill cashu-ts-migration -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install shopstr-eng/shopstr cashu-ts-migration --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/shopstr-eng/shopstr.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/cashu-ts-migration .claude/skills/cashu-ts-migration && 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 "cashu-ts-migration" agent skill from https://github.com/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migration into .claude/skills/cashu-ts-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cashu-ts-migration", 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/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migrationType 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 shopstr-eng/shopstr --skill cashu-ts-migration -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install shopstr-eng/shopstr cashu-ts-migration --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shopstr-eng/shopstr.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/cashu-ts-migration .agents/skills/cashu-ts-migration && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cashu-ts-migration" agent skill from https://github.com/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migration into .agents/skills/cashu-ts-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cashu-ts-migration", 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 shopstr-eng/shopstr --skill cashu-ts-migration -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install shopstr-eng/shopstr cashu-ts-migration --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shopstr-eng/shopstr.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/cashu-ts-migration .cursor/skills/cashu-ts-migration && 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 "cashu-ts-migration" agent skill from https://github.com/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migration into .cursor/skills/cashu-ts-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cashu-ts-migration", 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/shopstr-eng/shopstr.git --path .agents/skills/cashu-ts-migration--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 shopstr-eng/shopstr --skill cashu-ts-migration -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install shopstr-eng/shopstr cashu-ts-migration --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shopstr-eng/shopstr.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/cashu-ts-migration .gemini/skills/cashu-ts-migration && 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 "cashu-ts-migration" agent skill from https://github.com/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migration into .gemini/skills/cashu-ts-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cashu-ts-migration", 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 shopstr-eng/shopstr cashu-ts-migrationInstalls 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 shopstr-eng/shopstr --skill cashu-ts-migration -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/shopstr-eng/shopstr.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/cashu-ts-migration .github/skills/cashu-ts-migration && 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 "cashu-ts-migration" agent skill from https://github.com/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migration into .github/skills/cashu-ts-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cashu-ts-migration", 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 shopstr-eng/shopstr --skill cashu-ts-migration -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install shopstr-eng/shopstr cashu-ts-migration --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shopstr-eng/shopstr.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/cashu-ts-migration .opencode/skills/cashu-ts-migration && 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 "cashu-ts-migration" agent skill from https://github.com/shopstr-eng/shopstr/tree/main/.agents/skills/cashu-ts-migration into .opencode/skills/cashu-ts-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cashu-ts-migration", 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.
cashu-ts-migrationMigrate a TypeScript/JavaScript codebase from @cashu/cashu-ts v2 to v4.
Cashu TS Migration is an agent skill from shopstr-eng/shopstr. Migrate a TypeScript/JavaScript codebase from @cashu/cashu-ts v2 to v4. Use when bumping cashu-ts past 2.x to unlock v3+ Wallet ergonomics (rate-limit aware retries, Amount boundary type, KeyChain, BOLT-method-typed quote helpers). Covers import renames, deprecated method renames, removed constructor options, the Amount boundary, the new getDecodedToken(token, keysetIds) signature, runtime loadMint() requirement, and Jest mock updates.
Its SKILL.md is about 3.1k 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 Backend & APIs, covering Rate limiting. It works with Jest, JavaScript and TypeScript. The repository describes itself as: A global, permissionless Nostr marketplace for Bitcoin commerce. The licence is GPL-3.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit fcfc0bd. 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:
gitnpxnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npx and npm, which can reach the network depending on how they are called.
From 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.
Cashu TS Migration loads about 3.1k tokens when it runs. Until then it costs about 118 tokens; SKILL.md has 983 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 shopstr-eng/shopstr at commit fcfc0bd, republished under its GPL-3.0 licence (© shopstr-eng). 983 words, ~3,090 tokens.
.claude/skills/cashu-ts-migration/SKILL.md (or your agent's skills folder).@cashu/cashu-ts v2 → v4 Migrationcashu-ts v3 was a hard breaking change: classes were renamed (CashuMint/CashuWallet → Mint/Wallet), keysets moved into a KeyChain, all amounts became an opaque Amount class, mint/melt quote helpers were split per-payment-method (Bolt11/Bolt12), and wallets must be explicitly initialized with loadMint(). v4 layered additional API hardening on top. The authoritative migration guide ships in the package itself: read node_modules/@cashu/cashu-ts/migration-4.0.0.SKILL.md before starting.
node_modules/@cashu/cashu-ts/migration-4.0.0.SKILL.md end-to-end.package.json, run npm install.@noble/hashes ≥ v2: v2 dropped implicit .js extension resolution from ESM subpath imports. Sed-rename every from "@noble/hashes/utils" to from "@noble/hashes/utils.js" (and any other subpath you import). Skip and you get cryptic Next.js/Vite/Webpack module resolution errors that look like a cashu-ts problem.@cashu/crypto/modules/common was dropped: hashToCurve is re-exported from @cashu/cashu-ts itself. Replace import { hashToCurve } from "@cashu/crypto/modules/common" with import { hashToCurve } from "@cashu/cashu-ts".CashuMint and CashuWallet no longer exist. Use the new Mint / Wallet exports. Aliasing in the import line preserves every downstream call site:
// before
import { CashuMint, CashuWallet } from "@cashu/cashu-ts";
// after
import { Mint as CashuMint, Wallet as CashuWallet } from "@cashu/cashu-ts";This pattern lets new CashuMint(...) / new CashuWallet(...) keep working everywhere. Apply across all production AND test files.
The Wallet constructor no longer accepts { keys } (or other preload options). Construct the wallet with just the mint, then call loadMint():
// before
const wallet = new CashuWallet(mint, { keys: storedKeys });
// after
const wallet = new CashuWallet(mint);
await wallet.loadMint(); // hydrates mint info, keysets, keysAll quote-related wallet methods were split per payment method. For Lightning (the common case), append Bolt11. A bulk sed pass works because the names are unambiguous within wallet.X(:
| v2/early-v3 | v3+ / v4 |
|---|---|
wallet.createMintQuote( | wallet.createMintQuoteBolt11( |
wallet.checkMintQuote( | wallet.checkMintQuoteBolt11( |
wallet.mintProofs( | wallet.mintProofsBolt11( |
wallet.createMeltQuote( | wallet.createMeltQuoteBolt11( |
wallet.meltProofs( | wallet.meltProofsBolt11( |
for f in $(git ls-files '*.ts' '*.tsx'); do
sed -i \
-e 's/wallet\.createMintQuote(/wallet.createMintQuoteBolt11(/g' \
-e 's/wallet\.checkMintQuote(/wallet.checkMintQuoteBolt11(/g' \
-e 's/wallet\.mintProofs(/wallet.mintProofsBolt11(/g' \
-e 's/wallet\.createMeltQuote(/wallet.createMeltQuoteBolt11(/g' \
-e 's/wallet\.meltProofs(/wallet.meltProofsBolt11(/g' \
-e 's/wallet?\.createMeltQuote(/wallet?.createMeltQuoteBolt11(/g' \
"$f"
doneBe sure to handle optional-chain forms (wallet?.createMeltQuote() explicitly.
KeyChainwallet.getKeySets() is gone. Use wallet.keyChain.getKeysets() which returns Keyset[] (a domain class), not the raw API DTO MintKeyset.
sed -i 's/wallet\.getKeySets()/wallet.keyChain.getKeysets()/g' "$f"If the codebase has type annotations using MintKeyset against the result, the cheapest fix is to alias Keyset as MintKeyset in the import — both classes expose .id so most call sites are unaffected:
import { Keyset as MintKeyset } from "@cashu/cashu-ts";If your code reads more than .id (e.g. active), you'll need to switch to Keyset proper and adjust field accesses.
Amount boundary (CRITICAL)Amount is a class. Every quote/proof/response now carries Amount where v2 had number. The migration guide presents two strategies:
Amount end-to-end.MAX_SAFE_INTEGER): keep internal types as number, convert at the cashu-ts boundary with .toNumber().Choice B was the right call for shopstr (sat-only marketplace, simpler diff). Apply systematically:
// arithmetic — both Amounts → both .toNumber()
const total = meltQuote.amount.toNumber() + meltQuote.fee_reserve.toNumber();
// reduce sums over Proofs (Proof.amount is Amount in v3+)
const total = proofs.reduce((acc, p) => acc + p.amount.toNumber(), 0);
// passing to functions that take number (e.g. UI formatters)
formatWithCommas(meltQuote.fee_reserve.toNumber(), "sats");
// re-extracting an Amount from a response
const meltAmount = meltResponse.quote.amount.toNumber();A single sed pass catches the high-volume reduce patterns:
sed -i \
-e 's/acc + token\.amount/acc + token.amount.toNumber()/g' \
-e 's/acc + p\.amount/acc + p.amount.toNumber()/g' \
-e 's/acc + current\.amount/acc + current.amount.toNumber()/g' \
-e 's/meltQuote\.amount + meltQuote\.fee_reserve/meltQuote.amount.toNumber() + meltQuote.fee_reserve.toNumber()/g' \
"$f"Method inputs that accept AmountLike (e.g. wallet.createMintQuoteBolt11(amount), wallet.send(amount, proofs, ...)) accept raw number. No conversion needed at input sites.
getDecodedToken requires a second argumentgetDecodedToken(token, keysetIds: string[])The second argument is the list of keyset IDs the caller is willing to trust for V2 (Hashed) keysets. Pass [] if your application only handles standard hex (V1) keyset IDs (the universal default for current Cashu mints). For mints using v2 hashed keyset IDs you must obtain the IDs out-of-band first via getTokenMetadata.
// before
const decoded = getDecodedToken(token);
// after (safe for v1 hex keysets)
const decoded = getDecodedToken(token, []);MintQuoteState lives on the bolt11-specific responseMintQuoteBaseResponse is method-agnostic and does NOT carry state. Use the Bolt11 variants (returned by checkMintQuoteBolt11) which extend the base with state: MintQuoteState. Same story for fee_reserve on melt — only present on MeltQuoteBolt11Response. Once you've completed Step 3 the typed return values flow correctly.
import { MintQuoteState } from "@cashu/cashu-ts";
const status = await wallet.checkMintQuoteBolt11(quote);
if (status.state === MintQuoteState.PAID) { ... }await wallet.loadMint() at every construction siteThis is a runtime requirement TypeScript will not enforce. Audit every new CashuWallet(...) site and ensure loadMint() is awaited before any keyChain.*, createMintQuoteBolt11, createMeltQuoteBolt11, checkProofsStates, receive, send, etc. is called. Skip and the wallet's lazily-loaded mint info will be undefined and methods will throw.
# Find every construction site
grep -rn "new CashuWallet(" --include="*.ts" --include="*.tsx"For wallets stored in React state via setWallet and only used later in handlers that already call loadMint(), the construction-site call may be skipped — but adding it is harmless and defensive.
Test mocks need three coordinated changes:
jest.mock factories (Mint/Wallet, not CashuMint/CashuWallet).Bolt11 variants.keyChain: { getKeysets: ... } (not getKeySets: at the top level).loadMint to every mock wallet implementation, including per-test mockImplementation overrides.// before
jest.mock("@cashu/cashu-ts", () => ({
CashuMint: jest.fn().mockImplementation(() => ({})),
CashuWallet: jest.fn().mockImplementation(() => ({
createMeltQuote: mockCreateMeltQuote,
getKeySets: mockGetKeySets,
send: mockSend,
meltProofs: mockMeltProofs,
})),
}));
// after
jest.mock("@cashu/cashu-ts", () => ({
Mint: jest.fn().mockImplementation(() => ({})),
Wallet: jest.fn().mockImplementation(() => ({
loadMint: jest.fn().mockResolvedValue(undefined),
createMeltQuoteBolt11: mockCreateMeltQuote,
keyChain: { getKeysets: mockGetKeySets },
send: mockSend,
meltProofsBolt11: mockMeltProofs,
})),
}));For tests that use auto-mocking (jest.mock("@cashu/cashu-ts") with no factory) plus (CashuWallet as jest.Mock).mockImplementation(...), the alias trick from Step 1 means the local binding resolves to the auto-mock — only the method-name keys inside the implementation need updating.
Test mocks return raw numbers for fields that are now Amount. Production code calls .toNumber() on them and explodes (is not a function). The cleanest fix is a one-line shim in jest.setup.js so raw numbers stay compatible:
// jest.setup.js
if (!Number.prototype.toNumber) {
Object.defineProperty(Number.prototype, "toNumber", {
value: function () {
return this.valueOf();
},
writable: true,
configurable: true,
});
}This is test-scope only; production Amount objects bring their own .toNumber(). Without this shim you'd have to wrap every mock value in a fake { toNumber: () => N }, which bloats fixtures.
npx tsc --noEmit — must reach exit 0 before running tests. Fix Amount boundary errors and method-rename leftovers first; these surface cleanly in tsc output.npx jest — expect failures clustered in wallet UI tests if Step 9 wasn't applied. Compare pass count to your pre-migration baseline; the goal is zero new failures.@noble/hashes extension paths (Step 0) that tsc allows.createMintQuoteBolt12, mintProofsBolt12, etc.) — adopt as needed.OutputConfig (4th arg to wallet.send / mint helpers) for advanced output shaping like P2PK locking — only needed if migrating away from the legacy pubkey config field.For a typical mid-sized codebase the following sed bundle clears 80%+ of the breakage. Apply, then iterate on the residual tsc errors:
FILES=$(git ls-files '*.ts' '*.tsx')
for f in $FILES; do
sed -i \
-e 's|from "@noble/hashes/utils"|from "@noble/hashes/utils.js"|g' \
-e 's|from "@cashu/crypto/modules/common"|from "@cashu/cashu-ts"|g' \
-e 's/wallet\.createMintQuote(/wallet.createMintQuoteBolt11(/g' \
-e 's/wallet\.checkMintQuote(/wallet.checkMintQuoteBolt11(/g' \
-e 's/wallet\.mintProofs(/wallet.mintProofsBolt11(/g' \
-e 's/wallet\.createMeltQuote(/wallet.createMeltQuoteBolt11(/g' \
-e 's/wallet\.meltProofs(/wallet.meltProofsBolt11(/g' \
-e 's/wallet?\.createMeltQuote(/wallet?.createMeltQuoteBolt11(/g' \
-e 's/wallet\.getKeySets()/wallet.keyChain.getKeysets()/g' \
-e 's/acc + p\.amount/acc + p.amount.toNumber()/g' \
-e 's/acc + token\.amount/acc + token.amount.toNumber()/g' \
-e 's/acc + current\.amount/acc + current.amount.toNumber()/g' \
"$f"
done© shopstr-eng, 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
Just SKILL.md in .agents/skills/cashu-ts-migration of shopstr-eng/shopstr.
Open the folder on GitHubat commit fcfc0bd
Cashu TS Migration 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 |
|---|---|---|---|---|---|---|
| Cashu TS Migration this skillshopstr-eng/shopstr | 103 | — | ~3.1k | Automated safety check: Pass | GPL-3.0 | |
| Bungalfrevn/apollo | 237 | — | ~2k | Automated safety check: Notes | MIT | |
| Jest Skillsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Vitest Skillsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Javascript Typescript Jestgithub/awesome-copilot | 40k | 1 repos | ~559 | Automated safety check: Pass | MIT | |
| Jest UnitPramodDutta/qaskills | 235 | — | ~3.8k | Automated safety check: Pass | MIT |
galfrevn/apollo
A skill your agent uses when building, running, testing, or bundling JavaScript/TypeScript applications.
sickn33/agentic-awesome-skills
Generates Jest unit and integration tests in JavaScript or TypeScript.
sickn33/agentic-awesome-skills
Generates Vitest tests in JavaScript/TypeScript with Vite-native speed.
github/awesome-copilot
Best practices for writing JavaScript/TypeScript tests using Jest, including mocking strategies, test structure, and common patterns.
PramodDutta/qaskills
Unit testing skill using Jest for TypeScript and JavaScript, covering mocking, spies, snapshots, coverage, async testing, and custom matchers.
prime-radiant-inc/greenfield
Layer 1 skill for extracting behavioral intelligence from test suites.
Works with
Categories
Migrate a TypeScript/JavaScript codebase from @cashu/cashu-ts v2 to v4. Cashu TS Migration is an agent skill from shopstr-eng/shopstr. Migrate a TypeScript/JavaScript codebase from @cashu/cashu-ts v2 to v4.
Cashu TS Migration fits situations like: bumping cashu-ts past 2.x to unlock v3+ Wallet ergonomics (rate-limit aware retries; amount boundary type; BOLT-method-typed quote helpers).
Run `npx skills add shopstr-eng/shopstr --skill cashu-ts-migration -a claude-code`. Or copy the skill folder (.agents/skills/cashu-ts-migration in shopstr-eng/shopstr) into .claude/skills/cashu-ts-migration in your project. Claude Code loads it when a task matches its description.
Run `npx skills add shopstr-eng/shopstr --skill cashu-ts-migration -a codex`. Or copy the skill folder (.agents/skills/cashu-ts-migration in shopstr-eng/shopstr) into .agents/skills/cashu-ts-migration 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 shopstr-eng/shopstr --skill cashu-ts-migration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cashu-ts-migration, .gemini/skills/cashu-ts-migration, .github/skills/cashu-ts-migration and .opencode/skills/cashu-ts-migration in your project.
Going by SKILL.md and its folder, Cashu TS Migration needs the command-line tools its instructions call (git, npx and npm). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use git, npx and npm, which can reach the network depending on how they are called. 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.
Cashu TS Migration 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.
About 3.1k tokens (SKILL.md is roughly 12k 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 Cashu TS Migration: Bun (galfrevn/apollo, 237 stars), Jest Skill (sickn33/agentic-awesome-skills, 47k stars), Vitest Skill (sickn33/agentic-awesome-skills, 47k stars) and Javascript Typescript Jest (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
shopstr-eng (a GitHub organization) maintains it in shopstr-eng/shopstr, which has 103 GitHub stars. The repository was last updated on October 1, 2026.
Source: shopstr-eng/shopstr on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.