@lemoncode/lemony 0.1.2 → 0.3.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.
Files changed (37) hide show
  1. package/README.md +19 -14
  2. package/catalog/VERSION +1 -1
  3. package/catalog/agents/architect.md +13 -4
  4. package/catalog/agents/implementer.md +87 -8
  5. package/catalog/agents/orchestrator.md +643 -386
  6. package/catalog/agents/partition.md +316 -0
  7. package/catalog/agents/reviewer.md +356 -21
  8. package/catalog/agents/spec-author.md +16 -4
  9. package/catalog/agents/spinoff.md +100 -0
  10. package/catalog/agents/triage.md +41 -0
  11. package/catalog/agents/ui-design.md +147 -0
  12. package/catalog/agents/ui-designer.md +3 -2
  13. package/catalog/commands/add-capability.md +4 -4
  14. package/catalog/commands/define.md +7 -0
  15. package/catalog/commands/hotfix.md +15 -1
  16. package/catalog/commands/pause.md +5 -0
  17. package/catalog/commands/resume.md +38 -10
  18. package/catalog/commands/triage.md +4 -3
  19. package/catalog/harness.config.schema.json +40 -0
  20. package/catalog/hooks/lib/merge-pr.sh +699 -0
  21. package/catalog/schemas/tier2-events-history.md +17 -0
  22. package/catalog/schemas/tier2-events.md +10 -10
  23. package/catalog/skills/mutation-testing/SKILL.md +80 -19
  24. package/catalog/skills/prd-to-spec/SKILL.md +74 -2
  25. package/catalog/skills/raise-discovery/SKILL.md +6 -0
  26. package/catalog/skills/resolve-discovery/SKILL.md +12 -7
  27. package/catalog/skills/security-review/SKILL.md +119 -6
  28. package/catalog/skills/spec-compliance-check/SKILL.md +8 -4
  29. package/catalog/skills/spec-to-issue/SKILL.md +7 -1
  30. package/catalog/skills/task-closeout/SKILL.md +85 -20
  31. package/catalog/skills/test-gap-report/SKILL.md +4 -0
  32. package/catalog/skills/triage-issue/SKILL.md +65 -4
  33. package/catalog/skills/verify/SKILL.md +3 -0
  34. package/catalog/templates/claude-code/agents.md.tpl +50 -16
  35. package/catalog/templates/claude-code/harness.config.yml.tpl +33 -0
  36. package/dist/cli.mjs +744 -37
  37. package/package.json +10 -6
@@ -0,0 +1,147 @@
1
+ # UI design (DEFINE + REVIEW) — Orchestrator companion
2
+
3
+ > Vendor companion to `.claude/agents/orchestrator.md` (the hat). **Read on
4
+ > demand, never at boot** — and never just to evaluate the activation gate: the
5
+ > gate's canonical two-part statement lives in the orchestrator's L1 step 3 and
6
+ > is evaluated there, core-only. Read this file when that gate has FIRED, when an
7
+ > implemented UI change reaches review (`tasks/<id>/spec/ui-handoff.md` exists),
8
+ > when resuming a task parked `awaiting design definition`, or on
9
+ > `/sync-design-tokens`.
10
+
11
+ UI design threads into an L1 task that touches UI — never a linear step. **The interactive
12
+ design interview is yours**: a sub-agent can't talk to the human, so at DEFINE **you** run
13
+ the `grill-ui` skill on your human-facing surface and author the `ui-handoff.md` contract.
14
+ The **UI Designer** sub-agent — always installed, invoked **on-demand**, your only invoker —
15
+ is your design **critic and QA**: at DEFINE it reviews the handoff you just authored (before
16
+ the Spec Author runs); at REVIEW it runs a mechanical pre-pass (the deterministic
17
+ `design-tokens` gates + the project's a11y tooling) then the `design-critique` and
18
+ `a11y-audit` judgment lenses, and returns one design verdict. You own the human dialogue, the
19
+ `ui-handoff.md` artifact, and the labels; it critiques and reports.
20
+
21
+ A third, on-demand affordance sits outside those two moments: **design-tool token sync**.
22
+ When the human runs `/sync-design-tokens` (or accepts the DEFINE offer when a drift check
23
+ shows an export is pending), dispatch the UI Designer to run its `design-tool-sync` skill.
24
+ It is human-reviewed both ways and tokens-only; the design tool is a projection of
25
+ `docs/design-tokens.json`, never a peer source of truth.
26
+
27
+ ## Activation gate
28
+
29
+ Canonical statement: the orchestrator's **L1 step 3** — evaluated there, core-only,
30
+ before this file is ever read. Rationale worth keeping in mind when it fired on a
31
+ borderline call: a wasted handoff stub is cheaper than UI shipped with no design
32
+ pass.
33
+
34
+ ## Design-stop offer
35
+
36
+ When the gate fires, **put `harness:needs-design`** on the issue and offer the human,
37
+ inline, in one line — three choices:
38
+
39
+ > This task touches UI. (1) **Continue** — define the design now, as part of the spec;
40
+ > (2) **Stop for handoff** — park here so a designer picks it up later; (3) **No UI after
41
+ > all** — skip design.
42
+
43
+ - **Continue** → **run `grill-ui` yourself** — the interactive design interview on your
44
+ human-facing surface — authoring `ui-handoff.md` under `tasks/<id>/spec/`. Then dispatch
45
+ the **UI Designer** (fresh context, Task tool) with the `<id>` and branch to **critique**
46
+ the handoff, and resolve its findings — tighten the handoff, re-ask the human, or
47
+ record an open question — before the Spec Author runs. The issue stays at
48
+ `harness:status:spec-in-progress` — design is part of completing the spec, not a new
49
+ lifecycle state.
50
+ - **Stop for handoff** → record the sub-state `awaiting design definition` in
51
+ `progress.md`, commit and push the task state to the branch, and stop. The task waits
52
+ at `spec-in-progress` (+ `harness:needs-design`) for a `/resume` (below).
53
+ - **No UI after all** → **remove `harness:needs-design`** and proceed with the ordinary
54
+ spec flow — the gate was a false positive, which bias-to-include accepts.
55
+
56
+ ## Persisting personas (offer)
57
+
58
+ `docs/personas.md` is **client-owned** — the harness consumes it, never imposes it. When your
59
+ `grill-ui` interview captured personas **inline** because `docs/personas.md` was **absent** (§1
60
+ of the handoff), make the offer — a human-facing choice, so it is yours:
61
+
62
+ > The design defined these personas inline. Persist them to `docs/personas.md` so future UI
63
+ > tasks reuse them? (yes / no)
64
+
65
+ - **Yes** → write a minimal `docs/personas.md` from the personas already in the handoff's §1
66
+ — the client's own words, not an invented cast. Then continue toward spec-ready.
67
+ - **No** → write nothing; the inline personas live on in the handoff for this task. The next
68
+ UI task simply asks again.
69
+
70
+ Only offer when the file was **absent and personas were captured inline** — never when
71
+ `docs/personas.md` already exists (it was consumed, nothing to persist) and never unasked.
72
+ This is opt-in surfacing of the client's own answers, not the harness authoring a persona set.
73
+
74
+ ## Design-tokens & design-tool on-ramp (offer)
75
+
76
+ `docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — consumed if
77
+ present, never imposed. A repo adopting the harness fresh has neither, and silence there is a dead
78
+ end. So when your `grill-ui` interview finds **either absent**, surface it as an opt-in offer (a
79
+ human-facing choice, so it is yours) rather than only an open question:
80
+
81
+ - **No `docs/design-tokens.json`** → offer to **scaffold** a starter token set derived from the
82
+ direction the interview just settled (the client's own colours/type/spacing, not a vendor
83
+ template), plus an opt-in follow-up to generate a sensible starter set for the aspects the
84
+ interview didn't cover. On **yes**, write the file and run `lemony design-tokens validate` before
85
+ closing; on **no**, capture it as an open question.
86
+ - **No `com.lemony.design-tool` binding** → offer to **connect a design tool** (write the binding +
87
+ first import via the UI Designer's `design-tool-sync` skill / `/sync-design-tokens`), or **stay
88
+ pure-code**. Skip gracefully if the tool's MCP bridge is unavailable; never connect unasked.
89
+
90
+ The mechanics live in the `grill-ui` skill; you run the offers on your human-facing surface. Only
91
+ offer when the input is **absent** — never re-offer a token file or binding that already exists.
92
+
93
+ ## Label put/remove
94
+
95
+ `harness:needs-design` is an **orthogonal presence flag** (same family as
96
+ `harness:architecture-drift`), never a status:
97
+
98
+ - **Put** it as soon as the gate classifies the task as touching UI and design is not
99
+ yet complete.
100
+ - **Remove** it the moment `ui-handoff.md` is **complete** — at or before the flip to
101
+ `harness:status:spec-ready`. **Complete** = the handoff carries **this task's** design
102
+ decisions (its sections hold real content, not the verbatim placeholder template), the UI
103
+ Designer's critique **passed** (or you resolved its findings), and **no** open design fork
104
+ remains (an open fork means design is still open — keep the label and resolve it first).
105
+ Ensure the label is gone **before** flipping to `spec-ready`: a spec-ready task never
106
+ carries `harness:needs-design`.
107
+
108
+ ## `awaiting design definition` sub-state + /resume re-entry
109
+
110
+ A task parked at "stop for handoff" sits at `harness:status:spec-in-progress` with
111
+ `progress.md` recording the sub-state `awaiting design definition`. It is the design
112
+ analogue of the step-by-step `awaiting human checkpoint` line — execution state, not a
113
+ label. `/resume <id>` re-enters there: check out the branch, read the captured context,
114
+ resume the `grill-ui` interview yourself to finish `ui-handoff.md`, dispatch the UI Designer
115
+ to critique it, then remove `harness:needs-design` and continue toward spec-ready. The resume
116
+ queue surfaces the parked design (`resume.md` lists `spec-in-progress` too).
117
+
118
+ ## REVIEW — the design lens
119
+
120
+ When an implemented UI change reaches review (L1 step 8), invoke the **UI Designer** as
121
+ a **distinct lens** alongside the Reviewer (code). The **durable "this task touched UI"
122
+ signal is the existence of `tasks/<id>/spec/ui-handoff.md`** — `harness:needs-design` is
123
+ already gone by spec-ready, so it can't be the cue; the handoff artifact persists and
124
+ survives a cold `/resume`, so it is what to check. Either lens rejecting routes back to
125
+ the Implementer (rejection is transient — no dedicated label); both passing reaches the
126
+ single human merge gate (two inputs, one gate).
127
+
128
+ The UI Designer's lens mirrors the Reviewer's own shape — a **mechanical pre-pass** (the
129
+ deterministic `lemony design-tokens validate` + `lemony design-tokens contrast` gates, plus the
130
+ project's a11y tooling), then **judgment** (`design-critique` + `a11y-audit`), returning
131
+ **one design verdict** with findings grouped by source (tokens / accessibility / craft).
132
+ The Reviewer's code lens stays design-unaware; you still see exactly two review inputs.
133
+
134
+ **Deterministic vs judgment, by level.** The two deterministic gates are cheap, agent-free
135
+ facts, so they run **per-step** on UI-touching steps in step-by-step mode (a bad contrast
136
+ in step 2 must not ride to step 6 — see the orchestrator's §Step-by-step implementation);
137
+ the project's a11y lint rides the per-step lint the same way. The **judgment lenses run
138
+ full-pass only** — design is holistic, and a mid-component critique is noise. There is no
139
+ per-step design agent and no new cap: a full-pass design rejection routes back like any
140
+ other rejection. (`lemony design-tokens validate` / `contrast` also run in CI independently of
141
+ review.)
142
+
143
+ ## Closeout
144
+
145
+ `ui-handoff.md` lives in `tasks/<id>/spec/`, so closeout archives it with the rest of
146
+ the spec (`task-closeout` `git mv`s the whole `spec/` into `_archive/<id>/`) — no
147
+ special handling.
@@ -42,8 +42,9 @@ wishes they had on call. Hold a high bar and bring conviction:
42
42
  You do **not** author the design — a sub-agent can't interview the human, so at DEFINE the
43
43
  Orchestrator runs the `grill-ui` interview on its own surface and authors `ui-handoff.md`.
44
44
  You come in at **two moments** — **critique** at DEFINE, **QA** at REVIEW — plus one
45
- off-cycle affordance, design-tool token sync (authority for the gate and label lifecycle is
46
- `orchestrator.md` §UI design).
45
+ off-cycle affordance, design-tool token sync (authority for the label lifecycle is
46
+ `.claude/agents/ui-design.md`, the Orchestrator's UI-design companion; the activation
47
+ gate itself lives in the Orchestrator's L1 step 3, core-only).
47
48
 
48
49
  **DEFINE — critique the handoff.** After the Orchestrator authors `ui-handoff.md` and
49
50
  **before** it dispatches the Spec Author, it dispatches you (fresh context) to review that
@@ -43,10 +43,10 @@ latent ones.
43
43
  reports the project has no meaningful architecture to map, it writes nothing: relay
44
44
  that to the user and **end the command** — skip step 4, force nothing.
45
45
 
46
- - **Any other latent capability** (e.g. a `test:mutation` script → `mutation-testing`):
47
- its guided activation is **not wired yet**. Say so plainly and **end the command** — do
48
- **not** fabricate the artifact. (Tracked as a follow-up; the activation behaviour plugs
49
- in here.)
46
+ - **Any other latent capability**: it has no guided activation. Say so plainly and
47
+ **end the command** do **not** fabricate the artifact. (Guided activation beyond
48
+ the architecture map is a deliberate non-feature, not a pending seam; wiring one up
49
+ for a future capability is its own decision.)
50
50
 
51
51
  4. **Re-sync so the gated skill installs** — only when step 3 actually wrote the artifact.
52
52
  Run:
@@ -22,3 +22,10 @@ self-approve, and move the `harness:status:*` labels per the lifecycle.
22
22
  If the task turns out to be too small for the full ceremony — nothing to specify,
23
23
  verify, or review — nudge toward `/triage` (L2) or `/bypass` (L3) per the task-fit
24
24
  dial (`.claude/agents/fit-assessment.md`). When in doubt, keep it in the harness.
25
+
26
+ The dial's ceiling is the **partition question**: if the closed PRD bundles separable,
27
+ independently mergeable wants, the orchestrator asks — at the define's close, before
28
+ opening the task — whether to cut the feature into several issues, each its own
29
+ branch, PR and merge gate (authority: `.claude/agents/partition.md`, read on trigger).
30
+ An approved cut opens a parent partition-plan issue (`harness:partition-plan`, never a
31
+ task) and Part 1 as a normal task; later parts open at their turn.
@@ -23,7 +23,21 @@ question to capture it, then proceed.
23
23
  issue, so it auto-closes on merge).
24
24
  3. **Skip the human-wait gates.** Do **not** pause for an approval gate, and do
25
25
  **not** wait on the merge gate — merge/ship as soon as the test is green and CI
26
- passes. This is the one path where you don't wait for a human to sign off first.
26
+ passes. "As soon as CI passes" is mechanical, not a vibe: execute the merge
27
+ through the checks-precondition executor
28
+ (`.claude/hooks/lib/merge-pr.sh <pr> --squash` — no `--approve-issue` here:
29
+ the hotfix review runs async, so there is no APPROVE to bind at merge time;
30
+ the stale-approve guard belongs to the reviewed task path), which waits for green and
31
+ refuses red or absent checks — urgency skips the _human_ wait, never the
32
+ verification. This is the one path where you don't wait for a human to sign
33
+ off first. On any non-zero exit (red / no checks / timeout / no verdict),
34
+ act on the exit code exactly as the Orchestrator's "Executing an authorized
35
+ merge — the checks precondition" section prescribes: surface the real state
36
+ and ask. Urgency never authorizes `--force` on your own initiative — a fire
37
+ does not lower the bar for merging on red or unverified checks. One
38
+ adaptation: a standing no-checks answer has no closeout PR to ride on this
39
+ path — commit the `merge.allow_no_checks: true` line onto the **hotfix
40
+ branch** before merging, so it lands with the hotfix PR.
27
41
  4. **Run the Reviewer asynchronously.** After shipping, dispatch the **Reviewer**
28
42
  sub-agent (fresh context, `senior-review`) on the merged change. The review is not
29
43
  skipped — it's deferred. If it surfaces problems, file a follow-up fix (a normal
@@ -50,3 +50,8 @@ A two-step pause:
50
50
 
51
51
  The hook prints `git status --porcelain` after emitting — it never
52
52
  auto-commits. Decide what (if anything) to stage and commit before leaving.
53
+ Exception — a task running **pre-commit review ON** (orchestrator §Pre-commit
54
+ review ON): do **not** commit; the zero-commit deferral binds `/pause` too.
55
+ Leave the staged save-point untouched (it survives the session; staging
56
+ anything now is the mid-experiment `add` the protocol forbids), note the pause
57
+ in `progress.md` — disk-only, per the mode's contract.
@@ -16,8 +16,11 @@ is the single source for the procedure.
16
16
  parked at `awaiting design definition` (+ `harness:needs-design`), and
17
17
  `-l harness:status:pending` for stubs captured by `/spinoff`), plus parked closeouts
18
18
  (`-l harness:status:closeout-pending --state all` — their issue is already **closed** by
19
- the task PR's `Closes #<id>`, so an open-only listing would miss them), and ask which to
20
- pick up.
19
+ the task PR's `Closes #<id>`, so an open-only listing would miss them), and **partition
20
+ parents** (`-l harness:partition-plan` — not tasks; one with unticked parts surfaces as
21
+ "partition in progress: next part per the plan" — or "waiting on #<id> (Part <j>)" when
22
+ the next row is blocked by an in-flight child — and resuming it starts the next eligible
23
+ part, or names the blocker, per `.claude/agents/partition.md`), and ask which to pick up.
21
24
 
22
25
  In brief (authority is the orchestrator): for an SDD task the state and spec live
23
26
  **only on the branch** until merge — `git fetch` and check out `harness/<id>-<slug>`
@@ -27,21 +30,41 @@ In brief (authority is the orchestrator): for an SDD task the state and spec liv
27
30
  resumes at the **approval gate** (run it — read the spec cold, never self-approve);
28
31
  an `in-progress` one resumes at the active subtask. A `spec-in-progress` task whose
29
32
  `progress.md` records `awaiting design definition` is a **UI design parked at "stop for
30
- handoff"** (authority: orchestrator §UI design): re-enter by **resuming the `grill-ui`
33
+ handoff"** (authority: `.claude/agents/ui-design.md`): re-enter by **resuming the `grill-ui`
31
34
  interview yourself** to finish `ui-handoff.md` (the UI Designer then critiques it), then
32
35
  drop `harness:needs-design` and continue toward spec-ready. When `progress.md` records
33
36
  `Mode: step-by-step`, the `## Step log` carries the step sub-state — resume
34
37
  exactly there: `awaiting human checkpoint (step N/M)` re-presents that pending
35
- checkpoint (inspect / run / OK / changes / OK+downgrade); a `fix-loop iteration K`
36
- line re-enters the per-step implement→review loop at that iteration (authority:
37
- the orchestrator §Step-by-step implementation). If the Mode line carries a
38
+ checkpoint (inspect / run / OK / changes / OK+downgrade; in all-at-once under
39
+ pre-commit review ON the line carries no `(step N/M)` counter — same
40
+ re-entry); a `fix-loop iteration K`
41
+ line re-enters the per-step implement→review loop at that iteration; an
42
+ `awaiting ledger retry (step N/M, retry 1/1)` line — or its full-pass twin
43
+ `awaiting ledger retry (full pass, retry 1/1)` — re-runs
44
+ `lemony review-ledger validate` on the sidecar on disk (`--anchor` per the
45
+ orchestrator: per-step, the `(anchor <oid>)` on the step-log line; full pass, the
46
+ fingerprint merge-base — except pre-commit review ON's pre-gate twin, which anchors
47
+ at the recorded single-group anchor, = the branch head: ON defers every commit) —
48
+ green re-presents the gate
49
+ the pass feeds, red goes to that gate with the verb's lines, the single retry being spent
50
+ (authority: the orchestrator §Step-by-step implementation). If the Mode line carries a
38
51
  `(downgraded to all-at-once at step N)` suffix, the remaining tasks run all-at-once —
39
52
  resume at the active subtask as usual, not via the step loop (the Step log is then
40
53
  history, not sub-state).
41
54
 
42
55
  **Cross-machine pickup of an `in-progress` task**: the branch on origin
43
56
  carries the last **successful** best-effort WIP push — the Implementer pushes on
44
- signaling done, and step-by-step pushes at each checkpoint-wait. If a **local** copy
57
+ signaling done, and step-by-step pushes at each checkpoint-wait. Exception: a task
58
+ running **pre-commit review ON** defers every commit and push until a checkpoint OK
59
+ — in-flight work and its `progress.md` updates exist only in the implementing
60
+ machine's worktree, so from another machine the branch reads as of the last OK'd
61
+ group; before the first OK it is **indistinguishable from idle** (the knob record
62
+ itself is deferred — the documented price of the mode, orchestrator §Pre-commit
63
+ review ON). When config pins `implementation.pre_commit_review: on`, or the
64
+ branch's `progress.md` already carries the `Pre-commit review: on` line (some OK
65
+ landed), surface the mode instead of concluding the task is idle. A discovery
66
+ pause still surfaces cross-machine via its labels and issue comment, though the
67
+ full `discoveries.md` entry stays machine-local. If a **local** copy
45
68
  of the branch is ahead of origin, prefer it (it is the newer state — this is what
46
69
  makes same-machine resume lossless). From a **different** machine, anything committed
47
70
  after the last successful push is unreachable and undetectable (origin is
@@ -51,9 +74,14 @@ checkpoint is a conscious replay, not a silent assumption. An `in-review` one re
51
74
  **merge gate**: surface the open PR's review comments and run the merge-gate procedure
52
75
  (route change-requests back to the Implementer, then offer to post threaded replies —
53
76
  authority is the orchestrator). A `closeout-pending` task has **nothing to check out** —
54
- its task PR already merged and its state is archived under `_archive/<id>/`: re-enter the
55
- `task-closeout` skill at its **finalize** step (step 6) once the open
56
- `harness/closeout-<id>` record PR is merged the skill owns the finalize operations
77
+ its task PR already merged and its state is archived under `_archive/<id>/`: if the open
78
+ `harness/closeout-<id>` record PR is still unmerged, **re-run the self-merge executor on
79
+ it** (`.claude/hooks/lib/merge-pr.sh harness/closeout-<id> --squash --delete-branch`
80
+ the skill's step-5 line verbatim, flags included: a bare invocation is rejected by
81
+ `gh pr merge` non-interactively and would re-park forever. The park may have been a
82
+ transient pending/red that has since settled; a repeat not-green re-parks), then re-enter the
83
+ `task-closeout` skill at its **finalize** step (step 6) once that PR is merged — the
84
+ skill owns the finalize operations
57
85
  (delete the task branch, flip to `done`, emit `task_done`, close the issue). A
58
86
  `pending` stub has **no branch
59
87
  yet** — nothing to check out: read the captured context (the title is the symptom; the
@@ -6,14 +6,15 @@ allowed-tools: Read, Write, Edit, Bash, Task, Skill
6
6
  # /triage
7
7
 
8
8
  Enter **TRIAGE** mode and run the **L2 lightweight round-trip** exactly as specified
9
- in `.claude/agents/orchestrator.md` (§"L2 lightweight round-trip"). This command only
10
- **forces the mode** — the orchestrator file is the single source for the steps.
9
+ in `.claude/agents/triage.md` (the orchestrator's lazy companion). This command only
10
+ **forces the mode** — that file is the single source for the steps.
11
11
 
12
12
  `$ARGUMENTS` is the bug report (the symptom, repro, or error). If empty, ask one
13
13
  question to capture it, then proceed.
14
14
 
15
15
  In brief (authority is the orchestrator): triage the codebase to find the root cause
16
- and draft a TDD-based fix plan (`triage-issue`), creating the issue with
16
+ draft a TDD-based fix plan and declare the risk surfaces (`triage-issue`), creating
17
+ the issue with
17
18
  `harness:managed` (no `harness:sdd` — its absence marks the lightweight path), then
18
19
  branch and scaffold `progress.md`, implement (`tdd`), review (`senior-review`), and
19
20
  run the human merge gate before closeout. L2 skips the spec and its approval gate, but
@@ -92,6 +92,46 @@
92
92
  }
93
93
  },
94
94
  "additionalProperties": false
95
+ },
96
+ "merge": {
97
+ "default": {},
98
+ "type": "object",
99
+ "properties": {
100
+ "checks_timeout_secs": {
101
+ "default": 600,
102
+ "type": "integer",
103
+ "exclusiveMinimum": 0,
104
+ "maximum": 9007199254740991
105
+ },
106
+ "allow_no_checks": {
107
+ "default": false,
108
+ "type": "boolean"
109
+ }
110
+ },
111
+ "additionalProperties": false
112
+ },
113
+ "implementation": {
114
+ "default": {},
115
+ "type": "object",
116
+ "properties": {
117
+ "pre_commit_review": {
118
+ "default": "human",
119
+ "type": "string",
120
+ "enum": [
121
+ "human",
122
+ "on",
123
+ "off"
124
+ ]
125
+ }
126
+ },
127
+ "additionalProperties": false
128
+ },
129
+ "gates": {
130
+ "type": "array",
131
+ "items": {
132
+ "type": "string",
133
+ "minLength": 1
134
+ }
95
135
  }
96
136
  },
97
137
  "required": [