@cejel/cejel 0.7.0-rc.1 → 0.7.0-rc.3
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 +131 -27
- package/dist/calibration/llm-detector.js +28 -7
- package/dist/{chunk-D7MWEPPX.js → chunk-2UMHJ23V.js} +9 -4
- package/dist/{chunk-SNRQAKKE.js → chunk-73XAL26O.js} +9772 -1080
- package/dist/{chunk-LBJFDK4R.js → chunk-QIBLNTZB.js} +1 -1
- package/dist/{chunk-UMGZWGOI.js → chunk-RRPQHEBU.js} +1 -1
- package/dist/index.js +217 -21
- package/dist/mcp/index.js +3 -3
- package/dist/packs/d-series/index.js +2 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -24,8 +24,13 @@ jobs:
|
|
|
24
24
|
- uses: BargLabs/cejel/action@v1
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
Keep `fetch-depth: 0`. `actions/checkout` makes a shallow clone by default, and a shallow clone is
|
|
28
|
+
"Unrated: shallow clone", with no score and no verdict, under every rubric, the default included,
|
|
29
|
+
until the full history is checked out. A directory with no `.git` (an uploaded snapshot or an
|
|
30
|
+
archive) is "Unrated: no git history" under every rubric.
|
|
31
|
+
|
|
27
32
|
Or run it once from a shell: `npx @cejel/cejel@latest .` More on the Action under
|
|
28
|
-
[GitHub Action](#github-action).
|
|
33
|
+
[GitHub Action](#github-action). To read what comes out, see [Reading the result](#reading-the-result).
|
|
29
34
|
|
|
30
35
|
Cejel (*"SEH-jel"*) — a trust certificate for your codebase.
|
|
31
36
|
|
|
@@ -75,6 +80,48 @@ untouched holdout, every preregistered gate to pass, and a separately recorded p
|
|
|
75
80
|
The [defect-class census](docs/defect-class-census.md) publishes the coverage-breadth
|
|
76
81
|
boundary—which defect classes any shipped rule targets—and is explicitly not a recall claim.
|
|
77
82
|
|
|
83
|
+
## Reading the result
|
|
84
|
+
|
|
85
|
+
The first page of `certificate.html` (and the block printed after the verdict in the terminal)
|
|
86
|
+
answers four questions in plain words, built only from `report.json`:
|
|
87
|
+
|
|
88
|
+
- **What holds:** the measured areas the report labels Verified, or Info (one label below, listed
|
|
89
|
+
as "Partly holds"), each with its score out of 4 and the strongest measurement it saw, for
|
|
90
|
+
example "Rated Verified, at 1.0 out of 4". Only a score of 4.0 is called the top score. A label
|
|
91
|
+
and a score are set separately, so a Verified area can have a low score; each area's card in the
|
|
92
|
+
certificate compares the two. An area Cejel did not examine, or examined with no measurement, is
|
|
93
|
+
never listed here. When the list is empty, one sentence says why: no overall result, no area
|
|
94
|
+
labelled Verified or Info, or both.
|
|
95
|
+
- **What is wrong:** every critical and warning-level finding, most serious first, naming the file
|
|
96
|
+
or area and what is wrong, and every area labelled Critical or Warning that has no critical or
|
|
97
|
+
warning finding of its own, with its score ("Scored 2.2 out of 4, with no single finding of its own"). A score made
|
|
98
|
+
up of several measurements is given with its number and level, for example "give 3.1 out of 4,
|
|
99
|
+
which Cejel counts as a warning".
|
|
100
|
+
- **What is not known:** what the report records it could not establish, from these fields: an
|
|
101
|
+
overall result it withheld, with its reason restated from a fixed table (a reason the table does
|
|
102
|
+
not know reads "Cejel could not rate the source here; see the certificate below"); areas that do
|
|
103
|
+
not apply, have no measurement, or have no score while a finding stands; areas Cejel could not
|
|
104
|
+
fully read (named in the report's skipped-content summary or by a scan or history limitation),
|
|
105
|
+
listed as "not read" with the cause the report ties to that area: files that could not be read,
|
|
106
|
+
Git LFS pointers, files left out under Cejel's size limit or rules, a scan limitation, or a
|
|
107
|
+
shallow clone; each scan and history limitation, reworded into plain words; files it did not
|
|
108
|
+
read; a label moved by imported evidence; and each limit a check recorded on what it examined.
|
|
109
|
+
Anything the report does not record is not listed, so an empty list does not mean nothing is
|
|
110
|
+
unknown.
|
|
111
|
+
- **What to check next:** one line for each wrong or not-known item, taken from a fixed table of
|
|
112
|
+
reviewed sentences. The line for an area not read, and for a scan limitation, follows its own
|
|
113
|
+
cause: `git lfs pull` for Git LFS pointers, making files readable only where they could not be
|
|
114
|
+
read, and no fix for a size limit or rule. An item with no table entry points to the section of
|
|
115
|
+
the certificate that holds it.
|
|
116
|
+
|
|
117
|
+
The first page also says what the result does not cover: Cejel reads files and history and does
|
|
118
|
+
not run the code or its tests. Under a prospective rubric such as
|
|
119
|
+
`witan-rubric-v27-prospective-2026-10-19`, the first page opens, above the verdict line, with the
|
|
120
|
+
same notice the certificate's header carries: the rubric is not calibrated, and its results carry
|
|
121
|
+
no precision or recall claim. Every line links to its source further down; the certificate below
|
|
122
|
+
the first page holds the evidence, unchanged apart from the anchors those links point to.
|
|
123
|
+
`summary.json` carries the same lists under `plainSummary`.
|
|
124
|
+
|
|
78
125
|
## Install
|
|
79
126
|
|
|
80
127
|
No account, no key, no signup.
|
|
@@ -116,7 +163,7 @@ if (-not $expected -or $actual -ne $expected.ToLowerInvariant()) {
|
|
|
116
163
|
```
|
|
117
164
|
|
|
118
165
|
> **Windows signing status:** `cejel-Windows-x86_64.exe` is intentionally unsigned in
|
|
119
|
-
> 0.6.
|
|
166
|
+
> 0.6.11 and may trigger Microsoft SmartScreen. The release build removes Node's inherited
|
|
120
167
|
> signature before SEA injection and fails unless Windows reports the result as `NotSigned`;
|
|
121
168
|
> it does not ship an invalid signature. Before running it, verify `SHA256SUMS` and the
|
|
122
169
|
> GitHub build-provenance attestation. Each binary also has an attached SPDX SBOM (the packages
|
|
@@ -140,9 +187,10 @@ docker run --rm --network=none -v "$PWD:/w" -w /w -v "$PWD/cejel:/cejel:ro" debi
|
|
|
140
187
|
npx @cejel/cejel@latest .
|
|
141
188
|
```
|
|
142
189
|
|
|
143
|
-
> **Distribution note:** Cejel `0.6.
|
|
144
|
-
> standalone binaries, Docker/OCI, GitHub Action, Homebrew, and MCP Registry.
|
|
145
|
-
>
|
|
190
|
+
> **Distribution note:** Cejel `0.6.11` is the coordinated release version for npm,
|
|
191
|
+
> standalone binaries, Docker/OCI, GitHub Action, Homebrew, and MCP Registry. On GitLab, use the
|
|
192
|
+
> CI/CD Catalog component `gitlab.com/barglabs/cejel/cejel@0.6.11`; it, the include template and
|
|
193
|
+
> the Code Quality export are documented in [`docs/gitlab-ci.md`](./docs/gitlab-ci.md).
|
|
146
194
|
|
|
147
195
|
`npx` can reuse a stale cached package. Force the current npm release with the `@latest`
|
|
148
196
|
specifier above, and check the version that will run before comparing certificates:
|
|
@@ -181,17 +229,34 @@ The npm package is scoped as `@cejel/cejel`; its executable remains the short co
|
|
|
181
229
|
min-score: "2.5" # optional: fail the build below this
|
|
182
230
|
```
|
|
183
231
|
|
|
184
|
-
`actions/checkout` fetches one commit by default, so clone in full with `fetch-depth: 0`.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
232
|
+
`actions/checkout` fetches one commit by default, so clone in full with `fetch-depth: 0`. Under
|
|
233
|
+
every rubric, the calibrated default included, a shallow clone gets no composite score and no
|
|
234
|
+
verdict until the full history is checked out. The scan abstains (`insufficient_source`), still
|
|
235
|
+
reads and shows each criterion, and says what to do: run `git fetch --unshallow` (or check out with
|
|
236
|
+
full history, for example `fetch-depth: 0` in `actions/checkout`), then scan again. The
|
|
237
|
+
certificate, the badge and the Action's `verdict` output read "Unrated: shallow clone", and the
|
|
238
|
+
Action's `limited` output is `true`. With `--min-score` an abstained scan fails the check, as any
|
|
239
|
+
abstention does, and the message says how to fetch the history. If git cannot report the depth (git
|
|
240
|
+
is not installed, or cannot open the repository), Cejel reads it from the repository's `.git`
|
|
241
|
+
files; if those do not settle it either, the scan abstains the same way as "Unrated: history depth
|
|
242
|
+
unknown". Among the criteria shown on a shallow clone, A2's scans of earlier commits for `.env`
|
|
243
|
+
files and credentials read only the commits it holds, so A2 abstains unless a confirmed critical
|
|
244
|
+
secret finding stands, including where it would otherwise be marked not applicable, since that
|
|
245
|
+
decision also rests on earlier commits; B2 withholds its pull-request merge ratio, or abstains
|
|
246
|
+
where nothing else is left to score it on, saying why in its note. The certificate says so under
|
|
247
|
+
"History limitations". Until 2 November 2026 this held only under the opt-in prospective v27
|
|
248
|
+
rubric (`--rubric-pin witan-rubric-v27-prospective-2026-10-19`; v17 remains the default), and the
|
|
249
|
+
default rubric scored a shallow clone, on which A2 could not see a secret committed and later
|
|
250
|
+
deleted. A complete clone is scored exactly as before.
|
|
251
|
+
|
|
252
|
+
A directory that is not a git repository gets no composite score and no verdict under every
|
|
253
|
+
rubric, v27 included: "Unrated: no git history". That covers a directory with no `.git`, a
|
|
254
|
+
tarball, an archive export of a commit, and every snapshot uploaded to the HTTP or remote-MCP
|
|
255
|
+
server. A2 abstains, since no commit history was read, unless a confirmed critical secret finding
|
|
256
|
+
stands on the files. Scan a git clone with full history; an uploaded snapshot or archive carries no
|
|
257
|
+
history.
|
|
258
|
+
|
|
259
|
+
On a clone that is not shallow, A2 abstains under v27 where one of its reads of earlier commits failed:
|
|
195
260
|
for example on a partial clone made with `--filter`, which `fetch-depth: 0` and no `filter` avoid,
|
|
196
261
|
or where a read stops at one of Cejel's own limits: an output limit or the history secret scan's
|
|
197
262
|
cap of 5,000 historical files, which happen on some large complete histories and which a re-scan
|
|
@@ -227,16 +292,16 @@ gh attestation verify ./cejel-Windows-x86_64.exe -R BargLabs/cejel
|
|
|
227
292
|
This is cryptographically signed provenance. It is distinct from Apple Developer ID or
|
|
228
293
|
Microsoft Authenticode code-signing.
|
|
229
294
|
|
|
230
|
-
**Docker / OCI.** The current container release is `0.6.
|
|
295
|
+
**Docker / OCI.** The current container release is `0.6.11`:
|
|
231
296
|
|
|
232
297
|
```bash
|
|
233
|
-
docker run --rm -i -v "$PWD:/workspace:ro" ghcr.io/barglabs/cejel:0.6.
|
|
298
|
+
docker run --rm -i -v "$PWD:/workspace:ro" ghcr.io/barglabs/cejel:0.6.11
|
|
234
299
|
```
|
|
235
300
|
|
|
236
301
|
The image defaults to `cejel-mcp` over stdio. To use the CLI instead:
|
|
237
302
|
|
|
238
303
|
```bash
|
|
239
|
-
docker run --rm -v "$PWD:/workspace:ro" --entrypoint cejel ghcr.io/barglabs/cejel:0.6.
|
|
304
|
+
docker run --rm -v "$PWD:/workspace:ro" --entrypoint cejel ghcr.io/barglabs/cejel:0.6.11 .
|
|
240
305
|
```
|
|
241
306
|
|
|
242
307
|
The OCI image carries an SBOM of its base-image packages, maximum-mode build provenance, and a
|
|
@@ -345,8 +410,8 @@ prints that boundary on every successful verification.
|
|
|
345
410
|
- `--rubric-pin <version>` — Explicit opt-in only: pin an alternate rubric instead of the
|
|
346
411
|
calibrated public default. It
|
|
347
412
|
accepts the calibrated version or any published prospective rubric
|
|
348
|
-
(`witan-rubric-v18-prospective-*` through `
|
|
349
|
-
anything else. `v26` (`witan-rubric-v26-prospective-2026-10-14`) is prospective and uncalibrated:
|
|
413
|
+
(`witan-rubric-v18-prospective-*` through `v27`) and fails closed, naming what was accepted, on
|
|
414
|
+
anything else. The GitHub Action takes the same value as its optional `rubric-pin` input. `v26` (`witan-rubric-v26-prospective-2026-10-14`) is prospective and uncalibrated:
|
|
350
415
|
it is the next calibration candidate, inherits v25 complete, inherits neither v23 nor v24, and
|
|
351
416
|
today scores exactly as v25 does. `v25` is prospective and uncalibrated: it inherits v22 and adds only credit for a
|
|
352
417
|
health or readiness route declared inline in an application file (see "What counts as a health or
|
|
@@ -503,11 +568,50 @@ secrets.
|
|
|
503
568
|
min-score: '2.5' # optional; omit to never fail the check
|
|
504
569
|
```
|
|
505
570
|
|
|
506
|
-
Check out with `fetch-depth: 0
|
|
507
|
-
the
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
571
|
+
Check out with `fetch-depth: 0`. The default depth of 1 is a shallow clone, and under every
|
|
572
|
+
rubric, the default included, a shallow checkout gets no composite score and no verdict: the step
|
|
573
|
+
summary, the badge and the `verdict` output read "Unrated: shallow clone", the `limited` output is
|
|
574
|
+
`true` and `limitations` names the cause, and the scan says to run `git fetch --unshallow` (or check
|
|
575
|
+
out with full history, for example `fetch-depth: 0` in `actions/checkout`), then scan again. On a
|
|
576
|
+
shallow clone A2's scans of earlier commits read only the commits present and B2 withholds its
|
|
577
|
+
pull-request merge ratio, each with its reason. A `repo-path` that is not a git repository is
|
|
578
|
+
"Unrated: no git history" under every rubric. The Action does not pin a rubric, so it scores under
|
|
579
|
+
the default.
|
|
580
|
+
|
|
581
|
+
| Output | What it holds |
|
|
582
|
+
|---|---|
|
|
583
|
+
| `score` | The overall score (0.0–4.0), or empty when Cejel abstains. |
|
|
584
|
+
| `verdict` | The verdict label, or the abstention label (`Insufficient source`, `Insufficient evidence`, `Unrated: shallow clone`, `Unrated: history depth unknown`, `Unrated: no git history`). |
|
|
585
|
+
| `limited` | `true` when scan limitations qualify the result, or when the verdict is Unrated; otherwise `false`. |
|
|
586
|
+
| `limitation-count` | How many limitations qualify the certificate, counting an Unrated verdict as one. |
|
|
587
|
+
| `limitations` | A JSON array of the limitation messages; an Unrated verdict adds one naming its cause. |
|
|
588
|
+
| `artifact-dir` | Where this run's report artifacts were exported. |
|
|
589
|
+
|
|
590
|
+
| Input | Default | What it does |
|
|
591
|
+
|---|---|---|
|
|
592
|
+
| `repo-path` | the checkout (`$GITHUB_WORKSPACE`) | Path to the repository to score. |
|
|
593
|
+
| `min-score` | empty: never fail | Fails the step below this overall score (0–4), or when Cejel abstains. |
|
|
594
|
+
| `out-dir` | `.cejel` | Empty destination for this run's report artifacts. |
|
|
595
|
+
| `rubric-pin` | empty: the calibrated default | Explicit opt-in only: the same value as the CLI's `--rubric-pin`. An unknown id fails the step with the CLI's message. |
|
|
596
|
+
|
|
597
|
+
The scoring step is offline whatever the inputs; it never fetches history. To opt in to the
|
|
598
|
+
prospective v27 rubric, pin it and check out in full with `fetch-depth: 0`: v27 reads the commit
|
|
599
|
+
history, so a shallow checkout gets no full v27 result, as under the default. v17 remains the
|
|
600
|
+
calibrated default.
|
|
601
|
+
|
|
602
|
+
```yaml
|
|
603
|
+
- uses: actions/checkout@v4
|
|
604
|
+
with:
|
|
605
|
+
fetch-depth: 0 # full history: A2 and B2 read commit history
|
|
606
|
+
- uses: BargLabs/cejel/action@v1
|
|
607
|
+
with:
|
|
608
|
+
rubric-pin: witan-rubric-v27-prospective-2026-10-19
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
A prospective pin carries no precision/recall claim, and the certificate states that plainly
|
|
612
|
+
whenever one is used. Leave `rubric-pin` empty for the calibrated result every default scan
|
|
613
|
+
produces: an empty input passes no `--rubric-pin`, so the scan, the report and the outputs are
|
|
614
|
+
the same as without the input.
|
|
511
615
|
|
|
512
616
|
## Use with Claude
|
|
513
617
|
|
|
@@ -630,7 +734,7 @@ The OCI image is an alternative when Docker is the preferred execution boundary.
|
|
|
630
734
|
the host path with the repository OpenClaw should allow Cejel to read:
|
|
631
735
|
|
|
632
736
|
```bash
|
|
633
|
-
npx -y openclaw@latest mcp set cejel-oci '{"command":"docker","args":["run","--rm","-i","-v","/absolute/path/to/repo:/workspace:ro","ghcr.io/barglabs/cejel:0.6.
|
|
737
|
+
npx -y openclaw@latest mcp set cejel-oci '{"command":"docker","args":["run","--rm","-i","-v","/absolute/path/to/repo:/workspace:ro","ghcr.io/barglabs/cejel:0.6.11"]}'
|
|
634
738
|
npx -y openclaw@latest mcp doctor cejel-oci --probe
|
|
635
739
|
```
|
|
636
740
|
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
deriveProductIdentity,
|
|
6
6
|
runCejelScan,
|
|
7
7
|
serializeWitanReport
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-73XAL26O.js";
|
|
9
9
|
import {
|
|
10
10
|
listCejelLlmPackFiles
|
|
11
|
-
} from "../chunk-
|
|
12
|
-
import "../chunk-
|
|
11
|
+
} from "../chunk-RRPQHEBU.js";
|
|
12
|
+
import "../chunk-2UMHJ23V.js";
|
|
13
13
|
import {
|
|
14
14
|
external_exports
|
|
15
15
|
} from "../chunk-AMVP7L26.js";
|
|
@@ -4855,8 +4855,27 @@ var CejelLlmPackStatusSchema = external_exports.enum([
|
|
|
4855
4855
|
"assessed_with_limitations",
|
|
4856
4856
|
"not_applicable"
|
|
4857
4857
|
]);
|
|
4858
|
+
var CEJEL_LLM_EVIDENCE_PATH_MAX = 700;
|
|
4859
|
+
var CEJEL_LLM_OVER_LIMIT_EVIDENCE = Object.freeze({
|
|
4860
|
+
path: ".",
|
|
4861
|
+
line: null,
|
|
4862
|
+
label: `Path longer than the artifact's ${CEJEL_LLM_EVIDENCE_PATH_MAX}-character limit; not cited`
|
|
4863
|
+
});
|
|
4864
|
+
function cejelLlmOverLimitPathsLimitation(count) {
|
|
4865
|
+
const one = count === 1;
|
|
4866
|
+
return `Cejel did not cite ${count} repository ${one ? "path" : "paths"} because ${one ? "it is" : "they are"} longer than the artifact's ${CEJEL_LLM_EVIDENCE_PATH_MAX}-character path limit. Every finding that cited ${one ? "it" : "one"} is kept, with its rule, severity, confidence and summary, anchored on the repository ('.') instead. No path is shortened, since a shortened path would name a file that does not exist.`;
|
|
4867
|
+
}
|
|
4868
|
+
function fitCejelLlmFindingPaths(findings) {
|
|
4869
|
+
const dropped = /* @__PURE__ */ new Set();
|
|
4870
|
+
const fitted = findings.map((finding5) => {
|
|
4871
|
+
if (finding5.evidence.path.length <= CEJEL_LLM_EVIDENCE_PATH_MAX) return finding5;
|
|
4872
|
+
dropped.add(finding5.evidence.path);
|
|
4873
|
+
return { ...finding5, evidence: { ...CEJEL_LLM_OVER_LIMIT_EVIDENCE } };
|
|
4874
|
+
});
|
|
4875
|
+
return dropped.size === 0 ? { findings, droppedPaths: 0 } : { findings: fitted, droppedPaths: dropped.size };
|
|
4876
|
+
}
|
|
4858
4877
|
var CejelLlmEvidenceSchema = external_exports.object({
|
|
4859
|
-
path: external_exports.string().min(1).max(
|
|
4878
|
+
path: external_exports.string().min(1).max(CEJEL_LLM_EVIDENCE_PATH_MAX).refine(
|
|
4860
4879
|
(path) => !path.startsWith("/") && !/^[A-Za-z]:[\\/]/.test(path) && !path.split(/[\\/]/).some((member) => member === ".."),
|
|
4861
4880
|
{ message: "Evidence paths must be repository-relative and cannot traverse parents." }
|
|
4862
4881
|
),
|
|
@@ -5112,7 +5131,7 @@ function collectCejelLlmPack(repoPath, repoFiles) {
|
|
|
5112
5131
|
(rule) => (rule.id === "LLM-AGY-002" ? sourceFiles.filter((file) => isPythonSource(file)) : pythonLlmFiles).flatMap((file) => rule.detect(file))
|
|
5113
5132
|
);
|
|
5114
5133
|
const applicable = javascriptLlmFiles.length > 0 || pythonLlmFiles.length > 0 || actionSurfaceFiles.length > 0 || hasEvaluationSurface || pythonLineageFindings.length > 0 || pythonRuleFindings.length > 0;
|
|
5115
|
-
const
|
|
5134
|
+
const detectedFindings = applicable ? [
|
|
5116
5135
|
...CEJEL_LLM_V1_RULES.flatMap(
|
|
5117
5136
|
(rule) => (rule.id === "LLM-IOH-001" ? javascriptUnsafeSinkFiles : javascriptLlmFiles).flatMap((file) => rule.detect(file))
|
|
5118
5137
|
),
|
|
@@ -5129,6 +5148,7 @@ function collectCejelLlmPack(repoPath, repoFiles) {
|
|
|
5129
5148
|
// evidence that an unrelated metrics writer is an LLM evaluation.
|
|
5130
5149
|
...detectCejelLlmEvaluationRules(sourceFiles)
|
|
5131
5150
|
] : [];
|
|
5151
|
+
const { findings, droppedPaths } = fitCejelLlmFindingPaths(detectedFindings);
|
|
5132
5152
|
const ruleResults = CEJEL_LLM_ENABLED_RULE_IDS.map((ruleId) => {
|
|
5133
5153
|
const ruleFindings = findings.filter((finding5) => finding5.ruleId === ruleId);
|
|
5134
5154
|
const confidence = RULE_CONFIDENCE.get(ruleId) ?? "low";
|
|
@@ -5182,7 +5202,7 @@ function collectCejelLlmPack(repoPath, repoFiles) {
|
|
|
5182
5202
|
...pythonLlmFiles.map((file) => file.path),
|
|
5183
5203
|
...actionSurfaceFiles.map((file) => file.path),
|
|
5184
5204
|
...evaluationSurfaceFiles.map((file) => file.path),
|
|
5185
|
-
...
|
|
5205
|
+
...detectedFindings.map((finding5) => finding5.evidence.path)
|
|
5186
5206
|
]);
|
|
5187
5207
|
const integrationSet = new Set(integrations);
|
|
5188
5208
|
if (actionSurfaceFiles.length > 0) integrationSet.add("Model-facing tool registration");
|
|
@@ -5209,7 +5229,8 @@ function collectCejelLlmPack(repoPath, repoFiles) {
|
|
|
5209
5229
|
"Alpha coverage is limited to fixture-backed JavaScript, TypeScript, and Python source patterns in files up to 1 MB.",
|
|
5210
5230
|
"Rules use bounded, observable source patterns and do not claim whole-program data-flow analysis.",
|
|
5211
5231
|
"Action-governance and evaluation-hygiene rules require one of the explicitly supported complete local JavaScript, TypeScript, or Python evidence paths.",
|
|
5212
|
-
"No model-quality, factuality, prompt-injection-resistance, or general hallucination rate is measured."
|
|
5232
|
+
"No model-quality, factuality, prompt-injection-resistance, or general hallucination rate is measured.",
|
|
5233
|
+
...droppedPaths > 0 ? [cejelLlmOverLimitPathsLimitation(droppedPaths)] : []
|
|
5213
5234
|
]
|
|
5214
5235
|
},
|
|
5215
5236
|
notes: applicable ? "Static LLM application-integrity alpha; findings require calibration before public release." : "No supported LLM application surface was detected; LLM controls were not scored."
|
|
@@ -89,17 +89,21 @@ function isGitMetadataEntry(path) {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
function hasVisibleGitMetadata(repoPath) {
|
|
92
|
+
return findVisibleGitMetadata(repoPath) !== void 0;
|
|
93
|
+
}
|
|
94
|
+
function findVisibleGitMetadata(repoPath) {
|
|
92
95
|
let current;
|
|
93
96
|
try {
|
|
94
97
|
current = realpathSync(repoPath);
|
|
95
98
|
} catch {
|
|
96
|
-
return
|
|
99
|
+
return void 0;
|
|
97
100
|
}
|
|
98
101
|
for (; ; ) {
|
|
99
|
-
if (discoveryCeiling !== void 0 && current === discoveryCeiling) return
|
|
100
|
-
|
|
102
|
+
if (discoveryCeiling !== void 0 && current === discoveryCeiling) return void 0;
|
|
103
|
+
const entry = join(current, ".git");
|
|
104
|
+
if (isGitMetadataEntry(entry)) return entry;
|
|
101
105
|
const parent = dirname(current);
|
|
102
|
-
if (parent === current) return
|
|
106
|
+
if (parent === current) return void 0;
|
|
103
107
|
current = parent;
|
|
104
108
|
}
|
|
105
109
|
}
|
|
@@ -211,6 +215,7 @@ export {
|
|
|
211
215
|
GIT_EXEC_MAX_BUFFER_BYTES,
|
|
212
216
|
GIT_EXEC_TIMEOUT_MS,
|
|
213
217
|
hasVisibleGitMetadata,
|
|
218
|
+
findVisibleGitMetadata,
|
|
214
219
|
execGit,
|
|
215
220
|
isExpectedGitAbsence,
|
|
216
221
|
describeGitFailure
|