@cejel/cejel 0.3.1 → 0.4.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.
package/README.md CHANGED
@@ -68,7 +68,7 @@ if (-not $expected -or $actual -ne $expected.ToLowerInvariant()) {
68
68
  ```
69
69
 
70
70
  > **Windows signing status:** `cejel-Windows-x86_64.exe` is intentionally unsigned in
71
- > 0.3.1 and may trigger Microsoft SmartScreen. The release build removes Node's inherited
71
+ > 0.4.0 and may trigger Microsoft SmartScreen. The release build removes Node's inherited
72
72
  > signature before SEA injection and fails unless Windows reports the result as `NotSigned`;
73
73
  > it does not ship an invalid signature. Before running it, verify `SHA256SUMS` and the
74
74
  > GitHub build-provenance attestation. Each binary also has an attached SPDX SBOM and an
@@ -91,7 +91,7 @@ docker run --rm --network=none -v "$PWD:/w" -w /w -v "$PWD/cejel:/cejel:ro" debi
91
91
  npx @cejel/cejel@latest .
92
92
  ```
93
93
 
94
- > **Distribution note:** Cejel `0.3.1` is the coordinated release version for npm,
94
+ > **Distribution note:** Cejel `0.4.0` is the coordinated release version for npm,
95
95
  > standalone binaries, Docker/OCI, GitHub Action, Homebrew, and MCP Registry.
96
96
 
97
97
  `npx` can reuse a stale cached package. Force the current npm release with the `@latest`
@@ -140,16 +140,16 @@ gh attestation verify ./cejel-Windows-x86_64.exe -R BargLabs/cejel
140
140
  This is cryptographically signed provenance. It is distinct from Apple Developer ID or
141
141
  Microsoft Authenticode code-signing.
142
142
 
143
- **Docker / OCI.** The current container release is `0.3.1`:
143
+ **Docker / OCI.** The current container release is `0.4.0`:
144
144
 
145
145
  ```bash
146
- docker run --rm -i -v "$PWD:/workspace:ro" ghcr.io/barglabs/cejel:0.3.1
146
+ docker run --rm -i -v "$PWD:/workspace:ro" ghcr.io/barglabs/cejel:0.4.0
147
147
  ```
148
148
 
149
149
  The image defaults to `cejel-mcp` over stdio. To use the CLI instead:
150
150
 
151
151
  ```bash
152
- docker run --rm -v "$PWD:/workspace:ro" --entrypoint cejel ghcr.io/barglabs/cejel:0.3.1 .
152
+ docker run --rm -v "$PWD:/workspace:ro" --entrypoint cejel ghcr.io/barglabs/cejel:0.4.0 .
153
153
  ```
154
154
 
155
155
  The OCI image carries an SBOM, maximum-mode build provenance, and a signed registry
@@ -426,7 +426,7 @@ The OCI image is an alternative when Docker is the preferred execution boundary.
426
426
  the host path with the repository OpenClaw should allow Cejel to read:
427
427
 
428
428
  ```bash
429
- openclaw mcp set cejel-oci '{"command":"docker","args":["run","--rm","-i","-v","/absolute/path/to/repo:/workspace:ro","ghcr.io/barglabs/cejel:0.3.1"]}'
429
+ openclaw mcp set cejel-oci '{"command":"docker","args":["run","--rm","-i","-v","/absolute/path/to/repo:/workspace:ro","ghcr.io/barglabs/cejel:0.4.0"]}'
430
430
  openclaw mcp doctor cejel-oci --probe
431
431
  ```
432
432
 
@@ -5269,10 +5269,11 @@ var WITAN_RUBRIC_VERSION_V15 = "witan-rubric-v15-2026-07-24";
5269
5269
  var WITAN_RUBRIC_VERSION_V16 = "witan-rubric-v16-2026-07-24";
5270
5270
  var WITAN_RUBRIC_VERSION_V17 = "witan-rubric-v17-2026-07-24";
5271
5271
  var WITAN_RUBRIC_VERSION_V18 = "witan-rubric-v18-prospective-2026-07-25";
5272
+ var WITAN_RUBRIC_VERSION_V19 = "witan-rubric-v19-prospective-2026-08-09";
5272
5273
 
5273
5274
  // src/witan/repo-signals.ts
5274
5275
  function usesV17DetectorClosure(rubricVersion) {
5275
- return rubricVersion === WITAN_RUBRIC_VERSION_V17 || rubricVersion === WITAN_RUBRIC_VERSION_V18;
5276
+ return rubricVersion === WITAN_RUBRIC_VERSION_V17 || rubricVersion === WITAN_RUBRIC_VERSION_V18 || rubricVersion === WITAN_RUBRIC_VERSION_V19;
5276
5277
  }
5277
5278
  function buildWitanInputFromRepo(options) {
5278
5279
  const tracked = trackContentReads(options.repoPath, () => buildWitanInputFromRepoUntracked(options));
@@ -5312,7 +5313,8 @@ function buildWitanInputFromRepoUntracked(options) {
5312
5313
  const inventoryFiles = fileInventory.inventoryFiles;
5313
5314
  const ignoredTargetReason = repoFiles.length === 0 ? explainIgnoredScanTarget(options.repoPath) : void 0;
5314
5315
  const usesV17Detectors = usesV17DetectorClosure(rubricVersion);
5315
- const usesV18NativeRls = rubricVersion === WITAN_RUBRIC_VERSION_V18;
5316
+ const usesV18NativeRls = rubricVersion === WITAN_RUBRIC_VERSION_V18 || rubricVersion === WITAN_RUBRIC_VERSION_V19;
5317
+ const usesV19CommitYear = rubricVersion === WITAN_RUBRIC_VERSION_V19;
5316
5318
  const structuralArchetype = classifyRepoArchetype(inventoryFiles, rubricVersion);
5317
5319
  const readableArchetype = rubricVersion === WITAN_RUBRIC_VERSION_V13 || rubricVersion === WITAN_RUBRIC_VERSION_V14 || rubricVersion === WITAN_RUBRIC_VERSION_V15 || rubricVersion === WITAN_RUBRIC_VERSION_V16 || usesV17DetectorClosure(rubricVersion) ? applyReadableSourceRepresentationGate(
5318
5320
  options.repoPath,
@@ -5344,6 +5346,7 @@ function buildWitanInputFromRepoUntracked(options) {
5344
5346
  usesV39Detectors,
5345
5347
  usesV47Detectors,
5346
5348
  usesV18NativeRls,
5349
+ usesV19CommitYear,
5347
5350
  reviewableSourceProof,
5348
5351
  scanLimitations
5349
5352
  );
@@ -5952,7 +5955,7 @@ function buildNotApplicableSignal(criterionId, reason) {
5952
5955
  notApplicable: true
5953
5956
  };
5954
5957
  }
5955
- function collectRepoSignals(repoPath, generatedAt, repoFiles, useV27Detectors, useV33Detectors, useV36Detectors, useV39Detectors, useV47Detectors, useV18NativeRls, reviewableSourceProof, scanLimitations = /* @__PURE__ */ new Set()) {
5958
+ function collectRepoSignals(repoPath, generatedAt, repoFiles, useV27Detectors, useV33Detectors, useV36Detectors, useV39Detectors, useV47Detectors, useV18NativeRls, useV19CommitYear, reviewableSourceProof, scanLimitations = /* @__PURE__ */ new Set()) {
5956
5959
  const signals = [];
5957
5960
  const mono = resolveMonorepoContext(repoPath, scanLimitations);
5958
5961
  const collectCriterion = (criterionId, collect) => withContentReadCriterion(criterionId, collect);
@@ -6010,7 +6013,13 @@ function collectRepoSignals(repoPath, generatedAt, repoFiles, useV27Detectors, u
6010
6013
  );
6011
6014
  const b4Signal = collectCriterion(
6012
6015
  "B4",
6013
- () => collectB4AuditEvidence(repoPath, repoFiles, generatedAt)
6016
+ () => collectB4AuditEvidence(
6017
+ repoPath,
6018
+ repoFiles,
6019
+ generatedAt,
6020
+ useV19CommitYear,
6021
+ scanLimitations
6022
+ )
6014
6023
  );
6015
6024
  const b5Signal = buildNotApplicableSignal(
6016
6025
  "B5",
@@ -7214,7 +7223,31 @@ function collectB3CiDisciplineEvidence(repoPath, repoFiles, mono) {
7214
7223
  ]
7215
7224
  };
7216
7225
  }
7217
- function collectB4AuditEvidence(repoPath, repoFiles, generatedAt) {
7226
+ function auditFreshnessCommitterYearFromGitResult(result, scanLimitations) {
7227
+ if (!result.ok) {
7228
+ if (!isExpectedGitAbsence(result)) {
7229
+ scanLimitations.add(
7230
+ `${describeGitFailure(result.reason, "HEAD committer-date discovery")} Cejel omitted the numeric B4 freshness year and retained only static freshness markers.`
7231
+ );
7232
+ }
7233
+ return null;
7234
+ }
7235
+ const year = /^([0-9]{4})-/.exec(result.stdout.trim())?.[1];
7236
+ if (!year) {
7237
+ scanLimitations.add(
7238
+ "Cejel: local git HEAD committer-date discovery returned a malformed date. Cejel omitted the numeric B4 freshness year and retained only static freshness markers."
7239
+ );
7240
+ return null;
7241
+ }
7242
+ return year;
7243
+ }
7244
+ function readAuditFreshnessCommitterYear(repoPath, scanLimitations) {
7245
+ return auditFreshnessCommitterYearFromGitResult(
7246
+ execGit(["show", "-s", "--format=%cI", "HEAD"], { cwd: repoPath }),
7247
+ scanLimitations
7248
+ );
7249
+ }
7250
+ function collectB4AuditEvidence(repoPath, repoFiles, generatedAt, useV19CommitYear = false, scanLimitations = /* @__PURE__ */ new Set()) {
7218
7251
  const evidence = [];
7219
7252
  const auditFiles = repoFiles.filter(isAuditFile);
7220
7253
  for (const file of auditFiles.slice(0, 5)) {
@@ -7233,8 +7266,11 @@ function collectB4AuditEvidence(repoPath, repoFiles, generatedAt) {
7233
7266
  "Only a static security-policy artifact (e.g. SECURITY.md) was detected \u2014 no committed CHANGELOG/CHANGES/HISTORY/NEWS/AUDIT/STATUS/release-notes/runbook/provenance file to rate for an audit trail. The project may publish release history outside the repository (e.g. GitHub Releases). B4 has no ratable surface here; it is excluded rather than scored."
7234
7267
  );
7235
7268
  }
7236
- const runYear = new Date(generatedAt).getFullYear();
7237
- const freshnessPattern = new RegExp(`${runYear}|recent|latest|current`, "i");
7269
+ const referenceYear = useV19CommitYear ? readAuditFreshnessCommitterYear(repoPath, scanLimitations) : String(new Date(generatedAt).getFullYear());
7270
+ const freshnessPattern = new RegExp(
7271
+ `${referenceYear ? `${referenceYear}|` : ""}recent|latest|current`,
7272
+ "i"
7273
+ );
7238
7274
  return {
7239
7275
  criterionId: "B4",
7240
7276
  positiveEvidence: evidence,
@@ -7265,7 +7301,7 @@ function collectB4AuditEvidence(repoPath, repoFiles, generatedAt) {
7265
7301
  Math.max(auditFiles.length, 1),
7266
7302
  0.2,
7267
7303
  "ratio",
7268
- "Credits audit artifacts that carry freshness/current-state markers."
7304
+ useV19CommitYear ? "Credits audit artifacts that carry the scanned HEAD committer year or static freshness/current-state markers." : "Credits audit artifacts that carry freshness/current-state markers."
7269
7305
  )
7270
7306
  ]
7271
7307
  };
@@ -10192,7 +10228,7 @@ var WITAN_RUBRIC = [
10192
10228
 
10193
10229
  // src/witan/scoring.ts
10194
10230
  function usesV17DetectorClosure2(rubricVersion) {
10195
- return rubricVersion === WITAN_RUBRIC_VERSION_V17 || rubricVersion === WITAN_RUBRIC_VERSION_V18;
10231
+ return rubricVersion === WITAN_RUBRIC_VERSION_V17 || rubricVersion === WITAN_RUBRIC_VERSION_V18 || rubricVersion === WITAN_RUBRIC_VERSION_V19;
10196
10232
  }
10197
10233
  var MAX_SIGNAL_ADJUSTMENT = 0.8;
10198
10234
  function createWitanReport(input, inputSignals, rubric = WITAN_RUBRIC) {
@@ -10351,7 +10387,7 @@ function statusForScore(score) {
10351
10387
  }
10352
10388
  function statusAfterInputAdjustment(nativeStatus, nativeScore, adjustment, rubricVersion) {
10353
10389
  if (adjustment === 0) return nativeStatus;
10354
- if (rubricVersion !== WITAN_RUBRIC_VERSION_V8 && rubricVersion !== WITAN_RUBRIC_VERSION_V9 && rubricVersion !== WITAN_RUBRIC_VERSION_V10 && rubricVersion !== WITAN_RUBRIC_VERSION_V11 && rubricVersion !== WITAN_RUBRIC_VERSION_V12 && rubricVersion !== WITAN_RUBRIC_VERSION_V13 && rubricVersion !== WITAN_RUBRIC_VERSION_V14 && rubricVersion !== WITAN_RUBRIC_VERSION_V15 && rubricVersion !== WITAN_RUBRIC_VERSION_V16 && rubricVersion !== WITAN_RUBRIC_VERSION_V17 && rubricVersion !== WITAN_RUBRIC_VERSION_V18) {
10390
+ if (rubricVersion !== WITAN_RUBRIC_VERSION_V8 && rubricVersion !== WITAN_RUBRIC_VERSION_V9 && rubricVersion !== WITAN_RUBRIC_VERSION_V10 && rubricVersion !== WITAN_RUBRIC_VERSION_V11 && rubricVersion !== WITAN_RUBRIC_VERSION_V12 && rubricVersion !== WITAN_RUBRIC_VERSION_V13 && rubricVersion !== WITAN_RUBRIC_VERSION_V14 && rubricVersion !== WITAN_RUBRIC_VERSION_V15 && rubricVersion !== WITAN_RUBRIC_VERSION_V16 && rubricVersion !== WITAN_RUBRIC_VERSION_V17 && rubricVersion !== WITAN_RUBRIC_VERSION_V18 && rubricVersion !== WITAN_RUBRIC_VERSION_V19) {
10355
10391
  return statusForScore(roundScore(Math.max(0, nativeScore - adjustment)));
10356
10392
  }
10357
10393
  const statusFloor = {
@@ -10396,7 +10432,7 @@ function mergeSignalsByCriterion(signals) {
10396
10432
  return merged;
10397
10433
  }
10398
10434
  function usesMetricScoring(rubricVersion) {
10399
- return rubricVersion === WITAN_RUBRIC_VERSION_V1 || rubricVersion === WITAN_RUBRIC_VERSION_V2 || rubricVersion === WITAN_RUBRIC_VERSION_V3 || rubricVersion === WITAN_RUBRIC_VERSION_V4 || rubricVersion === WITAN_RUBRIC_VERSION_V5 || rubricVersion === WITAN_RUBRIC_VERSION_V6 || rubricVersion === WITAN_RUBRIC_VERSION_V7 || rubricVersion === WITAN_RUBRIC_VERSION_V8 || rubricVersion === WITAN_RUBRIC_VERSION_V9 || rubricVersion === WITAN_RUBRIC_VERSION_V10 || rubricVersion === WITAN_RUBRIC_VERSION_V11 || rubricVersion === WITAN_RUBRIC_VERSION_V12 || rubricVersion === WITAN_RUBRIC_VERSION_V13 || rubricVersion === WITAN_RUBRIC_VERSION_V14 || rubricVersion === WITAN_RUBRIC_VERSION_V15 || rubricVersion === WITAN_RUBRIC_VERSION_V16 || rubricVersion === WITAN_RUBRIC_VERSION_V17 || rubricVersion === WITAN_RUBRIC_VERSION_V18 || rubricVersion === WITAN_TRADING_RUBRIC_VERSION_V0;
10435
+ return rubricVersion === WITAN_RUBRIC_VERSION_V1 || rubricVersion === WITAN_RUBRIC_VERSION_V2 || rubricVersion === WITAN_RUBRIC_VERSION_V3 || rubricVersion === WITAN_RUBRIC_VERSION_V4 || rubricVersion === WITAN_RUBRIC_VERSION_V5 || rubricVersion === WITAN_RUBRIC_VERSION_V6 || rubricVersion === WITAN_RUBRIC_VERSION_V7 || rubricVersion === WITAN_RUBRIC_VERSION_V8 || rubricVersion === WITAN_RUBRIC_VERSION_V9 || rubricVersion === WITAN_RUBRIC_VERSION_V10 || rubricVersion === WITAN_RUBRIC_VERSION_V11 || rubricVersion === WITAN_RUBRIC_VERSION_V12 || rubricVersion === WITAN_RUBRIC_VERSION_V13 || rubricVersion === WITAN_RUBRIC_VERSION_V14 || rubricVersion === WITAN_RUBRIC_VERSION_V15 || rubricVersion === WITAN_RUBRIC_VERSION_V16 || rubricVersion === WITAN_RUBRIC_VERSION_V17 || rubricVersion === WITAN_RUBRIC_VERSION_V18 || rubricVersion === WITAN_RUBRIC_VERSION_V19 || rubricVersion === WITAN_TRADING_RUBRIC_VERSION_V0;
10400
10436
  }
10401
10437
  function unmeasuredStatus(rubricVersion) {
10402
10438
  return rubricVersion === WITAN_TRADING_RUBRIC_VERSION_V0 ? "unverified" : "insufficient_data";
@@ -10772,7 +10808,7 @@ function calibratedCriterionStateV11(criterionId, metrics) {
10772
10808
  return void 0;
10773
10809
  }
10774
10810
  function ensureFindingsExplainStatus(criterionId, score, status, findings, evidence, rubricVersion) {
10775
- if (rubricVersion !== WITAN_RUBRIC_VERSION_V8 && rubricVersion !== WITAN_RUBRIC_VERSION_V9 && rubricVersion !== WITAN_RUBRIC_VERSION_V10 && rubricVersion !== WITAN_RUBRIC_VERSION_V11 && rubricVersion !== WITAN_RUBRIC_VERSION_V12 && rubricVersion !== WITAN_RUBRIC_VERSION_V13 && rubricVersion !== WITAN_RUBRIC_VERSION_V14 && rubricVersion !== WITAN_RUBRIC_VERSION_V15 && rubricVersion !== WITAN_RUBRIC_VERSION_V16 && rubricVersion !== WITAN_RUBRIC_VERSION_V17 && rubricVersion !== WITAN_RUBRIC_VERSION_V18 && findings.length > 0) {
10811
+ if (rubricVersion !== WITAN_RUBRIC_VERSION_V8 && rubricVersion !== WITAN_RUBRIC_VERSION_V9 && rubricVersion !== WITAN_RUBRIC_VERSION_V10 && rubricVersion !== WITAN_RUBRIC_VERSION_V11 && rubricVersion !== WITAN_RUBRIC_VERSION_V12 && rubricVersion !== WITAN_RUBRIC_VERSION_V13 && rubricVersion !== WITAN_RUBRIC_VERSION_V14 && rubricVersion !== WITAN_RUBRIC_VERSION_V15 && rubricVersion !== WITAN_RUBRIC_VERSION_V16 && rubricVersion !== WITAN_RUBRIC_VERSION_V17 && rubricVersion !== WITAN_RUBRIC_VERSION_V18 && rubricVersion !== WITAN_RUBRIC_VERSION_V19 && findings.length > 0) {
10776
10812
  return [...findings];
10777
10813
  }
10778
10814
  if (status !== "critical" && status !== "warning") return [...findings];
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  runCejelScan,
12
12
  serializeWitanReport,
13
13
  verifyWitanAttestationBinding
14
- } from "./chunk-XB65L6WE.js";
14
+ } from "./chunk-PSYXFAVU.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "./chunk-LZVKQV3R.js";
package/dist/mcp/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  renderWitanBadgeSvg,
10
10
  renderWitanHtmlReport,
11
11
  runCejelScan
12
- } from "../chunk-XB65L6WE.js";
12
+ } from "../chunk-PSYXFAVU.js";
13
13
  import {
14
14
  __commonJS,
15
15
  __export,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cejel/cejel",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "mcpName": "io.github.BargLabs/cejel",
5
5
  "private": false,
6
6
  "publishConfig": {