@ploaness/cli 1.6.0 → 1.7.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.
Files changed (62) hide show
  1. package/dist/bin.js +16 -11
  2. package/dist/bin.js.map +1 -1
  3. package/dist/checks/conventions.d.ts.map +1 -1
  4. package/dist/checks/conventions.js +2 -5
  5. package/dist/checks/conventions.js.map +1 -1
  6. package/dist/checks/environment.d.ts +2 -2
  7. package/dist/checks/environment.d.ts.map +1 -1
  8. package/dist/checks/environment.js.map +1 -1
  9. package/dist/checks/images.d.ts.map +1 -1
  10. package/dist/checks/images.js +8 -4
  11. package/dist/checks/images.js.map +1 -1
  12. package/dist/checks/install.d.ts +3 -3
  13. package/dist/checks/install.d.ts.map +1 -1
  14. package/dist/checks/install.js +3 -3
  15. package/dist/checks/install.js.map +1 -1
  16. package/dist/checks/oci-images.d.ts +6 -0
  17. package/dist/checks/oci-images.d.ts.map +1 -0
  18. package/dist/checks/oci-images.js +63 -0
  19. package/dist/checks/oci-images.js.map +1 -0
  20. package/dist/checks/oxlint.d.ts.map +1 -1
  21. package/dist/checks/oxlint.js +1 -1
  22. package/dist/checks/oxlint.js.map +1 -1
  23. package/dist/checks/payload.d.ts.map +1 -1
  24. package/dist/checks/payload.js +12 -7
  25. package/dist/checks/payload.js.map +1 -1
  26. package/dist/checks/references.d.ts +2 -2
  27. package/dist/checks/references.d.ts.map +1 -1
  28. package/dist/checks/references.js.map +1 -1
  29. package/dist/checks/sbom.d.ts +5 -0
  30. package/dist/checks/sbom.d.ts.map +1 -0
  31. package/dist/checks/sbom.js +12 -0
  32. package/dist/checks/sbom.js.map +1 -0
  33. package/dist/checks/tests.d.ts +2 -0
  34. package/dist/checks/tests.d.ts.map +1 -1
  35. package/dist/checks/tests.js +16 -6
  36. package/dist/checks/tests.js.map +1 -1
  37. package/dist/checks/wiring.d.ts.map +1 -1
  38. package/dist/checks/wiring.js +3 -3
  39. package/dist/checks/wiring.js.map +1 -1
  40. package/dist/commands/commit-message.d.ts +1 -1
  41. package/dist/commands/commit-message.d.ts.map +1 -1
  42. package/dist/commands/commit-message.js +2 -2
  43. package/dist/commands/commit-message.js.map +1 -1
  44. package/dist/commands/sbom.d.ts +4 -0
  45. package/dist/commands/sbom.d.ts.map +1 -0
  46. package/dist/commands/sbom.js +13 -0
  47. package/dist/commands/sbom.js.map +1 -0
  48. package/dist/commands/verify.d.ts +3 -3
  49. package/dist/commands/verify.d.ts.map +1 -1
  50. package/dist/commands/verify.js +40 -12
  51. package/dist/commands/verify.js.map +1 -1
  52. package/dist/gates.d.ts +3 -3
  53. package/dist/gates.d.ts.map +1 -1
  54. package/dist/gates.js +3 -1
  55. package/dist/gates.js.map +1 -1
  56. package/dist/probes/payload-defaults.probe.js +2 -2
  57. package/dist/probes/payload-defaults.probe.js.map +1 -1
  58. package/dist/sbom.d.ts +5 -0
  59. package/dist/sbom.d.ts.map +1 -0
  60. package/dist/sbom.js +183 -0
  61. package/dist/sbom.js.map +1 -0
  62. package/package.json +8 -7
package/dist/sbom.js ADDED
@@ -0,0 +1,183 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import path from 'node:path';
5
+ import process from 'node:process';
6
+ import { CONTAINER_IMAGES, canonicalInventory, readKey, SBOM_SCOPE, sbomInputProblems, sbomProblems, sbomWithWorkspaceRoles, } from '@ploaness/governance';
7
+ import { parseAllDocuments } from 'yaml';
8
+ import { acquireImage } from './checks/container-run.js';
9
+ import { git } from './context.js';
10
+ import { run } from './exec.js';
11
+ import { workingTreeFingerprint } from './working-tree.js';
12
+ const JSON_INDENT = 2;
13
+ const SBOM_TIMEOUT_MS = 300_000;
14
+ const IMAGE = CONTAINER_IMAGES.cdxgen;
15
+ const hashFile = (file) => createHash('sha256').update(readFileSync(file)).digest('hex');
16
+ const readJson = (file) => JSON.parse(readFileSync(file, 'utf8'));
17
+ const lockDocument = (file) => {
18
+ const documents = parseAllDocuments(readFileSync(file, 'utf8'));
19
+ if (documents.length === 0 || documents.some((document) => document.errors.length > 0)) {
20
+ throw new Error(`${file} is not a readable pnpm lockfile`);
21
+ }
22
+ return documents.at(-1)?.toJS();
23
+ };
24
+ const assertInputs = (repository) => {
25
+ const problems = sbomInputProblems(repository.projects, lockDocument(path.join(repository.root, 'pnpm-lock.yaml')), lockDocument(path.join(repository.root, 'node_modules/.pnpm/lock.yaml')), existsSync(path.join(repository.root, 'pnpm-workspace.yaml'))
26
+ ? lockDocument(path.join(repository.root, 'pnpm-workspace.yaml'))
27
+ : {});
28
+ if (problems.length > 0) {
29
+ throw new Error(problems.join('\n'));
30
+ }
31
+ };
32
+ // Resolve existing ancestors so an ignored symlink cannot direct output into authored content.
33
+ const resolvedDestination = (directory) => existsSync(directory)
34
+ ? realpathSync(directory)
35
+ : path.join(resolvedDestination(path.dirname(directory)), path.basename(directory));
36
+ const outputDirectory = (repository, requested) => {
37
+ const directory = resolvedDestination(path.resolve(requested));
38
+ const relative = path.relative(realpathSync(repository.root), directory);
39
+ const isInside = relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
40
+ if (isInside) {
41
+ const ignored = ['bom.cdx.json', 'release.json', 'bom.cdx.json.tmp', 'release.json.tmp'].map((file) => run('git', ['check-ignore', '--quiet', '--', path.join(directory, file)], {
42
+ cwd: repository.root,
43
+ }));
44
+ const tracked = git(repository, ['ls-files', '--', relative]);
45
+ if (ignored.some((result) => result.code !== 0) || tracked.length > 0) {
46
+ throw new Error('SBOM output must be in an ignored artifact directory or outside the repository');
47
+ }
48
+ }
49
+ return directory;
50
+ };
51
+ const mirrorInputs = (repository, directory) => {
52
+ const files = [
53
+ ...new Set([
54
+ 'package.json',
55
+ 'pnpm-lock.yaml',
56
+ ...(existsSync(path.join(repository.root, 'pnpm-workspace.yaml')) ? ['pnpm-workspace.yaml'] : []),
57
+ ...repository.projects.map((project) => path.join(project.path, 'package.json')),
58
+ ]),
59
+ ];
60
+ for (const file of files) {
61
+ const destination = path.join(directory, file);
62
+ mkdirSync(path.dirname(destination), { recursive: true });
63
+ copyFileSync(path.join(repository.root, file), destination);
64
+ }
65
+ };
66
+ // Linux bind mounts retain host ownership, including private lockfiles and output directories.
67
+ // Docker Desktop handles the ownership mapping on hosts without POSIX user identities.
68
+ const containerUserArguments = () => {
69
+ const uid = process.geteuid?.();
70
+ const gid = process.getegid?.();
71
+ return uid === undefined || gid === undefined ? [] : ['--user', `${String(uid)}:${String(gid)}`];
72
+ };
73
+ const generate = (repository, directory) => {
74
+ const input = path.join(directory, 'input');
75
+ const output = path.join(directory, 'output');
76
+ mkdirSync(input);
77
+ mkdirSync(output);
78
+ mirrorInputs(repository, input);
79
+ const result = run('docker', [
80
+ 'run',
81
+ '--rm',
82
+ '--network=none',
83
+ ...containerUserArguments(),
84
+ '-v',
85
+ `${input}:/workspace:ro`,
86
+ '-v',
87
+ `${output}:/output`,
88
+ '-w',
89
+ '/workspace',
90
+ '-e',
91
+ 'FETCH_LICENSE=false',
92
+ '-e',
93
+ 'CDXGEN_FETCH_PKG_METADATA=false',
94
+ IMAGE,
95
+ '-t',
96
+ 'js',
97
+ '--recurse',
98
+ '--no-install-deps',
99
+ '--no-babel',
100
+ '--fail-on-error',
101
+ '--validate',
102
+ '--spec-version',
103
+ '1.6',
104
+ '-o',
105
+ '/output/bom.cdx.json',
106
+ '/workspace',
107
+ ], { cwd: repository.root, timeoutMs: SBOM_TIMEOUT_MS });
108
+ if (result.code !== 0) {
109
+ throw new Error(`SBOM generation failed: ${result.output}`);
110
+ }
111
+ const bom = readJson(path.join(output, 'bom.cdx.json'));
112
+ const problems = sbomProblems(bom);
113
+ if (problems.length > 0) {
114
+ throw new Error(problems.join('\n'));
115
+ }
116
+ return sbomWithWorkspaceRoles(bom, repository.projects);
117
+ };
118
+ const artifactsOf = (arguments_) => arguments_.artifacts.map((file) => {
119
+ const absolute = realpathSync(path.resolve(file));
120
+ if (!statSync(absolute).isFile()) {
121
+ throw new Error(`release artifact is not a file: ${file}`);
122
+ }
123
+ return { path: path.basename(absolute), sha256: hashFile(absolute) };
124
+ });
125
+ const rejectArtifactOutputs = (arguments_, directory) => {
126
+ const outputs = new Set(['bom.cdx.json', 'release.json', 'bom.cdx.json.tmp', 'release.json.tmp'].map((file) => path.join(directory, file)));
127
+ if (arguments_.artifacts.some((file) => outputs.has(realpathSync(path.resolve(file))))) {
128
+ throw new Error('release artifacts must not be overwritten by the SBOM output files');
129
+ }
130
+ };
131
+ const publishReports = (directory, reports) => {
132
+ mkdirSync(directory, { recursive: true });
133
+ for (const [name, report] of Object.entries(reports)) {
134
+ const temporary = path.join(directory, `${name}.tmp`);
135
+ writeFileSync(temporary, `${JSON.stringify(report, null, JSON_INDENT)}\n`, { flag: 'wx' });
136
+ renameSync(temporary, path.join(directory, name));
137
+ }
138
+ };
139
+ /** Generate inventory and source metadata; supplied artifacts add release associations. */
140
+ export const writeSbom = (repository, arguments_) => {
141
+ const before = workingTreeFingerprint(repository.root);
142
+ const destination = outputDirectory(repository, arguments_.output);
143
+ rejectArtifactOutputs(arguments_, destination);
144
+ const artifacts = artifactsOf(arguments_);
145
+ if (new Set(artifacts.map((artifact) => artifact.path)).size !== artifacts.length) {
146
+ throw new Error('release artifact filenames must be distinct');
147
+ }
148
+ assertInputs(repository);
149
+ const unavailable = acquireImage(repository, IMAGE, 'SBOM generation');
150
+ if (unavailable !== undefined) {
151
+ throw new Error([unavailable.summary, ...unavailable.findings].join('\n'));
152
+ }
153
+ const temporary = mkdtempSync(path.join(homedir(), '.ploaness-sbom-'));
154
+ try {
155
+ const bom = generate(repository, temporary);
156
+ if (before !== workingTreeFingerprint(repository.root)) {
157
+ throw new Error('the authored tree changed during SBOM generation; regenerate from stable inputs');
158
+ }
159
+ if (canonicalInventory(artifacts) !== canonicalInventory(artifactsOf(arguments_))) {
160
+ throw new Error('release artifact bytes changed during SBOM generation');
161
+ }
162
+ const text = `${JSON.stringify(bom, null, JSON_INDENT)}\n`;
163
+ publishReports(destination, {
164
+ 'bom.cdx.json': bom,
165
+ 'release.json': {
166
+ schemaVersion: 1,
167
+ sourceCommit: git(repository, ['rev-parse', 'HEAD']).trim(),
168
+ sourceDirty: git(repository, ['status', '--porcelain']).length > 0,
169
+ sourceFingerprint: before,
170
+ lockfileSha256: hashFile(path.join(repository.root, 'pnpm-lock.yaml')),
171
+ generator: { image: IMAGE, tool: readKey(readKey(bom, 'metadata'), 'tools') },
172
+ scope: SBOM_SCOPE,
173
+ sbomSha256: createHash('sha256').update(text).digest('hex'),
174
+ artifacts,
175
+ },
176
+ });
177
+ return destination;
178
+ }
179
+ finally {
180
+ rmSync(temporary, { recursive: true, force: true });
181
+ }
182
+ };
183
+ //# sourceMappingURL=sbom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom.js","sourceRoot":"","sources":["../src/sbom.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ploaness/cli",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "The executable half of ploaness: the verification gates and the commands that run them.",
5
5
  "license": "MIT",
6
6
  "author": "Herman Ciechanowiec <herman@ciechanowiec.eu>",
@@ -32,19 +32,20 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@biomejs/biome": "2.5.15",
35
- "@ploaness/assets": "1.6.0",
36
- "@ploaness/config": "1.6.0",
37
- "@ploaness/governance": "1.6.0",
35
+ "@ploaness/assets": "1.7.0",
36
+ "@ploaness/config": "1.7.0",
37
+ "@ploaness/governance": "1.7.0",
38
38
  "@vitest/coverage-v8": "5.0.3",
39
39
  "dependency-cruiser": "18.5.0",
40
40
  "eslint": "10.12.0",
41
- "knip": "6.39.0",
42
- "oxlint": "1.86.0",
41
+ "knip": "6.40.0",
42
+ "oxlint": "1.87.0",
43
43
  "stylelint": "17.16.0",
44
44
  "tsx": "4.23.15",
45
45
  "type-coverage": "2.30.3",
46
46
  "typescript": "6.0.3",
47
- "vitest": "5.0.3"
47
+ "vitest": "5.0.3",
48
+ "yaml": "2.9.1"
48
49
  },
49
50
  "engines": {
50
51
  "node": ">=26"