mister-wolf 2.22.0 → 2.23.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 +3 -3
- package/README.ru.md +1 -1
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +6 -0
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/usage.d.ts +3 -0
- package/dist/adapters/cli/commands/usage.d.ts.map +1 -0
- package/dist/adapters/cli/commands/usage.js +103 -0
- package/dist/adapters/cli/commands/usage.js.map +1 -0
- package/dist/adapters/fs/opencode-usage-db.d.ts +12 -0
- package/dist/adapters/fs/opencode-usage-db.d.ts.map +1 -0
- package/dist/adapters/fs/opencode-usage-db.js +116 -0
- package/dist/adapters/fs/opencode-usage-db.js.map +1 -0
- package/dist/app/use-cases/gitignore-block.d.ts +2 -2
- package/dist/app/use-cases/gitignore-block.d.ts.map +1 -1
- package/dist/app/use-cases/gitignore-block.js +3 -3
- package/dist/app/use-cases/gitignore-block.js.map +1 -1
- package/dist/app/use-cases/import-usage.d.ts +17 -0
- package/dist/app/use-cases/import-usage.d.ts.map +1 -0
- package/dist/app/use-cases/import-usage.js +69 -0
- package/dist/app/use-cases/import-usage.js.map +1 -0
- package/dist/app/use-cases/usage-signal.d.ts +91 -0
- package/dist/app/use-cases/usage-signal.d.ts.map +1 -0
- package/dist/app/use-cases/usage-signal.js +169 -0
- package/dist/app/use-cases/usage-signal.js.map +1 -0
- package/package.json +3 -3
- package/templates/base/skills/finishing-a-development-branch/SKILL.md +2 -0
- package/templates/base/skills/using-git-worktrees/SKILL.md +2 -0
- package/templates/base/skills/using-skills/SKILL.md +1 -0
- package/templates/base/skills/wolf-git/SKILL.md +54 -0
- package/templates/base/skills/wolf-git/reference/git-collaboration-policy-v1.1.md +553 -0
- package/templates/base/skills/wolf-handoff/SKILL.md +2 -0
- package/templates/base/skills/wolf-release-docs/SKILL.md +107 -0
- package/update-map.json +24 -9
- package/templates/.wolf/router.log +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { SignalEvent } from '../../adapters/fs/session-metrics-log.js';
|
|
2
|
+
/** Один завершённый/незавершённый assistant-turn из источника. */
|
|
3
|
+
export interface UsageTurn {
|
|
4
|
+
/** session_message.id */
|
|
5
|
+
messageId: string;
|
|
6
|
+
/** session_message.session_id */
|
|
7
|
+
sessionId: string;
|
|
8
|
+
seq: number | null;
|
|
9
|
+
/** data.time.created */
|
|
10
|
+
createdMs: number | null;
|
|
11
|
+
/** data.time.completed (streamed не считается завершением) */
|
|
12
|
+
completedMs: number | null;
|
|
13
|
+
/** data.agent */
|
|
14
|
+
agent: string | null;
|
|
15
|
+
/** data.model.id */
|
|
16
|
+
modelId: string | null;
|
|
17
|
+
/** data.model.providerID */
|
|
18
|
+
providerId: string | null;
|
|
19
|
+
tokens: {
|
|
20
|
+
input: number;
|
|
21
|
+
output: number;
|
|
22
|
+
cacheRead: number;
|
|
23
|
+
} | null;
|
|
24
|
+
/** data.tokens.reasoning — не входит в output. */
|
|
25
|
+
reasoning: number | null;
|
|
26
|
+
/** data.tokens.cache.write — не входит в cache_read. */
|
|
27
|
+
cacheWrite: number | null;
|
|
28
|
+
/** data.finish */
|
|
29
|
+
finish: 'stop' | 'tool-calls' | 'error' | null;
|
|
30
|
+
/** data.retry.attempt */
|
|
31
|
+
attempt: number | null;
|
|
32
|
+
}
|
|
33
|
+
/** Метаданные run (сессии источника). */
|
|
34
|
+
export interface UsageRun {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
/** session_v2.parent_id */
|
|
37
|
+
parentSessionId: string | null;
|
|
38
|
+
agent: string | null;
|
|
39
|
+
modelId: string | null;
|
|
40
|
+
providerId: string | null;
|
|
41
|
+
createdMs: number | null;
|
|
42
|
+
/** session_v2.time_busy */
|
|
43
|
+
busyMs: number | null;
|
|
44
|
+
}
|
|
45
|
+
export interface RunSummary {
|
|
46
|
+
runId: string;
|
|
47
|
+
sessionId: string;
|
|
48
|
+
traceId: string | null;
|
|
49
|
+
taskId: string | null;
|
|
50
|
+
/** null = неизвестно */
|
|
51
|
+
attempts: number[] | null;
|
|
52
|
+
/** `${providerId}/${modelId}` или modelId */
|
|
53
|
+
model: string | null;
|
|
54
|
+
agent: string | null;
|
|
55
|
+
/** null = неизвестно */
|
|
56
|
+
tokens: {
|
|
57
|
+
input: number;
|
|
58
|
+
output: number;
|
|
59
|
+
cacheRead: number;
|
|
60
|
+
} | null;
|
|
61
|
+
/** сумма duration_ms импортированных turn'ов */
|
|
62
|
+
generationMs: number | null;
|
|
63
|
+
busyMs: number | null;
|
|
64
|
+
events: number;
|
|
65
|
+
outcomes: {
|
|
66
|
+
ok: number;
|
|
67
|
+
error: number;
|
|
68
|
+
unknown: number;
|
|
69
|
+
};
|
|
70
|
+
/** имена недоступных полей */
|
|
71
|
+
unknowns: string[];
|
|
72
|
+
}
|
|
73
|
+
export declare const USAGE_SOURCE_LIMITATIONS: readonly string[];
|
|
74
|
+
/** Детерминированный id события: sha256("opencode-usage:v1|"+messageId), первые 32 hex. */
|
|
75
|
+
export declare function usageEventId(messageId: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* null — turn не завершён (нет completedMs) или нет session_id; иначе событие run.
|
|
78
|
+
*/
|
|
79
|
+
export declare function signalFromTurn(turn: UsageTurn, ctx?: {
|
|
80
|
+
taskId?: string | null;
|
|
81
|
+
traceId?: string | null;
|
|
82
|
+
sessionModel?: {
|
|
83
|
+
id: string;
|
|
84
|
+
providerID: string;
|
|
85
|
+
} | null;
|
|
86
|
+
/** session_v2.agent — fallback, когда у turn агент не записан (design §Маппинг). */
|
|
87
|
+
sessionAgent?: string | null;
|
|
88
|
+
}): SignalEvent | null;
|
|
89
|
+
/** Агрегация по run_id; порядок — по возрастанию первого ts. */
|
|
90
|
+
export declare function summarizeRuns(events: SignalEvent[], runs: UsageRun[]): RunSummary[];
|
|
91
|
+
//# sourceMappingURL=usage-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-signal.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/usage-signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A1.1: чистый маппинг записи usage-источника (assistant-turn OpenCode 2.2.5) в
|
|
3
|
+
* событие `run` существующей схемы SignalEvent и агрегация run-итогов.
|
|
4
|
+
* Пишутся только поля SignalEventSchema (ADR-6): схема памяти не расширяется.
|
|
5
|
+
* Дизайн: docs/dev/2026-10-31-a1-1-measurements/design.md.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
export const USAGE_SOURCE_LIMITATIONS = [
|
|
9
|
+
'model variant is not carried over (no field in the signal schema)',
|
|
10
|
+
'reasoning and cache.write have undocumented semantics and are not added to output/cache_read or weighted',
|
|
11
|
+
'cost is not computed (the source has no pricing table)',
|
|
12
|
+
'task_id comes only from an explicit session-to-task map',
|
|
13
|
+
'attempt exists only when the source recorded a retry',
|
|
14
|
+
'duration_ms is turn wall-clock time, not answer length',
|
|
15
|
+
'unfinished turns (no completed timestamp) are not imported',
|
|
16
|
+
'an empty event set means unknown coverage, not zero usage',
|
|
17
|
+
];
|
|
18
|
+
/** Детерминированный id события: sha256("opencode-usage:v1|"+messageId), первые 32 hex. */
|
|
19
|
+
export function usageEventId(messageId) {
|
|
20
|
+
return createHash('sha256').update(`opencode-usage:v1|${messageId}`).digest('hex').slice(0, 32);
|
|
21
|
+
}
|
|
22
|
+
function modelRef(id, providerId) {
|
|
23
|
+
if (!id)
|
|
24
|
+
return null;
|
|
25
|
+
return providerId ? `${providerId}/${id}` : id;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* null — turn не завершён (нет completedMs) или нет session_id; иначе событие run.
|
|
29
|
+
*/
|
|
30
|
+
export function signalFromTurn(turn, ctx) {
|
|
31
|
+
const { completedMs, createdMs } = turn;
|
|
32
|
+
if (completedMs == null || !turn.sessionId)
|
|
33
|
+
return null;
|
|
34
|
+
const agent = turn.agent || ctx?.sessionAgent || null;
|
|
35
|
+
const modelId = modelRef(turn.modelId, turn.providerId) ?? modelRef(ctx?.sessionModel?.id, ctx?.sessionModel?.providerID);
|
|
36
|
+
const event = {
|
|
37
|
+
ts: new Date(completedMs).toISOString(),
|
|
38
|
+
event: 'run',
|
|
39
|
+
schema_version: 2,
|
|
40
|
+
session_id: turn.sessionId,
|
|
41
|
+
run_id: turn.sessionId,
|
|
42
|
+
event_id: usageEventId(turn.messageId),
|
|
43
|
+
gen_ai: { modelID: modelId, agent },
|
|
44
|
+
orchestration: { task: null, actor: agent ? `agent:${agent}` : 'opencode:unknown' },
|
|
45
|
+
};
|
|
46
|
+
if (ctx?.traceId)
|
|
47
|
+
event.trace_id = ctx.traceId;
|
|
48
|
+
if (ctx?.taskId)
|
|
49
|
+
event.task_id = ctx.taskId;
|
|
50
|
+
if (turn.attempt != null)
|
|
51
|
+
event.attempt = turn.attempt;
|
|
52
|
+
if (turn.tokens) {
|
|
53
|
+
const { input, output, cacheRead } = turn.tokens;
|
|
54
|
+
event.tokens = { input, output, cache_read: cacheRead };
|
|
55
|
+
event.weighted = input + 0.1 * cacheRead + 5 * output;
|
|
56
|
+
}
|
|
57
|
+
if (createdMs != null && completedMs - createdMs >= 0) {
|
|
58
|
+
event.duration_ms = completedMs - createdMs;
|
|
59
|
+
}
|
|
60
|
+
if (turn.finish === 'stop' || turn.finish === 'tool-calls')
|
|
61
|
+
event.outcome = 'ok';
|
|
62
|
+
else if (turn.finish === 'error')
|
|
63
|
+
event.outcome = 'error';
|
|
64
|
+
return event;
|
|
65
|
+
}
|
|
66
|
+
/** Агрегация по run_id; порядок — по возрастанию первого ts. */
|
|
67
|
+
export function summarizeRuns(events, runs) {
|
|
68
|
+
const runById = new Map();
|
|
69
|
+
for (const run of runs)
|
|
70
|
+
runById.set(run.sessionId, run);
|
|
71
|
+
const groups = new Map();
|
|
72
|
+
for (const ev of events) {
|
|
73
|
+
const runId = ev.run_id ?? ev.session_id;
|
|
74
|
+
if (!runId)
|
|
75
|
+
continue;
|
|
76
|
+
const group = groups.get(runId);
|
|
77
|
+
if (group)
|
|
78
|
+
group.push(ev);
|
|
79
|
+
else
|
|
80
|
+
groups.set(runId, [ev]);
|
|
81
|
+
}
|
|
82
|
+
for (const run of runs) {
|
|
83
|
+
if (!groups.has(run.sessionId))
|
|
84
|
+
groups.set(run.sessionId, []);
|
|
85
|
+
}
|
|
86
|
+
const ordered = [];
|
|
87
|
+
for (const [runId, group] of groups) {
|
|
88
|
+
const run = runById.get(runId);
|
|
89
|
+
ordered.push({
|
|
90
|
+
ts: group[0]?.ts ?? (run?.createdMs != null ? new Date(run.createdMs).toISOString() : ''),
|
|
91
|
+
summary: summarizeRun(runId, group, run),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
ordered.sort((a, b) => (a.ts === b.ts ? a.summary.runId.localeCompare(b.summary.runId) : a.ts.localeCompare(b.ts)));
|
|
95
|
+
return ordered.map((entry) => entry.summary);
|
|
96
|
+
}
|
|
97
|
+
function summarizeRun(runId, group, run) {
|
|
98
|
+
const unknowns = [];
|
|
99
|
+
const firstString = (pick) => {
|
|
100
|
+
for (const ev of group) {
|
|
101
|
+
const value = pick(ev);
|
|
102
|
+
if (typeof value === 'string' && value !== '')
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
};
|
|
107
|
+
const taskIds = new Set();
|
|
108
|
+
for (const ev of group) {
|
|
109
|
+
if (typeof ev.task_id === 'string' && ev.task_id !== '')
|
|
110
|
+
taskIds.add(ev.task_id);
|
|
111
|
+
}
|
|
112
|
+
const taskId = taskIds.size === 1 ? ([...taskIds][0] ?? null) : null;
|
|
113
|
+
if (!taskId)
|
|
114
|
+
unknowns.push('task-unknown');
|
|
115
|
+
const attemptSet = new Set();
|
|
116
|
+
for (const ev of group) {
|
|
117
|
+
if (typeof ev.attempt === 'number')
|
|
118
|
+
attemptSet.add(ev.attempt);
|
|
119
|
+
}
|
|
120
|
+
const attempts = [...attemptSet].sort((a, b) => a - b);
|
|
121
|
+
if (attempts.length === 0)
|
|
122
|
+
unknowns.push('attempt-unknown');
|
|
123
|
+
let tokens = null;
|
|
124
|
+
for (const ev of group) {
|
|
125
|
+
if (!ev.tokens)
|
|
126
|
+
continue;
|
|
127
|
+
tokens = tokens ?? { input: 0, output: 0, cacheRead: 0 };
|
|
128
|
+
tokens.input += ev.tokens.input;
|
|
129
|
+
tokens.output += ev.tokens.output;
|
|
130
|
+
tokens.cacheRead += ev.tokens.cache_read;
|
|
131
|
+
}
|
|
132
|
+
if (!tokens)
|
|
133
|
+
unknowns.push('tokens-unknown');
|
|
134
|
+
let generationMs = null;
|
|
135
|
+
for (const ev of group) {
|
|
136
|
+
if (typeof ev.duration_ms !== 'number')
|
|
137
|
+
continue;
|
|
138
|
+
generationMs = (generationMs ?? 0) + ev.duration_ms;
|
|
139
|
+
}
|
|
140
|
+
if (generationMs === null)
|
|
141
|
+
unknowns.push('duration-unknown');
|
|
142
|
+
const outcomes = { ok: 0, error: 0, unknown: 0 };
|
|
143
|
+
for (const ev of group) {
|
|
144
|
+
if (ev.outcome === 'ok')
|
|
145
|
+
outcomes.ok += 1;
|
|
146
|
+
else if (ev.outcome === 'error')
|
|
147
|
+
outcomes.error += 1;
|
|
148
|
+
else
|
|
149
|
+
outcomes.unknown += 1;
|
|
150
|
+
}
|
|
151
|
+
if (group.length === 0)
|
|
152
|
+
unknowns.push('no-events');
|
|
153
|
+
return {
|
|
154
|
+
runId,
|
|
155
|
+
sessionId: firstString((ev) => ev.session_id) ?? run?.sessionId ?? runId,
|
|
156
|
+
traceId: firstString((ev) => ev.trace_id),
|
|
157
|
+
taskId,
|
|
158
|
+
attempts: attempts.length > 0 ? attempts : null,
|
|
159
|
+
model: firstString((ev) => ev.gen_ai.modelID),
|
|
160
|
+
agent: firstString((ev) => ev.gen_ai.agent),
|
|
161
|
+
tokens,
|
|
162
|
+
generationMs,
|
|
163
|
+
busyMs: run?.busyMs ?? null,
|
|
164
|
+
events: group.length,
|
|
165
|
+
outcomes,
|
|
166
|
+
unknowns,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=usage-signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-signal.js","sourceRoot":"","sources":["../../../src/app/use-cases/usage-signal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mister-wolf",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.23.0",
|
|
4
4
|
"description": "Local-first project memory for AI coding agents: decisions, lessons, tools and processes that outlive the session",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"update-map.json"
|
|
29
29
|
],
|
|
30
30
|
"scripts": {
|
|
31
|
-
"build": "tsc",
|
|
31
|
+
"build": "rm -rf dist && tsc",
|
|
32
32
|
"dev": "tsc --watch",
|
|
33
33
|
"test": "vitest",
|
|
34
34
|
"test:run": "vitest run",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"bench:tokens": "node --disable-warning=ExperimentalWarning scripts/bench-tokens.mjs",
|
|
42
42
|
"check": "node scripts/check-english-surface.mjs && npm run format:check && npm run lint && npm run build && npm run test:run",
|
|
43
43
|
"docs:dev": "vitepress dev docs/site",
|
|
44
|
-
"docs:build": "node scripts/generate-cli-reference.mjs && node scripts/sync-changelog.mjs && vitepress build docs/site",
|
|
44
|
+
"docs:build": "node scripts/generate-cli-reference.mjs && node scripts/generate-cli-site-page.mjs && node scripts/sync-changelog.mjs && vitepress build docs/site",
|
|
45
45
|
"docs:preview": "vitepress preview docs/site"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
@@ -12,6 +12,8 @@ L1 проверяет выполненный scope, ACCEPTANCE и текущие
|
|
|
12
12
|
Загрузи полный текст назначенной методики до её выполнения. Обязательные пункты отслеживай в доступном трекере или рабочем брифе; не добавляй новые статусы памяти. Недоступное действие передай ответственному уровню.
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
Уборка и завершение — гейт G9 по `wolf-git` и §15 регламента.
|
|
16
|
+
|
|
15
17
|
## Предусловия
|
|
16
18
|
|
|
17
19
|
Ответственный — L1 с действующими правами. Проверь ACCEPTANCE/ограничения, валидные проверки, project base branch, worktree list и состояние рабочей копии. Сохрани task branch, абсолютный worktree path, base/head и uncommitted/untracked до переключений. Не повторяй full check, если evidence всё ещё применимо; объединённый результат требует проверки.
|
|
@@ -12,6 +12,8 @@ L0 поручает подготовку L1; L2 получает готовую
|
|
|
12
12
|
Загрузи полный текст назначенной методики до её выполнения. Обязательные пункты отслеживай в доступном трекере или рабочем брифе; не добавляй новые статусы памяти. Недоступное действие передай ответственному уровню.
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
Git-этапы задачи ведутся по `wolf-git`; baseline и ownership ниже не меняются.
|
|
16
|
+
|
|
15
17
|
## Владелец
|
|
16
18
|
|
|
17
19
|
Создание, настройка и git-операции — L1 либо разрешённая исполнительская роль. L2 получает готовые cwd, branch и allowlist. Следуй профилю проекта; local .worktrees/<task> — рекомендуемый fallback, не универсальный запрет других путей.
|
|
@@ -64,6 +64,7 @@ wolf-debug: один осмысленный обход в scope, затем FRIC
|
|
|
64
64
|
| Утверждённый план, входы сверены | L1: wolf-sdd; разрешённая исполнительская роль без диспетчеризации: wolf-execute |
|
|
65
65
|
| Баг, падение проверки, неожиданное поведение | wolf-debug до исправления; реализация нового поведения/фикса — test-driven-development |
|
|
66
66
|
| Требуется изоляция записи | using-git-worktrees перед изменениями |
|
|
67
|
+
| Git-граница задачи: вход/возобновление, ветка, checkpoint, передача, завершение | wolf-git |
|
|
67
68
|
| Ревью документов / ревью кода | wolf-review / requesting-code-review; обработка замечаний — receiving-code-review |
|
|
68
69
|
| «Готово», «исправлено», «проверено» | verification-before-completion до утверждения; затем согласованный finishing-a-development-branch |
|
|
69
70
|
| Смена сессии, исполнителя или восстановление | wolf-handoff |
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wolf-git
|
|
3
|
+
description: "Применять на Git-этапах задачи: вход/возобновление, ветка или worktree, checkpoint, передача, завершение и уборка; также при отказе git, требующем force, и при неподтверждённой актуальности."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Git-этапы задачи
|
|
7
|
+
|
|
8
|
+
Регламент: `reference/git-collaboration-policy-v1.1.md` рядом с этим файлом (в проекте `.opencode/skills/wolf-git/reference/git-collaboration-policy-v1.1.md`). Читать только нужный § регламента по этапу; весь файл в контекст не тянуть.
|
|
9
|
+
|
|
10
|
+
## Обязательный вход
|
|
11
|
+
|
|
12
|
+
Полномочия берутся из брифа задачи; скилл прав не выдаёт. Нет полномочия на коммит/публикацию — сохраняет назначенный L1 (§3). Спутники: `using-git-worktrees`, `wolf-handoff`, `finishing-a-development-branch`.
|
|
13
|
+
|
|
14
|
+
## Вход / возобновление (G0)
|
|
15
|
+
|
|
16
|
+
§6: `git rev-parse --show-toplevel`, `git remote -v`, `git worktree list --porcelain`, `git status --porcelain`, `git rev-parse HEAD`, `git ls-remote` с временем наблюдения; незавершённые merge/rebase/cherry-pick; владелец, baseline, сравнение с опубликованной ветвью и целью MR. Нет remote/сети — «не удалось проверить», не успех (§6.5). Локальный `main` впереди или разошёлся — не push и не reset (§6.2).
|
|
17
|
+
|
|
18
|
+
## Создание ветки и worktree (G1)
|
|
19
|
+
|
|
20
|
+
§7, §4.1: задача, владелец, цель MR, явный baseline SHA (не текущий HEAD). Независимая задача — от проверенного SHA `main`, подзадача — от идентифицированного SHA родителя (для передачи на другой хост он должен быть опубликован). Уникальное имя, безопасный путь; чужой непустой каталог не перезаписывается; сначала ищется существующая ветка/worktree продолжения (§15.3).
|
|
21
|
+
|
|
22
|
+
## Сохранение (checkpoint)
|
|
23
|
+
|
|
24
|
+
§8: обязателен на логической границе, перед остановкой или передачей, перед операцией, затрагивающей незакоммиченное, и перед предъявлением. Перед коммитом — просмотр diff и известный набор файлов; `git add -A` из неизвестного состояния запрещён. Секреты не публикуются. Коммит ≠ публикация.
|
|
25
|
+
|
|
26
|
+
## Передача (G2)
|
|
27
|
+
|
|
28
|
+
§9: остановить прежнюю запись, сохранить и опубликовать при доступном remote; передать задачу/владельца, repo/branch/target, baseline и опубликованный SHA, рабочую копию, состояние, проверки, следующий шаг. Получатель подтверждает вход; без подтверждения передача не завершена, таймаут не доказывает остановку записи.
|
|
29
|
+
|
|
30
|
+
## Завершение и уборка (G9)
|
|
31
|
+
|
|
32
|
+
§15: остановить писателей; подтвердить судьбу результата — ancestry исходного SHA (`git merge-base --is-ancestor`) либо запись MR при разрешённом squash; проверить незавершённые операции, dirty, коммиты после принятого SHA, ценные ignored-файлы, нужность потомкам. Чистый `git status` не доказывает безопасность удаления. Запрещены по умолчанию `--force`, `reset --hard`, `clean` с удалением неизвестного, `branch -D`; при неподтверждённой сохранности каталог остаётся.
|
|
33
|
+
|
|
34
|
+
## Приёмка, интеграция и выпуск
|
|
35
|
+
|
|
36
|
+
§10, §16, §22: стандарт — merge `--no-ff`; squash — только явное исключение. В Wolf это не автоматизировано.
|
|
37
|
+
|
|
38
|
+
## Что не поставлено
|
|
39
|
+
|
|
40
|
+
Нет MR-статусов и адаптера хостинга, CI-проверок, очереди интеграции (§11), тегов/registry/выпуска, структурного read-only `git inspect` и JSON-вердикта (B0.5/B1), scheduler и постоянного контролёра. Гейты G3–G8 не автоматизированы и не являются поставленным гейтом: при необходимости их выполняют люди вручную. Отсутствующее не называть доступной командой.
|
|
41
|
+
|
|
42
|
+
## Гейт перехода
|
|
43
|
+
|
|
44
|
+
Подтверждено лишь то, что проверено командой с временем и результатом. «Не удалось проверить» ≠ пройдено; неизвестное состояние не считается чистым.
|
|
45
|
+
|
|
46
|
+
## Не пропускай процесс
|
|
47
|
+
|
|
48
|
+
| Мысль | Действие |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| «Создам от текущего HEAD» | Выбери baseline SHA явно. |
|
|
51
|
+
| «PR готов — уберу worktree» | Сохранность не доказана (§15.1). |
|
|
52
|
+
| «Git отказал — добавлю --force» | Разбери причину, не усиливай. |
|
|
53
|
+
| «Заметка Wolf доказывает Git-состояние» | Память не факт Git; проверь команды. |
|
|
54
|
+
| «Передача вроде сделана» | Нужно подтверждение получателя (§9). |
|