arkgate 4.8.19 → 4.8.21
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/CHANGELOG.md +220 -0
- package/README.md +107 -117
- package/bin/ark-check-runtime.mjs +26 -4
- package/bin/ark-layer-match.mjs +236 -12
- package/bin/ark.mjs +6 -2
- package/bin/lib/analysis-engine.mjs +13 -6
- package/bin/lib/config-contract.mjs +6 -0
- package/bin/lib/diagnostic-catalog.mjs +1 -0
- package/bin/lib/doctor-advisories.mjs +22 -1
- package/bin/lib/doctor-human.mjs +11 -9
- package/bin/lib/doctor-plan.mjs +17 -14
- package/bin/lib/enforcement-honesty.mjs +30 -2
- package/bin/lib/first-run-help.mjs +7 -1
- package/bin/lib/html-report-advisories.mjs +8 -0
- package/bin/lib/html-report-depth.mjs +12 -7
- package/bin/lib/invariant-coverage.mjs +406 -54
- package/bin/lib/managed-upgrade.mjs +59 -14
- package/bin/lib/package-manager.mjs +5 -2
- package/bin/lib/physical-cohesion.mjs +68 -51
- package/bin/lib/pilot-loop.mjs +183 -37
- package/bin/lib/reshape-decisions.mjs +2 -2
- package/bin/lib/rules-under-contract.mjs +40 -4
- package/bin/lib/start-install-recovery.mjs +156 -0
- package/bin/lib/start-preview.mjs +0 -54
- package/bin/lib/upgrade-behavior-changes.mjs +83 -0
- package/bin/lib/upgrade-command.mjs +69 -31
- package/bin/lib/upgrade-outcome.mjs +359 -0
- package/bin/lib/violations.mjs +109 -0
- package/dist/{configTypes-VD0qcubY.d.ts → configTypes-CTELo87-.d.ts} +9 -0
- package/dist/{diagnosticCatalog-D2v0ASN2.d.ts → diagnosticCatalog-B7BXlet6.d.ts} +79 -5
- package/dist/eslint/index.cjs +4 -4
- package/dist/eslint/index.d.ts +35 -4
- package/dist/eslint/index.js +4 -4
- package/dist/index.cjs +25 -18
- package/dist/index.d.ts +13 -4
- package/dist/index.js +27 -20
- package/dist/nestjs/index.cjs +9 -9
- package/dist/nestjs/index.d.ts +3 -3
- package/dist/nestjs/index.js +9 -9
- package/dist/runtime/index.cjs +18 -11
- package/dist/runtime/index.d.ts +6 -6
- package/dist/runtime/index.js +18 -11
- package/dist/{types-D5GT5ZT8.d.ts → types-fQ9-KrBj.d.ts} +1 -1
- package/dist/{types-BSzRy2X1.d.ts → types-yDNEQ603.d.ts} +1 -1
- package/docs/README.md +4 -3
- package/docs/agent-guide.md +15 -7
- package/docs/brownfield-adoption.md +4 -3
- package/docs/configuration.md +46 -8
- package/docs/develop.md +1 -1
- package/docs/diagnostics.md +12 -2
- package/docs/package-surface.md +4 -3
- package/docs/product-voice.md +11 -3
- package/docs/use.md +1 -1
- package/package.json +3 -3
- package/schemas/ark.config.schema.json +14 -0
- package/server.json +2 -2
- package/templates/agent-skills/README.md +1 -1
- package/templates/agent-skills/ark-adopt/SKILL.md +18 -1
- package/templates/agent-skills/ark-architect/SKILL.md +2 -0
- package/templates/agent-skills/ark-autopilot/SKILL.md +6 -2
- package/templates/agent-skills/ark-contract/SKILL.md +2 -0
- package/templates/agent-skills/ark-coverage/SKILL.md +3 -1
- package/templates/agent-skills/ark-explain/SKILL.md +3 -1
- package/templates/agent-skills/ark-explore/SKILL.md +15 -1
- package/templates/agent-skills/ark-fix/SKILL.md +2 -0
- package/templates/agent-skills/ark-loop/SKILL.md +2 -0
- package/templates/agent-skills/ark-order/SKILL.md +2 -0
- package/templates/agent-skills/ark-place/SKILL.md +2 -0
- package/templates/agent-skills/ark-runtime/SKILL.md +2 -0
- package/templates/agent-skills/ark-think/SKILL.md +2 -0
- package/templates/agent-skills/ark-upgrade/SKILL.md +25 -10
- package/templates/skills/ark-adopt.md +18 -1
- package/templates/skills/ark-architect.md +2 -0
- package/templates/skills/ark-autopilot.md +6 -2
- package/templates/skills/ark-contract.md +2 -0
- package/templates/skills/ark-coverage.md +3 -1
- package/templates/skills/ark-explain.md +3 -1
- package/templates/skills/ark-explore.md +15 -1
- package/templates/skills/ark-fix.md +2 -0
- package/templates/skills/ark-loop.md +2 -0
- package/templates/skills/ark-order.md +2 -0
- package/templates/skills/ark-place.md +2 -0
- package/templates/skills/ark-runtime.md +2 -0
- package/templates/skills/ark-think.md +2 -0
- package/templates/skills/ark-upgrade.md +25 -10
package/CHANGELOG.md
CHANGED
|
@@ -96,6 +96,226 @@ in the immutable pre-2.0 archive linked below.
|
|
|
96
96
|
Existing configs keep whatever URL they already have. Editor completion
|
|
97
97
|
matches the 4.x line you just installed.
|
|
98
98
|
|
|
99
|
+
## 4.8.21 — 2026-09-26
|
|
100
|
+
|
|
101
|
+
**Patch** over **4.8.20**. Daily accumulate (2026-09-26 ART) of the ships
|
|
102
|
+
that landed after 4.8.20 published: a bare invariant-id mention is not
|
|
103
|
+
coverage and `coverage.symbol` accepts `type` / `interface` / `enum` again
|
|
104
|
+
([#319](https://github.com/pedroknigge/arkgate/pull/319) /
|
|
105
|
+
[#310](https://github.com/pedroknigge/arkgate/issues/310),
|
|
106
|
+
[#307](https://github.com/pedroknigge/arkgate/issues/307)), one explained
|
|
107
|
+
`arkgate upgrade --apply` outcome with exit `3` for applied but red
|
|
108
|
+
([#320](https://github.com/pedroknigge/arkgate/pull/320) /
|
|
109
|
+
[#311](https://github.com/pedroknigge/arkgate/issues/311),
|
|
110
|
+
[#312](https://github.com/pedroknigge/arkgate/issues/312)), optional
|
|
111
|
+
`sliceIdentity: "stars"`
|
|
112
|
+
([#318](https://github.com/pedroknigge/arkgate/pull/318) /
|
|
113
|
+
[#308](https://github.com/pedroknigge/arkgate/issues/308)), grouped
|
|
114
|
+
`SHARED_IMPORTS_SLICE` human output
|
|
115
|
+
([#316](https://github.com/pedroknigge/arkgate/pull/316) /
|
|
116
|
+
[#313](https://github.com/pedroknigge/arkgate/issues/313)), pilot loop sees
|
|
117
|
+
reshape pilots
|
|
118
|
+
([#317](https://github.com/pedroknigge/arkgate/pull/317) /
|
|
119
|
+
[#309](https://github.com/pedroknigge/arkgate/issues/309)), README
|
|
120
|
+
first-contact rewrite
|
|
121
|
+
([#306](https://github.com/pedroknigge/arkgate/pull/306)), and docs fixes
|
|
122
|
+
([#315](https://github.com/pedroknigge/arkgate/pull/315)).
|
|
123
|
+
**Write. Check. Ship.** **Behavior change:** some repos that are green
|
|
124
|
+
today can turn red, and scripts that compare `arkgate upgrade --apply`
|
|
125
|
+
against exit `1` must compare non-zero. See the two notes under Changed.
|
|
126
|
+
No `schemaVersion` bump. Does not close `K01` / `Z09`. This mother
|
|
127
|
+
`ark.config.json` still does **not** turn `arkOrder` on.
|
|
128
|
+
|
|
129
|
+
**Status: released** (tag `v4.8.21`). This file does not assert registry
|
|
130
|
+
state; run `npm view arkgate@4.8.21 version` to confirm the package is
|
|
131
|
+
available (#314).
|
|
132
|
+
|
|
133
|
+
### Changed
|
|
134
|
+
- **Behavior change.** A comment, a string, a test body, or an import that merely
|
|
135
|
+
mentions an invariant id no longer counts as coverage. Only a `describe` /
|
|
136
|
+
`it` / `test` / `context` title does. Repos that were green because a comment
|
|
137
|
+
or a string contained the id will turn red. One-line fix: move the id into
|
|
138
|
+
the `it()` title.
|
|
139
|
+
([#319](https://github.com/pedroknigge/arkgate/pull/319) /
|
|
140
|
+
[#310](https://github.com/pedroknigge/arkgate/issues/310))
|
|
141
|
+
- **Behavior change for scripts.** `arkgate upgrade --apply` reports one
|
|
142
|
+
outcome. Exit `0` means applied and the architecture check is green (or
|
|
143
|
+
there was nothing to apply). Exit `3` means applied but red, so scripts
|
|
144
|
+
that compare against exit `1` must compare non-zero. Exit `2` means
|
|
145
|
+
blocked until you consent. Exit `1` means error, including a stale `--plan-digest` (that path was exit `2`). A stale CLI
|
|
146
|
+
outside the project still refuses with exit `2` before any plan. JSON stays
|
|
147
|
+
additive: `outcome`, `postUpgrade.verdict`, `postUpgrade.failing`
|
|
148
|
+
(`ruleId`, `count`, `sample`), `postUpgrade.behaviorChanges`, and on each
|
|
149
|
+
blocked asset `reason` plus `nextCommand`. A recorded file that is missing
|
|
150
|
+
and gitignored is `absent-local` and is recreated without consent (a
|
|
151
|
+
per-machine `.mcp.json` in a fresh worktree). A deleted file that is not
|
|
152
|
+
gitignored still needs `--accept-conflicts`. Behavior-change lines come from
|
|
153
|
+
the shipped per-version table (same sentences as these notes):
|
|
154
|
+
- 4.8.20: coverage.symbol now requires a real declaration (some green repos turn red)
|
|
155
|
+
- 4.8.21: a bare mention of an invariant id no longer counts as coverage (only describe/it titles or declarations, incl. type/interface/enum)
|
|
156
|
+
- 4.8.21: upgrade exit code 3 = applied but red. Scripts comparing against 1 must switch to 'non-zero'
|
|
157
|
+
([#320](https://github.com/pedroknigge/arkgate/pull/320) /
|
|
158
|
+
[#311](https://github.com/pedroknigge/arkgate/issues/311),
|
|
159
|
+
[#312](https://github.com/pedroknigge/arkgate/issues/312)).
|
|
160
|
+
- README first screen is the one-minute story: what (**Contener · Guiar · Ordenar**),
|
|
161
|
+
why, `npx arkgate@<version> start`, and one honest red check (fail-open named).
|
|
162
|
+
Host matrix, not-that line, and release index sit below `## Appendix`.
|
|
163
|
+
Release history points at CHANGELOG.md, the site changelog, and the docs hub.
|
|
164
|
+
([#306](https://github.com/pedroknigge/arkgate/pull/306))
|
|
165
|
+
|
|
166
|
+
### Added
|
|
167
|
+
- Optional per-rule `sliceIdentity`: `path` (default) or `stars`.
|
|
168
|
+
Absent and `path` keep today's slice ids byte for byte, so baselines and
|
|
169
|
+
`allowedCrossSlice` need no migration. `stars` names a starred
|
|
170
|
+
`sliceFolders` prefix as the last literal plus the star bindings
|
|
171
|
+
(`lib/features/*/*` and `lib/repositories/features/*/*` both yield
|
|
172
|
+
`features/projects/rfi`). Doctor warns when two prefixes collapse onto one
|
|
173
|
+
id and names both paths. Additive. No `schemaVersion` bump.
|
|
174
|
+
([#318](https://github.com/pedroknigge/arkgate/pull/318) /
|
|
175
|
+
[#308](https://github.com/pedroknigge/arkgate/issues/308)).
|
|
176
|
+
|
|
177
|
+
### Fixed
|
|
178
|
+
- `coverage.symbol` accepts `type`, `interface`, and `enum` declarations
|
|
179
|
+
again (a `function`, `class`, `const`, or method still counts).
|
|
180
|
+
`INVARIANT_UNCOVERED` names what the scan found — for example found `type X`
|
|
181
|
+
in a file, or that the id appears only in a comment or a test body — instead
|
|
182
|
+
of saying no symbol was declared when one was.
|
|
183
|
+
([#319](https://github.com/pedroknigge/arkgate/pull/319) /
|
|
184
|
+
[#307](https://github.com/pedroknigge/arkgate/issues/307)).
|
|
185
|
+
- Human `ark-check` groups `SHARED_IMPORTS_SLICE` advisories into one line per
|
|
186
|
+
rule and layer edge (the count and three examples) instead of one line per
|
|
187
|
+
import. The line names `ark-check --json` and `ark-check --doctor` for the
|
|
188
|
+
full list. `--json` is unchanged: one warning object per edge. Doctor prints
|
|
189
|
+
every edge. No engine change
|
|
190
|
+
([#316](https://github.com/pedroknigge/arkgate/pull/316) /
|
|
191
|
+
[#313](https://github.com/pedroknigge/arkgate/issues/313)).
|
|
192
|
+
- Doctor `pilotLoop` turns on when a pilot is proposed, including a
|
|
193
|
+
physical-cohesion reshape card on a tree that is not design-weak.
|
|
194
|
+
`summarizePilotLoop` takes one candidate list and is active only when
|
|
195
|
+
that list is non-empty. It still names **one** extraction card
|
|
196
|
+
(`nextPilot` / `extractionCard`, same fields). Further candidates stay
|
|
197
|
+
queued. Inactive reason is `no-pilot-candidates` (replaces
|
|
198
|
+
`not-design-weak` and `no-pattern-bets`). Skill completion contracts
|
|
199
|
+
derive **Incomplete?** from `doctor.productHonesty.finished`: when
|
|
200
|
+
`finished` is false, **Incomplete? no** is disallowed and the agent
|
|
201
|
+
writes `yes — <pilotLoop.extractionCard.move or residual>`
|
|
202
|
+
([#317](https://github.com/pedroknigge/arkgate/pull/317) /
|
|
203
|
+
[#309](https://github.com/pedroknigge/arkgate/issues/309)).
|
|
204
|
+
- Docs: the 4.8.20 header states its behavior change instead of "no
|
|
205
|
+
required config migration", and starred anchored `sliceFolders` wording
|
|
206
|
+
matches the code (the slice id includes the literal prefix plus the star
|
|
207
|
+
bindings) in configuration, the agent guide, and the adopt skill
|
|
208
|
+
([#315](https://github.com/pedroknigge/arkgate/pull/315)).
|
|
209
|
+
|
|
210
|
+
## 4.8.20 — 2026-09-25
|
|
211
|
+
|
|
212
|
+
**Patch** over **4.8.19**. Daily accumulate (2026-09-25 ART) of the ships
|
|
213
|
+
that landed after 4.8.19 published: `coverage.symbol` is a non-test
|
|
214
|
+
declaration
|
|
215
|
+
([#301](https://github.com/pedroknigge/arkgate/pull/301) /
|
|
216
|
+
[#291](https://github.com/pedroknigge/arkgate/issues/291)), reshape pilot
|
|
217
|
+
stays in the source layer and slice
|
|
218
|
+
([#299](https://github.com/pedroknigge/arkgate/pull/299) /
|
|
219
|
+
[#295](https://github.com/pedroknigge/arkgate/issues/295)),
|
|
220
|
+
physical-cohesion residual clears finished and elegant
|
|
221
|
+
([#302](https://github.com/pedroknigge/arkgate/pull/302) /
|
|
222
|
+
[#296](https://github.com/pedroknigge/arkgate/issues/296)), anchored
|
|
223
|
+
starred `sliceFolders`
|
|
224
|
+
([#300](https://github.com/pedroknigge/arkgate/pull/300) /
|
|
225
|
+
[#294](https://github.com/pedroknigge/arkgate/issues/294)), shared roots
|
|
226
|
+
cannot import a slice when opted in
|
|
227
|
+
([#303](https://github.com/pedroknigge/arkgate/pull/303) /
|
|
228
|
+
[#297](https://github.com/pedroknigge/arkgate/issues/297)), pnpm Age
|
|
229
|
+
install-fail recovery
|
|
230
|
+
([#293](https://github.com/pedroknigge/arkgate/pull/293) /
|
|
231
|
+
[#292](https://github.com/pedroknigge/arkgate/issues/292)), vitest 4.1.11
|
|
232
|
+
([#298](https://github.com/pedroknigge/arkgate/pull/298)), Dependabot
|
|
233
|
+
vitest 5 ignore
|
|
234
|
+
([#304](https://github.com/pedroknigge/arkgate/pull/304)), and docs
|
|
235
|
+
([#244](https://github.com/pedroknigge/arkgate/pull/244),
|
|
236
|
+
[#234](https://github.com/pedroknigge/arkgate/pull/234)).
|
|
237
|
+
**Write. Check. Ship.** **Behavior change:** some repos that are green
|
|
238
|
+
today can turn red. See the migration note under Changed. No
|
|
239
|
+
`schemaVersion` bump. Does not close `K01` / `Z09`. This mother
|
|
240
|
+
`ark.config.json` still does **not** turn `arkOrder` on.
|
|
241
|
+
|
|
242
|
+
**Status: published** (npm `latest` is **4.8.20**).
|
|
243
|
+
|
|
244
|
+
### Changed
|
|
245
|
+
- **Migration.** This is a behavior change. Some repos that are green today
|
|
246
|
+
will turn red when `coverage.symbol` only appeared in tests or imports.
|
|
247
|
+
Move the invariant id into a `describe`/`it` title, or point
|
|
248
|
+
`coverage.symbol` at a function, class, or const declaration; `type` and
|
|
249
|
+
`interface` symbols are currently rejected
|
|
250
|
+
([#307](https://github.com/pedroknigge/arkgate/issues/307)).
|
|
251
|
+
`symbolEvidenceFile` is the non-test file that declares the symbol.
|
|
252
|
+
Discard counters (`depthLimited`, the per-file byte cap, and the other
|
|
253
|
+
existing reasons) are printed on green doctor and `--rules-inventory`
|
|
254
|
+
output too; the depth and byte caps themselves stay internal
|
|
255
|
+
([#301](https://github.com/pedroknigge/arkgate/pull/301) /
|
|
256
|
+
[#291](https://github.com/pedroknigge/arkgate/issues/291)).
|
|
257
|
+
- `sliceFolders` accepts a starred prefix (`lib/features/*/*`), anchored
|
|
258
|
+
like `sharedRoots`. For a starred anchored pattern the slice id includes
|
|
259
|
+
the literal prefix plus the directories the stars bind
|
|
260
|
+
(`lib/features/projects/rfi`), so parallel trees get different ids
|
|
261
|
+
(tracked in [#308](https://github.com/pedroknigge/arkgate/issues/308)).
|
|
262
|
+
A star never binds a filename; a file
|
|
263
|
+
directly under that prefix stays in the last directory
|
|
264
|
+
(`lib/features/projects`). Bare `sliceFolders` names no longer treat a
|
|
265
|
+
filename as the slice child segment.
|
|
266
|
+
`src/components/features/projects/rfi-status-pill.tsx` with `["projects"]`
|
|
267
|
+
is not a slice. Bare names under `src/lib/features` behave exactly as
|
|
268
|
+
before: `src/lib/features/projects/rfi/x.ts` with `["features"]` stays
|
|
269
|
+
`features/projects` (a regression test covers it)
|
|
270
|
+
([#300](https://github.com/pedroknigge/arkgate/pull/300) /
|
|
271
|
+
[#294](https://github.com/pedroknigge/arkgate/issues/294)).
|
|
272
|
+
|
|
273
|
+
### Fixed
|
|
274
|
+
- Reshape pilot destinations stay in the source file's layer and slice. A
|
|
275
|
+
proposal that would leave both is withheld instead of pointing at
|
|
276
|
+
`src/features/`
|
|
277
|
+
([#299](https://github.com/pedroknigge/arkgate/pull/299) /
|
|
278
|
+
[#295](https://github.com/pedroknigge/arkgate/issues/295)).
|
|
279
|
+
- Doctor no longer calls the tree finished or elegant while a
|
|
280
|
+
physical-cohesion finding is still unsuppressed. The gate verdict is
|
|
281
|
+
unchanged, and the reshape card stays one judgment
|
|
282
|
+
([#302](https://github.com/pedroknigge/arkgate/pull/302) /
|
|
283
|
+
[#296](https://github.com/pedroknigge/arkgate/issues/296)).
|
|
284
|
+
- A `peerIsolation` rule may set `sharedImportsSlice` to `"deny"`. A
|
|
285
|
+
declared shared root then may not import a slice
|
|
286
|
+
(`shared root … → slice …`). The default stays off, so current walls
|
|
287
|
+
stay green. A slice importing a shared root stays allowed.
|
|
288
|
+
`allowedCrossSlice` does not excuse this hop. Doctor lists shared-root
|
|
289
|
+
→ slice bridges even when the flag is off. A green run still says the
|
|
290
|
+
wall is direct-only
|
|
291
|
+
([#303](https://github.com/pedroknigge/arkgate/pull/303) /
|
|
292
|
+
[#297](https://github.com/pedroknigge/arkgate/issues/297)).
|
|
293
|
+
- Age-gated `start --apply` install failure no longer reprints the same
|
|
294
|
+
`pnpm add` as the primary next step. Recovery names pnpm Age, leads
|
|
295
|
+
with `npx --package=arkgate@<pin> arkgate-check --doctor`, and says
|
|
296
|
+
`minimumReleaseAgeExclude` must live in pnpm config or
|
|
297
|
+
`pnpm-workspace.yaml` (a CLI flag is not enough)
|
|
298
|
+
([#293](https://github.com/pedroknigge/arkgate/pull/293) /
|
|
299
|
+
[#292](https://github.com/pedroknigge/arkgate/issues/292)).
|
|
300
|
+
|
|
301
|
+
### Dependencies
|
|
302
|
+
- Dev dependency `vitest` and `@vitest/coverage-v8` are on 4.1.11, which
|
|
303
|
+
pulls `@vitest/mocker@4.1.11` and closes
|
|
304
|
+
[GHSA-82fw-gwwq-j7x9](https://github.com/vitest-dev/vitest/security/advisories/GHSA-82fw-gwwq-j7x9)
|
|
305
|
+
(moderate path traversal via redirect mocks). Vitest 4's V8 coverage
|
|
306
|
+
provider remaps with AST analysis, so the same suite reports a larger
|
|
307
|
+
branch denominator; coverage floors moved to just under those measured
|
|
308
|
+
numbers. No tests were removed
|
|
309
|
+
([#298](https://github.com/pedroknigge/arkgate/pull/298)).
|
|
310
|
+
- Dependabot ignores vitest 5 (`vitest`, `@vitest/coverage-v8`, and
|
|
311
|
+
`@vitest/mocker` at `>= 5.0.0`) until Node 22.12+ is the floor.
|
|
312
|
+
Version-update pull requests stay off; the cooldown is 7 days
|
|
313
|
+
([#304](https://github.com/pedroknigge/arkgate/pull/304)).
|
|
314
|
+
- Docs: anonymized live dogfood sales stats
|
|
315
|
+
([#244](https://github.com/pedroknigge/arkgate/pull/244)); `UC01` marked
|
|
316
|
+
done after [#233](https://github.com/pedroknigge/arkgate/pull/233)
|
|
317
|
+
([#234](https://github.com/pedroknigge/arkgate/pull/234)).
|
|
318
|
+
|
|
99
319
|
## 4.8.19 — 2026-09-20
|
|
100
320
|
|
|
101
321
|
**Patch** over **4.8.18**. Daily accumulate (2026-09-20 ART) of the five
|
package/README.md
CHANGED
|
@@ -4,53 +4,59 @@
|
|
|
4
4
|
|
|
5
5
|
**When the agent writes a bad import, the write doesn’t land. The same check fails the pull request.**
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
[](https://www.arkgate.online/)
|
|
8
|
+
[](https://github.com/pedroknigge/arkgate/actions/workflows/ci.yml)
|
|
9
|
+
[](https://www.npmjs.com/package/arkgate)
|
|
10
|
+
[](LICENSE)
|
|
11
|
+

|
|
12
|
+

|
|
9
13
|
|
|
10
|
-
|
|
14
|
+
</div>
|
|
11
15
|
|
|
12
|
-
|
|
16
|
+
ArkGate is import rules for AI-written TypeScript. **Contener · Guiar · Ordenar**: contain what the AI may write, and in what shape. Guide the next step. Order leftover mess toward a clean tree, a little at a time.
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
<a id="less-spaghetti-after-the-gate-is-green"></a>
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
## Why
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
AI takes the shortest path. One bad import lands, then another, and the product gets harder to change. A linter that runs only after the agent finishes sees the mess too late.
|
|
19
23
|
|
|
20
|
-
|
|
24
|
+
Design the boundary before you implement. Put a small interface in front of the work and keep the detail behind it. When leftover mess remains, the honest light is **needs a refactor**. Weakening the rules to paint the check green leaves that design unfinished.
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
## Try it
|
|
27
|
+
|
|
28
|
+
One command. Preview only — no files change. Current release is **4.8.21**
|
|
29
|
+
(check npm `latest` with `npm view arkgate version`):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx arkgate@4.8.21 start
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## What a red result looks like
|
|
36
|
+
|
|
37
|
+
After a rules file exists, a domain file that imports infrastructure fails the check (exit 1). This is real output from `arkgate-check` on arkgate@4.8.20:
|
|
28
38
|
|
|
29
39
|
```text
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
bad import
|
|
37
|
-
doesn't land
|
|
40
|
+
✖ LAYER_IMPORT_VIOLATION src/domain/order.ts:1
|
|
41
|
+
DomainModel → Infrastructure (src/infra/db.ts)
|
|
42
|
+
DomainModel must not import Infrastructure.
|
|
43
|
+
Next action: Classify the import: if it is constants/types/pure, adopt into DomainModel or SharedKernel; define a port only if the target is a real use-case. Then preflight again.
|
|
44
|
+
|
|
45
|
+
✖ 1 violation(s).
|
|
38
46
|
```
|
|
39
47
|
|
|
40
|
-
|
|
48
|
+
Do that next action. Classify the import, or introduce a port when the dependency is a real use case. Then run the check again.
|
|
41
49
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
> Status is compact (`arkgate-check --doctor`; `--all` for Details). Optional **ArkRun**
|
|
46
|
-
> (`arkgate/runtime`) is an in-memory runtime — not Postgres. Optional **ArkOrder**
|
|
47
|
-
> (`arkgate/order`) stops rewriting a big product choice — like the billing plan —
|
|
48
|
-
> as if it were a seat count. Change those choices through a valve, not a generic update.
|
|
49
|
-
> `@arkgate/runtime` is deprecated.
|
|
50
|
-
> [4.8.19](CHANGELOG.md) · [4.8.11](docs/releases/4.8.11.md) · [4.8.10](docs/releases/4.8.10.md) · [4.8.9](docs/releases/4.8.9.md) · [4.8.8](docs/releases/4.8.8.md) · [4.8.7](docs/releases/4.8.7.md) · [4.8.6](docs/releases/4.8.6.md) · [4.8.5](docs/releases/4.8.5.md) · [4.8.4](docs/releases/4.8.4.md) · [4.8.3](docs/releases/4.8.3.md) · [4.8.2](docs/releases/4.8.2.md) · [4.8.1](docs/releases/4.8.1.md) · [4.8.0](docs/releases/4.8.0.md) · [Docs hub](docs/README.md) · [Voice](docs/product-voice.md)
|
|
50
|
+
That red line is the check. It does not stop every write. On Cursor, a hook without `failClosed: true` is fail-open: if the checker cannot run, the write still lands. Shell writes, hosted tools, and human edits are outside the local hook. The hard line for every path is a **required** GitHub status running `arkgate-check --strict-merge`. Until that status is required, the rules file is just documentation.
|
|
51
|
+
|
|
52
|
+
Anyone: [Use ArkGate](docs/use.md) · Developers: [Develop](docs/develop.md) · This library: [CONTRIBUTING](CONTRIBUTING.md)
|
|
51
53
|
|
|
52
54
|
---
|
|
53
55
|
|
|
56
|
+
## Appendix
|
|
57
|
+
|
|
58
|
+
The minute above is the product. Below is reference: the longer introduction, what this is not, hosts, commands, extras, and where release history lives.
|
|
59
|
+
|
|
54
60
|
## Choose your path
|
|
55
61
|
|
|
56
62
|
| You are… | Go here |
|
|
@@ -61,47 +67,26 @@ Works with Cursor, Claude, Codex, and Grok.
|
|
|
61
67
|
|
|
62
68
|
Full map: **[docs/README.md](docs/README.md)**
|
|
63
69
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
## Start in one minute
|
|
70
|
+
## The longer introduction
|
|
67
71
|
|
|
68
|
-
|
|
69
|
-
npx arkgate start # preview files + commands
|
|
70
|
-
npx arkgate start --apply # compact config + host router + CI plan
|
|
71
|
-
npx --package=arkgate arkgate-check --doctor # status — one next step
|
|
72
|
-
npx --package=arkgate arkgate-check --doctor --all # full details
|
|
73
|
-
```
|
|
72
|
+
AI can build fast—and make a mess just as fast.
|
|
74
73
|
|
|
75
|
-
|
|
74
|
+
Keep the product easy to understand, change, and trust.
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
shape confidence is weak (below 0.6 with coverage under 80%), or when the
|
|
79
|
-
planned write is too big for compact start (more than 8 gate files or 32 KB).
|
|
80
|
-
That lock is deliberate. Coverage/shape: lock with `--archetype <id>`,
|
|
81
|
-
`--preset <name>`, or `--force`. Size: `--force` does not unlock. Next:
|
|
82
|
-
`npx arkgate-check --init`. Or inspect ranked shapes with
|
|
83
|
-
`npx arkgate-check --recommend`.
|
|
76
|
+
Contain what the AI may write, and in what shape. Guide you with proven patterns and one next step. Order leftover mess toward a clean tree, a little at a time.
|
|
84
77
|
|
|
85
|
-
|
|
78
|
+
Safer changes, fewer surprises, and extra protection only when you choose it.
|
|
86
79
|
|
|
87
|
-
|
|
88
|
-
start → doctor → new files in the right folder
|
|
89
|
-
↘ leftover mess: map, then one small refactor
|
|
90
|
-
```
|
|
80
|
+
That is **Contener · Guiar · Ordenar**.
|
|
91
81
|
|
|
92
|
-
|
|
93
|
-
`ark-check --local --base origin/dev` (same as `--changed`; refused with
|
|
94
|
-
`--strict-merge`). Changing the rules themselves uses `--contract-session`.
|
|
82
|
+
## What this is not
|
|
95
83
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
installs at a pinned commit with no `allowBuilds` entry. A git install gives you the CLIs and the
|
|
99
|
-
schemas; the library, MCP and ESLint entry points live in the built `dist/` and come from npm.
|
|
100
|
-
See [docs/package-surface.md](docs/package-surface.md#installing-from-git).
|
|
84
|
+
Not an API Gateway. Not a folder linter. If the check is not required on the PR, the config
|
|
85
|
+
is just documentation.
|
|
101
86
|
|
|
102
|
-
|
|
87
|
+
ArkGate is not a web framework, ORM, or job runner. The npm package is `arkgate` — not affiliated with the separate Archgate CLI project.
|
|
103
88
|
|
|
104
|
-
|
|
89
|
+
ArkRun is an optional experimental runtime. In-memory. Not Postgres. `@arkgate/runtime` is deprecated. ArkOrder does not replace import rules: layers can be green while the agent still rewrites the billing plan like a seat count.
|
|
105
90
|
|
|
106
91
|
## What it is
|
|
107
92
|
|
|
@@ -133,12 +118,20 @@ inter-layer verdict when absent. Label leftovers **`[Layer]`** vs **`[ArkRules]`
|
|
|
133
118
|
**`[ArkRun]`** vs **`[ArkOrder]`**.
|
|
134
119
|
Details: [configuration](docs/configuration.md) · [use](docs/use.md).
|
|
135
120
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
121
|
+
```text
|
|
122
|
+
┌─────────┐ ┌─────────┐ ┌─────────┐
|
|
123
|
+
│ WRITE │────▶│ CHECK │────▶│ SHIP │
|
|
124
|
+
│ agent │ │ block │ │ merge │
|
|
125
|
+
└─────────┘ └────┬────┘ └─────────┘
|
|
126
|
+
│
|
|
127
|
+
▼
|
|
128
|
+
bad import
|
|
129
|
+
doesn't land
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+

|
|
140
133
|
|
|
141
|
-
|
|
134
|
+
Adopted means a required GitHub status running `arkgate-check --strict-merge`, or an explicit `advisory-only` stance. Status is compact (`arkgate-check --doctor`; `--all` for details).
|
|
142
135
|
|
|
143
136
|
### When not to adopt
|
|
144
137
|
|
|
@@ -152,18 +145,6 @@ check: [4.3.0 — What ArkGate is / isn't](docs/releases/4.3.0.md#what-arkgate-i
|
|
|
152
145
|
|
|
153
146
|
---
|
|
154
147
|
|
|
155
|
-
## Why it exists
|
|
156
|
-
|
|
157
|
-
AI takes the shortest path. Contain the write so a bad import never lands. Guide
|
|
158
|
-
the next step so a non-expert is not stuck. Order leftover mess toward a clean
|
|
159
|
-
tree, one small refactor at a time.
|
|
160
|
-
|
|
161
|
-
Traditional linters catch this only in CI after the agent finished. ArkGate
|
|
162
|
-
checks at write time and again on the PR. Green imports are not elegant design —
|
|
163
|
-
leftover mess is **needs a refactor**, not “done”.
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
148
|
## Status lights (not settings)
|
|
168
149
|
|
|
169
150
|
```text
|
|
@@ -183,6 +164,44 @@ Details: [docs/use.md](docs/use.md).
|
|
|
183
164
|
|
|
184
165
|
---
|
|
185
166
|
|
|
167
|
+
## Start in one minute
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
npx arkgate start # preview files + commands
|
|
171
|
+
npx arkgate start --apply # compact config + host router + CI plan
|
|
172
|
+
npx --package=arkgate arkgate-check --doctor # status — one next step
|
|
173
|
+
npx --package=arkgate arkgate-check --doctor --all # full details
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`start --apply` pins arkgate with this repo's package manager (`pnpm add -w` / `yarn add -W` at a workspace root). Do not run `npm install -D arkgate` at a `workspace:*` root — npm rejects that protocol. After a local install, `npx arkgate-check --doctor` also works. `arkgate-check` is a command in the `arkgate` package, not its own npm package. If pnpm Age (`minimumReleaseAge`) blocks a brand-new release, keep using `npx --package=arkgate@<version>` — do not re-run the same add. Put arkgate on `minimumReleaseAgeExclude` in pnpm config or `pnpm-workspace.yaml` (a CLI flag is not enough), or wait until the package is mature.
|
|
177
|
+
|
|
178
|
+
`start --apply` refuses when projected governed coverage is below 50% or
|
|
179
|
+
shape confidence is weak (below 0.6 with coverage under 80%), or when the
|
|
180
|
+
planned write is too big for compact start (more than 8 gate files or 32 KB).
|
|
181
|
+
That lock is deliberate. Coverage/shape: lock with `--archetype <id>`,
|
|
182
|
+
`--preset <name>`, or `--force`. Size: `--force` does not unlock. Next:
|
|
183
|
+
`npx arkgate-check --init`. Or inspect ranked shapes with
|
|
184
|
+
`npx arkgate-check --recommend`.
|
|
185
|
+
|
|
186
|
+
That is the fuller path. Stuck? Run status (`--doctor`) and do action **#1**.
|
|
187
|
+
|
|
188
|
+
```text
|
|
189
|
+
start → doctor → new files in the right folder
|
|
190
|
+
↘ leftover mess: map, then one small refactor
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Keep the rules file out of product PRs. Local check:
|
|
194
|
+
`ark-check --local --base origin/dev` (same as `--changed`; refused with
|
|
195
|
+
`--strict-merge`). Changing the rules themselves uses `--contract-session`.
|
|
196
|
+
|
|
197
|
+
Aliases `ark` / `ark-check` / `ark-mcp` still work. npm / pnpm / yarn. No install lifecycle scripts
|
|
198
|
+
— and none on pack or prepare either, so `pnpm add git+https://github.com/pedroknigge/arkgate`
|
|
199
|
+
installs at a pinned commit with no `allowBuilds` entry. A git install gives you the CLIs and the
|
|
200
|
+
schemas; the library, MCP and ESLint entry points live in the built `dist/` and come from npm.
|
|
201
|
+
See [docs/package-surface.md](docs/package-surface.md#installing-from-git).
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
186
205
|
## Host enforcement support
|
|
187
206
|
|
|
188
207
|
<!-- arkgate-host-support:start -->
|
|
@@ -271,6 +290,10 @@ npx arkgate-check --install-agent-gates --tools claude,cursor,codex,grok,antigra
|
|
|
271
290
|
|
|
272
291
|
More: [docs/develop.md](docs/develop.md) · skills install: [docs/agent-guide.md](docs/agent-guide.md#install-skills-ark-and-ecosystem) · enthusiast track: [docs/enthusiast/](docs/enthusiast/README.md)
|
|
273
292
|
|
|
293
|
+
## Other skills, only when you need them
|
|
294
|
+
|
|
295
|
+
Day-to-day work uses the compact router and status. The full `/ark-*` pack is expert depth: install it when you want a guided next step, not as the first action. Catalog and install paths: [Install skills — Ark and ecosystem](docs/agent-guide.md#install-skills-ark-and-ecosystem).
|
|
296
|
+
|
|
274
297
|
---
|
|
275
298
|
|
|
276
299
|
## Optional ArkRun
|
|
@@ -346,44 +369,11 @@ Compact starters leave the extra off. Details: [ArkOrder](docs/arkorder.md).
|
|
|
346
369
|
| Config · package surface · TS | [configuration](docs/configuration.md) · [package-surface](docs/package-surface.md) · [typescript-support](docs/typescript-support.md) |
|
|
347
370
|
| Brownfield | [docs/brownfield-adoption.md](docs/brownfield-adoption.md) |
|
|
348
371
|
| Security | [SECURITY.md](SECURITY.md) |
|
|
349
|
-
|
|
|
350
|
-
| Prior published (4.8.11) | [docs/releases/4.8.11.md](docs/releases/4.8.11.md) · [CHANGELOG](CHANGELOG.md) |
|
|
351
|
-
| Prior published (4.8.10) | [docs/releases/4.8.10.md](docs/releases/4.8.10.md) · [CHANGELOG](CHANGELOG.md) |
|
|
352
|
-
| Prior published (4.8.9) | [docs/releases/4.8.9.md](docs/releases/4.8.9.md) · [CHANGELOG](CHANGELOG.md) |
|
|
353
|
-
| Prior published (4.8.7) | [docs/releases/4.8.7.md](docs/releases/4.8.7.md) · [CHANGELOG](CHANGELOG.md) |
|
|
354
|
-
| Prior published (4.8.6) | [docs/releases/4.8.6.md](docs/releases/4.8.6.md) |
|
|
355
|
-
| Prior published (4.8.5) | [docs/releases/4.8.5.md](docs/releases/4.8.5.md) |
|
|
356
|
-
| Prior published (4.8.4) | [docs/releases/4.8.4.md](docs/releases/4.8.4.md) |
|
|
357
|
-
| Prior published (4.8.3) | [docs/releases/4.8.3.md](docs/releases/4.8.3.md) |
|
|
358
|
-
| Prior published (4.8.2) | [docs/releases/4.8.2.md](docs/releases/4.8.2.md) |
|
|
359
|
-
| Prior published (4.8.1) | [docs/releases/4.8.1.md](docs/releases/4.8.1.md) |
|
|
360
|
-
| Prior published (4.8.0) | [docs/releases/4.8.0.md](docs/releases/4.8.0.md) |
|
|
361
|
-
| Prior published (4.7.6) | [docs/releases/4.7.6.md](docs/releases/4.7.6.md) |
|
|
362
|
-
| Prior published (4.7.5) | [docs/releases/4.7.5.md](docs/releases/4.7.5.md) |
|
|
363
|
-
| Prior published (4.7.3) | [docs/releases/4.7.3.md](docs/releases/4.7.3.md) |
|
|
364
|
-
| Prior published (4.7.2) | [docs/releases/4.7.2.md](docs/releases/4.7.2.md) |
|
|
365
|
-
| Prior published (4.7.1) | [docs/releases/4.7.1.md](docs/releases/4.7.1.md) |
|
|
366
|
-
| Prior published (4.7.0) | [docs/releases/4.7.0.md](docs/releases/4.7.0.md) |
|
|
367
|
-
| Prior published (4.6.7) | [docs/releases/4.6.7.md](docs/releases/4.6.7.md) |
|
|
368
|
-
| Prior published (4.6.6) | [docs/releases/4.6.6.md](docs/releases/4.6.6.md) |
|
|
369
|
-
| Prior published (4.6.5) | [docs/releases/4.6.5.md](docs/releases/4.6.5.md) |
|
|
370
|
-
| Prior published (4.6.3) | [docs/releases/4.6.3.md](docs/releases/4.6.3.md) |
|
|
371
|
-
| Prior (4.6.2) | [docs/releases/4.6.2.md](docs/releases/4.6.2.md) |
|
|
372
|
-
| Prior (4.6.1) | [docs/releases/4.6.1.md](docs/releases/4.6.1.md) |
|
|
373
|
-
| Prior (4.6.0) | [docs/releases/4.6.0.md](docs/releases/4.6.0.md) |
|
|
374
|
-
| Prior (4.5.7) | [docs/releases/4.5.7.md](docs/releases/4.5.7.md) |
|
|
375
|
-
| Prior (4.5.0) | [docs/releases/4.5.0.md](docs/releases/4.5.0.md) |
|
|
376
|
-
| Prior (4.4.0) | [docs/releases/4.4.0.md](docs/releases/4.4.0.md) |
|
|
377
|
-
| Prior (4.3.0) | [docs/releases/4.3.0.md](docs/releases/4.3.0.md) |
|
|
378
|
-
| Prior (4.2.1) | [docs/releases/4.2.1.md](docs/releases/4.2.1.md) |
|
|
379
|
-
| Previous (4.2.0) | [docs/releases/4.2.0.md](docs/releases/4.2.0.md) |
|
|
380
|
-
| Previous (4.1.1) | [docs/releases/4.1.1.md](docs/releases/4.1.1.md) |
|
|
381
|
-
| Previous (4.1.0) | [docs/releases/4.1.0.md](docs/releases/4.1.0.md) |
|
|
382
|
-
| Previous patch (4.0.1) | [docs/releases/4.0.1.md](docs/releases/4.0.1.md) |
|
|
383
|
-
| Previous (4.0.0) | [docs/releases/4.0.0.md](docs/releases/4.0.0.md) |
|
|
384
|
-
| Previous (3.9.2) | [docs/releases/3.9.2.md](docs/releases/3.9.2.md) |
|
|
372
|
+
| Release history | [CHANGELOG.md](CHANGELOG.md) · [site changelog](https://www.arkgate.online/changelog/) · [docs hub index](docs/README.md#history-and-maintainer-material) |
|
|
385
373
|
| History / maintainer evidence | [docs/archive/](docs/archive/README.md) |
|
|
386
374
|
|
|
375
|
+
Version notes live in [CHANGELOG.md](CHANGELOG.md) and on the [site changelog](https://www.arkgate.online/changelog/). The docs hub keeps the per-version index: [History and maintainer material](docs/README.md#history-and-maintainer-material).
|
|
376
|
+
|
|
387
377
|
---
|
|
388
378
|
|
|
389
379
|
## Contribute to this library
|
|
@@ -74,7 +74,7 @@ import {
|
|
|
74
74
|
writeBaseline,
|
|
75
75
|
printViolation,
|
|
76
76
|
printViolationBreakdown,
|
|
77
|
-
|
|
77
|
+
printHumanWarnings,
|
|
78
78
|
CONCENTRATION_MIN_VIOLATIONS,
|
|
79
79
|
} from './lib/violations.mjs';
|
|
80
80
|
import {
|
|
@@ -1503,6 +1503,7 @@ async function main() {
|
|
|
1503
1503
|
safety, designDelta,
|
|
1504
1504
|
ts, parseHealth, completeness,
|
|
1505
1505
|
all: args.all === true, requireGates: args.requireGates === true,
|
|
1506
|
+
warnings,
|
|
1506
1507
|
});
|
|
1507
1508
|
if (designDelta) process.exitCode = !designDelta.complete ? 2 : designDelta.valid ? 0 : 1; return;
|
|
1508
1509
|
}
|
|
@@ -1673,6 +1674,27 @@ async function main() {
|
|
|
1673
1674
|
inventory.candidates[0] != null
|
|
1674
1675
|
? inventoryToExtractionCard(inventory.candidates[0])
|
|
1675
1676
|
: null;
|
|
1677
|
+
let evidenceLines = [];
|
|
1678
|
+
let coverageEvidence = null;
|
|
1679
|
+
if (config.arkRules && Object.keys(config.arkRules).length > 0) {
|
|
1680
|
+
try {
|
|
1681
|
+
const { summarizeRulesUnderContract, formatArkRulesEvidenceLines } = await import(
|
|
1682
|
+
'./lib/rules-under-contract.mjs'
|
|
1683
|
+
);
|
|
1684
|
+
const section = summarizeRulesUnderContract(root, config, {
|
|
1685
|
+
files: files.map((file) => ({ path: normalize(path.relative(root, file)) })),
|
|
1686
|
+
});
|
|
1687
|
+
evidenceLines = formatArkRulesEvidenceLines(section);
|
|
1688
|
+
if (section.active === true) {
|
|
1689
|
+
coverageEvidence = {
|
|
1690
|
+
symbolEvidence: section.symbolEvidence ?? [],
|
|
1691
|
+
discarded: section.coverageStats?.discarded ?? null,
|
|
1692
|
+
};
|
|
1693
|
+
}
|
|
1694
|
+
} catch {
|
|
1695
|
+
/* inventory still useful when coverage cannot be read */
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1676
1698
|
const payload = {
|
|
1677
1699
|
rulesInventory: inventory,
|
|
1678
1700
|
rulesMigration: {
|
|
@@ -1682,6 +1704,7 @@ async function main() {
|
|
|
1682
1704
|
notAScore: true,
|
|
1683
1705
|
},
|
|
1684
1706
|
nextPilot: nextPilot,
|
|
1707
|
+
...(coverageEvidence ? { coverageEvidence } : {}),
|
|
1685
1708
|
};
|
|
1686
1709
|
if (args.json) {
|
|
1687
1710
|
console.log(JSON.stringify(payload, null, 2));
|
|
@@ -1695,6 +1718,7 @@ async function main() {
|
|
|
1695
1718
|
if (nextPilot) {
|
|
1696
1719
|
console.log(`Next extraction pilot: ${nextPilot.pilot} → ${nextPilot.pilotTarget}`);
|
|
1697
1720
|
}
|
|
1721
|
+
for (const line of evidenceLines) console.log(line);
|
|
1698
1722
|
}
|
|
1699
1723
|
process.exitCode = 0;
|
|
1700
1724
|
return;
|
|
@@ -1933,9 +1957,7 @@ async function main() {
|
|
|
1933
1957
|
...(teamParliament ? { teamParliament } : {}),
|
|
1934
1958
|
}, null, 2));
|
|
1935
1959
|
} else {
|
|
1936
|
-
|
|
1937
|
-
printWarning(warning);
|
|
1938
|
-
}
|
|
1960
|
+
printHumanWarnings(warnings);
|
|
1939
1961
|
for (const violation of activeViolations) {
|
|
1940
1962
|
printViolation(violation);
|
|
1941
1963
|
}
|