{"_id":"@dxpert/uns-naming-check","_rev":"2-244fe2f30a5a0d5bf65e68cf1806da71","name":"@dxpert/uns-naming-check","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@dxpert/uns-naming-check","version":"0.1.0","keywords":["uns","unified-namespace","mqtt","isa-95","industrial-iot","iiot","naming-convention","linter"],"author":{"url":"https://dxpert.ai","name":"DXP Technologies inc."},"license":"MIT","_id":"@dxpert/uns-naming-check@0.1.0","maintainers":[{"name":"dxpert.ai","email":"admin@dxpert.ai"}],"homepage":"https://dxpert.ai/tools.html","bugs":{"url":"https://github.com/dxpert-ai/uns-naming-check/issues"},"bin":{"uns-naming-check":"bin/cli.js"},"dist":{"shasum":"c0c9cab004c928e539a3afe9a8accf0ffb08087c","tarball":"https://registry.npmjs.org/@dxpert/uns-naming-check/-/uns-naming-check-0.1.0.tgz","fileCount":6,"integrity":"sha512-vIUZRZPol22IWXMhNFIthOBmACQktb4TwPhP1MY69Ex9wEtKjnKz9zCvYLcYWb2u9eUgfBqaTSrJhIQrw5Pacw==","signatures":[{"sig":"MEQCIAMJI3QFmBPo39zvKEU93OzvW5wQvZK6Gz3UMl97L3NqAiAkF4AnAy58FerA62/SKkEMX3Jd5GzRPqgvBl5KKQcVIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17620},"main":"src/index.js","type":"module","module":"src/index.js","exports":{".":"./src/index.js"},"scripts":{"test":"node test/run.js"},"_npmUser":{"name":"dxpert.ai","email":"admin@dxpert.ai"},"repository":{"url":"git+https://github.com/dxpert-ai/uns-naming-check.git","type":"git"},"_npmVersion":"11.13.0","description":"Check a set of Unified Namespace (UNS) topic paths for depth, casing, and collision problems - browser module, CLI, and demo page.","directories":{},"_nodeVersion":"24.16.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/uns-naming-check_0.1.0_1787448232198_0.6250539902664256","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"_id":"@dxpert/uns-naming-check@0.1.1","bin":{"uns-naming-check":"bin/cli.js"},"bugs":{"url":"https://github.com/dxpert-ai/uns-naming-check/issues"},"dist":{"shasum":"dd90c43b1af8a7f25f27e82220b7bbe927ffc33e","tarball":"https://registry.npmjs.org/@dxpert/uns-naming-check/-/uns-naming-check-0.1.1.tgz","fileCount":6,"integrity":"sha512-iDK+TtPGuLmqDW/69XgFgEacIP/LmOogCjbgA+iI10w/01Ot2rL+LvoBbdm6RomrqenDoYqLTDIHVe/OaLwn2g==","signatures":[{"sig":"MEQCIEv7nAK/XaBeSP4SfPYKxyCBiqqyirqaZSEAsby2Gt66AiBJLuLJJV0dJkK/GoH9QdQCkI8wFf02opir3fmneredbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHrX6l6snJfT6rA31+KbVyfp+JLRUWrWfEgDNsWNiF2EAiBmL4y1IUoypPd8ogn3vEi+jJXiGBX9ddU5ZeCj6et2ww=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dxpert%2funs-naming-check@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":19234},"main":"src/index.js","name":"@dxpert/uns-naming-check","type":"module","author":{"url":"https://dxpert.ai","name":"DXP Technologies inc."},"module":"src/index.js","exports":{".":"./src/index.js"},"gitHead":"82d9ee9eaf10b9b4d42f1afb8537009029971fc1","license":"MIT","scripts":{"test":"node test/run.js"},"version":"0.1.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9b0dcdc0-1b83-4bfe-b30e-b3877418a907"}},"homepage":"https://dxpert.ai/tools.html","keywords":["uns","unified-namespace","mqtt","isa-95","industrial-iot","iiot","naming-convention","linter"],"repository":{"url":"git+https://github.com/dxpert-ai/uns-naming-check.git","type":"git"},"_npmVersion":"11.19.0","description":"Check a set of Unified Namespace (UNS) topic paths for depth, casing, and collision problems - browser module, CLI, and demo page.","directories":{},"maintainers":[{"name":"dxpert.ai","email":"admin@dxpert.ai"}],"_nodeVersion":"24.20.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/uns-naming-check_0.1.1_1789331669453_0.58553345937426"}}},"time":{"created":"2026-08-23T01:23:51.978Z","modified":"2026-09-13T20:34:29.883Z","0.1.0":"2026-08-23T01:23:52.356Z","0.1.1":"2026-09-13T20:34:29.556Z"},"bugs":{"url":"https://github.com/dxpert-ai/uns-naming-check/issues"},"author":{"url":"https://dxpert.ai","name":"DXP Technologies inc."},"license":"MIT","homepage":"https://dxpert.ai/tools.html","keywords":["uns","unified-namespace","mqtt","isa-95","industrial-iot","iiot","naming-convention","linter"],"repository":{"url":"git+https://github.com/dxpert-ai/uns-naming-check.git","type":"git"},"description":"Check a set of Unified Namespace (UNS) topic paths for depth, casing, and collision problems - browser module, CLI, and demo page.","maintainers":[{"name":"dxpert.ai","email":"admin@dxpert.ai"}],"readme":"# uns-naming-check\n\nChecks a set of Unified Namespace (UNS) topic paths for the problems that quietly rot a namespace over time. It exists because a UNS is only as useful as its naming discipline, and drift (mixed casing, inconsistent depth, near-duplicate siblings) is hard to spot by eye once a namespace has hundreds of topics.\n\n## What it checks\n\n- Inconsistent depth across paths (e.g. some paths at 4 levels, others at 5)\n- Mixed casing styles across segments (kebab-case, snake_case, camelCase, PascalCase, UPPER, lower, mixed)\n- Whitespace inside a segment\n- Case-collisions between siblings at any level (`Line-1` vs `line-1` read as one namespace node in most brokers, but are two distinct topics under case-sensitive MQTT)\n- Duplicate full paths\n- Stray MQTT wildcards (`+`, `#`) inside a stored path\n\n## Usage\n\n### Browser\n\nOpen `demo/index.html` directly in a browser (no server or build step needed — it's a plain ES module import). Paste topic paths, one per line, and click \"Check namespace\".\n\n### As a module\n\n```js\nimport { checkNamespace, checkNamespaceText } from '@dxpert/uns-naming-check';\n\nconst findings = checkNamespace([\n  'Acme/Montreal/Stamping/Line-1/Press-01',\n  'acme/montreal/stamping/line-1/press-02',\n]);\n\n// or, from raw multi-line text:\nconst findings2 = checkNamespaceText('Acme/Montreal/Line-1\\nAcme/Montreal/Line-1');\n```\n\nEach finding is `{ kind: 'fail' | 'warn' | 'pass' | 'info', label, message }`. `message` may contain simple `<code>...</code>` markup; strip it with the exported `plainText()` helper for plain-text output.\n\n### CLI\n\n```sh\nnode bin/cli.js \"Acme/Montreal/Line-1/Press-01\" \"acme/montreal/line-1/press-01\"\nnode bin/cli.js --file paths.txt\ncat paths.txt | node bin/cli.js --json\n```\n\nNo dependencies to install. Exit code is non-zero if any check finds an error.\n\n## Examples\n\n```\n$ node bin/cli.js --file paths.txt\n[ISSUES] 7 path(s) checked - 2 error(s), 2 warning(s).\n[WARN] Duplicate path: Acme/Montreal/Stamping/Line-1/Press-01 appears more than once.\n[ERROR] Case-collision: Acme/Montreal/Assembly/Line-4/Robot-Cell-02 vs acme/montreal/assembly/line-4/robot-cell-02. MQTT topics are case-sensitive - these read as one namespace but are two.\n[WARN] Line 5 Acme/Toronto/Packaging/Line 2/Palletizer-01: segment Line 2 contains whitespace - prefer - or _.\n[WARN] Inconsistent depth: 6 path(s) at 5 levels, 1 path(s) at 3 levels. A UNS aligned to ISA-95 usually keeps one consistent depth (e.g. Enterprise/Site/Area/Line/Unit) with clear rules for shallower nodes.\n[SUMMARY] 6 unique path(s) - depth(s): 5, 3 - styles: PascalCase, lower, Title-Case\n```\n\n```\n$ node bin/cli.js \"Acme/Montreal/Stamping/Line-1/Press-01\" \"Acme/Montreal/Stamping/Line-1/Press-02\"\n[VALID] No issues found. 2 path(s), consistent depth, one naming style.\n[SUMMARY] 2 unique path(s) - depth(s): 5 - styles: PascalCase\n```\n\n## Maintained by dxpert.ai\n\ndxpert.ai (https://dxpert.ai) builds tools and services for Industry 4.0 / digital transformation teams designing and validating industrial data layers. This checker is one of a small set of free, no-signup validators.\n\nA free hosted version of this tool runs at [dxpert.ai/tools.html](https://dxpert.ai/tools.html) — no install required.\n","readmeFilename":"README.md"}