@goodandready/dsh-kanban 0.2.42 โ†’ 0.2.43

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.
Files changed (2) hide show
  1. package/lib/client.js +50 -41
  2. package/package.json +3 -2
package/lib/client.js CHANGED
@@ -526,7 +526,7 @@ window.__ModuleLoader__.load({
526
526
  {
527
527
  style: {
528
528
  margin: '12px 0', padding: '14px', borderRadius: '8px',
529
- background: CLR_ERR_S,
529
+ background: CLR_ERR_S2,
530
530
  border: '1px solid var(--dsw-alias-state-error-secondary, #ffc1c0)',
531
531
  },
532
532
  },
@@ -1730,7 +1730,7 @@ window.__ModuleLoader__.load({
1730
1730
  return h('div', {
1731
1731
  className: 'dkb-section-card',
1732
1732
  key: 'remote-test-card',
1733
- style: { borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)', background: 'var(--dsw-alias-bg-layer-1, #f6f8fa)', padding: '12px 14px', marginBottom: '12px' },
1733
+ style: { borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)', background: CLR_BG_F6, padding: '12px 14px', marginBottom: '12px' },
1734
1734
  },
1735
1735
  h('div', {
1736
1736
  style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: result ? '8px' : '0' },
@@ -1751,7 +1751,7 @@ window.__ModuleLoader__.load({
1751
1751
  borderRadius: '4px',
1752
1752
  background: (result.ssh?.ok || result.server?.ok)
1753
1753
  ? CLR_SUC_S
1754
- : CLR_ERR_S,
1754
+ : CLR_ERR_S2,
1755
1755
  color: (result.ssh?.ok || result.server?.ok)
1756
1756
  ? CLR_SUC_P
1757
1757
  : CLR_ERR_P,
@@ -2032,7 +2032,7 @@ window.__ModuleLoader__.load({
2032
2032
  key: 'cost-meter-notice',
2033
2033
  style: {
2034
2034
  borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)',
2035
- background: 'var(--dsw-alias-bg-layer-1, #f6f8fa)',
2035
+ background: CLR_BG_F6,
2036
2036
  padding: '12px 14px',
2037
2037
  marginBottom: '12px',
2038
2038
  },
@@ -2123,9 +2123,9 @@ window.__ModuleLoader__.load({
2123
2123
  ? h('span', {
2124
2124
  className: 'dkb-tag',
2125
2125
  style: {
2126
- background: CLR_ERR_S,
2126
+ background: CLR_ERR_S2,
2127
2127
  color: CLR_ERR_P,
2128
- borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)',
2128
+ borderColor: CLR_ERR_S2,
2129
2129
  fontWeight: 600,
2130
2130
  },
2131
2131
  title: 'Blocked by unfinished dependencies'
@@ -2143,19 +2143,19 @@ window.__ModuleLoader__.load({
2143
2143
  : null,
2144
2144
  task.cron ? h('span', { className: 'dkb-tag', title: task.cron }, 'โฐ cron') : null,
2145
2145
  task.progressDump ? h('span', { className: 'dkb-tag', title: 'PROGRESSDUMP' }, '๐Ÿ“‹ dump') : null,
2146
- task.rejectReason ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S, color: CLR_ERR_P, borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)' }, title: task.rejectReason }, 'โ†ฉ ' + t('acceptance.rejectedBadge')) : null,
2146
+ task.rejectReason ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S2, color: CLR_ERR_P, borderColor: CLR_ERR_S2 }, title: task.rejectReason }, 'โ†ฉ ' + t('acceptance.rejectedBadge')) : null,
2147
2147
  Array.isArray(task.checklist) && task.checklist.length > 0
2148
2148
  ? h('span', { className: 'dkb-tag', title: 'DoD Checklist' }, `โ˜‘ ${task.checklist.filter((i) => i.completed).length}/${task.checklist.length}`)
2149
2149
  : null,
2150
2150
  task.report?.verification?.status === 'passed'
2151
2151
  ? h('span', { className: 'dkb-tag', style: { background: CLR_SUC_S, color: CLR_SUC_P, borderColor: 'var(--dsw-alias-state-success-secondary, #4ac26b)' }, title: task.report.verification.command || 'Tests passed' }, 'โœ“ PASS')
2152
2152
  : (task.report?.verification?.status === 'failed'
2153
- ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S, color: CLR_ERR_P, borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)' }, title: task.report.verification.command || 'Tests failed' }, 'โœ— FAIL')
2153
+ ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S2, color: CLR_ERR_P, borderColor: CLR_ERR_S2 }, title: task.report.verification.command || 'Tests failed' }, 'โœ— FAIL')
2154
2154
  : null),
2155
2155
  task.costMetrics && task.costMetrics.totalTokens > 0
2156
2156
  ? h('span', {
2157
2157
  className: 'dkb-tag',
2158
- style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)' },
2158
+ style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: CLR_BUS_54 },
2159
2159
  title: 'Tokens: ' + task.costMetrics.totalTokens.toLocaleString()
2160
2160
  }, '๐Ÿช™ ' + (task.costMetrics.totalTokens / 1000).toFixed(1) + 'k' + (task.costMetrics.costFormatted ? ' ยท ' + task.costMetrics.costFormatted : ''))
2161
2161
  : null,
@@ -2729,7 +2729,7 @@ window.__ModuleLoader__.load({
2729
2729
  style: {
2730
2730
  background: CLR_BIZ_T,
2731
2731
  color: CLR_BIZ_P,
2732
- borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)',
2732
+ borderColor: CLR_BUS_54,
2733
2733
  fontWeight: '600',
2734
2734
  fontSize: '11px',
2735
2735
  },
@@ -3218,7 +3218,7 @@ window.__ModuleLoader__.load({
3218
3218
  ? h('div', {
3219
3219
  style: {
3220
3220
  margin: '6px 0', padding: '10px 12px',
3221
- background: CLR_ERR_S,
3221
+ background: CLR_ERR_S2,
3222
3222
  border: '1px solid var(--dsw-alias-state-error-primary, #cf222e)',
3223
3223
  borderRadius: 8, fontSize: 12, display: 'flex', flexDirection: 'column', gap: 4,
3224
3224
  },
@@ -3409,7 +3409,7 @@ window.__ModuleLoader__.load({
3409
3409
  ? h('div', {
3410
3410
  style: {
3411
3411
  margin: '8px 0', padding: '10px 12px',
3412
- background: CLR_ERR_S,
3412
+ background: CLR_ERR_S2,
3413
3413
  border: '1px solid var(--dsw-alias-state-error-primary, #cf222e)',
3414
3414
  borderRadius: 8, fontSize: 12, display: 'flex', flexDirection: 'column', gap: 6,
3415
3415
  },
@@ -3512,13 +3512,13 @@ window.__ModuleLoader__.load({
3512
3512
  h('div', { className: 'dkb-group' }, t('task.progressDump')),
3513
3513
  h('pre', {
3514
3514
  style: {
3515
- background: 'var(--dsw-alias-bg-layer-1, #f6f8fa)', padding: 8, borderRadius: 6, fontSize: 12,
3515
+ background: CLR_BG_F6, padding: 8, borderRadius: 6, fontSize: 12,
3516
3516
  whiteSpace: 'pre-wrap', maxHeight: 150, overflowY: 'auto', margin: 0,
3517
3517
  },
3518
3518
  }, openTask.progressDump),
3519
3519
  )
3520
3520
  : null,
3521
- h('div', { style: { margin: '6px 0', padding: 10, background: CLR_BG_L1, border: BDR_L2, borderRadius: 6 } },
3521
+ h('div', { style: { margin: '6px 0', padding: 10, background: CLR_BG_F6, border: BDR_L2, borderRadius: 6 } },
3522
3522
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6 } },
3523
3523
  h('span', { className: 'dkb-group', style: { margin: 0 } },
3524
3524
  '๐Ÿ‘‘ ' + t('epic.subtasks') + (subtasks.length > 0 ? ` (${subtasks.filter(s => s.column === 'done').length}/${subtasks.length})` : '')
@@ -3729,23 +3729,23 @@ window.__ModuleLoader__.load({
3729
3729
  ),
3730
3730
  h('span', {
3731
3731
  className: 'dkb-tag',
3732
- style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)' }
3732
+ style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: CLR_BUS_54 }
3733
3733
  }, openTask.costMetrics.costFormatted || '$0.00'),
3734
3734
  ),
3735
3735
  h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 8, fontSize: '11px', textAlign: 'center' } },
3736
- h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
3736
+ h('div', { style: { background: CLR_BG_F6, padding: '6px', borderRadius: '4px' } },
3737
3737
  h('div', { style: { opacity: 0.7 } }, t('telemetry.tokens')),
3738
3738
  h('div', { style: { fontWeight: 600 } }, openTask.costMetrics.totalTokens.toLocaleString()),
3739
3739
  ),
3740
- h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
3740
+ h('div', { style: { background: CLR_BG_F6, padding: '6px', borderRadius: '4px' } },
3741
3741
  h('div', { style: { opacity: 0.7 } }, t('telemetry.input')),
3742
3742
  h('div', { style: { fontWeight: 600 } }, (openTask.costMetrics.uncachedInputTokens || 0).toLocaleString()),
3743
3743
  ),
3744
- h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
3744
+ h('div', { style: { background: CLR_BG_F6, padding: '6px', borderRadius: '4px' } },
3745
3745
  h('div', { style: { opacity: 0.7 } }, t('telemetry.output')),
3746
3746
  h('div', { style: { fontWeight: 600 } }, (openTask.costMetrics.outputTokens || 0).toLocaleString()),
3747
3747
  ),
3748
- h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
3748
+ h('div', { style: { background: CLR_BG_F6, padding: '6px', borderRadius: '4px' } },
3749
3749
  h('div', { style: { opacity: 0.7 } }, t('telemetry.cache')),
3750
3750
  h('div', { style: { fontWeight: 600 } }, (openTask.costMetrics.cacheReadTokens || 0).toLocaleString()),
3751
3751
  ),
@@ -3791,7 +3791,7 @@ window.__ModuleLoader__.load({
3791
3791
  className: 'dkb-warnBox',
3792
3792
  style: {
3793
3793
  margin: '4px 0', padding: 10,
3794
- background: CLR_ERR_S,
3794
+ background: CLR_ERR_S2,
3795
3795
  border: '1px solid var(--dsw-alias-state-error-secondary, #ffc1c0)',
3796
3796
  borderRadius: 6,
3797
3797
  },
@@ -3855,7 +3855,7 @@ window.__ModuleLoader__.load({
3855
3855
  style: {
3856
3856
  fontWeight: 'bold', fontSize: 10, padding: '1px 4px', borderRadius: 3,
3857
3857
  background: f.status === 'added' ? CLR_SUC_S
3858
- : (f.status === 'deleted' ? CLR_ERR_S
3858
+ : (f.status === 'deleted' ? CLR_ERR_S2
3859
3859
  : CLR_WRN_S),
3860
3860
  color: f.status === 'added' ? CLR_SUC_P
3861
3861
  : (f.status === 'deleted' ? CLR_ERR_P
@@ -3926,7 +3926,7 @@ window.__ModuleLoader__.load({
3926
3926
  ? h('button', {
3927
3927
  type: 'button', className: 'dkb-save',
3928
3928
  disabled: merging,
3929
- style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: 'var(--dsw-alias-label-primary-inverted, #fff)' },
3929
+ style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: CLR_LBL_INV },
3930
3930
  onClick: async () => {
3931
3931
  try {
3932
3932
  setMerging(true)
@@ -3956,7 +3956,7 @@ window.__ModuleLoader__.load({
3956
3956
  ? h('button', {
3957
3957
  type: 'button', className: 'dkb-save',
3958
3958
  disabled: prCreating,
3959
- style: { background: CLR_BIZ_P, color: 'var(--dsw-alias-label-primary-inverted, #fff)' },
3959
+ style: { background: CLR_BIZ_P, color: CLR_LBL_INV },
3960
3960
  onClick: async () => {
3961
3961
  setPrCreating(true)
3962
3962
  try {
@@ -3974,7 +3974,7 @@ window.__ModuleLoader__.load({
3974
3974
  createdPr
3975
3975
  ? h('a', {
3976
3976
  className: 'dkb-save',
3977
- style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: 'var(--dsw-alias-label-primary-inverted, #fff)', textDecoration: 'none', display: 'inline-flex', alignItems: 'center' },
3977
+ style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: CLR_LBL_INV, textDecoration: 'none', display: 'inline-flex', alignItems: 'center' },
3978
3978
  href: createdPr.html_url,
3979
3979
  target: '_blank', rel: 'noopener noreferrer',
3980
3980
  }, 'โ†— ' + t('pr.view') + ` #${createdPr.number}`)
@@ -4032,7 +4032,7 @@ window.__ModuleLoader__.load({
4032
4032
  key: idx,
4033
4033
  style: {
4034
4034
  display: 'flex', flexDirection: 'column', gap: 2, padding: '4px 8px',
4035
- background: item.completed ? CLR_BG_L1 : CLR_BG_L3,
4035
+ background: item.completed ? CLR_BG_F6 : CLR_BG_L3,
4036
4036
  borderRadius: 6, border: BDR_L2,
4037
4037
  },
4038
4038
  },
@@ -4119,7 +4119,7 @@ window.__ModuleLoader__.load({
4119
4119
  ? h('div', {
4120
4120
  style: {
4121
4121
  margin: '6px 0', padding: 10,
4122
- background: CLR_BG_L1,
4122
+ background: CLR_BG_F6,
4123
4123
  border: BDR_L2,
4124
4124
  borderRadius: 6,
4125
4125
  },
@@ -4179,7 +4179,7 @@ window.__ModuleLoader__.load({
4179
4179
  className: 'dkb-tag',
4180
4180
  style: {
4181
4181
  fontWeight: 600,
4182
- background: c.role === 'agent' ? CLR_BG_L1 : CLR_BG_L2,
4182
+ background: c.role === 'agent' ? CLR_BG_F6 : CLR_BG_L2,
4183
4183
  },
4184
4184
  }, c.role === 'agent' ? t('comments.authorAgent') : (c.author || t('comments.authorUser'))),
4185
4185
  h('span', { style: { color: 'var(--dsw-alias-label-tertiary)', fontSize: 11 } },
@@ -4975,6 +4975,10 @@ window.__ModuleLoader__.load({
4975
4975
  )
4976
4976
  }
4977
4977
 
4978
+ const CLR_ERR_S2 = 'var(--dsw-alias-state-error-secondary, #ffc1c0)'
4979
+ const CLR_BG_F6 = 'var(--dsw-alias-bg-layer-1, #f6f8fa)'
4980
+ const CLR_BUS_54 = 'var(--dsw-alias-state-business-tertiary, #54aeff)'
4981
+ const CLR_LBL_INV = 'var(--dsw-alias-label-primary-inverted, #fff)'
4978
4982
  const CLR_ERR_P = 'var(--dsw-alias-state-error-primary, #cf222e)'
4979
4983
  const CLR_ERR_S = 'var(--dsw-alias-state-error-secondary, #ffebe9)'
4980
4984
  const CLR_BIZ_P = 'var(--dsw-alias-state-business-primary, #0969da)'
@@ -5026,6 +5030,8 @@ window.__ModuleLoader__.load({
5026
5030
  }
5027
5031
  }
5028
5032
 
5033
+ let layoutService = null
5034
+ const selectPanel = (id) => { layoutService?.selectPanel?.(id) }
5029
5035
  function createFallbackNavEntry(ctx, toggle, label) {
5030
5036
  const sE = document.querySelector('nav[class*="panelList"] > [class*="panelEntry"], [class*="panelEntry"]')
5031
5037
  const sR = sE?.querySelector('button[class*="panelRow"], button')
@@ -5053,7 +5059,7 @@ window.__ModuleLoader__.load({
5053
5059
  btn.addEventListener('click', (e) => {
5054
5060
  e.preventDefault()
5055
5061
  e.stopPropagation()
5056
- if (typeof ctx?.layout?.selectPanel === 'function') ctx.layout.selectPanel(toggle.isOpen() ? null : 'kanban')
5062
+ selectPanel(toggle.isOpen() ? null : 'kanban')
5057
5063
  toggle.toggle()
5058
5064
  })
5059
5065
  return item
@@ -5129,7 +5135,7 @@ window.__ModuleLoader__.load({
5129
5135
  col.appendChild(container)
5130
5136
  root = ReactDOM.createRoot(container)
5131
5137
  root.render(h(BoardScreen, { ctx, toggle, onClose: () => {
5132
- if (typeof ctx?.layout?.selectPanel === 'function') ctx.layout.selectPanel(null)
5138
+ selectPanel(null)
5133
5139
  toggle.set(false)
5134
5140
  } }))
5135
5141
  }
@@ -5256,24 +5262,27 @@ window.__ModuleLoader__.load({
5256
5262
  ctx.slots.register({
5257
5263
  name: 'main', key: 'kanban', locale: NS,
5258
5264
  inject: () => ({ ctx, toggle, onClose: () => {
5259
- if (typeof ctx?.layout?.selectPanel === 'function') ctx.layout.selectPanel(null)
5265
+ selectPanel(null)
5260
5266
  toggle.set(false)
5261
5267
  } }),
5262
5268
  }, BoardScreen)
5263
5269
  })
5264
5270
  const toggle = createToggle()
5265
- if (ctx?.layout?.panelInfo?.subscribe) {
5266
- const pInfo = ctx.layout.panelInfo
5267
- ctx.effect(() => {
5268
- const sync = () => {
5269
- const act = (pInfo.getSnapshot ? pInfo.getSnapshot() : pInfo)?.activePanelId
5270
- if (act === 'kanban' && !toggle.isOpen()) toggle.set(true)
5271
- else if (act !== 'kanban' && act !== undefined && toggle.isOpen()) toggle.set(false)
5272
- }
5273
- sync()
5274
- return pInfo.subscribe(sync)
5275
- }, 'dsh-kanban: sync layout activePanel')
5271
+ const bindLayout = () => {
5272
+ const p = layoutService?.panelInfo
5273
+ if (!p?.subscribe) return
5274
+ const sync = () => {
5275
+ const a = (p.getSnapshot ? p.getSnapshot() : p)?.activePanelId
5276
+ if (a === 'kanban' && !toggle.isOpen()) toggle.set(true)
5277
+ else if (a !== 'kanban' && a !== undefined && toggle.isOpen()) toggle.set(false)
5278
+ }
5279
+ sync()
5280
+ if (typeof ctx?.effect === 'function') ctx.effect(() => p.subscribe(sync), 'dsh-kanban: layout')
5281
+ else p.subscribe(sync)
5276
5282
  }
5283
+ if (typeof ctx?.inject === 'function') {
5284
+ try { ctx.inject(['layout'], (sc) => { layoutService = sc?.layout || null; bindLayout() }) } catch (_) { /* bestEffort: optional layout */ }
5285
+ } else if (ctx?.layout) { layoutService = ctx.layout; bindLayout() }
5277
5286
  ctx.effect(() => {
5278
5287
  const off = [mountSidebarEntry(ctx, toggle, fallbackT('section.label')), mountBoard(ctx, toggle)]
5279
5288
  return () => { for (const fn of off) fn() }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-kanban",
3
- "version": "0.2.42",
3
+ "version": "0.2.43",
4
4
  "description": "Visual Kanban board for DeepSeek Harness: Gitea and GitHub-backed tasks, workflow columns, and a dedicated agent session per task.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -50,7 +50,8 @@
50
50
  "inject": [
51
51
  "@deepseek-ai/dsh-client-locale",
52
52
  "@deepseek-ai/dsh-client-ui-settings",
53
- "@deepseek-ai/dsh-client-ui-slots"
53
+ "@deepseek-ai/dsh-client-ui-slots",
54
+ "@deepseek-ai/dsh-client-ui-layout"
54
55
  ]
55
56
  }
56
57
  },