@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 +27 -0
- package/lib/client.js +34 -6
- package/package.json +1 -1
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
|
|
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.
|
|
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",
|