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,95 @@
1
+ // src/adapters/fs/update-map.ts
2
+ // T1 (волна 2.19.0, ADR-1): карта обновления — zod-схема wire-формата
3
+ // update-map.json (полный инвентарь состава релиза, корень пакета) и
4
+ // загрузчик из packageRoot. Путь в FileEntry/FaceEntry — относительно
5
+ // templates/ пакета: base/agents/*.md, base/skills/<name>/SKILL.md,
6
+ // base/commands/*.md, base/playbooks/*.md, opencode/plugins/* — те же
7
+ // корни, что обходит templateFiles() рендерера (opencode-renderer.ts).
8
+ import { readFileSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { z } from 'zod';
11
+ import { UserFacingError } from '../../domain/errors.js';
12
+ import { packageRoot as defaultPackageRoot } from '../render/templates-root.js';
13
+ /** Полный X.Y.Z — голые миноры запрещены (AGENTS.md). */
14
+ const SEMVER_RE = /^\d+\.\d+\.\d+$/;
15
+ export const UpdateCategorySchema = z.enum(['new', 'changed', 'unchanged', 'deprecated', 'removed']);
16
+ export const FileKindSchema = z.enum(['agent', 'skill', 'command', 'plugin']);
17
+ export const FileEntrySchema = z.object({
18
+ path: z.string().min(1),
19
+ kind: FileKindSchema,
20
+ category: UpdateCategorySchema,
21
+ });
22
+ export const FaceEntrySchema = z.object({
23
+ template: z.string().min(1),
24
+ owner_skill: z.string().min(1),
25
+ category: UpdateCategorySchema,
26
+ /** true = сеять недостающее лицо (seed-missing-only); false = репортить, не мутировать (deprecated). */
27
+ seed: z.boolean(),
28
+ });
29
+ export const UpdateMapSchema = z.object({
30
+ version: z.string().regex(SEMVER_RE),
31
+ prev: z.string().regex(SEMVER_RE),
32
+ /** ВСЕ файловые цели base-set — полный инвентарь, не компоновка дельт. */
33
+ files: z.array(FileEntrySchema),
34
+ faces: z.array(FaceEntrySchema),
35
+ agents_md: z.object({ category: UpdateCategorySchema, mode: z.literal('append-block') }),
36
+ /** Пусто = релиз без миграций схемы. */
37
+ schema_migrations: z.array(z.object({ from: z.number().int(), to: z.number().int() })),
38
+ /** Классы вне покрытия v1 — граница «не трогать чужое» объявлена явно. */
39
+ outside_v1: z.array(z.string()),
40
+ });
41
+ /** Сравнение полных версий X.Y.Z: -1 (a<b) | 0 | 1 (a>b). */
42
+ export function compareVersions(a, b) {
43
+ const pa = a.split('.').map(Number);
44
+ const pb = b.split('.').map(Number);
45
+ for (let i = 0; i < 3; i++) {
46
+ if (pa[i] !== pb[i])
47
+ return (pa[i] ?? 0) < (pb[i] ?? 0) ? -1 : 1;
48
+ }
49
+ return 0;
50
+ }
51
+ function readCliVersion(pkgRoot) {
52
+ let version;
53
+ try {
54
+ version = JSON.parse(readFileSync(join(pkgRoot, 'package.json'), 'utf8')).version;
55
+ }
56
+ catch {
57
+ throw new UserFacingError(`package.json not found or corrupted at ${pkgRoot}`);
58
+ }
59
+ if (typeof version !== 'string' || !SEMVER_RE.test(version)) {
60
+ throw new UserFacingError(`package.json at ${pkgRoot} has no valid X.Y.Z version`);
61
+ }
62
+ return version;
63
+ }
64
+ /**
65
+ * Читает и валидирует update-map.json из корня пакета. Карта из будущего
66
+ * (version новее CLI) — честный отказ, не молчаливое использование.
67
+ */
68
+ export function loadUpdateMap(pkgRoot = defaultPackageRoot()) {
69
+ const mapPath = join(pkgRoot, 'update-map.json');
70
+ let raw;
71
+ try {
72
+ raw = readFileSync(mapPath, 'utf8');
73
+ }
74
+ catch {
75
+ throw new UserFacingError(`update-map.json not found at ${mapPath} — reinstall the package`);
76
+ }
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(raw);
80
+ }
81
+ catch (err) {
82
+ throw new UserFacingError(`update-map.json is corrupted (invalid JSON): ${err instanceof Error ? err.message : String(err)}`);
83
+ }
84
+ const result = UpdateMapSchema.safeParse(parsed);
85
+ if (!result.success) {
86
+ const issue = result.error.issues[0];
87
+ throw new UserFacingError(`update-map.json is invalid at ${issue.path.join('.')}: ${issue.message}`);
88
+ }
89
+ const cliVersion = readCliVersion(pkgRoot);
90
+ if (compareVersions(result.data.version, cliVersion) > 0) {
91
+ throw new UserFacingError(`update-map.json version ${result.data.version} is newer than CLI ${cliVersion} — update wolf first`);
92
+ }
93
+ return result.data;
94
+ }
95
+ //# sourceMappingURL=update-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-map.js","sourceRoot":"","sources":["../../../src/adapters/fs/update-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TTL lock-файла параллельного upgrade (REQ-01/06): проход, убитый без
3
+ * release (SIGKILL/OOM), не должен блокировать следующие запуски навсегда —
4
+ * протухший lock перехватывается. 10 минут ≥ парковый бюджет N03.1 (≤40 с
5
+ * на 4 проекта) с запасом на медленные окружения.
6
+ */
7
+ export declare const LOCK_TTL_MS: number;
8
+ /**
9
+ * Lock-файл параллельного upgrade в ОС-tmp (механика в духе flock, но с
10
+ * TTL). Владелец — экземпляр в процессе: повторный acquire() тем же
11
+ * экземпляром идемпотентен; живой чужой lock → Error 'upgrade already
12
+ * running'; отсутствующий/протухший/битый — захватывается перезаписью.
13
+ */
14
+ export declare class UpgradeLock {
15
+ private readonly now;
16
+ private readonly dir;
17
+ private readonly held;
18
+ constructor(now?: () => number, dir?: string);
19
+ private file;
20
+ acquire(id: string): boolean;
21
+ release(id: string): void;
22
+ }
23
+ //# sourceMappingURL=upgrade-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-lock.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/upgrade-lock.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAiB,CAAC;AAE1C;;;;;GAKG;AACH,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;gBAGvB,GAAG,GAAE,MAAM,MAAiB,EAC5B,GAAG,GAAE,MAAiB;IAGzC,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAmB5B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAQ1B"}
@@ -0,0 +1,59 @@
1
+ import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
2
+ import { tmpdir } from 'os';
3
+ import { join } from 'path';
4
+ /**
5
+ * TTL lock-файла параллельного upgrade (REQ-01/06): проход, убитый без
6
+ * release (SIGKILL/OOM), не должен блокировать следующие запуски навсегда —
7
+ * протухший lock перехватывается. 10 минут ≥ парковый бюджет N03.1 (≤40 с
8
+ * на 4 проекта) с запасом на медленные окружения.
9
+ */
10
+ export const LOCK_TTL_MS = 10 * 60 * 1000;
11
+ /**
12
+ * Lock-файл параллельного upgrade в ОС-tmp (механика в духе flock, но с
13
+ * TTL). Владелец — экземпляр в процессе: повторный acquire() тем же
14
+ * экземпляром идемпотентен; живой чужой lock → Error 'upgrade already
15
+ * running'; отсутствующий/протухший/битый — захватывается перезаписью.
16
+ */
17
+ export class UpgradeLock {
18
+ now;
19
+ dir;
20
+ held = new Set();
21
+ constructor(now = Date.now, dir = tmpdir()) {
22
+ this.now = now;
23
+ this.dir = dir;
24
+ }
25
+ file(id) {
26
+ return join(this.dir, `${id}.lock`);
27
+ }
28
+ acquire(id) {
29
+ if (this.held.has(id))
30
+ return true; // тот же владелец — идемпотентно
31
+ let raw;
32
+ try {
33
+ raw = readFileSync(this.file(id), 'utf-8');
34
+ }
35
+ catch {
36
+ raw = undefined; // lock-файла нет — захват
37
+ }
38
+ if (raw !== undefined) {
39
+ const ts = Number(raw);
40
+ if (Number.isFinite(ts) && this.now() - ts < LOCK_TTL_MS)
41
+ throw new Error('upgrade already running');
42
+ // протухший (≥ TTL) или битый lock — перезаписываем
43
+ }
44
+ mkdirSync(this.dir, { recursive: true });
45
+ writeFileSync(this.file(id), String(this.now()));
46
+ this.held.add(id);
47
+ return true;
48
+ }
49
+ release(id) {
50
+ this.held.delete(id);
51
+ try {
52
+ unlinkSync(this.file(id));
53
+ }
54
+ catch {
55
+ // файла нет — уже снят
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=upgrade-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-lock.js","sourceRoot":"","sources":["../../../src/adapters/fs/upgrade-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAIH;IACA;IAJF,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,YACmB,MAAoB,IAAI,CAAC,GAAG,EAC5B,MAAc,MAAM,EAAE;QADtB,QAAG,GAAH,GAAG,CAAyB;QAC5B,QAAG,GAAH,GAAG,CAAmB;IACtC,CAAC;IAEI,IAAI,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,iCAAiC;QACrE,IAAI,GAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,SAAS,CAAC,CAAC,0BAA0B;QAC7C,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACrG,oDAAoD;QACtD,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import { BaseSetRenderer, ModelContext, RenderBaseSetOptions, RenderOutcome } from '../../../ports/base-set-renderer.port.js';
1
+ import { BaseSetRenderer, InspectOutcome, ModelContext, RenderBaseSetOptions, RenderOutcome } from '../../../ports/base-set-renderer.port.js';
2
2
  export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
3
3
  private readonly baseTemplatesRoot;
4
4
  private readonly opts;
@@ -16,6 +16,18 @@ export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
16
16
  outcomes: RenderOutcome[];
17
17
  orphaned: string[];
18
18
  }>;
19
+ /** T10 (REQ-08): read-only инспекция целей base-set — предикат того, что
20
+ * сделает syncBaseSet, БЕЗ записей (ни writeFileAtomic, ни saveSyncState):
21
+ * missing / foreign (unstamped, wx-политика) / identical / differs /
22
+ * mutated (свидетель sync-state говорит о локальной правке). models по
23
+ * умолчанию 'omit' — паритет с syncBaseSet, чей исход и предсказываем. */
24
+ inspectBaseSet(baseDir: string, opts?: RenderBaseSetOptions): Promise<InspectOutcome[]>;
25
+ /** Read-only инспекция AGENTS.md (§4.2) — по фактическим веткам управления:
26
+ * штампованный цельный файл — зона syncAgentsMd (сверка всего файла со
27
+ * штампом, mutated по свидетелю); без штампа — маркер-блок append-ветки
28
+ * init (синку не принадлежит, свидетеля не имеет); нет ни штампа, ни
29
+ * маркера — чужой файл на месте цели (wx-политика → foreign). */
30
+ private inspectAgentsMd;
19
31
  /** AGENTS.md — цель в КОРНЕ проекта (§4.2); шаблона нет — тихо нет исхода. */
20
32
  private agentsMdPaths;
21
33
  private agentsMdContent;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-renderer.d.ts","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EAEf,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACd,MAAM,0CAA0C,CAAC;AAuBlD,qBAAa,uBAAwB,YAAW,eAAe;IAI3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,EAAE,SAAc;gBAGG,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE;QAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpF,OAAO,KAAK,UAAU,GAErB;IAED,gFAAgF;IAChF,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,OAAO;IASV,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA8CrF,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA8D7D,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,6EAA6E;YAC/D,cAAc;IAyB5B,gGAAgG;YAClF,YAAY;IA2C1B,OAAO,CAAC,aAAa;IASrB,+EAA+E;YACjE,aAAa;CAM5B"}
1
+ {"version":3,"file":"opencode-renderer.d.ts","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,eAAe,EAEf,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACd,MAAM,0CAA0C,CAAC;AAuBlD,qBAAa,uBAAwB,YAAW,eAAe;IAI3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,EAAE,SAAc;gBAGG,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE;QAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpF,OAAO,KAAK,UAAU,GAErB;IAED,gFAAgF;IAChF,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,OAAO;IASV,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA+CrF,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA+D7D;;;;+EAI2E;IACrE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8B7F;;;;sEAIkE;IAClE,OAAO,CAAC,eAAe;IAqBvB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,6EAA6E;YAC/D,cAAc;IAyB5B,gGAAgG;YAClF,YAAY;IA4C1B,OAAO,CAAC,aAAa;IASrB,+EAA+E;YACjE,aAAa;CAM5B"}
@@ -1,7 +1,8 @@
1
1
  // src/adapters/render/opencode/opencode-renderer.ts
2
2
  import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
3
3
  import { basename, join, relative } from 'path';
4
- import { mkdir, writeFile } from 'fs/promises';
4
+ import { mkdir } from 'fs/promises';
5
+ import { writeFileAtomic } from '../../fs/markdown-memory-store.js';
5
6
  import { OPENCODE_MANIFEST, substitute } from '../manifest.js';
6
7
  import { insertStamp, parseStamp } from '../stamp.js';
7
8
  import { loadSyncState, saveSyncState, sha256 } from '../sync-state.js';
@@ -85,11 +86,12 @@ export class OpencodeBaseSetRenderer {
85
86
  outcomes.push({
86
87
  file: rel,
87
88
  action: 'skipped',
89
+ mutated: true,
88
90
  reason: 'mutated after render — differs from recorded render and fresh render; left untouched',
89
91
  });
90
92
  }
91
93
  else {
92
- await writeFile(f.target, fresh, 'utf-8');
94
+ await writeFileAtomic(f.target, fresh);
93
95
  state.files[rel] = sha256(fresh);
94
96
  outcomes.push({ file: rel, action: 'updated', reason: 'content differs (diff branch, §4.5)' });
95
97
  }
@@ -137,12 +139,13 @@ export class OpencodeBaseSetRenderer {
137
139
  outcomes.push({
138
140
  file: rel,
139
141
  action: 'skipped',
142
+ mutated: true,
140
143
  reason: 'mutated after render — differs from recorded render and fresh render; left untouched',
141
144
  });
142
145
  continue;
143
146
  }
144
147
  await mkdir(join(f.target, '..'), { recursive: true });
145
- await writeFile(f.target, fresh, 'utf-8');
148
+ await writeFileAtomic(f.target, fresh);
146
149
  state.files[rel] = sha256(fresh);
147
150
  outcomes.push({ file: rel, action: 'updated' });
148
151
  }
@@ -165,6 +168,70 @@ export class OpencodeBaseSetRenderer {
165
168
  saveSyncState(baseDir, state);
166
169
  return { outcomes, orphaned };
167
170
  }
171
+ /** T10 (REQ-08): read-only инспекция целей base-set — предикат того, что
172
+ * сделает syncBaseSet, БЕЗ записей (ни writeFileAtomic, ни saveSyncState):
173
+ * missing / foreign (unstamped, wx-политика) / identical / differs /
174
+ * mutated (свидетель sync-state говорит о локальной правке). models по
175
+ * умолчанию 'omit' — паритет с syncBaseSet, чей исход и предсказываем. */
176
+ async inspectBaseSet(baseDir, opts) {
177
+ const ctx = opts?.models ?? 'omit'; // легаси без routing-объекта — omit (§4.5)
178
+ const state = loadSyncState(baseDir);
179
+ const outcomes = [];
180
+ for (const f of this.templateFiles(baseDir)) {
181
+ const rel = relative(baseDir, f.target);
182
+ if (!existsSync(f.target)) {
183
+ outcomes.push({ file: rel, action: 'missing' });
184
+ continue;
185
+ }
186
+ const current = readFileSync(f.target, 'utf-8');
187
+ if (parseStamp(current) === null) {
188
+ outcomes.push({ file: rel, action: 'foreign' });
189
+ continue;
190
+ }
191
+ const fresh = this.renderContent(f, opts?.bake, ctx);
192
+ if (fresh === current) {
193
+ outcomes.push({ file: rel, action: 'identical' });
194
+ continue;
195
+ }
196
+ outcomes.push({
197
+ file: rel,
198
+ action: state.files[rel] !== undefined && sha256(current) !== state.files[rel] ? 'mutated' : 'differs',
199
+ });
200
+ }
201
+ const agents = this.inspectAgentsMd(baseDir, ctx, state);
202
+ if (agents)
203
+ outcomes.push(agents);
204
+ return outcomes;
205
+ }
206
+ /** Read-only инспекция AGENTS.md (§4.2) — по фактическим веткам управления:
207
+ * штампованный цельный файл — зона syncAgentsMd (сверка всего файла со
208
+ * штампом, mutated по свидетелю); без штампа — маркер-блок append-ветки
209
+ * init (синку не принадлежит, свидетеля не имеет); нет ни штампа, ни
210
+ * маркера — чужой файл на месте цели (wx-политика → foreign). */
211
+ inspectAgentsMd(baseDir, models, state) {
212
+ const paths = this.agentsMdPaths(baseDir);
213
+ if (!paths)
214
+ return null;
215
+ if (!existsSync(paths.target))
216
+ return { file: 'AGENTS.md', action: 'missing' };
217
+ const current = readFileSync(paths.target, 'utf-8');
218
+ const content = this.agentsMdContent(paths.tplPath, models);
219
+ const norm = (s) => (s.endsWith('\n') ? s : `${s}\n`);
220
+ if (parseStamp(current) !== null) {
221
+ const fresh = insertStamp(content, { base: 'AGENTS.md', set: this.setVersion }, 'AGENTS.md');
222
+ if (fresh === current)
223
+ return { file: 'AGENTS.md', action: 'identical' };
224
+ const recorded = state.files['AGENTS.md'];
225
+ return {
226
+ file: 'AGENTS.md',
227
+ action: recorded !== undefined && sha256(current) !== recorded ? 'mutated' : 'differs',
228
+ };
229
+ }
230
+ const idx = current.indexOf(ONBOARDING_MARKER);
231
+ if (idx === -1)
232
+ return { file: 'AGENTS.md', action: 'foreign' };
233
+ return { file: 'AGENTS.md', action: norm(current.slice(idx)) === norm(content) ? 'identical' : 'differs' };
234
+ }
168
235
  /** AGENTS.md — цель в КОРНЕ проекта (§4.2); шаблона нет — тихо нет исхода. */
169
236
  agentsMdPaths(baseDir) {
170
237
  const tplPath = join(this.baseTemplatesRoot, 'AGENTS.md');
@@ -184,7 +251,7 @@ export class OpencodeBaseSetRenderer {
184
251
  const content = this.agentsMdContent(paths.tplPath, models);
185
252
  if (!existsSync(paths.target)) {
186
253
  const written = insertStamp(content, { base: 'AGENTS.md', set: this.setVersion }, 'AGENTS.md');
187
- await writeFile(paths.target, written, 'utf-8');
254
+ await writeFileAtomic(paths.target, written);
188
255
  state.files['AGENTS.md'] = sha256(written);
189
256
  return [{ file: 'AGENTS.md', action: 'created' }];
190
257
  }
@@ -195,7 +262,7 @@ export class OpencodeBaseSetRenderer {
195
262
  // marker-append: маркированный блок без штампа в конец; чужой контент не трогаем
196
263
  const block = content.endsWith('\n') ? content : `${content}\n`;
197
264
  const sep = current.endsWith('\n') ? (current.endsWith('\n\n') ? '' : '\n') : '\n\n';
198
- await writeFile(paths.target, `${current}${sep}${block}`, 'utf-8');
265
+ await writeFileAtomic(paths.target, `${current}${sep}${block}`);
199
266
  return [{ file: 'AGENTS.md', action: 'appended', reason: 'marker-append (D3: foreign content untouched)' }];
200
267
  }
201
268
  /** Sync-ветка AGENTS.md: только штампованный цельный файл; append-блок синку не принадлежит. */
@@ -205,7 +272,7 @@ export class OpencodeBaseSetRenderer {
205
272
  return [];
206
273
  const fresh = insertStamp(this.agentsMdContent(paths.tplPath, models), { base: 'AGENTS.md', set: this.setVersion }, 'AGENTS.md');
207
274
  if (!existsSync(paths.target)) {
208
- await writeFile(paths.target, fresh, 'utf-8');
275
+ await writeFileAtomic(paths.target, fresh);
209
276
  state.files['AGENTS.md'] = sha256(fresh);
210
277
  return [{ file: 'AGENTS.md', action: 'created' }];
211
278
  }
@@ -226,11 +293,12 @@ export class OpencodeBaseSetRenderer {
226
293
  {
227
294
  file: 'AGENTS.md',
228
295
  action: 'skipped',
296
+ mutated: true,
229
297
  reason: 'mutated after render — differs from recorded render and fresh render; left untouched',
230
298
  },
231
299
  ];
232
300
  }
233
- await writeFile(paths.target, fresh, 'utf-8');
301
+ await writeFileAtomic(paths.target, fresh);
234
302
  state.files['AGENTS.md'] = sha256(fresh);
235
303
  return [{ file: 'AGENTS.md', action: 'updated' }];
236
304
  }
@@ -246,7 +314,7 @@ export class OpencodeBaseSetRenderer {
246
314
  async writeRendered(f, bake, models) {
247
315
  await mkdir(join(f.target, '..'), { recursive: true });
248
316
  const content = this.renderContent(f, bake, models);
249
- await writeFile(f.target, content, 'utf-8');
317
+ await writeFileAtomic(f.target, content);
250
318
  return content;
251
319
  }
252
320
  }
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-renderer.js","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-renderer.js","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { BaseSetRenderer, ModelContext } from '../../ports/base-set-renderer.port.js';
2
+ import type { UpdateMap } from '../../adapters/fs/update-map.js';
3
+ import { type SeedDeps, type SeedOutcome } from './seed-base-playbooks.js';
4
+ import { type SyncVerifyOutcome, type VerifyResult } from './verify-against-map.js';
5
+ /** Внешние зависимости шага: посев (SeedDeps без mode — режим задаёт шаг;
6
+ * files — базовые имена шаблонов, прецедент сборки memory-init.ts:183-196) +
7
+ * рендерер base-set. Контейнер собирает вызывающий слой (T7/Ф4), не шаг. */
8
+ export interface ProjectStepDeps extends Omit<SeedDeps, 'mode'> {
9
+ renderer: BaseSetRenderer;
10
+ /** Контекст моделей для sync-рендера (§4.5); дефолт 'omit' (прецедент sync). */
11
+ models?: ModelContext | 'omit';
12
+ /** Замер wall-time шага (NFR-03); дефолт Date.now. */
13
+ now?: () => number;
14
+ }
15
+ /** Подтверждение REQ-02: проектные пути removed-целей, покрытые единым
16
+ * списком. Шаг НЕ спрашивает второго подтверждения (ADR-4) — но и не
17
+ * удаляет ничего без него (fail-safe: без opts.confirmedRemovals удалений нет,
18
+ * оставшиеся removed-цели дают error сверки — план не доведён). */
19
+ export interface ProjectStepOpts {
20
+ confirmedRemovals?: string[];
21
+ }
22
+ /** Итог шага по exit-модели design §«Exit-модель»: 0-подобный / требует
23
+ * решения / error. Сам exit-код ставит CLI-слой (T7/T9), не шаг. */
24
+ export type ExitKind = 'done' | 'needs-decision' | 'error';
25
+ /** Отчёт по проекту — вход рендера T3 и сводки парка T7. */
26
+ export interface ProjectReport {
27
+ /** Имя (basename) и корень проекта. */
28
+ name: string;
29
+ root: string;
30
+ /** Фазы 1-2: исходы sync; осиротевшие, ОСТАВШИЕСЯ после шага удалений
31
+ * (дрейф без объявления); удалённые в этом проходе (подтверждённые). */
32
+ sync: {
33
+ outcomes: SyncVerifyOutcome[];
34
+ orphaned: string[];
35
+ removed: string[];
36
+ };
37
+ /** Фаза 3: исходы посева — единственная мутация памяти (REQ-07). */
38
+ seed: SeedOutcome[];
39
+ /** Фаза 4: ленивая миграция схемы (backup — внутри guard); refused —
40
+ * отказ guard (например схема из будущего), ошибка передаётся как есть. */
41
+ schema: {
42
+ status: 'ok' | 'migrated' | 'refused';
43
+ error?: string;
44
+ };
45
+ /** Фаза 5: строгая сверка с картой — каждый пункт со статусом (T5). */
46
+ verify: VerifyResult;
47
+ /** Замер шага (NFR-03), мс; минимум 1 — разрешение Date.now-обёртки. */
48
+ wallMs: number;
49
+ exitKind: ExitKind;
50
+ }
51
+ export declare function runProjectStep(deps: ProjectStepDeps, root: string, map: UpdateMap, opts?: ProjectStepOpts): Promise<ProjectReport>;
52
+ //# sourceMappingURL=project-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-step.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/project-step.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC;;4EAE4E;AAC5E,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC7D,QAAQ,EAAE,eAAe,CAAC;IAC1B,gFAAgF;IAChF,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC/B,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;mEAGmE;AACnE,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;oEACoE;AACpE,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAE3D,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;4EACwE;IACxE,IAAI,EAAE;QAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/E,oEAAoE;IACpE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB;+EAC2E;IAC3E,MAAM,EAAE;QAAE,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,uEAAuE;IACvE,MAAM,EAAE,YAAY,CAAC;IACrB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,EACd,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,aAAa,CAAC,CAiExB"}
@@ -0,0 +1,77 @@
1
+ // src/app/use-cases/project-step.ts
2
+ // T6 (волна 2.19.0, REQ-03/07/11, ADR-3/4, design §«Проектный шаг»): тонкая
3
+ // композиция ОДНОГО проекта — sync → removals → посев → миграция → сверка.
4
+ // Семантика шагов живёт в самих шагах (ADR-3); здесь только порядок фаз,
5
+ // ввод подтверждения удалений (REQ-02/ADR-4) и сведение исходов в ProjectReport
6
+ // (контракт для оркестратора T7 и рендера T3). Пофазная фиксация: записи фаз
7
+ // атомарны внутри шагов, сбой фазы k не откатывает k-1 — повтор доводит до
8
+ // конца (NFR-02). Единственная мутация памяти — посев (REQ-07).
9
+ import { existsSync } from 'fs';
10
+ import { unlink } from 'fs/promises';
11
+ import { basename, join } from 'path';
12
+ import { ensureCurrentSchema } from '../../adapters/fs/schema-guard.js';
13
+ import { syncBaseSet } from './sync-base-set.js';
14
+ import { seedBasePlaybooks } from './seed-base-playbooks.js';
15
+ import { projectPath as mapEntryProjectPath, verifyAgainstMap, } from './verify-against-map.js';
16
+ export async function runProjectStep(deps, root, map, opts = {}) {
17
+ const now = deps.now ?? Date.now;
18
+ const startedAt = now();
19
+ // 1. sync: перезапись / skip-mutated / identical; orphaned — вход шага удалений.
20
+ const { outcomes: syncOutcomes, orphaned } = await syncBaseSet(deps.renderer, root, deps.models ?? 'omit');
21
+ // 2. removals: удаляется только объявленное картой И подтверждённое списком
22
+ // REQ-02 (второго подтверждения нет — ADR-4). Прочий orphaned не трогаем.
23
+ const removedTargets = new Set(map.files.filter((e) => e.category === 'removed').map((e) => mapEntryProjectPath(e)));
24
+ const confirmed = new Set(opts.confirmedRemovals ?? []);
25
+ const removed = [];
26
+ for (const p of orphaned) {
27
+ if (!removedTargets.has(p) || !confirmed.has(p))
28
+ continue;
29
+ await unlink(join(root, p));
30
+ removed.push(p);
31
+ }
32
+ // Контракт T5: removals = подтверждённо отсутствующие ПОСЛЕ шага — удалённые
33
+ // теперь или отсутствовавшие ранее (идемпотентность повтора, NFR-02).
34
+ const removals = [...removedTargets].filter((p) => confirmed.has(p) && !existsSync(join(root, p)));
35
+ // Дрейф без объявления: оставшийся orphaned вне карты — факт для сверки
36
+ // («файл вне карты» → conflict → «требует решения», design §«Сверка»).
37
+ const drift = orphaned
38
+ .filter((p) => !removedTargets.has(p))
39
+ .map((p) => ({
40
+ file: p,
41
+ action: 'conflict',
42
+ reason: 'orphaned after pass — stamped file outside the map, not declared removed (drift without declaration)',
43
+ }));
44
+ // 3. посев — только недостающие лица (mode задаёт шаг) и только шаблоны,
45
+ // объявленные картой с seed:true; deprecated-шаблоны не сеются (REQ-11).
46
+ const seedTemplates = new Set(map.faces.filter((f) => f.seed).map((f) => basename(f.template)));
47
+ const seedFiles = new Map([...deps.files].filter(([file]) => seedTemplates.has(file)));
48
+ const seedOutcomes = await seedBasePlaybooks({ ...deps, files: seedFiles, mode: 'seed-missing-only' });
49
+ // 4. миграция: отказ guard'а (например схема из будущего) — в отчёт как есть,
50
+ // не крах шага; эффекты фаз 1-3 стабильны.
51
+ let schema = { status: 'ok' };
52
+ try {
53
+ schema = { status: await ensureCurrentSchema(root) };
54
+ }
55
+ catch (err) {
56
+ schema = { status: 'refused', error: err instanceof Error ? err.message : String(err) };
57
+ }
58
+ // 5. сверка: исходы всех фаз → статус каждого пункта карты.
59
+ const verify = verifyAgainstMap(map, {
60
+ syncOutcomes: [...syncOutcomes, ...drift],
61
+ seedOutcomes,
62
+ removals,
63
+ });
64
+ const errors = verify.summary.errors + (schema.status === 'refused' ? 1 : 0);
65
+ const exitKind = errors > 0 ? 'error' : verify.summary.needsDecision > 0 ? 'needs-decision' : 'done';
66
+ return {
67
+ name: basename(root),
68
+ root,
69
+ sync: { outcomes: syncOutcomes, orphaned: orphaned.filter((p) => !removed.includes(p)), removed },
70
+ seed: seedOutcomes,
71
+ schema,
72
+ verify,
73
+ wallMs: Math.max(1, now() - startedAt),
74
+ exitKind,
75
+ };
76
+ }
77
+ //# sourceMappingURL=project-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-step.js","sourceRoot":"","sources":["../../../src/app/use-cases/project-step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface ScanUnregisteredDeps {
2
+ /** Пути из реестра (projects.yaml); сверка по realpath (прецедент T4 dedupeByRealpath), несуществующие пропускаются мягко. */
3
+ registeredPaths: string[];
4
+ /** Корень скана; по умолчанию домашний каталог. */
5
+ root?: string;
6
+ /** Максимальная глубина обхода (уровни каталогов ниже root). */
7
+ maxDepth?: number;
8
+ /** Мягкий бюджет скана, мс: при превышении вернуть найденное к моменту остановки. */
9
+ budgetMs?: number;
10
+ /** Инжект часов (бюджет тестируем без fake timers). */
11
+ now?: () => number;
12
+ }
13
+ export type ScanResult = {
14
+ found: number;
15
+ top: string[];
16
+ hint: string;
17
+ } | null;
18
+ /**
19
+ * Ограниченный read-only скан живых памятей вне реестра (REQ-09):
20
+ * обход root BFS на глубину maxDepth, «живая» = `<dir>/.wolf/memory`.
21
+ * Read-only (readdir/stat/realpath); мутаций и автозаписи в реестр нет.
22
+ * null — ничего не найдено или root недоступен (R09.2: это не ошибка).
23
+ */
24
+ export declare function scanUnregistered(deps: ScanUnregisteredDeps): Promise<ScanResult>;
25
+ //# sourceMappingURL=scan-unregistered.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-unregistered.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scan-unregistered.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,8HAA8H;IAC9H,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAK/E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CA6DtF"}