@rightkit/release 0.4.1 → 0.5.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.
@@ -19,6 +19,7 @@
19
19
  "@rightkit/doc-render": "0.2.1",
20
20
  "@rightkit/hooks": "0.1.2",
21
21
  "@rightkit/i18n": "0.2.0",
22
+ "@rightkit/issues-tracker": "0.1.0",
22
23
  "@rightkit/legal": "0.6.1",
23
24
  "@rightkit/legal-ui": "0.4.1",
24
25
  "@rightkit/license": "0.3.0",
@@ -31,7 +32,7 @@
31
32
  "@rightkit/qa": "0.5.2",
32
33
  "@rightkit/qa-chrome": "0.1.10",
33
34
  "@rightkit/react-shell": "0.7.2",
34
- "@rightkit/release": "0.4.1",
35
+ "@rightkit/release": "0.5.0",
35
36
  "@rightkit/settings-ui": "0.7.0",
36
37
  "@rightkit/tauri": "0.3.0",
37
38
  "@rightkit/tauri-shell": "0.1.2",
@@ -220,7 +221,8 @@
220
221
  "0.2.173",
221
222
  "0.2.174",
222
223
  "0.3.0",
223
- "0.4.0"
224
+ "0.4.0",
225
+ "0.4.1"
224
226
  ],
225
227
  "@rightkit/qa": [
226
228
  "0.1.0",
@@ -424,49 +426,50 @@
424
426
  "rightkit-tauri": "0.1.0"
425
427
  },
426
428
  "stagedCargo": {
427
- "rightkit-agent-tools": "0.2.1",
429
+ "rightkit-agent-tools": "0.3.0",
428
430
  "rightkit-agents": "0.2.0",
429
431
  "rightkit-android": "0.3.0",
430
432
  "rightkit-app-settings": "0.3.0",
431
433
  "rightkit-asr": "0.3.0",
432
434
  "rightkit-audio": "0.3.1",
433
- "rightkit-automation": "0.5.0",
435
+ "rightkit-automation": "0.6.0",
434
436
  "rightkit-browser": "0.3.5",
435
437
  "rightkit-cache": "0.2.3",
436
438
  "rightkit-channel-memory": "0.2.1",
437
- "rightkit-child-process": "0.5.4",
439
+ "rightkit-child-process": "0.5.5",
438
440
  "rightkit-compose": "0.2.0",
439
441
  "rightkit-contracts": "0.1.7",
440
- "rightkit-crash": "0.3.4",
441
- "rightkit-credentials": "0.3.1",
442
+ "rightkit-crash": "0.3.6",
443
+ "rightkit-credentials": "0.4.2",
442
444
  "rightkit-crypto": "0.1.0",
443
- "rightkit-daemon": "0.3.1",
444
- "rightkit-db": "0.5.0",
445
- "rightkit-device": "0.3.1",
446
- "rightkit-docs": "0.1.1",
447
- "rightkit-embed": "0.6.0",
445
+ "rightkit-daemon": "0.4.0",
446
+ "rightkit-db": "0.5.1",
447
+ "rightkit-device": "0.4.0",
448
+ "rightkit-docs": "0.1.2",
449
+ "rightkit-embed": "0.6.1",
448
450
  "rightkit-ffmpeg": "0.2.10",
449
451
  "rightkit-file-watch": "0.4.1",
450
452
  "rightkit-fs": "0.4.6",
451
- "rightkit-fsindex": "0.4.1",
453
+ "rightkit-fsindex": "0.5.0",
452
454
  "rightkit-google-identity": "0.2.0",
453
455
  "rightkit-hooks": "0.2.0",
454
456
  "rightkit-hotkeys": "0.1.2",
455
457
  "rightkit-http": "0.3.8",
456
458
  "rightkit-identity": "0.1.0",
457
- "rightkit-job-queue": "0.4.1",
459
+ "rightkit-job-queue": "0.5.0",
458
460
  "rightkit-license": "0.2.4",
459
461
  "rightkit-llm": "0.3.0",
460
462
  "rightkit-logs": "0.3.5",
461
463
  "rightkit-mcp": "0.7.0",
462
- "rightkit-models": "0.5.0",
464
+ "rightkit-models": "0.5.1",
463
465
  "rightkit-motion": "0.2.0",
464
- "rightkit-oauth": "0.9.0",
466
+ "rightkit-oauth": "0.10.0",
465
467
  "rightkit-ocr": "0.2.3",
466
468
  "rightkit-onnx": "0.2.7",
467
- "rightkit-overlay": "0.1.2",
468
- "rightkit-ownership": "0.3.1",
469
- "rightkit-pdf": "0.3.2",
469
+ "rightkit-overlay": "0.2.0",
470
+ "rightkit-overlay-win": "0.1.0",
471
+ "rightkit-ownership": "0.4.0",
472
+ "rightkit-pdf": "0.3.3",
470
473
  "rightkit-platform-rules": "0.1.0",
471
474
  "rightkit-playback": "0.3.0",
472
475
  "rightkit-qa": "0.7.1",
@@ -506,63 +509,64 @@
506
509
  },
507
510
  "registry": {
508
511
  "cargo": {
509
- "rightkit-agent-tools": "0.2.0",
512
+ "rightkit-agent-tools": "0.3.0",
510
513
  "rightkit-agents": "0.2.0",
511
- "rightkit-android": "0.2.0",
514
+ "rightkit-android": "0.3.0",
512
515
  "rightkit-app-settings": "0.3.0",
513
- "rightkit-asr": "0.2.4",
516
+ "rightkit-asr": "0.3.0",
514
517
  "rightkit-audio": "0.3.1",
515
- "rightkit-automation": "0.5.0",
518
+ "rightkit-automation": "0.6.0",
516
519
  "rightkit-browser": "0.3.4",
517
520
  "rightkit-cache": "0.2.3",
518
521
  "rightkit-channel-memory": "0.2.1",
519
- "rightkit-child-process": "0.5.4",
522
+ "rightkit-child-process": "0.5.5",
520
523
  "rightkit-compose": "0.2.0",
521
524
  "rightkit-contracts": "0.1.7",
522
525
  "rightkit-control": "0.3.0",
523
- "rightkit-crash": "0.3.4",
524
- "rightkit-credentials": "0.3.0",
526
+ "rightkit-crash": "0.3.6",
527
+ "rightkit-credentials": "0.4.2",
525
528
  "rightkit-crypto": "0.1.0",
526
- "rightkit-daemon": "0.3.0",
529
+ "rightkit-daemon": "0.4.0",
527
530
  "rightkit-db": "0.5.1",
528
- "rightkit-device": "0.3.1",
529
- "rightkit-docs": "0.1.1",
530
- "rightkit-embed": "0.6.0",
531
- "rightkit-ffmpeg": "0.2.9",
531
+ "rightkit-device": "0.4.0",
532
+ "rightkit-docs": "0.1.2",
533
+ "rightkit-embed": "0.6.1",
534
+ "rightkit-ffmpeg": "0.2.10",
532
535
  "rightkit-file-watch": "0.4.1",
533
536
  "rightkit-framed-sidecar": "0.2.0",
534
537
  "rightkit-fs": "0.4.6",
535
- "rightkit-fsindex": "0.4.1",
536
- "rightkit-google-identity": "0.1.0",
538
+ "rightkit-fsindex": "0.5.0",
539
+ "rightkit-google-identity": "0.2.0",
537
540
  "rightkit-hooks": "0.2.0",
538
541
  "rightkit-hotkeys": "0.1.2",
539
542
  "rightkit-http": "0.3.8",
540
543
  "rightkit-identity": "0.1.0",
541
- "rightkit-job-queue": "0.4.0",
544
+ "rightkit-job-queue": "0.5.0",
542
545
  "rightkit-jobs": "0.3.0",
543
- "rightkit-license": "0.2.3",
546
+ "rightkit-license": "0.2.4",
544
547
  "rightkit-llm": "0.3.0",
545
548
  "rightkit-logs": "0.3.5",
546
549
  "rightkit-mcp": "0.7.0",
547
550
  "rightkit-media": "0.2.6",
548
- "rightkit-models": "0.4.4",
549
- "rightkit-motion": "0.1.0",
550
- "rightkit-oauth": "0.9.0",
551
+ "rightkit-models": "0.5.1",
552
+ "rightkit-motion": "0.2.0",
553
+ "rightkit-oauth": "0.10.0",
551
554
  "rightkit-ocr": "0.2.3",
552
- "rightkit-onnx": "0.2.6",
555
+ "rightkit-onnx": "0.2.7",
553
556
  "rightkit-ort": "0.2.3",
554
- "rightkit-overlay": "0.1.2",
555
- "rightkit-ownership": "0.3.1",
556
- "rightkit-pdf": "0.3.2",
557
+ "rightkit-overlay": "0.2.0",
558
+ "rightkit-overlay-win": "0.1.0",
559
+ "rightkit-ownership": "0.4.0",
560
+ "rightkit-pdf": "0.3.3",
557
561
  "rightkit-platform-rules": "0.1.0",
558
- "rightkit-playback": "0.2.2",
562
+ "rightkit-playback": "0.3.0",
559
563
  "rightkit-process": "0.4.0",
560
564
  "rightkit-qa": "0.7.1",
561
565
  "rightkit-qa-driver": "0.6.0",
562
566
  "rightkit-qts": "0.2.6",
563
567
  "rightkit-qts-ggml": "0.1.2",
564
568
  "rightkit-qts-ggml-sys": "0.1.2",
565
- "rightkit-record": "0.3.2",
569
+ "rightkit-record": "0.3.3",
566
570
  "rightkit-review": "0.4.0",
567
571
  "rightkit-sandbox": "0.5.0",
568
572
  "rightkit-search": "0.4.0",
@@ -572,8 +576,8 @@
572
576
  "rightkit-settings": "0.2.0",
573
577
  "rightkit-shell": "0.3.0",
574
578
  "rightkit-sidecar": "0.3.0",
575
- "rightkit-speech-client": "0.3.6",
576
- "rightkit-spend": "0.1.1",
579
+ "rightkit-speech-client": "0.4.0",
580
+ "rightkit-spend": "0.2.0",
577
581
  "rightkit-sync": "0.2.2",
578
582
  "rightkit-tauri": "0.1.3",
579
583
  "rightkit-tauri-shell": "0.4.0",
@@ -584,13 +588,13 @@
584
588
  "rightkit-tts-qwen-sys": "0.1.2",
585
589
  "rightkit-typeset": "0.1.0",
586
590
  "rightkit-vad": "0.1.2",
587
- "rightkit-vault": "0.1.0",
591
+ "rightkit-vault": "0.2.0",
588
592
  "rightkit-watch": "0.4.0",
589
593
  "rightkit-workflow": "0.2.0"
590
594
  },
591
595
  "npm": {
592
596
  "@rightkit/app-shell": "0.6.2",
593
- "@rightkit/app-update": "0.4.0",
597
+ "@rightkit/app-update": "0.4.1",
594
598
  "@rightkit/ax": "0.3.2",
595
599
  "@rightkit/ci": "0.3.0",
596
600
  "@rightkit/doc-render": "0.2.1",
@@ -600,7 +604,7 @@
600
604
  "@rightkit/legal": "0.6.1",
601
605
  "@rightkit/legal-ui": "0.4.1",
602
606
  "@rightkit/license": "0.3.0",
603
- "@rightkit/logs": "0.1.5",
607
+ "@rightkit/logs": "0.1.6",
604
608
  "@rightkit/media-ui": "0.3.4",
605
609
  "@rightkit/onboarding": "0.6.3",
606
610
  "@rightkit/outdated": "0.2.0",
@@ -609,8 +613,8 @@
609
613
  "@rightkit/qa": "0.5.2",
610
614
  "@rightkit/qa-chrome": "0.1.10",
611
615
  "@rightkit/react-shell": "0.7.2",
612
- "@rightkit/release": "0.4.0",
613
- "@rightkit/settings-ui": "0.6.1",
616
+ "@rightkit/release": "0.4.1",
617
+ "@rightkit/settings-ui": "0.7.0",
614
618
  "@rightkit/shell": "0.1.1",
615
619
  "@rightkit/tauri": "0.3.0",
616
620
  "@rightkit/tauri-shell": "0.1.2",
@@ -621,7 +625,8 @@
621
625
  "legacyCargo": {
622
626
  "rightkit-ownership": [
623
627
  "0.2.0",
624
- "0.2.1"
628
+ "0.2.1",
629
+ "0.3.1"
625
630
  ],
626
631
  "rightkit-browser": [
627
632
  "0.2.0",
@@ -666,7 +671,8 @@
666
671
  "0.3.1",
667
672
  "0.3.2",
668
673
  "0.4.0",
669
- "0.5.0"
674
+ "0.5.0",
675
+ "0.6.0"
670
676
  ],
671
677
  "rightkit-jobs": [
672
678
  "0.2.1",
@@ -829,7 +835,8 @@
829
835
  ],
830
836
  "rightkit-pdf": [
831
837
  "0.1.0",
832
- "0.3.0"
838
+ "0.3.0",
839
+ "0.3.2"
833
840
  ],
834
841
  "rightkit-speech-client": [
835
842
  "0.3.0",
@@ -845,7 +852,9 @@
845
852
  "0.2.2",
846
853
  "0.3.0",
847
854
  "0.3.2",
848
- "0.3.3"
855
+ "0.3.3",
856
+ "0.3.4",
857
+ "0.3.5"
849
858
  ],
850
859
  "rightkit-qts-ggml-sys": [
851
860
  "0.1.0",
@@ -855,7 +864,8 @@
855
864
  "0.1.0",
856
865
  "0.2.0",
857
866
  "0.2.1",
858
- "0.3.0"
867
+ "0.3.0",
868
+ "0.4.1"
859
869
  ],
860
870
  "rightkit-asr": [
861
871
  "0.0.2",
@@ -941,7 +951,8 @@
941
951
  "0.5.0",
942
952
  "0.5.1",
943
953
  "0.5.2",
944
- "0.5.3"
954
+ "0.5.3",
955
+ "0.5.4"
945
956
  ],
946
957
  "rightkit-hotkeys": [
947
958
  "0.1.0",
@@ -965,7 +976,8 @@
965
976
  "0.2.1"
966
977
  ],
967
978
  "rightkit-overlay": [
968
- "0.1.1"
979
+ "0.1.1",
980
+ "0.1.2"
969
981
  ],
970
982
  "rightkit-app-settings": [
971
983
  "0.2.0",
@@ -984,7 +996,9 @@
984
996
  "rightkit-credentials": [
985
997
  "0.2.0",
986
998
  "0.2.1",
987
- "0.3.0"
999
+ "0.3.0",
1000
+ "0.4.0",
1001
+ "0.4.1"
988
1002
  ],
989
1003
  "rightkit-review": [
990
1004
  "0.2.0"
@@ -995,7 +1009,8 @@
995
1009
  "rightkit-device": [
996
1010
  "0.1.3",
997
1011
  "0.2.0",
998
- "0.3.0"
1012
+ "0.3.0",
1013
+ "0.3.1"
999
1014
  ],
1000
1015
  "rightkit-onnx": [
1001
1016
  "0.2.3",
@@ -1010,7 +1025,8 @@
1010
1025
  "0.2.0"
1011
1026
  ],
1012
1027
  "rightkit-docs": [
1013
- "0.1.0"
1028
+ "0.1.0",
1029
+ "0.1.1"
1014
1030
  ],
1015
1031
  "rightkit-tts-qwen": [
1016
1032
  "0.2.6"
@@ -21,6 +21,10 @@
21
21
  "ceilings": null,
22
22
  "requiredScale": null
23
23
  },
24
+ "rightkit-crash": {
25
+ "ceilings": null,
26
+ "requiredScale": null
27
+ },
24
28
  "rightkit-embed": {
25
29
  "ceilings": null,
26
30
  "requiredScale": null
@@ -41,6 +45,10 @@
41
45
  "ceilings": null,
42
46
  "requiredScale": null
43
47
  },
48
+ "rightkit-overlay-win": {
49
+ "ceilings": null,
50
+ "requiredScale": null
51
+ },
44
52
  "rightkit-record": {
45
53
  "ceilings": null,
46
54
  "requiredScale": null
@@ -0,0 +1,107 @@
1
+ // Canonical JSON and the scan-set digest, shared by the scanner (deterministic-scans.mjs) and the credentialed
2
+ // receipt verifiers (scripts/ci/scan-receipt.mjs). No imports beyond node:crypto, by design.
3
+ import crypto from "node:crypto";
4
+
5
+ const sha256 = (value) => crypto.createHash("sha256").update(value).digest("hex");
6
+
7
+ /** Deterministic JSON: object keys sorted, no undefined, no non-finite numbers. */
8
+ export function canonicalJson(value) {
9
+ if (value === null || typeof value === "string" || typeof value === "boolean") return JSON.stringify(value);
10
+ if (typeof value === "number") {
11
+ if (!Number.isFinite(value)) throw new TypeError("canonicalJson: non-finite number");
12
+ return JSON.stringify(value);
13
+ }
14
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
15
+ if (typeof value === "object") {
16
+ const keys = Object.keys(value).sort();
17
+ for (const key of keys) if (value[key] === undefined) throw new TypeError(`canonicalJson: undefined at ${key}`);
18
+ return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
19
+ }
20
+ throw new TypeError(`canonicalJson: unsupported ${typeof value}`);
21
+ }
22
+
23
+ /** Digest of a scan set: the sorted (id, class, command) of every entry. Plan items and result rows agree. */
24
+ export function digestScanSet(entries) {
25
+ const rows = entries.map((e) => [String(e.id), String(e.class), String(e.command)]).sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
26
+ return sha256(canonicalJson(rows));
27
+ }
28
+
29
+ // ---- required scan ids ---------------------------------------------------------------------------------
30
+ // The one place the scan ids that belong to a crate are spelled, shared by planScans (deterministic-scans.mjs) and by the
31
+ // credentialed verifiers (scripts/ci/scan-receipt.mjs), so a verifier recomputes what a receipt must contain from the
32
+ // authenticated source and never trusts the plan the producer recorded. Dependency-free by design (see the header).
33
+
34
+ export const rustScanId = Object.freeze({
35
+ check: (name) => `check:${name}`,
36
+ checkFeatures: (name, index) => `check-features:${name}:${index}`,
37
+ clippy: (name, count, index) => (count === 1 ? `clippy:${name}` : `clippy:${name}:${index}`),
38
+ doc: (name) => `doc:${name}`,
39
+ testRust: (name, count, index) => `test:rust:${name}${count === 1 ? "" : `:${index}`}`,
40
+ testRustSerial: (name, count, index) => `test:rust-serial:${name}${count === 1 ? "" : `:${index}`}`,
41
+ packageList: (name) => `cargo-package-list:${name}`,
42
+ changelog: (name) => `changelog-version:${name}`,
43
+ });
44
+
45
+ /**
46
+ * A crate's compile feature plan exactly as CI's gate runs it (ci/gate.config.json rust.<crate>): `lintSets` (clippy; default
47
+ * features when none), whether a default `check` is needed (no lint set covers default features), and the `checkSets` that
48
+ * remain (none when a lint set already uses --all-features).
49
+ */
50
+ export function rustCratePlan(own = {}) {
51
+ const lintSets = Array.isArray(own?.featureSets) && own.featureSets.length ? own.featureSets : [[]];
52
+ const defaultCheck = !lintSets.some((set) => set.length === 0);
53
+ const checkSets = (lintSets.some((set) => set.includes("--all-features")) ? [] : (Array.isArray(own?.checkFeatureSets) ? own.checkFeatureSets : [["--all-features"]])).filter((set) => set.length);
54
+ return { lintSets, defaultCheck, checkSets };
55
+ }
56
+
57
+ /** Scan ids every scan of the whole repository always has when it holds Rust units (cargo.toml, workflows, YAML, JSON and licences). */
58
+ export const WORKSPACE_SCAN_IDS = Object.freeze(["cargo-metadata", "cargo-deny", "cargo-audit", "actionlint", "yaml-parse", "toml-parse", "json-parse", "license", "secret-scan"]);
59
+ /** Prefixes at least one scan id must carry (rustfmt groups by edition, so its exact ids depend on the files). */
60
+ export const REQUIRED_SCAN_PREFIXES = Object.freeze(["rustfmt:"]);
61
+
62
+ /**
63
+ * The scan ids a LOCAL scan record must contain, each with status pass, for these publishable Rust `units` ([names], crates/<name>).
64
+ * `exists(repoPath)` answers from the AUTHENTICATED source (never from the record): src/lib.rs decides `doc`, CHANGELOG.md decides
65
+ * `changelog-version`, and the repository's own ci/advisory-exceptions.json, ownership catalog and docs generator decide theirs.
66
+ * `crateFeatures` is ci/gate.config.json `rust`. `includeTests` adds the per-feature-set test scans. Extra scans in a record are
67
+ * allowed; a missing one is not. planScans builds its ids from the same helpers, and a test holds the two in agreement.
68
+ */
69
+ export function requiredScanIds({ units, crateFeatures = {}, exists, includeTests = false }) {
70
+ if (!Array.isArray(units) || units.length === 0 || !units.every((n) => typeof n === "string" && n)) throw new TypeError("requiredScanIds: units must be a non-empty array of names");
71
+ if (typeof exists !== "function") throw new TypeError("requiredScanIds: exists(repoPath) is required");
72
+ const ids = new Set(WORKSPACE_SCAN_IDS);
73
+ if (exists("ci/advisory-exceptions.json")) ids.add("advisory-exceptions");
74
+ if (exists("packages/release/rightkit-ownership.json") && exists("crates/rightkit-ownership/catalog/ownership-catalog.json")) ids.add("ownership-catalog");
75
+ if (exists("scripts/generate-index.mjs")) ids.add("generated-docs");
76
+ for (const name of units) {
77
+ const own = crateFeatures?.[name] ?? {};
78
+ const { lintSets, defaultCheck, checkSets } = rustCratePlan(own);
79
+ ids.add(rustScanId.packageList(name));
80
+ if (exists(`crates/${name}/CHANGELOG.md`)) ids.add(rustScanId.changelog(name));
81
+ if (defaultCheck) ids.add(rustScanId.check(name));
82
+ checkSets.forEach((_set, i) => ids.add(rustScanId.checkFeatures(name, i)));
83
+ lintSets.forEach((_set, i) => ids.add(rustScanId.clippy(name, lintSets.length, i)));
84
+ if (exists(`crates/${name}/src/lib.rs`)) ids.add(rustScanId.doc(name));
85
+ if (includeTests) {
86
+ lintSets.forEach((_set, i) => {
87
+ ids.add(rustScanId.testRust(name, lintSets.length, i));
88
+ if (own.alsoSerial) ids.add(rustScanId.testRustSerial(name, lintSets.length, i));
89
+ });
90
+ }
91
+ }
92
+ return [...ids].sort();
93
+ }
94
+
95
+ /** Why `rows` (a record's scans) do not contain every required id with status pass; empty when they do. */
96
+ export function requiredScanProblems(rows, required, prefixes = REQUIRED_SCAN_PREFIXES) {
97
+ const byId = new Map();
98
+ for (const row of Array.isArray(rows) ? rows : []) if (row && typeof row.id === "string") byId.set(row.id, row);
99
+ const problems = [];
100
+ for (const id of required) {
101
+ const row = byId.get(id);
102
+ if (!row) problems.push(`required scan ${id} is missing`);
103
+ else if (row.status !== "pass") problems.push(`required scan ${id} is ${row.status}`);
104
+ }
105
+ for (const prefix of prefixes) if (![...byId.values()].some((row) => row.id.startsWith(prefix) && row.status === "pass")) problems.push(`no passing ${prefix}* scan`);
106
+ return problems;
107
+ }