mister-wolf 2.18.5 → 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 (61) 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/memory-sync.d.ts.map +1 -1
  7. package/dist/adapters/cli/commands/memory-sync.js +3 -0
  8. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  9. package/dist/adapters/cli/commands/memory-upgrade.d.ts +133 -0
  10. package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
  11. package/dist/adapters/cli/commands/memory-upgrade.js +507 -5
  12. package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
  13. package/dist/adapters/cli/commands/upgrade-projects.d.ts +17 -0
  14. package/dist/adapters/cli/commands/upgrade-projects.d.ts.map +1 -0
  15. package/dist/adapters/cli/commands/upgrade-projects.js +75 -0
  16. package/dist/adapters/cli/commands/upgrade-projects.js.map +1 -0
  17. package/dist/adapters/cli/report-renderer.d.ts +43 -0
  18. package/dist/adapters/cli/report-renderer.d.ts.map +1 -0
  19. package/dist/adapters/cli/report-renderer.js +184 -0
  20. package/dist/adapters/cli/report-renderer.js.map +1 -0
  21. package/dist/adapters/fs/projects-registry.d.ts +21 -0
  22. package/dist/adapters/fs/projects-registry.d.ts.map +1 -1
  23. package/dist/adapters/fs/projects-registry.js +54 -1
  24. package/dist/adapters/fs/projects-registry.js.map +1 -1
  25. package/dist/adapters/fs/update-map.d.ts +102 -0
  26. package/dist/adapters/fs/update-map.d.ts.map +1 -0
  27. package/dist/adapters/fs/update-map.js +95 -0
  28. package/dist/adapters/fs/update-map.js.map +1 -0
  29. package/dist/adapters/fs/upgrade-lock.d.ts +23 -0
  30. package/dist/adapters/fs/upgrade-lock.d.ts.map +1 -0
  31. package/dist/adapters/fs/upgrade-lock.js +59 -0
  32. package/dist/adapters/fs/upgrade-lock.js.map +1 -0
  33. package/dist/adapters/render/opencode/opencode-renderer.d.ts +13 -1
  34. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -1
  35. package/dist/adapters/render/opencode/opencode-renderer.js +76 -8
  36. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -1
  37. package/dist/app/use-cases/project-step.d.ts +52 -0
  38. package/dist/app/use-cases/project-step.d.ts.map +1 -0
  39. package/dist/app/use-cases/project-step.js +77 -0
  40. package/dist/app/use-cases/project-step.js.map +1 -0
  41. package/dist/app/use-cases/scan-unregistered.d.ts +25 -0
  42. package/dist/app/use-cases/scan-unregistered.d.ts.map +1 -0
  43. package/dist/app/use-cases/scan-unregistered.js +74 -0
  44. package/dist/app/use-cases/scan-unregistered.js.map +1 -0
  45. package/dist/app/use-cases/seed-base-playbooks.d.ts +10 -0
  46. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  47. package/dist/app/use-cases/seed-base-playbooks.js +54 -13
  48. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  49. package/dist/app/use-cases/upgrade-projects.d.ts +61 -0
  50. package/dist/app/use-cases/upgrade-projects.d.ts.map +1 -0
  51. package/dist/app/use-cases/upgrade-projects.js +379 -0
  52. package/dist/app/use-cases/upgrade-projects.js.map +1 -0
  53. package/dist/app/use-cases/verify-against-map.d.ts +48 -0
  54. package/dist/app/use-cases/verify-against-map.d.ts.map +1 -0
  55. package/dist/app/use-cases/verify-against-map.js +161 -0
  56. package/dist/app/use-cases/verify-against-map.js.map +1 -0
  57. package/dist/ports/base-set-renderer.port.d.ts +13 -0
  58. package/dist/ports/base-set-renderer.port.d.ts.map +1 -1
  59. package/package.json +3 -2
  60. package/templates/.wolf/router.log +1 -1
  61. package/update-map.json +204 -0
@@ -0,0 +1,75 @@
1
+ // src/adapters/cli/commands/upgrade-projects.ts
2
+ // T8 (волна 2.19.0, REQ-01/04, ADR-5): hidden-транспорт фазы 2 — вызывается
3
+ // ТОЛЬКО re-exec'ом `wolf upgrade` (склейка фаз ADR-2: --no-banner — шапку
4
+ // уже напечатала фаза 1). Прод-deps — те же адаптеры, что у T7/T9: реестр
5
+ // wolfUserConfigDir, карта релиза, makeStepDeps = hereStepDeps (точечный
6
+ // reuse T9, не дубль сборки), UpgradeLock и скан незарегистрированных
7
+ // (registeredPaths передаёт оркестратор). Подтверждение — TTY-прецедент
8
+ // upgradeHereAction: plans-узел рендерится ДО вопроса (REQ-02).
9
+ // --from/--to/--state — контракт re-exec (контекст state-файла), отчёт
10
+ // фазы 2 их не требует; banner в report T7 нет, --no-banner — флаг склейки.
11
+ import { createInterface } from 'node:readline/promises';
12
+ import { Command } from 'commander';
13
+ import { runUpgradeProjects } from '../../../app/use-cases/upgrade-projects.js';
14
+ import { scanUnregistered } from '../../../app/use-cases/scan-unregistered.js';
15
+ import { ProjectsRegistry } from '../../fs/projects-registry.js';
16
+ import { loadUpdateMap } from '../../fs/update-map.js';
17
+ import { UpgradeLock } from '../../fs/upgrade-lock.js';
18
+ import { wolfUserConfigDir } from '../../fs/user-config.js';
19
+ import { hereStepDeps, termEnv } from './memory-upgrade.js';
20
+ import { renderReport } from '../report-renderer.js';
21
+ function prodIo() {
22
+ const env = termEnv(process.stdout, process.env);
23
+ return {
24
+ env,
25
+ tty: Boolean(process.stdout.isTTY),
26
+ write: (text) => process.stdout.write(text),
27
+ ask: async () => {
28
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
29
+ try {
30
+ const ans = (await rl.question('Upgrade these projects? [y/N] ')).trim().toLowerCase();
31
+ return ans === 'y' || ans === 'yes';
32
+ }
33
+ finally {
34
+ rl.close();
35
+ }
36
+ },
37
+ };
38
+ }
39
+ /** Прод-deps фазы 2 (T8): реестр/карта/фабрика шага/lock/скан — риск-список Ф4. */
40
+ export function upgradeProjectsDeps() {
41
+ return {
42
+ registry: new ProjectsRegistry(wolfUserConfigDir()),
43
+ loadMap: () => loadUpdateMap(),
44
+ makeStepDeps: hereStepDeps,
45
+ upgradeLock: new UpgradeLock(),
46
+ scan: scanUnregistered, // registeredPaths — оркестратор; root — дефолт homedir
47
+ };
48
+ }
49
+ /** Обвязка фазы 2: deps + TTY-confirm (plans ДО вопроса, REQ-02) + печать
50
+ * отчёта renderer'ом и простановка exit-кода. */
51
+ export async function upgradeProjectsAction(yes, deps = upgradeProjectsDeps(), io = prodIo()) {
52
+ const confirm = yes || !io.tty
53
+ ? undefined
54
+ : async (plans) => {
55
+ io.write(`${renderReport(plans, io.env)}\n`); // список ДО вопроса (REQ-02)
56
+ return io.ask();
57
+ };
58
+ const res = await runUpgradeProjects(deps, { yes, tty: io.tty, confirm });
59
+ io.write(`${renderReport(res.report, io.env)}\n`);
60
+ process.exitCode = res.exitCode;
61
+ }
62
+ export function upgradeProjectsCommand() {
63
+ return new Command('upgrade-projects')
64
+ .description('Run the registered-projects update pass with the installed CLI version (re-exec target of wolf upgrade; hidden)')
65
+ .option('--from <version>', 'Previous CLI version (context from the phase-1 state file)')
66
+ .option('--to <version>', 'New CLI version (context from the phase-1 state file)')
67
+ .option('--yes', 'Apply the plan without interactive confirmation')
68
+ .option('--no-banner', 'Do not print the banner: phase 1 already opened the section')
69
+ .option('--state <path>', 'Phase-1 state file ({ from, to, startedAt })')
70
+ .action(async (options) => {
71
+ // from/to/state/noBanner — принятый контракт re-exec; отчёт фазы 2 их не требует
72
+ await upgradeProjectsAction(options.yes === true);
73
+ });
74
+ }
75
+ //# sourceMappingURL=upgrade-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-projects.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/upgrade-projects.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,sEAAsE;AACtE,wEAAwE;AACxE,gEAAgE;AAChE,uEAAuE;AACvE,4EAA4E;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAA4B,MAAM,4CAA4C,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAiC,MAAM,uBAAuB,CAAC;AAUpF,SAAS,MAAM;IACb,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjD,OAAO;QACL,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAClC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3C,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACvF,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,CAAC;YACtC,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,QAAQ,EAAE,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;QACnD,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE;QAC9B,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,IAAI,WAAW,EAAE;QAC9B,IAAI,EAAE,gBAAgB,EAAE,uDAAuD;KAChF,CAAC;AACJ,CAAC;AAED;kDACkD;AAClD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAY,EACZ,OAA4B,mBAAmB,EAAE,EACjD,KAAiB,MAAM,EAAE;IAEzB,MAAM,OAAO,GACX,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG;QACZ,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,EAAE,KAAiB,EAAoB,EAAE;YAC5C,EAAE,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B;YAC3E,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC,CAAC;IACR,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,EAAE,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;SACnC,WAAW,CACV,iHAAiH,CAClH;SACA,MAAM,CAAC,kBAAkB,EAAE,4DAA4D,CAAC;SACxF,MAAM,CAAC,gBAAgB,EAAE,uDAAuD,CAAC;SACjF,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;SAClE,MAAM,CAAC,aAAa,EAAE,6DAA6D,CAAC;SACpF,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,iFAAiF;QACjF,MAAM,qBAAqB,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * REQ-15 / ADR-6 (волна 2.19.0): единый renderer терминального отчёта.
3
+ *
4
+ * Чистая функция над деревом ReportNode: без I/O и без чтения process.env —
5
+ * решение «TTY/пайп/NO_COLOR» принимает caller (прецедент: colorsEnabled в
6
+ * src/domain/facet-colors.ts) и передаёт его как TermEnv. Данные (статусы,
7
+ * счётчики) формируют оркестраторы; renderer про реестр и карту не знает.
8
+ *
9
+ * Дизайн-вопрос №5 решён переносом, не усечением: путь/текст не теряются,
10
+ * рамки не рвутся (snapshot-тесты на width 60/80/120).
11
+ */
12
+ export type Marker = 'info' | 'ok' | 'warn' | 'error' | 'skip';
13
+ export type ColorDepth = 'truecolor' | '256' | '16' | 'mono';
14
+ /** Терминальное окружение; в тестах — фейка, детект — зона caller'а. */
15
+ export interface TermEnv {
16
+ tty: boolean;
17
+ colors: ColorDepth;
18
+ width: number;
19
+ }
20
+ export interface Counter {
21
+ label: string;
22
+ count: number;
23
+ }
24
+ export type ReportNode = {
25
+ kind: 'banner';
26
+ version: string;
27
+ } | {
28
+ kind: 'section';
29
+ title: string;
30
+ children: ReportNode[];
31
+ } | {
32
+ kind: 'line';
33
+ marker: Marker;
34
+ text: string;
35
+ dim?: boolean;
36
+ } | {
37
+ kind: 'summary';
38
+ counters: Counter[];
39
+ done: boolean;
40
+ };
41
+ /** Отчёт → строка: styled при tty=true, plain (плоские строки с префиксами) при tty=false. */
42
+ export declare function renderReport(node: ReportNode, env: TermEnv): string;
43
+ //# sourceMappingURL=report-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-renderer.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/report-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAC/D,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAE7D,wEAAwE;AACxE,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAiE5D,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * REQ-15 / ADR-6 (волна 2.19.0): единый renderer терминального отчёта.
3
+ *
4
+ * Чистая функция над деревом ReportNode: без I/O и без чтения process.env —
5
+ * решение «TTY/пайп/NO_COLOR» принимает caller (прецедент: colorsEnabled в
6
+ * src/domain/facet-colors.ts) и передаёт его как TermEnv. Данные (статусы,
7
+ * счётчики) формируют оркестраторы; renderer про реестр и карту не знает.
8
+ *
9
+ * Дизайн-вопрос №5 решён переносом, не усечением: путь/текст не теряются,
10
+ * рамки не рвутся (snapshot-тесты на width 60/80/120).
11
+ */
12
+ const RESET = '\x1b[0m';
13
+ const DIM = '\x1b[2m';
14
+ const ANSI = /\x1b\[[0-9;]*m/g;
15
+ /** Маркер → глиф + plain-префикс (design §«Палитра»). */
16
+ const MARKERS = {
17
+ info: { glyph: '●', plain: '-' },
18
+ ok: { glyph: '●', plain: 'ok:' },
19
+ warn: { glyph: '▲', plain: 'warn:' },
20
+ error: { glyph: '✖', plain: 'error:' },
21
+ skip: { glyph: '●', plain: 'skip:' },
22
+ };
23
+ const PALETTES = {
24
+ truecolor: {
25
+ info: '\x1b[38;2;0;191;191m', // cyan
26
+ ok: '\x1b[38;2;80;220;100m', // green
27
+ okDim: '\x1b[38;2;110;170;120m', // dim green
28
+ warn: '\x1b[38;2;230;190;60m', // yellow
29
+ error: '\x1b[38;2;235;90;90m', // red
30
+ skip: DIM,
31
+ },
32
+ '256': {
33
+ info: '\x1b[38;5;80m',
34
+ ok: '\x1b[38;5;71m',
35
+ okDim: '\x1b[38;5;108m',
36
+ warn: '\x1b[38;5;179m',
37
+ error: '\x1b[38;5;173m',
38
+ skip: DIM,
39
+ },
40
+ '16': {
41
+ // okDim сливается с ok (нет dim-green в 16 цветах): различимость несут маркер + слово (REQ-15 AC-3)
42
+ info: '\x1b[36m',
43
+ ok: '\x1b[32m',
44
+ okDim: '\x1b[32m',
45
+ warn: '\x1b[33m',
46
+ error: '\x1b[31m',
47
+ skip: '\x1b[90m',
48
+ },
49
+ mono: { info: '', ok: '', okDim: '', warn: '', error: '', skip: '' },
50
+ };
51
+ /** Логотип A — блочный вордмарк Mr.WOLF (уточнение владельца mem_20261023_utochnenie_logotipa_2_19_0_blochnyy_vord_a989dd); глифы скопированы дословно. */
52
+ const LOGO = [
53
+ '███╗ ███╗██████╗ ██╗ ██╗ ██████╗ ██╗ ███████╗',
54
+ '████╗ ████║██╔══██╗ ██║ ██║██╔═══██╗██║ ██╔════╝',
55
+ '██╔████╔██║██████╔╝ ██║ █╗ ██║██║ ██║██║ █████╗',
56
+ '██║╚██╔╝██║██╔══██╗ ██║███╗██║██║ ██║██║ ██╔══╝',
57
+ '██║ ╚═╝ ██║██║ ██║██╗ ╚███╔███╔╝╚██████╔╝███████╗██║',
58
+ '╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══╝╚══╝ ╚═════╝ ╚══════╝╚═╝',
59
+ ' upgrade ${v}',
60
+ ];
61
+ const paint = (code, s) => (code ? `${code}${s}${RESET}` : s);
62
+ const visibleLen = (s) => s.replace(ANSI, '').length;
63
+ /** Отчёт → строка: styled при tty=true, plain (плоские строки с префиксами) при tty=false. */
64
+ export function renderReport(node, env) {
65
+ return (env.tty ? styledTop(node, env) : plainTop(node)).join('\n');
66
+ }
67
+ function plainTop(node) {
68
+ switch (node.kind) {
69
+ case 'banner':
70
+ return [`Mr Wolf upgrade ${node.version}`];
71
+ case 'section':
72
+ return [node.title, ...node.children.flatMap(plainTop)];
73
+ case 'line':
74
+ return [`${MARKERS[node.marker].plain} ${node.text}`];
75
+ case 'summary':
76
+ return [summaryText(node)];
77
+ }
78
+ }
79
+ function summaryText(n) {
80
+ const counters = n.counters.map((c) => `${c.label} ${c.count}`).join(' · ');
81
+ return n.done ? `${counters} — Done` : counters;
82
+ }
83
+ function styledTop(node, env) {
84
+ switch (node.kind) {
85
+ case 'banner':
86
+ return bannerLines(env, node.version);
87
+ case 'section':
88
+ return sectionFrame(node, env);
89
+ case 'line':
90
+ return lineLines(node, env, '', Math.max(1, env.width - 3));
91
+ case 'summary':
92
+ return [`└ ${summaryText(node)}`];
93
+ }
94
+ }
95
+ function bannerLines(env, version) {
96
+ const tpl = LOGO.map((l) => l.replace('${v}', version));
97
+ const widest = Math.max(...tpl.map(visibleLen));
98
+ // Деградация ширины: логотип не лезет — однострочный текстовый баннер (как plain)
99
+ if (widest > env.width)
100
+ return [`Mr Wolf upgrade ${version}`];
101
+ return tpl.map((l) => paint(PALETTES[env.colors].info, l));
102
+ }
103
+ function sectionFrame(sec, env) {
104
+ const maxInner = Math.max(1, env.width - 4);
105
+ const children = [...sec.children];
106
+ const last = children[children.length - 1];
107
+ const closing = last?.kind === 'summary' ? children.pop() : null;
108
+ const titleParts = wrap(sec.title, maxInner);
109
+ const content = children.flatMap((c) => contentLines(c, env, '', maxInner));
110
+ const closingParts = closing ? wrap(summaryText(closing), maxInner) : null;
111
+ // Автоширина рамки: по самому длинному содержимому, но не шире терминала
112
+ let inner = Math.max(titleParts.reduce((m, t) => Math.max(m, t.length), 0), ...content.map(visibleLen), 0);
113
+ if (closingParts)
114
+ inner = Math.max(inner, ...closingParts.map((t) => t.length));
115
+ inner = Math.min(inner, maxInner);
116
+ const out = [];
117
+ titleParts.forEach((t, i) => out.push(`${i === 0 ? '┌' : '│'} ${(t + ' ').padEnd(inner, '─')}┐`));
118
+ for (const l of content) {
119
+ out.push(`│ ${l}${' '.repeat(Math.max(0, inner - visibleLen(l)))} │`);
120
+ }
121
+ if (closingParts) {
122
+ closingParts.forEach((t, i) => {
123
+ const tail = i === closingParts.length - 1;
124
+ out.push(`${tail ? '└' : '│'} ${(t + ' ').padEnd(inner, '─')}${tail ? '┘' : '┤'}`);
125
+ });
126
+ }
127
+ else {
128
+ out.push(`└${'─'.repeat(inner + 2)}┘`);
129
+ }
130
+ return out;
131
+ }
132
+ /** Содержимое секции без рамки; вложенные секции — заголовок + дети с отступом (вайрфрейм design (1)). */
133
+ function contentLines(node, env, indent, maxInner) {
134
+ switch (node.kind) {
135
+ case 'banner':
136
+ return bannerLines(env, node.version); // глифы логотипа не переносим
137
+ case 'section':
138
+ return [
139
+ ...wrap(node.title, Math.max(1, maxInner - indent.length)).map((t) => indent + t),
140
+ ...node.children.flatMap((c) => contentLines(c, env, indent + ' ', maxInner)),
141
+ ];
142
+ case 'line':
143
+ // 3 = глиф + пробел + колонка выравнивания продолжения (перенос длиннее первой строки на 1)
144
+ return lineLines(node, env, indent, Math.max(1, maxInner - indent.length - 3));
145
+ case 'summary':
146
+ return wrap(summaryText(node), Math.max(1, maxInner - indent.length - 2)).map((t, i) => indent + (i === 0 ? '' : ' ') + t);
147
+ }
148
+ }
149
+ function lineLines(node, env, indent, budget) {
150
+ const p = PALETTES[env.colors];
151
+ const code = node.marker === 'ok' && node.dim ? p.okDim : p[node.marker];
152
+ const glyph = paint(code, MARKERS[node.marker].glyph);
153
+ const dim = (s) => (node.dim && env.colors !== 'mono' ? paint(DIM, s) : s);
154
+ // Перенос: продолжение выравнивается под текст (отступ маркера), текст не усекается
155
+ return wrap(node.text, budget).map((part, i) => `${indent}${i === 0 ? glyph : ' '} ${dim(part)}`);
156
+ }
157
+ /** Word-wrap; неразрывные токены (пути) режутся жёстко. */
158
+ function wrap(text, max) {
159
+ const out = [];
160
+ let cur = '';
161
+ for (const word of text.split(' ')) {
162
+ if (word === '')
163
+ continue;
164
+ const cand = cur === '' ? word : `${cur} ${word}`;
165
+ if (cand.length <= max) {
166
+ cur = cand;
167
+ continue;
168
+ }
169
+ if (cur !== '') {
170
+ out.push(cur);
171
+ cur = '';
172
+ }
173
+ let rest = word;
174
+ while (rest.length > max) {
175
+ out.push(rest.slice(0, max));
176
+ rest = rest.slice(max);
177
+ }
178
+ cur = rest;
179
+ }
180
+ if (cur !== '' || out.length === 0)
181
+ out.push(cur);
182
+ return out;
183
+ }
184
+ //# sourceMappingURL=report-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-renderer.js","sourceRoot":"","sources":["../../../src/adapters/cli/report-renderer.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ export interface RegisteredProject {
2
2
  path: string;
3
3
  schema_version: number;
4
4
  initialized_at: string;
5
+ /** Пиннинг (REQ-13): ставится/снимается ручной правкой projects.yaml; upgrade показывает и пропускает. */
6
+ pinned?: boolean;
5
7
  }
6
8
  /**
7
9
  * Реестр инициализированных проектов: `<user-config>/projects.yaml`.
@@ -12,6 +14,12 @@ export declare class ProjectsRegistry {
12
14
  constructor(configDir: string);
13
15
  private get file();
14
16
  list(): Promise<RegisteredProject[]>;
17
+ /**
18
+ * Строгая альтернатива list() для прохода upgrade (design «Гварды прохода»):
19
+ * файла нет (ENOENT) → пустой реестр штатно; битый yaml / ошибка чтения →
20
+ * throw — «реестр нечитаем» обязан отличаться от «реестр пуст» (exit 1 vs 0).
21
+ */
22
+ listStrict(): Promise<RegisteredProject[]>;
15
23
  register(path: string, schemaVersion: number): Promise<void>;
16
24
  /**
17
25
  * Самолечение реестра (спека 2.14 §8.2, P331): синхронный upsert — добавляет
@@ -24,4 +32,17 @@ export declare class ProjectsRegistry {
24
32
  remove(path: string): Promise<boolean>;
25
33
  private persist;
26
34
  }
35
+ export interface RealpathDedup {
36
+ /** По одной записи на realpath — первая встреченная (порядок реестра сохранён). */
37
+ unique: RegisteredProject[];
38
+ /** Записи, свёрнутые в уже встреченный realpath (для пометки «дубль» в отчёте прохода). */
39
+ duplicates: RegisteredProject[];
40
+ }
41
+ /**
42
+ * Дедуп списка проектов по fs.realpathSync(root) (design «Гварды прохода»):
43
+ * ручные правки yaml могут задублировать один проект symlink'ом/алиас-путём.
44
+ * Несуществующий путь realpath не резолвится — запись сохраняется как есть
45
+ * (missing-статус классифицирует проход, не дедуп).
46
+ */
47
+ export declare function dedupeByRealpath(projects: RegisteredProject[]): RealpathDedup;
27
48
  //# sourceMappingURL=projects-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/projects-registry.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAE9C,OAAO,KAAK,IAAI,GAEf;IAEK,IAAI,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAiBpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE;;;;;OAKG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAalE,OAAO,CAAC,QAAQ;IAkBV,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAQ9B,OAAO;CAKtB"}
1
+ {"version":3,"file":"projects-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/projects-registry.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,0GAA0G;IAC1G,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAE9C,OAAO,KAAK,IAAI,GAEf;IAEK,IAAI,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAiB1C;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAkB1C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE;;;;;OAKG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAalE,OAAO,CAAC,QAAQ;IAkBV,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAQ9B,OAAO;CAKtB;AAED,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,2FAA2F;IAC3F,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAmB7E"}
@@ -1,5 +1,5 @@
1
1
  import * as fs from 'fs/promises';
2
- import { mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { mkdirSync, readFileSync, realpathSync, writeFileSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import yaml from 'js-yaml';
5
5
  import { writeFileAtomic } from './markdown-memory-store.js';
@@ -33,6 +33,31 @@ export class ProjectsRegistry {
33
33
  const projects = doc?.projects;
34
34
  return Array.isArray(projects) ? projects : [];
35
35
  }
36
+ /**
37
+ * Строгая альтернатива list() для прохода upgrade (design «Гварды прохода»):
38
+ * файла нет (ENOENT) → пустой реестр штатно; битый yaml / ошибка чтения →
39
+ * throw — «реестр нечитаем» обязан отличаться от «реестр пуст» (exit 1 vs 0).
40
+ */
41
+ async listStrict() {
42
+ let raw;
43
+ try {
44
+ raw = await fs.readFile(this.file, 'utf-8');
45
+ }
46
+ catch (err) {
47
+ if (err.code === 'ENOENT')
48
+ return []; // реестра ещё нет
49
+ throw err;
50
+ }
51
+ let doc;
52
+ try {
53
+ doc = yaml.load(raw);
54
+ }
55
+ catch (err) {
56
+ throw new Error(`failed to read projects registry ${this.file}: ${err.message}`);
57
+ }
58
+ const projects = doc?.projects;
59
+ return Array.isArray(projects) ? projects : [];
60
+ }
36
61
  async register(path, schemaVersion) {
37
62
  const projects = await this.list();
38
63
  const existing = projects.find((p) => p.path === path);
@@ -100,4 +125,32 @@ export class ProjectsRegistry {
100
125
  await writeFileAtomic(this.file, body);
101
126
  }
102
127
  }
128
+ /**
129
+ * Дедуп списка проектов по fs.realpathSync(root) (design «Гварды прохода»):
130
+ * ручные правки yaml могут задублировать один проект symlink'ом/алиас-путём.
131
+ * Несуществующий путь realpath не резолвится — запись сохраняется как есть
132
+ * (missing-статус классифицирует проход, не дедуп).
133
+ */
134
+ export function dedupeByRealpath(projects) {
135
+ const seen = new Set();
136
+ const unique = [];
137
+ const duplicates = [];
138
+ for (const project of projects) {
139
+ let real;
140
+ try {
141
+ real = realpathSync(project.path);
142
+ }
143
+ catch {
144
+ unique.push(project);
145
+ continue;
146
+ }
147
+ if (seen.has(real))
148
+ duplicates.push(project);
149
+ else {
150
+ seen.add(real);
151
+ unique.push(project);
152
+ }
153
+ }
154
+ return { unique, duplicates };
155
+ }
103
156
  //# sourceMappingURL=projects-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects-registry.js","sourceRoot":"","sources":["../../../src/adapters/fs/projects-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects-registry.js","sourceRoot":"","sources":["../../../src/adapters/fs/projects-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { z } from 'zod';
2
+ export declare const UpdateCategorySchema: z.ZodEnum<{
3
+ deprecated: "deprecated";
4
+ new: "new";
5
+ removed: "removed";
6
+ unchanged: "unchanged";
7
+ changed: "changed";
8
+ }>;
9
+ export type UpdateCategory = z.infer<typeof UpdateCategorySchema>;
10
+ export declare const FileKindSchema: z.ZodEnum<{
11
+ command: "command";
12
+ agent: "agent";
13
+ skill: "skill";
14
+ plugin: "plugin";
15
+ }>;
16
+ export type FileKind = z.infer<typeof FileKindSchema>;
17
+ export declare const FileEntrySchema: z.ZodObject<{
18
+ path: z.ZodString;
19
+ kind: z.ZodEnum<{
20
+ command: "command";
21
+ agent: "agent";
22
+ skill: "skill";
23
+ plugin: "plugin";
24
+ }>;
25
+ category: z.ZodEnum<{
26
+ deprecated: "deprecated";
27
+ new: "new";
28
+ removed: "removed";
29
+ unchanged: "unchanged";
30
+ changed: "changed";
31
+ }>;
32
+ }, z.core.$strip>;
33
+ export type FileEntry = z.infer<typeof FileEntrySchema>;
34
+ export declare const FaceEntrySchema: z.ZodObject<{
35
+ template: z.ZodString;
36
+ owner_skill: z.ZodString;
37
+ category: z.ZodEnum<{
38
+ deprecated: "deprecated";
39
+ new: "new";
40
+ removed: "removed";
41
+ unchanged: "unchanged";
42
+ changed: "changed";
43
+ }>;
44
+ seed: z.ZodBoolean;
45
+ }, z.core.$strip>;
46
+ export type FaceEntry = z.infer<typeof FaceEntrySchema>;
47
+ export declare const UpdateMapSchema: z.ZodObject<{
48
+ version: z.ZodString;
49
+ prev: z.ZodString;
50
+ files: z.ZodArray<z.ZodObject<{
51
+ path: z.ZodString;
52
+ kind: z.ZodEnum<{
53
+ command: "command";
54
+ agent: "agent";
55
+ skill: "skill";
56
+ plugin: "plugin";
57
+ }>;
58
+ category: z.ZodEnum<{
59
+ deprecated: "deprecated";
60
+ new: "new";
61
+ removed: "removed";
62
+ unchanged: "unchanged";
63
+ changed: "changed";
64
+ }>;
65
+ }, z.core.$strip>>;
66
+ faces: z.ZodArray<z.ZodObject<{
67
+ template: z.ZodString;
68
+ owner_skill: z.ZodString;
69
+ category: z.ZodEnum<{
70
+ deprecated: "deprecated";
71
+ new: "new";
72
+ removed: "removed";
73
+ unchanged: "unchanged";
74
+ changed: "changed";
75
+ }>;
76
+ seed: z.ZodBoolean;
77
+ }, z.core.$strip>>;
78
+ agents_md: z.ZodObject<{
79
+ category: z.ZodEnum<{
80
+ deprecated: "deprecated";
81
+ new: "new";
82
+ removed: "removed";
83
+ unchanged: "unchanged";
84
+ changed: "changed";
85
+ }>;
86
+ mode: z.ZodLiteral<"append-block">;
87
+ }, z.core.$strip>;
88
+ schema_migrations: z.ZodArray<z.ZodObject<{
89
+ from: z.ZodNumber;
90
+ to: z.ZodNumber;
91
+ }, z.core.$strip>>;
92
+ outside_v1: z.ZodArray<z.ZodString>;
93
+ }, z.core.$strip>;
94
+ export type UpdateMap = z.infer<typeof UpdateMapSchema>;
95
+ /** Сравнение полных версий X.Y.Z: -1 (a<b) | 0 | 1 (a>b). */
96
+ export declare function compareVersions(a: string, b: string): number;
97
+ /**
98
+ * Читает и валидирует update-map.json из корня пакета. Карта из будущего
99
+ * (version новее CLI) — честный отказ, не молчаливое использование.
100
+ */
101
+ export declare function loadUpdateMap(pkgRoot?: string): UpdateMap;
102
+ //# sourceMappingURL=update-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-map.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/update-map.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,oBAAoB;;;;;;EAAmE,CAAC;AACrG,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,cAAc;;;;;EAAkD,CAAC;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;iBAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe;;;;;;;;;;;iBAM1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5D;AAeD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAA6B,GAAG,SAAS,CA4B/E"}