lantern-harness 0.1.2 → 0.1.3

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.
Files changed (81) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +6 -6
  3. package/builtin/session/lh-spaces.mjs +102 -0
  4. package/cli/data-root.mjs +80 -3
  5. package/cli/lantern.mjs +2 -1
  6. package/cli/server.mjs +4 -0
  7. package/cli/spaces.mjs +91 -5
  8. package/config/app.defaults.json +4 -2
  9. package/dist/500.html +9 -5
  10. package/dist/_astro/Base.ByB0D4ZA.css +1 -0
  11. package/dist/_astro/{Base.astro_astro_type_script_index_0_lang.lxEwQ1R4.js → Base.astro_astro_type_script_index_0_lang.Cg_8YLVA.js} +1 -1
  12. package/dist/_astro/CaseGenerateApp.BlZyjWEr.js +9 -0
  13. package/dist/_astro/CasesLibrary.C76La3Xj.js +1 -0
  14. package/dist/_astro/ChatApp.gfsPLvan.js +269 -0
  15. package/dist/_astro/ColumnResize.Bs6GL3DJ.js +1 -0
  16. package/dist/_astro/DatePicker.BdwFRioL.js +1 -0
  17. package/dist/_astro/{DocsFileBrowser.DkE26UTR.js → DocsFileBrowser.BxAyrkkw.js} +1 -1
  18. package/dist/_astro/KnowledgeLibrary.Cv488Hot.js +1 -0
  19. package/dist/_astro/NavLibraries.ALZ9e12z.js +1 -0
  20. package/dist/_astro/PluginsPage.B2uxCiHL.js +1 -0
  21. package/dist/_astro/{PluginsPage.BNzpPg2H.js → PluginsPage.DEkyOfQE.js} +2 -2
  22. package/dist/_astro/PromptsLibrary.BUC1OiCH.js +1 -0
  23. package/dist/_astro/RequirementsLibrary.D3olQI63.js +1 -0
  24. package/dist/_astro/{SearchableSelect.DMS2XmXc.js → SearchableSelect.DP74JRWW.js} +1 -1
  25. package/dist/_astro/SelectDropdown.D2i7-lQC.js +1 -0
  26. package/dist/_astro/{SettingsDialog.DC0e7580.js → SettingsDialog.CrMDjSLJ.js} +1 -1
  27. package/dist/_astro/SlideOverDrawer.C7UVeCX1.js +1 -0
  28. package/dist/_astro/SpaceSwitcher.Wf8EPYUx.js +7 -0
  29. package/dist/_astro/TasksBoard.2j7rGT9O.js +1 -0
  30. package/dist/_astro/TemplatesLibrary.J0x7yIcY.js +1 -0
  31. package/dist/_astro/TodosBoard.BugeB7_7.js +1 -0
  32. package/dist/_astro/app-config.vqDkEMS3.js +1 -0
  33. package/dist/_astro/doc-roots.DAJP9Svr.js +1 -0
  34. package/dist/_astro/i18n.9qZsrs3u.js +7 -0
  35. package/dist/_astro/{open-docs-in-session.D3JCwMWB.js → open-docs-in-session.fLwnA5qh.js} +1 -1
  36. package/dist/_astro/plugins.DSUPSizB.js +1 -0
  37. package/dist/_astro/project-docs.Cd2gKPKh.js +1 -0
  38. package/dist/_astro/{settings.BoQ0e0m1.js → settings.CkbipdPI.js} +2 -2
  39. package/dist/_astro/{useListAnim.CnbC_9MC.js → useListAnim.Y3N2budK.js} +1 -1
  40. package/dist/cases/generate/index.html +10 -6
  41. package/dist/cases/library/index.html +10 -6
  42. package/dist/docs/changelog/index.html +69 -6
  43. package/dist/docs/install/index.html +22 -8
  44. package/dist/docs/manual/index.html +74 -11
  45. package/dist/index.html +10 -6
  46. package/dist/knowledge/index.html +10 -6
  47. package/dist/knowledge//345/212/237/350/203/275/346/265/213/350/257/225/347/224/250/344/276/213/347/274/226/345/206/231/350/247/204/350/214/203/index.html +9 -5
  48. package/dist/plugins/index.html +10 -6
  49. package/dist/prompts/index.html +10 -6
  50. package/dist/requirements/index.html +10 -6
  51. package/dist/tasks/index.html +253 -0
  52. package/dist/templates/index.html +10 -6
  53. package/dist/templates//345/212/237/350/203/275/346/265/213/350/257/225/346/212/245/345/221/212//345/212/237/350/203/275/346/265/213/350/257/225/346/212/245/345/221/212/346/250/241/346/235/277/index.html +9 -5
  54. package/dist/templates//346/200/247/350/203/275/346/265/213/350/257/225/346/212/245/345/221/212//346/200/247/350/203/275/346/265/213/350/257/225/346/212/245/345/221/212/346/250/241/346/235/277/index.html +9 -5
  55. package/dist/templates//346/200/247/350/203/275/346/265/213/350/257/225/347/224/250/344/276/213//346/200/247/350/203/275/346/265/213/350/257/225/347/224/250/344/276/213/346/250/241/346/235/277/index.html +9 -5
  56. package/dist/templates//346/216/245/345/217/243/346/265/213/350/257/225/346/212/245/345/221/212//346/216/245/345/217/243/346/265/213/350/257/225/346/212/245/345/221/212/346/250/241/346/235/277/index.html +9 -5
  57. package/dist/templates//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/347/224/250/344/276/213//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/347/224/250/344/276/213/346/250/241/346/235/277/index.html +9 -5
  58. package/dist/todos/index.html +253 -0
  59. package/docs//345/205/250/345/261/200/346/217/222/344/273/266.md +2 -2
  60. package/docs//345/256/211/350/243/205/346/211/213/345/206/214.md +10 -8
  61. package/docs//346/223/215/344/275/234/346/211/213/345/206/214.md +73 -23
  62. package/lh-plugins/lh-project-docs.mjs +2 -0
  63. package/lh-plugins/lh-tasks.mjs +223 -0
  64. package/lh-plugins/lh-todos.mjs +297 -0
  65. package/lh-plugins/storage-domain.mjs +1 -0
  66. package/package.json +1 -1
  67. package/dist/_astro/Base.B9f_iFAZ.css +0 -1
  68. package/dist/_astro/CaseGenerateApp.Br4uKjun.js +0 -9
  69. package/dist/_astro/CasesLibrary.CpPoVQ4P.js +0 -1
  70. package/dist/_astro/ChatApp.CYSPlSNP.js +0 -258
  71. package/dist/_astro/KnowledgeLibrary.DZinlAWn.js +0 -1
  72. package/dist/_astro/NavLibraries.EayBsg5g.js +0 -1
  73. package/dist/_astro/PluginsPage.CY61glLU.js +0 -1
  74. package/dist/_astro/PromptsLibrary.DfrrCjs7.js +0 -1
  75. package/dist/_astro/RequirementsLibrary.Dt0Gj6Nr.js +0 -1
  76. package/dist/_astro/SelectDropdown.Dc7QaPbH.js +0 -1
  77. package/dist/_astro/SpaceSwitcher.Yy2w8MDF.js +0 -7
  78. package/dist/_astro/TemplatesLibrary.uK-SjK1z.js +0 -1
  79. package/dist/_astro/app-config.CpjKWnzM.js +0 -1
  80. package/dist/_astro/i18n.BVvhz-vw.js +0 -7
  81. package/dist/_astro/plugins.CrpY8UI9.js +0 -1
@@ -3,7 +3,7 @@
3
3
  try {
4
4
  if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
5
5
  } catch (e) {}
6
- </script><script type="module" src="/_astro/Base.astro_astro_type_script_index_0_lang.lxEwQ1R4.js"></script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CO1cjG9V.js"></script><script>
6
+ </script><script type="module" src="/_astro/Base.astro_astro_type_script_index_0_lang.Cg_8YLVA.js"></script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CO1cjG9V.js"></script><script>
7
7
  (function () {
8
8
  try {
9
9
  var raw = localStorage.getItem('tw.app.config.v1');
@@ -42,7 +42,8 @@
42
42
  var savedCfg = JSON.parse(cfgRaw) || {};
43
43
  var plugins = savedCfg.plugins || {};
44
44
  if (plugins.cases === false) document.documentElement.dataset.pluginOffCases = '1';
45
- if (plugins.prompts === false) document.documentElement.dataset.pluginOffPrompts = '1';
45
+ if (plugins.todos === false) document.documentElement.dataset.pluginOffTodos = '1';
46
+ if (plugins.tasks === false) document.documentElement.dataset.pluginOffTasks = '1';
46
47
  if (plugins.knowledgeLib === false)
47
48
  document.documentElement.dataset.pluginOffKnowledgeLib = '1';
48
49
  if (plugins.requirements === false)
@@ -63,10 +64,10 @@
63
64
  }
64
65
  } catch (e) {}
65
66
  })();
66
- </script><link rel="stylesheet" href="/_astro/Base.B9f_iFAZ.css"><style>.tw-docs[data-astro-cid-lpetmyok]{grid-template-columns:11.5rem minmax(0,1fr);gap:0;min-height:100vh;display:grid}.tw-docs-rail[data-astro-cid-lpetmyok]{background:color-mix(in srgb, var(--tw-surface-rail-solid) 55%, var(--tw-surface-panel))}.tw-docs-rail-inner[data-astro-cid-lpetmyok]{max-height:100vh;padding:1.75rem .85rem 2.5rem 1.25rem;position:sticky;top:0;overflow-y:auto}.tw-docs-rail-title[data-astro-cid-lpetmyok]{letter-spacing:.08em;text-transform:uppercase;color:var(--tw-label-tertiary);margin:0 0 .65rem .55rem;font-size:.6875rem;font-weight:650}.tw-docs-rail-nav[data-astro-cid-lpetmyok]{flex-direction:column;gap:.2rem;display:flex}.tw-docs-rail-ext[data-astro-cid-lpetmyok]{border-top:1px solid var(--tw-border);flex-direction:column;gap:.2rem;margin-top:.85rem;padding-top:.55rem;display:flex}.tw-docs-rail-link[data-astro-cid-lpetmyok]{color:var(--tw-label-secondary);border-radius:8px;padding:.45rem .65rem;font-size:.875rem;line-height:1.35;text-decoration:none;transition:background .12s,color .12s;display:block}.tw-docs-rail-link[data-astro-cid-lpetmyok]:hover{color:var(--tw-label-primary);background:color-mix(in srgb, var(--tw-accent) 8%, transparent)}.tw-docs-rail-link[data-astro-cid-lpetmyok].is-active{color:var(--tw-accent);background:var(--tw-accent-soft);font-weight:600}.tw-docs-rail-link--ext[data-astro-cid-lpetmyok]:after{content:"↗";opacity:.65;margin-left:.35rem;font-size:.8em}.tw-docs-main[data-astro-cid-lpetmyok]{border-left:1px solid var(--tw-border);min-width:0}@media (width<=860px){.tw-docs[data-astro-cid-lpetmyok]{grid-template-columns:1fr}.tw-docs-rail[data-astro-cid-lpetmyok]{border-bottom:1px solid var(--tw-border)}.tw-docs-rail-inner[data-astro-cid-lpetmyok]{max-height:none;padding:1rem 1rem .75rem;position:static}.tw-docs-main[data-astro-cid-lpetmyok]{border-left:none}.tw-docs-rail-nav[data-astro-cid-lpetmyok]{flex-flow:wrap;gap:.35rem}.tw-docs-rail-title[data-astro-cid-lpetmyok]{width:100%;margin:0 0 .45rem .15rem}}
67
+ </script><link rel="stylesheet" href="/_astro/Base.ByB0D4ZA.css"><style>.tw-docs[data-astro-cid-lpetmyok]{grid-template-columns:11.5rem minmax(0,1fr);gap:0;min-height:100vh;display:grid}.tw-docs-rail[data-astro-cid-lpetmyok]{background:color-mix(in srgb, var(--tw-surface-rail-solid) 55%, var(--tw-surface-panel))}.tw-docs-rail-inner[data-astro-cid-lpetmyok]{max-height:100vh;padding:1.75rem .85rem 2.5rem 1.25rem;position:sticky;top:0;overflow-y:auto}.tw-docs-rail-title[data-astro-cid-lpetmyok]{letter-spacing:.08em;text-transform:uppercase;color:var(--tw-label-tertiary);margin:0 0 .65rem .55rem;font-size:.6875rem;font-weight:650}.tw-docs-rail-nav[data-astro-cid-lpetmyok]{flex-direction:column;gap:.2rem;display:flex}.tw-docs-rail-ext[data-astro-cid-lpetmyok]{border-top:1px solid var(--tw-border);flex-direction:column;gap:.2rem;margin-top:.85rem;padding-top:.55rem;display:flex}.tw-docs-rail-link[data-astro-cid-lpetmyok]{color:var(--tw-label-secondary);border-radius:8px;padding:.45rem .65rem;font-size:.875rem;line-height:1.35;text-decoration:none;transition:background .12s,color .12s;display:block}.tw-docs-rail-link[data-astro-cid-lpetmyok]:hover{color:var(--tw-label-primary);background:color-mix(in srgb, var(--tw-accent) 8%, transparent)}.tw-docs-rail-link[data-astro-cid-lpetmyok].is-active{color:var(--tw-accent);background:var(--tw-accent-soft);font-weight:600}.tw-docs-rail-link--ext[data-astro-cid-lpetmyok]:after{content:"↗";opacity:.65;margin-left:.35rem;font-size:.8em}.tw-docs-main[data-astro-cid-lpetmyok]{border-left:1px solid var(--tw-border);min-width:0}@media (width<=860px){.tw-docs[data-astro-cid-lpetmyok]{grid-template-columns:1fr}.tw-docs-rail[data-astro-cid-lpetmyok]{border-bottom:1px solid var(--tw-border)}.tw-docs-rail-inner[data-astro-cid-lpetmyok]{max-height:none;padding:1rem 1rem .75rem;position:static}.tw-docs-main[data-astro-cid-lpetmyok]{border-left:none}.tw-docs-rail-nav[data-astro-cid-lpetmyok]{flex-flow:wrap;gap:.35rem}.tw-docs-rail-title[data-astro-cid-lpetmyok]{width:100%;margin:0 0 .45rem .15rem}}
67
68
  </style><script type="module" src="/_astro/page.Bx2KSkeL.js"></script><style>[data-astro-transition-scope="astro-v4xhcqov-3"] { view-transition-name: astro-v4xhcqov-3; }@layer astro { ::view-transition-old(astro-v4xhcqov-3) { animation: none; opacity: 0; mix-blend-mode: normal; }::view-transition-new(astro-v4xhcqov-3) { animation: none; mix-blend-mode: normal; }::view-transition-group(astro-v4xhcqov-3) { animation: none } }[data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-v4xhcqov-3"],
68
69
  [data-astro-transition-fallback="old"][data-astro-transition-scope="astro-v4xhcqov-3"] { animation: none; mix-blend-mode: normal; }[data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-v4xhcqov-3"],
69
- [data-astro-transition-fallback="new"][data-astro-transition-scope="astro-v4xhcqov-3"] { animation: none; mix-blend-mode: normal; }</style></head><body class="tw-body antialiased"><div class="tw-shell min-h-screen"><aside class="tw-nav-aside fixed inset-y-0 left-0 flex flex-col z-45" id="tw-nav-aside"><div class="tw-nav-brand"><div class="tw-nav-brand-row"><a href="/" class="tw-nav-brand-link min-w-0 flex-1"><span class="tw-nav-brand-mark" aria-hidden="true"><img class="tw-nav-brand-mark-img" src="/brand-mark.png" alt="" width="36" height="36"></span><span class="tw-nav-brand-text"><span class="tw-nav-brand-title-row"><span class="tw-nav-brand-title" data-i18n="nav.brand">Lantern Harness</span><span class="tw-nav-brand-ver" data-hint="平台版本 v0.1.2">v0.1.2</span></span></span></a></div></div><div class="tw-nav-space-slot"><div class="tw-nav-space tw-nav-space-ph" id="tw-nav-space-ph" aria-hidden="true"><div class="tw-nav-space-ph-box"><span class="tw-nav-space-ph-ico"></span><span class="tw-nav-space-ph-lines"><span class="tw-nav-space-ph-bar is-cap"></span><span class="tw-nav-space-ph-bar is-name"></span></span></div></div><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).only=e,window.dispatchEvent(new Event(`astro:only`))})();</script><script>(function(){function e(t){"@babel/helpers - typeof";return e=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},e(t)}function t(t,n){if(e(t)!=`object`||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var i=r.call(t,n||`default`);if(e(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(t)}function n(n){var r=t(n,`string`);return e(r)==`symbol`?r:r+``}function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let i=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);{let e={0:e=>a(e),1:e=>n(e),2:e=>new RegExp(e),3:e=>new Date(e),4:e=>new Map(n(e)),5:e=>new Set(n(e)),6:e=>BigInt(e),7:e=>new URL(e),8:e=>new Uint8Array(e),9:e=>new Uint16Array(e),10:e=>new Uint32Array(e),11:e=>1/0*e},t=t=>{let[n,r]=t;return n in e?e[n](r):void 0},n=e=>e.map(t),a=e=>typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]));class o extends HTMLElement{constructor(...e){super(...e),r(this,`Component`,void 0),r(this,`hydrator`,void 0),r(this,`hydrate`,async()=>{var e;if(!this.hydrator||!this.isConnected)return;let t=(e=this.parentElement)==null?void 0:e.closest(`astro-island[ssr]`);if(t){t.addEventListener(`astro:hydrate`,this.hydrate,{once:!0});return}let n=this.querySelectorAll(`astro-slot`),r={},i=this.querySelectorAll(`template[data-astro-template]`);for(let e of i){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`data-astro-template`)||`default`]=e.innerHTML,e.remove())}for(let e of n){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`name`)||`default`]=e.innerHTML)}let o;try{o=this.hasAttribute(`props`)?a(JSON.parse(this.getAttribute(`props`))):{}}catch(e){let t=this.getAttribute(`component-url`)||`<unknown>`,n=this.getAttribute(`component-export`);throw n&&(t+=` (export ${n})`),console.error(`[hydrate] Error parsing props for component ${t}`,this.getAttribute(`props`),e),e}await this.hydrator(this)(this.Component,o,r,{client:this.getAttribute(`client`)}),this.removeAttribute(`ssr`),this.dispatchEvent(new CustomEvent(`astro:hydrate`))}),r(this,`unmount`,()=>{this.isConnected||this.dispatchEvent(new CustomEvent(`astro:unmount`))})}disconnectedCallback(){document.removeEventListener(`astro:after-swap`,this.unmount),document.addEventListener(`astro:after-swap`,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(`await-children`)||document.readyState===`interactive`||document.readyState===`complete`)this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(`DOMContentLoaded`,e),t.disconnect(),this.childrenConnectedCallback()},t=new MutationObserver(()=>{var t;((t=this.lastChild)==null?void 0:t.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===`astro:end`&&(this.lastChild.remove(),e())});t.observe(this,{childList:!0}),document.addEventListener(`DOMContentLoaded`,e)}}async childrenConnectedCallback(){let e=this.getAttribute(`before-hydration-url`);e&&await import(e),this.start()}getRetryImportUrl(e){let t=new URL(e,document.baseURI);return t.searchParams.set(`astro-retry`,Date.now().toString()),t.toString()}async importWithRetry(e){try{return await import(e)}catch(t){return await new Promise(e=>setTimeout(e,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let t=this.getAttribute(`component-url`),n=new CustomEvent(`astro:hydration-error`,{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:t}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${t}`,e)}async start(){let e=JSON.parse(this.getAttribute(`opts`)),t=this.getAttribute(`client`);if(Astro[t]===void 0)window.addEventListener(`astro:${t}`,()=>this.start(),{once:!0});else try{await Astro[t](async()=>{let e=this.getAttribute(`renderer-url`);try{let[t,{default:n}]=await Promise.all([this.importWithRetry(this.getAttribute(`component-url`)),e?this.importWithRetry(e):Promise.resolve({default:()=>()=>{}})]),r=this.getAttribute(`component-export`)||`default`;if(r.includes(`.`)){this.Component=t;for(let e of r.split(`.`)){if(i.has(e)||!this.Component||typeof this.Component!=`object`&&typeof this.Component!=`function`||!Object.hasOwn(this.Component,e))throw Error(`Invalid component export path: ${r}`);this.Component=this.Component[e]}}else{if(i.has(r))throw Error(`Invalid component export path: ${r}`);this.Component=t[r]}return this.hydrator=n,this.hydrate}catch(e){return this.handleHydrationError(e),()=>{}}},e,this)}catch(e){this.handleHydrationError(e)}}attributeChangedCallback(){this.hydrate()}}r(o,`observedAttributes`,[`props`]),customElements.get(`astro-island`)||customElements.define(`astro-island`,o)}})();</script><astro-island uid="2wH2Dz" component-url="/_astro/SpaceSwitcher.Yy2w8MDF.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-gyrtbwwo-1&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;SpaceSwitcher&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-gyrtbwwo-1"></astro-island></div><button type="button" id="tw-nav-toggle" class="tw-nav-toggle" aria-label="收起或展开左侧导航" aria-expanded="true" aria-controls="tw-nav-aside"><svg class="tw-nav-toggle-icon is-collapse" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6 6 6"></path></svg><svg class="tw-nav-toggle-icon is-expand" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"></path></svg></button><nav class="tw-nav-list flex-1 overflow-y-auto"><a href="/" class="tw-nav-item" data-i18n-hint="nav.home" data-hint="我的工作台"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5"></path><path d="M5 9.5V20h14V9.5"></path></svg><span class="tw-nav-label" data-i18n="nav.home">我的工作台</span></a><div class="tw-nav-libraries"><div class="tw-nav-libraries-ph"><a href="/cases/library/" class="tw-nav-item" data-plugin-nav="cases"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 11l3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg><span class="tw-nav-label" data-i18n="nav.caseManage">用例管理</span></a><a href="/prompts/" class="tw-nav-item" data-plugin-nav="prompts"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg><span class="tw-nav-label" data-i18n="nav.prompts">提示词管理</span></a><a href="/knowledge/" class="tw-nav-item" data-plugin-nav="knowledgeLib"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg><span class="tw-nav-label" data-i18n="nav.knowledge">知识库管理</span></a><a href="/requirements/" class="tw-nav-item" data-plugin-nav="requirements" data-i18n-hint="nav.requirements"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M14 3v5h5"></path><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z"></path><path d="M8 13h8"></path><path d="M8 17h6"></path></svg><span class="tw-nav-label" data-i18n="nav.requirements">需求文档库</span></a><a href="/templates/" class="tw-nav-item" data-plugin-nav="templates" data-i18n-hint="nav.templates"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg><span class="tw-nav-label" data-i18n="nav.templates">测试模板库</span></a></div><astro-island uid="Z1lgSd4" component-url="/_astro/NavLibraries.EayBsg5g.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-iywf7oe7-2&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;NavLibraries&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-iywf7oe7-2"></astro-island></div><a href="/docs/manual/" class="tw-nav-item is-active font-medium" data-hint="帮助中心" data-i18n-hint="nav.helpCenter"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M5 4.5h9.5L19 9v10.5H5V4.5Z" stroke-linejoin="round"></path><path d="M14.5 4.5V9H19" stroke-linejoin="round"></path><path d="M8 13h8M8 16.5h6" stroke-linecap="round"></path></svg><span class="tw-nav-label" data-i18n="nav.helpCenter">帮助中心</span></a></nav><div class="tw-nav-foot"><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).load=e,window.dispatchEvent(new Event(`astro:load`))})();</script><astro-island uid="Z12jkyC" prefix="r1" component-url="/_astro/SettingsDialog.DC0e7580.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;SettingsDialog&quot;,&quot;value&quot;:true}" await-children><div class="tw-nav-foot-row"><button type="button" class="tw-nav-settings-btn" data-hint="设置"><svg class="tw-nav-ico w-4.5 h-4.5 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.7 1 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg><span data-i18n="nav.settings">设置</span></button><button type="button" class="tw-nav-provider-chip is-empty" data-hint="未配置模型"><span class="tw-nav-provider-dot" aria-hidden="true"></span><span class="tw-nav-provider-name">未配置</span></button></div><span hidden="" style="position:fixed;top:1px;left:1px;width:1px;height:0;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;display:none"></span><!--astro:end--></astro-island></div></aside><script data-astro-rerun>
70
+ [data-astro-transition-fallback="new"][data-astro-transition-scope="astro-v4xhcqov-3"] { animation: none; mix-blend-mode: normal; }</style></head><body class="tw-body antialiased"><div class="tw-shell min-h-screen"><aside class="tw-nav-aside fixed inset-y-0 left-0 flex flex-col z-45" id="tw-nav-aside"><div class="tw-nav-brand"><div class="tw-nav-brand-row"><a href="/" class="tw-nav-brand-link min-w-0 flex-1"><span class="tw-nav-brand-mark" aria-hidden="true"><img class="tw-nav-brand-mark-img" src="/brand-mark.png" alt="" width="36" height="36"></span><span class="tw-nav-brand-text"><span class="tw-nav-brand-title-row"><span class="tw-nav-brand-title" data-i18n="nav.brand">Lantern Harness</span><span class="tw-nav-brand-ver" data-hint="平台版本 v0.1.2">v0.1.2</span></span></span></a></div></div><div class="tw-nav-space-slot"><div class="tw-nav-space tw-nav-space-ph" id="tw-nav-space-ph" aria-hidden="true"><div class="tw-nav-space-ph-box"><span class="tw-nav-space-ph-ico"></span><span class="tw-nav-space-ph-lines"><span class="tw-nav-space-ph-bar is-cap"></span><span class="tw-nav-space-ph-bar is-name"></span></span></div></div><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).only=e,window.dispatchEvent(new Event(`astro:only`))})();</script><script>(function(){function e(t){"@babel/helpers - typeof";return e=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},e(t)}function t(t,n){if(e(t)!=`object`||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var i=r.call(t,n||`default`);if(e(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(t)}function n(n){var r=t(n,`string`);return e(r)==`symbol`?r:r+``}function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let i=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);{let e={0:e=>a(e),1:e=>n(e),2:e=>new RegExp(e),3:e=>new Date(e),4:e=>new Map(n(e)),5:e=>new Set(n(e)),6:e=>BigInt(e),7:e=>new URL(e),8:e=>new Uint8Array(e),9:e=>new Uint16Array(e),10:e=>new Uint32Array(e),11:e=>1/0*e},t=t=>{let[n,r]=t;return n in e?e[n](r):void 0},n=e=>e.map(t),a=e=>typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]));class o extends HTMLElement{constructor(...e){super(...e),r(this,`Component`,void 0),r(this,`hydrator`,void 0),r(this,`hydrate`,async()=>{var e;if(!this.hydrator||!this.isConnected)return;let t=(e=this.parentElement)==null?void 0:e.closest(`astro-island[ssr]`);if(t){t.addEventListener(`astro:hydrate`,this.hydrate,{once:!0});return}let n=this.querySelectorAll(`astro-slot`),r={},i=this.querySelectorAll(`template[data-astro-template]`);for(let e of i){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`data-astro-template`)||`default`]=e.innerHTML,e.remove())}for(let e of n){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`name`)||`default`]=e.innerHTML)}let o;try{o=this.hasAttribute(`props`)?a(JSON.parse(this.getAttribute(`props`))):{}}catch(e){let t=this.getAttribute(`component-url`)||`<unknown>`,n=this.getAttribute(`component-export`);throw n&&(t+=` (export ${n})`),console.error(`[hydrate] Error parsing props for component ${t}`,this.getAttribute(`props`),e),e}await this.hydrator(this)(this.Component,o,r,{client:this.getAttribute(`client`)}),this.removeAttribute(`ssr`),this.dispatchEvent(new CustomEvent(`astro:hydrate`))}),r(this,`unmount`,()=>{this.isConnected||this.dispatchEvent(new CustomEvent(`astro:unmount`))})}disconnectedCallback(){document.removeEventListener(`astro:after-swap`,this.unmount),document.addEventListener(`astro:after-swap`,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(`await-children`)||document.readyState===`interactive`||document.readyState===`complete`)this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(`DOMContentLoaded`,e),t.disconnect(),this.childrenConnectedCallback()},t=new MutationObserver(()=>{var t;((t=this.lastChild)==null?void 0:t.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===`astro:end`&&(this.lastChild.remove(),e())});t.observe(this,{childList:!0}),document.addEventListener(`DOMContentLoaded`,e)}}async childrenConnectedCallback(){let e=this.getAttribute(`before-hydration-url`);e&&await import(e),this.start()}getRetryImportUrl(e){let t=new URL(e,document.baseURI);return t.searchParams.set(`astro-retry`,Date.now().toString()),t.toString()}async importWithRetry(e){try{return await import(e)}catch(t){return await new Promise(e=>setTimeout(e,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let t=this.getAttribute(`component-url`),n=new CustomEvent(`astro:hydration-error`,{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:t}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${t}`,e)}async start(){let e=JSON.parse(this.getAttribute(`opts`)),t=this.getAttribute(`client`);if(Astro[t]===void 0)window.addEventListener(`astro:${t}`,()=>this.start(),{once:!0});else try{await Astro[t](async()=>{let e=this.getAttribute(`renderer-url`);try{let[t,{default:n}]=await Promise.all([this.importWithRetry(this.getAttribute(`component-url`)),e?this.importWithRetry(e):Promise.resolve({default:()=>()=>{}})]),r=this.getAttribute(`component-export`)||`default`;if(r.includes(`.`)){this.Component=t;for(let e of r.split(`.`)){if(i.has(e)||!this.Component||typeof this.Component!=`object`&&typeof this.Component!=`function`||!Object.hasOwn(this.Component,e))throw Error(`Invalid component export path: ${r}`);this.Component=this.Component[e]}}else{if(i.has(r))throw Error(`Invalid component export path: ${r}`);this.Component=t[r]}return this.hydrator=n,this.hydrate}catch(e){return this.handleHydrationError(e),()=>{}}},e,this)}catch(e){this.handleHydrationError(e)}}attributeChangedCallback(){this.hydrate()}}r(o,`observedAttributes`,[`props`]),customElements.get(`astro-island`)||customElements.define(`astro-island`,o)}})();</script><astro-island uid="2wH2Dz" component-url="/_astro/SpaceSwitcher.Wf8EPYUx.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-gyrtbwwo-1&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;SpaceSwitcher&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-gyrtbwwo-1"></astro-island></div><button type="button" id="tw-nav-toggle" class="tw-nav-toggle" aria-label="收起或展开左侧导航" aria-expanded="true" aria-controls="tw-nav-aside"><svg class="tw-nav-toggle-icon is-collapse" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6 6 6"></path></svg><svg class="tw-nav-toggle-icon is-expand" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"></path></svg></button><nav class="tw-nav-list flex-1 overflow-y-auto"><a href="/" class="tw-nav-item" data-i18n-hint="nav.home" data-hint="我的工作台"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5"></path><path d="M5 9.5V20h14V9.5"></path></svg><span class="tw-nav-label" data-i18n="nav.home">我的工作台</span></a><div class="tw-nav-libraries"><div class="tw-nav-libraries-ph"><a href="/tasks/" class="tw-nav-item" data-plugin-nav="tasks"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 5h10"></path><path d="M9 12h10"></path><path d="M9 19h10"></path><path d="M4 5h.01"></path><path d="M4 12h.01"></path><path d="M4 19h.01"></path></svg><span class="tw-nav-label" data-i18n="nav.tasks">任务管理</span></a><a href="/todos/" class="tw-nav-item" data-plugin-nav="todos"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M8 6h13"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M3 6h.01"></path><path d="M3 12h.01"></path><path d="M3 18h.01"></path></svg><span class="tw-nav-label" data-i18n="nav.todos">待办事项</span></a><a href="/cases/library/" class="tw-nav-item" data-plugin-nav="cases"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 11l3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg><span class="tw-nav-label" data-i18n="nav.caseManage">用例管理</span></a><a href="/knowledge/" class="tw-nav-item" data-plugin-nav="knowledgeLib"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg><span class="tw-nav-label" data-i18n="nav.knowledge">知识库管理</span></a><a href="/requirements/" class="tw-nav-item" data-plugin-nav="requirements" data-i18n-hint="nav.requirements"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M14 3v5h5"></path><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z"></path><path d="M8 13h8"></path><path d="M8 17h6"></path></svg><span class="tw-nav-label" data-i18n="nav.requirements">需求文档库</span></a><a href="/templates/" class="tw-nav-item" data-plugin-nav="templates" data-i18n-hint="nav.templates"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg><span class="tw-nav-label" data-i18n="nav.templates">测试模板库</span></a></div><astro-island uid="Z1lgSd4" component-url="/_astro/NavLibraries.ALZ9e12z.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-iywf7oe7-2&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;NavLibraries&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-iywf7oe7-2"></astro-island></div><a href="/prompts/" class="tw-nav-item" data-plugin-nav="prompts" data-pinned-nav="prompts"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg><span class="tw-nav-label" data-i18n="nav.prompts">提示词管理</span></a><a href="/docs/manual/" class="tw-nav-item is-active font-medium" data-hint="帮助中心" data-i18n-hint="nav.helpCenter"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M5 4.5h9.5L19 9v10.5H5V4.5Z" stroke-linejoin="round"></path><path d="M14.5 4.5V9H19" stroke-linejoin="round"></path><path d="M8 13h8M8 16.5h6" stroke-linecap="round"></path></svg><span class="tw-nav-label" data-i18n="nav.helpCenter">帮助中心</span></a></nav><div class="tw-nav-foot"><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).load=e,window.dispatchEvent(new Event(`astro:load`))})();</script><astro-island uid="Z12jkyC" prefix="r1" component-url="/_astro/SettingsDialog.CrMDjSLJ.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;SettingsDialog&quot;,&quot;value&quot;:true}" await-children><div class="tw-nav-foot-row"><button type="button" class="tw-nav-settings-btn" data-hint="设置"><svg class="tw-nav-ico w-4.5 h-4.5 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.7 1 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg><span data-i18n="nav.settings">设置</span></button><button type="button" class="tw-nav-provider-chip is-empty" data-hint="未配置模型"><span class="tw-nav-provider-dot" aria-hidden="true"></span><span class="tw-nav-provider-name">未配置</span></button></div><span hidden="" style="position:fixed;top:1px;left:1px;width:1px;height:0;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;display:none"></span><!--astro:end--></astro-island></div></aside><script data-astro-rerun>
70
71
  (function () {
71
72
  var root = document.documentElement;
72
73
  var btn = document.getElementById('tw-nav-toggle');
@@ -97,6 +98,8 @@
97
98
  var en = {
98
99
  'nav.brand': 'Lantern Harness',
99
100
  'nav.home': 'My Workbench',
101
+ 'nav.tasks': 'Tasks',
102
+ 'nav.todos': 'Todos',
100
103
  'nav.caseManage': 'Test Cases',
101
104
  'nav.prompts': 'Prompts',
102
105
  'nav.knowledge': 'Knowledge Mgmt',
@@ -141,7 +144,7 @@
141
144
  </thead>
142
145
  <tbody><tr>
143
146
  <td>左侧导航</td>
144
- <td>新建空间默认只有「我的工作台」「帮助中心」;开启内容库插件后才出现用例管理 / 提示词管理 / 知识库管理 / 需求文档库 / 测试模板库(可自行建分组)</td>
147
+ <td>新建空间默认有「我的工作台」「提示词管理」「帮助中心」;提示词管理固定在帮助中心上方、不参与分组排序,其余内容库开启插件后才出现用例管理 / 知识库管理 / 需求文档库 / 测试模板库(可自行建分组)</td>
145
148
  </tr>
146
149
  <tr>
147
150
  <td>底部设置</td>
@@ -296,13 +299,24 @@
296
299
  </tr>
297
300
  </tbody></table>
298
301
  <blockquote>
299
- <p>目录<strong>按插件开关懒建</strong>:新建 / 首次选中的数据空间只有隐藏的 <code>.lantern/</code> 元数据,启用对应内容库插件后才出现上表目录并补入种子文件;旧版本留下的空目录(只有 <code>.gitkeep</code>)会自动收起,已有文件的目录不动。</p>
302
+ <p>目录<strong>按插件开关懒建</strong>:新建 / 首次选中的数据空间只有隐藏的 <code>.lantern/</code> 元数据,启用对应内容库插件后才出现上表目录并补入种子文件;旧版本留下的空目录(只有 <code>.gitkeep</code>)会自动收起,已有文件的目录不动。<strong><code>提示词管理/</code> 是唯一例外</strong>:每个空间都有默认提示词,因此该目录与 <code>默认提示词.md</code> 会始终铺好。</p>
303
+ </blockquote>
304
+ <blockquote>
305
+ <p>「空间管理」默认展示全部空间:右上角「+ 新增空间」新建并立即写入默认提示词;每行的「编辑」可修改空间名称、提示词要求与默认提示词正文,保存后工作台立即生效。</p>
300
306
  </blockquote>
301
307
  <blockquote>
302
308
  <p>旧版英文目录(<code>requirements/</code> / <code>cases/</code> / <code>prompts/</code> / <code>knowledge/</code> / <code>templates/</code>)在启动时<strong>自动改名</strong>为上述中文目录,无需手工迁移;若目标目录已存在则不覆盖。</p>
303
309
  </blockquote>
304
310
  <h3>整体拷贝 / 扫描纳入</h3>
305
311
  <p>把一份空间文件夹(带 <code>.lantern/space.json</code> 清单)整体拷进数据目录后,在「空间管理」点「扫描文件夹」,即可纳入列表:名称以目录名为准,清单里的 id 与已有空间撞车时自动换新。</p>
312
+ <p>「空间管理」里的「复制」是另一种做法:在数据目录内<strong>逐文件复制</strong>出一个新空间(含 <code>.lantern/local</code> 下的待办、任务、会话、记忆与配置),新空间直接出现在列表里、不需要再扫描。</p>
313
+ <ul>
314
+ <li>复制会跳过 <code>node_modules</code> / <code>.git</code> / <code>.astro</code> / <code>dist</code> 与 <code>.DS_Store</code>;也会跳过可重建的派生缓存(<code>.lantern/local/session-query.sqlite</code> 及其 <code>-wal</code> / <code>-shm</code>、<code>.lantern/local/spill/</code>),避免拷到写了一半的文件。</li>
315
+ <li>复制品里的工作区注册表会被改指新目录,所以新空间的「工作区」停在自己身上,而不是被复制的那个空间。</li>
316
+ <li>有会话正在运行时不允许复制(与切换空间一致,先停止再操作)。</li>
317
+ <li>复制<strong>不会</strong>自动切过去;切到新空间时页面会重载,待办 / 任务等按新空间的数据重新加载。</li>
318
+ <li>浏览器本地存储里按空间 id 记的界面偏好(列宽、侧栏展开状态等)不会跟着复制,新空间用默认值。</li>
319
+ </ul>
306
320
  <p>同一目录里其它<strong>不是空间</strong>的文件夹会在扫描后列出来,勾选并确认才纳入:</p>
307
321
  <ul>
308
322
  <li>纳入只把文件夹登记进列表,<strong>不写入 <code>.lantern/space.json</code>,也不铺内容目录、不播种子</strong>,文件夹内容保持原样。</li>
@@ -402,7 +416,7 @@ version: &#39;1.0&#39; # 可选
402
416
  <p>工作台会话栏「新会话」下方点「插件」进入:</p>
403
417
  <ul>
404
418
  <li><strong>我的插件</strong>(<code>/plugins/</code>):分「扩展插件 / 会话插件 / 全局插件」三个 Tab(默认打开扩展插件),Tab 标题带数量;点击卡片展开详情。扩展为可配置项,可开关;开关状态存本机。插件随仓库代码发布,不提供远程安装 / 更新。</li>
405
- <li>扩展插件按「内容库 / 生成能力 / 记忆与检索 / 开发工具」四类分组展示,分类标题带数量,可点击折叠 / 展开;分类与插件注册表的 <code>category</code> 字段一致。</li>
419
+ <li>扩展插件按「内容库 / 生成能力 / 记忆与检索 / 待办与效率 / 开发工具」五类分组展示,分类标题带数量,可点击折叠 / 展开;分类与插件注册表的 <code>category</code> 字段一致。</li>
406
420
  </ul>
407
421
  <table>
408
422
  <thead>
@@ -422,8 +436,8 @@ version: &#39;1.0&#39; # 可选
422
436
  <tr>
423
437
  <td>内容库</td>
424
438
  <td>提示词管理</td>
425
- <td>关</td>
426
- <td>侧栏进入提示词库;关闭后入口隐藏,「生成提示词」一并关闭;磁盘文件仍保留</td>
439
+ <td>开(内置)</td>
440
+ <td>侧栏进入提示词库,并维护当前空间的「默认提示词」;每个空间都需要,因此常开不可关闭</td>
427
441
  </tr>
428
442
  <tr>
429
443
  <td>内容库</td>
@@ -474,6 +488,18 @@ version: &#39;1.0&#39; # 可选
474
488
  <td>长期记忆 / 项目关键 / 项目日志等记忆轨 + 待确认队列;<code>.lantern/local/memories/</code>(需本地服务)</td>
475
489
  </tr>
476
490
  <tr>
491
+ <td>待办与效率</td>
492
+ <td>任务管理</td>
493
+ <td>关</td>
494
+ <td>侧栏进入任务列表:任务池 / 进行中 / 已完成 / 已关闭,自动汇总任务下待办的数量与完成进度(需本地服务)</td>
495
+ </tr>
496
+ <tr>
497
+ <td>待办与效率</td>
498
+ <td>待办事项</td>
499
+ <td>关</td>
500
+ <td>侧栏进入待办列表:筛选、行内改状态、手动增删改;工作台会话可用工具记录同一份待办(需本地服务)</td>
501
+ </tr>
502
+ <tr>
477
503
  <td>开发工具</td>
478
504
  <td>插件开发</td>
479
505
  <td>关</td>
@@ -481,8 +507,44 @@ version: &#39;1.0&#39; # 可选
481
507
  </tr>
482
508
  </tbody></table>
483
509
  <blockquote>
484
- <p><strong>新建空间的插件全部默认关闭</strong>:侧栏只有「我的工作台」「帮助中心」,所有入口与「生成」能力都要在「我的插件」里按分类手动开启;已有空间保持原开关。种子文件(默认提示词、模板)不会让插件自动打开,只有用户自己放进空间的内容才会触发首次识别。</p>
510
+ <p><strong>新建空间默认开启「提示词管理」,其余插件默认关闭</strong>:每个空间都会带上自己的「默认提示词.md」,因此提示词管理是内置常开项;其余入口与「生成」能力仍要在「我的插件」里按分类手动开启,已有空间也保持原开关。种子文件(默认提示词、模板)不会让其它插件自动打开,只有用户自己放进空间的内容才会触发首次识别。</p>
485
511
  </blockquote>
512
+ <h3>待办事项</h3>
513
+ <p>「我的插件」→「待办与效率」→「待办事项」开启后,侧栏出现「待办事项」入口(<code>/todos/</code>)。</p>
514
+ <ul>
515
+ <li>数据落在当前数据空间的 <code>.lantern/local/todos.json</code>,随空间走、不进 git;切换空间后看到的是各空间自己的待办。</li>
516
+ <li>字段:待办名称、待办状态(待开始 / 进行中 / 已完成 / 已取消)、紧急程度(重要紧急 / 重要不紧急 / 紧急不重要 / 普通)、所属任务、开始日期、截止日期、结束日期、备注。</li>
517
+ <li><strong>结束日期是只读派生值</strong>:状态改为「已完成 / 已取消」时自动记为当天(再改其他字段不会刷新);状态改回「待开始 / 进行中」时清空,界面上显示「待办未完成」。表格行内、抽屉、AI 工具(<code>todo_update</code>)改状态都按同一规则处理。</li>
518
+ <li>新建待办(抽屉与「+ 新增记录」)的<strong>开始日期 / 截止日期默认是当天</strong>,可直接改。</li>
519
+ <li>「所属任务」从「任务管理」里选(需同时开启该插件),选中后写回任务 id 与任务名称;<strong>已关闭的任务不出现在选项里</strong>。待办关联任务时,任务会从「任务池 / 已完成」被拉回「进行中」(已关闭的不动);打开待办页时也会对「仍有未完成待办」的已关联任务做同样处理。任务管理开启时,旧数据里只存了任务名的待办会按名称自动补上关联,任务管理关闭时该列显示「任务管理插件未启用」,原任务名不会丢。</li>
520
+ <li>「待办周期」与「剩余天数」由日期自动算出(含首尾);未完成且过了截止日期显示「已延期」,存储状态不变。</li>
521
+ <li>表格按飞书多维表格的方式展示:默认按「待办状态」分组(进行中 / 待开始 / 已延期 / 已完成 / 已取消),每组标题带记录数,点标题可折叠;顶部的分组下拉可切换为「按紧急程度分组」或「不分组」。</li>
522
+ <li>单元格直接改:点名称 / 所属任务 / 日期 / 备注即可编辑,回车或点空白处保存,Esc 放弃;状态下拉与紧急程度下拉在行内改完立即生效(改状态后会自动换到对应分组)。</li>
523
+ <li>日期格不再显示系统小日历图标:点一下弹出白色卡片日历(可翻月,底部「清除 / 今天」),选完立即保存。</li>
524
+ <li>工具栏与单元格里的下拉都是卡片菜单(白底圆角),状态 / 紧急程度用颜色点和选中底色区分,不显示对钩,不会弹出系统原生下拉。</li>
525
+ <li>每组底部有「+ 新增记录」(手动新增入口):点开后在组内展开一行,包含全部列(名称 / 状态 / 紧急程度 / 所属任务 / 开始日期 / 截止日期 / 备注;结束日期随状态自动生成,不在这里填);没有单独的保存 / 取消按钮——填好名称后回车,或直接点页面空白处即自动保存,完全没填内容时点空白处则自动收起,Esc 放弃。顶部「新建待办」会从右侧滑出记录抽屉,按顺序填写名称、状态、任务详情、日期与备注后保存;没有数据时只保留右上角的「新建待办」按钮。</li>
526
+ <li>抽屉里的「待办状态」整行都可点:点击范围一直延伸到「待办名称」输入框的右边界,胶囊只是选中值的样子,点行的任意位置都会展开状态选项。</li>
527
+ <li>行尾的展开按钮可用同一个抽屉回看 / 修改整条记录;抽屉里的「待办周期」「剩余天数」是只读派生值,会随日期即时计算。</li>
528
+ <li>顶部可搜索,并按紧急程度筛选;支持批量删除,行尾「操作」列可删除单条,都会二次弹窗确认;表格右侧列较多时可横向滚动。</li>
529
+ <li>列宽可拖:把鼠标放到表头字段的右边缘,出现竖线后左右拖即可调整;默认宽度就是设计稿宽度。调过的列宽存在浏览器本地(localStorage),刷新、切换页面后保持,不会写进数据空间。</li>
530
+ <li>新增行没有任何内容时,点页面其它位置会自动收起;已经填了名称则点空白处(或回车)即自动保存,不再有单独的 ✓ / ✕ 按钮。</li>
531
+ <li>「我的工作台」对话上方的 Tab 里有「待办」(待办插件开启时,排在「回合」右侧):默认「全部待办」,按 已逾期 / 今天截止 / 接下来 / 没有截止日期 / 已完成 分桶(今日与其它待办都在里面);也可只看「未完成」或「已完成」。每行显示待办名称、紧急程度,以及第二行的截止日期、剩余天数(逾期会标红)和所属任务;点左侧圆圈即可标记完成 / 恢复,右上角「打开待办页」跳到完整表格。停在 Tab 上每 15 秒自动刷新,AI 在会话里写入后不用手动刷。</li>
532
+ <li>输入框左侧「+」→「计划」下面会按插件开关给出「待办」「任务」两个手动入口(对应插件关闭时入口直接隐藏,不会触发新增):点开后弹出同一张确认卡片,手动入口的最后一个按钮是「提交」。待办分两页:第一页填待办自身字段(名称 / 状态 / 紧急程度 / 开始日期 / 截止日期 / 备注,开始 / 截止默认今天),第二页选「所属任务」并只读展示该任务的名称、状态、紧急程度与起止日期;选中任务后,任务有值的开始日期 / 截止日期 / 紧急程度会自动带到第一页(紧急程度仅在待办未设置时带出),仍可再改。任务没有所属任务,一页填完(名称 / 状态 / 紧急程度 / 开始日期 / 截止日期 / 备注)。填好「提交」直接落库,不经过模型;点「取消」或点卡片外面任意位置(包括切到别的 Tab)只会播放收起动画并放弃这次新增,不会写入待办 / 任务。</li>
533
+ <li>工作台里直接说「记一条待办:周五前提交测试报告」,AI 会调用 <code>todo_add</code>;写入前聊天区会弹出确认卡片,同样分两页(第一页待办字段,第二页选所属任务并带出任务的日期与紧急程度),点「确认新增」才落库;点「取消」或点卡片外面会收起卡片、不写任何数据。查进度用 <code>todo_list</code>,完成用 <code>todo_update</code>。停在该页时会定时刷新,AI 在会话里写入后不用手动刷新。</li>
534
+ </ul>
535
+ <h3>任务管理</h3>
536
+ <p>「我的插件」→「待办与效率」→「任务管理」开启后,侧栏出现「任务管理」入口(<code>/tasks/</code>)。</p>
537
+ <ul>
538
+ <li>数据落在当前数据空间的 <code>.lantern/local/tasks.json</code>;切换空间后看到各空间自己的任务。</li>
539
+ <li>顶部六张统计卡片:全部任务、任务池、进行中、已完成、已关闭、需要紧急(重要紧急 + 紧急不重要)。</li>
540
+ <li>列表字段:任务描述、任务状态、紧急程度、开始日期、截止日期、任务周期、待办数量、完成进度、备注。</li>
541
+ <li>新建任务的开始日期 / 截止日期默认是当天,可直接改。</li>
542
+ <li>「任务周期」由开始 / 截止日期算出;「待办数量」与「完成进度」按待办里的「所属任务」实时汇总(待办完成状态变化后自动刷新)。待办事项插件关闭时,这两列显示「待办事项未启用」。</li>
543
+ <li>状态 / 紧急程度在行内用卡片菜单改;日期点开卡片日历;点任务名称或用行尾展开按钮打开右侧抽屉,可改名称、日期与备注,并看到该任务下已关联的待办。</li>
544
+ <li>工作台里也可以让 AI 建任务:说「新建一个任务:…」会调用 <code>task_add</code>,同样先弹确认卡片(一页:名称 / 状态 / 紧急程度 / 开始 / 截止日期 / 备注),确认后才创建;点「取消」或点卡片外面不会写入。查询用 <code>task_list</code>、改字段用 <code>task_update</code>、删除用 <code>task_delete</code>。</li>
545
+ <li>删除任务不会删待办,只是解除关联(待办里的「所属任务」变为未关联)。</li>
546
+ <li>列宽同样可拖表头右边缘调整,与待办页一致;表头、行高、状态胶囊、行尾展开 / 删除按钮的样式也与待办页保持同一套。</li>
547
+ </ul>
486
548
  <h3>插件开发</h3>
487
549
  <blockquote>
488
550
  <p>需在 Lantern Harness 源码仓库中运行(<code>pnpm dev</code> / 本地服务),并能读写项目源码。生成的新插件进入仓库代码,开发服会热更新。</p>
@@ -602,8 +664,9 @@ version: &#39;1.0&#39; # 可选
602
664
  if (cur.dataset.spaceService) nextRoot.dataset.spaceService = cur.dataset.spaceService;
603
665
  // 插件开关同理:不搬过去会先亮出被隐藏的侧栏入口,等 page-load 再收起
604
666
  [
667
+ 'pluginOffTasks',
668
+ 'pluginOffTodos',
605
669
  'pluginOffCases',
606
- 'pluginOffPrompts',
607
670
  'pluginOffKnowledgeLib',
608
671
  'pluginOffRequirements',
609
672
  'pluginOffTemplates',
package/dist/index.html CHANGED
@@ -3,7 +3,7 @@
3
3
  try {
4
4
  if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
5
5
  } catch (e) {}
6
- </script><script type="module" src="/_astro/Base.astro_astro_type_script_index_0_lang.lxEwQ1R4.js"></script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CO1cjG9V.js"></script><script>
6
+ </script><script type="module" src="/_astro/Base.astro_astro_type_script_index_0_lang.Cg_8YLVA.js"></script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CO1cjG9V.js"></script><script>
7
7
  (function () {
8
8
  try {
9
9
  var raw = localStorage.getItem('tw.app.config.v1');
@@ -42,7 +42,8 @@
42
42
  var savedCfg = JSON.parse(cfgRaw) || {};
43
43
  var plugins = savedCfg.plugins || {};
44
44
  if (plugins.cases === false) document.documentElement.dataset.pluginOffCases = '1';
45
- if (plugins.prompts === false) document.documentElement.dataset.pluginOffPrompts = '1';
45
+ if (plugins.todos === false) document.documentElement.dataset.pluginOffTodos = '1';
46
+ if (plugins.tasks === false) document.documentElement.dataset.pluginOffTasks = '1';
46
47
  if (plugins.knowledgeLib === false)
47
48
  document.documentElement.dataset.pluginOffKnowledgeLib = '1';
48
49
  if (plugins.requirements === false)
@@ -63,7 +64,7 @@
63
64
  }
64
65
  } catch (e) {}
65
66
  })();
66
- </script><link rel="stylesheet" href="/_astro/Base.B9f_iFAZ.css"><script type="module" src="/_astro/page.Bx2KSkeL.js"></script><style>[data-astro-transition-scope="astro-bbhp3f5g-3"] { view-transition-name: astro-bbhp3f5g-3; }@layer astro { ::view-transition-old(astro-bbhp3f5g-3) {
67
+ </script><link rel="stylesheet" href="/_astro/Base.ByB0D4ZA.css"><script type="module" src="/_astro/page.Bx2KSkeL.js"></script><style>[data-astro-transition-scope="astro-bbhp3f5g-3"] { view-transition-name: astro-bbhp3f5g-3; }@layer astro { ::view-transition-old(astro-bbhp3f5g-3) {
67
68
  animation-duration: 180ms;
68
69
  animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
69
70
  animation-fill-mode: both;
@@ -99,7 +100,7 @@
99
100
  animation-duration: 180ms;
100
101
  animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
101
102
  animation-fill-mode: both;
102
- animation-name: astroFadeIn; }</style></head><body class="tw-body antialiased"><div class="tw-shell min-h-screen"><aside class="tw-nav-aside fixed inset-y-0 left-0 flex flex-col z-45" id="tw-nav-aside"><div class="tw-nav-brand"><div class="tw-nav-brand-row"><a href="/" class="tw-nav-brand-link min-w-0 flex-1"><span class="tw-nav-brand-mark" aria-hidden="true"><img class="tw-nav-brand-mark-img" src="/brand-mark.png" alt="" width="36" height="36"></span><span class="tw-nav-brand-text"><span class="tw-nav-brand-title-row"><span class="tw-nav-brand-title" data-i18n="nav.brand">Lantern Harness</span><span class="tw-nav-brand-ver" data-hint="平台版本 v0.1.2">v0.1.2</span></span></span></a></div></div><div class="tw-nav-space-slot"><div class="tw-nav-space tw-nav-space-ph" id="tw-nav-space-ph" aria-hidden="true"><div class="tw-nav-space-ph-box"><span class="tw-nav-space-ph-ico"></span><span class="tw-nav-space-ph-lines"><span class="tw-nav-space-ph-bar is-cap"></span><span class="tw-nav-space-ph-bar is-name"></span></span></div></div><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).only=e,window.dispatchEvent(new Event(`astro:only`))})();</script><script>(function(){function e(t){"@babel/helpers - typeof";return e=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},e(t)}function t(t,n){if(e(t)!=`object`||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var i=r.call(t,n||`default`);if(e(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(t)}function n(n){var r=t(n,`string`);return e(r)==`symbol`?r:r+``}function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let i=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);{let e={0:e=>a(e),1:e=>n(e),2:e=>new RegExp(e),3:e=>new Date(e),4:e=>new Map(n(e)),5:e=>new Set(n(e)),6:e=>BigInt(e),7:e=>new URL(e),8:e=>new Uint8Array(e),9:e=>new Uint16Array(e),10:e=>new Uint32Array(e),11:e=>1/0*e},t=t=>{let[n,r]=t;return n in e?e[n](r):void 0},n=e=>e.map(t),a=e=>typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]));class o extends HTMLElement{constructor(...e){super(...e),r(this,`Component`,void 0),r(this,`hydrator`,void 0),r(this,`hydrate`,async()=>{var e;if(!this.hydrator||!this.isConnected)return;let t=(e=this.parentElement)==null?void 0:e.closest(`astro-island[ssr]`);if(t){t.addEventListener(`astro:hydrate`,this.hydrate,{once:!0});return}let n=this.querySelectorAll(`astro-slot`),r={},i=this.querySelectorAll(`template[data-astro-template]`);for(let e of i){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`data-astro-template`)||`default`]=e.innerHTML,e.remove())}for(let e of n){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`name`)||`default`]=e.innerHTML)}let o;try{o=this.hasAttribute(`props`)?a(JSON.parse(this.getAttribute(`props`))):{}}catch(e){let t=this.getAttribute(`component-url`)||`<unknown>`,n=this.getAttribute(`component-export`);throw n&&(t+=` (export ${n})`),console.error(`[hydrate] Error parsing props for component ${t}`,this.getAttribute(`props`),e),e}await this.hydrator(this)(this.Component,o,r,{client:this.getAttribute(`client`)}),this.removeAttribute(`ssr`),this.dispatchEvent(new CustomEvent(`astro:hydrate`))}),r(this,`unmount`,()=>{this.isConnected||this.dispatchEvent(new CustomEvent(`astro:unmount`))})}disconnectedCallback(){document.removeEventListener(`astro:after-swap`,this.unmount),document.addEventListener(`astro:after-swap`,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(`await-children`)||document.readyState===`interactive`||document.readyState===`complete`)this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(`DOMContentLoaded`,e),t.disconnect(),this.childrenConnectedCallback()},t=new MutationObserver(()=>{var t;((t=this.lastChild)==null?void 0:t.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===`astro:end`&&(this.lastChild.remove(),e())});t.observe(this,{childList:!0}),document.addEventListener(`DOMContentLoaded`,e)}}async childrenConnectedCallback(){let e=this.getAttribute(`before-hydration-url`);e&&await import(e),this.start()}getRetryImportUrl(e){let t=new URL(e,document.baseURI);return t.searchParams.set(`astro-retry`,Date.now().toString()),t.toString()}async importWithRetry(e){try{return await import(e)}catch(t){return await new Promise(e=>setTimeout(e,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let t=this.getAttribute(`component-url`),n=new CustomEvent(`astro:hydration-error`,{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:t}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${t}`,e)}async start(){let e=JSON.parse(this.getAttribute(`opts`)),t=this.getAttribute(`client`);if(Astro[t]===void 0)window.addEventListener(`astro:${t}`,()=>this.start(),{once:!0});else try{await Astro[t](async()=>{let e=this.getAttribute(`renderer-url`);try{let[t,{default:n}]=await Promise.all([this.importWithRetry(this.getAttribute(`component-url`)),e?this.importWithRetry(e):Promise.resolve({default:()=>()=>{}})]),r=this.getAttribute(`component-export`)||`default`;if(r.includes(`.`)){this.Component=t;for(let e of r.split(`.`)){if(i.has(e)||!this.Component||typeof this.Component!=`object`&&typeof this.Component!=`function`||!Object.hasOwn(this.Component,e))throw Error(`Invalid component export path: ${r}`);this.Component=this.Component[e]}}else{if(i.has(r))throw Error(`Invalid component export path: ${r}`);this.Component=t[r]}return this.hydrator=n,this.hydrate}catch(e){return this.handleHydrationError(e),()=>{}}},e,this)}catch(e){this.handleHydrationError(e)}}attributeChangedCallback(){this.hydrate()}}r(o,`observedAttributes`,[`props`]),customElements.get(`astro-island`)||customElements.define(`astro-island`,o)}})();</script><astro-island uid="2wH2Dz" component-url="/_astro/SpaceSwitcher.Yy2w8MDF.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-gyrtbwwo-1&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;SpaceSwitcher&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-gyrtbwwo-1"></astro-island></div><button type="button" id="tw-nav-toggle" class="tw-nav-toggle" aria-label="收起或展开左侧导航" aria-expanded="true" aria-controls="tw-nav-aside"><svg class="tw-nav-toggle-icon is-collapse" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6 6 6"></path></svg><svg class="tw-nav-toggle-icon is-expand" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"></path></svg></button><nav class="tw-nav-list flex-1 overflow-y-auto"><a href="/" class="tw-nav-item is-active font-medium" data-i18n-hint="nav.home" data-hint="我的工作台"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5"></path><path d="M5 9.5V20h14V9.5"></path></svg><span class="tw-nav-label" data-i18n="nav.home">我的工作台</span></a><div class="tw-nav-libraries"><div class="tw-nav-libraries-ph"><a href="/cases/library/" class="tw-nav-item" data-plugin-nav="cases"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 11l3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg><span class="tw-nav-label" data-i18n="nav.caseManage">用例管理</span></a><a href="/prompts/" class="tw-nav-item" data-plugin-nav="prompts"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg><span class="tw-nav-label" data-i18n="nav.prompts">提示词管理</span></a><a href="/knowledge/" class="tw-nav-item" data-plugin-nav="knowledgeLib"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg><span class="tw-nav-label" data-i18n="nav.knowledge">知识库管理</span></a><a href="/requirements/" class="tw-nav-item" data-plugin-nav="requirements" data-i18n-hint="nav.requirements"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M14 3v5h5"></path><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z"></path><path d="M8 13h8"></path><path d="M8 17h6"></path></svg><span class="tw-nav-label" data-i18n="nav.requirements">需求文档库</span></a><a href="/templates/" class="tw-nav-item" data-plugin-nav="templates" data-i18n-hint="nav.templates"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg><span class="tw-nav-label" data-i18n="nav.templates">测试模板库</span></a></div><astro-island uid="Z1lgSd4" component-url="/_astro/NavLibraries.EayBsg5g.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-iywf7oe7-2&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;NavLibraries&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-iywf7oe7-2"></astro-island></div><a href="/docs/manual/" class="tw-nav-item" data-hint="帮助中心" data-i18n-hint="nav.helpCenter"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M5 4.5h9.5L19 9v10.5H5V4.5Z" stroke-linejoin="round"></path><path d="M14.5 4.5V9H19" stroke-linejoin="round"></path><path d="M8 13h8M8 16.5h6" stroke-linecap="round"></path></svg><span class="tw-nav-label" data-i18n="nav.helpCenter">帮助中心</span></a></nav><div class="tw-nav-foot"><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).load=e,window.dispatchEvent(new Event(`astro:load`))})();</script><astro-island uid="Z12jkyC" prefix="r1" component-url="/_astro/SettingsDialog.DC0e7580.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;SettingsDialog&quot;,&quot;value&quot;:true}" await-children><div class="tw-nav-foot-row"><button type="button" class="tw-nav-settings-btn" data-hint="设置"><svg class="tw-nav-ico w-4.5 h-4.5 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.7 1 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg><span data-i18n="nav.settings">设置</span></button><button type="button" class="tw-nav-provider-chip is-empty" data-hint="未配置模型"><span class="tw-nav-provider-dot" aria-hidden="true"></span><span class="tw-nav-provider-name">未配置</span></button></div><span hidden="" style="position:fixed;top:1px;left:1px;width:1px;height:0;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;display:none"></span><!--astro:end--></astro-island></div></aside><script data-astro-rerun>
103
+ animation-name: astroFadeIn; }</style></head><body class="tw-body antialiased"><div class="tw-shell min-h-screen"><aside class="tw-nav-aside fixed inset-y-0 left-0 flex flex-col z-45" id="tw-nav-aside"><div class="tw-nav-brand"><div class="tw-nav-brand-row"><a href="/" class="tw-nav-brand-link min-w-0 flex-1"><span class="tw-nav-brand-mark" aria-hidden="true"><img class="tw-nav-brand-mark-img" src="/brand-mark.png" alt="" width="36" height="36"></span><span class="tw-nav-brand-text"><span class="tw-nav-brand-title-row"><span class="tw-nav-brand-title" data-i18n="nav.brand">Lantern Harness</span><span class="tw-nav-brand-ver" data-hint="平台版本 v0.1.2">v0.1.2</span></span></span></a></div></div><div class="tw-nav-space-slot"><div class="tw-nav-space tw-nav-space-ph" id="tw-nav-space-ph" aria-hidden="true"><div class="tw-nav-space-ph-box"><span class="tw-nav-space-ph-ico"></span><span class="tw-nav-space-ph-lines"><span class="tw-nav-space-ph-bar is-cap"></span><span class="tw-nav-space-ph-bar is-name"></span></span></div></div><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).only=e,window.dispatchEvent(new Event(`astro:only`))})();</script><script>(function(){function e(t){"@babel/helpers - typeof";return e=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},e(t)}function t(t,n){if(e(t)!=`object`||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var i=r.call(t,n||`default`);if(e(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(t)}function n(n){var r=t(n,`string`);return e(r)==`symbol`?r:r+``}function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let i=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);{let e={0:e=>a(e),1:e=>n(e),2:e=>new RegExp(e),3:e=>new Date(e),4:e=>new Map(n(e)),5:e=>new Set(n(e)),6:e=>BigInt(e),7:e=>new URL(e),8:e=>new Uint8Array(e),9:e=>new Uint16Array(e),10:e=>new Uint32Array(e),11:e=>1/0*e},t=t=>{let[n,r]=t;return n in e?e[n](r):void 0},n=e=>e.map(t),a=e=>typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]));class o extends HTMLElement{constructor(...e){super(...e),r(this,`Component`,void 0),r(this,`hydrator`,void 0),r(this,`hydrate`,async()=>{var e;if(!this.hydrator||!this.isConnected)return;let t=(e=this.parentElement)==null?void 0:e.closest(`astro-island[ssr]`);if(t){t.addEventListener(`astro:hydrate`,this.hydrate,{once:!0});return}let n=this.querySelectorAll(`astro-slot`),r={},i=this.querySelectorAll(`template[data-astro-template]`);for(let e of i){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`data-astro-template`)||`default`]=e.innerHTML,e.remove())}for(let e of n){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`name`)||`default`]=e.innerHTML)}let o;try{o=this.hasAttribute(`props`)?a(JSON.parse(this.getAttribute(`props`))):{}}catch(e){let t=this.getAttribute(`component-url`)||`<unknown>`,n=this.getAttribute(`component-export`);throw n&&(t+=` (export ${n})`),console.error(`[hydrate] Error parsing props for component ${t}`,this.getAttribute(`props`),e),e}await this.hydrator(this)(this.Component,o,r,{client:this.getAttribute(`client`)}),this.removeAttribute(`ssr`),this.dispatchEvent(new CustomEvent(`astro:hydrate`))}),r(this,`unmount`,()=>{this.isConnected||this.dispatchEvent(new CustomEvent(`astro:unmount`))})}disconnectedCallback(){document.removeEventListener(`astro:after-swap`,this.unmount),document.addEventListener(`astro:after-swap`,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(`await-children`)||document.readyState===`interactive`||document.readyState===`complete`)this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(`DOMContentLoaded`,e),t.disconnect(),this.childrenConnectedCallback()},t=new MutationObserver(()=>{var t;((t=this.lastChild)==null?void 0:t.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===`astro:end`&&(this.lastChild.remove(),e())});t.observe(this,{childList:!0}),document.addEventListener(`DOMContentLoaded`,e)}}async childrenConnectedCallback(){let e=this.getAttribute(`before-hydration-url`);e&&await import(e),this.start()}getRetryImportUrl(e){let t=new URL(e,document.baseURI);return t.searchParams.set(`astro-retry`,Date.now().toString()),t.toString()}async importWithRetry(e){try{return await import(e)}catch(t){return await new Promise(e=>setTimeout(e,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let t=this.getAttribute(`component-url`),n=new CustomEvent(`astro:hydration-error`,{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:t}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${t}`,e)}async start(){let e=JSON.parse(this.getAttribute(`opts`)),t=this.getAttribute(`client`);if(Astro[t]===void 0)window.addEventListener(`astro:${t}`,()=>this.start(),{once:!0});else try{await Astro[t](async()=>{let e=this.getAttribute(`renderer-url`);try{let[t,{default:n}]=await Promise.all([this.importWithRetry(this.getAttribute(`component-url`)),e?this.importWithRetry(e):Promise.resolve({default:()=>()=>{}})]),r=this.getAttribute(`component-export`)||`default`;if(r.includes(`.`)){this.Component=t;for(let e of r.split(`.`)){if(i.has(e)||!this.Component||typeof this.Component!=`object`&&typeof this.Component!=`function`||!Object.hasOwn(this.Component,e))throw Error(`Invalid component export path: ${r}`);this.Component=this.Component[e]}}else{if(i.has(r))throw Error(`Invalid component export path: ${r}`);this.Component=t[r]}return this.hydrator=n,this.hydrate}catch(e){return this.handleHydrationError(e),()=>{}}},e,this)}catch(e){this.handleHydrationError(e)}}attributeChangedCallback(){this.hydrate()}}r(o,`observedAttributes`,[`props`]),customElements.get(`astro-island`)||customElements.define(`astro-island`,o)}})();</script><astro-island uid="2wH2Dz" component-url="/_astro/SpaceSwitcher.Wf8EPYUx.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-gyrtbwwo-1&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;SpaceSwitcher&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-gyrtbwwo-1"></astro-island></div><button type="button" id="tw-nav-toggle" class="tw-nav-toggle" aria-label="收起或展开左侧导航" aria-expanded="true" aria-controls="tw-nav-aside"><svg class="tw-nav-toggle-icon is-collapse" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6 6 6"></path></svg><svg class="tw-nav-toggle-icon is-expand" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"></path></svg></button><nav class="tw-nav-list flex-1 overflow-y-auto"><a href="/" class="tw-nav-item is-active font-medium" data-i18n-hint="nav.home" data-hint="我的工作台"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5"></path><path d="M5 9.5V20h14V9.5"></path></svg><span class="tw-nav-label" data-i18n="nav.home">我的工作台</span></a><div class="tw-nav-libraries"><div class="tw-nav-libraries-ph"><a href="/tasks/" class="tw-nav-item" data-plugin-nav="tasks"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 5h10"></path><path d="M9 12h10"></path><path d="M9 19h10"></path><path d="M4 5h.01"></path><path d="M4 12h.01"></path><path d="M4 19h.01"></path></svg><span class="tw-nav-label" data-i18n="nav.tasks">任务管理</span></a><a href="/todos/" class="tw-nav-item" data-plugin-nav="todos"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M8 6h13"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M3 6h.01"></path><path d="M3 12h.01"></path><path d="M3 18h.01"></path></svg><span class="tw-nav-label" data-i18n="nav.todos">待办事项</span></a><a href="/cases/library/" class="tw-nav-item" data-plugin-nav="cases"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 11l3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg><span class="tw-nav-label" data-i18n="nav.caseManage">用例管理</span></a><a href="/knowledge/" class="tw-nav-item" data-plugin-nav="knowledgeLib"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg><span class="tw-nav-label" data-i18n="nav.knowledge">知识库管理</span></a><a href="/requirements/" class="tw-nav-item" data-plugin-nav="requirements" data-i18n-hint="nav.requirements"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M14 3v5h5"></path><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z"></path><path d="M8 13h8"></path><path d="M8 17h6"></path></svg><span class="tw-nav-label" data-i18n="nav.requirements">需求文档库</span></a><a href="/templates/" class="tw-nav-item" data-plugin-nav="templates" data-i18n-hint="nav.templates"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg><span class="tw-nav-label" data-i18n="nav.templates">测试模板库</span></a></div><astro-island uid="Z1lgSd4" component-url="/_astro/NavLibraries.ALZ9e12z.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-iywf7oe7-2&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;NavLibraries&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-iywf7oe7-2"></astro-island></div><a href="/prompts/" class="tw-nav-item" data-plugin-nav="prompts" data-pinned-nav="prompts"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg><span class="tw-nav-label" data-i18n="nav.prompts">提示词管理</span></a><a href="/docs/manual/" class="tw-nav-item" data-hint="帮助中心" data-i18n-hint="nav.helpCenter"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M5 4.5h9.5L19 9v10.5H5V4.5Z" stroke-linejoin="round"></path><path d="M14.5 4.5V9H19" stroke-linejoin="round"></path><path d="M8 13h8M8 16.5h6" stroke-linecap="round"></path></svg><span class="tw-nav-label" data-i18n="nav.helpCenter">帮助中心</span></a></nav><div class="tw-nav-foot"><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).load=e,window.dispatchEvent(new Event(`astro:load`))})();</script><astro-island uid="Z12jkyC" prefix="r1" component-url="/_astro/SettingsDialog.CrMDjSLJ.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;SettingsDialog&quot;,&quot;value&quot;:true}" await-children><div class="tw-nav-foot-row"><button type="button" class="tw-nav-settings-btn" data-hint="设置"><svg class="tw-nav-ico w-4.5 h-4.5 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.7 1 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg><span data-i18n="nav.settings">设置</span></button><button type="button" class="tw-nav-provider-chip is-empty" data-hint="未配置模型"><span class="tw-nav-provider-dot" aria-hidden="true"></span><span class="tw-nav-provider-name">未配置</span></button></div><span hidden="" style="position:fixed;top:1px;left:1px;width:1px;height:0;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;display:none"></span><!--astro:end--></astro-island></div></aside><script data-astro-rerun>
103
104
  (function () {
104
105
  var root = document.documentElement;
105
106
  var btn = document.getElementById('tw-nav-toggle');
@@ -130,6 +131,8 @@
130
131
  var en = {
131
132
  'nav.brand': 'Lantern Harness',
132
133
  'nav.home': 'My Workbench',
134
+ 'nav.tasks': 'Tasks',
135
+ 'nav.todos': 'Todos',
133
136
  'nav.caseManage': 'Test Cases',
134
137
  'nav.prompts': 'Prompts',
135
138
  'nav.knowledge': 'Knowledge Mgmt',
@@ -164,7 +167,7 @@
164
167
  });
165
168
  } catch (e) {}
166
169
  })();
167
- </script><main data-astro-transition-scope="astro-bbhp3f5g-3" class="tw-main min-h-screen"><div id="tw-route-loading" class="tw-route-loading is-hidden" role="status" aria-live="polite" aria-label="页面加载中"><span class="tw-route-loading-spin" aria-hidden="true"></span></div><div class="tw-workbench-host"><astro-island uid="1DjyQy" component-url="/_astro/ChatApp.CYSPlSNP.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;slashDocs&quot;:[1,[[0,{&quot;collection&quot;:[0,&quot;knowledge&quot;],&quot;id&quot;:[0,&quot;功能测试用例编写规范&quot;],&quot;title&quot;:[0,&quot;功能测试用例编写规范&quot;],&quot;category&quot;:[0,&quot;测试规范&quot;],&quot;description&quot;:[0,&quot;统一功能测试用例编写口径与质量标准&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;知识库管理/功能测试用例编写规范.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;功能测试报告/功能测试报告模板&quot;],&quot;title&quot;:[0,&quot;功能测试报告模板&quot;],&quot;category&quot;:[0,&quot;功能测试报告&quot;],&quot;description&quot;:[0,&quot;版本迭代功能测试报告结构模板,含执行统计、缺陷分析与上线风险评估。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/功能测试报告/功能测试报告模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;接口测试报告/接口测试报告模板&quot;],&quot;title&quot;:[0,&quot;接口测试报告模板&quot;],&quot;category&quot;:[0,&quot;接口测试报告&quot;],&quot;description&quot;:[0,&quot;接口测试报告结构模板,含接口覆盖统计、失败分析与性能基线记录。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/接口测试报告/接口测试报告模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;性能测试报告/性能测试报告模板&quot;],&quot;title&quot;:[0,&quot;性能测试报告模板&quot;],&quot;category&quot;:[0,&quot;性能测试报告&quot;],&quot;description&quot;:[0,&quot;性能测试报告结构模板,含负载模型、结果汇总、资源监控与瓶颈分析。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/性能测试报告/性能测试报告模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;性能测试用例/性能测试用例模板&quot;],&quot;title&quot;:[0,&quot;性能测试用例(场景)模板&quot;],&quot;category&quot;:[0,&quot;性能测试用例&quot;],&quot;description&quot;:[0,&quot;性能测试场景设计模板,含负载模型、加压策略与通过标准的定义方式。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/性能测试用例/性能测试用例模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;自动化测试用例/自动化测试用例模板&quot;],&quot;title&quot;:[0,&quot;自动化测试用例模板&quot;],&quot;category&quot;:[0,&quot;自动化测试用例&quot;],&quot;description&quot;:[0,&quot;自动化脚本设计模板,强调步骤稳定、断言明确、数据可参数化与环境依赖。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/自动化测试用例/自动化测试用例模板.md&quot;]}]]]}" ssr client="only" opts="{&quot;name&quot;:&quot;ChatApp&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div></main></div><script>
170
+ </script><main data-astro-transition-scope="astro-bbhp3f5g-3" class="tw-main min-h-screen"><div id="tw-route-loading" class="tw-route-loading is-hidden" role="status" aria-live="polite" aria-label="页面加载中"><span class="tw-route-loading-spin" aria-hidden="true"></span></div><div class="tw-workbench-host"><astro-island uid="1DjyQy" component-url="/_astro/ChatApp.gfsPLvan.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;slashDocs&quot;:[1,[[0,{&quot;collection&quot;:[0,&quot;knowledge&quot;],&quot;id&quot;:[0,&quot;功能测试用例编写规范&quot;],&quot;title&quot;:[0,&quot;功能测试用例编写规范&quot;],&quot;category&quot;:[0,&quot;测试规范&quot;],&quot;description&quot;:[0,&quot;统一功能测试用例编写口径与质量标准&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;知识库管理/功能测试用例编写规范.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;功能测试报告/功能测试报告模板&quot;],&quot;title&quot;:[0,&quot;功能测试报告模板&quot;],&quot;category&quot;:[0,&quot;功能测试报告&quot;],&quot;description&quot;:[0,&quot;版本迭代功能测试报告结构模板,含执行统计、缺陷分析与上线风险评估。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/功能测试报告/功能测试报告模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;接口测试报告/接口测试报告模板&quot;],&quot;title&quot;:[0,&quot;接口测试报告模板&quot;],&quot;category&quot;:[0,&quot;接口测试报告&quot;],&quot;description&quot;:[0,&quot;接口测试报告结构模板,含接口覆盖统计、失败分析与性能基线记录。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/接口测试报告/接口测试报告模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;性能测试报告/性能测试报告模板&quot;],&quot;title&quot;:[0,&quot;性能测试报告模板&quot;],&quot;category&quot;:[0,&quot;性能测试报告&quot;],&quot;description&quot;:[0,&quot;性能测试报告结构模板,含负载模型、结果汇总、资源监控与瓶颈分析。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/性能测试报告/性能测试报告模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;性能测试用例/性能测试用例模板&quot;],&quot;title&quot;:[0,&quot;性能测试用例(场景)模板&quot;],&quot;category&quot;:[0,&quot;性能测试用例&quot;],&quot;description&quot;:[0,&quot;性能测试场景设计模板,含负载模型、加压策略与通过标准的定义方式。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/性能测试用例/性能测试用例模板.md&quot;]}],[0,{&quot;collection&quot;:[0,&quot;templates&quot;],&quot;id&quot;:[0,&quot;自动化测试用例/自动化测试用例模板&quot;],&quot;title&quot;:[0,&quot;自动化测试用例模板&quot;],&quot;category&quot;:[0,&quot;自动化测试用例&quot;],&quot;description&quot;:[0,&quot;自动化脚本设计模板,强调步骤稳定、断言明确、数据可参数化与环境依赖。&quot;],&quot;format&quot;:[0,&quot;md&quot;],&quot;path&quot;:[0,&quot;测试模板库/自动化测试用例/自动化测试用例模板.md&quot;]}]]]}" ssr client="only" opts="{&quot;name&quot;:&quot;ChatApp&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div></main></div><script>
168
171
  (function () {
169
172
  /**
170
173
  * 切页滚回顶部。
@@ -220,8 +223,9 @@
220
223
  if (cur.dataset.spaceService) nextRoot.dataset.spaceService = cur.dataset.spaceService;
221
224
  // 插件开关同理:不搬过去会先亮出被隐藏的侧栏入口,等 page-load 再收起
222
225
  [
226
+ 'pluginOffTasks',
227
+ 'pluginOffTodos',
223
228
  'pluginOffCases',
224
- 'pluginOffPrompts',
225
229
  'pluginOffKnowledgeLib',
226
230
  'pluginOffRequirements',
227
231
  'pluginOffTemplates',
@@ -3,7 +3,7 @@
3
3
  try {
4
4
  if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
5
5
  } catch (e) {}
6
- </script><script type="module" src="/_astro/Base.astro_astro_type_script_index_0_lang.lxEwQ1R4.js"></script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CO1cjG9V.js"></script><script>
6
+ </script><script type="module" src="/_astro/Base.astro_astro_type_script_index_0_lang.Cg_8YLVA.js"></script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CO1cjG9V.js"></script><script>
7
7
  (function () {
8
8
  try {
9
9
  var raw = localStorage.getItem('tw.app.config.v1');
@@ -42,7 +42,8 @@
42
42
  var savedCfg = JSON.parse(cfgRaw) || {};
43
43
  var plugins = savedCfg.plugins || {};
44
44
  if (plugins.cases === false) document.documentElement.dataset.pluginOffCases = '1';
45
- if (plugins.prompts === false) document.documentElement.dataset.pluginOffPrompts = '1';
45
+ if (plugins.todos === false) document.documentElement.dataset.pluginOffTodos = '1';
46
+ if (plugins.tasks === false) document.documentElement.dataset.pluginOffTasks = '1';
46
47
  if (plugins.knowledgeLib === false)
47
48
  document.documentElement.dataset.pluginOffKnowledgeLib = '1';
48
49
  if (plugins.requirements === false)
@@ -63,7 +64,7 @@
63
64
  }
64
65
  } catch (e) {}
65
66
  })();
66
- </script><link rel="stylesheet" href="/_astro/Base.B9f_iFAZ.css"><script type="module" src="/_astro/page.Bx2KSkeL.js"></script><style>[data-astro-transition-scope="astro-bbhp3f5g-3"] { view-transition-name: astro-bbhp3f5g-3; }@layer astro { ::view-transition-old(astro-bbhp3f5g-3) {
67
+ </script><link rel="stylesheet" href="/_astro/Base.ByB0D4ZA.css"><script type="module" src="/_astro/page.Bx2KSkeL.js"></script><style>[data-astro-transition-scope="astro-bbhp3f5g-3"] { view-transition-name: astro-bbhp3f5g-3; }@layer astro { ::view-transition-old(astro-bbhp3f5g-3) {
67
68
  animation-duration: 180ms;
68
69
  animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
69
70
  animation-fill-mode: both;
@@ -99,7 +100,7 @@
99
100
  animation-duration: 180ms;
100
101
  animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
101
102
  animation-fill-mode: both;
102
- animation-name: astroFadeIn; }</style></head><body class="tw-body antialiased"><div class="tw-shell min-h-screen"><aside class="tw-nav-aside fixed inset-y-0 left-0 flex flex-col z-45" id="tw-nav-aside"><div class="tw-nav-brand"><div class="tw-nav-brand-row"><a href="/" class="tw-nav-brand-link min-w-0 flex-1"><span class="tw-nav-brand-mark" aria-hidden="true"><img class="tw-nav-brand-mark-img" src="/brand-mark.png" alt="" width="36" height="36"></span><span class="tw-nav-brand-text"><span class="tw-nav-brand-title-row"><span class="tw-nav-brand-title" data-i18n="nav.brand">Lantern Harness</span><span class="tw-nav-brand-ver" data-hint="平台版本 v0.1.2">v0.1.2</span></span></span></a></div></div><div class="tw-nav-space-slot"><div class="tw-nav-space tw-nav-space-ph" id="tw-nav-space-ph" aria-hidden="true"><div class="tw-nav-space-ph-box"><span class="tw-nav-space-ph-ico"></span><span class="tw-nav-space-ph-lines"><span class="tw-nav-space-ph-bar is-cap"></span><span class="tw-nav-space-ph-bar is-name"></span></span></div></div><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).only=e,window.dispatchEvent(new Event(`astro:only`))})();</script><script>(function(){function e(t){"@babel/helpers - typeof";return e=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},e(t)}function t(t,n){if(e(t)!=`object`||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var i=r.call(t,n||`default`);if(e(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(t)}function n(n){var r=t(n,`string`);return e(r)==`symbol`?r:r+``}function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let i=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);{let e={0:e=>a(e),1:e=>n(e),2:e=>new RegExp(e),3:e=>new Date(e),4:e=>new Map(n(e)),5:e=>new Set(n(e)),6:e=>BigInt(e),7:e=>new URL(e),8:e=>new Uint8Array(e),9:e=>new Uint16Array(e),10:e=>new Uint32Array(e),11:e=>1/0*e},t=t=>{let[n,r]=t;return n in e?e[n](r):void 0},n=e=>e.map(t),a=e=>typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]));class o extends HTMLElement{constructor(...e){super(...e),r(this,`Component`,void 0),r(this,`hydrator`,void 0),r(this,`hydrate`,async()=>{var e;if(!this.hydrator||!this.isConnected)return;let t=(e=this.parentElement)==null?void 0:e.closest(`astro-island[ssr]`);if(t){t.addEventListener(`astro:hydrate`,this.hydrate,{once:!0});return}let n=this.querySelectorAll(`astro-slot`),r={},i=this.querySelectorAll(`template[data-astro-template]`);for(let e of i){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`data-astro-template`)||`default`]=e.innerHTML,e.remove())}for(let e of n){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`name`)||`default`]=e.innerHTML)}let o;try{o=this.hasAttribute(`props`)?a(JSON.parse(this.getAttribute(`props`))):{}}catch(e){let t=this.getAttribute(`component-url`)||`<unknown>`,n=this.getAttribute(`component-export`);throw n&&(t+=` (export ${n})`),console.error(`[hydrate] Error parsing props for component ${t}`,this.getAttribute(`props`),e),e}await this.hydrator(this)(this.Component,o,r,{client:this.getAttribute(`client`)}),this.removeAttribute(`ssr`),this.dispatchEvent(new CustomEvent(`astro:hydrate`))}),r(this,`unmount`,()=>{this.isConnected||this.dispatchEvent(new CustomEvent(`astro:unmount`))})}disconnectedCallback(){document.removeEventListener(`astro:after-swap`,this.unmount),document.addEventListener(`astro:after-swap`,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(`await-children`)||document.readyState===`interactive`||document.readyState===`complete`)this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(`DOMContentLoaded`,e),t.disconnect(),this.childrenConnectedCallback()},t=new MutationObserver(()=>{var t;((t=this.lastChild)==null?void 0:t.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===`astro:end`&&(this.lastChild.remove(),e())});t.observe(this,{childList:!0}),document.addEventListener(`DOMContentLoaded`,e)}}async childrenConnectedCallback(){let e=this.getAttribute(`before-hydration-url`);e&&await import(e),this.start()}getRetryImportUrl(e){let t=new URL(e,document.baseURI);return t.searchParams.set(`astro-retry`,Date.now().toString()),t.toString()}async importWithRetry(e){try{return await import(e)}catch(t){return await new Promise(e=>setTimeout(e,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let t=this.getAttribute(`component-url`),n=new CustomEvent(`astro:hydration-error`,{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:t}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${t}`,e)}async start(){let e=JSON.parse(this.getAttribute(`opts`)),t=this.getAttribute(`client`);if(Astro[t]===void 0)window.addEventListener(`astro:${t}`,()=>this.start(),{once:!0});else try{await Astro[t](async()=>{let e=this.getAttribute(`renderer-url`);try{let[t,{default:n}]=await Promise.all([this.importWithRetry(this.getAttribute(`component-url`)),e?this.importWithRetry(e):Promise.resolve({default:()=>()=>{}})]),r=this.getAttribute(`component-export`)||`default`;if(r.includes(`.`)){this.Component=t;for(let e of r.split(`.`)){if(i.has(e)||!this.Component||typeof this.Component!=`object`&&typeof this.Component!=`function`||!Object.hasOwn(this.Component,e))throw Error(`Invalid component export path: ${r}`);this.Component=this.Component[e]}}else{if(i.has(r))throw Error(`Invalid component export path: ${r}`);this.Component=t[r]}return this.hydrator=n,this.hydrate}catch(e){return this.handleHydrationError(e),()=>{}}},e,this)}catch(e){this.handleHydrationError(e)}}attributeChangedCallback(){this.hydrate()}}r(o,`observedAttributes`,[`props`]),customElements.get(`astro-island`)||customElements.define(`astro-island`,o)}})();</script><astro-island uid="2wH2Dz" component-url="/_astro/SpaceSwitcher.Yy2w8MDF.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-gyrtbwwo-1&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;SpaceSwitcher&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-gyrtbwwo-1"></astro-island></div><button type="button" id="tw-nav-toggle" class="tw-nav-toggle" aria-label="收起或展开左侧导航" aria-expanded="true" aria-controls="tw-nav-aside"><svg class="tw-nav-toggle-icon is-collapse" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6 6 6"></path></svg><svg class="tw-nav-toggle-icon is-expand" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"></path></svg></button><nav class="tw-nav-list flex-1 overflow-y-auto"><a href="/" class="tw-nav-item" data-i18n-hint="nav.home" data-hint="我的工作台"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5"></path><path d="M5 9.5V20h14V9.5"></path></svg><span class="tw-nav-label" data-i18n="nav.home">我的工作台</span></a><div class="tw-nav-libraries"><div class="tw-nav-libraries-ph"><a href="/cases/library/" class="tw-nav-item" data-plugin-nav="cases"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 11l3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg><span class="tw-nav-label" data-i18n="nav.caseManage">用例管理</span></a><a href="/prompts/" class="tw-nav-item" data-plugin-nav="prompts"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg><span class="tw-nav-label" data-i18n="nav.prompts">提示词管理</span></a><a href="/knowledge/" class="tw-nav-item is-active font-medium" data-plugin-nav="knowledgeLib"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg><span class="tw-nav-label" data-i18n="nav.knowledge">知识库管理</span></a><a href="/requirements/" class="tw-nav-item" data-plugin-nav="requirements" data-i18n-hint="nav.requirements"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M14 3v5h5"></path><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z"></path><path d="M8 13h8"></path><path d="M8 17h6"></path></svg><span class="tw-nav-label" data-i18n="nav.requirements">需求文档库</span></a><a href="/templates/" class="tw-nav-item" data-plugin-nav="templates" data-i18n-hint="nav.templates"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg><span class="tw-nav-label" data-i18n="nav.templates">测试模板库</span></a></div><astro-island uid="Z1lgSd4" component-url="/_astro/NavLibraries.EayBsg5g.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-iywf7oe7-2&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;NavLibraries&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-iywf7oe7-2"></astro-island></div><a href="/docs/manual/" class="tw-nav-item" data-hint="帮助中心" data-i18n-hint="nav.helpCenter"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M5 4.5h9.5L19 9v10.5H5V4.5Z" stroke-linejoin="round"></path><path d="M14.5 4.5V9H19" stroke-linejoin="round"></path><path d="M8 13h8M8 16.5h6" stroke-linecap="round"></path></svg><span class="tw-nav-label" data-i18n="nav.helpCenter">帮助中心</span></a></nav><div class="tw-nav-foot"><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).load=e,window.dispatchEvent(new Event(`astro:load`))})();</script><astro-island uid="Z12jkyC" prefix="r1" component-url="/_astro/SettingsDialog.DC0e7580.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;SettingsDialog&quot;,&quot;value&quot;:true}" await-children><div class="tw-nav-foot-row"><button type="button" class="tw-nav-settings-btn" data-hint="设置"><svg class="tw-nav-ico w-4.5 h-4.5 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.7 1 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg><span data-i18n="nav.settings">设置</span></button><button type="button" class="tw-nav-provider-chip is-empty" data-hint="未配置模型"><span class="tw-nav-provider-dot" aria-hidden="true"></span><span class="tw-nav-provider-name">未配置</span></button></div><span hidden="" style="position:fixed;top:1px;left:1px;width:1px;height:0;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;display:none"></span><!--astro:end--></astro-island></div></aside><script data-astro-rerun>
103
+ animation-name: astroFadeIn; }</style></head><body class="tw-body antialiased"><div class="tw-shell min-h-screen"><aside class="tw-nav-aside fixed inset-y-0 left-0 flex flex-col z-45" id="tw-nav-aside"><div class="tw-nav-brand"><div class="tw-nav-brand-row"><a href="/" class="tw-nav-brand-link min-w-0 flex-1"><span class="tw-nav-brand-mark" aria-hidden="true"><img class="tw-nav-brand-mark-img" src="/brand-mark.png" alt="" width="36" height="36"></span><span class="tw-nav-brand-text"><span class="tw-nav-brand-title-row"><span class="tw-nav-brand-title" data-i18n="nav.brand">Lantern Harness</span><span class="tw-nav-brand-ver" data-hint="平台版本 v0.1.2">v0.1.2</span></span></span></a></div></div><div class="tw-nav-space-slot"><div class="tw-nav-space tw-nav-space-ph" id="tw-nav-space-ph" aria-hidden="true"><div class="tw-nav-space-ph-box"><span class="tw-nav-space-ph-ico"></span><span class="tw-nav-space-ph-lines"><span class="tw-nav-space-ph-bar is-cap"></span><span class="tw-nav-space-ph-bar is-name"></span></span></div></div><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).only=e,window.dispatchEvent(new Event(`astro:only`))})();</script><script>(function(){function e(t){"@babel/helpers - typeof";return e=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},e(t)}function t(t,n){if(e(t)!=`object`||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var i=r.call(t,n||`default`);if(e(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(t)}function n(n){var r=t(n,`string`);return e(r)==`symbol`?r:r+``}function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let i=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);{let e={0:e=>a(e),1:e=>n(e),2:e=>new RegExp(e),3:e=>new Date(e),4:e=>new Map(n(e)),5:e=>new Set(n(e)),6:e=>BigInt(e),7:e=>new URL(e),8:e=>new Uint8Array(e),9:e=>new Uint16Array(e),10:e=>new Uint32Array(e),11:e=>1/0*e},t=t=>{let[n,r]=t;return n in e?e[n](r):void 0},n=e=>e.map(t),a=e=>typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]));class o extends HTMLElement{constructor(...e){super(...e),r(this,`Component`,void 0),r(this,`hydrator`,void 0),r(this,`hydrate`,async()=>{var e;if(!this.hydrator||!this.isConnected)return;let t=(e=this.parentElement)==null?void 0:e.closest(`astro-island[ssr]`);if(t){t.addEventListener(`astro:hydrate`,this.hydrate,{once:!0});return}let n=this.querySelectorAll(`astro-slot`),r={},i=this.querySelectorAll(`template[data-astro-template]`);for(let e of i){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`data-astro-template`)||`default`]=e.innerHTML,e.remove())}for(let e of n){let t=e.closest(this.tagName);t!=null&&t.isSameNode(this)&&(r[e.getAttribute(`name`)||`default`]=e.innerHTML)}let o;try{o=this.hasAttribute(`props`)?a(JSON.parse(this.getAttribute(`props`))):{}}catch(e){let t=this.getAttribute(`component-url`)||`<unknown>`,n=this.getAttribute(`component-export`);throw n&&(t+=` (export ${n})`),console.error(`[hydrate] Error parsing props for component ${t}`,this.getAttribute(`props`),e),e}await this.hydrator(this)(this.Component,o,r,{client:this.getAttribute(`client`)}),this.removeAttribute(`ssr`),this.dispatchEvent(new CustomEvent(`astro:hydrate`))}),r(this,`unmount`,()=>{this.isConnected||this.dispatchEvent(new CustomEvent(`astro:unmount`))})}disconnectedCallback(){document.removeEventListener(`astro:after-swap`,this.unmount),document.addEventListener(`astro:after-swap`,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(`await-children`)||document.readyState===`interactive`||document.readyState===`complete`)this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(`DOMContentLoaded`,e),t.disconnect(),this.childrenConnectedCallback()},t=new MutationObserver(()=>{var t;((t=this.lastChild)==null?void 0:t.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===`astro:end`&&(this.lastChild.remove(),e())});t.observe(this,{childList:!0}),document.addEventListener(`DOMContentLoaded`,e)}}async childrenConnectedCallback(){let e=this.getAttribute(`before-hydration-url`);e&&await import(e),this.start()}getRetryImportUrl(e){let t=new URL(e,document.baseURI);return t.searchParams.set(`astro-retry`,Date.now().toString()),t.toString()}async importWithRetry(e){try{return await import(e)}catch(t){return await new Promise(e=>setTimeout(e,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let t=this.getAttribute(`component-url`),n=new CustomEvent(`astro:hydration-error`,{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:t}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${t}`,e)}async start(){let e=JSON.parse(this.getAttribute(`opts`)),t=this.getAttribute(`client`);if(Astro[t]===void 0)window.addEventListener(`astro:${t}`,()=>this.start(),{once:!0});else try{await Astro[t](async()=>{let e=this.getAttribute(`renderer-url`);try{let[t,{default:n}]=await Promise.all([this.importWithRetry(this.getAttribute(`component-url`)),e?this.importWithRetry(e):Promise.resolve({default:()=>()=>{}})]),r=this.getAttribute(`component-export`)||`default`;if(r.includes(`.`)){this.Component=t;for(let e of r.split(`.`)){if(i.has(e)||!this.Component||typeof this.Component!=`object`&&typeof this.Component!=`function`||!Object.hasOwn(this.Component,e))throw Error(`Invalid component export path: ${r}`);this.Component=this.Component[e]}}else{if(i.has(r))throw Error(`Invalid component export path: ${r}`);this.Component=t[r]}return this.hydrator=n,this.hydrate}catch(e){return this.handleHydrationError(e),()=>{}}},e,this)}catch(e){this.handleHydrationError(e)}}attributeChangedCallback(){this.hydrate()}}r(o,`observedAttributes`,[`props`]),customElements.get(`astro-island`)||customElements.define(`astro-island`,o)}})();</script><astro-island uid="2wH2Dz" component-url="/_astro/SpaceSwitcher.Wf8EPYUx.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-gyrtbwwo-1&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;SpaceSwitcher&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-gyrtbwwo-1"></astro-island></div><button type="button" id="tw-nav-toggle" class="tw-nav-toggle" aria-label="收起或展开左侧导航" aria-expanded="true" aria-controls="tw-nav-aside"><svg class="tw-nav-toggle-icon is-collapse" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6 6 6"></path></svg><svg class="tw-nav-toggle-icon is-expand" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"></path></svg></button><nav class="tw-nav-list flex-1 overflow-y-auto"><a href="/" class="tw-nav-item" data-i18n-hint="nav.home" data-hint="我的工作台"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M3 10.5 12 3l9 7.5"></path><path d="M5 9.5V20h14V9.5"></path></svg><span class="tw-nav-label" data-i18n="nav.home">我的工作台</span></a><div class="tw-nav-libraries"><div class="tw-nav-libraries-ph"><a href="/tasks/" class="tw-nav-item" data-plugin-nav="tasks"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 5h10"></path><path d="M9 12h10"></path><path d="M9 19h10"></path><path d="M4 5h.01"></path><path d="M4 12h.01"></path><path d="M4 19h.01"></path></svg><span class="tw-nav-label" data-i18n="nav.tasks">任务管理</span></a><a href="/todos/" class="tw-nav-item" data-plugin-nav="todos"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M8 6h13"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M3 6h.01"></path><path d="M3 12h.01"></path><path d="M3 18h.01"></path></svg><span class="tw-nav-label" data-i18n="nav.todos">待办事项</span></a><a href="/cases/library/" class="tw-nav-item" data-plugin-nav="cases"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M9 11l3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg><span class="tw-nav-label" data-i18n="nav.caseManage">用例管理</span></a><a href="/knowledge/" class="tw-nav-item is-active font-medium" data-plugin-nav="knowledgeLib"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg><span class="tw-nav-label" data-i18n="nav.knowledge">知识库管理</span></a><a href="/requirements/" class="tw-nav-item" data-plugin-nav="requirements" data-i18n-hint="nav.requirements"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M14 3v5h5"></path><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z"></path><path d="M8 13h8"></path><path d="M8 17h6"></path></svg><span class="tw-nav-label" data-i18n="nav.requirements">需求文档库</span></a><a href="/templates/" class="tw-nav-item" data-plugin-nav="templates" data-i18n-hint="nav.templates"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="m3 13 9 5 9-5"></path></svg><span class="tw-nav-label" data-i18n="nav.templates">测试模板库</span></a></div><astro-island uid="Z1lgSd4" component-url="/_astro/NavLibraries.ALZ9e12z.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-iywf7oe7-2&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;NavLibraries&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-persist="astro-iywf7oe7-2"></astro-island></div><a href="/prompts/" class="tw-nav-item" data-plugin-nav="prompts" data-pinned-nav="prompts"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg><span class="tw-nav-label" data-i18n="nav.prompts">提示词管理</span></a><a href="/docs/manual/" class="tw-nav-item" data-hint="帮助中心" data-i18n-hint="nav.helpCenter"><svg class="tw-nav-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><path d="M5 4.5h9.5L19 9v10.5H5V4.5Z" stroke-linejoin="round"></path><path d="M14.5 4.5V9H19" stroke-linejoin="round"></path><path d="M8 13h8M8 16.5h6" stroke-linecap="round"></path></svg><span class="tw-nav-label" data-i18n="nav.helpCenter">帮助中心</span></a></nav><div class="tw-nav-foot"><script>(function(){let e=async e=>{await(await e())()};(self.Astro||(self.Astro={})).load=e,window.dispatchEvent(new Event(`astro:load`))})();</script><astro-island uid="Z12jkyC" prefix="r1" component-url="/_astro/SettingsDialog.CrMDjSLJ.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;SettingsDialog&quot;,&quot;value&quot;:true}" await-children><div class="tw-nav-foot-row"><button type="button" class="tw-nav-settings-btn" data-hint="设置"><svg class="tw-nav-ico w-4.5 h-4.5 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9c.2.6.7 1 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"></path></svg><span data-i18n="nav.settings">设置</span></button><button type="button" class="tw-nav-provider-chip is-empty" data-hint="未配置模型"><span class="tw-nav-provider-dot" aria-hidden="true"></span><span class="tw-nav-provider-name">未配置</span></button></div><span hidden="" style="position:fixed;top:1px;left:1px;width:1px;height:0;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;display:none"></span><!--astro:end--></astro-island></div></aside><script data-astro-rerun>
103
104
  (function () {
104
105
  var root = document.documentElement;
105
106
  var btn = document.getElementById('tw-nav-toggle');
@@ -130,6 +131,8 @@
130
131
  var en = {
131
132
  'nav.brand': 'Lantern Harness',
132
133
  'nav.home': 'My Workbench',
134
+ 'nav.tasks': 'Tasks',
135
+ 'nav.todos': 'Todos',
133
136
  'nav.caseManage': 'Test Cases',
134
137
  'nav.prompts': 'Prompts',
135
138
  'nav.knowledge': 'Knowledge Mgmt',
@@ -164,7 +167,7 @@
164
167
  });
165
168
  } catch (e) {}
166
169
  })();
167
- </script><main data-astro-transition-scope="astro-bbhp3f5g-3" class="tw-main min-h-screen"><div id="tw-route-loading" class="tw-route-loading is-hidden" role="status" aria-live="polite" aria-label="页面加载中"><span class="tw-route-loading-spin" aria-hidden="true"></span></div><div class="tw-library-page px-8 py-8"><header class="mb-6 shrink-0"><h1 class="text-2xl font-bold text-stone-900">知识库管理</h1><p class="mt-2 text-sm text-stone-500">以列表管理测试规范 / 方法论 / 环境约定(.md)。</p></header><astro-island uid="s8nbj" component-url="/_astro/KnowledgeLibrary.DZinlAWn.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;base&quot;:[0,&quot;/&quot;],&quot;staticCount&quot;:[0,1]}" ssr client="only" opts="{&quot;name&quot;:&quot;KnowledgeLibrary&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div></main></div><script>
170
+ </script><main data-astro-transition-scope="astro-bbhp3f5g-3" class="tw-main min-h-screen"><div id="tw-route-loading" class="tw-route-loading is-hidden" role="status" aria-live="polite" aria-label="页面加载中"><span class="tw-route-loading-spin" aria-hidden="true"></span></div><div class="tw-library-page px-8 py-8"><header class="mb-6 shrink-0"><h1 class="text-2xl font-bold text-stone-900">知识库管理</h1><p class="mt-2 text-sm text-stone-500">以列表管理测试规范 / 方法论 / 环境约定(.md)。</p></header><astro-island uid="s8nbj" component-url="/_astro/KnowledgeLibrary.Cv488Hot.js" component-export="default" renderer-url="/_astro/client.Be_SakrB.js" props="{&quot;base&quot;:[0,&quot;/&quot;],&quot;staticCount&quot;:[0,1]}" ssr client="only" opts="{&quot;name&quot;:&quot;KnowledgeLibrary&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div></main></div><script>
168
171
  (function () {
169
172
  /**
170
173
  * 切页滚回顶部。
@@ -220,8 +223,9 @@
220
223
  if (cur.dataset.spaceService) nextRoot.dataset.spaceService = cur.dataset.spaceService;
221
224
  // 插件开关同理:不搬过去会先亮出被隐藏的侧栏入口,等 page-load 再收起
222
225
  [
226
+ 'pluginOffTasks',
227
+ 'pluginOffTodos',
223
228
  'pluginOffCases',
224
- 'pluginOffPrompts',
225
229
  'pluginOffKnowledgeLib',
226
230
  'pluginOffRequirements',
227
231
  'pluginOffTemplates',