@starci/hfs 4.0.6 → 4.0.7
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.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.0.7 - 2026-10-01
|
|
4
|
+
|
|
5
|
+
- Changed: the runtime layer check (scripts/api/<system>, a pure scripts/lib) in its bundled runtime.
|
|
6
|
+
|
|
3
7
|
## 4.0.6 - 2026-10-01
|
|
4
8
|
|
|
5
9
|
- Changed: R112 integration specs, the runtime api layer, the examples-root CI scope and the new pins.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starci/hfs",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.7",
|
|
4
4
|
"description": "The HFS command line of a StarCi app (one repository: the root, be/ and fe/): hfs lint, check, scaffold app, explain, sync and work-hygiene. Self-contained: it carries the runtime files it reads.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -31,14 +31,14 @@ pins:
|
|
|
31
31
|
source: packages/grammar/package.json
|
|
32
32
|
why: nivo-fe pins 0.4.11 and 0.5.0 in one workspace, starci-next-fe 0.5.1, miamia-fe 0.5.0; the runtime source is 0.8.0 (the brand layer sets `--font-sans` and `--font-mono`; the grammar reads them; 0.7.2 added the Input tel kind and IconButton disclosure props).
|
|
33
33
|
'@starci/eslint-canon-be':
|
|
34
|
-
version: 3.0.
|
|
34
|
+
version: 3.0.7
|
|
35
35
|
group: starci
|
|
36
36
|
install: registry
|
|
37
37
|
side: be
|
|
38
38
|
source: packages/eslint/be/package.json
|
|
39
39
|
why: '3.0.3: its bundled canon-pins copy pins stylelint-canon 2.0.2 and hfs 4.0.3; no rule changed. 3.0.2: its bundled runtime copies (slots, canon-pins, failure codes, the architecture machine) put .starcistacks and .sops.yaml at the app root (app.starcistacks, app.sops) and pin hfs 4.0.2. 3.0.1: its bundled canon-pins copy pins hfs 4.0.1. 3.0.0: `loadHfs(import.meta.url)` of be/eslint.config.mjs finds the app-root hfs.json (kind app) and gives every linted file the view of the be side; the project graph is built per side. 2.0.0 (C0 release): starciBeConfig({ hfs: loadHfs(import.meta.url) }) typed factory and the BE-CONVENTION laws.'
|
|
40
40
|
'@starci/eslint-canon-fe':
|
|
41
|
-
version: 8.0.
|
|
41
|
+
version: 8.0.7
|
|
42
42
|
group: starci
|
|
43
43
|
install: registry
|
|
44
44
|
side: fe
|
|
@@ -78,7 +78,7 @@ pins:
|
|
|
78
78
|
source: packages/test-world/package.json
|
|
79
79
|
why: '1.0.5: a modules world boots real peer apps beside its modules, world.apps.<name>.during(fn) is the outage of a peer app, and w.keycloak.clientSecret(client) answers the run-generated secret of a confidential realm client. 1.0.4: world.resolve and scope.resolve take any Nest token (class, string or symbol). 1.0.3: the globalSetup registers the path aliases as TypeScript resolves them (the extends chain, paths from the config that declares them, the effective baseUrl), so a tests tsconfig that only extends the side config loads the declaration. 1.0.2: every path a declaration names (`stack`, seeds, the realm, Dockerfiles) resolves from the app root (the directory of hfs.json), where .starcistacks lives, never from the be side. The shared e2e library of every back end (R47, R48): the warm stack behind toxiproxy, the network-edge fakes, the Nest boot, the typed useTestWorld handle, useSandbox for contract specs, the outage lock and the starci-test-stack bin behind the managed test:stack script; a devDependency of every back end. 1.0.1: world.keycloak.events/sessions (the user events of the realm and live sessions through the admin API) and world.infra.postgresql.connection(name) (the database of one connection down while the others serve, under the outage lock).'
|
|
80
80
|
'@starci/hfs':
|
|
81
|
-
version: 4.0.
|
|
81
|
+
version: 4.0.7
|
|
82
82
|
group: starci
|
|
83
83
|
install: registry
|
|
84
84
|
side: both
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// decrypt.mjs — one `sops` decryption: the custody reads (scripts/lib/sops-exec-env.mjs readCustody) and the test
|
|
2
|
+
// secrets (scripts/lib/test-secrets.mjs testSecret). The plaintext stays in this process's memory (stdout over a pipe).
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Run `<bin> <args>` with SOPS_AGE_KEY_FILE defaulted to ~/.starci/master.identity. {status, stdout, stderr, error}.
|
|
9
|
+
*/
|
|
10
|
+
export function sopsDecrypt(bin, args, { env = process.env, cwd = undefined, maxBuffer = 16 * 1024 * 1024 } = {}) {
|
|
11
|
+
const r = spawnSync(bin, args, {
|
|
12
|
+
cwd, encoding: 'utf8', windowsHide: true, maxBuffer,
|
|
13
|
+
env: { ...env, SOPS_AGE_KEY_FILE: env.SOPS_AGE_KEY_FILE || path.join(os.homedir(), '.starci', 'master.identity') },
|
|
14
|
+
});
|
|
15
|
+
return { status: r.status, stdout: r.stdout, stderr: r.stderr, error: r.error ?? null };
|
|
16
|
+
}
|
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
// const password = testSecret('login-capture-password', { repo });
|
|
17
17
|
// The push secret scan (scripts/supervisor/push-mains.mjs) passes a `.enc` only when isSopsEnvelope holds.
|
|
18
18
|
import fs from 'node:fs';
|
|
19
|
-
import os from 'node:os';
|
|
20
19
|
import path from 'node:path';
|
|
21
|
-
import {
|
|
20
|
+
import { sopsDecrypt } from '../api/sops/decrypt.mjs';
|
|
22
21
|
import { fileURLToPath } from 'node:url';
|
|
23
22
|
import { parseYaml } from '../../engine/yaml.mjs';
|
|
24
23
|
|
|
@@ -67,10 +66,7 @@ export function testSecret(name, { repo, stack = 'dev', env = process.env, sops
|
|
|
67
66
|
const bin = sops ?? resolveSops(env);
|
|
68
67
|
if (!bin) throw new Error('sops is not installed (Windows: winget install Mozilla.SOPS)');
|
|
69
68
|
const format = sopsFormatFor(plain);
|
|
70
|
-
const r =
|
|
71
|
-
cwd: path.resolve(String(repo)), encoding: 'utf8', windowsHide: true,
|
|
72
|
-
env: { ...env, SOPS_AGE_KEY_FILE: env.SOPS_AGE_KEY_FILE || path.join(os.homedir(), '.starci', 'master.identity') },
|
|
73
|
-
});
|
|
69
|
+
const r = sopsDecrypt(bin, ['--decrypt', '--input-type', format, '--output-type', format, enc], { cwd: path.resolve(String(repo)), env, maxBuffer: 1024 * 1024 });
|
|
74
70
|
if (r.status !== 0) throw new Error(`test secret ${name}: sops could not decrypt .starcistacks/${rel}.enc (${String(r.stderr ?? r.error?.message ?? '').trim().split(/\r?\n/).pop()})`);
|
|
75
71
|
return String(r.stdout).replace(/\r?\n$/, '');
|
|
76
72
|
}
|