mister-wolf 2.0.0 → 2.1.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/dist/adapters/cli/cli-entry.d.ts +6 -0
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +14 -1
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/memory-complain.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-complain.js +3 -2
- package/dist/adapters/cli/commands/memory-complain.js.map +1 -1
- package/dist/adapters/cli/commands/memory-effectiveness.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-effectiveness.js +2 -1
- package/dist/adapters/cli/commands/memory-effectiveness.js.map +1 -1
- package/dist/adapters/cli/commands/memory-init.d.ts +14 -0
- package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-init.js +27 -8
- package/dist/adapters/cli/commands/memory-init.js.map +1 -1
- package/dist/adapters/cli/commands/memory-learn.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-learn.js +2 -1
- package/dist/adapters/cli/commands/memory-learn.js.map +1 -1
- package/dist/adapters/cli/commands/memory-list.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-list.js +15 -3
- package/dist/adapters/cli/commands/memory-list.js.map +1 -1
- package/dist/adapters/cli/commands/memory-migrate.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-migrate.js +45 -2
- package/dist/adapters/cli/commands/memory-migrate.js.map +1 -1
- package/dist/adapters/cli/commands/memory-scan.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-scan.js +5 -0
- package/dist/adapters/cli/commands/memory-scan.js.map +1 -1
- package/dist/adapters/cli/commands/memory-update.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-update.js +2 -1
- package/dist/adapters/cli/commands/memory-update.js.map +1 -1
- package/dist/adapters/fs/doc-id-migration.d.ts +33 -0
- package/dist/adapters/fs/doc-id-migration.d.ts.map +1 -0
- package/dist/adapters/fs/doc-id-migration.js +158 -0
- package/dist/adapters/fs/doc-id-migration.js.map +1 -0
- package/dist/adapters/fs/document-id.d.ts +23 -0
- package/dist/adapters/fs/document-id.d.ts.map +1 -0
- package/dist/adapters/fs/document-id.js +52 -0
- package/dist/adapters/fs/document-id.js.map +1 -0
- package/dist/adapters/fs/hash-id-generator.d.ts +1 -1
- package/dist/adapters/fs/hash-id-generator.d.ts.map +1 -1
- package/dist/adapters/fs/hash-id-generator.js +1 -1
- package/dist/adapters/fs/hash-id-generator.js.map +1 -1
- package/dist/adapters/fs/layout-migration.d.ts +7 -0
- package/dist/adapters/fs/layout-migration.d.ts.map +1 -1
- package/dist/adapters/fs/layout-migration.js +4 -2
- package/dist/adapters/fs/layout-migration.js.map +1 -1
- package/dist/adapters/platforms/claude-adapter.d.ts.map +1 -1
- package/dist/adapters/platforms/claude-adapter.js +4 -2
- package/dist/adapters/platforms/claude-adapter.js.map +1 -1
- package/dist/adapters/platforms/opencode-adapter.d.ts +2 -0
- package/dist/adapters/platforms/opencode-adapter.d.ts.map +1 -1
- package/dist/adapters/platforms/opencode-adapter.js +27 -8
- package/dist/adapters/platforms/opencode-adapter.js.map +1 -1
- package/dist/app/use-cases/init-project.d.ts +3 -0
- package/dist/app/use-cases/init-project.d.ts.map +1 -1
- package/dist/app/use-cases/init-project.js +16 -4
- package/dist/app/use-cases/init-project.js.map +1 -1
- package/dist/app/use-cases/list-memory-objects.d.ts +13 -0
- package/dist/app/use-cases/list-memory-objects.d.ts.map +1 -1
- package/dist/app/use-cases/list-memory-objects.js +37 -0
- package/dist/app/use-cases/list-memory-objects.js.map +1 -1
- package/dist/app/use-cases/scan-project.d.ts.map +1 -1
- package/dist/app/use-cases/scan-project.js +14 -2
- package/dist/app/use-cases/scan-project.js.map +1 -1
- package/dist/domain/memory-types.d.ts +2 -0
- package/dist/domain/memory-types.d.ts.map +1 -1
- package/dist/domain/memory-types.js +2 -0
- package/dist/domain/memory-types.js.map +1 -1
- package/dist/ports/platform-adapter.port.d.ts +5 -1
- package/dist/ports/platform-adapter.port.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-update.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,gFAAgF;AAChF,gEAAgE;AAChE,2EAA2E;AAC3E,gEAAgE;AAChE,sEAAsE;AACtE,sDAAsD;AACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AACnD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEnE,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,UAAkB,OAAO,
|
|
1
|
+
{"version":3,"file":"memory-update.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface DocIdMigrationEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
newId: string;
|
|
4
|
+
from: string;
|
|
5
|
+
to: string;
|
|
6
|
+
action: 'rename' | 'conflict';
|
|
7
|
+
}
|
|
8
|
+
export interface DocIdMigrationReport {
|
|
9
|
+
entries: DocIdMigrationEntry[];
|
|
10
|
+
conflicts: DocIdMigrationEntry[];
|
|
11
|
+
problems: {
|
|
12
|
+
path: string;
|
|
13
|
+
error: string;
|
|
14
|
+
}[];
|
|
15
|
+
renamed: number;
|
|
16
|
+
refsRewritten: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Однократная миграция id document-ref на канон §2.1 (спека 2.1.0 §2.6):
|
|
20
|
+
* 1. найти объекты с id вне канона (frontmatter.type === 'document-ref');
|
|
21
|
+
* 2. вычислить новый id = withTieBreak(documentRefId(source.path, created_at), takenIds),
|
|
22
|
+
* где takenIds — id ВСЕХ объектов памяти (коллизии → суффикс -2, -3, …);
|
|
23
|
+
* 3. переименовать файл (targetPathFor) и заменить id в frontmatter;
|
|
24
|
+
* 4. переписать все ссылки на старый id во всех .md памяти (кроме briefs/quarantine)
|
|
25
|
+
* и в relations.jsonl — по границе id (lookahead `(?![A-Za-z0-9_-])`),
|
|
26
|
+
* иначе doc_X порвётся при существующем doc_X2;
|
|
27
|
+
* 5. rebuild-index;
|
|
28
|
+
* 6. отчёт: переименовано / ссылок переписано / коллизии.
|
|
29
|
+
* НЕ трогает: events.jsonl (исторический лог), .wolf/memory/briefs, quarantine.
|
|
30
|
+
*/
|
|
31
|
+
export declare function planDocIdMigration(baseDir: string): Promise<DocIdMigrationReport>;
|
|
32
|
+
export declare function applyDocIdMigration(baseDir: string): Promise<DocIdMigrationReport>;
|
|
33
|
+
//# sourceMappingURL=doc-id-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-id-migration.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/doc-id-migration.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgDvF;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwDxF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import { existsSync, readFileSync } from 'fs';
|
|
3
|
+
import { join, relative, dirname } from 'path';
|
|
4
|
+
import yaml from 'js-yaml';
|
|
5
|
+
import { memoryDir, relationsPath, targetPathFor } from './project-paths.js';
|
|
6
|
+
import { writeFileAtomic } from './markdown-memory-store.js';
|
|
7
|
+
import { parseFrontmatter, walkMd } from './layout-migration.js';
|
|
8
|
+
import { documentRefId, isCanonicalDocumentId, withTieBreak } from './document-id.js';
|
|
9
|
+
import { rebuildMemoryIndex } from '../../app/use-cases/rebuild-memory-index.js';
|
|
10
|
+
import { createCliContainer } from '../../bootstrap/container.js';
|
|
11
|
+
/**
|
|
12
|
+
* Однократная миграция id document-ref на канон §2.1 (спека 2.1.0 §2.6):
|
|
13
|
+
* 1. найти объекты с id вне канона (frontmatter.type === 'document-ref');
|
|
14
|
+
* 2. вычислить новый id = withTieBreak(documentRefId(source.path, created_at), takenIds),
|
|
15
|
+
* где takenIds — id ВСЕХ объектов памяти (коллизии → суффикс -2, -3, …);
|
|
16
|
+
* 3. переименовать файл (targetPathFor) и заменить id в frontmatter;
|
|
17
|
+
* 4. переписать все ссылки на старый id во всех .md памяти (кроме briefs/quarantine)
|
|
18
|
+
* и в relations.jsonl — по границе id (lookahead `(?![A-Za-z0-9_-])`),
|
|
19
|
+
* иначе doc_X порвётся при существующем doc_X2;
|
|
20
|
+
* 5. rebuild-index;
|
|
21
|
+
* 6. отчёт: переименовано / ссылок переписано / коллизии.
|
|
22
|
+
* НЕ трогает: events.jsonl (исторический лог), .wolf/memory/briefs, quarantine.
|
|
23
|
+
*/
|
|
24
|
+
export async function planDocIdMigration(baseDir) {
|
|
25
|
+
const memDir = memoryDir(baseDir);
|
|
26
|
+
const files = existsSync(memDir) ? await walkMd(memDir) : [];
|
|
27
|
+
const problems = [];
|
|
28
|
+
// проход 1: собрать id ВСЕХ объектов (занятые для tie-break) + распарсить кандидатов
|
|
29
|
+
const takenIds = new Set();
|
|
30
|
+
const parsed = [];
|
|
31
|
+
for (const f of files) {
|
|
32
|
+
const rel = relative(baseDir, f);
|
|
33
|
+
if (isExcluded(rel))
|
|
34
|
+
continue; // briefs/quarantine не трогаем
|
|
35
|
+
let content;
|
|
36
|
+
try {
|
|
37
|
+
content = await fs.readFile(f, 'utf-8');
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
problems.push({ path: rel, error: String(err) });
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const p = parseFrontmatter(content);
|
|
44
|
+
if (!p)
|
|
45
|
+
continue; // не объект памяти (нет frontmatter) — не субъект миграции
|
|
46
|
+
if (typeof p.fm.id === 'string')
|
|
47
|
+
takenIds.add(p.fm.id);
|
|
48
|
+
parsed.push({ rel, fm: p.fm });
|
|
49
|
+
}
|
|
50
|
+
// проход 2: вычислить newId для кандидатов вне канона
|
|
51
|
+
const entries = [];
|
|
52
|
+
const conflicts = [];
|
|
53
|
+
for (const { rel, fm } of parsed) {
|
|
54
|
+
if (fm.type !== 'document-ref' || isCanonicalDocumentId(fm.id))
|
|
55
|
+
continue;
|
|
56
|
+
const sourcePath = fm.source?.path;
|
|
57
|
+
if (!sourcePath) {
|
|
58
|
+
problems.push({ path: rel, error: `document-ref ${fm.id} без source.path — миграция невозможна` });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const newId = withTieBreak(documentRefId(sourcePath, fm.created_at), takenIds);
|
|
62
|
+
takenIds.add(newId); // накапливаем новые id — защита от коллизий внутри одного прогона
|
|
63
|
+
const to = relative(baseDir, targetPathFor(baseDir, { type: 'document-ref', id: newId, thread: fm.thread }));
|
|
64
|
+
// конфликт: файл по пути to уже существует на диске и его id != newId
|
|
65
|
+
let action = 'rename';
|
|
66
|
+
if (existsSync(join(baseDir, to)) && readIdFromDisk(join(baseDir, to)) !== newId) {
|
|
67
|
+
action = 'conflict';
|
|
68
|
+
}
|
|
69
|
+
const entry = { id: fm.id, newId, from: rel, to, action };
|
|
70
|
+
entries.push(entry);
|
|
71
|
+
if (action === 'conflict')
|
|
72
|
+
conflicts.push(entry);
|
|
73
|
+
}
|
|
74
|
+
return { entries, conflicts, problems, renamed: 0, refsRewritten: 0 };
|
|
75
|
+
}
|
|
76
|
+
export async function applyDocIdMigration(baseDir) {
|
|
77
|
+
const report = await planDocIdMigration(baseDir);
|
|
78
|
+
const renames = report.entries.filter((e) => e.action === 'rename');
|
|
79
|
+
const memDir = memoryDir(baseDir);
|
|
80
|
+
// 3. переименовать файлы + заменить id в frontmatter
|
|
81
|
+
for (const e of renames) {
|
|
82
|
+
const absFrom = join(baseDir, e.from);
|
|
83
|
+
const absTo = join(baseDir, e.to);
|
|
84
|
+
const parsed = parseFrontmatter(await fs.readFile(absFrom, 'utf-8'));
|
|
85
|
+
if (!parsed)
|
|
86
|
+
continue;
|
|
87
|
+
parsed.fm.id = e.newId;
|
|
88
|
+
const newContent = `---\n${yaml.dump(parsed.fm).trimEnd()}\n---\n\n${parsed.body}`;
|
|
89
|
+
await fs.mkdir(dirname(absTo), { recursive: true });
|
|
90
|
+
await writeFileAtomic(absTo, newContent);
|
|
91
|
+
if (absFrom !== absTo)
|
|
92
|
+
await fs.unlink(absFrom);
|
|
93
|
+
}
|
|
94
|
+
report.renamed = renames.length;
|
|
95
|
+
// 4. переписать ссылки oldId → newId по всем .md памяти и relations.jsonl.
|
|
96
|
+
// Замена идемпотентна: уже переименованные файлы содержат newId, oldId там не матчится.
|
|
97
|
+
// Длинные id заменяем первыми — защита от вложенных вхождений.
|
|
98
|
+
const pairs = renames.map((e) => ({ oldId: e.id, newId: e.newId })).sort((a, b) => b.oldId.length - a.oldId.length);
|
|
99
|
+
const rewrite = (text) => {
|
|
100
|
+
let count = 0;
|
|
101
|
+
for (const { oldId, newId } of pairs) {
|
|
102
|
+
text = text.replace(idBoundaryRe(oldId), () => {
|
|
103
|
+
count++;
|
|
104
|
+
return newId;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return { text, count };
|
|
108
|
+
};
|
|
109
|
+
let refs = 0;
|
|
110
|
+
for (const f of await walkMd(memDir)) {
|
|
111
|
+
if (isExcluded(relative(baseDir, f)))
|
|
112
|
+
continue;
|
|
113
|
+
const content = await fs.readFile(f, 'utf-8');
|
|
114
|
+
const { text, count } = rewrite(content);
|
|
115
|
+
if (count > 0)
|
|
116
|
+
await writeFileAtomic(f, text);
|
|
117
|
+
refs += count;
|
|
118
|
+
}
|
|
119
|
+
const rel = relationsPath(baseDir); // отсутствует — пропустить
|
|
120
|
+
if (existsSync(rel)) {
|
|
121
|
+
const content = await fs.readFile(rel, 'utf-8');
|
|
122
|
+
const { text, count } = rewrite(content);
|
|
123
|
+
if (count > 0)
|
|
124
|
+
await writeFileAtomic(rel, text);
|
|
125
|
+
refs += count;
|
|
126
|
+
}
|
|
127
|
+
report.refsRewritten = refs;
|
|
128
|
+
// 5. перестроить поисковый индекс (как memory-rebuild-index.ts, но напрямую)
|
|
129
|
+
const { store, index } = createCliContainer(baseDir);
|
|
130
|
+
await rebuildMemoryIndex({ store, index });
|
|
131
|
+
return report;
|
|
132
|
+
}
|
|
133
|
+
/** briefs/ и quarantine/ — служебные/битые зоны, миграция их не трогает (§2.6). */
|
|
134
|
+
function isExcluded(relToBase) {
|
|
135
|
+
const relToMemory = relToBase.replace(/^\.wolf[/\\]memory[/\\]/, '');
|
|
136
|
+
return (relToMemory.startsWith('briefs/') ||
|
|
137
|
+
relToMemory.startsWith('briefs\\') ||
|
|
138
|
+
relToMemory.startsWith('quarantine/') ||
|
|
139
|
+
relToMemory.startsWith('quarantine\\'));
|
|
140
|
+
}
|
|
141
|
+
/** Граница id: заменяем oldId, только если дальше НЕ идёт [A-Za-z0-9_-] (не порвёт doc_X2). */
|
|
142
|
+
function idBoundaryRe(id) {
|
|
143
|
+
return new RegExp(escapeRegExp(id) + '(?![A-Za-z0-9_-])', 'g');
|
|
144
|
+
}
|
|
145
|
+
function escapeRegExp(s) {
|
|
146
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
147
|
+
}
|
|
148
|
+
/** Быстрое чтение id из frontmatter без полного парса — для детекции конфликтов. */
|
|
149
|
+
function readIdFromDisk(absPath) {
|
|
150
|
+
try {
|
|
151
|
+
const m = readFileSync(absPath, 'utf-8').match(/^---[\s\S]*?\nid:\s*(\S+)/);
|
|
152
|
+
return m ? m[1] : null;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=doc-id-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-id-migration.js","sourceRoot":"","sources":["../../../src/adapters/fs/doc-id-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Канон id document-ref (спека 2.1.0 §2.1): `mem_<YYYYMMDD>_doc_<slug>_<hash8>`.
|
|
3
|
+
*
|
|
4
|
+
* - `<YYYYMMDD>` — дата создания объекта (scan: текущий день; миграция: created_at);
|
|
5
|
+
* - `<slug>` — basename документа без расширения, kebab-case (транслит кириллицы);
|
|
6
|
+
* - `<hash8>` — первые 8 hex sha256(canonical path): путь остаётся в id только
|
|
7
|
+
* как хеш — FTS-шум от псевдо-токенов пути исчезает (F9).
|
|
8
|
+
*
|
|
9
|
+
* Tie-break: коллизия `slug+hash8` в пределах памяти → суффикс `-2`, `-3`, …
|
|
10
|
+
* (см. withTieBreak); суффикс допускается канон-регуляркой.
|
|
11
|
+
*/
|
|
12
|
+
export declare const CANONICAL_DOCUMENT_ID_RE: RegExp;
|
|
13
|
+
/** id соответствует канону §2.1 (с учётом tie-break-суффикса). */
|
|
14
|
+
export declare function isCanonicalDocumentId(id: string): boolean;
|
|
15
|
+
/** Канонический путь: posix-разделители, без ведущего `./`. */
|
|
16
|
+
export declare function canonicalPath(path: string): string;
|
|
17
|
+
/** Slug из basename без расширения: kebab-case, транслит кириллицы, cap 40, пусто → `doc`. */
|
|
18
|
+
export declare function documentSlug(path: string): string;
|
|
19
|
+
/** Канонический id document-ref; `dateISO` — ISO-дата создания (берётся день). */
|
|
20
|
+
export declare function documentRefId(path: string, dateISO: string): string;
|
|
21
|
+
/** Tie-break (§2.1): если id занят другим объектом — суффикс `-2`, `-3`, … */
|
|
22
|
+
export declare function withTieBreak(id: string, taken: Iterable<string>): string;
|
|
23
|
+
//# sourceMappingURL=document-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-id.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/document-id.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,QAAkE,CAAC;AAExG,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASjD;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAInE;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAOxE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { basename } from 'path';
|
|
3
|
+
import { HashIdGenerator } from './hash-id-generator.js';
|
|
4
|
+
/**
|
|
5
|
+
* Канон id document-ref (спека 2.1.0 §2.1): `mem_<YYYYMMDD>_doc_<slug>_<hash8>`.
|
|
6
|
+
*
|
|
7
|
+
* - `<YYYYMMDD>` — дата создания объекта (scan: текущий день; миграция: created_at);
|
|
8
|
+
* - `<slug>` — basename документа без расширения, kebab-case (транслит кириллицы);
|
|
9
|
+
* - `<hash8>` — первые 8 hex sha256(canonical path): путь остаётся в id только
|
|
10
|
+
* как хеш — FTS-шум от псевдо-токенов пути исчезает (F9).
|
|
11
|
+
*
|
|
12
|
+
* Tie-break: коллизия `slug+hash8` в пределах памяти → суффикс `-2`, `-3`, …
|
|
13
|
+
* (см. withTieBreak); суффикс допускается канон-регуляркой.
|
|
14
|
+
*/
|
|
15
|
+
export const CANONICAL_DOCUMENT_ID_RE = /^mem_\d{8}_doc_[a-z0-9]+(?:-[a-z0-9]+)*_[0-9a-f]{8}(?:-\d+)?$/;
|
|
16
|
+
/** id соответствует канону §2.1 (с учётом tie-break-суффикса). */
|
|
17
|
+
export function isCanonicalDocumentId(id) {
|
|
18
|
+
return CANONICAL_DOCUMENT_ID_RE.test(id);
|
|
19
|
+
}
|
|
20
|
+
/** Канонический путь: posix-разделители, без ведущего `./`. */
|
|
21
|
+
export function canonicalPath(path) {
|
|
22
|
+
return path.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
23
|
+
}
|
|
24
|
+
/** Slug из basename без расширения: kebab-case, транслит кириллицы, cap 40, пусто → `doc`. */
|
|
25
|
+
export function documentSlug(path) {
|
|
26
|
+
const name = basename(canonicalPath(path)).replace(/\.[^.]+$/, '');
|
|
27
|
+
const translit = name.toLowerCase().replace(/[а-яё]/g, (ch) => HashIdGenerator.CYRILLIC[ch] ?? '');
|
|
28
|
+
const slug = translit
|
|
29
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
30
|
+
.replace(/^-+|-+$/g, '')
|
|
31
|
+
.substring(0, 40)
|
|
32
|
+
.replace(/^-+|-+$/g, '');
|
|
33
|
+
return slug || 'doc';
|
|
34
|
+
}
|
|
35
|
+
/** Канонический id document-ref; `dateISO` — ISO-дата создания (берётся день). */
|
|
36
|
+
export function documentRefId(path, dateISO) {
|
|
37
|
+
const day = dateISO.slice(0, 10).replace(/-/g, '');
|
|
38
|
+
const hash8 = createHash('sha256').update(canonicalPath(path)).digest('hex').slice(0, 8);
|
|
39
|
+
return `mem_${day}_doc_${documentSlug(path)}_${hash8}`;
|
|
40
|
+
}
|
|
41
|
+
/** Tie-break (§2.1): если id занят другим объектом — суффикс `-2`, `-3`, … */
|
|
42
|
+
export function withTieBreak(id, taken) {
|
|
43
|
+
const used = new Set(taken);
|
|
44
|
+
if (!used.has(id))
|
|
45
|
+
return id;
|
|
46
|
+
for (let n = 2;; n++) {
|
|
47
|
+
const candidate = `${id}-${n}`;
|
|
48
|
+
if (!used.has(candidate))
|
|
49
|
+
return candidate;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=document-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-id.js","sourceRoot":"","sources":["../../../src/adapters/fs/document-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,+DAA+D,CAAC;AAExG,kEAAkE;AAClE,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACnG,MAAM,IAAI,GAAG,QAAQ;SAClB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;SAChB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,IAAI,IAAI,KAAK,CAAC;AACvB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,OAAO,GAAG,QAAQ,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,KAAuB;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IdGenerator } from '../../ports/id-generator.port.js';
|
|
2
2
|
export declare class HashIdGenerator implements IdGenerator {
|
|
3
|
-
|
|
3
|
+
static readonly CYRILLIC: Record<string, string>;
|
|
4
4
|
generateMemoryId(date: Date, slug: string): string;
|
|
5
5
|
generateEventId(date: Date): string;
|
|
6
6
|
private datePart;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-id-generator.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/hash-id-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,qBAAa,eAAgB,YAAW,WAAW;IAGjD,
|
|
1
|
+
{"version":3,"file":"hash-id-generator.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/hash-id-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,qBAAa,eAAgB,YAAW,WAAW;IAGjD,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkC9C;IAEF,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAMlD,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAKnC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
2
|
export class HashIdGenerator {
|
|
3
3
|
// ponytail: flat translit map, deterministic; switch to a lib only if other
|
|
4
|
-
// alphabets (CJK etc.) need real slugs
|
|
4
|
+
// alphabets (CJK etc.) need real slugs. Публичная: переиспользуется document-id.ts.
|
|
5
5
|
static CYRILLIC = {
|
|
6
6
|
а: 'a',
|
|
7
7
|
б: 'b',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-id-generator.js","sourceRoot":"","sources":["../../../src/adapters/fs/hash-id-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,OAAO,eAAe;IAC1B,4EAA4E;IAC5E,
|
|
1
|
+
{"version":3,"file":"hash-id-generator.js","sourceRoot":"","sources":["../../../src/adapters/fs/hash-id-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,13 @@ export interface MigrationReport {
|
|
|
15
15
|
}[];
|
|
16
16
|
total: number;
|
|
17
17
|
}
|
|
18
|
+
/** Экспортировано для переиспользования в doc-id-migration.ts (спека 2.1.0 §2.6). */
|
|
19
|
+
export declare function parseFrontmatter(content: string): {
|
|
20
|
+
fm: Record<string, any>;
|
|
21
|
+
body: string;
|
|
22
|
+
} | null;
|
|
23
|
+
/** Экспортировано для переиспользования в doc-id-migration.ts (спека 2.1.0 §2.6). */
|
|
24
|
+
export declare function walkMd(dir: string): Promise<string[]>;
|
|
18
25
|
export declare function planLayoutMigration(baseDir: string): Promise<MigrationReport>;
|
|
19
26
|
export declare function applyLayoutMigration(baseDir: string): Promise<MigrationReport>;
|
|
20
27
|
//# sourceMappingURL=layout-migration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-migration.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/layout-migration.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,UAAU,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"layout-migration.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/layout-migration.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,UAAU,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASlG;AAED,qFAAqF;AACrF,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB3D;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA6DnF;AAaD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2BpF"}
|
|
@@ -4,7 +4,8 @@ import { join, relative, dirname } from 'path';
|
|
|
4
4
|
import yaml from 'js-yaml';
|
|
5
5
|
import { objectsDir, targetPathFor, memoryDir } from './project-paths.js';
|
|
6
6
|
import { writeFileAtomic } from './markdown-memory-store.js';
|
|
7
|
-
|
|
7
|
+
/** Экспортировано для переиспользования в doc-id-migration.ts (спека 2.1.0 §2.6). */
|
|
8
|
+
export function parseFrontmatter(content) {
|
|
8
9
|
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
|
|
9
10
|
if (!match)
|
|
10
11
|
return null;
|
|
@@ -16,7 +17,8 @@ function parseFrontmatter(content) {
|
|
|
16
17
|
return null;
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
/** Экспортировано для переиспользования в doc-id-migration.ts (спека 2.1.0 §2.6). */
|
|
21
|
+
export async function walkMd(dir) {
|
|
20
22
|
const results = [];
|
|
21
23
|
async function recurse(d) {
|
|
22
24
|
let entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-migration.js","sourceRoot":"","sources":["../../../src/adapters/fs/layout-migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAmB7D,
|
|
1
|
+
{"version":3,"file":"layout-migration.js","sourceRoot":"","sources":["../../../src/adapters/fs/layout-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/platforms/claude-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAIxH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,EAAE,YAAY;IAEvB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIpC,OAAO,CAAC,UAAU;IAIZ,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoB/D,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/platforms/claude-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAIxH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,EAAE,YAAY;IAEvB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIpC,OAAO,CAAC,UAAU;IAIZ,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoB/D,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgB/E,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAYxD"}
|
|
@@ -38,13 +38,15 @@ export class ClaudeAdapter {
|
|
|
38
38
|
const mcpServers = asRecord(cfg.mcpServers) ?? {};
|
|
39
39
|
// каноническая проекция McpCommand в формат Claude Code: command + args
|
|
40
40
|
const desired = { command: cmd.command, args: [...cmd.args] };
|
|
41
|
+
// F6 (спека 2.1.0 §2.4): честный лог — имя файла + фактический wolf-ключ
|
|
42
|
+
const reported = { configFile: '.mcp.json', keys: ['mcpServers.wolf'] };
|
|
41
43
|
if (JSON.stringify(mcpServers.wolf) === JSON.stringify(desired))
|
|
42
|
-
return { action: 'unchanged' };
|
|
44
|
+
return { action: 'unchanged', ...reported };
|
|
43
45
|
const replaced = mcpServers.wolf !== undefined;
|
|
44
46
|
mcpServers.wolf = desired;
|
|
45
47
|
cfg.mcpServers = mcpServers;
|
|
46
48
|
await writeFileAtomic(file, JSON.stringify(cfg, null, 2) + '\n');
|
|
47
|
-
return { action: replaced ? 'replaced' : 'written' };
|
|
49
|
+
return { action: replaced ? 'replaced' : 'written', ...reported };
|
|
48
50
|
}
|
|
49
51
|
async removeWolf(projectRoot) {
|
|
50
52
|
const file = this.configFile(projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../../src/adapters/platforms/claude-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,aAAa;IACf,EAAE,GAAG,QAAQ,CAAC;IAEvB,MAAM,CAAC,WAAmB;QACxB,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAChG,CAAC;IAEO,UAAU,CAAC,WAAmB;QACpC,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,GAAG,GAAkB,IAAI,CAAC;QAC9B,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,eAAe,CAAC,GAAG,IAAI,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,eAAe,CAAC,GAAG,IAAI,8CAA8C,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAwB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB,EAAE,GAAe;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClD,wEAAwE;QACxE,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../../src/adapters/platforms/claude-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PlatformAdapter, McpCommand, PlatformConfig, PlatformWriteResult } from '../../ports/platform-adapter.port.js';
|
|
2
2
|
/** Дефолтный агент Wolf в opencode (§6.1). */
|
|
3
3
|
export declare const DEFAULT_AGENT = "mr-wolf";
|
|
4
|
+
/** Глубина субагентов: executor-lead спавнит worker-* (трёхуровневая схема). */
|
|
5
|
+
export declare const SUBAGENT_DEPTH = 2;
|
|
4
6
|
export declare class OpencodeAdapter implements PlatformAdapter {
|
|
5
7
|
readonly id = "opencode";
|
|
6
8
|
detect(projectRoot: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/platforms/opencode-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAKxH,8CAA8C;AAC9C,eAAO,MAAM,aAAa,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/platforms/opencode-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAKxH,8CAA8C;AAC9C,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,gFAAgF;AAChF,eAAO,MAAM,cAAc,IAAI,CAAC;AAIhC,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,EAAE,cAAc;IAEzB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAQpC,+FAA+F;IAC/F,OAAO,CAAC,UAAU;IAOZ,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAkB/D,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2C/E,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAYxD"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
2
|
import { existsSync } from 'fs';
|
|
3
|
-
import { join } from 'path';
|
|
3
|
+
import { basename, join } from 'path';
|
|
4
4
|
import { parseJsonc } from './jsonc.js';
|
|
5
5
|
import { writeFileAtomic } from '../fs/markdown-memory-store.js';
|
|
6
6
|
import { UserFacingError } from '../../domain/errors.js';
|
|
7
7
|
/** Дефолтный агент Wolf в opencode (§6.1). */
|
|
8
8
|
export const DEFAULT_AGENT = 'mr-wolf';
|
|
9
|
+
/** Глубина субагентов: executor-lead спавнит worker-* (трёхуровневая схема). */
|
|
10
|
+
export const SUBAGENT_DEPTH = 2;
|
|
9
11
|
// ponytail: комментарии в opencode.jsonc теряются при rewrite (plain JSON валиден как JSONC);
|
|
10
12
|
// сохранение комментариев = AST-редактор, YAGNI до запроса.
|
|
11
13
|
export class OpencodeAdapter {
|
|
@@ -48,22 +50,39 @@ export class OpencodeAdapter {
|
|
|
48
50
|
// каноническая проекция McpCommand в формат opencode: command — массив
|
|
49
51
|
const desired = { type: 'local', command: [cmd.command, ...cmd.args], enabled: true };
|
|
50
52
|
const mcpOk = JSON.stringify(mcp.wolf) === JSON.stringify(desired);
|
|
51
|
-
// §6.1: default_agent
|
|
53
|
+
// §6.1: default_agent и subagent_depth мерджатся рядом с mcp.wolf
|
|
52
54
|
const da = cfg.default_agent;
|
|
53
|
-
|
|
55
|
+
const sd = cfg.subagent_depth;
|
|
56
|
+
const reasons = [];
|
|
54
57
|
if (da !== undefined && da !== DEFAULT_AGENT) {
|
|
55
|
-
|
|
58
|
+
reasons.push(`default_agent=${da} занят; mr-wolf не назначен`);
|
|
56
59
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
if (sd !== undefined && !(typeof sd === 'number' && sd >= SUBAGENT_DEPTH)) {
|
|
61
|
+
reasons.push(`subagent_depth=${sd} занят; трёхуровневая схема не заработает, поставьте >=2`);
|
|
62
|
+
}
|
|
63
|
+
const reason = reasons.length > 0 ? reasons.join('; ') : undefined;
|
|
64
|
+
// F6 (спека 2.1.0 §2.4): фактические wolf-ключи после ensured — только наши
|
|
65
|
+
// (mcp.wolf в обоих ветках ниже каноничен; default_agent/subagent_depth — если ключ наш, не занят чужим значением)
|
|
66
|
+
const ours = () => {
|
|
67
|
+
const keys = ['mcp.wolf'];
|
|
68
|
+
if (cfg.default_agent === DEFAULT_AGENT)
|
|
69
|
+
keys.push(`default_agent=${DEFAULT_AGENT}`);
|
|
70
|
+
if (typeof cfg.subagent_depth === 'number' && cfg.subagent_depth >= SUBAGENT_DEPTH)
|
|
71
|
+
keys.push(`subagent_depth=${cfg.subagent_depth}`);
|
|
72
|
+
return keys;
|
|
73
|
+
};
|
|
74
|
+
// unchanged — по ВСЕМ ключам: корректный mcp.wolf не маскирует отсутствие default_agent/subagent_depth
|
|
75
|
+
if (mcpOk && da !== undefined && sd !== undefined)
|
|
76
|
+
return { action: 'unchanged', reason, configFile: basename(file), keys: ours() };
|
|
60
77
|
const replaced = mcp.wolf !== undefined && !mcpOk;
|
|
61
78
|
mcp.wolf = desired;
|
|
62
79
|
cfg.mcp = mcp;
|
|
63
80
|
if (da === undefined)
|
|
64
81
|
cfg.default_agent = DEFAULT_AGENT; // конфликтный ключ не трогаем
|
|
82
|
+
if (sd === undefined)
|
|
83
|
+
cfg.subagent_depth = SUBAGENT_DEPTH; // конфликтный ключ не трогаем
|
|
65
84
|
await writeFileAtomic(file, JSON.stringify(cfg, null, 2) + '\n');
|
|
66
|
-
return { action: replaced ? 'replaced' : 'written', reason };
|
|
85
|
+
return { action: replaced ? 'replaced' : 'written', reason, configFile: basename(file), keys: ours() };
|
|
67
86
|
}
|
|
68
87
|
async removeWolf(projectRoot) {
|
|
69
88
|
const file = this.configFile(projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-adapter.js","sourceRoot":"","sources":["../../../src/adapters/platforms/opencode-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode-adapter.js","sourceRoot":"","sources":["../../../src/adapters/platforms/opencode-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,9 @@ export interface PlatformInitOutcome {
|
|
|
58
58
|
platform: string;
|
|
59
59
|
action: 'written' | 'replaced' | 'unchanged' | 'skipped' | 'removed';
|
|
60
60
|
reason?: string;
|
|
61
|
+
/** F6 (спека 2.1.0 §2.4): имя конфиг-файла платформы + фактические wolf-ключи (проброс из writeConfig). */
|
|
62
|
+
configFile?: string;
|
|
63
|
+
keys?: string[];
|
|
61
64
|
}
|
|
62
65
|
export interface InitProjectResult {
|
|
63
66
|
npx: boolean;
|