devlyn-cli 4.3.24 → 4.3.25

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/bin/engines.js CHANGED
@@ -4,10 +4,11 @@ const ENGINE_IDS = Object.freeze([
4
4
  'claude', 'codex', 'grok', 'omp', 'antigravity', 'cursor', 'opencode', 'kimi', 'copilot', 'qwen',
5
5
  ]);
6
6
 
7
- // The versions each channel was examined on. Newer releases of the same major are taken as
8
- // compatible: these CLIs ship minor releases weekly, and gating on the examined minor would turn
9
- // the harness off at every one of them. A new major (or a Cursor build older than the examined one)
10
- // is refused, since any flag may change there.
7
+ // The versions each channel was examined on. Any newer release, a new major included, is taken as
8
+ // compatible: a version number is not evidence that a channel broke (omp 18 kept both flags devlyn
9
+ // uses), and refusing unexamined majors turned working engines off. Only a version below the examined
10
+ // floor (or a Cursor build older than the examined one) is refused; an unreadable version is refused
11
+ // with its own reason.
11
12
  const ENGINE_CAPABILITIES = Object.freeze({
12
13
  claude: { minimum: '2.1.307', executor: true },
13
14
  codex: { minimum: '0.163.0', executor: true },
@@ -21,20 +22,21 @@ const ENGINE_CAPABILITIES = Object.freeze({
21
22
  qwen: { minimum: '0.26.0', executor: false },
22
23
  });
23
24
 
25
+ function readableVersion(engine, version) {
26
+ return typeof version === 'string'
27
+ && (engine === 'cursor' ? /^\d{4}\.\d{2}\.\d{2}-[0-9a-f]+$/ : /^\d+\.\d+\.\d+$/).test(version);
28
+ }
29
+
24
30
  function supportedVersion(engine, version) {
31
+ if (!readableVersion(engine, version)) return false;
25
32
  const capability = ENGINE_CAPABILITIES[engine];
26
- if (engine === 'cursor') {
27
- const build = typeof version === 'string' && version.match(/^(\d{4})\.(\d{2})\.(\d{2})-[0-9a-f]+$/);
28
- return Boolean(build) && build.slice(1).join('') >= capability.minimum.slice(0, 10).replace(/\./g, '');
29
- }
30
- if (typeof version !== 'string' || !/^\d+\.\d+\.\d+$/.test(version)) return false;
33
+ if (engine === 'cursor') return version.slice(0, 10).replace(/\./g, '') >= capability.minimum.slice(0, 10).replace(/\./g, '');
31
34
  const actual = version.split('.').map(Number);
32
35
  const floor = capability.minimum.split('.').map(Number);
33
- if (actual[0] !== floor[0]) return false;
34
- for (let i = 1; i < 3; i++) {
36
+ for (let i = 0; i < 3; i++) {
35
37
  if (actual[i] !== floor[i]) return actual[i] > floor[i];
36
38
  }
37
39
  return true;
38
40
  }
39
41
 
40
- module.exports = { ENGINE_IDS, ENGINE_CAPABILITIES, supportedVersion };
42
+ module.exports = { ENGINE_IDS, ENGINE_CAPABILITIES, readableVersion, supportedVersion };
@@ -1,7 +1,7 @@
1
1
  const fs = require('fs');
2
2
  const os = require('os');
3
3
  const path = require('path');
4
- const { ENGINE_IDS, ENGINE_CAPABILITIES, supportedVersion } = require('./engines');
4
+ const { ENGINE_IDS, ENGINE_CAPABILITIES, readableVersion, supportedVersion } = require('./engines');
5
5
  const { verifyRelease, sha256, fail, options, HarnessError } = require('./release');
6
6
  const { fingerprint } = require('./skill-ownership');
7
7
  const history = require('./skill-history.json');
@@ -301,7 +301,9 @@ function planActivation(releaseRoot, input, env = process.env) {
301
301
  if (off) return finish(plan);
302
302
  plan.release = release;
303
303
  if (!supported) {
304
- const reasons = [reason('engine-version-unsupported', { minimum: ENGINE_CAPABILITIES[context.engine].minimum })];
304
+ const reasons = [readableVersion(context.engine, context.version)
305
+ ? reason('engine-version-unsupported', { minimum: ENGINE_CAPABILITIES[context.engine].minimum })
306
+ : reason('engine-version-unreadable')];
305
307
  status.principles = channel('unavailable', null, reasons);
306
308
  status.skills = channel('unavailable', null, reasons);
307
309
  return finish(plan);
@@ -803,6 +803,7 @@
803
803
  "4.3.22",
804
804
  "4.3.23",
805
805
  "4.3.24",
806
+ "4.3.25",
806
807
  "4.3.3",
807
808
  "4.3.4",
808
809
  "4.3.5",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devlyn",
3
- "version": "4.3.24",
3
+ "version": "4.3.25",
4
4
  "description": "Devlyn harness skills",
5
5
  "skills": "./skills/"
6
6
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "devlyn-harness-v4-3-24",
2
+ "name": "devlyn-harness-v4-3-25",
3
3
  "plugins": [
4
4
  {
5
5
  "name": "devlyn",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devlyn",
3
- "version": "4.3.24",
3
+ "version": "4.3.25",
4
4
  "description": "Devlyn harness skills",
5
5
  "skills": "./skills/"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devlyn-cli",
3
- "version": "4.3.24",
3
+ "version": "4.3.25",
4
4
  "description": "Loop & harness engineering for AI coding agents (Claude Code, Codex, and any AGENTS.md-driven agent) — core engineering principles for CLAUDE.md/AGENTS.md and a loop designer that splits one intent into tasks agents drain hands-free",
5
5
  "homepage": "https://github.com/fysoul17/devlyn-cli#readme",
6
6
  "bin": {
package/release.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "devlyn-cli",
4
- "version": "4.3.24",
4
+ "version": "4.3.25",
5
5
  "principles": {
6
6
  "defaults": "config/skills/_shared/runtime-principles.md",
7
7
  "memory": {
@@ -134,12 +134,12 @@
134
134
  },
135
135
  {
136
136
  "path": "bin/engines.js",
137
- "sha256": "4761b73b9117dc2935180c0ad46f4a39649ba22156903d683ce6984ed086af4d",
137
+ "sha256": "f36fe59473e050a6d53fde7642058c67b4f3353816d62042f0fe6c1004715bfa",
138
138
  "executable": false
139
139
  },
140
140
  {
141
141
  "path": "bin/harness-activation.js",
142
- "sha256": "105796f18f947dec95997f3f4ed66918457bcff76a5fe59abc84682829c0ed3a",
142
+ "sha256": "b864c9e325e3e7bd6f800e51d456cb00d40925d6f0713a0c692cff207a9c6183",
143
143
  "executable": false
144
144
  },
145
145
  {
@@ -164,7 +164,7 @@
164
164
  },
165
165
  {
166
166
  "path": "bin/skill-history.json",
167
- "sha256": "849217b20d6788544fd5795f9247762e962413a8dbb7790fc921934ecf72b999",
167
+ "sha256": "c137de72e6ca67b53800f1a5f777f44b00dcbdfa1e036ccf38174177f5fed69e",
168
168
  "executable": false
169
169
  },
170
170
  {
@@ -334,7 +334,7 @@
334
334
  },
335
335
  {
336
336
  "path": "native/claude/.claude-plugin/plugin.json",
337
- "sha256": "3ee80f72f0382fc335db31c25fe4d0d6a5b58bf9bac2240964110b862481e787",
337
+ "sha256": "f2d0eb5a6bccfe88a6e5b8a5117f309f41f724d00acdeff4eac8a1b310ca907b",
338
338
  "executable": false
339
339
  },
340
340
  {
@@ -484,12 +484,12 @@
484
484
  },
485
485
  {
486
486
  "path": "native/codex/.agents/plugins/marketplace.json",
487
- "sha256": "35287fcd0ba7fd6a926eeeb69a577e0ed0cb34fb4c66847e9c2be9cd2200e6b7",
487
+ "sha256": "3fcaa2f62b36f4aab8475d2ab10910ba0d6a55045a152399d358e2abbf2f5934",
488
488
  "executable": false
489
489
  },
490
490
  {
491
491
  "path": "native/codex/plugins/devlyn/.codex-plugin/plugin.json",
492
- "sha256": "3ee80f72f0382fc335db31c25fe4d0d6a5b58bf9bac2240964110b862481e787",
492
+ "sha256": "f2d0eb5a6bccfe88a6e5b8a5117f309f41f724d00acdeff4eac8a1b310ca907b",
493
493
  "executable": false
494
494
  },
495
495
  {
@@ -1779,12 +1779,12 @@
1779
1779
  },
1780
1780
  {
1781
1781
  "path": "package.json",
1782
- "sha256": "afb9b972cf14db2a1d0923b449e1abd05095928ce026420775f38a6e3d3bd641",
1782
+ "sha256": "2448478a5c2d95bc1cddde475d3d091942f4685c982ca5e52a7d1a267636fd4c",
1783
1783
  "executable": false
1784
1784
  }
1785
1785
  ],
1786
1786
  "digest": {
1787
1787
  "algorithm": "sha256",
1788
- "value": "585265812643ce0653d91fb4e3abdf6de3ab03f688ee7bc5184f90351069fc3d"
1788
+ "value": "2a0d645e703b3aa32324d5890cbb83d6bf9174074e12dbf3f16e00c2f1ba7cb1"
1789
1789
  }
1790
1790
  }