clearotron 0.3.0-beta.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -141,6 +141,12 @@
141
141
  "skips": 0,
142
142
  "todos": 0
143
143
  },
144
+ "a-command-printed-from-npx-outlives-the-cache.test.mjs": {
145
+ "tests": 3,
146
+ "asserts": 14,
147
+ "skips": 0,
148
+ "todos": 0
149
+ },
144
150
  "a-company-can-be-given-a-framework-after-it-exists.test.mjs": {
145
151
  "tests": 8,
146
152
  "asserts": 19,
@@ -375,6 +381,12 @@
375
381
  "skips": 0,
376
382
  "todos": 0
377
383
  },
384
+ "a-key-the-demo-prints-signs-for-that-demo.test.mjs": {
385
+ "tests": 5,
386
+ "asserts": 30,
387
+ "skips": 0,
388
+ "todos": 0
389
+ },
378
390
  "a-killed-browser-takes-its-children.test.mjs": {
379
391
  "tests": 2,
380
392
  "asserts": 4,
@@ -543,6 +555,12 @@
543
555
  "skips": 0,
544
556
  "todos": 0
545
557
  },
558
+ "a-read-the-engine-could-not-answer-names-the-check.test.mjs": {
559
+ "tests": 4,
560
+ "asserts": 14,
561
+ "skips": 0,
562
+ "todos": 0
563
+ },
546
564
  "a-real-dispatch-records-the-tool-that-served-it.test.mjs": {
547
565
  "tests": 1,
548
566
  "asserts": 5,
@@ -629,7 +647,7 @@
629
647
  },
630
648
  "a-release-note-is-written-for-its-reader.test.mjs": {
631
649
  "tests": 9,
632
- "asserts": 63,
650
+ "asserts": 66,
633
651
  "skips": 0,
634
652
  "todos": 0
635
653
  },
@@ -1301,7 +1319,7 @@
1301
1319
  },
1302
1320
  "client-door.test.mjs": {
1303
1321
  "tests": 38,
1304
- "asserts": 161,
1322
+ "asserts": 162,
1305
1323
  "skips": 1,
1306
1324
  "todos": 0
1307
1325
  },
@@ -2781,6 +2799,12 @@
2781
2799
  "skips": 0,
2782
2800
  "todos": 0
2783
2801
  },
2802
+ "nothing-a-command-awaits-imports-it-back.test.mjs": {
2803
+ "tests": 16,
2804
+ "asserts": 49,
2805
+ "skips": 0,
2806
+ "todos": 0
2807
+ },
2784
2808
  "numeric-setting-refuses.test.mjs": {
2785
2809
  "tests": 15,
2786
2810
  "asserts": 35,
@@ -3095,7 +3119,7 @@
3095
3119
  },
3096
3120
  "portal-service.test.mjs": {
3097
3121
  "tests": 124,
3098
- "asserts": 671,
3122
+ "asserts": 673,
3099
3123
  "skips": 1,
3100
3124
  "todos": 0
3101
3125
  },
@@ -4217,7 +4241,13 @@
4217
4241
  },
4218
4242
  "start-refuses-on-a-box-that-has-the-services.test.mjs": {
4219
4243
  "tests": 6,
4220
- "asserts": 17,
4244
+ "asserts": 20,
4245
+ "skips": 0,
4246
+ "todos": 0
4247
+ },
4248
+ "status-and-stop-see-a-foreground-start.test.mjs": {
4249
+ "tests": 6,
4250
+ "asserts": 25,
4221
4251
  "skips": 0,
4222
4252
  "todos": 0
4223
4253
  },
@@ -4515,6 +4545,12 @@
4515
4545
  "skips": 0,
4516
4546
  "todos": 0
4517
4547
  },
4548
+ "the-demo-offers-no-background-form.test.mjs": {
4549
+ "tests": 4,
4550
+ "asserts": 14,
4551
+ "skips": 0,
4552
+ "todos": 0
4553
+ },
4518
4554
  "the-door-answers-the-address-it-advertises.test.mjs": {
4519
4555
  "tests": 9,
4520
4556
  "asserts": 37,
@@ -4635,6 +4671,12 @@
4635
4671
  "skips": 0,
4636
4672
  "todos": 0
4637
4673
  },
4674
+ "the-install-guide-says-how-to-remove-it.test.mjs": {
4675
+ "tests": 4,
4676
+ "asserts": 11,
4677
+ "skips": 0,
4678
+ "todos": 0
4679
+ },
4638
4680
  "the-install-names-the-auth-values-it-needs.test.mjs": {
4639
4681
  "tests": 9,
4640
4682
  "asserts": 25,
@@ -4804,8 +4846,8 @@
4804
4846
  "todos": 0
4805
4847
  },
4806
4848
  "the-published-manifest-is-not-the-repos-manifest.test.mjs": {
4807
- "tests": 18,
4808
- "asserts": 65,
4849
+ "tests": 21,
4850
+ "asserts": 82,
4809
4851
  "skips": 1,
4810
4852
  "todos": 0
4811
4853
  },
@@ -5828,8 +5870,8 @@
5828
5870
  "todos": 0
5829
5871
  },
5830
5872
  "nav.test.ts": {
5831
- "tests": 12,
5832
- "asserts": 57,
5873
+ "tests": 13,
5874
+ "asserts": 67,
5833
5875
  "skips": 0,
5834
5876
  "todos": 0
5835
5877
  },
@@ -112,19 +112,13 @@ export function unitsNeedingRender(root = ROOT) {
112
112
  // through `envFrom`, so a name that later gains an old spelling in the alias table keeps resolving —
113
113
  // a literal `process.env.X` here would be a spelling, and a spelling goes stale in silence.
114
114
  //
115
- // A `KEY=value` parser and nothing more: this reads the same file systemd's EnvironmentFile= reads, and
116
- // systemd does no shell expansion there either. Quotes are stripped because operators write them.
117
- export function parseEnvFile(text) {
118
- const out = {};
119
- for (const line of String(text ?? "").split("\n")) {
120
- const m = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(line);
121
- if (!m) continue;
122
- let v = m[2].trim();
123
- if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) v = v.slice(1, -1);
124
- out[m[1]] = v;
125
- }
126
- return out;
127
- }
115
+ // A `KEY=value` parser and nothing more, and it lives in `shared/env-file-merge.mjs` a file that
116
+ // imports nothing. THIS module is a command too: its `--apply` path awaits at the top level and imports
117
+ // `bin/start.mjs` from inside that await, so anything that took the parser from here put a CLI in its
118
+ // import path, and `start.mjs` doing so closed a cycle that stopped 21 install arms at once. Re-exported
119
+ // so every reader here keeps one reader and one spelling.
120
+ export { parseEnvFile } from "../../shared/env-file-merge.mjs";
121
+ import { parseEnvFile } from "../../shared/env-file-merge.mjs";
128
122
 
129
123
  export function resolveValues(names, { env = process.env, envFile = null } = {}) {
130
124
  const fileVals = envFile && existsSync(envFile) ? parseEnvFile(readFileSync(envFile, "utf8")) : {};
@@ -35,7 +35,7 @@
35
35
  // PURE. It opens no file and knows no path: the caller injects the unit text and the env-file text, so
36
36
  // every branch — including the ones a developer box cannot produce — is drivable from a test.
37
37
 
38
- import { parseEnvFile } from "./systemd/render-units.mjs";
38
+ import { parseEnvFile } from "../shared/env-file-merge.mjs"; // the leaf the unit renderer re-exports it from; this module stays free of the command
39
39
 
40
40
  /** systemd's own name for "load this file, and do not fail if it is missing". */
41
41
  const OPTIONAL = "-";
@@ -1,5 +1,17 @@
1
1
  # trademark-artifacts-mcp
2
2
 
3
+ ## 0.3.0
4
+
5
+ No changes in this release.
6
+
7
+ ## 0.3.0-beta.10
8
+
9
+ No changes in this release.
10
+
11
+ ## 0.3.0-beta.9
12
+
13
+ No changes in this release.
14
+
3
15
  ## 0.3.0-beta.8
4
16
 
5
17
  No changes in this release.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trademark-artifacts-mcp",
3
- "version": "0.3.0-beta.8",
3
+ "version": "0.3.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "private": true,
6
6
  "description": "MCP server to interrogate clearotron trademark-clearance runs — list/read artifacts, trace the full decision flow, telemetry/cost, coverage, single-run search, and a gated single-step what-if. Imports the clearotron-driver read-only; touches no driver/template/deploy files.",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "clearotron",
3
3
  "type": "module",
4
- "version": "0.3.0-beta.8",
4
+ "version": "0.3.0",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
7
7
  "type": "git",
@@ -11008,7 +11008,8 @@ var NAV = [
11008
11008
  label: "Clearance",
11009
11009
  path: "/portal/result",
11010
11010
  icon: "layers",
11011
- hidden: true
11011
+ hidden: true,
11012
+ subtree: true
11012
11013
  },
11013
11014
  {
11014
11015
  id: "about",
@@ -11107,7 +11108,7 @@ function avatarMenuFor(who, entries = NAV) {
11107
11108
  }
11108
11109
  function screenForPath(path, who, entries = NAV) {
11109
11110
  const clean = path.replace(/[?#].*$/, "").replace(/\/+$/, "") || "/portal";
11110
- const hits = flatten(routableFor(who, entries)).filter((e) => clean === e.path || clean.startsWith(e.path + "/"));
11111
+ const hits = flatten(routableFor(who, entries)).filter((e) => clean === e.path || e.subtree === true && clean.startsWith(e.path + "/"));
11111
11112
  if (!hits.length) return null;
11112
11113
  return hits.reduce((a, b) => b.path.length > a.path.length ? b : a);
11113
11114
  }
@@ -49,7 +49,7 @@
49
49
  -->
50
50
  <link rel="preconnect" href="https://api.fontshare.com" crossorigin />
51
51
  <link href="https://api.fontshare.com/v2/css?f[]=satoshi@400,500,700,900&display=swap" rel="stylesheet" />
52
- <script type="module" crossorigin src="/portal/assets/index-qes7gLpM.js"></script>
52
+ <script type="module" crossorigin src="/portal/assets/index-CwPAS0we.js"></script>
53
53
  <link rel="stylesheet" crossorigin href="/portal/assets/index-Cv-E_agg.css">
54
54
  </head>
55
55
  <body>
@@ -2,7 +2,7 @@
2
2
  "name": "portal-ui",
3
3
  "private": true,
4
4
  "type": "module",
5
- "version": "0.3.0-beta.8",
5
+ "version": "0.3.0",
6
6
  "license": "AGPL-3.0-only",
7
7
  "description": "The unified trademark portal UI. One address, one login: who you are decides what you see. Built as a static bundle, served by driver/portal-service.mjs — the browser never reaches profile-service or recipe-service.",
8
8
  "engines": {
@@ -1,5 +1,17 @@
1
1
  # trademark-oauth-mcp-bridge
2
2
 
3
+ ## 0.3.0
4
+
5
+ No changes in this release.
6
+
7
+ ## 0.3.0-beta.10
8
+
9
+ No changes in this release.
10
+
11
+ ## 0.3.0-beta.9
12
+
13
+ No changes in this release.
14
+
3
15
  ## 0.3.0-beta.8
4
16
 
5
17
  No changes in this release.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trademark-oauth-mcp-bridge",
3
- "version": "0.3.0-beta.8",
3
+ "version": "0.3.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "private": true,
6
6
  "description": "OAuth 2.1 MCP stdio bridge used by the engine's case-law gather stage (courtlistener / legaldatahunter).",