nx-kv 0.11.0 → 0.11.1

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
@@ -4,6 +4,21 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.11.1] - 2026-10-23 单个项目目录也能从远程导入 + 面板导入 ref/refs 键修复
8
+
9
+ ### Added
10
+
11
+ - **每个项目目录单独也能从远程导入**。目录看板的每一行操作列现在都有「导入」按钮
12
+ (全局池行同样有),点开就是同一个子弹窗:按主题筛选 + 单条勾选,导入落点是
13
+ **这一行的目录队列**——不用先点开它的队列再导。
14
+
15
+ ### Fixed
16
+
17
+ - **【面板上点「导入」什么也没发生】**。action 只读 `ctx.ref`(CLI 的 `--ref` flag 名),
18
+ 而面板 body 发的是 `refs`;HTTP body 里未声明的键会原样透传,于是 `ctx.ref` 是
19
+ undefined → 后端报「要导入的远程任务不能为空」,面板**静默导了 0 条**。
20
+ 现在 `ref` 与 `refs` 两个键都收(合并逻辑抽成纯函数 `mergeImportRefs()`,可单测)。
21
+
7
22
  ## [0.11.0] - 2026-10-23 远程任务导入 + 仓库上下文迁入 + 面板视觉收敛
8
23
 
9
24
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nx-kv",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "nx-kv — KV 清单管理中枢(远程)+ 本机本地任务队列(localtask):serve 驱动 CLI 与 Web 面板,同源同构,附带可安装 skill 供 agent 提交 / 领取 / 阻塞接收任务",
5
5
  "type": "module",
6
6
  "bin": {
@@ -147,7 +147,10 @@ export default {
147
147
  },
148
148
  run: (ctx) =>
149
149
  service.importRemoteTasks({
150
- refs: ctx.ref,
150
+ // ref(CLI 的 --ref,可给多次)与 refs(面板发的列表)**都传过去**:
151
+ // HTTP body 里未声明的键会原样透传,两边各叫各的更顺手。
152
+ ref: ctx.ref,
153
+ refs: ctx.refs,
151
154
  cwd: ctx.cwd,
152
155
  global: ctx.global,
153
156
  topic: ctx.topic,
@@ -1143,14 +1143,31 @@ async function todoService() {
1143
1143
  return todoMod;
1144
1144
  }
1145
1145
 
1146
+ /**
1147
+ * 合并两个来源的"要导入的远程任务内容":**ref**(CLI 的 `--ref`,可给多次)与
1148
+ * **refs**(面板发的列表)。
1149
+ *
1150
+ * 为什么两个键:CLI 的 flag 叫 `--ref`(沿用 todo 模块"按内容定位"的约定),
1151
+ * 面板一次要导多条,发的是 `refs`;HTTP body 里未声明的键会原样透传,所以两个
1152
+ * 都可能到 action 的 ctx 里。**只认一个就会整批丢掉**——曾经只读 `ctx.ref`,
1153
+ * 面板那次导入静默地导了 0 条。
1154
+ *
1155
+ * 单独抽成纯函数是为了能单测(真跑导入要连远程后端,单测里连不上)。
1156
+ */
1157
+ export function mergeImportRefs(refs, ref) {
1158
+ const a = Array.isArray(refs) ? refs : [];
1159
+ const b = Array.isArray(ref) ? ref : [];
1160
+ return [...a, ...b].map((r) => String(r ?? '').trim()).filter(Boolean);
1161
+ }
1162
+
1146
1163
  /**
1147
1164
  * 从远程清单导入任务到本地队列。
1148
1165
  *
1149
1166
  * @param {object} opts
1150
1167
  * @param {string} [opts.cwd] 目标本地目录(不给则用当前目录)
1151
1168
  * @param {boolean} [opts.global] true = 导入到全局共享池
1152
- * @param {Array} opts.refs 要导入的远程任务**内容整串**(按内容定位,不按 id ——
1153
- * 远程 id 会被复用,详见 todo 模块的「定位一律按内容」)
1169
+ * @param {Array} [opts.refs] 要导入的远程任务**内容整串**(面板发这个)
1170
+ * @param {Array} [opts.ref] 同上,CLI 的 `--ref` 走这个键
1154
1171
  * @param {string} [opts.topic] 远程主题(消歧用)
1155
1172
  * @param {number} [opts.pick] 同内容多条时的编号(消歧用)
1156
1173
  * @param {number|string} [opts.groupId] 远程工作空间(缺省 = 当前)
@@ -1158,12 +1175,13 @@ async function todoService() {
1158
1175
  export async function importRemoteTasks({
1159
1176
  cwd: rawCwd,
1160
1177
  global: toGlobal = false,
1161
- refs = [],
1178
+ refs,
1179
+ ref,
1162
1180
  topic,
1163
1181
  pick,
1164
1182
  groupId,
1165
1183
  } = {}) {
1166
- const list = Array.isArray(refs) ? refs.map((r) => String(r ?? '').trim()).filter(Boolean) : [];
1184
+ const list = mergeImportRefs(refs, ref);
1167
1185
  if (!list.length) throw badInput('要导入的远程任务不能为空(按内容指定 --ref)');
1168
1186
 
1169
1187
  const todo = await todoService();
@@ -1035,7 +1035,25 @@ export default function SessionTaskView() {
1035
1035
  }}
1036
1036
  title="把远程(KV 后端)上还没人领的任务勾几条搬进全局任务池"
1037
1037
  >
1038
- 从远程导入
1038
+ 导入
1039
+ </button>
1040
+ )}
1041
+ {/* 每个项目目录**单独**也能从远程导入(#73:「全局任务栏里面,队列栏
1042
+ 里面也可以从中提取」)——不用先点开它的队列,直接在看板这一行
1043
+ 把远程任务搬进这个目录的队列。 */}
1044
+ {!row.isGlobal && (
1045
+ <button
1046
+ className="btn small ghost"
1047
+ onClick={(e) => {
1048
+ e.stopPropagation();
1049
+ setModal({
1050
+ title: `从远程清单导入到「${row.name}」的队列`,
1051
+ importRemote: { global: false, cwd: row.cwd, name: row.name },
1052
+ });
1053
+ }}
1054
+ title={`把远程(KV 后端)上还没人领的任务勾几条搬进「${row.name}」的队列`}
1055
+ >
1056
+ 导入
1039
1057
  </button>
1040
1058
  )}
1041
1059
  {goal ? (
@@ -806,10 +806,12 @@ table.directory-board { min-width: 780px; table-layout: fixed; border-collapse:
806
806
  既填上了空位,也让批量删除多一个入口。 */
807
807
  .directory-board thead .board-check input { vertical-align: middle; cursor: pointer; }
808
808
  .directory-board thead .board-check input:disabled { cursor: default; opacity: 0.35; }
809
- .directory-board .board-directory { width: 40%; min-width: 240px; }
810
- .directory-board .board-task-state { width: 18%; }
811
- .directory-board .board-goal-state { width: 19%; }
812
- .directory-board .board-ops { width: 196px; }
809
+ /* 列宽:操作列塞了 4 个按钮(任务 / 目标 / 删除队列 / 导入),要给够宽度,
810
+ 不然最后一个按钮会被挤出格子。目录列相应收窄。 */
811
+ .directory-board .board-directory { width: 36%; min-width: 240px; }
812
+ .directory-board .board-task-state { width: 17%; }
813
+ .directory-board .board-goal-state { width: 17%; }
814
+ .directory-board .board-ops { width: 290px; }
813
815
  /* 行内操作:默认低调,hover/选中时全亮(把"操作"从视觉噪音里挪出去)。
814
816
  常态 0.5 太像 disabled(disabled 才是 0.4),两态分不清 → 抬到 0.7。 */
815
817
  .directory-board .board-ops .btn { opacity: 0.7; transition: opacity 0.12s, background 0.12s; }
@@ -1 +1 @@
1
- import{o as e,s as t,t as n}from"./index-bExI8RZr.js";var r=t();function i({module:t}){let{boot:i}=e(),a=(i?.commands||[]).filter(e=>e.module===t);return a.length?(0,r.jsxs)(`div`,{className:`cli-hint`,children:[(0,r.jsx)(`span`,{className:`cli-hint-label`,children:`CLI 等价(同构命令,加 --json 得机器可读输出):`}),a.map(e=>(0,r.jsx)(n,{className:`cli-cmd`,text:e.command,title:`点击复制:${e.usage}`,children:e.command},e.id))]}):null}export{i as t};
1
+ import{o as e,s as t,t as n}from"./index-CAoAkDuU.js";var r=t();function i({module:t}){let{boot:i}=e(),a=(i?.commands||[]).filter(e=>e.module===t);return a.length?(0,r.jsxs)(`div`,{className:`cli-hint`,children:[(0,r.jsx)(`span`,{className:`cli-hint-label`,children:`CLI 等价(同构命令,加 --json 得机器可读输出):`}),a.map(e=>(0,r.jsx)(n,{className:`cli-cmd`,text:e.command,title:`点击复制:${e.usage}`,children:e.command},e.id))]}):null}export{i as t};
@@ -1 +1 @@
1
- :root{--ink:#16181c;--ink-2:#4b515a;--mid:#838a93;--paper:#fff;--canvas:#f7f6f3;--soft:#f2f1ed;--soft-2:#e5e3de;--line:#e7e5e0;--live:#1f7a4d;--warn:#99690f;--danger:#b3261e;--radius:10px;--radius-sm:7px;--shadow-sm:0 1px 2px #16181c0d;--shadow:0 1px 2px #16181c0d, 0 10px 28px -16px #16181c2e;--label:"Bahnschrift", "Segoe UI Variable Display", "Segoe UI", system-ui, sans-serif;--mono:ui-monospace, "Cascadia Mono", "JetBrains Mono", "SF Mono", Menlo, Consolas, "Liberation Mono", "Courier New", monospace}*{box-sizing:border-box}body{color:var(--ink);background:var(--canvas);-webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums;margin:0;font-family:Segoe UI Variable Text,Segoe UI,system-ui,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;font-size:13px;line-height:1.5}:focus-visible{outline:2px solid var(--ink);outline-offset:1px;border-radius:4px}header{background:var(--paper);box-shadow:0 1px 0 var(--soft-2);z-index:5;align-items:center;gap:20px;padding:12px 20px;display:flex;position:sticky;top:0}.brand{letter-spacing:.4px;align-items:center;gap:7px;font-weight:800;display:inline-flex}.brand img{border-radius:5px;width:20px;height:20px;display:block}.brand .sub{color:var(--mid);margin-left:8px;font-size:12px;font-weight:400}nav{gap:2px;display:inline-flex}.tab{font:inherit;color:var(--mid);cursor:pointer;background:0 0;border:0;border-radius:7px 7px 0 0;padding:7px 12px 8px;font-size:12.5px;transition:color .15s,background .15s;position:relative}.tab:hover{color:var(--ink);background:var(--soft)}.tab.active{color:var(--ink);font-weight:600}.tab.active:after{content:"";background:var(--ink);border-radius:2px 2px 0 0;height:2px;position:absolute;bottom:0;left:10px;right:10px}.meta{color:var(--mid);margin-left:auto;font-family:ui-monospace,Consolas,monospace;font-size:11.5px}#root{flex-direction:column;min-height:100vh;display:flex}main{flex:1 0 auto;width:100%;max-width:1240px;margin:0 auto;padding:18px 20px 28px}.panel{display:none}.panel.active{display:block}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}.toolbar label{color:var(--mid);font-size:12px}.sep{background:var(--soft-2);width:1px;height:20px;margin:0 4px}.grow{max-width:340px}.compose-toolbar{align-items:center}.compose-label{color:var(--mid);white-space:nowrap;font-size:12px}.compose-bar{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-sm);min-width:0;box-shadow:var(--shadow-sm);flex:auto;align-items:stretch;transition:border-color .15s,box-shadow .15s;display:flex;overflow:hidden}.compose-bar:focus-within{border-color:var(--ink);box-shadow:0 0 0 3px #16181c0f}.compose-bar select,.compose-bar textarea{box-shadow:none;background-color:#0000;border:0;border-radius:0;padding:8px 10px}.compose-bar select:hover,.compose-bar textarea:hover{border-color:#0000}.compose-bar select{border-right:1px solid var(--line);background-color:var(--soft);flex:0 0 232px;font-size:12.5px}.compose-bar textarea{resize:vertical;flex:auto;min-width:180px;min-height:38px;line-height:1.5}.compose-bar .btn{border-radius:var(--radius-sm);flex:none;align-self:center;margin:3px}.compose-bar textarea::placeholder{color:#b3b8bd;font-size:12.5px}@media (width<=820px){.compose-toolbar{flex-direction:column;align-items:stretch;gap:6px}.compose-bar{flex-wrap:wrap}.compose-bar select{border-right:0;border-bottom:1px solid var(--line);flex:100%}.compose-bar textarea{flex:160px}.compose-bar .btn{margin:3px 3px 3px 0}table.directory-board{min-width:620px}.directory-board .board-ops{width:150px}.directory-board .board-directory{width:34%;min-width:200px}.directory-board .board-task-state{width:19%}.directory-board .board-goal-state{width:25%}.board-goal-label,.board-deadline{white-space:nowrap}}input,select,textarea{font:inherit;color:var(--ink);background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-sm);padding:6px 10px;transition:border-color .15s,box-shadow .15s}input::placeholder,textarea::placeholder{color:#b3b8bd}input:focus,select:focus,textarea:focus{border-color:var(--ink);outline:none;box-shadow:0 0 0 3px #16181c12}select{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--mid) 50%), linear-gradient(135deg, var(--mid) 50%, transparent 50%);cursor:pointer;background-position:calc(100% - 14px) 52%,calc(100% - 9px) 52%;background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-right:26px}.goal-form{flex-direction:column;gap:12px;display:flex}.goal-form-section{font-size:12px}.goal-form-title{margin-bottom:4px;font-weight:700}.goal-cwd-input{width:100%}.goal-dur-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.goal-dur-input{width:96px}.goal-dur-unit{width:92px}.goal-prompt{resize:vertical;width:100%;line-height:1.55}.goal-hint{color:var(--mid);font-size:11px}.goal-reset{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.goal-presets{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.goal-actions{align-items:center;gap:8px;margin-top:12px;display:flex}.btn{font:inherit;cursor:pointer;border-radius:var(--radius-sm);background:var(--ink);color:var(--paper);border:0;padding:6px 12px;transition:opacity .15s,background .15s,color .15s}.btn:hover{opacity:.86}.btn.ghost{background:var(--soft);color:var(--ink)}.btn.ghost:hover{background:var(--soft-2);opacity:1}.btn.ghost.danger{color:var(--danger);background:0 0;border:1px solid #b3261e4d}.btn.ghost.danger:hover{opacity:1;background:#b3261e12}.btn.small{border-radius:7px;padding:3px 9px;font-size:12px}.btn:disabled{opacity:.4;cursor:default}.btn.danger{color:#fff;background:#b3261e}.toast-stack{z-index:60;pointer-events:none;flex-direction:column;align-items:center;gap:8px;display:flex;position:fixed;bottom:28px;left:50%;transform:translate(-50%)}.toast{background:var(--ink);color:var(--paper);white-space:pre-wrap;word-break:break-all;border-radius:10px;max-width:72vw;padding:9px 16px;font-size:12.5px;box-shadow:0 8px 24px #14161a40}.dlg{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:50;background:#fbfbfcdb;justify-content:center;align-items:flex-start;padding:96px 16px;display:flex;position:fixed;inset:0}.dlg-box{background:var(--paper);border-radius:var(--radius);width:min(460px,94vw);padding:16px 18px;box-shadow:0 12px 40px #14161a29}.dlg-title{margin-bottom:6px;font-weight:700}.dlg-msg{color:var(--ink);white-space:pre-wrap;word-break:break-all;margin-bottom:6px}.dlg-input{width:100%;margin:8px 0 4px;font-family:ui-monospace,Consolas,monospace;font-size:12.5px}.dlg-acts{justify-content:flex-end;gap:8px;margin-top:12px;display:flex}.card{background:var(--paper);border-radius:var(--radius);margin-bottom:12px;padding:10px 12px;box-shadow:0 0 0 1px #16181c12}.card.hidden{display:none}.fold-row{border-top:1px solid var(--line);margin-top:8px;padding-top:2px}.fold-row>summary{cursor:pointer;color:var(--ink-2);align-items:center;gap:7px;padding:7px 2px;font-size:12.5px;font-weight:600;list-style:none;display:flex}.fold-row>summary::-webkit-details-marker{display:none}.fold-row>summary:before{content:"▸";color:var(--mid);font-size:10px}.fold-row[open]>summary:before{content:"▾"}.fold-row>summary:hover{color:var(--ink)}.fold-row table{margin-top:4px}.localtask-cli-reference{margin-top:10px}.localtask-cli-reference>details>summary{cursor:pointer;color:var(--ink-2);align-items:center;gap:7px;padding:7px 2px;font-size:12.5px;font-weight:600;list-style:none;display:flex}.localtask-cli-reference>details>summary::-webkit-details-marker{display:none}.localtask-cli-reference>details>summary:before{content:"▸";color:var(--mid);font-size:10px}.localtask-cli-reference>details[open]>summary:before{content:"▾"}.localtask-cli-reference>details>summary:hover{color:var(--ink)}.import-remote-entry{flex-wrap:wrap;align-items:center;gap:8px;margin:-2px 0 8px;font-size:11.5px;display:flex}.import-remote-bar{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:10px;display:flex}.import-remote-bar label{color:var(--mid);align-items:center;gap:6px;font-size:12px;display:inline-flex}.import-remote-err{border-radius:var(--radius-sm);color:var(--danger);border:1px solid #b3261e4d;margin-bottom:10px;padding:8px 10px;font-size:12px}.import-remote-list{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--paper);max-height:46vh;overflow:auto}.import-remote-item{border-bottom:1px solid var(--line);cursor:pointer;align-items:baseline;gap:8px;padding:7px 10px;font-size:12.5px;display:flex}.import-remote-item:last-child{border-bottom:0}.import-remote-item:hover{background:var(--soft)}.import-remote-item input{flex:none;align-self:center}.import-remote-topic{font-family:var(--mono);color:var(--mid);background:var(--soft);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;flex:none;max-width:120px;padding:1px 6px;font-size:10.5px;overflow:hidden}.import-remote-text{min-width:0;color:var(--ink);flex:auto}.import-remote-actions{align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.repo-boards{text-overflow:ellipsis;max-width:220px;overflow:hidden}.compose-context{background:var(--soft);border-radius:var(--radius-sm);color:var(--ink-2);flex-wrap:wrap;align-items:baseline;gap:8px;margin:0 0 6px;padding:5px 10px;font-size:11.5px;display:flex}.compose-context .repo-name{color:var(--ink);font-weight:700}.compose-context .repo-desc{color:var(--ink-2)}.compose-context .repo-boards-list{color:var(--mid);margin-left:auto}.bd-workbench{flex-direction:column;gap:12px;display:flex}.bd-board{padding:0 0 10px}.bd-board.drop{outline:1px dashed var(--ink);outline-offset:-1px}.bd-board .colhead{border-bottom:1px solid var(--line);margin:0;padding:8px 12px}.bd-head h3{margin:0;font-size:13px}.bd-head .bd-count{margin-left:auto;font-size:11px}.bd-grid{grid-template-columns:repeat(auto-fill,118px);justify-content:start;gap:8px;padding:10px 12px 0;display:grid}.bd-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--paper);cursor:grab;text-align:center;flex-direction:column;align-items:center;gap:4px;padding:12px 8px 8px;display:flex;position:relative}.bd-card:hover{border-color:var(--mid);box-shadow:var(--shadow-sm)}.bd-card.dragging{opacity:.45}.bd-card.drop{outline:1px dashed var(--ink);outline-offset:-1px}.bd-card .glyph{background:var(--ink);color:#fff;border-radius:10px;place-items:center;width:38px;height:38px;font-size:16px;font-weight:700;display:grid}.bd-card .nm{text-overflow:ellipsis;white-space:nowrap;max-width:100%;color:var(--ink);font-size:12px;font-weight:600;overflow:hidden}.bd-card .ds{-webkit-line-clamp:2;min-height:28px;color:var(--mid);-webkit-box-orient:vertical;font-size:11px;line-height:14px;display:-webkit-box;overflow:hidden}.bd-card .acts{gap:2px;display:none;position:absolute;top:4px;right:4px}.bd-card:hover .acts{display:inline-flex}.bd-card .acts .btn{padding:1px 4px;font-size:10px}.bd-empty{text-align:center;grid-column:1/-1;padding:14px 0;font-size:11px}.bd-exp{width:100%;font-family:var(--mono);font-size:11px}.colhead{align-items:baseline;gap:8px;margin:2px 2px 8px;display:flex}h3{margin:0;font-size:13px;font-weight:700}.cols{align-items:flex-start;gap:14px;display:flex}.col{flex:1;min-width:0}@media (width<=900px){.cols{flex-direction:column}.col{width:100%}}.list{padding:4px}.row{border-radius:10px;flex-wrap:wrap;align-items:center;gap:8px 10px;padding:8px 10px;transition:background .12s;display:flex}.row:hover{background:var(--soft)}.row+.row{margin-top:2px}.row .tid{color:var(--mid);text-align:right;flex-shrink:0;min-width:30px;font-family:ui-monospace,Consolas,monospace;font-size:11.5px}.row .topic{background:var(--soft-2);white-space:nowrap;border-radius:5px;flex-shrink:0;padding:1px 6px;font-size:12px;font-weight:600}.row .text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.row .time{color:var(--mid);white-space:nowrap;flex-shrink:0;font-size:11.5px}.row .note{color:var(--mid);word-break:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex-basis:100%;padding-left:40px;font-size:11.5px;line-height:1.4;display:-webkit-box;overflow:hidden}.row-inline{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row .name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}.row .desc{color:var(--mid);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;overflow:hidden}.row .acts{flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.plats{flex-wrap:wrap;gap:4px;display:flex}.pill{font:inherit;cursor:pointer;background:var(--soft);color:var(--mid);border:0;border-radius:999px;padding:5px 8px;font-size:11px;line-height:1;transition:background .12s,color .12s}.pill:hover{background:var(--soft-2);color:var(--ink)}.pill.on{background:var(--ink);color:var(--paper);font-weight:600}.pill.on.lnk{background:var(--paper);color:var(--ink);border:1.5px dashed var(--ink);padding:4px 6.5px}.tag{border:1px solid var(--soft-2);color:var(--mid);white-space:nowrap;letter-spacing:0;background:0 0;border-radius:4px;padding:1px 6px;font-size:10.5px;font-weight:600}.tag.strong{background:var(--ink);color:var(--paper)}.tag.badge{color:var(--ink-2);border:1px solid var(--soft-2);letter-spacing:.02em;background:0 0;font-weight:600}table{border-collapse:collapse;width:100%}th,td{text-align:left;vertical-align:top;padding:9px 10px}th{color:var(--mid);font-family:var(--label);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;font-size:10.5px;font-weight:600}tbody tr:hover{background:var(--soft)}tbody tr+tr td{box-shadow:inset 0 1px 0 var(--soft)}.mono,td.path{font-family:var(--mono);word-break:break-all;font-size:11.5px}td.ops{white-space:nowrap}td.ops .btn{margin:0 3px 3px 0}.muted{color:var(--mid)}.bad{font-weight:700}.queue-table{table-layout:fixed}.queue-table .c-drag{width:30px}.queue-table .c-id{width:46px}.queue-table .c-status{width:104px}.queue-table .c-time{width:150px}.queue-table .c-ops{width:196px}.queue-wrap{overflow-x:auto}.queue-table td.task-text{white-space:pre-wrap;word-break:break-word;font-size:12.5px;line-height:1.45}.queue-table .c-time{font-family:var(--mono);color:var(--mid);font-size:11px}.queue-table thead th{background:var(--soft);border-bottom:1px solid var(--line);color:var(--mid);font-family:var(--label);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;vertical-align:middle;padding:7px 10px;font-size:10.5px;font-weight:600}.queue-table tbody td{vertical-align:middle;padding:8px 10px}.queue-table .board-status{color:var(--ink-2);font-size:11.5px}.queue-table .board-status.done:before{background:var(--soft-2);box-shadow:inset 0 0 0 1.5px var(--soft-2)}.queue-table .board-status.pend:before{background:var(--live);box-shadow:0 0 0 3px #1f7a4d1f}.board-toolbar{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-sm);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;margin-bottom:10px;padding:10px 12px;display:flex}.board-heading,.board-actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.board-heading strong{font-family:var(--label);font-size:13.5px;font-weight:600}.board-heading .muted{font-size:11.5px}.board-live{color:var(--mid);align-items:center;gap:6px;font-size:11px;display:inline-flex}.board-live-dot{background:var(--mid);border-radius:50%;flex:none;width:6px;height:6px}.board-live-dot.ok{background:var(--live);animation:2.4s ease-in-out infinite board-pulse}.board-live-dot.reconnecting{background:var(--danger)}.board-live-dot.connecting{background:var(--mid)}@keyframes board-pulse{0%,to{box-shadow:0 0 #1f7a4d59}50%{box-shadow:0 0 0 3px #1f7a4d00}}@media (prefers-reduced-motion:reduce){.board-live-dot.ok{animation:none}}.board-table-wrap{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);width:100%;box-shadow:var(--shadow-sm);margin-bottom:12px;overflow-x:auto}table.directory-board{table-layout:fixed;border-collapse:separate;border-spacing:0;min-width:780px}.directory-board thead th{font-family:var(--label);letter-spacing:.04em;text-transform:uppercase;color:var(--mid);text-align:left;background:var(--soft);border-bottom:1px solid var(--line);white-space:nowrap;padding:7px 12px;font-size:10.5px;font-weight:600}.directory-board td{border-bottom:1px solid var(--line);vertical-align:top;padding:8px 12px}.directory-board tbody tr:last-child td{border-bottom:0}.directory-board tbody tr{cursor:pointer;--rail:var(--soft-2);transition:background .12s}.directory-board tbody tr:hover{background:#faf9f6}.directory-board tbody tr td:first-child{box-shadow:inset 2px 0 0 var(--rail)}.directory-board tbody tr[data-state=live]{--rail:var(--live)}.directory-board tbody tr[data-state=stale]{--rail:var(--warn)}.directory-board tbody tr[data-state=pool]{--rail:var(--ink-2)}.directory-board tbody tr.is-active{background:var(--soft);--rail:var(--ink)}.directory-board .board-check{text-align:center;width:34px}.directory-board thead .board-check input{vertical-align:middle;cursor:pointer}.directory-board thead .board-check input:disabled{cursor:default;opacity:.35}.directory-board .board-directory{width:40%;min-width:240px}.directory-board .board-task-state{width:18%}.directory-board .board-goal-state{width:19%}.directory-board .board-ops{width:196px}.directory-board .board-ops .btn{opacity:.7;transition:opacity .12s,background .12s}.directory-board tbody tr:hover .board-ops .btn,.directory-board tbody tr.is-active .board-ops .btn,.directory-board tbody tr:focus-within .board-ops .btn{opacity:1}.board-name-line{align-items:baseline;gap:7px;min-width:0;display:flex}.board-name-line strong{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13.5px;font-weight:650;overflow:hidden}.board-cwd{font-family:var(--mono);color:var(--ink-2);white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;font-size:10.5px;line-height:1.4;overflow:hidden}.board-cwd .anc{color:var(--mid)}.board-summary-line{align-items:baseline;gap:6px;min-width:0;margin-top:1px;display:flex}.board-summary{min-width:0;color:var(--ink-2);font:inherit;text-align:left;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:0;flex:auto;padding:0;font-size:11.5px;line-height:1.4;display:block;overflow:hidden}.board-summary:hover{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.board-summary.muted{color:var(--mid)}.board-submit{min-width:0;max-width:46%;color:var(--mid);font:inherit;text-align:left;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:0;flex:0 auto;padding:0;font-size:11.5px;line-height:1.4;overflow:hidden}.board-submit:hover{color:var(--ink-2);-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.board-count,.board-deadline{font-family:var(--mono);color:var(--mid);letter-spacing:-.01em;margin-top:4px;font-size:10.5px;display:block}.board-count b{color:var(--ink);font-weight:650}.board-count .sep-dot{color:var(--soft-2);margin:0 2px}.board-deadline{font-size:10px}.board-goal-label{color:var(--live);font-family:var(--mono);cursor:pointer;letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;max-width:100%;padding:0;font-size:11px;font-weight:650;display:block;overflow:hidden}.board-goal-gone{display:block}.board-goal-label:hover{text-underline-offset:2px;text-decoration:underline}.board-ops{white-space:nowrap}.board-ops .btn{margin:0 3px 2px 0}.board-status-row{align-items:center;gap:8px;min-width:0;display:flex}.board-status-row .board-status{flex:0 auto;min-width:0}.board-wait-stop{flex:none}.board-pickup{font-family:var(--mono);color:var(--mid);white-space:nowrap;margin-top:2px;font-size:10.5px}.board-status{color:var(--ink-2);white-space:nowrap;text-overflow:ellipsis;vertical-align:bottom;align-items:center;gap:7px;max-width:100%;font-size:12px;display:inline-flex;overflow:hidden}.board-status:before{content:"";background:var(--soft-2);border-radius:50%;flex:none;width:6px;height:6px}.board-status.live:before{background:var(--live);box-shadow:0 0 0 3px #1f7a4d1f}.board-status.busy:before{background:var(--warn);box-shadow:0 0 0 3px #99690f21}.board-status.pool:before{background:var(--ink)}.board-status.stale:before{box-shadow:inset 0 0 0 1.5px var(--soft-2);background:0 0}.board-empty{text-align:center;padding:30px 16px}.board-empty-mark{border:1.5px dashed var(--soft-2);border-radius:50%;width:26px;height:26px;margin:0 auto 10px}.board-empty-title{color:var(--ink-2);font-size:12.5px;font-weight:600}.board-empty-sub{color:var(--mid);margin-top:3px;font-size:11.5px}.localtask-topic-cards-legacy{display:none}.board-settings-dialog{gap:14px;display:grid}.board-setting-section{border-bottom:1px solid var(--soft-2);padding-bottom:12px}.board-setting-section:last-child{border-bottom:0;padding-bottom:0}.board-setting-title{align-items:center;gap:8px;margin-bottom:6px;font-size:13px;font-weight:700;display:flex}.board-setting-control{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.board-setting-control select{min-width:170px;padding:6px 8px}.board-setting-help{margin:0 0 8px;font-size:11px;line-height:1.4}.board-settings-dialog textarea{box-sizing:border-box;resize:vertical;width:100%;font:inherit;font-size:12px}.board-setting-actions{flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;display:flex}.board-add-directory label{margin-bottom:5px;font-size:12px;font-weight:700;display:block}.board-add-directory input{box-sizing:border-box;width:100%;font:inherit;padding:8px}.board-add-directory p{margin:6px 0 0;font-size:11px}.copyable{cursor:copy;border-bottom:1px dashed #0000;transition:border-color .12s,color .12s}.copyable:hover{border-bottom-color:var(--mid)}.copyable:active{color:var(--ink)}dd .adapter-dir{margin-right:14px;display:inline-block}.settings{grid-template-columns:120px 1fr;align-items:center;gap:10px 16px;display:grid}.settings dt{color:var(--mid);font-size:12px}.settings dd{margin:0}.row-inline{gap:8px;margin-top:8px;display:flex}.row-inline input{flex:1}.cli-hint{color:var(--mid);flex-wrap:wrap;align-items:baseline;gap:4px 8px;padding:6px 4px 2px;font-size:11.5px;display:flex}.cli-hint-label{flex-basis:100%}.cli-cmd{background:var(--soft);white-space:nowrap;border-radius:5px;padding:1px 6px}.modal{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:20;background:#fbfbfcdb;justify-content:center;align-items:flex-start;padding:48px 16px;display:flex;position:fixed;inset:0}.modal.hidden{display:none}.modal-box{background:var(--paper);border-radius:var(--radius);flex-direction:column;width:min(880px,96vw);max-height:84vh;display:flex;overflow:hidden;box-shadow:0 12px 40px #14161a29}.modal-title{box-shadow:0 1px 0 var(--soft);justify-content:space-between;align-items:center;padding:12px 14px;font-weight:700;display:flex}.modal-body{padding:14px;overflow:auto}pre{white-space:pre-wrap;word-break:break-all;margin:0;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.6}.d-add{background:var(--soft-2);font-weight:600}.d-del{color:var(--mid);text-decoration:line-through}.conflict-file{background:var(--soft);border-radius:10px;margin-bottom:10px;overflow:hidden}.conflict-file .cf-head{justify-content:space-between;align-items:center;padding:8px 12px;font-family:ui-monospace,Consolas,monospace;font-size:12px;display:flex}.conflict-file pre{background:var(--paper);padding:10px 12px}footer{color:var(--mid);text-align:center;padding:14px 20px 24px;font-size:11.5px}footer code{background:var(--soft);border-radius:6px;padding:1px 6px;font-family:ui-monospace,Consolas,monospace}.mdtext,.mdtext-plain{white-space:pre-wrap}.embed-image{vertical-align:middle;margin:0 2px;line-height:0;display:inline-block}.embed-image img{border-radius:var(--radius-sm);background:var(--soft);max-width:100%;max-height:220px;display:block}.embed-image.compact img{max-height:28px;box-shadow:0 0 0 1px var(--soft-2);border-radius:6px}.embed-file{background:var(--soft);color:var(--ink);vertical-align:middle;border-radius:7px;margin:0 2px;padding:1px 8px;font-size:12px;text-decoration:none;display:inline-block}.embed-file:hover{background:var(--soft-2)}.editor{border-radius:var(--radius);flex-direction:column;gap:12px;min-width:min(600px,80vw);display:flex;position:relative}.editor.drag{box-shadow:0 0 0 2px var(--ink)}.editor.drag:after{content:"松手即上传";border-radius:var(--radius);pointer-events:none;background:#ffffffdb;justify-content:center;align-items:center;font-weight:700;display:flex;position:absolute;inset:0}.ed-tip{color:var(--mid);font-size:11.5px;line-height:1.8}.ed-link{font:inherit;color:var(--ink);text-underline-offset:2px;cursor:pointer;background:0 0;border:0;padding:0 2px;font-weight:600;text-decoration:underline}.ed-link:disabled{color:var(--mid);cursor:default;text-decoration:none}.ed-field{flex-direction:column;gap:4px;display:flex}.ed-label{color:var(--mid);letter-spacing:.3px;font-size:11.5px;font-weight:600}.ed-textarea{width:100%;font:inherit;border-radius:var(--radius-sm);background:var(--soft);color:var(--ink);resize:vertical;border:0;padding:9px 11px}.ed-textarea:focus{outline:2px solid var(--soft-2)}.ed-meta{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.ed-acts{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.ed-foot{box-shadow:0 -1px 0 var(--soft) inset;justify-content:space-between;align-items:center;gap:10px;padding-top:10px;display:flex}.preview{border-radius:var(--radius-sm);background:var(--soft);max-height:340px;padding:10px;overflow:auto}.hint{color:var(--mid);font-size:11.5px}.hint code,.ed-tip code,kbd{background:var(--soft-2);border-radius:5px;padding:0 4px;font-family:ui-monospace,Consolas,monospace;font-size:11px}.toggle{background:var(--soft);color:var(--mid);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 11px;font-size:12px;display:inline-flex;position:relative}.toggle:hover{background:var(--soft-2)}.toggle:focus-within{outline:2px solid var(--soft-2)}.toggle input{opacity:0;width:1px;height:1px;position:absolute}.toggle .dot{background:var(--mid);border-radius:50%;width:7px;height:7px}.toggle.on{background:var(--ink);color:var(--paper)}.toggle.on .dot{background:var(--paper)}
1
+ :root{--ink:#16181c;--ink-2:#4b515a;--mid:#838a93;--paper:#fff;--canvas:#f7f6f3;--soft:#f2f1ed;--soft-2:#e5e3de;--line:#e7e5e0;--live:#1f7a4d;--warn:#99690f;--danger:#b3261e;--radius:10px;--radius-sm:7px;--shadow-sm:0 1px 2px #16181c0d;--shadow:0 1px 2px #16181c0d, 0 10px 28px -16px #16181c2e;--label:"Bahnschrift", "Segoe UI Variable Display", "Segoe UI", system-ui, sans-serif;--mono:ui-monospace, "Cascadia Mono", "JetBrains Mono", "SF Mono", Menlo, Consolas, "Liberation Mono", "Courier New", monospace}*{box-sizing:border-box}body{color:var(--ink);background:var(--canvas);-webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums;margin:0;font-family:Segoe UI Variable Text,Segoe UI,system-ui,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;font-size:13px;line-height:1.5}:focus-visible{outline:2px solid var(--ink);outline-offset:1px;border-radius:4px}header{background:var(--paper);box-shadow:0 1px 0 var(--soft-2);z-index:5;align-items:center;gap:20px;padding:12px 20px;display:flex;position:sticky;top:0}.brand{letter-spacing:.4px;align-items:center;gap:7px;font-weight:800;display:inline-flex}.brand img{border-radius:5px;width:20px;height:20px;display:block}.brand .sub{color:var(--mid);margin-left:8px;font-size:12px;font-weight:400}nav{gap:2px;display:inline-flex}.tab{font:inherit;color:var(--mid);cursor:pointer;background:0 0;border:0;border-radius:7px 7px 0 0;padding:7px 12px 8px;font-size:12.5px;transition:color .15s,background .15s;position:relative}.tab:hover{color:var(--ink);background:var(--soft)}.tab.active{color:var(--ink);font-weight:600}.tab.active:after{content:"";background:var(--ink);border-radius:2px 2px 0 0;height:2px;position:absolute;bottom:0;left:10px;right:10px}.meta{color:var(--mid);margin-left:auto;font-family:ui-monospace,Consolas,monospace;font-size:11.5px}#root{flex-direction:column;min-height:100vh;display:flex}main{flex:1 0 auto;width:100%;max-width:1240px;margin:0 auto;padding:18px 20px 28px}.panel{display:none}.panel.active{display:block}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}.toolbar label{color:var(--mid);font-size:12px}.sep{background:var(--soft-2);width:1px;height:20px;margin:0 4px}.grow{max-width:340px}.compose-toolbar{align-items:center}.compose-label{color:var(--mid);white-space:nowrap;font-size:12px}.compose-bar{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-sm);min-width:0;box-shadow:var(--shadow-sm);flex:auto;align-items:stretch;transition:border-color .15s,box-shadow .15s;display:flex;overflow:hidden}.compose-bar:focus-within{border-color:var(--ink);box-shadow:0 0 0 3px #16181c0f}.compose-bar select,.compose-bar textarea{box-shadow:none;background-color:#0000;border:0;border-radius:0;padding:8px 10px}.compose-bar select:hover,.compose-bar textarea:hover{border-color:#0000}.compose-bar select{border-right:1px solid var(--line);background-color:var(--soft);flex:0 0 232px;font-size:12.5px}.compose-bar textarea{resize:vertical;flex:auto;min-width:180px;min-height:38px;line-height:1.5}.compose-bar .btn{border-radius:var(--radius-sm);flex:none;align-self:center;margin:3px}.compose-bar textarea::placeholder{color:#b3b8bd;font-size:12.5px}@media (width<=820px){.compose-toolbar{flex-direction:column;align-items:stretch;gap:6px}.compose-bar{flex-wrap:wrap}.compose-bar select{border-right:0;border-bottom:1px solid var(--line);flex:100%}.compose-bar textarea{flex:160px}.compose-bar .btn{margin:3px 3px 3px 0}table.directory-board{min-width:620px}.directory-board .board-ops{width:150px}.directory-board .board-directory{width:34%;min-width:200px}.directory-board .board-task-state{width:19%}.directory-board .board-goal-state{width:25%}.board-goal-label,.board-deadline{white-space:nowrap}}input,select,textarea{font:inherit;color:var(--ink);background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-sm);padding:6px 10px;transition:border-color .15s,box-shadow .15s}input::placeholder,textarea::placeholder{color:#b3b8bd}input:focus,select:focus,textarea:focus{border-color:var(--ink);outline:none;box-shadow:0 0 0 3px #16181c12}select{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--mid) 50%), linear-gradient(135deg, var(--mid) 50%, transparent 50%);cursor:pointer;background-position:calc(100% - 14px) 52%,calc(100% - 9px) 52%;background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-right:26px}.goal-form{flex-direction:column;gap:12px;display:flex}.goal-form-section{font-size:12px}.goal-form-title{margin-bottom:4px;font-weight:700}.goal-cwd-input{width:100%}.goal-dur-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.goal-dur-input{width:96px}.goal-dur-unit{width:92px}.goal-prompt{resize:vertical;width:100%;line-height:1.55}.goal-hint{color:var(--mid);font-size:11px}.goal-reset{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.goal-presets{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.goal-actions{align-items:center;gap:8px;margin-top:12px;display:flex}.btn{font:inherit;cursor:pointer;border-radius:var(--radius-sm);background:var(--ink);color:var(--paper);border:0;padding:6px 12px;transition:opacity .15s,background .15s,color .15s}.btn:hover{opacity:.86}.btn.ghost{background:var(--soft);color:var(--ink)}.btn.ghost:hover{background:var(--soft-2);opacity:1}.btn.ghost.danger{color:var(--danger);background:0 0;border:1px solid #b3261e4d}.btn.ghost.danger:hover{opacity:1;background:#b3261e12}.btn.small{border-radius:7px;padding:3px 9px;font-size:12px}.btn:disabled{opacity:.4;cursor:default}.btn.danger{color:#fff;background:#b3261e}.toast-stack{z-index:60;pointer-events:none;flex-direction:column;align-items:center;gap:8px;display:flex;position:fixed;bottom:28px;left:50%;transform:translate(-50%)}.toast{background:var(--ink);color:var(--paper);white-space:pre-wrap;word-break:break-all;border-radius:10px;max-width:72vw;padding:9px 16px;font-size:12.5px;box-shadow:0 8px 24px #14161a40}.dlg{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:50;background:#fbfbfcdb;justify-content:center;align-items:flex-start;padding:96px 16px;display:flex;position:fixed;inset:0}.dlg-box{background:var(--paper);border-radius:var(--radius);width:min(460px,94vw);padding:16px 18px;box-shadow:0 12px 40px #14161a29}.dlg-title{margin-bottom:6px;font-weight:700}.dlg-msg{color:var(--ink);white-space:pre-wrap;word-break:break-all;margin-bottom:6px}.dlg-input{width:100%;margin:8px 0 4px;font-family:ui-monospace,Consolas,monospace;font-size:12.5px}.dlg-acts{justify-content:flex-end;gap:8px;margin-top:12px;display:flex}.card{background:var(--paper);border-radius:var(--radius);margin-bottom:12px;padding:10px 12px;box-shadow:0 0 0 1px #16181c12}.card.hidden{display:none}.fold-row{border-top:1px solid var(--line);margin-top:8px;padding-top:2px}.fold-row>summary{cursor:pointer;color:var(--ink-2);align-items:center;gap:7px;padding:7px 2px;font-size:12.5px;font-weight:600;list-style:none;display:flex}.fold-row>summary::-webkit-details-marker{display:none}.fold-row>summary:before{content:"▸";color:var(--mid);font-size:10px}.fold-row[open]>summary:before{content:"▾"}.fold-row>summary:hover{color:var(--ink)}.fold-row table{margin-top:4px}.localtask-cli-reference{margin-top:10px}.localtask-cli-reference>details>summary{cursor:pointer;color:var(--ink-2);align-items:center;gap:7px;padding:7px 2px;font-size:12.5px;font-weight:600;list-style:none;display:flex}.localtask-cli-reference>details>summary::-webkit-details-marker{display:none}.localtask-cli-reference>details>summary:before{content:"▸";color:var(--mid);font-size:10px}.localtask-cli-reference>details[open]>summary:before{content:"▾"}.localtask-cli-reference>details>summary:hover{color:var(--ink)}.import-remote-entry{flex-wrap:wrap;align-items:center;gap:8px;margin:-2px 0 8px;font-size:11.5px;display:flex}.import-remote-bar{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:10px;display:flex}.import-remote-bar label{color:var(--mid);align-items:center;gap:6px;font-size:12px;display:inline-flex}.import-remote-err{border-radius:var(--radius-sm);color:var(--danger);border:1px solid #b3261e4d;margin-bottom:10px;padding:8px 10px;font-size:12px}.import-remote-list{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--paper);max-height:46vh;overflow:auto}.import-remote-item{border-bottom:1px solid var(--line);cursor:pointer;align-items:baseline;gap:8px;padding:7px 10px;font-size:12.5px;display:flex}.import-remote-item:last-child{border-bottom:0}.import-remote-item:hover{background:var(--soft)}.import-remote-item input{flex:none;align-self:center}.import-remote-topic{font-family:var(--mono);color:var(--mid);background:var(--soft);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;flex:none;max-width:120px;padding:1px 6px;font-size:10.5px;overflow:hidden}.import-remote-text{min-width:0;color:var(--ink);flex:auto}.import-remote-actions{align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.repo-boards{text-overflow:ellipsis;max-width:220px;overflow:hidden}.compose-context{background:var(--soft);border-radius:var(--radius-sm);color:var(--ink-2);flex-wrap:wrap;align-items:baseline;gap:8px;margin:0 0 6px;padding:5px 10px;font-size:11.5px;display:flex}.compose-context .repo-name{color:var(--ink);font-weight:700}.compose-context .repo-desc{color:var(--ink-2)}.compose-context .repo-boards-list{color:var(--mid);margin-left:auto}.bd-workbench{flex-direction:column;gap:12px;display:flex}.bd-board{padding:0 0 10px}.bd-board.drop{outline:1px dashed var(--ink);outline-offset:-1px}.bd-board .colhead{border-bottom:1px solid var(--line);margin:0;padding:8px 12px}.bd-head h3{margin:0;font-size:13px}.bd-head .bd-count{margin-left:auto;font-size:11px}.bd-grid{grid-template-columns:repeat(auto-fill,118px);justify-content:start;gap:8px;padding:10px 12px 0;display:grid}.bd-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--paper);cursor:grab;text-align:center;flex-direction:column;align-items:center;gap:4px;padding:12px 8px 8px;display:flex;position:relative}.bd-card:hover{border-color:var(--mid);box-shadow:var(--shadow-sm)}.bd-card.dragging{opacity:.45}.bd-card.drop{outline:1px dashed var(--ink);outline-offset:-1px}.bd-card .glyph{background:var(--ink);color:#fff;border-radius:10px;place-items:center;width:38px;height:38px;font-size:16px;font-weight:700;display:grid}.bd-card .nm{text-overflow:ellipsis;white-space:nowrap;max-width:100%;color:var(--ink);font-size:12px;font-weight:600;overflow:hidden}.bd-card .ds{-webkit-line-clamp:2;min-height:28px;color:var(--mid);-webkit-box-orient:vertical;font-size:11px;line-height:14px;display:-webkit-box;overflow:hidden}.bd-card .acts{gap:2px;display:none;position:absolute;top:4px;right:4px}.bd-card:hover .acts{display:inline-flex}.bd-card .acts .btn{padding:1px 4px;font-size:10px}.bd-empty{text-align:center;grid-column:1/-1;padding:14px 0;font-size:11px}.bd-exp{width:100%;font-family:var(--mono);font-size:11px}.colhead{align-items:baseline;gap:8px;margin:2px 2px 8px;display:flex}h3{margin:0;font-size:13px;font-weight:700}.cols{align-items:flex-start;gap:14px;display:flex}.col{flex:1;min-width:0}@media (width<=900px){.cols{flex-direction:column}.col{width:100%}}.list{padding:4px}.row{border-radius:10px;flex-wrap:wrap;align-items:center;gap:8px 10px;padding:8px 10px;transition:background .12s;display:flex}.row:hover{background:var(--soft)}.row+.row{margin-top:2px}.row .tid{color:var(--mid);text-align:right;flex-shrink:0;min-width:30px;font-family:ui-monospace,Consolas,monospace;font-size:11.5px}.row .topic{background:var(--soft-2);white-space:nowrap;border-radius:5px;flex-shrink:0;padding:1px 6px;font-size:12px;font-weight:600}.row .text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.row .time{color:var(--mid);white-space:nowrap;flex-shrink:0;font-size:11.5px}.row .note{color:var(--mid);word-break:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex-basis:100%;padding-left:40px;font-size:11.5px;line-height:1.4;display:-webkit-box;overflow:hidden}.row-inline{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row .name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}.row .desc{color:var(--mid);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;overflow:hidden}.row .acts{flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.plats{flex-wrap:wrap;gap:4px;display:flex}.pill{font:inherit;cursor:pointer;background:var(--soft);color:var(--mid);border:0;border-radius:999px;padding:5px 8px;font-size:11px;line-height:1;transition:background .12s,color .12s}.pill:hover{background:var(--soft-2);color:var(--ink)}.pill.on{background:var(--ink);color:var(--paper);font-weight:600}.pill.on.lnk{background:var(--paper);color:var(--ink);border:1.5px dashed var(--ink);padding:4px 6.5px}.tag{border:1px solid var(--soft-2);color:var(--mid);white-space:nowrap;letter-spacing:0;background:0 0;border-radius:4px;padding:1px 6px;font-size:10.5px;font-weight:600}.tag.strong{background:var(--ink);color:var(--paper)}.tag.badge{color:var(--ink-2);border:1px solid var(--soft-2);letter-spacing:.02em;background:0 0;font-weight:600}table{border-collapse:collapse;width:100%}th,td{text-align:left;vertical-align:top;padding:9px 10px}th{color:var(--mid);font-family:var(--label);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;font-size:10.5px;font-weight:600}tbody tr:hover{background:var(--soft)}tbody tr+tr td{box-shadow:inset 0 1px 0 var(--soft)}.mono,td.path{font-family:var(--mono);word-break:break-all;font-size:11.5px}td.ops{white-space:nowrap}td.ops .btn{margin:0 3px 3px 0}.muted{color:var(--mid)}.bad{font-weight:700}.queue-table{table-layout:fixed}.queue-table .c-drag{width:30px}.queue-table .c-id{width:46px}.queue-table .c-status{width:104px}.queue-table .c-time{width:150px}.queue-table .c-ops{width:196px}.queue-wrap{overflow-x:auto}.queue-table td.task-text{white-space:pre-wrap;word-break:break-word;font-size:12.5px;line-height:1.45}.queue-table .c-time{font-family:var(--mono);color:var(--mid);font-size:11px}.queue-table thead th{background:var(--soft);border-bottom:1px solid var(--line);color:var(--mid);font-family:var(--label);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;vertical-align:middle;padding:7px 10px;font-size:10.5px;font-weight:600}.queue-table tbody td{vertical-align:middle;padding:8px 10px}.queue-table .board-status{color:var(--ink-2);font-size:11.5px}.queue-table .board-status.done:before{background:var(--soft-2);box-shadow:inset 0 0 0 1.5px var(--soft-2)}.queue-table .board-status.pend:before{background:var(--live);box-shadow:0 0 0 3px #1f7a4d1f}.board-toolbar{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-sm);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;margin-bottom:10px;padding:10px 12px;display:flex}.board-heading,.board-actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.board-heading strong{font-family:var(--label);font-size:13.5px;font-weight:600}.board-heading .muted{font-size:11.5px}.board-live{color:var(--mid);align-items:center;gap:6px;font-size:11px;display:inline-flex}.board-live-dot{background:var(--mid);border-radius:50%;flex:none;width:6px;height:6px}.board-live-dot.ok{background:var(--live);animation:2.4s ease-in-out infinite board-pulse}.board-live-dot.reconnecting{background:var(--danger)}.board-live-dot.connecting{background:var(--mid)}@keyframes board-pulse{0%,to{box-shadow:0 0 #1f7a4d59}50%{box-shadow:0 0 0 3px #1f7a4d00}}@media (prefers-reduced-motion:reduce){.board-live-dot.ok{animation:none}}.board-table-wrap{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);width:100%;box-shadow:var(--shadow-sm);margin-bottom:12px;overflow-x:auto}table.directory-board{table-layout:fixed;border-collapse:separate;border-spacing:0;min-width:780px}.directory-board thead th{font-family:var(--label);letter-spacing:.04em;text-transform:uppercase;color:var(--mid);text-align:left;background:var(--soft);border-bottom:1px solid var(--line);white-space:nowrap;padding:7px 12px;font-size:10.5px;font-weight:600}.directory-board td{border-bottom:1px solid var(--line);vertical-align:top;padding:8px 12px}.directory-board tbody tr:last-child td{border-bottom:0}.directory-board tbody tr{cursor:pointer;--rail:var(--soft-2);transition:background .12s}.directory-board tbody tr:hover{background:#faf9f6}.directory-board tbody tr td:first-child{box-shadow:inset 2px 0 0 var(--rail)}.directory-board tbody tr[data-state=live]{--rail:var(--live)}.directory-board tbody tr[data-state=stale]{--rail:var(--warn)}.directory-board tbody tr[data-state=pool]{--rail:var(--ink-2)}.directory-board tbody tr.is-active{background:var(--soft);--rail:var(--ink)}.directory-board .board-check{text-align:center;width:34px}.directory-board thead .board-check input{vertical-align:middle;cursor:pointer}.directory-board thead .board-check input:disabled{cursor:default;opacity:.35}.directory-board .board-directory{width:36%;min-width:240px}.directory-board .board-task-state,.directory-board .board-goal-state{width:17%}.directory-board .board-ops{width:290px}.directory-board .board-ops .btn{opacity:.7;transition:opacity .12s,background .12s}.directory-board tbody tr:hover .board-ops .btn,.directory-board tbody tr.is-active .board-ops .btn,.directory-board tbody tr:focus-within .board-ops .btn{opacity:1}.board-name-line{align-items:baseline;gap:7px;min-width:0;display:flex}.board-name-line strong{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13.5px;font-weight:650;overflow:hidden}.board-cwd{font-family:var(--mono);color:var(--ink-2);white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;font-size:10.5px;line-height:1.4;overflow:hidden}.board-cwd .anc{color:var(--mid)}.board-summary-line{align-items:baseline;gap:6px;min-width:0;margin-top:1px;display:flex}.board-summary{min-width:0;color:var(--ink-2);font:inherit;text-align:left;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:0;flex:auto;padding:0;font-size:11.5px;line-height:1.4;display:block;overflow:hidden}.board-summary:hover{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.board-summary.muted{color:var(--mid)}.board-submit{min-width:0;max-width:46%;color:var(--mid);font:inherit;text-align:left;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:0;flex:0 auto;padding:0;font-size:11.5px;line-height:1.4;overflow:hidden}.board-submit:hover{color:var(--ink-2);-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.board-count,.board-deadline{font-family:var(--mono);color:var(--mid);letter-spacing:-.01em;margin-top:4px;font-size:10.5px;display:block}.board-count b{color:var(--ink);font-weight:650}.board-count .sep-dot{color:var(--soft-2);margin:0 2px}.board-deadline{font-size:10px}.board-goal-label{color:var(--live);font-family:var(--mono);cursor:pointer;letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;max-width:100%;padding:0;font-size:11px;font-weight:650;display:block;overflow:hidden}.board-goal-gone{display:block}.board-goal-label:hover{text-underline-offset:2px;text-decoration:underline}.board-ops{white-space:nowrap}.board-ops .btn{margin:0 3px 2px 0}.board-status-row{align-items:center;gap:8px;min-width:0;display:flex}.board-status-row .board-status{flex:0 auto;min-width:0}.board-wait-stop{flex:none}.board-pickup{font-family:var(--mono);color:var(--mid);white-space:nowrap;margin-top:2px;font-size:10.5px}.board-status{color:var(--ink-2);white-space:nowrap;text-overflow:ellipsis;vertical-align:bottom;align-items:center;gap:7px;max-width:100%;font-size:12px;display:inline-flex;overflow:hidden}.board-status:before{content:"";background:var(--soft-2);border-radius:50%;flex:none;width:6px;height:6px}.board-status.live:before{background:var(--live);box-shadow:0 0 0 3px #1f7a4d1f}.board-status.busy:before{background:var(--warn);box-shadow:0 0 0 3px #99690f21}.board-status.pool:before{background:var(--ink)}.board-status.stale:before{box-shadow:inset 0 0 0 1.5px var(--soft-2);background:0 0}.board-empty{text-align:center;padding:30px 16px}.board-empty-mark{border:1.5px dashed var(--soft-2);border-radius:50%;width:26px;height:26px;margin:0 auto 10px}.board-empty-title{color:var(--ink-2);font-size:12.5px;font-weight:600}.board-empty-sub{color:var(--mid);margin-top:3px;font-size:11.5px}.localtask-topic-cards-legacy{display:none}.board-settings-dialog{gap:14px;display:grid}.board-setting-section{border-bottom:1px solid var(--soft-2);padding-bottom:12px}.board-setting-section:last-child{border-bottom:0;padding-bottom:0}.board-setting-title{align-items:center;gap:8px;margin-bottom:6px;font-size:13px;font-weight:700;display:flex}.board-setting-control{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.board-setting-control select{min-width:170px;padding:6px 8px}.board-setting-help{margin:0 0 8px;font-size:11px;line-height:1.4}.board-settings-dialog textarea{box-sizing:border-box;resize:vertical;width:100%;font:inherit;font-size:12px}.board-setting-actions{flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;display:flex}.board-add-directory label{margin-bottom:5px;font-size:12px;font-weight:700;display:block}.board-add-directory input{box-sizing:border-box;width:100%;font:inherit;padding:8px}.board-add-directory p{margin:6px 0 0;font-size:11px}.copyable{cursor:copy;border-bottom:1px dashed #0000;transition:border-color .12s,color .12s}.copyable:hover{border-bottom-color:var(--mid)}.copyable:active{color:var(--ink)}dd .adapter-dir{margin-right:14px;display:inline-block}.settings{grid-template-columns:120px 1fr;align-items:center;gap:10px 16px;display:grid}.settings dt{color:var(--mid);font-size:12px}.settings dd{margin:0}.row-inline{gap:8px;margin-top:8px;display:flex}.row-inline input{flex:1}.cli-hint{color:var(--mid);flex-wrap:wrap;align-items:baseline;gap:4px 8px;padding:6px 4px 2px;font-size:11.5px;display:flex}.cli-hint-label{flex-basis:100%}.cli-cmd{background:var(--soft);white-space:nowrap;border-radius:5px;padding:1px 6px}.modal{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:20;background:#fbfbfcdb;justify-content:center;align-items:flex-start;padding:48px 16px;display:flex;position:fixed;inset:0}.modal.hidden{display:none}.modal-box{background:var(--paper);border-radius:var(--radius);flex-direction:column;width:min(880px,96vw);max-height:84vh;display:flex;overflow:hidden;box-shadow:0 12px 40px #14161a29}.modal-title{box-shadow:0 1px 0 var(--soft);justify-content:space-between;align-items:center;padding:12px 14px;font-weight:700;display:flex}.modal-body{padding:14px;overflow:auto}pre{white-space:pre-wrap;word-break:break-all;margin:0;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.6}.d-add{background:var(--soft-2);font-weight:600}.d-del{color:var(--mid);text-decoration:line-through}.conflict-file{background:var(--soft);border-radius:10px;margin-bottom:10px;overflow:hidden}.conflict-file .cf-head{justify-content:space-between;align-items:center;padding:8px 12px;font-family:ui-monospace,Consolas,monospace;font-size:12px;display:flex}.conflict-file pre{background:var(--paper);padding:10px 12px}footer{color:var(--mid);text-align:center;padding:14px 20px 24px;font-size:11.5px}footer code{background:var(--soft);border-radius:6px;padding:1px 6px;font-family:ui-monospace,Consolas,monospace}.mdtext,.mdtext-plain{white-space:pre-wrap}.embed-image{vertical-align:middle;margin:0 2px;line-height:0;display:inline-block}.embed-image img{border-radius:var(--radius-sm);background:var(--soft);max-width:100%;max-height:220px;display:block}.embed-image.compact img{max-height:28px;box-shadow:0 0 0 1px var(--soft-2);border-radius:6px}.embed-file{background:var(--soft);color:var(--ink);vertical-align:middle;border-radius:7px;margin:0 2px;padding:1px 8px;font-size:12px;text-decoration:none;display:inline-block}.embed-file:hover{background:var(--soft-2)}.editor{border-radius:var(--radius);flex-direction:column;gap:12px;min-width:min(600px,80vw);display:flex;position:relative}.editor.drag{box-shadow:0 0 0 2px var(--ink)}.editor.drag:after{content:"松手即上传";border-radius:var(--radius);pointer-events:none;background:#ffffffdb;justify-content:center;align-items:center;font-weight:700;display:flex;position:absolute;inset:0}.ed-tip{color:var(--mid);font-size:11.5px;line-height:1.8}.ed-link{font:inherit;color:var(--ink);text-underline-offset:2px;cursor:pointer;background:0 0;border:0;padding:0 2px;font-weight:600;text-decoration:underline}.ed-link:disabled{color:var(--mid);cursor:default;text-decoration:none}.ed-field{flex-direction:column;gap:4px;display:flex}.ed-label{color:var(--mid);letter-spacing:.3px;font-size:11.5px;font-weight:600}.ed-textarea{width:100%;font:inherit;border-radius:var(--radius-sm);background:var(--soft);color:var(--ink);resize:vertical;border:0;padding:9px 11px}.ed-textarea:focus{outline:2px solid var(--soft-2)}.ed-meta{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.ed-acts{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.ed-foot{box-shadow:0 -1px 0 var(--soft) inset;justify-content:space-between;align-items:center;gap:10px;padding-top:10px;display:flex}.preview{border-radius:var(--radius-sm);background:var(--soft);max-height:340px;padding:10px;overflow:auto}.hint{color:var(--mid);font-size:11.5px}.hint code,.ed-tip code,kbd{background:var(--soft-2);border-radius:5px;padding:0 4px;font-family:ui-monospace,Consolas,monospace;font-size:11px}.toggle{background:var(--soft);color:var(--mid);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 11px;font-size:12px;display:inline-flex;position:relative}.toggle:hover{background:var(--soft-2)}.toggle:focus-within{outline:2px solid var(--soft-2)}.toggle input{opacity:0;width:1px;height:1px;position:absolute}.toggle .dot{background:var(--mid);border-radius:50%;width:7px;height:7px}.toggle.on{background:var(--ink);color:var(--paper)}.toggle.on .dot{background:var(--paper)}