@goodandready/dsh-clinebot 0.3.12 → 0.3.14

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,33 @@ 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.14] - 2026-09-19
9
+
10
+ ### Fixed
11
+ - **The row-seat key is registered under both spellings.** The core keys a row's
12
+ configuration page as `` `${bundle.name}#${rowId}` `` (`rowConfigKey` in
13
+ `dsh-client-ui-plugin-manager`), and `bundle.name` may be either the package name
14
+ (`@goodandready/dsh-clinebot`) or the short bundle name (`dsh-clinebot`) depending
15
+ on how the manager builds its package view. Both keys are now registered for
16
+ `plugins.row.config`, so the row's configure control appears whichever spelling the
17
+ core compares against; the unused entry is inert.
18
+
19
+ ## [0.3.13] - 2026-09-19
20
+
21
+ ### Fixed
22
+ - **Settings reachable again**: the card registered into `settings.plugin.item`, a
23
+ slot the current DSH core (0.1.6-alpha.2) no longer renders, so the plugin's
24
+ settings were unreachable. The surface now registers into the Plugins page row
25
+ seat `plugins.row.config` first, keyed
26
+ `@goodandready/dsh-clinebot#dsh-clinebot` (`rowConfigKey(package, rowId)`): the
27
+ plugin's row gains a configure control whose page is the settings form
28
+ (`view: 'page'`, open and without our card chrome — the host page draws the title,
29
+ icon, crumb and padding) plus a one-line state for `view: 'summary'`. The legacy
30
+ seat stays registered as a fallback for older cores.
31
+ - The client module test now expects both seats in order.
32
+ - The change lives in `src/client/*`; `lib/client.js` is rebuilt by
33
+ `npm run build:client` (also run by `npm test`).
34
+
8
35
  ## [0.3.12] - 2026-09-16
9
36
 
10
37
  ### 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,24 @@ function apply(ctx) {
1431
1441
  }
1432
1442
  }
1433
1443
 
1444
+ // Row seat first (the seat the current core renders), legacy seat after it.
1445
+ // The core keys the seat as `<bundle name>#<row id>`; `bundle.name` may be the
1446
+ // package name or the short bundle name depending on the manager's view, so both
1447
+ // spellings are registered — the unused one is inert.
1448
+ for (const key of [ROW_CONFIG_KEY, ROW_ID + '#' + ROW_ID]) {
1449
+ registerSlotWhenReady('plugins.row.config', () =>
1450
+ ctx.slots.register(
1451
+ {
1452
+ name: 'plugins.row.config',
1453
+ key,
1454
+ locale: NS,
1455
+ inject: () => ({ ctx }),
1456
+ },
1457
+ (props) => React.createElement(ErrorBoundary, null, React.createElement(PluginCard, { ...props, ctx: (props && props.ctx) || ctx }))
1458
+ )
1459
+ )
1460
+ }
1461
+
1434
1462
  registerSlotWhenReady('settings.plugin.item', () =>
1435
1463
  ctx.slots.register(
1436
1464
  {
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.14",
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",