@goodandready/dsh-clinebot 0.3.12 → 0.3.13

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/CHANGELOG.md CHANGED
@@ -5,6 +5,22 @@ All notable changes to `@goodandready/dsh-clinebot` will be documented in this f
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.13] - 2026-09-19
9
+
10
+ ### Fixed
11
+ - **Settings reachable again**: the card registered into `settings.plugin.item`, a
12
+ slot the current DSH core (0.1.6-alpha.2) no longer renders, so the plugin's
13
+ settings were unreachable. The surface now registers into the Plugins page row
14
+ seat `plugins.row.config` first, keyed
15
+ `@goodandready/dsh-clinebot#dsh-clinebot` (`rowConfigKey(package, rowId)`): the
16
+ plugin's row gains a configure control whose page is the settings form
17
+ (`view: 'page'`, open and without our card chrome — the host page draws the title,
18
+ icon, crumb and padding) plus a one-line state for `view: 'summary'`. The legacy
19
+ seat stays registered as a fallback for older cores.
20
+ - The client module test now expects both seats in order.
21
+ - The change lives in `src/client/*`; `lib/client.js` is rebuilt by
22
+ `npm run build:client` (also run by `npm test`).
23
+
8
24
  ## [0.3.12] - 2026-09-16
9
25
 
10
26
  ### Changed
package/lib/client.js CHANGED
@@ -10,6 +10,9 @@ window.__ModuleLoader__.load({
10
10
 
11
11
  // --- src/client/constants.js ---
12
12
  const NS = 'dsh-clinebot'
13
+ // Plugins page row seat (DSH 0.1.6-alpha.2): key = '<package name>#<row id>'.
14
+ const ROW_ID = 'dsh-clinebot'
15
+ const ROW_CONFIG_KEY = '@goodandready/dsh-clinebot#' + ROW_ID
13
16
  const ROUTE_PREFIX = '/dsh-clinebot'
14
17
  const SNAPSHOT_LOADING = { status: 'loading', view: null }
15
18
 
@@ -1303,15 +1306,22 @@ function SettingsPage(props) {
1303
1306
 
1304
1307
  // --- src/client/plugin-card.js ---
1305
1308
  function PluginCard(props) {
1306
- const [open, setOpen] = React.useState(false)
1309
+ const page = !!(props && props.view === 'page')
1310
+ const [open, setOpen] = React.useState(!!page)
1307
1311
  const t = props?.t || makeT(en, en)
1308
1312
  React.useEffect(() => {
1309
1313
  ensureCss()
1310
1314
  }, [])
1311
1315
 
1316
+ // Row seat (plugins.row.config): the host page draws title/icon/crumb and the
1317
+ // padding, so the summary is a one-liner and the page drops our card chrome.
1318
+ if (props && props.view === 'summary') {
1319
+ return React.createElement('span', { style: { fontSize: '13px', color: 'var(--dsw-alias-label-secondary)' } }, t('subtitle'))
1320
+ }
1321
+
1312
1322
  return React.createElement(
1313
- 'li',
1314
- { className: 'cb-section-card', style: { listStyle: 'none', marginBottom: '12px' } },
1323
+ page ? 'div' : 'li',
1324
+ { className: page ? 'cb-page' : 'cb-section-card', style: page ? undefined : { listStyle: 'none', marginBottom: '12px' } },
1315
1325
  React.createElement(
1316
1326
  'button',
1317
1327
  {
@@ -1320,13 +1330,13 @@ function PluginCard(props) {
1320
1330
  background: 'none',
1321
1331
  border: 'none',
1322
1332
  cursor: 'pointer',
1323
- display: 'flex',
1333
+ display: page ? 'none' : 'flex',
1324
1334
  alignItems: 'center',
1325
1335
  width: '100%',
1326
1336
  padding: 0,
1327
1337
  textAlign: 'left',
1328
1338
  },
1329
- 'aria-expanded': open,
1339
+ 'aria-expanded': page ? true : open,
1330
1340
  onClick: () => setOpen((v) => !v),
1331
1341
  },
1332
1342
  React.createElement(
@@ -1339,7 +1349,7 @@ function PluginCard(props) {
1339
1349
  React.createElement(Chevron)
1340
1350
  )
1341
1351
  ),
1342
- open
1352
+ (page || open)
1343
1353
  ? React.createElement(
1344
1354
  'div',
1345
1355
  { style: { marginTop: '16px' } },
@@ -1431,6 +1441,19 @@ function apply(ctx) {
1431
1441
  }
1432
1442
  }
1433
1443
 
1444
+ // Row seat first (the seat the current core renders), legacy seat after it.
1445
+ registerSlotWhenReady('plugins.row.config', () =>
1446
+ ctx.slots.register(
1447
+ {
1448
+ name: 'plugins.row.config',
1449
+ key: ROW_CONFIG_KEY,
1450
+ locale: NS,
1451
+ inject: () => ({ ctx }),
1452
+ },
1453
+ (props) => React.createElement(ErrorBoundary, null, React.createElement(PluginCard, { ...props, ctx: (props && props.ctx) || ctx }))
1454
+ )
1455
+ )
1456
+
1434
1457
  registerSlotWhenReady('settings.plugin.item', () =>
1435
1458
  ctx.slots.register(
1436
1459
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-clinebot",
3
- "version": "0.3.12",
3
+ "version": "0.3.13",
4
4
  "description": "DeepSeek Harness companion for ClineBot / ClinePass: dynamic subscription models sync, quota exhaustion warnings, session metrics, dedicated settings page, live usage limits, and /cline slash-command.",
5
5
  "license": "MIT",
6
6
  "type": "module",