@rt-tools/agent-kit 0.20.0 → 0.22.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 (78) hide show
  1. package/assets/checks/check-reuse.mjs +11 -1
  2. package/assets/checks/check-specs.mjs +8 -23
  3. package/assets/checks/signals/core.json +12 -2
  4. package/assets/checks/signals.mjs +17 -0
  5. package/assets/checks/spec-proposed.mjs +122 -0
  6. package/assets/hooks/browser-guard-device-id.sh +3 -0
  7. package/assets/hooks/browser-guard-no-asking.sh +3 -0
  8. package/assets/hooks/browser-guard-no-listing.sh +3 -0
  9. package/assets/hooks/browser-guard-no-other-drivers.sh +3 -0
  10. package/assets/hooks/browser-guard-require-select.sh +3 -0
  11. package/assets/hooks/claim-guard.sh +4 -0
  12. package/assets/hooks/conscience-guard.sh +4 -0
  13. package/assets/hooks/deny-tail.sh +12 -0
  14. package/assets/hooks/dev-server-guard.sh +3 -0
  15. package/assets/hooks/docs-guard.sh +4 -11
  16. package/assets/hooks/exam-guard.sh +3 -0
  17. package/assets/hooks/git-guard-delivery.sh +4 -4
  18. package/assets/hooks/git-guard-main.sh +4 -9
  19. package/assets/hooks/git-guard-push-tests.sh +3 -0
  20. package/assets/hooks/grill-gate.sh +5 -0
  21. package/assets/hooks/guard-note.sh +45 -0
  22. package/assets/hooks/handoff-entry-guard.sh +3 -0
  23. package/assets/hooks/handoff-write.sh +58 -7
  24. package/assets/hooks/hook-input.sh +1 -0
  25. package/assets/hooks/override-write-guard.sh +4 -4
  26. package/assets/hooks/postmortem-guard.sh +4 -0
  27. package/assets/hooks/proposal-guard.sh +11 -0
  28. package/assets/hooks/prose-style-guard.sh +3 -0
  29. package/assets/hooks/qa-dataid-guard.sh +3 -0
  30. package/assets/hooks/rerun-guard.sh +3 -0
  31. package/assets/hooks/reuse-first-guard.sh +3 -0
  32. package/assets/hooks/rule-article.sh +1 -1
  33. package/assets/hooks/rule-source-guard.sh +4 -4
  34. package/assets/hooks/sql-guard.sh +3 -0
  35. package/assets/hooks/task-context-load.sh +1 -1
  36. package/assets/hooks/task-flow-draft-guard.sh +3 -0
  37. package/assets/hooks/task-flow-guard.sh +3 -0
  38. package/assets/hooks/turn-entry-load.sh +27 -2
  39. package/assets/hooks/turn-exit-guard.sh +4 -0
  40. package/assets/hooks/waiting-turn-guard.sh +32 -10
  41. package/assets/hooks/window-fill-guard.sh +3 -0
  42. package/assets/hooks/work-start-guard.sh +5 -0
  43. package/assets/hooks/write-targets.sh +59 -10
  44. package/assets/laws/delivery.md +5 -0
  45. package/assets/laws/frontend-application.md +10 -0
  46. package/assets/laws/work-conduct.md +8 -0
  47. package/assets/patterns/browser-verification-stand.md +24 -9
  48. package/assets/patterns/git-workflow-pr.github.md +29 -22
  49. package/assets/patterns/spec-driven-domain.md +5 -0
  50. package/assets/patterns/spec-driven-rule.md +41 -1
  51. package/assets/patterns/task-flow-archive.md +12 -0
  52. package/assets/patterns/task-flow-handoff.md +14 -1
  53. package/assets/patterns/task-flow-resume.md +11 -0
  54. package/assets/patterns/task-flow-start.md +40 -40
  55. package/assets/patterns/testing-e2e.md +15 -0
  56. package/assets/patterns/testing-unit.md +13 -0
  57. package/assets/pitfalls/git-workflow.github.md +13 -0
  58. package/assets/pitfalls/spec-driven.md +20 -0
  59. package/assets/pitfalls/task-flow.md +78 -48
  60. package/assets/rules/git-workflow.azure.md +5 -0
  61. package/assets/rules/git-workflow.github.md +26 -23
  62. package/assets/rules/git-workflow.gitlab.md +5 -0
  63. package/assets/rules/spec-driven.md +23 -24
  64. package/assets/rules/turn-conduct.md +13 -15
  65. package/assets/rules/turn-entry.md +6 -4
  66. package/assets/rules/typescript-conventions.md +7 -0
  67. package/assets/skills/agent-kit-extend.md +11 -0
  68. package/assets/skills/agent-kit.md +12 -2
  69. package/lib/commands.d.ts.map +1 -1
  70. package/lib/commands.js +36 -1
  71. package/lib/commands.js.map +1 -1
  72. package/lib/observations.d.ts +13 -1
  73. package/lib/observations.d.ts.map +1 -1
  74. package/lib/observations.js +7 -1
  75. package/lib/observations.js.map +1 -1
  76. package/package.json +1 -1
  77. package/rt-tools-agent-kit-0.22.0.tgz +0 -0
  78. package/rt-tools-agent-kit-0.20.0.tgz +0 -0
package/lib/commands.js CHANGED
@@ -737,6 +737,33 @@ function weightsOfSkills(root, dir, names) {
737
737
  }
738
738
  return found;
739
739
  }
740
+ /**
741
+ * Имена гардов, разложенных в это дерево.
742
+ *
743
+ * Гардом считается тот, кто заявил своё имя для наблюдений строкой вверху файла. Заявка
744
+ * добровольна и точна: хук, который своё отбитие считает сам — как гейт правил, — её не ставит и
745
+ * в счёт отказов гардов не идёт, а отбой заявившего пишет общий хвост отказа.
746
+ *
747
+ * Имя берётся из заявки, а не из имени файла: в наблюдение уезжает именно оно, и разойтись этим
748
+ * двум именам нельзя.
749
+ *
750
+ * Каталог спрашивается у дерева, а не у пакета: свои гарды дерева лежат в нём же и пишут
751
+ * наблюдения наравне с пакетными — перечень от пакета не назвал бы ни одного из них.
752
+ */
753
+ function guardsOfTree(root, dir) {
754
+ const at = join(root, dir);
755
+ if (!existsSync(at)) {
756
+ return [];
757
+ }
758
+ const found = new Set();
759
+ for (const file of readdirSync(at)) {
760
+ const named = /^RT_GUARD_NAME=([A-Za-z0-9._-]+)/m.exec(readFileSync(join(at, file), 'utf8'));
761
+ if (named) {
762
+ found.add(named[1]);
763
+ }
764
+ }
765
+ return [...found].sort(byText);
766
+ }
740
767
  /** Байты человеку: килобайтами, потому что счёт идёт на сотни тысяч и читается по одному. */
741
768
  function kbOf(bytes) {
742
769
  return `${Math.round(bytes / 1024)} КБ`;
@@ -806,6 +833,14 @@ function statsLines(summary, swept, days, version, laidOut) {
806
833
  ...countLines(summary.guards),
807
834
  ]
808
835
  : []),
836
+ ...(summary.silentGuards.length
837
+ ? [
838
+ '',
839
+ `гарды не отбивали ни разу: ${summary.silentGuards.length}`,
840
+ ...summary.silentGuards.map((name) => ` ${name}`),
841
+ ' — стоял и не понадобился или стоял и не работал, по сводке это одно и то же',
842
+ ]
843
+ : []),
809
844
  ...(swept.length ? ['', `снято по сроку хранения (${KEEP_DAYS} дн.): ${swept.length}`] : []),
810
845
  '',
811
846
  `пакет v${version}`,
@@ -840,7 +875,7 @@ export function stats(env, options) {
840
875
  const known = laidOutSkills(config, assetsDir);
841
876
  // Вес спрашивается у дерева, а не у пакета: правило дерево могло переписать надстройкой, и
842
877
  // заход читал то, что лежит здесь, а не то, что уехало бы из пакета.
843
- const summary = summarize(result.observations, known, days, weightsOfSkills(root, config.layout.rules, known));
878
+ const summary = summarize(result.observations, known, days, weightsOfSkills(root, config.layout.rules, known), guardsOfTree(root, config.layout.hooks));
844
879
  if (options.json) {
845
880
  return { code: 0, lines: [JSON.stringify({ ...summary, swept: result.swept })] };
846
881
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/commands.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines -- файл делится задачей RT-849 */\n/**\n * Команды и их вывод. Печать отделена от работы: команда возвращает строки и код возврата,\n * а `process.exit` зовёт только точка входа — иначе ни одну из них нельзя было бы проверить\n * спекой, не перехватывая поток вывода.\n */\nimport { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { IAsset, collectAssets } from './assets.js';\nimport { ICargoOverride } from './cargo.js';\nimport { cascadeCuts, ICascadeCut, IIdleSkip } from './cascade.js';\nimport { IBrokenLink, IEntryOfCatalog, IGapOfVariant, isChosen, readCatalog } from './catalog.js';\nimport { debtLine, ICompanion, isUnfilled, IUnaddressed, pathOf as companionPathOf, TCompanionState, unaddressedOf } from './companion.js';\nimport { CONFIG_PATH, DEFAULT_LAYOUT, IConfig, KINDS, OVERRIDES_DIR, PROFILE_FILE, readConfig, RT_KIT_DIR, TKind } from './config.js';\nimport { IStaleBuild } from './freshness.js';\nimport { hooksSection, IHookBinding, IMatcherDrift, SETTINGS_PATH } from './hooks-map.js';\nimport {\n DEFAULT_DAYS,\n ICount,\n IReadResult,\n ISummary,\n KEEP_DAYS,\n OBSERVATIONS_DIR,\n readObservations,\n summarize,\n TWeights,\n} from './observations.js';\nimport { IPlanned, isRefusal, TOutcome } from './plan.js';\nimport { laidOutSkills, treeSnapshot } from './snapshot.js';\nimport { ICutFound, IRetiredFound, ISyncResult, mergedBody, pendingOf, planSync, runSync } from './sync.js';\nimport { thresholdLines } from './thresholds.js';\nimport { answersRequirement, ITrait, readTraits, unknownTraits } from './traits.js';\nimport { placeholdersOf } from './vars.js';\nimport { IAxis, IOptionOfAxis, readAxes, unansweredAxes } from './variants.js';\nimport { byText } from './order.js';\n\nexport interface IOutcomeOfCommand {\n readonly code: number;\n readonly lines: readonly string[];\n}\n\n/** Всё, что команда знает о мире: корень проекта, версия пакета и его каталог ресурсов. */\nexport interface IEnvironment {\n readonly root: string;\n readonly version: string;\n readonly assetsDir: string;\n /**\n * Ресурсы правлены позже, чем собран пакет, из которого идёт раскладка; `null` — сверять не с\n * чем. Считается на краю, где пакет знает своё расположение: библиотечные модули работают с\n * тем каталогом ресурсов, который им дали, и о существовании исходников не знают.\n */\n readonly stale?: IStaleBuild | null;\n /**\n * Имя пакета из его собственного манифеста. Нужно, чтобы найти себя в зависимостях дерева:\n * искать по угаданному имени значило бы промахнуться молча у всякого, кто пакет переименовал.\n */\n readonly name?: string;\n}\n\n/** Что с файлом сделала раскладка. Прошедшее время здесь правда: `sync` уже записал. */\nconst DONE_WORD: Readonly<Record<TOutcome, string>> = {\n create: 'положен',\n update: 'переложен',\n drift: 'правлен руками',\n foreign: 'положен не пакетом',\n ok: 'без изменений',\n};\n\n/**\n * Что с файлом **сейчас**. Отдельно от прошедшего времени потому, что `doctor` и `list` ничего\n * не пишут: сказать «положен» о файле, которого в дереве нет, значит соврать читателю ровно там,\n * где он пришёл узнать состояние.\n */\nconst STATE_WORD: Readonly<Record<TOutcome, string>> = {\n create: 'нет в дереве',\n update: 'отстал от пакета',\n drift: 'правлен руками',\n foreign: 'положен не пакетом',\n ok: 'на месте',\n};\n\nconst NOT_CHOSEN: string = 'не выбран';\n/** Перечень отделяет снятое каскадом от невыбранного: дерево его не выбирало и не отвергало. */\nconst CUT_BY_CASCADE: string = 'снят каскадом';\nconst SKIPPED: string = 'пропущен';\n/** Ресурс чужого вида: в этом дереве его не существует, а не «от него отказались». */\nconst OTHER_VARIANT: string = 'другой вид';\n/** Ресурс, которому нужно свойство дерева: дерево его не отвергало — свойства у него нет. */\nconst NEEDS_TRAIT: string = 'нужно свойство';\n\nconst KIND_TITLE: Readonly<Record<TKind, string>> = {\n laws: 'ЗАКОНЫ',\n rules: 'ПРАВИЛА',\n pitfalls: 'ХОЛОДНЫЕ ЧАСТИ',\n patterns: 'ПАТТЕРНЫ',\n skills: 'СКИЛЫ',\n hooks: 'ХУКИ',\n defaults: 'УМОЛЧАНИЯ',\n checks: 'ПРОВЕРКИ',\n agents: 'АГЕНТЫ',\n commands: 'КОМАНДЫ',\n workflows: 'ВОРКФЛОУ',\n templates: 'ШАБЛОНЫ',\n docs: 'ДОКУМЕНТЫ',\n samples: 'ОБРАЗЦЫ',\n};\n\n/** Состояние компаньона словами. У заполненного слова нет: о нём говорить нечего. */\nconst COMPANION_WORD: Readonly<Record<TCompanionState, string>> = {\n missing: 'пропал',\n draft: 'остался черновиком',\n filled: 'заполнен',\n};\n\nconst NO_CONFIG: string = `нет \\`${CONFIG_PATH}\\` — начни с \\`agent-kit init\\``;\n\n/** Куда уезжает прежнее содержимое файла, отданного пакету. */\nexport const KEPT_SUFFIX: string = '.before-rt-kit';\n\n/**\n * Имя функции профиля, которую хук ждёт. Обе формы: голая проверка наличия и спрос через\n * помощника, который о нехватке говорит вслух. Считать одну значило бы недосчитаться ровно тех\n * хуков, которые перешли на второе.\n */\nconst PROFILE_CALL: RegExp = /(?:command -v|rt_needs)[ \\t]+(rt_[a-z_]+)/g;\n\n/** Сам помощник функцией профиля не является: его везёт пакет, а не дерево. */\nconst PROFILE_HELPER: string = 'rt_needs';\n\n/**\n * Объявление функции: `rt_is_app_code() {`. Не с начала строки — хук объявляет запасной вариант\n * прямо в условии, и не считать его объявлением значило бы звать недостающим то, что у хука\n * есть.\n */\nconst PROFILE_DEFINE: RegExp = /(rt_[a-z_]+)\\s*\\(\\)\\s*\\{/g;\n\n/** Что взятые хуки зовут у профиля и что определяют сами. */\nfunction readHooks(assets: readonly IAsset[], wanted: Set<string>, defined: Set<string>): void {\n for (const asset of assets.filter((one: IAsset): boolean => one.kind === 'hooks')) {\n for (const found of asset.text.matchAll(PROFILE_CALL)) {\n if (found[1] !== PROFILE_HELPER) {\n wanted.add(found[1]);\n }\n }\n // Часть общих функций живёт не в профиле, а в соседнем хуке: запись наблюдения объявлена\n // в хуке наблюдений, и гарды зовут её через ту же проверку наличия. Не считать их\n // определёнными значило бы требовать от дерева переписать в профиль чужой код.\n for (const found of asset.text.matchAll(PROFILE_DEFINE)) {\n defined.add(found[1]);\n }\n }\n}\n\n/** Функции, определённые самим профилем: разложенным умолчанием пакета и надстройкой дерева. */\nfunction readProfiles(root: string, config: IConfig, defined: Set<string>): void {\n // Профиль собирается из тех же файлов, что читает сам хук: сперва разложенное умолчание\n // пакета, поверх — надстройка дерева. Судить по одной надстройке значило бы объявить мёртвым\n // каждый гард дерева, которое умолчаний не переписывало.\n const defaults: string = config.layout.defaults ?? DEFAULT_LAYOUT.defaults;\n const sources: readonly string[] = [join(root, defaults, PROFILE_FILE), join(root, RT_KIT_DIR, PROFILE_FILE)];\n\n for (const path of sources.filter((one: string): boolean => existsSync(one))) {\n for (const found of readFileSync(path, 'utf8').matchAll(PROFILE_DEFINE)) {\n defined.add(found[1]);\n }\n }\n}\n\n/**\n * Функции профиля, которых ждут взятые хуки, и те из них, что дерево не определило.\n *\n * Отдельной строкой в разборе состояния потому, что на месте вызова нехватка не видна вовсе:\n * хук выходит с нулём, стоит в настройке, виден в списке — и читается как работающий. Тишина\n * при этом означает разом «нечего проверять», «проверять нечем» и «всё в порядке».\n */\nfunction profileLines(root: string, assetsDir: string, config: IConfig): string[] {\n const wanted: Set<string> = new Set();\n const defined: Set<string> = new Set();\n\n readHooks([...collectAssets(config, assetsDir)], wanted, defined);\n\n if (!wanted.size) {\n return [];\n }\n\n readProfiles(root, config, defined);\n\n const absent: readonly string[] = [...wanted].filter((name: string): boolean => !defined.has(name)).sort(byText);\n\n return [\n `функции профиля, которых ждут взятые хуки: ${wanted.size}`,\n ...(absent.length\n ? [\n ...absent.map((name: string): string => ` нет функции ${name} — её определяют в ${join(RT_KIT_DIR, PROFILE_FILE)}`),\n ' хук без своей функции проверку не делает и действие пропускает',\n ]\n : [' все определены']),\n ];\n}\n\n/**\n * Местное значение, которым живёт хук: путь от корня дерева и то, что перестаёт проверяться без\n * него. Стоит строкой шапки, тем же приёмом, каким хук называет требуемые ресурсы.\n */\nconst LOCAL_VALUE: RegExp = /^# Местное значение: (\\S+) — ([^\\n]+)$/gm;\n\n/**\n * Местные значения, которых ждут взятые хуки, и те из них, которых в дереве нет.\n *\n * Считать их приходится отдельно от файлов и функций: разложенный хук с пустым значением лежит\n * на месте, зовётся и выходит нулём — сводка называет такое дерево настроенным, а проверять оно\n * перестало. Хук, отказывающий в пользу работы, тем и опасен: снаружи это выглядит исправной\n * работой.\n */\nfunction localValueLines(root: string, assetsDir: string, config: IConfig): string[] {\n const absent: string[] = [];\n let wanted: number = 0;\n\n for (const asset of collectAssets(config, assetsDir).filter((one: IAsset): boolean => one.kind === 'hooks')) {\n for (const [, path, loss] of asset.text.matchAll(LOCAL_VALUE)) {\n wanted += 1;\n if (!existsSync(join(root, path))) {\n absent.push(` нет значения ${path} — его ждёт ${asset.id}: ${loss.trim()}`);\n }\n }\n }\n\n if (!wanted) {\n return [];\n }\n\n return [\n `местные значения, которых ждут взятые хуки: ${wanted}`,\n ...(absent.length\n ? [...absent.sort(byText), ' хук без своего значения проверку не делает и действие пропускает']\n : [' все на месте']),\n ];\n}\n\n/** Дырка в тексте пакета, как она написана в самом тексте. */\nfunction holeOf(name: string): string {\n return `{{${name}}}`;\n}\n\nconst holes: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n [...result.missing].map(([asset, names]: [string, readonly string[]]): string => {\n const written: string = names.map(holeOf).join(', ');\n\n return ` ${asset}: нет значений для ${written}`;\n });\n\nconst unfilled: (result: ISyncResult) => readonly ICompanion[] = (result: ISyncResult): readonly ICompanion[] =>\n result.companions.filter(isUnfilled);\n\n/**\n * Строка про компаньон, которому нечего сказать.\n *\n * У правила, требующего свойства, которого дерево не назвало, это не черновик, а лишний файл:\n * заполнять его нечем — ни одной статье такого правила здесь не отвечает ни файл, ни символ.\n * Такое правило доезжает сюда только выбором поимённо, и верное действие тут обратное\n * заполнению — снять ресурс строкой отказа.\n */\nconst companionLine: (entry: ICompanion) => string = (entry: ICompanion): string =>\n entry.needs === null\n ? ` ${entry.path} — ${COMPANION_WORD[entry.state]}`\n : ` ${entry.path} — правилу нужно свойство «${entry.needs}»: заполнять нечем, снимай ресурс строкой в \\`skip\\``;\n\n/** Ось без ответа: чем её спрашивают и из чего выбирают. */\nconst axisLines: (axes: readonly IAxis[]) => string[] = (axes: readonly IAxis[]): string[] =>\n axes.flatMap((axis: IAxis): string[] => [\n ` ${axis.name} — ${axis.question}`,\n ...axis.options.map((option: IOptionOfAxis): string => ` ${option.value.padEnd(8)} ${option.title}`),\n ` выбор пишется в \\`variants\\` конфига: {\"${axis.name}\": \"${axis.options[0]?.value ?? ''}\"}`,\n ]);\n\n/**\n * Брошенное: файл лежит, а ресурс за ним больше не берут. Печатается отдельным списком и с\n * подсказкой — стереть его пакет не вправе, а промолчать не может: агент читает такой файл как\n * действующее правило.\n */\nconst abandonedLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.abandoned.length\n ? [\n `лежит от ресурсов, которые больше не берутся: ${result.abandoned.length}`,\n ...result.abandoned.map((path: string): string => ` ${path}`),\n ' их не стирает никто: рядом может лежать написанное проектом — убирать вручную',\n ]\n : [];\n\n/**\n * Ресурс, у которого нет вида под выбор дерева. Называется и то, чего не хватает, и оба способа\n * это снять: отказ без действия обходят, а не исполняют.\n */\nconst gapLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.gaps.flatMap((gap: IGapOfVariant): string[] => [\n ` ${gap.kind}/${gap.name} — есть только под ${gap.axis}: ${gap.available.join(', ')}, а выбран «${gap.chosen}»`,\n ` либо заведи вид под «${gap.chosen}», либо назови в skip: ${gap.ids.join(', ')}`,\n ]);\n\n/**\n * Свойства, названные не по перечню пакета, — и деревом, и ресурсами.\n *\n * Обе стороны собираются одной функцией, потому что промах у них общий: имя свойства написано\n * так, как его никто не объявлял. Разница только в том, где оно написано, и потому в строке\n * отказа стоит место, а не одно имя.\n */\nfunction strangeTraits(config: IConfig, assetsDir: string): readonly string[] {\n const traits: readonly ITrait[] = readTraits(assetsDir);\n const lines: string[] = unknownTraits(config.has, traits).map(\n (trait: string): string => ` \\`${trait}\\` — названо деревом в \\`has\\`, а пакет такого свойства не объявлял`\n );\n\n for (const entry of readCatalog(assetsDir)) {\n if (entry.needs !== null && unknownTraits([entry.needs], traits).length) {\n lines.push(` \\`${entry.needs}\\` — требует ${entry.id}, а пакет такого свойства не объявлял`);\n }\n }\n\n return lines.length ? [...lines, ` объявленные свойства: ${traits.map((trait: ITrait): string => trait.value).join(', ')}`] : [];\n}\n\n/**\n * Что запись объявления сделала с настройкой агента.\n *\n * Дописанное называется поимённо: правка легла в файл дерева, и увидеть её оно должно тем же\n * выводом, каким видит положенные файлы, — а не следующим просмотром истории.\n */\nconst boundLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] => {\n if (result.bound === null || (!result.bound.added.length && !result.bound.unreadable)) {\n return [];\n }\n\n return result.bound.unreadable\n ? [\n `\\`${SETTINGS_PATH}\\` не разбирается как JSON — записи в неё не делалось`,\n ' дерево вправе держать её по-своему, вплоть до комментариев; тогда запись идёт рукой',\n ]\n : [\n `в \\`${SETTINGS_PATH}\\` дописано событий: ${result.bound.added.length}`,\n ...result.bound.added.map((event: string): string => ` ${event} — зовёт диспетчер`),\n ];\n};\n\n/**\n * Гарды, которых нет в настройке агента, и готовый кусок для неё.\n *\n * Кусок печатается целиком, а не одними именами: правку в свою настройку делает проект, и\n * список «не хватает трёх» заставляет собирать JSON по памяти — там и теряется образец вызова.\n */\nconst unboundLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.unbound.length\n ? [\n `гарды разложены, но в \\`${SETTINGS_PATH}\\` их не зовёт никто: ${result.unbound.length}`,\n ...result.unbound.map((binding: IHookBinding): string => {\n const matcher: string = binding.matcher ? ' ' + binding.matcher : '';\n\n return ` ${binding.path} — ${binding.event}${matcher}`;\n }),\n ` вставь в \\`${SETTINGS_PATH}\\` раздел \\`hooks\\` — готовый кусок ниже:`,\n ...JSON.stringify({ hooks: hooksSection(result.unbound) }, null, 4)\n .split('\\n')\n .map((line: string): string => ` ${line}`),\n ]\n : [];\n\n/**\n * Гарды, подписанные не на то, что объявляют.\n *\n * Называются обе стороны: объявленное гардом и стоящее в настройке. Одной стороной такую строку\n * не починить — правится настройка, а верное значение лежит в гарде, и по разнице видно, что\n * именно до него не доходит.\n */\nconst driftedLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.drifted.length\n ? [\n `гарды подписаны не на то, что объявляют: ${result.drifted.length}`,\n ...result.drifted.flatMap((drift: IMatcherDrift): string[] => [\n ` ${drift.path} — ${drift.event}`,\n ` объявлено: ${drift.declared || '(без образца)'}`,\n ` в настройке: ${drift.bound || '(без образца)'}`,\n ]),\n ` поправь образец в \\`${SETTINGS_PATH}\\` по объявлению гарда: тело его разбирает то, что объявлено`,\n ]\n : [];\n\n/**\n * Разорванные связи между ресурсами.\n *\n * Печатается предупреждением и кода возврата не меняет: дерево вправе закрыть требование своим\n * средством. Но и молчать нельзя — дерево, выбравшее паттерн без хука, которым тот живёт,\n * выглядит исправным, а расходится с пакетом на целую волну работ.\n */\nconst brokenLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.broken.length\n ? [\n `требования ресурсов, оставшиеся без ответа: ${result.broken.length}`,\n ...result.broken.map(\n (link: IBrokenLink): string => ` ${link.id} — требует ${link.requires}: ${link.unknown ? 'нет в пакете' : NOT_CHOSEN}`\n ),\n ' это предупреждение, а не отказ: требование закрывается своим средством дерева либо выбором ресурса',\n ]\n : [];\n\n/**\n * Строки отказа, которые ничего не снимают.\n *\n * Названы вместе с тем, из-за чего стали лишними: «строка ни на что не влияет» без этого читается\n * как промах в имени, и дерево идёт искать опечатку там, где её нет.\n */\nconst idleLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.idle.length\n ? [\n `строк отказа, которые ничего не снимают: ${result.idle.length}`,\n ...result.idle.map((one: IIdleSkip): string => {\n const why: string = one.by ? 'снято отказом от ' + one.by : 'нет в пакете';\n\n return ` ${one.id} — ${why}`;\n }),\n ' это предупреждение, а не отказ: строки убирает дерево, и раскладка идёт дальше',\n ]\n : [];\n\n/**\n * Разложенное раньше, а теперь снятое каскадом.\n *\n * Отдельно от брошенного: от брошенного дерево отказалось само и знает, где искать причину, а\n * снятое каскадом ушло вслед за родителем — в отказе его имени нет и не будет.\n */\nconst cutOnDiskLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.cutOnDisk.length\n ? [\n `лежит от ресурсов, снятых вслед за родителем: ${result.cutOnDisk.length}`,\n ...result.cutOnDisk.map(\n (one: ICutFound): string => ` ${one.path} — снят вслед за ${one.cut.parent}, отвергнут ${one.cut.root}`\n ),\n ' их не стирает никто: убирать вручную, как и брошенные',\n ]\n : [];\n\n/**\n * Названное выбором, чего дерево всё равно не получит.\n *\n * Молчать здесь нельзя вдвойне: дерево не просто осталось без ресурса — оно попросило его\n * поимённо и прочло бы отсутствие как промах раскладки.\n */\nconst namedCutLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.namedCut.length\n ? [\n `названо выбором, но не приедет: ${result.namedCut.length}`,\n ...result.namedCut.map((one: ICascadeCut): string => ` ${one.id} — снято вслед за ${one.parent}, отвергнут ${one.root}`),\n ' это предупреждение, а не отказ: возьми родителя в выбор либо убери потомка из него',\n ]\n : [];\n\n/**\n * Файлы ресурсов, ушедших из набора.\n *\n * Названы отдельно от брошенных: брошенный ресурс в наборе есть и вернётся, если дерево его\n * выберет, а снятый не вернётся никогда — и правило, по которому агент работает, у него\n * последнее.\n */\nconst retiredLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.retired.length\n ? [\n `в дереве лежат файлы ресурсов, которых в пакете больше нет: ${result.retired.length}`,\n ...result.retired.map((one: IRetiredFound): string => ` ${one.path} — снят в v${one.since}: ${one.why}`),\n ' убирает их дерево: в чужие файлы пакет не пишет',\n ]\n : [];\n\n/**\n * Надстройка, которой в пакете ничего не отвечает: она не применена, и молчание об этом читается\n * как «всё применено».\n */\nconst strayLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.strayOverrides.length\n ? [\n `надстроек, не подобранных ни к одному ресурсу: ${result.strayOverrides.length}`,\n ...result.strayOverrides.map((id: string): string => ` ${join(OVERRIDES_DIR, id)} — применена не была`),\n ' подбор идёт по идентификатору ресурса целиком, вместе с приставкой свойства',\n ]\n : [];\n\n/**\n * Предупреждения раскладки: кода возврата они не меняют и печатаются на любом её исходе.\n *\n * Иначе их не видит никто: на сошедшемся дереве проверка молчит, а удавшаяся раскладка называет\n * положенные файлы — и лишняя строка отказа, снятый каскадом файл и ушедший из набора ресурс\n * всплывали бы только там, где и без них уже красно.\n */\nconst warnings: (result: ISyncResult) => string[] = (result: ISyncResult): string[] => [\n ...brokenLines(result),\n ...idleLines(result),\n ...namedCutLines(result),\n ...retiredLines(result),\n ...cutOnDiskLines(result),\n ...abandonedLines(result),\n ...strayLines(result),\n];\n\nconst describe: (result: ISyncResult) => string[] = (result: ISyncResult): string[] => [\n ...holes(result),\n ...gapLines(result),\n ...unboundLines(result),\n ...driftedLines(result),\n ...warnings(result),\n ...pendingOf(result).map((entry: IPlanned): string => ` ${entry.path} — ${STATE_WORD[entry.outcome]}`),\n ...unfilled(result).map(companionLine),\n];\n\n/** Имена дырок во всех ресурсах, которые дерево берёт. Без конфига — ни одной: выбор неизвестен. */\nfunction placeholdersIn(config: IConfig | null, assetsDir: string): readonly string[] {\n if (!config) {\n return [];\n }\n const names: string[] = [];\n for (const asset of collectAssets(config, assetsDir)) {\n for (const name of placeholdersOf(asset.text)) {\n if (!names.includes(name)) {\n names.push(name);\n }\n }\n }\n\n return names.sort(byText);\n}\n\n/**\n * Что проект выбрал при заведении конфига. Пустой список — весь набор; выбор приходит сюда\n * готовым, потому что взять его негде, кроме края: у строки запуска флаг, у терминала вопрос,\n * а у неинтерактивного прогона нет ни того ни другого — и решать это команде не по чину.\n */\nexport function init(\n root: string,\n only: readonly string[] = [],\n variants: Readonly<Record<string, string>> = {},\n assetsDir: string = ''\n): IOutcomeOfCommand {\n const path: string = join(root, CONFIG_PATH);\n if (existsSync(path)) {\n return { code: 0, lines: [`${CONFIG_PATH} уже есть — оставлен как есть`] };\n }\n\n const config: object = { vars: {}, layout: DEFAULT_LAYOUT, skip: [], variants, only };\n mkdirSync(join(root, OVERRIDES_DIR), { recursive: true });\n mkdirSync(join(root, CONFIG_PATH, '..'), { recursive: true });\n writeFileSync(path, `${JSON.stringify(config, null, 4)}\\n`, 'utf8');\n\n // Значения, которых пакет ждёт от дерева, называются здесь, а не отказом раскладки: узнать\n // о них на первом же `sync` значит начать установку с ошибки, притом что список известен\n // сразу — он вычитывается из текстов выбранных ресурсов.\n const wanted: readonly string[] = assetsDir ? placeholdersIn(readConfig(root), assetsDir) : [];\n\n return {\n code: 0,\n lines: [\n `заведён ${CONFIG_PATH}`,\n only.length ? `выбрано ресурсов: ${only.length}` : 'выбрано всё, что везёт пакет',\n ...Object.entries(variants).map(([axis, value]: [string, string]): string => `${axis}: ${value}`),\n `заведён ${OVERRIDES_DIR}/ — надстройки проекта кладутся сюда путём ресурса`,\n ...(wanted.length\n ? [\n `значения, которых ждут ресурсы, — впиши их в \\`vars\\` конфига: ${wanted.length}`,\n ...wanted.map((name: string): string => ` {{${name}}}`),\n ]\n : []),\n 'дальше: `agent-kit sync`, а своё дописывается в `.claude/rt-kit/gate-map.sh` и `project.sh`',\n ],\n };\n}\n\n/**\n * Долг, добавленный этой раскладкой: статьи разложенных правил, у которых в компаньонах дерева\n * нет адреса.\n *\n * Называется он здесь, а не отдельной сверкой, ровно потому, что через день его уже не отличить\n * от накопленного: сверка видит расхождение, но не знает, чьим обновлением оно приехало.\n */\nfunction debtLines(config: IConfig, root: string, assetsDir: string): readonly string[] {\n const found: IUnaddressed[] = [];\n for (const asset of collectAssets(config, assetsDir)) {\n if (asset.kind !== 'rules') {\n continue;\n }\n const path: string = join(root, companionPathOf(asset));\n const existing: string | null = existsSync(path) ? readFileSync(path, 'utf8') : null;\n found.push(unaddressedOf(asset.name, mergedBody(asset, root), existing));\n }\n\n const line: string | null = debtLine(found);\n return line === null ? [] : [line, 'адрес статье дописывается в компаньоне рядом с правилом'];\n}\n\n/**\n * Отказ на устаревшей сборке. Раскладка из неё положила бы прежнюю редакцию ресурса и назвала\n * это сделанным: неправда дороже отказа — её замечают, когда правленое правило не действует.\n */\nconst staleRefusal: (stale: IStaleBuild) => IOutcomeOfCommand = (stale: IStaleBuild): IOutcomeOfCommand => ({\n code: 1,\n lines: [\n 'раскладка не начата: строка запуска читает собранное, а ресурсы правлены позже',\n ` правлено: ${stale.newest}`,\n ` исходные ресурсы: ${stale.source}`,\n ' собери пакет и повтори',\n ],\n});\n\n/**\n * Отказ, случившийся до первой записи на диск. Пусто — раскладке ничто не мешает.\n *\n * Ось без ответа отбивает раскладку целиком, а не пропускает свои ресурсы молча: правило\n * поставки бывает в трёх видах, и дерево, не назвавшее свой, осталось бы вовсе без правила\n * поставки — заметить это можно было бы только по тому, что гейт перестал его требовать.\n *\n * Незнакомое свойство — опечатка, и молчать о ней нельзя ни с одной стороны. У дерева она\n * означает, что помеченного им ресурса оно не получит вовсе; у ресурса — что он не ляжет\n * никуда и никогда, а причину в имени файла не разглядеть.\n */\n/**\n * Редакция пакета, объявленная деревом: точный номер из его зависимостей либо пусто.\n *\n * Диапазон сюда не идёт вовсе. Правило зависимостей велит называть точный номер, но дерево\n * вправе объявить иначе, и отказ по диапазону отбивал бы законную раскладку: `^0.19.0` покрывает\n * и 0.19.3, и обе редакции при этом объявлены верно.\n */\nfunction askedVersionOf(root: string, name: string): string | null {\n const path: string = join(root, 'package.json');\n\n if (!existsSync(path)) {\n return null;\n }\n\n const manifest: string = readFileSync(path, 'utf8');\n\n let parsed: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n\n try {\n parsed = JSON.parse(manifest) as { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n } catch {\n return null;\n }\n\n const asked: string = parsed.dependencies?.[name] ?? parsed.devDependencies?.[name] ?? '';\n\n return /^\\d+\\.\\d+\\.\\d+$/.test(asked) ? asked : null;\n}\n\n/**\n * Отказ на расхождение редакций: раскладка кладёт установленную, а не объявленную деревом.\n *\n * Зачем отказ, а не предупреждение. Установленной остаётся редакция соседней ветки — той, где её\n * как раз поднимали, — и раскладка ложится ею целиком: в рабочем дереве оказывается две с лишним\n * сотни правленых файлов чужой работы, а разобрать, какие из них свои, стоит получаса и риска\n * потерять свою правку вместе с ними. Обратный случай тот же по цене: раскладка прежней редакцией\n * откатывает дерево назад, и тоже молча. Успешный выход у обеих редакций одинаковый, а перечень\n * положенных файлов называет файлы, а не редакцию, которой они собраны.\n *\n * Починка дешевле разбора: поставить зависимости и повторить вызов — одна команда.\n */\nfunction versionRefusal(env: IEnvironment): IOutcomeOfCommand | null {\n if (!env.name) {\n return null;\n }\n\n const asked: string | null = askedVersionOf(env.root, env.name);\n\n if (!asked || asked === env.version) {\n return null;\n }\n\n return {\n code: 1,\n lines: [\n 'раскладка не начата: установленная редакция не та, что объявило дерево',\n ` объявлено деревом: ${asked}`,\n ` установлено: ${env.version}`,\n 'раскладка легла бы установленной — целиком, и успешный выход у обеих редакций одинаковый',\n 'поставь зависимости дерева и повтори вызов',\n ],\n };\n}\n\nfunction refusalBeforeSync(env: IEnvironment, config: IConfig): IOutcomeOfCommand | null {\n if (env.stale) {\n return staleRefusal(env.stale);\n }\n\n const mismatch: IOutcomeOfCommand | null = versionRefusal(env);\n if (mismatch) {\n return mismatch;\n }\n\n const unanswered: readonly IAxis[] = unansweredAxes(readAxes(env.assetsDir), config.variants);\n if (unanswered.length) {\n return { code: 1, lines: ['раскладка не начата: не выбран вид', ...axisLines(unanswered)] };\n }\n\n const strange: readonly string[] = strangeTraits(config, env.assetsDir);\n if (strange.length) {\n return { code: 1, lines: ['раскладка не начата: свойство дерева не объявлено пакетом', ...strange] };\n }\n\n return null;\n}\n\n/** Ответ `sync --check`: расхождения считаются, на диск не пишется ничего. */\nfunction syncCheck(config: IConfig, root: string, version: string, assetsDir: string): IOutcomeOfCommand {\n {\n const result: ISyncResult = planSync(config, root, version, assetsDir);\n const pending: readonly IPlanned[] = pendingOf(result);\n // Незаполненный компаньон — такое же расхождение, как отставший файл: правило разложено,\n // а имён этого дерева при нём нет, и агент читает указание, которому некуда примениться.\n const empty: readonly ICompanion[] = unfilled(result);\n // Гард, которого не зовёт настройка агента, — такое же расхождение, как отставший файл:\n // он разложен, он коммитится, и по дереву его не отличить от работающего.\n // Разорванная связь в счёт расхождений не идёт: дерево вправе закрыть требование своим\n // средством, и отказ отбивал бы законную раскладку. Но и сходство её не отменяет —\n // предупреждение печатается и там, где расходиться больше нечему.\n //\n // Гард, подписанный не на то, что объявляет, идёт в счёт по той же причине и с большим\n // основанием: неподключённый хотя бы не притворяется — этот выглядит работающим, и ветка\n // его тела, ради которой всё писалось, не исполняется ни разу.\n const count: number =\n result.missing.size + result.gaps.length + pending.length + empty.length + result.unbound.length + result.drifted.length;\n if (!count) {\n return { code: 0, lines: [`sync --check: разложенное сходится с пакетом v${version}`, ...warnings(result)] };\n }\n\n return { code: 1, lines: [`sync --check: расхождений ${count}`, ...describe(result)] };\n }\n}\n\nexport function sync(env: IEnvironment, check: boolean): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n const refusal: IOutcomeOfCommand | null = refusalBeforeSync(env, config);\n if (refusal) {\n return refusal;\n }\n\n if (check) {\n return syncCheck(config, root, version, assetsDir);\n }\n\n const result: ISyncResult = runSync(config, root, version, assetsDir);\n // Перечисляются только дырки: раскладка не начата, и назвать файл «положенным» значило бы\n // сказать неправду — на диске его нет.\n if (result.missing.size) {\n return { code: 1, lines: ['раскладка не начата: нечего подставить в дырки', ...holes(result)] };\n }\n\n // Ресурс без вида под выбор дерева отбивает раскладку целиком, а не выпадает из неё молча:\n // правило, разложенное без инструмента, который оно зовёт, читается как действующее.\n if (result.gaps.length) {\n return {\n code: 1,\n lines: ['раскладка не начата: у этих ресурсов нет вида под выбор дерева', ...gapLines(result)],\n };\n }\n\n const refused: readonly IPlanned[] = result.planned.filter((entry: IPlanned): boolean => isRefusal(entry.outcome));\n if (refused.length) {\n return {\n code: 1,\n lines: [\n 'раскладка не начата: эти файлы пакет переписывать не станет',\n ...refused.map((entry: IPlanned): string => ` ${entry.path} — ${DONE_WORD[entry.outcome]}`),\n 'правку надо либо перенести в надстройку, либо снять — и повторить',\n `положенное не пакетом отдаётся ему командой \\`agent-kit adopt\\`: прежнее содержимое ляжет рядом с пометкой \\`${KEPT_SUFFIX}\\``,\n ],\n };\n }\n\n // Раскладка удалась, и объявление легло вместе с файлами. Остаётся оно неположенным ровно\n // там, где настройку не разобрать: комментарии дерева пакет не сносит своим разбором, и\n // тогда печатается прежний готовый кусок. Код возврата в обоих случаях нулевой — файлы\n // легли, — но молчать нельзя: узнают иначе, когда что-нибудь пройдёт мимо гарда.\n return {\n code: 0,\n lines: [\n ...(result.written.length\n ? [`разложено файлов: ${result.written.length}`, ...result.written.map((path: string): string => ` ${path}`)]\n : ['всё уже разложено']),\n ...boundLines(result),\n ...(result.bound?.unreadable === false ? [] : unboundLines(result)),\n ...driftedLines(result),\n ...debtLines(config, root, assetsDir),\n ...warnings(result),\n ],\n };\n}\n\n/**\n * Отдать пакету файл, который лежит в дереве не от него.\n *\n * Пока команды не было, `sync` отказывал на такой файл поимённо и предлагал «перенести правку в\n * надстройку или снять» — то есть работу, которую делают руками, и до неё же сводилась вся\n * установка в живое дерево. При этом один чужой файл останавливал раскладку целиком.\n *\n * Молчаливой перезаписи здесь нет и быть не может: в файле лежит то, чего в дереве больше нигде\n * нет. Поэтому переход — это переименование прежнего содержимого рядом и повторный `sync`:\n * пакет кладёт своё, а прежнее остаётся на диске под именем с пометкой и ждёт разбора.\n */\nexport function adopt(env: IEnvironment, names: readonly string[]): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n const foreign: readonly IPlanned[] = planSync(config, root, version, assetsDir).planned.filter(\n (entry: IPlanned): boolean => entry.outcome === 'foreign'\n );\n if (!foreign.length) {\n return { code: 0, lines: ['чужих файлов на путях пакета нет'] };\n }\n\n // Имена принимаются как их печатает `sync`: путём в дереве. Без имён отдаются все — на\n // свежей установке их бывает столько же, сколько ресурсов, и перечислять их руками значит\n // делать ту же работу, ради которой команда заведена.\n const wanted: readonly IPlanned[] = names.length\n ? foreign.filter((entry: IPlanned): boolean => names.some((name: string): boolean => entry.path.endsWith(name)))\n : foreign;\n if (!wanted.length) {\n return {\n code: 1,\n lines: ['ни одно имя не отвечает чужому файлу; чужие сейчас такие:', ...foreign.map((e: IPlanned): string => ` ${e.path}`)],\n };\n }\n\n const moved: string[] = [];\n const blocked: string[] = [];\n for (const entry of wanted) {\n const path: string = join(root, entry.path);\n const kept: string = `${path}${KEPT_SUFFIX}`;\n if (existsSync(kept)) {\n blocked.push(` ${entry.path}${KEPT_SUFFIX} — уже лежит, разбери его прежде`);\n continue;\n }\n renameSync(path, kept);\n moved.push(` ${entry.path} → ${entry.path}${KEPT_SUFFIX}`);\n }\n\n return {\n code: blocked.length ? 1 : 0,\n lines: [\n ...(moved.length ? [`прежнее содержимое отложено: ${moved.length}`, ...moved, 'дальше: `agent-kit sync`'] : []),\n ...(blocked.length ? ['не тронуто:', ...blocked] : []),\n ],\n };\n}\n\n/**\n * Сколько незагруженных правил называется поимённо. На коротком отрезке их бывает больше\n * тридцати, и список во весь экран прячет всё остальное, ради чего сводку и открыли.\n */\nconst UNUSED_SHOWN: number = 12;\n\n/** Чем сводка отвечает: отрезок в днях, сегодняшний день и вид вывода. */\nexport interface IStatsOptions {\n readonly days: number;\n /** Сегодняшний день, `ГГГГ-ММ-ДД`. Приходит с края: команду со своими часами не проверить. */\n readonly today: string;\n readonly json: boolean;\n}\n\n/** Столбиком: имя и счёт. Ширина по самому длинному имени — иначе счёт читается по одному. */\nconst countLines: (counted: readonly ICount[]) => string[] = (counted: readonly ICount[]): string[] => {\n const width: number = counted.reduce((found: number, entry: ICount): number => Math.max(found, entry.name.length), 0);\n\n return counted.map((entry: ICount): string => ` ${entry.name.padEnd(width)} ${entry.count}`);\n};\n\n/**\n * Вес разложенных правил на диске: имя правила в сумму байт его текстов.\n *\n * Считается здесь, а не в сводке: сводка разбирает наблюдения и диска не знает. Складываются все\n * `.md` папки правила — само правило, компаньон с именами дерева и всё, что дерево положило\n * рядом: загрузка правила тянет их не поодиночке, и раздельный счёт врал бы в меньшую сторону.\n *\n * Правило, которого в дереве нет, в карту не попадает вовсе. Ноль от него неотличим по числу, но\n * отличим по смыслу: не «ничего не весит», а «весить нечему».\n */\nfunction weightsOfSkills(root: string, dir: string, names: readonly string[]): TWeights {\n const at: string = join(root, dir);\n const found: Record<string, number> = {};\n\n for (const name of names) {\n const folder: string = join(at, name);\n\n if (!existsSync(folder)) {\n continue;\n }\n\n found[name] = readdirSync(folder)\n .filter((file: string): boolean => file.endsWith('.md'))\n .reduce((sum: number, file: string): number => sum + statSync(join(folder, file)).size, 0);\n }\n\n return found;\n}\n\n/** Байты человеку: килобайтами, потому что счёт идёт на сотни тысяч и читается по одному. */\nfunction kbOf(bytes: number): string {\n return `${Math.round(bytes / 1024)} КБ`;\n}\n\n/**\n * Строка о том, сколько отбитий пришло не на правку файла.\n *\n * Своей строкой, а не долей, выведенной читателем из разбивки по родам: гейт стоит ради правки, и\n * доля, пришедшая на команду оболочки и на браузер, говорит, сколько раз правило потребовали под\n * то, что правкой не является. Сложенная глазами из десятка строк, эта доля не складывается\n * никогда.\n *\n * Молчит, когда отбитий не было вовсе: «0 процентов» при нуле отбитий — ответ на незаданный\n * вопрос.\n */\nfunction offFileLines(summary: ISummary): string[] {\n const total: number = summary.denials.reduce((found: number, entry: ICount): number => found + entry.count, 0);\n\n if (total === 0) {\n return [];\n }\n\n return [` не на правке файла: ${summary.denialsOffFile} из ${total} — ${Math.round((summary.denialsOffFile / total) * 100)}%`];\n}\n\n/** Сводка строками: загруженное, незагруженное, отбивки гейта и отказы гардов. */\nfunction statsLines(summary: ISummary, swept: readonly string[], days: number, version: string, laidOut: number): string[] {\n return [\n `наблюдения за ${days} дн., заходов ${summary.sessions}, событий ${summary.total}`,\n ...(summary.versions.length ? [`версии пакета в записях: ${summary.versions.join(', ')}`] : []),\n '',\n `правил загружено: ${summary.loads.reduce((found: number, entry: ICount): number => found + entry.count, 0)}`,\n // Вес молчит, когда весить нечем: каталог правил не разложен или пуст. Ноль килобайт при\n // сотне загрузок читался бы как «правила ничего не стоят», а это не то же самое.\n ...(summary.bytes > 0\n ? [\n ` весом ${kbOf(summary.bytes)}, на один заход ${kbOf(summary.bytesPerSession)}`,\n ' — столько текста заход прочитал прежде, чем взяться за работу',\n ]\n : []),\n ...countLines(summary.loads),\n ...(summary.unused.length\n ? [\n '',\n `разложено и не загружено ни разу: ${summary.unused.length} из ${laidOut}`,\n ...summary.unused.slice(0, UNUSED_SHOWN).map((name: string): string => ` ${name}`),\n // Список говорится не весь, и об этом говорится вслух: молчаливый обрыв\n // читается как «вот они все», и правило, не попавшее в первую дюжину,\n // считалось бы работающим.\n ...(summary.unused.length > UNUSED_SHOWN\n ? [` … и ещё ${summary.unused.length - UNUSED_SHOWN} — целиком в \\`--json\\``]\n : []),\n ]\n : []),\n ...(summary.denials.length\n ? [\n '',\n `гейт отбивал: ${summary.denials.reduce((found: number, entry: ICount): number => found + entry.count, 0)}`,\n ...offFileLines(summary),\n ...countLines(summary.denials),\n ...(summary.kinds.length\n ? [' по роду правки:', ...countLines(summary.kinds).map((line: string): string => ` ${line}`)]\n : []),\n ]\n : []),\n ...(summary.guards.length\n ? [\n '',\n `гарды отказывали: ${summary.guards.reduce((found: number, entry: ICount): number => found + entry.count, 0)}`,\n ...countLines(summary.guards),\n ]\n : []),\n ...(swept.length ? ['', `снято по сроку хранения (${KEEP_DAYS} дн.): ${swept.length}`] : []),\n '',\n `пакет v${version}`,\n ];\n}\n\n/**\n * Сводка наблюдений за отрезок дней.\n *\n * Отдельная строка про незагруженное — то, ради чего сводка вообще нужна: чем пользуются, видно\n * и по работе, а вот правило, которое не открыли ни разу, ничем себя не выдаёт. Сокращать текст\n * правил так же ценно, как дополнять.\n */\nexport function stats(env: IEnvironment, options: IStatsOptions): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n // Выключенная запись — не пустая сводка: нули на месте наблюдений читаются как «ничего не\n // делали», тогда как на самом деле никто и не смотрел.\n if (!config.observe) {\n return {\n code: 0,\n lines: [\n 'запись наблюдений выключена ключом `observe` в конфиге',\n `включить — убрать ключ или поставить \\`\"observe\": true\\`; пишутся они в ${OBSERVATIONS_DIR}/`,\n ],\n };\n }\n\n const days: number = options.days > 0 ? options.days : DEFAULT_DAYS;\n const result: IReadResult = readObservations(root, options.today, days);\n const known: readonly string[] = laidOutSkills(config, assetsDir);\n // Вес спрашивается у дерева, а не у пакета: правило дерево могло переписать надстройкой, и\n // заход читал то, что лежит здесь, а не то, что уехало бы из пакета.\n const summary: ISummary = summarize(result.observations, known, days, weightsOfSkills(root, config.layout.rules, known));\n\n if (options.json) {\n return { code: 0, lines: [JSON.stringify({ ...summary, swept: result.swept })] };\n }\n\n if (result.silent) {\n return {\n code: 0,\n lines: [\n 'наблюдений нет: записи не велось ни разу',\n `их пишут гарды в ${OBSERVATIONS_DIR}/ — проверь, что гарды разложены и подключены в ${SETTINGS_PATH}`,\n ],\n };\n }\n\n if (!summary.total) {\n return {\n code: 0,\n lines: [\n `наблюдений за ${days} дн. нет ни одного, а записи велись раньше`,\n ...(result.swept.length ? [`снято по сроку хранения (${KEEP_DAYS} дн.): ${result.swept.length}`] : []),\n 'возьми отрезок длиннее: `--days 14`',\n ],\n };\n }\n\n return {\n code: 0,\n lines: statsLines(summary, result.swept, days, version, laidOutSkills(config, assetsDir).length),\n };\n}\n\n/**\n * Разделы пакета, замещённые надстройками дерева.\n *\n * Совпавший заголовок замещает раздел целиком, и всё, что пакет дописал в такой раздел новой\n * версией, пропадает молча: раскладка сходится, заголовки совпадают, а утверждений нет. Сверка\n * заголовков ловит переименование раздела, а не пополнение, и других свидетелей у потери не\n * бывает. Разбор состояния поэтому называет замещённое поимённо — это половина ответа, которую\n * машина знает и без прежней редакции; вторую половину даёт снимок, снятый до установки.\n */\nfunction replacedLines(config: IConfig, assetsDir: string, root: string): readonly string[] {\n const replaced: readonly ICargoOverride[] = treeSnapshot(config, assetsDir, root).filter(\n (one: ICargoOverride): boolean => one.kind === 'replace'\n );\n\n if (replaced.length === 0) {\n return [];\n }\n\n return [\n `замещено надстройками разделов: ${replaced.length} — что пакет дописал в них новой версией, теряется молча`,\n ...replaced.map((one: ICargoOverride): string => ` ${one.resource} · ${one.section}`),\n ];\n}\n\nexport function doctor(env: IEnvironment): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n const result: ISyncResult = planSync(config, root, version, assetsDir);\n const counted: Map<TOutcome, number> = new Map();\n for (const entry of result.planned) {\n counted.set(entry.outcome, (counted.get(entry.outcome) ?? 0) + 1);\n }\n\n const catalog: readonly IEntryOfCatalog[] = readCatalog(assetsDir);\n const taken: number = collectAssets(config, assetsDir).length;\n const unanswered: readonly IAxis[] = unansweredAxes(readAxes(assetsDir), config.variants);\n const chosen: string[] = Object.entries(config.variants).map(([axis, value]: [string, string]): string => `${axis}: ${value}`);\n // Ресурс чужого вида в «не выбрано» не идёт: проект от него не отказывался — его в этом\n // дереве не существует, как не существует второго правила поставки.\n const foreignVariant: readonly IEntryOfCatalog[] = catalog.filter(\n (entry: IEntryOfCatalog): boolean => entry.variant !== null && config.variants[entry.variant.axis] !== entry.variant.value\n );\n const other: number = foreignVariant.length;\n // Ресурс, названный и в отказе, и чужим видом, считается один раз — иначе «не выбрано»\n // уходит в минус, а минус в отчёте читается как поломка счёта, а не как двойной счёт.\n const skipped: number = config.skip.filter((id: string): boolean =>\n foreignVariant.every((entry: IEntryOfCatalog): boolean => entry.id !== id)\n ).length;\n\n // Снятое каскадом считается и называется отдельно от невыбранного: дерево его не выбирало и\n // не отвергало — оно ушло вслед за родителем, и искать его в отказе читатель пойдёт зря.\n const cuts: readonly ICascadeCut[] = cascadeCuts(catalog, config);\n const cut: ReadonlySet<string> = new Set(cuts.map((one: ICascadeCut): string => one.id));\n\n // Ресурс с неотвеченным требованием в «не выбрано» не идёт по той же причине, что и чужой\n // вид: дерево его не отвергало — свойства, без которого он бессмыслен, у него просто нет.\n const needing: readonly IEntryOfCatalog[] = catalog.filter(\n (entry: IEntryOfCatalog): boolean =>\n entry.needs !== null && !answersRequirement(entry.needs, config.has) && !config.skip.includes(entry.id)\n );\n const needsTrait: number = needing.length;\n\n // Невыбранное называется поимённо: число «не выбрано: 73» не отвечает ни на один вопрос,\n // ради которого его читают, — ни какого ресурса не хватает, ни требуется ли он соседу.\n const unchosen: readonly IEntryOfCatalog[] = catalog.filter(\n (entry: IEntryOfCatalog): boolean =>\n !isChosen(entry, config) &&\n !config.skip.includes(entry.id) &&\n foreignVariant.every((one: IEntryOfCatalog): boolean => one.id !== entry.id) &&\n needing.every((one: IEntryOfCatalog): boolean => one.id !== entry.id)\n );\n\n const lines: string[] = [\n `пакет v${version}, везёт ресурсов ${catalog.length}, взято ${taken}`,\n `не выбрано: ${catalog.length - taken - skipped - other - cut.size - needsTrait}, пропущено: ${skipped}, другой вид: ${other}, снято каскадом: ${cut.size}, нужно свойство: ${needsTrait}`,\n ...unchosen.map((entry: IEntryOfCatalog): string => ` не выбран: ${entry.id}`),\n ...needing.map((entry: IEntryOfCatalog): string => ` нужно свойство «${entry.needs}»: ${entry.id}`),\n ...cuts.map((one: ICascadeCut): string => {\n const root: string = one.parent === one.root ? '' : ', отвергнут ' + one.root;\n\n return ` снят каскадом: ${one.id} — вслед за ${one.parent}${root}`;\n }),\n ...profileLines(root, assetsDir, config),\n ...localValueLines(root, assetsDir, config),\n ...replacedLines(config, assetsDir, root),\n ...thresholdLines(root),\n `значений в конфиге: ${Object.keys(config.vars).length}`,\n ...chosen,\n ...[...counted].map(([outcome, count]: [TOutcome, number]): string => `${STATE_WORD[outcome]}: ${count}`),\n ...describe(result),\n ...(unanswered.length ? ['не выбран вид — раскладка не начнётся:', ...axisLines(unanswered)] : []),\n // Про устаревшую сборку `doctor` говорит, но отказом её не считает: он ничего не пишет,\n // и прочитать состояние дерева можно и из вчерашней сборки — знать бы, что она вчерашняя.\n ...(env.stale ? ['собранное отстало от исходников — раскладка откажет:', ` правлено: ${env.stale.newest}`] : []),\n ];\n\n return { code: 0, lines };\n}\n\n/**\n * Что пакет везёт и что из этого взято здесь.\n *\n * Работает и без конфига: посмотреть, из чего выбирать, нужно раньше, чем выбор сделан, — иначе\n * имена законов взять неоткуда, кроме исходников пакета.\n */\nexport function list(env: IEnvironment): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n const catalog: readonly IEntryOfCatalog[] = readCatalog(assetsDir);\n const planned: Map<string, TOutcome> = new Map();\n const cutByCascade: ReadonlySet<string> = new Set(config ? cascadeCuts(catalog, config).map((one: ICascadeCut): string => one.id) : []);\n\n if (config) {\n for (const entry of planSync(config, root, version, assetsDir).planned) {\n planned.set(entry.asset, entry.outcome);\n }\n }\n\n const stateOf: (entry: IEntryOfCatalog) => string = (entry: IEntryOfCatalog): string => {\n if (!config) {\n return 'везёт пакет';\n }\n if (entry.variant && config.variants[entry.variant.axis] !== entry.variant.value) {\n return OTHER_VARIANT;\n }\n if (config.skip.includes(entry.id)) {\n return SKIPPED;\n }\n // Неотвеченное требование — не отказ дерева: оно этого ресурса не выбирало и не\n // отвергало, а свойства, без которого ресурс бессмыслен, у него просто нет.\n if (entry.needs !== null && !answersRequirement(entry.needs, config.has)) {\n return `${NEEDS_TRAIT}: ${entry.needs}`;\n }\n if (!isChosen(entry, config)) {\n return NOT_CHOSEN;\n }\n if (cutByCascade.has(entry.id)) {\n return CUT_BY_CASCADE;\n }\n const outcome: TOutcome | undefined = planned.get(entry.id);\n\n // Ресурса нет среди запланированных ровно в одном случае: в нём осталась дырка без\n // значения, и до решения о судьбе файла раскладка не дошла.\n return outcome ? STATE_WORD[outcome] : 'дырка без значения';\n };\n\n const name: number = catalog.reduce((found: number, entry: IEntryOfCatalog): number => Math.max(found, entry.name.length), 0);\n const state: number = catalog.reduce((found: number, entry: IEntryOfCatalog): number => Math.max(found, stateOf(entry).length), 0);\n const lines: string[] = [config ? `пакет v${version}` : `пакет v${version}, ${CONFIG_PATH} ещё не заведён`];\n\n for (const kind of KINDS) {\n const entries: readonly IEntryOfCatalog[] = catalog.filter((entry: IEntryOfCatalog): boolean => entry.kind === kind);\n if (!entries.length) {\n continue;\n }\n lines.push('', KIND_TITLE[kind]);\n lines.push(\n ...entries.map(\n (entry: IEntryOfCatalog): string => ` ${entry.name.padEnd(name)} ${stateOf(entry).padEnd(state)} ${entry.title}`\n )\n );\n }\n\n return { code: 0, lines };\n}\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/commands.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines -- файл делится задачей RT-849 */\n/**\n * Команды и их вывод. Печать отделена от работы: команда возвращает строки и код возврата,\n * а `process.exit` зовёт только точка входа — иначе ни одну из них нельзя было бы проверить\n * спекой, не перехватывая поток вывода.\n */\nimport { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { IAsset, collectAssets } from './assets.js';\nimport { ICargoOverride } from './cargo.js';\nimport { cascadeCuts, ICascadeCut, IIdleSkip } from './cascade.js';\nimport { IBrokenLink, IEntryOfCatalog, IGapOfVariant, isChosen, readCatalog } from './catalog.js';\nimport { debtLine, ICompanion, isUnfilled, IUnaddressed, pathOf as companionPathOf, TCompanionState, unaddressedOf } from './companion.js';\nimport { CONFIG_PATH, DEFAULT_LAYOUT, IConfig, KINDS, OVERRIDES_DIR, PROFILE_FILE, readConfig, RT_KIT_DIR, TKind } from './config.js';\nimport { IStaleBuild } from './freshness.js';\nimport { hooksSection, IHookBinding, IMatcherDrift, SETTINGS_PATH } from './hooks-map.js';\nimport {\n DEFAULT_DAYS,\n ICount,\n IReadResult,\n ISummary,\n KEEP_DAYS,\n OBSERVATIONS_DIR,\n readObservations,\n summarize,\n TWeights,\n} from './observations.js';\nimport { IPlanned, isRefusal, TOutcome } from './plan.js';\nimport { laidOutSkills, treeSnapshot } from './snapshot.js';\nimport { ICutFound, IRetiredFound, ISyncResult, mergedBody, pendingOf, planSync, runSync } from './sync.js';\nimport { thresholdLines } from './thresholds.js';\nimport { answersRequirement, ITrait, readTraits, unknownTraits } from './traits.js';\nimport { placeholdersOf } from './vars.js';\nimport { IAxis, IOptionOfAxis, readAxes, unansweredAxes } from './variants.js';\nimport { byText } from './order.js';\n\nexport interface IOutcomeOfCommand {\n readonly code: number;\n readonly lines: readonly string[];\n}\n\n/** Всё, что команда знает о мире: корень проекта, версия пакета и его каталог ресурсов. */\nexport interface IEnvironment {\n readonly root: string;\n readonly version: string;\n readonly assetsDir: string;\n /**\n * Ресурсы правлены позже, чем собран пакет, из которого идёт раскладка; `null` — сверять не с\n * чем. Считается на краю, где пакет знает своё расположение: библиотечные модули работают с\n * тем каталогом ресурсов, который им дали, и о существовании исходников не знают.\n */\n readonly stale?: IStaleBuild | null;\n /**\n * Имя пакета из его собственного манифеста. Нужно, чтобы найти себя в зависимостях дерева:\n * искать по угаданному имени значило бы промахнуться молча у всякого, кто пакет переименовал.\n */\n readonly name?: string;\n}\n\n/** Что с файлом сделала раскладка. Прошедшее время здесь правда: `sync` уже записал. */\nconst DONE_WORD: Readonly<Record<TOutcome, string>> = {\n create: 'положен',\n update: 'переложен',\n drift: 'правлен руками',\n foreign: 'положен не пакетом',\n ok: 'без изменений',\n};\n\n/**\n * Что с файлом **сейчас**. Отдельно от прошедшего времени потому, что `doctor` и `list` ничего\n * не пишут: сказать «положен» о файле, которого в дереве нет, значит соврать читателю ровно там,\n * где он пришёл узнать состояние.\n */\nconst STATE_WORD: Readonly<Record<TOutcome, string>> = {\n create: 'нет в дереве',\n update: 'отстал от пакета',\n drift: 'правлен руками',\n foreign: 'положен не пакетом',\n ok: 'на месте',\n};\n\nconst NOT_CHOSEN: string = 'не выбран';\n/** Перечень отделяет снятое каскадом от невыбранного: дерево его не выбирало и не отвергало. */\nconst CUT_BY_CASCADE: string = 'снят каскадом';\nconst SKIPPED: string = 'пропущен';\n/** Ресурс чужого вида: в этом дереве его не существует, а не «от него отказались». */\nconst OTHER_VARIANT: string = 'другой вид';\n/** Ресурс, которому нужно свойство дерева: дерево его не отвергало — свойства у него нет. */\nconst NEEDS_TRAIT: string = 'нужно свойство';\n\nconst KIND_TITLE: Readonly<Record<TKind, string>> = {\n laws: 'ЗАКОНЫ',\n rules: 'ПРАВИЛА',\n pitfalls: 'ХОЛОДНЫЕ ЧАСТИ',\n patterns: 'ПАТТЕРНЫ',\n skills: 'СКИЛЫ',\n hooks: 'ХУКИ',\n defaults: 'УМОЛЧАНИЯ',\n checks: 'ПРОВЕРКИ',\n agents: 'АГЕНТЫ',\n commands: 'КОМАНДЫ',\n workflows: 'ВОРКФЛОУ',\n templates: 'ШАБЛОНЫ',\n docs: 'ДОКУМЕНТЫ',\n samples: 'ОБРАЗЦЫ',\n};\n\n/** Состояние компаньона словами. У заполненного слова нет: о нём говорить нечего. */\nconst COMPANION_WORD: Readonly<Record<TCompanionState, string>> = {\n missing: 'пропал',\n draft: 'остался черновиком',\n filled: 'заполнен',\n};\n\nconst NO_CONFIG: string = `нет \\`${CONFIG_PATH}\\` — начни с \\`agent-kit init\\``;\n\n/** Куда уезжает прежнее содержимое файла, отданного пакету. */\nexport const KEPT_SUFFIX: string = '.before-rt-kit';\n\n/**\n * Имя функции профиля, которую хук ждёт. Обе формы: голая проверка наличия и спрос через\n * помощника, который о нехватке говорит вслух. Считать одну значило бы недосчитаться ровно тех\n * хуков, которые перешли на второе.\n */\nconst PROFILE_CALL: RegExp = /(?:command -v|rt_needs)[ \\t]+(rt_[a-z_]+)/g;\n\n/** Сам помощник функцией профиля не является: его везёт пакет, а не дерево. */\nconst PROFILE_HELPER: string = 'rt_needs';\n\n/**\n * Объявление функции: `rt_is_app_code() {`. Не с начала строки — хук объявляет запасной вариант\n * прямо в условии, и не считать его объявлением значило бы звать недостающим то, что у хука\n * есть.\n */\nconst PROFILE_DEFINE: RegExp = /(rt_[a-z_]+)\\s*\\(\\)\\s*\\{/g;\n\n/** Что взятые хуки зовут у профиля и что определяют сами. */\nfunction readHooks(assets: readonly IAsset[], wanted: Set<string>, defined: Set<string>): void {\n for (const asset of assets.filter((one: IAsset): boolean => one.kind === 'hooks')) {\n for (const found of asset.text.matchAll(PROFILE_CALL)) {\n if (found[1] !== PROFILE_HELPER) {\n wanted.add(found[1]);\n }\n }\n // Часть общих функций живёт не в профиле, а в соседнем хуке: запись наблюдения объявлена\n // в хуке наблюдений, и гарды зовут её через ту же проверку наличия. Не считать их\n // определёнными значило бы требовать от дерева переписать в профиль чужой код.\n for (const found of asset.text.matchAll(PROFILE_DEFINE)) {\n defined.add(found[1]);\n }\n }\n}\n\n/** Функции, определённые самим профилем: разложенным умолчанием пакета и надстройкой дерева. */\nfunction readProfiles(root: string, config: IConfig, defined: Set<string>): void {\n // Профиль собирается из тех же файлов, что читает сам хук: сперва разложенное умолчание\n // пакета, поверх — надстройка дерева. Судить по одной надстройке значило бы объявить мёртвым\n // каждый гард дерева, которое умолчаний не переписывало.\n const defaults: string = config.layout.defaults ?? DEFAULT_LAYOUT.defaults;\n const sources: readonly string[] = [join(root, defaults, PROFILE_FILE), join(root, RT_KIT_DIR, PROFILE_FILE)];\n\n for (const path of sources.filter((one: string): boolean => existsSync(one))) {\n for (const found of readFileSync(path, 'utf8').matchAll(PROFILE_DEFINE)) {\n defined.add(found[1]);\n }\n }\n}\n\n/**\n * Функции профиля, которых ждут взятые хуки, и те из них, что дерево не определило.\n *\n * Отдельной строкой в разборе состояния потому, что на месте вызова нехватка не видна вовсе:\n * хук выходит с нулём, стоит в настройке, виден в списке — и читается как работающий. Тишина\n * при этом означает разом «нечего проверять», «проверять нечем» и «всё в порядке».\n */\nfunction profileLines(root: string, assetsDir: string, config: IConfig): string[] {\n const wanted: Set<string> = new Set();\n const defined: Set<string> = new Set();\n\n readHooks([...collectAssets(config, assetsDir)], wanted, defined);\n\n if (!wanted.size) {\n return [];\n }\n\n readProfiles(root, config, defined);\n\n const absent: readonly string[] = [...wanted].filter((name: string): boolean => !defined.has(name)).sort(byText);\n\n return [\n `функции профиля, которых ждут взятые хуки: ${wanted.size}`,\n ...(absent.length\n ? [\n ...absent.map((name: string): string => ` нет функции ${name} — её определяют в ${join(RT_KIT_DIR, PROFILE_FILE)}`),\n ' хук без своей функции проверку не делает и действие пропускает',\n ]\n : [' все определены']),\n ];\n}\n\n/**\n * Местное значение, которым живёт хук: путь от корня дерева и то, что перестаёт проверяться без\n * него. Стоит строкой шапки, тем же приёмом, каким хук называет требуемые ресурсы.\n */\nconst LOCAL_VALUE: RegExp = /^# Местное значение: (\\S+) — ([^\\n]+)$/gm;\n\n/**\n * Местные значения, которых ждут взятые хуки, и те из них, которых в дереве нет.\n *\n * Считать их приходится отдельно от файлов и функций: разложенный хук с пустым значением лежит\n * на месте, зовётся и выходит нулём — сводка называет такое дерево настроенным, а проверять оно\n * перестало. Хук, отказывающий в пользу работы, тем и опасен: снаружи это выглядит исправной\n * работой.\n */\nfunction localValueLines(root: string, assetsDir: string, config: IConfig): string[] {\n const absent: string[] = [];\n let wanted: number = 0;\n\n for (const asset of collectAssets(config, assetsDir).filter((one: IAsset): boolean => one.kind === 'hooks')) {\n for (const [, path, loss] of asset.text.matchAll(LOCAL_VALUE)) {\n wanted += 1;\n if (!existsSync(join(root, path))) {\n absent.push(` нет значения ${path} — его ждёт ${asset.id}: ${loss.trim()}`);\n }\n }\n }\n\n if (!wanted) {\n return [];\n }\n\n return [\n `местные значения, которых ждут взятые хуки: ${wanted}`,\n ...(absent.length\n ? [...absent.sort(byText), ' хук без своего значения проверку не делает и действие пропускает']\n : [' все на месте']),\n ];\n}\n\n/** Дырка в тексте пакета, как она написана в самом тексте. */\nfunction holeOf(name: string): string {\n return `{{${name}}}`;\n}\n\nconst holes: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n [...result.missing].map(([asset, names]: [string, readonly string[]]): string => {\n const written: string = names.map(holeOf).join(', ');\n\n return ` ${asset}: нет значений для ${written}`;\n });\n\nconst unfilled: (result: ISyncResult) => readonly ICompanion[] = (result: ISyncResult): readonly ICompanion[] =>\n result.companions.filter(isUnfilled);\n\n/**\n * Строка про компаньон, которому нечего сказать.\n *\n * У правила, требующего свойства, которого дерево не назвало, это не черновик, а лишний файл:\n * заполнять его нечем — ни одной статье такого правила здесь не отвечает ни файл, ни символ.\n * Такое правило доезжает сюда только выбором поимённо, и верное действие тут обратное\n * заполнению — снять ресурс строкой отказа.\n */\nconst companionLine: (entry: ICompanion) => string = (entry: ICompanion): string =>\n entry.needs === null\n ? ` ${entry.path} — ${COMPANION_WORD[entry.state]}`\n : ` ${entry.path} — правилу нужно свойство «${entry.needs}»: заполнять нечем, снимай ресурс строкой в \\`skip\\``;\n\n/** Ось без ответа: чем её спрашивают и из чего выбирают. */\nconst axisLines: (axes: readonly IAxis[]) => string[] = (axes: readonly IAxis[]): string[] =>\n axes.flatMap((axis: IAxis): string[] => [\n ` ${axis.name} — ${axis.question}`,\n ...axis.options.map((option: IOptionOfAxis): string => ` ${option.value.padEnd(8)} ${option.title}`),\n ` выбор пишется в \\`variants\\` конфига: {\"${axis.name}\": \"${axis.options[0]?.value ?? ''}\"}`,\n ]);\n\n/**\n * Брошенное: файл лежит, а ресурс за ним больше не берут. Печатается отдельным списком и с\n * подсказкой — стереть его пакет не вправе, а промолчать не может: агент читает такой файл как\n * действующее правило.\n */\nconst abandonedLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.abandoned.length\n ? [\n `лежит от ресурсов, которые больше не берутся: ${result.abandoned.length}`,\n ...result.abandoned.map((path: string): string => ` ${path}`),\n ' их не стирает никто: рядом может лежать написанное проектом — убирать вручную',\n ]\n : [];\n\n/**\n * Ресурс, у которого нет вида под выбор дерева. Называется и то, чего не хватает, и оба способа\n * это снять: отказ без действия обходят, а не исполняют.\n */\nconst gapLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.gaps.flatMap((gap: IGapOfVariant): string[] => [\n ` ${gap.kind}/${gap.name} — есть только под ${gap.axis}: ${gap.available.join(', ')}, а выбран «${gap.chosen}»`,\n ` либо заведи вид под «${gap.chosen}», либо назови в skip: ${gap.ids.join(', ')}`,\n ]);\n\n/**\n * Свойства, названные не по перечню пакета, — и деревом, и ресурсами.\n *\n * Обе стороны собираются одной функцией, потому что промах у них общий: имя свойства написано\n * так, как его никто не объявлял. Разница только в том, где оно написано, и потому в строке\n * отказа стоит место, а не одно имя.\n */\nfunction strangeTraits(config: IConfig, assetsDir: string): readonly string[] {\n const traits: readonly ITrait[] = readTraits(assetsDir);\n const lines: string[] = unknownTraits(config.has, traits).map(\n (trait: string): string => ` \\`${trait}\\` — названо деревом в \\`has\\`, а пакет такого свойства не объявлял`\n );\n\n for (const entry of readCatalog(assetsDir)) {\n if (entry.needs !== null && unknownTraits([entry.needs], traits).length) {\n lines.push(` \\`${entry.needs}\\` — требует ${entry.id}, а пакет такого свойства не объявлял`);\n }\n }\n\n return lines.length ? [...lines, ` объявленные свойства: ${traits.map((trait: ITrait): string => trait.value).join(', ')}`] : [];\n}\n\n/**\n * Что запись объявления сделала с настройкой агента.\n *\n * Дописанное называется поимённо: правка легла в файл дерева, и увидеть её оно должно тем же\n * выводом, каким видит положенные файлы, — а не следующим просмотром истории.\n */\nconst boundLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] => {\n if (result.bound === null || (!result.bound.added.length && !result.bound.unreadable)) {\n return [];\n }\n\n return result.bound.unreadable\n ? [\n `\\`${SETTINGS_PATH}\\` не разбирается как JSON — записи в неё не делалось`,\n ' дерево вправе держать её по-своему, вплоть до комментариев; тогда запись идёт рукой',\n ]\n : [\n `в \\`${SETTINGS_PATH}\\` дописано событий: ${result.bound.added.length}`,\n ...result.bound.added.map((event: string): string => ` ${event} — зовёт диспетчер`),\n ];\n};\n\n/**\n * Гарды, которых нет в настройке агента, и готовый кусок для неё.\n *\n * Кусок печатается целиком, а не одними именами: правку в свою настройку делает проект, и\n * список «не хватает трёх» заставляет собирать JSON по памяти — там и теряется образец вызова.\n */\nconst unboundLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.unbound.length\n ? [\n `гарды разложены, но в \\`${SETTINGS_PATH}\\` их не зовёт никто: ${result.unbound.length}`,\n ...result.unbound.map((binding: IHookBinding): string => {\n const matcher: string = binding.matcher ? ' ' + binding.matcher : '';\n\n return ` ${binding.path} — ${binding.event}${matcher}`;\n }),\n ` вставь в \\`${SETTINGS_PATH}\\` раздел \\`hooks\\` — готовый кусок ниже:`,\n ...JSON.stringify({ hooks: hooksSection(result.unbound) }, null, 4)\n .split('\\n')\n .map((line: string): string => ` ${line}`),\n ]\n : [];\n\n/**\n * Гарды, подписанные не на то, что объявляют.\n *\n * Называются обе стороны: объявленное гардом и стоящее в настройке. Одной стороной такую строку\n * не починить — правится настройка, а верное значение лежит в гарде, и по разнице видно, что\n * именно до него не доходит.\n */\nconst driftedLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.drifted.length\n ? [\n `гарды подписаны не на то, что объявляют: ${result.drifted.length}`,\n ...result.drifted.flatMap((drift: IMatcherDrift): string[] => [\n ` ${drift.path} — ${drift.event}`,\n ` объявлено: ${drift.declared || '(без образца)'}`,\n ` в настройке: ${drift.bound || '(без образца)'}`,\n ]),\n ` поправь образец в \\`${SETTINGS_PATH}\\` по объявлению гарда: тело его разбирает то, что объявлено`,\n ]\n : [];\n\n/**\n * Разорванные связи между ресурсами.\n *\n * Печатается предупреждением и кода возврата не меняет: дерево вправе закрыть требование своим\n * средством. Но и молчать нельзя — дерево, выбравшее паттерн без хука, которым тот живёт,\n * выглядит исправным, а расходится с пакетом на целую волну работ.\n */\nconst brokenLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.broken.length\n ? [\n `требования ресурсов, оставшиеся без ответа: ${result.broken.length}`,\n ...result.broken.map(\n (link: IBrokenLink): string => ` ${link.id} — требует ${link.requires}: ${link.unknown ? 'нет в пакете' : NOT_CHOSEN}`\n ),\n ' это предупреждение, а не отказ: требование закрывается своим средством дерева либо выбором ресурса',\n ]\n : [];\n\n/**\n * Строки отказа, которые ничего не снимают.\n *\n * Названы вместе с тем, из-за чего стали лишними: «строка ни на что не влияет» без этого читается\n * как промах в имени, и дерево идёт искать опечатку там, где её нет.\n */\nconst idleLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.idle.length\n ? [\n `строк отказа, которые ничего не снимают: ${result.idle.length}`,\n ...result.idle.map((one: IIdleSkip): string => {\n const why: string = one.by ? 'снято отказом от ' + one.by : 'нет в пакете';\n\n return ` ${one.id} — ${why}`;\n }),\n ' это предупреждение, а не отказ: строки убирает дерево, и раскладка идёт дальше',\n ]\n : [];\n\n/**\n * Разложенное раньше, а теперь снятое каскадом.\n *\n * Отдельно от брошенного: от брошенного дерево отказалось само и знает, где искать причину, а\n * снятое каскадом ушло вслед за родителем — в отказе его имени нет и не будет.\n */\nconst cutOnDiskLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.cutOnDisk.length\n ? [\n `лежит от ресурсов, снятых вслед за родителем: ${result.cutOnDisk.length}`,\n ...result.cutOnDisk.map(\n (one: ICutFound): string => ` ${one.path} — снят вслед за ${one.cut.parent}, отвергнут ${one.cut.root}`\n ),\n ' их не стирает никто: убирать вручную, как и брошенные',\n ]\n : [];\n\n/**\n * Названное выбором, чего дерево всё равно не получит.\n *\n * Молчать здесь нельзя вдвойне: дерево не просто осталось без ресурса — оно попросило его\n * поимённо и прочло бы отсутствие как промах раскладки.\n */\nconst namedCutLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.namedCut.length\n ? [\n `названо выбором, но не приедет: ${result.namedCut.length}`,\n ...result.namedCut.map((one: ICascadeCut): string => ` ${one.id} — снято вслед за ${one.parent}, отвергнут ${one.root}`),\n ' это предупреждение, а не отказ: возьми родителя в выбор либо убери потомка из него',\n ]\n : [];\n\n/**\n * Файлы ресурсов, ушедших из набора.\n *\n * Названы отдельно от брошенных: брошенный ресурс в наборе есть и вернётся, если дерево его\n * выберет, а снятый не вернётся никогда — и правило, по которому агент работает, у него\n * последнее.\n */\nconst retiredLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.retired.length\n ? [\n `в дереве лежат файлы ресурсов, которых в пакете больше нет: ${result.retired.length}`,\n ...result.retired.map((one: IRetiredFound): string => ` ${one.path} — снят в v${one.since}: ${one.why}`),\n ' убирает их дерево: в чужие файлы пакет не пишет',\n ]\n : [];\n\n/**\n * Надстройка, которой в пакете ничего не отвечает: она не применена, и молчание об этом читается\n * как «всё применено».\n */\nconst strayLines: (result: ISyncResult) => string[] = (result: ISyncResult): string[] =>\n result.strayOverrides.length\n ? [\n `надстроек, не подобранных ни к одному ресурсу: ${result.strayOverrides.length}`,\n ...result.strayOverrides.map((id: string): string => ` ${join(OVERRIDES_DIR, id)} — применена не была`),\n ' подбор идёт по идентификатору ресурса целиком, вместе с приставкой свойства',\n ]\n : [];\n\n/**\n * Предупреждения раскладки: кода возврата они не меняют и печатаются на любом её исходе.\n *\n * Иначе их не видит никто: на сошедшемся дереве проверка молчит, а удавшаяся раскладка называет\n * положенные файлы — и лишняя строка отказа, снятый каскадом файл и ушедший из набора ресурс\n * всплывали бы только там, где и без них уже красно.\n */\nconst warnings: (result: ISyncResult) => string[] = (result: ISyncResult): string[] => [\n ...brokenLines(result),\n ...idleLines(result),\n ...namedCutLines(result),\n ...retiredLines(result),\n ...cutOnDiskLines(result),\n ...abandonedLines(result),\n ...strayLines(result),\n];\n\nconst describe: (result: ISyncResult) => string[] = (result: ISyncResult): string[] => [\n ...holes(result),\n ...gapLines(result),\n ...unboundLines(result),\n ...driftedLines(result),\n ...warnings(result),\n ...pendingOf(result).map((entry: IPlanned): string => ` ${entry.path} — ${STATE_WORD[entry.outcome]}`),\n ...unfilled(result).map(companionLine),\n];\n\n/** Имена дырок во всех ресурсах, которые дерево берёт. Без конфига — ни одной: выбор неизвестен. */\nfunction placeholdersIn(config: IConfig | null, assetsDir: string): readonly string[] {\n if (!config) {\n return [];\n }\n const names: string[] = [];\n for (const asset of collectAssets(config, assetsDir)) {\n for (const name of placeholdersOf(asset.text)) {\n if (!names.includes(name)) {\n names.push(name);\n }\n }\n }\n\n return names.sort(byText);\n}\n\n/**\n * Что проект выбрал при заведении конфига. Пустой список — весь набор; выбор приходит сюда\n * готовым, потому что взять его негде, кроме края: у строки запуска флаг, у терминала вопрос,\n * а у неинтерактивного прогона нет ни того ни другого — и решать это команде не по чину.\n */\nexport function init(\n root: string,\n only: readonly string[] = [],\n variants: Readonly<Record<string, string>> = {},\n assetsDir: string = ''\n): IOutcomeOfCommand {\n const path: string = join(root, CONFIG_PATH);\n if (existsSync(path)) {\n return { code: 0, lines: [`${CONFIG_PATH} уже есть — оставлен как есть`] };\n }\n\n const config: object = { vars: {}, layout: DEFAULT_LAYOUT, skip: [], variants, only };\n mkdirSync(join(root, OVERRIDES_DIR), { recursive: true });\n mkdirSync(join(root, CONFIG_PATH, '..'), { recursive: true });\n writeFileSync(path, `${JSON.stringify(config, null, 4)}\\n`, 'utf8');\n\n // Значения, которых пакет ждёт от дерева, называются здесь, а не отказом раскладки: узнать\n // о них на первом же `sync` значит начать установку с ошибки, притом что список известен\n // сразу — он вычитывается из текстов выбранных ресурсов.\n const wanted: readonly string[] = assetsDir ? placeholdersIn(readConfig(root), assetsDir) : [];\n\n return {\n code: 0,\n lines: [\n `заведён ${CONFIG_PATH}`,\n only.length ? `выбрано ресурсов: ${only.length}` : 'выбрано всё, что везёт пакет',\n ...Object.entries(variants).map(([axis, value]: [string, string]): string => `${axis}: ${value}`),\n `заведён ${OVERRIDES_DIR}/ — надстройки проекта кладутся сюда путём ресурса`,\n ...(wanted.length\n ? [\n `значения, которых ждут ресурсы, — впиши их в \\`vars\\` конфига: ${wanted.length}`,\n ...wanted.map((name: string): string => ` {{${name}}}`),\n ]\n : []),\n 'дальше: `agent-kit sync`, а своё дописывается в `.claude/rt-kit/gate-map.sh` и `project.sh`',\n ],\n };\n}\n\n/**\n * Долг, добавленный этой раскладкой: статьи разложенных правил, у которых в компаньонах дерева\n * нет адреса.\n *\n * Называется он здесь, а не отдельной сверкой, ровно потому, что через день его уже не отличить\n * от накопленного: сверка видит расхождение, но не знает, чьим обновлением оно приехало.\n */\nfunction debtLines(config: IConfig, root: string, assetsDir: string): readonly string[] {\n const found: IUnaddressed[] = [];\n for (const asset of collectAssets(config, assetsDir)) {\n if (asset.kind !== 'rules') {\n continue;\n }\n const path: string = join(root, companionPathOf(asset));\n const existing: string | null = existsSync(path) ? readFileSync(path, 'utf8') : null;\n found.push(unaddressedOf(asset.name, mergedBody(asset, root), existing));\n }\n\n const line: string | null = debtLine(found);\n return line === null ? [] : [line, 'адрес статье дописывается в компаньоне рядом с правилом'];\n}\n\n/**\n * Отказ на устаревшей сборке. Раскладка из неё положила бы прежнюю редакцию ресурса и назвала\n * это сделанным: неправда дороже отказа — её замечают, когда правленое правило не действует.\n */\nconst staleRefusal: (stale: IStaleBuild) => IOutcomeOfCommand = (stale: IStaleBuild): IOutcomeOfCommand => ({\n code: 1,\n lines: [\n 'раскладка не начата: строка запуска читает собранное, а ресурсы правлены позже',\n ` правлено: ${stale.newest}`,\n ` исходные ресурсы: ${stale.source}`,\n ' собери пакет и повтори',\n ],\n});\n\n/**\n * Отказ, случившийся до первой записи на диск. Пусто — раскладке ничто не мешает.\n *\n * Ось без ответа отбивает раскладку целиком, а не пропускает свои ресурсы молча: правило\n * поставки бывает в трёх видах, и дерево, не назвавшее свой, осталось бы вовсе без правила\n * поставки — заметить это можно было бы только по тому, что гейт перестал его требовать.\n *\n * Незнакомое свойство — опечатка, и молчать о ней нельзя ни с одной стороны. У дерева она\n * означает, что помеченного им ресурса оно не получит вовсе; у ресурса — что он не ляжет\n * никуда и никогда, а причину в имени файла не разглядеть.\n */\n/**\n * Редакция пакета, объявленная деревом: точный номер из его зависимостей либо пусто.\n *\n * Диапазон сюда не идёт вовсе. Правило зависимостей велит называть точный номер, но дерево\n * вправе объявить иначе, и отказ по диапазону отбивал бы законную раскладку: `^0.19.0` покрывает\n * и 0.19.3, и обе редакции при этом объявлены верно.\n */\nfunction askedVersionOf(root: string, name: string): string | null {\n const path: string = join(root, 'package.json');\n\n if (!existsSync(path)) {\n return null;\n }\n\n const manifest: string = readFileSync(path, 'utf8');\n\n let parsed: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n\n try {\n parsed = JSON.parse(manifest) as { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n } catch {\n return null;\n }\n\n const asked: string = parsed.dependencies?.[name] ?? parsed.devDependencies?.[name] ?? '';\n\n return /^\\d+\\.\\d+\\.\\d+$/.test(asked) ? asked : null;\n}\n\n/**\n * Отказ на расхождение редакций: раскладка кладёт установленную, а не объявленную деревом.\n *\n * Зачем отказ, а не предупреждение. Установленной остаётся редакция соседней ветки — той, где её\n * как раз поднимали, — и раскладка ложится ею целиком: в рабочем дереве оказывается две с лишним\n * сотни правленых файлов чужой работы, а разобрать, какие из них свои, стоит получаса и риска\n * потерять свою правку вместе с ними. Обратный случай тот же по цене: раскладка прежней редакцией\n * откатывает дерево назад, и тоже молча. Успешный выход у обеих редакций одинаковый, а перечень\n * положенных файлов называет файлы, а не редакцию, которой они собраны.\n *\n * Починка дешевле разбора: поставить зависимости и повторить вызов — одна команда.\n */\nfunction versionRefusal(env: IEnvironment): IOutcomeOfCommand | null {\n if (!env.name) {\n return null;\n }\n\n const asked: string | null = askedVersionOf(env.root, env.name);\n\n if (!asked || asked === env.version) {\n return null;\n }\n\n return {\n code: 1,\n lines: [\n 'раскладка не начата: установленная редакция не та, что объявило дерево',\n ` объявлено деревом: ${asked}`,\n ` установлено: ${env.version}`,\n 'раскладка легла бы установленной — целиком, и успешный выход у обеих редакций одинаковый',\n 'поставь зависимости дерева и повтори вызов',\n ],\n };\n}\n\nfunction refusalBeforeSync(env: IEnvironment, config: IConfig): IOutcomeOfCommand | null {\n if (env.stale) {\n return staleRefusal(env.stale);\n }\n\n const mismatch: IOutcomeOfCommand | null = versionRefusal(env);\n if (mismatch) {\n return mismatch;\n }\n\n const unanswered: readonly IAxis[] = unansweredAxes(readAxes(env.assetsDir), config.variants);\n if (unanswered.length) {\n return { code: 1, lines: ['раскладка не начата: не выбран вид', ...axisLines(unanswered)] };\n }\n\n const strange: readonly string[] = strangeTraits(config, env.assetsDir);\n if (strange.length) {\n return { code: 1, lines: ['раскладка не начата: свойство дерева не объявлено пакетом', ...strange] };\n }\n\n return null;\n}\n\n/** Ответ `sync --check`: расхождения считаются, на диск не пишется ничего. */\nfunction syncCheck(config: IConfig, root: string, version: string, assetsDir: string): IOutcomeOfCommand {\n {\n const result: ISyncResult = planSync(config, root, version, assetsDir);\n const pending: readonly IPlanned[] = pendingOf(result);\n // Незаполненный компаньон — такое же расхождение, как отставший файл: правило разложено,\n // а имён этого дерева при нём нет, и агент читает указание, которому некуда примениться.\n const empty: readonly ICompanion[] = unfilled(result);\n // Гард, которого не зовёт настройка агента, — такое же расхождение, как отставший файл:\n // он разложен, он коммитится, и по дереву его не отличить от работающего.\n // Разорванная связь в счёт расхождений не идёт: дерево вправе закрыть требование своим\n // средством, и отказ отбивал бы законную раскладку. Но и сходство её не отменяет —\n // предупреждение печатается и там, где расходиться больше нечему.\n //\n // Гард, подписанный не на то, что объявляет, идёт в счёт по той же причине и с большим\n // основанием: неподключённый хотя бы не притворяется — этот выглядит работающим, и ветка\n // его тела, ради которой всё писалось, не исполняется ни разу.\n const count: number =\n result.missing.size + result.gaps.length + pending.length + empty.length + result.unbound.length + result.drifted.length;\n if (!count) {\n return { code: 0, lines: [`sync --check: разложенное сходится с пакетом v${version}`, ...warnings(result)] };\n }\n\n return { code: 1, lines: [`sync --check: расхождений ${count}`, ...describe(result)] };\n }\n}\n\nexport function sync(env: IEnvironment, check: boolean): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n const refusal: IOutcomeOfCommand | null = refusalBeforeSync(env, config);\n if (refusal) {\n return refusal;\n }\n\n if (check) {\n return syncCheck(config, root, version, assetsDir);\n }\n\n const result: ISyncResult = runSync(config, root, version, assetsDir);\n // Перечисляются только дырки: раскладка не начата, и назвать файл «положенным» значило бы\n // сказать неправду — на диске его нет.\n if (result.missing.size) {\n return { code: 1, lines: ['раскладка не начата: нечего подставить в дырки', ...holes(result)] };\n }\n\n // Ресурс без вида под выбор дерева отбивает раскладку целиком, а не выпадает из неё молча:\n // правило, разложенное без инструмента, который оно зовёт, читается как действующее.\n if (result.gaps.length) {\n return {\n code: 1,\n lines: ['раскладка не начата: у этих ресурсов нет вида под выбор дерева', ...gapLines(result)],\n };\n }\n\n const refused: readonly IPlanned[] = result.planned.filter((entry: IPlanned): boolean => isRefusal(entry.outcome));\n if (refused.length) {\n return {\n code: 1,\n lines: [\n 'раскладка не начата: эти файлы пакет переписывать не станет',\n ...refused.map((entry: IPlanned): string => ` ${entry.path} — ${DONE_WORD[entry.outcome]}`),\n 'правку надо либо перенести в надстройку, либо снять — и повторить',\n `положенное не пакетом отдаётся ему командой \\`agent-kit adopt\\`: прежнее содержимое ляжет рядом с пометкой \\`${KEPT_SUFFIX}\\``,\n ],\n };\n }\n\n // Раскладка удалась, и объявление легло вместе с файлами. Остаётся оно неположенным ровно\n // там, где настройку не разобрать: комментарии дерева пакет не сносит своим разбором, и\n // тогда печатается прежний готовый кусок. Код возврата в обоих случаях нулевой — файлы\n // легли, — но молчать нельзя: узнают иначе, когда что-нибудь пройдёт мимо гарда.\n return {\n code: 0,\n lines: [\n ...(result.written.length\n ? [`разложено файлов: ${result.written.length}`, ...result.written.map((path: string): string => ` ${path}`)]\n : ['всё уже разложено']),\n ...boundLines(result),\n ...(result.bound?.unreadable === false ? [] : unboundLines(result)),\n ...driftedLines(result),\n ...debtLines(config, root, assetsDir),\n ...warnings(result),\n ],\n };\n}\n\n/**\n * Отдать пакету файл, который лежит в дереве не от него.\n *\n * Пока команды не было, `sync` отказывал на такой файл поимённо и предлагал «перенести правку в\n * надстройку или снять» — то есть работу, которую делают руками, и до неё же сводилась вся\n * установка в живое дерево. При этом один чужой файл останавливал раскладку целиком.\n *\n * Молчаливой перезаписи здесь нет и быть не может: в файле лежит то, чего в дереве больше нигде\n * нет. Поэтому переход — это переименование прежнего содержимого рядом и повторный `sync`:\n * пакет кладёт своё, а прежнее остаётся на диске под именем с пометкой и ждёт разбора.\n */\nexport function adopt(env: IEnvironment, names: readonly string[]): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n const foreign: readonly IPlanned[] = planSync(config, root, version, assetsDir).planned.filter(\n (entry: IPlanned): boolean => entry.outcome === 'foreign'\n );\n if (!foreign.length) {\n return { code: 0, lines: ['чужих файлов на путях пакета нет'] };\n }\n\n // Имена принимаются как их печатает `sync`: путём в дереве. Без имён отдаются все — на\n // свежей установке их бывает столько же, сколько ресурсов, и перечислять их руками значит\n // делать ту же работу, ради которой команда заведена.\n const wanted: readonly IPlanned[] = names.length\n ? foreign.filter((entry: IPlanned): boolean => names.some((name: string): boolean => entry.path.endsWith(name)))\n : foreign;\n if (!wanted.length) {\n return {\n code: 1,\n lines: ['ни одно имя не отвечает чужому файлу; чужие сейчас такие:', ...foreign.map((e: IPlanned): string => ` ${e.path}`)],\n };\n }\n\n const moved: string[] = [];\n const blocked: string[] = [];\n for (const entry of wanted) {\n const path: string = join(root, entry.path);\n const kept: string = `${path}${KEPT_SUFFIX}`;\n if (existsSync(kept)) {\n blocked.push(` ${entry.path}${KEPT_SUFFIX} — уже лежит, разбери его прежде`);\n continue;\n }\n renameSync(path, kept);\n moved.push(` ${entry.path} → ${entry.path}${KEPT_SUFFIX}`);\n }\n\n return {\n code: blocked.length ? 1 : 0,\n lines: [\n ...(moved.length ? [`прежнее содержимое отложено: ${moved.length}`, ...moved, 'дальше: `agent-kit sync`'] : []),\n ...(blocked.length ? ['не тронуто:', ...blocked] : []),\n ],\n };\n}\n\n/**\n * Сколько незагруженных правил называется поимённо. На коротком отрезке их бывает больше\n * тридцати, и список во весь экран прячет всё остальное, ради чего сводку и открыли.\n */\nconst UNUSED_SHOWN: number = 12;\n\n/** Чем сводка отвечает: отрезок в днях, сегодняшний день и вид вывода. */\nexport interface IStatsOptions {\n readonly days: number;\n /** Сегодняшний день, `ГГГГ-ММ-ДД`. Приходит с края: команду со своими часами не проверить. */\n readonly today: string;\n readonly json: boolean;\n}\n\n/** Столбиком: имя и счёт. Ширина по самому длинному имени — иначе счёт читается по одному. */\nconst countLines: (counted: readonly ICount[]) => string[] = (counted: readonly ICount[]): string[] => {\n const width: number = counted.reduce((found: number, entry: ICount): number => Math.max(found, entry.name.length), 0);\n\n return counted.map((entry: ICount): string => ` ${entry.name.padEnd(width)} ${entry.count}`);\n};\n\n/**\n * Вес разложенных правил на диске: имя правила в сумму байт его текстов.\n *\n * Считается здесь, а не в сводке: сводка разбирает наблюдения и диска не знает. Складываются все\n * `.md` папки правила — само правило, компаньон с именами дерева и всё, что дерево положило\n * рядом: загрузка правила тянет их не поодиночке, и раздельный счёт врал бы в меньшую сторону.\n *\n * Правило, которого в дереве нет, в карту не попадает вовсе. Ноль от него неотличим по числу, но\n * отличим по смыслу: не «ничего не весит», а «весить нечему».\n */\nfunction weightsOfSkills(root: string, dir: string, names: readonly string[]): TWeights {\n const at: string = join(root, dir);\n const found: Record<string, number> = {};\n\n for (const name of names) {\n const folder: string = join(at, name);\n\n if (!existsSync(folder)) {\n continue;\n }\n\n found[name] = readdirSync(folder)\n .filter((file: string): boolean => file.endsWith('.md'))\n .reduce((sum: number, file: string): number => sum + statSync(join(folder, file)).size, 0);\n }\n\n return found;\n}\n\n/**\n * Имена гардов, разложенных в это дерево.\n *\n * Гардом считается тот, кто заявил своё имя для наблюдений строкой вверху файла. Заявка\n * добровольна и точна: хук, который своё отбитие считает сам — как гейт правил, — её не ставит и\n * в счёт отказов гардов не идёт, а отбой заявившего пишет общий хвост отказа.\n *\n * Имя берётся из заявки, а не из имени файла: в наблюдение уезжает именно оно, и разойтись этим\n * двум именам нельзя.\n *\n * Каталог спрашивается у дерева, а не у пакета: свои гарды дерева лежат в нём же и пишут\n * наблюдения наравне с пакетными — перечень от пакета не назвал бы ни одного из них.\n */\nfunction guardsOfTree(root: string, dir: string): readonly string[] {\n const at: string = join(root, dir);\n\n if (!existsSync(at)) {\n return [];\n }\n\n const found: Set<string> = new Set();\n\n for (const file of readdirSync(at)) {\n const named: RegExpExecArray | null = /^RT_GUARD_NAME=([A-Za-z0-9._-]+)/m.exec(readFileSync(join(at, file), 'utf8'));\n\n if (named) {\n found.add(named[1]);\n }\n }\n\n return [...found].sort(byText);\n}\n\n/** Байты человеку: килобайтами, потому что счёт идёт на сотни тысяч и читается по одному. */\nfunction kbOf(bytes: number): string {\n return `${Math.round(bytes / 1024)} КБ`;\n}\n\n/**\n * Строка о том, сколько отбитий пришло не на правку файла.\n *\n * Своей строкой, а не долей, выведенной читателем из разбивки по родам: гейт стоит ради правки, и\n * доля, пришедшая на команду оболочки и на браузер, говорит, сколько раз правило потребовали под\n * то, что правкой не является. Сложенная глазами из десятка строк, эта доля не складывается\n * никогда.\n *\n * Молчит, когда отбитий не было вовсе: «0 процентов» при нуле отбитий — ответ на незаданный\n * вопрос.\n */\nfunction offFileLines(summary: ISummary): string[] {\n const total: number = summary.denials.reduce((found: number, entry: ICount): number => found + entry.count, 0);\n\n if (total === 0) {\n return [];\n }\n\n return [` не на правке файла: ${summary.denialsOffFile} из ${total} — ${Math.round((summary.denialsOffFile / total) * 100)}%`];\n}\n\n/** Сводка строками: загруженное, незагруженное, отбивки гейта и отказы гардов. */\nfunction statsLines(summary: ISummary, swept: readonly string[], days: number, version: string, laidOut: number): string[] {\n return [\n `наблюдения за ${days} дн., заходов ${summary.sessions}, событий ${summary.total}`,\n ...(summary.versions.length ? [`версии пакета в записях: ${summary.versions.join(', ')}`] : []),\n '',\n `правил загружено: ${summary.loads.reduce((found: number, entry: ICount): number => found + entry.count, 0)}`,\n // Вес молчит, когда весить нечем: каталог правил не разложен или пуст. Ноль килобайт при\n // сотне загрузок читался бы как «правила ничего не стоят», а это не то же самое.\n ...(summary.bytes > 0\n ? [\n ` весом ${kbOf(summary.bytes)}, на один заход ${kbOf(summary.bytesPerSession)}`,\n ' — столько текста заход прочитал прежде, чем взяться за работу',\n ]\n : []),\n ...countLines(summary.loads),\n ...(summary.unused.length\n ? [\n '',\n `разложено и не загружено ни разу: ${summary.unused.length} из ${laidOut}`,\n ...summary.unused.slice(0, UNUSED_SHOWN).map((name: string): string => ` ${name}`),\n // Список говорится не весь, и об этом говорится вслух: молчаливый обрыв\n // читается как «вот они все», и правило, не попавшее в первую дюжину,\n // считалось бы работающим.\n ...(summary.unused.length > UNUSED_SHOWN\n ? [` … и ещё ${summary.unused.length - UNUSED_SHOWN} — целиком в \\`--json\\``]\n : []),\n ]\n : []),\n ...(summary.denials.length\n ? [\n '',\n `гейт отбивал: ${summary.denials.reduce((found: number, entry: ICount): number => found + entry.count, 0)}`,\n ...offFileLines(summary),\n ...countLines(summary.denials),\n ...(summary.kinds.length\n ? [' по роду правки:', ...countLines(summary.kinds).map((line: string): string => ` ${line}`)]\n : []),\n ]\n : []),\n ...(summary.guards.length\n ? [\n '',\n `гарды отказывали: ${summary.guards.reduce((found: number, entry: ICount): number => found + entry.count, 0)}`,\n ...countLines(summary.guards),\n ]\n : []),\n ...(summary.silentGuards.length\n ? [\n '',\n `гарды не отбивали ни разу: ${summary.silentGuards.length}`,\n ...summary.silentGuards.map((name: string): string => ` ${name}`),\n ' — стоял и не понадобился или стоял и не работал, по сводке это одно и то же',\n ]\n : []),\n ...(swept.length ? ['', `снято по сроку хранения (${KEEP_DAYS} дн.): ${swept.length}`] : []),\n '',\n `пакет v${version}`,\n ];\n}\n\n/**\n * Сводка наблюдений за отрезок дней.\n *\n * Отдельная строка про незагруженное — то, ради чего сводка вообще нужна: чем пользуются, видно\n * и по работе, а вот правило, которое не открыли ни разу, ничем себя не выдаёт. Сокращать текст\n * правил так же ценно, как дополнять.\n */\nexport function stats(env: IEnvironment, options: IStatsOptions): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n // Выключенная запись — не пустая сводка: нули на месте наблюдений читаются как «ничего не\n // делали», тогда как на самом деле никто и не смотрел.\n if (!config.observe) {\n return {\n code: 0,\n lines: [\n 'запись наблюдений выключена ключом `observe` в конфиге',\n `включить — убрать ключ или поставить \\`\"observe\": true\\`; пишутся они в ${OBSERVATIONS_DIR}/`,\n ],\n };\n }\n\n const days: number = options.days > 0 ? options.days : DEFAULT_DAYS;\n const result: IReadResult = readObservations(root, options.today, days);\n const known: readonly string[] = laidOutSkills(config, assetsDir);\n // Вес спрашивается у дерева, а не у пакета: правило дерево могло переписать надстройкой, и\n // заход читал то, что лежит здесь, а не то, что уехало бы из пакета.\n const summary: ISummary = summarize(\n result.observations,\n known,\n days,\n weightsOfSkills(root, config.layout.rules, known),\n guardsOfTree(root, config.layout.hooks)\n );\n\n if (options.json) {\n return { code: 0, lines: [JSON.stringify({ ...summary, swept: result.swept })] };\n }\n\n if (result.silent) {\n return {\n code: 0,\n lines: [\n 'наблюдений нет: записи не велось ни разу',\n `их пишут гарды в ${OBSERVATIONS_DIR}/ — проверь, что гарды разложены и подключены в ${SETTINGS_PATH}`,\n ],\n };\n }\n\n if (!summary.total) {\n return {\n code: 0,\n lines: [\n `наблюдений за ${days} дн. нет ни одного, а записи велись раньше`,\n ...(result.swept.length ? [`снято по сроку хранения (${KEEP_DAYS} дн.): ${result.swept.length}`] : []),\n 'возьми отрезок длиннее: `--days 14`',\n ],\n };\n }\n\n return {\n code: 0,\n lines: statsLines(summary, result.swept, days, version, laidOutSkills(config, assetsDir).length),\n };\n}\n\n/**\n * Разделы пакета, замещённые надстройками дерева.\n *\n * Совпавший заголовок замещает раздел целиком, и всё, что пакет дописал в такой раздел новой\n * версией, пропадает молча: раскладка сходится, заголовки совпадают, а утверждений нет. Сверка\n * заголовков ловит переименование раздела, а не пополнение, и других свидетелей у потери не\n * бывает. Разбор состояния поэтому называет замещённое поимённо — это половина ответа, которую\n * машина знает и без прежней редакции; вторую половину даёт снимок, снятый до установки.\n */\nfunction replacedLines(config: IConfig, assetsDir: string, root: string): readonly string[] {\n const replaced: readonly ICargoOverride[] = treeSnapshot(config, assetsDir, root).filter(\n (one: ICargoOverride): boolean => one.kind === 'replace'\n );\n\n if (replaced.length === 0) {\n return [];\n }\n\n return [\n `замещено надстройками разделов: ${replaced.length} — что пакет дописал в них новой версией, теряется молча`,\n ...replaced.map((one: ICargoOverride): string => ` ${one.resource} · ${one.section}`),\n ];\n}\n\nexport function doctor(env: IEnvironment): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n if (!config) {\n return { code: 1, lines: [NO_CONFIG] };\n }\n\n const result: ISyncResult = planSync(config, root, version, assetsDir);\n const counted: Map<TOutcome, number> = new Map();\n for (const entry of result.planned) {\n counted.set(entry.outcome, (counted.get(entry.outcome) ?? 0) + 1);\n }\n\n const catalog: readonly IEntryOfCatalog[] = readCatalog(assetsDir);\n const taken: number = collectAssets(config, assetsDir).length;\n const unanswered: readonly IAxis[] = unansweredAxes(readAxes(assetsDir), config.variants);\n const chosen: string[] = Object.entries(config.variants).map(([axis, value]: [string, string]): string => `${axis}: ${value}`);\n // Ресурс чужого вида в «не выбрано» не идёт: проект от него не отказывался — его в этом\n // дереве не существует, как не существует второго правила поставки.\n const foreignVariant: readonly IEntryOfCatalog[] = catalog.filter(\n (entry: IEntryOfCatalog): boolean => entry.variant !== null && config.variants[entry.variant.axis] !== entry.variant.value\n );\n const other: number = foreignVariant.length;\n // Ресурс, названный и в отказе, и чужим видом, считается один раз — иначе «не выбрано»\n // уходит в минус, а минус в отчёте читается как поломка счёта, а не как двойной счёт.\n const skipped: number = config.skip.filter((id: string): boolean =>\n foreignVariant.every((entry: IEntryOfCatalog): boolean => entry.id !== id)\n ).length;\n\n // Снятое каскадом считается и называется отдельно от невыбранного: дерево его не выбирало и\n // не отвергало — оно ушло вслед за родителем, и искать его в отказе читатель пойдёт зря.\n const cuts: readonly ICascadeCut[] = cascadeCuts(catalog, config);\n const cut: ReadonlySet<string> = new Set(cuts.map((one: ICascadeCut): string => one.id));\n\n // Ресурс с неотвеченным требованием в «не выбрано» не идёт по той же причине, что и чужой\n // вид: дерево его не отвергало — свойства, без которого он бессмыслен, у него просто нет.\n const needing: readonly IEntryOfCatalog[] = catalog.filter(\n (entry: IEntryOfCatalog): boolean =>\n entry.needs !== null && !answersRequirement(entry.needs, config.has) && !config.skip.includes(entry.id)\n );\n const needsTrait: number = needing.length;\n\n // Невыбранное называется поимённо: число «не выбрано: 73» не отвечает ни на один вопрос,\n // ради которого его читают, — ни какого ресурса не хватает, ни требуется ли он соседу.\n const unchosen: readonly IEntryOfCatalog[] = catalog.filter(\n (entry: IEntryOfCatalog): boolean =>\n !isChosen(entry, config) &&\n !config.skip.includes(entry.id) &&\n foreignVariant.every((one: IEntryOfCatalog): boolean => one.id !== entry.id) &&\n needing.every((one: IEntryOfCatalog): boolean => one.id !== entry.id)\n );\n\n const lines: string[] = [\n `пакет v${version}, везёт ресурсов ${catalog.length}, взято ${taken}`,\n `не выбрано: ${catalog.length - taken - skipped - other - cut.size - needsTrait}, пропущено: ${skipped}, другой вид: ${other}, снято каскадом: ${cut.size}, нужно свойство: ${needsTrait}`,\n ...unchosen.map((entry: IEntryOfCatalog): string => ` не выбран: ${entry.id}`),\n ...needing.map((entry: IEntryOfCatalog): string => ` нужно свойство «${entry.needs}»: ${entry.id}`),\n ...cuts.map((one: ICascadeCut): string => {\n const root: string = one.parent === one.root ? '' : ', отвергнут ' + one.root;\n\n return ` снят каскадом: ${one.id} — вслед за ${one.parent}${root}`;\n }),\n ...profileLines(root, assetsDir, config),\n ...localValueLines(root, assetsDir, config),\n ...replacedLines(config, assetsDir, root),\n ...thresholdLines(root),\n `значений в конфиге: ${Object.keys(config.vars).length}`,\n ...chosen,\n ...[...counted].map(([outcome, count]: [TOutcome, number]): string => `${STATE_WORD[outcome]}: ${count}`),\n ...describe(result),\n ...(unanswered.length ? ['не выбран вид — раскладка не начнётся:', ...axisLines(unanswered)] : []),\n // Про устаревшую сборку `doctor` говорит, но отказом её не считает: он ничего не пишет,\n // и прочитать состояние дерева можно и из вчерашней сборки — знать бы, что она вчерашняя.\n ...(env.stale ? ['собранное отстало от исходников — раскладка откажет:', ` правлено: ${env.stale.newest}`] : []),\n ];\n\n return { code: 0, lines };\n}\n\n/**\n * Что пакет везёт и что из этого взято здесь.\n *\n * Работает и без конфига: посмотреть, из чего выбирать, нужно раньше, чем выбор сделан, — иначе\n * имена законов взять неоткуда, кроме исходников пакета.\n */\nexport function list(env: IEnvironment): IOutcomeOfCommand {\n const { root, version, assetsDir } = env;\n const config: IConfig | null = readConfig(root);\n const catalog: readonly IEntryOfCatalog[] = readCatalog(assetsDir);\n const planned: Map<string, TOutcome> = new Map();\n const cutByCascade: ReadonlySet<string> = new Set(config ? cascadeCuts(catalog, config).map((one: ICascadeCut): string => one.id) : []);\n\n if (config) {\n for (const entry of planSync(config, root, version, assetsDir).planned) {\n planned.set(entry.asset, entry.outcome);\n }\n }\n\n const stateOf: (entry: IEntryOfCatalog) => string = (entry: IEntryOfCatalog): string => {\n if (!config) {\n return 'везёт пакет';\n }\n if (entry.variant && config.variants[entry.variant.axis] !== entry.variant.value) {\n return OTHER_VARIANT;\n }\n if (config.skip.includes(entry.id)) {\n return SKIPPED;\n }\n // Неотвеченное требование — не отказ дерева: оно этого ресурса не выбирало и не\n // отвергало, а свойства, без которого ресурс бессмыслен, у него просто нет.\n if (entry.needs !== null && !answersRequirement(entry.needs, config.has)) {\n return `${NEEDS_TRAIT}: ${entry.needs}`;\n }\n if (!isChosen(entry, config)) {\n return NOT_CHOSEN;\n }\n if (cutByCascade.has(entry.id)) {\n return CUT_BY_CASCADE;\n }\n const outcome: TOutcome | undefined = planned.get(entry.id);\n\n // Ресурса нет среди запланированных ровно в одном случае: в нём осталась дырка без\n // значения, и до решения о судьбе файла раскладка не дошла.\n return outcome ? STATE_WORD[outcome] : 'дырка без значения';\n };\n\n const name: number = catalog.reduce((found: number, entry: IEntryOfCatalog): number => Math.max(found, entry.name.length), 0);\n const state: number = catalog.reduce((found: number, entry: IEntryOfCatalog): number => Math.max(found, stateOf(entry).length), 0);\n const lines: string[] = [config ? `пакет v${version}` : `пакет v${version}, ${CONFIG_PATH} ещё не заведён`];\n\n for (const kind of KINDS) {\n const entries: readonly IEntryOfCatalog[] = catalog.filter((entry: IEntryOfCatalog): boolean => entry.kind === kind);\n if (!entries.length) {\n continue;\n }\n lines.push('', KIND_TITLE[kind]);\n lines.push(\n ...entries.map(\n (entry: IEntryOfCatalog): string => ` ${entry.name.padEnd(name)} ${stateOf(entry).padEnd(state)} ${entry.title}`\n )\n );\n }\n\n return { code: 0, lines };\n}\n"]}
@@ -60,6 +60,14 @@ export interface ISummary {
60
60
  */
61
61
  readonly denialsOffFile: number;
62
62
  readonly guards: readonly ICount[];
63
+ /**
64
+ * Гарды, разложенные в дерево и не отбившие за отрезок ни разу.
65
+ *
66
+ * Считается той же разностью, что и незагруженные правила, и по той же причине: в самих
67
+ * наблюдениях молчащего гарда нет по определению, а из перечня защит его никто не вычеркнет
68
+ * — молчащий гард и ненужный выглядят одинаково ровно до разбора.
69
+ */
70
+ readonly silentGuards: readonly string[];
63
71
  /**
64
72
  * Правила, разложенные в дерево и не загруженные за отрезок ни разу. Мёртвый ресурс иначе
65
73
  * неотличим от работающего — и это единственная строка сводки, которую нельзя получить из
@@ -97,10 +105,14 @@ export declare function readObservations(root: string, today: string, days: numb
97
105
  * «чем пользовались», а самое ценное — чем не пользовались ни разу — сказать нечем: в самих
98
106
  * наблюдениях незагруженного правила нет по определению.
99
107
  *
108
+ * `guards` — имена гардов, разложенных в это дерево. Гардом здесь считается тот, кто заявил своё
109
+ * имя для наблюдений: хук без заявки в наблюдениях не появится ни при каком отрезке, и молчащим
110
+ * он назывался бы неверно — он молчит не потому, что не понадобился.
111
+ *
100
112
  * `weights` — вес этих правил на диске. Без них сводка говорит, сколько раз правило открывали, и
101
113
  * молчит о том, во что это обошлось: тридцать загрузок паттерна и тридцать загрузок правила на
102
114
  * пятьсот строк стоят разного, а в счёте выглядят одинаково. Не назван — вес считается нулём, и
103
115
  * строки о нём в выводе не будет вовсе.
104
116
  */
105
- export declare function summarize(observations: readonly IObservation[], known: readonly string[], days: number, weights?: TWeights): ISummary;
117
+ export declare function summarize(observations: readonly IObservation[], known: readonly string[], days: number, weights?: TWeights, guards?: readonly string[]): ISummary;
106
118
  //# sourceMappingURL=observations.d.ts.map