mister-wolf 1.1.0 → 2.0.1
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 +16 -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 +41 -17
- package/dist/adapters/cli/commands/memory-complain.js.map +1 -1
- package/dist/adapters/cli/commands/memory-init.d.ts +21 -0
- package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-init.js +165 -19
- package/dist/adapters/cli/commands/memory-init.js.map +1 -1
- package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-search.js +8 -0
- package/dist/adapters/cli/commands/memory-search.js.map +1 -1
- package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-sync.js +9 -1
- package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
- package/dist/adapters/cli/commands/memory-update.d.ts +3 -0
- package/dist/adapters/cli/commands/memory-update.d.ts.map +1 -0
- package/dist/adapters/cli/commands/memory-update.js +105 -0
- package/dist/adapters/cli/commands/memory-update.js.map +1 -0
- package/dist/adapters/mcp/mcp-schemas.d.ts +1 -1
- package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.js +8 -2
- package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
- package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-tools.js +10 -8
- package/dist/adapters/mcp/mcp-tools.js.map +1 -1
- package/dist/adapters/platforms/claude-adapter.d.ts +2 -2
- package/dist/adapters/platforms/claude-adapter.d.ts.map +1 -1
- package/dist/adapters/platforms/claude-adapter.js +2 -2
- package/dist/adapters/platforms/claude-adapter.js.map +1 -1
- package/dist/adapters/platforms/opencode-adapter.d.ts +6 -2
- package/dist/adapters/platforms/opencode-adapter.d.ts.map +1 -1
- package/dist/adapters/platforms/opencode-adapter.js +25 -4
- package/dist/adapters/platforms/opencode-adapter.js.map +1 -1
- package/dist/adapters/render/manifest.d.ts +2 -1
- package/dist/adapters/render/manifest.d.ts.map +1 -1
- package/dist/adapters/render/manifest.js +13 -2
- package/dist/adapters/render/manifest.js.map +1 -1
- package/dist/adapters/render/opencode/opencode-renderer.d.ts +10 -3
- package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -1
- package/dist/adapters/render/opencode/opencode-renderer.js +88 -15
- package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -1
- package/dist/adapters/sqlite/sqlite-search-index.d.ts +10 -1
- package/dist/adapters/sqlite/sqlite-search-index.d.ts.map +1 -1
- package/dist/adapters/sqlite/sqlite-search-index.js +48 -10
- package/dist/adapters/sqlite/sqlite-search-index.js.map +1 -1
- package/dist/app/use-cases/bootstrap-project.d.ts +4 -2
- package/dist/app/use-cases/bootstrap-project.d.ts.map +1 -1
- package/dist/app/use-cases/bootstrap-project.js +29 -8
- package/dist/app/use-cases/bootstrap-project.js.map +1 -1
- package/dist/app/use-cases/generate-recap.d.ts +8 -0
- package/dist/app/use-cases/generate-recap.d.ts.map +1 -1
- package/dist/app/use-cases/generate-recap.js +34 -1
- package/dist/app/use-cases/generate-recap.js.map +1 -1
- package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
- package/dist/app/use-cases/get-call-injections.js +7 -3
- package/dist/app/use-cases/get-call-injections.js.map +1 -1
- package/dist/app/use-cases/init-project.d.ts +47 -11
- package/dist/app/use-cases/init-project.d.ts.map +1 -1
- package/dist/app/use-cases/init-project.js +128 -33
- package/dist/app/use-cases/init-project.js.map +1 -1
- package/dist/app/use-cases/model-routing.d.ts +30 -0
- package/dist/app/use-cases/model-routing.d.ts.map +1 -0
- package/dist/app/use-cases/model-routing.js +39 -0
- package/dist/app/use-cases/model-routing.js.map +1 -0
- package/dist/app/use-cases/sync-base-set.d.ts +3 -2
- package/dist/app/use-cases/sync-base-set.d.ts.map +1 -1
- package/dist/app/use-cases/sync-base-set.js +3 -2
- package/dist/app/use-cases/sync-base-set.js.map +1 -1
- package/dist/domain/governance.d.ts.map +1 -1
- package/dist/domain/governance.js +4 -2
- package/dist/domain/governance.js.map +1 -1
- package/dist/domain/memory-types.d.ts +45 -1
- package/dist/domain/memory-types.d.ts.map +1 -1
- package/dist/domain/memory-types.js +20 -0
- package/dist/domain/memory-types.js.map +1 -1
- package/dist/domain/schemas/article-schema.d.ts +1 -1
- package/dist/domain/schemas/blocker-schema.d.ts +1 -1
- package/dist/domain/schemas/decision-schema.d.ts +1 -1
- package/dist/domain/schemas/info-request-schema.d.ts +1 -1
- package/dist/domain/schemas/rule-schema.d.ts +1 -1
- package/dist/domain/schemas/session-checkpoint-schema.d.ts +1 -1
- package/dist/domain/schemas/thread-schema.d.ts +1 -1
- package/dist/domain/type-schema-builder.d.ts +11 -2
- package/dist/domain/type-schema-builder.d.ts.map +1 -1
- package/dist/domain/type-schema-builder.js +41 -0
- package/dist/domain/type-schema-builder.js.map +1 -1
- package/dist/ports/base-set-renderer.port.d.ts +18 -4
- package/dist/ports/base-set-renderer.port.d.ts.map +1 -1
- package/dist/ports/platform-adapter.port.d.ts +7 -1
- package/dist/ports/platform-adapter.port.d.ts.map +1 -1
- package/package.json +1 -6
- package/templates/base/AGENTS.md +28 -0
- package/templates/base/agents/executor-lead.md +24 -7
- package/templates/base/agents/mr-wolf.md +20 -7
- package/templates/base/agents/steward.md +5 -1
- package/templates/base/agents/worker-implementer.md +7 -6
- package/templates/base/agents/worker-researcher.md +7 -6
- package/templates/base/agents/worker-reviewer.md +7 -6
- package/templates/base/commands/complain.md +6 -6
- package/templates/base/playbooks/complaint-protocol.md +97 -24
- package/templates/base/playbooks/steward-nastavnik.md +5 -3
- package/templates/base/playbooks/worker-implementer-playbook.md +16 -8
- package/templates/base/playbooks/worker-researcher-playbook.md +15 -7
- package/templates/base/playbooks/worker-reviewer-playbook.md +14 -7
|
@@ -11,6 +11,8 @@ const LAYOUT = {
|
|
|
11
11
|
skills: '.opencode/skills',
|
|
12
12
|
commands: '.opencode/command',
|
|
13
13
|
};
|
|
14
|
+
/** Маркер онбординг-блока в AGENTS.md (спека §4.2). */
|
|
15
|
+
const ONBOARDING_MARKER = '<!-- wolf:onboarding v2 -->';
|
|
14
16
|
export class OpencodeBaseSetRenderer {
|
|
15
17
|
baseTemplatesRoot;
|
|
16
18
|
opts;
|
|
@@ -52,46 +54,64 @@ export class OpencodeBaseSetRenderer {
|
|
|
52
54
|
yield p;
|
|
53
55
|
}
|
|
54
56
|
}
|
|
55
|
-
async renderBaseSet(baseDir,
|
|
57
|
+
async renderBaseSet(baseDir, opts) {
|
|
56
58
|
const outcomes = [];
|
|
57
59
|
for (const f of this.templateFiles(baseDir)) {
|
|
60
|
+
const rel = relative(baseDir, f.target);
|
|
58
61
|
if (existsSync(f.target)) {
|
|
59
|
-
|
|
62
|
+
// diff-ветка (§4.5): unstamped — чужое (wx); stamped — сравнение контента
|
|
63
|
+
const current = readFileSync(f.target, 'utf-8');
|
|
64
|
+
if (parseStamp(current) === null) {
|
|
65
|
+
outcomes.push({ file: rel, action: 'skipped', reason: 'exists, unstamped (wx-политика)' });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const fresh = this.renderContent(f, opts?.bake, opts?.models);
|
|
69
|
+
if (fresh === current) {
|
|
70
|
+
outcomes.push({ file: rel, action: 'skipped', reason: 'content identical' });
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
await writeFile(f.target, fresh, 'utf-8');
|
|
74
|
+
outcomes.push({ file: rel, action: 'updated', reason: 'content differs (diff-ветка, §4.5)' });
|
|
75
|
+
}
|
|
60
76
|
continue;
|
|
61
77
|
}
|
|
62
|
-
await this.writeRendered(f, bake);
|
|
63
|
-
outcomes.push({ file:
|
|
78
|
+
await this.writeRendered(f, opts?.bake, opts?.models);
|
|
79
|
+
outcomes.push({ file: rel, action: 'created' });
|
|
64
80
|
}
|
|
81
|
+
outcomes.push(...(await this.renderAgentsMd(baseDir, opts?.models)));
|
|
65
82
|
return outcomes;
|
|
66
83
|
}
|
|
67
|
-
async syncBaseSet(baseDir) {
|
|
84
|
+
async syncBaseSet(baseDir, models) {
|
|
85
|
+
const ctx = models ?? 'omit'; // легаси без routing-объекта — omit (§4.5)
|
|
68
86
|
const outcomes = [];
|
|
69
87
|
const seen = new Set();
|
|
70
88
|
for (const f of this.templateFiles(baseDir)) {
|
|
71
89
|
seen.add(f.target);
|
|
90
|
+
const rel = relative(baseDir, f.target);
|
|
72
91
|
if (!existsSync(f.target)) {
|
|
73
|
-
await this.writeRendered(f);
|
|
74
|
-
outcomes.push({ file:
|
|
92
|
+
await this.writeRendered(f, undefined, ctx);
|
|
93
|
+
outcomes.push({ file: rel, action: 'created' });
|
|
75
94
|
continue;
|
|
76
95
|
}
|
|
77
96
|
const current = readFileSync(f.target, 'utf-8');
|
|
78
97
|
if (parseStamp(current) === null) {
|
|
79
98
|
outcomes.push({
|
|
80
|
-
file:
|
|
99
|
+
file: rel,
|
|
81
100
|
action: 'conflict',
|
|
82
101
|
reason: 'unstamped на месте шаблонного — владелец решает: переименовать / удалить / принять текущий',
|
|
83
102
|
});
|
|
84
103
|
continue;
|
|
85
104
|
}
|
|
86
|
-
const fresh = this.renderContent(f);
|
|
105
|
+
const fresh = this.renderContent(f, undefined, ctx);
|
|
87
106
|
if (fresh === current) {
|
|
88
|
-
outcomes.push({ file:
|
|
107
|
+
outcomes.push({ file: rel, action: 'skipped', reason: 'content identical (M2)' });
|
|
89
108
|
continue;
|
|
90
109
|
}
|
|
91
110
|
await mkdir(join(f.target, '..'), { recursive: true });
|
|
92
111
|
await writeFile(f.target, fresh, 'utf-8');
|
|
93
|
-
outcomes.push({ file:
|
|
112
|
+
outcomes.push({ file: rel, action: 'updated' });
|
|
94
113
|
}
|
|
114
|
+
outcomes.push(...(await this.syncAgentsMd(baseDir, ctx)));
|
|
95
115
|
const orphaned = [];
|
|
96
116
|
const scanRoots = [
|
|
97
117
|
join(baseDir, '.opencode/agents'),
|
|
@@ -109,17 +129,70 @@ export class OpencodeBaseSetRenderer {
|
|
|
109
129
|
}
|
|
110
130
|
return { outcomes, orphaned };
|
|
111
131
|
}
|
|
112
|
-
|
|
113
|
-
|
|
132
|
+
/** AGENTS.md — цель в КОРНЕ проекта (§4.2); шаблона нет — тихо нет исхода. */
|
|
133
|
+
agentsMdPaths(baseDir) {
|
|
134
|
+
const tplPath = join(this.baseTemplatesRoot, 'AGENTS.md');
|
|
135
|
+
if (!existsSync(tplPath))
|
|
136
|
+
return null;
|
|
137
|
+
return { tplPath, target: join(baseDir, 'AGENTS.md') };
|
|
138
|
+
}
|
|
139
|
+
agentsMdContent(tplPath, models) {
|
|
140
|
+
const raw = readFileSync(tplPath, 'utf-8');
|
|
141
|
+
return substitute(raw, OPENCODE_MANIFEST, models);
|
|
142
|
+
}
|
|
143
|
+
/** Init-ветка AGENTS.md: create (wx + штамп) / marker-append / skip (D3). */
|
|
144
|
+
async renderAgentsMd(baseDir, models) {
|
|
145
|
+
const paths = this.agentsMdPaths(baseDir);
|
|
146
|
+
if (!paths)
|
|
147
|
+
return [];
|
|
148
|
+
const content = this.agentsMdContent(paths.tplPath, models);
|
|
149
|
+
if (!existsSync(paths.target)) {
|
|
150
|
+
await writeFile(paths.target, insertStamp(content, { base: 'AGENTS.md', set: this.setVersion }, 'AGENTS.md'), 'utf-8');
|
|
151
|
+
return [{ file: 'AGENTS.md', action: 'created' }];
|
|
152
|
+
}
|
|
153
|
+
const current = readFileSync(paths.target, 'utf-8');
|
|
154
|
+
if (current.includes(ONBOARDING_MARKER)) {
|
|
155
|
+
return [{ file: 'AGENTS.md', action: 'skipped', reason: 'onboarding marker exists (§4.2)' }];
|
|
156
|
+
}
|
|
157
|
+
// marker-append: маркированный блок без штампа в конец; чужой контент не трогаем
|
|
158
|
+
const block = content.endsWith('\n') ? content : `${content}\n`;
|
|
159
|
+
const sep = current.endsWith('\n') ? (current.endsWith('\n\n') ? '' : '\n') : '\n\n';
|
|
160
|
+
await writeFile(paths.target, `${current}${sep}${block}`, 'utf-8');
|
|
161
|
+
return [{ file: 'AGENTS.md', action: 'appended', reason: 'marker-append (D3: чужой контент не тронут)' }];
|
|
162
|
+
}
|
|
163
|
+
/** Sync-ветка AGENTS.md: только штампованный цельный файл; append-блок синку не принадлежит. */
|
|
164
|
+
async syncAgentsMd(baseDir, models) {
|
|
165
|
+
const paths = this.agentsMdPaths(baseDir);
|
|
166
|
+
if (!paths)
|
|
167
|
+
return [];
|
|
168
|
+
const fresh = insertStamp(this.agentsMdContent(paths.tplPath, models), { base: 'AGENTS.md', set: this.setVersion }, 'AGENTS.md');
|
|
169
|
+
if (!existsSync(paths.target)) {
|
|
170
|
+
await writeFile(paths.target, fresh, 'utf-8');
|
|
171
|
+
return [{ file: 'AGENTS.md', action: 'created' }];
|
|
172
|
+
}
|
|
173
|
+
const current = readFileSync(paths.target, 'utf-8');
|
|
174
|
+
if (parseStamp(current) === null) {
|
|
175
|
+
return [
|
|
176
|
+
{ file: 'AGENTS.md', action: 'skipped', reason: 'без штампа (append-блок) — синку не принадлежит (§4.2)' },
|
|
177
|
+
];
|
|
178
|
+
}
|
|
179
|
+
if (fresh === current) {
|
|
180
|
+
return [{ file: 'AGENTS.md', action: 'skipped', reason: 'content identical (M2)' }];
|
|
181
|
+
}
|
|
182
|
+
await writeFile(paths.target, fresh, 'utf-8');
|
|
183
|
+
return [{ file: 'AGENTS.md', action: 'updated' }];
|
|
184
|
+
}
|
|
185
|
+
renderContent(f, bake, models) {
|
|
186
|
+
let rendered = substitute(readFileSync(f.tplPath, 'utf-8'), OPENCODE_MANIFEST, models);
|
|
114
187
|
const body = bake?.(f.baseName);
|
|
115
188
|
if (body) {
|
|
116
189
|
rendered += `\n<!-- wolf:face baked (bake-in, §4) -->\n${body}\n`;
|
|
117
190
|
}
|
|
118
191
|
return insertStamp(rendered, { base: f.baseName, set: this.setVersion }, f.baseName);
|
|
119
192
|
}
|
|
120
|
-
async writeRendered(f, bake) {
|
|
193
|
+
async writeRendered(f, bake, models) {
|
|
121
194
|
await mkdir(join(f.target, '..'), { recursive: true });
|
|
122
|
-
await writeFile(f.target, this.renderContent(f, bake), 'utf-8');
|
|
195
|
+
await writeFile(f.target, this.renderContent(f, bake, models), 'utf-8');
|
|
123
196
|
}
|
|
124
197
|
}
|
|
125
198
|
//# sourceMappingURL=opencode-renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-renderer.js","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode-renderer.js","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { SearchIndex, SearchOptions, SearchResult } from '../../ports/search-index.port.js';
|
|
2
2
|
import { MemoryObject } from '../../domain/schemas/memory-object-schema.js';
|
|
3
|
+
/** Колонки FTS-таблицы memory_search — единственный источник: SQLITE_SCHEMA. */
|
|
4
|
+
export declare const FTS_COLUMNS: ReadonlySet<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Вариант D (report-2026-09-01-fts-query-analysis): честная токенизация +
|
|
7
|
+
* конъюнкция префикс-термов; `field:value` — column-filter только для колонок
|
|
8
|
+
* memory_search, неизвестное поле отбрасывается, значение ищется словами;
|
|
9
|
+
* заглавный AND — implicit, заглавный OR — проброс FTS5-оператора;
|
|
10
|
+
* NOT/NEAR — обычные слова (унарный NOT в FTS5 нелегален, см. отчёт).
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildFtsQuery(query: string): string;
|
|
3
13
|
export declare class SQLiteSearchIndex implements SearchIndex {
|
|
4
14
|
private db;
|
|
5
15
|
constructor(dbPath: string);
|
|
@@ -10,7 +20,6 @@ export declare class SQLiteSearchIndex implements SearchIndex {
|
|
|
10
20
|
/** Все живые объекты индекса без MATCH; для проверки свежести индекса (validate). */
|
|
11
21
|
searchAll(): Promise<SearchResult[]>;
|
|
12
22
|
private rowToResult;
|
|
13
|
-
private buildFtsQuery;
|
|
14
23
|
private matchesFilePath;
|
|
15
24
|
private computeScore;
|
|
16
25
|
private removeFromIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-search-index.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite/sqlite-search-index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAI5E,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAOpB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyEjF,qFAAqF;IAC/E,SAAS,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAc1C,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"sqlite-search-index.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite/sqlite-search-index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAI5E,gFAAgF;AAChF,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAK3C,CAAC;AAOF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BnD;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAOpB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyEjF,qFAAqF;IAC/E,SAAS,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAc1C,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,eAAe;CAmCxB"}
|
|
@@ -3,6 +3,53 @@ import { dirname } from 'path';
|
|
|
3
3
|
import Database from 'better-sqlite3';
|
|
4
4
|
import { SQLITE_SCHEMA } from './sqlite-schema.js';
|
|
5
5
|
import { runWithBusyRetry } from './busy-retry.js';
|
|
6
|
+
/** Колонки FTS-таблицы memory_search — единственный источник: SQLITE_SCHEMA. */
|
|
7
|
+
export const FTS_COLUMNS = new Set((SQLITE_SCHEMA.match(/fts5\(([^)]*)\)/)?.[1] ?? '')
|
|
8
|
+
.split(',')
|
|
9
|
+
.map((c) => c.trim().toLowerCase())
|
|
10
|
+
.filter(Boolean));
|
|
11
|
+
/** Слова = последовательности юникод-букв/цифр; всё остальное — разделитель. */
|
|
12
|
+
function tokenizeWords(input) {
|
|
13
|
+
return input.split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Вариант D (report-2026-09-01-fts-query-analysis): честная токенизация +
|
|
17
|
+
* конъюнкция префикс-термов; `field:value` — column-filter только для колонок
|
|
18
|
+
* memory_search, неизвестное поле отбрасывается, значение ищется словами;
|
|
19
|
+
* заглавный AND — implicit, заглавный OR — проброс FTS5-оператора;
|
|
20
|
+
* NOT/NEAR — обычные слова (унарный NOT в FTS5 нелегален, см. отчёт).
|
|
21
|
+
*/
|
|
22
|
+
export function buildFtsQuery(query) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
for (const segment of query.split(/\s+/)) {
|
|
26
|
+
if (!segment)
|
|
27
|
+
continue;
|
|
28
|
+
if (segment === 'AND')
|
|
29
|
+
continue; // неявный AND уже есть (join(' '))
|
|
30
|
+
if (segment === 'OR') {
|
|
31
|
+
// оператор валиден только между термами
|
|
32
|
+
if (parts.length > 0 && parts[parts.length - 1] !== 'OR')
|
|
33
|
+
parts.push('OR');
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const m = segment.match(/^([\p{L}_][\p{L}\p{N}_]*):(.*)$/u);
|
|
37
|
+
// ponytail: имя неизвестного поля («steward:») отбрасываем — значение важнее
|
|
38
|
+
const column = m ? m[1].toLowerCase() : null;
|
|
39
|
+
const prefix = column && FTS_COLUMNS.has(column) ? `${column}:` : '';
|
|
40
|
+
const words = tokenizeWords(m ? m[2] : segment);
|
|
41
|
+
for (const w of words) {
|
|
42
|
+
const term = `${prefix}"${w}"*`;
|
|
43
|
+
if (!seen.has(term)) {
|
|
44
|
+
seen.add(term);
|
|
45
|
+
parts.push(term);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (parts.length > 0 && parts[parts.length - 1] === 'OR')
|
|
50
|
+
parts.pop();
|
|
51
|
+
return parts.join(' ');
|
|
52
|
+
}
|
|
6
53
|
export class SQLiteSearchIndex {
|
|
7
54
|
db;
|
|
8
55
|
constructor(dbPath) {
|
|
@@ -32,7 +79,7 @@ export class SQLiteSearchIndex {
|
|
|
32
79
|
});
|
|
33
80
|
}
|
|
34
81
|
async search(query, options = {}) {
|
|
35
|
-
const ftsQuery =
|
|
82
|
+
const ftsQuery = buildFtsQuery(query);
|
|
36
83
|
if (!ftsQuery) {
|
|
37
84
|
return [];
|
|
38
85
|
}
|
|
@@ -131,15 +178,6 @@ export class SQLiteSearchIndex {
|
|
|
131
178
|
score: this.computeScore(row.rank ?? 0, row.importance, row.confidence),
|
|
132
179
|
};
|
|
133
180
|
}
|
|
134
|
-
buildFtsQuery(query) {
|
|
135
|
-
return (query
|
|
136
|
-
.split(/\s+/)
|
|
137
|
-
.map((token) => token.replace(/["()*:^]/g, ''))
|
|
138
|
-
// ponytail: токены без букв/цифр («-», «—») дают fts5 syntax error — отбрасываем
|
|
139
|
-
.filter((token) => /[\p{L}\p{N}]/u.test(token))
|
|
140
|
-
.map((token) => `"${token}"*`)
|
|
141
|
-
.join(' '));
|
|
142
|
-
}
|
|
143
181
|
matchesFilePath(object, filePath) {
|
|
144
182
|
if (object.source.path === filePath) {
|
|
145
183
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-search-index.js","sourceRoot":"","sources":["../../../src/adapters/sqlite/sqlite-search-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,iBAAiB;IACpB,EAAE,CAAoB;IAE9B,YAAY,MAAc;QACxB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAoB;QACpC,gBAAgB,CAAC,GAAG,EAAE;YACpB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,gBAAgB,CAAC,GAAG,EAAE;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBACvC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;gBACpE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,UAAyB,EAAE;QACrD,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"sqlite-search-index.js","sourceRoot":"","sources":["../../../src/adapters/sqlite/sqlite-search-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,11 +18,13 @@ export interface BootstrapProjectResult {
|
|
|
18
18
|
documentCount: number;
|
|
19
19
|
brief: string;
|
|
20
20
|
}
|
|
21
|
+
/** Заголовок bootstrap-thread — константа дедупа и детекции recap-секции (§3). */
|
|
22
|
+
export declare const BOOTSTRAP_THREAD_TITLE = "Bootstrap: \u043D\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0441\u0442\u0430\u0440\u0442\u043E\u0432\u043E\u0439 \u043F\u0430\u043C\u044F\u0442\u0438";
|
|
21
23
|
/**
|
|
22
24
|
* «Bootstrap-адаптивный» старт памяти проекта (концепт §7.4):
|
|
23
25
|
* скан → черновики правил (proposed) из фактов → work-thread → brief.
|
|
24
|
-
*
|
|
25
|
-
* (
|
|
26
|
+
* Свёртка черновиков и завершение онбординга — в диалоге с пользователем
|
|
27
|
+
* (onboarding v2 §5.4, Q6: предписанных авто-ролей нет).
|
|
26
28
|
*/
|
|
27
29
|
export declare function bootstrapProject(deps: {
|
|
28
30
|
store: MemoryStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-project.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/bootstrap-project.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,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAG5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,EAAE,EAAE,UAAU,CAAC;CAChB,EACD,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"bootstrap-project.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/bootstrap-project.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,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAG5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,wKAA2C,CAAC;AAE/E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,EAAE,EAAE,UAAU,CAAC;CAChB,EACD,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA8EjC"}
|
|
@@ -3,17 +3,31 @@ import { UserFacingError } from '../../domain/errors.js';
|
|
|
3
3
|
import { scanProject } from './scan-project.js';
|
|
4
4
|
import { addMemoryObject } from './add-memory-object.js';
|
|
5
5
|
import { createWorkThread } from './create-work-thread.js';
|
|
6
|
+
/** Заголовок bootstrap-thread — константа дедупа и детекции recap-секции (§3). */
|
|
7
|
+
export const BOOTSTRAP_THREAD_TITLE = 'Bootstrap: наполнение стартовой памяти';
|
|
6
8
|
/**
|
|
7
9
|
* «Bootstrap-адаптивный» старт памяти проекта (концепт §7.4):
|
|
8
10
|
* скан → черновики правил (proposed) из фактов → work-thread → brief.
|
|
9
|
-
*
|
|
10
|
-
* (
|
|
11
|
+
* Свёртка черновиков и завершение онбординга — в диалоге с пользователем
|
|
12
|
+
* (onboarding v2 §5.4, Q6: предписанных авто-ролей нет).
|
|
11
13
|
*/
|
|
12
14
|
export async function bootstrapProject(deps, input) {
|
|
13
15
|
const config = await deps.fs.readSmallTextFile(join(input.baseDir, '.wolf', 'config.yaml'));
|
|
14
16
|
if (config === null) {
|
|
15
17
|
throw new UserFacingError('Project is not initialized: сначала wolf init');
|
|
16
18
|
}
|
|
19
|
+
// Guard §5.1 «онбординг уже закрыт»: thread status ≠ active → no-op без скана.
|
|
20
|
+
// Иначе повторный bootstrap после закрытия регрессировал бы память к черновикам
|
|
21
|
+
// (дедуп смотрит только proposed, а после свёртки черновиков их нет).
|
|
22
|
+
const existingThread = (await deps.store.list({ type: 'work-thread' })).find((t) => t.title === BOOTSTRAP_THREAD_TITLE);
|
|
23
|
+
if (existingThread && existingThread.status !== 'active') {
|
|
24
|
+
return {
|
|
25
|
+
rules: [],
|
|
26
|
+
workThreadId: existingThread.id,
|
|
27
|
+
documentCount: 0,
|
|
28
|
+
brief: `Онбординг уже завершён/отложен (thread ${existingThread.status}); для пересоздания — владелец вручную`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
17
31
|
const { snapshot, documents } = await scanProject(deps, input.baseDir);
|
|
18
32
|
const testCommand = await readTestCommand(deps.fs, input.baseDir);
|
|
19
33
|
const drafts = draftRulesFromSnapshot(snapshot, testCommand);
|
|
@@ -38,18 +52,24 @@ export async function bootstrapProject(deps, input) {
|
|
|
38
52
|
});
|
|
39
53
|
rules.push(object);
|
|
40
54
|
}
|
|
41
|
-
// дедуп work-thread: повторный bootstrap переиспользует существующий
|
|
42
|
-
|
|
43
|
-
const existingThread = (await deps.store.list({ type: 'work-thread' })).find((t) => t.title === BOOTSTRAP_THREAD_TITLE);
|
|
55
|
+
// дедуп work-thread: повторный bootstrap переиспользует существующий active
|
|
56
|
+
// (currentState активного thread'а не дополняем — события живут в events.jsonl)
|
|
44
57
|
let threadId;
|
|
45
58
|
if (existingThread) {
|
|
46
59
|
threadId = existingThread.id;
|
|
47
60
|
}
|
|
48
61
|
else {
|
|
62
|
+
// Указатель «что и когда сделано» (§5.2): id init-отчёта по тегам wolf-init
|
|
63
|
+
const now = deps.clock.now().toISOString();
|
|
64
|
+
const initReport = (await deps.store.list({ type: 'report' }))
|
|
65
|
+
.filter((r) => r.status === 'active' && r.tags.includes('wolf-init'))
|
|
66
|
+
.sort((a, b) => b.updated_at.localeCompare(a.updated_at))[0];
|
|
67
|
+
const initTs = initReport ? initReport.created_at : now;
|
|
49
68
|
const { object: thread } = await createWorkThread(deps, {
|
|
50
69
|
title: BOOTSTRAP_THREAD_TITLE,
|
|
51
|
-
goal: 'Свёртка черновиков
|
|
52
|
-
currentState:
|
|
70
|
+
goal: 'Свёртка черновиков и завершение онбординга в диалоге с пользователем',
|
|
71
|
+
currentState: `init ${initTs} ✓ (${initReport ? `report ${initReport.id}` : 'без отчёта'}); ` +
|
|
72
|
+
`bootstrap ${now}: черновиков ${rules.length}, document-ref'ов ${documents.length}`,
|
|
53
73
|
nextSteps: rules.map((rule) => `${rule.id}: ${rule.title}`),
|
|
54
74
|
createdBy: input.createdBy,
|
|
55
75
|
});
|
|
@@ -113,7 +133,8 @@ function renderBrief(rules, documents, workThreadId, skippedCount) {
|
|
|
113
133
|
lines.push(`- Work-thread: ${workThreadId}`);
|
|
114
134
|
lines.push('');
|
|
115
135
|
lines.push('## Финальный шаг');
|
|
116
|
-
lines.push(
|
|
136
|
+
lines.push(`Онбординг не завершён: свёртка черновиков и завершение — в диалоге с пользователем; ` +
|
|
137
|
+
`когда закончите — закройте thread (\`wolf transition ${workThreadId} completed\`)`);
|
|
117
138
|
return lines.join('\n');
|
|
118
139
|
}
|
|
119
140
|
//# sourceMappingURL=bootstrap-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-project.js","sourceRoot":"","sources":["../../../src/app/use-cases/bootstrap-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAmB3D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAUC,EACD,KAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAC5F,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,+CAA+C,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE7D,8EAA8E;IAC9E,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IAE3D,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;YAC7C,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;YACjC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;YAC7C,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;SAC5B,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"bootstrap-project.js","sourceRoot":"","sources":["../../../src/app/use-cases/bootstrap-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { MemoryStore } from '../../ports/memory-store.port.js';
|
|
2
2
|
import { MemoryObject } from '../../domain/schemas/memory-object-schema.js';
|
|
3
|
+
/** Сигнал «онбординг не завершён» (спека onboarding-pipeline-v2 §3, D6/D8). */
|
|
4
|
+
export type OnboardingSignal = {
|
|
5
|
+
kind: 'bootstrap';
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'continue';
|
|
8
|
+
threadId: string;
|
|
9
|
+
};
|
|
3
10
|
export interface RecapReport {
|
|
4
11
|
activeRules: MemoryObject[];
|
|
5
12
|
activeWorkThreads: MemoryObject[];
|
|
@@ -7,6 +14,7 @@ export interface RecapReport {
|
|
|
7
14
|
openQuestions: MemoryObject[];
|
|
8
15
|
openInfoRequests: MemoryObject[];
|
|
9
16
|
recentDecisions: MemoryObject[];
|
|
17
|
+
onboarding: OnboardingSignal | null;
|
|
10
18
|
}
|
|
11
19
|
export declare function generateRecap(deps: {
|
|
12
20
|
store: MemoryStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-recap.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/generate-recap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-recap.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/generate-recap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAG5E,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC,eAAe,EAAE,YAAY,EAAE,CAAC;IAChC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACrC;AAqBD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBtF;AA6BD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgBvD"}
|
|
@@ -1,10 +1,26 @@
|
|
|
1
|
+
import { BOOTSTRAP_THREAD_TITLE } from './bootstrap-project.js';
|
|
2
|
+
/**
|
|
3
|
+
* Правила вывода секции Onboarding (§3):
|
|
4
|
+
* 1. bootstrap-thread active → продолжение-сигнал (покрывает legacy без init-report);
|
|
5
|
+
* 2. иначе init-report (теги wolf-init + onboarding-v2, active) есть, а thread
|
|
6
|
+
* отсутствует вовсе → bootstrap-сигнал; thread paused — тишина (Q4);
|
|
7
|
+
* 3. иначе (нет ни того ни другого; thread completed/archived/paused) — null.
|
|
8
|
+
*/
|
|
9
|
+
function detectOnboarding(all) {
|
|
10
|
+
const thread = all.find((o) => o.type === 'work-thread' && o.title === BOOTSTRAP_THREAD_TITLE);
|
|
11
|
+
if (thread) {
|
|
12
|
+
return thread.status === 'active' ? { kind: 'continue', threadId: thread.id } : null;
|
|
13
|
+
}
|
|
14
|
+
const hasInitReport = all.some((o) => o.type === 'report' && o.status === 'active' && o.tags.includes('wolf-init') && o.tags.includes('onboarding-v2'));
|
|
15
|
+
return hasInitReport ? { kind: 'bootstrap' } : null;
|
|
16
|
+
}
|
|
1
17
|
export async function generateRecap(deps) {
|
|
2
18
|
// ponytail: store.list() — полный reparse всех md (V6); ровно один вызов на отчёт (D1)
|
|
3
19
|
const all = await deps.store.list();
|
|
4
20
|
// Вопросы живут в 'open' (defaultStatus) или 'active' (созданные до введения defaultStatus)
|
|
5
21
|
const openQuestions = all.filter((obj) => obj.type === 'open-question' && (obj.status === 'open' || obj.status === 'active'));
|
|
6
22
|
return {
|
|
7
|
-
activeRules: all.filter((obj) => obj.type === 'rule' && obj.status === 'active'),
|
|
23
|
+
activeRules: all.filter((obj) => obj.type === 'rule' && (obj.status === 'active' || obj.status === 'accepted')),
|
|
8
24
|
activeWorkThreads: all.filter((obj) => obj.type === 'work-thread' && obj.status === 'active'),
|
|
9
25
|
openBlockers: all.filter((obj) => obj.type === 'blocker' && obj.status === 'active'),
|
|
10
26
|
openQuestions,
|
|
@@ -13,6 +29,7 @@ export async function generateRecap(deps) {
|
|
|
13
29
|
.filter((obj) => obj.type === 'decision' && obj.status === 'active')
|
|
14
30
|
.sort((a, b) => b.updated_at.localeCompare(a.updated_at))
|
|
15
31
|
.slice(0, 5),
|
|
32
|
+
onboarding: detectOnboarding(all),
|
|
16
33
|
};
|
|
17
34
|
}
|
|
18
35
|
function section(lines, title, items) {
|
|
@@ -25,9 +42,25 @@ function section(lines, title, items) {
|
|
|
25
42
|
lines.push(item);
|
|
26
43
|
}
|
|
27
44
|
}
|
|
45
|
+
/** Тексты секции — контракт для рамки mr-wolf (§6.2), дословно. */
|
|
46
|
+
function onboardingText(signal) {
|
|
47
|
+
if (signal.kind === 'bootstrap') {
|
|
48
|
+
return ('Onboarding v2: init выполнен, bootstrap — нет. Уточни у пользователя: предложить выполнить ' +
|
|
49
|
+
'`wolf bootstrap` (можно исполнить прямо в сессии: `wolf bootstrap`; в dogfood-репо Wolf — ' +
|
|
50
|
+
'`node dist/bootstrap/cli.js bootstrap`) или следовать пути пользователя. ' +
|
|
51
|
+
'Действия с побочными эффектами — только с согласия пользователя.');
|
|
52
|
+
}
|
|
53
|
+
return ('Onboarding v2: bootstrap выполнен, онбординг не завершён (thread active). Работай под управлением ' +
|
|
54
|
+
'пользователя — свёртка черновиков, глубокое изучение проекта — как решит пользователь; предписанных ' +
|
|
55
|
+
`ролей нет. Когда онбординг завершён — предложи закрыть thread (\`wolf transition ${signal.threadId} ` +
|
|
56
|
+
'completed`) и закрой с согласия пользователя.');
|
|
57
|
+
}
|
|
28
58
|
export function renderRecap(report) {
|
|
29
59
|
const fmtObj = (obj) => `- ${obj.id} [${obj.type}] ${obj.title}`;
|
|
30
60
|
const lines = ['Recap'];
|
|
61
|
+
if (report.onboarding !== null) {
|
|
62
|
+
section(lines, 'Onboarding', [onboardingText(report.onboarding)]);
|
|
63
|
+
}
|
|
31
64
|
section(lines, 'Active rules', report.activeRules.map(fmtObj));
|
|
32
65
|
section(lines, 'Active work threads', report.activeWorkThreads.map(fmtObj));
|
|
33
66
|
section(lines, 'Open blockers', report.openBlockers.map(fmtObj));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-recap.js","sourceRoot":"","sources":["../../../src/app/use-cases/generate-recap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-recap.js","sourceRoot":"","sources":["../../../src/app/use-cases/generate-recap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-call-injections.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/get-call-injections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAIlD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"get-call-injections.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/get-call-injections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAIlD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAWD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,EAC/D,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC5E,OAAO,CAAC,mBAAmB,CAAC,CAwG9B"}
|