mister-wolf 2.30.0 → 2.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +10 -0
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/council.d.ts +9 -0
- package/dist/adapters/cli/commands/council.d.ts.map +1 -0
- package/dist/adapters/cli/commands/council.js +65 -0
- package/dist/adapters/cli/commands/council.js.map +1 -0
- package/dist/adapters/cli/commands/memory-add.d.ts +2 -0
- package/dist/adapters/cli/commands/memory-add.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-add.js +2 -0
- package/dist/adapters/cli/commands/memory-add.js.map +1 -1
- package/dist/adapters/cli/commands/memory-complain.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-complain.js +5 -1
- package/dist/adapters/cli/commands/memory-complain.js.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.js +4 -0
- package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
- package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-upgrade.js +1 -41
- package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
- package/dist/adapters/cli/removed-commands.d.ts.map +1 -1
- package/dist/adapters/cli/removed-commands.js +0 -1
- package/dist/adapters/cli/removed-commands.js.map +1 -1
- package/dist/adapters/cli/report-renderer.d.ts +7 -0
- package/dist/adapters/cli/report-renderer.d.ts.map +1 -1
- package/dist/adapters/cli/report-renderer.js +17 -3
- package/dist/adapters/cli/report-renderer.js.map +1 -1
- package/dist/adapters/cli/type-command-generator.d.ts.map +1 -1
- package/dist/adapters/cli/type-command-generator.js +2 -0
- package/dist/adapters/cli/type-command-generator.js.map +1 -1
- package/dist/adapters/fs/document-id.d.ts.map +1 -1
- package/dist/adapters/fs/document-id.js +42 -2
- package/dist/adapters/fs/document-id.js.map +1 -1
- package/dist/adapters/fs/hash-id-generator.d.ts +8 -3
- package/dist/adapters/fs/hash-id-generator.d.ts.map +1 -1
- package/dist/adapters/fs/hash-id-generator.js +16 -50
- package/dist/adapters/fs/hash-id-generator.js.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.d.ts +1 -0
- package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.js +3 -0
- package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
- package/dist/adapters/mcp/mcp-tools.d.ts +3 -2
- package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-tools.js +48 -3
- package/dist/adapters/mcp/mcp-tools.js.map +1 -1
- package/dist/adapters/platforms/opencode-adapter.js +6 -2
- package/dist/adapters/platforms/opencode-adapter.js.map +1 -1
- package/dist/app/use-cases/add-memory-object.d.ts +8 -0
- package/dist/app/use-cases/add-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/add-memory-object.js +28 -7
- package/dist/app/use-cases/add-memory-object.js.map +1 -1
- package/dist/app/use-cases/build-analytics.d.ts +8 -0
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +100 -35
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/council-normalizer.d.ts +34 -0
- package/dist/app/use-cases/council-normalizer.d.ts.map +1 -0
- package/dist/app/use-cases/council-normalizer.js +71 -0
- package/dist/app/use-cases/council-normalizer.js.map +1 -0
- package/dist/app/use-cases/create-memory-repair-request.d.ts +1 -0
- package/dist/app/use-cases/create-memory-repair-request.d.ts.map +1 -1
- package/dist/app/use-cases/create-memory-repair-request.js +1 -1
- package/dist/app/use-cases/create-memory-repair-request.js.map +1 -1
- package/dist/app/use-cases/create-mutation-record.d.ts +2 -0
- package/dist/app/use-cases/create-mutation-record.d.ts.map +1 -1
- package/dist/app/use-cases/create-mutation-record.js +1 -1
- package/dist/app/use-cases/create-mutation-record.js.map +1 -1
- package/dist/app/use-cases/face-operation.d.ts.map +1 -1
- package/dist/app/use-cases/face-operation.js +17 -1
- package/dist/app/use-cases/face-operation.js.map +1 -1
- package/dist/app/use-cases/init-project.d.ts +1 -1
- package/dist/app/use-cases/init-project.d.ts.map +1 -1
- package/dist/app/use-cases/init-project.js +1 -0
- package/dist/app/use-cases/init-project.js.map +1 -1
- package/dist/app/use-cases/lint-artifacts.d.ts.map +1 -1
- package/dist/app/use-cases/lint-artifacts.js +41 -0
- package/dist/app/use-cases/lint-artifacts.js.map +1 -1
- package/dist/app/use-cases/record-council.d.ts +104 -0
- package/dist/app/use-cases/record-council.d.ts.map +1 -0
- package/dist/app/use-cases/record-council.js +379 -0
- package/dist/app/use-cases/record-council.js.map +1 -0
- package/dist/app/use-cases/save-proposal.d.ts.map +1 -1
- package/dist/app/use-cases/save-proposal.js +2 -0
- package/dist/app/use-cases/save-proposal.js.map +1 -1
- package/dist/app/use-cases/scaffold-artifact.d.ts +12 -0
- package/dist/app/use-cases/scaffold-artifact.d.ts.map +1 -1
- package/dist/app/use-cases/scaffold-artifact.js +55 -8
- package/dist/app/use-cases/scaffold-artifact.js.map +1 -1
- package/dist/app/use-cases/summarize-session.d.ts.map +1 -1
- package/dist/app/use-cases/summarize-session.js +2 -0
- package/dist/app/use-cases/summarize-session.js.map +1 -1
- package/dist/app/use-cases/supersede-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/supersede-memory-object.js +4 -2
- package/dist/app/use-cases/supersede-memory-object.js.map +1 -1
- package/dist/app/use-cases/thinking.d.ts +4 -2
- package/dist/app/use-cases/thinking.d.ts.map +1 -1
- package/dist/app/use-cases/thinking.js +2 -2
- package/dist/app/use-cases/thinking.js.map +1 -1
- package/dist/app/use-cases/upgrade-projects.d.ts +3 -0
- package/dist/app/use-cases/upgrade-projects.d.ts.map +1 -1
- package/dist/app/use-cases/upgrade-projects.js +45 -31
- package/dist/app/use-cases/upgrade-projects.js.map +1 -1
- package/dist/domain/memory-slug.d.ts +17 -0
- package/dist/domain/memory-slug.d.ts.map +1 -0
- package/dist/domain/memory-slug.js +39 -0
- package/dist/domain/memory-slug.js.map +1 -0
- package/dist/ports/id-generator.port.d.ts +4 -1
- package/dist/ports/id-generator.port.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/base/AGENTS.md +4 -2
- package/templates/base/agents/executor-lead.md +14 -15
- package/templates/base/agents/mr-wolf.md +7 -7
- package/templates/base/agents/worker-expert.md +70 -0
- package/templates/base/agents/worker-reviewer.md +6 -0
- package/templates/base/playbooks/worker-expert-playbook.md +17 -0
- package/templates/base/skills/using-skills/references/agent-language.md +16 -5
- package/templates/base/skills/using-skills/references/context-and-memory.md +3 -2
- package/templates/base/skills/using-skills/references/contracts.md +26 -1
- package/templates/base/skills/using-skills/references/project-rules.md +13 -6
- package/templates/base/skills/using-skills/references/routes-execution.md +4 -0
- package/templates/base/skills/using-skills/references/routes-intent.md +5 -0
- package/templates/base/skills/using-skills/references/routes-quality.md +4 -0
- package/templates/base/skills/wolf-brainstorm/SKILL.md +14 -33
- package/templates/base/skills/wolf-council/SKILL.md +117 -0
- package/templates/base/skills/wolf-debug/SKILL.md +3 -2
- package/templates/base/skills/wolf-feedback/references/complaints.md +1 -1
- package/templates/base/skills/wolf-plan/SKILL.md +1 -1
- package/templates/base/skills/wolf-review/SKILL.md +17 -2
- package/templates/base/skills/wolf-sdd/SKILL.md +1 -1
- package/templates/opencode/plugins/wolf-session-start.js +1 -1
- package/update-map.json +30 -14
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// src/app/use-cases/record-council.ts
|
|
2
|
+
// REL-231-A P04/REQ-09 (AC-A3, design 2026-11-05-council §4): доменная операция
|
|
3
|
+
// записи council envelope (question/opinion/synthesis) поверх штатного note-пути:
|
|
4
|
+
// addMemoryObject (тот же governance/event/index), строгая схема envelope
|
|
5
|
+
// (эквивалент additionalProperties:false), канонический JSON body,
|
|
6
|
+
// question_revision = sha256 от canonical JSON вопроса, идемпотентность
|
|
7
|
+
// request_key, recovery недостающих рёбер после частичного сбоя (сбой между
|
|
8
|
+
// note и relations). Прецеденты: deps-паттерн — create-mutation-record.ts;
|
|
9
|
+
// рёбра — record-relation.ts (прямое + обратное, дедуп subject+predicate+object).
|
|
10
|
+
// Lock: если deps.lock передан — берём один раз здесь; в addMemoryObject/recordRelation
|
|
11
|
+
// не пробрасываем (FsMemoryLock не реентерабелен, комментарий create-mutation-record).
|
|
12
|
+
import { createHash } from 'crypto';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { addMemoryObject } from './add-memory-object.js';
|
|
15
|
+
import { recordRelation } from './record-relation.js';
|
|
16
|
+
import { UserFacingError } from '../../domain/errors.js';
|
|
17
|
+
const COUNCIL_TAG = 'wolf:council-record:v1';
|
|
18
|
+
export const MAX_BODY_BYTES = 256 * 1024;
|
|
19
|
+
// --- Строгая схема envelope (D-W3-1: ручная zod-схема здесь, не FieldSpec в memory-types) ---
|
|
20
|
+
const nonEmpty = z.string().min(1);
|
|
21
|
+
const nonEmptyStrings = z.array(nonEmpty);
|
|
22
|
+
const SourceRefSchema = z.strictObject({
|
|
23
|
+
ref: nonEmpty,
|
|
24
|
+
revision: nonEmpty,
|
|
25
|
+
});
|
|
26
|
+
// A9/F-02: хотя бы одно непустое memory_id или path; quote ≤ 200, note ≤ 500
|
|
27
|
+
const EvidenceRefSchema = z
|
|
28
|
+
.strictObject({
|
|
29
|
+
memory_id: nonEmpty.optional(),
|
|
30
|
+
path: nonEmpty.optional(),
|
|
31
|
+
quote: z.string().max(200).optional(),
|
|
32
|
+
note: z.string().max(500).optional(),
|
|
33
|
+
})
|
|
34
|
+
.refine((data) => Boolean((data.memory_id && data.memory_id.trim().length > 0) || (data.path && data.path.trim().length > 0)), { message: 'EvidenceRef must contain at least one non-empty field: memory_id or path' });
|
|
35
|
+
const RejectedAlternativeSchema = z.strictObject({
|
|
36
|
+
claim: nonEmpty,
|
|
37
|
+
reason: nonEmpty,
|
|
38
|
+
});
|
|
39
|
+
const QuestionPayloadSchema = z.strictObject({
|
|
40
|
+
question: nonEmpty,
|
|
41
|
+
decision_owner: nonEmpty,
|
|
42
|
+
sources: z.array(SourceRefSchema).optional(),
|
|
43
|
+
lenses: nonEmptyStrings.optional(),
|
|
44
|
+
budget: nonEmpty.optional(),
|
|
45
|
+
constraints: nonEmptyStrings.optional(),
|
|
46
|
+
});
|
|
47
|
+
const OpinionPayloadSchema = z.strictObject({
|
|
48
|
+
expert_id: nonEmpty,
|
|
49
|
+
round: z.number().int().min(1),
|
|
50
|
+
claims: nonEmptyStrings.min(1),
|
|
51
|
+
evidence: z.array(EvidenceRefSchema).optional(),
|
|
52
|
+
assumptions: nonEmptyStrings.optional(),
|
|
53
|
+
confidence: z.enum(['low', 'medium', 'high']),
|
|
54
|
+
risks: nonEmptyStrings.optional(),
|
|
55
|
+
failure_conditions: nonEmptyStrings.optional(),
|
|
56
|
+
counterexamples: nonEmptyStrings.optional(),
|
|
57
|
+
recommendation: nonEmpty.optional(),
|
|
58
|
+
});
|
|
59
|
+
const SynthesisPayloadSchema = z
|
|
60
|
+
.strictObject({
|
|
61
|
+
outcome: z.enum(['ready', 'insufficient_evidence']),
|
|
62
|
+
opinion_ids: nonEmptyStrings,
|
|
63
|
+
accepted_claims: nonEmptyStrings,
|
|
64
|
+
rejected_alternatives: z.array(RejectedAlternativeSchema).optional(),
|
|
65
|
+
unresolved_dissent: nonEmptyStrings,
|
|
66
|
+
required_validation: nonEmptyStrings,
|
|
67
|
+
confidence: z.enum(['low', 'medium', 'high']),
|
|
68
|
+
actual_participants: nonEmptyStrings.min(1),
|
|
69
|
+
missing_participants: nonEmptyStrings.optional(),
|
|
70
|
+
cost_note: nonEmpty.optional(),
|
|
71
|
+
isolation_limits: nonEmptyStrings.optional(),
|
|
72
|
+
})
|
|
73
|
+
.superRefine((payload, ctx) => {
|
|
74
|
+
if (payload.outcome === 'ready' && payload.accepted_claims.length === 0) {
|
|
75
|
+
ctx.addIssue({
|
|
76
|
+
code: 'custom',
|
|
77
|
+
path: ['accepted_claims'],
|
|
78
|
+
message: 'accepted_claims must be non-empty when outcome is "ready"',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (payload.outcome === 'insufficient_evidence') {
|
|
82
|
+
if (payload.unresolved_dissent.length === 0) {
|
|
83
|
+
ctx.addIssue({
|
|
84
|
+
code: 'custom',
|
|
85
|
+
path: ['unresolved_dissent'],
|
|
86
|
+
message: 'outcome "insufficient_evidence" requires an explanation in unresolved_dissent',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (payload.required_validation.length === 0) {
|
|
90
|
+
ctx.addIssue({
|
|
91
|
+
code: 'custom',
|
|
92
|
+
path: ['required_validation'],
|
|
93
|
+
message: 'outcome "insufficient_evidence" requires non-empty required_validation',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const envelopeBase = {
|
|
99
|
+
schema_version: z.literal(1),
|
|
100
|
+
request_key: nonEmpty,
|
|
101
|
+
task_id: nonEmpty,
|
|
102
|
+
};
|
|
103
|
+
const QuestionEnvelopeSchema = z.strictObject({
|
|
104
|
+
...envelopeBase,
|
|
105
|
+
record_kind: z.literal('question'),
|
|
106
|
+
payload: QuestionPayloadSchema,
|
|
107
|
+
});
|
|
108
|
+
const OpinionEnvelopeSchema = z.strictObject({
|
|
109
|
+
...envelopeBase,
|
|
110
|
+
record_kind: z.literal('opinion'),
|
|
111
|
+
question_id: nonEmpty,
|
|
112
|
+
question_revision: nonEmpty,
|
|
113
|
+
payload: OpinionPayloadSchema,
|
|
114
|
+
});
|
|
115
|
+
const SynthesisEnvelopeSchema = z.strictObject({
|
|
116
|
+
...envelopeBase,
|
|
117
|
+
record_kind: z.literal('synthesis'),
|
|
118
|
+
question_id: nonEmpty,
|
|
119
|
+
question_revision: nonEmpty,
|
|
120
|
+
payload: SynthesisPayloadSchema,
|
|
121
|
+
});
|
|
122
|
+
function envelopeSchemaFor(kind) {
|
|
123
|
+
if (kind === 'question')
|
|
124
|
+
return QuestionEnvelopeSchema;
|
|
125
|
+
if (kind === 'opinion')
|
|
126
|
+
return OpinionEnvelopeSchema;
|
|
127
|
+
if (kind === 'synthesis')
|
|
128
|
+
return SynthesisEnvelopeSchema;
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
/** Строгая валидация envelope; любая ошибка — UserFacingError (до любых записей). */
|
|
132
|
+
function parseEnvelope(raw) {
|
|
133
|
+
const kind = raw?.record_kind;
|
|
134
|
+
const schema = envelopeSchemaFor(kind);
|
|
135
|
+
if (!schema) {
|
|
136
|
+
throw new UserFacingError(`Invalid council envelope: record_kind must be one of "question" | "opinion" | "synthesis" (got ${JSON.stringify(kind)})`);
|
|
137
|
+
}
|
|
138
|
+
const result = schema.safeParse(raw);
|
|
139
|
+
if (!result.success) {
|
|
140
|
+
throw new UserFacingError(`Invalid council envelope: ${result.error.issues
|
|
141
|
+
.map((issue) => `${issue.path.join('.') || '<root>'}: ${issue.message}`)
|
|
142
|
+
.join('; ')}`);
|
|
143
|
+
}
|
|
144
|
+
return result.data;
|
|
145
|
+
}
|
|
146
|
+
/** Терпеливый разбор чужих note (для поиска по request_key/дайджеста): битые пропускаем. */
|
|
147
|
+
function tryParseEnvelope(raw) {
|
|
148
|
+
const schema = envelopeSchemaFor(raw?.record_kind);
|
|
149
|
+
if (!schema)
|
|
150
|
+
return null;
|
|
151
|
+
const result = schema.safeParse(raw);
|
|
152
|
+
return result.success ? result.data : null;
|
|
153
|
+
}
|
|
154
|
+
// --- Канонизация и дайджест (байт-в-байт как в тестах W1) ---
|
|
155
|
+
/** Канонический JSON (stable stringify): рекурсивная сортировка ключей, без пробелов. */
|
|
156
|
+
function canonicalJson(value) {
|
|
157
|
+
const walk = (v) => {
|
|
158
|
+
if (Array.isArray(v))
|
|
159
|
+
return v.map(walk);
|
|
160
|
+
if (v !== null && typeof v === 'object') {
|
|
161
|
+
const src = v;
|
|
162
|
+
const out = {};
|
|
163
|
+
for (const key of Object.keys(src).sort())
|
|
164
|
+
out[key] = walk(src[key]);
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
return v;
|
|
168
|
+
};
|
|
169
|
+
return JSON.stringify(walk(value));
|
|
170
|
+
}
|
|
171
|
+
/** Семантика 2: question_revision = sha256-hex от canonical JSON
|
|
172
|
+
* {schema_version, record_kind:'question', task_id, payload} вопроса. */
|
|
173
|
+
function questionDigest(envelope) {
|
|
174
|
+
return createHash('sha256')
|
|
175
|
+
.update(canonicalJson({
|
|
176
|
+
schema_version: envelope.schema_version,
|
|
177
|
+
record_kind: 'question',
|
|
178
|
+
task_id: envelope.task_id,
|
|
179
|
+
payload: envelope.payload,
|
|
180
|
+
}), 'utf8')
|
|
181
|
+
.digest('hex');
|
|
182
|
+
}
|
|
183
|
+
function titleFor(envelope) {
|
|
184
|
+
if (envelope.record_kind === 'question')
|
|
185
|
+
return `[council] question: ${envelope.task_id}`;
|
|
186
|
+
if (envelope.record_kind === 'opinion') {
|
|
187
|
+
return `[council] opinion ${envelope.payload.expert_id} r${envelope.payload.round}: ${envelope.task_id}`;
|
|
188
|
+
}
|
|
189
|
+
return `[council] synthesis ${envelope.payload.outcome}: ${envelope.task_id}`;
|
|
190
|
+
}
|
|
191
|
+
/** Контракт §6: opinion → answers → question; synthesis → based_on → question и каждое opinion. */
|
|
192
|
+
function requiredEdges(envelope, noteId) {
|
|
193
|
+
if (envelope.record_kind === 'opinion') {
|
|
194
|
+
return [{ subject: noteId, predicate: 'answers', object: envelope.question_id }];
|
|
195
|
+
}
|
|
196
|
+
if (envelope.record_kind === 'synthesis') {
|
|
197
|
+
return [
|
|
198
|
+
{ subject: noteId, predicate: 'based_on', object: envelope.question_id },
|
|
199
|
+
...envelope.payload.opinion_ids.map((opinionId) => ({
|
|
200
|
+
subject: noteId,
|
|
201
|
+
predicate: 'based_on',
|
|
202
|
+
object: opinionId,
|
|
203
|
+
})),
|
|
204
|
+
];
|
|
205
|
+
}
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
// --- Чтение существующих council-записей (только note с тегом wolf:council-record:v1) ---
|
|
209
|
+
async function councilNotes(deps) {
|
|
210
|
+
const notes = await deps.store.list({ type: 'note' });
|
|
211
|
+
const found = [];
|
|
212
|
+
for (const note of notes) {
|
|
213
|
+
if (!note.tags.includes(COUNCIL_TAG))
|
|
214
|
+
continue;
|
|
215
|
+
let raw;
|
|
216
|
+
try {
|
|
217
|
+
raw = JSON.parse(note.body);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
continue; // чужой/битый body — не council-контракт
|
|
221
|
+
}
|
|
222
|
+
const env = tryParseEnvelope(raw);
|
|
223
|
+
if (env)
|
|
224
|
+
found.push({ id: note.id, env });
|
|
225
|
+
}
|
|
226
|
+
return found;
|
|
227
|
+
}
|
|
228
|
+
/** Семантика 2: opinion/synthesis ссылаются на существующую валидную question-запись. */
|
|
229
|
+
async function loadQuestion(deps, questionId) {
|
|
230
|
+
const note = await deps.store.get(questionId);
|
|
231
|
+
if (!note) {
|
|
232
|
+
throw new UserFacingError(`council question "${questionId}" not found (dangling question_id)`);
|
|
233
|
+
}
|
|
234
|
+
if (!note.tags.includes(COUNCIL_TAG)) {
|
|
235
|
+
throw new UserFacingError(`memory "${questionId}" is not a council record (missing tag "${COUNCIL_TAG}")`);
|
|
236
|
+
}
|
|
237
|
+
let raw;
|
|
238
|
+
try {
|
|
239
|
+
raw = JSON.parse(note.body);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
throw new UserFacingError(`council question "${questionId}" has unreadable body`);
|
|
243
|
+
}
|
|
244
|
+
const env = tryParseEnvelope(raw);
|
|
245
|
+
if (!env || env.record_kind !== 'question') {
|
|
246
|
+
throw new UserFacingError(`memory "${questionId}" is not a council question record`);
|
|
247
|
+
}
|
|
248
|
+
return env;
|
|
249
|
+
}
|
|
250
|
+
/** Семантика 6: opinion_ids существуют и принадлежат этому же question. */
|
|
251
|
+
async function assertOpinionsBelong(deps, envelope) {
|
|
252
|
+
for (const opinionId of envelope.payload.opinion_ids) {
|
|
253
|
+
const note = await deps.store.get(opinionId);
|
|
254
|
+
if (!note || !note.tags.includes(COUNCIL_TAG)) {
|
|
255
|
+
throw new UserFacingError(`council opinion "${opinionId}" not found (referenced from synthesis opinion_ids)`);
|
|
256
|
+
}
|
|
257
|
+
let raw;
|
|
258
|
+
try {
|
|
259
|
+
raw = JSON.parse(note.body);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
raw = null;
|
|
263
|
+
}
|
|
264
|
+
const env = raw === null ? null : tryParseEnvelope(raw);
|
|
265
|
+
if (!env || env.record_kind !== 'opinion') {
|
|
266
|
+
throw new UserFacingError(`memory "${opinionId}" is not a council opinion record`);
|
|
267
|
+
}
|
|
268
|
+
if (env.question_id !== envelope.question_id) {
|
|
269
|
+
throw new UserFacingError(`council opinion "${opinionId}" belongs to question "${env.question_id}", not "${envelope.question_id}"`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** Семантика 6: дубль expert_id+round на тот же question под другим request_key — отказ. */
|
|
274
|
+
async function assertNoExpertRoundDup(deps, envelope) {
|
|
275
|
+
const others = await councilNotes(deps);
|
|
276
|
+
for (const { env } of others) {
|
|
277
|
+
if (env.record_kind !== 'opinion')
|
|
278
|
+
continue;
|
|
279
|
+
if (env.request_key === envelope.request_key)
|
|
280
|
+
continue; // тот же ключ — идемпотентность, не дубль
|
|
281
|
+
if (env.question_id !== envelope.question_id)
|
|
282
|
+
continue;
|
|
283
|
+
if (env.payload.expert_id === envelope.payload.expert_id && env.payload.round === envelope.payload.round) {
|
|
284
|
+
throw new UserFacingError(`opinion of expert "${envelope.payload.expert_id}" round ${envelope.payload.round} already recorded for question "${envelope.question_id}" (request_key "${env.request_key}")`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async function edgeExists(deps, edge) {
|
|
289
|
+
const listed = await deps.relations.list({ subject: edge.subject, predicate: edge.predicate, object: edge.object });
|
|
290
|
+
return listed.some((relation) => relation.subject === edge.subject && relation.predicate === edge.predicate && relation.object === edge.object);
|
|
291
|
+
}
|
|
292
|
+
async function appendEdge(deps, edge) {
|
|
293
|
+
// recordRelation кладёт прямое и обратное ребро (проектная конвенция);
|
|
294
|
+
// дедуп перед вызовом — здесь (subject+predicate+object)
|
|
295
|
+
await recordRelation({ relations: deps.relations, idGen: deps.idGen }, deps.clock.now(), edge.subject, edge.predicate, edge.object, 'agent');
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Запись council envelope как note (facet context, тег wolf:council-record:v1,
|
|
299
|
+
* body = canonical JSON envelope) + relations. Идемпотентна по request_key;
|
|
300
|
+
* после частичного сбоя (note есть, рёбер нет) дописывает только недостающие
|
|
301
|
+
* рёбра без повторного memory.added. Валидация и лимиты — до любых записей
|
|
302
|
+
* (отказ атомарен: ни note, ни event, ни ребра).
|
|
303
|
+
*/
|
|
304
|
+
export async function recordCouncil(deps, input) {
|
|
305
|
+
const envelope = parseEnvelope(input.envelope);
|
|
306
|
+
const body = canonicalJson(envelope);
|
|
307
|
+
// Семантика 5: лимит 256 KiB на вход и на итоговый body
|
|
308
|
+
const inputBytes = Buffer.byteLength(JSON.stringify(input.envelope), 'utf8');
|
|
309
|
+
if (inputBytes > MAX_BODY_BYTES) {
|
|
310
|
+
throw new UserFacingError(`council envelope exceeds 256 KiB limit (${inputBytes} bytes after stringify)`);
|
|
311
|
+
}
|
|
312
|
+
const bodyBytes = Buffer.byteLength(body, 'utf8');
|
|
313
|
+
if (bodyBytes > MAX_BODY_BYTES) {
|
|
314
|
+
throw new UserFacingError(`council record body exceeds 256 KiB limit (${bodyBytes} bytes)`);
|
|
315
|
+
}
|
|
316
|
+
const core = async () => {
|
|
317
|
+
// Перекрёстная валидация (только чтение) — до любых записей
|
|
318
|
+
if (envelope.record_kind !== 'question') {
|
|
319
|
+
const question = await loadQuestion(deps, envelope.question_id);
|
|
320
|
+
const digest = questionDigest(question);
|
|
321
|
+
if (digest !== envelope.question_revision) {
|
|
322
|
+
throw new UserFacingError(`question_revision mismatch for question "${envelope.question_id}": expected ${digest}, got ${envelope.question_revision}`);
|
|
323
|
+
}
|
|
324
|
+
if (envelope.record_kind === 'synthesis') {
|
|
325
|
+
await assertOpinionsBelong(deps, envelope);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Идемпотентность/recovery: существующий note с этим request_key
|
|
329
|
+
const notes = await councilNotes(deps);
|
|
330
|
+
const existing = notes.find(({ env }) => env.request_key === envelope.request_key);
|
|
331
|
+
if (existing) {
|
|
332
|
+
if (existing.env && canonicalJson(existing.env) !== body) {
|
|
333
|
+
throw new UserFacingError(`request_key "${envelope.request_key}" is already recorded with a different payload (council conflict)`);
|
|
334
|
+
}
|
|
335
|
+
const edges = requiredEdges(envelope, existing.id);
|
|
336
|
+
const missing = [];
|
|
337
|
+
for (const edge of edges) {
|
|
338
|
+
if (!(await edgeExists(deps, edge)))
|
|
339
|
+
missing.push(edge);
|
|
340
|
+
}
|
|
341
|
+
for (const edge of missing) {
|
|
342
|
+
await appendEdge(deps, edge);
|
|
343
|
+
}
|
|
344
|
+
return { memoryId: existing.id, created: false, recovered: missing.length > 0 };
|
|
345
|
+
}
|
|
346
|
+
if (envelope.record_kind === 'opinion') {
|
|
347
|
+
await assertNoExpertRoundDup(deps, envelope);
|
|
348
|
+
}
|
|
349
|
+
// Запись через штатный путь (governance/event/index); lock не пробрасываем —
|
|
350
|
+
// он уже удержан этим вызовом (не реентерабелен)
|
|
351
|
+
const addDeps = {
|
|
352
|
+
store: deps.store,
|
|
353
|
+
log: deps.log,
|
|
354
|
+
clock: deps.clock,
|
|
355
|
+
idGen: deps.idGen,
|
|
356
|
+
...(deps.index ? { index: deps.index } : {}),
|
|
357
|
+
};
|
|
358
|
+
const { object } = await addMemoryObject(addDeps, {
|
|
359
|
+
type: 'note',
|
|
360
|
+
facet: 'context',
|
|
361
|
+
title: titleFor(envelope),
|
|
362
|
+
// 2.32.0: два разных совета с одинаковым заголовком-вопросом — разные записи
|
|
363
|
+
idFingerprint: `${titleFor(envelope)}\u0000${body}`,
|
|
364
|
+
body,
|
|
365
|
+
createdBy: input.createdBy,
|
|
366
|
+
tags: [COUNCIL_TAG],
|
|
367
|
+
// W8/F3: вопрос открыт до закрытия синтезом — симметрия с legacy
|
|
368
|
+
// council-question defaultStatus 'open'; статус — поле note, не входит
|
|
369
|
+
// в canonical body/question_revision (идемпотентность не меняется)
|
|
370
|
+
...(envelope.record_kind === 'question' ? { status: 'open' } : {}),
|
|
371
|
+
});
|
|
372
|
+
for (const edge of requiredEdges(envelope, object.id)) {
|
|
373
|
+
await appendEdge(deps, edge);
|
|
374
|
+
}
|
|
375
|
+
return { memoryId: object.id, created: true, recovered: false };
|
|
376
|
+
};
|
|
377
|
+
return deps.lock ? deps.lock.withLock(core) : core();
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=record-council.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-council.js","sourceRoot":"","sources":["../../../src/app/use-cases/record-council.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-proposal.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/save-proposal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAI5E;;;;;mFAKmF;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG;IAC1C,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"save-proposal.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/save-proposal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAI5E;;;;;mFAKmF;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG;IAC1C,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiC5G"}
|
|
@@ -16,6 +16,8 @@ export async function saveProposal(deps, input) {
|
|
|
16
16
|
}, {
|
|
17
17
|
type: 'note',
|
|
18
18
|
title: input.title ?? `Proposal to ${input.addressee}: ${shortChange}`,
|
|
19
|
+
// 2.32.0: одинаковый клип заголовка не делает предложения одним и тем же
|
|
20
|
+
idFingerprint: [input.addressee, input.proposedChange, input.expectedBenefit ?? ''].join('\u0000'),
|
|
19
21
|
body: input.body,
|
|
20
22
|
createdBy,
|
|
21
23
|
facet: 'proposal',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-proposal.js","sourceRoot":"","sources":["../../../src/app/use-cases/save-proposal.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA6CzD,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,kDAAkD;AAEnE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB,EAAE,KAAwB;IACjF,2EAA2E;IAC3E,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,WAAW,GACf,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IACxG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CACtC;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,EACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,eAAe,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;QACtE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS;QACT,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,eAAe,EAAE,KAAK,CAAC,cAAc;YACrC,gBAAgB,EAAE,KAAK,CAAC,eAAe;YACvC,oBAAoB,EAAE,KAAK,CAAC,mBAAmB;SAChD;KACF,CACF,CAAC;IACF,OAAO,MAAwB,CAAC;AAClC,CAAC"}
|
|
1
|
+
{"version":3,"file":"save-proposal.js","sourceRoot":"","sources":["../../../src/app/use-cases/save-proposal.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA6CzD,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,kDAAkD;AAEnE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB,EAAE,KAAwB;IACjF,2EAA2E;IAC3E,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,WAAW,GACf,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IACxG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CACtC;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,EACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,eAAe,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;QACtE,yEAAyE;QACzE,aAAa,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClG,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS;QACT,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,eAAe,EAAE,KAAK,CAAC,cAAc;YACrC,gBAAgB,EAAE,KAAK,CAAC,eAAe;YACvC,oBAAoB,EAAE,KAAK,CAAC,mBAAmB;SAChD;KACF,CACF,CAAC;IACF,OAAO,MAAwB,CAAC;AAClC,CAAC"}
|
|
@@ -16,10 +16,22 @@ export interface ScaffoldArtifactInput {
|
|
|
16
16
|
}
|
|
17
17
|
export interface ScaffoldArtifactResult {
|
|
18
18
|
dir: string;
|
|
19
|
+
/** Файлы, созданные этим запуском (при top-up — только недостающие). */
|
|
19
20
|
files: string[];
|
|
21
|
+
/** Файлы, которые уже были на месте: никогда не перезаписываются (Q4). */
|
|
22
|
+
existing: string[];
|
|
23
|
+
/** true — пакет уже полон, добавлять было нечего. */
|
|
24
|
+
complete: boolean;
|
|
20
25
|
}
|
|
21
26
|
/** Анатомия §4.1 спеки — дословно (7 секций + анатомия записи REQ/NFR). */
|
|
22
27
|
export declare function requirementsTemplate(slug: string, title: string, created: string, fix: boolean): string;
|
|
28
|
+
/** 2.32.0 (Q5): pre-requirements — первый документ пакета. Фиксирует намерение и
|
|
29
|
+
* рамку до формальных требований; не заменяет requirements и не утверждает их. */
|
|
30
|
+
export declare function preRequirementsTemplate(slug: string, title: string, created: string): string;
|
|
31
|
+
/** 2.32.0 (Q5): change-request.md — запросы на изменение пакета. Отдельный
|
|
32
|
+
* документ ≠ раздел «Журнал изменений (CR)» в requirements.md (тот журнал
|
|
33
|
+
* описывает изменения самих требований). */
|
|
34
|
+
export declare function changeRequestTemplate(slug: string, title: string, created: string): string;
|
|
23
35
|
export declare function designTemplate(slug: string, title: string, created: string): string;
|
|
24
36
|
export declare function planTemplate(slug: string, title: string, created: string): string;
|
|
25
37
|
export declare function testPlanTemplate(slug: string, title: string, created: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-artifact.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB;;yDAEqD;IACrD,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold-artifact.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB;;yDAEqD;IACrD,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;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;mFACmF;AACnF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB5F;AAED;;6CAE6C;AAC7C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc1F;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,CAmCjC"}
|
|
@@ -65,6 +65,47 @@ export function requirementsTemplate(slug, title, created, fix) {
|
|
|
65
65
|
'',
|
|
66
66
|
].join('\n');
|
|
67
67
|
}
|
|
68
|
+
/** 2.32.0 (Q5): pre-requirements — первый документ пакета. Фиксирует намерение и
|
|
69
|
+
* рамку до формальных требований; не заменяет requirements и не утверждает их. */
|
|
70
|
+
export function preRequirementsTemplate(slug, title, created) {
|
|
71
|
+
return [
|
|
72
|
+
frontMatter(slug, `${title} — pre-requirements`, created),
|
|
73
|
+
`# ${title} — pre-requirements`,
|
|
74
|
+
'',
|
|
75
|
+
'<!-- Итог обсуждения до требований: зачем, что уже решено, что открыто. Не утверждает требования. -->',
|
|
76
|
+
'',
|
|
77
|
+
'## 1. Намерение и польза',
|
|
78
|
+
'<!-- Что хотим получить и какую проблему это решает; словами владельца, без решения. -->',
|
|
79
|
+
'',
|
|
80
|
+
'## 2. Рамка и ключевые решения',
|
|
81
|
+
'<!-- Согласованная рамка: границы, принятые решения, источники (тред/жалоба/ревью). -->',
|
|
82
|
+
'',
|
|
83
|
+
'## 3. Открытые вопросы',
|
|
84
|
+
'<!-- Что ещё не решено; у каждого — кому адресован и что блокирует. -->',
|
|
85
|
+
'',
|
|
86
|
+
'## 4. Что дальше',
|
|
87
|
+
'<!-- Переход к требованиям: что фиксируем как REQ/NFR, какие документы появятся. -->',
|
|
88
|
+
'',
|
|
89
|
+
].join('\n');
|
|
90
|
+
}
|
|
91
|
+
/** 2.32.0 (Q5): change-request.md — запросы на изменение пакета. Отдельный
|
|
92
|
+
* документ ≠ раздел «Журнал изменений (CR)» в requirements.md (тот журнал
|
|
93
|
+
* описывает изменения самих требований). */
|
|
94
|
+
export function changeRequestTemplate(slug, title, created) {
|
|
95
|
+
return [
|
|
96
|
+
frontMatter(slug, `${title} — запросы на изменение`, created),
|
|
97
|
+
`# ${title} — запросы на изменение (CR)`,
|
|
98
|
+
'',
|
|
99
|
+
'<!-- Append-only: новые записи вниз, старые не редактируются. Один CR — одно изменение пакета. -->',
|
|
100
|
+
'<!-- Поток: замечание → change-request → pre-requirements/requirements → design → test-plan → plan. -->',
|
|
101
|
+
'<!-- Номер локален для пакета: CR-<YYYY-MM-DD>-NN (NN — порядковый номер внутри дня). -->',
|
|
102
|
+
'',
|
|
103
|
+
'## Запросы',
|
|
104
|
+
'',
|
|
105
|
+
`- CR-${created}-01: <что и почему> — затронуто: <REQ/NFR или "нет">; утвердил: <кто>; downstream: <артефакты или "нет">`,
|
|
106
|
+
'',
|
|
107
|
+
].join('\n');
|
|
108
|
+
}
|
|
68
109
|
export function designTemplate(slug, title, created) {
|
|
69
110
|
return [
|
|
70
111
|
frontMatter(slug, `${title} — дизайн`, created),
|
|
@@ -128,28 +169,34 @@ export async function scaffoldArtifact(deps, input) {
|
|
|
128
169
|
}
|
|
129
170
|
const now = deps.clock.now();
|
|
130
171
|
const created = now.toISOString().slice(0, 10);
|
|
172
|
+
const folder = `${created}-${input.slug}`;
|
|
131
173
|
// REQ-05 AC-3: guard до любой записи — без claim запись отклоняется в use-case
|
|
132
|
-
deps.claims.requireClaim(`dev:${
|
|
133
|
-
const dir = join(deps.baseDir, 'docs', 'dev',
|
|
134
|
-
// Уникальность имён — машина, не дисциплина: отказ ДО любых записей (спека §4-A1).
|
|
135
|
-
if (await deps.fs.exists(dir)) {
|
|
136
|
-
throw new UserFacingError(`Artifact folder already exists: ${dir}`);
|
|
137
|
-
}
|
|
174
|
+
deps.claims.requireClaim(`dev:${folder}`);
|
|
175
|
+
const dir = join(deps.baseDir, 'docs', 'dev', folder);
|
|
138
176
|
const templates = {
|
|
177
|
+
'pre-requirements.md': preRequirementsTemplate(input.slug, input.slug, created),
|
|
139
178
|
'requirements.md': requirementsTemplate(input.slug, input.slug, created, input.fix),
|
|
179
|
+
'change-request.md': changeRequestTemplate(input.slug, input.slug, created),
|
|
140
180
|
'design.md': designTemplate(input.slug, input.slug, created),
|
|
141
181
|
'plan.md': planTemplate(input.slug, input.slug, created),
|
|
142
182
|
'test-plan.md': testPlanTemplate(input.slug, input.slug, created),
|
|
143
183
|
};
|
|
184
|
+
// Q4 (a): top-up. Папка могла появиться из brainstorm (pre-requirements.md);
|
|
185
|
+
// существующие документы не перезаписываются ни при каких условиях.
|
|
144
186
|
const names = input.fix
|
|
145
187
|
? ['requirements.md', 'plan.md']
|
|
146
|
-
: ['requirements.md', '
|
|
188
|
+
: ['pre-requirements.md', 'requirements.md', 'change-request.md', 'design.md', 'test-plan.md', 'plan.md'];
|
|
147
189
|
const written = [];
|
|
190
|
+
const existing = [];
|
|
148
191
|
for (const name of names) {
|
|
149
192
|
const p = join(dir, name);
|
|
193
|
+
if (await deps.fs.exists(p)) {
|
|
194
|
+
existing.push(p);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
150
197
|
await deps.fs.writeFile(p, templates[name]);
|
|
151
198
|
written.push(p);
|
|
152
199
|
}
|
|
153
|
-
return { dir, files: written };
|
|
200
|
+
return { dir, files: written, existing, complete: written.length === 0 };
|
|
154
201
|
}
|
|
155
202
|
//# sourceMappingURL=scaffold-artifact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,OAAO,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/scaffold-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize-session.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/summarize-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAmB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAKhF,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CACzC;AAWD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,EACrH,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"summarize-session.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/summarize-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAmB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAKhF,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CACzC;AAWD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,EACrH,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAgDxC"}
|
|
@@ -39,6 +39,8 @@ export async function summarizeSession(deps, input) {
|
|
|
39
39
|
type: 'note',
|
|
40
40
|
facet: 'history',
|
|
41
41
|
title,
|
|
42
|
+
// 2.32.0: два wrap-up в одну минуту — разные записи; id различается телом
|
|
43
|
+
idFingerprint: `${title}\u0000${body}`,
|
|
42
44
|
body,
|
|
43
45
|
createdBy: input.createdBy,
|
|
44
46
|
tags,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize-session.js","sourceRoot":"","sources":["../../../src/app/use-cases/summarize-session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"summarize-session.js","sourceRoot":"","sources":["../../../src/app/use-cases/summarize-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supersede-memory-object.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/supersede-memory-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"supersede-memory-object.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/supersede-memory-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAU7D,wBAAsB,qBAAqB,CACzC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,EACrH,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|