Skip to content

feat(repo-memory): add format-json option to pretty-print JSON files before commit#39540

Merged
pelikhan merged 3 commits into
mainfrom
copilot/add-json-formatting-option
Jun 17, 2026
Merged

feat(repo-memory): add format-json option to pretty-print JSON files before commit#39540
pelikhan merged 3 commits into
mainfrom
copilot/add-json-formatting-option

Conversation

Copilot AI commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

AI agents frequently write JSON memory files as single-line blobs even when instructed otherwise, making them hard to review or manually correct in the repository. A new format-json: true option on repo-memory entries forces all .json files to be pretty-printed (2-space indent, trailing newline) before they are committed to the memory branch.

Changes

  • RepoMemoryEntry struct — new FormatJSON bool field (format-json YAML key)
  • extractRepoMemoryConfig — parses format-json in both object and array config paths
  • buildPushRepoMemoryJob — emits FORMAT_JSON: 'true' env var on the push step only when enabled (omitted otherwise, no-op default)
  • push_repo_memory.cjs — after files are copied but before git add, recursively formats .json files via JSON.stringify(parsed, null, 2); invalid JSON files are skipped with a warning rather than failing the push
  • Schemaformat-json boolean added to both the object and array-item repo-memory schema variants
  • Docsformat-json documented in the advanced config example and option descriptions
  • Tests — object config, array config, default-false, and push-step env-var emission

Example

tools:
  repo-memory:
    branch-name: memory/notes
    format-json: true   # pretty-prints all .json files before commit

Or per-entry in array notation:

tools:
  repo-memory:
    - id: notes
      branch-name: memory/notes
      format-json: true
    - id: logs
      branch-name: memory/logs

Co-authored-by: dsyme <7204669+dsyme@users.noreply.github.com>
Copilot AI changed the title [WIP] Add option to format JSON repo memory for readability feat(repo-memory): add format-json option to pretty-print JSON files before commit Jun 16, 2026
Copilot finished work on behalf of dsyme June 16, 2026 12:29
Copilot AI requested a review from dsyme June 16, 2026 12:29
@pelikhan pelikhan marked this pull request as ready for review June 17, 2026 13:42
Copilot AI review requested due to automatic review settings June 17, 2026 13:42
@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel failed to deliver outputs during test quality analysis.

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check.

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds an opt-in format-json: true setting to the repo-memory tool so that .json files are pretty-printed (2-space indent, trailing newline) before being committed to the memory branch, improving readability and reviewability of agent-written JSON.

Changes:

  • Added format-json to RepoMemoryEntry and parsing logic for both object and array tool config forms.
  • Wired FORMAT_JSON=true into the generated push step environment only when enabled.
  • Implemented recursive .json pretty-printing in push_repo_memory.cjs, plus schema/docs/tests updates.
Show a summary per file
File Description
pkg/workflow/repo_memory.go Adds FormatJSON config parsing and conditionally emits FORMAT_JSON to the push step env.
pkg/workflow/repo_memory_test.go Adds coverage for parsing defaults and push-step env-var emission.
pkg/parser/schemas/main_workflow_schema.json Extends the workflow schema to allow format-json in both repo-memory config variants.
docs/src/content/docs/reference/repo-memory.md Documents the new option in the advanced configuration section.
actions/setup/js/push_repo_memory.cjs Implements the JSON formatting behavior when FORMAT_JSON is enabled.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 5/5 changed files
  • Comments generated: 1

Comment on lines +381 to +394
try {
const raw = fs.readFileSync(fullPath, "utf8");
if (!raw.trim()) {
continue;
}
const parsed = JSON.parse(raw);
const formatted = JSON.stringify(parsed, null, 2) + "\n";
if (raw !== formatted) {
fs.writeFileSync(fullPath, formatted, "utf8");
core.info(`Formatted JSON: ${path.relative(destMemoryPath, fullPath)}`);
}
} catch (/** @type {any} */ error) {
core.warning(`Skipping JSON formatting for ${path.relative(destMemoryPath, fullPath)}: ${error.message}`);
}
@github-actions

Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (153 new lines in business-logic directories, above the 100-line threshold) but does not have a linked Architecture Decision Record (ADR).

⚠️ I generated a draft ADR but could not auto-commit it — the push step ran against a detached-HEAD working tree (GITHUB_HEAD_REF/GITHUB_REF_NAME unavailable). Please add the draft below to your branch manually as docs/adr/39540-format-json-option-for-repo-memory.md.

🔒 This PR cannot merge until an ADR is linked in the PR body.

📄 Draft ADR — copy into docs/adr/39540-format-json-option-for-repo-memory.md
# ADR-39540: Opt-in `format-json` Pretty-Printing for repo-memory JSON Files

**Date**: 2026-06-17
**Status**: Draft

## Context

AI agents that write to `repo-memory` branches frequently emit `.json` files as single-line blobs, even when instructed otherwise. These compact files are hard to review in PRs and awkward to correct by hand. The `repo-memory` push pipeline already copies, filters, and validates memory files before committing, so it is a natural place to normalize formatting. Any solution must be backward compatible: existing memory branches and `.jsonl` files must not change behavior unless a user opts in.

## Decision

We will add an opt-in boolean `format-json` option to `repo-memory` entries (object and array notations). When enabled, the push step (`push_repo_memory.cjs`) recursively pretty-prints every `.json` file (2-space indent, trailing newline) after files are copied but before `git add`. It is plumbed through `RepoMemoryEntry.FormatJSON` and emitted as a `FORMAT_JSON: 'true'` env var only when enabled, so the default (`false`) is a strict no-op. Invalid JSON files are skipped with a warning rather than failing the push.

## Alternatives Considered

### Alternative 1: Always pretty-print JSON (no opt-in)
Format all `.json` unconditionally. Rejected: it would silently reshape existing memory branches, produce large one-time diffs, and remove the option of compact storage.

### Alternative 2: Rely on agent instructions to format JSON
Rejected: agents demonstrably ignore these instructions; commit-time enforcement is deterministic and reliable.

### Alternative 3: Git attribute filter or pre-commit hook
Rejected: more complex and harder to provision in the ephemeral generated workflow runtime than inlining in the existing push script.

## Consequences

### Positive
- JSON memory files become human-readable, making review and manual edits practical.
- Strictly opt-in: default behavior unchanged; env var omitted when disabled.
- Malformed JSON is skipped with a warning, so formatting never breaks a valid push.

### Negative
- Pretty-printing increases file size and produces larger diffs for JSON.
- Adds a recursive filesystem scan to the push step when enabled.
- Applies only to `.json`, not `.jsonl`, leaving possible mixed conventions in one branch.

### Neutral
- Introduces a new `FORMAT_JSON` env-var contract between compiler and push script.
- The `format-json` schema property is duplicated across object and array-item schema variants and must be kept in sync.
📋 What to do next
  1. Add the draft ADR above to docs/adr/39540-format-json-option-for-repo-memory.md on your branch.
  2. Complete/refine the sections — add context the gate couldn't infer and confirm the alternatives match what you considered.
  3. Commit the finalized ADR to your branch.
  4. Reference the ADR in this PR body, e.g.:

    ADR: ADR-39540: Opt-in format-json Pretty-Printing for repo-memory JSON Files

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

❓ Why ADRs Matter

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) benefit from understanding the trade-offs behind a decision rather than reverse-engineering them from the diff.

📋 Michael Nygard ADR Format Reference

An ADR must contain four sections to be complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

ADRs live in docs/adr/ numbered by PR number (e.g., 39540-...md).

🔒 This PR cannot merge until an ADR is linked in the PR body.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ ·

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 90/100 — Excellent

Analyzed 4 test(s): 4 design, 0 implementation, 0 hard guideline violation(s). Minor soft issue: several require.NotNil / require.Len / require.NoError calls are missing descriptive assertion messages.

📊 Metrics & Test Classification (4 tests analyzed)
Metric Value
New/modified tests analyzed 4
✅ Design tests (behavioral contracts) 4 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 4 (100%)
Duplicate test clusters 0
Test inflation detected YES (127 test lines / 18 production lines ≈ 7:1)
🚨 Coding-guideline violations 0 hard — 8 soft (missing assertion messages on require.NotNil / require.Len / require.NoError calls)
Test File Classification Issues Detected
TestRepoMemoryFormatJSONObjectConfig pkg/workflow/repo_memory_test.go:1422 ✅ Design Soft: require.NotNil, require.Len lack messages
TestRepoMemoryFormatJSONObjectConfigFalse pkg/workflow/repo_memory_test.go:1444 ✅ Design Soft: require.NotNil, require.Len lack messages
TestRepoMemoryFormatJSONArrayConfig pkg/workflow/repo_memory_test.go:1465 ✅ Design Soft: require.NotNil, require.Len lack messages
TestRepoMemoryFormatJSONPushStepEnvVar pkg/workflow/repo_memory_test.go:1494 ✅ Design Soft: require.NoError, require.NotNil (×2 each) lack messages

Go: 1 (*_test.go); JavaScript: 0.

Score breakdown:

  • Behavioral coverage: 40/40
  • Error/edge case coverage: 30/30
  • Duplication: 20/20
  • Proportional growth: 0/10 (inflation penalty: 127 test lines vs 18 production lines)
⚠️ Flagged Tests — Soft Issues (8 missing assertion messages)

These are not hard failures but violate the project guideline requiring a descriptive message on every assertion call.

TestRepoMemoryFormatJSONObjectConfig (pkg/workflow/repo_memory_test.go:1422) — require.NotNil(t, config) and require.Len(t, config.Memories, 1) have no message argument. Suggested fix: add "extractRepoMemoryConfig should return a non-nil config" and "expected exactly one memory entry".

TestRepoMemoryFormatJSONObjectConfigFalse (pkg/workflow/repo_memory_test.go:1444) — Same pattern: require.NotNil and require.Len lack messages.

TestRepoMemoryFormatJSONArrayConfig (pkg/workflow/repo_memory_test.go:1465) — Same pattern: require.NotNil and require.Len lack messages.

TestRepoMemoryFormatJSONPushStepEnvVar (pkg/workflow/repo_memory_test.go:1494) — Both subtests have bare require.NoError(t, err) and require.NotNil(t, pushJob). Suggested fix: e.g. require.NoError(t, err, "buildPushRepoMemoryJob should not return an error").

Verdict

Check passed. 0% implementation tests (threshold: 30%). All 4 new tests verify observable behavioral contracts — config parsing correctness and env-var emission — and include both positive and negative/default-value paths. Test inflation is noted (7:1 ratio) but is expected for config-parsing tests requiring full struct setup. Soft guideline issues (missing assertion messages) are encouraged to fix but do not block merge.

References:

🧪 Test quality analysis by Test Quality Sentinel ·

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skills-Based Review 🧠

Applied /tdd and /grill-with-docs — requesting changes on JavaScript test coverage.

📋 Key Themes & Highlights

Blocking concern

  • JS test gap: push_repo_memory.test.cjs has 1566 lines of coverage for this file, but the entire FORMAT_JSON feature — the runtime logic that actually mutates files before git commit — has zero tests. All four issues flagged in inline comments point back to this single gap.

Positive highlights

  • ✅ Go compiler side is thoroughly tested: 127 lines covering object config, array config, default-false, and env-var emission/omission.
  • ✅ The runtime defaults are safe: invalid JSON files are skipped with a core.warning rather than failing the push; the FORMAT_JSON env var is only emitted when explicitly enabled, so all existing users are unaffected.
  • ✅ The if (raw !== formatted) guard avoids gratuitous writes — good for idempotency.
  • .git directory exclusion is correct and deliberate.
  • ✅ Schema change covers both the object-config and array-item variants, consistent with the allowed-extensions pattern.

Summary of inline comments

File Line Skill Issue
push_repo_memory.cjs 372 /tdd formatJSONFilesInDir untestable in current location; suggest extracting to module or adding source-content tests
push_repo_memory.cjs 387 /grill-with-docs Integer-keyed objects get key-reordered by JSON.stringify; worth a doc note
push_repo_memory.cjs 380 /tdd .jsonl exclusion is documented but untested
push_repo_memory.cjs 388 /tdd raw !== formatted no-op path is untested — hot path for repeat runs

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer

* Recursively find and format all .json files under a directory
* @param {string} dirPath - Directory to scan
*/
function formatJSONFilesInDir(dirPath) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] formatJSONFilesInDir is defined inside the if (formatJSON) block inside main() — making it untestable in isolation. push_repo_memory.test.cjs already has 1566 lines of coverage for this file, but FORMAT_JSON handling has zero test coverage despite being the core runtime behaviour of this feature.

💡 Two paths to fix

Option A — extract to a module (same pattern as glob_pattern_helpers.cjs):

// format_json_helpers.cjs
function formatJSONFilesInDir(dirPath, { destMemoryPath, fs, path, core }) { ... }
module.exports = { formatJSONFilesInDir };

This makes the function importable and testable with a mock fs.

Option B — source-content checks (already used at lines 1502–1565):

expect(scriptContent).toContain('FORMAT_JSON === "true"');
expect(scriptContent).toContain('.endsWith(".json")');
expect(scriptContent).toContain('core.warning');

Lower fidelity but consistent with existing test style.

Behaviours worth covering:

  • Compact JSON → 2-space indent + trailing \n
  • Already-formatted → no writeFileSync call (no-op)
  • Empty file → skipped
  • Invalid JSON → core.warning, not core.setFailed
  • .jsonl / .txt → untouched
  • .git/ → not traversed

continue;
}
const parsed = JSON.parse(raw);
const formatted = JSON.stringify(parsed, null, 2) + "\n";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/grill-with-docs] JSON.stringify sorts integer-like string keys before other keys — {"1":"a","name":"b"} round-trips to {"1":"a","name":"b"} (fine), but {"name":"b","1":"a"} becomes {"1":"a","name":"b"} (key-order change). Agents that happen to use numeric keys would see a one-time noisy diff the first time format-json runs.

This is a V8 spec behaviour, not a bug in this code, but the docs (repo-memory.md) should mention it so users aren't surprised by unexpected diffs.

if (entry.name !== ".git") {
formatJSONFilesInDir(fullPath);
}
} else if (entry.isFile() && entry.name.endsWith(".json")) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] The docs state format-json has no effect on .jsonl files, but this is untested. A source-content test (consistent with the existing style at lines 1502–1565) could guard this:

it('should only format .json files, not .jsonl or other types', () => {
  expect(scriptContent).toContain('.endsWith(".json")');
  // Verify .jsonl is not in the same condition
  expect(scriptContent).not.toMatch(/endsWith\(".jsonl"\)/);
});

This also documents the intended exclusion for future maintainers.

}
const parsed = JSON.parse(raw);
const formatted = JSON.stringify(parsed, null, 2) + "\n";
if (raw !== formatted) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] The raw !== formatted early-exit is a smart optimization (avoids a needless write + dirty git status entry), but it's entirely untested. The already-formatted no-op path is the hot path for users who run the workflow repeatedly — skipping it means each run silently rewrites every file.

💡 Suggested test (source-content check)
it('should skip writeFileSync when JSON is already formatted', () => {
  // Verify the guard exists in source — protects against accidental removal
  expect(scriptContent).toContain('if (raw !== formatted)');
});

For a more behavioural test, extract formatJSONFilesInDir to a module (see comment on line 372) and drive it with a mock fs that asserts writeFileSync is not called when the file content already matches the formatted output.

@pelikhan

Copy link
Copy Markdown
Collaborator

@copilot run pr-finisher skill

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

REQUEST_CHANGES — Four correctness issues in the JS formatter that need fixing before merge.

### Blocking issues summary
  1. Scope expansion → guaranteed limit violations on first enable (line 400): formatJSONFilesInDir walks the entire memory branch root, not just newly copied files. First enable on a branch with ≥100 pre-existing JSON files will always hit maxFileCount or maxPatchSize, failing the push with an opaque error. Either restrict formatting to just-copied files, or clearly document and warn about this behavior.

  2. No file-size guard in the formatter (line 382): Pre-existing large JSON files on the branch bypass the maxFileSize check that protects the copy phase, risking OOM on the runner.

  3. readdirSync failure in subdirectory is fatal (line 373): A single unreadable subdirectory kills the entire push. Per-file errors are warnings; per-directory errors should be too.

  4. Integer-like string keys silently reordered (line 387): V8 sorts integer-indexed keys numerically before string keys on stringify, causing an irreversible one-time mutation to key ordering that is not logged.

Non-blocking notes

  • FORMAT_JSON is not listed in the module-level JSDoc env-var comment block (lines 13–40). Should be added between FILE_GLOB_FILTER and GH_TOKEN.
  • The JavaScript formatting logic has no unit tests at the CJS level; the Go tests only cover YAML parsing and env-var emission, not actual JSON reformatting behavior.

🔎 Code quality review by PR Code Quality Reviewer

}

try {
formatJSONFilesInDir(destMemoryPath);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First-enable will always exceed maxFileCount/maxPatchSize limits on a populated branch: formatJSONFilesInDir(destMemoryPath) walks the entire memory branch root, not just the files that were just copied. When format-json: true is first activated on a branch that already has ≥ maxFileCount (default 100) pre-existing JSON files, all of them are reformatted, changedFileCount exceeds the limit, and the push is hard-failed — even though the agent only wrote a single new file. The error message (Too many changed files (150 > 100)) gives no hint that format-json caused it.

💡 Suggested fix

Option A (preferred) — only format files that were just copied:

const copiedPaths = new Set(
  filesToCopy.map(f => path.resolve(path.join(destMemoryPath, f.relativePath)))
);
// inside formatJSONFilesInDir, change the condition to:
} else if (entry.isFile() && entry.name.endsWith('.json') && copiedPaths.has(path.resolve(fullPath))) {

Option B (documentation-only) — add a note in the docs that first enable on a populated branch reformats ALL pre-existing JSON files and may require increasing maxFileCount/maxPatchSize.

The same scope expansion inflates git diff --cached size, so maxPatchSize is equally at risk of being triggered.

continue;
}
const parsed = JSON.parse(raw);
const formatted = JSON.stringify(parsed, null, 2) + "\n";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JSON.stringify silently reorders integer-like string keys on first format pass: V8 enumerates integer-indexed properties (non-negative integer string keys ≤ 232−2) before string keys, sorted numerically. A file like {"b":1,"10":3,"2":4} becomes {"2":4,"10":3,"b":1} after one round-trip. This mutation is silent (no warning, no log line), one-time, and irreversible. For config schemas, OpenAPI specs, or ordered key–value stores stored in memory, this is unexpected data corruption.

💡 Details and fix

Reproduction:

const o = JSON.parse('{"b":1,"10":3,"2":4}');
console.log(JSON.stringify(o, null, 2));
// Output:
// {
//   "2": 4,
//   "10": 3,
//   "b": 1
// }

This is a one-time normalization (idempotent after first write), but the silent reordering may break downstream consumers that rely on key order.

Consider logging a per-file warning when the stringified form differs from the original to give visibility into what was mutated, not just that it was mutated:

core.info(`Formatted JSON (structural change): ${path.relative(destMemoryPath, fullPath)}`);

* @param {string} dirPath - Directory to scan
*/
function formatJSONFilesInDir(dirPath) {
const entries = fs.readdirSync(dirPath, { withFileTypes: true });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

readdirSync failure in a subdirectory is fatal while per-file failures are warnings — asymmetric error handling: If readdirSync throws for any subdirectory (e.g. EACCES, a broken directory symlink, or a race-condition ENOENT), the exception propagates through the recursive call stack and is caught by the outer try/catch at line 399, which calls core.setFailed() and aborts the push. Individual file read/parse errors at line 392 are caught and emitted as core.warning, allowing the run to continue. The asymmetry means a single unreadable subdirectory kills the entire push while an unreadable file does not.

💡 Suggested fix

Wrap the recursive call and the readdirSync in per-directory error handling:

function formatJSONFilesInDir(dirPath) {
  let entries;
  try {
    entries = fs.readdirSync(dirPath, { withFileTypes: true });
  } catch (err) {
    core.warning(`Skipping directory (cannot read): ${path.relative(destMemoryPath, dirPath)}: ${err.message}`);
    return;
  }
  for (const entry of entries) {
    // ...
    if (entry.isDirectory() && entry.name !== ".git") {
      formatJSONFilesInDir(fullPath); // inner failures now self-contained
    }
  }
}

}
} else if (entry.isFile() && entry.name.endsWith(".json")) {
try {
const raw = fs.readFileSync(fullPath, "utf8");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No file-size guard before readFileSync — OOM risk for large pre-existing JSON files: The copy phase enforces maxFileSize per file (line 289), but the formatter reads every .json file on the branch into memory with no size check. A 200 MB accumulated-history file that was committed to the branch before maxFileSize was lowered, or that was once allowed but now exceeds the limit, will be fully loaded, parsed, and re-serialized. On a standard GitHub Actions runner (7 GB RAM shared with git and Node), a handful of large files can exhaust the heap and crash the runner process with an OOM error that is caught by the outer try/catch and surfaces as a confusing core.setFailed failure.

💡 Suggested fix

Add a stat check before reading, consistent with the copy-phase guard:

const statResult = fs.statSync(fullPath);
if (statResult.size > maxFileSize) {
  core.warning(`Skipping large JSON file (> ${maxFileSize} bytes): ${path.relative(destMemoryPath, fullPath)}`);
  continue;
}
const raw = fs.readFileSync(fullPath, "utf8");

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>

Copilot AI commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

@copilot run pr-finisher skill

Ran a pr-finisher pass and pushed d0fadad, which enforces MAX_FILE_SIZE after JSON pretty-printing so formatting cannot commit oversize JSON files.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants