npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@galaxy-foundry/tag-registry

v0.1.1

Published

The shared meta_tags.yml format for Foundry-pattern instances — parser, validator, and accessors. The facet vocabulary stays per-instance.

Readme

@galaxy-foundry/tag-registry

The meta_tags.yml format every Foundry-pattern instance shares: parser, validator, and the accessors a schema, a validator and a browse surface need.

This package ships no vocabulary. Facets are the browse axes of one domain — the Galaxy Workflow Foundry groups by source/target/tool, the Statistical Genomics Foundry by family/role/domain — and there is no useful subset to inherit. What is shared is the format and the three rules that make it work.

npm install @galaxy-foundry/tag-registry
import { loadTagRegistry } from '@galaxy-foundry/tag-registry';

const tags = loadTagRegistry('meta_tags.yml');

tags.isValidTag('target/galaxy'); // true
tags.facetOf('target/galaxy'); //   'target'
tags.tagDescription('target/galaxy'); // 'Galaxy-specific material.'
tags.facets(); //                   [{ key, label, description }, …] in declared order
tags.allTags(); //                  every registered tag, in declaration order

The corpus supplies only its usage counts; the registry owns how those tags browse:

import { groupTagsInUse, facetLabelOf } from '@galaxy-foundry/tag-registry';

const groups = groupTagsInUse(
  tags,
  new Map([
    ['target/galaxy', 4],
    ['meta', 1],
  ]),
);
// Declared facet order, sorted tags, no empty facets or invented "other" bucket.

facetLabelOf(tags, 'target/galaxy'); // 'Target'

The format

version: 1
facets:
  target:
    label: Target
    description: The platform a note is about.
    values:
      target/galaxy: Galaxy-specific material.

values may be omitted while a facet is still empty. version is accepted and ignored.

The three rules

Membership is declared, never parsed off the / prefix. A tag is valid because some facet lists it under values. The slash in target/galaxy is a naming convention, so a bare key like meta is an ordinary member — there is no flat-flag special case in the loader, the schema, or the browse pages. A facet may equally declare a tag whose text looks nothing like the facet's name.

Every facet is a closed enum. No open, free-form, or prefix-wildcard escape hatch, ever. A tag with no gloss is a tag the browse surface cannot document and a reader cannot learn from, so parseTagRegistry refuses one.

Browse pages group by the declaring facet. This is what makes an "other" bucket impossible rather than merely empty — and it is why a tag declared under two facets is refused: it would have no single declaring facet, and facetOf would answer with whichever won the iteration.

The rules are specified in the Foundry Pattern (content/pattern/standing-up-a-foundry.instructions.txt). Treat a format change as a cross-repo change.

What this package does not do

It does not decide what a valid tag means for a note — that tags is required, that a minimum of one is carried, or that note-kind is never copied into tags. Those are schema rules, and they live in each instance's note schema.

It does not collect usage from a corpus. A registered tag carried by zero notes is dead vocabulary, but only an instance can decide what counts as a tagged note. Pass those local counts to groupTagsInUse; corpus drift checks remain with the instance.

API

  • Loading: loadTagRegistry, findTagRegistryPath, parseTagRegistry
  • Accessors: tagRegistry, buildTagIndex, groupTagsInUse, facetLabelOf
  • Types: TagRegistry, TagRegistryFile, Facet, FacetInfo, FacetGroup, TagEntry, TagUsage
  • Constant: TAG_REGISTRY_FILE

License

MIT