jscpd Code Migration Tracker
kucherenko/jscpd
Measures a code port between languages or frameworks with jscpd's function-level comparison, porting tests before code and tracking what is left unmatched.
Moves a legacy internal Ghost package from JavaScript and CommonJS to TypeScript and ESM in three focused commits that keep git file history intact.
$ npx skills add TryGhost/Ghost --skill convert-internal-package-to-typescript -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TryGhost/Ghost convert-internal-package-to-typescript --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/TryGhost/Ghost.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/convert-internal-package-to-typescript .claude/skills/convert-internal-package-to-typescript && 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 "convert-internal-package-to-typescript" agent skill from https://github.com/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescript into .claude/skills/convert-internal-package-to-typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convert-internal-package-to-typescript", 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/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescriptType 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 TryGhost/Ghost --skill convert-internal-package-to-typescript -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TryGhost/Ghost convert-internal-package-to-typescript --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TryGhost/Ghost.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/convert-internal-package-to-typescript .agents/skills/convert-internal-package-to-typescript && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "convert-internal-package-to-typescript" agent skill from https://github.com/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescript into .agents/skills/convert-internal-package-to-typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convert-internal-package-to-typescript", 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 TryGhost/Ghost --skill convert-internal-package-to-typescript -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TryGhost/Ghost convert-internal-package-to-typescript --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TryGhost/Ghost.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/convert-internal-package-to-typescript .cursor/skills/convert-internal-package-to-typescript && 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 "convert-internal-package-to-typescript" agent skill from https://github.com/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescript into .cursor/skills/convert-internal-package-to-typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convert-internal-package-to-typescript", 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/TryGhost/Ghost.git --path .agents/skills/convert-internal-package-to-typescript--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 TryGhost/Ghost --skill convert-internal-package-to-typescript -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TryGhost/Ghost convert-internal-package-to-typescript --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TryGhost/Ghost.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/convert-internal-package-to-typescript .gemini/skills/convert-internal-package-to-typescript && 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 "convert-internal-package-to-typescript" agent skill from https://github.com/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescript into .gemini/skills/convert-internal-package-to-typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convert-internal-package-to-typescript", 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 TryGhost/Ghost convert-internal-package-to-typescriptInstalls 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 TryGhost/Ghost --skill convert-internal-package-to-typescript -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TryGhost/Ghost.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/convert-internal-package-to-typescript .github/skills/convert-internal-package-to-typescript && 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 "convert-internal-package-to-typescript" agent skill from https://github.com/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescript into .github/skills/convert-internal-package-to-typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convert-internal-package-to-typescript", 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 TryGhost/Ghost --skill convert-internal-package-to-typescript -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TryGhost/Ghost convert-internal-package-to-typescript --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TryGhost/Ghost.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/convert-internal-package-to-typescript .opencode/skills/convert-internal-package-to-typescript && 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 "convert-internal-package-to-typescript" agent skill from https://github.com/TryGhost/Ghost/tree/main/.agents/skills/convert-internal-package-to-typescript into .opencode/skills/convert-internal-package-to-typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convert-internal-package-to-typescript", 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.
convert-internal-package-to-typescriptMoves a legacy internal Ghost package from JavaScript and CommonJS to TypeScript and ESM in three focused commits that keep git file history intact.
This skill keeps mechanical moves apart from meaningful changes. Before editing, the agent reads `packages/README.md`, finds every import, require, export, runtime asset and path reference, inspects build, test and archive configuration, runs the package's tests for a baseline, and identifies consumers that cannot load ESM output. It stops if the package has an active independent release or a third-party support contract.
The work then lands as three commits, each valid on its own, with rename detection checked after each. First, `git mv` the sources from `lib` to `src`, touching only references that must change. Second, `git mv` the `.js` files to `.ts` with only the minimum config to parse. Third, convert the implementation to TypeScript and ESM under the package contract in `packages/README.md`. A reference file covers history and verification; the excerpt is cut off during the third step.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7aecaf7. 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.
No URLs in SKILL.md. Its commands use git, 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.
Convert Internal Package to TypeScript loads about 1.2k tokens when it runs, and up to ~2k if it reads all its reference files. Until then it costs about 100 tokens; SKILL.md has 625 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 TryGhost/Ghost at commit 7aecaf7, republished under its MIT licence (© TryGhost). 625 words, ~1,247 tokens.
.claude/skills/convert-internal-package-to-typescript/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Modernize an internal package without mixing mechanical moves with semantic
changes or obscuring file history. Treat packages/README.md as the authority
for the package's lifetime architecture; this skill owns only the conversion
workflow.
Read packages/README.md completely, then inspect the package, its consumers,
and comparable current packages. Confirm that the package is internal-only and
can adopt the documented single-build TypeScript and ESM contract.
Before editing:
require(), export, runtime asset and path reference.If the package has an active independent release or third-party support contract, or requires a format that conflicts with the golden path, stop and establish its support contract instead of applying this workflow mechanically. Deprecated historical npm versions do not by themselves block conversion.
Read
references/history-and-verification.md
completely before planning the commits.
Keep each commit independently valid and verify rename detection before moving on. Avoid formatting or opportunistic cleanup in the mechanical commits.
lib to srcUse git mv to move the source tree. Update only references that must change
for the new path, such as test imports, build inputs and package metadata. Do
not change module syntax, file extensions or implementation in this commit.
Use the subject Moved <package> sources from lib to src when that accurately
describes the change.
Use git mv for .js to .ts renames. Add only the minimum configuration and
syntax adjustments needed for the renamed sources to parse and for this commit
to remain coherent. Preserve behavior and defer meaningful typing and ESM
conversion to the next commit.
Use the subject Changed <package> file extensions to TypeScript.
Apply the package contract from packages/README.md: shared config packages,
minimal package-local config, ESM metadata and exports, standard scripts, and a
single compiled output unless a verified consumer requires an exception.
Replace the package's migration status with
ghostPackage.goldenPath: compliant only after every mechanical golden-path
check passes.
Use the subject Converted <package> to TypeScript.
any.unknown only at genuine untrusted boundaries and narrow it promptly.@ts-ignore, or lint disables
merely to silence the compiler..ts extensions for relative TypeScript imports under the
repository's NodeNext configuration.build/.await so supported CommonJS consumers can use Node's
require(esm) interoperability.Run the build, tests and lint commands required by packages/README.md. Also:
import or require()
path;source resolution and compiled output where both are used;git diff --summary for each mechanical commit and git log --follow on
representative files to confirm the lineage remains readable.The modernization PR may be rebase-merged when these commits are independently valid and intentionally ordered. This does not change the merge-commit requirement for a preceding subtree history import.
© TryGhost, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/convert-internal-package-to-typescript of TryGhost/Ghost.
Open the folder on GitHubat commit 7aecaf7
Convert Internal Package to TypeScript 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 |
|---|---|---|---|---|---|---|
| Convert Internal Package to TypeScript this skillTryGhost/Ghost | 55k | — | ~1.2k | Automated safety check: Pass | MIT | |
| jscpd Code Migration Trackerkucherenko/jscpd | 6.3k | — | ~5k | Automated safety check: Pass | MIT | |
| Markbind Typescript MigrationMarkBind/markbind | 158 | — | ~2k | Automated safety check: Pass | MIT | |
| Check npmgrafana/skills | 278 | — | ~1.3k | Automated safety check: Warn | Apache-2.0 | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 5 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Skyvern Version BumpSkyvern-AI/skyvern | 23k | — | ~1k | Automated safety check: Notes | AGPL-3.0 |
kucherenko/jscpd
Measures a code port between languages or frameworks with jscpd's function-level comparison, porting tests before code and tracking what is left unmatched.
MarkBind/markbind
Complete guide for migrating JavaScript files to TypeScript in the MarkBind project, including the two-commit strategy, import/export syntax conversion, and best practices.
grafana/skills
Audit a JavaScript/TypeScript repo's npm, yarn, or pnpm configuration for supply-chain hardening: tool version, lifecycle scripts, unsafe dependency protocols, and minimum release age ≥3 days.
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
Skyvern-AI/skyvern
Walks through a Skyvern open-source release bump: update the version, rebuild the Python and TypeScript SDKs with Fern, commit, and open a pull request.
warp-drive-data/warp-drive
Reference for writing and debugging TypeScript and JavaScript codemods with @ast-grep/napi: parsing, node queries, meta-variables, rule objects and editing.
TryGhost/Ghost
Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.
TryGhost/Ghost
Adds a private developer-experiments feature flag to Ghost, covering the backend registration, the Labs settings toggle and the test snapshot updates.
TryGhost/Ghost
Guidance for running the Tinybird tb CLI: choosing local, branch or cloud workflows, building and deploying, loading data, handling tokens and secrets, and CI/CD.
TryGhost/Ghost
Guides the agent through making a focused git commit in the Ghost repository: inspect state, stage only relevant files, follow the contributing rules, then verify.
TryGhost/Ghost
Rules for writing Tinybird datasources, pipes, endpoints and materialized views, with SQL constraints, optimization habits and deduplication patterns.
TryGhost/Ghost
Add, consume, review, or remove Admin 7 milestone flags using Ghost's existing Labs conventions.
Works with
Categories
Moves a legacy internal Ghost package from JavaScript and CommonJS to TypeScript and ESM in three focused commits that keep git file history intact. This skill keeps mechanical moves apart from meaningful changes.md`, finds every import, require, export, runtime asset and path reference, inspects build, test and archive configuration, runs the package's tests for a baseline, and identifies consumers that cannot load ESM output.
Convert Internal Package to TypeScript fits situations like: modernizing a private package in the Ghost monorepo from JavaScript to TypeScript; converting a CommonJS internal package to ESM without losing git history; planning commit boundaries for a lib-to-src and JS-to-TS migration.
Run `npx skills add TryGhost/Ghost --skill convert-internal-package-to-typescript -a claude-code`. Or copy the skill folder (.agents/skills/convert-internal-package-to-typescript in TryGhost/Ghost) into .claude/skills/convert-internal-package-to-typescript in your project. Claude Code loads it when a task matches its description.
Run `npx skills add TryGhost/Ghost --skill convert-internal-package-to-typescript -a codex`. Or copy the skill folder (.agents/skills/convert-internal-package-to-typescript in TryGhost/Ghost) into .agents/skills/convert-internal-package-to-typescript 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 TryGhost/Ghost --skill convert-internal-package-to-typescript -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/convert-internal-package-to-typescript, .gemini/skills/convert-internal-package-to-typescript, .github/skills/convert-internal-package-to-typescript and .opencode/skills/convert-internal-package-to-typescript in your project.
Going by SKILL.md and its folder, Convert Internal Package to TypeScript needs the command-line tools its instructions call (git). Our summary lists: A checkout of the Ghost repository with `packages/README.md`; Git.
SKILL.md contains no URLs. Its commands use git, 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.
Convert Internal Package to TypeScript is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.2k tokens (SKILL.md is roughly 5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 739 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Convert Internal Package to TypeScript: jscpd Code Migration Tracker (kucherenko/jscpd, 6.3k stars), Markbind Typescript Migration (MarkBind/markbind, 158 stars), Check npm (grafana/skills, 278 stars) and Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
TryGhost (a GitHub organization) maintains it in TryGhost/Ghost, which has 55,493 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 7, 2026.
Source: TryGhost/Ghost on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.