harness-everything 0.19.1 → 0.20.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.
@@ -10,7 +10,7 @@
10
10
  "name": "harness-everything",
11
11
  "source": "./",
12
12
  "description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
13
- "version": "0.19.1",
13
+ "version": "0.20.0",
14
14
  "author": {
15
15
  "name": "Miya Daniel"
16
16
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "harness-everything",
3
3
  "description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
4
- "version": "0.19.1",
4
+ "version": "0.20.0",
5
5
  "author": {
6
6
  "name": "Miya Daniel"
7
7
  },
package/.releaserc.json CHANGED
@@ -64,7 +64,7 @@
64
64
  "@semantic-release/exec",
65
65
  {
66
66
  "verifyReleaseCmd": "node scripts/sync-release-version.js --validate ${nextRelease.version}",
67
- "prepareCmd": "node scripts/sync-release-version.js ${nextRelease.version} --base ${lastRelease.gitTag} && npm run plugin:sync && node scripts/sync-release-version.js --check ${nextRelease.version} --base ${lastRelease.gitTag} && npm run test:consistency && npm run test:plugin:openai && npm run test:plugin:submission"
67
+ "prepareCmd": "node scripts/sync-release-version.js ${nextRelease.version} --base ${lastRelease.gitTag} && npm run plugin:sync && node scripts/generate-sbom.js --output sbom.cdx.json --version ${nextRelease.version} && node scripts/generate-sbom.js --validate sbom.cdx.json --version ${nextRelease.version} && node scripts/sync-release-version.js --check ${nextRelease.version} --base ${lastRelease.gitTag} && npm run test:consistency && npm run test:plugin:openai && npm run test:plugin:submission"
68
68
  }
69
69
  ],
70
70
  [
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.20.0](https://github.com/dyphn1/Harness-everything/compare/v0.19.1...v0.20.0) (2026-09-21)
6
+
7
+ ### Features
8
+
9
+ * **release:** adopt cyclonedx 1.7 sbom ([39304e4](https://github.com/dyphn1/Harness-everything/commit/39304e4bfe8f94e969c72624301238c5f183a995))
10
+ * **release:** generate and publish CycloneDX SBOM with npm ([6d8ddd0](https://github.com/dyphn1/Harness-everything/commit/6d8ddd008b5cb1e893cbdad915be8fe063e85b84))
11
+
5
12
  ## [0.19.1](https://github.com/dyphn1/Harness-everything/compare/v0.19.0...v0.19.1) (2026-09-21)
6
13
 
7
14
  ## [0.19.0](https://github.com/dyphn1/Harness-everything/compare/v0.18.1...v0.19.0) (2026-09-21)
package/RELEASING.md CHANGED
@@ -38,9 +38,11 @@ A push to `main` runs the full reusable CI gate and then semantic-release. A man
38
38
  4. Exit without publishing when there is no releasable commit.
39
39
  5. Calculate the next stable SemVer.
40
40
  6. Run `scripts/sync-release-version.js` to synchronize package, Claude, OpenAI/Codex, OpenCode, lockfile, and changed canonical skill version fields.
41
- 7. Regenerate and verify plugin packages.
41
+ 7. Regenerate and verify plugin packages, then generate and validate the release-only `sbom.cdx.json` CycloneDX 1.7 file.
42
42
  8. Update `CHANGELOG.md` and create `chore(release): X.Y.Z [skip ci]`.
43
- 9. Create tag `vX.Y.Z`, publish npm with provenance, and create the GitHub Release.
43
+ 9. Create tag `vX.Y.Z`, publish npm with provenance (including the generated SBOM), and create the GitHub Release.
44
+
45
+ The SBOM is generated from the release `package.json`/`package-lock.json` as CycloneDX 1.7, the current 1.x format, to satisfy consumers and regulatory baselines requiring CycloneDX 1.6 or later. It is intentionally not committed to Git. npm packaging is tested to ensure `sbom.cdx.json` is included in the published tarball.
44
46
 
45
47
  Release concurrency is serialized so two updates to `main` cannot publish competing versions.
46
48
 
@@ -69,6 +71,12 @@ node scripts/sync-release-version.js --validate 1.2.3
69
71
 
70
72
  Prerelease/build suffixes such as `1.2.3-beta` or `1.2.3+meta` are rejected.
71
73
 
74
+ The release SBOM can be checked independently with:
75
+
76
+ ```bash
77
+ npm run test:release:sbom
78
+ ```
79
+
72
80
  ## Contributor requirements
73
81
 
74
82
  The final commit that lands on `main` must use a Conventional Commit type because it is release input. With squash merging, the PR title becomes especially important. Use `feat`, `fix`, `perf`, `refactor`, `build`, or `revert` when a shipped change needs a release, and use non-releasing types for changes that should not publish.
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+ const childProcess = require('child_process');
5
+ const fs = require('fs');
6
+ const os = require('os');
7
+ const path = require('path');
8
+ const {
9
+ buildBom,
10
+ CYCLONEDX_SCHEMA_URL,
11
+ CYCLONEDX_VERSION,
12
+ validateBom,
13
+ writeBom
14
+ } = require('../scripts/generate-sbom');
15
+
16
+ const ROOT = path.resolve(__dirname, '..');
17
+ const packageJson = JSON.parse(fs.readFileSync(path.join(ROOT, 'package.json'), 'utf8'));
18
+ const releaseConfig = JSON.parse(fs.readFileSync(path.join(ROOT, '.releaserc.json'), 'utf8'));
19
+ const execFileSync = childProcess.execFileSync;
20
+ const npmCommand = 'npm';
21
+
22
+ const execPlugin = releaseConfig.plugins.find(plugin => Array.isArray(plugin) && plugin[0] === '@semantic-release/exec');
23
+ assert.ok(execPlugin, 'semantic-release exec plugin is required for SBOM generation');
24
+ assert.match(execPlugin[1].prepareCmd, /generate-sbom\.js --output sbom\.cdx\.json --version \$\{nextRelease\.version\}/);
25
+ assert.match(execPlugin[1].prepareCmd, /generate-sbom\.js --validate sbom\.cdx\.json --version \$\{nextRelease\.version\}/);
26
+
27
+ const bom = buildBom(ROOT, {
28
+ version: packageJson.version,
29
+ timestamp: '2026-09-21T00:00:00.000Z',
30
+ serialNumber: 'urn:uuid:00000000-0000-5000-8000-000000000001'
31
+ });
32
+ assert.doesNotThrow(() => validateBom(bom, packageJson.version));
33
+ assert.strictEqual(bom.bomFormat, 'CycloneDX');
34
+ assert.strictEqual(bom.$schema, CYCLONEDX_SCHEMA_URL);
35
+ assert.strictEqual(bom.specVersion, CYCLONEDX_VERSION);
36
+ assert.strictEqual(CYCLONEDX_VERSION, '1.7');
37
+ assert.match(bom.serialNumber, /^urn:uuid:/);
38
+ assert.strictEqual(bom.metadata.component.version, packageJson.version);
39
+ assert.ok(bom.components.length > 0, 'SBOM must include lockfile components');
40
+ assert.ok(bom.components.every(component => component.purl.startsWith('pkg:npm/')));
41
+ assert.ok(bom.components.some(component => component.name.startsWith('@') && component.purl.includes('%40')), 'scoped npm packages must use valid PURLs');
42
+ assert.ok(bom.dependencies.some(entry => entry.ref === `pkg:npm/${packageJson.name}@${packageJson.version}`));
43
+
44
+ const output = path.join(os.tmpdir(), `harness-sbom-${process.pid}.cdx.json`);
45
+ try {
46
+ writeBom(output, ROOT, { version: packageJson.version, timestamp: '2026-09-21T00:00:00.000Z' });
47
+ const written = JSON.parse(fs.readFileSync(output, 'utf8'));
48
+ assert.doesNotThrow(() => validateBom(written, packageJson.version));
49
+ } finally {
50
+ fs.rmSync(output, { force: true });
51
+ }
52
+
53
+ const packRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'harness-sbom-pack-'));
54
+ try {
55
+ fs.cpSync(ROOT, packRoot, {
56
+ recursive: true,
57
+ filter: source => {
58
+ const relative = path.relative(ROOT, source).replace(/\\/g, '/');
59
+ return relative === '' || !['.git', 'node_modules', '.husky', '.mechanism-test-opencode-home', '.mechanism-test-opencode-workspace'].some(prefix => relative === prefix || relative.startsWith(`${prefix}/`));
60
+ }
61
+ });
62
+ const generated = writeBom(path.join(packRoot, 'sbom.cdx.json'), packRoot, { version: packageJson.version, timestamp: '2026-09-21T00:00:00.000Z' });
63
+ const packOutput = execFileSync(npmCommand, ['pack', '--dry-run', '--json', '--ignore-scripts'], {
64
+ cwd: packRoot,
65
+ encoding: 'utf8',
66
+ shell: process.platform === 'win32',
67
+ env: {
68
+ ...process.env,
69
+ HUSKY: '0',
70
+ npm_config_ignore_scripts: 'true'
71
+ }
72
+ });
73
+ const jsonStart = packOutput.indexOf('[');
74
+ const jsonEnd = packOutput.lastIndexOf(']');
75
+ assert.ok(jsonStart >= 0 && jsonEnd > jsonStart, 'npm pack --json output must include JSON records');
76
+ const records = JSON.parse(packOutput.slice(jsonStart, jsonEnd + 1));
77
+ const files = records.flatMap(record => record.files || []).map(file => file.path);
78
+ assert.ok(files.includes('sbom.cdx.json'), 'npm pack must include the generated SBOM');
79
+ assert.strictEqual(generated.metadata.component.version, packageJson.version);
80
+ } finally {
81
+ fs.rmSync(packRoot, { recursive: true, force: true });
82
+ }
83
+
84
+ let tracked = true;
85
+ try {
86
+ execFileSync('git', ['ls-files', '--error-unmatch', 'sbom.cdx.json'], { cwd: ROOT, stdio: 'ignore' });
87
+ } catch (_) {
88
+ tracked = false;
89
+ }
90
+ assert.strictEqual(tracked, false, 'release-generated SBOM must remain untracked');
91
+
92
+ console.log(`CycloneDX SBOM verified: ${bom.components.length} lockfile components and npm pack inclusion.`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "harness-enforcement",
3
3
  "description": "Repository inventory for the opencode enforcement plugin and its standalone helper",
4
- "version": "0.19.1",
4
+ "version": "0.20.0",
5
5
  "runtime": "index.mjs",
6
6
  "hooks": {
7
7
  "verify": "hooks/verify.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-everything",
3
- "version": "0.19.1",
3
+ "version": "0.20.0",
4
4
  "description": "Harness OS: An Orchestrated Agent Operating System for AI-driven Development",
5
5
  "main": "harness-everything/scripts/bootstrap.js",
6
6
  "bin": {
@@ -20,7 +20,7 @@
20
20
  "test:consistency": "node ci/consistency-check.js && node ci/doc-capability-consistency.test.js && node ci/repository-contract.test.js && node ci/mechanism-2ao-plugin-sync.test.js",
21
21
  "test:docs:capabilities": "node ci/doc-capability-consistency.test.js",
22
22
  "test:references": "node ci/reference-check.js",
23
- "test:release": "node ci/release-consistency-check.js && node ci/mechanism-2x-release-automation.test.js && node ci/mechanism-2x-release-commit-message.test.js",
23
+ "test:release": "node ci/release-consistency-check.js && node ci/mechanism-2x-release-automation.test.js && node ci/mechanism-2x-release-commit-message.test.js && node ci/mechanism-2ap-sbom.test.js",
24
24
  "test:release:semantics": "node ci/semantic-release-analyzer.test.mjs",
25
25
  "test:install": "node scripts/verify-install.js",
26
26
  "test:collision": "node ci/description-collision.js",
@@ -29,11 +29,14 @@
29
29
  "test:routing:invariants": "node ci/invariant-routing.test.js && node ci/router-workflow-plan.test.js && node ci/workflow-execution-contract.test.js",
30
30
  "plugin:sync": "node scripts/sync-openai-plugin.js",
31
31
  "plugin:hosts": "node scripts/plugin-sync.js",
32
+ "sbom:generate": "node scripts/generate-sbom.js --output sbom.cdx.json",
33
+ "sbom:validate": "node scripts/generate-sbom.js --validate sbom.cdx.json",
32
34
  "test:plugin:claude": "node ci/mechanism-2z-claude-plugin-manifest.test.js",
33
35
  "plugin:claude:stage": "node scripts/stage-claude-plugin.js",
34
36
  "plugin:claude:validate": "node scripts/validate-claude-plugin.js",
35
37
  "test:plugin:openai": "node ci/openai-plugin-package.test.js && node ci/openai-plugin-runtime.test.js",
36
38
  "test:plugin:hosts": "node ci/mechanism-2ao-plugin-sync.test.js",
39
+ "test:release:sbom": "node ci/mechanism-2ap-sbom.test.js",
37
40
  "plugin:submission:build": "node scripts/build-openai-submission.js",
38
41
  "test:plugin:submission": "node ci/openai-plugin-submission.test.js",
39
42
  "test:platform:compatibility": "node ci/mechanism-2w-platform-compatibility.test.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-everything",
3
- "version": "0.19.1",
3
+ "version": "0.20.0",
4
4
  "description": "Invariant-first engineering harness for routing, verification, and failure recovery while preserving agent autonomy.",
5
5
  "author": {
6
6
  "name": "Miya Daniel",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "harness-everything",
4
- "version": "0.19.1",
4
+ "version": "0.20.0",
5
5
  "description": "Invariant-first engineering harness for routing, verification, and failure recovery while preserving agent autonomy.",
6
6
  "author": {
7
7
  "name": "Miya Daniel",