@jonloucks/badges-ts is a CLI-first tool for generating project SVG badges and version artifacts.
Primary workflows:
package.jsonsrc/version.ts and release notes)npm install @jonloucks/badges-ts
or run directly:
npx badges-ts <command>
discoverDiscovers project information from package.json and logs name/version.
badges-ts discover
generateGenerates badges using project metadata, coverage data, and template values.
badges-ts generate
Generation includes:
Coverage is resolved from the first available source:
KIT_CODE_COVERAGE_PERCENTKIT_COVERAGE_SUMMARY_PATH)KIT_LCOV_REPORT_INDEX_PATH)apply-versionCreates/updates src/version.ts and creates release notes from template for the current package version.
badges-ts apply-version
Behavior notes:
versionPrints CLI version.
badges-ts version
helpPrints usage information.
badges-ts help
These flags are supported by command context handling:
--dry-run, -d: Show what would be written, but do not write files.--quiet, -q: Suppress normal output.--trace, -t: Show trace logs.--warn, -w: Show warning logs.--verbose: Enable verbose output.badges-ts can read configuration from:
KIT_BADGES_FOLDER)badges-ts.json) using dot keys (for example, kit.badges.folder)Use defaults with explicit color tuning:
{
"kit.badges.folder": "badges",
"kit.template.badge.path": "src/data/badge-template.svg.dat",
"kit.100.percent.color": "#4bc124",
"kit.above.90.percent.color": "#377526",
"kit.below.60.percent.color": "darkred",
"kit.0.percent.color": "#ff0000"
}
Run from repo root, but target a package directory:
{
"kit.project.folder": "packages/my-library",
"kit.package.json.path": "package.json",
"kit.coverage.summary.path": "coverage/coverage-summary.json",
"kit.lcov.report.index.path": "coverage/lcov-report/index.html",
"kit.badges.folder": "../../badges",
"kit.npm.badge.path": "my-library-npm.svg",
"kit.coverage.summary.badge.path": "my-library-coverage.svg",
"kit.typedoc.badge.path": "my-library-typedoc.svg"
}
Use explicit CI paths and injected coverage percent:
{
"kit.badges.folder": "artifacts/badges",
"kit.template.badge.path": "src/data/badge-template.svg.dat",
"kit.coverage.summary.badge.path": "coverage-summary.svg",
"kit.npm.badge.path": "npm.svg",
"kit.typedoc.badge.path": "typedoc.svg"
}
Example CI command:
KIT_CODE_COVERAGE_PERCENT=94.6 npx badges-ts generate --verbose
gh-pages publishing profileWrite badges to a branch/worktree folder used for site publishing:
{
"kit.project.folder": ".",
"kit.badges.folder": "gh-pages/badges",
"kit.coverage.summary.badge.path": "main-coverage.svg",
"kit.npm.badge.path": "main-npm.svg",
"kit.typedoc.badge.path": "main-typedoc.svg",
"kit.coverage.summary.path": "coverage/coverage-summary.json",
"kit.lcov.report.index.path": "coverage/lcov-report/index.html"
}
If you publish coverage and typedoc to gh-pages, keep badge filenames stable (for example main-*.svg) so README links do not need to change per run.
Example GitHub Actions step sequence:
jobs:
badges:
runs-on: ubuntu-latest
steps:
- name: Checkout main
uses: actions/checkout@v4
with:
path: main-project
- name: Checkout gh-pages
uses: actions/checkout@v4
with:
ref: gh-pages
path: gh-pages
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
- name: Install and generate badges
working-directory: main-project
run: |
npm ci
KIT_BADGES_FOLDER="$/gh-pages/badges" npm run badges
- name: Commit gh-pages badge updates
uses: EndBug/add-and-commit@v9
with:
default_author: github_actions
message: "Update badges"
add: "badges/*.svg"
cwd: gh-pages
Artifact-based variant (recommended for privileged publish flows):
# Workflow A: unprivileged build/generate (aligned with main-push)
name: main-push
on:
push:
branches: [main]
permissions:
contents: read
jobs:
build-badges:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "24"
- run: npm ci
- run: npm run badges
- uses: actions/upload-artifact@v4
with:
name: publish-badges
path: "*.svg"
# Workflow B: privileged publisher (aligned with main-push-publish)
name: main-push-publish
on:
workflow_run:
workflows: [main-push]
types: [completed]
permissions:
actions: read
contents: write
jobs:
publish:
if: $
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: gh-pages
path: gh-pages
- uses: actions/download-artifact@v4
with:
github-token: $
run-id: $
name: publish-badges
path: gh-pages/badges
- uses: EndBug/add-and-commit@v9
with:
default_author: github_actions
message: "Update badges"
add: "badges/*.svg"
cwd: gh-pages
KIT_PROJECT_FOLDER / kit.project.folder (default: ./)KIT_BADGES_CONFIG_PATH / kit.badges.config.path (default: badges-ts.json)KIT_PACKAGE_JSON_PATH / kit.package.json.path (default: package.json)KIT_BADGES_FOLDER / kit.badges.folderKIT_TEMPLATE_BADGE_PATH / kit.template.badge.path (default: internal template)KIT_CODE_COVERAGE_PERCENT / kit.code.coverage.percentKIT_COVERAGE_SUMMARY_PATH / kit.coverage.summary.path (default: coverage/coverage-summary.json)KIT_LCOV_REPORT_INDEX_PATH / kit.lcov.report.index.path (default: coverage/lcov-report/index.html)KIT_NPM_BADGE_PATH / kit.npm.badge.path (default: npm-badge.svg)KIT_COVERAGE_SUMMARY_BADGE_PATH / kit.coverage.summary.badge.path (default: coverage-summary.svg)KIT_TYPEDOC_BADGE_PATH / kit.typedoc.badge.path (default: typedoc-badge.svg)KIT_VERSION_TS_PATH / kit.version.ts.path (default: src/version.ts)KIT_RELEASE_NOTES_OUTPUT_FOLDER / kit.release.notes.output.folder (default: notes)KIT_RELEASE_NOTES_TEMPLATE_PATH / kit.release.notes.template.path (default: notes/release-notes-template.md)KIT_100_PERCENT_COLOR / kit.100.percent.colorKIT_ABOVE_90_PERCENT_COLOR / kit.above.90.percent.colorKIT_ABOVE_80_PERCENT_COLOR / kit.above.80.percent.colorKIT_ABOVE_70_PERCENT_COLOR / kit.above.70.percent.colorKIT_ABOVE_60_PERCENT_COLOR / kit.above.60.percent.colorKIT_BELOW_60_PERCENT_COLOR / kit.below.60.percent.colorKIT_0_PERCENT_COLOR / kit.0.percent.colorDefault template location:
src/data/badge-template.svg.datSupported template placeholders:
Example override:
KIT_TEMPLATE_BADGE_PATH=./my-template.svg badges-ts generate
The package exports include:
Badge, BadgesBadgeConfig, BadgesConfigBadgeExceptionInstaller, InstallerConfigcreateInstallerVERSIONSee generated TypeDoc for full API details:
--trace and confirm coverage source files exist.KIT_TEMPLATE_BADGE_PATH points to a readable SVG template file.KIT_RELEASE_NOTES_TEMPLATE_PATH.