agent-quality-kit 0.6.0 → 0.8.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.
- package/README.md +61 -2
- package/README.ru.md +61 -2
- package/kit/docs/ai/agent-harness-playbook.md +1 -1
- package/kit/docs/ready-made-rules.md +29 -4
- package/kit/gates/README.md +40 -0
- package/kit/gates/_skip.sh +61 -1
- package/kit/gates/ci-actually-fails/README.md +12 -0
- package/kit/gates/ci-actually-fails/check.sh +26 -3
- package/kit/gates/ci-actually-fails/green/.github/workflows/ci.yml +16 -0
- package/kit/gates/ci-actually-fails/red/.github/workflows/soft.yml +15 -0
- package/kit/gates/ci-not-hijackable/README.md +56 -0
- package/kit/gates/ci-not-hijackable/check.sh +73 -0
- package/kit/gates/ci-not-hijackable/gate.yml +19 -0
- package/kit/gates/ci-not-hijackable/green/.github/workflows/triage.yml +19 -0
- package/kit/gates/ci-not-hijackable/red/.github/workflows/triage.yml +18 -0
- package/kit/gates/color-from-token/check.sh +19 -3
- package/kit/gates/color-from-token/green/Button.tsx +2 -0
- package/kit/gates/commit-explains-itself/README.md +13 -3
- package/kit/gates/commit-explains-itself/check.sh +8 -4
- package/kit/gates/complexity-limit/README.md +5 -0
- package/kit/gates/complexity-limit/check.sh +27 -9
- package/kit/gates/complexity-limit/green/test_fixtures.py +14 -0
- package/kit/gates/deps-are-pinned/README.md +14 -1
- package/kit/gates/deps-are-pinned/check.sh +6 -1
- package/kit/gates/deps-are-pinned/green/pyproject-with-requirements/pyproject.toml +12 -0
- package/kit/gates/deps-are-pinned/green/pyproject-with-requirements/requirements.txt +3 -0
- package/kit/gates/deps-are-pinned/red/pyproject-loose/pyproject.toml +12 -0
- package/kit/gates/deps-are-pinned/red/pyproject-loose/requirements.txt +3 -0
- package/kit/gates/duplicate-code/README.md +11 -2
- package/kit/gates/duplicate-code/check.sh +36 -5
- package/kit/gates/duplicate-code/gate.yml +8 -0
- package/kit/gates/duplicate-code/green/imports_a.go +20 -0
- package/kit/gates/duplicate-code/green/imports_b.go +19 -0
- package/kit/gates/entry-links-exist/README.md +5 -0
- package/kit/gates/entry-links-exist/check.sh +10 -1
- package/kit/gates/entry-links-exist/green/AGENTS.md +5 -0
- package/kit/gates/file-size-limit/README.md +9 -2
- package/kit/gates/file-size-limit/check.sh +14 -2
- package/kit/gates/gate-not-weakened/check.sh +13 -1
- package/kit/gates/hook-actually-fires/README.md +74 -0
- package/kit/gates/hook-actually-fires/check.sh +183 -0
- package/kit/gates/hook-actually-fires/gate.yml +15 -0
- package/kit/gates/hook-actually-fires/green/.claude/hooks/hooks.json +3 -0
- package/kit/gates/hook-actually-fires/green/.claude/settings.json +74 -0
- package/kit/gates/hook-actually-fires/green/.claude/settings.local.json +74 -0
- package/kit/gates/hook-actually-fires/red/.claude/hooks/hooks.json +4 -0
- package/kit/gates/hook-actually-fires/red/.claude/settings.json +53 -0
- package/kit/gates/no-phantom-package/README.md +84 -0
- package/kit/gates/no-phantom-package/check.sh +161 -0
- package/kit/gates/no-phantom-package/gate.yml +20 -0
- package/kit/gates/no-phantom-package/green/AGENTS.md +15 -0
- package/kit/gates/no-phantom-package/red/AGENTS.md +15 -0
- package/kit/gates/no-print-in-prod/README.md +33 -39
- package/kit/gates/no-print-in-prod/gate.yml +14 -6
- package/kit/gates/personal-config-not-shared/README.md +66 -0
- package/kit/gates/personal-config-not-shared/check.sh +103 -0
- package/kit/gates/personal-config-not-shared/gate.yml +16 -0
- package/kit/gates/personal-config-not-shared/green/.aqk-tracked +9 -0
- package/kit/gates/personal-config-not-shared/red/.aqk-tracked +6 -0
- package/kit/gates/secrets-not-in-code/check.sh +29 -4
- package/kit/gates/secrets-not-in-code/green/testdata/certificate/key.pem +3 -0
- package/kit/gates/swallowed-error/README.md +36 -18
- package/kit/gates/swallowed-error/gate.yml +13 -3
- package/kit/gates/test-has-assertion/check.sh +13 -1
- package/kit/gates/test-not-adjusted/README.md +79 -0
- package/kit/gates/test-not-adjusted/check.sh +136 -0
- package/kit/gates/test-not-adjusted/gate.yml +19 -0
- package/kit/gates/test-not-adjusted/green/after/calc.py +6 -0
- package/kit/gates/test-not-adjusted/green/after/tests/test_calc.py +9 -0
- package/kit/gates/test-not-adjusted/green/before/calc.py +2 -0
- package/kit/gates/test-not-adjusted/green/before/tests/test_calc.py +5 -0
- package/kit/gates/test-not-adjusted/red/after/calc.py +2 -0
- package/kit/gates/test-not-adjusted/red/after/tests/test_calc.py +5 -0
- package/kit/gates/test-not-adjusted/red/before/calc.py +2 -0
- package/kit/gates/test-not-adjusted/red/before/tests/test_calc.py +7 -0
- package/kit/gates/todo-without-task/README.md +6 -0
- package/kit/gates/todo-without-task/check.sh +14 -2
- package/kit/gates/todo-without-task/green/app.py +1 -0
- package/kit/ratchet/ratchet.sh +70 -2
- package/kit/rules/general.md +9 -0
- package/kit/rules-en/general.md +82 -0
- package/kit/rules-en/security.md +33 -0
- package/kit/rules-en/testing.md +48 -0
- package/llms.txt +22 -1
- package/package.json +6 -2
- package/tool/commands/badge.mjs +7 -1
- package/tool/commands/context.mjs +260 -0
- package/tool/commands/doctor.mjs +72 -25
- package/tool/commands/gates.mjs +10 -4
- package/tool/commands/learn.mjs +159 -0
- package/tool/commands/project.mjs +9 -1
- package/tool/commands/prove.mjs +67 -0
- package/tool/commands/report.mjs +37 -2
- package/tool/i18n/en-docs.mjs +154 -0
- package/tool/i18n/en.mjs +70 -90
- package/tool/i18n/ru-docs.mjs +156 -0
- package/tool/i18n/ru.mjs +69 -90
- package/tool/i18n/templates-en.mjs +1 -1
- package/tool/i18n/templates-ru.mjs +1 -1
- package/tool/lib/core.mjs +37 -2
- package/tool/lib/evidence.mjs +124 -0
- package/tool/lib/manifest.mjs +63 -5
- package/tool/lib/prove.mjs +172 -0
- package/tool/lib/repo.mjs +31 -2
- package/tool/lib/scope.mjs +46 -2
- package/tool/lib/templates.mjs +3 -0
- package/tool/program.mjs +23 -22
- package/tool/selfcheck/gates.sh +66 -0
- package/tool/selfcheck/mutation.sh +21 -1
- package/tool/selfcheck/smoke.sh +519 -39
- package/tool/selfcheck/units-context.mjs +186 -0
- package/tool/selfcheck/units-evidence.mjs +83 -0
- package/tool/selfcheck/units-learn.mjs +88 -0
- package/tool/selfcheck/units-level.mjs +122 -0
- package/tool/selfcheck/units.mjs +114 -2
- package/kit/gates/no-print-in-prod/check.sh +0 -38
- package/kit/gates/no-print-in-prod/green/docs.ts +0 -15
- package/kit/gates/no-print-in-prod/green/main.go +0 -8
- package/kit/gates/no-print-in-prod/green/main.rs +0 -4
- package/kit/gates/no-print-in-prod/red/main.go +0 -8
- package/kit/gates/no-print-in-prod/red/main.rs +0 -4
- package/kit/gates/swallowed-error/check.sh +0 -54
- package/kit/gates/swallowed-error/green/run.js +0 -8
- package/kit/gates/swallowed-error/red/run.js +0 -3
- /package/kit/gates/commit-explains-itself/green/{COMMIT_MSG → .aqk-commit-msg} +0 -0
- /package/kit/gates/commit-explains-itself/red/{COMMIT_MSG → .aqk-commit-msg} +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// tool/i18n/en-docs.mjs — text that ends up IN A FILE, not in the terminal.
|
|
2
|
+
//
|
|
3
|
+
// WHY SEPARATE. The string catalogue outgrew its own 500-line limit — caught by our own
|
|
4
|
+
// file-size-limit gate. The seam follows meaning rather than the midpoint: here is what the
|
|
5
|
+
// program WRITES (comments in .aqk.yml, level names, the report form), and in en.mjs what it
|
|
6
|
+
// SAYS. These texts live differently: the first is read months later in someone's repository,
|
|
7
|
+
// the second for one second in a terminal.
|
|
8
|
+
|
|
9
|
+
const enDocs = {
|
|
10
|
+
// THE STATE BLOCK — the one text of ours whose reader is a machine, not a person.
|
|
11
|
+
// It goes into the agent's context via a SessionStart hook, so it is written as claims of
|
|
12
|
+
// fact: no politeness, no preamble, every line either a fact or an honest "unknown".
|
|
13
|
+
context: {
|
|
14
|
+
title: "AQK — the state of this repository right now. Only what a machine computed; where it\ndoes not know, it says \"unknown\" — which is not the same as \"fine\".",
|
|
15
|
+
level: (r, top, missing) =>
|
|
16
|
+
`Level: AQK-${r} of ${top}.` + (missing ? ` AQK-${r + 1} is missing: ${missing}.` : ""),
|
|
17
|
+
levelUnknown: "Level: not computed — there is no .aqk.yml here. The standard is not set up.",
|
|
18
|
+
rules: (total, machine, human) =>
|
|
19
|
+
`Rules in the entry point: ${total}. Held by a machine ${machine}, by a human ${human}.`,
|
|
20
|
+
rulesNobody: "A rule held by a human is held by nobody: no machine checks it.",
|
|
21
|
+
runNone:
|
|
22
|
+
"No run has been made — which checks are red is UNKNOWN. This is not \"clean\": `aqk doctor --run`.",
|
|
23
|
+
runStale: (when) =>
|
|
24
|
+
`The last run ${when} is OLDER than the last commit — it describes different code.`,
|
|
25
|
+
runClean: (when) => `Last run ${when} — nothing red.`,
|
|
26
|
+
runRed: (when, names) => `Last run ${when} — RED: ${names}.`,
|
|
27
|
+
andMore: (n) => `and ${n} more`,
|
|
28
|
+
skipped: (n) => `Not run: ${n} — the tool is absent on this machine, their state is unknown.`,
|
|
29
|
+
ratchets: (list) => `Ratchets: ${list}. The list may only get shorter, never longer.`,
|
|
30
|
+
where: (entry) => `The rulebook: ${entry}. What proves a diff: \`aqk report --since main\`.`,
|
|
31
|
+
mapTitle: "WHAT THIS TOOL CAN DO. The full list of commands — not a retelling, the same list\nthe help is built from:",
|
|
32
|
+
rulesTitle: (e) => `THE RULEBOOK OF THIS PROJECT (${e}) — verbatim, in full. This is not an invitation\nto read it: it is already here.`,
|
|
33
|
+
hookAlready: (p) => `the hook is already in ${p} — changing nothing.`,
|
|
34
|
+
hookAdded: (p) => `SessionStart hook appended to ${p}:`,
|
|
35
|
+
hookCreated: (p) => `created ${p} with a SessionStart hook:`,
|
|
36
|
+
hookBadJson: (p) => `${p} does not parse as JSON — leaving it alone. Fix it and retry.`,
|
|
37
|
+
hookWhat:
|
|
38
|
+
"the project state now reaches the agent's context before its first action, not at its discretion.",
|
|
39
|
+
},
|
|
40
|
+
// Форма отчёта переехала сюда из терминального каталога 2026-09-08: это текст, который
|
|
41
|
+
// программа ПИШЕТ в .aqk/report.md, а не говорит в терминал. Повод — тот же гейт
|
|
42
|
+
// file-size-limit, что развёл эти файлы в первый раз: терминальный каталог снова перерос
|
|
43
|
+
// 500 строк. Шов по смыслу, а не пополам.
|
|
44
|
+
report2: {
|
|
45
|
+
evidenceNamed: (who) => `named by: ${who}`,
|
|
46
|
+
evidenceSilent: (n) => `${n} check${n === 1 ? "" : "s"} walked past it and said nothing`,
|
|
47
|
+
evidenceTitle: "What proves this diff",
|
|
48
|
+
evidenceUncovered: "no check named this file",
|
|
49
|
+
evidenceBase: "base of comparison",
|
|
50
|
+
evidenceHash: "evidence fingerprint",
|
|
51
|
+
evidenceBadRef: (r) => `ref "${r}" could not be resolved — coverage not computed`,
|
|
52
|
+
evidenceNoFiles: (r) => `no code files in the diff against "${r}" — nothing to prove`,
|
|
53
|
+
evidenceWarn:
|
|
54
|
+
"◻️ means a check walked the directory and said nothing. \"Scanned and clean\" and " +
|
|
55
|
+
"\"never looked\" are indistinguishable from the output, and neither may be passed off " +
|
|
56
|
+
"as the other. " +
|
|
57
|
+
"The fingerprint covers the base, the set of commands and the contents of the files. " +
|
|
58
|
+
"Change any of them and this report is stale, so \"ran it, then edited three more files\" " +
|
|
59
|
+
"stops being indistinguishable from \"ran it\". Mechanism taken from donecheck (MIT).",
|
|
60
|
+
title: "AQK report",
|
|
61
|
+
noManifest: (cmd) => `No .aqk.yml — nothing to report on. Start with ${cmd}`,
|
|
62
|
+
level: "Level",
|
|
63
|
+
holdsTitle: "What a machine holds (from a run, not from the manifest)",
|
|
64
|
+
nothingRuns: "⬜ no gate is declared",
|
|
65
|
+
native: (prog) => `native recipe: ${prog}`,
|
|
66
|
+
portable: "portable check",
|
|
67
|
+
weakerTitle: "Weaker than it could be",
|
|
68
|
+
weaker: (progs) => `${progs} is available on this system, but the gate uses the portable check — it catches less`,
|
|
69
|
+
missingTitle: "What is missing",
|
|
70
|
+
nothingMissing: "✅ every applicable entry is installed",
|
|
71
|
+
needsTool: (prog) => `needs ${prog} — not on this system`,
|
|
72
|
+
notInstalled: "applicable, but not installed",
|
|
73
|
+
hiddenTitle: "Not applicable to this repository",
|
|
74
|
+
readTitle: "What the kit told you to read",
|
|
75
|
+
readWarn:
|
|
76
|
+
"The mark only means the file is on disk. Whether it was read, the machine does not know " +
|
|
77
|
+
"and does not pretend to: that is answered by whoever is reporting.",
|
|
78
|
+
ignoreTitle: "What .aqkignore hides",
|
|
79
|
+
ignoreNone: "no .aqkignore file — nothing is hidden",
|
|
80
|
+
ignoreWarn:
|
|
81
|
+
"Hiding things silently is the same class as a silent gate: the gates do not look at these " +
|
|
82
|
+
"paths at all. A line here means there is no protection there, and will not be.",
|
|
83
|
+
whyTitle: "Why this matters — briefly",
|
|
84
|
+
whyNothing: "nothing to add: everything applicable is in place",
|
|
85
|
+
saved: (path) => `Saved: ${path}`,
|
|
86
|
+
docs: {
|
|
87
|
+
baseline: "the minimum a project needs, independent of language",
|
|
88
|
+
readyMade: "the map of off-the-shelf rules: look for a ready one before writing your own",
|
|
89
|
+
rulesGeneral: "general working rules",
|
|
90
|
+
rulesTesting: "rules about tests",
|
|
91
|
+
rulesSecurity: "rules about security",
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
manifestDoc: {
|
|
95
|
+
head: [
|
|
96
|
+
"# .aqk.yml — the Agent Quality Kit manifest",
|
|
97
|
+
"# What this is: a machine-readable description of how agents live in this repository.",
|
|
98
|
+
"# `aqk doctor` computes the compliance level. An empty field = the level is not reached,",
|
|
99
|
+
"# and that is honest: filling it with placeholders is pointless, files are checked, not words.",
|
|
100
|
+
],
|
|
101
|
+
entry: "# AQK-0 — what the agent reads first.",
|
|
102
|
+
rules: "# AQK-1 — where the standards are and which checks are mandatory. docs — where the\n# guides are: doctor reads both, so the kit may live anywhere you like.",
|
|
103
|
+
gates: [
|
|
104
|
+
" # name: a command returning 0 or non-zero. An empty declaration protects nothing and is",
|
|
105
|
+
' # rejected by the "a declared gate runs" check — hence examples here, not placeholders.',
|
|
106
|
+
' # lint: "ruff check ."',
|
|
107
|
+
' # test: "pytest -q"',
|
|
108
|
+
" # To install a ready entry from the catalogue together with its samples: aqk add <name>",
|
|
109
|
+
],
|
|
110
|
+
samples: [
|
|
111
|
+
"# AQK-2 — what proves the gates work, and where the debt registries are.",
|
|
112
|
+
"# samples: the directory with red and green samples (a gate must go red on the first and",
|
|
113
|
+
"# stay quiet on the second). ratchets: lists of known violations that may only get",
|
|
114
|
+
"# shorter.",
|
|
115
|
+
],
|
|
116
|
+
lessons: "# AQK-3 — where lessons accumulate. A path or an address.",
|
|
117
|
+
advisory: [
|
|
118
|
+
"# Advisory gates: they show findings but do not fail the run. The third way to introduce",
|
|
119
|
+
"# a rule, next to the ratchet and the big clean-up. The list is named on every run:",
|
|
120
|
+
"# an advisory gate everyone forgot about is a switched-off check.",
|
|
121
|
+
"# advisory:",
|
|
122
|
+
"# - complexity-limit",
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
levels: [
|
|
126
|
+
{
|
|
127
|
+
title: "a manifest and an entry point",
|
|
128
|
+
need: "create .aqk.yml and point entry at the file an agent reads first (AGENTS.md)",
|
|
129
|
+
gives: "any tool understands what to read in this repository",
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
title: "rules and working gates",
|
|
133
|
+
need: "set rules (the standards directory) and fill at least one gate in gates with a real command",
|
|
134
|
+
gives: "checks are declared as commands, not described in prose",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
title: "gates are proven, debt is under a ratchet",
|
|
138
|
+
need: "set samples (red and green gate samples) and ratchets (debt registries)",
|
|
139
|
+
gives: "the gate has proven it catches defects and stays quiet on correct code",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
title: "lessons come back into the work",
|
|
143
|
+
need: "set lessons — the path or address of a journal where every incident yields a conclusion",
|
|
144
|
+
gives: "the project learns: the same bruise is not collected twice",
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
report: {
|
|
148
|
+
title: "aqk doctor --run",
|
|
149
|
+
version: "version",
|
|
150
|
+
level: "level",
|
|
151
|
+
summary: (ok, all) => `total: ${ok} of ${all} green`,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
export { enDocs };
|
package/tool/i18n/en.mjs
CHANGED
|
@@ -3,9 +3,24 @@
|
|
|
3
3
|
// Правка здесь обязана иметь пару в ru.mjs с тем же ключом: расхождение ловит модульная
|
|
4
4
|
// проверка «оба каталога несут одни и те же ключи».
|
|
5
5
|
|
|
6
|
+
import { enDocs } from "./en-docs.mjs";
|
|
7
|
+
|
|
6
8
|
import { templates } from "./templates-en.mjs";
|
|
7
9
|
|
|
8
10
|
export const en = {
|
|
11
|
+
learn: {
|
|
12
|
+
title: "Said out loud, never written down",
|
|
13
|
+
noLogs: (p) => `no logs for this project: ${p}\n The command reads Claude Code transcripts on this machine. Empty means nobody worked here.`,
|
|
14
|
+
counted: (s, typed, said, fresh) =>
|
|
15
|
+
`sessions: ${s} · typed by a human: ${typed} · looks like an instruction: ${said} · not in the entry point: ${fresh}`,
|
|
16
|
+
nothing: "everything that looks like a rule is already in the entry point",
|
|
17
|
+
andMore: (n) => `… and ${n} more`,
|
|
18
|
+
warn:
|
|
19
|
+
"These are CANDIDATES, not findings: measured on 1619 messages, the markers returned 79, and " +
|
|
20
|
+
"about half of those are real rules. The human decides. Nothing was written to disk — the " +
|
|
21
|
+
"command reads transcripts and prints to the terminal only.",
|
|
22
|
+
},
|
|
23
|
+
...enDocs,
|
|
9
24
|
templates,
|
|
10
25
|
help: {
|
|
11
26
|
tagline: "tooling for building software with agents",
|
|
@@ -13,6 +28,7 @@ export const en = {
|
|
|
13
28
|
init: "lay the rules and guides into the current project",
|
|
14
29
|
initForce: "overwrite files that already exist",
|
|
15
30
|
start: "no code yet: day-zero guards and the order of work",
|
|
31
|
+
prove: "prove the gates catch a defect: each against its own red and green sample",
|
|
16
32
|
doctor: "check what is laid out and what is missing",
|
|
17
33
|
doctorRun: "and also run the declared gates",
|
|
18
34
|
doctorSince: "the same, but show only what the diff against a ref introduced",
|
|
@@ -23,13 +39,20 @@ export const en = {
|
|
|
23
39
|
new: "scaffold your own gate for the catalogue",
|
|
24
40
|
note: "record a lesson in the shared bruise journal",
|
|
25
41
|
blob: "assemble the guides into a single GOD_AI.md",
|
|
26
|
-
|
|
42
|
+
learn: "rule candidates from local transcripts: said out loud, never written down",
|
|
43
|
+
context: "the project state in one block — for an agent's context, not for reading",
|
|
44
|
+
contextInstall: "the same in full — the map and the rulebook — installed as a hook",
|
|
45
|
+
report: "the mandatory report form: what is in place, what is not, what was not read; --since <ref> adds what proves the diff",
|
|
27
46
|
badge: "a level badge for your README — and a check that it does not lie",
|
|
28
47
|
noInstall: "Without installing: npx agent-quality-kit init",
|
|
29
48
|
language: "Output language: AQK_LANG=ru (or en), otherwise your system locale",
|
|
30
49
|
},
|
|
31
50
|
|
|
32
51
|
doctor: {
|
|
52
|
+
baselineClash: (f) =>
|
|
53
|
+
`"--baseline" is an inspection, not a run: it always exits 0, so together with "${f}" it\n` +
|
|
54
|
+
" gives you a pipeline that cannot go red.\n" +
|
|
55
|
+
" fix: split it in two — \"doctor --baseline\" and \"doctor --run --min 1\".",
|
|
33
56
|
docsKit: "guides — the originals live here, not a copy",
|
|
34
57
|
docs: "guides",
|
|
35
58
|
rulesKit: "standards — the originals live here, not a copy",
|
|
@@ -41,6 +64,8 @@ export const en = {
|
|
|
41
64
|
emptyCommands: (n) => `AGENTS.md has ${n} unfilled commands.`,
|
|
42
65
|
emptyCommandsWhy: "An agent cannot execute an empty line.",
|
|
43
66
|
|
|
67
|
+
levelUnproven: (cmd) => `not proven: ${cmd}`,
|
|
68
|
+
gatesDoNotCatch: (n, cmd) => `gates that do not catch a defect: ${n}. Details: ${cmd}`,
|
|
44
69
|
levelHeading: "AQK compliance level",
|
|
45
70
|
levelNone: "none",
|
|
46
71
|
levelNotSet: "Level: the standard is not set up in this repository.",
|
|
@@ -71,6 +96,10 @@ export const en = {
|
|
|
71
96
|
sinceBadRef: (ref) => `cannot compare against "${ref}": no such ref, or this is not a git repository`,
|
|
72
97
|
notScopable: "output carries no paths — cannot be narrowed by diff, left red",
|
|
73
98
|
outsideDiff: (n) => `findings exist, but outside the diff (${n})`,
|
|
99
|
+
advisoryMark: "advisory — shown, the run was not failed",
|
|
100
|
+
advisorySummary: (names) =>
|
|
101
|
+
`advisory and red: ${names.join(", ")}. These are switched-off checks: ` +
|
|
102
|
+
`either fix them and drop them from advisory, or admit the rule does not exist.`,
|
|
74
103
|
runHeading: "Running the declared gates",
|
|
75
104
|
timeout: "did not finish within 5 minutes",
|
|
76
105
|
exitCode: (code) => `exit ${code}`,
|
|
@@ -132,6 +161,8 @@ export const en = {
|
|
|
132
161
|
has_deps: ["no dependency file in sight", "dependencies are declared"],
|
|
133
162
|
has_tests: ["no tests in sight", "tests exist"],
|
|
134
163
|
has_env: ["no environment file", "an environment file exists"],
|
|
164
|
+
has_agent_config: ["the agent was never configured here", "agent settings exist"],
|
|
165
|
+
has_agent_entry: ["no entry point for an agent here", "an entry point for an agent exists"],
|
|
135
166
|
has_ui: ["no stylesheets or UI components in sight", "a UI exists: stylesheets or components"],
|
|
136
167
|
},
|
|
137
168
|
},
|
|
@@ -160,7 +191,13 @@ export const en = {
|
|
|
160
191
|
|
|
161
192
|
add: {
|
|
162
193
|
noSuchGate: (slug, cmd) => `No such gate: ${slug}\nThe applicable ones — ${cmd}`,
|
|
163
|
-
|
|
194
|
+
toolMissing: (slug, missing) =>
|
|
195
|
+
`Entry ${slug} needs ${missing.join(" and ")}, which is not on this machine.\n fix: install ${missing.join(" and ")} and try again — this entry delegates to a ready-made tool by design and has no check of its own.`,
|
|
196
|
+
noRecipe: (slug, stack, missing) =>
|
|
197
|
+
`Entry ${slug} has no command for ${stack} and no portable one.` +
|
|
198
|
+
(Array.isArray(missing) && missing.length
|
|
199
|
+
? `\n fix: install ${missing.join(" or ")} and try again — this entry delegates to a ready-made tool by design and has no check of its own.`
|
|
200
|
+
: `\n fix: add a recipe for your stack to this entry's gate.yml, or pick another entry.`),
|
|
164
201
|
thisStack: "this stack",
|
|
165
202
|
needName: (cmd, doctor) => `Name the gate: ${cmd}. The list — ${doctor}`,
|
|
166
203
|
noManifest: (cmd) => `No .aqk.yml — run ${cmd} first`,
|
|
@@ -213,7 +250,14 @@ export const en = {
|
|
|
213
250
|
registryHead: (slug, stamp) =>
|
|
214
251
|
`# Debt registry: ${slug}\n` +
|
|
215
252
|
`# Captured ${stamp}. This list may ONLY get shorter.\n` +
|
|
216
|
-
`# A new violation turns the gate red; a fixed one is struck out automatically.\n
|
|
253
|
+
`# A new violation turns the gate red; a fixed one is struck out automatically.\n` +
|
|
254
|
+
`#\n` +
|
|
255
|
+
`# Debt with no goal and no deadline never ends. The goal is how many violations count as\n` +
|
|
256
|
+
`# paid off; on reaching it the ratchet tells you to remove the wrapper. The deadline is\n` +
|
|
257
|
+
`# optional, but if set, debt still open past that date turns the gate red — a deadline\n` +
|
|
258
|
+
`# without a consequence is not a deadline.\n` +
|
|
259
|
+
`# aqk-goal: 0\n` +
|
|
260
|
+
`# aqk-deadline:\n`,
|
|
217
261
|
recorded: (n) => `${n} violations recorded as debt`,
|
|
218
262
|
libCopied: "wrapper copied into the project",
|
|
219
263
|
wrapped: "command wrapped in the ratchet",
|
|
@@ -295,6 +339,8 @@ export const en = {
|
|
|
295
339
|
|
|
296
340
|
init: {
|
|
297
341
|
noDocs: (dir) => `Guides not found: ${dir}\nLooks like the package is not fully installed.`,
|
|
342
|
+
docsRu:
|
|
343
|
+
"the guides in .aqk/docs/ are in Russian — a deliberate decision, not a broken install.\n The rules in .aqk/rules/ are in English; the guides are prose an agent may ignore anyway,\n and what a machine holds lives in .aqk.yml and the gates. Translation waits for someone who needs it.",
|
|
298
344
|
created: (n) => `created (${n}):`,
|
|
299
345
|
andMore: (n) => `… and ${n} more`,
|
|
300
346
|
kept: (n) => `already there, left untouched (${n}):`,
|
|
@@ -314,6 +360,7 @@ export const en = {
|
|
|
314
360
|
n4c: ". A gate guards an artefact that exists:",
|
|
315
361
|
n4d: "a check for code that is not written yet is a dead rule.",
|
|
316
362
|
burned: (cmd) => `Got burned by something — write it down: ${cmd}`,
|
|
363
|
+
hookHint: (cmd) => `Claude Code: ${cmd} — the project state will reach the agent's context\n by itself, before its first action. Other agents have no hook, and that is not an omission.`,
|
|
317
364
|
},
|
|
318
365
|
|
|
319
366
|
feedback: {
|
|
@@ -386,31 +433,27 @@ export const en = {
|
|
|
386
433
|
nextWhy: "— run everything that is declared",
|
|
387
434
|
},
|
|
388
435
|
|
|
389
|
-
manifestDoc: {
|
|
390
|
-
head: [
|
|
391
|
-
"# .aqk.yml — the Agent Quality Kit manifest",
|
|
392
|
-
"# What this is: a machine-readable description of how agents live in this repository.",
|
|
393
|
-
"# `aqk doctor` computes the compliance level. An empty field = the level is not reached,",
|
|
394
|
-
"# and that is honest: filling it with placeholders is pointless, files are checked, not words.",
|
|
395
|
-
],
|
|
396
|
-
entry: "# AQK-0 — what the agent reads first.",
|
|
397
|
-
rules: "# AQK-1 — where the standards are and which checks are mandatory.",
|
|
398
|
-
gates: [
|
|
399
|
-
" # name: a command returning 0 or non-zero. An empty declaration protects nothing and is",
|
|
400
|
-
' # rejected by the "a declared gate runs" check — hence examples here, not placeholders.',
|
|
401
|
-
' # lint: "ruff check ."',
|
|
402
|
-
' # test: "pytest -q"',
|
|
403
|
-
" # To install a ready entry from the catalogue together with its samples: aqk add <name>",
|
|
404
|
-
],
|
|
405
|
-
samples: [
|
|
406
|
-
"# AQK-2 — what proves the gates work, and where the debt registries are.",
|
|
407
|
-
"# samples: the directory with red and green samples (a gate must go red on the first and",
|
|
408
|
-
"# stay quiet on the second). ratchets: lists of known violations that may only get",
|
|
409
|
-
"# shorter.",
|
|
410
|
-
],
|
|
411
|
-
lessons: "# AQK-3 — where lessons accumulate. A path or an address.",
|
|
412
|
-
},
|
|
413
436
|
|
|
437
|
+
prove: {
|
|
438
|
+
title: "aqk prove — proving the gates",
|
|
439
|
+
running: "proving the gates against their samples…",
|
|
440
|
+
proven: (n) => `proven: ${n}`,
|
|
441
|
+
broken: (n) => `do not catch: ${n}`,
|
|
442
|
+
unprovable: (n) => `nothing to prove with: ${n}`,
|
|
443
|
+
okRed: "red on the red sample, silent on the green one",
|
|
444
|
+
redPassed: "stayed silent on the RED sample — the gate does not catch the defect",
|
|
445
|
+
greenFailed: "went red on the GREEN sample — the gate complains about working code",
|
|
446
|
+
empty: "the command is empty — a declaration without a command protects nothing",
|
|
447
|
+
noSamples: "no samples — nothing to prove with",
|
|
448
|
+
noTarget: "no place to substitute the sample directory — the command was written by hand",
|
|
449
|
+
otherRecipe: (lang) => `the samples are written for the "${lang}" recipe, another one is installed — nothing to prove with`,
|
|
450
|
+
noGates: "no gates declared — nothing to prove",
|
|
451
|
+
noSamplesDir: "the samples field in .aqk.yml is empty — nowhere to look for samples",
|
|
452
|
+
nothingProven:
|
|
453
|
+
"not a single gate is proven. A level above AQK-1 would mean trust in the author, not a fact:\n a project whose gate is `true` would pass it exactly like a project with real protection.",
|
|
454
|
+
fix: (cmd) => `fix: install a catalogue entry together with its samples — ${cmd}`,
|
|
455
|
+
heading: "Proving the gates",
|
|
456
|
+
},
|
|
414
457
|
badge: {
|
|
415
458
|
noManifest: (cmd) => `No .aqk.yml — there is no level yet. Start with ${cmd}`,
|
|
416
459
|
notReached: (cmd) => `AQK-0 is not reached — there is nothing to put on a badge. What is missing: ${cmd}`,
|
|
@@ -423,69 +466,6 @@ export const en = {
|
|
|
423
466
|
checkOk: (level, where) => `Badge matches the run: AQK-${level} — ${where}`,
|
|
424
467
|
},
|
|
425
468
|
|
|
426
|
-
report2: {
|
|
427
|
-
title: "AQK report",
|
|
428
|
-
noManifest: (cmd) => `No .aqk.yml — nothing to report on. Start with ${cmd}`,
|
|
429
|
-
level: "Level",
|
|
430
|
-
holdsTitle: "What a machine holds (from a run, not from the manifest)",
|
|
431
|
-
nothingRuns: "⬜ no gate is declared",
|
|
432
|
-
native: (prog) => `native recipe: ${prog}`,
|
|
433
|
-
portable: "portable check",
|
|
434
|
-
weakerTitle: "Weaker than it could be",
|
|
435
|
-
weaker: (progs) => `${progs} is available on this system, but the gate uses the portable check — it catches less`,
|
|
436
|
-
missingTitle: "What is missing",
|
|
437
|
-
nothingMissing: "✅ every applicable entry is installed",
|
|
438
|
-
needsTool: (prog) => `needs ${prog} — not on this system`,
|
|
439
|
-
notInstalled: "applicable, but not installed",
|
|
440
|
-
hiddenTitle: "Not applicable to this repository",
|
|
441
|
-
readTitle: "What the kit told you to read",
|
|
442
|
-
readWarn:
|
|
443
|
-
"The mark only means the file is on disk. Whether it was read, the machine does not know " +
|
|
444
|
-
"and does not pretend to: that is answered by whoever is reporting.",
|
|
445
|
-
ignoreTitle: "What .aqkignore hides",
|
|
446
|
-
ignoreNone: "no .aqkignore file — nothing is hidden",
|
|
447
|
-
ignoreWarn:
|
|
448
|
-
"Hiding things silently is the same class as a silent gate: the gates do not look at these " +
|
|
449
|
-
"paths at all. A line here means there is no protection there, and will not be.",
|
|
450
|
-
whyTitle: "Why this matters — briefly",
|
|
451
|
-
whyNothing: "nothing to add: everything applicable is in place",
|
|
452
|
-
saved: (path) => `Saved: ${path}`,
|
|
453
|
-
docs: {
|
|
454
|
-
baseline: "the minimum a project needs, independent of language",
|
|
455
|
-
readyMade: "the map of off-the-shelf rules: look for a ready one before writing your own",
|
|
456
|
-
rulesGeneral: "general working rules",
|
|
457
|
-
rulesTesting: "rules about tests",
|
|
458
|
-
rulesSecurity: "rules about security",
|
|
459
|
-
},
|
|
460
|
-
},
|
|
461
469
|
|
|
462
|
-
levels: [
|
|
463
|
-
{
|
|
464
|
-
title: "a manifest and an entry point",
|
|
465
|
-
need: "create .aqk.yml and point entry at the file an agent reads first (AGENTS.md)",
|
|
466
|
-
gives: "any tool understands what to read in this repository",
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
title: "rules and working gates",
|
|
470
|
-
need: "set rules (the standards directory) and fill at least one gate in gates with a real command",
|
|
471
|
-
gives: "checks are declared as commands, not described in prose",
|
|
472
|
-
},
|
|
473
|
-
{
|
|
474
|
-
title: "gates are proven, debt is under a ratchet",
|
|
475
|
-
need: "set samples (red and green gate samples) and ratchets (debt registries)",
|
|
476
|
-
gives: "the gate has proven it catches defects and stays quiet on correct code",
|
|
477
|
-
},
|
|
478
|
-
{
|
|
479
|
-
title: "lessons come back into the work",
|
|
480
|
-
need: "set lessons — the path or address of a journal where every incident yields a conclusion",
|
|
481
|
-
gives: "the project learns: the same bruise is not collected twice",
|
|
482
|
-
},
|
|
483
|
-
],
|
|
484
470
|
|
|
485
|
-
report: {
|
|
486
|
-
title: "aqk doctor --run",
|
|
487
|
-
version: "version",
|
|
488
|
-
level: "level",
|
|
489
|
-
summary: (ok, all) => `total: ${ok} of ${all} green`,
|
|
490
|
-
},
|
|
491
471
|
};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// tool/i18n/ru-docs.mjs — тексты, которые уходят В ФАЙЛ, а не в терминал.
|
|
2
|
+
//
|
|
3
|
+
// ЗАЧЕМ ОТДЕЛЬНО. Каталог строк перерос собственный предел в 500 строк — его поймал наш же
|
|
4
|
+
// гейт file-size-limit. Шов выбран по смыслу, а не пополам: здесь то, что программа ПИШЕТ
|
|
5
|
+
// (комментарии в .aqk.yml, названия ступеней, форма отчёта), а в ru.mjs — то, что она ГОВОРИТ.
|
|
6
|
+
// У этих текстов разная жизнь: первые читает человек в своём репозитории месяцы спустя,
|
|
7
|
+
// вторые — он же в терминале, одну секунду.
|
|
8
|
+
|
|
9
|
+
const ruDocs = {
|
|
10
|
+
// БЛОК СОСТОЯНИЯ — единственный наш текст, у которого читатель машина, а не человек.
|
|
11
|
+
// Уходит в контекст агента хуком SessionStart, поэтому пишется как утверждения о факте:
|
|
12
|
+
// без вежливости, без вводных, каждая строка либо факт, либо честное «неизвестно».
|
|
13
|
+
// Замер 2026-09-08: блок ≈147 токенов против ≈3348 у AGENTS.md — и несёт то, чего в файле
|
|
14
|
+
// нет и быть не может, потому что меняется каждый день.
|
|
15
|
+
context: {
|
|
16
|
+
title: "AQK — состояние этого репозитория на сейчас. Ниже только вычисленное машиной; где\nмашина не знает — сказано «неизвестно», и это не «всё хорошо».",
|
|
17
|
+
level: (r, top, missing) =>
|
|
18
|
+
`Уровень: AQK-${r} из ${top}.` + (missing ? ` До AQK-${r + 1} не хватает: ${missing}.` : ""),
|
|
19
|
+
levelUnknown: "Уровень: не вычислен — в репозитории нет .aqk.yml. Стандарт здесь не заведён.",
|
|
20
|
+
rules: (total, machine, human) =>
|
|
21
|
+
`Правил в точке входа: ${total}. Держит машина ${machine}, держит человек ${human}.`,
|
|
22
|
+
rulesNobody: "Правило, которое держит человек, не держит никто: машина его не проверяет.",
|
|
23
|
+
runNone:
|
|
24
|
+
"Прогон не делался — какие проверки красные, НЕИЗВЕСТНО. Это не «чисто»: `aqk doctor --run`.",
|
|
25
|
+
runStale: (when) =>
|
|
26
|
+
`Последний прогон ${when} СТАРЕЕ последнего коммита — он описывает не тот код, что здесь.`,
|
|
27
|
+
runClean: (when) => `Последний прогон ${when} — красных нет.`,
|
|
28
|
+
runRed: (when, names) => `Последний прогон ${when} — КРАСНЫЕ: ${names}.`,
|
|
29
|
+
andMore: (n) => `и ещё ${n}`,
|
|
30
|
+
skipped: (n) => `Не запускались: ${n} — инструмента нет на этой машине, их состояние неизвестно.`,
|
|
31
|
+
ratchets: (list) => `Храповики: ${list}. Список может только укорачиваться, увеличивать нельзя.`,
|
|
32
|
+
where: (entry) => `Свод правил: ${entry}. Чем доказан диф: \`aqk report --since main\`.`,
|
|
33
|
+
mapTitle: "ЧТО УМЕЕТ ЭТОТ ИНСТРУМЕНТ. Полный список команд — не пересказ, а тот же список,\nиз которого собрана справка:",
|
|
34
|
+
rulesTitle: (e) => `СВОД ПРАВИЛ ЭТОГО ПРОЕКТА (${e}) — дословно, целиком. Это не приглашение\nпрочитать: он уже здесь.`,
|
|
35
|
+
hookAlready: (p) => `хук уже стоит в ${p} — ничего не меняю.`,
|
|
36
|
+
hookAdded: (p) => `хук SessionStart дописан в ${p}:`,
|
|
37
|
+
hookCreated: (p) => `создан ${p} с хуком SessionStart:`,
|
|
38
|
+
hookBadJson: (p) => `${p} не разбирается как JSON — не трогаю его. Почини файл и повтори.`,
|
|
39
|
+
hookWhat:
|
|
40
|
+
"теперь состояние проекта попадает в контекст агента до первого действия, а не по его желанию.",
|
|
41
|
+
},
|
|
42
|
+
// Форма отчёта переехала сюда из терминального каталога 2026-09-08: это текст, который
|
|
43
|
+
// программа ПИШЕТ в .aqk/report.md, а не говорит в терминал. Повод — тот же гейт
|
|
44
|
+
// file-size-limit, что развёл эти файлы в первый раз: терминальный каталог снова перерос
|
|
45
|
+
// 500 строк. Шов по смыслу, а не пополам.
|
|
46
|
+
report2: {
|
|
47
|
+
evidenceNamed: (who) => `назван проверками: ${who}`,
|
|
48
|
+
evidenceSilent: (n) => `${n} ${n === 1 ? "проверка прошла" : "проверок прошли"} мимо и промолчали`,
|
|
49
|
+
evidenceTitle: "Чем доказан этот диф",
|
|
50
|
+
evidenceUncovered: "ни одна проверка не назвала этот файл",
|
|
51
|
+
evidenceBase: "база сравнения",
|
|
52
|
+
evidenceHash: "отпечаток доказательства",
|
|
53
|
+
evidenceBadRef: (r) => `ссылка «${r}» не разобрана — покрытие не считано`,
|
|
54
|
+
evidenceNoFiles: (r) => `файлов кода в дифе с «${r}» нет — доказывать нечего`,
|
|
55
|
+
evidenceWarn:
|
|
56
|
+
"◻️ означает: проверка обошла каталог и ничего не сказала. «Просмотрен и чист» и «не " +
|
|
57
|
+
"просмотрен вовсе» по выводу неразличимы — и выдавать одно за другое нельзя ни в ту, ни " +
|
|
58
|
+
"в другую сторону. " +
|
|
59
|
+
"Отпечаток считается по базе, набору команд и содержимому файлов. Изменилось что-то из " +
|
|
60
|
+
"этого — отчёт устарел, и «прогнал, потом поправил ещё три файла» перестаёт быть " +
|
|
61
|
+
"неотличимым от «прогнал». Механизм взят у donecheck (MIT).",
|
|
62
|
+
title: "Отчёт AQK",
|
|
63
|
+
noManifest: (cmd) => `Нет .aqk.yml — отчитываться не о чем. Начни с ${cmd}`,
|
|
64
|
+
level: "Уровень",
|
|
65
|
+
holdsTitle: "Что держит машина (прогон, а не манифест)",
|
|
66
|
+
nothingRuns: "⬜ ни один гейт не объявлен",
|
|
67
|
+
native: (prog) => `родной рецепт: ${prog}`,
|
|
68
|
+
portable: "переносимая проверка",
|
|
69
|
+
weakerTitle: "Стоит слабее возможного",
|
|
70
|
+
weaker: (progs) => `в системе есть ${progs}, но гейт стоит на переносимой проверке — она ловит меньше`,
|
|
71
|
+
missingTitle: "Чего нет",
|
|
72
|
+
nothingMissing: "✅ все применимые записи поставлены",
|
|
73
|
+
needsTool: (prog) => `нужен ${prog} — его нет в системе`,
|
|
74
|
+
notInstalled: "применимо, но не поставлено",
|
|
75
|
+
hiddenTitle: "Не применимо к этому репозиторию",
|
|
76
|
+
readTitle: "Что комплект велел прочитать",
|
|
77
|
+
readWarn:
|
|
78
|
+
"Значок означает только наличие файла на диске. Прочитан он или нет, машина не знает и " +
|
|
79
|
+
"не притворяется, что знает: это отвечает тот, кто отчитывается.",
|
|
80
|
+
ignoreTitle: "Что спрятано .aqkignore",
|
|
81
|
+
ignoreNone: "файла .aqkignore нет — ничего не спрятано",
|
|
82
|
+
ignoreWarn:
|
|
83
|
+
"Скрытое молча — тот же класс, что молчащий гейт: гейты по этим путям не смотрят вовсе. " +
|
|
84
|
+
"Строка здесь означает, что защиты там нет и не будет.",
|
|
85
|
+
whyTitle: "Зачем это нужно — коротко",
|
|
86
|
+
whyNothing: "нечего добавлять: применимое уже стоит",
|
|
87
|
+
saved: (path) => `Сохранено: ${path}`,
|
|
88
|
+
docs: {
|
|
89
|
+
baseline: "обязательный минимум проекта, без привязки к языку",
|
|
90
|
+
readyMade: "карта готовых правил: сперва ищи готовое, потом пиши своё",
|
|
91
|
+
rulesGeneral: "общие правила работы",
|
|
92
|
+
rulesTesting: "правила про тесты",
|
|
93
|
+
rulesSecurity: "правила про безопасность",
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
manifestDoc: {
|
|
97
|
+
head: [
|
|
98
|
+
"# .aqk.yml — манифест Agent Quality Kit",
|
|
99
|
+
"# Что это: машиночитаемое описание того, как в этом репозитории живут агенты.",
|
|
100
|
+
"# Уровень соответствия считает `aqk doctor`. Пустое поле = ступень не пройдена,",
|
|
101
|
+
"# и это честно: заполнять заглушками бессмысленно, проверяются файлы, а не слова.",
|
|
102
|
+
],
|
|
103
|
+
entry: "# AQK-0 — что агент читает первым.",
|
|
104
|
+
rules: "# AQK-1 — где стандарты и какие проверки обязательны. docs — где методички:\n# оба пути читает doctor, так что комплект можно разложить куда угодно.",
|
|
105
|
+
gates: [
|
|
106
|
+
" # Имя: команда, возвращающая 0 или не 0. Пустое объявление защиты не даёт и бракуется",
|
|
107
|
+
" # проверкой «объявленный гейт запускается» — поэтому здесь примеры, а не заготовки.",
|
|
108
|
+
' # lint: "ruff check ."',
|
|
109
|
+
' # test: "pytest -q"',
|
|
110
|
+
" # Поставить готовую запись из каталога вместе с образцами: aqk add <имя>",
|
|
111
|
+
],
|
|
112
|
+
samples: [
|
|
113
|
+
"# AQK-2 — чем доказано, что гейты работают, и где реестры долга.",
|
|
114
|
+
"# samples: каталог с красными и зелёными образцами (гейт обязан краснеть на первом",
|
|
115
|
+
"# и молчать на втором). ratchets: списки известных нарушений, которые могут только",
|
|
116
|
+
"# укорачиваться.",
|
|
117
|
+
],
|
|
118
|
+
lessons: "# AQK-3 — где копятся уроки. Путь или адрес.",
|
|
119
|
+
advisory: [
|
|
120
|
+
"# Совещательные гейты: показывают находки, но не роняют прогон. Третий способ ввести",
|
|
121
|
+
"# правило — рядом с храповиком и с большой чисткой. Список называется в каждом прогоне:",
|
|
122
|
+
"# совещательный гейт, о котором забыли, — это выключенная проверка.",
|
|
123
|
+
"# advisory:",
|
|
124
|
+
"# - complexity-limit",
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
levels: [
|
|
128
|
+
{
|
|
129
|
+
title: "манифест и точка входа",
|
|
130
|
+
need: "создай .aqk.yml и укажи в entry файл, который агент читает первым (AGENTS.md)",
|
|
131
|
+
gives: "любой инструмент понимает, что читать в этом репозитории",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
title: "правила и работающие гейты",
|
|
135
|
+
need: "укажи rules (каталог стандартов) и заполни хотя бы один гейт в gates реальной командой",
|
|
136
|
+
gives: "проверки объявлены командами, а не описаны словами",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
title: "гейты доказаны, долг под храповиком",
|
|
140
|
+
need: "заведи samples (красные и зелёные образцы гейтов) и ratchets (реестры долга)",
|
|
141
|
+
gives: "гейт доказал, что ловит брак и молчит на исправном коде",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
title: "уроки возвращаются в работу",
|
|
145
|
+
need: "укажи lessons — путь или адрес журнала, где каждый инцидент даёт вывод",
|
|
146
|
+
gives: "проект учится: одна и та же шишка не набивается дважды",
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
report: {
|
|
150
|
+
title: "aqk doctor --run",
|
|
151
|
+
version: "версия",
|
|
152
|
+
level: "уровень",
|
|
153
|
+
summary: (ok, all) => `итого: ${ok} из ${all} зелёных`,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
export { ruDocs };
|