mister-wolf 2.17.0 → 2.18.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.
- package/README.md +31 -18
- package/README.ru.md +25 -14
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +8 -0
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/claim.d.ts +6 -0
- package/dist/adapters/cli/commands/claim.d.ts.map +1 -0
- package/dist/adapters/cli/commands/claim.js +74 -0
- package/dist/adapters/cli/commands/claim.js.map +1 -0
- package/dist/adapters/cli/commands/face.d.ts.map +1 -1
- package/dist/adapters/cli/commands/face.js +36 -3
- package/dist/adapters/cli/commands/face.js.map +1 -1
- package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-doctor.js +37 -5
- package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
- package/dist/adapters/cli/commands/memory-edit.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-edit.js +6 -52
- package/dist/adapters/cli/commands/memory-edit.js.map +1 -1
- package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-init.js +26 -1
- package/dist/adapters/cli/commands/memory-init.js.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.js +2 -1
- package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
- package/dist/adapters/fs/claim-registry.d.ts +114 -0
- package/dist/adapters/fs/claim-registry.d.ts.map +1 -0
- package/dist/adapters/fs/claim-registry.js +343 -0
- package/dist/adapters/fs/claim-registry.js.map +1 -0
- package/dist/adapters/fs/memory-root.d.ts +26 -1
- package/dist/adapters/fs/memory-root.d.ts.map +1 -1
- package/dist/adapters/fs/memory-root.js +88 -2
- package/dist/adapters/fs/memory-root.js.map +1 -1
- package/dist/app/use-cases/build-analytics.d.ts +22 -0
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +34 -0
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/claim-artifact.d.ts +34 -0
- package/dist/app/use-cases/claim-artifact.d.ts.map +1 -0
- package/dist/app/use-cases/claim-artifact.js +43 -0
- package/dist/app/use-cases/claim-artifact.js.map +1 -0
- package/dist/app/use-cases/create-face-version.d.ts +26 -4
- package/dist/app/use-cases/create-face-version.d.ts.map +1 -1
- package/dist/app/use-cases/create-face-version.js +9 -133
- package/dist/app/use-cases/create-face-version.js.map +1 -1
- package/dist/app/use-cases/edit-memory-object.d.ts +26 -0
- package/dist/app/use-cases/edit-memory-object.d.ts.map +1 -0
- package/dist/app/use-cases/edit-memory-object.js +57 -0
- package/dist/app/use-cases/edit-memory-object.js.map +1 -0
- package/dist/app/use-cases/face-operation.d.ts +81 -0
- package/dist/app/use-cases/face-operation.d.ts.map +1 -0
- package/dist/app/use-cases/face-operation.js +503 -0
- package/dist/app/use-cases/face-operation.js.map +1 -0
- package/dist/app/use-cases/get-call-injections.d.ts +12 -1
- package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
- package/dist/app/use-cases/get-call-injections.js +73 -12
- package/dist/app/use-cases/get-call-injections.js.map +1 -1
- package/dist/app/use-cases/init-project.d.ts +6 -0
- package/dist/app/use-cases/init-project.d.ts.map +1 -1
- package/dist/app/use-cases/init-project.js +34 -1
- package/dist/app/use-cases/init-project.js.map +1 -1
- package/dist/app/use-cases/migrate-faces.d.ts +45 -11
- package/dist/app/use-cases/migrate-faces.d.ts.map +1 -1
- package/dist/app/use-cases/migrate-faces.js +234 -32
- package/dist/app/use-cases/migrate-faces.js.map +1 -1
- package/dist/app/use-cases/promote-memory.d.ts +14 -1
- package/dist/app/use-cases/promote-memory.d.ts.map +1 -1
- package/dist/app/use-cases/promote-memory.js +36 -5
- package/dist/app/use-cases/promote-memory.js.map +1 -1
- package/dist/app/use-cases/scaffold-artifact.d.ts +5 -0
- package/dist/app/use-cases/scaffold-artifact.d.ts.map +1 -1
- package/dist/app/use-cases/scaffold-artifact.js +2 -0
- package/dist/app/use-cases/scaffold-artifact.js.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.d.ts +3 -3
- package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.js +75 -29
- package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
- package/dist/app/use-cases/supersede-memory-object.d.ts +3 -1
- package/dist/app/use-cases/supersede-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/supersede-memory-object.js +8 -1
- package/dist/app/use-cases/supersede-memory-object.js.map +1 -1
- package/dist/app/use-cases/transition-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/transition-memory-object.js +6 -0
- package/dist/app/use-cases/transition-memory-object.js.map +1 -1
- package/dist/domain/memory-types.d.ts +28 -2
- package/dist/domain/memory-types.d.ts.map +1 -1
- package/dist/domain/memory-types.js +50 -2
- package/dist/domain/memory-types.js.map +1 -1
- package/dist/domain/schemas/memory-event-schema.d.ts +4 -0
- package/dist/domain/schemas/memory-event-schema.d.ts.map +1 -1
- package/dist/domain/schemas/memory-event-schema.js +12 -0
- package/dist/domain/schemas/memory-event-schema.js.map +1 -1
- package/dist/domain/type-schema-builder.d.ts +1 -1
- package/dist/domain/type-schema-builder.d.ts.map +1 -1
- package/dist/domain/type-schema-builder.js +20 -0
- package/dist/domain/type-schema-builder.js.map +1 -1
- package/package.json +1 -1
- package/templates/.wolf/router.log +1 -1
- package/templates/base/agents/steward.md +9 -6
- package/templates/base/playbooks/complaint-protocol.md +1 -1
- package/templates/base/playbooks/steward-nastavnik.md +36 -17
- package/templates/base/skills/wolf-brainstorm/SKILL.md +25 -0
|
@@ -1,10 +1,234 @@
|
|
|
1
|
+
import { resolveCreatedBy } from '../../domain/actor.js';
|
|
1
2
|
import { createFaceVersion } from './create-face-version.js';
|
|
2
3
|
import { supersedeMemoryObject } from './supersede-memory-object.js';
|
|
4
|
+
import { generateOpId } from './face-operation.js';
|
|
5
|
+
/** Дословный формат reason миграции волны 2.17 (migrate-faces.ts:95 той волны);
|
|
6
|
+
* детект healing — только точное равенство (anchored, с суффиксом), усечённое
|
|
7
|
+
* сравнение запрещено (ADR-4: риск «формат сломает детект» закрыт контрактом). */
|
|
8
|
+
function legacyMigrationReason(headId) {
|
|
9
|
+
return `migrated from playbook note ${headId} (2.17)`;
|
|
10
|
+
}
|
|
3
11
|
async function facesOfOwner(store, ownerSkill) {
|
|
4
12
|
return (await store.list({ type: 'face' }))
|
|
5
13
|
.filter((o) => o.owner_skill === ownerSkill)
|
|
6
14
|
.map((o) => o);
|
|
7
15
|
}
|
|
16
|
+
function parseMigrateOps(events) {
|
|
17
|
+
const ops = new Map();
|
|
18
|
+
let seq = 0;
|
|
19
|
+
for (const e of events) {
|
|
20
|
+
const opId = typeof e.payload['opId'] === 'string' ? e.payload['opId'] : null;
|
|
21
|
+
if (opId === null)
|
|
22
|
+
continue;
|
|
23
|
+
if (e.type === 'memory.face.op_started') {
|
|
24
|
+
if (e.payload['command'] !== 'migrate')
|
|
25
|
+
continue;
|
|
26
|
+
const plan = Array.isArray(e.payload['plan']) ? e.payload['plan'].map(String) : [];
|
|
27
|
+
ops.set(opId, {
|
|
28
|
+
opId,
|
|
29
|
+
ownerSkill: String(e.payload['owner_skill'] ?? ''),
|
|
30
|
+
healing: plan[0] !== 'add_face',
|
|
31
|
+
input: (e.payload['input'] ?? {}),
|
|
32
|
+
steps: new Set(),
|
|
33
|
+
seq: seq++,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else if (e.type === 'memory.face.op_step') {
|
|
37
|
+
const op = ops.get(opId);
|
|
38
|
+
if (op)
|
|
39
|
+
op.steps.add(String(e.payload['step']));
|
|
40
|
+
}
|
|
41
|
+
else if (e.type === 'memory.face.op_committed' || e.type === 'memory.face.op_aborted') {
|
|
42
|
+
// незавершённая = нет op_committed/op_aborted (как incompleteFaceOperations §3.3)
|
|
43
|
+
ops.delete(opId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return ops;
|
|
47
|
+
}
|
|
48
|
+
async function appendFaceEvent(deps, type, payload, actor) {
|
|
49
|
+
const now = deps.clock.now();
|
|
50
|
+
await deps.log.append({ id: deps.idGen.generateEventId(now), type, timestamp: now.toISOString(), actor, payload });
|
|
51
|
+
}
|
|
52
|
+
/** FTS-индекс производный (§3.3): сбой его обновления не рушит healing —
|
|
53
|
+
* зеркалирует safeIndex face-operation.ts (обёртка без прототипного spread). */
|
|
54
|
+
function healingSafeIndex(deps, opId) {
|
|
55
|
+
const idx = deps.index;
|
|
56
|
+
if (!idx)
|
|
57
|
+
return undefined;
|
|
58
|
+
return {
|
|
59
|
+
rebuild: (objects) => idx.rebuild(objects),
|
|
60
|
+
indexObject: (o) => idx.indexObject(o).catch((err) => {
|
|
61
|
+
console.error(`face healing ${opId}: FTS index update failed (wolf doctor --repair rebuilds it): ${err instanceof Error ? err.message : String(err)}`);
|
|
62
|
+
}),
|
|
63
|
+
removeObject: (id) => idx.removeObject(id),
|
|
64
|
+
search: (q, o) => idx.search(q, o),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Healing-операция (§3.4 разбор 3): дозавершение доказуемо связанного
|
|
68
|
+
* legacy-перехода — ТОЛЬКО переходы статусов и события; body лица не пишется
|
|
69
|
+
* (REQ-04 AC-3). Каждый шаг идемпотентен (повторный supersede_legacy — skip);
|
|
70
|
+
* resume существующей незавершённой healing-операции — по её op_started input
|
|
71
|
+
* (faceId/headId записаны в него — resume детерминирован). Идёт под тем же
|
|
72
|
+
* MemoryLock, что и fresh-миграция (createFaceVersion берёт его сам; lock
|
|
73
|
+
* не реентерабелен — внутри шагов lock не берётся). */
|
|
74
|
+
async function healLegacyTransition(deps, ownerSkill, face, headId, existing, actor) {
|
|
75
|
+
const run = async () => {
|
|
76
|
+
let opId;
|
|
77
|
+
let done;
|
|
78
|
+
if (existing) {
|
|
79
|
+
opId = existing.opId;
|
|
80
|
+
done = existing.steps;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
opId = generateOpId(deps.clock);
|
|
84
|
+
await appendFaceEvent(deps, 'memory.face.op_started', {
|
|
85
|
+
opId,
|
|
86
|
+
command: 'migrate',
|
|
87
|
+
owner_skill: ownerSkill,
|
|
88
|
+
plan: ['supersede_legacy', 'announce'],
|
|
89
|
+
input: { command: 'migrate', ownerSkill, reason: face.reason, faceId: face.id, headId },
|
|
90
|
+
}, actor);
|
|
91
|
+
done = new Set();
|
|
92
|
+
}
|
|
93
|
+
// supersede_legacy — уже погашенный head не перезаписывается (идемпотентность)
|
|
94
|
+
const head = await deps.store.get(headId);
|
|
95
|
+
if (head && head.status !== 'superseded') {
|
|
96
|
+
await supersedeMemoryObject({ store: deps.store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index: healingSafeIndex(deps, opId) }, headId, face.id);
|
|
97
|
+
}
|
|
98
|
+
if (!done.has('supersede_legacy')) {
|
|
99
|
+
await appendFaceEvent(deps, 'memory.face.op_step', { opId, step: 'supersede_legacy', detail: { head_id: headId, face_id: face.id } }, actor);
|
|
100
|
+
done.add('supersede_legacy');
|
|
101
|
+
}
|
|
102
|
+
deps.fault?.('supersede_legacy');
|
|
103
|
+
// announce — идемпотентен по событию memory.face.versioned(new = face)
|
|
104
|
+
const announced = (await deps.log.readAll()).some((e) => e.type === 'memory.face.versioned' && e.payload['new'] === face.id);
|
|
105
|
+
if (!announced) {
|
|
106
|
+
await appendFaceEvent(deps, 'memory.face.versioned', { owner_skill: ownerSkill, from: null, new: face.id, initiator: 'migration', reason: face.reason }, actor);
|
|
107
|
+
}
|
|
108
|
+
if (!done.has('announce')) {
|
|
109
|
+
await appendFaceEvent(deps, 'memory.face.op_step', { opId, step: 'announce' }, actor);
|
|
110
|
+
done.add('announce');
|
|
111
|
+
}
|
|
112
|
+
// op_committed — F7-крайний случай: дозаписывается повторным запуском
|
|
113
|
+
const committed = (await deps.log.readAll()).some((e) => e.type === 'memory.face.op_committed' && e.payload['opId'] === opId);
|
|
114
|
+
if (!committed) {
|
|
115
|
+
deps.fault?.('op_committed');
|
|
116
|
+
await appendFaceEvent(deps, 'memory.face.op_committed', { opId }, actor);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return deps.lock ? deps.lock.withLock(run) : run();
|
|
120
|
+
}
|
|
121
|
+
async function migrateOwner(deps, ownerSkill, records, actor) {
|
|
122
|
+
// §3.4 разбор 1: незавершённая операция migrate владельца → resume
|
|
123
|
+
const migrateOps = parseMigrateOps(await deps.log.readAll());
|
|
124
|
+
const lastUnfinished = (healing) => [...migrateOps.values()]
|
|
125
|
+
.filter((o) => o.healing === healing && o.ownerSkill === ownerSkill)
|
|
126
|
+
.sort((a, b) => a.seq - b.seq)
|
|
127
|
+
.pop() ?? null;
|
|
128
|
+
const unfinishedMigration = lastUnfinished(false);
|
|
129
|
+
let resumed = false;
|
|
130
|
+
if (unfinishedMigration) {
|
|
131
|
+
// input — JSON-чистый payload op_started (JSONL); недоверенные ключи createFaceVersion
|
|
132
|
+
// валидирует сам (reason/body обязательны, guard — до op_started)
|
|
133
|
+
await createFaceVersion(deps, unfinishedMigration.input);
|
|
134
|
+
resumed = true;
|
|
135
|
+
}
|
|
136
|
+
// разборы 2–4 — по фактическому состоянию store (журнал — намёк, store — истина)
|
|
137
|
+
const liveFaces = (await facesOfOwner(deps.store, ownerSkill)).filter((f) => f.status === 'active' || f.status === 'candidate');
|
|
138
|
+
const heads = (await Promise.all(records.map((r) => deps.store.get(r.id)))).filter((r) => r !== null && r.status !== 'superseded');
|
|
139
|
+
if (liveFaces.length > 1) {
|
|
140
|
+
return {
|
|
141
|
+
conflict: {
|
|
142
|
+
kind: 'multiple-faces',
|
|
143
|
+
error: `owner ${ownerSkill} has ${liveFaces.length} live faces (${liveFaces.map((f) => f.id).join(', ')}) — ambiguous, resolve manually`,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (heads.length > 1) {
|
|
148
|
+
return {
|
|
149
|
+
conflict: {
|
|
150
|
+
kind: 'multiple-legacy-heads',
|
|
151
|
+
error: `owner ${ownerSkill} has ${heads.length} active legacy playbook notes (${heads.map((h) => h.id).join(', ')}) — ambiguous legacy head, resolve manually`,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// дозавершение незавершённой healing-операции (сбой внутри healing)
|
|
156
|
+
const unfinishedHealing = lastUnfinished(true);
|
|
157
|
+
if (unfinishedHealing) {
|
|
158
|
+
const faceId = typeof unfinishedHealing.input['faceId'] === 'string' ? unfinishedHealing.input['faceId'] : null;
|
|
159
|
+
const headId = typeof unfinishedHealing.input['headId'] === 'string' ? unfinishedHealing.input['headId'] : null;
|
|
160
|
+
const face = faceId ? (await deps.store.get(faceId)) : null;
|
|
161
|
+
if (!face || !headId) {
|
|
162
|
+
return {
|
|
163
|
+
conflict: {
|
|
164
|
+
kind: 'broken-healing-op',
|
|
165
|
+
error: `unfinished healing operation ${unfinishedHealing.opId} lacks face/head binding — resolve manually (wolf face recover ${unfinishedHealing.opId})`,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
await healLegacyTransition(deps, ownerSkill, face, headId, unfinishedHealing, actor);
|
|
170
|
+
resumed = true;
|
|
171
|
+
}
|
|
172
|
+
if (liveFaces.length === 1) {
|
|
173
|
+
const face = liveFaces[0];
|
|
174
|
+
if (heads.length === 0) {
|
|
175
|
+
return {
|
|
176
|
+
outcome: {
|
|
177
|
+
ownerSkill,
|
|
178
|
+
action: resumed ? 'resumed' : 'skipped',
|
|
179
|
+
faceId: face.id,
|
|
180
|
+
reason: resumed
|
|
181
|
+
? 'unfinished migration operation completed by re-run (resume)'
|
|
182
|
+
: 'face already exists and no active legacy head — idempotent, nothing to do',
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const head = heads[0];
|
|
187
|
+
if (face.reason === legacyMigrationReason(head.id)) {
|
|
188
|
+
// доказуемая связь → healing; body не пишется (AC-3)
|
|
189
|
+
await healLegacyTransition(deps, ownerSkill, face, head.id, null, actor);
|
|
190
|
+
return {
|
|
191
|
+
outcome: {
|
|
192
|
+
ownerSkill,
|
|
193
|
+
action: resumed ? 'resumed' : 'healed',
|
|
194
|
+
faceId: face.id,
|
|
195
|
+
headId: head.id,
|
|
196
|
+
reason: `provable link by exact reason "${legacyMigrationReason(head.id)}" — legacy head superseded, face body untouched`,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
conflict: {
|
|
202
|
+
kind: 'reason-mismatch',
|
|
203
|
+
error: `face ${face.id} of ${ownerSkill} does not prove the link to active legacy head ${head.id} (expected exact reason "${legacyMigrationReason(head.id)}", got "${face.reason}") — not healing blindly, resolve manually`,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// fresh-миграция: дословный перенос (ADR-4 волны 2.17: FTS-совместимость router)
|
|
208
|
+
if (heads.length === 0) {
|
|
209
|
+
return {
|
|
210
|
+
outcome: {
|
|
211
|
+
ownerSkill,
|
|
212
|
+
action: 'skipped',
|
|
213
|
+
reason: 'no active playbook note — superseded chain stays legacy and reads as before',
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const head = heads[0];
|
|
218
|
+
const reason = legacyMigrationReason(head.id);
|
|
219
|
+
const { face } = await createFaceVersion(deps, {
|
|
220
|
+
command: 'migrate',
|
|
221
|
+
ownerSkill,
|
|
222
|
+
reason,
|
|
223
|
+
title: head.title,
|
|
224
|
+
body: head.body,
|
|
225
|
+
tags: head.tags,
|
|
226
|
+
legacyHeadId: head.id,
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
outcome: { ownerSkill, action: resumed ? 'resumed' : 'migrated', faceId: face.id, headId: head.id, reason },
|
|
230
|
+
};
|
|
231
|
+
}
|
|
8
232
|
export async function migrateFaces(deps) {
|
|
9
233
|
const skippedHowtoIds = [];
|
|
10
234
|
const byOwner = new Map();
|
|
@@ -20,46 +244,24 @@ export async function migrateFaces(deps) {
|
|
|
20
244
|
}
|
|
21
245
|
const outcomes = [];
|
|
22
246
|
const failed = [];
|
|
247
|
+
const conflicts = [];
|
|
248
|
+
const actor = resolveCreatedBy(undefined, deps.env ?? process.env);
|
|
23
249
|
for (const [ownerSkill, records] of [...byOwner.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
24
250
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
31
|
-
continue;
|
|
251
|
+
const result = await migrateOwner(deps, ownerSkill, records, actor);
|
|
252
|
+
if (result.conflict) {
|
|
253
|
+
conflicts.push({ ownerSkill, ...result.conflict });
|
|
254
|
+
// параллельная запись в failed: существующий CLI-маппинг даёт exit ≠ 0
|
|
255
|
+
failed.push({ ownerSkill, error: result.conflict.error });
|
|
32
256
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
.filter((r) => r.status !== 'superseded')
|
|
36
|
-
.sort((a, b) => b.updated_at.localeCompare(a.updated_at))[0];
|
|
37
|
-
if (!head) {
|
|
38
|
-
outcomes.push({
|
|
39
|
-
ownerSkill,
|
|
40
|
-
action: 'skipped',
|
|
41
|
-
reason: 'no active playbook note — superseded chain stays legacy and reads as before',
|
|
42
|
-
});
|
|
43
|
-
continue;
|
|
257
|
+
else if (result.outcome) {
|
|
258
|
+
outcomes.push(result.outcome);
|
|
44
259
|
}
|
|
45
|
-
const reason = `migrated from playbook note ${head.id} (2.17)`;
|
|
46
|
-
const { face } = await createFaceVersion(deps, {
|
|
47
|
-
command: 'migrate',
|
|
48
|
-
ownerSkill,
|
|
49
|
-
reason,
|
|
50
|
-
// дословный перенос (ADR-4: совместимость FTS-поиска router, NFR-01)
|
|
51
|
-
title: head.title,
|
|
52
|
-
body: head.body,
|
|
53
|
-
tags: head.tags,
|
|
54
|
-
});
|
|
55
|
-
// head скрыт (hide-superseded); superseded-цепочка предков не трогается
|
|
56
|
-
await supersedeMemoryObject(deps, head.id, face.id);
|
|
57
|
-
outcomes.push({ ownerSkill, action: 'migrated', faceId: face.id, headId: head.id, reason });
|
|
58
260
|
}
|
|
59
261
|
catch (err) {
|
|
60
262
|
failed.push({ ownerSkill, error: err instanceof Error ? err.message : String(err) });
|
|
61
263
|
}
|
|
62
264
|
}
|
|
63
|
-
return { outcomes, skippedHowtoIds, failed };
|
|
265
|
+
return { outcomes, skippedHowtoIds, failed, conflicts };
|
|
64
266
|
}
|
|
65
267
|
//# sourceMappingURL=migrate-faces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-faces.js","sourceRoot":"","sources":["../../../src/app/use-cases/migrate-faces.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrate-faces.js","sourceRoot":"","sources":["../../../src/app/use-cases/migrate-faces.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAgD,MAAM,0BAA0B,CAAC;AAC3G,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AA0E3E;;kFAEkF;AAClF,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,+BAA+B,MAAM,SAAS,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAkB,EAAE,UAAkB;IAChE,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAgB,CAAC,WAAW,KAAK,UAAU,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAe,CAAC,CAAC;AACjC,CAAC;AAaD,SAAS,eAAe,CAAC,MAA8B;IACrD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS;gBAAE,SAAS;YACjD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;gBACZ,IAAI;gBACJ,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBAClD,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU;gBAC/B,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAA4B;gBAC5D,KAAK,EAAE,IAAI,GAAG,EAAE;gBAChB,GAAG,EAAE,GAAG,EAAE;aACX,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,EAAE;gBAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,0BAA0B,IAAI,CAAC,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YACxF,kFAAkF;YAClF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,IAAsB,EACtB,IAAyB,EACzB,OAAgC,EAChC,KAAa;IAEb,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACrH,CAAC;AAED;gFACgF;AAChF,SAAS,gBAAgB,CAAC,IAAsB,EAAE,IAAY;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;IACvB,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO;QACL,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,OAAO,CAAC,KAAK,CACX,gBAAgB,IAAI,iEAAiE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxI,CAAC;QACJ,CAAC,CAAC;QACJ,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;uDAMuD;AACvD,KAAK,UAAU,oBAAoB,CACjC,IAAsB,EACtB,UAAkB,EAClB,IAAgB,EAChB,MAAc,EACd,QAAiC,EACjC,KAAa;IAEb,MAAM,GAAG,GAAG,KAAK,IAAmB,EAAE;QACpC,IAAI,IAAY,CAAC;QACjB,IAAI,IAAiB,CAAC;QACtB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACrB,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,eAAe,CACnB,IAAI,EACJ,wBAAwB,EACxB;gBACE,IAAI;gBACJ,OAAO,EAAE,SAAS;gBAClB,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC;gBACtC,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE;aACxF,EACD,KAAK,CACN,CAAC;YACF,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,+EAA+E;QAC/E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACzC,MAAM,qBAAqB,CACzB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAC/G,MAAM,EACN,IAAI,CAAC,EAAE,CACR,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClC,MAAM,eAAe,CACnB,IAAI,EACJ,qBAAqB,EACrB,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EACjF,KAAK,CACN,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAEjC,uEAAuE;QACvE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAC1E,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,eAAe,CACnB,IAAI,EACJ,uBAAuB,EACvB,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAClG,KAAK,CACN,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1B,MAAM,eAAe,CAAC,IAAI,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;YACtF,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC;QAED,sEAAsE;QACtE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,0BAA0B,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAC3E,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,CAAC;YAC7B,MAAM,eAAe,CAAC,IAAI,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACrD,CAAC;AAOD,KAAK,UAAU,YAAY,CACzB,IAAsB,EACtB,UAAkB,EAClB,OAAuB,EACvB,KAAa;IAEb,mEAAmE;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,CAAC,OAAgB,EAA2B,EAAE,CACnE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;SACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;SAC7B,GAAG,EAAE,IAAI,IAAI,CAAC;IACnB,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,mBAAmB,EAAE,CAAC;QACxB,uFAAuF;QACvF,kEAAkE;QAClE,MAAM,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAA0C,CAAC,CAAC;QAC9F,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,iFAAiF;IACjF,MAAM,SAAS,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CACzD,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAChF,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,CAClE,CAAC;IAEF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ,EAAE;gBACR,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,SAAS,UAAU,QAAQ,SAAS,CAAC,MAAM,gBAAgB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC;aACzI;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,QAAQ,EAAE;gBACR,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,SAAS,UAAU,QAAQ,KAAK,CAAC,MAAM,kCAAkC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C;aAC/J;SACF,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,OAAO,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChH,MAAM,MAAM,GAAG,OAAO,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO;gBACL,QAAQ,EAAE;oBACR,IAAI,EAAE,mBAAmB;oBACzB,KAAK,EAAE,gCAAgC,iBAAiB,CAAC,IAAI,kEAAkE,iBAAiB,CAAC,IAAI,GAAG;iBACzJ;aACF,CAAC;QACJ,CAAC;QACD,MAAM,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACrF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE;oBACP,UAAU;oBACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACvC,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,MAAM,EAAE,OAAO;wBACb,CAAC,CAAC,6DAA6D;wBAC/D,CAAC,CAAC,2EAA2E;iBAChF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACnD,qDAAqD;YACrD,MAAM,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO;gBACL,OAAO,EAAE;oBACP,UAAU;oBACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;oBACtC,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,MAAM,EAAE,kCAAkC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,iDAAiD;iBAC1H;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,QAAQ,IAAI,CAAC,EAAE,OAAO,UAAU,kDAAkD,IAAI,CAAC,EAAE,4BAA4B,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,MAAM,4CAA4C;aAC7N;SACF,CAAC;IACJ,CAAC;IAED,iFAAiF;IACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE;gBACP,UAAU;gBACV,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,6EAA6E;aACtF;SACF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE;QAC7C,OAAO,EAAE,SAAS;QAClB,UAAU;QACV,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE;KAC5G,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB;IACvD,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAI,GAAiC,CAAC,WAAW,CAAC;QAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnD,uEAAuE;gBACvE,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -4,13 +4,24 @@ import { Clock } from '../../ports/clock.port.js';
|
|
|
4
4
|
import { IdGenerator } from '../../ports/id-generator.port.js';
|
|
5
5
|
import { SearchIndex } from '../../ports/search-index.port.js';
|
|
6
6
|
import { MemoryLock } from '../../ports/memory-lock.port.js';
|
|
7
|
+
import { type WorktreeIdentity } from '../../adapters/fs/memory-root.js';
|
|
7
8
|
export declare const MAIN_SCOPE = "main";
|
|
8
9
|
export interface PromoteResult {
|
|
9
10
|
promoted: number;
|
|
11
|
+
/** Source-токены владельца (через запятую) — печать CLI. */
|
|
10
12
|
scopeFrom: string;
|
|
13
|
+
/** 2.17.1 REQ-02 (R02), design §3.2: неоднозначные legacy-токены — честный
|
|
14
|
+
* конфликт; объекты этих токенов НЕ переписываются. */
|
|
15
|
+
conflicts: string[];
|
|
11
16
|
}
|
|
12
17
|
/** WP3 §6.2 (спека 2.16): шаг finishing-a-development-branch — scoped-объекты
|
|
13
|
-
* ворктрии становятся main. Автоудаления нет (P3): только перевод scope.
|
|
18
|
+
* ворктрии становятся main. Автоудаления нет (P3): только перевод scope.
|
|
19
|
+
* 2.17.1 REQ-02 (R02), design §3.2: резолвит WorktreeIdentity ТЕКУЩЕЙ копии и
|
|
20
|
+
* переводит в main объекты ОБОИХ токенов владельца — WT-ID и однозначное
|
|
21
|
+
* legacy-имя (два семейства scope сосуществуют после обновления, NFR-01);
|
|
22
|
+
* неоднозначное legacy-имя — честный конфликт, объекты не переписываются.
|
|
23
|
+
* Идентичность null (main-чекоут / битые метаданные) — пустое множество токенов
|
|
24
|
+
* владельца: честный отчёт 0 promoted, не ошибка (S-17, решение L0 2026-10-13). */
|
|
14
25
|
export declare function promoteWorktreeMemory(deps: {
|
|
15
26
|
store: MemoryStore;
|
|
16
27
|
log: EventLog;
|
|
@@ -18,5 +29,7 @@ export declare function promoteWorktreeMemory(deps: {
|
|
|
18
29
|
idGen: IdGenerator;
|
|
19
30
|
index?: SearchIndex;
|
|
20
31
|
lock?: MemoryLock;
|
|
32
|
+
/** Тестовый seam: идентичность копии; прод-дефолт — resolveWorktreeIdentity(process.cwd()). */
|
|
33
|
+
resolveIdentity?: () => WorktreeIdentity | null;
|
|
21
34
|
}, worktree: string): Promise<PromoteResult>;
|
|
22
35
|
//# sourceMappingURL=promote-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote-memory.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/promote-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"promote-memory.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/promote-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAG7D,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAElG,eAAO,MAAM,UAAU,SAAS,CAAC;AAIjC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB;2DACuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;mFAOmF;AACnF,wBAAsB,qBAAqB,CACzC,IAAI,EAAE;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAAC;CACjD,EACD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CA+CxB"}
|
|
@@ -1,30 +1,61 @@
|
|
|
1
1
|
import { UserFacingError } from '../../domain/errors.js';
|
|
2
|
+
import { resolveWorktreeIdentity } from '../../adapters/fs/memory-root.js';
|
|
2
3
|
export const MAIN_SCOPE = 'main';
|
|
4
|
+
const WT_PREFIX = 'worktree:';
|
|
3
5
|
/** WP3 §6.2 (спека 2.16): шаг finishing-a-development-branch — scoped-объекты
|
|
4
|
-
* ворктрии становятся main. Автоудаления нет (P3): только перевод scope.
|
|
6
|
+
* ворктрии становятся main. Автоудаления нет (P3): только перевод scope.
|
|
7
|
+
* 2.17.1 REQ-02 (R02), design §3.2: резолвит WorktreeIdentity ТЕКУЩЕЙ копии и
|
|
8
|
+
* переводит в main объекты ОБОИХ токенов владельца — WT-ID и однозначное
|
|
9
|
+
* legacy-имя (два семейства scope сосуществуют после обновления, NFR-01);
|
|
10
|
+
* неоднозначное legacy-имя — честный конфликт, объекты не переписываются.
|
|
11
|
+
* Идентичность null (main-чекоут / битые метаданные) — пустое множество токенов
|
|
12
|
+
* владельца: честный отчёт 0 promoted, не ошибка (S-17, решение L0 2026-10-13). */
|
|
5
13
|
export async function promoteWorktreeMemory(deps, worktree) {
|
|
6
14
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(worktree)) {
|
|
7
15
|
throw new UserFacingError(`Invalid worktree name: "${worktree}" (see: git worktree list)`);
|
|
8
16
|
}
|
|
9
|
-
|
|
17
|
+
// Аргумент CLI — имя для валидации/отчёта; владелец определяется текущей копией.
|
|
18
|
+
const identity = (deps.resolveIdentity ?? (() => resolveWorktreeIdentity(process.cwd())))();
|
|
19
|
+
const conflicts = [];
|
|
20
|
+
const tokens = [];
|
|
21
|
+
if (identity !== null) {
|
|
22
|
+
tokens.push(identity.id);
|
|
23
|
+
const legacyScope = `${WT_PREFIX}${identity.legacyName}`;
|
|
24
|
+
if (identity.legacyUnique) {
|
|
25
|
+
if (!tokens.includes(legacyScope))
|
|
26
|
+
tokens.push(legacyScope);
|
|
27
|
+
}
|
|
28
|
+
else if (legacyScope !== identity.id) {
|
|
29
|
+
conflicts.push(legacyScope); // неоднозначное имя — никому не присваивается молча
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (conflicts.length > 0) {
|
|
33
|
+
// stderr-подсказка: CLI-слой печатает только сводку promote (не меняется в T1)
|
|
34
|
+
console.error(`[wolf] worktree scope conflict: ${conflicts.join(', ')} — ` +
|
|
35
|
+
'ambiguous legacy worktree name (two live checkouts share the basename); objects left as-is');
|
|
36
|
+
}
|
|
10
37
|
const run = async () => {
|
|
11
|
-
const objects = (await deps.store.list()).filter((o) =>
|
|
38
|
+
const objects = (await deps.store.list()).filter((o) => {
|
|
39
|
+
const s = o.scope;
|
|
40
|
+
return typeof s === 'string' && tokens.includes(s);
|
|
41
|
+
});
|
|
12
42
|
const now = deps.clock.now();
|
|
13
43
|
let promoted = 0;
|
|
14
44
|
for (const o of objects) {
|
|
45
|
+
const from = o.scope;
|
|
15
46
|
await deps.store.update(o.id, { scope: MAIN_SCOPE });
|
|
16
47
|
await deps.log.append({
|
|
17
48
|
id: deps.idGen.generateEventId(now),
|
|
18
49
|
type: 'memory.scope_promoted',
|
|
19
50
|
timestamp: now.toISOString(),
|
|
20
51
|
actor: 'system:wolf',
|
|
21
|
-
payload: { memory_id: o.id, from
|
|
52
|
+
payload: { memory_id: o.id, from, to: MAIN_SCOPE },
|
|
22
53
|
});
|
|
23
54
|
if (deps.index)
|
|
24
55
|
await deps.index.indexObject({ ...o, scope: MAIN_SCOPE });
|
|
25
56
|
promoted += 1;
|
|
26
57
|
}
|
|
27
|
-
return { promoted, scopeFrom };
|
|
58
|
+
return { promoted, scopeFrom: tokens.length > 0 ? tokens.join(', ') : `${WT_PREFIX}${worktree}`, conflicts };
|
|
28
59
|
};
|
|
29
60
|
return deps.lock ? deps.lock.withLock(run) : run();
|
|
30
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote-memory.js","sourceRoot":"","sources":["../../../src/app/use-cases/promote-memory.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"promote-memory.js","sourceRoot":"","sources":["../../../src/app/use-cases/promote-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { Clock } from '../../ports/clock.port.js';
|
|
2
2
|
import { FileSystem } from '../../ports/file-system.port.js';
|
|
3
|
+
import type { ClaimGuard } from './claim-artifact.js';
|
|
3
4
|
export interface ScaffoldArtifactDeps {
|
|
4
5
|
clock: Clock;
|
|
5
6
|
fs: Pick<FileSystem, 'exists' | 'writeFile'>;
|
|
6
7
|
baseDir: string;
|
|
8
|
+
/** 2.17.1 REQ-05 (R06): запись TASK-бриф сета требует активный claim
|
|
9
|
+
* (артефакт `dev:<created>-<slug>`); CLI передаёт реальный guard из
|
|
10
|
+
* makeClaimGuard, юнит-тесты шаблонов — заглушку. */
|
|
11
|
+
claims: ClaimGuard;
|
|
7
12
|
}
|
|
8
13
|
export interface ScaffoldArtifactInput {
|
|
9
14
|
slug: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-artifact.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold-artifact.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB;;yDAEqD;IACrD,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CA2DvG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBnF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAcjF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBrF;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA6BjC"}
|
|
@@ -128,6 +128,8 @@ export async function scaffoldArtifact(deps, input) {
|
|
|
128
128
|
}
|
|
129
129
|
const now = deps.clock.now();
|
|
130
130
|
const created = now.toISOString().slice(0, 10);
|
|
131
|
+
// REQ-05 AC-3: guard до любой записи — без claim запись отклоняется в use-case
|
|
132
|
+
deps.claims.requireClaim(`dev:${created}-${input.slug}`);
|
|
131
133
|
const dir = join(deps.baseDir, 'docs', 'dev', `${created}-${input.slug}`);
|
|
132
134
|
// Уникальность имён — машина, не дисциплина: отказ ДО любых записей (спека §4-A1).
|
|
133
135
|
if (await deps.fs.exists(dir)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { MemoryLock } from '../../ports/memory-lock.port.js';
|
|
|
7
7
|
import { MemoryTypeDeclaration } from '../../domain/memory-types.js';
|
|
8
8
|
export interface SeedOutcome {
|
|
9
9
|
file: string;
|
|
10
|
-
action: 'created' | 'skipped';
|
|
10
|
+
action: 'created' | 'updated' | 'skipped' | 'diverged';
|
|
11
11
|
reason?: string;
|
|
12
12
|
}
|
|
13
13
|
export interface SeedDeps {
|
|
@@ -20,7 +20,7 @@ export interface SeedDeps {
|
|
|
20
20
|
lock?: MemoryLock;
|
|
21
21
|
declarations?: readonly MemoryTypeDeclaration[];
|
|
22
22
|
}
|
|
23
|
-
/** Посев
|
|
24
|
-
*
|
|
23
|
+
/** Посев + шаблонное обновление live-лиц (§3.6): одна точка решения о записи
|
|
24
|
+
* для каждого шаблона base-set с owner_skill. */
|
|
25
25
|
export declare function seedBasePlaybooks(deps: SeedDeps): Promise<SeedOutcome[]>;
|
|
26
26
|
//# sourceMappingURL=seed-base-playbooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-base-playbooks.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/seed-base-playbooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"seed-base-playbooks.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/seed-base-playbooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAIrE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACjD;AAyBD;iDACiD;AACjD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA4E9E"}
|