@hy-sde-org/dsh-tool-git 0.1.1-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/review.js ADDED
@@ -0,0 +1,487 @@
1
+ /**
2
+ * The `review` tool: fan out dedicated reviewer subagents in parallel over a
3
+ * git diff (working tree, staged, or a commit range), collect P0–P3 findings
4
+ * with confidence, and produce a ship/reject verdict.
5
+ *
6
+ * Port of omp's `/review` for the harness. omp's reviewer persona
7
+ * (`prompts/agents/reviewer.md`) is adapted into a plain prompt handed to
8
+ * `ctx.subagents` children with a typed `outputSchema`, so each reviewer
9
+ * returns structured verdict + findings instead of prose; aggregation is local.
10
+ * See port_omp.md item: commit/review.
11
+ * @module @hy-sde-org/dsh-tool-git/review
12
+ */
13
+ import { defineTool } from '@deepseek-ai/dsh-tools';
14
+ import { parseFileDiffs } from '@hy-sde-org/dsh-git';
15
+ import { resolveCwd } from "./commit.js";
16
+ const DEFAULT_PROVIDER = 'spawn';
17
+ const DEFAULT_MAX_REVIEWERS = 4;
18
+ const DEFAULT_MAX_REVIEWER_DIFF_CHARS = 40_000;
19
+ /** Subagent `outputSchema` — the standard JSON-Schema dialect
20
+ * (object-level `required` arrays; per-property must appear in `properties`). */
21
+ const REVIEWER_SCHEMA = {
22
+ type: 'object',
23
+ additionalProperties: false,
24
+ required: ['overall_correctness', 'explanation', 'confidence', 'findings'],
25
+ properties: {
26
+ overall_correctness: { type: 'string', enum: ['correct', 'incorrect'] },
27
+ explanation: { type: 'string' },
28
+ confidence: { type: 'number' },
29
+ findings: {
30
+ type: 'array',
31
+ items: {
32
+ type: 'object',
33
+ additionalProperties: false,
34
+ required: ['title', 'body', 'priority', 'confidence', 'file_path', 'line_start', 'line_end'],
35
+ properties: {
36
+ title: { type: 'string' },
37
+ body: { type: 'string' },
38
+ priority: { type: 'integer', enum: [0, 1, 2, 3] },
39
+ confidence: { type: 'number' },
40
+ file_path: { type: 'string' },
41
+ line_start: { type: 'integer' },
42
+ line_end: { type: 'integer' },
43
+ },
44
+ },
45
+ },
46
+ },
47
+ };
48
+ const PRIORITY_LABELS = ['P0', 'P1', 'P2', 'P3'];
49
+ export function toPriority(value) {
50
+ if (value === 0 || value === '0')
51
+ return 'P0';
52
+ if (value === 1 || value === '1')
53
+ return 'P1';
54
+ if (value === 2 || value === '2')
55
+ return 'P2';
56
+ return 'P3';
57
+ }
58
+ export function applyReviewTool(ctx, config = {}) {
59
+ const provider = config.provider ?? DEFAULT_PROVIDER;
60
+ const maxReviewers = config.maxReviewers ?? DEFAULT_MAX_REVIEWERS;
61
+ const maxReviewerDiffChars = config.maxReviewerDiffChars ?? DEFAULT_MAX_REVIEWER_DIFF_CHARS;
62
+ ctx.tools.register(defineTool({
63
+ name: 'review',
64
+ description: 'Run a parallel code review over git changes (working tree, staged, or a commit range) with dedicated reviewer '
65
+ + 'subagents. Every finding is ranked P0–P3 with a confidence score; the tool returns all findings sorted by severity '
66
+ + 'and a ship/reject verdict with explanation. Reviewers are read-only (git diff/log/show, read, grep, ast_grep) and '
67
+ + 'never edit files or run builds. Use the focus filter to review only the paths that matter.',
68
+ parameters: {
69
+ target: {
70
+ type: 'string',
71
+ enum: ['worktree', 'staged', 'commits'],
72
+ description: 'What to review: working-tree changes vs HEAD (default, includes staged + unstaged), only staged, or a commit range.',
73
+ },
74
+ range: {
75
+ type: 'string',
76
+ description: 'Commit range like HEAD~3..HEAD when target is commits (both endpoints resolved by git).',
77
+ },
78
+ focus: {
79
+ type: 'array',
80
+ items: { type: 'string' },
81
+ description: 'Optional subset of paths/prefixes to restrict the review to; other files are skipped.',
82
+ },
83
+ maxReviewers: {
84
+ type: 'integer',
85
+ description: `Cap on parallel reviewers (default ${maxReviewers}); the diff is split into at most this many slices.`,
86
+ },
87
+ cwd: { type: 'string', description: 'Working directory; defaults to the session workspace.' },
88
+ },
89
+ output: {
90
+ schema: {
91
+ type: 'object',
92
+ additionalProperties: false,
93
+ properties: {
94
+ target: { type: 'string', required: true, enum: ['worktree', 'staged', 'commits'] },
95
+ files: { type: 'array', required: true, items: { type: 'string' } },
96
+ diffTruncated: { type: 'boolean', required: true },
97
+ verdict: { type: 'string', required: true, enum: ['ship', 'reject'] },
98
+ verdictExplanation: { type: 'string', required: true },
99
+ confidence: { type: 'number', required: true },
100
+ findings: {
101
+ type: 'array',
102
+ required: true,
103
+ items: {
104
+ type: 'object',
105
+ additionalProperties: false,
106
+ properties: {
107
+ title: { type: 'string', required: true },
108
+ body: { type: 'string', required: true },
109
+ priority: { type: 'string', required: true, enum: ['P0', 'P1', 'P2', 'P3'] },
110
+ confidence: { type: 'number', required: true },
111
+ file_path: { type: 'string', required: true },
112
+ line_start: { type: 'integer', required: true },
113
+ line_end: { type: 'integer', required: true },
114
+ reviewer: { type: 'string', required: true },
115
+ },
116
+ },
117
+ },
118
+ slices: {
119
+ type: 'array',
120
+ required: true,
121
+ items: {
122
+ type: 'object',
123
+ additionalProperties: false,
124
+ properties: {
125
+ label: { type: 'string', required: true },
126
+ files: { type: 'array', required: true, items: { type: 'string' } },
127
+ overall_correctness: { type: 'string', required: true, enum: ['correct', 'incorrect'] },
128
+ explanation: { type: 'string', required: true },
129
+ confidence: { type: 'number', required: true },
130
+ findings: {
131
+ type: 'array',
132
+ required: true,
133
+ items: {
134
+ type: 'object',
135
+ additionalProperties: false,
136
+ properties: {
137
+ title: { type: 'string', required: true },
138
+ body: { type: 'string', required: true },
139
+ priority: { type: 'string', required: true, enum: ['P0', 'P1', 'P2', 'P3'] },
140
+ confidence: { type: 'number', required: true },
141
+ file_path: { type: 'string', required: true },
142
+ line_start: { type: 'integer', required: true },
143
+ line_end: { type: 'integer', required: true },
144
+ },
145
+ },
146
+ },
147
+ },
148
+ },
149
+ },
150
+ errors: { type: 'array', required: true, items: { type: 'string' } },
151
+ warnings: { type: 'array', required: true, items: { type: 'string' } },
152
+ },
153
+ },
154
+ render: (_args, value) => [{
155
+ type: 'text',
156
+ text: renderReview(value),
157
+ }],
158
+ },
159
+ isConcurrencySafe: () => false,
160
+ async execute(args, exec) {
161
+ const git = ctx.git;
162
+ const cwd = resolveCwd(exec, args.cwd);
163
+ if (!(await git.isRepo(cwd, exec.signal))) {
164
+ throw new Error(`review requires a git repository: ${cwd} is not inside a working tree`);
165
+ }
166
+ const parent = exec.agent;
167
+ if (!parent) {
168
+ throw new Error('review requires a calling agent (exec.agent was undefined)');
169
+ }
170
+ const subagents = ctx.get('subagents');
171
+ if (subagents === undefined || subagents.getProvider(provider) === undefined) {
172
+ throw new Error(`review needs a subagent provider "${provider}" — load @deepseek-ai/dsh-tool-subagent with that provider first`);
173
+ }
174
+ const target = args.target ?? 'worktree';
175
+ const diffText = await resolveReviewDiff(git, cwd, target, args.range, exec.signal);
176
+ const allFiles = Array.from(new Set(parseFileDiffs(diffText).map(file => file.filename)));
177
+ const focus = (args.focus ?? []).map(prefix => prefix.replace(/\/+$/, ''));
178
+ const files = focus.length > 0
179
+ ? allFiles.filter(file => focus.some(prefix => file === prefix || file.startsWith(`${prefix}/`)))
180
+ : allFiles;
181
+ const warnings = [];
182
+ if (focus.length > 0 && files.length === 0) {
183
+ warnings.push(`no changed files matched the focus filter: ${focus.join(', ')}`);
184
+ }
185
+ if (files.length === 0) {
186
+ return {
187
+ target,
188
+ files: [],
189
+ diffTruncated: false,
190
+ findings: [],
191
+ verdict: 'ship',
192
+ verdictExplanation: 'No changed files to review.',
193
+ confidence: 1,
194
+ slices: [],
195
+ errors: [],
196
+ warnings,
197
+ };
198
+ }
199
+ // Cap the inline diff handed to any one reviewer up front.
200
+ let anyTruncated = false;
201
+ const diffFor = new Map();
202
+ for (const file of files) {
203
+ let slice = gitDiffSection(diffText, file);
204
+ if (slice.length > 0 && slice.length > maxReviewerDiffChars) {
205
+ slice = slice.slice(0, maxReviewerDiffChars);
206
+ anyTruncated = true;
207
+ warnings.push(`diff section for ${file} truncated to ${maxReviewerDiffChars} chars for the reviewer`);
208
+ }
209
+ if (slice.length > 0)
210
+ diffFor.set(file, slice);
211
+ }
212
+ const budget = Math.max(1, Math.min(args.maxReviewers ?? maxReviewers, files.length));
213
+ const slices = sliceByWeight(files, diffFor, budget);
214
+ const settled = await Promise.allSettled(slices.map((sliceFiles, index) => collectSlice(sliceFiles, index)));
215
+ const slicesResult = [];
216
+ const errors = [];
217
+ for (const [i, result] of settled.entries()) {
218
+ if (result.status === 'fulfilled') {
219
+ if (result.value.kind === 'ok') {
220
+ slicesResult.push(result.value.slice);
221
+ }
222
+ else {
223
+ errors.push(`reviewer ${i + 1}/${slices.length} failed: ${result.value.error}`);
224
+ }
225
+ }
226
+ else {
227
+ errors.push(`reviewer ${i + 1}/${slices.length} failed: ${reasonOf(result.reason)}`);
228
+ }
229
+ }
230
+ const findings = [];
231
+ for (const slice of slicesResult) {
232
+ for (const finding of slice.findings) {
233
+ findings.push({ ...finding, reviewer: slice.label });
234
+ }
235
+ }
236
+ findings.sort((a, b) => {
237
+ const pa = PRIORITY_LABELS.indexOf(a.priority);
238
+ const pb = PRIORITY_LABELS.indexOf(b.priority);
239
+ if (pa !== pb)
240
+ return pa - pb;
241
+ return b.confidence - a.confidence;
242
+ });
243
+ const incorrect = slicesResult.filter(slice => slice.overall_correctness === 'incorrect');
244
+ // If every reviewer failed, we cannot approve unreviewed changes.
245
+ const noReviewerCompleted = slicesResult.length === 0 && errors.length > 0;
246
+ const verdict = incorrect.length > 0 || noReviewerCompleted ? 'reject' : 'ship';
247
+ const confidence = slicesResult.length === 0
248
+ ? 0
249
+ : Math.min(...slicesResult.map(slice => slice.confidence));
250
+ const verdictExplanation = noReviewerCompleted
251
+ ? `No reviewer completed (${errors.length} of ${slices.length} failed); refusing to approve unreviewed changes.`
252
+ : verdict === 'reject'
253
+ ? `${incorrect.length} of ${slicesResult.length} reviewers found blocking problems. `
254
+ + incorrect.map(slice => `[${slice.label}] ${slice.explanation}`).join(' ')
255
+ : 'All reviewers judged the change correct'
256
+ + (slicesResult.length > 0 ? ` (${slicesResult.length} reviewer(s))` : '') + '.'
257
+ + (findings.length > 0 ? ` ${findings.length} non-blocking finding(s) remain.` : '');
258
+ return {
259
+ target,
260
+ files,
261
+ diffTruncated: anyTruncated,
262
+ findings,
263
+ verdict,
264
+ verdictExplanation,
265
+ confidence,
266
+ slices: slicesResult,
267
+ errors,
268
+ warnings,
269
+ };
270
+ async function collectSlice(sliceFiles, index) {
271
+ const label = `reviewer ${index + 1}/${slices.length}`;
272
+ const inline = sliceFiles.map(file => diffFor.get(file) ?? '').filter(Boolean).join('\n');
273
+ const prompt = buildReviewerPrompt(label, sliceFiles, inline);
274
+ // Narrowing from the outer scope does not flow into this closure; the
275
+ // checks were already performed above (parent exists, subagents provides
276
+ // the selected provider), so re-assert them for the type checker.
277
+ if (subagents === undefined || parent === undefined) {
278
+ return { kind: 'error', error: 'subagents or calling agent unavailable' };
279
+ }
280
+ const controller = new AbortController();
281
+ const forwardAbort = () => controller.abort();
282
+ if (exec.signal !== undefined)
283
+ exec.signal.addEventListener('abort', forwardAbort, { once: true });
284
+ let run;
285
+ try {
286
+ run = await subagents.start(provider, {
287
+ label,
288
+ prompt: [{ type: 'text', text: prompt }],
289
+ parent,
290
+ signal: controller.signal,
291
+ outputSchema: REVIEWER_SCHEMA,
292
+ });
293
+ }
294
+ catch (error) {
295
+ if (exec.signal !== undefined)
296
+ exec.signal.removeEventListener('abort', forwardAbort);
297
+ return { kind: 'error', error: `start failed: ${String(error)}` };
298
+ }
299
+ try {
300
+ const result = await run.result;
301
+ if (result.stopReason === 'completed' && isSliceStructured(result.structured)) {
302
+ const slice = {
303
+ label,
304
+ files: sliceFiles,
305
+ overall_correctness: result.structured.overall_correctness,
306
+ explanation: result.structured.explanation,
307
+ confidence: result.structured.confidence,
308
+ findings: (result.structured.findings ?? []).map(toReviewerFinding),
309
+ };
310
+ return { kind: 'ok', slice };
311
+ }
312
+ return {
313
+ kind: 'error',
314
+ error: `${result.stopReason}${result.diagnostic !== undefined ? ` (${result.diagnostic})` : ''}`,
315
+ };
316
+ }
317
+ catch (error) {
318
+ return { kind: 'error', error: String(error) };
319
+ }
320
+ finally {
321
+ if (exec.signal !== undefined)
322
+ exec.signal.removeEventListener('abort', forwardAbort);
323
+ try {
324
+ await run.dispose();
325
+ }
326
+ catch {
327
+ // disposal failures are not reviewer results
328
+ }
329
+ }
330
+ }
331
+ },
332
+ }));
333
+ }
334
+ /* ── helpers ─────────────────────────────────────────────────────────────── */
335
+ export function reasonOf(reason) {
336
+ if (reason instanceof Error)
337
+ return reason.message;
338
+ return String(reason);
339
+ }
340
+ function isSliceStructured(value) {
341
+ if (typeof value !== 'object' || value === null)
342
+ return false;
343
+ const record = value;
344
+ return (record.overall_correctness === 'correct' || record.overall_correctness === 'incorrect')
345
+ && typeof record.explanation === 'string'
346
+ && typeof record.confidence === 'number' && Number.isFinite(record.confidence);
347
+ }
348
+ function toReviewerFinding(value) {
349
+ const record = (typeof value === 'object' && value !== null ? value : {});
350
+ return {
351
+ title: typeof record.title === 'string' ? record.title : '(untitled finding)',
352
+ body: typeof record.body === 'string' ? record.body : '',
353
+ priority: toPriority(record.priority),
354
+ confidence: typeof record.confidence === 'number' && Number.isFinite(record.confidence) ? record.confidence : 0,
355
+ file_path: typeof record.file_path === 'string' ? record.file_path : '',
356
+ line_start: typeof record.line_start === 'number' && Number.isFinite(record.line_start) ? record.line_start : 0,
357
+ line_end: typeof record.line_end === 'number' && Number.isFinite(record.line_end) ? record.line_end : 0,
358
+ };
359
+ }
360
+ /** Which diff to review for the given target. */
361
+ async function resolveReviewDiff(git, cwd, target, range, signal) {
362
+ if (target === 'staged')
363
+ return git.diffText(cwd, { cached: true, binary: true }, signal);
364
+ if (target === 'commits') {
365
+ if (range === undefined || range.length === 0) {
366
+ throw new Error('review target "commits" requires a range, e.g. HEAD~3..HEAD');
367
+ }
368
+ const dash = range.indexOf('..');
369
+ if (dash === -1) {
370
+ throw new Error(`review range must be base..head (e.g. HEAD~3..HEAD), got "${range}"`);
371
+ }
372
+ const base = range.slice(0, dash);
373
+ const head = range.slice(dash + 2);
374
+ return git.diffText(cwd, { base, ...(head.length > 0 ? { head } : {}), binary: true }, signal);
375
+ }
376
+ // worktree: everything vs HEAD (staged + unstaged; untracked files are
377
+ // excluded — reviewers judge tracked changes).
378
+ return git.diffText(cwd, { base: 'HEAD', binary: true }, signal);
379
+ }
380
+ /** Split `files` into at most `budget` slices balanced by diff size. */
381
+ export function sliceByWeight(files, diffFor, budget) {
382
+ if (budget <= 1)
383
+ return [files.slice()];
384
+ const weight = (file) => diffFor.get(file)?.length ?? 1;
385
+ const ordered = files.slice();
386
+ ordered.sort((a, b) => weight(b) - weight(a));
387
+ const slices = Array.from({ length: budget }, () => []);
388
+ const load = new Array(budget).fill(0);
389
+ for (const file of ordered) {
390
+ let lightest = 0;
391
+ for (let i = 1; i < budget; i++)
392
+ if ((load[i] ?? 0) < (load[lightest] ?? 0))
393
+ lightest = i;
394
+ slices[lightest]?.push(file);
395
+ load[lightest] = (load[lightest] ?? 0) + weight(file);
396
+ }
397
+ return slices;
398
+ }
399
+ /** Extract the `diff --git` section for one file from a whole diff text. */
400
+ export function gitDiffSection(diffText, file) {
401
+ const parts = diffText.split('\ndiff --git ');
402
+ for (let index = 0; index < parts.length; index += 1) {
403
+ const raw = parts[index] ?? '';
404
+ const part = index === 0 ? raw : `diff --git ${raw}`;
405
+ if (!part.trim())
406
+ continue;
407
+ const header = part.split('\n')[0] ?? '';
408
+ if (new RegExp(` b/${escapeRegExp(file)}$`).test(header) || header === `diff --git a/${file} b/${file}`)
409
+ return part;
410
+ }
411
+ return '';
412
+ }
413
+ function escapeRegExp(value) {
414
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
415
+ }
416
+ /** The reviewer instruction prompt (adapted from omp reviewer.md). */
417
+ export function buildReviewerPrompt(label, files, inlineDiff) {
418
+ const parts = [];
419
+ parts.push(`You are ${label}, a code review specialist performing a READ-ONLY review.`);
420
+ parts.push('');
421
+ parts.push('OWNED FILES (review these; other changed files are out of scope):');
422
+ for (const file of files)
423
+ parts.push(`- ${file}`);
424
+ parts.push('');
425
+ parts.push('Find bugs the author wants fixed before merge.');
426
+ parts.push('');
427
+ parts.push('PROCEDURE');
428
+ parts.push('1. Patch: `git diff` (recomputed) or the inline diff below — never trust it blindly.');
429
+ parts.push('2. Read the FULL context of each modified file with read/lsp before judging (the inline diff omits surrounding code).');
430
+ parts.push('3. Report each issue as a finding (see OUTPUT).');
431
+ parts.push('4. Return the final verdict in the structured result (see OUTPUT).');
432
+ parts.push('');
433
+ parts.push('CRITERIA — report only issues meeting ALL: provable impact (no speculation); actionable (discrete fix); '
434
+ + 'unintentional (not a deliberate design choice); introduced in the patch (do not flag pre-existing bugs); '
435
+ + 'no unstated assumptions; rigorous only to the level present elsewhere in the codebase.');
436
+ parts.push('');
437
+ parts.push('CHECK boundary-crossing values: every patch-introduced type/variant/value crossing a function or module '
438
+ + 'boundary (event, message, command, frame, enum variant, queue item, IPC payload) needs its consuming-side dispatch '
439
+ + 'point to forward it explicitly. A silent-drop/no-op at the consumer is a defect — read the consumer before concluding.');
440
+ parts.push('');
441
+ parts.push('PRIORITY — P0: blocks release/operations, universal impact (data corruption, auth bypass). '
442
+ + 'P1: high, fix next cycle (race under load). P2: medium, fix eventually (edge-case mishandling). '
443
+ + 'P3: info / nice to have (suboptimal but correct).');
444
+ parts.push('');
445
+ parts.push(`INLINE DIFF (may be truncated; recompute with git diff / git diff --cached / git diff <range>):\n\n${inlineDiff}`);
446
+ parts.push('');
447
+ parts.push('RULES: This is READ-ONLY. NEVER edit files, never stage, never commit, never run builds or tests that mutate '
448
+ + 'state — git diff/log/show/status and file reads only.');
449
+ parts.push('');
450
+ parts.push('OUTPUT: Return the structured result with `overall_correctness` ("correct" = no bugs/blockers, ignoring '
451
+ + 'style/docs/nits, or "incorrect") and `explanation` (1-3 sentences). `findings` is an array where each item has '
452
+ + 'title (imperative, ≤80 chars), body (one paragraph: bug, trigger, impact), priority (0=P0 … 3=P3), '
453
+ + 'confidence (0.0-1.0 it is a real bug), file_path, line_start, line_end (≤10-line range overlapping the diff). '
454
+ + 'Never invent findings: every finding must be patch-anchored and evidence-backed. Findings that are not patch-introduced '
455
+ + 'or have no provable impact should not be reported.');
456
+ return parts.join('\n');
457
+ }
458
+ function renderReview(value) {
459
+ const lines = [];
460
+ lines.push(`Review (${value.target}) — ${value.files.length} file(s), verdict: ${value.verdict.toUpperCase()}`
461
+ + ` (confidence ${Math.round(value.confidence * 100)}%)`);
462
+ lines.push(value.verdictExplanation);
463
+ if (value.findings.length > 0) {
464
+ lines.push('');
465
+ lines.push(`Findings (${value.findings.length}, sorted by severity):`);
466
+ for (const finding of value.findings) {
467
+ lines.push(` [${finding.priority}] (${Math.round(finding.confidence * 100)}%) ${finding.title}`);
468
+ if (finding.body.length > 0)
469
+ lines.push(` ${finding.body}`);
470
+ lines.push(` ${finding.file_path}:${finding.line_start}-${finding.line_end} (reviewer ${finding.reviewer})`);
471
+ }
472
+ }
473
+ else {
474
+ lines.push('');
475
+ lines.push('No findings reported.');
476
+ }
477
+ if (value.errors.length > 0) {
478
+ lines.push('');
479
+ lines.push(`Reviewer failures (${value.errors.length}):`);
480
+ for (const error of value.errors)
481
+ lines.push(` - ${error}`);
482
+ }
483
+ for (const warning of value.warnings)
484
+ lines.push(`warning: ${warning}`);
485
+ return lines.join('\n');
486
+ }
487
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ # User agent preset for @hy-sde-org/dsh-git on OFFICIAL DeepSeek Harness
2
+ # releases (dsh-v0.1.1-rc.2 and later).
3
+ #
4
+ # Install: copy this directory to ~/.dsh/.agent-presets/<id>/ (pick any id),
5
+ # then select the preset in the Web UI preset picker (or `dsh agent` CLI).
6
+ #
7
+ # The `git` SERVICE row is added host-wide by the plugin's own
8
+ # cordis.patch.yml when you run `dsh plugin add`; this preset contributes
9
+ # ONLY the model-facing tool row. `@hy-sde-org/dsh-tool-git` registers no
10
+ # service of its own — it resolves the host instance across the plane
11
+ # boundary, so no realm/isolate is needed here.
12
+ #
13
+ # Copy any other rows from the preset you normally use (persona, bash, todo,
14
+ # ask-user, skills, ...) next to these; only the git row is special. If
15
+ # the package isn't installed, the loader reports the missing plugin on boot.
16
+
17
+ - id: tool-git
18
+ name: '@hy-sde-org/dsh-tool-git'
19
+ config:
20
+ reviewProvider: spawn
21
+ maxReviewers: 4
@@ -0,0 +1,3 @@
1
+ name: Agentic Git
2
+ description: Coding agent with agentic git commit + review — commit / commit_apply / review tools over the host ctx.git service. For stock DeepSeek Harness releases (rc.2+).
3
+ order: 7
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@hy-sde-org/dsh-tool-git",
3
+ "version": "0.1.1-rc.2",
4
+ "description": "Model-facing agentic git tools (commit analyze + commit_apply split execution with validation, and review with P0-P3 verdicts) over the host ctx.git service — a standalone plugin for DeepSeek Harness with no upstream harness changes required.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./commit": {
14
+ "types": "./dist/commit.d.ts",
15
+ "default": "./dist/commit.js"
16
+ },
17
+ "./review": {
18
+ "types": "./dist/review.d.ts",
19
+ "default": "./dist/review.js"
20
+ },
21
+ "./invariant": {
22
+ "types": "./dist/invariant.d.ts",
23
+ "default": "./dist/invariant.js"
24
+ },
25
+ "./package.json": "./package.json"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "examples/agent-preset/agent.cordis.yml",
30
+ "examples/agent-preset/preset.yml",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "engines": {
35
+ "node": ">=22.19.0"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/hy-sde/dsh-git.git"
43
+ },
44
+ "license": "MIT",
45
+ "dependencies": {
46
+ "@hy-sde-org/dsh-git": "0.1.1-rc.2"
47
+ },
48
+ "peerDependencies": {
49
+ "@deepseek-ai/cordis": "^4.0.1",
50
+ "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
51
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
52
+ "@deepseek-ai/dsh-subagent": "^0.1.1-rc.2",
53
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
54
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
55
+ "@hy-sde-org/dsh-git": "^0.1.1-rc.2"
56
+ },
57
+ "devDependencies": {
58
+ "@deepseek-ai/cordis": "^4.0.1",
59
+ "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
60
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
61
+ "@deepseek-ai/dsh-subagent": "^0.1.1-rc.2",
62
+ "@deepseek-ai/dsh-subprocess-local": "^0.1.1-rc.2",
63
+ "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
64
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
65
+ "@types/node": "^24.0.0",
66
+ "typescript": "^5.9.3",
67
+ "vitest": "^3.2.7",
68
+ "@hy-sde-org/dsh-git": "0.1.1-rc.2"
69
+ },
70
+ "keywords": [
71
+ "deepseek",
72
+ "agent",
73
+ "harness",
74
+ "dsh-plugin",
75
+ "git",
76
+ "commit",
77
+ "review"
78
+ ],
79
+ "scripts": {
80
+ "clean": "rm -rf dist",
81
+ "build": "tsc -p tsconfig.build.json",
82
+ "check": "tsc -p tsconfig.json --noEmit",
83
+ "test": "vitest run"
84
+ }
85
+ }