mister-wolf 2.18.4 → 2.19.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 (72) hide show
  1. package/README.md +1 -1
  2. package/README.ru.md +16 -14
  3. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  4. package/dist/adapters/cli/cli-entry.js +10 -1
  5. package/dist/adapters/cli/cli-entry.js.map +1 -1
  6. package/dist/adapters/cli/commands/claim.d.ts.map +1 -1
  7. package/dist/adapters/cli/commands/claim.js +2 -1
  8. package/dist/adapters/cli/commands/claim.js.map +1 -1
  9. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
  10. package/dist/adapters/cli/commands/memory-sync.js +3 -0
  11. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  12. package/dist/adapters/cli/commands/memory-upgrade.d.ts +133 -0
  13. package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
  14. package/dist/adapters/cli/commands/memory-upgrade.js +507 -5
  15. package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
  16. package/dist/adapters/cli/commands/upgrade-projects.d.ts +17 -0
  17. package/dist/adapters/cli/commands/upgrade-projects.d.ts.map +1 -0
  18. package/dist/adapters/cli/commands/upgrade-projects.js +75 -0
  19. package/dist/adapters/cli/commands/upgrade-projects.js.map +1 -0
  20. package/dist/adapters/cli/report-renderer.d.ts +43 -0
  21. package/dist/adapters/cli/report-renderer.d.ts.map +1 -0
  22. package/dist/adapters/cli/report-renderer.js +184 -0
  23. package/dist/adapters/cli/report-renderer.js.map +1 -0
  24. package/dist/adapters/fs/claim-registry.d.ts.map +1 -1
  25. package/dist/adapters/fs/claim-registry.js +15 -2
  26. package/dist/adapters/fs/claim-registry.js.map +1 -1
  27. package/dist/adapters/fs/projects-registry.d.ts +21 -0
  28. package/dist/adapters/fs/projects-registry.d.ts.map +1 -1
  29. package/dist/adapters/fs/projects-registry.js +54 -1
  30. package/dist/adapters/fs/projects-registry.js.map +1 -1
  31. package/dist/adapters/fs/update-map.d.ts +102 -0
  32. package/dist/adapters/fs/update-map.d.ts.map +1 -0
  33. package/dist/adapters/fs/update-map.js +95 -0
  34. package/dist/adapters/fs/update-map.js.map +1 -0
  35. package/dist/adapters/fs/upgrade-lock.d.ts +23 -0
  36. package/dist/adapters/fs/upgrade-lock.d.ts.map +1 -0
  37. package/dist/adapters/fs/upgrade-lock.js +59 -0
  38. package/dist/adapters/fs/upgrade-lock.js.map +1 -0
  39. package/dist/adapters/render/opencode/opencode-renderer.d.ts +13 -1
  40. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -1
  41. package/dist/adapters/render/opencode/opencode-renderer.js +76 -8
  42. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -1
  43. package/dist/app/use-cases/claim-artifact.d.ts +4 -1
  44. package/dist/app/use-cases/claim-artifact.d.ts.map +1 -1
  45. package/dist/app/use-cases/claim-artifact.js +9 -2
  46. package/dist/app/use-cases/claim-artifact.js.map +1 -1
  47. package/dist/app/use-cases/project-step.d.ts +52 -0
  48. package/dist/app/use-cases/project-step.d.ts.map +1 -0
  49. package/dist/app/use-cases/project-step.js +77 -0
  50. package/dist/app/use-cases/project-step.js.map +1 -0
  51. package/dist/app/use-cases/scan-unregistered.d.ts +25 -0
  52. package/dist/app/use-cases/scan-unregistered.d.ts.map +1 -0
  53. package/dist/app/use-cases/scan-unregistered.js +74 -0
  54. package/dist/app/use-cases/scan-unregistered.js.map +1 -0
  55. package/dist/app/use-cases/seed-base-playbooks.d.ts +10 -0
  56. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  57. package/dist/app/use-cases/seed-base-playbooks.js +54 -13
  58. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  59. package/dist/app/use-cases/upgrade-projects.d.ts +61 -0
  60. package/dist/app/use-cases/upgrade-projects.d.ts.map +1 -0
  61. package/dist/app/use-cases/upgrade-projects.js +379 -0
  62. package/dist/app/use-cases/upgrade-projects.js.map +1 -0
  63. package/dist/app/use-cases/verify-against-map.d.ts +48 -0
  64. package/dist/app/use-cases/verify-against-map.d.ts.map +1 -0
  65. package/dist/app/use-cases/verify-against-map.js +161 -0
  66. package/dist/app/use-cases/verify-against-map.js.map +1 -0
  67. package/dist/ports/base-set-renderer.port.d.ts +13 -0
  68. package/dist/ports/base-set-renderer.port.d.ts.map +1 -1
  69. package/package.json +3 -2
  70. package/templates/.wolf/router.log +1 -1
  71. package/templates/opencode/plugins/wolf-router.ts +158 -48
  72. package/update-map.json +204 -0
@@ -0,0 +1,379 @@
1
+ // src/app/use-cases/upgrade-projects.ts
2
+ // T7 (волна 2.19.0, REQ-01/02/05/06/09, design §«Фазы», §«Список подтверждения»,
3
+ // §«Exit-модель», §«Гварды прохода», §«Вайрфреймы»): оркестратор прохода парка
4
+ // — планы из реестра + карты, одно подтверждение списка (ADR-4: покрывает и
5
+ // удаления), изоляция сбоев per-project (REQ-06), парковые счётчики (REQ-05),
6
+ // exit 0/1/2, скан незарегистрированных после сводного отчёта (REQ-09).
7
+ // Без CLI-обвязки: hidden-команда, npm-фаза, re-exec, banner и печать
8
+ // подтверждения — T8 (Ф5); use-case детерминирован для тестов exit-модели:
9
+ // катастрофы (lock занят, реестр/карта нечитаемы) — результат с exitCode 1,
10
+ // не throw; caller печатает report и выходит с exitCode.
11
+ import { readFileSync, realpathSync } from 'fs';
12
+ import { basename, join } from 'path';
13
+ import { dedupeByRealpath } from '../../adapters/fs/projects-registry.js';
14
+ import { resolveMemoryRoot } from '../../adapters/fs/memory-root.js';
15
+ import { loadSyncState } from '../../adapters/render/sync-state.js';
16
+ import { parseStamp } from '../../adapters/render/stamp.js';
17
+ import { compareVersions } from '../../adapters/fs/update-map.js';
18
+ import { runProjectStep } from './project-step.js';
19
+ import { projectPath } from './verify-against-map.js';
20
+ /** id lock'а параллельного upgrade (T4 UpgradeLock, design «Гварды прохода»). */
21
+ const LOCK_ID = 'wolf-upgrade';
22
+ const SECTION_TITLE = 'wolf upgrade — projects';
23
+ const msg = (err) => (err instanceof Error ? err.message : String(err));
24
+ const line = (marker, text, dim = false) => ({ kind: 'line', marker, text, dim });
25
+ /** Катастрофы прохода (lock занят, реестр/карта нечитаемы) — результат, не
26
+ * throw: exit 1 + error-строка; проекты не тронуты (контракт lead). */
27
+ function guardFailure(message) {
28
+ return {
29
+ exitCode: 1,
30
+ report: {
31
+ kind: 'section',
32
+ title: SECTION_TITLE,
33
+ children: [line('error', message), line('error', 'Failed')],
34
+ },
35
+ counters: [],
36
+ };
37
+ }
38
+ export async function runUpgradeProjects(deps, opts = {}) {
39
+ const lock = deps.upgradeLock;
40
+ if (lock) {
41
+ try {
42
+ lock.acquire(LOCK_ID);
43
+ }
44
+ catch (err) {
45
+ // чужой живой lock: не снимаем (release удалил бы файл владельца)
46
+ return guardFailure(msg(err));
47
+ }
48
+ }
49
+ try {
50
+ return await runPass(deps, opts);
51
+ }
52
+ finally {
53
+ lock?.release(LOCK_ID);
54
+ }
55
+ }
56
+ async function runPass(deps, opts) {
57
+ let registered;
58
+ try {
59
+ registered = await deps.registry.listStrict();
60
+ }
61
+ catch (err) {
62
+ return guardFailure(`failed to read the projects registry: ${msg(err)}`);
63
+ }
64
+ if (registered.length === 0) {
65
+ return {
66
+ exitCode: 0,
67
+ report: {
68
+ kind: 'section',
69
+ title: SECTION_TITLE,
70
+ children: [
71
+ line('info', 'no projects in the registry — run wolf init in a project to register it'),
72
+ line('ok', 'Done: no projects'),
73
+ ],
74
+ },
75
+ counters: [],
76
+ };
77
+ }
78
+ let map;
79
+ try {
80
+ map = deps.loadMap();
81
+ }
82
+ catch (err) {
83
+ return guardFailure(`failed to load the update map: ${msg(err)}`);
84
+ }
85
+ // Планы: realpath → статусы worktree/pinned/missing; дедуп по realpath —
86
+ // дубль отмечается в отчёте, второй записи прохода нет (design «Гварды»).
87
+ const { unique, duplicates } = dedupeByRealpath(registered);
88
+ const plans = unique.map(planOf);
89
+ const active = plans.filter((p) => p.status === null);
90
+ // Подтверждение списка (REQ-02): --yes — без вопросов; TTY — confirm;
91
+ // не-TTY/без confirm — проход пропущен (не ошибка, exit 0).
92
+ let proceed = opts.yes === true;
93
+ let declinedByUser = false;
94
+ if (!proceed && opts.tty && opts.confirm) {
95
+ // планы передаются аргументом — список показывается ДО вопроса (REQ-02)
96
+ proceed = await opts.confirm(plansSection(plans, registered.length, duplicates, map));
97
+ declinedByUser = !proceed;
98
+ }
99
+ if (!proceed) {
100
+ const finalText = declinedByUser ? 'Cancelled — no changes' : 'Cancelled: --yes is required';
101
+ return {
102
+ exitCode: 0,
103
+ report: {
104
+ kind: 'section',
105
+ title: SECTION_TITLE,
106
+ children: [plansSection(plans, registered.length, duplicates, map), line('info', finalText, true)],
107
+ },
108
+ counters: [],
109
+ };
110
+ }
111
+ // Подтверждение списка покрывает и удаления (ADR-4): removed-цели карты —
112
+ // подтверждённые, второго вопроса шаг не задаёт.
113
+ const confirmedRemovals = map.files.filter((f) => f.category === 'removed').map(projectPath);
114
+ const runStep = deps.runStep ?? runProjectStep;
115
+ const outcomes = [];
116
+ for (const plan of active) {
117
+ try {
118
+ const report = await runStep(withNow(deps.makeStepDeps(plan.path), opts.now), plan.path, map, {
119
+ confirmedRemovals,
120
+ });
121
+ outcomes.push({ plan, status: statusOf(report), report });
122
+ }
123
+ catch (err) {
124
+ // Изоляция сбоев (REQ-06): ошибка проекта не останавливает обход.
125
+ outcomes.push({ plan, status: 'error', error: msg(err) });
126
+ }
127
+ }
128
+ // Счётчики (REQ-05/R11.6): статусы парка + категории карты (один раз) + досеяно лиц.
129
+ const planStatuses = { worktree: 0, pinned: 0, missing: 0 };
130
+ for (const plan of plans)
131
+ if (plan.status)
132
+ planStatuses[plan.status]++;
133
+ const stepStatuses = {
134
+ updated: 0,
135
+ 'up-to-date': 0,
136
+ 'needs-decision': 0,
137
+ error: 0,
138
+ };
139
+ let facesSeeded = 0;
140
+ for (const o of outcomes) {
141
+ stepStatuses[o.status]++;
142
+ if (o.report) {
143
+ facesSeeded += o.report.seed.filter((s) => s.kind === 'seeded' || s.kind === 'legacy-absorbed').length;
144
+ }
145
+ }
146
+ const cats = mapCategories(map);
147
+ const counters = [
148
+ { label: 'updated', count: stepStatuses.updated },
149
+ { label: 'up-to-date', count: stepStatuses['up-to-date'] },
150
+ { label: 'worktree', count: planStatuses.worktree },
151
+ { label: 'pinned', count: planStatuses.pinned },
152
+ { label: 'missing', count: planStatuses.missing },
153
+ { label: 'needs decision', count: stepStatuses['needs-decision'] },
154
+ { label: 'errors', count: stepStatuses.error },
155
+ { label: 'new', count: cats.new },
156
+ { label: 'changed', count: cats.changed },
157
+ { label: 'deprecated', count: cats.deprecated },
158
+ { label: 'removed', count: cats.removed },
159
+ { label: 'faces seeded', count: facesSeeded },
160
+ ];
161
+ // Exit-модель (design §«Exit-модель»): error → 1 «Failed»; 0 error +
162
+ // ≥1 «требует решения» → 2 «Done with attention»; иначе 0 «Done».
163
+ const errors = stepStatuses.error;
164
+ const needsDecision = stepStatuses['needs-decision'];
165
+ const exitCode = errors > 0 ? 1 : needsDecision > 0 ? 2 : 0;
166
+ const finalText = errors > 0 ? 'Failed' : needsDecision > 0 ? 'Done with attention' : 'Done';
167
+ // Скан незарегистрированных (REQ-09): после сводного отчёта; ошибка скана —
168
+ // не ошибка прохода (exitCode не меняется).
169
+ const scan = await scanLines(deps, registered);
170
+ return {
171
+ exitCode,
172
+ report: {
173
+ kind: 'section',
174
+ title: SECTION_TITLE,
175
+ children: [
176
+ plansSection(plans, registered.length, duplicates, map),
177
+ projectsSection(outcomes),
178
+ // Суффикс summary у renderer фиксирован («— Done») и не выражает
179
+ // exit-таблицу — слово финальной строки передаёт оркестратор строкой.
180
+ { kind: 'summary', counters, done: false },
181
+ line(exitCode === 1 ? 'error' : exitCode === 2 ? 'warn' : 'ok', finalText),
182
+ ...scan,
183
+ ],
184
+ },
185
+ counters,
186
+ };
187
+ }
188
+ /** План одной записи реестра: realpath → статусы (порядок гвардов: missing →
189
+ * worktree → pinned); состав/штамп — справочно, только для активных планов. */
190
+ function planOf(entry) {
191
+ let real;
192
+ try {
193
+ real = realpathSync(entry.path);
194
+ }
195
+ catch {
196
+ return { name: basename(entry.path), path: entry.path, status: 'missing', composition: null, stampFloor: null };
197
+ }
198
+ // .wolf/ общий с main-чекоутом — копию пропускает main-запись (design «Гварды»)
199
+ if (resolveMemoryRoot(real).worktree !== null) {
200
+ return { name: basename(real), path: real, status: 'worktree', composition: null, stampFloor: null };
201
+ }
202
+ if (entry.pinned) {
203
+ return { name: basename(real), path: real, status: 'pinned', composition: null, stampFloor: null };
204
+ }
205
+ const stamps = stampVersions(real);
206
+ return { name: basename(real), path: real, status: null, composition: stamps.max, stampFloor: stamps.min };
207
+ }
208
+ /** Справочные версии состава (REQ-02): max/min set= по штампованным файлам
209
+ * свидетеля рендера (loadSyncState). Штамп недостоверен (инвентаризация §3.4)
210
+ * — свидетель касания, не истина; истина состава — карта.
211
+ * shortcut: неоднородность штампов показана min/max, контент-сверка — зона --check (T10). */
212
+ function stampVersions(root) {
213
+ let max = null;
214
+ let min = null;
215
+ for (const rel of Object.keys(loadSyncState(root).files)) {
216
+ let stamp;
217
+ try {
218
+ stamp = parseStamp(readFileSync(join(root, rel), 'utf-8'));
219
+ }
220
+ catch {
221
+ continue;
222
+ }
223
+ if (!stamp)
224
+ continue;
225
+ if (max === null || compareVersions(stamp.set, max) > 0)
226
+ max = stamp.set;
227
+ if (min === null || compareVersions(stamp.set, min) < 0)
228
+ min = stamp.set;
229
+ }
230
+ return { max, min };
231
+ }
232
+ /** Статус проекта по отчёту шага (REQ-05): done с фактическими изменениями
233
+ * этого прохода — updated, без — up-to-date; needs-decision/error — как есть.
234
+ * «Действие» берём из фаз шага, не из кодов сверки: verify-код removed —
235
+ * состояние «подтверждённо отсутствует» (идемпотентность NFR-02), в повторном
236
+ * прогоне это не изменение. */
237
+ export function statusOf(report) {
238
+ if (report.exitKind !== 'done')
239
+ return report.exitKind;
240
+ const changed = report.sync.outcomes.some((o) => o.action === 'updated' || o.action === 'created' || o.action === 'appended') ||
241
+ report.sync.removed.length > 0 ||
242
+ report.seed.some((s) => s.kind === 'seeded' || s.kind === 'legacy-absorbed') ||
243
+ report.schema.status === 'migrated';
244
+ return changed ? 'updated' : 'up-to-date';
245
+ }
246
+ /** Категории карты (числами, REQ-02/R11.6) — считаются один раз по карте.
247
+ * Экспорт — точечный reuse для T9 (--here, одиночный план). */
248
+ export function mapCategories(map) {
249
+ const cats = { new: 0, changed: 0, deprecated: 0, removed: 0 };
250
+ for (const f of map.files) {
251
+ if (f.category !== 'unchanged')
252
+ cats[f.category]++;
253
+ }
254
+ return cats;
255
+ }
256
+ /** opts.now — дефолт часов шага, если фабрика не задала свои (NFR-03). */
257
+ function withNow(deps, now) {
258
+ return deps.now || !now ? deps : { ...deps, now };
259
+ }
260
+ /** Секция планов/подтверждения (REQ-02, вайрфрейм (1)): обзор реестра,
261
+ * строка плана на запись (поля-контракт), дубликаты realpath. */
262
+ function plansSection(plans, registrySize, duplicates, map) {
263
+ const cats = mapCategories(map);
264
+ const seedFaces = map.faces.filter((f) => f.seed).length;
265
+ const note = [];
266
+ const statusCount = (s) => plans.filter((p) => p.status === s).length;
267
+ const pinned = statusCount('pinned');
268
+ const worktree = statusCount('worktree');
269
+ const missing = statusCount('missing');
270
+ if (pinned)
271
+ note.push(`${pinned} pinned`);
272
+ if (worktree)
273
+ note.push(`${worktree} worktree`);
274
+ if (missing)
275
+ note.push(`${missing} missing`);
276
+ const children = [
277
+ line('info', `${registrySize} ${registrySize === 1 ? 'project' : 'projects'} in registry${note.length ? ` (${note.join(', ')})` : ''}`),
278
+ ];
279
+ for (const plan of plans) {
280
+ if (plan.status === null) {
281
+ children.push(line('info', `plan: ${plan.name} · ${plan.path}`));
282
+ const floor = plan.stampFloor !== null && plan.stampFloor !== plan.composition ? ` (stamps from ${plan.stampFloor})` : '';
283
+ children.push(line('info', `composition ${plan.composition ?? 'unknown'}${floor} → ${map.version}`, true));
284
+ children.push(line('info', `map: ${cats.new} new · ${cats.changed} changed · ${cats.deprecated} deprecated · ${cats.removed} removed · seed×${seedFaces}`, true));
285
+ }
286
+ else {
287
+ const reason = plan.status === 'worktree'
288
+ ? ' (shared .wolf with the main checkout)'
289
+ : plan.status === 'missing'
290
+ ? ' (path does not exist)'
291
+ : '';
292
+ children.push(line('skip', `plan: ${plan.name} · ${plan.path} · [${plan.status}] — skipped${reason}`));
293
+ }
294
+ }
295
+ for (const dup of duplicates) {
296
+ children.push(line('info', `duplicate registry entry collapsed: ${dup.path}`, true));
297
+ }
298
+ return { kind: 'section', title: 'Plans', children };
299
+ }
300
+ /** Отображение статуса в строке отчёта (REQ-05): «требует решения» — текст
301
+ * счётчика, не литерал ExitKind шага. Экспорт — точечный reuse для T9 (--here). */
302
+ export const STATUS_TEXT = {
303
+ updated: 'updated',
304
+ 'up-to-date': 'up-to-date',
305
+ 'needs-decision': 'needs decision',
306
+ error: 'error',
307
+ };
308
+ /** Секция проектов: строка-статус на проект + детали шага (REQ-05, палитра T3). */
309
+ function projectsSection(outcomes) {
310
+ const children = [];
311
+ for (const o of outcomes) {
312
+ const marker = o.status === 'error' ? 'error' : o.status === 'needs-decision' ? 'warn' : 'ok';
313
+ children.push(line(marker, o.error ? `${o.plan.name} — error: ${o.error}` : `${o.plan.name} — ${STATUS_TEXT[o.status]}`, o.status === 'up-to-date'));
314
+ const r = o.report;
315
+ if (!r)
316
+ continue;
317
+ const bs = baseSetSummary(r);
318
+ if (bs)
319
+ children.push(line('info', `base-set: ${bs}`, true));
320
+ if (r.seed.length > 0) {
321
+ const faces = r.seed.map((s) => `${s.file.replace(/-playbook\.md$/, '')} ${s.kind ?? s.action}`).join(', ');
322
+ children.push(line('info', `faces: ${faces}`, true));
323
+ }
324
+ if (r.schema.status !== 'ok') {
325
+ children.push(line('warn', `schema: ${r.schema.status}${r.schema.error ? ` — ${r.schema.error}` : ''}`, true));
326
+ }
327
+ const v = r.verify.summary;
328
+ const ok = r.verify.items.length - v.needsDecision - v.errors;
329
+ const parts = [`${ok}/${r.verify.items.length} ok`];
330
+ if (v.needsDecision > 0)
331
+ parts.push(`${v.needsDecision} needs decision`);
332
+ if (v.errors > 0)
333
+ parts.push(`${v.errors} errors`);
334
+ children.push(line(v.errors > 0 ? 'error' : v.needsDecision > 0 ? 'warn' : 'info', `verify: ${parts.join(' · ')}`, true));
335
+ }
336
+ return { kind: 'section', title: 'Projects', children };
337
+ }
338
+ /** Исходы sync одной строкой: ненулевые счётчики по действиям. */
339
+ function baseSetSummary(r) {
340
+ if (r.sync.outcomes.length === 0)
341
+ return null;
342
+ const counts = { updated: 0, created: 0, appended: 0, identical: 0, mutated: 0, conflict: 0 };
343
+ for (const o of r.sync.outcomes) {
344
+ if (o.action === 'skipped') {
345
+ if (o.mutated)
346
+ counts.mutated++;
347
+ else
348
+ counts.identical++;
349
+ }
350
+ else {
351
+ counts[o.action]++;
352
+ }
353
+ }
354
+ const parts = Object.entries(counts)
355
+ .filter(([, n]) => n > 0)
356
+ .map(([k, n]) => `${n} ${k}`);
357
+ return parts.length > 0 ? parts.join(', ') : null;
358
+ }
359
+ /** Строки скана (REQ-09): hint с плюрализацией + топ-пути; сбой — предупреждение. */
360
+ async function scanLines(deps, registered) {
361
+ if (!deps.scan)
362
+ return [];
363
+ try {
364
+ const found = await deps.scan({ registeredPaths: registered.map((p) => p.path) });
365
+ if (!found)
366
+ return [];
367
+ const noun = found.found === 1 ? 'project' : 'projects';
368
+ const lines = [
369
+ line('warn', `found ${found.found} ${noun} with wolf memory outside the registry; running any wolf command in a project registers it (self-healing)`, true),
370
+ ];
371
+ for (const path of found.top)
372
+ lines.push(line('info', path, true));
373
+ return lines;
374
+ }
375
+ catch (err) {
376
+ return [line('warn', `unregistered-projects scan failed: ${msg(err)} — pass result unaffected`, true)];
377
+ }
378
+ }
379
+ //# sourceMappingURL=upgrade-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-projects.js","sourceRoot":"","sources":["../../../src/app/use-cases/upgrade-projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { FileEntry, UpdateMap } from '../../adapters/fs/update-map.js';
2
+ import type { RenderOutcome } from '../../ports/base-set-renderer.port.js';
3
+ import type { SeedOutcome } from './seed-base-playbooks.js';
4
+ /** Структурные коды исхода сверки (design §«Сверка» / глоссарий). */
5
+ export type VerifyCode = 'updated' | 'created' | 'removed' | 'seeded' | 'skipped-identical' | 'skipped-mutated' | 'skipped-live' | 'legacy-absorbed' | 'deprecated-noted' | 'unchanged' | 'diverged' | 'conflict';
6
+ /** Коды, всегда отображаемые как «требует решения» (view-код needs-decision). */
7
+ export declare const NEEDS_DECISION_CODES: ReadonlySet<VerifyCode>;
8
+ export interface VerifyItem {
9
+ /** Ключ цели: путь карты (files/agents_md — проектный для фактов вне карты) или шаблон лица. */
10
+ target: string;
11
+ kind: 'file' | 'agents-md' | 'face';
12
+ code: VerifyCode | 'error';
13
+ needsDecision: boolean;
14
+ detail?: string;
15
+ }
16
+ /** Сводка проекта: счётчики исходов по кодам + «требует решения» + errors. */
17
+ export interface VerifySummary {
18
+ byCode: Partial<Record<VerifyCode, number>>;
19
+ needsDecision: number;
20
+ errors: number;
21
+ }
22
+ export interface VerifyResult {
23
+ items: VerifyItem[];
24
+ summary: VerifySummary;
25
+ }
26
+ /**
27
+ * Sync-исход для сверки. В RenderOutcome action='skipped' покрывает и
28
+ * 'content identical', и 'mutated after render' (различие — только в
29
+ * reason-строке, парсинг запрещён контрактом T5). Композитор проектного
30
+ * шага обязан выставить структурный признак мутанта.
31
+ */
32
+ export type SyncVerifyOutcome = RenderOutcome & {
33
+ mutated?: boolean;
34
+ };
35
+ export interface VerifyOutcomes {
36
+ syncOutcomes: SyncVerifyOutcome[];
37
+ seedOutcomes: SeedOutcome[];
38
+ /** removed-цели (проектные пути), подтверждённо отсутствующие после шага
39
+ * удалений: удалённые в этом проходе или отсутствовавшие ранее. */
40
+ removals: string[];
41
+ }
42
+ /** Путь цели карты → проектный путь (LAYOUT opencode-renderer.ts). Экспорт —
43
+ * точечный (T6): проектный шаг использует тот же перевод путей в удалениях. */
44
+ export declare function projectPath(entry: FileEntry): string;
45
+ /** Сверка проекта против карты: каждый пункт карты получает статус,
46
+ * факты без ожидания → conflict, отсутствие статуса → error. */
47
+ export declare function verifyAgainstMap(map: UpdateMap, outcomes: VerifyOutcomes): VerifyResult;
48
+ //# sourceMappingURL=verify-against-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-against-map.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/verify-against-map.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAa,SAAS,EAA4B,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,qEAAqE;AACrE,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,SAAS,GACT,QAAQ,GACR,mBAAmB,GACnB,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,WAAW,GACX,UAAU,GACV,UAAU,CAAC;AAEf,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,UAAU,CAAwD,CAAC;AAElH,MAAM,WAAW,UAAU;IACzB,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B;wEACoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAgBD;+EAC+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAGpD;AAwCD;iEACiE;AACjE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,YAAY,CA+DvF"}
@@ -0,0 +1,161 @@
1
+ // src/app/use-cases/verify-against-map.ts
2
+ // T5 (волна 2.19.0, REQ-11, design §«Сверка»): движок сверки проекта против
3
+ // карты обновления. Чистая функция без I/O: ожидание из карты × факт из
4
+ // исходов прохода (sync → seed → removals, design §«Проектный шаг» шаг 5).
5
+ // Исходы — структурные коды, НЕ reason-строки.
6
+ import { basename } from 'path';
7
+ /** Коды, всегда отображаемые как «требует решения» (view-код needs-decision). */
8
+ export const NEEDS_DECISION_CODES = new Set(['skipped-mutated', 'diverged', 'conflict']);
9
+ /** Корень карты (по kind, генератор T1) → корень проекта (LAYOUT opencode-renderer.ts). */
10
+ const TARGET_ROOT = {
11
+ agent: '.opencode/agents/',
12
+ skill: '.opencode/skills/',
13
+ command: '.opencode/command/',
14
+ plugin: '.opencode/plugins/',
15
+ };
16
+ const SOURCE_ROOT = {
17
+ agent: 'base/agents/',
18
+ skill: 'base/skills/',
19
+ command: 'base/commands/',
20
+ plugin: 'opencode/plugins/',
21
+ };
22
+ /** Путь цели карты → проектный путь (LAYOUT opencode-renderer.ts). Экспорт —
23
+ * точечный (T6): проектный шаг использует тот же перевод путей в удалениях. */
24
+ export function projectPath(entry) {
25
+ const src = SOURCE_ROOT[entry.kind];
26
+ return entry.path.startsWith(src) ? TARGET_ROOT[entry.kind] + entry.path.slice(src.length) : entry.path;
27
+ }
28
+ /** Факт sync → код сверки. appended (AGENTS-блок init) ≈ updated. */
29
+ function syncFact(o) {
30
+ if (o.action === 'conflict')
31
+ return 'conflict';
32
+ if (o.action === 'skipped')
33
+ return o.mutated ? 'skipped-mutated' : 'skipped-identical';
34
+ if (o.action === 'appended')
35
+ return 'updated';
36
+ return o.action;
37
+ }
38
+ /**
39
+ * Категория карты × факт → код. Мутант и unstamped-conflict перекрывают
40
+ * любое ожидание → «требует решения». created/updated/skipped-identical —
41
+ * конечное состояние равно текущему рендеру (повтор прогона NFR-02 — exit 0).
42
+ */
43
+ function fileVerdict(category, fact) {
44
+ if (fact === 'skipped-mutated' || fact === 'conflict')
45
+ return fact;
46
+ switch (category) {
47
+ case 'new':
48
+ case 'changed':
49
+ return fact;
50
+ case 'unchanged':
51
+ return fact === 'skipped-identical' ? 'unchanged' : fact;
52
+ case 'deprecated':
53
+ // «файл на месте»: identical/updated → пометка; created → файла не было
54
+ // (удалён вручную до прохода) — факт ≠ ожиданию → «требует решения».
55
+ return fact === 'created' ? 'conflict' : 'deprecated-noted';
56
+ case 'removed':
57
+ return fact;
58
+ }
59
+ }
60
+ function item(kind, target, code, detail) {
61
+ return { kind, target, code, needsDecision: NEEDS_DECISION_CODES.has(code), detail };
62
+ }
63
+ function errorItem(kind, target, detail) {
64
+ return { kind, target, code: 'error', needsDecision: false, detail };
65
+ }
66
+ /** Сверка проекта против карты: каждый пункт карты получает статус,
67
+ * факты без ожидания → conflict, отсутствие статуса → error. */
68
+ export function verifyAgainstMap(map, outcomes) {
69
+ if (!map || !Array.isArray(map.files) || !Array.isArray(map.faces) || !map.agents_md) {
70
+ throw new Error('verifyAgainstMap: invalid update map (files/faces/agents_md are required)');
71
+ }
72
+ const items = [];
73
+ const syncByFile = new Map(outcomes.syncOutcomes.map((o) => [o.file, o]));
74
+ const seedByTemplate = new Map(outcomes.seedOutcomes.map((o) => [o.file, o]));
75
+ const removals = new Set(outcomes.removals);
76
+ const seenSync = new Set();
77
+ const seenSeed = new Set();
78
+ const seenRemovals = new Set();
79
+ for (const entry of map.files) {
80
+ const path = projectPath(entry);
81
+ if (entry.category === 'removed') {
82
+ if (removals.has(path)) {
83
+ seenRemovals.add(path);
84
+ items.push(item('file', entry.path, 'removed'));
85
+ }
86
+ else {
87
+ items.push(errorItem('file', entry.path, 'removed target got no removal status'));
88
+ }
89
+ continue;
90
+ }
91
+ const fact = syncByFile.get(path);
92
+ if (!fact) {
93
+ items.push(errorItem('file', entry.path, `${entry.category} target got no sync outcome`));
94
+ continue;
95
+ }
96
+ seenSync.add(path);
97
+ items.push(item('file', entry.path, fileVerdict(entry.category, syncFact(fact))));
98
+ }
99
+ // AGENTS.md (append-block): цель в корне проекта, категория — из карты.
100
+ const agentsFact = syncByFile.get('AGENTS.md');
101
+ if (agentsFact) {
102
+ seenSync.add('AGENTS.md');
103
+ items.push(item('agents-md', 'AGENTS.md', fileVerdict(map.agents_md.category, syncFact(agentsFact))));
104
+ }
105
+ else {
106
+ items.push(errorItem('agents-md', 'AGENTS.md', 'agents_md target got no sync outcome'));
107
+ }
108
+ for (const face of map.faces) {
109
+ items.push(faceEntry(face, seedByTemplate, seenSeed));
110
+ }
111
+ // Факт без ожидания → conflict → «требует решения» (дрейф без объявления).
112
+ for (const o of outcomes.syncOutcomes) {
113
+ if (!seenSync.has(o.file)) {
114
+ items.push(item('file', o.file, 'conflict', 'sync outcome for a file outside the map'));
115
+ }
116
+ }
117
+ for (const o of outcomes.seedOutcomes) {
118
+ if (!seenSeed.has(o.file)) {
119
+ items.push(item('face', o.file, 'conflict', 'seed outcome for a face outside the map'));
120
+ }
121
+ }
122
+ for (const p of outcomes.removals) {
123
+ if (!seenRemovals.has(p)) {
124
+ items.push(item('file', p, 'conflict', 'removal of a file not declared removed in the map'));
125
+ }
126
+ }
127
+ return { items, summary: summarize(items) };
128
+ }
129
+ function faceEntry(face, seedByTemplate, seenSeed) {
130
+ // SeedOutcome.file — базовое имя шаблона (прецедент memory-init.ts); playbooks — плоский каталог.
131
+ const fact = seedByTemplate.get(basename(face.template));
132
+ if (!face.seed) {
133
+ // deprecated-шаблон лица: репортится, не мутируется (R10.4)
134
+ if (!fact)
135
+ return item('face', face.template, 'deprecated-noted');
136
+ seenSeed.add(fact.file);
137
+ return item('face', face.template, 'conflict', 'deprecated face template must not be seeded or updated');
138
+ }
139
+ if (!fact)
140
+ return errorItem('face', face.template, 'seed target got no seed outcome');
141
+ seenSeed.add(fact.file);
142
+ if (!fact.kind) {
143
+ return errorItem('face', face.template, 'seed outcome carries no structural kind (legacy seed mode?)');
144
+ }
145
+ return item('face', face.template, fact.kind);
146
+ }
147
+ function summarize(items) {
148
+ const byCode = {};
149
+ let needsDecision = 0;
150
+ let errors = 0;
151
+ for (const it of items) {
152
+ if (it.code === 'error')
153
+ errors++;
154
+ else
155
+ byCode[it.code] = (byCode[it.code] ?? 0) + 1;
156
+ if (it.needsDecision)
157
+ needsDecision++;
158
+ }
159
+ return { byCode, needsDecision, errors };
160
+ }
161
+ //# sourceMappingURL=verify-against-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-against-map.js","sourceRoot":"","sources":["../../../src/app/use-cases/verify-against-map.ts"],"names":[],"mappings":"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"}