shadow-claw 1.54.0 → 1.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/README.md +1 -1
- package/dist/cli/build/build.js +1 -1
- package/dist/cli/{chunk-DO2t9bUI.js → chunk--IuVyWfT.js} +24 -23
- package/dist/cli/{chunk-2ZYd9gYC.js → chunk--JpdI-Ht.js} +1 -1
- package/dist/cli/{chunk-m4Ineemy.js → chunk-4O8yrQuN.js} +1 -1
- package/dist/cli/{chunk-BiH9IXnQ.js → chunk-7S9Ywlfy.js} +1 -1
- package/dist/cli/{chunk-BmMOdYvk.js → chunk-B0SqqDSK.js} +1 -1
- package/dist/cli/chunk-BNaWaEm-.js +1 -0
- package/dist/cli/chunk-BXCsxO9e.js +1 -0
- package/dist/cli/chunk-Bq37qDoZ.js +18 -0
- package/dist/cli/{chunk-C1htf-nO.js → chunk-BrEeCKIo.js} +2 -2
- package/dist/cli/{chunk-BI1SOTM1.js → chunk-Bu3ylrhT.js} +8 -8
- package/dist/cli/{chunk-3smiGQoQ.js → chunk-C1v_s0Kb.js} +1 -1
- package/dist/cli/{chunk-DGeysxz3.js → chunk-C44G533y.js} +1 -1
- package/dist/cli/{chunk-9KiBalKu.js → chunk-C7hJLmsL.js} +1 -1
- package/dist/cli/{chunk-BFv9XSNd.js → chunk-CAaQWd6t.js} +1 -1
- package/dist/cli/chunk-CIkgn5Fh.js +1 -0
- package/dist/cli/chunk-CWEIN2kc.js +1 -0
- package/dist/cli/{chunk-BDeDZ-0L.js → chunk-CYg1lO1a.js} +1 -1
- package/dist/cli/{chunk-DXLmEQ3i.js → chunk-Ce09lwXT.js} +1 -1
- package/dist/cli/{chunk-XsfHeN4m.js → chunk-CpdqRSO-.js} +1 -1
- package/dist/cli/chunk-DB4x5L-B.js +1 -0
- package/dist/cli/{chunk-DaNyMqrk.js → chunk-DBvObsBQ.js} +1 -1
- package/dist/cli/chunk-DGPpt7Ka.js +1 -0
- package/dist/cli/chunk-DGagHluH.js +1 -0
- package/dist/cli/chunk-DUIs23D9.js +1 -0
- package/dist/cli/{chunk-CyvfQV16.js → chunk-DaurYOqg.js} +1 -1
- package/dist/cli/{chunk-DSFrcSyA.js → chunk-DfwRL0Ue.js} +1 -1
- package/dist/cli/{chunk-M2tZrzY5.js → chunk-DudYQk0p.js} +1 -1
- package/dist/cli/chunk-DvKo50Tp.js +2 -0
- package/dist/cli/{chunk-H_Mw5ypp.js → chunk-Dvrqte5Q.js} +2 -2
- package/dist/cli/{chunk-BtNO-m9T.js → chunk-DzhSExU0.js} +1 -1
- package/dist/cli/{chunk-IOMO88kZ.js → chunk-ENKlt3i9.js} +1 -1
- package/dist/cli/{chunk-Bspgzwsm.js → chunk-FWRwAX75.js} +8 -8
- package/dist/cli/chunk-Lf-Z-h48.js +32 -0
- package/dist/cli/{chunk-BucXnZ4Z.js → chunk-VRfkSLrD.js} +1 -1
- package/dist/cli/chunk-uaTxD024.js +1 -0
- package/dist/cli/cli.js +1 -1
- package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
- package/dist/headless-agent.js +2 -2
- package/dist/lib/components/index.js +25 -25
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw/utils/get-route.d.ts +3 -0
- package/dist/lib/components/shadow-claw/utils/sync-slotted-sidebar-active-links.d.ts +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{configure-peer-js-D5jDCtLx.js → configure-peer-js-C9554Slv.js} +2 -2
- package/dist/lib/{configure-peer-js-D5jDCtLx.js.map → configure-peer-js-C9554Slv.js.map} +1 -1
- package/dist/lib/{file-viewer-B4CL4e0i.js → file-viewer-DBc5dxNy.js} +2 -2
- package/dist/lib/{file-viewer-B4CL4e0i.js.map → file-viewer-DBc5dxNy.js.map} +1 -1
- package/dist/lib/index.js +28 -27
- package/dist/lib/{init-control-plane-l2uFnhGV.js → init-control-plane-D-41Fm5q.js} +12 -12
- package/dist/lib/{init-control-plane-l2uFnhGV.js.map → init-control-plane-D-41Fm5q.js.map} +1 -1
- package/dist/lib/{markdown-0_p_zfxL.js → markdown-KnDWzWJJ.js} +2 -2
- package/dist/lib/{markdown-0_p_zfxL.js.map → markdown-KnDWzWJJ.js.map} +1 -1
- package/dist/lib/{orchestrator-D6wm8Sec.js → orchestrator-BEZcqgR5.js} +9 -9
- package/dist/lib/{orchestrator-D6wm8Sec.js.map → orchestrator-BEZcqgR5.js.map} +1 -1
- package/dist/lib/{orchestrator-Dh-hnIpK.js → orchestrator-Cda13e5U.js} +4 -4
- package/dist/lib/{orchestrator-Dh-hnIpK.js.map → orchestrator-Cda13e5U.js.map} +1 -1
- package/dist/lib/{peerjs-BWZnsD0B.js → peerjs-DYkUTcee.js} +5 -5
- package/dist/lib/{peerjs-BWZnsD0B.js.map → peerjs-DYkUTcee.js.map} +1 -1
- package/dist/lib/{push-client-MybDfOdi.js → push-client-CQtCFDaD.js} +3 -3
- package/dist/lib/{push-client-MybDfOdi.js.map → push-client-CQtCFDaD.js.map} +1 -1
- package/dist/lib/security/custom-element-security.d.ts +8 -4
- package/dist/lib/{shadow-claw-PdOpgTxH.js → shadow-claw-DYe9u6Tp.js} +142 -33
- package/dist/lib/shadow-claw-DYe9u6Tp.js.map +1 -0
- package/dist/lib/{shadow-claw-accounts-3bR76EOb.js → shadow-claw-accounts-D2URoHys.js} +2 -2
- package/dist/lib/{shadow-claw-accounts-3bR76EOb.js.map → shadow-claw-accounts-D2URoHys.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js → shadow-claw-channel-config-buXoz2xv.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-ChdZ1iB8.js.map → shadow-claw-channel-config-buXoz2xv.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-CK9sc7h_.js → shadow-claw-channels-5yVJ1gLk.js} +3 -3
- package/dist/lib/{shadow-claw-channels-CK9sc7h_.js.map → shadow-claw-channels-5yVJ1gLk.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js → shadow-claw-chat-CVc-7ycM.js} +7 -7
- package/dist/lib/{shadow-claw-chat-B6uuZnJ7.js.map → shadow-claw-chat-CVc-7ycM.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-BpRcl312.js → shadow-claw-control-plane-B5vsF91B.js} +6 -6
- package/dist/lib/{shadow-claw-control-plane-BpRcl312.js.map → shadow-claw-control-plane-B5vsF91B.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js → shadow-claw-conversations-PGK5zqn3.js} +54 -12
- package/dist/lib/{shadow-claw-conversations-Dc_Xk2mB.js.map → shadow-claw-conversations-PGK5zqn3.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js → shadow-claw-file-viewer-DSqn0hgx.js} +6 -6
- package/dist/lib/{shadow-claw-file-viewer-C4x1PtB2.js.map → shadow-claw-file-viewer-DSqn0hgx.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-DhnHbXKf.js → shadow-claw-files-vOa9ZWbr.js} +6 -6
- package/dist/lib/{shadow-claw-files-DhnHbXKf.js.map → shadow-claw-files-vOa9ZWbr.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-BeQ1ElUd.js → shadow-claw-git-D54Z85Bj.js} +4 -4
- package/dist/lib/{shadow-claw-git-BeQ1ElUd.js.map → shadow-claw-git-D54Z85Bj.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js → shadow-claw-integrations-BTubMH9d.js} +2 -2
- package/dist/lib/{shadow-claw-integrations-Bbdolk3w.js.map → shadow-claw-integrations-BTubMH9d.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-DPda4L3C.js → shadow-claw-llm-8koGTNYs.js} +3 -3
- package/dist/lib/{shadow-claw-llm-DPda4L3C.js.map → shadow-claw-llm-8koGTNYs.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js → shadow-claw-mcp-remote-C2jwBsQt.js} +2 -2
- package/dist/lib/{shadow-claw-mcp-remote-Dn9c30WI.js.map → shadow-claw-mcp-remote-C2jwBsQt.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-zqNuyn3-.js → shadow-claw-networking-BV-rna16.js} +2 -2
- package/dist/lib/{shadow-claw-networking-zqNuyn3-.js.map → shadow-claw-networking-BV-rna16.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-DFgdo33v.js → shadow-claw-notifications-Dku7VBLk.js} +2 -2
- package/dist/lib/{shadow-claw-notifications-DFgdo33v.js.map → shadow-claw-notifications-Dku7VBLk.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js → shadow-claw-page-header-VPjYWfsT.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-B7LFGQRf.js.map → shadow-claw-page-header-VPjYWfsT.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-DLspFqdK.js → shadow-claw-pages-DXrM6hgZ.js} +29 -19
- package/dist/lib/shadow-claw-pages-DXrM6hgZ.js.map +1 -0
- package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js → shadow-claw-peerjs-D3xonez5.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-D8xWwuWR.js.map → shadow-claw-peerjs-D3xonez5.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-NbvzXASD.js → shadow-claw-settings-DMTx6OS9.js} +5 -5
- package/dist/lib/{shadow-claw-settings-NbvzXASD.js.map → shadow-claw-settings-DMTx6OS9.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-B_NAoZmd.js → shadow-claw-storage-BJLnukxa.js} +3 -3
- package/dist/lib/{shadow-claw-storage-B_NAoZmd.js.map → shadow-claw-storage-BJLnukxa.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js → shadow-claw-task-server-DcMj20hD.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-BaQJXhYJ.js.map → shadow-claw-task-server-DcMj20hD.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-CAZua0-j.js → shadow-claw-tasks-BQBe4lVi.js} +7 -7
- package/dist/lib/{shadow-claw-tasks-CAZua0-j.js.map → shadow-claw-tasks-BQBe4lVi.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js → shadow-claw-terminal-DPEzTxXv.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-B2YJhkJL.js.map → shadow-claw-terminal-DPEzTxXv.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-CkZWxxTm.js → shadow-claw-tools-BCnU8FaK.js} +6 -6
- package/dist/lib/{shadow-claw-tools-CkZWxxTm.js.map → shadow-claw-tools-BCnU8FaK.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js → shadow-claw-webvm-CnW-hoJ8.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-BL9cgrP9.js.map → shadow-claw-webvm-CnW-hoJ8.js.map} +1 -1
- package/dist/lib/subsystems/mcp/webmcp.d.ts +15 -2
- package/dist/lib/{sync-web-mcp-registration-dW2MVCj4.js → sync-web-mcp-registration-DwpGjVdo.js} +10 -4
- package/dist/lib/sync-web-mcp-registration-DwpGjVdo.js.map +1 -0
- package/dist/lib/{tools-D7whby3H.js → tools-CP6G0HF7.js} +5 -6
- package/dist/lib/tools-CP6G0HF7.js.map +1 -0
- package/dist/lib/{trusted-types-d0cdkut_.js → trusted-types-0cu5Dm6M.js} +29 -4
- package/dist/lib/{trusted-types-d0cdkut_.js.map → trusted-types-0cu5Dm6M.js.map} +1 -1
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +4 -2
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/resolve-page-script-dependencies.d.ts +19 -0
- package/dist/lib/utils/resolve-page-script-dependencies.js +98 -0
- package/dist/lib/utils/resolve-page-script-dependencies.js.map +1 -0
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/webmcp-Bf9rT7uu.js +2001 -0
- package/dist/lib/webmcp-Bf9rT7uu.js.map +1 -0
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/AGENTS.md +3 -3
- package/dist/public/README.md +1 -1
- package/dist/public/agent.worker.js +2 -2
- package/dist/public/components/shadow-claw/shadow-claw.css +1 -1
- package/dist/public/components/shadow-claw/shadow-claw.html +1 -1
- package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.css +1 -1
- package/dist/public/components/shadow-claw-conversations/shadow-claw-conversations.html +1 -1
- package/dist/public/{configure-peer-js-WLRM7Qa7.js → configure-peer-js-OYl3V8sW.js} +1 -1
- package/dist/public/{custom-element-security-Cl991z-x.js → custom-element-security-BR4V40j4.js} +1 -1
- package/dist/public/docs/example/article/index.html +3 -3
- package/dist/public/docs/example/article.html +3 -3
- package/dist/public/docs/publishing/index.html +3 -3
- package/dist/public/docs/publishing.html +3 -3
- package/dist/public/docs/skill-creator/index.html +3 -3
- package/dist/public/docs/skill-creator.html +3 -3
- package/dist/public/docs/subsystems/custom-element-security.md +19 -5
- package/dist/public/docs/subsystems/pages.md +10 -2
- package/dist/public/docs/subsystems/tools.md +1 -2
- package/dist/public/docs/subsystems/webmcp.md +41 -6
- package/dist/public/{download-group-file-fFjoIIp4.js → download-group-file-BNmK8wac.js} +1 -1
- package/dist/public/e2e/README.md +2 -2
- package/dist/public/{e2e-bridge-CiSfBRT4.js → e2e-bridge-4phD1JUQ.js} +1 -1
- package/dist/public/{file-viewer-DFC3kfeO.js → file-viewer-Dbh3K9nL.js} +1 -1
- package/dist/public/index.html +3 -3
- package/dist/public/index.js +1 -1
- package/dist/public/{init-control-plane-BEbcwmmv.js → init-control-plane-DGOY_RNS.js} +1 -1
- package/dist/public/llms.txt +1 -1
- package/dist/public/main/index.html +3 -3
- package/dist/public/main/memory/index.html +3 -3
- package/dist/public/main/memory.html +3 -3
- package/dist/public/main.html +3 -3
- package/dist/public/{markdown-BeglYzw9.js → markdown-BPZYpfGm.js} +1 -1
- package/dist/public/{orchestrator-BlvEG3PO.js → orchestrator-OoUK7CF9.js} +1 -1
- package/dist/public/{orchestrator-DTNrntd4.js → orchestrator-a9047bGu.js} +1 -1
- package/dist/public/{peerjs-CnBdK94R.js → peerjs-Cbn310Tz.js} +1 -1
- package/dist/public/{push-client-DOHbdCyj.js → push-client-Dy4LGJy9.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/shadow-claw-B-HWC1uN.js +1180 -0
- package/dist/public/{shadow-claw-accounts-C6FXVw2K.js → shadow-claw-accounts-Di-anCZ1.js} +1 -1
- package/dist/public/{shadow-claw-channels-tr_r60Kq.js → shadow-claw-channels-RVwCE8pE.js} +1 -1
- package/dist/public/{shadow-claw-chat-BAAPhAOs.js → shadow-claw-chat-DI1q8UnX.js} +1 -1
- package/dist/public/{shadow-claw-control-plane-C_5VIx8E.js → shadow-claw-control-plane-KXEdLOGl.js} +2 -2
- package/dist/public/{shadow-claw-conversations-DGYZdDa3.js → shadow-claw-conversations-BCBGtS30.js} +40 -6
- package/dist/public/{shadow-claw-file-viewer-5j2-Z3fN.js → shadow-claw-file-viewer-CW3t6j-w.js} +1 -1
- package/dist/public/{shadow-claw-files-DKF4Yy0m.js → shadow-claw-files-JQ-o0ImX.js} +1 -1
- package/dist/public/{shadow-claw-git-CtUTJXKT.js → shadow-claw-git-D2M8VixW.js} +2 -2
- package/dist/public/{shadow-claw-integrations-CuBy9D3z.js → shadow-claw-integrations-Cgw6v9_1.js} +1 -1
- package/dist/public/{shadow-claw-llm-BIfNNjGL.js → shadow-claw-llm-74ieXp7i.js} +1 -1
- package/dist/public/{shadow-claw-mcp-remote-C17FXvrb.js → shadow-claw-mcp-remote-BX0BkSmy.js} +1 -1
- package/dist/public/{shadow-claw-networking-CjxQ1CLI.js → shadow-claw-networking-DNX8vaIQ.js} +1 -1
- package/dist/public/{shadow-claw-notifications-Brn2O3Ps.js → shadow-claw-notifications-BLTaGAny.js} +1 -1
- package/dist/public/{shadow-claw-page-header-Bn1P7Cxb.js → shadow-claw-page-header-CjFOdo9v.js} +1 -1
- package/dist/public/shadow-claw-pages-DOQqMm0_.js +645 -0
- package/dist/public/{shadow-claw-settings-CfDm0hVA.js → shadow-claw-settings-DFtl0Fy8.js} +2 -2
- package/dist/public/{shadow-claw-storage-DOOesRzw.js → shadow-claw-storage-gQGExZRq.js} +1 -1
- package/dist/public/{shadow-claw-task-server-H36iDDp2.js → shadow-claw-task-server-Ca45uY7S.js} +1 -1
- package/dist/public/{shadow-claw-tasks-4JsjSGkN.js → shadow-claw-tasks-CCTaaSdi.js} +1 -1
- package/dist/public/{shadow-claw-terminal-CTRTcYz-.js → shadow-claw-terminal-BfgulLkl.js} +1 -1
- package/dist/public/{shadow-claw-tools-Dm1LxNf4.js → shadow-claw-tools-V8NA4n18.js} +1 -1
- package/dist/public/{shadow-claw-webvm-JzuPe9Nr.js → shadow-claw-webvm-CxxI2bnC.js} +1 -1
- package/dist/public/sync-web-mcp-registration-CkCA8UFm.js +1 -0
- package/dist/public/{tools-FiTtOlIt.js → tools-CwQq5tJH.js} +2 -2
- package/dist/public/webmcp-CmtWOAFm.js +6 -0
- package/dist/server.js +2 -2
- package/package.json +3 -3
- package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +16 -0
- package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +62 -1
- package/src/cli/prerender/pretty-paths/prerender-pretty-paths.test.ts +277 -0
- package/src/cli/prerender/pretty-paths/prerender-pretty-paths.ts +28 -1
- package/src/cli/site-config/custom-elements/build-custom-element-script-tags.ts +13 -1
- package/src/components/shadow-claw/shadow-claw.css +12 -0
- package/src/components/shadow-claw/shadow-claw.html +12 -2
- package/src/components/shadow-claw/utils/bind-event-listeners.test.ts +18 -0
- package/src/components/shadow-claw/utils/bind-event-listeners.ts +14 -0
- package/src/components/shadow-claw/utils/get-route.test.ts +35 -0
- package/src/components/shadow-claw/utils/get-route.ts +18 -0
- package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.test.ts +152 -1
- package/src/components/shadow-claw/utils/sync-slotted-sidebar-active-links.ts +139 -8
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.css +11 -0
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.html +27 -4
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.ts +32 -4
- package/src/components/shadow-claw-pages/shadow-claw-pages-scripts.test.ts +266 -0
- package/src/components/shadow-claw-pages/shadow-claw-pages.ts +41 -17
- package/src/core/orchestrator/utils/sync-web-mcp-registration.test.ts +18 -1
- package/src/core/orchestrator/utils/sync-web-mcp-registration.ts +8 -0
- package/src/core/utils/init-control-plane.test.ts +9 -4
- package/src/security/custom-element-security.test.ts +65 -0
- package/src/security/custom-element-security.ts +67 -4
- package/src/stores/tools.test.ts +5 -3
- package/src/stores/tools.ts +5 -10
- package/src/subsystems/mcp/webmcp.test.ts +84 -13
- package/src/subsystems/mcp/webmcp.ts +73 -10
- package/src/utils/index.ts +1 -0
- package/src/utils/resolve-page-script-dependencies.test.ts +245 -0
- package/src/utils/resolve-page-script-dependencies.ts +198 -0
- package/dist/cli/chunk-B1hufJeO.js +0 -1
- package/dist/cli/chunk-BZpn8npn.js +0 -1
- package/dist/cli/chunk-Bw5aOTFr.js +0 -1
- package/dist/cli/chunk-C8nH01Gw.js +0 -32
- package/dist/cli/chunk-CK1ZoyoE.js +0 -17
- package/dist/cli/chunk-CVkhDr-7.js +0 -1
- package/dist/cli/chunk-Cum07Vlh.js +0 -1
- package/dist/cli/chunk-D3UhDDmV.js +0 -2
- package/dist/cli/chunk-D8GI6qj6.js +0 -1
- package/dist/cli/chunk-DEH-FvmP.js +0 -1
- package/dist/cli/chunk-DksvJ_kf.js +0 -1
- package/dist/cli/chunk-RGb9wM4R.js +0 -1
- package/dist/lib/shadow-claw-PdOpgTxH.js.map +0 -1
- package/dist/lib/shadow-claw-pages-DLspFqdK.js.map +0 -1
- package/dist/lib/sync-web-mcp-registration-dW2MVCj4.js.map +0 -1
- package/dist/lib/tools-D7whby3H.js.map +0 -1
- package/dist/lib/webmcp-CYTNZfkn.js +0 -1687
- package/dist/lib/webmcp-CYTNZfkn.js.map +0 -1
- package/dist/public/shadow-claw-CnNX-WCh.js +0 -1158
- package/dist/public/shadow-claw-pages-BwOOqRWW.js +0 -645
- package/dist/public/sync-web-mcp-registration-BnHVUjat.js +0 -1
- package/dist/public/webmcp-_TBqXlVW.js +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><title>Agent Skills & Skill Creator - ShadowClaw</title><meta charset="utf-8"><meta name="revision" content="
|
|
1
|
+
<!doctype html><html lang="en"><head><title>Agent Skills & Skill Creator - ShadowClaw</title><meta charset="utf-8"><meta name="revision" content="d08b95dc08d6a41c1985585dba9aedcdf5ea1bff" /><meta name="version" content="1.55.0" /><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="description" content="Welcome to the ShadowClaw Agent Skills guide! Skills are workspace-local instruction packages and automated tool pipelines that give your AI assistant..." /><link rel="canonical" href="https://xt-ml.github.io/shadow-claw/docs/skill-creator/" /><meta property="og:title" content="Agent Skills & Skill Creator - ShadowClaw" /><meta property="og:description" content="Welcome to the ShadowClaw Agent Skills guide! Skills are workspace-local instruction packages and automated tool pipelines that give your AI assistant..." /><meta property="og:type" content="article" /><meta property="og:url" content="https://xt-ml.github.io/shadow-claw/docs/skill-creator/" /><meta property="og:image" content="https://xt-ml.github.io/shadow-claw/assets/icons/512.png"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Agent Skills & Skill Creator - ShadowClaw" /><meta name="twitter:description" content="Welcome to the ShadowClaw Agent Skills guide! Skills are workspace-local instruction packages and automated tool pipelines that give your AI assistant..." /><meta name="twitter:image" content="https://xt-ml.github.io/shadow-claw/assets/icons/512.png"><script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"SoftwareApplication","@id":"https://xt-ml.github.io/shadow-claw/#software","name":"ShadowClaw","description":"Multi-runtime AI assistant with local and remote LLM orchestration, Web Workers, OPFS storage, and agentic tool execution.","url":"https://xt-ml.github.io/shadow-claw/","applicationCategory":"DeveloperApplication","operatingSystem":"Web, Browser, Desktop","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"author":{"@type":"Organization","name":"xt-ml","url":"https://github.com/xt-ml"},"codeRepository":"https://github.com/xt-ml/shadow-claw","license":"https://github.com/xt-ml/shadow-claw/blob/main/LICENSE"},{"@type":"WebSite","@id":"https://xt-ml.github.io/shadow-claw/#website","url":"https://xt-ml.github.io/shadow-claw/","name":"ShadowClaw","description":"Official website and live deployment of ShadowClaw multi-runtime AI assistant.","publisher":{"@type":"Organization","name":"xt-ml","url":"https://github.com/xt-ml"}},{"@type":"Organization","@id":"https://xt-ml.github.io/shadow-claw/#organization","name":"xt-ml","url":"https://github.com/xt-ml","sameAs":["https://github.com/xt-ml"]}]}</script><meta name="theme-color" content="#fff" /><meta http-equiv="origin-trial" content="A4bwm3ftxmSutme0zCvNMbjdZ4Efbdzz1x2bgmL6RSBDjHVU4Cz5Paeurxk0LO5uyNZjcyaAM+3fQFuCu0XbJwQAAAB2eyJvcmlnaW4iOiJodHRwczovL3h0LW1sLmdpdGh1Yi5pbzo0NDMiLCJmZWF0dXJlIjoiV2ViTUNQIiwiZXhwaXJ5IjoxODA2MzY0ODAwLCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ=="><base href="/shadow-claw/" /><meta name="shadow-claw-override-prerender-skeleton" content="false" />
|
|
2
2
|
<script id="shadow-claw-site-config" type="application/json">{"$schema":"https:\u002f\u002fjson-schema.org\u002fdraft\u002f2020-12\u002fschema","site":{"title":"ShadowClaw","description":"ShadowClaw - multi-runtime AI assistant.","themeColor":"#fff"},"branding":{"siteUrl":"https:\u002f\u002fxt-ml.github.io\u002fshadow-claw\u002f","faviconPath":"assets\u002ficons\u002ffavicon.ico","appleTouchIconPath":"assets\u002ficons\u002f180.png","notFoundPath":"404.html"},"pwa":{"manifestPath":"manifest.json","themeColor":"#000000"},"assets":["assets"],"sidebar":{"pagesHidden":false,"chatHidden":false,"tasksHidden":false,"filesHidden":false,"defaultPage":"pages"},"pages":{"allowList":[],"denyList":[]},"settings":{"defaultToolsProfile":"__builtin_default","overridePrerenderSkeleton":false},"agent":{"defaultProvider":"transformers_js_local","defaultModel":"onnx-community\u002fgemma-4-E2B-it-ONNX"},"customElements":{"allowedElements":["block-garden","block-garden-option","block-garden-select"],"allowedDomains":["kherrick.github.io","cdn.jsdelivr.net"]},"security":{"connectSrc":["'self'","blob:","data:","https:\u002f\u002fkherrick.github.io","https:\u002f\u002fcdn.jsdelivr.net"]}}</script>
|
|
3
3
|
<script>var ShadowClawThemeInit=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(){if(globalThis.trustedTypes)return;let e=/* @__PURE__ */ new Map;globalThis.trustedTypes={createPolicy:(t,n)=>{if(e.has(t))throw TypeError(`Policy with name "${t}" already exists.`);let r={createHTML:n.createHTML?e=>n.createHTML(e):void 0,createScriptURL:n.createScriptURL?e=>n.createScriptURL(e):void 0,createScript:n.createScript?e=>n.createScript(e):void 0};return e.set(t,r),r},getPolicy:t=>e.get(t)??null,isHTML:e=>typeof e==`string`||e instanceof Object&&`toString`in e,isScriptURL:e=>typeof e==`string`||e instanceof Object&&`toString`in e,isScript:e=>typeof e==`string`||e instanceof Object&&`toString`in e}}let n=`__shadowClawDefaultTrustedTypesPolicyState`,r=`default`,i=`shadowclaw-sandbox`;function a(){let e=globalThis;return e[n]||(e[n]={initialized:!1,policy:null}),e[n]}function o(){let e=a();if(e.initialized)return;let t=Reflect.get(globalThis,`trustedTypes`);if(t&&typeof t.createPolicy==`function`){e.initialized=!0;try{if(typeof t.getPolicy==`function`){let n=t.getPolicy(r);if(n){e.policy=n;return}}let n=!1;if(typeof t.getPolicyNames==`function`){let e=t.getPolicyNames();Array.isArray(e)&&e.includes(r)&&(n=!0)}if(n){if(typeof t.getPolicy==`function`){let n=t.getPolicy(i);if(n){e.policy=n;return}}e.policy=t.createPolicy(i,{createHTML:e=>e,createScriptURL:e=>e});return}e.policy=t.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch{typeof t.getPolicy==`function`&&(e.policy=t.getPolicy(r)??t.getPolicy(i)??null)}}}function s(e){let t=e.trim();if(!t)return()=>!1;if(t.startsWith(`/`)&&(t.endsWith(`/`)||/\/[gimuy]*$/.test(t)))try{let e=t.lastIndexOf(`/`),n=t.slice(1,e),r=t.slice(e+1),i=new RegExp(n,r||`i`);return e=>i.test(e)}catch{}if(t.includes(`^`)||t.includes(`$`)||t.includes(`(`)&&t.includes(`)`))try{let e=new RegExp(t,`i`);return t=>e.test(t)}catch{}if(t.startsWith(`*.`)){let e=t.slice(2).toLowerCase();return t=>{let n=t.toLowerCase();return n===e||n.endsWith(`.`+e)}}let n=t.toLowerCase();return e=>{let t=e.toLowerCase();return t===n||t.endsWith(`.`+n)}}let c=[],l=[],u=new Set(c.map(e=>e.toLowerCase().trim())),d=[...l];function f(e){e.map(e=>s(e)).filter(Boolean)}f(d);function p(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.toLowerCase().trim():``).filter(Boolean):typeof e==`string`?e.split(/[\n,]+/).map(e=>e.toLowerCase().trim()).filter(Boolean):[]}function m(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):typeof e==`string`?e.split(/[\n,]+/).map(e=>e.trim()).filter(Boolean):[]}function h(e){let t=p(e);u=new Set(t)}function g(e){let t=m(e);d=t,f(t)}function _(e){if(!e||typeof e!=`string`)return!1;let t=e.trim().toLowerCase();return!t.includes(`-`)||t===`shadow-claw`||t.startsWith(`shadow-claw-`)||t.startsWith(`sc-`)?!0:u.has(t)}function v(e){if(!e||typeof e!=`object`)return;let t=e.allowedCustomElements||(typeof e.customElements==`object`&&!Array.isArray(e.customElements)?e.customElements?.allowedElements:void 0);t!==void 0&&h(t);let n=e.allowedCustomElementDomains||(typeof e.customElements==`object`&&!Array.isArray(e.customElements)?e.customElements?.allowedDomains:void 0);n!==void 0&&g(n)}function y(){if(typeof document>`u`)return;let e=document.getElementById(`shadow-claw-site-config`);if(e&&e.textContent)try{v(JSON.parse(e.textContent))}catch{}}let b=null,x=!1;function S(){y(),!(x||typeof customElements>`u`||typeof customElements.define!=`function`)&&(b=customElements.define.bind(customElements),customElements.define=function(e,t,n){if(!_((e||``).toLowerCase().trim())){let t=`[Security] Registration blocked: <${e}> is not an approved custom element.`;throw console.error(t),Error(t)}return b(e,t,n)},x=!0)}function C(e=typeof document<`u`?document.documentElement:null){if(typeof MutationObserver>`u`||!e)return null;if(typeof e.querySelectorAll==`function`)try{e.querySelectorAll(`*`).forEach(e=>{let t=e.tagName?e.tagName.toLowerCase():``;t.includes(`-`)&&!_(t)&&(console.warn(`[Security] Removing existing unapproved custom element: <${t}>`),e.remove())})}catch{}let t=new MutationObserver(e=>{for(let t of e)t.addedNodes.forEach(e=>{if(e.nodeType===1){let t=e,n=t.tagName?t.tagName.toLowerCase():``;n.includes(`-`)&&!_(n)&&(console.warn(`[Security] Removing unapproved custom element: <${n}>`),t.remove())}})});return t.observe(e,{childList:!0,subtree:!0}),t}function w(e){return e.replace(/^\/+|\/+$/g,``)}function T(e){let t=w(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),w(t)}function E(e){let t=w(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let r=n[0].toLowerCase();if(r===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(r===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(r===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(r===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return r===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function D(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}function O(e,t){let n=t||D();if(!n||!n.routes)return null;let r=T(e);for(let[e,t]of Object.entries(n.routes))if(t&&t.prettyPath&&T(t.prettyPath)===r)return E(e);return null}let k=null,A=/* @__PURE__ */ new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function j(){k=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=j);function M(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=N();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function N(){if(k!==null)return k;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return k=`/`,k;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return k=`/`,k;if(!n)return k=`/`+e[0]+`/`,k}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),k=t,k}catch{}}}let t=e.pathname||`/`;if(t===`/`)return k=`/`,k;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>A.has(e.toLowerCase()));return r>=0?r===0?(k=`/`,k):(k=`/`+n.slice(0,r).join(`/`)+`/`,k):O(t)?(k=`/`,k):n.length===1&&!t.includes(`.`)?(k=`/`+n[0]+`/`,k):(k=`/`,k)}function P(e){let t=M();return t?`shadowclaw:${t}:${e}`:e}function F(e){if(typeof localStorage>`u`)return null;let t=P(e);try{let n=localStorage.getItem(t);if(n!==null)return n;if(t===e)return null;let r=localStorage.getItem(e);if(r!==null)return localStorage.setItem(t,r),r}catch(e){console.warn(`Unable to read from localStorage:`,e)}return null}function I(){try{let e=document.querySelector(`meta[name="shadow-claw-override-prerender-skeleton"]`)?.getAttribute(`content`);if(e===`true`)return!0;if(e===`false`)return!1}catch{}return!1}function L(){let e=sessionStorage.getItem(`shadow-claw-github-pages-404-redirect`);e&&sessionStorage.removeItem(`shadow-claw-github-pages-404-redirect`),e&&e!==location.pathname+location.search+location.hash&&history.replaceState(null,``,e)}function R(){t(),o(),S(),C();let e=document.documentElement;e.classList.add(`sc-js-enabled`,`sc-js-boot-pending`);let n=!1;try{let e=F(`shadow-claw-override-prerender-skeleton`);n=e===null?I():e===`true`}catch{n=I()}n&&e.classList.add(`sc-prerender-override`);let r=()=>{let e=document.querySelector(`shadow-claw`);return!e||e.getAttribute(`data-prerender-no-seed`)!==`true`&&!n?!1:(n&&(e.setAttribute(`data-prerender-no-seed`,`true`),e.setAttribute(`data-js-boot-pending`,`true`),e.setAttribute(`data-hydration-pending`,`true`)),!0)};if(!r()){let e=new MutationObserver(()=>{r()&&e.disconnect()});e.observe(document.documentElement,{childList:!0,subtree:!0})}let i=F(`shadow-claw-theme`)||`system`,a=window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches,s=i===`system`?a?`dark`:`light`:i;document.documentElement.classList.add(`${s}-mode`)}return L(),R(),window.addEventListener(`load`,e=>{let t=e.target;if(t&&t.tagName===`LINK`){let e=t;e.rel===`stylesheet`&&e.media===`print`&&e.href.includes(`Material+Symbols`)&&(e.media=`all`)}},!0),e.handleGithubPages404Redirects=L,e.initializeThemeAndBootState=R,e})({});</script><link rel="manifest" href="manifest.json"><link href="assets/icons/favicon.ico" rel="icon" type="image/x-icon" /><link href="assets/icons/180.png" rel="apple-touch-icon" /><style>:root{--shadow-claw-font-mono:"Fira Code","Courier New",monospace;--shadow-claw-font-sans:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;--shadow-claw-accent-hover:#1e293b;--shadow-claw-accent-primary:#334155;--shadow-claw-bg-primary-reverse:#0f172a;--shadow-claw-bg-primary:#f8fafc;--shadow-claw-bg-secondary:#f1f5f9;--shadow-claw-bg-tertiary:#e2e8f0;--shadow-claw-border-color:#e2e8f0;--shadow-claw-error-color:#ba1a1a;--shadow-claw-important-color:#334155;--shadow-claw-link-hover:#334155;--shadow-claw-link:#1e40af;--shadow-claw-on-error:#fff;--shadow-claw-on-primary:#fff;--shadow-claw-success-color:#059669;--shadow-claw-surface-tint:#334155;--shadow-claw-text-primary:#0f172a;--shadow-claw-text-secondary:#475569;--shadow-claw-text-tertiary:#64748b;--shadow-claw-warning-color:#d97706;--shadow-claw-font-size-lg:1.5rem;--shadow-claw-font-size-md:1.125rem;--shadow-claw-font-size-sm:0.875rem;--shadow-claw-radius-s:0.5rem;--shadow-claw-radius-m:0.75rem;--shadow-claw-radius-l:1.25rem;--shadow-claw-radius-pill:62.5rem;--shadow-claw-shadow-sm:0 0.0625rem 0.1875rem rgba(0,0,0,.1),0 0.0625rem 0.125rem rgba(0,0,0,.06);--shadow-claw-shadow-md:0 0.25rem 0.375rem -0.0625rem rgba(0,0,0,.1),0 0.125rem 0.25rem -0.0625rem rgba(0,0,0,.06);--shadow-claw-shadow-lg:0 0.625rem 0.9375rem -0.1875rem rgba(0,0,0,.1),0 0.25rem 0.375rem -0.125rem rgba(0,0,0,.05);--shadow-claw-shadow-sm:0 0.625rem 0.75rem 0 rgba(0,0,0,.05);--shadow-claw-shadow-md:0 0.625rem 1.875rem 0 rgba(0,0,0,.08);--shadow-claw-shadow-lg:0 0.625rem 1.875rem 0 rgba(0,0,0,.1);--shadow-claw-ease-in:cubic-bezier(0.32,0,0.67,0);--shadow-claw-ease-out:cubic-bezier(0.33,1,0.68,1);--shadow-claw-ease-in-out:cubic-bezier(0.65,0,0.35,1);--shadow-claw-duration-min:150ms;--shadow-claw-duration-regular:300ms;--shadow-claw-header-title-font-size:1.5rem;--shadow-claw-icon-accent-dark:#8e1d13;--shadow-claw-icon-bg:transparent;--shadow-claw-icon-body-segment:#c0392b;--shadow-claw-icon-body-shine:#e74c3c;--shadow-claw-icon-body:#922b21;--shadow-claw-icon-claw-inner:#922b21;--shadow-claw-icon-claw-main:#c0392b;--shadow-claw-icon-eye-shine:#fff;--shadow-claw-icon-eye:#171d1e;--shadow-claw-hljs-background-color:#282c34;--shadow-claw-logo-margin:0 0 0.375rem;--shadow-claw-logo-size:1.5rem;display:contents}@media (prefers-color-scheme:dark){:root{--shadow-claw-accent-hover:#cbd5e1;--shadow-claw-accent-primary:#94a3b8;--shadow-claw-on-primary:#0f172a;--shadow-claw-surface-tint:#94a3b8;--shadow-claw-bg-primary:#0f172a;--shadow-claw-bg-primary-reverse:#f8fafc;--shadow-claw-bg-secondary:#1e293b;--shadow-claw-bg-tertiary:#334155;--shadow-claw-border-color:#334155;--shadow-claw-error-color:#ffb4ab;--shadow-claw-link:#94a3b8;--shadow-claw-link-hover:#94a3b8;--shadow-claw-on-error:#690005;--shadow-claw-success-color:#34d399;--shadow-claw-text-primary:#f1f5f9;--shadow-claw-text-secondary:#cbd5e1;--shadow-claw-text-tertiary:#94a3b8;--shadow-claw-shadow-sm:0 0.0625rem 0.1875rem rgba(0,0,0,.3);--shadow-claw-shadow-md:0 0.25rem 0.375rem -0.0625rem rgba(0,0,0,.4);--shadow-claw-shadow-lg:0 0.625rem 0.9375rem -0.1875rem rgba(0,0,0,.5);--shadow-claw-icon-accent-dark:#ff6b6b;--shadow-claw-icon-body-segment:#ff5252;--shadow-claw-icon-body-shine:hsla(0,0%,100%,.3);--shadow-claw-icon-body:#ff1744;--shadow-claw-icon-claw-inner:#ff1744;--shadow-claw-icon-claw-main:#ff5252;--shadow-claw-icon-eye-shine:#171d1e;--shadow-claw-icon-eye:#dee3e5}}.light-mode{--shadow-claw-accent-hover:#1e293b;--shadow-claw-accent-primary:#334155;--shadow-claw-on-primary:#fff;--shadow-claw-surface-tint:#334155;--shadow-claw-bg-primary:#f8fafc;--shadow-claw-bg-primary-reverse:#0f172a;--shadow-claw-bg-secondary:#f1f5f9;--shadow-claw-bg-tertiary:#e2e8f0;--shadow-claw-border-color:#e2e8f0;--shadow-claw-error-color:#ba1a1a;--shadow-claw-link:#334155;--shadow-claw-link-hover:#1e293b;--shadow-claw-on-error:#fff;--shadow-claw-success-color:#059669;--shadow-claw-warning-color:#d97706;--shadow-claw-text-primary:#0f172a;--shadow-claw-text-secondary:#475569;--shadow-claw-text-tertiary:#64748b}.dark-mode{--shadow-claw-accent-hover:#cbd5e1;--shadow-claw-accent-primary:#94a3b8;--shadow-claw-on-primary:#0f172a;--shadow-claw-surface-tint:#94a3b8;--shadow-claw-bg-primary:#0f172a;--shadow-claw-bg-primary-reverse:#f8fafc;--shadow-claw-bg-secondary:#1e293b;--shadow-claw-bg-tertiary:#334155;--shadow-claw-border-color:#334155;--shadow-claw-error-color:#ffb4ab;--shadow-claw-link:#94a3b8;--shadow-claw-link-hover:#cbd5e1;--shadow-claw-on-error:#690005;--shadow-claw-success-color:#34d399;--shadow-claw-text-primary:#f1f5f9;--shadow-claw-text-secondary:#cbd5e1;--shadow-claw-text-tertiary:#94a3b8;--shadow-claw-shadow-sm:0 0.0625rem 0.1875rem rgba(0,0,0,.3);--shadow-claw-shadow-md:0 0.25rem 0.375rem -0.0625rem rgba(0,0,0,.4);--shadow-claw-shadow-lg:0 0.625rem 0.9375rem -0.1875rem rgba(0,0,0,.5);--shadow-claw-icon-accent-dark:#ff6b6b;--shadow-claw-icon-bg:transparent;--shadow-claw-icon-body-segment:#ff5252;--shadow-claw-icon-body-shine:hsla(0,0%,100%,.3);--shadow-claw-icon-body:#ff1744;--shadow-claw-icon-claw-inner:#ff1744;--shadow-claw-icon-claw-main:#ff5252;--shadow-claw-icon-eye-shine:#171d1e;--shadow-claw-icon-eye:#dee3e5}*,:after,:before{font-family:var(--shadow-claw-font-sans)}*{box-sizing:border-box;margin:0;padding:0;scrollbar-color:var(--shadow-claw-border-color) transparent;scrollbar-width:thin}::-webkit-scrollbar{height:.5rem;width:.5rem}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--shadow-claw-border-color);border-radius:.25rem}::-webkit-scrollbar-thumb:hover{background:var(--shadow-claw-text-tertiary)}body,html{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary);display:flex;flex-direction:column;width:100%}@media (max-width:48rem){input,select,textarea{font-size:16px}}html.sc-prerender-override shadow-claw{visibility:hidden}shadow-claw:not(:defined){background:radial-gradient(circle at 20% 15%,rgba(56,189,248,.08),transparent 40%),radial-gradient(circle at 85% 90%,rgba(51,65,85,.2),transparent 45%),var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary);display:grid}.header-title-link,.header-title-link:hover{align-items:center;color:var(--shadow-claw-text-primary);display:flex;text-decoration:none}.header-title-logo{display:none;flex-shrink:0;height:var(--shadow-claw-logo-size,1.5rem);margin:var(--shadow-claw-logo-margin,0 0 .375rem);width:var(--shadow-claw-logo-size,1.5rem)}.header-title{align-items:center;display:none;font-size:var(--shadow-claw-header-title-font-size,1.5rem);font-weight:700;line-height:1;margin:0 0 0 .5rem}.header-title:first-child{margin-left:0}@media (min-width:30rem){.header-title,.header-title-logo{display:flex}}.header-actions-logo-link{align-items:center;color:inherit;display:flex;flex-direction:row;height:2.5rem;justify-content:center;width:2.5rem}.header-actions-logo-link svg{height:1.5rem;width:1.5rem}.app-dialog,dialog{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.25rem);box-shadow:var(--shadow-claw-shadow-lg);color:var(--shadow-claw-text-primary);padding:0}.app-dialog::backdrop,dialog::backdrop{backdrop-filter:blur(2px);background:color-mix(in srgb,#000 65%,transparent)}.sidebar-custom-sections{display:flex;flex-direction:column;gap:.5rem;padding:.5rem}.sidebar-section{display:flex;flex-direction:column;gap:.125rem}.sidebar-section-header{color:var(--shadow-claw-text-tertiary);font-size:.75rem;font-weight:700;letter-spacing:.05em;padding:.5rem .75rem .25rem;text-transform:uppercase}.sidebar-section-header a.sidebar-link{color:inherit;font-weight:700;padding:0;text-transform:uppercase}.sidebar-item{display:flex}.sidebar-link{align-items:center;border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-secondary);display:flex;font-size:var(--shadow-claw-font-size-sm);font-weight:500;padding:.5rem .75rem;text-decoration:none;transition:background-color .15s,color .15s;width:100%}.sidebar-link:hover{background-color:var(--shadow-claw-text-secondary);color:var(--shadow-claw-on-primary)}.sidebar-link.active,.sidebar-link[aria-current=page]{background-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary)}</style><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined&display=swap" media="print"><noscript> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined&display=swap"> </noscript> <script id="shadow-claw-static-manifest" type="application/json">{"pages":[{"displayPath":"~\u002fdocs\u002fskill-creator.md","content":"---\ntitle: \"Agent Skills & Skill Creator\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"skill-creator\"\n---\n\n## Agent Skills & Skill Creator\n\nWelcome to the ShadowClaw Agent Skills guide! Skills are workspace-local instruction packages and automated tool pipelines that give your AI assistant specialized capabilities.\n\nWhether you want to teach the assistant a specialized coding workflow, build silent background utility tools, or trigger automated tasks with slash commands, **Agent Skills** make it simple and declarative.\n\n---\n\n## 🌟 Quick Start: What is an Agent Skill?\n\nAn Agent Skill is a directory containing a `SKILL.md` file located inside your workspace's `.agents\u002fskills\u002f` folder:\n\n```text\n.agents\u002fskills\u002f\n└── main\u002f\n ├── skill-creator\u002f\n │ ├── SKILL.md\n │ └── references\u002f\n │ ├── frontmatter-spec.md\n │ ├── declarative-pipelines.md\n │ └── declarative-tools.md\n └── toast-random-number\u002f\n └── SKILL.md\n```\n\nEach skill includes:\n\n1. **`SKILL.md`**: Standard frontmatter metadata (name, description, slash command triggers) and step-by-step instructions.\n2. **`references\u002f` Directory**: Detailed reference guides and technical documentation co-located with the skill.\n3. **Declarative Pipelines**: Optional deterministic tool workflows (`execution.type: \"tools\"`) that execute instantly without calling LLM prompts.\n\n---\n\n## 🚀 Creating Skills with `\u002fskill-creator`\n\nShadowClaw comes with an official bundled **Skill Creator**. You can trigger it anytime by typing `\u002fskill-creator` in the chat thread or asking the AI assistant to create a skill for you.\n\n### Recommended Skill Authoring Workflow\n\n1. **Define the Scope & Trigger**: Decide on a clear skill name (e.g. `toast-random-number`) and write a concise description of what it does.\n2. **Set Up Workspace Folders**:\n - Skill files belong in `.agents\u002fskills\u002fmain\u002f\u003cskill-name\u003e\u002fSKILL.md`.\n - Custom declarative tools belong in `.agents\u002ftools\u002fmain\u002f\u003ctool-name\u003e.json`.\n3. **Write `SKILL.md`**: Configure standard frontmatter attributes and instructions.\n4. **Add Technical References**: Store detailed reference materials under the skill's `references\u002f` directory.\n\n---\n\n## 📚 Skill Reference Documentation\n\nFor deep technical details, explore the co-located reference guides bundled with the official `skill-creator` skill:\n\n- 📋 **[Frontmatter Specification](file:\u002f\u002f\u002f.agents\u002fskills\u002fmain\u002fskill-creator\u002freferences\u002ffrontmatter-spec.md)** \n Complete schema rules for `name`, `description`, `user-invocable`, `disable-model-invocation`, `argument-hint`, and `metadata.allowed-tools`.\n\n- ⚡ **[Declarative Execution Pipelines](file:\u002f\u002f\u002f.agents\u002fskills\u002fmain\u002fskill-creator\u002freferences\u002fdeclarative-pipelines.md)** \n How to write zero-LLM tool chains using `execution.type: \"tools\"`, `$pipe` output piping, `suppressToast`, and `suppressOutput`.\n\n- 🛠️ **[Declarative Tools Reference](file:\u002f\u002f\u002f.agents\u002fskills\u002fmain\u002fskill-creator\u002freferences\u002fdeclarative-tools.md)** \n How to author custom JSON tool definitions in `.agents\u002ftools\u002f` with sandboxed JavaScript evaluation and WebMCP model context integration.\n\n---\n\n## 💡 Example: A Two-Step Declarative Skill\n\nHere is a complete, real-world example of a declarative skill that generates a random number and displays it in a toast notification silently:\n\n```yaml\n---\nname: toast-random-number\ndescription: Generate a random integer from 1 to 1000000 and show it in a ShadowClaw toast notification.\nuser-invocable: true\nmetadata:\n allowed-tools: javascript show_toast generate_random_number\n execution:\n type: tools\n suppressToast: true\n suppressOutput: true\n tools:\n - name: javascript\n input:\n code: Math.floor(Math.random() * 1000000) + 1\n - name: show_toast\n input:\n title: Random Number\n message:\n $pipe: prev\n---\n# Toast Random Number\n\nThis skill generates a random integer and displays it instantly in a toast notification.\n```\n\nWhen you type `\u002ftoast-random-number`, ShadowClaw executes the two steps directly without delay!\n"},{"displayPath":"index.html","content":"---\ntitle: \"ShadowClaw Pages\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"shadow-claw-pages\"\n---\n\n\u003carticle\u003e\n \u003ch2\u003eWelcome to ShadowClaw Pages\u003c\u002fh2\u003e\n \u003cp\u003eThis is the default static page for your workspace.\u003c\u002fp\u003e\n \u003ch2 id=\"getting-started-with-shadowclaw\"\u003eGetting started with ShadowClaw\u003c\u002fh2\u003e\n \u003ch3 id=\"what-is-memorymd\"\u003eWhat is MEMORY.md?\u003c\u002fh3\u003e\n \u003cul\u003e\n \u003cli\u003e\n \"\u003ca href=\"\u002ffiles\u002fmain\u002fMEMORY.md\"\u003eMEMORY.md\u003c\u002fa\u003e\" is a per conversation, per\n invocation, auto-loaded, persistent agent memory file.\n \u003c\u002fli\u003e\n \u003cli\u003e\n It is designed to be a helpful scratchpad for agents to store important\n information, notes, and context about the conversation.\n \u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003ch3 id=\"how-to-use-files\"\u003eHow to use Files\u003c\u002fh3\u003e\n \u003cul\u003e\n \u003cli\u003eOpen \"\u003ca href=\"\u002ffiles\u002fmain\"\u003eFiles\u003c\u002fa\u003e\" to browse your workspace.\u003c\u002fli\u003e\n \u003cli\u003e\n Edit and preview files with the file viewer:\n \u003cul\u003e\n \u003cli\u003e\u003ca href=\"\u002ffiles\u002fmain\u002findex.html\"\u003eindex.html\u003c\u002fa\u003e\u003c\u002fli\u003e\n \u003cli\u003e\n \u003ca href=\"\u002ffiles\u002fmain\u002f~\u002fdocs\u002fexample\u002farticle.html\"\u003earticle.html\u003c\u002fa\u003e\n \u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003ch3 id=\"how-to-use-pages\"\u003eHow to use Pages\u003c\u002fh3\u003e\n \u003cul\u003e\n \u003cli\u003eUse Set as Page on any markdown or HTML file to add it to Pages.\u003c\u002fli\u003e\n \u003cli\u003eRemove a page anytime from the \"\u003ca href=\"\u002fpages\"\u003ePages\u003c\u002fa\u003e\" view.\u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003ch3 id=\"how-to-use-chat\"\u003eHow to use Chat\u003c\u002fh3\u003e\n \u003cul\u003e\n \u003cli\u003e\n Open \"\u003ca href=\"\u002fsettings\"\u003eSettings\u003c\u002fa\u003e\" to configure your agent's system\n prompt, tools, and more.\n \u003c\u002fli\u003e\n \u003cli\u003e\n Open \"\u003ca href=\"\u002fchat\u002fmain\"\u003eChat\u003c\u002fa\u003e\" to start a conversation with your\n agent.\n \u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003ch2 id=\"further-information\"\u003eFurther information\u003c\u002fh2\u003e\n \u003cul\u003e\n \u003cli\u003e\n \u003ca href=\"https:\u002f\u002fgithub.com\u002fxt-ml\u002fshadow-claw#-shadowclaw\"\n \u003eShadowClaw Project\u003c\u002fa\n \u003e\n \u003c\u002fli\u003e\n \u003cli\u003e\u003ca href=\"https:\u002f\u002fdeepwiki.com\u002fxt-ml\u002fshadow-claw\"\u003eDeep Wiki\u003c\u002fa\u003e\u003c\u002fli\u003e\n \u003c\u002ful\u003e\n\u003c\u002farticle\u003e\n"},{"displayPath":"~\u002fdocs\u002fpublishing-to-github-pages.md","content":"---\ntitle: \"Publishing to GitHub Pages\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"publishing-to-github-pages\"\n---\n\n## Publishing to GitHub Pages\n\nShadowClaw can drive a fully automated static-site publishing pipeline directly from the browser, with the only server-side requirement being a GitHub Actions workflow that runs the Node.js build.\n\n---\n\n## Deployment strategies\n\n### Strategy A — Full fork\n\nClone the entire ShadowClaw repository, add your pages to `pages\u002fmain\u002f`, push to a new repo you own, and let CI build and deploy it.\n\n### Strategy B — Pages-only repo (Git clone & inject in CI)\n\nYour repo contains your content, an optional root-level `shadow-claw.config.json` (or `site-config.json`), and a GitHub Actions workflow. Content lives under `pages\u002f`; the workflow checks out ShadowClaw as a build toolchain in CI and builds into `dist\u002fpublic`.\n\n### Strategy C — NPM Package & CLI (`npx shadow-claw`)\n\nRun or deploy using the `shadow-claw` npm package directly:\n\n- Locally: `npx shadow-claw dev` (or `shadow-claw run`) to preview with dev server.\n- In CI: `npx shadow-claw build --prod` builds `dist\u002fpublic` without needing to clone ShadowClaw or copy files.\n- In `package.json`: add `\"shadow-claw\": \"^1.22.4\"` as a devDependency and run `npm run build`.\n\n**Strategy B and Strategy C are both fully supported for content-only repositories and knowledge hubs.**\n\n---\n\n## Strategy B — Step-by-step\n\n### 1. Create a new GitHub repository\n\nCreate an empty repo at `github.com\u002f\u003cyou\u003e\u002f\u003cyour-site\u003e`. Enable **Settings → Pages → Source: GitHub Actions**.\n\n### 2. Add the workflow\n\nCreate `.github\u002fworkflows\u002fdeploy-pages.yml`:\n\n```yaml\nname: Build and Deploy via ShadowClaw\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n inputs:\n shadowclaw_version:\n description: \"ShadowClaw npm version (e.g. latest, 1.23.3)\"\n required: false\n default: \"latest\"\n\npermissions:\n contents: read\n pages: write\n id-token: write\n\nconcurrency:\n group: pages\n cancel-in-progress: true\n\njobs:\n build-and-deploy:\n environment:\n name: github-pages\n url: ${{ steps.deployment.outputs.page_url }}\n runs-on: ubuntu-latest\n steps:\n - name: Checkout repository\n uses: actions\u002fcheckout@v6\n\n - name: Setup Node.js\n uses: actions\u002fsetup-node@v6\n with:\n node-version: \"24\"\n\n - name: Build static site via ShadowClaw CLI\n env:\n PAGES_ORIGIN: \"https:\u002f\u002f${{ github.repository_owner }}.github.io\u002f${{ github.event.repository.name }}\u002f\"\n PAGES_BASE_PATH: \"\u002f${{ github.event.repository.name }}\u002f\"\n run: |\n VERSION=\"${{ github.event.inputs.shadowclaw_version || 'latest' }}\"\n npx --yes \"shadow-claw@$VERSION\" build --prod\n\n - name: Upload Pages artifact\n uses: actions\u002fupload-pages-artifact@v3\n with:\n path: dist\u002fpublic\n\n - name: Deploy to GitHub Pages\n id: deployment\n uses: actions\u002fdeploy-pages@v4\n```\n\n### Version Pinning\n\nShadowClaw builds via `npx --yes shadow-claw@latest build --prod`. To pin to a specific npm release (e.g. `1.23.3`), specify the version in `.github\u002fworkflows\u002fdeploy-pages.yml` or supply `shadowclaw_version` when triggering the GitHub Actions workflow manually.\n\nFor a **custom apex domain** (e.g. `example.com`), override:\n\n```yaml\nPAGES_ORIGIN: \"https:\u002f\u002fexample.com\u002f\"\nPAGES_BASE_PATH: \"\u002f\"\n```\n\n### 3. Add your content\n\n```text\npages\u002f\n main\u002f\n index.html ← home page\n ~\u002fcontent\u002f\n about.md ← any other pages\n routes.json ← pretty-path config (optional)\n\nshadow-claw.config.json ← branding, default tool settings, and build configuration (optional)\n```\n\nSite configurations can also specify tool defaults under `settings`:\n\n```json\n{\n \"settings\": {\n \"defaultToolsProfile\": \"__builtin_default\",\n \"enabledTools\": [\"javascript\", \"read_file\", \"write_file\"]\n }\n}\n```\n\nThe `pages\u002f` directory is optional. If it is absent, the build succeeds and\nShadowClaw publishes its built-in `index.html` and `MEMORY.md` Pages content.\nPretty paths are skipped unless a `routes.json` file is present.\n\nMinimal `pages\u002froutes.json`:\n\n```json\n{\n \"routes\": {\n \"\u002fpages\u002fmain\u002findex.html\": { \"prettyPath\": \"\u002fmain\" },\n \"\u002fpages\u002fmain\u002f~\u002fcontent\u002fabout.md\": { \"prettyPath\": \"\u002fmain\u002fabout\" },\n \"\u002fpages\u002fmain\u002fMEMORY.md\": { \"prettyPath\": \"\u002fmain\u002fmemory\" }\n }\n}\n```\n\n\u003e **Reserved path prefixes** — the following first-path-segments are owned by\n\u003e ShadowClaw's own router and **must not** be used as pretty path prefixes:\n\u003e `\u002f`, `\u002fchat`, `\u002ffiles`, `\u002ftasks`, `\u002fpages`, `\u002fsettings`, `\u002ftools`, `\u002fchannels`.\n\u003e `\u002f` (root) is also reserved as the default pinned page and is unreachable as\n\u003e a pretty path. Use a safe namespace like `\u002fmain\u002f`, `\u002farticles\u002f`, `\u002fdocs\u002f`, or\n\u003e any custom prefix that doesn't collide with the list above.\n\n#### Default Pinned Page (`\u002f`)\n\nWhen visitors navigate to the root URL (`\u002f`) of your published site, ShadowClaw displays the **default pinned page**.\n\n**How ShadowClaw selects the default page for `\u002f`:**\n\n1. Both the static site prerenderer (`prerender-dsd-shell`) and runtime page store (`orchestratorStore`) gather all page files in `pages\u002fmain\u002f`. If `pages\u002fmain\u002f` is absent, both use the built-in default `index.html` and `MEMORY.md` pages.\n2. `MEMORY.md` is always moved to the bottom of the list.\n3. All remaining pages are sorted by `pages.sortOrder` from `shadow-claw.config.json` (or `site-config.json`) (`\"desc\"` by default, natural numeric, or `\"asc\"`).\n4. The first file in this sorted list (`pages[0]`) becomes the default page rendered at `\u002f`.\n\n**How to ensure your intended home page is rendered at `\u002f`:**\nName your landing page file so it sorts first in reverse-alphabetical order relative to other files in `pages\u002fmain\u002f`:\n\n- `index.md` or `index.html` will sort ahead of `about.md`, `contact.md`, or `faq.md`.\n- If you have files starting with letters after `i` (e.g. `welcome.md`), `welcome.md` will sort ahead of `index.md`. Ensure your preferred landing page filename sorts highest in reverse-alphabetical order.\n\n### 4. Push — CI does the rest\n\nEvery push to `main` triggers a build (~3–5 min on a cold runner, faster with the npm cache warm) and deploys to `https:\u002f\u002f\u003cyou\u003e.github.io\u002f\u003cyour-site\u003e\u002f`.\n\n---\n\n## In-browser automation (no LLM, no server)\n\nShadowClaw can publish to your content repo entirely from the browser using a `type: \"tools\"` task chain. The chain is deterministic — it makes **zero LLM calls**.\n\n### Prerequisites\n\n- Clone your content repo into the workspace: ask the agent to `git_clone https:\u002f\u002fgithub.com\u002f\u003cyou\u003e\u002f\u003cyour-site\u003e`, or do it manually.\n- Configure a GitHub Personal Access Token in **Settings → Git → PAT** (needs `repo` scope for private repos, `public_repo` for public ones).\n\n### Minimal publish chain\n\n```json\n{\n \"type\": \"tools\",\n \"tools\": [\n {\n \"name\": \"write_file\",\n \"input\": {\n \"path\": \"repos\u002fyour-site\u002fpages\u002fmain\u002fpost.md\",\n \"content\": \"---\\ntitle: My Post\\n---\\n\\n# Hello World\\n\\nContent here.\"\n }\n },\n {\n \"name\": \"git_add\",\n \"input\": {\n \"repo\": \"your-site\",\n \"files\": [\"pages\u002fmain\u002fpost.md\"]\n }\n },\n {\n \"name\": \"git_commit\",\n \"input\": {\n \"repo\": \"your-site\",\n \"message\": \"publish: new post\"\n }\n },\n {\n \"name\": \"git_push\",\n \"input\": {\n \"repo\": \"your-site\"\n }\n }\n ]\n}\n```\n\n### Fetch-transform-publish chain (fully automated data pipeline)\n\nThis chain fetches an external data source, transforms it to markdown via the JavaScript sandbox, writes it as a page, and pushes — no human in the loop:\n\n```json\n{\n \"type\": \"tools\",\n \"tools\": [\n {\n \"name\": \"fetch_url\",\n \"input\": {\n \"url\": \"https:\u002f\u002fapi.github.com\u002frepos\u002fxt-ml\u002fshadow-claw\u002freleases\u002flatest\"\n }\n },\n {\n \"name\": \"javascript\",\n \"input\": {\n \"code\": \"const match = $PIPE_DATA.match(\u002f--- BEGIN EXTERNAL CONTENT[\\\\s\\\\S]*?---\\\\n([\\\\s\\\\S]*?)\\\\n--- END EXTERNAL CONTENT ---\u002f); const raw = match ? match[1] : $PIPE_DATA; const rel = JSON.parse(raw); const date = rel.published_at?.slice(0, 10) ?? 'unknown'; return `---\\\\ntitle: ShadowClaw ${rel.tag_name}\\\\ndate: ${date}\\\\n---\\\\n\\\\n# ${rel.name}\\\\n\\\\nPublished: ${date}\\\\n\\\\n${rel.body ?? ''}`;\",\n \"data\": { \"$pipe\": \"prev\" }\n }\n },\n {\n \"name\": \"write_file\",\n \"input\": {\n \"path\": \"repos\u002fyour-site\u002fpages\u002fmain\u002frelease-notes.md\",\n \"content\": { \"$pipe\": \"prev\" }\n }\n },\n {\n \"name\": \"git_add\",\n \"input\": {\n \"repo\": \"your-site\",\n \"files\": [\"pages\u002fmain\u002frelease-notes.md\"]\n }\n },\n {\n \"name\": \"git_commit\",\n \"input\": {\n \"repo\": \"your-site\",\n \"message\": \"shadow-claw[bot]: sync release notes\"\n }\n },\n {\n \"name\": \"git_push\",\n \"input\": {\n \"repo\": \"your-site\"\n }\n }\n ]\n}\n```\n\n---\n\n## Strategy C — NPM Package & CLI Workflow\n\nIf you prefer building directly with `npx shadowclaw` without cloning the ShadowClaw repository in CI, use this minimal workflow:\n\n```yaml\nname: Build and Deploy via ShadowClaw CLI\n\non:\n push:\n branches: [main]\n workflow_dispatch:\n\npermissions:\n contents: read\n pages: write\n id-token: write\n\nconcurrency:\n group: pages\n cancel-in-progress: true\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout content repo\n uses: actions\u002fcheckout@v4\n\n - uses: actions\u002fsetup-node@v4\n with:\n node-version: \"24\"\n\n - name: Build production bundle\n env:\n NODE_ENV: production\n PAGES_ORIGIN: \"https:\u002f\u002f${{ github.repository_owner }}.github.io\u002f${{ github.event.repository.name }}\u002f\"\n PAGES_BASE_PATH: \"\u002f${{ github.event.repository.name }}\u002f\"\n run: npx shadow-claw build --prod\n\n - name: Upload Pages artifact\n uses: actions\u002fupload-pages-artifact@v3\n with:\n path: dist\u002fpublic\n\n deploy:\n needs: build\n runs-on: ubuntu-latest\n environment:\n name: github-pages\n url: ${{ steps.deployment.outputs.page_url }}\n steps:\n - name: Deploy to GitHub Pages\n id: deployment\n uses: actions\u002fdeploy-pages@v4\n```\n\n\u003e **Tip:** Wrap this in a scheduled task (Tasks sidebar → New Task → type `tools`, set a cron interval) to run the pipeline automatically, e.g. every 24 hours. No LLM calls are made at execution time.\n\n---\n\n## Template repository\n\nA ready-to-fork starter template is available in the [`shadow-claw-template`](https:\u002f\u002fgithub.com\u002fxt-ml\u002fshadow-claw-template) repository. It contains the workflow, sample `pages\u002fmain\u002findex.html`, `pages\u002fmain\u002f~\u002fcontent\u002fabout.md`, root-level `shadow-claw.config.json`, and `pages\u002froutes.json`.\n"},{"displayPath":"~\u002fdocs\u002fexample\u002farticle.html","content":"---\ntitle: \"Article\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"article\"\n---\n\n\u003carticle\u003e\n \u003ch2\u003eBig Buck Bunny\u003c\u002fh2\u003e\n\n \u003cvideo controls style=\"border-radius: 0.5rem; width: 100%\"\u003e\n \u003csource\n src=\"https:\u002f\u002fxt-ml.github.io\u002fassets\u002fmedia\u002fBigBuckBunny\u002fBigBuckBunny_320x180.mp4\"\n type=\"video\u002fmp4\"\n \u002f\u003e\n \u003c\u002fvideo\u003e\n \u003csection\u003e\n \u003ch2\u003eLicensing\u003c\u002fh2\u003e\n \u003cul\u003e\n \u003cli\u003e\n \u003ccode\u003eBig Buck Bunny\u003c\u002fcode\u003e is licensed under the\n \u003ca href=\"https:\u002f\u002fblender.org\"\n \u003eCreative Commons Attribution 3.0 License\u003c\u002fa\n \u003e.\n \u003cul\u003e\n \u003cli\u003e\n Attribution: Blender Foundation \u002f\n \u003ca href=\"https:\u002f\u002fwww.blender.org\u002f\"\u003ewww.blender.org\u003c\u002fa\u003e\n \u003c\u002fli\u003e\n \u003cli\u003e\n Copyright: (c) copyright 2008, Blender Foundation \u002f\n \u003ca href=\"https:\u002f\u002fwww.bigbuckbunny.org\u002f\"\u003ewww.bigbuckbunny.org\u003c\u002fa\u003e\n \u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003c\u002fli\u003e\n \u003c\u002ful\u003e\n \u003c\u002fsection\u003e\n\u003c\u002farticle\u003e\n"},{"displayPath":"MEMORY.md","content":"---\ntitle: \"Agent Memory\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"agent-memory\"\n---\n\n## Memory\n\n### Workspace Layout & Skills Conventions\n\n- **Skills**: `.agents\u002fskills\u002fmain\u002f\u003cskill-name\u003e\u002fSKILL.md`\n- **Declarative Tools**: `.agents\u002ftools\u002fmain\u002f\u003ctool-name\u003e.json`\n- **Skill Format**: Markdown file with YAML frontmatter AND a Markdown body (frontmatter is metadata only; always include a `# \u003cSkill Title\u003e` heading and human-readable description in the Markdown body so it renders in document previews):\n\n ```yaml\n ---\n name: \u003cskill-name\u003e\n description: \u003cclear summary for model and slash command\u003e\n user-invocable: true\n metadata:\n allowed-tools: \u003ctool1\u003e \u003ctool2\u003e\n execution:\n type: tools\n tools:\n - name: \u003ctool1\u003e\n input: { ... }\n - name: \u003ctool2\u003e\n input: { \"$pipe\": \"prev\" }\n ---\n # \u003cSkill Title\u003e\n\n \u003cOverview and description of what the skill does, parameters, and usage instructions.\u003e\n ```\n\n- **Declarative Tool Format**: JSON with `\"name\"`, `\"description\"`, `\"executor\": \"javascript\"`, `\"inputSchema\"`, and `\"code\"`.\n- **Authoring**: Use `create_directory` before writing new directories, then `write_file`.\n"}],"skills":[{"displayPath":"skill-creator\u002freferences\u002fdeclarative-pipelines.md","content":"# Declarative Execution Pipelines\n\nDeclarative execution pipelines allow skills to execute deterministic sequential tool chains directly on the worker thread without scheduling a Task or making model LLM calls.\n\n## Configuration Syntax\n\nPipelines are declared in `SKILL.md` frontmatter under `metadata.execution`:\n\n```yaml\n---\nname: sample-pipeline\ndescription: Run a deterministic tool chain.\nuser-invocable: true\nmetadata:\n allowed-tools: javascript show_toast\n execution:\n type: tools\n suppressToast: true\n suppressOutput: true\n tools:\n - name: javascript\n input:\n code: \"Math.floor(Math.random() * 100) + 1\"\n - name: show_toast\n input:\n title: \"Random Number\"\n message:\n $pipe: prev\n---\n```\n\n## Data Piping (`$pipe`)\n\nInputs in tool step configurations can reference outputs from previous steps using the `$pipe` operator:\n\n- `{ \"$pipe\": \"prev\" }` or `{ \"$pipe\": -1 }`: Resolves to the return output of the immediately preceding tool step.\n- `{ \"$pipe\": 0 }`: Resolves to the return output of step index `0` (0-indexed).\n- `{ \"$pipe\": \"javascript\" }`: Resolves to the return output of the last step that ran the `javascript` tool.\n\n## Execution Suppression\n\n- `suppressToast: true`: Suppresses step progress toasts (\"Running skill tool...\") during pipeline execution.\n- `suppressOutput: true`: Suppresses raw tool result blocks from being rendered in the chat thread.\n- Setting suppression options at the `execution` root cascades down to all steps unless explicitly overridden per tool step.\n"},{"displayPath":"skill-creator\u002freferences\u002fdeclarative-tools.md","content":"# Declarative Tools\n\nDeclarative tools allow workspace authors to define reusable custom tools using JSON definitions placed under `.agents\u002ftools\u002f\u003cgroup\u003e\u002f\u003ctool-name\u003e.json`.\n\n## Directory Structure\n\n```text\n.agents\u002ftools\u002f\n└── main\u002f\n └── generate_random_number.json\n```\n\n## Schema Format\n\n```json\n{\n \"name\": \"generate_random_number\",\n \"description\": \"Generate a random integer within a specified range.\",\n \"executor\": \"javascript\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"min\": { \"type\": \"number\", \"default\": 1 },\n \"max\": { \"type\": \"number\", \"default\": 1000000 }\n }\n },\n \"code\": \"const min = Number(inputs.min ?? 1); const max = Number(inputs.max ?? 1000000); return Math.floor(Math.random() * (max - min + 1)) + min;\"\n}\n```\n\n## Features\n\n- **Automatic Discovery**: Automatically loaded from `.agents\u002ftools\u002f` across conversation workspaces.\n- **WebMCP Integration**: Registered with the browser ModelContext API for both manual pinning and automated agent execution.\n- **Expression Evaluation**: Code expressions automatically evaluate and return results without needing explicit wrapper boilerplate.\n"},{"displayPath":"skill-creator\u002freferences\u002ffrontmatter-spec.md","content":"# Frontmatter Specification\n\nAgent skills in ShadowClaw are configured via YAML frontmatter at the top of `SKILL.md`. Frontmatter attributes adhere strictly to the standard Agent Skills specification.\n\n## Specification Schema\n\n```yaml\n---\nname: skill-name\ndescription: \"Clear, concise model-facing trigger description.\"\nuser-invocable: true\ndisable-model-invocation: false\nargument-hint: \"[arguments]\"\nmetadata:\n allowed-tools: read_file write_file javascript\ncompatibility: ShadowClaw\nlicense: MIT\n---\n```\n\n\u003e **Quoting Rule**: Always enclose `description` in double quotes (`\"...\"`) or use a YAML folded block scalar (`\u003e`). Descriptions often contain URLs (`https:\u002f\u002f`), colons (`trigger:` or `en:`), quotes, or parentheses that break unquoted YAML frontmatter.\n\n## Attribute Reference\n\n| Attribute | Type | Required | Description |\n| :------------------------- | :-------- | :------- | :-------------------------------------------------------------------------------------------------------- |\n| `name` | `string` | **Yes** | Skill identifier (1–64 lowercase alphanumeric characters and single hyphens). |\n| `description` | `string` | **Yes** | Model-facing description used for skill discovery and activation (max 1024 characters). **Always wrap in double quotes.** |\n| `user-invocable` | `boolean` | No | When `true` (default), allows users to invoke the skill directly via slash commands (e.g. `\u002fskill-name`). |\n| `disable-model-invocation` | `boolean` | No | When `true`, hides the skill from model discovery so it is only triggered via slash command. |\n| `argument-hint` | `string` | No | Display placeholder in the UI search\u002fautocomplete menu when typing slash commands. |\n| `metadata` | `object` | No | Key-value dictionary for custom metadata, tool permissions (`allowed-tools` string or list), and `execution` pipelines. |\n| `compatibility` | `string` | No | Platform compatibility requirements or version strings. |\n| `license` | `string` | No | Open-source software license string (e.g. `MIT`, `AGPL-3.0`). |\n\n## Metadata Attributes (`metadata`)\n\nCustom configuration properties and extension specifications (like declarative execution pipelines) that fall outside the standard Agent Skills frontmatter attributes should be placed inside `metadata`:\n\n```yaml\nmetadata:\n allowed-tools: javascript show_toast generate_random_number\n author: ShadowClaw Team\n version: 1.0.0\n execution:\n type: tools\n suppressToast: true\n tools:\n - name: javascript\n input:\n code: Math.floor(Math.random() * 100) + 1\n```\n"},{"displayPath":"skill-creator\u002fSKILL.md","content":"---\nname: skill-creator\ndescription: Create, edit, review, and validate ShadowClaw declarative skills and their supporting resources.\nuser-invocable: true\nmetadata:\n allowed-tools: read_file write_file javascript create_directory\n---\n\n# ShadowClaw Skill Creator\n\nUse this skill when creating, modifying, reviewing, or validating a ShadowClaw agent skill or declarative tool pipeline.\n\n## Workspace Layout Standards\n\n- **Skills**: Create each skill in its dedicated directory under `.agents\u002fskills\u002f\u003cgroup\u003e\u002f\u003cskill-name\u003e\u002fSKILL.md` (default group: `main`).\n- **Declarative Tools**: Define supporting declarative tools under `.agents\u002ftools\u002f\u003cgroup\u003e\u002f\u003ctool-name\u003e.json` (default group: `main`).\n- **Supporting Resources**: Co-locate skill-specific assets (reference documents, templates, helper scripts) inside the skill directory alongside `SKILL.md`.\n\n## Workflow\n\n1. **Establish Contract & Scope**\n - For existing skills, read `SKILL.md` and related resources before editing.\n - For new skills, define the trigger prompt, intended execution outcome, required tools, and output artifacts.\n2. **Configure Frontmatter**\n - Provide a clear, concise trigger description in `description` (1024 characters max).\n - **Always enclose `description` in double quotes** (`description: \"...\"`) or use a YAML block scalar (`\u003e`). Colons (`:`), URLs, and trigger phrases inside unquoted YAML break parsing.\n - Set `user-invocable: true` if the skill should be triggerable via slash command (e.g. `\u002fskill-name`).\n - Use `disable-model-invocation: true` for skills intended strictly for slash-command execution.\n - Place non-standard configuration (such as `allowed-tools`) within the standard `metadata` block to maintain Agent Skills specification compliance. Specify tools as a space-separated string or a list.\n3. **Structure & Draft Content**\n - Write instructions in `SKILL.md` using clear, modular procedures.\n - Place deterministic operations in `javascript` tool calls; use `read_file` and `write_file` for workspace persistence.\n - Create required target directories via `create_directory` prior to writing files.\n4. **Declarative Pipelines (`execution.type: tools`)**\n - Define sequential tool pipelines in frontmatter via `execution: { type: \"tools\", tools: [...] }`.\n - Pass outputs between steps using `{ \"$pipe\": \"prev\" }` or step\u002ftool identifiers.\n - Optionally apply `suppressToast: true` or `suppressOutput: true` at the execution root or per step to suppress notifications and output blocks.\n5. **Verify & Validate**\n - Re-read the saved `SKILL.md` and verify valid YAML frontmatter syntax (ensure `description` is enclosed in double quotes).\n - Ensure the skill name uses 1–64 lowercase alphanumeric characters or hyphens and all referenced resource paths exist.\n"}]}</script>
|
|
4
4
|
<script id="shadow-claw-static-routing" type="application/json">{"routes":{"\u002fpages\u002fmain\u002findex.html":{"prettyPath":"\u002fmain\u002f"},"\u002fpages\u002fmain\u002f~\u002fdocs\u002fpublishing-to-github-pages.md":{"prettyPath":"\u002fdocs\u002fpublishing\u002f"},"\u002fpages\u002fmain\u002f~\u002fdocs\u002fskill-creator.md":{"prettyPath":"\u002fdocs\u002fskill-creator\u002f"},"\u002fpages\u002fmain\u002f~\u002fdocs\u002fexample\u002farticle.html":{"prettyPath":"\u002fdocs\u002fexample\u002farticle\u002f"},"\u002fpages\u002fmain\u002fMEMORY.md":{"prettyPath":"\u002fmain\u002fmemory\u002f"}}}</script>
|
|
5
5
|
<meta property="og:site_name" content="ShadowClaw" />
|
|
6
6
|
</head><body> <shadow-claw data-prerender-no-seed="true">
|
|
7
|
-
<template shadowrootmode="open" data-shadow-claw-dsd="true"><style data-dsd-style>*,:after,:before{box-sizing:border-box}.hidden,[hidden]{display:none!important}a{color:var(--shadow-claw-link);text-decoration:underline;text-underline-offset:.125rem}a:hover{color:var(--shadow-claw-link-hover)}.header{background-color:var(--shadow-claw-bg-secondary);border-bottom:.0625rem solid var(--shadow-claw-border-color);gap:.5rem;height:4rem;justify-content:start;max-height:4rem;padding:.5rem 1rem}.header,.header h1{align-items:center;display:flex;width:100%}.header h1{color:var(--shadow-claw-text-primary);flex-direction:row;margin:0}#menu-button{align-items:center;background:transparent;border:none;border-radius:.25rem;color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;justify-content:center;padding:.5rem}#menu-button:hover,.theme-toggle:hover{background-color:var(--shadow-claw-bg-tertiary);color:var(--shadow-claw-text-primary)}.header-actions{gap:.5rem;margin-left:auto}.header-actions,.theme-toggle{align-items:center;display:flex}.theme-toggle{background:transparent;border:none;border-radius:.25rem;color:var(--shadow-claw-text-secondary);cursor:pointer;justify-content:center;padding:.5rem}.theme-mode-toggle .sun-icon{display:none}.theme-mode-toggle .moon-icon{display:block}.theme-toggle svg{transition:transform .2s ease}.header-main-toggle{display:var(--shadow-claw-header-main-toggle-display,block)}.activity-log-toggle[aria-pressed=true],.header-main-toggle[aria-pressed=true]{box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-warning-color,#d97706) 50%,transparent);color:var(--shadow-claw-warning-color,#d97706)}.activity-log-toggle[aria-pressed=true] svg,.header-main-toggle[aria-pressed=true] svg{transform:rotate(180deg)}.webvm-toggle--booting,.webvm-toggle--ready,.webvm-toggle--visible{color:var(--shadow-claw-success-color)}.webvm-toggle--error{color:var(--shadow-claw-error-color)}.app{background-color:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary);display:flex;flex-direction:column;font-family:var(--shadow-claw-font-sans);visibility:visible;width:100%}.app-body{--sidebar-width:15.625rem;display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.sidebar{background-color:var(--shadow-claw-bg-secondary);border-right:.0625rem solid var(--shadow-claw-bg-tertiary);display:flex;flex:none;flex-direction:column;overflow-y:auto;position:relative;width:var(--sidebar-width)}.sidebar-resize-handle{background:transparent;cursor:col-resize;flex:none;outline:none;position:relative;touch-action:none;user-select:none;width:.75rem}.sidebar-resize-handle:before{background:color-mix(in srgb,var(--shadow-claw-bg-secondary) 72%,var(--shadow-claw-border-color));border:.0625rem solid color-mix(in srgb,var(--shadow-claw-border-color) 80%,transparent);height:4.25rem;transition:background-color .15s,border-color .15s,box-shadow .15s;width:.5625rem}.sidebar-resize-handle:after,.sidebar-resize-handle:before{border-radius:var(--shadow-claw-radius-pill);content:"";left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.sidebar-resize-handle:after{background:var(--shadow-claw-border-color);height:2.75rem;transition:background-color .15s;width:.1875rem}.sidebar-resize-handle.active:before,.sidebar-resize-handle:hover:before{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:color-mix(in srgb,var(--shadow-claw-accent-primary) 45%,transparent);box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-accent-primary) 18%,transparent)}.sidebar-resize-handle.active:after,.sidebar-resize-handle:hover:after{background:var(--shadow-claw-accent-primary)}.sidebar-resize-handle:focus-visible:before{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:color-mix(in srgb,var(--shadow-claw-accent-primary) 45%,transparent);box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-accent-primary) 18%,transparent)}.sidebar-resize-handle:focus-visible:after{background:var(--shadow-claw-accent-primary)}.sidebar-resize-handle:focus-visible{outline:.125rem solid color-mix(in srgb,var(--shadow-claw-accent-primary) 60%,transparent);outline-offset:.0625rem}@media (max-width:55.9375rem){.sidebar{display:none}.sidebar.open{border-radius:0 var(--shadow-claw-radius-m) var(--shadow-claw-radius-m) 0;box-shadow:var(--shadow-claw-shadow-lg);display:flex;height:calc(100vh - 4rem);height:calc(100dvh - 4rem);position:absolute;width:min(85vw,20rem);z-index:100}.sidebar-resize-handle{display:none}}@media (min-width:56rem){#menu-button{display:none}}.nav-menu{display:var(--shadow-claw-sidebar-nav-display,flex);flex:none;flex-direction:column;list-style:none;margin:0;padding:.5rem}.nav-menu:not(:has(.nav-item:not([hidden]))){display:none}slot[name=sidebar-content],slot[name=sidebar-footer],slot[name=sidebar-nav],slot[name=sidebar]{display:block}::slotted([slot=sidebar-content]),::slotted([slot=sidebar-footer]),::slotted([slot=sidebar-nav]),::slotted([slot=sidebar]){display:block}.sidebar-footer{display:var(--shadow-claw-sidebar-footer-display,block)}.sidebar-spacer{flex:1}shadow-claw-conversations{display:flex;flex:none;flex-direction:column;min-height:0;overflow:hidden}.nav-item{border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:var(--shadow-claw-font-size-sm);font-weight:500;margin-bottom:.5rem;padding:.625rem .75rem;transition:background-color .15s,color .15s}.nav-item:hover{background-color:var(--shadow-claw-text-secondary)}.nav-item.active,.nav-item:hover{color:var(--shadow-claw-on-primary)}.nav-item.active{background-color:var(--shadow-claw-accent-primary)}.sidebar-footer{border-top:.0625rem solid var(--shadow-claw-border-color);flex:none;margin-bottom:.5rem;padding:.75rem}.settings-btn{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:.8125rem;padding:.625rem .75rem;transition:all var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);width:100%}.settings-btn:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);color:var(--shadow-claw-text-primary)}.main-content{--chat-split-height:20rem;height:calc(100vh - 4rem);height:calc(100dvh - 4rem);overflow:hidden;position:relative}.main-content,.page{display:flex;flex:1;flex-direction:column;min-height:0}.page{display:none;overflow:auto}.page.active{display:flex}.chat-split-resize-handle{background:transparent;cursor:row-resize;display:none;flex:none;height:.75rem;outline:none;position:relative;touch-action:none;user-select:none;width:100%}.main-content.split-chat-active .page.active{order:1}.main-content.split-chat-active .chat-split-resize-handle{display:flex;margin-bottom:-.375rem;margin-top:-.375rem;order:2;z-index:10}.chat-split-resize-handle:before{background:color-mix(in srgb,var(--shadow-claw-bg-secondary) 72%,var(--shadow-claw-border-color));border:.0625rem solid color-mix(in srgb,var(--shadow-claw-border-color) 80%,transparent);height:.5625rem;transition:background-color .15s,border-color .15s,box-shadow .15s;width:4.25rem}.chat-split-resize-handle:after,.chat-split-resize-handle:before{border-radius:var(--shadow-claw-radius-pill);content:"";left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.chat-split-resize-handle:after{background:var(--shadow-claw-border-color);height:.1875rem;transition:background-color .15s;width:2.75rem}.chat-split-resize-handle.active:before,.chat-split-resize-handle:focus-visible:before,.chat-split-resize-handle:hover:before{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:color-mix(in srgb,var(--shadow-claw-accent-primary) 45%,transparent);box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-accent-primary) 18%,transparent)}.chat-split-resize-handle.active:after,.chat-split-resize-handle:focus-visible:after,.chat-split-resize-handle:hover:after{background:var(--shadow-claw-accent-primary)}.chat-split-resize-handle:focus-visible{outline:.125rem solid color-mix(in srgb,var(--shadow-claw-accent-primary) 60%,transparent);outline-offset:.0625rem}.main-content.split-chat-active .chat-page:not(.active){border-top:.0625rem solid var(--shadow-claw-border-color);display:flex;flex:none;height:var(--chat-split-height);max-height:calc(100% - 6.25rem);min-height:9.375rem;order:3}@media (max-width:55.9375rem){.chat-split-resize-handle,.main-content.split-chat-active .chat-page:not(.active){display:none!important}}.app-dialog{background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l);box-shadow:var(--shadow-claw-shadow-lg);color:var(--shadow-claw-text-primary);max-width:min(90vw,28rem);padding:0}.app-dialog::backdrop{background:color-mix(in srgb,#000 50%,transparent)}.app-confirm-dialog__form{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:1rem}.app-dialog__title{font-size:1rem;margin:0}.app-dialog__details,.app-dialog__message{color:var(--shadow-claw-text-secondary);margin:0}.app-dialog__details{display:flex;flex-direction:column;gap:.25rem;padding-left:1rem}.app-dialog__links{display:flex;flex-wrap:wrap;gap:.5rem}.app-dialog__link{color:var(--shadow-claw-accent-primary);font-size:.9375rem;text-decoration:none}.app-dialog__link:focus-visible,.app-dialog__link:hover{text-decoration:underline}.app-dialog__countdown{color:var(--shadow-claw-text-secondary);font-size:.875rem;margin:0}.app-confirm-dialog__actions{display:flex;gap:.5rem;justify-content:flex-end}.app-dialog__btn{border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);cursor:pointer;font:inherit;padding:.5rem .75rem}.app-dialog__btn--cancel{background:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary)}.app-dialog__btn--confirm{background:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary)}.app-prompt-dialog__form{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:1rem}.app-prompt-dialog__title{font-size:1rem;margin:0}.app-prompt-dialog__message{color:var(--shadow-claw-text-secondary);margin:0}.app-prompt-dialog__input-area{display:flex;flex-direction:column;gap:.5rem;margin-top:.5rem}.app-prompt-dialog__input{background:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);font:inherit;padding:.5rem;width:100%}.app-prompt-dialog__actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.chat-page{flex-direction:column}:host([data-prerender-no-seed=true]) .nav-item,:host([data-prerender-no-seed=true]) .page.active,:host([data-prerender-no-seed=true]) .sidebar-footer,:host([data-prerender-no-seed=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true]) shadow-claw-toast{opacity:1;transform:translateY(0);transition:opacity var(--shadow-claw-duration-min) var(--shadow-claw-ease-out),transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out)}:host([data-prerender-no-seed=true][data-hydration-pending=true]) .nav-item,:host([data-prerender-no-seed=true][data-hydration-pending=true]) .page.active,:host([data-prerender-no-seed=true][data-hydration-pending=true]) .sidebar-footer,:host([data-prerender-no-seed=true][data-hydration-pending=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true][data-hydration-pending=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true][data-hydration-pending=true]) shadow-claw-toast,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .nav-item,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .page.active,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .sidebar-footer,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) shadow-claw-toast{opacity:0;pointer-events:none;transform:translateY(.25rem)}@media (prefers-reduced-motion:reduce){:host([data-prerender-no-seed=true]) .nav-item,:host([data-prerender-no-seed=true]) .page.active,:host([data-prerender-no-seed=true]) .sidebar-footer,:host([data-prerender-no-seed=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true]) shadow-claw-toast{transform:none;transition:none}}.sidebar-boot-skeleton{background-color:var(--shadow-claw-bg-secondary);bottom:0;display:flex;flex-direction:column;left:0;opacity:0;padding:1rem .75rem;pointer-events:none;position:absolute;right:0;top:0;transition:opacity var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out),visibility var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out);visibility:hidden;z-index:10}:host([data-hydration-pending=true]) .sidebar-boot-skeleton,:host([data-js-boot-pending=true]) .sidebar-boot-skeleton{opacity:1;pointer-events:auto;visibility:visible}.skeleton-nav-wrapper{display:none;flex-direction:column;gap:.5rem;margin-bottom:.5rem}:host([data-prerender-no-seed=true]) .skeleton-nav-wrapper{display:flex}.skeleton-divider{border-top:.0625rem solid var(--shadow-claw-border-color);display:none;margin:.75rem 0}:host([data-prerender-no-seed=true]) .skeleton-divider{display:block}.skeleton-convo-wrapper{display:flex;flex-direction:column;gap:.75rem;margin-top:.5rem}.skeleton-item{animation:skeleton-pulse 1.8s ease-in-out infinite;background:linear-gradient(90deg,var(--shadow-claw-bg-secondary) 25%,var(--shadow-claw-bg-tertiary) 50%,var(--shadow-claw-bg-secondary) 75%);background-size:200% 100%}.skeleton-nav{border-radius:var(--shadow-claw-radius-m);height:2.25rem;width:100%}.skeleton-nav:first-child{width:85%}.skeleton-nav:nth-child(2){width:90%}.skeleton-nav:nth-child(3){width:75%}.skeleton-nav:nth-child(4){width:80%}.skeleton-convo{border-radius:var(--shadow-claw-radius-m);height:3.5rem;width:100%}.main-content-boot-skeleton{align-items:center;background-color:var(--shadow-claw-bg-primary);bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;opacity:0;padding:2rem;pointer-events:none;position:absolute;right:0;top:0;transition:opacity var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out),visibility var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out);visibility:hidden;z-index:10}:host([data-prerender-no-seed=true][data-hydration-pending=true]) .main-content-boot-skeleton,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .main-content-boot-skeleton{opacity:1;pointer-events:auto;visibility:visible}.boot-loading-svg{height:4.5rem;opacity:.85;transition:color var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);width:4.5rem}.boot-loading-svg,.boot-loading-text{color:var(--shadow-claw-text-secondary)}.boot-loading-text{font-size:var(--shadow-claw-font-size-sm);font-weight:600;letter-spacing:.075em;margin-top:1.25rem;text-transform:uppercase}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}</style><div class="app"><header class="header"><button aria-label="Open menu" title="Open menu" id="menu-button"><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" viewBox="0 -960 960 960"><path d="M120-680v-80h720v80zm0 480v-80h720v80zm0-240v-80h720v80z"/></svg></button><h1><slot name="header-title-link"></slot><div class="header-actions"><button aria-label="Toggle theme" title="Toggle theme" class="theme-mode-toggle theme-toggle"><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" class="sun-icon" viewBox="0 -960 960 960"><path d="M480-360q50 0 85-35t35-85-35-85-85-35-85 35-35 85 35 85 85 35m0 80q-83 0-141.5-58.5T280-480t58.5-141.5T480-680t141.5 58.5T680-480t-58.5 141.5T480-280M200-440H40v-80h160zm720 0H760v-80h160zM440-760v-160h80v160zm0 720v-160h80v160zM256-650l-101-97 57-59 96 100zm492 496-97-101 53-55 101 97zm-98-550 97-101 59 57-101 97zM158-190l97-101 55 53-101 97z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" class="moon-icon" viewBox="0 -960 960 960"><path d="M480-120q-150 0-255-105T120-480t105-255 255-105q14 0 27.5 1t26.5 3q-41 29-65.5 75.5T444-660q0 90 63 153t153 63q52 0 99-24.5t75-65.5q2 13 3 26.5t1 27.5q0 150-105 255T480-120m0-80q88 0 158-48.5T740-375q-20 5-40 8t-40 3q-123 0-209.5-86.5T364-660q0-20 3-40t8-40q-74 30-122.5 100T204-480q0 116 82 198t194 82m-12-274"/></svg></button><button aria-label="Hide action header" title="Hide action header" aria-pressed="false" class="header-main-toggle theme-toggle" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" viewBox="0 -960 960 960"><path d="M280-200h400v-80H280zm200-200L280-600l56-56 104 104v-328h80v328l104-104 56 56z"/></svg></button><button aria-label="Hide activity log" title="Hide activity log" aria-pressed="false" class="activity-log-toggle theme-toggle" type="button" hidden><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 -960 960 960"><path d="M80-600v-160q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v160h-80v-160H160v160zm80 360q-33 0-56.5-23.5T80-320v-200h80v200h640v-200h80v200q0 33-23.5 56.5T800-240zM40-120v-80h880v80zm40-400v-80h240q11 0 21 6t15 16l47 93 123-215q5-9 14-14.5t20-5.5 21 5.5 15 16.5l49 98h235v80H620q-11 0-21-5.5T584-542l-26-53-123 215q-5 10-15 15t-21 5-20.5-6-14.5-16l-69-138z"/></svg></button><button aria-label="Hide WebVM terminal" title="Hide WebVM terminal" aria-pressed="true" class="theme-toggle webvm-toggle" type="button" hidden><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" viewBox="0 -960 960 960"><path d="M320-280 120-480l200-200 56 56-104 104h568v80H272l104 104zm320 0-56-56 104-104H120v-80h568L584-624l56-56 200 200z"/></svg></button><slot name="header-actions-logo"></slot></div></h1></header><div class="app-body"><aside class="sidebar"><div class="sidebar-boot-skeleton" aria-hidden="true"><div class="skeleton-nav-wrapper"><div class="skeleton-item skeleton-nav"></div><div class="skeleton-item skeleton-nav"></div><div class="skeleton-item skeleton-nav"></div><div class="skeleton-item skeleton-nav"></div></div><div class="skeleton-divider"></div><div class="skeleton-convo-wrapper"><div class="skeleton-convo skeleton-item"></div><div class="skeleton-convo skeleton-item"></div><div class="skeleton-convo skeleton-item"></div></div></div><nav><ul class="nav-menu"><li class="active nav-item" data-page="pages">📚 Pages</li><li class="nav-item" data-page="chat">💬 Chat</li><li class="nav-item" data-page="tasks"> ✓ Tasks</li><li class="nav-item" data-page="files">📁 Files</li></ul></nav><slot name="sidebar-nav"></slot><slot name="sidebar"></slot><slot name="sidebar-content"></slot><div class="sidebar-spacer"></div><shadow-claw-conversations></shadow-claw-conversations><slot name="sidebar-footer"></slot><div class="sidebar-footer"><button class="settings-btn" data-action="show-settings"> ⚙️ Settings </button></div></aside><div class="sidebar-resize-handle" title="Drag to resize sidebar"></div><main class="main-content"><div class="main-content-boot-skeleton" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" class="boot-loading-svg" viewBox="0 0 44 44"><g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-width="2"><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="0s" calcMode="spline" dur="1.8s" keySplines="0.165, 0.84, 0.44, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 20"/><animate attributeName="stroke-opacity" begin="0s" calcMode="spline" dur="1.8s" keySplines="0.3, 0.61, 0.355, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 0"/></circle><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="-0.9s" calcMode="spline" dur="1.8s" keySplines="0.165, 0.84, 0.44, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 20"/><animate attributeName="stroke-opacity" begin="-0.9s" calcMode="spline" dur="1.8s" keySplines="0.3, 0.61, 0.355, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 0"/></circle></g></svg><div class="boot-loading-text">Preparing workspace...</div></div><div class="chat-page page" data-page-id="chat"></div><div class="page" data-page-id="tasks"></div><div class="page" data-page-id="files"></div><div class="active page" data-page-id="pages"><shadow-claw-pages><template shadowrootmode="open" data-shadow-claw-pages-dsd="true"><style data-dsd-style>*{box-sizing:border-box}:host{display:block;height:calc(100dvh + 4rem);line-height:1.5}.pages{background:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary);flex-direction:column}.pages,.pages__content{display:flex;min-height:0;min-width:0}.pages__content{flex:1;flex-direction:column}.pages__sidebar{display:none}.pages__list{padding:.625rem}.pages__group-details,.pages__list{display:flex;flex-direction:column;gap:.375rem}.pages__group-label{align-items:center;color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;font-size:.75rem;font-weight:700;justify-content:space-between;list-style:none;margin:.25rem 0 0;padding:.125rem .25rem;text-transform:uppercase;user-select:none}.pages__group-label::-webkit-details-marker{display:none}.pages__group-icon{font-size:.625rem;transform:rotate(-90deg);transition:transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out)}.pages__group-details[open] .pages__group-icon{transform:rotate(0deg)}.pages__group-pages{display:flex;flex-direction:column;gap:.375rem}.pages__list-item{align-items:center;background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-primary);display:flex;font-size:var(--shadow-claw-font-size-sm);gap:.375rem;justify-content:space-between;line-height:1.35;padding:.375rem;width:100%}.pages__list-item:hover{border-color:var(--shadow-claw-accent-primary)}.pages__select{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;flex:1;font:inherit;min-width:0;padding:.125rem .25rem;text-align:left}.pages__list-item.active{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:var(--shadow-claw-accent-primary)}.pages__list-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pages__remove{background:transparent;border:none;color:var(--shadow-claw-text-secondary);cursor:pointer;flex:none;font-size:1rem;line-height:1;padding:.125rem .25rem}.pages__remove:hover{color:var(--shadow-claw-error-color)}.pages__viewer{display:flex;flex:1;flex-direction:row;min-height:calc(100vh - 11rem);min-height:calc(100dvh - 11rem);min-width:0;overflow:hidden;position:relative}.pages__viewer-scroll{display:flex;flex:1;flex-direction:column;height:calc(100% + 1.5rem);min-width:0;padding:.75rem 1rem}.pages__rendered{max-width:72rem;padding:1rem 1.5rem 1rem 1rem}.pages__rendered :is(pre){overflow:auto}.pages__rendered img{max-height:100%;max-width:100%}.pages__rendered a{color:var(--shadow-claw-link,var(--shadow-claw-accent-primary))}.pages__rendered>h1,.pages__rendered>h2,article :is(h1,h2),article header>h1,article header>h2,article>h1,article>h2{margin-bottom:var(--shadow-claw-article-header-margin-bottom,1.5rem);margin-top:0}.pages__rendered :is(h1,h2,h3,h4){clear:both}.pages__rendered :is(h1,h2,h3,h4,h5,h6) a{color:var(--shadow-claw-text-primary,inherit);text-decoration:none}.pages__rendered :is(h1,h2,h3,h4,h5,h6) a:hover{color:var(--shadow-claw-link-hover,inherit);text-decoration:underline}.pages__iframe{background:transparent;border-width:0;display:block;height:auto;min-height:20rem;overflow:hidden;width:100%}.pages__empty,.pages__status{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm)}.pages:has(.pages__sidebar.collapsed) .pages__remove-all-btn{display:none}.pages:has(.pages__sidebar.collapsed) shadow-claw-page-header::part(actions-disclosure){display:none}.pages__dropdown-container{align-items:center;display:var(--shadow-claw-pages-dropdown-container-display,flex);gap:.5rem;margin-bottom:1rem;position:relative;width:100%}.pages__nav-btn{align-items:center;backdrop-filter:blur(6px);background:color-mix(in srgb,var(--shadow-claw-bg-secondary) 80%,transparent);border:.0625rem solid color-mix(in srgb,var(--shadow-claw-border-color) 60%,transparent);border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;flex:none;height:8rem;justify-content:center;max-height:8rem;min-height:8rem;opacity:0;padding:.75rem .5rem;pointer-events:none;position:fixed;top:50dvh;transform:translateY(-50%);transition:opacity .4s var(--shadow-claw-ease-out),color .15s var(--shadow-claw-ease-out),border-color .15s var(--shadow-claw-ease-out),background .15s var(--shadow-claw-ease-out);z-index:100}.pages__nav-btn--prev{left:.5rem}.pages__nav-btn--next{right:.5rem}.pages__content:focus-within .pages__nav-btn:not(:disabled):not([hidden]),.pages__content:has(.pages__viewer--nav-visible) .pages__nav-btn:not(:disabled):not([hidden]),.pages__nav-btn:hover:not(:disabled):not([hidden]),.pages__viewer.pages__viewer--nav-visible~.pages__nav-btn:not(:disabled):not([hidden]),.pages__viewer:focus-within~.pages__nav-btn:not(:disabled):not([hidden]){opacity:1;pointer-events:auto}.pages__nav-btn:disabled,.pages__nav-btn[hidden]{display:none!important;opacity:0!important;pointer-events:none!important}.pages__nav-btn:hover:not(:disabled){background:color-mix(in srgb,var(--shadow-claw-accent-primary) 15%,var(--shadow-claw-bg-secondary));border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-accent-primary);opacity:1}.pages__nav-btn:disabled{cursor:not-allowed}.pages__dropdown{background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);box-shadow:var(--shadow-claw-shadow-sm);color:var(--shadow-claw-text-primary);display:block;transition:border-color var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);width:100%}.pages__dropdown:hover{border-color:var(--shadow-claw-accent-primary)}.pages__dropdown-summary{align-items:center;cursor:pointer;display:flex;font-size:var(--shadow-claw-font-size-sm);font-weight:600;gap:.5rem;justify-content:space-between;list-style:none;padding:.625rem 1rem;user-select:none}.pages__dropdown-summary::-webkit-details-marker{display:none}.pages__dropdown-selected{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pages__dropdown-arrow{color:var(--shadow-claw-text-secondary);font-size:.75rem;transition:transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out)}.pages__dropdown[open] .pages__dropdown-arrow{transform:rotate(180deg)}.pages__dropdown-menu{backdrop-filter:blur(10px);background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);box-shadow:var(--shadow-claw-shadow-lg);left:0;margin-top:.375rem;max-height:20rem;overflow-y:auto;position:absolute;right:0;z-index:100}.pages__dropdown-menu .pages__list{padding:.375rem}.pages__breadcrumbs{align-items:center;display:flex;font-size:.8125rem}.pages__sidebar-toggle-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.1875rem;color:var(--shadow-claw-accent-primary);cursor:pointer;padding:.25rem .5rem;transition:all .1s}.pages__sidebar-toggle-btn:focus-visible,.pages__sidebar-toggle-btn:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);outline:none}.pages__drag-handle{color:var(--shadow-claw-text-tertiary);cursor:grab;flex:none;font-size:.875rem;line-height:1;padding:.125rem .25rem;user-select:none}.pages__drag-handle:hover{color:var(--shadow-claw-text-secondary)}.pages__drag-handle:active,.pages__list-item.dragging .pages__drag-handle{cursor:grabbing}.pages__list-item.drag-over{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem var(--shadow-claw-accent-primary)}.pages__default-btn{background:transparent;border:none;color:var(--shadow-claw-text-tertiary);cursor:pointer;flex:none;font-size:.875rem;line-height:1;padding:.125rem .25rem}.pages__default-btn.is-default,.pages__default-btn:hover{color:var(--shadow-claw-accent-primary)}.pages__edit{background:transparent;border:none;color:var(--shadow-claw-text-secondary);cursor:pointer;flex:none;font-size:.875rem;line-height:1;padding:.125rem .25rem}.pages__edit:hover{color:var(--shadow-claw-text-primary)}@media (min-width:75rem){.pages__content{display:grid;grid-template-columns:minmax(14rem,20rem) minmax(0,1fr);grid-template-rows:minmax(0,1fr)}.pages__content.pages__content--sidebar-collapsed{grid-template-columns:1fr!important}.pages__sidebar{border-right:.0625rem solid var(--shadow-claw-border-color);display:block;min-height:0;overflow:auto}.pages__sidebar.collapsed{display:none!important}.pages__dropdown{display:none}.pages__nav-btn--prev{left:20.5rem}.pages__content.pages__content--sidebar-collapsed .pages__nav-btn--prev{left:.5rem}}shadow-claw-page-header{display:var(--shadow-claw-page-header-display,block)}ul{line-height:1.5}.pages__announcer{border:0;clip:rect(0,0,0,0);height:.0625rem;margin:-.0625rem;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:.0625rem}</style><section class="pages" aria-label="Pages"><div class="pages__announcer" data-pages-announcer aria-live="polite" aria-atomic="true"></div><shadow-claw-page-header icon="📚" title="Pages"><template shadowrootmode="open" data-shadow-claw-page-header-dsd="true"><style data-dsd-style>*,:after,:before{box-sizing:border-box;font-family:var(--shadow-claw-font-sans)}.hidden,[hidden]{display:none!important}:host{display:block}.header{background-color:var(--shadow-claw-bg-primary);border-bottom:.0625rem solid var(--shadow-claw-border-color)}.header__main{display:flex;flex-direction:column;padding:.75rem}.header__main,.header__top{align-items:flex-start;gap:.75rem}.header__top{display:grid;grid-template-columns:minmax(0,1fr);width:100%}.header__title{font-size:1rem;font-weight:600;margin:0}.header__title a{color:var(--shadow-claw-link);text-decoration:none}.header__title a:hover{color:var(--shadow-claw-link-hover);text-decoration:underline}.header__actions{display:flex;flex-direction:column;gap:.375rem;padding-top:.5rem;width:100%}.header__actions[hidden]{display:none!important}.header__actions-disclosure{width:100%}.header__actions-disclosure[hidden]{display:none!important}.header__actions-toggle{align-items:center;background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m,1rem);color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;font-size:.75rem;font-weight:600;gap:.5rem;justify-content:space-between;list-style:none;min-height:2rem;padding:.375rem .625rem;user-select:none;width:100%}.header__actions-toggle::-webkit-details-marker{display:none}.header__actions-toggle:after{border-color:currentcolor transparent transparent;border-style:solid;border-width:.375rem .3125rem 0;content:"";display:inline-block;flex:none;transform:rotate(0deg);transition:transform .2s ease}.header__actions-disclosure[open] .header__actions-toggle:after{transform:rotate(180deg)}.header__actions-toggle:focus-visible,.header__actions-toggle:hover{background-color:var(--shadow-claw-bg-tertiary,#f1f5f9);border-color:var(--shadow-claw-accent-primary,#334155);color:var(--shadow-claw-text-primary,#0f172a);outline:none}::slotted(button),::slotted(shadow-claw-page-header-action-button){flex:1 1 100%!important;min-width:0!important;width:100%!important}@media (min-width:40.625rem){.header__main{padding:.875rem 1rem 1rem}.header__title{font-size:var(--shadow-claw-font-size-md)}.header__top{align-items:start;grid-template-columns:1fr auto}.header__actions{flex-direction:row;flex-wrap:wrap;gap:.5rem;justify-content:flex-end;padding-top:0;width:auto}.header__actions-toggle{display:none}.header__actions-disclosure{width:auto}::slotted(button),::slotted(shadow-claw-page-header-action-button){flex:0 1 auto!important;min-width:fit-content!important;width:auto!important}}.header__breadcrumbs{width:100%}.header__breadcrumbs:empty{display:none}.header__status{align-items:flex-start;display:flex;flex-direction:column;gap:.5rem;width:100%}.header__status:empty{display:none}@media (min-width:40.625rem){.header__status{align-items:center;flex-direction:row;justify-content:space-between}}</style><header class="header"><div class="header__main"><div class="header__top"><h2 class="header__title">📚 Pages — Agent Skills & Skill Creator</h2><details class="header__actions-disclosure" part="actions-disclosure"><summary aria-label="Toggle page actions" class="header__actions-toggle"> Actions </summary><div class="header__actions" id="header-actions-panel" hidden><slot name="actions"></slot></div></details></div><div class="header__status"><slot name="status"></slot></div><div class="header__breadcrumbs"><slot name="breadcrumbs"></slot></div></div></header></template><nav slot="breadcrumbs" class="pages__breadcrumbs" aria-label="Toggle pages sidebar"><button type="button" class="pages__sidebar-toggle-btn" data-pages-sidebar-toggle title="Toggle pages list"> 📁 Pages </button></nav><div class="pages__status" data-pages-status>5 saved pages</div><shadow-claw-page-header-action-button class="pages__remove-all-btn" slot="actions" title="Remove all saved pages" variant="danger"> 🗑️ Remove All </shadow-claw-page-header-action-button></shadow-claw-page-header><div class="pages__content pages__content--sidebar-collapsed"><aside class="collapsed pages__sidebar" aria-label="Saved pages"><div class="pages__list" data-pages-list role="list"><details class="pages__group-details" open><summary class="pages__group-label"><span>Main</span><span class="pages__group-icon">▼</span></summary><div class="pages__group-pages"><div class="pages__list-item active"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn is-default" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/skill-creator.md"><span class="pages__list-path">~/docs/skill-creator.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/skill-creator.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/skill-creator.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open index.html"><span class="pages__list-path">index.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit index.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove index.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/publishing-to-github-pages.md"><span class="pages__list-path">~/docs/publishing-to-github-pages.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/publishing-to-github-pages.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/publishing-to-github-pages.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/example/article.html"><span class="pages__list-path">~/docs/example/article.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/example/article.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/example/article.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open MEMORY.md"><span class="pages__list-path">MEMORY.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit MEMORY.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove MEMORY.md from Pages in Main">✕</button></div></div></details></div></aside><button type="button" class="pages__nav-btn pages__nav-btn--prev" data-pages-prev aria-label="Previous page" hidden disabled><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="m15 18-6-6 6-6"/></svg></button><article class="pages__viewer" aria-label="Page preview"><div class="pages__viewer-scroll"><div class="pages__dropdown-container" data-pages-dropdown-container><details class="pages__dropdown" data-pages-dropdown><summary class="pages__dropdown-summary"><span class="pages__dropdown-selected" data-pages-dropdown-selected>~/docs/skill-creator.md</span><span class="pages__dropdown-arrow">▼</span></summary><div class="pages__dropdown-menu"><div class="pages__list" data-pages-list role="list"><details class="pages__group-details" open><summary class="pages__group-label"><span>Main</span><span class="pages__group-icon">▼</span></summary><div class="pages__group-pages"><div class="pages__list-item active"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn is-default" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/skill-creator.md"><span class="pages__list-path">~/docs/skill-creator.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/skill-creator.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/skill-creator.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open index.html"><span class="pages__list-path">index.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit index.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove index.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/publishing-to-github-pages.md"><span class="pages__list-path">~/docs/publishing-to-github-pages.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/publishing-to-github-pages.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/publishing-to-github-pages.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/example/article.html"><span class="pages__list-path">~/docs/example/article.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/example/article.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/example/article.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open MEMORY.md"><span class="pages__list-path">MEMORY.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit MEMORY.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove MEMORY.md from Pages in Main">✕</button></div></div></details></div></div></details></div><div class="pages__empty" data-pages-empty hidden> No pages yet. In Files, use "Set as Page" on a markdown or HTML file. </div><div class="pages__rendered" data-pages-rendered data-initial-path="~/docs/skill-creator.md"><section class="markdown-frontmatter" data-markdown-frontmatter="" data-frontmatter="{ "title": "Agent Skills & Skill Creator", "created": "1970-01-01T00:00:00Z", "updated": "1970-01-01T00:00:00Z", "slug": "skill-creator" }"><details class="markdown-frontmatter__details" hidden="hidden"><summary class="markdown-frontmatter__summary">Frontmatter</summary><pre class="markdown-frontmatter__pre"><code class="language-json">{
|
|
7
|
+
<template shadowrootmode="open" data-shadow-claw-dsd="true"><style data-dsd-style>*,:after,:before{box-sizing:border-box}.hidden,[hidden]{display:none!important}a{color:var(--shadow-claw-link);text-decoration:underline;text-underline-offset:.125rem}a:hover{color:var(--shadow-claw-link-hover)}.header{background-color:var(--shadow-claw-bg-secondary);border-bottom:.0625rem solid var(--shadow-claw-border-color);gap:.5rem;height:4rem;justify-content:start;max-height:4rem;padding:.5rem 1rem}.header,.header h1{align-items:center;display:flex;width:100%}.header h1{color:var(--shadow-claw-text-primary);flex-direction:row;margin:0}#menu-button{align-items:center;background:transparent;border:none;border-radius:.25rem;color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;justify-content:center;padding:.5rem}#menu-button:hover,.theme-toggle:hover{background-color:var(--shadow-claw-bg-tertiary);color:var(--shadow-claw-text-primary)}.header-actions{gap:.5rem;margin-left:auto}.header-actions,.theme-toggle{align-items:center;display:flex}.theme-toggle{background:transparent;border:none;border-radius:.25rem;color:var(--shadow-claw-text-secondary);cursor:pointer;justify-content:center;padding:.5rem}.theme-mode-toggle .sun-icon{display:none}.theme-mode-toggle .moon-icon{display:block}.theme-toggle svg{transition:transform .2s ease}.header-main-toggle{display:var(--shadow-claw-header-main-toggle-display,block)}.activity-log-toggle[aria-pressed=true],.header-main-toggle[aria-pressed=true]{box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-warning-color,#d97706) 50%,transparent);color:var(--shadow-claw-warning-color,#d97706)}.activity-log-toggle[aria-pressed=true] svg,.header-main-toggle[aria-pressed=true] svg{transform:rotate(180deg)}.webvm-toggle--booting,.webvm-toggle--ready,.webvm-toggle--visible{color:var(--shadow-claw-success-color)}.webvm-toggle--error{color:var(--shadow-claw-error-color)}.app{background-color:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary);display:flex;flex-direction:column;font-family:var(--shadow-claw-font-sans);visibility:visible;width:100%}.app-body{--sidebar-width:15.625rem;display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.sidebar{background-color:var(--shadow-claw-bg-secondary);border-right:.0625rem solid var(--shadow-claw-bg-tertiary);display:flex;flex:none;flex-direction:column;overflow-y:auto;position:relative;width:var(--sidebar-width)}.sidebar-resize-handle{background:transparent;cursor:col-resize;flex:none;outline:none;position:relative;touch-action:none;user-select:none;width:.75rem}.sidebar-resize-handle:before{background:color-mix(in srgb,var(--shadow-claw-bg-secondary) 72%,var(--shadow-claw-border-color));border:.0625rem solid color-mix(in srgb,var(--shadow-claw-border-color) 80%,transparent);height:4.25rem;transition:background-color .15s,border-color .15s,box-shadow .15s;width:.5625rem}.sidebar-resize-handle:after,.sidebar-resize-handle:before{border-radius:var(--shadow-claw-radius-pill);content:"";left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.sidebar-resize-handle:after{background:var(--shadow-claw-border-color);height:2.75rem;transition:background-color .15s;width:.1875rem}.sidebar-resize-handle.active:before,.sidebar-resize-handle:hover:before{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:color-mix(in srgb,var(--shadow-claw-accent-primary) 45%,transparent);box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-accent-primary) 18%,transparent)}.sidebar-resize-handle.active:after,.sidebar-resize-handle:hover:after{background:var(--shadow-claw-accent-primary)}.sidebar-resize-handle:focus-visible:before{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:color-mix(in srgb,var(--shadow-claw-accent-primary) 45%,transparent);box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-accent-primary) 18%,transparent)}.sidebar-resize-handle:focus-visible:after{background:var(--shadow-claw-accent-primary)}.sidebar-resize-handle:focus-visible{outline:.125rem solid color-mix(in srgb,var(--shadow-claw-accent-primary) 60%,transparent);outline-offset:.0625rem}@media (max-width:55.9375rem){.sidebar{display:none}.sidebar.open{border-radius:0 var(--shadow-claw-radius-m) var(--shadow-claw-radius-m) 0;box-shadow:var(--shadow-claw-shadow-lg);display:flex;height:calc(100vh - 4rem);height:calc(100dvh - 4rem);position:absolute;width:min(85vw,20rem);z-index:100}.sidebar-resize-handle{display:none}}@media (min-width:56rem){#menu-button{display:none}}.nav-menu{display:var(--shadow-claw-sidebar-nav-display,flex);flex:none;flex-direction:column;list-style:none;margin:0;padding:.5rem}.nav-menu:not(:has(.nav-item:not([hidden]))){display:none}slot[name=sidebar-content],slot[name=sidebar-footer],slot[name=sidebar-nav],slot[name=sidebar]{display:block}::slotted([slot=sidebar-content]),::slotted([slot=sidebar-footer]),::slotted([slot=sidebar-nav]),::slotted([slot=sidebar]){display:block}.sidebar-footer{display:var(--shadow-claw-sidebar-footer-display,block)}.sidebar-spacer{flex:1}shadow-claw-conversations{display:flex;flex:none;flex-direction:column;min-height:0;overflow:hidden}.nav-item{border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:var(--shadow-claw-font-size-sm);font-weight:500;margin-bottom:.5rem;padding:.625rem .75rem;transition:background-color .15s,color .15s}.nav-item:hover{background-color:var(--shadow-claw-text-secondary)}.nav-item.active,.nav-item:hover{color:var(--shadow-claw-on-primary)}.nav-item.active{background-color:var(--shadow-claw-accent-primary)}.sidebar-footer{border-top:.0625rem solid var(--shadow-claw-border-color);flex:none;margin-bottom:.5rem;padding:.75rem}.settings-btn{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:.8125rem;padding:.625rem .75rem;transition:all var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);width:100%}.settings-btn:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);color:var(--shadow-claw-text-primary)}.main-content{--chat-split-height:20rem;height:calc(100vh - 4rem);height:calc(100dvh - 4rem);overflow:hidden;position:relative}.main-content,.page{display:flex;flex:1;flex-direction:column;min-height:0}.page{display:none;overflow:auto}.page.active{display:flex}.chat-split-resize-handle{background:transparent;cursor:row-resize;display:none;flex:none;height:.75rem;outline:none;position:relative;touch-action:none;user-select:none;width:100%}.main-content.split-chat-active .page.active{order:1}.main-content.split-chat-active .chat-split-resize-handle{display:flex;margin-bottom:-.375rem;margin-top:-.375rem;order:2;z-index:10}.chat-split-resize-handle:before{background:color-mix(in srgb,var(--shadow-claw-bg-secondary) 72%,var(--shadow-claw-border-color));border:.0625rem solid color-mix(in srgb,var(--shadow-claw-border-color) 80%,transparent);height:.5625rem;transition:background-color .15s,border-color .15s,box-shadow .15s;width:4.25rem}.chat-split-resize-handle:after,.chat-split-resize-handle:before{border-radius:var(--shadow-claw-radius-pill);content:"";left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.chat-split-resize-handle:after{background:var(--shadow-claw-border-color);height:.1875rem;transition:background-color .15s;width:2.75rem}.chat-split-resize-handle.active:before,.chat-split-resize-handle:focus-visible:before,.chat-split-resize-handle:hover:before{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:color-mix(in srgb,var(--shadow-claw-accent-primary) 45%,transparent);box-shadow:0 0 .5rem color-mix(in srgb,var(--shadow-claw-accent-primary) 18%,transparent)}.chat-split-resize-handle.active:after,.chat-split-resize-handle:focus-visible:after,.chat-split-resize-handle:hover:after{background:var(--shadow-claw-accent-primary)}.chat-split-resize-handle:focus-visible{outline:.125rem solid color-mix(in srgb,var(--shadow-claw-accent-primary) 60%,transparent);outline-offset:.0625rem}.main-content.split-chat-active .chat-page:not(.active){border-top:.0625rem solid var(--shadow-claw-border-color);display:flex;flex:none;height:var(--chat-split-height);max-height:calc(100% - 6.25rem);min-height:9.375rem;order:3}@media (max-width:55.9375rem){.chat-split-resize-handle,.main-content.split-chat-active .chat-page:not(.active){display:none!important}}.app-dialog{background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l);box-shadow:var(--shadow-claw-shadow-lg);color:var(--shadow-claw-text-primary);max-width:min(90vw,28rem);padding:0}.app-dialog::backdrop{background:color-mix(in srgb,#000 50%,transparent)}.app-confirm-dialog__form{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:1rem}.app-dialog__title{font-size:1rem;margin:0}.app-dialog__details,.app-dialog__message{color:var(--shadow-claw-text-secondary);margin:0}.app-dialog__details{display:flex;flex-direction:column;gap:.25rem;padding-left:1rem}.app-dialog__links{display:flex;flex-wrap:wrap;gap:.5rem}.app-dialog__link{color:var(--shadow-claw-accent-primary);font-size:.9375rem;text-decoration:none}.app-dialog__link:focus-visible,.app-dialog__link:hover{text-decoration:underline}.app-dialog__countdown{color:var(--shadow-claw-text-secondary);font-size:.875rem;margin:0}.app-confirm-dialog__actions{display:flex;gap:.5rem;justify-content:flex-end}.app-dialog__btn{border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);cursor:pointer;font:inherit;padding:.5rem .75rem}.app-dialog__btn--cancel{background:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary)}.app-dialog__btn--confirm{background:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary)}.app-prompt-dialog__form{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:1rem}.app-prompt-dialog__title{font-size:1rem;margin:0}.app-prompt-dialog__message{color:var(--shadow-claw-text-secondary);margin:0}.app-prompt-dialog__input-area{display:flex;flex-direction:column;gap:.5rem;margin-top:.5rem}.app-prompt-dialog__input{background:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);font:inherit;padding:.5rem;width:100%}.app-prompt-dialog__actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.app-confirm-dialog__form:tool-form-active,.app-prompt-dialog__form:tool-form-active,form:tool-form-active{outline:2px dashed var(--shadow-claw-accent-primary,#3b82f6);outline-offset:4px}button:tool-submit-active{outline:2px dashed var(--shadow-claw-warning,#f59e0b);outline-offset:2px}.chat-page{flex-direction:column}:host([data-prerender-no-seed=true]) .nav-item,:host([data-prerender-no-seed=true]) .page.active,:host([data-prerender-no-seed=true]) .sidebar-footer,:host([data-prerender-no-seed=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true]) shadow-claw-toast{opacity:1;transform:translateY(0);transition:opacity var(--shadow-claw-duration-min) var(--shadow-claw-ease-out),transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out)}:host([data-prerender-no-seed=true][data-hydration-pending=true]) .nav-item,:host([data-prerender-no-seed=true][data-hydration-pending=true]) .page.active,:host([data-prerender-no-seed=true][data-hydration-pending=true]) .sidebar-footer,:host([data-prerender-no-seed=true][data-hydration-pending=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true][data-hydration-pending=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true][data-hydration-pending=true]) shadow-claw-toast,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .nav-item,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .page.active,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .sidebar-footer,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) shadow-claw-toast{opacity:0;pointer-events:none;transform:translateY(.25rem)}@media (prefers-reduced-motion:reduce){:host([data-prerender-no-seed=true]) .nav-item,:host([data-prerender-no-seed=true]) .page.active,:host([data-prerender-no-seed=true]) .sidebar-footer,:host([data-prerender-no-seed=true]) shadow-claw-conversations,:host([data-prerender-no-seed=true]) shadow-claw-file-viewer,:host([data-prerender-no-seed=true]) shadow-claw-toast{transform:none;transition:none}}.sidebar-boot-skeleton{background-color:var(--shadow-claw-bg-secondary);bottom:0;display:flex;flex-direction:column;left:0;opacity:0;padding:1rem .75rem;pointer-events:none;position:absolute;right:0;top:0;transition:opacity var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out),visibility var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out);visibility:hidden;z-index:10}:host([data-hydration-pending=true]) .sidebar-boot-skeleton,:host([data-js-boot-pending=true]) .sidebar-boot-skeleton{opacity:1;pointer-events:auto;visibility:visible}.skeleton-nav-wrapper{display:none;flex-direction:column;gap:.5rem;margin-bottom:.5rem}:host([data-prerender-no-seed=true]) .skeleton-nav-wrapper{display:flex}.skeleton-divider{border-top:.0625rem solid var(--shadow-claw-border-color);display:none;margin:.75rem 0}:host([data-prerender-no-seed=true]) .skeleton-divider{display:block}.skeleton-convo-wrapper{display:flex;flex-direction:column;gap:.75rem;margin-top:.5rem}.skeleton-item{animation:skeleton-pulse 1.8s ease-in-out infinite;background:linear-gradient(90deg,var(--shadow-claw-bg-secondary) 25%,var(--shadow-claw-bg-tertiary) 50%,var(--shadow-claw-bg-secondary) 75%);background-size:200% 100%}.skeleton-nav{border-radius:var(--shadow-claw-radius-m);height:2.25rem;width:100%}.skeleton-nav:first-child{width:85%}.skeleton-nav:nth-child(2){width:90%}.skeleton-nav:nth-child(3){width:75%}.skeleton-nav:nth-child(4){width:80%}.skeleton-convo{border-radius:var(--shadow-claw-radius-m);height:3.5rem;width:100%}.main-content-boot-skeleton{align-items:center;background-color:var(--shadow-claw-bg-primary);bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;opacity:0;padding:2rem;pointer-events:none;position:absolute;right:0;top:0;transition:opacity var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out),visibility var(--shadow-claw-duration-regular) var(--shadow-claw-ease-out);visibility:hidden;z-index:10}:host([data-prerender-no-seed=true][data-hydration-pending=true]) .main-content-boot-skeleton,:host([data-prerender-no-seed=true][data-js-boot-pending=true]) .main-content-boot-skeleton{opacity:1;pointer-events:auto;visibility:visible}.boot-loading-svg{height:4.5rem;opacity:.85;transition:color var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);width:4.5rem}.boot-loading-svg,.boot-loading-text{color:var(--shadow-claw-text-secondary)}.boot-loading-text{font-size:var(--shadow-claw-font-size-sm);font-weight:600;letter-spacing:.075em;margin-top:1.25rem;text-transform:uppercase}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}</style><div class="app"><header class="header"><button aria-label="Open menu" title="Open menu" id="menu-button"><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" viewBox="0 -960 960 960"><path d="M120-680v-80h720v80zm0 480v-80h720v80zm0-240v-80h720v80z"/></svg></button><h1><slot name="header-title-link"></slot><div class="header-actions"><button aria-label="Toggle theme" title="Toggle theme" class="theme-mode-toggle theme-toggle"><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" class="sun-icon" viewBox="0 -960 960 960"><path d="M480-360q50 0 85-35t35-85-35-85-85-35-85 35-35 85 35 85 85 35m0 80q-83 0-141.5-58.5T280-480t58.5-141.5T480-680t141.5 58.5T680-480t-58.5 141.5T480-280M200-440H40v-80h160zm720 0H760v-80h160zM440-760v-160h80v160zm0 720v-160h80v160zM256-650l-101-97 57-59 96 100zm492 496-97-101 53-55 101 97zm-98-550 97-101 59 57-101 97zM158-190l97-101 55 53-101 97z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" class="moon-icon" viewBox="0 -960 960 960"><path d="M480-120q-150 0-255-105T120-480t105-255 255-105q14 0 27.5 1t26.5 3q-41 29-65.5 75.5T444-660q0 90 63 153t153 63q52 0 99-24.5t75-65.5q2 13 3 26.5t1 27.5q0 150-105 255T480-120m0-80q88 0 158-48.5T740-375q-20 5-40 8t-40 3q-123 0-209.5-86.5T364-660q0-20 3-40t8-40q-74 30-122.5 100T204-480q0 116 82 198t194 82m-12-274"/></svg></button><button aria-label="Hide action header" title="Hide action header" aria-pressed="false" class="header-main-toggle theme-toggle" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" viewBox="0 -960 960 960"><path d="M280-200h400v-80H280zm200-200L280-600l56-56 104 104v-328h80v328l104-104 56 56z"/></svg></button><button aria-label="Hide activity log" title="Hide activity log" aria-pressed="false" class="activity-log-toggle theme-toggle" type="button" hidden><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 -960 960 960"><path d="M80-600v-160q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v160h-80v-160H160v160zm80 360q-33 0-56.5-23.5T80-320v-200h80v200h640v-200h80v200q0 33-23.5 56.5T800-240zM40-120v-80h880v80zm40-400v-80h240q11 0 21 6t15 16l47 93 123-215q5-9 14-14.5t20-5.5 21 5.5 15 16.5l49 98h235v80H620q-11 0-21-5.5T584-542l-26-53-123 215q-5 10-15 15t-21 5-20.5-6-14.5-16l-69-138z"/></svg></button><button aria-label="Hide WebVM terminal" title="Hide WebVM terminal" aria-pressed="true" class="theme-toggle webvm-toggle" type="button" hidden><svg xmlns="http://www.w3.org/2000/svg" width="1.5rem" height="1.5rem" fill="currentColor" viewBox="0 -960 960 960"><path d="M320-280 120-480l200-200 56 56-104 104h568v80H272l104 104zm320 0-56-56 104-104H120v-80h568L584-624l56-56 200 200z"/></svg></button><slot name="header-actions-logo"></slot></div></h1></header><div class="app-body"><aside class="sidebar"><div class="sidebar-boot-skeleton" aria-hidden="true"><div class="skeleton-nav-wrapper"><div class="skeleton-item skeleton-nav"></div><div class="skeleton-item skeleton-nav"></div><div class="skeleton-item skeleton-nav"></div><div class="skeleton-item skeleton-nav"></div></div><div class="skeleton-divider"></div><div class="skeleton-convo-wrapper"><div class="skeleton-convo skeleton-item"></div><div class="skeleton-convo skeleton-item"></div><div class="skeleton-convo skeleton-item"></div></div></div><nav><ul class="nav-menu"><li class="active nav-item" data-page="pages">📚 Pages</li><li class="nav-item" data-page="chat">💬 Chat</li><li class="nav-item" data-page="tasks"> ✓ Tasks</li><li class="nav-item" data-page="files">📁 Files</li></ul></nav><slot name="sidebar-nav"></slot><slot name="sidebar"></slot><slot name="sidebar-content"></slot><div class="sidebar-spacer"></div><shadow-claw-conversations></shadow-claw-conversations><slot name="sidebar-footer"></slot><div class="sidebar-footer"><button class="settings-btn" data-action="show-settings"> ⚙️ Settings </button></div></aside><div class="sidebar-resize-handle" title="Drag to resize sidebar"></div><main class="main-content"><div class="main-content-boot-skeleton" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" class="boot-loading-svg" viewBox="0 0 44 44"><g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-width="2"><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="0s" calcMode="spline" dur="1.8s" keySplines="0.165, 0.84, 0.44, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 20"/><animate attributeName="stroke-opacity" begin="0s" calcMode="spline" dur="1.8s" keySplines="0.3, 0.61, 0.355, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 0"/></circle><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="-0.9s" calcMode="spline" dur="1.8s" keySplines="0.165, 0.84, 0.44, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 20"/><animate attributeName="stroke-opacity" begin="-0.9s" calcMode="spline" dur="1.8s" keySplines="0.3, 0.61, 0.355, 1" keyTimes="0; 1" repeatCount="indefinite" values="1; 0"/></circle></g></svg><div class="boot-loading-text">Preparing workspace...</div></div><div class="chat-page page" data-page-id="chat"></div><div class="page" data-page-id="tasks"></div><div class="page" data-page-id="files"></div><div class="active page" data-page-id="pages"><shadow-claw-pages><template shadowrootmode="open" data-shadow-claw-pages-dsd="true"><style data-dsd-style>*{box-sizing:border-box}:host{display:block;height:calc(100dvh + 4rem);line-height:1.5}.pages{background:var(--shadow-claw-bg-primary);color:var(--shadow-claw-text-primary);flex-direction:column}.pages,.pages__content{display:flex;min-height:0;min-width:0}.pages__content{flex:1;flex-direction:column}.pages__sidebar{display:none}.pages__list{padding:.625rem}.pages__group-details,.pages__list{display:flex;flex-direction:column;gap:.375rem}.pages__group-label{align-items:center;color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;font-size:.75rem;font-weight:700;justify-content:space-between;list-style:none;margin:.25rem 0 0;padding:.125rem .25rem;text-transform:uppercase;user-select:none}.pages__group-label::-webkit-details-marker{display:none}.pages__group-icon{font-size:.625rem;transform:rotate(-90deg);transition:transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out)}.pages__group-details[open] .pages__group-icon{transform:rotate(0deg)}.pages__group-pages{display:flex;flex-direction:column;gap:.375rem}.pages__list-item{align-items:center;background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-primary);display:flex;font-size:var(--shadow-claw-font-size-sm);gap:.375rem;justify-content:space-between;line-height:1.35;padding:.375rem;width:100%}.pages__list-item:hover{border-color:var(--shadow-claw-accent-primary)}.pages__select{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;flex:1;font:inherit;min-width:0;padding:.125rem .25rem;text-align:left}.pages__list-item.active{background:color-mix(in srgb,var(--shadow-claw-accent-primary) 20%,var(--shadow-claw-bg-secondary));border-color:var(--shadow-claw-accent-primary)}.pages__list-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pages__remove{background:transparent;border:none;color:var(--shadow-claw-text-secondary);cursor:pointer;flex:none;font-size:1rem;line-height:1;padding:.125rem .25rem}.pages__remove:hover{color:var(--shadow-claw-error-color)}.pages__viewer{display:flex;flex:1;flex-direction:row;min-height:calc(100vh - 11rem);min-height:calc(100dvh - 11rem);min-width:0;overflow:hidden;position:relative}.pages__viewer-scroll{display:flex;flex:1;flex-direction:column;height:calc(100% + 1.5rem);min-width:0;padding:.75rem 1rem}.pages__rendered{max-width:72rem;padding:1rem 1.5rem 1rem 1rem}.pages__rendered :is(pre){overflow:auto}.pages__rendered img{max-height:100%;max-width:100%}.pages__rendered a{color:var(--shadow-claw-link,var(--shadow-claw-accent-primary))}.pages__rendered>h1,.pages__rendered>h2,article :is(h1,h2),article header>h1,article header>h2,article>h1,article>h2{margin-bottom:var(--shadow-claw-article-header-margin-bottom,1.5rem);margin-top:0}.pages__rendered :is(h1,h2,h3,h4){clear:both}.pages__rendered :is(h1,h2,h3,h4,h5,h6) a{color:var(--shadow-claw-text-primary,inherit);text-decoration:none}.pages__rendered :is(h1,h2,h3,h4,h5,h6) a:hover{color:var(--shadow-claw-link-hover,inherit);text-decoration:underline}.pages__iframe{background:transparent;border-width:0;display:block;height:auto;min-height:20rem;overflow:hidden;width:100%}.pages__empty,.pages__status{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm)}.pages:has(.pages__sidebar.collapsed) .pages__remove-all-btn{display:none}.pages:has(.pages__sidebar.collapsed) shadow-claw-page-header::part(actions-disclosure){display:none}.pages__dropdown-container{align-items:center;display:var(--shadow-claw-pages-dropdown-container-display,flex);gap:.5rem;margin-bottom:1rem;position:relative;width:100%}.pages__nav-btn{align-items:center;backdrop-filter:blur(6px);background:color-mix(in srgb,var(--shadow-claw-bg-secondary) 80%,transparent);border:.0625rem solid color-mix(in srgb,var(--shadow-claw-border-color) 60%,transparent);border-radius:var(--shadow-claw-radius-m);color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;flex:none;height:8rem;justify-content:center;max-height:8rem;min-height:8rem;opacity:0;padding:.75rem .5rem;pointer-events:none;position:fixed;top:50dvh;transform:translateY(-50%);transition:opacity .4s var(--shadow-claw-ease-out),color .15s var(--shadow-claw-ease-out),border-color .15s var(--shadow-claw-ease-out),background .15s var(--shadow-claw-ease-out);z-index:100}.pages__nav-btn--prev{left:.5rem}.pages__nav-btn--next{right:.5rem}.pages__content:focus-within .pages__nav-btn:not(:disabled):not([hidden]),.pages__content:has(.pages__viewer--nav-visible) .pages__nav-btn:not(:disabled):not([hidden]),.pages__nav-btn:hover:not(:disabled):not([hidden]),.pages__viewer.pages__viewer--nav-visible~.pages__nav-btn:not(:disabled):not([hidden]),.pages__viewer:focus-within~.pages__nav-btn:not(:disabled):not([hidden]){opacity:1;pointer-events:auto}.pages__nav-btn:disabled,.pages__nav-btn[hidden]{display:none!important;opacity:0!important;pointer-events:none!important}.pages__nav-btn:hover:not(:disabled){background:color-mix(in srgb,var(--shadow-claw-accent-primary) 15%,var(--shadow-claw-bg-secondary));border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-accent-primary);opacity:1}.pages__nav-btn:disabled{cursor:not-allowed}.pages__dropdown{background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);box-shadow:var(--shadow-claw-shadow-sm);color:var(--shadow-claw-text-primary);display:block;transition:border-color var(--shadow-claw-duration-min) var(--shadow-claw-ease-out);width:100%}.pages__dropdown:hover{border-color:var(--shadow-claw-accent-primary)}.pages__dropdown-summary{align-items:center;cursor:pointer;display:flex;font-size:var(--shadow-claw-font-size-sm);font-weight:600;gap:.5rem;justify-content:space-between;list-style:none;padding:.625rem 1rem;user-select:none}.pages__dropdown-summary::-webkit-details-marker{display:none}.pages__dropdown-selected{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pages__dropdown-arrow{color:var(--shadow-claw-text-secondary);font-size:.75rem;transition:transform var(--shadow-claw-duration-min) var(--shadow-claw-ease-out)}.pages__dropdown[open] .pages__dropdown-arrow{transform:rotate(180deg)}.pages__dropdown-menu{backdrop-filter:blur(10px);background:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);box-shadow:var(--shadow-claw-shadow-lg);left:0;margin-top:.375rem;max-height:20rem;overflow-y:auto;position:absolute;right:0;z-index:100}.pages__dropdown-menu .pages__list{padding:.375rem}.pages__breadcrumbs{align-items:center;display:flex;font-size:.8125rem}.pages__sidebar-toggle-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.1875rem;color:var(--shadow-claw-accent-primary);cursor:pointer;padding:.25rem .5rem;transition:all .1s}.pages__sidebar-toggle-btn:focus-visible,.pages__sidebar-toggle-btn:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);outline:none}.pages__drag-handle{color:var(--shadow-claw-text-tertiary);cursor:grab;flex:none;font-size:.875rem;line-height:1;padding:.125rem .25rem;user-select:none}.pages__drag-handle:hover{color:var(--shadow-claw-text-secondary)}.pages__drag-handle:active,.pages__list-item.dragging .pages__drag-handle{cursor:grabbing}.pages__list-item.drag-over{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem var(--shadow-claw-accent-primary)}.pages__default-btn{background:transparent;border:none;color:var(--shadow-claw-text-tertiary);cursor:pointer;flex:none;font-size:.875rem;line-height:1;padding:.125rem .25rem}.pages__default-btn.is-default,.pages__default-btn:hover{color:var(--shadow-claw-accent-primary)}.pages__edit{background:transparent;border:none;color:var(--shadow-claw-text-secondary);cursor:pointer;flex:none;font-size:.875rem;line-height:1;padding:.125rem .25rem}.pages__edit:hover{color:var(--shadow-claw-text-primary)}@media (min-width:75rem){.pages__content{display:grid;grid-template-columns:minmax(14rem,20rem) minmax(0,1fr);grid-template-rows:minmax(0,1fr)}.pages__content.pages__content--sidebar-collapsed{grid-template-columns:1fr!important}.pages__sidebar{border-right:.0625rem solid var(--shadow-claw-border-color);display:block;min-height:0;overflow:auto}.pages__sidebar.collapsed{display:none!important}.pages__dropdown{display:none}.pages__nav-btn--prev{left:20.5rem}.pages__content.pages__content--sidebar-collapsed .pages__nav-btn--prev{left:.5rem}}shadow-claw-page-header{display:var(--shadow-claw-page-header-display,block)}ul{line-height:1.5}.pages__announcer{border:0;clip:rect(0,0,0,0);height:.0625rem;margin:-.0625rem;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:.0625rem}</style><section class="pages" aria-label="Pages"><div class="pages__announcer" data-pages-announcer aria-live="polite" aria-atomic="true"></div><shadow-claw-page-header icon="📚" title="Pages"><template shadowrootmode="open" data-shadow-claw-page-header-dsd="true"><style data-dsd-style>*,:after,:before{box-sizing:border-box;font-family:var(--shadow-claw-font-sans)}.hidden,[hidden]{display:none!important}:host{display:block}.header{background-color:var(--shadow-claw-bg-primary);border-bottom:.0625rem solid var(--shadow-claw-border-color)}.header__main{display:flex;flex-direction:column;padding:.75rem}.header__main,.header__top{align-items:flex-start;gap:.75rem}.header__top{display:grid;grid-template-columns:minmax(0,1fr);width:100%}.header__title{font-size:1rem;font-weight:600;margin:0}.header__title a{color:var(--shadow-claw-link);text-decoration:none}.header__title a:hover{color:var(--shadow-claw-link-hover);text-decoration:underline}.header__actions{display:flex;flex-direction:column;gap:.375rem;padding-top:.5rem;width:100%}.header__actions[hidden]{display:none!important}.header__actions-disclosure{width:100%}.header__actions-disclosure[hidden]{display:none!important}.header__actions-toggle{align-items:center;background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m,1rem);color:var(--shadow-claw-text-secondary);cursor:pointer;display:flex;font-size:.75rem;font-weight:600;gap:.5rem;justify-content:space-between;list-style:none;min-height:2rem;padding:.375rem .625rem;user-select:none;width:100%}.header__actions-toggle::-webkit-details-marker{display:none}.header__actions-toggle:after{border-color:currentcolor transparent transparent;border-style:solid;border-width:.375rem .3125rem 0;content:"";display:inline-block;flex:none;transform:rotate(0deg);transition:transform .2s ease}.header__actions-disclosure[open] .header__actions-toggle:after{transform:rotate(180deg)}.header__actions-toggle:focus-visible,.header__actions-toggle:hover{background-color:var(--shadow-claw-bg-tertiary,#f1f5f9);border-color:var(--shadow-claw-accent-primary,#334155);color:var(--shadow-claw-text-primary,#0f172a);outline:none}::slotted(button),::slotted(shadow-claw-page-header-action-button){flex:1 1 100%!important;min-width:0!important;width:100%!important}@media (min-width:40.625rem){.header__main{padding:.875rem 1rem 1rem}.header__title{font-size:var(--shadow-claw-font-size-md)}.header__top{align-items:start;grid-template-columns:1fr auto}.header__actions{flex-direction:row;flex-wrap:wrap;gap:.5rem;justify-content:flex-end;padding-top:0;width:auto}.header__actions-toggle{display:none}.header__actions-disclosure{width:auto}::slotted(button),::slotted(shadow-claw-page-header-action-button){flex:0 1 auto!important;min-width:fit-content!important;width:auto!important}}.header__breadcrumbs{width:100%}.header__breadcrumbs:empty{display:none}.header__status{align-items:flex-start;display:flex;flex-direction:column;gap:.5rem;width:100%}.header__status:empty{display:none}@media (min-width:40.625rem){.header__status{align-items:center;flex-direction:row;justify-content:space-between}}</style><header class="header"><div class="header__main"><div class="header__top"><h2 class="header__title">📚 Pages — Agent Skills & Skill Creator</h2><details class="header__actions-disclosure" part="actions-disclosure"><summary aria-label="Toggle page actions" class="header__actions-toggle"> Actions </summary><div class="header__actions" id="header-actions-panel" hidden><slot name="actions"></slot></div></details></div><div class="header__status"><slot name="status"></slot></div><div class="header__breadcrumbs"><slot name="breadcrumbs"></slot></div></div></header></template><nav slot="breadcrumbs" class="pages__breadcrumbs" aria-label="Toggle pages sidebar"><button type="button" class="pages__sidebar-toggle-btn" data-pages-sidebar-toggle title="Toggle pages list"> 📁 Pages </button></nav><div class="pages__status" data-pages-status>5 saved pages</div><shadow-claw-page-header-action-button class="pages__remove-all-btn" slot="actions" title="Remove all saved pages" variant="danger"> 🗑️ Remove All </shadow-claw-page-header-action-button></shadow-claw-page-header><div class="pages__content pages__content--sidebar-collapsed"><aside class="collapsed pages__sidebar" aria-label="Saved pages"><div class="pages__list" data-pages-list role="list"><details class="pages__group-details" open><summary class="pages__group-label"><span>Main</span><span class="pages__group-icon">▼</span></summary><div class="pages__group-pages"><div class="pages__list-item active"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn is-default" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/skill-creator.md"><span class="pages__list-path">~/docs/skill-creator.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/skill-creator.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/skill-creator.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open index.html"><span class="pages__list-path">index.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit index.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove index.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/publishing-to-github-pages.md"><span class="pages__list-path">~/docs/publishing-to-github-pages.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/publishing-to-github-pages.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/publishing-to-github-pages.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/example/article.html"><span class="pages__list-path">~/docs/example/article.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/example/article.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/example/article.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open MEMORY.md"><span class="pages__list-path">MEMORY.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit MEMORY.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove MEMORY.md from Pages in Main">✕</button></div></div></details></div></aside><button type="button" class="pages__nav-btn pages__nav-btn--prev" data-pages-prev aria-label="Previous page" hidden disabled><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="m15 18-6-6 6-6"/></svg></button><article class="pages__viewer" aria-label="Page preview"><div class="pages__viewer-scroll"><div class="pages__dropdown-container" data-pages-dropdown-container><details class="pages__dropdown" data-pages-dropdown><summary class="pages__dropdown-summary"><span class="pages__dropdown-selected" data-pages-dropdown-selected>~/docs/skill-creator.md</span><span class="pages__dropdown-arrow">▼</span></summary><div class="pages__dropdown-menu"><div class="pages__list" data-pages-list role="list"><details class="pages__group-details" open><summary class="pages__group-label"><span>Main</span><span class="pages__group-icon">▼</span></summary><div class="pages__group-pages"><div class="pages__list-item active"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn is-default" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/skill-creator.md"><span class="pages__list-path">~/docs/skill-creator.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/skill-creator.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/skill-creator.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open index.html"><span class="pages__list-path">index.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit index.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove index.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/publishing-to-github-pages.md"><span class="pages__list-path">~/docs/publishing-to-github-pages.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/publishing-to-github-pages.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/publishing-to-github-pages.md from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open ~/docs/example/article.html"><span class="pages__list-path">~/docs/example/article.html</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit ~/docs/example/article.html in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove ~/docs/example/article.html from Pages in Main">✕</button></div><div class="pages__list-item"><span class="pages__drag-handle" draggable="true" title="Drag to reorder">⠿</span><span class="pages__default-btn" title="Default page">⭐</span><button type="button" class="pages__select" title="Open MEMORY.md"><span class="pages__list-path">MEMORY.md</span></button><button class="pages__edit" type="button" title="Edit in file editor" aria-label="Edit MEMORY.md in file editor">✏️</button><button class="pages__remove" type="button" title="Remove from Pages" aria-label="Remove MEMORY.md from Pages in Main">✕</button></div></div></details></div></div></details></div><div class="pages__empty" data-pages-empty hidden> No pages yet. In Files, use "Set as Page" on a markdown or HTML file. </div><div class="pages__rendered" data-pages-rendered data-initial-path="~/docs/skill-creator.md"><section class="markdown-frontmatter" data-markdown-frontmatter="" data-frontmatter="{ "title": "Agent Skills & Skill Creator", "created": "1970-01-01T00:00:00Z", "updated": "1970-01-01T00:00:00Z", "slug": "skill-creator" }"><details class="markdown-frontmatter__details" hidden="hidden"><summary class="markdown-frontmatter__summary">Frontmatter</summary><pre class="markdown-frontmatter__pre"><code class="language-json">{
|
|
8
8
|
"title": "Agent Skills & Skill Creator",
|
|
9
9
|
"created": "1970-01-01T00:00:00Z",
|
|
10
10
|
"updated": "1970-01-01T00:00:00Z",
|
|
@@ -42,7 +42,7 @@ metadata:
|
|
|
42
42
|
# Toast Random Number
|
|
43
43
|
|
|
44
44
|
This skill generates a random integer and displays it instantly in a toast notification.
|
|
45
|
-
</code></pre> <p>When you type <code>/toast-random-number</code>, ShadowClaw executes the two steps directly without delay!</p></div></div></article><button type="button" class="pages__nav-btn pages__nav-btn--next" data-pages-next aria-label="Next page" hidden disabled><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="m9 18 6-6-6-6"/></svg></button></div></section></template></shadow-claw-pages></div><div class="page" data-page-id="settings"></div><div class="page" data-page-id="tools"></div><div class="page" data-page-id="channels"></div><div class="chat-split-resize-handle" title="Drag to resize chat panel" hidden></div><shadow-claw-toast></shadow-claw-toast></main></div><shadow-claw-dialog dialog-class="app-dialog" dialog-aria-labelledby="appDialogTitle"><template><form method="dialog" class="app-confirm-dialog__form"><h2 id="appDialogTitle" class="app-dialog__title">Confirm</h2><p class="app-dialog__message"></p><ul class="app-dialog__details" hidden></ul><div class="app-dialog__links" hidden></div><p class="app-dialog__countdown" hidden role="status" aria-live="polite" aria-atomic="true"></p><div class="app-confirm-dialog__actions"><button type="submit" value="cancel" class="app-dialog__btn app-dialog__btn--cancel"> Cancel </button><button type="submit" value="confirm" class="app-dialog__btn app-dialog__btn--confirm"> Confirm </button></div></form></template></shadow-claw-dialog><shadow-claw-dialog dialog-class="app-dialog app-prompt-dialog" dialog-aria-labelledby="appPromptTitle"><template><form method="dialog" class="app-prompt-dialog__form"><h2 id="appPromptTitle" class="app-prompt-dialog__title"> Agent Question </h2><p class="app-prompt-dialog__message"></p><div class="app-prompt-dialog__input-area"></div><div class="app-prompt-dialog__actions"><button type="submit" value="submit" class="app-dialog__btn app-dialog__btn--confirm app-prompt-dialog__submit"> Submit </button></div></form></template></shadow-claw-dialog></div></template>
|
|
45
|
+
</code></pre> <p>When you type <code>/toast-random-number</code>, ShadowClaw executes the two steps directly without delay!</p></div></div></article><button type="button" class="pages__nav-btn pages__nav-btn--next" data-pages-next aria-label="Next page" hidden disabled><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="m9 18 6-6-6-6"/></svg></button></div></section></template></shadow-claw-pages></div><div class="page" data-page-id="settings"></div><div class="page" data-page-id="tools"></div><div class="page" data-page-id="channels"></div><div class="chat-split-resize-handle" title="Drag to resize chat panel" hidden></div><shadow-claw-toast></shadow-claw-toast></main></div><shadow-claw-dialog dialog-class="app-dialog" dialog-aria-labelledby="appDialogTitle"><template><form method="dialog" class="app-confirm-dialog__form" toolname="app_dialog_confirm" tooldescription="Confirm or cancel an application modal dialog prompt"><h2 id="appDialogTitle" class="app-dialog__title">Confirm</h2><p class="app-dialog__message"></p><ul class="app-dialog__details" hidden></ul><div class="app-dialog__links" hidden></div><p class="app-dialog__countdown" hidden role="status" aria-live="polite" aria-atomic="true"></p><div class="app-confirm-dialog__actions"><button type="submit" value="cancel" class="app-dialog__btn app-dialog__btn--cancel"> Cancel </button><button type="submit" value="confirm" class="app-dialog__btn app-dialog__btn--confirm"> Confirm </button></div></form></template></shadow-claw-dialog><shadow-claw-dialog dialog-class="app-dialog app-prompt-dialog" dialog-aria-labelledby="appPromptTitle"><template><form method="dialog" class="app-prompt-dialog__form" toolname="app_dialog_prompt" tooldescription="Submit user response or selection to an interactive dialog prompt"><h2 id="appPromptTitle" class="app-prompt-dialog__title"> Agent Question </h2><p class="app-prompt-dialog__message"></p><div class="app-prompt-dialog__input-area"></div><div class="app-prompt-dialog__actions"><button type="submit" value="submit" class="app-dialog__btn app-dialog__btn--confirm app-prompt-dialog__submit"> Submit </button></div></form></template></shadow-claw-dialog></div></template>
|
|
46
46
|
<a
|
|
47
47
|
aria-label="ShadowClaw"
|
|
48
48
|
class="header-title-link"
|
|
@@ -80,10 +80,15 @@ Registers `uponSanitizeElement` and `afterSanitizeElements` hooks with DOMPurify
|
|
|
80
80
|
Validates and executes custom element scripts safely:
|
|
81
81
|
|
|
82
82
|
- **Protocol & Host Validation:** Validates URL protocols (restricting to `http:`/`https:` or relative same-origin paths) and validates hostnames against `activeHostMatchers`. Converts URLs to Trusted Types via `toTrustedScriptUrl()`.
|
|
83
|
-
- **Script Descriptor Format:** Script entries in `customElements.scripts` support both traditional string URLs and object descriptors `{ src: string, hasInit?: boolean }` (standardized on `src`).
|
|
84
|
-
- **
|
|
83
|
+
- **Script Descriptor Format:** Script entries in `customElements.scripts` support both traditional string URLs and object descriptors `{ id?: string, name?: string, src: string, global?: boolean, autoload?: boolean, hasInit?: boolean, type?: string, async?: boolean, defer?: boolean }` (standardized on `src`).
|
|
84
|
+
- **Global & Autoload Scripts:** Descriptors with `global: true` or `autoload: true` are unconditionally resolved and injected into the `<head>` of all pre-rendered and client-side pages.
|
|
85
|
+
- **Page-Level Frontmatter Dependencies:** Markdown documents declare specific script dependencies in YAML frontmatter using `dependencies:` or `scripts:` (as arrays or comma-delimited strings), referencing scripts by `id`, `name`, filename (e.g. `x-postpress-code.js`), or filename stem (e.g. `x-postpress-code`).
|
|
86
|
+
- **Automatic Content Tag Scanning:** `resolvePageScriptDependencies` inspects page content for custom element tags (e.g. `<x-postpress-code`) and inline `<script src="...">` tags, auto-resolving them against approved descriptors so pages render with interactive web components without requiring manual frontmatter declarations.
|
|
87
|
+
- **SSR Pre-rendering & DSD Head Injection:** During SSR pre-rendering (`prerender-pretty-paths.ts`, `prerender-dsd-shell.ts`), resolved script dependencies are injected into the document `<head>`. Duplicate head checking (`headContent.includes(src)`) ensures scripts are placed in `<head>` even when inert script tags exist in Declarative Shadow DOM template bodies.
|
|
88
|
+
- **Graceful Failure & Backward Compatibility:** Legacy configurations lacking an explicit `id` resolve seamlessly via URL, filename, or stem matching. Declaring unrecognized script dependencies logs a warning and degrades gracefully without throwing errors or breaking page rendering.
|
|
89
|
+
- **Explicit `hasInit` Execution Gating:** Scripts defined with `{ src: "...", hasInit: true }` trigger an automated `import("${src}").then((m) => { if (typeof m?.init === "function") m.init(); })` within the preview iframe or after DOM injection. Standard custom elements or descriptors where `hasInit` is false/omitted are loaded without running an `init()` method, preventing unintended function executions.
|
|
85
90
|
- **Descriptors API:** The security subsystem exposes `getApprovedCustomElementScriptDescriptors(): CustomElementScriptDescriptor[]` for full descriptor access and `getApprovedCustomElementScripts(): string[]` for URL-only strings.
|
|
86
|
-
- **Single-Load Execution:** Custom element scripts execute exclusively inside sandboxed preview `<iframe>` environments (`iframe.srcdoc`) with
|
|
91
|
+
- **Single-Load Execution:** Custom element scripts execute exclusively inside sandboxed preview `<iframe>` environments (`iframe.srcdoc`) or page document heads with strict sandbox isolation, eliminating duplicate initialization and protecting the main application shell context.
|
|
87
92
|
|
|
88
93
|
### 7. Imported Artifacts & Runtime Isolation Boundary
|
|
89
94
|
|
|
@@ -115,8 +120,17 @@ Configuration can be provided declaratively or loaded dynamically:
|
|
|
115
120
|
],
|
|
116
121
|
"scripts": [
|
|
117
122
|
"https://cdn.jsdelivr.net/npm/my-chart/dist/index.js",
|
|
118
|
-
{
|
|
119
|
-
|
|
123
|
+
{
|
|
124
|
+
"id": "pwgen-adapter",
|
|
125
|
+
"src": ".agents/scripts/main/pwgen-adapter.js",
|
|
126
|
+
"hasInit": true
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"name": "x-pwgen",
|
|
130
|
+
"src": "https://kherrick.github.io/x-pwgen.js",
|
|
131
|
+
"hasInit": false,
|
|
132
|
+
"global": true
|
|
133
|
+
}
|
|
120
134
|
]
|
|
121
135
|
},
|
|
122
136
|
"security": {
|
|
@@ -73,7 +73,7 @@ The `shadow-claw-pages` web component handles rendering the UI and displaying fi
|
|
|
73
73
|
|
|
74
74
|
- **URL Sync & App Route Validation**: Selecting or reordering pages dispatches navigation events (`shadow-claw-navigate`) and updates browser URL history via `history.pushState()`, preserving active page state across refreshes. Same-origin link navigation uses `isPossibleAppRoute(pathname)` to validate internal routes against top-level valid pages (`VALID_PAGES`) and static route manifests; same-origin links pointing to non-app paths (such as external demo applications or static deployments) bypass SPA router interception and fall back to native browser navigation (`window.open`).
|
|
75
75
|
- **Root Pretty Path Resolution**: `src/storage/static-routing.ts` supports mapping root paths (`/` and `/index.html`) directly to page definitions (e.g. `/pages/main/index.html`) via `"prettyPath": "/"`, and reverse-resolves root page routes back to `"/"`.
|
|
76
|
-
- **In-Feed Scroll & Navigation Guarding**: `replaceState` navigations with state flags (`inFeedScroll: true`, `scrollSpy: true`, or `suppressRouter: true` in history
|
|
76
|
+
- **In-Feed Scroll, Sidebar Sync & Navigation Guarding**: `replaceState` navigations with state flags (`inFeedScroll: true`, `scrollSpy: true`, or `suppressRouter: true` in history, Navigation API destination state, or `navigateEvent.info`) are bypassed by the router in `getRoute` and `popstateListener`, preventing unnecessary page resets and view thrashing during scroll-driven URL synchronization. `setupSlottedSidebarActiveLinks` listens to `shadow-claw-feed-scroll`, `shadow-claw-url-change`, Navigation API `navigate`, and wraps `history.replaceState` / `pushState`. During in-feed scrolling, it inspects `ev.destination.url` (or target URL) synchronously so slotted sidebar links highlight the active article without off-by-one lags.
|
|
77
77
|
- **Ebook-Style Pagination**: Includes Previous (`[data-pages-prev]`) and Next (`[data-pages-next]`) page controls. Navigation buttons are dynamically enabled/disabled and set to `hidden` (`display: none !important`) based on current page index to avoid layout shifts.
|
|
78
78
|
- **Keyboard & Gesture Navigation**: Supports `ArrowLeft` and `ArrowRight` keyboard navigation for page turning with built-in throttling (`KEY_NAVIGATION_THROTTLE_MS = 300ms`) to prevent rapid page flipping when holding down keys, and strict focus guards to prevent interference when typing in inputs or content-editable regions. Swipe gestures are fully supported via touch and mouse drag interactions, including swipe passthrough from sandboxed iframe previews via `postMessage`.
|
|
79
79
|
- **Accessibility Announcements**: Uses an `aria-live` announcer to provide immediate screen reader feedback (`Navigated to page: [Title]`) when the active page changes.
|
|
@@ -103,7 +103,12 @@ The `shadow-claw-pages` web component handles rendering the UI and displaying fi
|
|
|
103
103
|
4. Images (`img[src]`) with relative workspace paths are fetched from OPFS via `readGroupFileBytes()`, converted to `Blob` data URLs based on their mime type, and injected back into the HTML.
|
|
104
104
|
5. Content is sanitized using `setSanitizedHtml` and a custom `DOMPurify` configuration (`previewSanitizeOptions`) that specifically allows `blob:` URIs.
|
|
105
105
|
6. **Custom Element Block Tokenizer:** `marked` is configured with a custom `tokenizer.html` rule (see `src/content/markdown.ts`) that detects standalone block-level custom element tags (any tag containing a hyphen, e.g. `<x-postpress-code>`) and forces them to be emitted as block-level HTML tokens rather than inline content. Without this rule, `marked` wraps unrecognized inline tags in `<p>` elements, which breaks light DOM slot behavior and causes custom elements to host a duplicate shadow root.
|
|
106
|
-
7.
|
|
106
|
+
7. **Script Dependency Resolution & `hasInit` Gating:**
|
|
107
|
+
- Pages declare required script dependencies in YAML frontmatter via `dependencies:` or `scripts:` (referencing approved script descriptors by `id`, `name`, filename, or stem).
|
|
108
|
+
- Global scripts (`global: true` or `autoload: true`) are automatically resolved for all pages.
|
|
109
|
+
- `resolvePageScriptDependencies` automatically scans markdown content for custom element tags (e.g. `<x-postpress-code`) and inline `<script src="...">` tags, auto-resolving them against approved `customElements.scripts` descriptors.
|
|
110
|
+
- After approved custom element scripts are loaded but before page HTML is injected into the DOM, `shadow-claw-pages` calls `init()` on any script that declares `{ hasInit: true }` in its descriptor (see [`custom-element-security.md`](custom-element-security.md#6-approved-script-loader--script-descriptors-customelementscriptdescriptor)). This ensures element definitions are fully registered before `connectedCallback` fires on first paint.
|
|
111
|
+
- Unrecognized script dependencies or legacy configs lacking an `id` fail gracefully without interrupting rendering.
|
|
107
112
|
|
|
108
113
|
#### HTML (`.html`, `.xhtml`)
|
|
109
114
|
|
|
@@ -143,6 +148,9 @@ Applications pre-rendered with Declarative Shadow DOM (DSD) shell via `src/cli/p
|
|
|
143
148
|
- **Canonical URLs & Social Cards**: Resolves absolute canonical URLs (`resolveCanonicalUrl`) based on canonical origin/basePath and updates `<link rel="canonical">`, `og:title`, `og:description`, `og:url`, `og:site_name`, `twitter:title`, and `twitter:description`.
|
|
144
149
|
- **Dynamic SPA Title Updates**: When navigating inside the browser SPA, `shadow-claw-pages` updates `document.title` to the formatted page title, restoring the base site title when on the home view.
|
|
145
150
|
- If no `routes.json` exists, pretty-path generation is skipped without failing the build.
|
|
151
|
+
- **Page Script Dependency Pre-rendering**:
|
|
152
|
+
- `prerender-pretty-paths.ts` and `prerender-dsd-shell.ts` invoke `resolvePageScriptDependencies` against approved `customElements.scripts` descriptors, inspecting each page's frontmatter declarations (`dependencies:` / `scripts:`) and body content.
|
|
153
|
+
- Resolved dependencies (and any `global: true` or `autoload: true` scripts) are dynamically injected into `<head>` with duplicate protection (`headContent.includes(src)`), ensuring web components hydrate and render without hydration flash or reliance on client-side markdown re-parsing.
|
|
146
154
|
- **Static Routing Manifest**:
|
|
147
155
|
- Embedded via `#shadow-claw-static-routing` JSON script tags or fetched via `static-routing.json` (`src/storage/static-routing.ts`), allowing client-side router (`app-routes.ts`) and pages component to resolve routes asynchronously (`resolvePrettyPathToRouteAsync`, `parseRouteFromUrlAsync`) across Node.js, Electron, and GitHub Pages.
|
|
148
156
|
- **Server Middleware Fallbacks**:
|
|
@@ -233,7 +233,6 @@ To adapt to Chrome Built-in AI's evolution and deprecation of experimental Write
|
|
|
233
233
|
- `RewriterPromptBuilder`: Formats tone/length/format transformations while preserving original meaning.
|
|
234
234
|
- `SummarizerPromptBuilder`: Formats summary types (TLDR, key points, teaser, headline), length constraints, format, or applies a custom `overridePrompt` system prompt.
|
|
235
235
|
|
|
236
|
-
|
|
237
236
|
### Agentic tools
|
|
238
237
|
|
|
239
238
|
- **`get_current_time`** — Returns the current time as an ISO 8601 string (UTC) or formatted for an IANA `timezone` (e.g. `America/New_York`) via `Intl.DateTimeFormat`; use this instead of relying on `bash`
|
|
@@ -361,7 +360,7 @@ Declarative tools are loaded from the conversation's OPFS workspace (`loadDeclar
|
|
|
361
360
|
|
|
362
361
|
Declarative tools are integrated into the application's reactive state and settings management:
|
|
363
362
|
|
|
364
|
-
- **State Management (`ToolsStore`)**: Reactively managed via `_declarativeTools` and `_declarativeToolNamesEnabled` signals. Enabled states are persisted in IndexedDB under `CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED`. When site configuration defaults (`enabledTools`) are applied during orchestrator initialization, both standard built-in tools (`setAllEnabled`) and declarative tools (`setAllDeclarativeEnabled`) are updated synchronously.
|
|
363
|
+
- **State Management (`ToolsStore`)**: Reactively managed via `_declarativeTools` and `_declarativeToolNamesEnabled` signals. Enabled states are persisted in IndexedDB under `CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED`. Declarative tools default to disabled unless explicitly enabled in configuration (`enabledTools`) or settings. When site configuration defaults (`enabledTools`) are applied during orchestrator initialization, both standard built-in tools (`setAllEnabled`) and declarative tools (`setAllDeclarativeEnabled`) are updated synchronously.
|
|
365
364
|
- **Settings UI (`<shadow-claw-tools>`)**: Displayed with dedicated `"declarative"` badges and independent enable/disable checkboxes. The tool count indicator calculates the total enabled capabilities as the sum of enabled built-in tools and enabled declarative tools. List updating uses in-place DOM diffing (`isSameStructure`) to avoid DOM reconstruction thrashed states or hover flickering.
|
|
366
365
|
- **WebMCP Integration**: Synchronized automatically via `syncWebMcpRegistration` so browser-side WebMCP callers receive both standard and active declarative tools.
|
|
367
366
|
- **Orchestrator Filtering**: Filtered dynamically in `invokeAgent` based on user settings before passing tool definitions to LLM providers.
|