fallow 2.80.0 → 2.82.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.
@@ -342,7 +342,7 @@ Angular templates contribute synthetic `<template>` complexity findings whenever
342
342
  | `--since` | string | `6m` | Git history window for hotspot analysis. Accepts durations (`6m`, `90d`, `1y`, `2w`) or ISO dates (`2025-06-01`). |
343
343
  | `--min-commits` | number | `3` | Minimum number of commits for a file to be included in hotspot ranking. |
344
344
  | `--ownership` | bool | `false` | Attach ownership signals to hotspot entries: bus factor (Avelino truck factor), contributor count, top contributor with stale-days, recent contributors (top-3), `suggested_reviewers`, declared CODEOWNERS owner, ownership drift, unowned-hotspot detection. Human output gains a project-level summary line. JSON adds `low-bus-factor`, `unowned-hotspot`, `ownership-drift` action types. Test files get a `[test]` tag. Implies `--hotspots`. Requires git. |
345
- | `--ownership-emails` | `raw\|handle\|hash` | `handle` | Privacy mode for author emails. `handle` shows the local-part only (default, with GitHub noreply unwrap). `hash` emits stable `xxh3:` pseudonyms. `raw` shows full addresses. Use `hash` in regulated environments. Implies `--ownership`. Configure default via `health.ownership.emailMode`. |
345
+ | `--ownership-emails` | `raw\|handle\|anonymized\|hash` | `handle` | Privacy mode for author emails. `handle` shows the local-part only (default, with GitHub noreply unwrap and deterministic same-handle disambiguation). `anonymized` emits stable `xxh3:` pseudonyms; `hash` remains accepted as the legacy spelling. `raw` shows full addresses. Use `anonymized` in regulated environments. Implies `--ownership`. Configure default via `health.ownership.emailMode`. |
346
346
  | `--changed-since` | string | — | Only analyze files changed since a git ref |
347
347
  | `--workspace` | string | — | Scope to one or more workspaces. Comma-separated values, globs (`apps/*`, `@scope/*`), and `!`-prefixed negation (`!apps/legacy`) supported. Matched against package name AND workspace path relative to repo root. Vital signs, health score, hotspots, file scores, findings, and `summary.files_analyzed` are all recomputed against the scoped subset. |
348
348
  | `--group-by` | `owner\|directory\|package\|section` | — | Partition the report into per-group sections. JSON adds `grouped_by` plus a `groups` array; each group contains its own `vital_signs`, `health_score`, `findings`, `file_scores`, `hotspots`, `large_functions`, and `targets` recomputed against the group's files. The top-level metrics stay project-wide so consumers that ignore grouping still see the project headline. Human output adds a per-group score / files / hot / p90 summary block (sorted worst-first when `--score`). SARIF results carry `properties.group` and CodeClimate issues carry a top-level `group` field so GitHub Code Scanning / GitLab Code Quality can partition per team / package. Compact, markdown, and badge fall back to ungrouped output with a stderr note. |
@@ -423,7 +423,11 @@ export type ChurnTrend = ("accelerating" | "stable" | "cooling")
423
423
  /**
424
424
  * Format discriminator for [`ContributorEntry::identifier`].
425
425
  */
426
- export type ContributorIdentifierFormat = ("raw" | "handle" | "hash")
426
+ export type ContributorIdentifierFormat = ("raw" | "handle" | "anonymized" | "hash")
427
+ /**
428
+ * Machine-readable ownership state for a hotspot.
429
+ */
430
+ export type OwnershipState = ("active" | "unowned" | "declared_inactive" | "drifting")
427
431
  /**
428
432
  * Discriminant for [`HotspotAction::kind`].
429
433
  */
@@ -3497,6 +3501,7 @@ declared_owner?: (string | null)
3497
3501
  * CODEOWNERS file was discovered for the repository (cannot determine).
3498
3502
  */
3499
3503
  unowned?: (boolean | null)
3504
+ ownership_state: OwnershipState
3500
3505
  /**
3501
3506
  * True when ownership has drifted from the original author to a new
3502
3507
  * top contributor. Pairs with [`drift_reason`](Self::drift_reason).
@@ -3510,17 +3515,17 @@ drift_reason?: (string | null)
3510
3515
  }
3511
3516
  /**
3512
3517
  * Per-author contribution summary. The identifier is rendered per the
3513
- * configured ownership.emailMode (handle, hash, or raw); the format field
3514
- * discriminates the three so type-aware consumers can branch without
3518
+ * configured ownership.emailMode (handle, anonymized/hash, or raw); the format field
3519
+ * discriminates the modes so type-aware consumers can branch without
3515
3520
  * re-parsing.
3516
3521
  */
3517
3522
  export interface ContributorEntry {
3518
3523
  /**
3519
3524
  * Display string per the configured email mode: raw email
3520
- * (`alice@example.com`), local-part handle (`alice`), or stable hash
3525
+ * (`alice@example.com`), local-part handle (`alice`), or stable anonymized hash
3521
3526
  * pseudonym (`xxh3:<16hex>`). The format depends on `format`.
3522
3527
  *
3523
- * Renamed from `email` because in `handle` and `hash` modes the value
3528
+ * Renamed from `email` because in `handle` and `anonymized`/`hash` modes the value
3524
3529
  * is no longer an email address; consumers tempted to use it as one
3525
3530
  * (e.g. `mailto:`) would be wrong.
3526
3531
  */
@@ -4549,10 +4554,22 @@ resolution_comments_posted: number
4549
4554
  * Stale review threads actually resolved (zero on dry runs).
4550
4555
  */
4551
4556
  threads_resolved: number
4557
+ /**
4558
+ * Operator-facing retry hint when apply stopped early.
4559
+ */
4560
+ apply_hint?: (string | null)
4552
4561
  /**
4553
4562
  * Errors collected during apply, one entry per failure.
4554
4563
  */
4555
4564
  apply_errors: string[]
4565
+ /**
4566
+ * Stale fingerprints whose provider mutation failed.
4567
+ */
4568
+ failed_fingerprints?: string[]
4569
+ /**
4570
+ * Stale fingerprints not fully applied after the fail-fast stop.
4571
+ */
4572
+ unapplied_fingerprints?: string[]
4556
4573
  }
4557
4574
  /**
4558
4575
  * Envelope emitted by `fallow coverage setup --json`. Deterministic
@@ -1,63 +0,0 @@
1
- const { getPlatformPackage } = require('./platform-package');
2
- const { verifyInstalled, SKIP_ENV } = require('./verify-binary');
3
-
4
- const pkg = (() => {
5
- if (process.platform !== 'linux') {
6
- return getPlatformPackage(process.platform, process.arch);
7
- }
8
-
9
- try {
10
- const { familySync } = require('detect-libc');
11
- return getPlatformPackage(process.platform, process.arch, familySync());
12
- } catch {
13
- return getPlatformPackage(process.platform, process.arch);
14
- }
15
- })();
16
-
17
- if (!pkg) {
18
- console.warn(
19
- `fallow: No prebuilt binary for ${process.platform}-${process.arch}. ` +
20
- `You can build from source: https://github.com/fallow-rs/fallow`
21
- );
22
- process.exit(0);
23
- }
24
-
25
- try {
26
- require.resolve(`${pkg}/package.json`);
27
- } catch {
28
- console.warn(
29
- `fallow: Platform package ${pkg} not installed. ` +
30
- `This may happen if you used --no-optional. ` +
31
- `Run 'npm install' to fix.`
32
- );
33
- // Without the platform package there is nothing to verify; keep the existing
34
- // soft-fail behavior for --no-optional installs.
35
- process.exit(0);
36
- }
37
-
38
- async function main() {
39
- const result = await verifyInstalled();
40
- if (result.skipped) {
41
- console.warn(
42
- `fallow: binary verification skipped (${SKIP_ENV}=${process.env[SKIP_ENV]}). ` +
43
- `Only set this when you are deliberately replacing the published binary. ` +
44
- `See https://github.com/fallow-rs/fallow/blob/main/SECURITY.md for details.`
45
- );
46
- process.exit(0);
47
- }
48
- if (!result.ok) {
49
- const where = result.binary ? ` ${result.binary}` : '';
50
- console.error(
51
- `fallow: binary verification failed${where} (${result.code}): ${result.message}. ` +
52
- `This usually means the published platform package was tampered with. ` +
53
- `See https://github.com/fallow-rs/fallow/blob/main/SECURITY.md for details. ` +
54
- `Set ${SKIP_ENV}=1 only if you are deliberately replacing the binary.`
55
- );
56
- process.exit(1);
57
- }
58
- }
59
-
60
- main().catch((err) => {
61
- console.error(`fallow: binary verification failed (internal-error): ${err.message}`);
62
- process.exit(1);
63
- });