Hermex Output Review

← all cases

comply-json

changed

Asserts — The compliance block as machine-readable output on a failing repo.

Ran hermex comply --format json in fixtures/ → exit 1, as asserted

Config fixtures/hermex.config.ts · Fixture fixtures (overview) · Case comply-json (dossier)

Reproduce locally: pnpm run test:output -- --filter comply-json

Config

fixtures/hermex.config.ts — resolved, as the loader sees it

{
  "excludes": [
    "**/node_modules/**",
    "**/dist/**",
    "**/build/**",
    "cases.ts",
    "configs/**",
    "registry/**",
    "repos/**"
  ],
  "versus": [
    {
      "name": "Design System Migration",
      "packages": [
        "@design-system/foundation",
        "@new-system/arc"
      ]
    },
    {
      "name": "Utility Library Migration",
      "packages": [
        "lodash",
        "es-toolkit"
      ]
    }
  ],
  "rules": {
    "no-files": [
      {
        "severity": "error",
        "patterns": [
          "jest.config.*",
          ".babelrc"
        ],
        "message": "Use vitest + Vite"
      }
    ],
    "no-packages": [
      {
        "severity": "error",
        "patterns": [
          "moment"
        ],
        "message": "Use date-fns or dayjs"
      }
    ],
    "require-files": [
      {
        "severity": "error",
        "patterns": [
          ".nvmrc"
        ]
      },
      {
        "severity": "warn",
        "patterns": [
          ".editorconfig"
        ]
      }
    ],
    "require-packages": [
      {
        "severity": "error",
        "patterns": [
          "typescript"
        ],
        "message": "TypeScript is required"
      }
    ],
    "require-scripts": [
      {
        "severity": "error",
        "patterns": [
          "build",
          "test"
        ],
        "message": "Required npm scripts"
      }
    ],
    "require-package-fields": [
      {
        "severity": "warn",
        "patterns": [
          "engines",
          "license"
        ]
      }
    ],
    "require-engine-version": {
      "severity": "warn",
      "range": ">=20",
      "message": "Minimum Node 20 required"
    }
  },
  "output": {
    "details": false,
    "patterns": false
  }
}

Diff against the target branch

Diffs are unified format: - is the target branch, + is this run. @@ -12,7 +12,9 @@ is a hunk header — unchanged lines were skipped, and the hunk below covers 7 lines from line 12 of the target branch and 9 lines from line 12 of this run.

--- target/stdout.json
+++ current/stdout.json
@@ -1,10 +1,10 @@
 {
   "version": "<version>",
   "summary": {
-    "filesAnalyzed": 17,
-    "totalImports": 80,
+    "filesAnalyzed": 21,
+    "totalImports": 86,
     "totalComponents": 35,
-    "totalUsagePatterns": 284
+    "totalUsagePatterns": 291
   },
   "packages": [
     {
@@ -16,6 +16,7 @@
       ],
       "componentCount": 18,
       "usageCount": 33,
+      "importingFileCount": 8,
       "percentage": 91.66666666666666,
       "hasVersionConflict": false,
       "allVersions": [
@@ -31,6 +32,7 @@
       ],
       "componentCount": 1,
       "usageCount": 3,
+      "importingFileCount": 6,
       "percentage": 8.333333333333332,
       "hasVersionConflict": false,
       "allVersions": [
@@ -38,6 +40,52 @@
       ]
     },
     {
+      "packageName": "react-dom",
+      "version": "18.3.1",
+      "rootVersion": "18.3.1",
+      "declaredIn": [],
+      "componentCount": 0,
+      "usageCount": 0,
+      "importingFileCount": 1,
+      "percentage": 0,
+      "hasVersionConflict": false,
+      "allVersions": [
+        "18.3.1"
+      ]
+    },
+    {
+      "packageName": "lodash",
+      "version": "4.17.21",
+      "rootVersion": "4.17.21",
+      "declaredIn": [
+        "dependencies"
+      ],
+      "componentCount": 0,
+      "usageCount": 0,
+      "importingFileCount": 3,
+      "percentage": 0,
+      "hasVersionConflict": false,
+      "allVersions": [
+        "4.17.21"
+      ]
+    },
+    {
+      "packageName": "es-toolkit",
+      "version": "1.39.10",
+      "rootVersion": "1.39.10",
+      "declaredIn": [
+        "dependencies"
+      ],
+      "componentCount": 0,
+      "usageCount": 0,
+      "importingFileCount": 1,
+      "percentage": 0,
+      "hasVersionConflict": false,
+      "allVersions": [
+        "1.39.10"
+      ]
+    },
+    {
       "packageName": "eslint",
       "version": null,
       "rootVersion": null,
@@ -46,6 +94,7 @@
       ],
       "componentCount": 0,
       "usageCount": 0,
+      "importingFileCount": 0,
       "percentage": 0,
       "hasVersionConflict": false,
       "allVersions": []
@@ -59,24 +108,12 @@
       ],
       "componentCount": 0,
       "usageCount": 0,
+      "importingFileCount": 0,
       "percentage": 0,
       "hasVersionConflict": false,
       "allVersions": [
         "2.29.4"
       ]
-    },
-    {
-      "packageName": "react-dom",
-      "version": "18.3.1",
-      "rootVersion": "18.3.1",
-      "declaredIn": [],
-      "componentCount": 0,
-      "usageCount": 0,
-      "percentage": 0,
-      "hasVersionConflict": false,
-      "allVersions": [
-        "18.3.1"
-      ]
     }
   ],
   "components": [
@@ -398,16 +435,44 @@
       "entries": [
         {
           "packageName": "@design-system/foundation",
-          "count": 33,
-          "percentage": 100
+          "count": 8,
+          "renderCount": 33,
+          "percentage": 100,
+          "present": true
         },
         {
           "packageName": "@new-system/arc",
           "count": 0,
-          "percentage": 0
+          "renderCount": 0,
+          "percentage": 0,
+          "present": false
         }
       ],
-      "totalCount": 33
+      "totalCount": 8
+    },
+    {
+      "name": "Utility Library Migration",
+      "packages": [
+        "lodash",
+        "es-toolkit"
+      ],
+      "entries": [
+        {
+          "packageName": "lodash",
+          "count": 3,
+          "renderCount": 0,
+          "percentage": 75,
+          "present": true
+        },
+        {
+          "packageName": "es-toolkit",
+          "count": 1,
+          "renderCount": 0,
+          "percentage": 25,
+          "present": true
+        }
+      ],
+      "totalCount": 4
     }
   ],
   "ruleViolations": [

--- target/stderr.txt
+++ current/stderr.txt
@@ -1,8 +1,8 @@
 hermex v<version>
 - Parsing lockfile...
-✔ Found pnpm lockfile (supports: v5, v6, v9) - 5 packages
-✔ Found 18 files
-✔ Analysis complete! Analyzed 17/18 files
+✔ Found pnpm lockfile (supports: v5, v6, v9) - 7 packages
+✔ Found 22 files
+✔ Analysis complete! Analyzed 21/22 files
 
 ⚠ 1 file(s) failed to parse:
   broken/unparseable.tsx

Full output

stdout.json
{
  "version": "<version>",
  "summary": {
    "filesAnalyzed": 21,
    "totalImports": 86,
    "totalComponents": 35,
    "totalUsagePatterns": 291
  },
  "packages": [
    {
      "packageName": "@design-system/foundation",
      "version": "2.5.3",
      "rootVersion": "2.5.3",
      "declaredIn": [
        "dependencies"
      ],
      "componentCount": 18,
      "usageCount": 33,
      "importingFileCount": 8,
      "percentage": 91.66666666666666,
      "hasVersionConflict": false,
      "allVersions": [
        "2.5.3"
      ]
    },
    {
      "packageName": "react",
      "version": "18.3.1",
      "rootVersion": "18.3.1",
      "declaredIn": [
        "dependencies"
      ],
      "componentCount": 1,
      "usageCount": 3,
      "importingFileCount": 6,
      "percentage": 8.333333333333332,
      "hasVersionConflict": false,
      "allVersions": [
        "18.3.1"
      ]
    },
    {
      "packageName": "react-dom",
      "version": "18.3.1",
      "rootVersion": "18.3.1",
      "declaredIn": [],
      "componentCount": 0,
      "usageCount": 0,
      "importingFileCount": 1,
      "percentage": 0,
      "hasVersionConflict": false,
      "allVersions": [
        "18.3.1"
      ]
    },
    {
      "packageName": "lodash",
      "version": "4.17.21",
      "rootVersion": "4.17.21",
      "declaredIn": [
        "dependencies"
      ],
      "componentCount": 0,
      "usageCount": 0,
      "importingFileCount": 3,
      "percentage": 0,
      "hasVersionConflict": false,
      "allVersions": [
        "4.17.21"
      ]
    },
    {
      "packageName": "es-toolkit",
      "version": "1.39.10",
      "rootVersion": "1.39.10",
      "declaredIn": [
        "dependencies"
      ],
      "componentCount": 0,
      "usageCount": 0,
      "importingFileCount": 1,
      "percentage": 0,
      "hasVersionConflict": false,
      "allVersions": [
        "1.39.10"
      ]
    },
    {
      "packageName": "eslint",
      "version": null,
      "rootVersion": null,
      "declaredIn": [
        "devDependencies"
      ],
      "componentCount": 0,
      "usageCount": 0,
      "importingFileCount": 0,
      "percentage": 0,
      "hasVersionConflict": false,
      "allVersions": []
    },
    {
      "packageName": "moment",
      "version": "2.29.4",
      "rootVersion": "2.29.4",
      "declaredIn": [
        "devDependencies"
      ],
      "componentCount": 0,
      "usageCount": 0,
      "importingFileCount": 0,
      "percentage": 0,
      "hasVersionConflict": false,
      "allVersions": [
        "2.29.4"
      ]
    }
  ],
  "components": [
    {
      "name": "Button",
      "source": "@design-system/foundation",
      "count": 6,
      "files": [
        "patterns/01-direct-usage.tsx",
        "patterns/03-object-mapping.tsx",
        "patterns/04-lazy-loading.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Card",
      "source": "unknown",
      "count": 5,
      "files": [
        "aliasing/01-plain.tsx",
        "aliasing/02-alias.tsx",
        "aliasing/03-alias-again.tsx",
        "aliasing/04-plain-again.tsx",
        "patterns/05-namespace-imports.tsx"
      ]
    },
    {
      "name": "Input",
      "source": "@design-system/foundation",
      "count": 5,
      "files": [
        "patterns/01-direct-usage.tsx",
        "patterns/03-object-mapping.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Card",
      "source": "@design-system/foundation",
      "count": 4,
      "files": [
        "patterns/01-direct-usage.tsx",
        "patterns/03-object-mapping.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Typography",
      "source": "@design-system/foundation",
      "count": 4,
      "files": [
        "patterns/01-direct-usage.tsx",
        "patterns/04-lazy-loading.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Suspense",
      "source": "react",
      "count": 3,
      "files": [
        "patterns/04-lazy-loading.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Foundation.Button",
      "source": "unknown",
      "count": 3,
      "files": [
        "patterns/05-namespace-imports.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Foundation.Input",
      "source": "unknown",
      "count": 3,
      "files": [
        "patterns/05-namespace-imports.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Foundation.Card",
      "source": "unknown",
      "count": 3,
      "files": [
        "patterns/05-namespace-imports.tsx",
        "patterns/06-common-patterns.tsx",
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Foundation.Typography",
      "source": "unknown",
      "count": 2,
      "files": [
        "patterns/05-namespace-imports.tsx",
        "patterns/06-common-patterns.tsx"
      ]
    },
    {
      "name": "Button",
      "source": "unknown",
      "count": 2,
      "files": [
        "versus/01-collision-classic-button.tsx",
        "versus/02-collision-pulse-button.tsx"
      ]
    },
    {
      "name": "Doc",
      "source": "local",
      "count": 1,
      "files": [
        "declarations/consumer.tsx"
      ]
    },
    {
      "name": "PrimaryButton",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/02-variable-assignment.tsx"
      ]
    },
    {
      "name": "UserInput",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/02-variable-assignment.tsx"
      ]
    },
    {
      "name": "InfoCard",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/02-variable-assignment.tsx"
      ]
    },
    {
      "name": "Typography",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/05-namespace-imports.tsx"
      ]
    },
    {
      "name": "FoundationComponents.Button",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/05-namespace-imports.tsx"
      ]
    },
    {
      "name": "Icon",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/06-common-patterns.tsx"
      ]
    },
    {
      "name": "SaveButton",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/06-common-patterns.tsx"
      ]
    },
    {
      "name": "UserCard",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/06-common-patterns.tsx"
      ]
    },
    {
      "name": "MyButton",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "MyInput",
      "source": "unknown",
      "count": 1,
      "files": [
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "Modal",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/07-comprehensive-usage.tsx"
      ]
    },
    {
      "name": "CaseChild",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseCond",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseMap",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseVar",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseReturn",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "Child",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseAttr",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseAttrSelfClosing",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
      ]
    },
    {
      "name": "CaseAttrCond",
      "source": "@design-system/foundation",
      "count": 1,
      "files": [
        "patterns/09-jsx-in-attributes.tsx"
… 119 more line(s) — re-run locally for the full text.
stderr.txt
hermex v<version>
- Parsing lockfile...
✔ Found pnpm lockfile (supports: v5, v6, v9) - 7 packages
✔ Found 22 files
✔ Analysis complete! Analyzed 21/22 files

⚠ 1 file(s) failed to parse:
  broken/unparseable.tsx
      x Expression expected
   ,----
 1 | export const Broken = ( : : :;
   :                         ^
   `----


Caused by:
    Syntax Error