mister-wolf 2.14.1 → 2.15.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.
Files changed (56) hide show
  1. package/README.md +22 -11
  2. package/README.ru.md +22 -11
  3. package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
  4. package/dist/adapters/cli/commands/memory-doctor.js +32 -1
  5. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  6. package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
  7. package/dist/adapters/cli/commands/memory-scaffold.js +15 -0
  8. package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
  9. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
  10. package/dist/adapters/cli/commands/memory-sync.js +8 -0
  11. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  12. package/dist/adapters/fs/artifact-fs.d.ts +4 -0
  13. package/dist/adapters/fs/artifact-fs.d.ts.map +1 -0
  14. package/dist/adapters/fs/artifact-fs.js +29 -0
  15. package/dist/adapters/fs/artifact-fs.js.map +1 -0
  16. package/dist/app/use-cases/artifact-front-matter.d.ts +5 -0
  17. package/dist/app/use-cases/artifact-front-matter.d.ts.map +1 -0
  18. package/dist/app/use-cases/artifact-front-matter.js +16 -0
  19. package/dist/app/use-cases/artifact-front-matter.js.map +1 -0
  20. package/dist/app/use-cases/lint-artifacts.d.ts +18 -0
  21. package/dist/app/use-cases/lint-artifacts.d.ts.map +1 -0
  22. package/dist/app/use-cases/lint-artifacts.js +249 -0
  23. package/dist/app/use-cases/lint-artifacts.js.map +1 -0
  24. package/dist/app/use-cases/scaffold-agent.d.ts +1 -1
  25. package/dist/app/use-cases/scaffold-agent.d.ts.map +1 -1
  26. package/dist/app/use-cases/scaffold-agent.js +1 -1
  27. package/dist/app/use-cases/scaffold-agent.js.map +1 -1
  28. package/dist/app/use-cases/scaffold-artifact.d.ts +22 -0
  29. package/dist/app/use-cases/scaffold-artifact.d.ts.map +1 -0
  30. package/dist/app/use-cases/scaffold-artifact.js +153 -0
  31. package/dist/app/use-cases/scaffold-artifact.js.map +1 -0
  32. package/dist/app/use-cases/sync-artifact-index.d.ts +20 -0
  33. package/dist/app/use-cases/sync-artifact-index.d.ts.map +1 -0
  34. package/dist/app/use-cases/sync-artifact-index.js +68 -0
  35. package/dist/app/use-cases/sync-artifact-index.js.map +1 -0
  36. package/dist/domain/memory-types.d.ts +12 -0
  37. package/dist/domain/memory-types.d.ts.map +1 -1
  38. package/dist/domain/memory-types.js +4 -0
  39. package/dist/domain/memory-types.js.map +1 -1
  40. package/dist/domain/schemas/relation-schema.d.ts +1 -1
  41. package/package.json +1 -1
  42. package/templates/.wolf/router.log +1 -1
  43. package/templates/base/skills/finishing-a-development-branch/SKILL.md +32 -13
  44. package/templates/base/skills/receiving-code-review/SKILL.md +39 -0
  45. package/templates/base/skills/test-driven-development/SKILL.md +59 -37
  46. package/templates/base/skills/using-git-worktrees/SKILL.md +25 -15
  47. package/templates/base/skills/verification-before-completion/SKILL.md +39 -25
  48. package/templates/base/skills/wolf-brainstorm/SKILL.md +51 -36
  49. package/templates/base/skills/wolf-design/SKILL.md +45 -0
  50. package/templates/base/skills/wolf-execute/SKILL.md +30 -13
  51. package/templates/base/skills/wolf-plan/SKILL.md +38 -21
  52. package/templates/base/skills/wolf-review/SKILL.md +33 -14
  53. package/templates/base/skills/wolf-sdd/SKILL.md +38 -16
  54. package/templates/base/skills/wolf-skill-intake/SKILL.md +66 -0
  55. package/templates/base/skills/wolf-testplan/SKILL.md +37 -0
  56. package/templates/base/skills/writing-skills/SKILL.md +40 -0
@@ -0,0 +1,249 @@
1
+ import { join } from 'path';
2
+ import { parseArtifactFrontMatter } from './artifact-front-matter.js';
3
+ /** Тело документа без front-matter (regex дублирует parseArtifactFrontMatter — она тело не отдаёт). */
4
+ function bodyOf(raw) {
5
+ const m = raw.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?([\s\S]*)$/);
6
+ return m ? m[1] : raw;
7
+ }
8
+ /** Нормализация для сравнения дубликатов: trim + lowercase + схлопывание пробелов. */
9
+ const normalize = (s) => s.replace(/\s+/g, ' ').trim().toLowerCase();
10
+ /** Слаг папки фичи: `2026-10-08-x` → `x`; без датового префикса — имя целиком. */
11
+ const folderSlug = (name) => name.replace(/^\d{4}-\d{2}-\d{2}-/, '');
12
+ /** Идентификатор CR-записи — первые 40 символов строки (спека §4-A3 п.6). */
13
+ const crId = (line) => line.slice(0, 40);
14
+ /** Линт артефактов docs/dev (спека §4-A3): только чтение + регулярки; tolerant —
15
+ * нечитаемое пропускается, линт никогда не бросает; находит, но не блокирует. */
16
+ export async function runArtifactLint(deps) {
17
+ const { fs, baseDir, toolOwners, baseSkillNames } = deps;
18
+ const findings = [];
19
+ const readOrNull = async (p) => {
20
+ try {
21
+ return await fs.readFile(p);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ };
27
+ /** Tolerant listDir: нет каталога/ошибка → [] (адаптер уже самогейтится через existsSync). */
28
+ const listDirSafe = async (p) => {
29
+ try {
30
+ return await fs.listDir(p);
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ };
36
+ // 12. Скиллы-призраки — независимо от наличия docs/dev.
37
+ for (const name of await listDirSafe(join(baseDir, '.opencode', 'skills'))) {
38
+ if (!toolOwners.has(name) && !baseSkillNames.has(name)) {
39
+ findings.push({
40
+ file: `.opencode/skills/${name}`,
41
+ message: `скилл-призрак: .opencode/skills/${name}/ без тул-объекта в памяти (wolf add --type tool)`,
42
+ });
43
+ }
44
+ }
45
+ const devDir = join(baseDir, 'docs', 'dev');
46
+ try {
47
+ if (!(await fs.exists(devDir)))
48
+ return findings;
49
+ }
50
+ catch {
51
+ return findings;
52
+ }
53
+ const devEntries = (await listDirSafe(devDir)).sort();
54
+ const featureFolders = devEntries.filter((n) => !n.endsWith('.md') && n !== 'roadmap');
55
+ const waveNames = devEntries.filter((n) => n.startsWith('wave-') && n.endsWith('.md'));
56
+ // Волны/роадмап: все wave-*.md в docs/dev + *.md в docs/dev/roadmap/.
57
+ const globalDocs = [];
58
+ for (const name of waveNames) {
59
+ const raw = await readOrNull(join(devDir, name));
60
+ if (raw !== null)
61
+ globalDocs.push({ rel: `docs/dev/${name}`, raw });
62
+ }
63
+ const roadmapDir = join(devDir, 'roadmap');
64
+ for (const name of (await listDirSafe(roadmapDir)).sort()) {
65
+ if (!name.endsWith('.md'))
66
+ continue;
67
+ const raw = await readOrNull(join(roadmapDir, name));
68
+ if (raw !== null)
69
+ globalDocs.push({ rel: `docs/dev/roadmap/${name}`, raw });
70
+ }
71
+ // 9. Дубли роадмапа: один нормализованный пункт ^- в двух файлах.
72
+ const firstSeen = new Map();
73
+ const reportedItems = new Set();
74
+ for (const doc of globalDocs) {
75
+ for (const line of doc.raw.split('\n')) {
76
+ if (!/^- /.test(line))
77
+ continue;
78
+ const key = normalize(line);
79
+ const first = firstSeen.get(key);
80
+ if (first && first !== doc.rel && !reportedItems.has(key)) {
81
+ reportedItems.add(key);
82
+ findings.push({
83
+ file: doc.rel,
84
+ message: `пункт роадмапа в двух файлах: "${key.slice(0, 60)}" — ${first}, ${doc.rel}`,
85
+ });
86
+ }
87
+ else if (!first) {
88
+ firstSeen.set(key, doc.rel);
89
+ }
90
+ }
91
+ }
92
+ // 10a. Released-файл: слаг пункта без папки docs/dev/*-<слаг>.
93
+ for (const doc of globalDocs) {
94
+ if (parseArtifactFrontMatter(doc.raw).status !== 'released')
95
+ continue;
96
+ for (const line of doc.raw.split('\n')) {
97
+ const m = line.match(/^- (.+)$/);
98
+ if (!m)
99
+ continue;
100
+ const slug = m[1].split(/[\s—:]+/)[0] ?? '';
101
+ if (slug === '')
102
+ continue;
103
+ if (!featureFolders.some((f) => f === slug || f.endsWith(`-${slug}`))) {
104
+ findings.push({ file: doc.rel, message: `волна ${doc.rel}: у фичи ${slug} нет папки фичи` });
105
+ }
106
+ }
107
+ }
108
+ // Правила 2–8 — по requirements.md папки фичи; 3/11 — по спутникам (requirements не нужен).
109
+ for (const folder of featureFolders) {
110
+ const folderPath = join(devDir, folder);
111
+ const reqRel = `docs/dev/${folder}/requirements.md`;
112
+ const reqRaw = await readOrNull(join(folderPath, 'requirements.md'));
113
+ const reqIds = new Set();
114
+ if (reqRaw !== null) {
115
+ const reqMeta = parseArtifactFrontMatter(reqRaw);
116
+ const reqBody = bodyOf(reqRaw);
117
+ const reqLines = reqBody.split('\n');
118
+ // 2. Дубли ID в requirements.md.
119
+ const ids = [];
120
+ for (const line of reqLines) {
121
+ const m = line.match(/^###\s+(REQ|NFR)-(\d{2})\b/);
122
+ if (m)
123
+ ids.push(`${m[1]}-${m[2]}`);
124
+ }
125
+ for (const id of ids)
126
+ reqIds.add(id);
127
+ const idSeen = new Set();
128
+ for (const id of ids) {
129
+ if (idSeen.has(id)) {
130
+ findings.push({ file: reqRel, message: `${id} дублируется в ${folder}/requirements.md` });
131
+ }
132
+ else {
133
+ idSeen.add(id);
134
+ }
135
+ }
136
+ // 4. Блоки REQ: AC:/Источник:; 8. Дубли текста требований.
137
+ const blocks = reqBody.split(/^###\s+/m).slice(1);
138
+ const reqTexts = new Map();
139
+ for (const block of blocks) {
140
+ const m = block.match(/^(REQ|NFR)-(\d{2})/);
141
+ if (!m)
142
+ continue;
143
+ const id = `${m[1]}-${m[2]}`;
144
+ const blockBody = block.slice(m[0].length);
145
+ if (!blockBody.split('\n').some((l) => l.includes('AC:'))) {
146
+ findings.push({ file: reqRel, message: `${id}: нет строки "AC:"` });
147
+ }
148
+ if (!blockBody.split('\n').some((l) => l.includes('Источник:'))) {
149
+ findings.push({ file: reqRel, message: `${id}: нет строки "Источник:"` });
150
+ }
151
+ for (const line of blockBody.split('\n')) {
152
+ const tm = line.match(/^- Требование:\s*(.+)$/);
153
+ if (!tm)
154
+ continue;
155
+ const key = normalize(tm[1]);
156
+ const firstId = reqTexts.get(key);
157
+ if (firstId && firstId !== id) {
158
+ findings.push({
159
+ file: reqRel,
160
+ message: `дубликат требования: "${key.slice(0, 60)}" (${firstId} ↔ ${id})`,
161
+ });
162
+ }
163
+ else if (!firstId) {
164
+ reqTexts.set(key, id);
165
+ }
166
+ }
167
+ }
168
+ // 5. НЕОПРЕДЕЛЕНО в approved-документе.
169
+ if (reqMeta.status === 'approved' && reqBody.includes('[НЕОПРЕДЕЛЕНО')) {
170
+ findings.push({
171
+ file: reqRel,
172
+ message: `[НЕОПРЕДЕЛЕНО в approved-документе: ${reqRel} — убери плейсхолдер или верни статус в draft`,
173
+ });
174
+ }
175
+ // 6. CR без downstream-отметки; 7. Сброс downstream (§6.7).
176
+ for (const line of reqLines) {
177
+ if (!/^- CR-/.test(line))
178
+ continue;
179
+ const id = crId(line);
180
+ if (!line.includes('downstream:')) {
181
+ findings.push({ file: reqRel, message: `${id} без downstream-отметки (${reqRel})` });
182
+ continue;
183
+ }
184
+ if (reqMeta.status !== 'approved')
185
+ continue;
186
+ const lower = line.toLowerCase();
187
+ for (const word of ['design', 'plan']) {
188
+ if (!lower.includes(word))
189
+ continue;
190
+ const subRaw = await readOrNull(join(folderPath, `${word}.md`));
191
+ if (subRaw === null)
192
+ continue;
193
+ if (parseArtifactFrontMatter(subRaw).status === 'approved') {
194
+ findings.push({
195
+ file: reqRel,
196
+ message: `${id} требует сброса статуса ${word}.md → draft (остался approved)`,
197
+ });
198
+ }
199
+ }
200
+ }
201
+ // 3. Битые REQ-ссылки в design/plan/test-plan.
202
+ for (const fileName of ['design.md', 'plan.md', 'test-plan.md']) {
203
+ const raw = await readOrNull(join(folderPath, fileName));
204
+ if (raw === null)
205
+ continue;
206
+ const refs = [...new Set(bodyOf(raw).match(/REQ-\d{2}/g) ?? [])];
207
+ for (const ref of refs) {
208
+ if (!reqIds.has(ref)) {
209
+ findings.push({
210
+ file: `docs/dev/${folder}/${fileName}`,
211
+ message: `${ref} не найден в requirements.md (упомянут в docs/dev/${folder}/${fileName})`,
212
+ });
213
+ }
214
+ }
215
+ }
216
+ }
217
+ // 11. Готовность по plan.md.
218
+ const planRaw = await readOrNull(join(folderPath, 'plan.md'));
219
+ if (planRaw !== null) {
220
+ const planLines = planRaw.split('\n');
221
+ const done = planLines.filter((l) => /^\s*[-*] \[x\]/i.test(l)).length;
222
+ const todo = planLines.filter((l) => /^\s*[-*] \[ \]/.test(l)).length;
223
+ if (done > 0 && todo === 0 && parseArtifactFrontMatter(planRaw).status === 'approved') {
224
+ findings.push({
225
+ file: `docs/dev/${folder}/plan.md`,
226
+ message: `${folder} готова к релизу (все задачи закрыты, план approved)`,
227
+ });
228
+ }
229
+ else if (done > 0 && todo > 0) {
230
+ findings.push({
231
+ file: `docs/dev/${folder}/plan.md`,
232
+ message: `${folder} в работе (закрыто ${done} из ${done + todo} задач)`,
233
+ });
234
+ }
235
+ }
236
+ }
237
+ // 10b. Папка фичи, слаг которой не упомянут ни в одном wave/roadmap-файле.
238
+ const waveText = globalDocs.map((d) => d.raw).join('\n');
239
+ for (const folder of featureFolders) {
240
+ const slug = folderSlug(folder);
241
+ if (slug === '')
242
+ continue;
243
+ if (!waveText.includes(slug)) {
244
+ findings.push({ file: `docs/dev/${folder}`, message: `${folder} не упомянута в файлах волн` });
245
+ }
246
+ }
247
+ return findings;
248
+ }
249
+ //# sourceMappingURL=lint-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-artifacts.js","sourceRoot":"","sources":["../../../src/app/use-cases/lint-artifacts.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import { MemoryLock } from '../../ports/memory-lock.port.js';
7
7
  import { RelationLog } from '../../ports/relation-log.port.js';
8
8
  import { FileSystem } from '../../ports/file-system.port.js';
9
9
  import { MemoryTypeDeclaration } from '../../domain/memory-types.js';
10
- export declare const SCAFFOLD_KINDS: readonly ["agent", "skill", "command"];
10
+ export declare const SCAFFOLD_KINDS: readonly ["agent", "skill", "command", "artifact"];
11
11
  export type ScaffoldKind = (typeof SCAFFOLD_KINDS)[number];
12
12
  export declare const DEFAULT_SCAFFOLD_MODEL = "zai-coding-plan/glm-5.3";
13
13
  export interface ScaffoldFrameInput {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-agent.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-agent.ts"],"names":[],"mappings":"AAEA,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,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAkB,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAyBrF,eAAO,MAAM,cAAc,wCAAyC,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1E;AAoDD,wBAAsB,aAAa,CACjC,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,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,EAAE,EAAE,UAAU,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,EACD,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAqF9B"}
1
+ {"version":3,"file":"scaffold-agent.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-agent.ts"],"names":[],"mappings":"AAEA,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,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAkB,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAyBrF,eAAO,MAAM,cAAc,oDAAqD,CAAC;AACjF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1E;AAoDD,wBAAsB,aAAa,CACjC,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,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,EAAE,EAAE,UAAU,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,EACD,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAqF9B"}
@@ -20,7 +20,7 @@ function isPlaybookNote(pb) {
20
20
  (pb.type === 'note' &&
21
21
  (pb.facet === 'howto' || pb.alias_origin === 'playbook')));
22
22
  }
23
- export const SCAFFOLD_KINDS = ['agent', 'skill', 'command'];
23
+ export const SCAFFOLD_KINDS = ['agent', 'skill', 'command', 'artifact'];
24
24
  export const DEFAULT_SCAFFOLD_MODEL = 'zai-coding-plan/glm-5.3';
25
25
  /** Каталог command — единственного числа (.opencode/command/), agents и skills — как в opencode. */
26
26
  export function frameRelativePath(kind, name) {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-agent.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold-agent.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Clock } from '../../ports/clock.port.js';
2
+ import { FileSystem } from '../../ports/file-system.port.js';
3
+ export interface ScaffoldArtifactDeps {
4
+ clock: Clock;
5
+ fs: Pick<FileSystem, 'exists' | 'writeFile'>;
6
+ baseDir: string;
7
+ }
8
+ export interface ScaffoldArtifactInput {
9
+ slug: string;
10
+ fix: boolean;
11
+ }
12
+ export interface ScaffoldArtifactResult {
13
+ dir: string;
14
+ files: string[];
15
+ }
16
+ /** Анатомия §4.1 спеки — дословно (7 секций + анатомия записи REQ/NFR). */
17
+ export declare function requirementsTemplate(slug: string, title: string, created: string, fix: boolean): string;
18
+ export declare function designTemplate(slug: string, title: string, created: string): string;
19
+ export declare function planTemplate(slug: string, title: string, created: string): string;
20
+ export declare function testPlanTemplate(slug: string, title: string, created: string): string;
21
+ export declare function scaffoldArtifact(deps: ScaffoldArtifactDeps, input: ScaffoldArtifactInput): Promise<ScaffoldArtifactResult>;
22
+ //# sourceMappingURL=scaffold-artifact.d.ts.map
@@ -0,0 +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;AAK7D,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;CACjB;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,CA2BjC"}
@@ -0,0 +1,153 @@
1
+ import { join } from 'path';
2
+ import { UserFacingError } from '../../domain/errors.js';
3
+ const SLUG_RE = /^[a-z0-9][a-z0-9-]*$/;
4
+ function frontMatter(slug, title, created) {
5
+ return ['---', `slug: ${slug}`, `title: ${title}`, 'status: draft', `created: ${created}`, '---', ''].join('\n');
6
+ }
7
+ /** Анатомия §4.1 спеки — дословно (7 секций + анатомия записи REQ/NFR). */
8
+ export function requirementsTemplate(slug, title, created, fix) {
9
+ if (fix) {
10
+ return [
11
+ frontMatter(slug, title, created),
12
+ `# ${title} — требования и журнал изменений (fix-профиль)`,
13
+ '',
14
+ '## 1. Контекст и проблема',
15
+ '<!-- Что наблюдаем, где, с какой версии; эффект на проект. -->',
16
+ '',
17
+ '## 2. Функциональные требования',
18
+ '<!-- Записи REQ-NN при необходимости; в простом фиксе секция остаётся пустой. -->',
19
+ '',
20
+ '## 3. Журнал изменений (CR) — содержание фикса',
21
+ '<!-- Append-only. Каждая запись: дата, что/почему, кем утверждено, downstream-перегенерации. -->',
22
+ '',
23
+ `- CR-${created}-01: <что и почему> — утвердил <кто>; downstream: <артефакты или «нет»>`,
24
+ '',
25
+ ].join('\n');
26
+ }
27
+ return [
28
+ frontMatter(slug, title, created),
29
+ `# ${title} — функциональные требования`,
30
+ '',
31
+ '## 1. Контекст и проблема',
32
+ '<!-- Зачем, прозой, бизнес-языком; метрика успеха. -->',
33
+ '',
34
+ '## 2. Область',
35
+ '<!-- Что входит; НЕ входит (не-цели уровня требований). -->',
36
+ '',
37
+ '## 3. Глоссарий',
38
+ '<!-- Бизнес-термины фичи, если появились новые. -->',
39
+ '',
40
+ '## 4. Функциональные требования',
41
+ '',
42
+ '### REQ-01 — <Название>',
43
+ '- История: Как <роль>, я хочу <возможность>, чтобы <выгода>.',
44
+ '- Требование: Когда <условие>, система должна <поведение>.',
45
+ '- Обоснование: <зачем это бизнесу — словами владельца>',
46
+ '- AC: <измеримый критерий; нетривиальные — Given/When/Then>',
47
+ '- Приоритет: Must',
48
+ '- Источник: <диалог YYYY-MM-DD / жалоба mem-… / ревью-линза>',
49
+ '',
50
+ '## 5. Нефункциональные требования (NFR)',
51
+ '<!-- Производительность, безопасность, совместимость; каждая с измеримым критерием. -->',
52
+ '',
53
+ '### NFR-01 — <Название>',
54
+ '- Требование: <shall-формулировка ограничения>',
55
+ '- AC: <измеримый критерий>',
56
+ '- Источник: <откуда требование>',
57
+ '',
58
+ '## 6. Ограничения и допущения',
59
+ '<!-- Что считаем данным. -->',
60
+ '',
61
+ '## 7. Журнал изменений (CR)',
62
+ '<!-- Append-only. Каждая запись: дата, затронутый REQ/NFR, что/почему, кем утверждено, какие downstream-артефакты перегенерированы. -->',
63
+ '',
64
+ `- CR-${created}-01: <что и почему> — утвердил <кто>; downstream: <артефакты или «нет»>`,
65
+ '',
66
+ ].join('\n');
67
+ }
68
+ export function designTemplate(slug, title, created) {
69
+ return [
70
+ frontMatter(slug, `${title} — дизайн`, created),
71
+ `# ${title} — дизайн`,
72
+ '',
73
+ '## Глоссарий',
74
+ '<!-- Технические термины; термин вводится до использования. -->',
75
+ '',
76
+ '## Компоненты и ответственность',
77
+ '<!-- Каждый компонент: имя — ответственность — файл. -->',
78
+ '',
79
+ '## Контракты',
80
+ '<!-- Типы, схемы, форматы событий; блоки ≤ 10 строк; псевдокод алгоритмов разрешён. Копипаста реализации продукта запрещена. -->',
81
+ '',
82
+ '## ADR-карточки',
83
+ '<!-- ADR-N: Контекст → Решение → Последствия. ADR — продуктовые выборы: владелец визирует отдельно. -->',
84
+ '',
85
+ '## Ссылки на NFR',
86
+ '<!-- NFR-NN из requirements.md + технические бюджеты; собственных ID-записей не заводить. -->',
87
+ '',
88
+ ].join('\n');
89
+ }
90
+ export function planTemplate(slug, title, created) {
91
+ return [
92
+ frontMatter(slug, `${title} — план`, created),
93
+ `# ${title} — план`,
94
+ '',
95
+ '<!-- Задачи: цель + ссылка на §design + file:line базлайна. Без копипасты реализации; единственный источник контрактов — design. -->',
96
+ '',
97
+ '## Задачи',
98
+ '',
99
+ '- [ ] Задача 1: <цель> — design §<раздел>, базлайн <file:line>',
100
+ '',
101
+ '<!-- Исполнитель переворачивает чекбокс в [x] в конце задачи вместе со строкой «сделано → коммит». Чекбокс — истина завершённости. -->',
102
+ '',
103
+ ].join('\n');
104
+ }
105
+ export function testPlanTemplate(slug, title, created) {
106
+ return [
107
+ frontMatter(slug, `${title} — тест-план`, created),
108
+ `# ${title} — тест-план`,
109
+ '',
110
+ '<!-- Сценарий на каждый REQ-NN; AC переизобретаться не должны (AC — единый источник). -->',
111
+ '',
112
+ '## Сценарии',
113
+ '',
114
+ '### REQ-01',
115
+ '- Given <контекст>',
116
+ '- When <действие>',
117
+ '- Then <результат>',
118
+ '- Маппинг: <tests/… файл или e2e-сценарий>',
119
+ '',
120
+ '## Прогоны',
121
+ '<!-- Точечные: npx vitest run <путь>; полный гейт: npm run check. -->',
122
+ '',
123
+ ].join('\n');
124
+ }
125
+ export async function scaffoldArtifact(deps, input) {
126
+ if (!SLUG_RE.test(input.slug)) {
127
+ throw new UserFacingError(`Invalid slug "${input.slug}" (expected ^[a-z0-9][a-z0-9-]*$)`);
128
+ }
129
+ const now = deps.clock.now();
130
+ const created = now.toISOString().slice(0, 10);
131
+ const dir = join(deps.baseDir, 'docs', 'dev', `${created}-${input.slug}`);
132
+ // Уникальность имён — машина, не дисциплина: отказ ДО любых записей (спека §4-A1).
133
+ if (await deps.fs.exists(dir)) {
134
+ throw new UserFacingError(`Artifact folder already exists: ${dir}`);
135
+ }
136
+ const templates = {
137
+ 'requirements.md': requirementsTemplate(input.slug, input.slug, created, input.fix),
138
+ 'design.md': designTemplate(input.slug, input.slug, created),
139
+ 'plan.md': planTemplate(input.slug, input.slug, created),
140
+ 'test-plan.md': testPlanTemplate(input.slug, input.slug, created),
141
+ };
142
+ const names = input.fix
143
+ ? ['requirements.md', 'plan.md']
144
+ : ['requirements.md', 'design.md', 'plan.md', 'test-plan.md'];
145
+ const written = [];
146
+ for (const name of names) {
147
+ const p = join(dir, name);
148
+ await deps.fs.writeFile(p, templates[name]);
149
+ written.push(p);
150
+ }
151
+ return { dir, files: written };
152
+ }
153
+ //# sourceMappingURL=scaffold-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface ArtifactIndexFs {
2
+ exists: (p: string) => Promise<boolean>;
3
+ readFile: (p: string) => Promise<string | null>;
4
+ writeFile: (p: string, c: string) => Promise<void>;
5
+ /** Имена записей каталога (файлы и папки, без «.»-записей). */
6
+ listDir: (p: string) => Promise<string[]>;
7
+ /** .md-файлы каталога рекурсивно, относительные пути. */
8
+ listFiles: (p: string) => Promise<string[]>;
9
+ }
10
+ export interface SyncArtifactIndexDeps {
11
+ fs: ArtifactIndexFs;
12
+ baseDir: string;
13
+ }
14
+ export type SyncArtifactIndexAction = 'written' | 'unchanged' | 'skipped';
15
+ /** Спека §4-A2: таблица слаг/дата/title/status/профиль; §4-A4: _index.md частей.
16
+ * Идемпотентность — по прецеденту штампов: identical → не пишем. */
17
+ export declare function syncArtifactIndex(deps: SyncArtifactIndexDeps): Promise<{
18
+ action: SyncArtifactIndexAction;
19
+ }>;
20
+ //# sourceMappingURL=sync-artifact-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-artifact-index.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/sync-artifact-index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,+DAA+D;IAC/D,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,yDAAyD;IACzD,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,eAAe,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAM1E;oEACoE;AACpE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAiEjH"}
@@ -0,0 +1,68 @@
1
+ import { join } from 'path';
2
+ import { parseArtifactFrontMatter } from './artifact-front-matter.js';
3
+ const INDEX_HEADER = '<!-- wolf:generated docs/dev/INDEX.md — regenerates on wolf sync; hand edits are overwritten -->\n\n' +
4
+ '# Артефакты — docs/dev\n\n';
5
+ /** Спека §4-A2: таблица слаг/дата/title/status/профиль; §4-A4: _index.md частей.
6
+ * Идемпотентность — по прецеденту штампов: identical → не пишем. */
7
+ export async function syncArtifactIndex(deps) {
8
+ const devDir = join(deps.baseDir, 'docs', 'dev');
9
+ if (!(await deps.fs.exists(devDir)))
10
+ return { action: 'skipped' };
11
+ const writes = new Map();
12
+ const rows = [];
13
+ const waves = [];
14
+ const folders = [];
15
+ for (const name of (await deps.fs.listDir(devDir)).sort()) {
16
+ if (name === 'INDEX.md')
17
+ continue; // сам индекс не индексируем — иначе повторный sync не идемпотентен
18
+ const p = join(devDir, name);
19
+ if (name.endsWith('.md')) {
20
+ const raw = await deps.fs.readFile(p);
21
+ if (raw) {
22
+ const meta = parseArtifactFrontMatter(raw);
23
+ waves.push(`- ${name} — ${meta.title ?? name} (${meta.status ?? 'draft'})`);
24
+ }
25
+ continue;
26
+ }
27
+ const reqRaw = await deps.fs.readFile(join(p, 'requirements.md'));
28
+ if (!reqRaw)
29
+ continue;
30
+ const meta = parseArtifactFrontMatter(reqRaw);
31
+ if (!meta.slug)
32
+ continue;
33
+ const files = await deps.fs.listFiles(p);
34
+ const profile = files.includes('design.md') && files.includes('test-plan.md') ? 'full' : 'fix';
35
+ folders.push(name);
36
+ rows.push(`| ${meta.slug} | ${meta.created ?? ''} | ${meta.title ?? meta.slug} | ${meta.status ?? 'draft'} | ${profile} |`);
37
+ }
38
+ let out = INDEX_HEADER;
39
+ out += '| Слаг | Дата | Title | Статус | Профиль |\n| ---- | ---- | ----- | ------ | ------- |\n';
40
+ out += rows.length > 0 ? rows.join('\n') + '\n' : '(пока нет папок фич)\n';
41
+ if (waves.length > 0)
42
+ out += '\n## Волны\n\n' + waves.join('\n') + '\n';
43
+ // Части (спека §4-A4): подпапки design/ и plan/ с файлами-частями получают _index.md.
44
+ for (const folder of folders) {
45
+ for (const sub of ['design', 'plan']) {
46
+ const subDir = join(devDir, folder, sub);
47
+ if (!(await deps.fs.exists(subDir)))
48
+ continue;
49
+ const parts = (await deps.fs.listFiles(subDir)).filter((f) => f.endsWith('.md') && f !== '_index.md').sort();
50
+ if (parts.length === 0)
51
+ continue;
52
+ writes.set(join(subDir, '_index.md'), ['<!-- wolf:generated parts index -->', '', `# ${sub} — части`, '', ...parts.map((f) => `- ${f}`), ''].join('\n'));
53
+ }
54
+ }
55
+ const indexPath = join(devDir, 'INDEX.md');
56
+ const existingIndex = await deps.fs.readFile(indexPath);
57
+ const allIdentical = existingIndex === out &&
58
+ (await Promise.all([...writes].map(async ([p, c]) => (await deps.fs.readFile(p)) === c))).every(Boolean);
59
+ if (allIdentical)
60
+ return { action: 'unchanged' };
61
+ await deps.fs.writeFile(indexPath, out);
62
+ for (const [p, c] of writes) {
63
+ if ((await deps.fs.readFile(p)) !== c)
64
+ await deps.fs.writeFile(p, c);
65
+ }
66
+ return { action: 'written' };
67
+ }
68
+ //# sourceMappingURL=sync-artifact-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-artifact-index.js","sourceRoot":"","sources":["../../../src/app/use-cases/sync-artifact-index.ts"],"names":[],"mappings":"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"}