@rt-tools/agent-kit 0.10.0 → 0.11.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 (91) hide show
  1. package/assets/checks/check-state-next.mjs +194 -0
  2. package/assets/checks/check-states.mjs +142 -0
  3. package/assets/checks/check-turn-map.mjs +146 -0
  4. package/assets/commands/agent-kit-digest.md +6 -5
  5. package/assets/defaults/project.sh +58 -6
  6. package/assets/defaults/turn-map.md +46 -0
  7. package/assets/hooks/browser-device-id.sh +2 -0
  8. package/assets/hooks/browser-guard-device-id.sh +2 -0
  9. package/assets/hooks/browser-guard-no-asking.sh +2 -0
  10. package/assets/hooks/browser-guard-no-listing.sh +2 -0
  11. package/assets/hooks/browser-guard-no-other-drivers.sh +2 -0
  12. package/assets/hooks/browser-guard-require-select.sh +2 -0
  13. package/assets/hooks/claim-guard.sh +2 -0
  14. package/assets/hooks/commit-msg.sh +2 -0
  15. package/assets/hooks/conscience-guard.sh +2 -0
  16. package/assets/hooks/constitution-index.sh +2 -0
  17. package/assets/hooks/dev-server-guard.sh +2 -0
  18. package/assets/hooks/docs-guard.sh +2 -0
  19. package/assets/hooks/exam-guard.sh +2 -0
  20. package/assets/hooks/git-guard-delivery-signature.sh +2 -0
  21. package/assets/hooks/git-guard-delivery.sh +2 -0
  22. package/assets/hooks/git-guard-main.sh +2 -0
  23. package/assets/hooks/git-guard-push-tests.sh +2 -0
  24. package/assets/hooks/glossary-load.sh +2 -0
  25. package/assets/hooks/grill-gate.sh +2 -0
  26. package/assets/hooks/handoff-entry-guard.sh +2 -0
  27. package/assets/hooks/handoff-write.sh +103 -0
  28. package/assets/hooks/lint-after-edit.sh +2 -0
  29. package/assets/hooks/observe.sh +2 -0
  30. package/assets/hooks/postmortem-guard.sh +2 -0
  31. package/assets/hooks/proposal-guard.sh +2 -0
  32. package/assets/hooks/prose-style-guard.sh +2 -0
  33. package/assets/hooks/qa-dataid-guard.sh +2 -0
  34. package/assets/hooks/rerun-guard.sh +2 -0
  35. package/assets/hooks/reuse-first-guard.sh +2 -0
  36. package/assets/hooks/roles.sh +2 -0
  37. package/assets/hooks/skill-gate-layers.sh +2 -0
  38. package/assets/hooks/skill-gate-rearm.sh +2 -0
  39. package/assets/hooks/skill-gate.sh +2 -0
  40. package/assets/hooks/skill-loaded.sh +2 -0
  41. package/assets/hooks/sql-guard-parse.sh +2 -0
  42. package/assets/hooks/sql-guard-request.sh +2 -0
  43. package/assets/hooks/sql-guard-target.sh +2 -0
  44. package/assets/hooks/sql-guard-write.sh +2 -0
  45. package/assets/hooks/sql-guard.sh +2 -0
  46. package/assets/hooks/task-context-load.sh +2 -0
  47. package/assets/hooks/task-flow-guard.sh +2 -0
  48. package/assets/hooks/turn-entry-load.sh +62 -0
  49. package/assets/hooks/turn-exit-guard.sh +2 -0
  50. package/assets/hooks/utf8.sh +35 -0
  51. package/assets/hooks/waiting-turn-guard.sh +2 -0
  52. package/assets/hooks/window-fill-guard.sh +31 -1
  53. package/assets/laws/work-conduct.md +29 -0
  54. package/assets/patterns/cargo-triage-mark.md +119 -0
  55. package/assets/patterns/task-flow-close.md +21 -0
  56. package/assets/patterns/task-flow-handoff.md +18 -0
  57. package/assets/patterns/task-flow-resume.md +6 -0
  58. package/assets/patterns/task-flow-start.md +41 -0
  59. package/assets/patterns/turn-entry-map.md +81 -0
  60. package/assets/rules/cargo-triage.md +126 -0
  61. package/assets/rules/task-flow.md +14 -1
  62. package/assets/rules/turn-entry.md +93 -0
  63. package/bin/agent-kit.d.ts.map +1 -1
  64. package/bin/agent-kit.js +42 -1
  65. package/bin/agent-kit.js.map +1 -1
  66. package/lib/cargo-state.d.ts +62 -0
  67. package/lib/cargo-state.d.ts.map +1 -0
  68. package/lib/cargo-state.js +118 -0
  69. package/lib/cargo-state.js.map +1 -0
  70. package/lib/cargo.d.ts +42 -0
  71. package/lib/cargo.d.ts.map +1 -1
  72. package/lib/cargo.js +2 -0
  73. package/lib/cargo.js.map +1 -1
  74. package/lib/commands.d.ts.map +1 -1
  75. package/lib/commands.js +64 -4
  76. package/lib/commands.js.map +1 -1
  77. package/lib/observations.d.ts +35 -1
  78. package/lib/observations.d.ts.map +1 -1
  79. package/lib/observations.js +14 -2
  80. package/lib/observations.js.map +1 -1
  81. package/lib/ship.d.ts +3 -0
  82. package/lib/ship.d.ts.map +1 -1
  83. package/lib/ship.js +56 -0
  84. package/lib/ship.js.map +1 -1
  85. package/lib/thresholds.d.ts +49 -0
  86. package/lib/thresholds.d.ts.map +1 -0
  87. package/lib/thresholds.js +151 -0
  88. package/lib/thresholds.js.map +1 -0
  89. package/package.json +1 -1
  90. package/rt-tools-agent-kit-0.11.0.tgz +0 -0
  91. package/rt-tools-agent-kit-0.10.0.tgz +0 -0
@@ -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, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { IAsset, collectAssets } from './assets.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 { DEFAULT_DAYS, ICount, IReadResult, ISummary, KEEP_DAYS, OBSERVATIONS_DIR, readObservations, summarize } from './observations.js';\nimport { IPlanned, isRefusal, TOutcome } from './plan.js';\nimport { laidOutSkills } from './snapshot.js';\nimport { ICutFound, IRetiredFound, ISyncResult, pendingOf, planSync, runSync } from './sync.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/** Что с файлом сделала раскладка. Прошедшее время здесь правда: `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 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/** Дырка в тексте пакета, как она написана в самом тексте. */\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 * список «не хватает трёх» заставляет собирать 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 * Иначе их не видит никто: на сошедшемся дереве проверка молчит, а удавшаяся раскладка называет\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];\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, asset.text, 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 */\nfunction refusalBeforeSync(env: IEnvironment, config: IConfig): IOutcomeOfCommand | null {\n if (env.stale) {\n return staleRefusal(env.stale);\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 return {\n code: 0,\n lines: [\n ...(result.written.length\n ? [`разложено файлов: ${result.written.length}`, ...result.written.map((path: string): string => ` ${path}`)]\n : ['всё уже разложено']),\n ...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/** Сводка строками: загруженное, незагруженное, отбивки гейта и отказы гардов. */\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 ...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 ...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 summary: ISummary = summarize(result.observations, laidOutSkills(config, assetsDir), days);\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\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 `значений в конфиге: ${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 { 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 } from './snapshot.js';\nimport { ICutFound, IRetiredFound, ISyncResult, 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/** Что с файлом сделала раскладка. Прошедшее время здесь правда: `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 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/** Дырка в тексте пакета, как она написана в самом тексте. */\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 * список «не хватает трёх» заставляет собирать 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 * Иначе их не видит никто: на сошедшемся дереве проверка молчит, а удавшаяся раскладка называет\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];\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, asset.text, 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 */\nfunction refusalBeforeSync(env: IEnvironment, config: IConfig): IOutcomeOfCommand | null {\n if (env.stale) {\n return staleRefusal(env.stale);\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 return {\n code: 0,\n lines: [\n ...(result.written.length\n ? [`разложено файлов: ${result.written.length}`, ...result.written.map((path: string): string => ` ${path}`)]\n : ['всё уже разложено']),\n ...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\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 ...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"]}
@@ -21,15 +21,44 @@ export interface ICount {
21
21
  readonly name: string;
22
22
  readonly count: number;
23
23
  }
24
+ /**
25
+ * Вес ресурса на диске, байтами: имя правила в число.
26
+ *
27
+ * Приходит доводом, а не читается здесь, по той же причине, что и день: разбор отделён от диска,
28
+ * и сводку, читающую каталог правил сама, пришлось бы проверять подложенными файлами.
29
+ */
30
+ export type TWeights = Readonly<Record<string, number>>;
24
31
  export interface ISummary {
25
32
  readonly days: number;
26
33
  /** Сколько заходов оставило хоть одно наблюдение. */
27
34
  readonly sessions: number;
28
35
  readonly loads: readonly ICount[];
36
+ /**
37
+ * Вес того, что заходы прочитали за отрезок, байтами. Каждая загрузка считается своим весом:
38
+ * правило, открытое в трёх заходах, стоило места трижды — тем, что оно одно, это не дешевле.
39
+ * Ресурс, веса которого не назвали, считается нулём: врать числом хуже, чем не знать его.
40
+ */
41
+ readonly bytes: number;
42
+ /**
43
+ * Тот же вес, приходящийся на один заход, — цена входа в работу.
44
+ *
45
+ * Ноль заходов даёт ноль, а не отказ: сводка за пустой отрезок печатается наравне с полной,
46
+ * и деление на ноль уронило бы её на том единственном случае, ради которого её и зовут, —
47
+ * «а было ли вообще что-нибудь».
48
+ */
49
+ readonly bytesPerSession: number;
29
50
  /** Отбития гейта по правилам. */
30
51
  readonly denials: readonly ICount[];
31
52
  /** Род правки, на котором гейт отбивал. */
32
53
  readonly kinds: readonly ICount[];
54
+ /**
55
+ * Отбития, пришедшие не на правку файла: род правки — команда оболочки или браузер.
56
+ *
57
+ * Считается здесь, а не выводится читателем из разбивки по родам: доля, которую надо
58
+ * сложить глазами из десятка строк, не читается вовсе — а именно она говорит, требует ли
59
+ * гейт правило под то, что правкой не является.
60
+ */
61
+ readonly denialsOffFile: number;
33
62
  readonly guards: readonly ICount[];
34
63
  /**
35
64
  * Правила, разложенные в дерево и не загруженные за отрезок ни разу. Мёртвый ресурс иначе
@@ -67,6 +96,11 @@ export declare function readObservations(root: string, today: string, days: numb
67
96
  * `known` — имена правил, разложенных в это дерево. Без них сводка отвечает только на вопрос
68
97
  * «чем пользовались», а самое ценное — чем не пользовались ни разу — сказать нечем: в самих
69
98
  * наблюдениях незагруженного правила нет по определению.
99
+ *
100
+ * `weights` — вес этих правил на диске. Без них сводка говорит, сколько раз правило открывали, и
101
+ * молчит о том, во что это обошлось: тридцать загрузок паттерна и тридцать загрузок правила на
102
+ * пятьсот строк стоят разного, а в счёте выглядят одинаково. Не назван — вес считается нулём, и
103
+ * строки о нём в выводе не будет вовсе.
70
104
  */
71
- export declare function summarize(observations: readonly IObservation[], known: readonly string[], days: number): ISummary;
105
+ export declare function summarize(observations: readonly IObservation[], known: readonly string[], days: number, weights?: TWeights): ISummary;
72
106
  //# sourceMappingURL=observations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observations.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/observations.ts"],"names":[],"mappings":"AAgBA,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,EAAE,MAAsC,CAAC;AAEtE,oGAAoG;AACpG,eAAO,MAAM,SAAS,EAAE,MAAW,CAAC;AAEpC,gEAAgE;AAChE,eAAO,MAAM,YAAY,EAAE,MAAU,CAAC;AAEtC,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AAED,qFAAqF;AACrF,MAAM,WAAW,MAAM;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAOD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAoBlE;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/C,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC5B;AAsBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA8BvF;AAoBD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAgBjH"}
1
+ {"version":3,"file":"observations.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/observations.ts"],"names":[],"mappings":"AAgBA,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,EAAE,MAAsC,CAAC;AAEtE,oGAAoG;AACpG,eAAO,MAAM,SAAS,EAAE,MAAW,CAAC;AAEpC,gEAAgE;AAChE,eAAO,MAAM,YAAY,EAAE,MAAU,CAAC;AAEtC,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AAED,qFAAqF;AACrF,MAAM,WAAW,MAAM;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAOD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAoBlE;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/C,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC5B;AAsBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA8BvF;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,QAAa,GAAG,QAAQ,CAqBzI"}
@@ -113,23 +113,35 @@ const countBy = (values) => {
113
113
  .sort((left, right) => right.count - left.count || left.name.localeCompare(right.name));
114
114
  };
115
115
  const of = (observations, event) => observations.filter((entry) => entry.event === event);
116
+ /** Роды правки, которые правкой файла не являются: гейт сработал не на файле. */
117
+ const OFF_FILE_KINDS = ['command', 'browser'];
116
118
  /**
117
119
  * Сводка за отрезок.
118
120
  *
119
121
  * `known` — имена правил, разложенных в это дерево. Без них сводка отвечает только на вопрос
120
122
  * «чем пользовались», а самое ценное — чем не пользовались ни разу — сказать нечем: в самих
121
123
  * наблюдениях незагруженного правила нет по определению.
124
+ *
125
+ * `weights` — вес этих правил на диске. Без них сводка говорит, сколько раз правило открывали, и
126
+ * молчит о том, во что это обошлось: тридцать загрузок паттерна и тридцать загрузок правила на
127
+ * пятьсот строк стоят разного, а в счёте выглядят одинаково. Не назван — вес считается нулём, и
128
+ * строки о нём в выводе не будет вовсе.
122
129
  */
123
- export function summarize(observations, known, days) {
130
+ export function summarize(observations, known, days, weights = {}) {
124
131
  const loads = of(observations, 'skill-load');
125
132
  const denials = of(observations, 'gate-deny');
126
133
  const loaded = new Set(loads.map((entry) => entry.resource));
134
+ const sessions = new Set(observations.map((entry) => entry.session).filter(Boolean)).size;
135
+ const bytes = loads.reduce((found, entry) => found + (weights[entry.resource] ?? 0), 0);
127
136
  return {
128
137
  days,
129
- sessions: new Set(observations.map((entry) => entry.session).filter(Boolean)).size,
138
+ sessions,
139
+ bytes,
130
140
  loads: countBy(loads.map((entry) => entry.resource)),
141
+ bytesPerSession: sessions > 0 ? Math.round(bytes / sessions) : 0,
131
142
  denials: countBy(denials.map((entry) => entry.resource)),
132
143
  kinds: countBy(denials.map((entry) => entry.kind)),
144
+ denialsOffFile: denials.filter((entry) => OFF_FILE_KINDS.includes(entry.kind)).length,
133
145
  guards: countBy(of(observations, 'guard-deny').map((entry) => entry.resource)),
134
146
  unused: known.filter((name) => !loaded.has(name)).sort(byText),
135
147
  versions: [...new Set(observations.map((entry) => entry.version).filter(Boolean))].sort(byText),