Add Thesisly research reader frontend and project design skills

This commit is contained in:
2026-11-07 01:35:35 +08:00
parent e6ee10ff84
commit 9cb04ee69b
135 changed files with 17322 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
# Foundry 身份接入
复用 `/Users/zzyang/endoleap` 中已实现的 PKCE 和服务端会话模式。后端来源核对:Foundry Core 当前平台/认证源码、`internal/auth/auth.go`、`email.go`、`slack.go` 与 README 的 Browser session lifetime。
## 注册前端项目
英文品牌为 Thesisly;当前本地目录为 `/Users/zzyang/thesisly`,建议后端项目 ID 使用 `thesisly`。后端 Gitea Variables 中的 `FOUNDRY_PROJECTS` 应保留现有 JSON 条目,追加新项目:
```json
{"thesisly":"http://localhost:17322/auth/callback"}
```
这只是新增项示例,**不要用此单项覆盖全部现有项目**。前端 `.env.local` 的 `FOUNDRY_PROJECT` 必须与键完全相同,`APP_ORIGIN=http://localhost:17322`。第三方平台 Google/Slack 回调依然指向共享 Foundry 后端,不改为前端地址。后端变量的应用方式由后端维护方处理;本前端不配置CI/CD。
## 流程
1. OAuth生成随机verifier和SHA256 challenge,verifier仅存当前标签的sessionStorage;顶部导航至同源 `/api/oauth/google|slack` 再跳转Core。
2. `/auth/callback`读取 fragment 中的一次性code/error或verify_email,立即清理地址栏,再向同源代理兑换。StrictMode重复effect复用同一兑换promise,避免重复消费一次性码。
3. 代理把access_token存入本站独立名的HttpOnly、SameSite=Lax Cookie,不返回客户端;不用localStorage保存token。
4. 通过auth/me恢复刷新后的登录状态;authenticated响应的`X-Foundry-Session-Expires-In`驱动Cookie续期,最多30天,绝对90天限制由Core执行。401清Cookie,暂时502保留现有Cookie并显示重试,不假装登录已失效。
5. 退出先撤销Core会话;成功后清Cookie,失败保留会话并告知重试。
6. 代理按路径/方法白名单,限制16KiB请求体;mutation必须与配置的APP_ORIGIN严格同源,跨站请求拒绝。生产HTTPS通过APP_ORIGIN启用Secure。
## 待真实验收
后端注册项目后,需用实际账户验证Google、Slack、首次授权、邮箱注册/验证、刷新恢复、跨标签/失效状态和退出。HTTP 302、单测或模拟token测试不等于真实OAuth授权成功。测试不要求用户把密码或OAuth token发给代理。
## 2026-11-07 配置更新
用户已确认新增 Thesisly 的 FOUNDRY_PROJECTS 回调。FOUNDRY_RESEARCH_DATABASE 为已撤回的 SQLite 路径方案,无需添加。论文数据正在独立任务迁移到 PostgreSQL;本任务等待迁移后的数据库/schema与只读接入方式,再完成 Core 论文 API。
+43
View File
@@ -0,0 +1,43 @@
# 论文只读 HTTP 接口
状态:用户要求等待既有论文库从 SQLite 迁移至 PostgreSQL。此前 SQLite 实现方案已撤回,未部署;Foundry Core 的 codex/research-api 分支在迁移完成后按实际 PostgreSQL schema实现。本任务包括后端实现与联调,不把接口开发留给用户。
## 地址与配置
实际契约:GET /projects/{project}/research/papers 和 GET /projects/{project}/research/papers/{id}。上线后前端配置:
```dotenv
PAPER_API_ORIGIN=https://api.foundry.entroia.com/projects/thesisly/research/
```
未配置时显式显示20条真实数据库样本;配置后只请求远程接口,错误不会退回样本。前端不携带数据库或服务账户凭据。
## 列表
GET {PAPER_API_ORIGIN}/papers?q=&searchIn=text&topic=&sort=recent&page=1&pageSize=8
- q:最多200个Unicode字符、20个词。searchIn=text时检索标题/摘要,searchIn=author时检索显示作者名。不会把用户输入作为任意SQL或FTS操作符。
- topic:精确arxiv:category值。
- sort:recent是稳定论文ID降序,即收录顺序,**不是发表日期排序**;title使用现有title_key索引。
- page:1–1000;pageSize:1–50,前端当前为8。
- 返回{items:Paper[],total,topics,page,pageSize},同一只读事务内计数及取页;无效、重复、未知参数返回400。
## 论文
Paper包含id、title、abstract(可空)、authors字符串数组、publishedAt(保留来源格式,可空)、topics、sources(label/url/externalId),以及publications(venue/year/track/status/evidenceUrl)。可选doi、journal、comments。
source_records按paper_id关联;作者兼容[family,given,suffix]数组与字符串。会议记录通过submissions→editions→venues,状态取最新决定观察;没有决定时保持unknown,不推断拒稿。不虚构代码库、数据集、引用量、热门或AI结论。详情不存在返回404。
## 读取边界
待 PostgreSQL 迁移任务完成后,核对实际数据库/schema、字段类型、全文索引及最小只读权限,在 Foundry Core 中实现查询。不部署 SQLite sidecar,不复制整库,不从浏览器持有数据库连接串。
最多两个并行查询、8秒查询预算;繁忙返回429,超时/存储异常明确报错。作者筛选可能全库扫描,需要在真实库上验证性能。语料库是共享公开数据;账户与未来私有收藏仍须按项目隔离。
## 联调前置
- 用户手动合并后端PR;后端沿用已确认ECS runner验证与部署。
- 保留FOUNDRY_PROJECTS旧条目,追加thesisly→http://localhost:17322/auth/callback。
- 用户已确认新增 FOUNDRY_PROJECTS;无需添加 FOUNDRY_RESEARCH_DATABASE。PostgreSQL 的后端接入配置待迁移完成后确定。
- 前端仓库为Zayden-Jung/Thesisly,不配置CI/CD;本地build按用户最新要求暂不执行。
- 真实Google/Slack、邮箱验证、刷新恢复与退出需要实际浏览器授权验收;302与fixture测试不代表登录成功。
+96
View File
@@ -0,0 +1,96 @@
{
".agents/skills/beautiful-article/README.md": "85a0ef24db463dc6ecae790eb25b3697e18c67b2778e34d3a50f38eb00142b52",
".agents/skills/beautiful-article/SKILL.md": "0ca56194c1c799ce1cee785f35d108b56564720f721803f4a7a57ffe6ecc0118",
".agents/skills/beautiful-article/manifest.json": "4a77f1ef55cf5258ea49c8f445bfd8efbcdd333973a704870fe86ce40c67c9ce",
".agents/skills/beautiful-article/README.zh-CN.md": "8462ffd5fc262c2d0987be7c8aff2c75b8a072ef600ad2f3a43ef226afddfe66",
".agents/skills/ui-craft/SKILL.md": "581bce5c1772929be91ac618a91dc0452a8bd03ddbb33110cb4ec9b68203d933",
".agents/skills/ui-craft-editorial/SKILL.md": "a84de9f622aa6e235d15e08dd4e07bced6e08d8d138cbd7bf7fcd30566d2d381",
".agents/skills/ui-craft/references/stack.md": "69b7900527c9d390f5b88e2f61038e938f7fc6e8385010721a692ce680801006",
".agents/skills/ui-craft/references/recipe-auth.md": "225ca94d236824ddd91ccac910629112d71bb4e1c7f1ca653c3ea0de3b45b5b9",
".agents/skills/ui-craft/references/dashboard.md": "b1167163bb2bcee515c78db8d136d49f8ebea15cdbb4fecad86875fee9e8d687",
".agents/skills/ui-craft/references/forms.md": "bb24e7cd3492dd5e6f430110df36ea47195f4893e8237988352752d89aed977a",
".agents/skills/ui-craft/references/loops.md": "d76cc01cd1f85849d2042999575783925f3799acf33ad93e6d0974b59574d5db",
".agents/skills/ui-craft/references/dataviz.md": "b44b78e2ff035139cb13e13eb66410382d3839a78e1d13cdcbf86abd1ee83fd8",
".agents/skills/ui-craft/references/motion.md": "5da3ce5ed0d4d581bd8c46c1c3fb8357a36f3b37eaf2014255c0360677dd284c",
".agents/skills/ui-craft/references/responsive.md": "658094521d0df690436a546388fe8b0c7231c1b903f2aa386320187b5b773488",
".agents/skills/ui-craft/references/components.md": "46a895d84e848ec279c1540b87e1d8635f0a0bd7119043514a6653d4b6220898",
".agents/skills/ui-craft/references/accessibility.md": "e647d68d051d4260b8d7cf66a57b4319e0898cf5b4e19797489f3671d74de4db",
".agents/skills/ui-craft/references/recipe-landing.md": "9db79a40d1d34c82298e3c589f913864d96d2a9eac2593e46fa8ce36b2bb6c75",
".agents/skills/ui-craft/references/state-design.md": "3c1311c839cb05ab75b8d16a2b13c3d0c5f22b39ab4c3912d0dc7dde32559858",
".agents/skills/ui-craft/references/principles-catalog.md": "db6459e0d468bb5dc133f25cf76107e23e7e477a6922c00a61b9f82adb12b400",
".agents/skills/ui-craft/references/metadata.md": "fa7f36915660de20bed1d44ebd0432d053d68fc121daa2587c2b6adf37bcc0a6",
".agents/skills/ui-craft/references/color.md": "812013aba70d1a87dab83f419a78e8cad13207a05f5699f602b4c2a208566c0d",
".agents/skills/ui-craft/references/finish-bar.md": "f9f0c9795e4598c6d6af276b3d4d96b94ded2c82768149f15f3213f4dd25294d",
".agents/skills/ui-craft/references/heuristics.md": "bd90d71658e8a0472f52772b7e446a72b96000b7e6a383aa256c4427cd482257",
".agents/skills/ui-craft/references/inspiration.md": "7f2b8833e658d98a20a41ed672a9de8d2bb1649c6e15a93972162927f1e80f27",
".agents/skills/ui-craft/references/sound.md": "ef1587775b3ec062262a9641fb6378368858a50761e37361abe7b25ab8b0da25",
".agents/skills/ui-craft/references/themes.md": "9570474567c3694c140ac4c7ecf5fc9233b43804dc6a498d4e5820aaacef7ddb",
".agents/skills/ui-craft/references/personas.md": "92af0ad1c9ae1f9229760a70c6503c1c84ebd1fb48d2135b8113ff0934c6eaf1",
".agents/skills/ui-craft/references/typography.md": "f827718d0d7bb227e48ca3336b84bf3d835ea02821163ce059cdba713df530bc",
".agents/skills/ui-craft/references/coverage.md": "b4543434311a60f881825543d5a4dee4da2864745ce96e606c38f07c4f184958",
".agents/skills/ui-craft/references/copy.md": "218582b5cde8d38d4f31b5698ace6696aef34375c5d930dfe7473624de838a02",
".agents/skills/ui-craft/references/spec.md": "2c1664f1b92f5fbf0fba0fe345b84ac5942c9a88f8c028d29fe15b9bffe97e08",
".agents/skills/ui-craft/references/modern-css.md": "adc2512778a20e2b88b7bc9cf5ea2189dc5e68452b6e6367dbe6f714c17be57d",
".agents/skills/ui-craft/references/brief.md": "5ec247b71c8250f7db17279153b3f784052e0963b2fa42ea38858296534a90ce",
".agents/skills/ui-craft/references/agents.md": "0678f51fcf6ed06e171d83b3469eef8815fe818a407fce10277734b353697add",
".agents/skills/ui-craft/references/craft-intent.md": "dcd4a1e1844f53c05e26eea7cedf55c12e354b7b4e8c442e15dce9858b7f2252",
".agents/skills/ui-craft/references/review.md": "360e32f7ef7bf3aa833b4fc9284ec294d7b661407f6fc296ff0ac1530bb91763",
".agents/skills/ui-craft/references/tokens.md": "0d4de718dc0c28f60f6480532124ae9d727e6a286b70a7c4c47c4f89e6399ced",
".agents/skills/ui-craft/references/layout.md": "f92040b67d43de5e9c0152fddf7a4a53d3bc934b57618386cbab8cd3a8ce5afe",
".agents/skills/ui-craft/references/recipe-dashboard.md": "0900100bf066f80669b0e72971c4ba23bae9631e3883c129603379e4e2016d8d",
".agents/skills/ui-craft/references/ai-chat.md": "2892b19a3ab2fdfec1a6e6330b27b113af605189497de7ab588f1b592a59a06f",
".agents/skills/beautiful-article/references/article-types.md": "55570c3d1a29a31f73596a0f0b12f91f1d52dbb2b4ef0caf14d9ae7ba29ea21e",
".agents/skills/beautiful-article/references/scaffold.md": "5aabed9074c8208f818c41c1007b3ca58a9e8e06015d47aa12d594793febe9bb",
".agents/skills/beautiful-article/references/review-checklist.md": "d7be3daf1a13482bbcfe6771402c1ce50e55189b02be244797a3b25af04c7894",
".agents/skills/beautiful-article/references/source-to-markdown.md": "0a49b88724be106a175d04566a7990cd53c0b6bc2f00b889c8ef7deddf6e22bd",
".agents/skills/beautiful-article/references/raw-policy.md": "f218b85e6d5cc4edee000c79daf9dbb5d2b64559897ef9b58a02827413bdb5b6",
".agents/skills/beautiful-article/references/asset-policy.md": "f02280053f6e6506915f1428df9beb4ed7d829c61f3bf92ace0c650f247db964",
".agents/skills/beautiful-article/references/component-policy.md": "d1f9beafb73ef3b2cf8e082511aae97b775680d2b907b0e645c10beb859b43fe",
".agents/skills/beautiful-article/references/repair-policy.md": "730a766ba9d6ab3556247ddf8fa52ce0868618bb504cbd8899f4177bbd87d06f",
".agents/skills/beautiful-article/references/information-density.md": "e9c9c3cdfcbf240271bd08b62b937709ade2c895bacb6c5daec6815c264a1342",
".agents/skills/beautiful-article/references/theme-selection.md": "846ec067e96d69141532eeba04d5c7f5869ccd29f4e8af82dfac724ba328598d",
".agents/skills/beautiful-article/references/section-build.md": "fd21f86889b637d168a1eba252a68af63c5c05c1a9a49f06b6211808764d574f",
".agents/skills/beautiful-article/references/cover.md": "e828a9805afdcbba141d4ae9f519d05faebcd821fa09bd5e97e419c649add5db",
".agents/skills/beautiful-article/references/harness.md": "06663300693cd78c12b53a1f15da13785965e27edb5fd24213543ff0cfd2d004",
".agents/skills/beautiful-article/references/html-output.md": "34d02ad04ebd2130cbdab56ee2354ec03976854af71003b0b055253347b359b7",
".agents/skills/beautiful-article/references/pdf-output.md": "086aeb02c374df76b1845e827b63ffeca6f15cde3b4a2883f337c0ffd70b9a91",
".agents/skills/beautiful-article/references/layout.md": "f3f3aeacd6e7f01fafea4dc3a5278293c55ea581e1fa00c646d9f26cc963e379",
".agents/skills/beautiful-article/references/plan-template.md": "3044d628c60e8a71177f7fac8b5769bb99809d0c17ef5962d657df43b6a17643",
".agents/skills/beautiful-article/scripts/html-to-pdf.sh": "816d65186c1fe62f36de6f9915aa65cb7ee186b0960dc0d2859d94c3c6aa8c76",
".agents/skills/beautiful-article/scripts/scaffold.sh": "1a5ffec7c4d0ce0bacaa3c47f50cbd0acb03cb8efdfc66e4391e0ed9f7ec1692",
".agents/skills/beautiful-article/scripts/source-to-markdown.py": "195b9f40fde04d428731ba0402713eddb9164ee32466242c4cb14d8a395ed132",
".agents/skills/beautiful-article/scripts/pdf-print-overrides.css": "e708bfb3202c32240bae59645b8e62d26b611b495017adcdf1ad29f878e55039",
".agents/skills/beautiful-article/scripts/source-to-markdown-markitdown.py": "96b580671dd1149ec86a7fe8630c7bc8f7b4e82578ba5a5291dcdeaa8df9d60b",
".agents/skills/beautiful-article/theme-profiles/shannon.md": "5e6ed09283b58d02af7de178b51601f14bc7140863d2393a146a865405ca7afb",
".agents/skills/beautiful-article/theme-profiles/vignelli.md": "c698715aa981bbba412a2f210380ebae7cab5279abf79e0c99507d7fd06bd403",
".agents/skills/beautiful-article/theme-profiles/bayer.md": "bb279c6229cd7086fa1d59e4a96e2efec0aa429db616bfdc47c0d9d80ce6530c",
".agents/skills/beautiful-article/theme-profiles/freddie.md": "3345e111dcb953e6d8a2fa61b07c1d867b00f6aed6aa6c0d5b306a275e56a291",
".agents/skills/beautiful-article/theme-profiles/press.md": "5cd97ef28e1e4988c0c8f4796a3987f5d414eff0a0a5457c89537c8e0207ab2c",
".agents/skills/beautiful-article/theme-profiles/fuller.md": "504d8ada4c732d5af1f17a2ee7cde4cb09aa7710a3422464157361a9875e8954",
".agents/skills/beautiful-article/theme-profiles/knuth.md": "6bd396e483fbb45d77d3b3ce3fc98ab9cb2fef34039e5d9606a30d7b49d858c6",
".agents/skills/beautiful-article/theme-profiles/tufte.md": "4bed572a12b158eb496ff8ef2a992cef3ac6b0b474ae2e5547d86a8c555ca48f",
".agents/skills/beautiful-article/theme-profiles/bodoni.md": "82c64f37a6718289388abc816b6e5da8280d61ebc2cdf02762137a529d74f508",
".agents/skills/beautiful-article/theme-profiles/sottsass.md": "4df575a683a8617a9177019d15794561e2b52a5c747d52b5f25775d5a2a00d13",
".agents/skills/beautiful-article/theme-profiles/index.json": "b1a81f7876d530db3810e43c33d7441a1765f986f91dff07b8fd8941a65b8f92",
".agents/skills/beautiful-article/theme-profiles/andy.md": "cd756c9de56d56d5e36fe2748a86b3401e96d6c1c133b9b208a093ef56de90b6",
".agents/skills/beautiful-article/assets/scaffold-template/tsconfig.node.json": "6a0c11a7481d35c069b81bd115ac7b2b3890c62503b6a2306187da7c394b9d35",
".agents/skills/beautiful-article/assets/scaffold-template/index.html": "19bcaa847b022558b889c182d028bb311aec44a2ddc3f6a5e64f3f4169960244",
".agents/skills/beautiful-article/assets/scaffold-template/.npmrc": "3a951f66e7e0f3e2dd1832473a871357c4a507b51100636b73bcf6ff0dd78b6c",
".agents/skills/beautiful-article/assets/scaffold-template/package.json": "628df742e15474f9d781a11b68f028ca9cd231f6468159fc8d0e8f8fb4fe3a34",
".agents/skills/beautiful-article/assets/scaffold-template/tsconfig.json": "ca329057d3c7713f02730b987a9f3fdcae4841f7ce138efc8e1c61ad6838a2f4",
".agents/skills/beautiful-article/assets/scaffold-template/vite.config.ts": "8ace7f23452fd62a7c607e8a7f87c503e1f2717f1a6ce6d53eff3b57e63d326e",
".agents/skills/beautiful-article/assets/scaffold-template/article/main.tsx": "2bc9ba7f4ac3115069d4fb1ba151b98016c0fda9e6ae558e726b8cd47104409f",
".agents/skills/beautiful-article/assets/scaffold-template/article/Cover.tsx": "51afad6a5c2a75be834e8698264eaefb42139361b815dbb1eca856385efb7242",
".agents/skills/beautiful-article/assets/scaffold-template/article/Article.tsx": "a02f3730d2845f23f8ff0ce720a91993e36bcaf8c6d24d719261db2bd728ff0d",
".agents/skills/beautiful-article/assets/scaffold-template/article/sections/01-opening.tsx": "f00bdebacaa3a4e7b5c05158af319da728a47520bc22caa083277ee2473fdbf8",
".agents/skills/beautiful-article/references/article-types/dialogue.md": "820aeb9cf78cd3bf615920d520b95c769a726cd397c68514a2cb16d144da052a",
".agents/skills/beautiful-article/references/article-types/longform.md": "e2b1bf7f96c8e052c7fdbb6396d9fd078b5871990cf90822a828b937b3f5eab5",
".agents/skills/beautiful-article/references/article-types/briefing.md": "bbd04e897919e53fb56584dc371991306cc505156ae4b2bdc51252d7c28ef657",
".agents/skills/beautiful-article/references/article-types/full-report.md": "8789076fb521053bda6a82794c6bebd10e1db229c8d0ec39b7c3b26fc8e16390",
".agents/skills/beautiful-article/references/article-types/essay.md": "3aa0110c7e5737acc0d1f9832cdfa779fc7ac19a97a9693610698f27657f72e7",
".agents/skills/beautiful-article/references/article-types/visual-essay.md": "cd302f77c8c55f4189b7b831ff8d49befe595e18392469591b916c55ac7e6c9e",
".agents/skills/beautiful-article/references/article-types/explainer.md": "43279d5105727217e0e5470bcca0782d988ebe6fa5b8bca9cc9988ca01169bd4",
".agents/skills/beautiful-article/references/article-types/tutorial.md": "49410d9f532ca6da9b46952e5f914e044dc0628a0cd34ccf37e5d02b272c2ba3",
".agents/skills/beautiful-article/references/article-types/review.md": "9e2fd1fa4fec6f42a66e0e375748916d605d5d44a2e58e51c69249e4dad17a3c",
".agents/skills/beautiful-article/references/article-types/interactive-explainer.md": "5176ed41f04cf531a071122354ae9d5a30140229ac51d634d92abad31e37a52d"
}
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Eduardo Calvo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+14
View File
@@ -0,0 +1,14 @@
[
{
"repository": "educlopez/ui-craft",
"license": "MIT",
"path": "docs/vendor-licenses/educlopez-ui-craft-LICENSE",
"sha256": "e66dff0c36cd3903458d52771dec4d5341f55bd90ba0411e22652317e3463c89"
},
{
"repository": "ConardLi/garden-skills",
"license": "MIT",
"path": "docs/vendor-licenses/ConardLi-garden-skills-LICENSE",
"sha256": "1126322e2cc8d165adc4c792eeb195717de2bcc7b39be1ce77959d78e87ef685"
}
]