@dzhechkov/harness-core 0.8.10 → 0.8.11

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 (76) hide show
  1. package/.dz-manifest.json +120 -60
  2. package/dist/codex-invoke.d.ts +73 -0
  3. package/dist/codex-invoke.d.ts.map +1 -0
  4. package/dist/codex-invoke.js +80 -0
  5. package/dist/codex-invoke.js.map +1 -0
  6. package/dist/discrimination-gate.d.ts +63 -3
  7. package/dist/discrimination-gate.d.ts.map +1 -1
  8. package/dist/discrimination-gate.js +113 -16
  9. package/dist/discrimination-gate.js.map +1 -1
  10. package/dist/event-chain.d.ts +30 -0
  11. package/dist/event-chain.d.ts.map +1 -1
  12. package/dist/event-chain.js +24 -0
  13. package/dist/event-chain.js.map +1 -1
  14. package/dist/guard.d.ts +8 -0
  15. package/dist/guard.d.ts.map +1 -1
  16. package/dist/guard.js +37 -0
  17. package/dist/guard.js.map +1 -1
  18. package/dist/index.d.ts +8 -5
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +8 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/mutation-gate.d.ts +39 -36
  23. package/dist/mutation-gate.d.ts.map +1 -1
  24. package/dist/mutation-gate.js +111 -5
  25. package/dist/mutation-gate.js.map +1 -1
  26. package/dist/operations.d.ts.map +1 -1
  27. package/dist/operations.js +8 -5
  28. package/dist/operations.js.map +1 -1
  29. package/dist/plugin.d.ts.map +1 -1
  30. package/dist/plugin.js +27 -5
  31. package/dist/plugin.js.map +1 -1
  32. package/dist/recommend.d.ts +4 -5
  33. package/dist/recommend.d.ts.map +1 -1
  34. package/dist/recommend.js +110 -45
  35. package/dist/recommend.js.map +1 -1
  36. package/dist/registry.d.ts +32 -1
  37. package/dist/registry.d.ts.map +1 -1
  38. package/dist/registry.js +165 -9
  39. package/dist/registry.js.map +1 -1
  40. package/dist/run-records.d.ts +3 -0
  41. package/dist/run-records.d.ts.map +1 -1
  42. package/dist/run-records.js +18 -0
  43. package/dist/run-records.js.map +1 -1
  44. package/dist/score.d.ts +95 -0
  45. package/dist/score.d.ts.map +1 -1
  46. package/dist/score.js +274 -2
  47. package/dist/score.js.map +1 -1
  48. package/dist/skill-selection.d.ts +72 -0
  49. package/dist/skill-selection.d.ts.map +1 -0
  50. package/dist/skill-selection.js +76 -0
  51. package/dist/skill-selection.js.map +1 -0
  52. package/dist/stem.d.ts +12 -0
  53. package/dist/stem.d.ts.map +1 -0
  54. package/dist/stem.js +89 -0
  55. package/dist/stem.js.map +1 -0
  56. package/dist/telemetry-vocabulary.d.ts +7 -0
  57. package/dist/telemetry-vocabulary.d.ts.map +1 -1
  58. package/dist/telemetry-vocabulary.js +29 -0
  59. package/dist/telemetry-vocabulary.js.map +1 -1
  60. package/package.json +8 -8
  61. package/sbom.json +209 -59
  62. package/src/codex-invoke.ts +138 -0
  63. package/src/discrimination-gate.ts +183 -19
  64. package/src/event-chain.ts +41 -0
  65. package/src/guard.ts +40 -0
  66. package/src/index.ts +10 -4
  67. package/src/mutation-gate.ts +165 -5
  68. package/src/operations.ts +8 -5
  69. package/src/plugin.ts +27 -5
  70. package/src/recommend.ts +116 -46
  71. package/src/registry.ts +144 -11
  72. package/src/run-records.ts +23 -0
  73. package/src/score.ts +361 -3
  74. package/src/skill-selection.ts +111 -0
  75. package/src/stem.ts +87 -0
  76. package/src/telemetry-vocabulary.ts +36 -0
package/dist/recommend.js CHANGED
@@ -15,37 +15,38 @@
15
15
  import { pretrain } from './pretrain.js';
16
16
  import { computePatternBoost, loadPatterns, loadStoreRecords, readLearningConfig, readReinforcementState, recordToPattern } from './patterns.js';
17
17
  import { resolveLearningBackend } from './learning-backend.js';
18
+ import { stems } from './stem.js';
18
19
  /** Topic → keywords mapping for task decomposition. */
19
20
  const TOPIC_KEYWORDS = {
20
- 'api': ['api', 'rest', 'graphql', 'endpoint', 'openapi', 'swagger', 'http', 'grpc'],
21
- 'testing': ['test', 'testing', 'tdd', 'unit test', 'integration test', 'e2e', 'coverage', 'spec'],
22
- 'ci-cd': ['ci/cd', 'ci cd', 'pipeline', 'github actions', 'gitlab', 'jenkins', 'deploy', 'continuous integration', 'continuous delivery'],
23
- 'security': ['security', 'audit', 'vulnerability', 'owasp', 'injection', 'auth', 'codeql', 'sast'],
24
- 'database': ['database', 'migration', 'schema', 'sql', 'postgres', 'mysql', 'query', 'index'],
25
- 'kubernetes': ['kubernetes', 'k8s', 'helm', 'pod', 'deployment', 'container', 'cluster', 'service mesh'],
26
- 'docker': ['docker', 'compose', 'container', 'dockerfile', 'image', 'registry'],
27
- 'terraform': ['terraform', 'iac', 'infrastructure', 'cloud', 'aws', 'gcp', 'azure', 'provision'],
28
- 'monitoring': ['monitoring', 'observability', 'metrics', 'logs', 'traces', 'alerting', 'slo', 'grafana', 'prometheus'],
29
- 'incident': ['incident', 'outage', 'postmortem', 'oncall', 'pagerduty', 'sev1', 'downtime'],
30
- 'monorepo': ['monorepo', 'workspace', 'pnpm', 'turborepo', 'nx', 'changeset', 'lerna'],
31
- 'review': ['review', 'pull request', 'code review', 'merge', ' pr ', 'pr '],
32
- 'debug': ['debug', 'error', 'crash', 'stack trace', 'bug', 'fix', 'troubleshoot'],
33
- 'frontend': ['frontend', 'react', 'vue', 'component', 'ui', 'css', 'tailwind'],
34
- 'git': ['git', 'merge', 'rebase', 'conflict', 'branch', 'cherry-pick'],
35
- 'web3': ['web3', 'blockchain', 'defi', 'crypto', 'ethereum', 'solana', 'nft', 'token', 'swap', 'wallet'],
36
- 'search': ['search', 'brave', 'exa', 'web search', 'find information'],
37
- 'email': ['email', 'gmail', 'inbox', 'send email', 'mail'],
38
- 'productivity': ['sheets', 'calendar', 'tasks', 'todo', 'schedule', 'meeting', 'clickup', 'project management'],
39
- 'data': ['data', 'etl', 'elt', 'pipeline', 'transform', 'dbt', 'airflow', 'warehouse'],
40
- 'social': ['farcaster', 'reddit', 'social', 'community'],
41
- 'research': ['research', 'explore', 'casarium', 'competitor', 'market', 'analysis'],
42
- 'docs': ['documentation', 'docs', 'context7', 'library', 'reference'],
43
- 'scrape': ['scrape', 'crawl', 'extract', 'jina', 'content', 'markdown'],
44
- 'design-thinking': ['design thinking', 'user research', 'prototype', 'empathize', 'jtbd', 'jobs to be done', 'cjm', 'customer journey', 'vsm', 'value stream', 'hadi', 'lean canvas', 'usability', 'product discovery', 'mvp'],
45
- 'product': ['product', 'feature', 'roadmap', 'prd', 'requirements', 'sprint', 'backlog'],
46
- 'academic': ['thesis', 'dissertation', 'defense', 'ВКР', 'защита', 'ГЭК', 'рецензия', 'academic'],
47
- 'quality': ['quality', 'qa', 'qe', 'quality engineering', 'test strategy', 'coverage'],
48
- 'health': ['health', 'medical', 'clinical', 'diagnosis', 'drug', 'lab', 'patient'],
21
+ 'api': ['api', 'rest', 'graphql', 'endpoint', 'openapi', 'swagger', 'http', 'grpc', 'апи', 'эндпоинт', 'интерфейс api', 'http запрос'],
22
+ 'testing': ['test', 'testing', 'tdd', 'unit test', 'integration test', 'e2e', 'coverage', 'spec', 'тест', 'тестирование', 'автотест', 'покрытие тестами'],
23
+ 'ci-cd': ['ci/cd', 'ci cd', 'pipeline', 'github actions', 'gitlab', 'jenkins', 'deploy', 'continuous integration', 'continuous delivery', 'непрерывная интеграция', 'непрерывную интеграцию', 'непрерывная доставка', 'пайплайн сборки', 'автодеплой'],
24
+ 'security': ['security', 'audit', 'vulnerability', 'owasp', 'injection', 'auth', 'codeql', 'sast', 'безопасность', 'уязвимость', 'аудит безопасности', 'авторизация'],
25
+ 'database': ['database', 'migration', 'schema', 'sql', 'postgres', 'mysql', 'query', 'index', 'база данных', 'миграция базы', 'схема данных', 'запрос к базе'],
26
+ 'kubernetes': ['kubernetes', 'k8s', 'helm', 'pod', 'deployment', 'container', 'cluster', 'service mesh', 'кубернетес', 'кластер кубернетес', 'оркестрация контейнеров', 'хелм чарт'],
27
+ 'docker': ['docker', 'compose', 'container', 'dockerfile', 'image', 'registry', 'докер', 'докерфайл', 'образ контейнера', 'докер композ'],
28
+ 'terraform': ['terraform', 'iac', 'infrastructure', 'cloud', 'aws', 'gcp', 'azure', 'provision', 'терраформ', 'инфраструктура как код', 'облачная инфраструктура', 'провижининг'],
29
+ 'monitoring': ['monitoring', 'observability', 'metrics', 'logs', 'traces', 'alerting', 'slo', 'grafana', 'prometheus', 'мониторинг', 'наблюдаемость', 'метрика', 'трассировка', 'оповещение'],
30
+ 'incident': ['incident', 'outage', 'postmortem', 'oncall', 'pagerduty', 'sev1', 'downtime', 'инцидент', 'авария', 'простой сервиса', 'постмортем', 'дежурство'],
31
+ 'monorepo': ['monorepo', 'workspace', 'pnpm', 'turborepo', 'nx', 'changeset', 'lerna', 'монорепо', 'рабочее пространство', 'турборепо', 'чейнджсет'],
32
+ 'review': ['review', 'pull request', 'code review', 'merge', ' pr ', 'pr ', 'repo', 'repository review', 'ревью', 'код ревью', 'чужой репозиторий', 'разбор кода'],
33
+ 'debug': ['debug', 'error', 'crash', 'stack trace', 'bug', 'fix', 'troubleshoot', 'отладка', 'ошибка', 'баг', 'падение', 'не работает'],
34
+ 'frontend': ['frontend', 'react', 'vue', 'component', 'ui', 'css', 'tailwind', 'фронтенд', 'пользовательский интерфейс', 'компонент интерфейса', 'верстка'],
35
+ 'git': ['git', 'merge', 'rebase', 'conflict', 'branch', 'cherry-pick', 'гит', 'слияние веток', 'ребейз', 'конфликт git', 'ветка git'],
36
+ 'web3': ['web3', 'blockchain', 'defi', 'crypto', 'ethereum', 'solana', 'nft', 'token', 'swap', 'wallet', 'блокчейн', 'криптовалюта', 'эфириум', 'токен', 'криптокошелек'],
37
+ 'search': ['search', 'brave', 'exa', 'web search', 'find information', 'поиск', 'веб поиск', 'найти информацию', 'искать в интернете'],
38
+ 'email': ['email', 'gmail', 'inbox', 'send email', 'mail', 'электронная почта', 'электронную почту', 'отправить письмо', 'входящие письма', 'почтовый ящик'],
39
+ 'productivity': ['sheets', 'calendar', 'tasks', 'todo', 'schedule', 'meeting', 'clickup', 'project management', 'календарь', 'список дел', 'расписание', 'встреча', 'управление проектом'],
40
+ 'data': ['data', 'etl', 'elt', 'pipeline', 'transform', 'dbt', 'airflow', 'warehouse', 'обработка данных', 'хранилище данных', 'преобразование данных', 'конвейер данных'],
41
+ 'social': ['farcaster', 'reddit', 'social', 'community', 'соцсеть', 'сообщество', 'реддит', 'социальные сети'],
42
+ 'research': ['research', 'explore', 'casarium', 'competitor', 'market', 'analysis', 'исследование', 'рынок', 'конкурент', 'анализ рынка'],
43
+ 'docs': ['documentation', 'docs', 'context7', 'library', 'reference', 'документация', 'документацию', 'справочник', 'руководство', 'описание библиотеки'],
44
+ 'scrape': ['scrape', 'crawl', 'extract', 'jina', 'content', 'markdown', 'скрапинг', 'парсинг сайта', 'извлечь контент', 'обход сайта'],
45
+ 'design-thinking': ['design thinking', 'user research', 'prototype', 'empathize', 'jtbd', 'jobs to be done', 'cjm', 'customer journey', 'vsm', 'value stream', 'hadi', 'lean canvas', 'usability', 'product discovery', 'mvp', 'дизайн мышление', 'исследование пользователей', 'прототип продукта', 'путь клиента', 'ценностный поток'],
46
+ 'product': ['product', 'feature', 'roadmap', 'prd', 'requirements', 'sprint', 'backlog', 'продукт', 'функция продукта', 'дорожная карта', 'требования', 'спринт', 'бэклог'],
47
+ 'academic': ['thesis', 'dissertation', 'defense', 'ВКР', 'защита', 'ГЭК', 'рецензия', 'academic', 'диссертация', 'дипломная работа', 'научная работа'],
48
+ 'quality': ['quality', 'qa', 'qe', 'quality engineering', 'test strategy', 'coverage', 'качество', 'обеспечение качества', 'инженерия качества', 'стратегия тестирования'],
49
+ 'health': ['health', 'medical', 'clinical', 'diagnosis', 'drug', 'lab', 'patient', 'blood', 'blood test', 'lab results', 'анализ', 'кровь', 'здоровье', 'врач', 'диагноз', 'лаборатория', 'симптом'],
49
50
  };
50
51
  /** Command knowledge base — what each command does and when to use it. */
51
52
  const COMMAND_KB = [
@@ -88,44 +89,82 @@ const TOOLKIT_KB = [
88
89
  { name: 'agentic-qe', npmPackage: 'agentic-qe', install: 'npm install -g agentic-qe && aqe init --auto', description: 'Full QE platform — 94 skills + 55 agents + MCP server', topics: ['quality', 'testing'] },
89
90
  { name: 'skills-analyst-manual', npmPackage: '@dzhechkov/skills-analyst-manual', install: 'npx @dzhechkov/skills-analyst-manual init', description: '3-phase analyst composite (explore → research → solve)', topics: ['research', 'product'] },
90
91
  ];
92
+ const CYRILLIC_KEYWORD = /\p{Script=Cyrillic}/u;
93
+ function containsStemSequence(textStems, keywordStems) {
94
+ if (keywordStems.length === 0 || keywordStems.length > textStems.length)
95
+ return false;
96
+ return textStems.some((_, start) => keywordStems.every((keywordStem, offset) => textStems[start + offset] === keywordStem));
97
+ }
98
+ function keywordMatches(lowerText, textStems, keyword) {
99
+ const normalizedKeyword = keyword.normalize('NFC').toLowerCase().replaceAll('ё', 'е');
100
+ // Preserve the old raw-substring behavior for the pre-existing Latin dictionary,
101
+ // including deliberately padded ` pr `. New Cyrillic rows use token/stem equality,
102
+ // so a word such as `протест` cannot accidentally activate the `тест` topic.
103
+ const rawMatch = !CYRILLIC_KEYWORD.test(normalizedKeyword) && lowerText.includes(normalizedKeyword);
104
+ return rawMatch || containsStemSequence(textStems, stems(normalizedKeyword));
105
+ }
91
106
  /** Extract topics from a task description. */
92
107
  function extractTopics(task) {
93
- const lower = task.toLowerCase();
108
+ const lower = task.normalize('NFC').toLowerCase().replaceAll('ё', 'е');
109
+ const taskStems = stems(task);
94
110
  const matched = [];
95
111
  for (const [topic, keywords] of Object.entries(TOPIC_KEYWORDS)) {
96
112
  for (const kw of keywords) {
97
- if (lower.includes(kw)) {
113
+ if (keywordMatches(lower, taskStems, kw)) {
98
114
  matched.push(topic);
99
115
  break;
100
116
  }
101
117
  }
102
118
  }
103
- return matched.length > 0 ? matched : ['general'];
119
+ return matched;
104
120
  }
105
121
  /** Score a skill against extracted topics. */
106
- function scoreSkill(entry, topics) {
107
- const lower = `${entry.id} ${entry.description} ${entry.category}`.toLowerCase();
122
+ function scoreSkill(entry, topics, task) {
123
+ const text = `${entry.id} ${entry.description} ${entry.category}`;
124
+ const lower = text.normalize('NFC').toLowerCase().replaceAll('ё', 'е');
125
+ const textStems = stems(text);
108
126
  let score = 0;
109
127
  for (const topic of topics) {
110
128
  const keywords = TOPIC_KEYWORDS[topic] ?? [topic];
111
129
  for (const kw of keywords) {
112
- if (lower.includes(kw)) {
130
+ if (keywordMatches(lower, textStems, kw)) {
113
131
  score += 10;
114
132
  break;
115
133
  }
116
134
  }
117
135
  }
136
+ // Topic points alone are FLAT: every skill of a matching topic scores exactly 10, so dozens tie
137
+ // and the top-N cut falls arbitrarily among them. Harmless while the catalogue was small; the
138
+ // moment it grew from 202 to 249 skills (layout fix, 2026-09-01) the right answer started losing
139
+ // ties to same-topic neighbours. A small tie-break by ACTUAL overlap with the asked task keeps
140
+ // the topic signal dominant (10 per topic) while letting the skill the user literally described
141
+ // rise above its topic-mates: an id word is worth more than a description word, because an id
142
+ // match is rarely accidental.
143
+ if (task !== undefined && task !== '') {
144
+ const words = [...new Set(task.toLowerCase().match(/[\p{L}\p{N}]{3,}/gu) ?? [])];
145
+ const id = entry.id.toLowerCase();
146
+ const desc = String(entry.description ?? '').toLowerCase();
147
+ const idStems = new Set(stems(entry.id));
148
+ const descStems = new Set(stems(String(entry.description ?? '')));
149
+ let overlap = 0;
150
+ for (const w of words) {
151
+ const wordStem = stems(w)[0];
152
+ if (id.includes(w) || (wordStem !== undefined && idStems.has(wordStem)))
153
+ overlap += 3;
154
+ else if (desc.includes(w) || (wordStem !== undefined && descStems.has(wordStem)))
155
+ overlap += 1;
156
+ }
157
+ // Capped below one topic point so a tie-break can never outrank a genuine topic match.
158
+ score += Math.min(overlap, 9);
159
+ }
118
160
  return score;
119
161
  }
120
- /** Generate recommendation from a task and registry.
121
- * When task is too generic (only 'general' topic), falls back to pretrain
122
- * to analyze the actual project and recommend based on tech stack.
123
- */
162
+ /** Generate recommendations from task topics, or visibly-labelled project-stack topics on a miss. */
124
163
  export function recommend(task, registry, projectRoot) {
125
164
  let topics = extractTopics(task);
126
- let pretrainFallback = false;
127
- // Fallback: if task is too generic, use pretrain to detect project stack
128
- if (topics.length === 1 && topics[0] === 'general' && projectRoot) {
165
+ let topicSource = topics.length > 0 ? 'task' : 'none';
166
+ // Fallback: if no task keyword matched, use pretrain only as explicitly stack-derived advice.
167
+ if (topics.length === 0 && projectRoot) {
129
168
  const analysis = pretrain(projectRoot);
130
169
  const pretrainTopics = [];
131
170
  const techNames = analysis.techs.map((t) => t.name.toLowerCase());
@@ -147,9 +186,24 @@ export function recommend(task, registry, projectRoot) {
147
186
  pretrainTopics.push('testing');
148
187
  if (pretrainTopics.length > 0) {
149
188
  topics = [...new Set(pretrainTopics)];
150
- pretrainFallback = true;
189
+ topicSource = 'project-stack';
151
190
  }
152
191
  }
192
+ const pretrainFallback = topicSource === 'project-stack';
193
+ if (topicSource === 'none') {
194
+ return {
195
+ task,
196
+ topics: [],
197
+ skills: [],
198
+ presets: [],
199
+ toolkits: [],
200
+ commands: [],
201
+ installCommand: '',
202
+ plan: [],
203
+ topicSource,
204
+ pretrainFallback,
205
+ };
206
+ }
153
207
  // Learned-pattern read-back (audit #2): reward-rank taught patterns into a
154
208
  // bounded, monotonic boost. Gated on the rollout flag; when memory is empty or
155
209
  // the flag is off, `patterns` is [] and the boost is 0 — ranking stays
@@ -172,7 +226,7 @@ export function recommend(task, registry, projectRoot) {
172
226
  const scored = registry.entries
173
227
  .map((e) => ({
174
228
  entry: e,
175
- score: scoreSkill(e, topics) + (patterns.length ? boostFor(e) : 0),
229
+ score: scoreSkill(e, topics, task) + (patterns.length ? boostFor(e) : 0),
176
230
  }))
177
231
  .filter((s) => s.score > 0)
178
232
  .sort((a, b) => b.score - a.score);
@@ -251,6 +305,17 @@ export function recommend(task, registry, projectRoot) {
251
305
  plan.push(`${plan.length + 1}. Ops: observability skill for monitoring + incident-response for runbooks`);
252
306
  }
253
307
  plan.push(`${plan.length + 1}. Use your agent normally — skills auto-activate on matching tasks`);
254
- return { task, topics, skills, presets, toolkits, commands, installCommand, plan, pretrainFallback };
308
+ return {
309
+ task,
310
+ topics,
311
+ skills,
312
+ presets,
313
+ toolkits,
314
+ commands,
315
+ installCommand,
316
+ plan,
317
+ topicSource,
318
+ pretrainFallback,
319
+ };
255
320
  }
256
321
  //# sourceMappingURL=recommend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../src/recommend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../src/recommend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjJ,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAqDlC,uDAAuD;AACvD,MAAM,cAAc,GAA6B;IAC/C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,CAAC;IACtI,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,CAAC;IACzJ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,YAAY,CAAC;IACtP,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,CAAC;IACrK,UAAU,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC;IAC9J,YAAY,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,WAAW,CAAC;IACpL,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,CAAC;IACzI,WAAW,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,aAAa,CAAC;IACjL,YAAY,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC;IAC7L,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,CAAC;IAC/J,UAAU,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,WAAW,EAAE,WAAW,CAAC;IACpJ,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,CAAC;IAClK,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC;IACvI,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,SAAS,CAAC;IAC3J,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC;IACrI,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC;IACzK,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,CAAC;IACtI,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,CAAC;IAC5J,cAAc,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB,CAAC;IAC1L,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,iBAAiB,CAAC;IAC1K,QAAQ,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,CAAC;IAC9G,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC;IACzI,MAAM,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,CAAC;IACzJ,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,CAAC;IACtI,iBAAiB,EAAE,CAAC,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,CAAC;IACxU,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC3K,UAAU,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;IACtJ,SAAS,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,wBAAwB,CAAC;IAC1K,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC;CACrM,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,GAAiG;IAC/G,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE,OAAO,EAAE,8CAA8C,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;IACxL,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iCAAiC,EAAE,OAAO,EAAE,qCAAqC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;IACvK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mCAAmC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE;IAC3J,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE;IAC3I,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,6BAA6B,EAAE,OAAO,EAAE,+BAA+B,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;IACrL,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,8BAA8B,EAAE,OAAO,EAAE,gCAAgC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACvL,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE;IAC7K,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,+BAA+B,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;IACrK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,oCAAoC,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IAChK,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,4BAA4B,EAAE,OAAO,EAAE,kCAAkC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE;IAClL,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,OAAO,EAAE,mCAAmC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE;IACtK,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,yBAAyB,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;IAC1J,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,kCAAkC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE;IACzL,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iCAAiC,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE;CACrK,CAAC;AAEF,6BAA6B;AAC7B,MAAM,SAAS,GAA2D;IACxE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;IAC9iB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;IACnN,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;IAC7O,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;IAC7Q,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE;IACjN,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IACzO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,0BAA0B,EAAE,+BAA+B,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC5H,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;IACrD,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,6BAA6B,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;IACnH,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;IAChK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;CAC9J,CAAC;AAEF,iEAAiE;AACjE,MAAM,UAAU,GAAmG;IACjH,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,mEAAmE,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IACjO,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,yBAAyB,EAAE,OAAO,EAAE,kCAAkC,EAAE,WAAW,EAAE,6DAA6D,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;IAC7M,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,2BAA2B,EAAE,OAAO,EAAE,oCAAoC,EAAE,WAAW,EAAE,gCAAgC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;IACrL,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,uBAAuB,EAAE,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,wCAAwC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;IAClL,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,+BAA+B,EAAE,OAAO,EAAE,wCAAwC,EAAE,WAAW,EAAE,4CAA4C,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;IACzN,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,8CAA8C,EAAE,WAAW,EAAE,uDAAuD,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;IAC/M,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,kCAAkC,EAAE,OAAO,EAAE,2CAA2C,EAAE,WAAW,EAAE,wDAAwD,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE;CAChP,CAAC;AAEF,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEhD,SAAS,oBAAoB,CAAC,SAA4B,EAAE,YAA+B;IACzF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACtF,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CACpD,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,WAAW,CACnE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,SAA4B,EAAE,OAAe;IACtF,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtF,iFAAiF;IACjF,mFAAmF;IACnF,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACpG,OAAO,QAAQ,IAAI,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,8CAA8C;AAC9C,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/D,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8CAA8C;AAC9C,SAAS,UAAU,CAAC,KAAoB,EAAE,MAAgB,EAAE,IAAa;IACvE,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;gBAAC,KAAK,IAAI,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,gGAAgG;IAChG,8FAA8F;IAC9F,iGAAiG;IACjG,+FAA+F;IAC/F,gGAAgG;IAChG,8FAA8F;IAC9F,8BAA8B;IAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC;iBACjF,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC;QACjG,CAAC;QACD,uFAAuF;QACvF,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAkB,EAAE,WAAoB;IAC9E,IAAI,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,WAAW,GAAwC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3F,8FAA8F;IAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAClE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAAE,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACjH,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAAE,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9H,IAAI,QAAQ,CAAC,SAAS;YAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,YAAY;YAAE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,QAAQ,CAAC,aAAa;YAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,QAAQ,CAAC,KAAK;YAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,QAAQ;YAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YACtC,WAAW,GAAG,eAAe,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAG,WAAW,KAAK,eAAe,CAAC;IAEzD,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,EAAE;YACR,WAAW;YACX,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,+EAA+E;IAC/E,uEAAuE;IACvE,2EAA2E;IAC3E,MAAM,OAAO,GAAG,WAAW,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnH,MAAM,QAAQ,GAAG,WAAW,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChH,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,MAAM,QAAQ,GAAG,CAAC,KAAoB,EAAU,EAAE;QAChD,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACxE,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9F,EAAE,IAAI,EAAE,WAAW,EAAE,CACtB,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,wBAAwB;IACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACzE,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;SAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,MAAM,GAA0B,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClE,IAAI,MAAM,GAAG,mBAAmB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChG,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,qBAAqB,CAAC;QAClC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;YACd,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;YAClB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW;YAChC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;YACvB,QAAQ,EAAE,aAAa,CAAC,MAAM;YAC9B,aAAa;SACd,CAAC;IACJ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjG,MAAM,OAAO,GAA2B,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,qCAAqC;IACrC,MAAM,QAAQ,GAA4B,UAAU;SACjD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;SAClF,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAExG,6DAA6D;IAC7D,MAAM,QAAQ,GAA4B,UAAU;SACjD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,MAAM,EAAE,YAAY,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C;SAC1F,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,EAAE,EAA+B,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;SACxD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,2BAA2B;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,SAAS;QAC9B,CAAC,CAAC,0CAA0C,SAAS,CAAC,IAAI,EAAE;QAC5D,CAAC,CAAC,yCAAyC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAErE,6BAA6B;IAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,eAAe,cAAc,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,qBAAqB,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,oEAAoE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAElG,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM;QACN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,cAAc;QACd,IAAI;QACJ,WAAW;QACX,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
@@ -21,11 +21,35 @@
21
21
  * scans (1, 2) never reach. Returns only directories that exist, de-duplicated, in order.
22
22
  */
23
23
  export declare function skillPackBaseDirs(cwd: string): string[];
24
- /** List `skills-*` pack directories across all base dirs, de-duplicated by pack name (first wins). */
25
24
  export declare function discoverSkillPackDirs(cwd: string): {
26
25
  pack: string;
27
26
  dir: string;
28
27
  }[];
28
+ /**
29
+ * Every directory that CARRIES skills a user can invoke — the catalogue question.
30
+ *
31
+ * A third enumerator on purpose, by the same ADR-001 reasoning that split signature verification
32
+ * from pack discovery. `discoverSkillPackDirs` answers "which SKILL PACKS are here?" and the
33
+ * `skills-` prefix is the right answer to THAT — AM-1 pins it, and widening it would let a plugin
34
+ * be counted as a pack. This function asks something else: "what can the assistant actually offer
35
+ * the user?" — and there the prefix is wrong.
36
+ *
37
+ * MEASURED 2026-09-01: 41 skill names existed on disk and were absent from `dz registry` —
38
+ * every medical skill of `health-advisor` (31 SKILL.md), plus keysarium, p-replicator,
39
+ * design-thinking, trip-planner, evidence-wiki. That gap is not "fewer results": `skill-advisor`
40
+ * must check a name against this catalogue and treat an unlisted one as a fabrication, so an
41
+ * invisible skill turns a hallucination guard into a ban on naming the right answer — asked about
42
+ * blood tests, a live session answered "there is no medical skill in the DZ catalogue" with 31 of
43
+ * them on disk. An authoritative denial of existence is worse than an empty result: it closes the
44
+ * question.
45
+ *
46
+ * The double-count AM-1 guards against is handled where it belongs — `buildRegistry` dedupes by
47
+ * skill id, so a skill reachable through both its canon and a plugin is listed once.
48
+ */
49
+ export declare function discoverSkillCarryingDirs(cwd: string): {
50
+ pack: string;
51
+ dir: string;
52
+ }[];
29
53
  /**
30
54
  * Every pack whose SIGNATURE should be checked: the skill packs above, PLUS any directory in the same
31
55
  * base dirs that carries a `.dz-manifest.json`, whatever it is called.
@@ -55,6 +79,13 @@ export interface RegistryEntry {
55
79
  readonly hasEvals: boolean;
56
80
  readonly lineCount: number;
57
81
  readonly category: string;
82
+ /**
83
+ * Repo-relative path of the skill directory. Stored rather than reconstructed: a skill lives in
84
+ * one of three layouts (pack root, `skills/`, `templates/.claude/skills/`), so `<pack>/<id>` is
85
+ * a guess that silently breaks for two of them — the plugin generator built exactly that guess
86
+ * and produced unresolvable paths the moment the catalogue learned the other layouts.
87
+ */
88
+ readonly path?: string;
58
89
  }
59
90
  /** The full registry. */
60
91
  export interface Registry {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoCvD;AAeD,sGAAsG;AACtG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBlF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAkEvF;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,yBAAyB;AACzB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAuFD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAmCnD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAK1F;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAE/F"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoCvD;AA+CD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBlF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAkEvF;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,yBAAyB;AACzB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAoGD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAwDnD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAsB1F;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAE/F"}
package/dist/registry.js CHANGED
@@ -7,8 +7,9 @@
7
7
  * @packageDocumentation
8
8
  */
9
9
  import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from 'node:fs';
10
- import { basename, dirname, join, resolve } from 'node:path';
10
+ import { basename, dirname, join, relative, resolve } from 'node:path';
11
11
  import { fileURLToPath } from 'node:url';
12
+ import { stems } from './stem.js';
12
13
  /**
13
14
  * Resolve every `@dzhechkov` base directory that may hold `skills-*` packs, for a given
14
15
  * working directory. Ordered by precedence (first wins on pack-name collision):
@@ -74,6 +75,43 @@ function readSkillDiscoveryConfig(cwd) {
74
75
  }
75
76
  }
76
77
  /** List `skills-*` pack directories across all base dirs, de-duplicated by pack name (first wins). */
78
+ /**
79
+ * Does this directory actually carry skills? Answers by LOOKING, so a pack is catalogued for what it
80
+ * contains rather than for how it is named. Bounded on purpose: only the three layouts real packs
81
+ * use (`skills/<id>/SKILL.md`, `<pack>/<id>/SKILL.md` for a single-skill pack, and a bare
82
+ * `SKILL.md`), never a full-tree walk — an unbounded scan over `node_modules` would cost more than
83
+ * the catalogue it builds. Templates are excluded: a template is a stamp for making skills, not an
84
+ * installed skill, and counting it would list the same name twice.
85
+ */
86
+ function packCarriesSkills(dir) {
87
+ const hasSkillMd = (d) => {
88
+ try {
89
+ for (const entry of readdirSync(d, { withFileTypes: true })) {
90
+ if (entry.name === 'templates' || entry.name === 'node_modules')
91
+ continue;
92
+ if (entry.isDirectory() && existsSync(join(d, entry.name, 'SKILL.md')))
93
+ return true;
94
+ }
95
+ }
96
+ catch { /* unreadable dir is simply not a skill carrier */ }
97
+ return false;
98
+ };
99
+ try {
100
+ if (existsSync(join(dir, 'SKILL.md')))
101
+ return true;
102
+ if (hasSkillMd(join(dir, 'skills')))
103
+ return true;
104
+ // A template pack ships the skills it will roll out into the user's project. From the
105
+ // catalogue's point of view those skills EXIST — `trip-planner` and `presentation-storyteller`
106
+ // are installable answers to a task — so hiding them makes the advisor deny a real capability.
107
+ if (hasSkillMd(join(dir, 'templates', '.claude', 'skills')))
108
+ return true;
109
+ return hasSkillMd(dir);
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
77
115
  export function discoverSkillPackDirs(cwd) {
78
116
  const seen = new Set();
79
117
  const out = [];
@@ -98,6 +136,62 @@ export function discoverSkillPackDirs(cwd) {
98
136
  }
99
137
  return out;
100
138
  }
139
+ /**
140
+ * Every directory that CARRIES skills a user can invoke — the catalogue question.
141
+ *
142
+ * A third enumerator on purpose, by the same ADR-001 reasoning that split signature verification
143
+ * from pack discovery. `discoverSkillPackDirs` answers "which SKILL PACKS are here?" and the
144
+ * `skills-` prefix is the right answer to THAT — AM-1 pins it, and widening it would let a plugin
145
+ * be counted as a pack. This function asks something else: "what can the assistant actually offer
146
+ * the user?" — and there the prefix is wrong.
147
+ *
148
+ * MEASURED 2026-09-01: 41 skill names existed on disk and were absent from `dz registry` —
149
+ * every medical skill of `health-advisor` (31 SKILL.md), plus keysarium, p-replicator,
150
+ * design-thinking, trip-planner, evidence-wiki. That gap is not "fewer results": `skill-advisor`
151
+ * must check a name against this catalogue and treat an unlisted one as a fabrication, so an
152
+ * invisible skill turns a hallucination guard into a ban on naming the right answer — asked about
153
+ * blood tests, a live session answered "there is no medical skill in the DZ catalogue" with 31 of
154
+ * them on disk. An authoritative denial of existence is worse than an empty result: it closes the
155
+ * question.
156
+ *
157
+ * The double-count AM-1 guards against is handled where it belongs — `buildRegistry` dedupes by
158
+ * skill id, so a skill reachable through both its canon and a plugin is listed once.
159
+ */
160
+ export function discoverSkillCarryingDirs(cwd) {
161
+ const seen = new Set();
162
+ const out = [];
163
+ for (const { pack, dir } of discoverSkillPackDirs(cwd)) {
164
+ if (!seen.has(pack)) {
165
+ seen.add(pack);
166
+ out.push({ pack, dir });
167
+ }
168
+ }
169
+ for (const base of skillPackBaseDirs(cwd)) {
170
+ let entries;
171
+ try {
172
+ entries = readdirSync(base, { withFileTypes: true });
173
+ }
174
+ catch {
175
+ continue;
176
+ }
177
+ for (const e of entries) {
178
+ if (seen.has(e.name))
179
+ continue;
180
+ const dir = join(base, e.name);
181
+ const isDir = e.isDirectory() || (e.isSymbolicLink() && (() => { try {
182
+ return statSync(dir).isDirectory();
183
+ }
184
+ catch {
185
+ return false;
186
+ } })());
187
+ if (!isDir || !packCarriesSkills(dir))
188
+ continue;
189
+ seen.add(e.name);
190
+ out.push({ pack: e.name, dir });
191
+ }
192
+ }
193
+ return out;
194
+ }
101
195
  /**
102
196
  * Every pack whose SIGNATURE should be checked: the skill packs above, PLUS any directory in the same
103
197
  * base dirs that carries a `.dz-manifest.json`, whatever it is called.
@@ -280,6 +374,25 @@ function categoryFromPack(pack) {
280
374
  // Course/tutorial manufacturing (skills-tutorial-factory: package → Head-First edu-site course).
281
375
  if (pack.includes('tutorial'))
282
376
  return 'learning';
377
+ // Packs that carry skills without the `skills-` prefix, catalogued since 2026-09-01. Each needs a
378
+ // category or it lands in `other`, and a test rightly forbids that bucket: an uncategorised skill
379
+ // cannot be filtered for, which is half of being findable.
380
+ if (pack === 'keysarium' || pack.includes('evidence-wiki'))
381
+ return 'research';
382
+ // feature-adr ships its skills as templates, so they were invisible until the layout fix and the
383
+ // pack never needed a category before. The pipeline that manufactures features is meta-work.
384
+ if (pack === 'p-replicator' || pack.includes('loop-designer') || pack.includes('feature-adr'))
385
+ return 'meta';
386
+ if (pack === 'design-thinking')
387
+ return 'design';
388
+ if (pack === 'trip-planner')
389
+ return 'personal';
390
+ // Packs whose skills live in `templates/` and were therefore never read until the layout fix.
391
+ // Each needs a home or it lands in `other`, which a test rightly forbids.
392
+ if (pack.includes('analyst-manual'))
393
+ return 'product';
394
+ if (pack.includes('edu-site') || pack.includes('transcript-site'))
395
+ return 'learning';
283
396
  return 'other';
284
397
  }
285
398
  /**
@@ -290,21 +403,45 @@ function categoryFromPack(pack) {
290
403
  */
291
404
  export function buildRegistry(cwd) {
292
405
  const entries = [];
293
- const packs = discoverSkillPackDirs(cwd);
406
+ const packs = discoverSkillCarryingDirs(cwd);
407
+ // A pack keeps its skills in one of three shapes, and reading only the first made 41 real skills
408
+ // invisible (MEASURED 2026-09-01): the pack root (`skills-*` packs), a `skills/` subdirectory
409
+ // (health-advisor and friends), and `templates/.claude/skills/` for packs that roll their skills
410
+ // out into the user's project. The catalogue answers "what can I use", so all three count.
411
+ const SKILL_LAYOUTS = [[], ['skills'], ['templates', '.claude', 'skills']];
412
+ const seenSkillIds = new Set();
294
413
  for (const { pack, dir: packDir } of packs) {
295
- const skillDirs = readdirSync(packDir, { withFileTypes: true })
296
- .filter((e) => e.isDirectory() && existsSync(join(packDir, e.name, 'SKILL.md')));
297
- for (const skill of skillDirs) {
298
- const skillMdPath = join(packDir, skill.name, 'SKILL.md');
414
+ const found = [];
415
+ for (const layout of SKILL_LAYOUTS) {
416
+ const root = layout.length === 0 ? packDir : join(packDir, ...layout);
417
+ if (!existsSync(root))
418
+ continue;
419
+ try {
420
+ for (const e of readdirSync(root, { withFileTypes: true })) {
421
+ if (e.isDirectory() && existsSync(join(root, e.name, 'SKILL.md')))
422
+ found.push({ name: e.name, root });
423
+ }
424
+ }
425
+ catch { /* an unreadable layout contributes nothing; the others still count */ }
426
+ }
427
+ for (const skill of found) {
428
+ // One skill id can ship in several packs (frontend-design is bundled by three). The catalogue
429
+ // answers "is this available", not "in how many packs" — so the first sighting wins and the
430
+ // list stays a list of capabilities rather than of copies.
431
+ if (seenSkillIds.has(skill.name))
432
+ continue;
433
+ seenSkillIds.add(skill.name);
434
+ const skillMdPath = join(skill.root, skill.name, 'SKILL.md');
299
435
  const content = readFileSync(skillMdPath, 'utf-8');
300
436
  const { description, trustTier } = extractFrontmatter(content);
301
437
  entries.push({
302
438
  id: skill.name,
303
439
  pack,
440
+ path: relative(cwd, join(skill.root, skill.name)) || join(skill.root, skill.name),
304
441
  description,
305
442
  trustTier,
306
- hasSchema: existsSync(join(packDir, skill.name, 'schemas', 'output.json')),
307
- hasEvals: existsSync(join(packDir, skill.name, 'evals')),
443
+ hasSchema: existsSync(join(skill.root, skill.name, 'schemas', 'output.json')),
444
+ hasEvals: existsSync(join(skill.root, skill.name, 'evals')),
308
445
  lineCount: content.split('\n').length,
309
446
  category: categoryFromPack(pack),
310
447
  });
@@ -322,7 +459,26 @@ export function buildRegistry(cwd) {
322
459
  /** Search registry by query (matches id and description, case-insensitive). */
323
460
  export function searchRegistry(registry, query) {
324
461
  const q = query.toLowerCase();
325
- return registry.entries.filter((e) => e.id.toLowerCase().includes(q) || e.description.toLowerCase().includes(q) || e.category.includes(q));
462
+ const queryStems = stems(query);
463
+ return registry.entries.filter((e) => {
464
+ const indexedText = `${e.id} ${e.description} ${e.category}`;
465
+ const rawMatch = e.id.toLowerCase().includes(q)
466
+ || e.description.toLowerCase().includes(q)
467
+ || e.category.toLowerCase().includes(q);
468
+ if (rawMatch)
469
+ return true;
470
+ const indexedStems = new Set(stems(indexedText));
471
+ const equalStemMatch = queryStems.length > 0 && queryStems.every((stem) => indexedStems.has(stem));
472
+ if (equalStemMatch)
473
+ return true;
474
+ // A singular raw query can already match its root inside a longer token (`анализ`
475
+ // inside `проанализируй`). Its inflected twin must inherit that existing hit or the
476
+ // preserved raw tier makes parity impossible. Limit this compatibility leg to one
477
+ // long stem; short common prefixes stay on exact stem equality.
478
+ const singleStem = queryStems.length === 1 ? queryStems[0] : undefined;
479
+ const foldedIndex = indexedText.normalize('NFC').toLowerCase().replaceAll('ё', 'е');
480
+ return singleStem !== undefined && singleStem.length >= 5 && foldedIndex.includes(singleStem);
481
+ });
326
482
  }
327
483
  /** Filter registry by category. */
328
484
  export function filterByCategory(registry, category) {