Ecosystem Renames — @jtcsv/* → jtcsv-*
Why
The @jtcsv npm scope is owned by an unrelated user. Attempts to publish under @jtcsv/<name> would fail (or, worse, succeed only if the squatter grants access). To ship the ecosystem without depending on a scope we don't control, every sibling package renames to the unscoped form jtcsv-<segment>.
This is a one-way rename per package — once a name is published, it stays.
Status (as of 2026-08-12)
| Current name | Target name | Version | Status | Owner | Notes |
|---|---|---|---|---|---|
| jtcsv | jtcsv | 3.3.0 | shipped | @fomenkoruslan | The core; no rename. |
| jtcsv-codemod | jtcsv-codemod | 0.2.0 | shipped | @fomenkoruslan | Already unscoped from day one. |
| @jtcsv/excel | jtcsv-excel | 2.1.0 | shipped 12 Aug 2026 | @fomenkoruslan | First @jtcsv/* → jtcsv-* migration. |
| @jtcsv/validator | jtcsv-validator | 2.0.0 | planned Phase 5 W13 | @fomenkoruslan | Currently private. |
| @jtcsv/tui | jtcsv-tui | 3.0.0 | planned Phase 5 W14 | @fomenkoruslan | Currently private. |
| @jtcsv/express-middleware | jtcsv-express | 2.0.0 | planned Phase 5 W13 | @fomenkoruslan | Drop "-middleware" suffix; the name implies it. |
| @jtcsv/fastify | jtcsv-fastify | 2.0.0 | planned Phase 5 W13 | @fomenkoruslan | Note: private flag accidentally OFF — verify before any publish. |
| @jtcsv/hono | jtcsv-hono | 2.0.0 | planned Phase 5 W14 | @fomenkoruslan | Currently private. |
| @jtcsv/nestjs | jtcsv-nestjs | 2.0.0 | planned Phase 5 W14 | @fomenkoruslan | Currently private. |
| @jtcsv/nextjs | jtcsv-nextjs | 2.0.0 | planned Phase 5 W14 | @fomenkoruslan | Currently private. Directory is plugins/nextjs-api. |
| (new — greenfield) | jtcsv-react | 0.1.0 | shipped 12 Aug 2026 | @fomenkoruslan | First React adapter package; no prior @jtcsv/* form. |
| (new — greenfield) | jtcsv-vue | 0.1.0 | shipped 12 Aug 2026 | @fomenkoruslan | Lifted from examples/frameworks/vue (no prior @jtcsv/vue private publish). |
Future-reserve (404 on npm as of audit, available for our use):
- jtcsv-svelte · jtcsv-angular · jtcsv-next · jtcsv-stream · jtcsv-cli · jtcsv-types
Per-package checklist
Each rename requires a coordinated set of edits. Use this checklist for every package:
package.json
- Change
namefrom@jtcsv/<x>tojtcsv-<x>. - Remove
private: true(or set tofalse). - Bump version (treat the rename as a feature release — minor bump from the prior @jtcsv/* version).
- Loosen
peerDependencies.jtcsvto^<current-major>.<current-minor>.0 || ^<next-major>.0.0. - Add
engines.node: ">=18.17". - Add
type: "commonjs"explicitly. - Ensure
filesarray includesREADME.md,CHANGELOG.md,LICENSE. - Confirm
publishConfig: { access: "public", provenance: true }is present.
- Change
Source code
- Replace any
require('../../../dist/index.js')/require('../../../index.ts')withrequire('jtcsv'). - Replace any
require('../../../src/<x>')either by inlining the dependency into the package or by exporting fromjtcsvand re-importing. - Run
npm pack --dry-runand inspect — anything referencing the parent monorepo path will break.
- Replace any
LICENSE — copy the root LICENSE into the package dir (npm requires a file, not just the field).
CHANGELOG.md — add a
## <version> (yyyy-mm-dd)entry listing the rename and any other changes.README.md — replace install instructions, badge URLs, "Why" hook, and any references to the old name. Document a brief migration section for anyone who had the @jtcsv/* private prerelease.
Tests — minimum: a smoke suite that imports the public surface and exercises every exported entry. Wire
jest+ts-jest+ the package's runtime deps intodevDependencies.Changeset
- Create
.changeset/<package-name>-<version>.mdwith the rename note. - Verify
.changeset/config.json#ignoredoes NOT list the new unscoped name; remove the @jtcsv/* form if present. - Run
npm run verify:changeset-ignorefrom the repo root.
- Create
Verify
cd <package-dir> && npm test→ green.cd <package-dir> && npm pack --dry-run→ inspect: only intended files, dist size < 1 MB unless documented.- At repo root:
npm run tsc:checkandnpm run test:unitmust remain green.
Publish (done from CI by the release pipeline; manually only in emergency):
- The changeset auto-bumps to the version in the changeset file.
- Release workflow runs
npm publish --provenancefor each.
Known traps
@jtcsv/fastifyis currentlyprivate: falsein the working tree. This was a slip — it has never been published (404 on npm). Before any of the parallel renames lands, theprivate:falseMUST be reviewed: either confirm publish-readiness, or flip it back toprivate: trueuntil the rename happens.plugins/nextjs-api directory name does NOT match the package name (which is
@jtcsv/nextjs). Keep the directory name as-is — npm publishes use thenamefield, not the dir name.Workspaces array in the root
package.jsonreferences directories by path, NOT by package name. Renaming a package does not require any change to the root workspaces list.@jtcsv/excelwas always private — no migration burden for users. For packages that were previously shipped privately to internal consumers, post a one-line npm DEPRECATE notice on the @jtcsv/* form pointing to the new name (we cannot do this for @jtcsv/excel since we never owned the scope; just document in the README that the package was renamed).
Future considerations
- A
jtcsv-typespackage containing the shared TypeScript declarations would let consumers depend on types without pulling the runtime; reserved but not scheduled. - A
jtcsv-clistandalone package (separate from the in-core CLI binary) is reserved for a future "thin CLI" release; not scheduled.
Verifying availability
The full audit was run on 2026-06-13. All 15 candidate names were 404 on npm. Re-check before publishing — npm namespaces are first-come-first-served, and a delay between audit and publish opens a small window where a squatter could grab a name.
Run:
for name in jtcsv-excel jtcsv-validator jtcsv-react jtcsv-vue jtcsv-svelte jtcsv-angular jtcsv-next jtcsv-express jtcsv-fastify jtcsv-nestjs jtcsv-hono jtcsv-tui jtcsv-stream jtcsv-cli jtcsv-types; do
npm view "$name" 2>&1 | head -1
done