harness-everything 0.5.1 → 0.5.2

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.5.1",
13
+ "version": "0.5.2",
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.5.1",
4
+ "version": "0.5.2",
5
5
  "author": {
6
6
  "name": "Miya Daniel"
7
7
  },
@@ -45,6 +45,25 @@ jobs:
45
45
  - name: Verify installer contract on Node 22
46
46
  run: node ci/installer-roundtrip.test.js
47
47
 
48
+ release-semantics:
49
+ runs-on: ubuntu-latest
50
+ steps:
51
+ - uses: actions/checkout@v7
52
+ with:
53
+ fetch-depth: 0
54
+ - uses: actions/setup-node@v7
55
+ with:
56
+ node-version: 24
57
+ - name: Install project dependencies
58
+ run: npm ci
59
+ - name: Install pinned semantic-release analyzer tooling
60
+ run: >-
61
+ npm install --no-save --package-lock=false --ignore-scripts
62
+ @semantic-release/commit-analyzer@13.0.1
63
+ conventional-changelog-conventionalcommits@10.4.0
64
+ - name: Verify semantic-release against real Git histories
65
+ run: npm run test:release:semantics
66
+
48
67
  skill-quality:
49
68
  runs-on: ubuntu-latest
50
69
  steps:
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.5.2](https://github.com/dyphn1/Harness-everything/compare/v0.5.1...v0.5.2) (2026-09-16)
6
+
7
+ ### Bug Fixes
8
+
9
+ * **release:** close semantic-release contract gaps ([79d2a76](https://github.com/dyphn1/Harness-everything/commit/79d2a76c931eaaa8928334877ca2b1195e06cce4))
10
+
5
11
  ## [0.5.1](https://github.com/dyphn1/Harness-everything/compare/v0.5.0...v0.5.1) (2026-09-16)
6
12
 
7
13
  ### Bug Fixes
@@ -52,12 +52,12 @@ for (const invalid of ['1.2.3-beta', '1.2.3+build', '01.2.3', '1.2', 'v1.2.3', '
52
52
  assert.ok(!isStableSemVer(invalid), invalid);
53
53
  }
54
54
 
55
- // Normal CI gates every checked-in runtime/plugin manifest against package.json.
56
- // package-lock is intentionally release-owned: the synchronizer fixes its root
57
- // version when semantic-release prepares the actual release transaction.
55
+ // Once semantic-release has established the stable release line, every
56
+ // release-owned checked-in version target must remain in lockstep. This is a
57
+ // normal CI invariant, not something deferred until the next release run.
58
58
  const packageVersion = JSON.parse(fs.readFileSync(path.join(ROOT, 'package.json'), 'utf8')).version;
59
59
  assert.ok(isStableSemVer(packageVersion), `package.json must use stable SemVer, got ${packageVersion}`);
60
- for (const target of VERSION_TARGETS.filter(target => target.file !== 'package-lock.json')) {
60
+ for (const target of VERSION_TARGETS) {
61
61
  const data = JSON.parse(fs.readFileSync(path.join(ROOT, target.file), 'utf8'));
62
62
  const current = target.get(data);
63
63
  const values = Array.isArray(current) ? current : [current];
@@ -120,6 +120,17 @@ json(portable, tampered);
120
120
  assert.throws(() => syncReleaseVersion(root, '1.2.3', { checkOnly: true }), /Release version drift/);
121
121
  assert.throws(() => syncReleaseVersion(root, '1.2.3-beta'), /stable SemVer/);
122
122
 
123
+ const lockDrift = fixture();
124
+ syncReleaseVersion(lockDrift, '1.2.3');
125
+ const driftedLock = JSON.parse(fs.readFileSync(path.join(lockDrift, 'package-lock.json'), 'utf8'));
126
+ driftedLock.packages[''].version = '1.2.2';
127
+ json(path.join(lockDrift, 'package-lock.json'), driftedLock);
128
+ assert.throws(
129
+ () => syncReleaseVersion(lockDrift, '1.2.3', { checkOnly: true }),
130
+ /package-lock\.json/,
131
+ 'release verification must reject package-lock drift'
132
+ );
133
+
123
134
  const missing = fixture();
124
135
  const packageBefore = fs.readFileSync(path.join(missing, 'package.json'), 'utf8');
125
136
  fs.rmSync(path.join(missing, 'opencode-plugin/plugin.json'));
@@ -154,4 +165,4 @@ assert.strictEqual(versionOfSkill(path.join(changed, 'alpha/nested/SKILL.md')),
154
165
  assert.strictEqual(versionOfSkill(path.join(changed, 'beta/SKILL.md')), '0.1.0');
155
166
  syncReleaseVersion(changed, '0.2.0', { base: 'v0.1.0', checkOnly: true });
156
167
 
157
- console.log('Release automation contract verified: stable SemVer rules, changed-skill versioning, manifest sync, drift detection, idempotency, and fail-before-write behavior.');
168
+ console.log('Release automation contract verified: stable SemVer rules, full manifest lockstep, changed-skill versioning, drift detection, idempotency, and fail-before-write behavior.');
@@ -0,0 +1,79 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { execFileSync } from 'node:child_process';
6
+ import { analyzeCommits } from '@semantic-release/commit-analyzer';
7
+
8
+ const ROOT = path.resolve(import.meta.dirname, '..');
9
+ const config = JSON.parse(fs.readFileSync(path.join(ROOT, '.releaserc.json'), 'utf8'));
10
+ const analyzer = config.plugins.find(plugin => Array.isArray(plugin) && plugin[0] === '@semantic-release/commit-analyzer');
11
+ assert.ok(analyzer, 'commit analyzer configuration missing');
12
+
13
+ function git(root, args) {
14
+ return execFileSync('git', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
15
+ }
16
+
17
+ function history(messages) {
18
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'harness-semantic-history-'));
19
+ try {
20
+ git(root, ['init']);
21
+ git(root, ['config', 'user.email', 'release-test@example.com']);
22
+ git(root, ['config', 'user.name', 'Release Test']);
23
+ git(root, ['commit', '--allow-empty', '-m', 'chore: baseline']);
24
+ git(root, ['tag', 'v1.0.0']);
25
+
26
+ for (const message of messages) {
27
+ git(root, ['commit', '--allow-empty', '-m', message]);
28
+ }
29
+
30
+ const log = execFileSync(
31
+ 'git',
32
+ ['log', '--reverse', '--format=%B%x00', 'v1.0.0..HEAD'],
33
+ { cwd: root, encoding: 'utf8' }
34
+ );
35
+ return log.split('\0').map(message => message.trim()).filter(Boolean);
36
+ } finally {
37
+ fs.rmSync(root, { recursive: true, force: true });
38
+ }
39
+ }
40
+
41
+ async function releaseType(messages) {
42
+ const commits = history(messages).map((message, index) => ({
43
+ hash: `fixture-${index}`,
44
+ message
45
+ }));
46
+ return analyzeCommits(analyzer[1], {
47
+ commits,
48
+ logger: { log() {} }
49
+ });
50
+ }
51
+
52
+ assert.equal(await releaseType(['fix(cache): repair invalidation']), 'patch', 'fix-only history must release patch');
53
+ assert.equal(
54
+ await releaseType(['fix(cache): repair invalidation', 'feat(router): add route']),
55
+ 'minor',
56
+ 'feat must dominate patch commits'
57
+ );
58
+ assert.equal(
59
+ await releaseType(['fix(cache): repair invalidation', 'feat(api)!: replace runtime contract']),
60
+ 'major',
61
+ 'breaking ! must dominate lower release types'
62
+ );
63
+ assert.equal(
64
+ await releaseType(['feat(api): replace shape\n\nBREAKING CHANGE: remove legacy shape']),
65
+ 'major',
66
+ 'BREAKING CHANGE footer must produce major'
67
+ );
68
+ assert.equal(
69
+ (await releaseType(['docs: update guide', 'test: cover retry', 'ci: tune matrix'])) ?? null,
70
+ null,
71
+ 'docs/test/ci-only history must not release'
72
+ );
73
+ assert.equal(
74
+ (await releaseType(['chore(release): 1.0.1 [skip ci]'])) ?? null,
75
+ null,
76
+ 'generated release commit must not recurse into another release'
77
+ );
78
+
79
+ console.log('Semantic-release analyzer verified against real temporary Git histories: patch, minor, major, no-release, and recursion guard.');
@@ -19,7 +19,7 @@ This page is generated from checked-in runtime and workflow sources. Do not edit
19
19
  | Workflow | Node.js versions | Explicit triggers | npm quality gates |
20
20
  | --- | --- | --- | --- |
21
21
  | `behavioral-evals.yml` | 24 | schedule, workflow_dispatch | n/a |
22
- | `ci.yml` | 22, 24 | workflow_call | `test`, `test:mutations`, `test:consistency`, `test:references`, `test:release`, `test:collision`, `test:plugin:openai`, `test:plugin:submission`, `test:platform:compatibility` |
22
+ | `ci.yml` | 22, 24 | workflow_call | `test`, `test:mutations`, `test:release:semantics`, `test:consistency`, `test:references`, `test:release`, `test:collision`, `test:plugin:openai`, `test:plugin:submission`, `test:platform:compatibility` |
23
23
  | `release.yml` | 24 | workflow_dispatch | n/a |
24
24
 
25
25
  ## Drift prevention
@@ -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.5.1",
4
+ "version": "0.5.2",
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.5.1",
3
+ "version": "0.5.2",
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,6 +20,7 @@
20
20
  "test:docs:capabilities": "node ci/doc-capability-consistency.test.js",
21
21
  "test:references": "node ci/reference-check.js",
22
22
  "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:semantics": "node ci/semantic-release-analyzer.test.mjs",
23
24
  "test:install": "node scripts/verify-install.js",
24
25
  "test:collision": "node ci/description-collision.js",
25
26
  "test:routing:skills": "node ci/skill-routing-check.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-everything",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
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.5.1",
4
+ "version": "0.5.2",
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",