dsh-ide-git 0.18.2 → 0.18.3

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/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-external/dsh-ide-git",
3
- "version": "0.18.2",
3
+ "version": "0.18.3",
4
4
  "main": "./src/index.js",
5
5
  "description": "IDE 级 Git 操作面板:分支树 + 提交图谱 + 变更/暂存/提交 + 提交详情。装了 dsh-better-sidebar 时挂成它的原生 tab(右侧栏 + 底部工作台);没装时直接挂 DSH 原生右侧栏,单独安装即可用。JetBrains 风格 Git 工具窗口 for DeepSeek Harness.",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-ide-git",
3
- "version": "0.18.2",
3
+ "version": "0.18.3",
4
4
  "description": "DSH plugin: an IDE-grade Git tool window as a native dsh-better-sidebar tab — branch tree, commit graph, changes, commit details, JetBrains-style actions, in the right sidebar and the bottom panel. | DSH 插件:IDE 级 Git 工具窗口,以 dsh-better-sidebar 原生 Tab 挂载——分支树 / 提交图谱 / 变更与提交详情 / JetBrains 风格操作,右侧栏与底部面板双布局自适应。",
5
5
  "type": "module",
6
6
  "repository": {
package/src/client.js CHANGED
@@ -9996,9 +9996,11 @@ window.__ModuleLoader__.load({
9996
9996
  return E('div', {
9997
9997
  className: 'dig-row dig-row-file' + (props.selected === true ? ' dig-row-selected' : ''),
9998
9998
  title: item.origPath === undefined ? item.path : item.origPath + ' → ' + item.path,
9999
- /* The click is handled ONE level up (ChangesPanel): plain click still
10000
- opens the diff, Shift/Ctrl+click join or toggle the multi-select. */
9999
+ /* The click is handled ONE level up (ChangesPanel): plain click only
10000
+ selects, DOUBLE-click opens the diff (v0.18.3 — one interaction model
10001
+ across every list). */
10001
10002
  onClick: (event) => props.onRowClick(event, item, props.group),
10003
+ onDoubleClick: () => props.onDblClick(item, props.group),
10002
10004
  onContextMenu: (event) => { event.preventDefault(); props.onMenu(event, item, props.group) },
10003
10005
  },
10004
10006
  FileTypeGlyph({ path: item.path }),
@@ -10108,8 +10110,10 @@ window.__ModuleLoader__.load({
10108
10110
  return
10109
10111
  }
10110
10112
  anchorRef.current = key
10111
- setSelection((previous) => previous.size === 0 ? previous : new Set())
10112
- props.onDiff(item, group)
10113
+ /* Plain click only SELECTS (single-replace, the branch tree's model):
10114
+ the diff moved to DOUBLE-click — a stray click mid-multi-select must
10115
+ not yank the pane away (v0.18.3). */
10116
+ setSelection((previous) => previous.size === 1 && previous.has(key) === true ? previous : new Set([key]))
10113
10117
  }, [setSelection, anchorRef, props.onDiff])
10114
10118
  /* ---- rubber-band selection over the windowed list: the fixed row
10115
10119
  heights + the prefix-sum offsets turn a pixel span back into the
@@ -10251,6 +10255,7 @@ window.__ModuleLoader__.load({
10251
10255
  key: key + ':' + item.path, item: item, group: key, t: t,
10252
10256
  selected: selection.has(key + ':' + item.path) === true,
10253
10257
  onRowClick: handleRowClick,
10258
+ onDblClick: props.onDiff,
10254
10259
  onStage: props.onStage, onUnstage: props.onUnstage, onDiscard: props.onDiscard, onDiff: props.onDiff, onMenu: props.onChangeMenu,
10255
10260
  })
10256
10261
  const folderOf = (item) => {
@@ -10438,7 +10443,6 @@ window.__ModuleLoader__.load({
10438
10443
  return E('div', { className: 'dig-changes' },
10439
10444
  aiConfirmDialog,
10440
10445
  head,
10441
- selectionBar,
10442
10446
  E('div', { className: 'dig-changes-body' },
10443
10447
  E('div', {
10444
10448
  className: 'dig-changes-list', ref: changesScrollRef,
@@ -10463,6 +10467,7 @@ window.__ModuleLoader__.load({
10463
10467
  winLast < changeItems.length ? E('div', { key: 'pad-bottom', style: { height: String(changeOffsets[changeItems.length] - changeOffsets[winLast]) + 'px' } }) : null,
10464
10468
  ]),
10465
10469
  composer),
10470
+ selectionBar,
10466
10471
  marquee === null ? null : E('div', {
10467
10472
  className: 'dig-marquee',
10468
10473
  style: { left: marquee.x + 'px', top: marquee.y + 'px', width: marquee.w + 'px', height: marquee.h + 'px' },
@@ -10591,8 +10596,10 @@ window.__ModuleLoader__.load({
10591
10596
  'data-lane': String(props.row.lane),
10592
10597
  className: 'dig-commit' + (props.selected === true ? ' dig-commit-selected' : ''),
10593
10598
  /* Modifier handling lives in HistoryList (it owns the rendered row
10594
- order the Shift-range walks); a plain click still opens the detail. */
10599
+ order the Shift-range walks); a plain click only selects and the
10600
+ DOUBLE-click opens the detail (v0.18.3, same model as the tree). */
10595
10601
  onClick: (event) => props.onRowClick(event, commit),
10602
+ onDoubleClick: () => props.onOpenDetail(commit),
10596
10603
  onContextMenu: (event) => { event.preventDefault(); props.onMenu(event, commit) },
10597
10604
  },
10598
10605
  E('span', { className: 'dig-commit-date', title: shortDate(commit.date) }, relativeTime(commit.date)),
@@ -10698,10 +10705,12 @@ window.__ModuleLoader__.load({
10698
10705
  const rows = useMemo(() => buildRows(filtered), [filtered])
10699
10706
  /* Multi-select gestures (issue #13): the rendered row order is what the
10700
10707
  Shift-range walks, and the range is computed over the FILTERED rows —
10701
- the same list the eye sees. Plain click keeps opening the detail and
10702
- collapses the multi-select, exactly like the other two lists. The
10703
- stale-callback risk is nil: rows change identity with the filters, and
10704
- every row re-renders whenever its commit reference changes. */
10708
+ the same list the eye sees. A plain click only SELECTS (single-replace,
10709
+ like the branch tree); it must NOT open the detail view — that killed
10710
+ any multi-select mid-flight and is now the DOUBLE-click's job (user
10711
+ request, v0.18.3). The stale-callback risk is nil: rows change identity
10712
+ with the filters, and every row re-renders whenever its commit
10713
+ reference changes. */
10705
10714
  const handleRowClick = (event, commit) => {
10706
10715
  const pickedHashes = props.pickedHashes
10707
10716
  const setPicks = props.onPicksChange
@@ -10857,7 +10866,7 @@ window.__ModuleLoader__.load({
10857
10866
  commit: row.commit, row: row, t: t,
10858
10867
  selected: props.selectedHash === row.commit.hash
10859
10868
  || (props.pickedHashes !== undefined && props.pickedHashes.has(row.commit.hash) === true),
10860
- onRowClick: handleRowClick, onMenu: props.onMenu, openMenuAt: props.openMenuAt,
10869
+ onRowClick: handleRowClick, onOpenDetail: props.onSelect, onMenu: props.onMenu, openMenuAt: props.openMenuAt,
10861
10870
  })),
10862
10871
  winEnd < rows.length ? E('div', { key: 'pad-bottom', style: { height: String((rows.length - winEnd) * HISTORY_ROW_H) + 'px' } }) : null,
10863
10872
  props.hasMore === true
@@ -10884,7 +10893,10 @@ window.__ModuleLoader__.load({
10884
10893
  key: file.path,
10885
10894
  className: 'dig-row dig-row-file' + (props.selectedPath === file.path ? ' dig-row-selected' : ''),
10886
10895
  title: file.path,
10896
+ /* Same click model as everywhere else (v0.18.3): plain click only
10897
+ selects, DOUBLE-click opens the diff. */
10887
10898
  onClick: () => props.onSelectFile(file),
10899
+ onDoubleClick: () => props.onOpenFile(file),
10888
10900
  onContextMenu: props.onFileMenu === undefined ? undefined : (event) => { event.preventDefault(); props.onFileMenu(event, file) },
10889
10901
  },
10890
10902
  FileTypeGlyph({ path: file.path }),
@@ -12241,7 +12253,10 @@ window.__ModuleLoader__.load({
12241
12253
  ? E(CommitDetail, {
12242
12254
  t: t, detail: detail, selectedPath: selectedPath,
12243
12255
  onBack: () => { setView('history'); setSelectedPath(null); setPatch(''); setDiffContext(null) },
12244
- onSelectFile: (file) => {
12256
+ /* Plain click only highlights the file; the DOUBLE-click opens its
12257
+ diff (v0.18.3, one click model across every list). */
12258
+ onSelectFile: (file) => { setSelectedPath(file.path) },
12259
+ onOpenFile: (file) => {
12245
12260
  setSelectedPath(file.path)
12246
12261
  showDiff({
12247
12262
  hash: detail === null || detail === undefined ? undefined : detail.hash,
@@ -13331,7 +13346,11 @@ window.__ModuleLoader__.load({
13331
13346
  VIEWPORT-space .dig-changes (invariant 13: position:fixed would be
13332
13347
  captured by the workbench's contain:layout and flung off-panel). */
13333
13348
  '.dig-marquee{position:absolute;border:1px solid var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 14%,transparent);pointer-events:none;z-index:6}',
13334
- '.dig-selection-bar{display:flex;align-items:center;gap:12px;padding:3px 10px;font-size:11px;background:var(--dsw-alias-interactive-bg-hover);border-bottom:1px solid var(--dsw-alias-border-subtle,transparent)}',
13349
+ /* The selection bar FLOATS over the top of the list (absolute, solid
13350
+ surface): as an in-flow bar it shoved the whole list down one row on
13351
+ the first selection — the second click of every double-click then
13352
+ landed on the shifted group head and the dblclick died (v0.18.3). */
13353
+ '.dig-selection-bar{position:absolute;top:0;left:0;right:0;z-index:6;display:flex;align-items:center;gap:12px;padding:3px 10px;font-size:11px;background:var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1));border-bottom:1px solid var(--dsw-alias-border-subtle,transparent);box-shadow:var(--dsw-elevation-prominent,0 4px 14px rgba(0,0,0,.3))}',
13335
13354
  '.dig-selection-bar .dig-link{margin-left:0}',
13336
13355
  '.dig-selection-bar .dig-link-danger{color:var(--dsw-alias-state-error-primary)}',
13337
13356
  '.dig-selection-count{color:var(--dsw-alias-label-secondary);white-space:nowrap}',