mister-wolf 2.26.0 → 2.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -195
- package/README.ru.md +33 -224
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +11 -0
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/git-inspect.d.ts +7 -0
- package/dist/adapters/cli/commands/git-inspect.d.ts.map +1 -0
- package/dist/adapters/cli/commands/git-inspect.js +20 -0
- package/dist/adapters/cli/commands/git-inspect.js.map +1 -0
- package/dist/adapters/fs/session-metrics-log.js +1 -1
- package/dist/app/use-cases/git-inspect.d.ts +105 -0
- package/dist/app/use-cases/git-inspect.d.ts.map +1 -0
- package/dist/app/use-cases/git-inspect.js +359 -0
- package/dist/app/use-cases/git-inspect.js.map +1 -0
- package/package.json +4 -3
- package/templates/base/skills/wolf-git/SKILL.md +3 -1
- package/update-map.json +7 -7
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
|
+
/** NFR-02: сетевое ls-remote ограничено 10 с, после чего remote недоступен. */
|
|
5
|
+
export const LS_REMOTE_TIMEOUT_MS = 10_000;
|
|
6
|
+
/** NFR-01: встроенные учётные данные (user:token@) замещаются целиком — ни логина, ни токена в выводе. */
|
|
7
|
+
export function sanitizeGitUrl(url) {
|
|
8
|
+
return url
|
|
9
|
+
.replace(/(^[a-zA-Z][a-zA-Z0-9+.-]*:\/\/)[^/@\s]+@/, '$1***@')
|
|
10
|
+
.replace(/(^|[\s/])([^/@\s:]+):([^/@\s]+)@/, '$1***@'); // scp-синтаксис user:token@host:path
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Вердикт/reasons/actions по таблице решений design (порядок строк — сверху
|
|
14
|
+
* вниз, первое сработавшее определяет вердикт). Чистая функция — тестируется
|
|
15
|
+
* без git.
|
|
16
|
+
*/
|
|
17
|
+
export function computeVerdict(facts) {
|
|
18
|
+
const { local_vs_remote: lvr, freshness_of_remote_observation: freshness } = facts;
|
|
19
|
+
// строка 1: не репозиторий / git-команда упала
|
|
20
|
+
if (facts.collection_error !== null) {
|
|
21
|
+
return {
|
|
22
|
+
verdict: 'UNKNOWN',
|
|
23
|
+
reasons: [facts.collection_error],
|
|
24
|
+
allowed_next_actions: ['verify the working directory is a git repository'],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const reasons = [];
|
|
28
|
+
const actions = [];
|
|
29
|
+
const upstreamMissing = lvr.relation === 'no-remote' || lvr.relation === 'no-upstream';
|
|
30
|
+
// по одной причине на выполненную проверку (REQ-02)
|
|
31
|
+
reasons.push(facts.dirty.value ? `dirty: ${facts.dirty.entries} uncommitted change(s)` : 'dirty: clean');
|
|
32
|
+
if (facts.dirty.value)
|
|
33
|
+
actions.push('commit or discard changes before handoff (if authorized)');
|
|
34
|
+
reasons.push(facts.unfinished_git_operation !== null
|
|
35
|
+
? `unfinished git operation: ${facts.unfinished_git_operation} in progress`
|
|
36
|
+
: 'unfinished git operation: none');
|
|
37
|
+
if (facts.unfinished_git_operation !== null) {
|
|
38
|
+
actions.push('complete or abort the unfinished git operation before handoff');
|
|
39
|
+
}
|
|
40
|
+
if (facts.baseline !== null) {
|
|
41
|
+
reasons.push(`baseline ${facts.baseline.sha}: ${facts.baseline.relationship}`);
|
|
42
|
+
if (facts.baseline.relationship === 'diverged') {
|
|
43
|
+
actions.push('reconcile baseline with head via rebase or merge (if authorized)');
|
|
44
|
+
}
|
|
45
|
+
if (facts.baseline.relationship === 'unresolved') {
|
|
46
|
+
actions.push('verify the baseline commit exists in this repository');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (lvr.upstream !== null && freshness.reachable === false) {
|
|
50
|
+
// строка 2: remote существует, но ls-remote недоступен
|
|
51
|
+
reasons.push(`remote unreachable: ls-remote failed for ${lvr.remote ?? 'remote'}`);
|
|
52
|
+
actions.push('verify network/remote access; do not assume clean');
|
|
53
|
+
}
|
|
54
|
+
else if (upstreamMissing && facts.target !== null) {
|
|
55
|
+
// вход --target требует remote-сравнения, а оно неприменимо
|
|
56
|
+
reasons.push(`remote comparison required by --target ${facts.target} but no upstream/remote is configured`);
|
|
57
|
+
actions.push('verify remote/upstream configuration');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
switch (lvr.relation) {
|
|
61
|
+
case 'no-remote':
|
|
62
|
+
reasons.push('remote comparison not applicable: no remote configured');
|
|
63
|
+
break;
|
|
64
|
+
case 'no-upstream':
|
|
65
|
+
reasons.push('remote comparison not applicable: no upstream branch');
|
|
66
|
+
break;
|
|
67
|
+
case 'in-sync':
|
|
68
|
+
reasons.push(`local vs remote: in sync with ${lvr.upstream}`);
|
|
69
|
+
break;
|
|
70
|
+
case 'ahead':
|
|
71
|
+
reasons.push(`unpublished commits present: ahead of ${lvr.upstream} by ${lvr.ahead}`);
|
|
72
|
+
break;
|
|
73
|
+
case 'behind':
|
|
74
|
+
reasons.push(`local vs remote: behind ${lvr.upstream} by ${lvr.behind}`);
|
|
75
|
+
break;
|
|
76
|
+
case 'diverged':
|
|
77
|
+
reasons.push(`local vs remote: diverged from ${lvr.upstream} (ahead ${lvr.ahead}, behind ${lvr.behind})`);
|
|
78
|
+
break;
|
|
79
|
+
case 'remote-ahead-unfetched':
|
|
80
|
+
reasons.push(`local vs remote: remote ${lvr.upstream} ahead with unfetched commits (count unknown)`);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (lvr.relation === 'diverged' || lvr.relation === 'behind' || lvr.relation === 'remote-ahead-unfetched') {
|
|
84
|
+
actions.push('sync with the remote before handoff (if authorized)');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// вердикт — строго по таблице design сверху вниз: unreachable-строка 2,
|
|
88
|
+
// затем violations (3–6), затем unknown-строки (baseline unresolved,
|
|
89
|
+
// target при отсутствующем remote), иначе PASS
|
|
90
|
+
let verdict;
|
|
91
|
+
if (lvr.upstream !== null && freshness.reachable === false)
|
|
92
|
+
verdict = 'UNKNOWN';
|
|
93
|
+
else if (facts.dirty.value)
|
|
94
|
+
verdict = 'VIOLATION';
|
|
95
|
+
else if (facts.unfinished_git_operation !== null)
|
|
96
|
+
verdict = 'VIOLATION';
|
|
97
|
+
else if (facts.baseline?.relationship === 'diverged')
|
|
98
|
+
verdict = 'VIOLATION';
|
|
99
|
+
else if (lvr.relation === 'diverged' || lvr.relation === 'behind' || lvr.relation === 'remote-ahead-unfetched') {
|
|
100
|
+
verdict = 'VIOLATION';
|
|
101
|
+
}
|
|
102
|
+
else if (facts.baseline?.relationship === 'unresolved')
|
|
103
|
+
verdict = 'UNKNOWN';
|
|
104
|
+
else if (upstreamMissing && facts.target !== null)
|
|
105
|
+
verdict = 'UNKNOWN';
|
|
106
|
+
else
|
|
107
|
+
verdict = 'PASS';
|
|
108
|
+
if (verdict === 'PASS') {
|
|
109
|
+
return {
|
|
110
|
+
verdict,
|
|
111
|
+
reasons,
|
|
112
|
+
allowed_next_actions: lvr.relation === 'ahead'
|
|
113
|
+
? ['publish if authorized']
|
|
114
|
+
: ['read-only observation complete; no git action required'],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return { verdict, reasons, allowed_next_actions: actions };
|
|
118
|
+
}
|
|
119
|
+
/** Сбор фактов: только читающие команды (design §Контракты). */
|
|
120
|
+
export async function collectGitFacts(deps, opts) {
|
|
121
|
+
const run = async (args, timeoutMs) => deps.runner(args, { cwd: opts.cwd, timeoutMs });
|
|
122
|
+
const emptyRemote = {
|
|
123
|
+
upstream: null,
|
|
124
|
+
remote: null,
|
|
125
|
+
relation: 'no-remote',
|
|
126
|
+
ahead: null,
|
|
127
|
+
behind: null,
|
|
128
|
+
remote_head: null,
|
|
129
|
+
};
|
|
130
|
+
const noFreshness = { observed_at: null, method: 'none', reachable: null };
|
|
131
|
+
const emptyFacts = (message) => ({
|
|
132
|
+
repository: { root: null, is_bare: null, origin_url_sanitized: null },
|
|
133
|
+
worktree: { path: null, kind: null },
|
|
134
|
+
branch: null,
|
|
135
|
+
head: null,
|
|
136
|
+
baseline: opts.baseline !== undefined ? { sha: opts.baseline, relationship: 'unresolved' } : null,
|
|
137
|
+
target: opts.target ?? null,
|
|
138
|
+
dirty: { value: false, entries: 0 },
|
|
139
|
+
unfinished_git_operation: null,
|
|
140
|
+
local_vs_remote: { ...emptyRemote },
|
|
141
|
+
branch_owner: opts.owner ?? null,
|
|
142
|
+
freshness_of_remote_observation: { ...noFreshness },
|
|
143
|
+
collection_error: message,
|
|
144
|
+
});
|
|
145
|
+
const gitDirRes = await run(['rev-parse', '--git-dir']);
|
|
146
|
+
if (gitDirRes.code !== 0)
|
|
147
|
+
return emptyFacts('not a git repository: git rev-parse --git-dir failed');
|
|
148
|
+
const gitDirRaw = gitDirRes.stdout.trim();
|
|
149
|
+
const gitDir = isAbsolute(gitDirRaw) ? gitDirRaw : resolve(opts.cwd, gitDirRaw);
|
|
150
|
+
const [toplevel, bareRes, headRes, branchRes, statusRes, worktreeRes, remoteRes] = await Promise.all([
|
|
151
|
+
run(['rev-parse', '--show-toplevel']),
|
|
152
|
+
run(['rev-parse', '--is-bare-repository']),
|
|
153
|
+
run(['rev-parse', 'HEAD']),
|
|
154
|
+
run(['branch', '--show-current']),
|
|
155
|
+
run(['status', '--porcelain']),
|
|
156
|
+
run(['worktree', 'list', '--porcelain']),
|
|
157
|
+
run(['remote', '-v']),
|
|
158
|
+
]);
|
|
159
|
+
const isBare = bareRes.code === 0 ? bareRes.stdout.trim() === 'true' : null;
|
|
160
|
+
const root = toplevel.code === 0 ? toplevel.stdout.trim() : isBare ? resolve(gitDir) : null;
|
|
161
|
+
const head = headRes.code === 0 ? headRes.stdout.trim() : null;
|
|
162
|
+
const branchRaw = branchRes.code === 0 ? branchRes.stdout.trim() : '';
|
|
163
|
+
const statusLines = statusRes.code === 0 ? statusRes.stdout.split('\n').filter((l) => l.trim() !== '') : [];
|
|
164
|
+
// kind: ищем cwd среди блоков worktree list (первый блок — main worktree);
|
|
165
|
+
// запасной признак linked — gitDir вида .git/worktrees/<name>
|
|
166
|
+
const worktreePaths = worktreeRes.code === 0
|
|
167
|
+
? worktreeRes.stdout
|
|
168
|
+
.split('\n')
|
|
169
|
+
.filter((l) => l.startsWith('worktree '))
|
|
170
|
+
.map((l) => resolve(l.slice('worktree '.length).trim()))
|
|
171
|
+
: [];
|
|
172
|
+
const worktreeIndex = worktreePaths.indexOf(resolve(opts.cwd));
|
|
173
|
+
const kind = worktreeIndex === 0
|
|
174
|
+
? 'main'
|
|
175
|
+
: worktreeIndex > 0
|
|
176
|
+
? 'linked'
|
|
177
|
+
: worktreeRes.code === 0
|
|
178
|
+
? resolve(gitDir).includes(`${join('.git', 'worktrees')}`)
|
|
179
|
+
? 'linked'
|
|
180
|
+
: 'main'
|
|
181
|
+
: null;
|
|
182
|
+
// origin URL (fetch-строка) с санитизацией учётных данных (NFR-01)
|
|
183
|
+
const remoteLines = remoteRes.code === 0 ? remoteRes.stdout.split('\n').filter((l) => l.includes('\t')) : [];
|
|
184
|
+
const originLine = remoteLines.find((l) => l.startsWith('origin\t') && l.endsWith('(fetch)')) ??
|
|
185
|
+
remoteLines.find((l) => l.endsWith('(fetch)'));
|
|
186
|
+
const originUrl = originLine !== undefined ? sanitizeGitUrl(originLine.split('\t')[1]?.replace(/\s+\(fetch\)$/, '') ?? '') : null;
|
|
187
|
+
const hasRemote = remoteLines.length > 0;
|
|
188
|
+
// незавершённые операции — служебные файлы в git-каталоге (порядок design)
|
|
189
|
+
const UNFINISHED = [
|
|
190
|
+
['MERGE_HEAD', 'merge'],
|
|
191
|
+
['rebase-merge', 'rebase'],
|
|
192
|
+
['rebase-apply', 'rebase'],
|
|
193
|
+
['CHERRY_PICK_HEAD', 'cherry-pick'],
|
|
194
|
+
['REVERT_HEAD', 'revert'],
|
|
195
|
+
];
|
|
196
|
+
let unfinished = null;
|
|
197
|
+
for (const [name, op] of UNFINISHED) {
|
|
198
|
+
if (deps.exists(join(gitDir, name))) {
|
|
199
|
+
unfinished = op;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// baseline — вход задачи; разрешаем SHA и сравниваем ancestry
|
|
204
|
+
let baseline = null;
|
|
205
|
+
if (opts.baseline !== undefined) {
|
|
206
|
+
const verify = await run(['rev-parse', '--verify', '--quiet', `${opts.baseline}^{commit}`]);
|
|
207
|
+
if (verify.code !== 0) {
|
|
208
|
+
baseline = { sha: opts.baseline, relationship: 'unresolved' };
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const resolved = verify.stdout.trim();
|
|
212
|
+
if (head !== null && resolved === head) {
|
|
213
|
+
baseline = { sha: resolved, relationship: 'equal' };
|
|
214
|
+
}
|
|
215
|
+
else if (head !== null) {
|
|
216
|
+
const ancestor = await run(['merge-base', '--is-ancestor', resolved, head]);
|
|
217
|
+
baseline = { sha: resolved, relationship: ancestor.code === 0 ? 'ancestor-of-head' : 'diverged' };
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
baseline = { sha: resolved, relationship: 'unresolved' };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// remote-наблюдение (ADR-2/ADR-4): живое ls-remote с таймаутом, без fetch
|
|
225
|
+
const upstreamRes = await run(['rev-parse', '--symbolic-full-name', '@{u}']);
|
|
226
|
+
const upstream = upstreamRes.code === 0 && upstreamRes.stdout.trim().startsWith('refs/remotes/') ? upstreamRes.stdout.trim() : null;
|
|
227
|
+
const branch = branchRaw !== '' ? branchRaw : null;
|
|
228
|
+
// Q-2: имя remote может содержать '/' — надёжный источник %(upstream:remotename);
|
|
229
|
+
// разбор upstream по первому '/' остаётся только запасной эвристикой
|
|
230
|
+
let remote = null;
|
|
231
|
+
if (upstream !== null && branch !== null) {
|
|
232
|
+
const nameRes = await run(['for-each-ref', '--format=%(upstream:remotename)', `refs/heads/${branch}`]);
|
|
233
|
+
const remoteName = nameRes.code === 0 ? nameRes.stdout.trim() : '';
|
|
234
|
+
remote = remoteName !== '' ? remoteName : (upstream.split('/')[2] ?? null);
|
|
235
|
+
}
|
|
236
|
+
let localVsRemote;
|
|
237
|
+
let freshness;
|
|
238
|
+
if (upstream === null) {
|
|
239
|
+
localVsRemote = { ...emptyRemote, relation: hasRemote ? 'no-upstream' : 'no-remote' };
|
|
240
|
+
freshness = { ...noFreshness };
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
const remotePrefix = remote !== null ? `refs/remotes/${remote}/` : null;
|
|
244
|
+
const remoteRef = remotePrefix !== null && upstream.startsWith(remotePrefix)
|
|
245
|
+
? `refs/heads/${upstream.slice(remotePrefix.length)}`
|
|
246
|
+
: `refs/heads/${upstream.split('/').slice(3).join('/')}`;
|
|
247
|
+
const tracking = await run(['rev-parse', '--verify', '--quiet', upstream]);
|
|
248
|
+
const trackingSha = tracking.code === 0 ? tracking.stdout.trim() : null;
|
|
249
|
+
let liveHead = null;
|
|
250
|
+
let reachable = false;
|
|
251
|
+
let observedAt = null;
|
|
252
|
+
try {
|
|
253
|
+
const ls = await run(['ls-remote', remote ?? '.', remoteRef], LS_REMOTE_TIMEOUT_MS);
|
|
254
|
+
if (ls.code === 0) {
|
|
255
|
+
reachable = true;
|
|
256
|
+
observedAt = deps.now().toISOString();
|
|
257
|
+
const match = ls.stdout
|
|
258
|
+
.split('\n')
|
|
259
|
+
.map((l) => l.trim())
|
|
260
|
+
.find((l) => l !== '');
|
|
261
|
+
liveHead = match !== undefined ? match.split('\t')[0] : null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
reachable = false; // раннер упал (например, процесс убит таймаутом)
|
|
266
|
+
}
|
|
267
|
+
if (!reachable) {
|
|
268
|
+
// недоступен → UNKNOWN (строка 2); relation считаем по tracking-ref, это наблюдение помечаем none
|
|
269
|
+
freshness = { observed_at: null, method: 'none', reachable: false };
|
|
270
|
+
const cmp = await compareWithRemote(run, head, trackingSha);
|
|
271
|
+
localVsRemote = { upstream, remote, ...cmp, remote_head: null };
|
|
272
|
+
}
|
|
273
|
+
else if (liveHead !== null) {
|
|
274
|
+
freshness = { observed_at: observedAt, method: 'ls-remote', reachable: true };
|
|
275
|
+
const cmp = await compareWithRemote(run, head, liveHead);
|
|
276
|
+
localVsRemote = { upstream, remote, ...cmp, remote_head: liveHead };
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// remote доступен, но ref на нём нет — деградация до tracking-ref (REQ-04)
|
|
280
|
+
freshness = { observed_at: observedAt, method: 'tracking-ref', reachable: true };
|
|
281
|
+
const cmp = await compareWithRemote(run, head, trackingSha);
|
|
282
|
+
localVsRemote = { upstream, remote, ...cmp, remote_head: null };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
repository: { root, is_bare: isBare, origin_url_sanitized: originUrl },
|
|
287
|
+
worktree: { path: opts.cwd, kind },
|
|
288
|
+
branch,
|
|
289
|
+
head,
|
|
290
|
+
baseline,
|
|
291
|
+
target: opts.target ?? null,
|
|
292
|
+
dirty: { value: statusLines.length > 0, entries: statusLines.length },
|
|
293
|
+
unfinished_git_operation: unfinished,
|
|
294
|
+
local_vs_remote: localVsRemote,
|
|
295
|
+
branch_owner: opts.owner ?? null,
|
|
296
|
+
freshness_of_remote_observation: freshness,
|
|
297
|
+
collection_error: null,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/** Сравнение HEAD с известным SHA remote: ancestry локально, без fetch (ADR-2). */
|
|
301
|
+
async function compareWithRemote(run, head, remoteSha) {
|
|
302
|
+
if (head === null || remoteSha === null || remoteSha === '') {
|
|
303
|
+
// без head/remote-SHA счёт невозможен; ближайшее честное отношение — remote впереди
|
|
304
|
+
return { relation: 'remote-ahead-unfetched', ahead: null, behind: null };
|
|
305
|
+
}
|
|
306
|
+
if (remoteSha === head)
|
|
307
|
+
return { relation: 'in-sync', ahead: 0, behind: 0 };
|
|
308
|
+
const present = await run(['rev-parse', '--verify', '--quiet', `${remoteSha}^{commit}`]);
|
|
309
|
+
if (present.code !== 0)
|
|
310
|
+
return { relation: 'remote-ahead-unfetched', ahead: null, behind: null };
|
|
311
|
+
const counts = await run(['rev-list', '--left-right', '--count', `${head}...${remoteSha}`]);
|
|
312
|
+
if (counts.code !== 0) {
|
|
313
|
+
// Q-1: счёт не получен — честный носитель «неизвестно» по ADR-2 (null), не выдуманный 0/0/in-sync
|
|
314
|
+
return { relation: 'remote-ahead-unfetched', ahead: null, behind: null };
|
|
315
|
+
}
|
|
316
|
+
const [aheadRaw, behindRaw] = counts.stdout.trim().split(/\s+/);
|
|
317
|
+
const ahead = Number(aheadRaw);
|
|
318
|
+
const behind = Number(behindRaw);
|
|
319
|
+
const safeAhead = Number.isFinite(ahead) ? ahead : 0;
|
|
320
|
+
const safeBehind = Number.isFinite(behind) ? behind : 0;
|
|
321
|
+
const relation = safeAhead > 0 && safeBehind > 0 ? 'diverged' : safeBehind > 0 ? 'behind' : safeAhead > 0 ? 'ahead' : 'in-sync';
|
|
322
|
+
return { relation, ahead: safeAhead, behind: safeBehind };
|
|
323
|
+
}
|
|
324
|
+
/** Полный отчёт: факты + вердикт; внутренние поля в JSON не попадают. */
|
|
325
|
+
export async function runGitInspect(deps, opts) {
|
|
326
|
+
const facts = await collectGitFacts(deps, opts);
|
|
327
|
+
const { collection_error, ...reportFacts } = facts;
|
|
328
|
+
void collection_error;
|
|
329
|
+
return { schema_version: 1, observed_at: deps.now().toISOString(), ...reportFacts, ...computeVerdict(facts) };
|
|
330
|
+
}
|
|
331
|
+
const execFileAsync = promisify(execFile);
|
|
332
|
+
/** Адаптер порта GitRunner: execFile('git') без shell; таймаут — опцией execFile (NFR-02). */
|
|
333
|
+
export function createExecFileGitRunner() {
|
|
334
|
+
return async (args, opts) => {
|
|
335
|
+
try {
|
|
336
|
+
const { stdout, stderr } = await execFileAsync('git', args, {
|
|
337
|
+
cwd: opts.cwd,
|
|
338
|
+
timeout: opts.timeoutMs,
|
|
339
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
340
|
+
windowsHide: true,
|
|
341
|
+
});
|
|
342
|
+
return { code: 0, stdout: String(stdout), stderr: String(stderr) };
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
// ненулевой exit или убитый таймаутом процесс — единый контракт {code, stdout, stderr}
|
|
346
|
+
const e = err;
|
|
347
|
+
return {
|
|
348
|
+
code: typeof e.code === 'number' ? e.code : 1,
|
|
349
|
+
stdout: String(e.stdout ?? ''),
|
|
350
|
+
stderr: String(e.stderr ?? ''),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/** ADR-3: exit-код кодирует вердикт — UNKNOWN не возвращает 0. */
|
|
356
|
+
export function gitInspectExitCode(verdict) {
|
|
357
|
+
return verdict === 'PASS' ? 0 : verdict === 'VIOLATION' ? 1 : 2;
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=git-inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-inspect.js","sourceRoot":"","sources":["../../../src/app/use-cases/git-inspect.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mister-wolf",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.27.1",
|
|
4
|
+
"description": "A local-first project organization for AI assistants: goal-directed processes, project memory and governed learning",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
7
7
|
"mcp",
|
|
@@ -42,7 +42,8 @@
|
|
|
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
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
|
-
"docs:preview": "vitepress preview docs/site"
|
|
45
|
+
"docs:preview": "vitepress preview docs/site",
|
|
46
|
+
"docs:check": "npm run build && npm run docs:build && node scripts/check-docs-links.mjs"
|
|
46
47
|
},
|
|
47
48
|
"dependencies": {
|
|
48
49
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
@@ -13,6 +13,8 @@ description: "Применять на Git-этапах задачи: вход/в
|
|
|
13
13
|
|
|
14
14
|
## Вход / возобновление (G0)
|
|
15
15
|
|
|
16
|
+
Структурный факт даёт `wolf git-inspect` (B0.5): JSON с вердиктом PASS|VIOLATION|UNKNOWN, facts/reasons/allowed_next_actions. Перечисленные ниже команды — для адресной детализации.
|
|
17
|
+
|
|
16
18
|
§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
19
|
|
|
18
20
|
## Создание ветки и worktree (G1)
|
|
@@ -37,7 +39,7 @@ description: "Применять на Git-этапах задачи: вход/в
|
|
|
37
39
|
|
|
38
40
|
## Что не поставлено
|
|
39
41
|
|
|
40
|
-
Нет MR-статусов и адаптера хостинга, CI-проверок, очереди интеграции (§11), тегов/registry/выпуска,
|
|
42
|
+
Нет MR-статусов и адаптера хостинга, CI-проверок, очереди интеграции (§11), тегов/registry/выпуска, переносимых git-мутаций B1 (структурный read-only `git inspect` и JSON-вердикт поставлены в B0.5 как `wolf git-inspect`), scheduler и постоянного контролёра. Гейты G3–G8 не автоматизированы и не являются поставленным гейтом: при необходимости их выполняют люди вручную. Отсутствующее не называть доступной командой.
|
|
41
43
|
|
|
42
44
|
## Гейт перехода
|
|
43
45
|
|
package/update-map.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.
|
|
3
|
-
"prev": "2.
|
|
2
|
+
"version": "2.27.1",
|
|
3
|
+
"prev": "2.27.0",
|
|
4
4
|
"files": [
|
|
5
5
|
{
|
|
6
6
|
"path": "base/agents/executor-lead.md",
|
|
7
7
|
"kind": "agent",
|
|
8
|
-
"category": "
|
|
8
|
+
"category": "unchanged"
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"path": "base/agents/mr-wolf.md",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
{
|
|
86
86
|
"path": "base/skills/using-skills/references/contracts.md",
|
|
87
87
|
"kind": "skill",
|
|
88
|
-
"category": "
|
|
88
|
+
"category": "unchanged"
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
91
|
"path": "base/skills/using-skills/references/project-rules.md",
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
{
|
|
171
171
|
"path": "base/skills/wolf-execute/SKILL.md",
|
|
172
172
|
"kind": "skill",
|
|
173
|
-
"category": "
|
|
173
|
+
"category": "unchanged"
|
|
174
174
|
},
|
|
175
175
|
{
|
|
176
176
|
"path": "base/skills/wolf-explain/SKILL.md",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
{
|
|
211
211
|
"path": "base/skills/wolf-handoff/SKILL.md",
|
|
212
212
|
"kind": "skill",
|
|
213
|
-
"category": "
|
|
213
|
+
"category": "unchanged"
|
|
214
214
|
},
|
|
215
215
|
{
|
|
216
216
|
"path": "base/skills/wolf-plan/SKILL.md",
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
{
|
|
231
231
|
"path": "base/skills/wolf-sdd/SKILL.md",
|
|
232
232
|
"kind": "skill",
|
|
233
|
-
"category": "
|
|
233
|
+
"category": "unchanged"
|
|
234
234
|
},
|
|
235
235
|
{
|
|
236
236
|
"path": "base/skills/wolf-skill-intake/SKILL.md",
|