mister-wolf 2.18.5 → 2.20.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 (102) hide show
  1. package/README.md +12 -1
  2. package/README.ru.md +33 -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/memory-doctor.d.ts.map +1 -1
  7. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  8. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
  9. package/dist/adapters/cli/commands/memory-sync.js +3 -0
  10. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  11. package/dist/adapters/cli/commands/memory-uninstall.d.ts.map +1 -1
  12. package/dist/adapters/cli/commands/memory-uninstall.js.map +1 -1
  13. package/dist/adapters/cli/commands/memory-upgrade.d.ts +274 -0
  14. package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
  15. package/dist/adapters/cli/commands/memory-upgrade.js +1354 -6
  16. package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
  17. package/dist/adapters/cli/commands/upgrade-projects.d.ts +19 -0
  18. package/dist/adapters/cli/commands/upgrade-projects.d.ts.map +1 -0
  19. package/dist/adapters/cli/commands/upgrade-projects.js +85 -0
  20. package/dist/adapters/cli/commands/upgrade-projects.js.map +1 -0
  21. package/dist/adapters/cli/report-renderer.d.ts +43 -0
  22. package/dist/adapters/cli/report-renderer.d.ts.map +1 -0
  23. package/dist/adapters/cli/report-renderer.js +184 -0
  24. package/dist/adapters/cli/report-renderer.js.map +1 -0
  25. package/dist/adapters/fs/projects-registry.d.ts +21 -0
  26. package/dist/adapters/fs/projects-registry.d.ts.map +1 -1
  27. package/dist/adapters/fs/projects-registry.js +54 -1
  28. package/dist/adapters/fs/projects-registry.js.map +1 -1
  29. package/dist/adapters/fs/update-map.d.ts +102 -0
  30. package/dist/adapters/fs/update-map.d.ts.map +1 -0
  31. package/dist/adapters/fs/update-map.js +95 -0
  32. package/dist/adapters/fs/update-map.js.map +1 -0
  33. package/dist/adapters/fs/upgrade-lock.d.ts +23 -0
  34. package/dist/adapters/fs/upgrade-lock.d.ts.map +1 -0
  35. package/dist/adapters/fs/upgrade-lock.js +59 -0
  36. package/dist/adapters/fs/upgrade-lock.js.map +1 -0
  37. package/dist/adapters/render/opencode/opencode-renderer.d.ts +45 -5
  38. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -1
  39. package/dist/adapters/render/opencode/opencode-renderer.js +434 -86
  40. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -1
  41. package/dist/adapters/render/stamp.d.ts +2 -0
  42. package/dist/adapters/render/stamp.d.ts.map +1 -1
  43. package/dist/adapters/render/stamp.js +9 -1
  44. package/dist/adapters/render/stamp.js.map +1 -1
  45. package/dist/adapters/render/sync-state.d.ts +15 -3
  46. package/dist/adapters/render/sync-state.d.ts.map +1 -1
  47. package/dist/adapters/render/sync-state.js +52 -8
  48. package/dist/adapters/render/sync-state.js.map +1 -1
  49. package/dist/app/use-cases/decisions.d.ts +247 -0
  50. package/dist/app/use-cases/decisions.d.ts.map +1 -0
  51. package/dist/app/use-cases/decisions.js +528 -0
  52. package/dist/app/use-cases/decisions.js.map +1 -0
  53. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  54. package/dist/app/use-cases/init-project.js +34 -1
  55. package/dist/app/use-cases/init-project.js.map +1 -1
  56. package/dist/app/use-cases/platform-mismatch.d.ts +2 -1
  57. package/dist/app/use-cases/platform-mismatch.d.ts.map +1 -1
  58. package/dist/app/use-cases/platform-mismatch.js.map +1 -1
  59. package/dist/app/use-cases/project-step.d.ts +71 -0
  60. package/dist/app/use-cases/project-step.d.ts.map +1 -0
  61. package/dist/app/use-cases/project-step.js +163 -0
  62. package/dist/app/use-cases/project-step.js.map +1 -0
  63. package/dist/app/use-cases/repair-platform.d.ts +2 -1
  64. package/dist/app/use-cases/repair-platform.d.ts.map +1 -1
  65. package/dist/app/use-cases/repair-platform.js.map +1 -1
  66. package/dist/app/use-cases/scan-unregistered.d.ts +25 -0
  67. package/dist/app/use-cases/scan-unregistered.d.ts.map +1 -0
  68. package/dist/app/use-cases/scan-unregistered.js +74 -0
  69. package/dist/app/use-cases/scan-unregistered.js.map +1 -0
  70. package/dist/app/use-cases/seed-base-playbooks.d.ts +10 -0
  71. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  72. package/dist/app/use-cases/seed-base-playbooks.js +54 -13
  73. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  74. package/dist/app/use-cases/sync-base-set.d.ts +4 -2
  75. package/dist/app/use-cases/sync-base-set.d.ts.map +1 -1
  76. package/dist/app/use-cases/sync-base-set.js +4 -2
  77. package/dist/app/use-cases/sync-base-set.js.map +1 -1
  78. package/dist/app/use-cases/uninstall.d.ts +2 -1
  79. package/dist/app/use-cases/uninstall.d.ts.map +1 -1
  80. package/dist/app/use-cases/uninstall.js.map +1 -1
  81. package/dist/app/use-cases/upgrade-projects.d.ts +91 -0
  82. package/dist/app/use-cases/upgrade-projects.d.ts.map +1 -0
  83. package/dist/app/use-cases/upgrade-projects.js +494 -0
  84. package/dist/app/use-cases/upgrade-projects.js.map +1 -0
  85. package/dist/app/use-cases/verify-against-map.d.ts +52 -0
  86. package/dist/app/use-cases/verify-against-map.d.ts.map +1 -0
  87. package/dist/app/use-cases/verify-against-map.js +189 -0
  88. package/dist/app/use-cases/verify-against-map.js.map +1 -0
  89. package/dist/domain/line-diff.d.ts +36 -0
  90. package/dist/domain/line-diff.d.ts.map +1 -0
  91. package/dist/domain/line-diff.js +175 -0
  92. package/dist/domain/line-diff.js.map +1 -0
  93. package/dist/domain/protect-key.d.ts +21 -0
  94. package/dist/domain/protect-key.d.ts.map +1 -0
  95. package/dist/domain/protect-key.js +112 -0
  96. package/dist/domain/protect-key.js.map +1 -0
  97. package/dist/ports/base-set-renderer.port.d.ts +62 -1
  98. package/dist/ports/base-set-renderer.port.d.ts.map +1 -1
  99. package/package.json +3 -2
  100. package/templates/.wolf/router.log +1 -1
  101. package/templates/base/AGENTS.md +6 -3
  102. package/update-map.json +204 -0
@@ -0,0 +1,494 @@
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
+ projects: [],
37
+ plan: { projects: 0, new: 0, changed: 0, deprecated: 0, removed: 0, faces: 0 },
38
+ };
39
+ }
40
+ /** План-счётчики §4.13: registry-проекты, категории карты, досеянные лица. */
41
+ function planCounts(plans, map, facesSeeded) {
42
+ const cats = mapCategories(map);
43
+ return { projects: plans.length, ...cats, faces: facesSeeded };
44
+ }
45
+ /** Проект, до которого проход не дошёл: только статус плана (design §4.13). */
46
+ function plannedProject(plan) {
47
+ return {
48
+ name: plan.name,
49
+ path: plan.path,
50
+ status: 'skipped',
51
+ ...(plan.status !== null ? { skipReason: plan.status } : {}),
52
+ files: [],
53
+ protected: [],
54
+ backups: [],
55
+ };
56
+ }
57
+ /** Файлы прогона для `--json.projects[].files`: путь, код, признак карты. */
58
+ export function jsonProjectFiles(report, map) {
59
+ const inMap = new Set(['AGENTS.md', ...map.files.map((e) => projectPath(e))]);
60
+ return report.sync.outcomes.map((o) => {
61
+ const code = o.protected
62
+ ? 'protected'
63
+ : o.kept
64
+ ? 'kept'
65
+ : o.action === 'skipped'
66
+ ? o.mutated
67
+ ? 'skipped-mutated'
68
+ : 'skipped-identical'
69
+ : o.action === 'appended'
70
+ ? 'updated'
71
+ : o.action;
72
+ return { path: o.file, code, inMap: inMap.has(o.file) };
73
+ });
74
+ }
75
+ export async function runUpgradeProjects(deps, opts = {}) {
76
+ const lock = deps.upgradeLock;
77
+ if (lock) {
78
+ try {
79
+ lock.acquire(LOCK_ID);
80
+ }
81
+ catch (err) {
82
+ // чужой живой lock: не снимаем (release удалил бы файл владельца)
83
+ return guardFailure(msg(err));
84
+ }
85
+ }
86
+ try {
87
+ return await runPass(deps, opts);
88
+ }
89
+ finally {
90
+ lock?.release(LOCK_ID);
91
+ }
92
+ }
93
+ async function runPass(deps, opts) {
94
+ let registered;
95
+ try {
96
+ registered = await deps.registry.listStrict();
97
+ }
98
+ catch (err) {
99
+ return guardFailure(`failed to read the projects registry: ${msg(err)}`);
100
+ }
101
+ if (registered.length === 0) {
102
+ return {
103
+ exitCode: 0,
104
+ report: {
105
+ kind: 'section',
106
+ title: SECTION_TITLE,
107
+ children: [
108
+ line('info', 'no projects in the registry — run wolf init in a project to register it'),
109
+ line('ok', 'Done: no projects'),
110
+ ],
111
+ },
112
+ counters: [],
113
+ projects: [],
114
+ plan: { projects: 0, new: 0, changed: 0, deprecated: 0, removed: 0, faces: 0 },
115
+ };
116
+ }
117
+ let map;
118
+ try {
119
+ map = deps.loadMap();
120
+ }
121
+ catch (err) {
122
+ return guardFailure(`failed to load the update map: ${msg(err)}`);
123
+ }
124
+ // Планы: realpath → статусы worktree/pinned/missing; дедуп по realpath —
125
+ // дубль отмечается в отчёте, второй записи прохода нет (design «Гварды»).
126
+ const { unique, duplicates } = dedupeByRealpath(registered);
127
+ const plans = unique.map(planOf);
128
+ const active = plans.filter((p) => p.status === null);
129
+ // Подтверждение списка (REQ-02): --yes — без вопросов; TTY — confirm;
130
+ // не-TTY/без confirm — проход пропущен (не ошибка, exit 0).
131
+ let proceed = opts.yes === true;
132
+ let declinedByUser = false;
133
+ if (!proceed && opts.tty && opts.confirm) {
134
+ // планы передаются аргументом — список показывается ДО вопроса (REQ-02)
135
+ proceed = await opts.confirm(plansSection(plans, registered.length, duplicates, map));
136
+ declinedByUser = !proceed;
137
+ }
138
+ if (!proceed) {
139
+ const finalText = declinedByUser ? 'Cancelled — no changes' : 'Cancelled: --yes is required';
140
+ return {
141
+ exitCode: 0,
142
+ report: {
143
+ kind: 'section',
144
+ title: SECTION_TITLE,
145
+ children: [plansSection(plans, registered.length, duplicates, map), line('info', finalText, true)],
146
+ },
147
+ counters: [],
148
+ // отменённый проход: только статусы плана (design §4.13)
149
+ projects: plans.map(plannedProject),
150
+ plan: planCounts(plans, map, 0),
151
+ };
152
+ }
153
+ // Подтверждение списка покрывает и удаления (ADR-4): removed-цели карты —
154
+ // подтверждённые, второго вопроса шаг не задаёт.
155
+ const confirmedRemovals = map.files.filter((f) => f.category === 'removed').map(projectPath);
156
+ const runStep = deps.runStep ?? runProjectStep;
157
+ const outcomes = [];
158
+ for (const plan of active) {
159
+ try {
160
+ const report = await runStep(withNow(deps.makeStepDeps(plan.path), opts.now), plan.path, map, {
161
+ confirmedRemovals,
162
+ takeMutated: opts.yes === true, // §4.12: --yes = тихий take с бэкапом
163
+ });
164
+ outcomes.push({ plan, status: statusOf(report), report });
165
+ }
166
+ catch (err) {
167
+ // Изоляция сбоев (REQ-06): ошибка проекта не останавливает обход.
168
+ outcomes.push({ plan, status: 'error', error: msg(err) });
169
+ }
170
+ }
171
+ // Счётчики (REQ-05/R11.6): статусы парка + категории карты (один раз) + досеяно лиц.
172
+ const planStatuses = { worktree: 0, pinned: 0, missing: 0 };
173
+ for (const plan of plans)
174
+ if (plan.status)
175
+ planStatuses[plan.status]++;
176
+ const stepStatuses = {
177
+ updated: 0,
178
+ 'up-to-date': 0,
179
+ 'needs-decision': 0,
180
+ error: 0,
181
+ };
182
+ let facesSeeded = 0;
183
+ for (const o of outcomes) {
184
+ stepStatuses[o.status]++;
185
+ if (o.report) {
186
+ facesSeeded += o.report.seed.filter((s) => s.kind === 'seeded' || s.kind === 'legacy-absorbed').length;
187
+ }
188
+ }
189
+ const cats = mapCategories(map);
190
+ const counters = [
191
+ { label: 'updated', count: stepStatuses.updated },
192
+ { label: 'up-to-date', count: stepStatuses['up-to-date'] },
193
+ { label: 'worktree', count: planStatuses.worktree },
194
+ { label: 'pinned', count: planStatuses.pinned },
195
+ { label: 'missing', count: planStatuses.missing },
196
+ { label: 'needs decision', count: stepStatuses['needs-decision'] },
197
+ { label: 'errors', count: stepStatuses.error },
198
+ { label: 'new', count: cats.new },
199
+ { label: 'changed', count: cats.changed },
200
+ { label: 'deprecated', count: cats.deprecated },
201
+ { label: 'removed', count: cats.removed },
202
+ { label: 'faces seeded', count: facesSeeded },
203
+ ];
204
+ // Exit-модель (design §«Exit-модель»): error → 1 «Failed»; 0 error +
205
+ // ≥1 «требует решения» → 2 «Done with attention»; иначе 0 «Done».
206
+ const errors = stepStatuses.error;
207
+ const needsDecision = stepStatuses['needs-decision'];
208
+ const exitCode = errors > 0 ? 1 : needsDecision > 0 ? 2 : 0;
209
+ const finalText = errors > 0 ? 'Failed' : needsDecision > 0 ? 'Done with attention' : 'Done';
210
+ // Скан незарегистрированных (REQ-09): после сводного отчёта; ошибка скана —
211
+ // не ошибка прохода (exitCode не меняется).
212
+ const scan = await scanLines(deps, registered);
213
+ // Подсказка §4.12: TTY без --yes и оставшиеся решения — путь к разбору.
214
+ const decisionsLeft = outcomes.reduce((n, o) => n + (o.report?.verify.summary.needsDecision ?? 0), 0);
215
+ const hint = opts.tty === true && opts.yes !== true && decisionsLeft > 0
216
+ ? [
217
+ line('info', `hint: ${decisionsLeft} ${decisionsLeft === 1 ? 'file needs' : 'files need'} a decision — run wolf upgrade --review`, true),
218
+ ]
219
+ : [];
220
+ const jsonProjects = outcomes.map((o) => ({
221
+ name: o.plan.name,
222
+ path: o.plan.path,
223
+ status: o.status,
224
+ ...(o.error !== undefined ? { error: o.error } : {}),
225
+ files: o.report ? jsonProjectFiles(o.report, map) : [],
226
+ protected: [], // заполняет CLI-слой из listProtections (§4.13)
227
+ backups: o.report?.backups ?? [],
228
+ }));
229
+ for (const plan of plans)
230
+ if (plan.status !== null)
231
+ jsonProjects.push(plannedProject(plan));
232
+ return {
233
+ exitCode,
234
+ report: {
235
+ kind: 'section',
236
+ title: SECTION_TITLE,
237
+ children: [
238
+ plansSection(plans, registered.length, duplicates, map),
239
+ projectsSection(outcomes, map),
240
+ // Суффикс summary у renderer фиксирован («— Done») и не выражает
241
+ // exit-таблицу — слово финальной строки передаёт оркестратор строкой.
242
+ { kind: 'summary', counters, done: false },
243
+ ...hint,
244
+ line(exitCode === 1 ? 'error' : exitCode === 2 ? 'warn' : 'ok', finalText),
245
+ ...scan,
246
+ ],
247
+ },
248
+ counters,
249
+ projects: jsonProjects,
250
+ plan: planCounts(plans, map, facesSeeded),
251
+ };
252
+ }
253
+ /** План одной записи реестра: realpath → статусы (порядок гвардов: missing →
254
+ * worktree → pinned); состав/штамп — справочно, только для активных планов.
255
+ * Экспорт (T7, design §4.7): `collectDecisions` нумерует те же активные проекты —
256
+ * второй реализации фильтра worktree/pinned/missing нет. */
257
+ export function planOf(entry) {
258
+ let real;
259
+ try {
260
+ real = realpathSync(entry.path);
261
+ }
262
+ catch {
263
+ return { name: basename(entry.path), path: entry.path, status: 'missing', composition: null, stampFloor: null };
264
+ }
265
+ // .wolf/ общий с main-чекоутом — копию пропускает main-запись (design «Гварды»)
266
+ if (resolveMemoryRoot(real).worktree !== null) {
267
+ return { name: basename(real), path: real, status: 'worktree', composition: null, stampFloor: null };
268
+ }
269
+ if (entry.pinned) {
270
+ return { name: basename(real), path: real, status: 'pinned', composition: null, stampFloor: null };
271
+ }
272
+ const stamps = stampVersions(real);
273
+ return { name: basename(real), path: real, status: null, composition: stamps.max, stampFloor: stamps.min };
274
+ }
275
+ /** Справочные версии состава (REQ-02): max/min set= по штампованным файлам
276
+ * свидетеля рендера (loadSyncState). Штамп недостоверен (инвентаризация §3.4)
277
+ * — свидетель касания, не истина; истина состава — карта.
278
+ * shortcut: неоднородность штампов показана min/max, контент-сверка — зона --check (T10). */
279
+ function stampVersions(root) {
280
+ let max = null;
281
+ let min = null;
282
+ for (const rel of Object.keys(loadSyncState(root).files)) {
283
+ let stamp;
284
+ try {
285
+ stamp = parseStamp(readFileSync(join(root, rel), 'utf-8'));
286
+ }
287
+ catch {
288
+ continue;
289
+ }
290
+ if (!stamp)
291
+ continue;
292
+ if (max === null || compareVersions(stamp.set, max) > 0)
293
+ max = stamp.set;
294
+ if (min === null || compareVersions(stamp.set, min) < 0)
295
+ min = stamp.set;
296
+ }
297
+ return { max, min };
298
+ }
299
+ /** Статус проекта по отчёту шага (REQ-05): done с фактическими изменениями
300
+ * этого прохода — updated, без — up-to-date; needs-decision/error — как есть.
301
+ * «Действие» берём из фаз шага, не из кодов сверки: verify-код removed —
302
+ * состояние «подтверждённо отсутствует» (идемпотентность NFR-02), в повторном
303
+ * прогоне это не изменение. */
304
+ export function statusOf(report) {
305
+ if (report.exitKind !== 'done')
306
+ return report.exitKind;
307
+ const changed = report.sync.outcomes.some((o) => o.action === 'updated' || o.action === 'created' || o.action === 'appended') ||
308
+ report.sync.removed.length > 0 ||
309
+ report.seed.some((s) => s.kind === 'seeded' || s.kind === 'legacy-absorbed') ||
310
+ report.schema.status === 'migrated';
311
+ return changed ? 'updated' : 'up-to-date';
312
+ }
313
+ /** Категории карты (числами, REQ-02/R11.6) — считаются один раз по карте.
314
+ * Экспорт — точечный reuse для T9 (--here, одиночный план). */
315
+ export function mapCategories(map) {
316
+ const cats = { new: 0, changed: 0, deprecated: 0, removed: 0 };
317
+ for (const f of map.files) {
318
+ if (f.category !== 'unchanged')
319
+ cats[f.category]++;
320
+ }
321
+ return cats;
322
+ }
323
+ /** opts.now — дефолт часов шага, если фабрика не задала свои (NFR-03). */
324
+ function withNow(deps, now) {
325
+ return deps.now || !now ? deps : { ...deps, now };
326
+ }
327
+ /** Секция планов/подтверждения (REQ-02, вайрфрейм (1)): обзор реестра,
328
+ * строка плана на запись (поля-контракт), дубликаты realpath. */
329
+ function plansSection(plans, registrySize, duplicates, map) {
330
+ const cats = mapCategories(map);
331
+ const seedFaces = map.faces.filter((f) => f.seed).length;
332
+ const note = [];
333
+ const statusCount = (s) => plans.filter((p) => p.status === s).length;
334
+ const pinned = statusCount('pinned');
335
+ const worktree = statusCount('worktree');
336
+ const missing = statusCount('missing');
337
+ if (pinned)
338
+ note.push(`${pinned} pinned`);
339
+ if (worktree)
340
+ note.push(`${worktree} worktree`);
341
+ if (missing)
342
+ note.push(`${missing} missing`);
343
+ const children = [
344
+ line('info', `${registrySize} ${registrySize === 1 ? 'project' : 'projects'} in registry${note.length ? ` (${note.join(', ')})` : ''}`),
345
+ ];
346
+ for (const plan of plans) {
347
+ if (plan.status === null) {
348
+ children.push(line('info', `plan: ${plan.name} · ${plan.path}`));
349
+ const floor = plan.stampFloor !== null && plan.stampFloor !== plan.composition ? ` (stamps from ${plan.stampFloor})` : '';
350
+ children.push(line('info', `composition ${plan.composition ?? 'unknown'}${floor} → ${map.version}`, true));
351
+ children.push(line('info', `map: ${cats.new} new · ${cats.changed} changed · ${cats.deprecated} deprecated · ${cats.removed} removed · seed×${seedFaces}`, true));
352
+ }
353
+ else {
354
+ const reason = plan.status === 'worktree'
355
+ ? ' (shared .wolf with the main checkout)'
356
+ : plan.status === 'missing'
357
+ ? ' (path does not exist)'
358
+ : '';
359
+ children.push(line('skip', `plan: ${plan.name} · ${plan.path} · [${plan.status}] — skipped${reason}`));
360
+ }
361
+ }
362
+ for (const dup of duplicates) {
363
+ children.push(line('info', `duplicate registry entry collapsed: ${dup.path}`, true));
364
+ }
365
+ return { kind: 'section', title: 'Plans', children };
366
+ }
367
+ /** Отображение статуса в строке отчёта (REQ-05): «требует решения» — текст
368
+ * счётчика, не литерал ExitKind шага. Экспорт — точечный reuse для T9 (--here). */
369
+ export const STATUS_TEXT = {
370
+ updated: 'updated',
371
+ 'up-to-date': 'up-to-date',
372
+ 'needs-decision': 'needs decision',
373
+ error: 'error',
374
+ };
375
+ /** Файловые строки деталей проекта (REQ-01, design §4.15): каждый needs-decision
376
+ * назван путём (счётчики выше сохраняются дословно), защищённые и принятые
377
+ * локальные — отдельными строками. Единственная реализация для прохода и
378
+ * `--here`. Лица печатает владелец seed-строки (секция проекта) — иначе одно
379
+ * diverged-лицо давало две строки `faces:` (m-1). */
380
+ /** Путь карты (`base/agents/x.md`) → проектный путь (`.opencode/agents/x.md`):
381
+ * REQ-01 требует путь относительно корня проекта, а verify.target для целей
382
+ * карты несёт путь карты. `kind` берётся из `map.files` (m-3) — вторых таблиц
383
+ * префиксов нет. */
384
+ function kindIndex(map) {
385
+ const kinds = new Map();
386
+ for (const entry of map.files)
387
+ kinds.set(entry.path, entry.kind);
388
+ return kinds;
389
+ }
390
+ function displayName(i, kinds) {
391
+ if (i.kind !== 'file')
392
+ return i.target;
393
+ const kind = kinds.get(i.target);
394
+ return kind ? projectPath({ path: i.target, kind, category: 'new' }) : i.target;
395
+ }
396
+ export function verifyNameLines(verify, map) {
397
+ const out = [];
398
+ const kinds = kindIndex(map);
399
+ const named = verify.items.filter((i) => i.needsDecision && i.code !== 'diverged');
400
+ if (named.length > 0) {
401
+ out.push(line('warn', `needs decision: ${named.map((i) => `${displayName(i, kinds)} (${i.code})`).join(', ')}`, true));
402
+ }
403
+ const protectedCount = verify.items.filter((i) => i.code === 'protected').length;
404
+ if (protectedCount > 0)
405
+ out.push(line('info', `${protectedCount} protected (intentional)`, true));
406
+ const kept = verify.items.filter((i) => i.code === 'kept').map((i) => displayName(i, kinds));
407
+ if (kept.length > 0)
408
+ out.push(line('info', `${kept.length} kept (local): ${kept.join(', ')}`, true));
409
+ return out;
410
+ }
411
+ /** Дайджест бэкапов проекта (§4.12): файл и путь копии; take — «took base»,
412
+ * удаление — «removed». Единственная реализация формата: проход и `--here`. */
413
+ export function backupDigestLines(report) {
414
+ const out = [];
415
+ for (const b of report.backups ?? []) {
416
+ const took = report.sync.outcomes.some((o) => o.backup === b.backup);
417
+ out.push(line('info', `${took ? 'took base for' : 'removed'} ${b.file} (local saved: ${b.backup})`, true));
418
+ }
419
+ return out;
420
+ }
421
+ /** Секция проектов: строка-статус на проект + детали шага (REQ-05, палитра T3). */
422
+ function projectsSection(outcomes, map) {
423
+ const children = [];
424
+ for (const o of outcomes) {
425
+ const marker = o.status === 'error' ? 'error' : o.status === 'needs-decision' ? 'warn' : 'ok';
426
+ children.push(line(marker, o.error ? `${o.plan.name} — error: ${o.error}` : `${o.plan.name} — ${STATUS_TEXT[o.status]}`, o.status === 'up-to-date'));
427
+ const r = o.report;
428
+ if (!r)
429
+ continue;
430
+ const bs = baseSetSummary(r);
431
+ if (bs)
432
+ children.push(line('info', `base-set: ${bs}`, true));
433
+ if (r.seed.length > 0) {
434
+ const faces = r.seed.map((s) => `${s.file.replace(/-playbook\.md$/, '')} ${s.kind ?? s.action}`).join(', ');
435
+ children.push(line('info', `faces: ${faces}`, true));
436
+ }
437
+ if (r.schema.status !== 'ok') {
438
+ children.push(line('warn', `schema: ${r.schema.status}${r.schema.error ? ` — ${r.schema.error}` : ''}`, true));
439
+ }
440
+ const v = r.verify.summary;
441
+ const ok = r.verify.items.length - v.needsDecision - v.errors;
442
+ const parts = [`${ok}/${r.verify.items.length} ok`];
443
+ if (v.needsDecision > 0)
444
+ parts.push(`${v.needsDecision} needs decision`);
445
+ if (v.errors > 0)
446
+ parts.push(`${v.errors} errors`);
447
+ children.push(line(v.errors > 0 ? 'error' : v.needsDecision > 0 ? 'warn' : 'info', `verify: ${parts.join(' · ')}`, true));
448
+ children.push(...verifyNameLines(r.verify, map));
449
+ children.push(...backupDigestLines(r));
450
+ }
451
+ return { kind: 'section', title: 'Projects', children };
452
+ }
453
+ /** Исходы sync одной строкой: ненулевые счётчики по действиям. */
454
+ function baseSetSummary(r) {
455
+ if (r.sync.outcomes.length === 0)
456
+ return null;
457
+ const counts = { updated: 0, created: 0, appended: 0, identical: 0, mutated: 0, conflict: 0 };
458
+ for (const o of r.sync.outcomes) {
459
+ if (o.action === 'skipped') {
460
+ if (o.mutated)
461
+ counts.mutated++;
462
+ else
463
+ counts.identical++;
464
+ }
465
+ else {
466
+ counts[o.action]++;
467
+ }
468
+ }
469
+ const parts = Object.entries(counts)
470
+ .filter(([, n]) => n > 0)
471
+ .map(([k, n]) => `${n} ${k}`);
472
+ return parts.length > 0 ? parts.join(', ') : null;
473
+ }
474
+ /** Строки скана (REQ-09): hint с плюрализацией + топ-пути; сбой — предупреждение. */
475
+ async function scanLines(deps, registered) {
476
+ if (!deps.scan)
477
+ return [];
478
+ try {
479
+ const found = await deps.scan({ registeredPaths: registered.map((p) => p.path) });
480
+ if (!found)
481
+ return [];
482
+ const noun = found.found === 1 ? 'project' : 'projects';
483
+ const lines = [
484
+ line('warn', `found ${found.found} ${noun} with wolf memory outside the registry; running any wolf command in a project registers it (self-healing)`, true),
485
+ ];
486
+ for (const path of found.top)
487
+ lines.push(line('info', path, true));
488
+ return lines;
489
+ }
490
+ catch (err) {
491
+ return [line('warn', `unregistered-projects scan failed: ${msg(err)} — pass result unaffected`, true)];
492
+ }
493
+ }
494
+ //# 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,52 @@
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
+ /** Правило 2 §4.3 (волна 2.20.0): файл держится ключом protect — не needs-decision. */
7
+ | 'protected'
8
+ /** Правило 6.5 §4.3: принятый локальный контент (origin:'keep') — не needs-decision. */
9
+ | 'kept';
10
+ /** Коды, всегда отображаемые как «требует решения» (view-код needs-decision). */
11
+ export declare const NEEDS_DECISION_CODES: ReadonlySet<VerifyCode>;
12
+ export interface VerifyItem {
13
+ /** Ключ цели: путь карты (files/agents_md — проектный для фактов вне карты) или шаблон лица. */
14
+ target: string;
15
+ kind: 'file' | 'agents-md' | 'face';
16
+ code: VerifyCode | 'error';
17
+ needsDecision: boolean;
18
+ detail?: string;
19
+ }
20
+ /** Сводка проекта: счётчики исходов по кодам + «требует решения» + errors. */
21
+ export interface VerifySummary {
22
+ byCode: Partial<Record<VerifyCode, number>>;
23
+ needsDecision: number;
24
+ errors: number;
25
+ }
26
+ export interface VerifyResult {
27
+ items: VerifyItem[];
28
+ summary: VerifySummary;
29
+ }
30
+ /**
31
+ * Sync-исход для сверки. В RenderOutcome action='skipped' покрывает и
32
+ * 'content identical', и 'mutated after render' (различие — только в
33
+ * reason-строке, парсинг запрещён контрактом T5). Композитор проектного
34
+ * шага обязан выставить структурный признак мутанта.
35
+ */
36
+ export type SyncVerifyOutcome = RenderOutcome & {
37
+ mutated?: boolean;
38
+ };
39
+ export interface VerifyOutcomes {
40
+ syncOutcomes: SyncVerifyOutcome[];
41
+ seedOutcomes: SeedOutcome[];
42
+ /** removed-цели (проектные пути), подтверждённо отсутствующие после шага
43
+ * удалений: удалённые в этом проходе или отсутствовавшие ранее. */
44
+ removals: string[];
45
+ }
46
+ /** Путь цели карты → проектный путь (LAYOUT opencode-renderer.ts). Экспорт —
47
+ * точечный (T6): проектный шаг использует тот же перевод путей в удалениях. */
48
+ export declare function projectPath(entry: FileEntry): string;
49
+ /** Сверка проекта против карты: каждый пункт карты получает статус,
50
+ * факты без ожидания → conflict, отсутствие статуса → error. */
51
+ export declare function verifyAgainstMap(map: UpdateMap, outcomes: VerifyOutcomes): VerifyResult;
52
+ //# 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;AACZ,uFAAuF;GACrF,WAAW;AACb,wFAAwF;GACtF,MAAM,CAAC;AAEX,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;AAoDD;iEACiE;AACjE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,YAAY,CA6EvF"}