dsh-life-pack 0.1.1 → 0.2.0

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/dist/client.js CHANGED
@@ -28,7 +28,6 @@ window.__ModuleLoader__.load({
28
28
  //#endregion
29
29
  let react = require("react");
30
30
  react = __toESM(react, 1);
31
- //#region src/nav.ts
32
31
  function dualInstallCmd(singlePlugin) {
33
32
  return "dsh plugin add dsh-life-pack " + singlePlugin;
34
33
  }
@@ -77,34 +76,151 @@ window.__ModuleLoader__.load({
77
76
  plugin: "dsh-bill-ilife"
78
77
  }
79
78
  ];
79
+ function recoFor(tab) {
80
+ const installCmd = dualInstallCmd(tab.plugin);
81
+ return {
82
+ ...tab,
83
+ kind: "reco",
84
+ installCmd,
85
+ hint: "未安装[" + tab.plugin + "],请补装后使用:" + installCmd
86
+ };
87
+ }
80
88
  //#endregion
81
89
  //#region src/client.ts
82
- /** dsh-life-pack client 适配器(六边形:browser 侧)。
90
+ /** dsh-life-pack client 适配器(六边形:browser 侧;爱生活单卡方案)。
83
91
  *
84
- * 真实 DSH 契约(出处见 docs/agents/dsh-client-contract.md):
92
+ * 真实 DSH 契约(出处见 docs/agents/dsh-client-contract.md §5/§11):
85
93
  * - 本文件经 tsdown 打成 loader 工厂包(browser/CJS + 注册包裹),classic 执行
86
94
  * 只注册,副作用全在 factory 内;传递闭包禁 node 内建与 ESM 语法(回路
87
95
  * test/client-bundle-48.test.mjs 看门)。
88
- * - inject 短名 ['slots'](总管机制范围无 RPC,不声明 connection);apply 只注册
89
- * 一处 settings.section(kind list,id 必填)。
90
- * - 组件 React.createElement 手写(禁 JSX),纯渲染 MANAGER_TABS 六行
91
- * (title/slotId/order)+ 每行补装命令(dualInstallCmd)只读文本——无假导航
92
- * (无真实导航 API 就不装有)、无轮询、无 document/window/process。
96
+ * - inject 短名 ['slots'](总管机制范围无 RPC,不声明 connection,不碰 sidebar);
97
+ * apply 只注册一处 DSH设置面板槽(kind list,id 必填)。
98
+ * - 爱生活页签条走 slot 驱动(settings-plugins 先例,禁纯 useState 手画 tab):
99
+ * section 声明 children 爱生活页签槽,各技能往里注册自家技能设置页;
100
+ * tab 行从 ledger 投影(entries+getVersion+subscribe),面板用 props.renderSlot
101
+ * 按 `{only}` 投影(一次只挂载一个)+ visited 缓存;ledger 无某技能=缺席,
102
+ * 显示推荐安装只读文本(不返空冒充)。
103
+ * - 组件 React.createElement 手写(禁 JSX),无数据轮询、无 document/window/process。
93
104
  */
94
105
  const inject = ["slots"];
95
- function LifePackSection() {
96
- return react.createElement("div", null, react.createElement("h2", null, "爱生活总管"), MANAGER_TABS.map((t) => react.createElement("div", { key: t.slotId }, react.createElement("div", null, t.title + " · " + t.slotId + " · order " + String(t.order)), react.createElement("code", null, dualInstallCmd(t.plugin)))));
106
+ /** 爱生活页签槽(总管声明的 children,技能设置页注册进来;单段名,避开官方 settings.* 前缀)。 */
107
+ const CONFIG_TAB_SLOT = "ilife.config-tab";
108
+ /** 标签解析(resolveSlotLabel 同形:thunk 跟活,无则空字串;见 slots lib:27-29)。 */
109
+ function resolveLabel(label) {
110
+ if (typeof label === "function") return label();
111
+ return label ?? "";
112
+ }
113
+ /** 缺席文案(grill 定案 Q2/Q5:调不通=没装;只读文本,不做假导航)。 */
114
+ function absentHint(tab) {
115
+ return recoFor(tab).hint;
116
+ }
117
+ /** 爱生活面板:总设置区 + 爱生活页签条(slot 驱动)+ 技能设置页投影/缺席文案。 */
118
+ function LifePackSection(props) {
119
+ const tabsId = react.useId();
120
+ const tabRefs = react.useRef([]);
121
+ const rows = props.useTabs((value) => value);
122
+ const present = new Set(rows.map((r) => r.id));
123
+ const [activeId, setActiveId] = react.useState(void 0);
124
+ const [visitedIds, setVisitedIds] = react.useState(() => /* @__PURE__ */ new Set());
125
+ const active = MANAGER_TABS.some((t) => t.plugin === activeId) ? activeId : MANAGER_TABS[0].plugin;
126
+ react.useEffect(() => {
127
+ setVisitedIds((previous) => {
128
+ if (previous.has(active)) return previous;
129
+ return /* @__PURE__ */ new Set([...previous, active]);
130
+ });
131
+ }, [active]);
132
+ function labelFor(tab) {
133
+ const row = rows.find((r) => r.id === tab.plugin);
134
+ return row && row.label.length > 0 ? row.label : tab.title;
135
+ }
136
+ function onTabKeyDown(event, index) {
137
+ let nextIndex;
138
+ switch (event.key) {
139
+ case "ArrowRight":
140
+ nextIndex = (index + 1) % MANAGER_TABS.length;
141
+ break;
142
+ case "ArrowLeft":
143
+ nextIndex = (index - 1 + MANAGER_TABS.length) % MANAGER_TABS.length;
144
+ break;
145
+ case "Home":
146
+ nextIndex = 0;
147
+ break;
148
+ case "End":
149
+ nextIndex = MANAGER_TABS.length - 1;
150
+ break;
151
+ default: return;
152
+ }
153
+ event.preventDefault();
154
+ const next = MANAGER_TABS[nextIndex];
155
+ setActiveId(next.plugin);
156
+ tabRefs.current[nextIndex]?.focus();
157
+ }
158
+ return react.createElement("div", null, react.createElement("h2", null, "爱生活"), react.createElement("div", null, react.createElement("div", null, "总开关 · 开关(缺省启用,只读)"), react.createElement("div", null, "总管 dsh-life-pack · 0.2.0")), react.createElement("div", {
159
+ role: "tablist",
160
+ "aria-label": "爱生活技能页签"
161
+ }, MANAGER_TABS.map((tab, index) => {
162
+ const selected = tab.plugin === active;
163
+ return react.createElement("button", {
164
+ key: tab.plugin,
165
+ ref: (element) => {
166
+ tabRefs.current[index] = element;
167
+ },
168
+ id: tabsId + "-tab-" + tab.plugin,
169
+ type: "button",
170
+ role: "tab",
171
+ "aria-selected": selected,
172
+ "aria-controls": tabsId + "-panel-" + tab.plugin,
173
+ tabIndex: selected ? 0 : -1,
174
+ onClick: () => {
175
+ setActiveId(tab.plugin);
176
+ },
177
+ onKeyDown: (event) => {
178
+ onTabKeyDown(event, index);
179
+ }
180
+ }, labelFor(tab));
181
+ })), MANAGER_TABS.filter((tab) => tab.plugin === active || visitedIds.has(tab.plugin)).map((tab) => {
182
+ const selected = tab.plugin === active;
183
+ return react.createElement("div", {
184
+ key: tab.plugin,
185
+ id: tabsId + "-panel-" + tab.plugin,
186
+ role: "tabpanel",
187
+ "aria-labelledby": tabsId + "-tab-" + tab.plugin,
188
+ hidden: !selected
189
+ }, present.has(tab.plugin) ? props.renderSlot(CONFIG_TAB_SLOT, {}, { only: tab.plugin }) : absentHint(tab));
190
+ }));
97
191
  }
98
192
  function apply(ctx) {
193
+ let tabsVersion = -1;
194
+ let tabs = [];
195
+ const sectionInjected = () => ({ hooks: { tabs: {
196
+ getSnapshot: () => {
197
+ const version = ctx.slots.getVersion(CONFIG_TAB_SLOT);
198
+ if (version !== tabsVersion) {
199
+ tabsVersion = version;
200
+ tabs = ctx.slots.entries(CONFIG_TAB_SLOT).map((entry) => ({
201
+ id: entry.options.id ?? "",
202
+ order: entry.options.order ?? 0,
203
+ label: resolveLabel(entry.options.label)
204
+ })).sort((a, b) => a.order - b.order);
205
+ }
206
+ return tabs;
207
+ },
208
+ subscribe: (listener) => ctx.slots.subscribe(CONFIG_TAB_SLOT, listener)
209
+ } } });
99
210
  ctx.slots.inject("settings.section", () => ctx.slots.register({
100
211
  name: "settings.section",
101
212
  id: "dsh-life-pack",
102
213
  order: 21,
103
- label: () => "爱生活总管",
104
- inject: () => ({})
214
+ label: () => "爱生活",
215
+ inject: sectionInjected,
216
+ children: { "ilife.config-tab": {
217
+ kind: "list",
218
+ scope: "root"
219
+ } }
105
220
  }, LifePackSection));
106
221
  }
107
222
  //#endregion
223
+ exports.CONFIG_TAB_SLOT = CONFIG_TAB_SLOT;
108
224
  exports.apply = apply;
109
225
  exports.inject = inject;
110
226
  return module.exports;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["React"],"sources":["../src/nav.ts","../src/client.ts"],"sourcesContent":["/** dsh-life-pack 导航表(P10 脚手架,P3 #4 定案 order)。\n *\n * 总管只导航:6 tab 描述子仅做 openTab 路径导航,内容由各单品包自注册\n * slot 提供;总管不 import 任何单品页/单品包(见 boundaries 断言)。\n * 缺席纯条件渲染:present 缺谁就回谁的 reco(推荐安装+补装提示),不轮询。\n * 子页不占栏:卡路里 diet/exercise/goal 等 ilife:calorie:* 后缀只在单品\n * 主面板内导航,绝不在此表另起 tab 行。\n * 60 deck:map 为 matt 探针已占位,本表不动它。\n */\n\nexport interface ManagerTab {\n readonly skill: string;\n readonly slotId: string;\n readonly order: number;\n readonly title: string;\n /** 提供该 tab 的单品插件包名(仅文档级引用,不 import)。 */\n readonly plugin: string;\n}\n\nexport interface RecoTab extends ManagerTab {\n readonly kind: 'reco';\n /** 补装命令(单命令双包口径,总管必须已在位)。 */\n readonly installCmd: string;\n readonly hint: string;\n}\n\nexport const MANAGER_PLUGIN = 'dsh-life-pack' as const;\n\nexport const DUAL_ADD_PREFIX = 'dsh plugin add dsh-life-pack' as const;\n\nexport function dualInstallCmd(singlePlugin: string): string {\n return DUAL_ADD_PREFIX + ' ' + singlePlugin;\n}\n\n/** P3 定案 6 tab(order 升序即 + 号菜单顺序;已打开条不受 order 控制)。 */\nexport const MANAGER_TABS: readonly ManagerTab[] = [\n { skill: 'memo', slotId: 'ilife:memo', order: 70, title: '备忘录', plugin: 'dsh-memo-ilife' },\n { skill: 'calorie', slotId: 'ilife:calorie', order: 75, title: '卡路里', plugin: 'dsh-calorie' },\n { skill: 'schedule', slotId: 'ilife:schedule', order: 80, title: '作息', plugin: 'dsh-schedule-ilife' },\n { skill: 'home', slotId: 'ilife:home', order: 85, title: '居家', plugin: 'dsh-home-ilife' },\n { skill: 'chef', slotId: 'ilife:chef', order: 90, title: '大厨', plugin: 'dsh-chef' },\n { skill: 'bill', slotId: 'ilife:cookie', order: 95, title: '记账', plugin: 'dsh-bill-ilife' },\n];\n\nexport function recoFor(tab: ManagerTab): RecoTab {\n const installCmd = dualInstallCmd(tab.plugin);\n return {\n ...tab,\n kind: 'reco',\n installCmd,\n hint: '未安装[' + tab.plugin + '],请补装后使用:' + installCmd,\n };\n}\n\nexport type Presence = ReadonlySet<string>;\n\nexport function tabsForPresence(present: Presence): readonly (ManagerTab | RecoTab)[] {\n return MANAGER_TABS.map((t) => (present.has(t.slotId) ? t : recoFor(t)));\n}\n\nexport interface OpenPort {\n openTab(seed: { readonly type: string; readonly path: string }, scope?: { readonly sessionId?: string }): void;\n}\n\nexport interface HasTabsPort extends OpenPort {\n hasTabs(): boolean;\n}\n\n/** 总管导航:只做 openTab 路径导航(内容型打开),缺席由调用方渲染 reco。 */\nexport function openManagerTab(port: HasTabsPort, slotId: string, sessionId?: string): void {\n if (!port.hasTabs()) return;\n port.openTab({ type: slotId, path: slotId }, sessionId ? { sessionId } : undefined);\n}\n","/** dsh-life-pack client 适配器(六边形:browser 侧)。\n *\n * 真实 DSH 契约(出处见 docs/agents/dsh-client-contract.md):\n * - 本文件经 tsdown 打成 loader 工厂包(browser/CJS + 注册包裹),classic 执行\n * 只注册,副作用全在 factory 内;传递闭包禁 node 内建与 ESM 语法(回路\n * test/client-bundle-48.test.mjs 看门)。\n * - inject 短名 ['slots'](总管机制范围无 RPC,不声明 connection);apply 只注册\n * 一处 settings.section(kind list,id 必填)。\n * - 组件 React.createElement 手写(禁 JSX),纯渲染 MANAGER_TABS 六行\n * (title/slotId/order)+ 每行补装命令(dualInstallCmd)只读文本——无假导航\n * (无真实导航 API 就不装有)、无轮询、无 document/window/process。\n */\n\nimport * as React from 'react';\nimport { MANAGER_TABS, dualInstallCmd } from './nav.js';\nimport type { ClientCtx } from './dsh-ctx.js';\n\nexport const inject = ['slots'];\n\nfunction LifePackSection(): React.ReactElement {\n return React.createElement(\n 'div',\n null,\n React.createElement('h2', null, '爱生活总管'),\n MANAGER_TABS.map((t) =>\n React.createElement(\n 'div',\n { key: t.slotId },\n React.createElement('div', null, t.title + ' · ' + t.slotId + ' · order ' + String(t.order)),\n React.createElement('code', null, dualInstallCmd(t.plugin)),\n ),\n ),\n );\n}\n\nexport function apply(ctx: ClientCtx): void {\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: 'dsh-life-pack',\n order: 21,\n label: () => '爱生活总管',\n inject: () => ({}),\n },\n LifePackSection,\n ),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BA,SAAgB,eAAe,cAA8B;GAC3D,OAAO,kCAAwB;EACjC;;EAGA,MAAa,eAAsC;GACjD;IAAE,OAAO;IAAQ,QAAQ;IAAc,OAAO;IAAI,OAAO;IAAO,QAAQ;GAAiB;GACzF;IAAE,OAAO;IAAW,QAAQ;IAAiB,OAAO;IAAI,OAAO;IAAO,QAAQ;GAAc;GAC5F;IAAE,OAAO;IAAY,QAAQ;IAAkB,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAqB;GACpG;IAAE,OAAO;IAAQ,QAAQ;IAAc,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAiB;GACxF;IAAE,OAAO;IAAQ,QAAQ;IAAc,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAW;GAClF;IAAE,OAAO;IAAQ,QAAQ;IAAgB,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAiB;EAC5F;;;;;;;;;;;;;;;ECzBA,MAAa,SAAS,CAAC,OAAO;EAE9B,SAAS,kBAAsC;GAC7C,OAAOA,MAAM,cACX,OACA,MACAA,MAAM,cAAc,MAAM,MAAM,OAAO,GACvC,aAAa,KAAK,MAChBA,MAAM,cACJ,OACA,EAAE,KAAK,EAAE,OAAO,GAChBA,MAAM,cAAc,OAAO,MAAM,EAAE,QAAQ,QAAQ,EAAE,SAAS,cAAc,OAAO,EAAE,KAAK,CAAC,GAC3FA,MAAM,cAAc,QAAQ,MAAM,eAAe,EAAE,MAAM,CAAC,CAC5D,CACF,CACF;EACF;EAEA,SAAgB,MAAM,KAAsB;GAC1C,IAAI,MAAM,OAAO,0BACf,IAAI,MAAM,SACR;IACE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,aAAa;IACb,eAAe,CAAC;GAClB,GACA,eACF,CACF;EACF"}
1
+ {"version":3,"file":"client.js","names":["React"],"sources":["../src/nav.ts","../src/client.ts"],"sourcesContent":["/** dsh-life-pack 导航表(P10 脚手架,P3 #4 定案 order)。\n *\n * 总管只导航:6 tab 描述子仅做 openTab 路径导航,内容由各单品包自注册\n * slot 提供;总管不 import 任何单品页/单品包(见 boundaries 断言)。\n * 缺席纯条件渲染:present 缺谁就回谁的 reco(推荐安装+补装提示),不轮询。\n * 子页不占栏:卡路里 diet/exercise/goal 等 ilife:calorie:* 后缀只在单品\n * 主面板内导航,绝不在此表另起 tab 行。\n * 60 deck:map 为 matt 探针已占位,本表不动它。\n */\n\nexport interface ManagerTab {\n readonly skill: string;\n readonly slotId: string;\n readonly order: number;\n readonly title: string;\n /** 提供该 tab 的单品插件包名(仅文档级引用,不 import)。 */\n readonly plugin: string;\n}\n\nexport interface RecoTab extends ManagerTab {\n readonly kind: 'reco';\n /** 补装命令(单命令双包口径,总管必须已在位)。 */\n readonly installCmd: string;\n readonly hint: string;\n}\n\nexport const MANAGER_PLUGIN = 'dsh-life-pack' as const;\n\n/** 总管版本号(与 package.json 同步,release 时一起 bump;设置页总设置区版本行唯一来源)。 */\nexport const MANAGER_VERSION = '0.2.0' as const;\n\nexport const DUAL_ADD_PREFIX = 'dsh plugin add dsh-life-pack' as const;\n\nexport function dualInstallCmd(singlePlugin: string): string {\n return DUAL_ADD_PREFIX + ' ' + singlePlugin;\n}\n\n/** P3 定案 6 tab(order 升序即 + 号菜单顺序;已打开条不受 order 控制)。 */\nexport const MANAGER_TABS: readonly ManagerTab[] = [\n { skill: 'memo', slotId: 'ilife:memo', order: 70, title: '备忘录', plugin: 'dsh-memo-ilife' },\n { skill: 'calorie', slotId: 'ilife:calorie', order: 75, title: '卡路里', plugin: 'dsh-calorie' },\n { skill: 'schedule', slotId: 'ilife:schedule', order: 80, title: '作息', plugin: 'dsh-schedule-ilife' },\n { skill: 'home', slotId: 'ilife:home', order: 85, title: '居家', plugin: 'dsh-home-ilife' },\n { skill: 'chef', slotId: 'ilife:chef', order: 90, title: '大厨', plugin: 'dsh-chef' },\n { skill: 'bill', slotId: 'ilife:cookie', order: 95, title: '记账', plugin: 'dsh-bill-ilife' },\n];\n\nexport function recoFor(tab: ManagerTab): RecoTab {\n const installCmd = dualInstallCmd(tab.plugin);\n return {\n ...tab,\n kind: 'reco',\n installCmd,\n hint: '未安装[' + tab.plugin + '],请补装后使用:' + installCmd,\n };\n}\n\nexport type Presence = ReadonlySet<string>;\n\nexport function tabsForPresence(present: Presence): readonly (ManagerTab | RecoTab)[] {\n return MANAGER_TABS.map((t) => (present.has(t.slotId) ? t : recoFor(t)));\n}\n\nexport interface OpenPort {\n openTab(seed: { readonly type: string; readonly path: string }, scope?: { readonly sessionId?: string }): void;\n}\n\nexport interface HasTabsPort extends OpenPort {\n hasTabs(): boolean;\n}\n\n/** 总管导航:只做 openTab 路径导航(内容型打开),缺席由调用方渲染 reco。 */\nexport function openManagerTab(port: HasTabsPort, slotId: string, sessionId?: string): void {\n if (!port.hasTabs()) return;\n port.openTab({ type: slotId, path: slotId }, sessionId ? { sessionId } : undefined);\n}\n","/** dsh-life-pack client 适配器(六边形:browser 侧;爱生活单卡方案)。\n *\n * 真实 DSH 契约(出处见 docs/agents/dsh-client-contract.md §5/§11):\n * - 本文件经 tsdown 打成 loader 工厂包(browser/CJS + 注册包裹),classic 执行\n * 只注册,副作用全在 factory 内;传递闭包禁 node 内建与 ESM 语法(回路\n * test/client-bundle-48.test.mjs 看门)。\n * - inject 短名 ['slots'](总管机制范围无 RPC,不声明 connection,不碰 sidebar);\n * apply 只注册一处 DSH设置面板槽(kind list,id 必填)。\n * - 爱生活页签条走 slot 驱动(settings-plugins 先例,禁纯 useState 手画 tab):\n * section 声明 children 爱生活页签槽,各技能往里注册自家技能设置页;\n * tab 行从 ledger 投影(entries+getVersion+subscribe),面板用 props.renderSlot\n * 按 `{only}` 投影(一次只挂载一个)+ visited 缓存;ledger 无某技能=缺席,\n * 显示推荐安装只读文本(不返空冒充)。\n * - 组件 React.createElement 手写(禁 JSX),无数据轮询、无 document/window/process。\n */\n\nimport * as React from 'react';\nimport { MANAGER_TABS, MANAGER_VERSION, recoFor } from './nav.js';\nimport type { ManagerTab } from './nav.js';\nimport type {\n ClientCtx,\n ConfigTabRow,\n LifePackSectionProps,\n SlotLedgerEntry,\n} from './dsh-ctx.js';\n\nexport const inject = ['slots'];\n\n/** 爱生活页签槽(总管声明的 children,技能设置页注册进来;单段名,避开官方 settings.* 前缀)。 */\nexport const CONFIG_TAB_SLOT = 'ilife.config-tab' as const;\n\n/** 标签解析(resolveSlotLabel 同形:thunk 跟活,无则空字串;见 slots lib:27-29)。 */\nfunction resolveLabel(label: SlotLedgerEntry['options']['label']): string {\n if (typeof label === 'function') return label();\n return label ?? '';\n}\n\n/** 缺席文案(grill 定案 Q2/Q5:调不通=没装;只读文本,不做假导航)。 */\nfunction absentHint(tab: ManagerTab): string {\n return recoFor(tab).hint;\n}\n\n/** 爱生活面板:总设置区 + 爱生活页签条(slot 驱动)+ 技能设置页投影/缺席文案。 */\nfunction LifePackSection(props: LifePackSectionProps): React.ReactElement {\n const tabsId = React.useId();\n const tabRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const rows: ConfigTabRow[] = props.useTabs((value) => value);\n const present = new Set(rows.map((r) => r.id));\n const [activeId, setActiveId] = React.useState<string | undefined>(undefined);\n const [visitedIds, setVisitedIds] = React.useState<ReadonlySet<string>>(() => new Set());\n const active = MANAGER_TABS.some((t) => t.plugin === activeId)\n ? (activeId as string)\n : MANAGER_TABS[0].plugin;\n React.useEffect(() => {\n setVisitedIds((previous) => {\n if (previous.has(active)) return previous;\n return new Set([...previous, active]);\n });\n }, [active]);\n function labelFor(tab: ManagerTab): string {\n const row = rows.find((r) => r.id === tab.plugin);\n return row && row.label.length > 0 ? row.label : tab.title;\n }\n function onTabKeyDown(event: React.KeyboardEvent, index: number): void {\n let nextIndex: number | undefined;\n switch (event.key) {\n case 'ArrowRight': nextIndex = (index + 1) % MANAGER_TABS.length; break;\n case 'ArrowLeft': nextIndex = (index - 1 + MANAGER_TABS.length) % MANAGER_TABS.length; break;\n case 'Home': nextIndex = 0; break;\n case 'End': nextIndex = MANAGER_TABS.length - 1; break;\n default: return;\n }\n event.preventDefault();\n const next = MANAGER_TABS[nextIndex];\n setActiveId(next.plugin);\n tabRefs.current[nextIndex]?.focus();\n }\n return React.createElement(\n 'div',\n null,\n React.createElement('h2', null, '爱生活'),\n React.createElement(\n 'div',\n null,\n React.createElement('div', null, '总开关 · 开关(缺省启用,只读)'),\n React.createElement('div', null, '总管 dsh-life-pack · ' + MANAGER_VERSION),\n ),\n React.createElement(\n 'div',\n { role: 'tablist', 'aria-label': '爱生活技能页签' },\n MANAGER_TABS.map((tab, index) => {\n const selected = tab.plugin === active;\n return React.createElement(\n 'button',\n {\n key: tab.plugin,\n ref: (element: HTMLButtonElement | null) => {\n tabRefs.current[index] = element;\n },\n id: tabsId + '-tab-' + tab.plugin,\n type: 'button',\n role: 'tab',\n 'aria-selected': selected,\n 'aria-controls': tabsId + '-panel-' + tab.plugin,\n tabIndex: selected ? 0 : -1,\n onClick: () => {\n setActiveId(tab.plugin);\n },\n onKeyDown: (event: React.KeyboardEvent) => {\n onTabKeyDown(event, index);\n },\n },\n labelFor(tab),\n );\n }),\n ),\n MANAGER_TABS.filter((tab) => tab.plugin === active || visitedIds.has(tab.plugin)).map((tab) => {\n const selected = tab.plugin === active;\n return React.createElement(\n 'div',\n {\n key: tab.plugin,\n id: tabsId + '-panel-' + tab.plugin,\n role: 'tabpanel',\n 'aria-labelledby': tabsId + '-tab-' + tab.plugin,\n hidden: !selected,\n },\n present.has(tab.plugin)\n ? (props.renderSlot(CONFIG_TAB_SLOT, {}, { only: tab.plugin }) as React.ReactNode)\n : absentHint(tab),\n );\n }),\n );\n}\n\nexport function apply(ctx: ClientCtx): void {\n // ledger 观测源(settings-plugins:1744-1767 同形;无 locale 面声明,故只订 ledger)。\n let tabsVersion = -1;\n let tabs: ConfigTabRow[] = [];\n const sectionInjected = () => ({\n hooks: {\n tabs: {\n getSnapshot: () => {\n const version = ctx.slots.getVersion(CONFIG_TAB_SLOT);\n if (version !== tabsVersion) {\n tabsVersion = version;\n tabs = ctx.slots\n .entries(CONFIG_TAB_SLOT)\n .map((entry) => ({\n id: entry.options.id ?? '',\n order: entry.options.order ?? 0,\n label: resolveLabel(entry.options.label),\n }))\n .sort((a, b) => a.order - b.order);\n }\n return tabs;\n },\n subscribe: (listener: () => void) => ctx.slots.subscribe(CONFIG_TAB_SLOT, listener),\n },\n },\n });\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: 'dsh-life-pack',\n order: 21,\n label: () => '爱生活',\n inject: sectionInjected,\n children: { 'ilife.config-tab': { kind: 'list', scope: 'root' } },\n },\n LifePackSection,\n ),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCA,SAAgB,eAAe,cAA8B;GAC3D,OAAO,kCAAwB;EACjC;;EAGA,MAAa,eAAsC;GACjD;IAAE,OAAO;IAAQ,QAAQ;IAAc,OAAO;IAAI,OAAO;IAAO,QAAQ;GAAiB;GACzF;IAAE,OAAO;IAAW,QAAQ;IAAiB,OAAO;IAAI,OAAO;IAAO,QAAQ;GAAc;GAC5F;IAAE,OAAO;IAAY,QAAQ;IAAkB,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAqB;GACpG;IAAE,OAAO;IAAQ,QAAQ;IAAc,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAiB;GACxF;IAAE,OAAO;IAAQ,QAAQ;IAAc,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAW;GAClF;IAAE,OAAO;IAAQ,QAAQ;IAAgB,OAAO;IAAI,OAAO;IAAM,QAAQ;GAAiB;EAC5F;EAEA,SAAgB,QAAQ,KAA0B;GAChD,MAAM,aAAa,eAAe,IAAI,MAAM;GAC5C,OAAO;IACL,GAAG;IACH,MAAM;IACN;IACA,MAAM,SAAS,IAAI,SAAS,cAAc;GAC5C;EACF;;;;;;;;;;;;;;;;;;EC7BA,MAAa,SAAS,CAAC,OAAO;;EAG9B,MAAa,kBAAkB;;EAG/B,SAAS,aAAa,OAAoD;GACxE,IAAI,OAAO,UAAU,YAAY,OAAO,MAAM;GAC9C,OAAO,SAAS;EAClB;;EAGA,SAAS,WAAW,KAAyB;GAC3C,OAAO,QAAQ,GAAG,CAAC,CAAC;EACtB;;EAGA,SAAS,gBAAgB,OAAiD;GACxE,MAAM,SAASA,MAAM,MAAM;GAC3B,MAAM,UAAUA,MAAM,OAAwC,CAAC,CAAC;GAChE,MAAM,OAAuB,MAAM,SAAS,UAAU,KAAK;GAC3D,MAAM,UAAU,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,EAAE,CAAC;GAC7C,MAAM,CAAC,UAAU,eAAeA,MAAM,SAA6B,KAAA,CAAS;GAC5E,MAAM,CAAC,YAAY,iBAAiBA,MAAM,+BAAoC,IAAI,IAAI,CAAC;GACvF,MAAM,SAAS,aAAa,MAAM,MAAM,EAAE,WAAW,QAAQ,IACxD,WACD,aAAa,EAAE,CAAC;GACpB,MAAM,gBAAgB;IACpB,eAAe,aAAa;KAC1B,IAAI,SAAS,IAAI,MAAM,GAAG,OAAO;KACjC,uBAAO,IAAI,IAAI,CAAC,GAAG,UAAU,MAAM,CAAC;IACtC,CAAC;GACH,GAAG,CAAC,MAAM,CAAC;GACX,SAAS,SAAS,KAAyB;IACzC,MAAM,MAAM,KAAK,MAAM,MAAM,EAAE,OAAO,IAAI,MAAM;IAChD,OAAO,OAAO,IAAI,MAAM,SAAS,IAAI,IAAI,QAAQ,IAAI;GACvD;GACA,SAAS,aAAa,OAA4B,OAAqB;IACrE,IAAI;IACJ,QAAQ,MAAM,KAAd;KACE,KAAK;MAAc,aAAa,QAAQ,KAAK,aAAa;MAAQ;KAClE,KAAK;MAAa,aAAa,QAAQ,IAAI,aAAa,UAAU,aAAa;MAAQ;KACvF,KAAK;MAAQ,YAAY;MAAG;KAC5B,KAAK;MAAO,YAAY,aAAa,SAAS;MAAG;KACjD,SAAS;IACX;IACA,MAAM,eAAe;IACrB,MAAM,OAAO,aAAa;IAC1B,YAAY,KAAK,MAAM;IACvB,QAAQ,QAAQ,UAAU,EAAE,MAAM;GACpC;GACA,OAAOA,MAAM,cACX,OACA,MACAA,MAAM,cAAc,MAAM,MAAM,KAAK,GACrCA,MAAM,cACJ,OACA,MACAA,MAAM,cAAc,OAAO,MAAM,mBAAmB,GACpDA,MAAM,cAAc,OAAO,MAAM,0BAAuC,CAC1E,GACAA,MAAM,cACJ,OACA;IAAE,MAAM;IAAW,cAAc;GAAU,GAC3C,aAAa,KAAK,KAAK,UAAU;IAC/B,MAAM,WAAW,IAAI,WAAW;IAChC,OAAOA,MAAM,cACX,UACA;KACE,KAAK,IAAI;KACT,MAAM,YAAsC;MAC1C,QAAQ,QAAQ,SAAS;KAC3B;KACA,IAAI,SAAS,UAAU,IAAI;KAC3B,MAAM;KACN,MAAM;KACN,iBAAiB;KACjB,iBAAiB,SAAS,YAAY,IAAI;KAC1C,UAAU,WAAW,IAAI;KACzB,eAAe;MACb,YAAY,IAAI,MAAM;KACxB;KACA,YAAY,UAA+B;MACzC,aAAa,OAAO,KAAK;KAC3B;IACF,GACA,SAAS,GAAG,CACd;GACF,CAAC,CACH,GACA,aAAa,QAAQ,QAAQ,IAAI,WAAW,UAAU,WAAW,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;IAC7F,MAAM,WAAW,IAAI,WAAW;IAChC,OAAOA,MAAM,cACX,OACA;KACE,KAAK,IAAI;KACT,IAAI,SAAS,YAAY,IAAI;KAC7B,MAAM;KACN,mBAAmB,SAAS,UAAU,IAAI;KAC1C,QAAQ,CAAC;IACX,GACA,QAAQ,IAAI,IAAI,MAAM,IACjB,MAAM,WAAW,iBAAiB,CAAC,GAAG,EAAE,MAAM,IAAI,OAAO,CAAC,IAC3D,WAAW,GAAG,CACpB;GACF,CAAC,CACH;EACF;EAEA,SAAgB,MAAM,KAAsB;GAE1C,IAAI,cAAc;GAClB,IAAI,OAAuB,CAAC;GAC5B,MAAM,yBAAyB,EAC7B,OAAO,EACL,MAAM;IACJ,mBAAmB;KACjB,MAAM,UAAU,IAAI,MAAM,WAAW,eAAe;KACpD,IAAI,YAAY,aAAa;MAC3B,cAAc;MACd,OAAO,IAAI,MACR,QAAQ,eAAe,CAAC,CACxB,KAAK,WAAW;OACf,IAAI,MAAM,QAAQ,MAAM;OACxB,OAAO,MAAM,QAAQ,SAAS;OAC9B,OAAO,aAAa,MAAM,QAAQ,KAAK;MACzC,EAAE,CAAC,CACF,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;KACrC;KACA,OAAO;IACT;IACA,YAAY,aAAyB,IAAI,MAAM,UAAU,iBAAiB,QAAQ;GACpF,EACF,EACF;GACA,IAAI,MAAM,OAAO,0BACf,IAAI,MAAM,SACR;IACE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,aAAa;IACb,QAAQ;IACR,UAAU,EAAE,oBAAoB;KAAE,MAAM;KAAQ,OAAO;IAAO,EAAE;GAClE,GACA,eACF,CACF;EACF"}
package/dist/dsh-ctx.d.ts CHANGED
@@ -1,9 +1,14 @@
1
1
  /** DSH ctx 最小镜像:只含本仓实际使用的面(type-only,构建期擦除,零运行时)。
2
2
  *
3
- * 每条成员的用法出处见 docs/agents/dsh-client-contract.md(附源码路径+行)。
3
+ * 每条成员的用法出处见 docs/agents/dsh-client-contract.md §5(附源码路径+行)。
4
4
  * 禁止加镜外成员:要用新能力,先在 cookbook 落出处,再加镜像。用 `import type` 引用本文件。
5
- * (本文件与各单品包内同名文件逐字一致;模板复制即用,同步源见 cookbook。)
5
+ * 注意:总管侧镜像含 ledger/子槽/renderSlot 面(爱生活单卡方案),比单品包同名文件多;
6
+ * 以 cookbook §5 为同步源,不再逐字一致。
6
7
  */
8
+ export interface SlotChildSpec {
9
+ readonly kind: 'single' | 'list' | 'keyed' | 'chain';
10
+ readonly scope: 'root' | 'session';
11
+ }
7
12
  export interface SlotsRegisterOptions {
8
13
  readonly name: string;
9
14
  readonly id?: string;
@@ -11,10 +16,51 @@ export interface SlotsRegisterOptions {
11
16
  readonly label?: string | (() => string);
12
17
  readonly locale?: string;
13
18
  readonly inject?: () => Record<string, unknown>;
19
+ readonly children?: Record<string, SlotChildSpec>;
20
+ }
21
+ /** 子槽 ledger 条目(只读投影 settings-plugins:1751-1756 同形)。 */
22
+ export interface SlotLedgerEntry {
23
+ readonly options: {
24
+ readonly id?: string;
25
+ readonly order?: number;
26
+ readonly label?: string | (() => string);
27
+ };
14
28
  }
15
29
  export interface SlotsFace {
16
30
  inject(key: string, callback: () => (() => void) | Iterable<() => void>): () => void;
17
31
  register(options: SlotsRegisterOptions, component: unknown): () => void;
32
+ entries(key: string): SlotLedgerEntry[];
33
+ getVersion(key: string): number;
34
+ subscribe(key: string, listener: () => void): () => void;
35
+ }
36
+ /** 爱生活页签槽行(总管自有形状:id=单品插件包名,order/label 随注册)。 */
37
+ export interface ConfigTabRow {
38
+ readonly id: string;
39
+ readonly order: number;
40
+ readonly label: string;
41
+ }
42
+ /** ledger 观测源(uSES 对:getSnapshot+subscribe; absent 形见 renderer:212-215)。 */
43
+ export interface TabHookSource {
44
+ getSnapshot(): ConfigTabRow[];
45
+ subscribe(listener: () => void): () => void;
46
+ }
47
+ /** hooks.tabs 绑出的选择器 hook(`use<Name>` 命名见 slots lib:7-9;
48
+ * 调用形 `(selector, equal?)` 见 renderer:203-210,用例见 settings-plugins:431)。 */
49
+ export interface UseTabsHook {
50
+ <T>(selector: (rows: ConfigTabRow[]) => T, equal?: (a: T, b: T) => boolean): T;
51
+ }
52
+ /** 组件 props 侧 renderSlot 面(仅声明过 children 的条目才有,renderer:613-614;
53
+ * 调用形 `(key, owner, opts)` 含 `{only}` 过滤,见 renderer:283-293 与 settings-plugins:511)。 */
54
+ export interface RenderSlotFace {
55
+ (key: string, ownerProps: Record<string, unknown>, opts?: {
56
+ only?: string;
57
+ }): unknown;
58
+ }
59
+ /** 爱生活 section 组件 props(kit 合成见 renderer:599-621:
60
+ * `hooks.tabs` 源出 `useTabs`,children 声明出 `renderSlot`)。 */
61
+ export interface LifePackSectionProps {
62
+ readonly renderSlot: RenderSlotFace;
63
+ readonly useTabs: UseTabsHook;
18
64
  }
19
65
  export type RpcCallResult = {
20
66
  readonly ok: true;
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;CACzE;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAE3I,MAAM,WAAW,WAAW;IAC1B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACrG;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;SAAE,CAAA;KAAE,CAAC;IACxE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC1E,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExG,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE;YAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;IACpG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC1E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B"}
1
+ {"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"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"}
package/dist/nav.d.ts CHANGED
@@ -22,6 +22,8 @@ export interface RecoTab extends ManagerTab {
22
22
  readonly hint: string;
23
23
  }
24
24
  export declare const MANAGER_PLUGIN: "dsh-life-pack";
25
+ /** 总管版本号(与 package.json 同步,release 时一起 bump;设置页总设置区版本行唯一来源)。 */
26
+ export declare const MANAGER_VERSION: "0.2.0";
25
27
  export declare const DUAL_ADD_PREFIX: "dsh plugin add dsh-life-pack";
26
28
  export declare function dualInstallCmd(singlePlugin: string): string;
27
29
  /** P3 定案 6 tab(order 升序即 + 号菜单顺序;已打开条不受 order 控制)。 */
package/dist/nav.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAG,eAAwB,CAAC;AAEvD,eAAO,MAAM,eAAe,EAAG,8BAAuC,CAAC;AAEvE,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAO7C,CAAC;AAEF,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAQhD;AAED,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAE3C,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC,UAAU,GAAG,OAAO,CAAC,EAAE,CAEpF;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChH;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1F"}
1
+ {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAG,eAAwB,CAAC;AAEvD,gEAAgE;AAChE,eAAO,MAAM,eAAe,EAAG,OAAgB,CAAC;AAEhD,eAAO,MAAM,eAAe,EAAG,8BAAuC,CAAC;AAEvE,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAO7C,CAAC;AAEF,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAQhD;AAED,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAE3C,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC,UAAU,GAAG,OAAO,CAAC,EAAE,CAEpF;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChH;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1F"}
package/dist/nav.js CHANGED
@@ -8,6 +8,8 @@
8
8
  * 60 deck:map 为 matt 探针已占位,本表不动它。
9
9
  */
10
10
  export const MANAGER_PLUGIN = 'dsh-life-pack';
11
+ /** 总管版本号(与 package.json 同步,release 时一起 bump;设置页总设置区版本行唯一来源)。 */
12
+ export const MANAGER_VERSION = '0.2.0';
11
13
  export const DUAL_ADD_PREFIX = 'dsh plugin add dsh-life-pack';
12
14
  export function dualInstallCmd(singlePlugin) {
13
15
  return DUAL_ADD_PREFIX + ' ' + singlePlugin;
package/dist/nav.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nav.js","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,MAAM,CAAC,MAAM,cAAc,GAAG,eAAwB,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,8BAAuC,CAAC;AAEvE,MAAM,UAAU,cAAc,CAAC,YAAoB;IACjD,OAAO,eAAe,GAAG,GAAG,GAAG,YAAY,CAAC;AAC9C,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAC1F,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;IAC7F,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE;IACrG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;IACzF,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;IACnF,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;CAC5F,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,GAAe;IACrC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE,MAAM;QACZ,UAAU;QACV,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,WAAW,GAAG,UAAU;KACrD,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,eAAe,CAAC,OAAiB;IAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAUD,iDAAiD;AACjD,MAAM,UAAU,cAAc,CAAC,IAAiB,EAAE,MAAc,EAAE,SAAkB;IAClF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO;IAC5B,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACtF,CAAC"}
1
+ {"version":3,"file":"nav.js","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,MAAM,CAAC,MAAM,cAAc,GAAG,eAAwB,CAAC;AAEvD,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,OAAgB,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG,8BAAuC,CAAC;AAEvE,MAAM,UAAU,cAAc,CAAC,YAAoB;IACjD,OAAO,eAAe,GAAG,GAAG,GAAG,YAAY,CAAC;AAC9C,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAC1F,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;IAC7F,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE;IACrG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;IACzF,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;IACnF,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;CAC5F,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,GAAe;IACrC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE,MAAM;QACZ,UAAU;QACV,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,WAAW,GAAG,UAAU;KACrD,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,eAAe,CAAC,OAAiB;IAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAUD,iDAAiD;AACjD,MAAM,UAAU,cAAc,CAAC,IAAiB,EAAE,MAAc,EAAE,SAAkB;IAClF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO;IAC5B,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACtF,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-life-pack",
3
- "version": "0.1.1",
4
- "description": "爱生活总管插件 P10 脚手架:6 tab 只导航+推荐安装,不依赖单品、不 import 单品页",
3
+ "version": "0.2.0",
4
+ "description": "爱生活总管插件:单 DSH设置面板槽(爱生活卡)+ 爱生活页签槽 children,技能设置页动态聚合,不依赖单品、不 import 单品页",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",