?`\n4. **GitHub 仓库**:https://github.com/tukuaiai/vim\n\n## 🎉 结论\n\n这份配置提供了:\n- ✅ 最新稳定的 Neovim 版本\n- ✅ 标准的 LazyVim 配置框架\n- ✅ 修复的所有已知问题\n- ✅ 美观实用的界面设计\n- ✅ 经过全面测试验证\n\n**确定没有任何问题和报错** - 你可以放心使用这份完美配置!\n",
"sha256": "905c3a248d5208f001f3eb6924beaf768454c70cdbc4c41cf67e906dba7ca8c0"
},
".github/tools/external/my-nvim/nvim-config/init.lua": {
"mode": "100644",
"encoding": "utf-8",
"data": "-- bootstrap lazy.nvim, LazyVim and your plugins\nrequire(\"config.lazy\")\n",
"sha256": "3b2d6e9976a515b7c8df08ed7c7f61a5751e9c08a6ff5579d621b87312c9e2c6"
},
".github/tools/external/my-nvim/nvim-config/lua/config/lazy.lua": {
"mode": "100644",
"encoding": "utf-8",
"data": "local lazypath = vim.fn.stdpath(\"data\") .. \"/lazy/lazy.nvim\"\nif not (vim.uv or vim.loop).fs_stat(lazypath) then\n local lazyrepo = \"https://github.com/folke/lazy.nvim.git\"\n local out = vim.fn.system({ \"git\", \"clone\", \"--filter=blob:none\", \"--branch=stable\", lazyrepo, lazypath })\n if vim.v.shell_error ~= 0 then\n vim.api.nvim_echo({\n { \"Failed to clone lazy.nvim:\\n\", \"ErrorMsg\" },\n { out, \"WarningMsg\" },\n { \"\\nPress any key to exit...\" },\n }, true, {})\n vim.fn.getchar()\n os.exit(1)\n end\nend\nvim.opt.rtp:prepend(lazypath)\n\nrequire(\"lazy\").setup({\n spec = {\n -- add LazyVim and import its plugins\n { \"LazyVim/LazyVim\", import = \"lazyvim.plugins\" },\n -- import/override with your plugins\n { import = \"plugins\" },\n },\n defaults = {\n -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup.\n -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default.\n lazy = false,\n -- It's recommended to leave version=false for now, since a lot the plugin that support versioning,\n -- have outdated releases, which may break your Neovim install.\n version = false, -- always use the latest git commit\n -- version = \"*\", -- try installing the latest stable version for plugins that support semver\n },\n install = { colorscheme = { \"tokyonight\", \"habamax\" } },\n checker = {\n enabled = true, -- check for plugin updates periodically\n notify = false, -- notify on update\n }, -- automatically check for plugin updates\n performance = {\n rtp = {\n -- disable some rtp plugins\n disabled_plugins = {\n \"gzip\",\n -- \"matchit\",\n -- \"matchparen\",\n -- \"netrwPlugin\",\n \"tarPlugin\",\n \"tohtml\",\n \"tutor\",\n \"zipPlugin\",\n },\n },\n },\n})\n-- 使用默认的tokyonight主题(LazyVim默认主题)\n-- 不需要手动设置,LazyVim会自动加载\n",
"sha256": "5fd03a47dc423a46b7c141149d35ba20cbbd96eb2c90f48f74dbff94c202802e"
},
".github/tools/external/MCPlayerTransfer/README.md": {
"mode": "100644",
"encoding": "utf-8",
"data": "# MC Player Transfer\n\nMinecraft 基岩版角色转移工具 - 像泰拉瑞亚一样转移角色\n\n## 项目结构\n\n```\nMCPlayerTransfer/\n├── main.py # 主入口\n├── requirements.txt # 依赖\n├── README.md\n├── src/\n│ ├── __init__.py\n│ ├── extract_player.py # 提取模块\n│ └── import_player.py # 导入模块\n├── input/ # 放入 .mcworld 文件\n└── output/ # 输出 .dat 角色文件\n```\n\n## 安装\n\n```bash\npip install -r requirements.txt\n```\n\n## 使用\n\n### 提取角色\n```bash\npython main.py extract \"input/World.mcworld\"\n```\n\n### 导入角色\n```bash\npython main.py import \"input/另一个世界.mcworld\" \"output/player.dat\"\n```\n\n## 数据说明\n\n提取的 `.dat` 文件包含角色全部数据:\n- 背包物品\n- 末影箱物品\n- 潜影盒及内容\n- 装备栏\n- 经验等级\n- 生命/饥饿值\n- 位置坐标\n\n## 注意事项\n\n- 操作前备份存档\n- 关闭游戏后操作\n",
"sha256": "f48b3081530011171ee6761115613c5eb7811a9ec3059cdec53e3b50c632f0e3"
},
".github/tools/external/MCPlayerTransfer/main.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/usr/bin/env python3\n\"\"\"\nMinecraft 基岩版角色转移工具\n\"\"\"\n\nimport sys\nimport os\n\nsys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))\n\nfrom extract_player import extract_player\nfrom import_player import import_player\n\n\ndef main():\n if len(sys.argv) < 2:\n print(\"\"\"\nMinecraft 基岩版角色转移工具\n============================\n\n用法:\n python main.py extract <.mcworld文件>\n python main.py import <.mcworld文件> <.dat角色文件>\n\n示例:\n python main.py extract \"input/World.mcworld\"\n python main.py import \"input/World.mcworld\" \"output/player.dat\"\n \"\"\")\n return\n \n cmd = sys.argv[1].lower()\n \n if cmd == 'extract':\n if len(sys.argv) < 3:\n print(\"错误: 请提供 .mcworld 文件路径\")\n return\n extract_player(sys.argv[2], \"output\")\n \n elif cmd == 'import':\n if len(sys.argv) < 4:\n print(\"错误: 请提供 .mcworld 文件和 .dat 角色文件\")\n return\n import_player(sys.argv[2], sys.argv[3])\n \n else:\n print(f\"未知命令: {cmd}\")\n\n\nif __name__ == '__main__':\n main()\n",
"sha256": "11bfdb47774247c32ad8cd0de441d56a13a17e9c12bcb3e2d9e81895958e1450"
},
".github/tools/external/XHS-image-to-PDF-conversion/README.md": {
"mode": "100644",
"encoding": "utf-8",
"data": "\n\n# 📚 小红书图文批量转 PDF\n### Batch Convert XHS Images to PDF\n\n**一个智能 Python 脚本,用于将从小红书批量下载的 ZIP 压缩包,按顺序自动拼接为清晰的 PDF 文件。**\n*A smart Python script that automatically converts ZIP archives from Xiaohongshu into well-ordered PDF files.*\n\n---\n\n[](https://opensource.org/licenses/MIT)\n[]()\n[]()\n[]()\n\n[✨ 功能特性](#-功能特性) • [⚙️ 工作流程](#️-工作流程) • [🚀 快速开始](#-快速开始) • [🗂️ 项目结构](#️-项目结构) • [🤝 参与贡献](#-参与贡献)\n\n
\n\n---\n\n## ✨ 功能特性\n\n| 特性 | 描述 |\n|:---:|:---|\n| 📦 **全自动处理** | 无需手动解压,脚本自动处理 `.zip` 压缩包。 |\n| 🔢 **智能自然排序** | 完美处理 `1, 2, ... 10, 11` 这样的文件名排序,确保图片顺序正确。 |\n| 🚀 **批量转换** | 支持一次性转换文件夹内的所有 `.zip` 文件,省时省力。 |\n| 🗑️ **自动清理** | 转换成功后,自动删除原始的 `.zip` 文件和临时文件,保持目录整洁。 |\n| 📖 **PDF 优化** | 生成的 PDF 文件经过优化,保证清晰度的同时控制文件大小。 |\n| 💻 **跨平台兼容** | 依赖的 `Pillow` 库和 Python 脚本可在 Windows, macOS, Linux 上运行。 |\n\n---\n\n## ⚙️ 工作流程\n\n\n\n| \n\n脚本的核心逻辑非常简单直接:监控并处理文件夹内的 ZIP 文件,通过一系列自动化步骤输出 PDF。\n\n### 核心步骤\n1. **扫描**: 查找当前目录下的所有 `.zip` 文件。\n2. **解压**: 将找到的 `.zip` 文件解压到临时目录。\n3. **排序**: 智能地对所有图片文件进行“自然排序”。\n4. **合并**: 将排序后的图片合并成一个 PDF 文件。\n5. **清理**: 删除原始的 `.zip` 文件和临时文件夹。\n\n | \n\n\n```mermaid\ngraph TD\n A[📁 放置 .zip 文件] --> B{运行 pdf.py 脚本};\n B --> C[🔄 解压到临时目录];\n C --> D[🔢 按文件名自然排序];\n D --> E[🖼️ 合并图片为 PDF];\n E --> F[📄 生成 output.pdf];\n F --> G[🗑️ 删除原 .zip 文件];\n G --> H[✅ 完成];\n```\n\n | \n
\n
\n\n---\n\n## 🚀 快速开始\n\n### 1. 环境准备\n\n首先,确保你的电脑上安装了 **Python 3**。\n\n然后,将本项目克隆到你的本地:\n```bash\ngit clone https://github.com/tukuaiai/XHS-image-to-PDF-conversion.git\ncd XHS-image-to-PDF-conversion\n```\n\n### 2. 安装依赖\n\n本项目依赖 `Pillow` 库来处理图片。运行以下命令安装它:\n```bash\npip install -r requirements.txt\n```\n或者,你也可以使用 `Makefile` (如果你的系统支持 `make`):\n```bash\nmake install\n```\n\n### 3. 下载图文\n\n使用你喜欢的浏览器扩展(如推荐的 **小地瓜**)从小红书下载图文,并确保它们是 `.zip` 格式。\n\n- **小地瓜 - 小红书图片视频下载助手**: [Firefox 扩展](https://addons.mozilla.org/zh-CN/firefox/addon/%E5%B0%8F%E5%9C%B0%E7%93%9C-%E5%B0%8F%E7%BA%A2%E4%B9%A6%E5%9B%BE%E7%89%87%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B/)\n\n### 4. 运行脚本\n\n\n模式一:批量处理所有 ZIP 文件 (推荐)
\n\n1. 将所有下载的 `.zip` 文件移动到本项目文件夹中。\n2. 直接运行 `pdf.bat` (Windows) 或在终端中运行以下命令:\n ```bash\n python pdf.py\n ```\n 或者使用 `make`:\n ```bash\n make run\n ```\n3. 脚本会自动处理文件夹内所有的 `.zip` 文件。\n\n \n\n\n模式二:处理单个 ZIP 文件
\n\n如果你只想处理一个文件,可以使用拖放或命令行参数:\n\n1. **拖放 (Windows)**: 将一个 `.zip` 文件直接拖到 `pdf.bat` 图标上。\n2. **命令行**:\n ```bash\n python pdf.py \"你的文件路径.zip\"\n ```\n \n\n---\n\n## 🗂️ 项目结构\n\n```\nXHS-image-to-PDF-conversion/\n├── .git/\n├── docs/ # (未来可能添加的文档)\n├── 📚...pdf # (示例文件)\n├── pdf.bat # Windows 批处理脚本\n├── pdf.py # 核心 Python 脚本\n├── Makefile # 自动化命令\n├── requirements.txt # Python 依赖\n├── README.md # 你正在阅读的这个文件\n├── LICENSE # MIT 许可证\n├── CODE_OF_CONDUCT.md # 社区行为准则\n└── CONTRIBUTING.md # 贡献指南\n```\n\n---\n\n## 🤝 参与贡献\n\n我们欢迎任何形式的贡献!无论是报告 Bug、提出功能建议还是直接贡献代码。\n\n请参考我们的 [**贡献指南 (CONTRIBUTING.md)**](CONTRIBUTING.md) 来了解如何参与。\n\n---\n\n## 📜 许可证\n\n本项目采用 [MIT](https://opensource.org/licenses/MIT) 许可证。\n\n---\n\n\n\n**如果这个项目对你有帮助,请给一个 Star ⭐!**\n\n[](https://star-history.com/#tukuaiai/XHS-image-to-PDF-conversion&Date)\n\n---\n\n**Made with 🐍 & ❤️ by tukuaiai**\n\n[⬆ 回到顶部](#-小红书图文批量转-pdf)\n\n
\n",
"sha256": "19f65c7b6afe56c57789a30d1aed3c214051474fd21ea97f1ec10cc1ec774f13"
},
".github/tools/external/XHS-image-to-PDF-conversion/pdf.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/usr/bin/env python3\n\"\"\"\n图片ZIP转PDF脚本\n将ZIP文件中的图片按序号排序并拼接成PDF文件\n\"\"\"\n\nimport zipfile\nimport os\nimport re\nfrom PIL import Image\nimport shutil\n\ndef 自然排序键(文件名):\n \"\"\"将文件名转换为自然排序键,支持数字排序\"\"\"\n return [int(text) if text.isdigit() else text.lower() for text in re.split(r'(\\d+)', 文件名)]\n\ndef zip转pdf(zip路径):\n \"\"\"\n 将ZIP文件中的图片排序后转换为PDF\n\n Args:\n zip路径: ZIP文件的完整路径\n\n Returns:\n 成功返回PDF路径,失败返回None\n \"\"\"\n try:\n # 获取ZIP文件名(不含扩展名)\n zip目录, zip文件名 = os.path.split(zip路径)\n pdf名称 = os.path.splitext(zip文件名)[0] + '.pdf'\n pdf路径 = os.path.join(zip目录, pdf名称)\n\n print(f\"正在处理: {zip文件名}\")\n\n # 创建临时目录解压文件\n 临时目录 = os.path.join(zip目录, 'temp_extract')\n if os.path.exists(临时目录):\n shutil.rmtree(临时目录)\n os.makedirs(临时目录)\n\n # 解压ZIP文件\n with zipfile.ZipFile(zip路径, 'r') as zip文件:\n zip文件.extractall(临时目录)\n\n # 获取所有图片文件\n 支持的格式 = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff', '.webp'}\n 图片文件 = []\n\n for 根目录, 目录, 文件列表 in os.walk(临时目录):\n for 文件 in 文件列表:\n if any(文件.lower().endswith(格式) for 格式 in 支持的格式):\n 完整路径 = os.path.join(根目录, 文件)\n 图片文件.append(完整路径)\n\n if not 图片文件:\n print(\"错误: ZIP文件中没有找到图片文件\")\n shutil.rmtree(临时目录)\n return None\n\n # 按文件名自然排序\n 图片文件.sort(key=lambda x: 自然排序键(os.path.basename(x)))\n\n print(f\"找到 {len(图片文件)} 张图片,开始转换...\")\n\n # 打开第一张图片作为基础\n 图片对象列表 = []\n for 图片路径 in 图片文件:\n try:\n 图片 = Image.open(图片路径)\n # 转换为RGB模式(确保兼容性)\n if 图片.mode != 'RGB':\n 图片 = 图片.convert('RGB')\n 图片对象列表.append(图片)\n except Exception as e:\n print(f\"警告: 无法打开图片 {图片路径}: {e}\")\n continue\n\n if not 图片对象列表:\n print(\"错误: 没有成功加载任何图片\")\n shutil.rmtree(临时目录)\n return None\n\n # 保存为PDF(第一张作为主图,其余附加)\n 图片对象列表[0].save(\n pdf路径,\n \"PDF\",\n quality=95,\n optimize=True,\n save_all=True,\n append_images=图片对象列表[1:]\n )\n\n # 关闭所有图片对象\n for 图片 in 图片对象列表:\n 图片.close()\n\n # 清理临时文件\n shutil.rmtree(临时目录)\n\n # 删除原ZIP文件\n os.remove(zip路径)\n\n print(f\"✓ 成功创建PDF: {pdf名称}\")\n print(f\"✓ 已删除原ZIP文件: {zip文件名}\")\n\n return pdf路径\n\n except zipfile.BadZipFile:\n print(f\"错误: {zip路径} 不是有效的ZIP文件\")\n return None\n except Exception as e:\n print(f\"处理过程中出错: {e}\")\n # 清理临时文件\n if '临时目录' in locals() and os.path.exists(临时目录):\n shutil.rmtree(临时目录)\n return None\n\ndef 批量处理当前目录():\n \"\"\"批量处理当前目录下所有ZIP文件\"\"\"\n 当前目录 = os.getcwd()\n zip文件列表 = []\n\n # 扫描当前目录所有ZIP文件\n for 文件 in os.listdir(当前目录):\n if 文件.lower().endswith('.zip'):\n zip文件列表.append(os.path.join(当前目录, 文件))\n\n if not zip文件列表:\n print(\"当前目录下没有找到ZIP文件\")\n return\n\n print(f\"发现 {len(zip文件列表)} 个ZIP文件,开始批量处理...\")\n print(\"-\" * 50)\n\n 成功计数 = 0\n 失败计数 = 0\n\n for zip路径 in zip文件列表:\n print(f\"\\n[{zip文件列表.index(zip路径) + 1}/{len(zip文件列表)}] 处理: {os.path.basename(zip路径)}\")\n\n # 执行转换\n 结果 = zip转pdf(zip路径)\n\n if 结果:\n 成功计数 += 1\n else:\n 失败计数 += 1\n\n print(\"-\" * 50)\n print(f\"批量处理完成!成功: {成功计数} 个,失败: {失败计数} 个\")\n\ndef 处理指定文件(zip路径):\n \"\"\"处理指定的单个ZIP文件\"\"\"\n if not os.path.exists(zip路径):\n print(f\"错误: 找不到文件 {zip路径}\")\n return False\n\n if not zip路径.lower().endswith('.zip'):\n print(\"错误: 请提供ZIP格式的文件\")\n return False\n\n # 执行转换\n 结果 = zip转pdf(zip路径)\n\n if 结果:\n print(f\"\\n🎉 任务完成!PDF文件已保存为: {结果}\")\n return True\n else:\n print(\"\\n❌ 任务失败,请检查错误信息\")\n return False\n\ndef 主函数():\n \"\"\"主函数:智能处理模式\"\"\"\n import sys\n\n # 优先处理指定文件(如果存在)\n 指定文件路径 = r\"C:\\Users\\lenovo\\Desktop\\新建文件夹\\剥头皮量化策略全拆解:低延迟、高频的底层.zip\"\n\n # 检查是否有命令行参数\n if len(sys.argv) > 1:\n # 命令行指定了ZIP文件路径\n zip路径 = sys.argv[1]\n print(f\"通过命令行参数指定文件: {zip路径}\")\n 处理指定文件(zip路径)\n elif os.path.exists(指定文件路径):\n # 处理默认指定文件\n print(f\"处理默认指定文件: {os.path.basename(指定文件路径)}\")\n 处理指定文件(指定文件路径)\n else:\n # 自动扫描当前目录所有ZIP文件\n print(\"开始扫描当前目录所有ZIP文件...\")\n 批量处理当前目录()\n\nif __name__ == \"__main__\":\n 主函数()",
"sha256": "ee045272a0ba361676c1ee908758e7316e96438774716c79472fb05cc5055539"
},
".github/tools/external/.tmux/LICENSE.MIT": {
"mode": "100644",
"encoding": "utf-8",
"data": "Copyright 2012— Gregory Pakosz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
"sha256": "f4c34427d3e29630cece9bca418eda48ac298867630cd6698d73e0f04642d1d0"
},
".github/tools/external/.tmux/LICENSE.WTFPLv2": {
"mode": "100644",
"encoding": "utf-8",
"data": " DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n Version 2, December 2004\n\n Copyright (C) 2004 Sam Hocevar \n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n 0. You just DO WHAT THE FUCK YOU WANT TO.\n",
"sha256": "ee820ff0db4ce628569e0975ac27dc926052a9f85d102b101edb104311ef4d90"
},
".github/tools/external/tmux/COPYING": {
"mode": "100644",
"encoding": "utf-8",
"data": "THIS IS FOR INFORMATION ONLY, CODE IS UNDER THE LICENCE AT THE TOP OF ITS FILE.\n\nThe README, CHANGES, FAQ and TODO files are licensed under the ISC license. All\nother files have a license and copyright notice at their start, typically:\n\nCopyright (c) \n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER\nIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\nOUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n",
"sha256": "c031bd37f464c534277814f6aa38686fa023d094261d57fd2545ad592bb53ccd"
},
".github/tools/external/Skill_Seekers-development/LICENSE": {
"mode": "100644",
"encoding": "utf-8",
"data": "MIT License\n\nCopyright (c) 2025 [Your Name/Username]\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
"sha256": "d131d0e96700cd78f8b3fa7ed79a47b019a0653066500faff376233246b6504d"
},
".github/tools/external/claude-official-skills/skills/skill-creator/LICENSE.txt": {
"mode": "100644",
"encoding": "utf-8",
"data": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.",
"sha256": "58d1e17ffe5109a7ae296caafcadfdbe6a7d176f0bc4ab01e12a689b0499d8bd"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/agent_client.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "\"\"\"\nUnified AI Client for Skill Seekers\n\nCentralizes all AI invocations (API and LOCAL mode) so that every enhancer\nuses a single abstraction instead of hardcoding subprocess calls or model names.\n\nSupports:\n- API mode: Anthropic, Moonshot/Kimi, Google Gemini, OpenAI (via adaptor pattern)\n- LOCAL mode: Claude Code, Kimi Code, Codex, Copilot, OpenCode, custom agents\n\nUsage:\n from skill_seekers.cli.agent_client import AgentClient\n\n client = AgentClient(mode=\"auto\")\n response = client.call(\"Analyze this code and return JSON\")\n\n # Or with explicit agent\n client = AgentClient(mode=\"local\", agent=\"kimi\")\n response = client.call(prompt, timeout=300)\n\n # Static helpers\n key, provider = AgentClient.detect_api_key()\n model = AgentClient.get_model()\n\"\"\"\n\nimport logging\nimport os\nimport shutil\nimport subprocess\nimport tempfile\nfrom pathlib import Path\n\nlogger = logging.getLogger(__name__)\n\n# Agent presets for LOCAL mode — reused from enhance_skill_local.py pattern\nAGENT_PRESETS = {\n \"claude\": {\n \"display_name\": \"Claude Code\",\n \"command\": [\"claude\", \"--dangerously-skip-permissions\", \"{prompt_file}\"],\n \"version_check\": [\"claude\", \"--version\"],\n },\n \"codex\": {\n \"display_name\": \"OpenAI Codex CLI\",\n \"command\": [\"codex\", \"exec\", \"--full-auto\", \"--skip-git-repo-check\", \"-\"],\n \"version_check\": [\"codex\", \"--version\"],\n \"uses_stdin\": True,\n },\n \"copilot\": {\n \"display_name\": \"GitHub Copilot CLI\",\n \"command\": [\"gh\", \"copilot\", \"chat\", \"-\"],\n \"version_check\": [\"gh\", \"copilot\", \"--version\"],\n \"uses_stdin\": True,\n },\n \"opencode\": {\n \"display_name\": \"OpenCode CLI\",\n \"command\": [\"opencode\"],\n \"version_check\": [\"opencode\", \"--version\"],\n },\n \"kimi\": {\n \"display_name\": \"Kimi Code CLI\",\n \"command\": [\n \"kimi\",\n \"--print\",\n \"--input-format\",\n \"text\",\n \"--work-dir\",\n \"{cwd}\",\n ],\n \"version_check\": [\"kimi\", \"--version\"],\n \"uses_stdin\": True,\n \"parse_output\": \"kimi\", # Needs special output parsing\n },\n}\n\n# Default models per API provider\nDEFAULT_MODELS = {\n \"anthropic\": \"claude-sonnet-4-20250514\",\n \"moonshot\": \"moonshot-v1-auto\",\n \"google\": \"gemini-2.0-flash\",\n \"openai\": \"gpt-4o\",\n}\n\n# API key env var → provider mapping\nAPI_KEY_MAP = {\n \"ANTHROPIC_API_KEY\": \"anthropic\",\n \"ANTHROPIC_AUTH_TOKEN\": \"anthropic\",\n \"MOONSHOT_API_KEY\": \"moonshot\",\n \"GOOGLE_API_KEY\": \"google\",\n \"OPENAI_API_KEY\": \"openai\",\n}\n\nDEFAULT_ENHANCE_TIMEOUT = 2700 # 45 minutes\nUNLIMITED_TIMEOUT = 86400 # 24 hours (subprocess requires a finite number)\n\n\ndef get_default_timeout() -> int:\n \"\"\"Return default enhancement timeout in seconds.\n\n Priority:\n 1. SKILL_SEEKER_ENHANCE_TIMEOUT environment variable\n 2. DEFAULT_ENHANCE_TIMEOUT (45 minutes)\n\n Supports 'unlimited' or 0/negative values which map to UNLIMITED_TIMEOUT (24h).\n \"\"\"\n env_val = os.environ.get(\"SKILL_SEEKER_ENHANCE_TIMEOUT\", \"\").strip().lower()\n if env_val in (\"unlimited\", \"none\", \"0\"):\n return UNLIMITED_TIMEOUT\n try:\n timeout = int(env_val)\n if timeout <= 0:\n return UNLIMITED_TIMEOUT\n return timeout\n except ValueError:\n return DEFAULT_ENHANCE_TIMEOUT\n\n\n# Provider → target platform mapping (for --target defaults)\nPROVIDER_TARGET_MAP = {\n \"anthropic\": \"claude\",\n \"moonshot\": \"kimi\",\n \"google\": \"gemini\",\n \"openai\": \"openai\",\n}\n\n\ndef normalize_agent_name(agent_name: str) -> str:\n \"\"\"Normalize agent name to canonical form.\"\"\"\n if not agent_name:\n return \"claude\"\n normalized = agent_name.strip().lower()\n aliases = {\n \"claude-code\": \"claude\",\n \"claude_code\": \"claude\",\n \"codex-cli\": \"codex\",\n \"copilot-cli\": \"copilot\",\n \"open-code\": \"opencode\",\n \"open_code\": \"opencode\",\n \"kimi-cli\": \"kimi\",\n \"kimi_code\": \"kimi\",\n \"kimi-code\": \"kimi\",\n }\n return aliases.get(normalized, normalized)\n\n\nclass AgentClient:\n \"\"\"\n Unified AI client that routes to API or LOCAL agent based on configuration.\n\n All enhancers should use this instead of direct subprocess calls or API imports.\n \"\"\"\n\n def __init__(\n self,\n mode: str = \"auto\",\n agent: str | None = None,\n api_key: str | None = None,\n ):\n \"\"\"\n Initialize the agent client.\n\n Args:\n mode: \"auto\" (detect from env), \"api\" (force API), \"local\" (force CLI agent)\n agent: LOCAL mode agent name (\"claude\", \"kimi\", \"codex\", \"copilot\", \"opencode\", \"custom\")\n Resolved from: arg → env SKILL_SEEKER_AGENT → \"claude\"\n api_key: API key override. If None, auto-detected from env vars.\n \"\"\"\n # Resolve agent name: param > ExecutionContext > env var > default\n try:\n from skill_seekers.cli.execution_context import ExecutionContext\n\n ctx = ExecutionContext.get()\n ctx_agent = ctx.enhancement.agent or \"\"\n except Exception:\n ctx_agent = \"\"\n env_agent = os.environ.get(\"SKILL_SEEKER_AGENT\", \"\").strip()\n self.agent = normalize_agent_name(agent or ctx_agent or env_agent or \"claude\")\n self.agent_display = AGENT_PRESETS.get(self.agent, {}).get(\"display_name\", self.agent)\n\n # Detect API key and provider\n if api_key:\n self.api_key = api_key\n # Detect provider from key prefix or env vars\n self.provider = self._detect_provider_from_key(api_key)\n else:\n self.api_key, self.provider = self.detect_api_key()\n\n # Determine mode (keep original for error handling decisions)\n self._requested_mode = mode\n self.mode = mode\n if mode == \"auto\":\n if self.api_key:\n self.mode = \"api\"\n else:\n self.mode = \"local\"\n\n # Initialize API client if needed\n self.client = None\n if self.mode == \"api\" and self.api_key:\n self.client = self._init_api_client()\n\n @staticmethod\n def _detect_provider_from_key(api_key: str) -> str:\n \"\"\"Detect provider from API key prefix or fall back to env var check.\"\"\"\n if api_key.startswith(\"sk-ant-\"):\n return \"anthropic\"\n if api_key.startswith(\"sk-\"):\n # Could be OpenAI or Moonshot — check env vars\n if os.environ.get(\"MOONSHOT_API_KEY\", \"\").strip() == api_key:\n return \"moonshot\"\n return \"openai\"\n if api_key.startswith(\"AIza\"):\n return \"google\"\n # Default: check which env var matches\n for env_var, provider in API_KEY_MAP.items():\n if os.environ.get(env_var, \"\").strip() == api_key:\n return provider\n return \"anthropic\" # Safe fallback\n\n def _init_api_client(self):\n \"\"\"Initialize the API client based on detected provider.\"\"\"\n try:\n if self.provider == \"anthropic\":\n import anthropic\n\n kwargs = {\"api_key\": self.api_key}\n base_url = os.environ.get(\"ANTHROPIC_BASE_URL\")\n if base_url:\n kwargs[\"base_url\"] = base_url\n return anthropic.Anthropic(**kwargs)\n elif self.provider == \"moonshot\":\n import anthropic\n\n return anthropic.Anthropic(\n api_key=self.api_key,\n base_url=\"https://api.moonshot.cn/v1\",\n )\n elif self.provider == \"openai\":\n from openai import OpenAI\n\n return OpenAI(api_key=self.api_key)\n elif self.provider == \"google\":\n import google.generativeai as genai\n\n genai.configure(api_key=self.api_key)\n return genai\n except ImportError as e:\n logger.info(f\"{self.provider} SDK not installed, falling back to LOCAL mode: {e}\")\n self.mode = \"local\"\n except Exception as e:\n if self._requested_mode == \"api\":\n raise RuntimeError(f\"Failed to initialize {self.provider} API client: {e}\") from e\n logger.error(f\"Failed to initialize {self.provider} API client: {e}\")\n self.mode = \"local\"\n return None\n\n def call(\n self,\n prompt: str,\n max_tokens: int = 4096,\n timeout: int | None = None,\n output_file: str | Path | None = None,\n cwd: str | Path | None = None,\n ) -> str | None:\n \"\"\"\n Call the AI agent (API or LOCAL mode).\n\n Args:\n prompt: The prompt to send\n max_tokens: Max response tokens (API mode only)\n timeout: Timeout in seconds (default from SKILL_SEEKER_ENHANCE_TIMEOUT or 2700 = 45m)\n output_file: Path for agent to write output (LOCAL mode, some agents)\n cwd: Working directory for LOCAL mode subprocess\n\n Returns:\n Response text, or None on failure\n \"\"\"\n if timeout is None:\n timeout = get_default_timeout()\n\n if self.mode == \"api\":\n return self._call_api(prompt, max_tokens)\n elif self.mode == \"local\":\n return self._call_local(prompt, timeout, output_file, cwd)\n return None\n\n def _call_api(self, prompt: str, max_tokens: int = 4096) -> str | None:\n \"\"\"Call via API using the detected provider.\"\"\"\n if not self.client:\n return None\n\n model = self.get_model(self.provider)\n\n try:\n if self.provider in (\"anthropic\", \"moonshot\"):\n response = self.client.messages.create(\n model=model,\n max_tokens=max_tokens,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n timeout=120,\n )\n return response.content[0].text\n\n elif self.provider == \"openai\":\n response = self.client.chat.completions.create(\n model=model,\n max_tokens=max_tokens,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n timeout=120,\n )\n return response.choices[0].message.content\n\n elif self.provider == \"google\":\n gmodel = self.client.GenerativeModel(model)\n response = gmodel.generate_content(prompt)\n return response.text\n\n except Exception as e:\n error_type = type(e).__name__\n error_module = type(e).__module__ or \"\"\n\n # Rate limit errors\n if \"rate\" in error_type.lower() or \"ratelimit\" in error_type.lower():\n logger.error(\n f\"{self.provider} API rate limited: {e}. \"\n \"Retry after waiting or reduce request frequency.\"\n )\n return None\n\n # Auth / permission errors\n if \"auth\" in error_type.lower() or \"permission\" in error_type.lower():\n logger.error(\n f\"{self.provider} API authentication failed: {e}. \"\n \"Check your API key is valid and has sufficient permissions.\"\n )\n return None\n\n # Timeout / connection errors\n if (\n any(\n kw in error_type.lower()\n for kw in (\"timeout\", \"connect\", \"connection\", \"network\")\n )\n or \"httpx\" in error_module.lower()\n ):\n logger.error(\n f\"{self.provider} API connection error: {e}. \"\n \"Check your network connectivity and try again.\"\n )\n return None\n\n # All other errors\n logger.error(f\"{self.provider} API call failed: {e}\")\n return None\n\n def _call_local(\n self,\n prompt: str,\n timeout: int | None = None,\n output_file: str | Path | None = None,\n cwd: str | Path | None = None,\n ) -> str | None:\n \"\"\"Call via LOCAL CLI agent using agent presets.\"\"\"\n if timeout is None:\n timeout = get_default_timeout()\n # Handle custom agent from env var\n if self.agent == \"custom\":\n custom_cmd = os.environ.get(\"SKILL_SEEKER_AGENT_CMD\", \"\").strip()\n if not custom_cmd:\n logger.warning(\"⚠️ Custom agent selected but SKILL_SEEKER_AGENT_CMD not set\")\n return None\n preset = {\n \"display_name\": \"Custom Agent\",\n \"command\": custom_cmd.split(),\n \"version_check\": custom_cmd.split()[:1] + [\"--version\"],\n }\n else:\n preset = AGENT_PRESETS.get(self.agent)\n if not preset:\n logger.warning(f\"⚠️ Unknown agent: {self.agent}\")\n return None\n\n try:\n with tempfile.TemporaryDirectory(prefix=\"agent_client_\") as temp_dir:\n temp_path = Path(temp_dir)\n prompt_file = temp_path / \"prompt.md\"\n resp_file = Path(output_file) if output_file else (temp_path / \"response.json\")\n\n # Only append output file instruction when caller explicitly requests it\n full_prompt = prompt\n if output_file:\n full_prompt += f\"\\n\\nWrite your response to: {resp_file}\\n\"\n\n prompt_file.write_text(full_prompt)\n\n # Build command from preset\n cmd = []\n for part in preset[\"command\"]:\n part = part.replace(\"{prompt_file}\", str(prompt_file))\n part = part.replace(\"{cwd}\", str(cwd or temp_path))\n part = part.replace(\"{skill_dir}\", str(cwd or temp_path))\n cmd.append(part)\n\n # Execute — pipe stdin for agents that read from it (e.g., codex)\n stdin_input = full_prompt if preset.get(\"uses_stdin\") else None\n result = subprocess.run(\n cmd,\n capture_output=True,\n text=True,\n timeout=timeout,\n cwd=str(cwd or temp_path),\n input=stdin_input,\n )\n\n if result.returncode != 0:\n logger.error(f\"{self.agent_display} returned error code {result.returncode}\")\n if result.stderr and result.stderr.strip():\n logger.error(f\"{self.agent_display} stderr: {result.stderr.strip()}\")\n\n # Try to read output file first\n resp_path = Path(resp_file)\n if resp_path.exists():\n return resp_path.read_text(encoding=\"utf-8\")\n\n # Try any JSON file in temp dir\n for json_file in temp_path.glob(\"*.json\"):\n if json_file.name != \"prompt.json\":\n return json_file.read_text(encoding=\"utf-8\")\n\n # Fall back to stdout (with agent-specific parsing)\n if result.stdout and result.stdout.strip():\n stdout = result.stdout.strip()\n parser = preset.get(\"parse_output\")\n if parser == \"kimi\":\n stdout = self._parse_kimi_output(stdout)\n return stdout\n\n logger.warning(f\"⚠️ No output from {self.agent_display}\")\n return None\n\n except subprocess.TimeoutExpired:\n logger.warning(f\"⚠️ {self.agent_display} timeout ({timeout}s)\")\n return None\n except FileNotFoundError:\n logger.warning(\n f\"⚠️ {self.agent_display} CLI not found. \"\n f\"Install it or set SKILL_SEEKER_AGENT to a different agent.\"\n )\n return None\n except Exception as e:\n logger.error(f\"{self.agent_display} error: {e}\")\n return None\n\n @staticmethod\n def _parse_kimi_output(raw_output: str) -> str:\n \"\"\"Parse Kimi CLI --print mode output to extract text content.\n\n Kimi's --print mode outputs structured lines like:\n TurnBegin(...)\n StepBegin(...)\n TextPart(type='text', text='actual content')\n ThinkPart(type='think', think='...')\n\n This extracts the text= values from TextPart lines.\n \"\"\"\n import re\n\n text_parts = re.findall(r\"TextPart\\(type='text', text='(.+?)'\\)\", raw_output)\n if text_parts:\n return \"\\n\".join(text_parts)\n # Fallback: return raw if no TextPart found\n return raw_output\n\n def is_available(self) -> bool:\n \"\"\"Check if the configured agent/API is available.\"\"\"\n if self.mode == \"api\":\n return self.client is not None\n\n # LOCAL mode: check if CLI exists\n preset = AGENT_PRESETS.get(self.agent)\n if not preset:\n return False\n\n version_cmd = preset.get(\"version_check\")\n if not version_cmd:\n return shutil.which(preset[\"command\"][0]) is not None\n\n try:\n result = subprocess.run(\n version_cmd,\n capture_output=True,\n text=True,\n timeout=5,\n )\n return result.returncode == 0\n except (FileNotFoundError, subprocess.TimeoutExpired):\n return False\n\n @staticmethod\n def detect_api_key() -> tuple[str | None, str | None]:\n \"\"\"\n Detect API key from environment variables.\n\n Returns:\n (api_key, provider) tuple. Provider is \"anthropic\", \"moonshot\", \"google\", or \"openai\".\n Returns (None, None) if no key found.\n \"\"\"\n for env_var, provider in API_KEY_MAP.items():\n key = os.environ.get(env_var, \"\").strip()\n if key:\n return key, provider\n return None, None\n\n @staticmethod\n def get_model(provider: str = \"anthropic\") -> str:\n \"\"\"\n Get the model name for a provider.\n\n Checks SKILL_SEEKER_MODEL env var first, then provider-specific env vars,\n then falls back to defaults.\n \"\"\"\n # Global override\n global_model = os.environ.get(\"SKILL_SEEKER_MODEL\", \"\").strip()\n if global_model:\n return global_model\n\n # Provider-specific env vars\n provider_env_map = {\n \"anthropic\": \"ANTHROPIC_MODEL\",\n \"moonshot\": \"MOONSHOT_MODEL\",\n \"google\": \"GOOGLE_MODEL\",\n \"openai\": \"OPENAI_MODEL\",\n }\n env_var = provider_env_map.get(provider)\n if env_var:\n model = os.environ.get(env_var, \"\").strip()\n if model:\n return model\n\n return DEFAULT_MODELS.get(provider, \"claude-sonnet-4-20250514\")\n\n @staticmethod\n def detect_default_target() -> str:\n \"\"\"\n Auto-detect the default --target platform from available API keys.\n\n Returns platform name: \"claude\", \"kimi\", \"gemini\", \"openai\", or \"markdown\" (fallback).\n \"\"\"\n _, provider = AgentClient.detect_api_key()\n if provider:\n return PROVIDER_TARGET_MAP.get(provider, \"markdown\")\n return \"markdown\"\n\n def log_mode(self) -> None:\n \"\"\"Log the current mode and agent for UX.\"\"\"\n if self.mode == \"api\":\n logger.info(f\"✅ AI enhancement enabled (using {self.provider} API)\")\n elif self.mode == \"local\":\n logger.info(f\"✅ AI enhancement enabled (using LOCAL mode - {self.agent_display})\")\n else:\n logger.info(\"ℹ️ AI enhancement disabled\")\n",
"sha256": "2fff7e6de630b6c8871db3419661195125c6128ac71d4d76f04e7561f7bdac17"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/install_skill.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/usr/bin/env python3\n\"\"\"\nComplete Skill Installation Workflow\nOne-command installation: fetch → scrape → enhance → package → upload\n\nThis CLI tool orchestrates the complete skill installation workflow by calling\nthe install_skill MCP tool.\n\nUsage:\n skill-seekers install --config react\n skill-seekers install --config configs/custom.json --no-upload\n skill-seekers install --config django --unlimited\n skill-seekers install --config react --dry-run\n\nExamples:\n # Install React skill from official configs\n skill-seekers install --config react\n\n # Install from local config file\n skill-seekers install --config configs/custom.json\n\n # Install without uploading\n skill-seekers install --config django --no-upload\n\n # Preview workflow without executing\n skill-seekers install --config react --dry-run\n\"\"\"\n\nimport argparse\nimport asyncio\nimport sys\n\n# Import the MCP tool function (with lazy loading)\ntry:\n from skill_seekers.mcp.server import install_skill_tool\n\n MCP_AVAILABLE = True\nexcept ImportError:\n MCP_AVAILABLE = False\n install_skill_tool = None\n\n\ndef main():\n \"\"\"Main entry point for CLI\"\"\"\n # Check MCP availability first\n if not MCP_AVAILABLE:\n print(\"\\n❌ Error: MCP package not installed\")\n print(\"\\nThe 'install' command requires MCP support.\")\n print(\"Install with:\")\n print(\" pip install skill-seekers[mcp]\")\n print(\"\\nOr use these alternatives:\")\n print(\" skill-seekers scrape --config react\")\n print(\" skill-seekers package output/react/\")\n print()\n sys.exit(1)\n\n parser = argparse.ArgumentParser(\n description=\"Complete skill installation workflow (fetch → scrape → enhance → package → upload)\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nExamples:\n # Install React skill from official API\n skill-seekers install --config react\n\n # Install from local config file\n skill-seekers install --config configs/custom.json\n\n # Install without uploading\n skill-seekers install --config django --no-upload\n\n # Unlimited scraping (no page limits)\n skill-seekers install --config godot --unlimited\n\n # Preview workflow (dry run)\n skill-seekers install --config react --dry-run\n\n # Install for Gemini instead of default platform\n skill-seekers install --config react --target gemini\n\n # Install for OpenAI ChatGPT\n skill-seekers install --config fastapi --target openai\n\nImportant:\n - Enhancement is MANDATORY (30-60 sec) for quality (3/10→9/10)\n - Total time: 20-45 minutes (mostly scraping)\n - Multi-platform support: claude (default), gemini, openai, markdown\n - Auto-uploads if API key is set (ANTHROPIC_API_KEY, GOOGLE_API_KEY, or OPENAI_API_KEY)\n\nPhases:\n 1. Fetch config (if config name provided)\n 2. Scrape documentation\n 3. AI Enhancement (MANDATORY - no skip option)\n 4. Package for target platform (ZIP or tar.gz)\n 5. Upload to target platform (optional)\n\"\"\",\n )\n\n parser.add_argument(\n \"--config\",\n required=True,\n help=\"Config name (e.g., 'react') or path (e.g., 'configs/custom.json')\",\n )\n\n parser.add_argument(\n \"--destination\",\n default=\"output\",\n help=\"Output directory for skill files (default: output/)\",\n )\n\n parser.add_argument(\n \"--no-upload\", action=\"store_true\", help=\"Skip automatic upload to target platform\"\n )\n\n parser.add_argument(\n \"--unlimited\",\n action=\"store_true\",\n help=\"Remove page limits during scraping (WARNING: Can take hours)\",\n )\n\n parser.add_argument(\"--dry-run\", action=\"store_true\", help=\"Preview workflow without executing\")\n\n parser.add_argument(\n \"--target\",\n choices=[\"claude\", \"gemini\", \"openai\", \"kimi\", \"markdown\"],\n default=None,\n help=\"Target LLM platform (auto-detected from API keys, or 'claude' if none set)\",\n )\n\n args = parser.parse_args()\n\n # Auto-detect target platform if not specified\n if args.target is None:\n from skill_seekers.cli.agent_client import AgentClient\n\n args.target = AgentClient.detect_default_target()\n\n # Determine if config is a name or path\n config_arg = args.config\n if config_arg.endswith(\".json\") or \"/\" in config_arg or \"\\\\\" in config_arg:\n # It's a path\n config_path = config_arg\n config_name = None\n else:\n # It's a name\n config_name = config_arg\n config_path = None\n\n # Build arguments for install_skill_tool\n tool_args = {\n \"config_name\": config_name,\n \"config_path\": config_path,\n \"destination\": args.destination,\n \"auto_upload\": not args.no_upload,\n \"unlimited\": args.unlimited,\n \"dry_run\": args.dry_run,\n \"target\": args.target,\n }\n\n # Run async tool\n try:\n result = asyncio.run(install_skill_tool(tool_args))\n\n # Print output\n for content in result:\n print(content.text)\n\n # Return success/failure based on output\n output_text = result[0].text\n if \"❌\" in output_text and \"WORKFLOW COMPLETE\" not in output_text:\n return 1\n return 0\n\n except KeyboardInterrupt:\n print(\"\\n\\n⚠️ Workflow interrupted by user\")\n return 130 # Standard exit code for SIGINT\n except Exception as e:\n print(f\"\\n\\n❌ Unexpected error: {str(e)}\")\n return 1\n\n\nif __name__ == \"__main__\":\n sys.exit(main())\n",
"sha256": "146be443d3b73b1e5c706b105fd0780831275baa6d0d61424b3c10d03dfa79aa"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/upload_skill.py": {
"mode": "100755",
"encoding": "utf-8",
"data": "#!/usr/bin/env python3\n\"\"\"\nAutomatic Skill Uploader\nUploads a skill package to LLM platforms (Claude, Gemini, OpenAI, etc.)\n\nUsage:\n # Anthropic (default)\n export ANTHROPIC_API_KEY=sk-ant-...\n skill-seekers upload output/react.zip\n\n # Gemini\n export GOOGLE_API_KEY=AIzaSy...\n skill-seekers upload output/react-gemini.tar.gz --target gemini\n\n # OpenAI\n export OPENAI_API_KEY=sk-proj-...\n skill-seekers upload output/react-openai.zip --target openai\n\"\"\"\n\nimport argparse\nimport os\nimport sys\nfrom pathlib import Path\n\n# Import utilities\ntry:\n from utils import print_upload_instructions\nexcept ImportError:\n sys.path.insert(0, str(Path(__file__).parent))\n from utils import print_upload_instructions\n\n\ndef upload_skill_api(package_path, target=\"claude\", api_key=None, **kwargs):\n \"\"\"\n Upload skill package to LLM platform\n\n Args:\n package_path: Path to skill package file\n target: Target platform ('claude', 'gemini', 'openai', 'chroma', 'weaviate')\n api_key: Optional API key (otherwise read from environment)\n **kwargs: Platform-specific upload options\n\n Returns:\n tuple: (success, message)\n \"\"\"\n try:\n from skill_seekers.cli.adaptors import get_adaptor\n except ImportError:\n return False, \"Adaptor system not available. Reinstall skill-seekers.\"\n\n # Get platform-specific adaptor\n try:\n adaptor = get_adaptor(target)\n except ValueError as e:\n return False, str(e)\n\n # Get API key\n if not api_key:\n api_key = os.environ.get(adaptor.get_env_var_name(), \"\").strip()\n\n # API key validation only for platforms that require it\n if target in [\"claude\", \"gemini\", \"openai\"]:\n if not api_key:\n return False, f\"{adaptor.get_env_var_name()} not set. Export your API key first.\"\n\n # Validate API key format\n if not adaptor.validate_api_key(api_key):\n return False, f\"Invalid API key format for {adaptor.PLATFORM_NAME}\"\n\n package_path = Path(package_path)\n\n # Basic file validation\n if not package_path.exists():\n return False, f\"File not found: {package_path}\"\n\n skill_name = package_path.stem\n\n print(f\"📤 Uploading skill: {skill_name}\")\n print(f\" Target: {adaptor.PLATFORM_NAME}\")\n print(f\" Source: {package_path}\")\n print(f\" Size: {package_path.stat().st_size:,} bytes\")\n print()\n\n # Upload using adaptor\n print(f\"⏳ Uploading to {adaptor.PLATFORM_NAME}...\")\n\n try:\n result = adaptor.upload(package_path, api_key, **kwargs)\n\n if result[\"success\"]:\n print()\n print(f\"✅ {result['message']}\")\n print()\n if result.get(\"url\"):\n print(\"Your skill is now available at:\")\n print(f\" {result['url']}\")\n if result.get(\"skill_id\"):\n print(f\" Skill ID: {result['skill_id']}\")\n if result.get(\"collection\"):\n print(f\" Collection: {result['collection']}\")\n if result.get(\"class_name\"):\n print(f\" Class: {result['class_name']}\")\n if result.get(\"count\"):\n print(f\" Documents uploaded: {result['count']}\")\n print()\n return True, \"Upload successful\"\n else:\n return False, result[\"message\"]\n\n except Exception as e:\n return False, f\"Unexpected error: {str(e)}\"\n\n\ndef main():\n parser = argparse.ArgumentParser(\n description=\"Upload a skill package to LLM platforms and vector databases\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nSetup:\n Anthropic (Claude):\n export ANTHROPIC_API_KEY=sk-ant-...\n\n Gemini:\n export GOOGLE_API_KEY=AIzaSy...\n\n OpenAI:\n export OPENAI_API_KEY=sk-proj-...\n\n ChromaDB (local):\n # No API key needed for local instance\n chroma run # Start server\n\n Weaviate (local):\n # No API key needed for local instance\n docker run -p 8080:8080 semitechnologies/weaviate:latest\n\nExamples:\n # Upload to default platform\n skill-seekers upload output/react.zip\n\n # Upload to Gemini\n skill-seekers upload output/react-gemini.tar.gz --target gemini\n\n # Upload to OpenAI\n skill-seekers upload output/react-openai.zip --target openai\n\n # Upload to ChromaDB (local)\n skill-seekers upload output/react-chroma.json --target chroma\n\n # Upload to ChromaDB with OpenAI embeddings\n skill-seekers upload output/react-chroma.json --target chroma --embedding-function openai\n\n # Upload to Weaviate (local)\n skill-seekers upload output/react-weaviate.json --target weaviate\n\n # Upload to Weaviate Cloud\n skill-seekers upload output/react-weaviate.json --target weaviate --use-cloud --cluster-url https://xxx.weaviate.network --api-key YOUR_KEY\n \"\"\",\n )\n\n parser.add_argument(\"package_file\", help=\"Path to skill package file (e.g., output/react.zip)\")\n\n parser.add_argument(\n \"--target\",\n choices=[\"claude\", \"gemini\", \"openai\", \"kimi\", \"chroma\", \"weaviate\"],\n default=None,\n help=\"Target platform (auto-detected from API keys, or 'claude' if none set)\",\n )\n\n parser.add_argument(\"--api-key\", help=\"Platform API key (or set environment variable)\")\n\n # ChromaDB upload options\n parser.add_argument(\n \"--chroma-url\",\n help=\"ChromaDB URL (default: http://localhost:8000 for HTTP, or use --persist-directory for local)\",\n )\n\n parser.add_argument(\n \"--persist-directory\",\n help=\"Local directory for persistent ChromaDB storage (default: ./chroma_db)\",\n )\n\n parser.add_argument(\n \"--embedding-function\",\n choices=[\"openai\", \"sentence-transformers\", \"none\"],\n help=\"Embedding function for ChromaDB/Weaviate (default: platform default)\",\n )\n\n parser.add_argument(\n \"--openai-api-key\", help=\"OpenAI API key for embeddings (or set OPENAI_API_KEY env var)\"\n )\n\n # Weaviate upload options\n parser.add_argument(\n \"--weaviate-url\",\n default=\"http://localhost:8080\",\n help=\"Weaviate URL (default: http://localhost:8080)\",\n )\n\n parser.add_argument(\n \"--use-cloud\",\n action=\"store_true\",\n help=\"Use Weaviate Cloud (requires --api-key and --cluster-url)\",\n )\n\n parser.add_argument(\n \"--cluster-url\", help=\"Weaviate Cloud cluster URL (e.g., https://xxx.weaviate.network)\"\n )\n\n args = parser.parse_args()\n\n # Auto-detect target platform if not specified\n if args.target is None:\n from skill_seekers.cli.agent_client import AgentClient\n\n args.target = AgentClient.detect_default_target()\n\n # Build kwargs for vector DB upload\n upload_kwargs = {}\n\n if args.target == \"chroma\":\n if args.chroma_url:\n upload_kwargs[\"chroma_url\"] = args.chroma_url\n if args.persist_directory:\n upload_kwargs[\"persist_directory\"] = args.persist_directory\n if args.embedding_function:\n upload_kwargs[\"embedding_function\"] = args.embedding_function\n if args.openai_api_key:\n upload_kwargs[\"openai_api_key\"] = args.openai_api_key\n\n elif args.target == \"weaviate\":\n upload_kwargs[\"weaviate_url\"] = args.weaviate_url\n upload_kwargs[\"use_cloud\"] = args.use_cloud\n if args.cluster_url:\n upload_kwargs[\"cluster_url\"] = args.cluster_url\n if args.embedding_function:\n upload_kwargs[\"embedding_function\"] = args.embedding_function\n if args.openai_api_key:\n upload_kwargs[\"openai_api_key\"] = args.openai_api_key\n\n # Upload skill\n success, message = upload_skill_api(\n args.package_file, args.target, args.api_key, **upload_kwargs\n )\n\n if success:\n sys.exit(0)\n else:\n print(f\"\\n❌ Upload failed: {message}\")\n print()\n print(\"📝 Manual upload instructions:\")\n print_upload_instructions(args.package_file)\n sys.exit(1)\n\n\nif __name__ == \"__main__\":\n main()\n",
"sha256": "2967da60c32c2495ea993f9122c6472d76ab86d3bcae878831fbeb07c55b0d1e"
},
".github/tools/external/claude-official-skills/skills/skill-creator/SKILL.md": {
"mode": "100644",
"encoding": "utf-8",
"data": "---\nname: skill-creator\ndescription: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.\nlicense: Complete terms in LICENSE.txt\n---\n\n# Skill Creator\n\nThis skill provides guidance for creating effective skills.\n\n## About Skills\n\nSkills are modular, self-contained packages that extend Claude's capabilities by providing\nspecialized knowledge, workflows, and tools. Think of them as \"onboarding guides\" for specific\ndomains or tasks—they transform Claude from a general-purpose agent into a specialized agent\nequipped with procedural knowledge that no model can fully possess.\n\n### What Skills Provide\n\n1. Specialized workflows - Multi-step procedures for specific domains\n2. Tool integrations - Instructions for working with specific file formats or APIs\n3. Domain expertise - Company-specific knowledge, schemas, business logic\n4. Bundled resources - Scripts, references, and assets for complex and repetitive tasks\n\n## Core Principles\n\n### Concise is Key\n\nThe context window is a public good. Skills share the context window with everything else Claude needs: system prompt, conversation history, other Skills' metadata, and the actual user request.\n\n**Default assumption: Claude is already very smart.** Only add context Claude doesn't already have. Challenge each piece of information: \"Does Claude really need this explanation?\" and \"Does this paragraph justify its token cost?\"\n\nPrefer concise examples over verbose explanations.\n\n### Set Appropriate Degrees of Freedom\n\nMatch the level of specificity to the task's fragility and variability:\n\n**High freedom (text-based instructions)**: Use when multiple approaches are valid, decisions depend on context, or heuristics guide the approach.\n\n**Medium freedom (pseudocode or scripts with parameters)**: Use when a preferred pattern exists, some variation is acceptable, or configuration affects behavior.\n\n**Low freedom (specific scripts, few parameters)**: Use when operations are fragile and error-prone, consistency is critical, or a specific sequence must be followed.\n\nThink of Claude as exploring a path: a narrow bridge with cliffs needs specific guardrails (low freedom), while an open field allows many routes (high freedom).\n\n### Anatomy of a Skill\n\nEvery skill consists of a required SKILL.md file and optional bundled resources:\n\n```\nskill-name/\n├── SKILL.md (required)\n│ ├── YAML frontmatter metadata (required)\n│ │ ├── name: (required)\n│ │ ├── description: (required)\n│ │ └── compatibility: (optional, rarely needed)\n│ └── Markdown instructions (required)\n└── Bundled Resources (optional)\n ├── scripts/ - Executable code (Python/Bash/etc.)\n ├── references/ - Documentation intended to be loaded into context as needed\n └── assets/ - Files used in output (templates, icons, fonts, etc.)\n```\n\n#### SKILL.md (required)\n\nEvery SKILL.md consists of:\n\n- **Frontmatter** (YAML): Contains `name` and `description` fields (required), plus optional fields like `license`, `metadata`, and `compatibility`. Only `name` and `description` are read by Claude to determine when the skill triggers, so be clear and comprehensive about what the skill is and when it should be used. The `compatibility` field is for noting environment requirements (target product, system packages, etc.) but most skills don't need it.\n- **Body** (Markdown): Instructions and guidance for using the skill. Only loaded AFTER the skill triggers (if at all).\n\n#### Bundled Resources (optional)\n\n##### Scripts (`scripts/`)\n\nExecutable code (Python/Bash/etc.) for tasks that require deterministic reliability or are repeatedly rewritten.\n\n- **When to include**: When the same code is being rewritten repeatedly or deterministic reliability is needed\n- **Example**: `scripts/rotate_pdf.py` for PDF rotation tasks\n- **Benefits**: Token efficient, deterministic, may be executed without loading into context\n- **Note**: Scripts may still need to be read by Claude for patching or environment-specific adjustments\n\n##### References (`references/`)\n\nDocumentation and reference material intended to be loaded as needed into context to inform Claude's process and thinking.\n\n- **When to include**: For documentation that Claude should reference while working\n- **Examples**: `references/finance.md` for financial schemas, `references/mnda.md` for company NDA template, `references/policies.md` for company policies, `references/api_docs.md` for API specifications\n- **Use cases**: Database schemas, API documentation, domain knowledge, company policies, detailed workflow guides\n- **Benefits**: Keeps SKILL.md lean, loaded only when Claude determines it's needed\n- **Best practice**: If files are large (>10k words), include grep search patterns in SKILL.md\n- **Avoid duplication**: Information should live in either SKILL.md or references files, not both. Prefer references files for detailed information unless it's truly core to the skill—this keeps SKILL.md lean while making information discoverable without hogging the context window. Keep only essential procedural instructions and workflow guidance in SKILL.md; move detailed reference material, schemas, and examples to references files.\n\n##### Assets (`assets/`)\n\nFiles not intended to be loaded into context, but rather used within the output Claude produces.\n\n- **When to include**: When the skill needs files that will be used in the final output\n- **Examples**: `assets/logo.png` for brand assets, `assets/slides.pptx` for PowerPoint templates, `assets/frontend-template/` for HTML/React boilerplate, `assets/font.ttf` for typography\n- **Use cases**: Templates, images, icons, boilerplate code, fonts, sample documents that get copied or modified\n- **Benefits**: Separates output resources from documentation, enables Claude to use files without loading them into context\n\n#### What to Not Include in a Skill\n\nA skill should only contain essential files that directly support its functionality. Do NOT create extraneous documentation or auxiliary files, including:\n\n- README.md\n- INSTALLATION_GUIDE.md\n- QUICK_REFERENCE.md\n- CHANGELOG.md\n- etc.\n\nThe skill should only contain the information needed for an AI agent to do the job at hand. It should not contain auxilary context about the process that went into creating it, setup and testing procedures, user-facing documentation, etc. Creating additional documentation files just adds clutter and confusion.\n\n### Progressive Disclosure Design Principle\n\nSkills use a three-level loading system to manage context efficiently:\n\n1. **Metadata (name + description)** - Always in context (~100 words)\n2. **SKILL.md body** - When skill triggers (<5k words)\n3. **Bundled resources** - As needed by Claude (Unlimited because scripts can be executed without reading into context window)\n\n#### Progressive Disclosure Patterns\n\nKeep SKILL.md body to the essentials and under 500 lines to minimize context bloat. Split content into separate files when approaching this limit. When splitting out content into other files, it is very important to reference them from SKILL.md and describe clearly when to read them, to ensure the reader of the skill knows they exist and when to use them.\n\n**Key principle:** When a skill supports multiple variations, frameworks, or options, keep only the core workflow and selection guidance in SKILL.md. Move variant-specific details (patterns, examples, configuration) into separate reference files.\n\n**Pattern 1: High-level guide with references**\n\n```markdown\n# PDF Processing\n\n## Quick start\n\nExtract text with pdfplumber:\n[code example]\n\n## Advanced features\n\n- **Form filling**: See [FORMS.md](FORMS.md) for complete guide\n- **API reference**: See [REFERENCE.md](REFERENCE.md) for all methods\n- **Examples**: See [EXAMPLES.md](EXAMPLES.md) for common patterns\n```\n\nClaude loads FORMS.md, REFERENCE.md, or EXAMPLES.md only when needed.\n\n**Pattern 2: Domain-specific organization**\n\nFor Skills with multiple domains, organize content by domain to avoid loading irrelevant context:\n\n```\nbigquery-skill/\n├── SKILL.md (overview and navigation)\n└── reference/\n ├── finance.md (revenue, billing metrics)\n ├── sales.md (opportunities, pipeline)\n ├── product.md (API usage, features)\n └── marketing.md (campaigns, attribution)\n```\n\nWhen a user asks about sales metrics, Claude only reads sales.md.\n\nSimilarly, for skills supporting multiple frameworks or variants, organize by variant:\n\n```\ncloud-deploy/\n├── SKILL.md (workflow + provider selection)\n└── references/\n ├── aws.md (AWS deployment patterns)\n ├── gcp.md (GCP deployment patterns)\n └── azure.md (Azure deployment patterns)\n```\n\nWhen the user chooses AWS, Claude only reads aws.md.\n\n**Pattern 3: Conditional details**\n\nShow basic content, link to advanced content:\n\n```markdown\n# DOCX Processing\n\n## Creating documents\n\nUse docx-js for new documents. See [DOCX-JS.md](DOCX-JS.md).\n\n## Editing documents\n\nFor simple edits, modify the XML directly.\n\n**For tracked changes**: See [REDLINING.md](REDLINING.md)\n**For OOXML details**: See [OOXML.md](OOXML.md)\n```\n\nClaude reads REDLINING.md or OOXML.md only when the user needs those features.\n\n**Important guidelines:**\n\n- **Avoid deeply nested references** - Keep references one level deep from SKILL.md. All reference files should link directly from SKILL.md.\n- **Structure longer reference files** - For files longer than 100 lines, include a table of contents at the top so Claude can see the full scope when previewing.\n\n## Skill Creation Process\n\nSkill creation involves these steps:\n\n1. Understand the skill with concrete examples\n2. Plan reusable skill contents (scripts, references, assets)\n3. Initialize the skill (run init_skill.py)\n4. Edit the skill (implement resources and write SKILL.md)\n5. Package the skill (run package_skill.py)\n6. Iterate based on real usage\n\nFollow these steps in order, skipping only if there is a clear reason why they are not applicable.\n\n### Step 1: Understanding the Skill with Concrete Examples\n\nSkip this step only when the skill's usage patterns are already clearly understood. It remains valuable even when working with an existing skill.\n\nTo create an effective skill, clearly understand concrete examples of how the skill will be used. This understanding can come from either direct user examples or generated examples that are validated with user feedback.\n\nFor example, when building an image-editor skill, relevant questions include:\n\n- \"What functionality should the image-editor skill support? Editing, rotating, anything else?\"\n- \"Can you give some examples of how this skill would be used?\"\n- \"I can imagine users asking for things like 'Remove the red-eye from this image' or 'Rotate this image'. Are there other ways you imagine this skill being used?\"\n- \"What would a user say that should trigger this skill?\"\n\nTo avoid overwhelming users, avoid asking too many questions in a single message. Start with the most important questions and follow up as needed for better effectiveness.\n\nConclude this step when there is a clear sense of the functionality the skill should support.\n\n### Step 2: Planning the Reusable Skill Contents\n\nTo turn concrete examples into an effective skill, analyze each example by:\n\n1. Considering how to execute on the example from scratch\n2. Identifying what scripts, references, and assets would be helpful when executing these workflows repeatedly\n\nExample: When building a `pdf-editor` skill to handle queries like \"Help me rotate this PDF,\" the analysis shows:\n\n1. Rotating a PDF requires re-writing the same code each time\n2. A `scripts/rotate_pdf.py` script would be helpful to store in the skill\n\nExample: When designing a `frontend-webapp-builder` skill for queries like \"Build me a todo app\" or \"Build me a dashboard to track my steps,\" the analysis shows:\n\n1. Writing a frontend webapp requires the same boilerplate HTML/React each time\n2. An `assets/hello-world/` template containing the boilerplate HTML/React project files would be helpful to store in the skill\n\nExample: When building a `big-query` skill to handle queries like \"How many users have logged in today?\" the analysis shows:\n\n1. Querying BigQuery requires re-discovering the table schemas and relationships each time\n2. A `references/schema.md` file documenting the table schemas would be helpful to store in the skill\n\nTo establish the skill's contents, analyze each concrete example to create a list of the reusable resources to include: scripts, references, and assets.\n\n### Step 3: Initializing the Skill\n\nAt this point, it is time to actually create the skill.\n\nSkip this step only if the skill being developed already exists, and iteration or packaging is needed. In this case, continue to the next step.\n\nWhen creating a new skill from scratch, always run the `init_skill.py` script. The script conveniently generates a new template skill directory that automatically includes everything a skill requires, making the skill creation process much more efficient and reliable.\n\nUsage:\n\n```bash\nscripts/init_skill.py --path \n```\n\nThe script:\n\n- Creates the skill directory at the specified path\n- Generates a SKILL.md template with proper frontmatter and TODO placeholders\n- Creates example resource directories: `scripts/`, `references/`, and `assets/`\n- Adds example files in each directory that can be customized or deleted\n\nAfter initialization, customize or remove the generated SKILL.md and example files as needed.\n\n### Step 4: Edit the Skill\n\nWhen editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of Claude to use. Include information that would be beneficial and non-obvious to Claude. Consider what procedural knowledge, domain-specific details, or reusable assets would help another Claude instance execute these tasks more effectively.\n\n#### Learn Proven Design Patterns\n\nConsult these helpful guides based on your skill's needs:\n\n- **Multi-step processes**: See references/workflows.md for sequential workflows and conditional logic\n- **Specific output formats or quality standards**: See references/output-patterns.md for template and example patterns\n\nThese files contain established best practices for effective skill design.\n\n#### Start with Reusable Skill Contents\n\nTo begin implementation, start with the reusable resources identified above: `scripts/`, `references/`, and `assets/` files. Note that this step may require user input. For example, when implementing a `brand-guidelines` skill, the user may need to provide brand assets or templates to store in `assets/`, or documentation to store in `references/`.\n\nAdded scripts must be tested by actually running them to ensure there are no bugs and that the output matches what is expected. If there are many similar scripts, only a representative sample needs to be tested to ensure confidence that they all work while balancing time to completion.\n\nAny example files and directories not needed for the skill should be deleted. The initialization script creates example files in `scripts/`, `references/`, and `assets/` to demonstrate structure, but most skills won't need all of them.\n\n#### Update SKILL.md\n\n**Writing Guidelines:** Always use imperative/infinitive form.\n\n##### Frontmatter\n\nWrite the YAML frontmatter with `name` and `description`:\n\n- `name`: The skill name\n- `description`: This is the primary triggering mechanism for your skill, and helps Claude understand when to use the skill.\n - Include both what the Skill does and specific triggers/contexts for when to use it.\n - Include all \"when to use\" information here - Not in the body. The body is only loaded after triggering, so \"When to Use This Skill\" sections in the body are not helpful to Claude.\n - Example description for a `docx` skill: \"Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. Use when Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks\"\n\nDo not include any other fields in YAML frontmatter.\n\n##### Body\n\nWrite instructions for using the skill and its bundled resources.\n\n### Step 5: Packaging a Skill\n\nOnce development of the skill is complete, it must be packaged into a distributable .skill file that gets shared with the user. The packaging process automatically validates the skill first to ensure it meets all requirements:\n\n```bash\nscripts/package_skill.py \n```\n\nOptional output directory specification:\n\n```bash\nscripts/package_skill.py ./dist\n```\n\nThe packaging script will:\n\n1. **Validate** the skill automatically, checking:\n\n - YAML frontmatter format and required fields\n - Skill naming conventions and directory structure\n - Description completeness and quality\n - File organization and resource references\n\n2. **Package** the skill if validation passes, creating a .skill file named after the skill (e.g., `my-skill.skill`) that includes all files and maintains the proper directory structure for distribution. The .skill file is a zip file with a .skill extension.\n\nIf validation fails, the script will report the errors and exit without creating a package. Fix any validation errors and run the packaging command again.\n\n### Step 6: Iterate\n\nAfter testing the skill, users may request improvements. Often this happens right after using the skill, with fresh context of how the skill performed.\n\n**Iteration workflow:**\n\n1. Use the skill on real tasks\n2. Notice struggles or inefficiencies\n3. Identify how SKILL.md or bundled resources should be updated\n4. Implement changes and test again\n",
"sha256": "d57b6e3a44535b9c0ef454dad5c86f5df78185fc80a65c7092885b4b5e10f81b"
},
".github/tools/external/tmux/compat/explicit_bzero.c": {
"mode": "100644",
"encoding": "utf-8",
"data": "/*\t$OpenBSD: explicit_bzero.c,v 1.4 2015/08/31 02:53:57 guenther Exp $ */\n/*\n * Public domain.\n * Written by Matthew Dempsky.\n */\n\n#include \n\n#include \"compat.h\"\n\nvoid\nexplicit_bzero(void *buf, size_t len)\n{\n\tmemset(buf, 0, len);\n}\n",
"sha256": "7e30bc63946093cd6ed7cb4ce01d2f8c6e329ab173a20df250da60bb0a3c757b"
},
".github/tools/external/tmux/compat/getopt_long.c": {
"mode": "100644",
"encoding": "utf-8",
"data": "/* This file is obtained from OpenSSH:\n * Repository: https://github.com/openssh/openssh-portable\n * Commit: b5b405fee7f3e79d44e2d2971a4b6b4cc53f112e\n * File: /openbsd-compat/getopt_long.c */\n\n/*\n * Copyright (c) 2002 Todd C. Miller \n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * Sponsored in part by the Defense Advanced Research Projects\n * Agency (DARPA) and Air Force Research Laboratory, Air Force\n * Materiel Command, USAF, under agreement number F39502-99-1-0512.\n */\n/*-\n * Copyright (c) 2000 The NetBSD Foundation, Inc.\n * All rights reserved.\n *\n * This code is derived from software contributed to The NetBSD Foundation\n * by Dieter Baron and Thomas Klausner.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS\n * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* OPENBSD ORIGINAL: lib/libc/stdlib/getopt_long.c */\n#include \"compat.h\"\n\n/* The following macro constants are taken from getopt.h of OpenSSH:\n * Repository: https://github.com/openssh/openssh-portable\n * Commit: b5b405fee7f3e79d44e2d2971a4b6b4cc53f112e\n * File: /openbsd-compat/getopt.h\n *\n * ---- BEGIN - Copyright notice and license of getopt.h ----\n * Copyright (c) 2000 The NetBSD Foundation, Inc.\n * All rights reserved.\n *\n * This code is derived from software contributed to The NetBSD Foundation\n * by Dieter Baron and Thomas Klausner.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS\n * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n * ---- END ----\n */\n#define no_argument 0\n#define required_argument 1\n#define optional_argument 2\n\n#if !defined(HAVE_GETOPT) || !defined(HAVE_GETOPT_OPTRESET)\n\n#if 0\n#include \n#include \n#endif\n#include \n#include \n#include \n#include \n\nstruct option {\n\t/* name of long option */\n\tconst char *name;\n\t/*\n\t * one of no_argument, required_argument, and optional_argument:\n\t * whether option takes an argument\n\t */\n\tint has_arg;\n\t/* if not NULL, set *flag to val when option found */\n\tint *flag;\n\t/* if flag not NULL, value to set *flag to; else return value */\n\tint val;\n};\n\nint\topterr = 1;\t\t/* if error message should be printed */\nint\toptind = 1;\t\t/* index into parent argv vector */\nint\toptopt = '?';\t\t/* character checked for validity */\nint\toptreset;\t\t/* reset getopt */\nchar *optarg;\t\t/* argument associated with option */\n\n#define PRINT_ERROR\t((opterr) && (*options != ':'))\n\n#define FLAG_PERMUTE\t0x01\t/* permute non-options to the end of argv */\n#define FLAG_ALLARGS\t0x02\t/* treat non-options as args to option \"-1\" */\n#define FLAG_LONGONLY\t0x04\t/* operate as getopt_long_only */\n\n/* return values */\n#define\tBADCH\t\t(int)'?'\n#define\tBADARG\t\t((*options == ':') ? (int)':' : (int)'?')\n#define\tINORDER\t\t(int)1\n\n#define\tEMSG\t\t(char *)\"\"\n\nstatic int getopt_internal(int, char * const *, const char *,\n\t\t\t const struct option *, int *, int);\nstatic int parse_long_options(char * const *, const char *,\n\t\t\t const struct option *, int *, int);\nstatic int gcd(int, int);\nstatic void permute_args(int, int, int, char * const *);\n\nstatic char *place = EMSG; /* option letter processing */\n\n/* XXX: set optreset to 1 rather than these two */\nstatic int nonopt_start = -1; /* first non option argument (for permute) */\nstatic int nonopt_end = -1; /* first option after non options (for permute) */\n\n/* Error messages */\nstatic const char recargchar[] = \"option requires an argument -- %c\";\nstatic const char recargstring[] = \"option requires an argument -- %s\";\nstatic const char ambig[] = \"ambiguous option -- %.*s\";\nstatic const char noarg[] = \"option doesn't take an argument -- %.*s\";\nstatic const char illoptchar[] = \"unknown option -- %c\";\nstatic const char illoptstring[] = \"unknown option -- %s\";\n\n/*\n * Compute the greatest common divisor of a and b.\n */\nstatic int\ngcd(int a, int b)\n{\n\tint c;\n\n\tc = a % b;\n\twhile (c != 0) {\n\t\ta = b;\n\t\tb = c;\n\t\tc = a % b;\n\t}\n\n\treturn (b);\n}\n\n/*\n * Exchange the block from nonopt_start to nonopt_end with the block\n * from nonopt_end to opt_end (keeping the same order of arguments\n * in each block).\n */\nstatic void\npermute_args(int panonopt_start, int panonopt_end, int opt_end,\n\tchar * const *nargv)\n{\n\tint cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;\n\tchar *swap;\n\n\t/*\n\t * compute lengths of blocks and number and size of cycles\n\t */\n\tnnonopts = panonopt_end - panonopt_start;\n\tnopts = opt_end - panonopt_end;\n\tncycle = gcd(nnonopts, nopts);\n\tcyclelen = (opt_end - panonopt_start) / ncycle;\n\n\tfor (i = 0; i < ncycle; i++) {\n\t\tcstart = panonopt_end+i;\n\t\tpos = cstart;\n\t\tfor (j = 0; j < cyclelen; j++) {\n\t\t\tif (pos >= panonopt_end)\n\t\t\t\tpos -= nnonopts;\n\t\t\telse\n\t\t\t\tpos += nopts;\n\t\t\tswap = nargv[pos];\n\t\t\t/* LINTED const cast */\n\t\t\t((char **) nargv)[pos] = nargv[cstart];\n\t\t\t/* LINTED const cast */\n\t\t\t((char **)nargv)[cstart] = swap;\n\t\t}\n\t}\n}\n\n/*\n * parse_long_options --\n *\tParse long options in argc/argv argument vector.\n * Returns -1 if short_too is set and the option does not match long_options.\n */\nstatic int\nparse_long_options(char * const *nargv, const char *options,\n\tconst struct option *long_options, int *idx, int short_too)\n{\n\tchar *current_argv, *has_equal;\n\tsize_t current_argv_len;\n\tint i, match;\n\n\tcurrent_argv = place;\n\tmatch = -1;\n\n\toptind++;\n\n\tif ((has_equal = strchr(current_argv, '=')) != NULL) {\n\t\t/* argument found (--option=arg) */\n\t\tcurrent_argv_len = has_equal - current_argv;\n\t\thas_equal++;\n\t} else\n\t\tcurrent_argv_len = strlen(current_argv);\n\n\tfor (i = 0; long_options[i].name; i++) {\n\t\t/* find matching long option */\n\t\tif (strncmp(current_argv, long_options[i].name,\n\t\t current_argv_len))\n\t\t\tcontinue;\n\n\t\tif (strlen(long_options[i].name) == current_argv_len) {\n\t\t\t/* exact match */\n\t\t\tmatch = i;\n\t\t\tbreak;\n\t\t}\n\t\t/*\n\t\t * If this is a known short option, don't allow\n\t\t * a partial match of a single character.\n\t\t */\n\t\tif (short_too && current_argv_len == 1)\n\t\t\tcontinue;\n\n\t\tif (match == -1)\t/* partial match */\n\t\t\tmatch = i;\n\t\telse {\n\t\t\t/* ambiguous abbreviation */\n\t\t\tif (PRINT_ERROR)\n\t\t\t\twarnx(ambig, (int)current_argv_len,\n\t\t\t\t current_argv);\n\t\t\toptopt = 0;\n\t\t\treturn (BADCH);\n\t\t}\n\t}\n\tif (match != -1) {\t\t/* option found */\n\t\tif (long_options[match].has_arg == no_argument\n\t\t && has_equal) {\n\t\t\tif (PRINT_ERROR)\n\t\t\t\twarnx(noarg, (int)current_argv_len,\n\t\t\t\t current_argv);\n\t\t\t/*\n\t\t\t * XXX: GNU sets optopt to val regardless of flag\n\t\t\t */\n\t\t\tif (long_options[match].flag == NULL)\n\t\t\t\toptopt = long_options[match].val;\n\t\t\telse\n\t\t\t\toptopt = 0;\n\t\t\treturn (BADARG);\n\t\t}\n\t\tif (long_options[match].has_arg == required_argument ||\n\t\t long_options[match].has_arg == optional_argument) {\n\t\t\tif (has_equal)\n\t\t\t\toptarg = has_equal;\n\t\t\telse if (long_options[match].has_arg ==\n\t\t\t required_argument) {\n\t\t\t\t/*\n\t\t\t\t * optional argument doesn't use next nargv\n\t\t\t\t */\n\t\t\t\toptarg = nargv[optind++];\n\t\t\t}\n\t\t}\n\t\tif ((long_options[match].has_arg == required_argument)\n\t\t && (optarg == NULL)) {\n\t\t\t/*\n\t\t\t * Missing argument; leading ':' indicates no error\n\t\t\t * should be generated.\n\t\t\t */\n\t\t\tif (PRINT_ERROR)\n\t\t\t\twarnx(recargstring,\n\t\t\t\t current_argv);\n\t\t\t/*\n\t\t\t * XXX: GNU sets optopt to val regardless of flag\n\t\t\t */\n\t\t\tif (long_options[match].flag == NULL)\n\t\t\t\toptopt = long_options[match].val;\n\t\t\telse\n\t\t\t\toptopt = 0;\n\t\t\t--optind;\n\t\t\treturn (BADARG);\n\t\t}\n\t} else {\t\t\t/* unknown option */\n\t\tif (short_too) {\n\t\t\t--optind;\n\t\t\treturn (-1);\n\t\t}\n\t\tif (PRINT_ERROR)\n\t\t\twarnx(illoptstring, current_argv);\n\t\toptopt = 0;\n\t\treturn (BADCH);\n\t}\n\tif (idx)\n\t\t*idx = match;\n\tif (long_options[match].flag) {\n\t\t*long_options[match].flag = long_options[match].val;\n\t\treturn (0);\n\t} else\n\t\treturn (long_options[match].val);\n}\n\n/*\n * getopt_internal --\n *\tParse argc/argv argument vector. Called by user level routines.\n */\nstatic int\ngetopt_internal(int nargc, char * const *nargv, const char *options,\n\tconst struct option *long_options, int *idx, int flags)\n{\n\tchar *oli;\t\t\t\t/* option letter list index */\n\tint optchar, short_too;\n\tstatic int posixly_correct = -1;\n\n\tif (options == NULL)\n\t\treturn (-1);\n\n\t/*\n\t * XXX Some GNU programs (like cvs) set optind to 0 instead of\n\t * XXX using optreset. Work around this braindamage.\n\t */\n\tif (optind == 0)\n\t\toptind = optreset = 1;\n\n\t/*\n\t * Disable GNU extensions if POSIXLY_CORRECT is set or options\n\t * string begins with a '+'.\n\t */\n\tif (posixly_correct == -1 || optreset)\n\t\tposixly_correct = (getenv(\"POSIXLY_CORRECT\") != NULL);\n\tif (*options == '-')\n\t\tflags |= FLAG_ALLARGS;\n\telse if (posixly_correct || *options == '+')\n\t\tflags &= ~FLAG_PERMUTE;\n\tif (*options == '+' || *options == '-')\n\t\toptions++;\n\n\toptarg = NULL;\n\tif (optreset)\n\t\tnonopt_start = nonopt_end = -1;\nstart:\n\tif (optreset || !*place) {\t\t/* update scanning pointer */\n\t\toptreset = 0;\n\t\tif (optind >= nargc) { /* end of argument vector */\n\t\t\tplace = EMSG;\n\t\t\tif (nonopt_end != -1) {\n\t\t\t\t/* do permutation, if we have to */\n\t\t\t\tpermute_args(nonopt_start, nonopt_end,\n\t\t\t\t optind, nargv);\n\t\t\t\toptind -= nonopt_end - nonopt_start;\n\t\t\t}\n\t\t\telse if (nonopt_start != -1) {\n\t\t\t\t/*\n\t\t\t\t * If we skipped non-options, set optind\n\t\t\t\t * to the first of them.\n\t\t\t\t */\n\t\t\t\toptind = nonopt_start;\n\t\t\t}\n\t\t\tnonopt_start = nonopt_end = -1;\n\t\t\treturn (-1);\n\t\t}\n\t\tif (*(place = nargv[optind]) != '-' ||\n\t\t (place[1] == '\\0' && strchr(options, '-') == NULL)) {\n\t\t\tplace = EMSG;\t\t/* found non-option */\n\t\t\tif (flags & FLAG_ALLARGS) {\n\t\t\t\t/*\n\t\t\t\t * GNU extension:\n\t\t\t\t * return non-option as argument to option 1\n\t\t\t\t */\n\t\t\t\toptarg = nargv[optind++];\n\t\t\t\treturn (INORDER);\n\t\t\t}\n\t\t\tif (!(flags & FLAG_PERMUTE)) {\n\t\t\t\t/*\n\t\t\t\t * If no permutation wanted, stop parsing\n\t\t\t\t * at first non-option.\n\t\t\t\t */\n\t\t\t\treturn (-1);\n\t\t\t}\n\t\t\t/* do permutation */\n\t\t\tif (nonopt_start == -1)\n\t\t\t\tnonopt_start = optind;\n\t\t\telse if (nonopt_end != -1) {\n\t\t\t\tpermute_args(nonopt_start, nonopt_end,\n\t\t\t\t optind, nargv);\n\t\t\t\tnonopt_start = optind -\n\t\t\t\t (nonopt_end - nonopt_start);\n\t\t\t\tnonopt_end = -1;\n\t\t\t}\n\t\t\toptind++;\n\t\t\t/* process next argument */\n\t\t\tgoto start;\n\t\t}\n\t\tif (nonopt_start != -1 && nonopt_end == -1)\n\t\t\tnonopt_end = optind;\n\n\t\t/*\n\t\t * If we have \"-\" do nothing, if \"--\" we are done.\n\t\t */\n\t\tif (place[1] != '\\0' && *++place == '-' && place[1] == '\\0') {\n\t\t\toptind++;\n\t\t\tplace = EMSG;\n\t\t\t/*\n\t\t\t * We found an option (--), so if we skipped\n\t\t\t * non-options, we have to permute.\n\t\t\t */\n\t\t\tif (nonopt_end != -1) {\n\t\t\t\tpermute_args(nonopt_start, nonopt_end,\n\t\t\t\t optind, nargv);\n\t\t\t\toptind -= nonopt_end - nonopt_start;\n\t\t\t}\n\t\t\tnonopt_start = nonopt_end = -1;\n\t\t\treturn (-1);\n\t\t}\n\t}\n\n\t/*\n\t * Check long options if:\n\t * 1) we were passed some\n\t * 2) the arg is not just \"-\"\n\t * 3) either the arg starts with -- we are getopt_long_only()\n\t */\n\tif (long_options != NULL && place != nargv[optind] &&\n\t (*place == '-' || (flags & FLAG_LONGONLY))) {\n\t\tshort_too = 0;\n\t\tif (*place == '-')\n\t\t\tplace++;\t\t/* --foo long option */\n\t\telse if (*place != ':' && strchr(options, *place) != NULL)\n\t\t\tshort_too = 1;\t\t/* could be short option too */\n\n\t\toptchar = parse_long_options(nargv, options, long_options,\n\t\t idx, short_too);\n\t\tif (optchar != -1) {\n\t\t\tplace = EMSG;\n\t\t\treturn (optchar);\n\t\t}\n\t}\n\n\tif ((optchar = (int)*place++) == (int)':' ||\n\t (optchar == (int)'-' && *place != '\\0') ||\n\t (oli = strchr(options, optchar)) == NULL) {\n\t\t/*\n\t\t * If the user specified \"-\" and '-' isn't listed in\n\t\t * options, return -1 (non-option) as per POSIX.\n\t\t * Otherwise, it is an unknown option character (or ':').\n\t\t */\n\t\tif (optchar == (int)'-' && *place == '\\0')\n\t\t\treturn (-1);\n\t\tif (!*place)\n\t\t\t++optind;\n\t\tif (PRINT_ERROR)\n\t\t\twarnx(illoptchar, optchar);\n\t\toptopt = optchar;\n\t\treturn (BADCH);\n\t}\n\tif (long_options != NULL && optchar == 'W' && oli[1] == ';') {\n\t\t/* -W long-option */\n\t\tif (*place)\t\t\t/* no space */\n\t\t\t/* NOTHING */;\n\t\telse if (++optind >= nargc) {\t/* no arg */\n\t\t\tplace = EMSG;\n\t\t\tif (PRINT_ERROR)\n\t\t\t\twarnx(recargchar, optchar);\n\t\t\toptopt = optchar;\n\t\t\treturn (BADARG);\n\t\t} else\t\t\t\t/* white space */\n\t\t\tplace = nargv[optind];\n\t\toptchar = parse_long_options(nargv, options, long_options,\n\t\t idx, 0);\n\t\tplace = EMSG;\n\t\treturn (optchar);\n\t}\n\tif (*++oli != ':') {\t\t\t/* doesn't take argument */\n\t\tif (!*place)\n\t\t\t++optind;\n\t} else {\t\t\t\t/* takes (optional) argument */\n\t\toptarg = NULL;\n\t\tif (*place)\t\t\t/* no white space */\n\t\t\toptarg = place;\n\t\telse if (oli[1] != ':') {\t/* arg not optional */\n\t\t\tif (++optind >= nargc) {\t/* no arg */\n\t\t\t\tplace = EMSG;\n\t\t\t\tif (PRINT_ERROR)\n\t\t\t\t\twarnx(recargchar, optchar);\n\t\t\t\toptopt = optchar;\n\t\t\t\treturn (BADARG);\n\t\t\t} else\n\t\t\t\toptarg = nargv[optind];\n\t\t}\n\t\tplace = EMSG;\n\t\t++optind;\n\t}\n\t/* dump back option letter */\n\treturn (optchar);\n}\n\n/*\n * getopt --\n *\tParse argc/argv argument vector.\n *\n * [eventually this will replace the BSD getopt]\n */\nint\ngetopt(int nargc, char * const *nargv, const char *options)\n{\n\n\t/*\n\t * We don't pass FLAG_PERMUTE to getopt_internal() since\n\t * the BSD getopt(3) (unlike GNU) has never done this.\n\t *\n\t * Furthermore, since many privileged programs call getopt()\n\t * before dropping privileges it makes sense to keep things\n\t * as simple (and bug-free) as possible.\n\t */\n\treturn (getopt_internal(nargc, nargv, options, NULL, NULL, 0));\n}\n\n#if 0\n/*\n * getopt_long --\n *\tParse argc/argv argument vector.\n */\nint\ngetopt_long(int nargc, char * const *nargv, const char *options,\n const struct option *long_options, int *idx)\n{\n\n\treturn (getopt_internal(nargc, nargv, options, long_options, idx,\n\t FLAG_PERMUTE));\n}\n\n/*\n * getopt_long_only --\n *\tParse argc/argv argument vector.\n */\nint\ngetopt_long_only(int nargc, char * const *nargv, const char *options,\n const struct option *long_options, int *idx)\n{\n\n\treturn (getopt_internal(nargc, nargv, options, long_options, idx,\n\t FLAG_PERMUTE|FLAG_LONGONLY));\n}\n#endif\n\n#endif /* !defined(HAVE_GETOPT) || !defined(HAVE_OPTRESET) */\n",
"sha256": "0486066fe70fb5a81d79971842f171e3bdcb570dbcab22ce51c1394235b8d21f"
},
".github/tools/external/tmux/xmalloc.c": {
"mode": "100644",
"encoding": "utf-8",
"data": "/* $OpenBSD$ */\n\n/*\n * Author: Tatu Ylonen \n * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland\n * All rights reserved\n * Versions of malloc and friends that check their results, and never return\n * failure (they call fatalx if they encounter an error).\n *\n * As far as I am concerned, the code I have written for this software\n * can be used freely for any purpose. Any derived versions of this\n * software must be clearly marked as such, and if the derived work is\n * incompatible with the protocol description in the RFC file, it must be\n * called by a name other than \"ssh\" or \"Secure Shell\".\n */\n\n#include \n#include \n#include \n#include \n#include \n#include \n\n#include \"tmux.h\"\n\nvoid *\nxmalloc(size_t size)\n{\n\tvoid *ptr;\n\n\tif (size == 0)\n\t\tfatalx(\"xmalloc: zero size\");\n\tptr = malloc(size);\n\tif (ptr == NULL)\n\t\tfatalx(\"xmalloc: allocating %zu bytes: %s\",\n\t\t size, strerror(errno));\n\treturn ptr;\n}\n\nvoid *\nxcalloc(size_t nmemb, size_t size)\n{\n\tvoid *ptr;\n\n\tif (size == 0 || nmemb == 0)\n\t\tfatalx(\"xcalloc: zero size\");\n\tptr = calloc(nmemb, size);\n\tif (ptr == NULL)\n\t\tfatalx(\"xcalloc: allocating %zu * %zu bytes: %s\",\n\t\t nmemb, size, strerror(errno));\n\treturn ptr;\n}\n\nvoid *\nxrealloc(void *ptr, size_t size)\n{\n\treturn xreallocarray(ptr, 1, size);\n}\n\nvoid *\nxreallocarray(void *ptr, size_t nmemb, size_t size)\n{\n\tvoid *new_ptr;\n\n\tif (nmemb == 0 || size == 0)\n\t\tfatalx(\"xreallocarray: zero size\");\n\tnew_ptr = reallocarray(ptr, nmemb, size);\n\tif (new_ptr == NULL)\n\t\tfatalx(\"xreallocarray: allocating %zu * %zu bytes: %s\",\n\t\t nmemb, size, strerror(errno));\n\treturn new_ptr;\n}\n\nvoid *\nxrecallocarray(void *ptr, size_t oldnmemb, size_t nmemb, size_t size)\n{\n\tvoid *new_ptr;\n\n\tif (nmemb == 0 || size == 0)\n\t\tfatalx(\"xrecallocarray: zero size\");\n\tnew_ptr = recallocarray(ptr, oldnmemb, nmemb, size);\n\tif (new_ptr == NULL)\n\t\tfatalx(\"xrecallocarray: allocating %zu * %zu bytes: %s\",\n\t\t nmemb, size, strerror(errno));\n\treturn new_ptr;\n}\n\nchar *\nxstrdup(const char *str)\n{\n\tchar *cp;\n\n\tif ((cp = strdup(str)) == NULL)\n\t\tfatalx(\"xstrdup: %s\", strerror(errno));\n\treturn cp;\n}\n\nchar *\nxstrndup(const char *str, size_t maxlen)\n{\n\tchar *cp;\n\n\tif ((cp = strndup(str, maxlen)) == NULL)\n\t\tfatalx(\"xstrndup: %s\", strerror(errno));\n\treturn cp;\n}\n\nint\nxasprintf(char **ret, const char *fmt, ...)\n{\n\tva_list ap;\n\tint i;\n\n\tva_start(ap, fmt);\n\ti = xvasprintf(ret, fmt, ap);\n\tva_end(ap);\n\n\treturn i;\n}\n\nint\nxvasprintf(char **ret, const char *fmt, va_list ap)\n{\n\tint i;\n\n\ti = vasprintf(ret, fmt, ap);\n\n\tif (i == -1)\n\t\tfatalx(\"xasprintf: %s\", strerror(errno));\n\n\treturn i;\n}\n\nint\nxsnprintf(char *str, size_t len, const char *fmt, ...)\n{\n\tva_list ap;\n\tint i;\n\n\tva_start(ap, fmt);\n\ti = xvsnprintf(str, len, fmt, ap);\n\tva_end(ap);\n\n\treturn i;\n}\n\nint\nxvsnprintf(char *str, size_t len, const char *fmt, va_list ap)\n{\n\tint i;\n\n\tif (len > INT_MAX)\n\t\tfatalx(\"xsnprintf: len > INT_MAX\");\n\n\ti = vsnprintf(str, len, fmt, ap);\n\n\tif (i < 0 || i >= (int)len)\n\t\tfatalx(\"xsnprintf: overflow\");\n\n\treturn i;\n}\n",
"sha256": "8ed468e9903b8abf18d5d5b76d99f030713fc479d02dc107ec3dbaa3a01c702b"
},
".github/tools/external/tmux/logo/LICENSE": {
"mode": "100644",
"encoding": "utf-8",
"data": "Copyright (c) 2015, Jason Long \n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n",
"sha256": "5fdf604dee98da6f827ea924cf5ae19a9da31555d3814143f2cc6f8e7ee05752"
},
".github/tools/external/tmux/mdoc2man.awk": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/usr/bin/awk\n#\n# $Id: mdoc2man.awk,v 1.9 2009/10/24 00:52:42 dtucker Exp $\n#\n# Version history:\n# v4+ Adapted for OpenSSH Portable (see cvs Id and history)\n# v3, I put the program under a proper license\n# Dan Nelson added .An, .Aq and fixed a typo\n# v2, fixed to work on GNU awk --posix and MacOS X\n# v1, first attempt, didn't work on MacOS X\n#\n# Copyright (c) 2003 Peter Stuge \n#\n# Permission to use, copy, modify, and distribute this software for any\n# purpose with or without fee is hereby granted, provided that the above\n# copyright notice and this permission notice appear in all copies.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\nBEGIN {\n optlist=0\n oldoptlist=0\n nospace=0\n synopsis=0\n reference=0\n block=0\n ext=0\n extopt=0\n literal=0\n prenl=0\n breakw=0\n line=\"\"\n}\n\nfunction wtail() {\n retval=\"\"\n while(w0;i--) {\n\tadd(refauthors[i])\n\tif(i>1)\n\t add(\", \")\n }\n if(nrefauthors>1)\n\tadd(\" and \")\n if(nrefauthors>0)\n add(refauthors[0] \", \")\n add(\"\\\\fI\" reftitle \"\\\\fP\")\n if(length(refissue))\n\tadd(\", \" refissue)\n if(length(refreport)) {\n\tadd(\", \" refreport)\n }\n if(length(refdate))\n\tadd(\", \" refdate)\n if(length(refopt))\n\tadd(\", \" refopt)\n add(\".\")\n reference=0\n } else if(reference) {\n if(match(words[w],\"^%A$\")) { refauthors[nrefauthors++]=wtail() }\n if(match(words[w],\"^%T$\")) {\n\treftitle=wtail()\n\tsub(\"^\\\"\",\"\",reftitle)\n\tsub(\"\\\"$\",\"\",reftitle)\n }\n if(match(words[w],\"^%N$\")) { refissue=wtail() }\n if(match(words[w],\"^%D$\")) { refdate=wtail() }\n if(match(words[w],\"^%O$\")) { refopt=wtail() }\n if(match(words[w],\"^%R$\")) { refreport=wtail() }\n } else if(match(words[w],\"^Nm$\")) {\n if(synopsis) {\n\tadd(\".br\")\n\tprenl++\n }\n n=words[++w]\n if(!length(name))\n\tname=n\n if(!length(n))\n\tn=name\n add(\"\\\\fB\" n \"\\\\fP\")\n if(!nospace&&match(words[w+1],\"^[\\\\.,]\"))\n\tnospace=1\n } else if(match(words[w],\"^Nd$\")) {\n add(\"\\\\- \" wtail())\n } else if(match(words[w],\"^Fl$\")) {\n add(\"\\\\fB\\\\-\" words[++w] \"\\\\fP\")\n if(!nospace&&match(words[w+1],\"^[\\\\.,]\"))\n\tnospace=1\n } else if(match(words[w],\"^Ar$\")) {\n add(\"\\\\fI\")\n if(w==nwords)\n\tadd(\"file ...\\\\fP\")\n else {\n\tadd(words[++w] \"\\\\fP\")\n\twhile(match(words[w+1],\"^\\\\|$\"))\n\t add(OFS words[++w] \" \\\\fI\" words[++w] \"\\\\fP\")\n }\n if(!nospace&&match(words[w+1],\"^[\\\\.,]\"))\n\tnospace=1\n } else if(match(words[w],\"^Cm$\")) {\n add(\"\\\\fB\" words[++w] \"\\\\fP\")\n while(w\")\n if(option)\n add(\"]\")\n if(ext&&!extopt&&!match(line,\" $\"))\n add(OFS)\n if(!ext&&!extopt&&length(line)) {\n print line\n prenl=0\n line=\"\"\n }\n}\n",
"sha256": "602f3d31ffec414850e697b73f1885e967698ac0cbe8f09efd14800e55abe7ea"
},
".github/tools/external/tmux/tmux.1": {
"mode": "100644",
"encoding": "utf-8",
"data": ".\\\" $OpenBSD$\n.\\\"\n.\\\" Copyright (c) 2007 Nicholas Marriott \n.\\\"\n.\\\" Permission to use, copy, modify, and distribute this software for any\n.\\\" purpose with or without fee is hereby granted, provided that the above\n.\\\" copyright notice and this permission notice appear in all copies.\n.\\\"\n.\\\" THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n.\\\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n.\\\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n.\\\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n.\\\" WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER\n.\\\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n.\\\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n.\\\"\n.Dd $Mdocdate$\n.Dt TMUX 1\n.Os\n.Sh NAME\n.Nm tmux\n.Nd terminal multiplexer\n.Sh SYNOPSIS\n.Nm tmux\n.Bk -words\n.Op Fl 2CDhlNuVv\n.Op Fl c Ar shell-command\n.Op Fl f Ar file\n.Op Fl L Ar socket-name\n.Op Fl S Ar socket-path\n.Op Fl T Ar features\n.Op Ar command Op Ar flags\n.Ek\n.Sh DESCRIPTION\n.Nm\nis a terminal multiplexer:\nit enables a number of terminals to be created, accessed, and\ncontrolled from a single screen.\n.Nm\nmay be detached from a screen\nand continue running in the background,\nthen later reattached.\n.Pp\nWhen\n.Nm\nis started, it creates a new\n.Em session\nwith a single\n.Em window\nand displays it on screen.\nA status line at the bottom of the screen\nshows information on the current session\nand is used to enter interactive commands.\n.Pp\nA session is a single collection of\n.Em pseudo terminals\nunder the management of\n.Nm .\nEach session has one or more\nwindows linked to it.\nA window occupies the entire screen\nand may be split into rectangular panes,\neach of which is a separate pseudo terminal\n(the\n.Xr pty 4\nmanual page documents the technical details of pseudo terminals).\nAny number of\n.Nm\ninstances may connect to the same session,\nand any number of windows may be present in the same session.\nOnce all sessions are killed,\n.Nm\nexits.\n.Pp\nEach session is persistent and will survive accidental disconnection\n(such as\n.Xr ssh 1\nconnection timeout) or intentional detaching (with the\n.Ql C-b d\nkey strokes).\n.Nm\nmay be reattached using:\n.Pp\n.Dl $ tmux attach\n.Pp\nIn\n.Nm ,\na session is displayed on screen by a\n.Em client\nand all sessions are managed by a single\n.Em server .\nThe server and each client are separate processes which communicate through a\nsocket in\n.Pa /tmp .\n.Pp\nThe options are as follows:\n.Bl -tag -width \"XXXXXXXXXXXX\"\n.It Fl 2\nForce\n.Nm\nto assume the terminal supports 256 colours.\nThis is equivalent to\n.Fl T Ar 256 .\n.It Fl C\nStart in control mode (see the\n.Sx CONTROL MODE\nsection).\nGiven twice\n.Xo ( Fl CC ) Xc\ndisables echo.\n.It Fl c Ar shell-command\nExecute\n.Ar shell-command\nusing the default shell.\nIf necessary, the\n.Nm\nserver will be started to retrieve the\n.Ic default-shell\noption.\nThis option is for compatibility with\n.Xr sh 1\nwhen\n.Nm\nis used as a login shell.\n.It Fl D\nDo not start the\n.Nm\nserver as a daemon.\nThis also turns the\n.Ic exit-empty\noption off.\nWith\n.Fl D ,\n.Ar command\nmay not be specified.\n.It Fl f Ar file\nSpecify an alternative configuration file.\nBy default,\n.Nm\nloads the system configuration file from\n.Pa @SYSCONFDIR@/tmux.conf ,\nif present, then looks for a user configuration file at\n.Pa \\[ti]/.tmux.conf\nor\n.Pa $XDG_CONFIG_HOME/tmux/tmux.conf .\n.Pp\nThe configuration file is a set of\n.Nm\ncommands which are executed in sequence when the server is first started.\n.Nm\nloads configuration files once when the server process has started.\nThe\n.Ic source-file\ncommand may be used to load a file later.\n.Pp\n.Nm\nshows any error messages from commands in configuration files in the first\nsession created, and continues to process the rest of the configuration file.\n.It Fl h\nPrint usage information and exit.\n.It Fl L Ar socket-name\n.Nm\nstores the server socket in a directory under\n.Ev TMUX_TMPDIR\nor\n.Pa /tmp\nif it is unset.\nThe default socket is named\n.Em default .\nThis option allows a different socket name to be specified, allowing several\nindependent\n.Nm\nservers to be run.\nUnlike\n.Fl S\na full path is not necessary: the sockets are all created in a directory\n.Pa tmux-UID\nunder the directory given by\n.Ev TMUX_TMPDIR\nor in\n.Pa /tmp .\nThe\n.Pa tmux-UID\ndirectory is created by\n.Nm\nand must not be world readable, writable or executable.\n.Pp\nIf the socket is accidentally removed, the\n.Dv SIGUSR1\nsignal may be sent to the\n.Nm\nserver process to recreate it (note that this will fail if any parent\ndirectories are missing).\n.It Fl l\nBehave as a login shell.\nThis flag currently has no effect and is for compatibility with other shells\nwhen using tmux as a login shell.\n.It Fl N\nDo not start the server even if the command would normally do so (for example\n.Ic new-session\nor\n.Ic start-server ) .\n.It Fl S Ar socket-path\nSpecify a full alternative path to the server socket.\nIf\n.Fl S\nis specified, the default socket directory is not used and any\n.Fl L\nflag is ignored.\n.It Fl T Ar features\nSet terminal features for the client.\nThis is a comma-separated list of features.\nSee the\n.Ic terminal-features\noption.\n.It Fl u\nWrite UTF-8 output to the terminal even if the first environment\nvariable of\n.Ev LC_ALL ,\n.Ev LC_CTYPE ,\nor\n.Ev LANG\nthat is set does not contain\n.Qq UTF-8\nor\n.Qq UTF8 .\n.It Fl V\nReport the\n.Nm\nversion.\n.It Fl v\nRequest verbose logging.\nLog messages will be saved into\n.Pa tmux-client-PID.log\nand\n.Pa tmux-server-PID.log\nfiles in the current directory, where\n.Em PID\nis the PID of the server or client process.\nIf\n.Fl v\nis specified twice, an additional\n.Pa tmux-out-PID.log\nfile is generated with a copy of everything\n.Nm\nwrites to the terminal.\n.Pp\nThe\n.Dv SIGUSR2\nsignal may be sent to the\n.Nm\nserver process to toggle logging between on (as if\n.Fl v\nwas given) and off.\n.It Ar command Op Ar flags\nThis specifies one of a set of commands used to control\n.Nm ,\nas described in the following sections.\nIf no commands are specified, the command in\n.Ic default-client-command\nis assumed, which defaults to\n.Ic new-session .\n.El\n.Sh DEFAULT KEY BINDINGS\n.Nm\nmay be controlled from an attached client by using a key combination of a\nprefix key,\n.Ql C-b\n(Ctrl-b) by default, followed by a command key.\n.Pp\nThe default command key bindings are:\n.Pp\n.Bl -tag -width \"XXXXXXXXXX\" -offset indent -compact\n.It C-b\nSend the prefix key (C-b) through to the application.\n.It C-o\nRotate the panes in the current window forwards.\n.It C-z\nSuspend the\n.Nm\nclient.\n.It !\nBreak the current pane out of the window.\n.It \\&\"\n.\\\" \"\nSplit the current pane into two, top and bottom.\n.It #\nList all paste buffers.\n.It $\nRename the current session.\n.It %\nSplit the current pane into two, left and right.\n.It &\nKill the current window.\n.It \\[aq]\nPrompt for a window index to select.\n.It \\&(\nSwitch the attached client to the previous session.\n.It \\&)\nSwitch the attached client to the next session.\n.It ,\nRename the current window.\n.It -\nDelete the most recently copied buffer of text.\n.It .\nPrompt for an index to move the current window.\n.It 0 to 9\nSelect windows 0 to 9.\n.It :\nEnter the\n.Nm\ncommand prompt.\n.It ;\nMove to the previously active pane.\n.It =\nChoose which buffer to paste interactively from a list.\n.It \\&?\nList all key bindings.\n.It D\nChoose a client to detach.\n.It L\nSwitch the attached client back to the last session.\n.It \\&[\nEnter copy mode to copy text or view the history.\n.It \\&]\nPaste the most recently copied buffer of text.\n.It c\nCreate a new window.\n.It d\nDetach the current client.\n.It f\nPrompt to search for text in open windows.\n.It i\nDisplay some information about the current window.\n.It l\nMove to the previously selected window.\n.It m\nMark the current pane (see\n.Ic select-pane\n.Fl m ) .\n.It M\nClear the marked pane.\n.It n\nChange to the next window.\n.It o\nSelect the next pane in the current window.\n.It p\nChange to the previous window.\n.It q\nBriefly display pane indexes.\n.It r\nForce redraw of the attached client.\n.It s\nSelect a new session for the attached client interactively.\n.It t\nShow the time.\n.It w\nChoose the current window interactively.\n.It x\nKill the current pane.\n.It z\nToggle zoom state of the current pane.\n.It {\nSwap the current pane with the previous pane.\n.It }\nSwap the current pane with the next pane.\n.It \\[ti]\nShow previous messages from\n.Nm ,\nif any.\n.It Page Up\nEnter copy mode and scroll one page up.\n.It Up, Down\n.It Left, Right\nChange to the pane above, below, to the left, or to the right of the current\npane.\n.It M-1 to M-7\nArrange panes in one of the seven preset layouts:\neven-horizontal, even-vertical,\nmain-horizontal, main-horizontal-mirrored,\nmain-vertical, main-vertical-mirrored,\nor tiled.\n.It Space\nArrange the current window in the next preset layout.\n.It M-n\nMove to the next window with a bell or activity marker.\n.It M-o\nRotate the panes in the current window backwards.\n.It M-p\nMove to the previous window with a bell or activity marker.\n.It C-Up, C-Down\n.It C-Left, C-Right\nResize the current pane in steps of one cell.\n.It M-Up, M-Down\n.It M-Left, M-Right\nResize the current pane in steps of five cells.\n.El\n.Pp\nKey bindings may be changed with the\n.Ic bind-key\nand\n.Ic unbind-key\ncommands.\n.Sh COMMAND PARSING AND EXECUTION\n.Nm\nsupports a large number of commands which can be used to control its\nbehaviour.\nEach command is named and can accept zero or more flags and arguments.\nThey may be bound to a key with the\n.Ic bind-key\ncommand or run from the shell prompt, a shell script, a configuration file or\nthe command prompt.\nFor example, the same\n.Ic set-option\ncommand run from the shell prompt, from\n.Pa \\[ti]/.tmux.conf\nand bound to a key may look like:\n.Bd -literal -offset indent\n$ tmux set-option -g status-style bg=cyan\n\nset-option -g status-style bg=cyan\n\nbind-key C set-option -g status-style bg=cyan\n.Ed\n.Pp\nHere, the command name is\n.Ql set-option ,\n.Ql Fl g\nis a flag and\n.Ql status-style\nand\n.Ql bg=cyan\nare arguments.\n.Pp\n.Nm\ndistinguishes between command parsing and execution.\nIn order to execute a command,\n.Nm\nneeds it to be split up into its name and arguments.\nThis is command parsing.\nIf a command is run from the shell, the shell parses it; from inside\n.Nm\nor from a configuration file,\n.Nm\ndoes.\nExamples of when\n.Nm\nparses commands are:\n.Bl -dash -offset indent\n.It\nin a configuration file;\n.It\ntyped at the command prompt (see\n.Ic command-prompt ) ;\n.It\ngiven to\n.Ic bind-key ;\n.It\npassed as arguments to\n.Ic if-shell\nor\n.Ic confirm-before .\n.El\n.Pp\nTo execute commands, each client has a\n.Ql command queue .\nA global command queue not attached to any client is used on startup\nfor configuration files like\n.Pa \\[ti]/.tmux.conf .\nParsed commands added to the queue are executed in order.\nSome commands, like\n.Ic if-shell\nand\n.Ic confirm-before ,\nparse their argument to create a new command which is inserted immediately\nafter themselves.\nThis means that arguments can be parsed twice or more - once when the parent\ncommand (such as\n.Ic if-shell )\nis parsed and again when it parses and executes its command.\nCommands like\n.Ic if-shell ,\n.Ic run-shell\nand\n.Ic display-panes\nstop execution of subsequent commands on the queue until something happens -\n.Ic if-shell\nand\n.Ic run-shell\nuntil a shell command finishes and\n.Ic display-panes\nuntil a key is pressed.\nFor example, the following commands:\n.Bd -literal -offset indent\nnew-session; new-window\nif-shell \"true\" \"split-window\"\nkill-session\n.Ed\n.Pp\nWill execute\n.Ic new-session ,\n.Ic new-window ,\n.Ic if-shell ,\nthe shell command\n.Xr true 1 ,\n.Ic split-window\nand\n.Ic kill-session\nin that order.\n.Pp\nThe\n.Sx COMMANDS\nsection lists the\n.Nm\ncommands and their arguments.\n.Sh PARSING SYNTAX\nThis section describes the syntax of commands parsed by\n.Nm ,\nfor example in a configuration file or at the command prompt.\nNote that when commands are entered into the shell, they are parsed by the shell\n- see for example\n.Xr ksh 1\nor\n.Xr csh 1 .\n.Pp\nEach command is terminated by a newline or a semicolon (;).\nCommands separated by semicolons together form a\n.Ql command sequence\n- if a command in the sequence encounters an error, no subsequent commands are\nexecuted.\n.Pp\nIt is recommended that a semicolon used as a command separator should be\nwritten as an individual token, for example from\n.Xr sh 1 :\n.Bd -literal -offset indent\n$ tmux neww \\\\; splitw\n.Ed\n.Pp\nOr:\n.Bd -literal -offset indent\n$ tmux neww \\[aq];\\[aq] splitw\n.Ed\n.Pp\nOr from the tmux command prompt:\n.Bd -literal -offset indent\nneww ; splitw\n.Ed\n.Pp\nHowever, a trailing semicolon is also interpreted as a command separator,\nfor example in these\n.Xr sh 1\ncommands:\n.Bd -literal -offset indent\n$ tmux neww\\e; splitw\n.Ed\n.Pp\nOr:\n.Bd -literal -offset indent\n$ tmux \\[aq]neww;\\[aq] splitw\n.Ed\n.Pp\nAs in these examples, when running tmux from the shell extra care must be taken\nto properly quote semicolons:\n.Bl -enum -offset Ds\n.It\nSemicolons that should be interpreted as a command separator\nshould be escaped according to the shell conventions.\nFor\n.Xr sh 1\nthis typically means quoted (such as\n.Ql neww \\[aq];\\[aq] splitw )\nor escaped (such as\n.Ql neww \\e; splitw ) .\n.It\nIndividual semicolons or trailing semicolons that should be interpreted as\narguments should be escaped twice: once according to the shell conventions and\na second time for\n.Nm ;\nfor example:\n.Bd -literal -offset indent\n$ tmux neww \\[aq]foo\\e;\\[aq] bar\n$ tmux neww foo\\e\\e\\e; bar\n.Ed\n.It\nSemicolons that are not individual tokens or trailing another token should only\nbe escaped once according to shell conventions; for example:\n.Bd -literal -offset indent\n$ tmux neww \\[aq]foo-;-bar\\[aq]\n$ tmux neww foo-\\e;-bar\n.Ed\n.El\n.Pp\nComments are marked by the unquoted # character - any remaining text after a\ncomment is ignored until the end of the line.\n.Pp\nIf the last character of a line is \\e, the line is joined with the following\nline (the \\e and the newline are completely removed).\nThis is called line continuation and applies both inside and outside quoted\nstrings and in comments, but not inside braces.\n.Pp\nCommand arguments may be specified as strings surrounded by single (\\[aq])\nquotes or double quotes (\\[dq]), or as command lists surrounded by braces ({}).\n.\\\" \"\nThis is required when the argument contains any special character.\nSingle and double quoted strings cannot span multiple lines except with line\ncontinuation.\nBraces can span multiple lines.\n.Pp\nOutside of quotes and inside double quotes, these replacements are performed:\n.Bl -dash -offset indent\n.It\nEnvironment variables preceded by $ are replaced with their value from the\nglobal environment (see the\n.Sx GLOBAL AND SESSION ENVIRONMENT\nsection).\n.It\nA leading \\[ti] or \\[ti]user is expanded to the home directory of the current or\nspecified user.\n.It\n\\euXXXX or \\euXXXXXXXX is replaced by the Unicode codepoint corresponding to\nthe given four or eight digit hexadecimal number.\n.It\nWhen preceded (escaped) by a \\e, the following characters are replaced: \\ee by\nthe escape character; \\er by a carriage return; \\en by a newline; and \\et by a\ntab.\n.It\n\\eooo is replaced by a character of the octal value ooo.\nThree octal digits are required, for example \\e001.\nThe largest valid character is \\e377.\n.It\nAny other characters preceded by \\e are replaced by themselves (that is, the \\e\nis removed) and are not treated as having any special meaning - so for example\n\\e; will not mark a command sequence and \\e$ will not expand an environment\nvariable.\n.El\n.Pp\nBraces are parsed as a configuration file (so conditions such as\n.Ql %if\nare processed) and then converted into a string.\nThey are designed to avoid the need for additional escaping when passing a\ngroup of\n.Nm\ncommands as an argument (for example to\n.Ic if-shell ) .\nThese two examples produce an identical command - note that no escaping is\nneeded when using {}:\n.Bd -literal -offset indent\nif-shell true {\n display -p \\[aq]brace-dollar-foo: }$foo\\[aq]\n}\n\nif-shell true \"display -p \\[aq]brace-dollar-foo: }\\e$foo\\[aq]\"\n.Ed\n.Pp\nBraces may be enclosed inside braces, for example:\n.Bd -literal -offset indent\nbind x if-shell \"true\" {\n if-shell \"true\" {\n display \"true!\"\n }\n}\n.Ed\n.Pp\nEnvironment variables may be set by using the syntax\n.Ql name=value ,\nfor example\n.Ql HOME=/home/user .\nVariables set during parsing are added to the global environment.\nA hidden variable may be set with\n.Ql %hidden ,\nfor example:\n.Bd -literal -offset indent\n%hidden MYVAR=42\n.Ed\n.Pp\nHidden variables are not passed to the environment of processes created\nby tmux.\nSee the\n.Sx GLOBAL AND SESSION ENVIRONMENT\nsection.\n.Pp\nCommands may be parsed conditionally by surrounding them with\n.Ql %if ,\n.Ql %elif ,\n.Ql %else\nand\n.Ql %endif .\nThe argument to\n.Ql %if\nand\n.Ql %elif\nis expanded as a format (see\n.Sx FORMATS )\nand if it evaluates to false (zero or empty), subsequent text is ignored until\nthe closing\n.Ql %elif ,\n.Ql %else\nor\n.Ql %endif .\nFor example:\n.Bd -literal -offset indent\n%if \"#{==:#{host},myhost}\"\nset -g status-style bg=red\n%elif \"#{==:#{host},myotherhost}\"\nset -g status-style bg=green\n%else\nset -g status-style bg=blue\n%endif\n.Ed\n.Pp\nWill change the status line to red if running on\n.Ql myhost ,\ngreen if running on\n.Ql myotherhost ,\nor blue if running on another host.\nConditionals may be given on one line, for example:\n.Bd -literal -offset indent\n%if #{==:#{host},myhost} set -g status-style bg=red %endif\n.Ed\n.Sh COMMANDS\nThis section describes the commands supported by\n.Nm .\nMost commands accept the optional\n.Fl t\n(and sometimes\n.Fl s )\nargument with one of\n.Ar target-client ,\n.Ar target-session ,\n.Ar target-window ,\nor\n.Ar target-pane .\nThese specify the client, session, window or pane which a command should affect.\n.Pp\n.Ar target-client\nshould be the name of the client,\ntypically the\n.Xr pty 4\nfile to which the client is connected, for example either of\n.Pa /dev/ttyp1\nor\n.Pa ttyp1\nfor the client attached to\n.Pa /dev/ttyp1 .\nIf no client is specified,\n.Nm\nattempts to work out the client currently in use; if that fails, an error is\nreported.\nClients may be listed with the\n.Ic list-clients\ncommand.\n.Pp\n.Ar target-session\nis tried as, in order:\n.Bl -enum -offset Ds\n.It\nA session ID prefixed with a $.\n.It\nAn exact name of a session (as listed by the\n.Ic list-sessions\ncommand).\n.It\nThe start of a session name, for example\n.Ql mysess\nwould match a session named\n.Ql mysession .\n.It\nA\n.Xr glob 7\npattern which is matched against the session name.\n.El\n.Pp\nIf the session name is prefixed with an\n.Ql = ,\nonly an exact match is accepted (so\n.Ql =mysess\nwill only match exactly\n.Ql mysess ,\nnot\n.Ql mysession ) .\n.Pp\nIf a single session is found, it is used as the target session; multiple matches\nproduce an error.\nIf a session is omitted, the current session is used if available; if no\ncurrent session is available, the most recently used is chosen.\n.Pp\n.Ar target-window\n(or\n.Ar src-window\nor\n.Ar dst-window )\nspecifies a window in the form\n.Em session Ns \\&: Ns Em window .\n.Em session\nfollows the same rules as for\n.Ar target-session ,\nand\n.Em window\nis looked for in order as:\n.Bl -enum -offset Ds\n.It\nA special token, listed below.\n.It\nA window index, for example\n.Ql mysession:1\nis window 1 in session\n.Ql mysession .\n.It\nA window ID, such as @1.\n.It\nAn exact window name, such as\n.Ql mysession:mywindow .\n.It\nThe start of a window name, such as\n.Ql mysession:mywin .\n.It\nAs a\n.Xr glob 7\npattern matched against the window name.\n.El\n.Pp\nLike sessions, a\n.Ql =\nprefix will do an exact match only.\nAn empty window name specifies the next unused index if appropriate (for\nexample the\n.Ic new-window\nand\n.Ic link-window\ncommands)\notherwise the current window in\n.Em session\nis chosen.\n.Pp\nThe following special tokens are available to indicate particular windows.\nEach has a single-character alternative form.\n.Bl -column \"XXXXXXXXXX\" \"X\"\n.It Sy \"Token\" Ta Sy \"\" Ta Sy \"Meaning\"\n.It Li \"{start}\" Ta \"^\" Ta \"The lowest-numbered window\"\n.It Li \"{end}\" Ta \"$\" Ta \"The highest-numbered window\"\n.It Li \"{last}\" Ta \"!\" Ta \"The last (previously current) window\"\n.It Li \"{next}\" Ta \"+\" Ta \"The next window by number\"\n.It Li \"{previous}\" Ta \"-\" Ta \"The previous window by number\"\n.It Li \"{current}\" Ta \"@\" Ta \"The current window\"\n.El\n.Pp\n.Ar target-pane\n(or\n.Ar src-pane\nor\n.Ar dst-pane )\nmay be a pane ID or takes a similar form to\n.Ar target-window\nbut with the optional addition of a period followed by a pane index or pane ID,\nfor example:\n.Ql mysession:mywindow.1 .\nIf the pane index is omitted, the currently active pane in the specified\nwindow is used.\nThe following special tokens are available for the pane index:\n.Bl -column \"XXXXXXXXXXXXXX\" \"X\"\n.It Sy \"Token\" Ta Sy \"\" Ta Sy \"Meaning\"\n.It Li \"{last}\" Ta \"!\" Ta \"The last (previously active) pane\"\n.It Li \"{next}\" Ta \"+\" Ta \"The next pane by number\"\n.It Li \"{previous}\" Ta \"-\" Ta \"The previous pane by number\"\n.It Li \"{top}\" Ta \"\" Ta \"The top pane\"\n.It Li \"{bottom}\" Ta \"\" Ta \"The bottom pane\"\n.It Li \"{left}\" Ta \"\" Ta \"The leftmost pane\"\n.It Li \"{right}\" Ta \"\" Ta \"The rightmost pane\"\n.It Li \"{top-left}\" Ta \"\" Ta \"The top-left pane\"\n.It Li \"{top-right}\" Ta \"\" Ta \"The top-right pane\"\n.It Li \"{bottom-left}\" Ta \"\" Ta \"The bottom-left pane\"\n.It Li \"{bottom-right}\" Ta \"\" Ta \"The bottom-right pane\"\n.It Li \"{up-of}\" Ta \"\" Ta \"The pane above the active pane\"\n.It Li \"{down-of}\" Ta \"\" Ta \"The pane below the active pane\"\n.It Li \"{left-of}\" Ta \"\" Ta \"The pane to the left of the active pane\"\n.It Li \"{right-of}\" Ta \"\" Ta \"The pane to the right of the active pane\"\n.It Li \"{active}\" Ta \"@\" Ta \"The active pane\"\n.El\n.Pp\nThe tokens\n.Ql +\nand\n.Ql -\nmay be followed by an offset, for example:\n.Bd -literal -offset indent\nselect-window -t:+2\n.Ed\n.Pp\nIn addition,\n.Em target-session ,\n.Em target-window\nor\n.Em target-pane\nmay consist entirely of the token\n.Ql {mouse}\n(alternative form\n.Ql = )\nto specify the session, window or pane where the most recent mouse event\noccurred (see the\n.Sx MOUSE SUPPORT\nsection)\nor\n.Ql {marked}\n(alternative form\n.Ql \\[ti] )\nto specify the marked pane (see\n.Ic select-pane\n.Fl m ) .\n.Pp\nSessions, window and panes are each numbered with a unique ID; session IDs are\nprefixed with a\n.Ql $ ,\nwindows with a\n.Ql @ ,\nand panes with a\n.Ql % .\nThese are unique and are unchanged for the life of the session, window or pane\nin the\n.Nm\nserver.\nThe pane ID is passed to the child process of the pane in the\n.Ev TMUX_PANE\nenvironment variable.\nIDs may be displayed using the\n.Ql session_id ,\n.Ql window_id ,\nor\n.Ql pane_id\nformats (see the\n.Sx FORMATS\nsection) and the\n.Ic display-message ,\n.Ic list-sessions ,\n.Ic list-windows\nor\n.Ic list-panes\ncommands.\n.Pp\n.Ar shell-command\narguments are\n.Xr sh 1\ncommands.\nThis may be a single argument passed to the shell, for example:\n.Bd -literal -offset indent\nnew-window \\[aq]vi \\[ti]/.tmux.conf\\[aq]\n.Ed\n.Pp\nWill run:\n.Bd -literal -offset indent\n/bin/sh -c \\[aq]vi \\[ti]/.tmux.conf\\[aq]\n.Ed\n.Pp\nAdditionally, the\n.Ic new-window ,\n.Ic new-session ,\n.Ic split-window ,\n.Ic respawn-window\nand\n.Ic respawn-pane\ncommands allow\n.Ar shell-command\nto be given as multiple arguments and executed directly (without\n.Ql sh -c ) .\nThis can avoid issues with shell quoting.\nFor example:\n.Bd -literal -offset indent\n$ tmux new-window vi \\[ti]/.tmux.conf\n.Ed\n.Pp\nWill run\n.Xr vi 1\ndirectly without invoking the shell.\n.Pp\n.Ar command\n.Op Ar argument ...\nrefers to a\n.Nm\ncommand, either passed with the command and arguments separately, for example:\n.Bd -literal -offset indent\nbind-key F1 set-option status off\n.Ed\n.Pp\nOr passed as a single string argument in\n.Pa .tmux.conf ,\nfor example:\n.Bd -literal -offset indent\nbind-key F1 { set-option status off }\n.Ed\n.Pp\nExample\n.Nm\ncommands include:\n.Bd -literal -offset indent\nrefresh-client -t/dev/ttyp2\n\nrename-session -tfirst newname\n\nset-option -wt:0 monitor-activity on\n\nnew-window ; split-window -d\n\nbind-key R source-file \\[ti]/.tmux.conf \\e; \\e\n\tdisplay-message \"source-file done\"\n.Ed\n.Pp\nOr from\n.Xr sh 1 :\n.Bd -literal -offset indent\n$ tmux kill-window -t :1\n\n$ tmux new-window \\e; split-window -d\n\n$ tmux new-session -d \\[aq]vi \\[ti]/.tmux.conf\\[aq] \\e; split-window -d \\e; attach\n.Ed\n.Sh CLIENTS AND SESSIONS\nThe\n.Nm\nserver manages clients, sessions, windows and panes.\nClients are attached to sessions to interact with them, either\nwhen they are created with the\n.Ic new-session\ncommand, or later with the\n.Ic attach-session\ncommand.\nEach session has one or more windows\n.Em linked\ninto it.\nWindows may be linked to multiple sessions and are made up of one or\nmore panes,\neach of which contains a pseudo terminal.\nCommands for creating, linking and otherwise manipulating windows\nare covered\nin the\n.Sx WINDOWS AND PANES\nsection.\n.Pp\nThe following commands are available to manage clients and sessions:\n.Bl -tag -width Ds\n.Tg attach\n.It Xo Ic attach-session\n.Op Fl dErx\n.Op Fl c Ar working-directory\n.Op Fl f Ar flags\n.Op Fl t Ar target-session\n.Xc\n.D1 Pq alias: Ic attach\nIf run from outside\n.Nm ,\nattach to\n.Ar target-session\nin the current terminal.\n.Ar target-session\nmust already exist - to create a new session, see the\n.Ic new-session\ncommand (with\n.Fl A\nto create or attach).\nIf used from inside, switch the currently attached session to\n.Ar target-session .\nIf\n.Fl d\nis specified, any other clients attached to the session are detached.\nIf\n.Fl x\nis given, send\n.Dv SIGHUP\nto the parent process of the client as well as\ndetaching the client, typically causing it to exit.\n.Fl f\nsets a comma-separated list of client flags.\nThe flags are:\n.Bl -tag -width Ds\n.It active-pane\nthe client has an independent active pane\n.It ignore-size\nthe client does not affect the size of other clients\n.It no-detach-on-destroy\ndo not detach the client when the session it is attached to is destroyed if\nthere are any other sessions\n.It no-output\nthe client does not receive pane output in control mode\n.It pause-after=seconds\noutput is paused once the pane is\n.Ar seconds\nbehind in control mode\n.It read-only\nthe client is read-only\n.It wait-exit\nwait for an empty line input before exiting in control mode\n.El\n.Pp\nA leading\n.Ql \\&!\nturns a flag off if the client is already attached.\n.Fl r\nis an alias for\n.Fl f\n.Ar read-only,ignore-size .\nWhen a client is read-only, only keys bound to the\n.Ic detach-client\nor\n.Ic switch-client\ncommands have any effect.\nA client with the\n.Ar active-pane\nflag allows the active pane to be selected independently of the window's active\npane used by clients without the flag.\nThis only affects the cursor position and commands issued from the client;\nother features such as hooks and styles continue to use the window's active\npane.\n.Pp\nIf no server is started,\n.Ic attach-session\nwill attempt to start it; this will fail unless sessions are created in the\nconfiguration file.\n.Pp\nThe\n.Ar target-session\nrules for\n.Ic attach-session\nare slightly adjusted: if\n.Nm\nneeds to select the most recently used session, it will prefer the most\nrecently used\n.Em unattached\nsession.\n.Pp\n.Fl c\nwill set the session working directory (used for new windows) to\n.Ar working-directory .\n.Pp\nIf\n.Fl E\nis used, the\n.Ic update-environment\noption will not be applied.\n.Tg detach\n.It Xo Ic detach-client\n.Op Fl aP\n.Op Fl E Ar shell-command\n.Op Fl s Ar target-session\n.Op Fl t Ar target-client\n.Xc\n.D1 Pq alias: Ic detach\nDetach the current client if bound to a key, the client specified with\n.Fl t ,\nor all clients currently attached to the session specified by\n.Fl s .\nThe\n.Fl a\noption kills all but the client given with\n.Fl t .\nIf\n.Fl P\nis given, send\n.Dv SIGHUP\nto the parent process of the client, typically causing it\nto exit.\nWith\n.Fl E ,\nrun\n.Ar shell-command\nto replace the client.\n.Tg has\n.It Ic has-session Op Fl t Ar target-session\n.D1 Pq alias: Ic has\nReport an error and exit with 1 if the specified session does not exist.\nIf it does exist, exit with 0.\n.It Ic kill-server\nKill the\n.Nm\nserver and clients and destroy all sessions.\n.It Xo Ic kill-session\n.Op Fl aC\n.Op Fl t Ar target-session\n.Xc\nDestroy the given session, closing any windows linked to it and no other\nsessions, and detaching all clients attached to it.\nIf\n.Fl a\nis given, all sessions but the specified one is killed.\nThe\n.Fl C\nflag clears alerts (bell, activity, or silence) in all windows linked to the\nsession.\n.Tg lsc\n.It Xo Ic list-clients\n.Op Fl r\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl O Ar sort-order\n.Op Fl t Ar target-session\n.Xc\n.D1 Pq alias: Ic lsc\nList all clients attached to the server.\n.Fl F\nspecifies the format of each line and\n.Fl f\na filter.\nOnly clients for which the filter is true are shown.\nSee the\n.Sx FORMATS\nsection.\n.Fl O\nspecifies the sort order: one of\n.Ql name ,\n.Ql size ,\n.Ql creation\n(time), or\n.Ql activity\n(time).\n.Fl r\nreverses the sort order.\nIf\n.Ar target-session\nis specified, list only clients connected to that session.\n.Tg lscm\n.It Xo Ic list-commands\n.Op Fl F Ar format\n.Op Ar command\n.Xc\n.D1 Pq alias: Ic lscm\nList the syntax of\n.Ar command\nor - if omitted - of all commands supported by\n.Nm .\n.Tg ls\n.It Xo Ic list-sessions\n.Op Fl r\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl O Ar sort-order\n.Xc\n.D1 Pq alias: Ic ls\nList all sessions managed by the server.\n.Fl F\nspecifies the format of each line and\n.Fl f\na filter.\nOnly sessions for which the filter is true are shown.\nSee the\n.Sx FORMATS\nsection.\n.Fl O\nspecifies the sort order: one of\n.Ql index ,\n.Ql name ,\n.Ql creation\n(time), or\n.Ql activity\n(time).\n.Fl r\nreverses the sort order.\n.Tg lockc\n.It Ic lock-client Op Fl t Ar target-client\n.D1 Pq alias: Ic lockc\nLock\n.Ar target-client ,\nsee the\n.Ic lock-server\ncommand.\n.Tg locks\n.It Ic lock-session Op Fl t Ar target-session\n.D1 Pq alias: Ic locks\nLock all clients attached to\n.Ar target-session .\n.Tg new\n.It Xo Ic new-session\n.Op Fl AdDEPX\n.Op Fl c Ar start-directory\n.Op Fl e Ar environment\n.Op Fl f Ar flags\n.Op Fl F Ar format\n.Op Fl n Ar window-name\n.Op Fl s Ar session-name\n.Op Fl t Ar group-name\n.Op Fl x Ar width\n.Op Fl y Ar height\n.Op Ar shell-command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic new\nCreate a new session with name\n.Ar session-name .\n.Pp\nThe new session is attached to the current terminal unless\n.Fl d\nis given.\n.Ar window-name\nand\n.Ar shell-command\nare the name of and shell command to execute in the initial window.\nWith\n.Fl d ,\nthe initial size comes from the global\n.Ic default-size\noption;\n.Fl x\nand\n.Fl y\ncan be used to specify a different size.\n.Ql -\nuses the size of the current client if any.\nIf\n.Fl x\nor\n.Fl y\nis given, the\n.Ic default-size\noption is set for the session.\n.Fl f\nsets a comma-separated list of client flags (see\n.Ic attach-session ) .\n.Pp\nIf run from a terminal, any\n.Xr termios 4\nspecial characters are saved and used for new windows in the new session.\n.Pp\nThe\n.Fl A\nflag makes\n.Ic new-session\nbehave like\n.Ic attach-session\nif\n.Ar session-name\nalready exists;\nif\n.Fl A\nis given,\n.Fl D\nbehaves like\n.Fl d\nto\n.Ic attach-session ,\nand\n.Fl X\nbehaves like\n.Fl x\nto\n.Ic attach-session .\n.Pp\nIf\n.Fl t\nis given, it specifies a\n.Ic session group .\nSessions in the same group share the same set of windows - new windows are\nlinked to all sessions in the group and any windows closed removed from all\nsessions.\nThe current and previous window and any session options remain independent and\nany session in a group may be killed without affecting the others.\nThe\n.Ar group-name\nargument may be:\n.Bl -enum -width Ds\n.It\nthe name of an existing group, in which case the new session is added to that\ngroup;\n.It\nthe name of an existing session - the new session is added to the same group\nas that session, creating a new group if necessary;\n.It\nthe name for a new group containing only the new session.\n.El\n.Pp\n.Fl n\nand\n.Ar shell-command\nare invalid if\n.Fl t\nis used.\n.Pp\nThe\n.Fl P\noption prints information about the new session after it has been created.\nBy default, it uses the format\n.Ql #{session_name}:\\&\nbut a different format may be specified with\n.Fl F .\n.Pp\nIf\n.Fl E\nis used, the\n.Ic update-environment\noption will not be applied.\n.Fl e\ntakes the form\n.Ql VARIABLE=value\nand sets an environment variable for the newly created session; it may be\nspecified multiple times.\n.Tg refresh\n.It Xo Ic refresh-client\n.Op Fl cDlLRSU\n.Op Fl A Ar pane:state\n.Op Fl B Ar name:what:format\n.Op Fl C Ar size\n.Op Fl f Ar flags\n.Op Fl r Ar pane:report\n.Op Fl t Ar target-client\n.Op Ar adjustment\n.Xc\n.D1 Pq alias: Ic refresh\nRefresh the current client if bound to a key, or a single client if one is given\nwith\n.Fl t .\nIf\n.Fl S\nis specified, only update the client's status line.\n.Pp\nThe\n.Fl U ,\n.Fl D ,\n.Fl L\n.Fl R ,\nand\n.Fl c\nflags allow the visible portion of a window which is larger than the client\nto be changed.\n.Fl U\nmoves the visible part up by\n.Ar adjustment\nrows and\n.Fl D\ndown,\n.Fl L\nleft by\n.Ar adjustment\ncolumns and\n.Fl R\nright.\n.Fl c\nreturns to tracking the cursor automatically.\nIf\n.Ar adjustment\nis omitted, 1 is used.\nNote that the visible position is a property of the client not of the\nwindow, changing the current window in the attached session will reset\nit.\n.Pp\n.Fl C\nsets the width and height of a control mode client or of a window for a\ncontrol mode client,\n.Ar size\nmust be one of\n.Ql widthxheight\nor\n.Ql window ID:widthxheight ,\nfor example\n.Ql 80x24\nor\n.Ql @0:80x24 .\n.Fl A\nallows a control mode client to trigger actions on a pane.\nThe argument is a pane ID (with leading\n.Ql % ) ,\na colon, then one of\n.Ql on ,\n.Ql off ,\n.Ql continue\nor\n.Ql pause .\nIf\n.Ql off ,\n.Nm\nwill not send output from the pane to the client and if all clients have turned\nthe pane off, will stop reading from the pane.\nIf\n.Ql continue ,\n.Nm\nwill return to sending output to the pane if it was paused (manually or with the\n.Ar pause-after\nflag).\nIf\n.Ql pause ,\n.Nm\nwill pause the pane.\n.Fl A\nmay be given multiple times for different panes.\n.Pp\n.Fl B\nsets a subscription to a format for a control mode client.\nThe argument is split into three items by colons:\n.Ar name\nis a name for the subscription;\n.Ar what\nis a type of item to subscribe to;\n.Ar format\nis the format.\nAfter a subscription is added, changes to the format are reported with the\n.Ic %subscription-changed\nnotification, at most once a second.\nIf only the name is given, the subscription is removed.\n.Ar what\nmay be empty to check the format only for the attached session, or one of:\na pane ID such as\n.Ql %0 ;\n.Ql %*\nfor all panes in the attached session;\na window ID such as\n.Ql @0 ;\nor\n.Ql @*\nfor all windows in the attached session.\n.Pp\n.Fl f\nsets a comma-separated list of client flags, see\n.Ic attach-session .\n.Fl r\nallows a control mode client to provide information about a pane via a report\n(such as the response to OSC 10).\nThe argument is a pane ID (with a leading\n.Ql % ) ,\na colon, then a report escape sequence.\n.Pp\n.Fl l\nrequests the clipboard from the client using the\n.Xr xterm 1\nescape sequence and stores it in a new paste buffer.\n.Pp\n.Fl L ,\n.Fl R ,\n.Fl U\nand\n.Fl D\nmove the visible portion of the window left, right, up or down\nby\n.Ar adjustment ,\nif the window is larger than the client.\n.Fl c\nresets so that the position follows the cursor.\nSee the\n.Ic window-size\noption.\n.Tg rename\n.It Xo Ic rename-session\n.Op Fl t Ar target-session\n.Ar new-name\n.Xc\n.D1 Pq alias: Ic rename\nRename the session to\n.Ar new-name .\n.It Xo Ic server-access\n.Op Fl adlrw\n.Op Ar user\n.Xc\nChange the access or read/write permission of\n.Ar user .\nThe user running the\n.Nm\nserver (its owner) and the root user cannot be changed and are always\npermitted access.\n.Pp\n.Fl a\nand\n.Fl d\nare used to give or revoke access for the specified user.\nIf the user is already attached, the\n.Fl d\nflag causes their clients to be detached.\n.Pp\n.Fl r\nand\n.Fl w\nchange the permissions for\n.Ar user :\n.Fl r\nmakes their clients read-only and\n.Fl w\nwritable.\n.Fl l\nlists current access permissions.\n.Pp\nBy default, the access list is empty and\n.Nm\ncreates sockets with file system permissions preventing access by any user\nother than the owner (and root).\nThese permissions must be changed manually.\nGreat care should be taken not to allow access to untrusted users even\nread-only.\n.Tg showmsgs\n.It Xo Ic show-messages\n.Op Fl JT\n.Op Fl t Ar target-client\n.Xc\n.D1 Pq alias: Ic showmsgs\nShow server messages or information.\nMessages are stored, up to a maximum of the limit set by the\n.Ar message-limit\nserver option.\n.Fl J\nand\n.Fl T\nshow debugging information about jobs and terminals.\n.Tg source\n.It Xo Ic source-file\n.Op Fl Fnqv\n.Op Fl t Ar target-pane\n.Ar path ...\n.Xc\n.D1 Pq alias: Ic source\nExecute commands from one or more files specified by\n.Ar path\n(which may be\n.Xr glob 7\npatterns).\nIf\n.Fl F\nis present, then\n.Ar path\nis expanded as a format.\nIf\n.Fl q\nis given, no error will be returned if\n.Ar path\ndoes not exist.\nWith\n.Fl n ,\nthe file is parsed but no commands are executed.\n.Fl v\nshows the parsed commands and line numbers if possible.\n.Tg start\n.It Ic start-server\n.D1 Pq alias: Ic start\nStart the\n.Nm\nserver, if not already running, without creating any sessions.\n.Pp\nNote that as by default the\n.Nm\nserver will exit with no sessions, this is only useful if a session is created\nin\n.Pa \\[ti]/.tmux.conf ,\n.Ic exit-empty\nis turned off, or another command is run as part of the same command sequence.\nFor example:\n.Bd -literal -offset indent\n$ tmux start \\\\; show -g\n.Ed\n.Tg suspendc\n.It Xo Ic suspend-client\n.Op Fl t Ar target-client\n.Xc\n.D1 Pq alias: Ic suspendc\nSuspend a client by sending\n.Dv SIGTSTP\n(tty stop).\n.Tg switchc\n.It Xo Ic switch-client\n.Op Fl ElnprZ\n.Op Fl c Ar target-client\n.Op Fl O Ar sort-order\n.Op Fl t Ar target-session\n.Op Fl T Ar key-table\n.Xc\n.D1 Pq alias: Ic switchc\nSwitch the current session for client\n.Ar target-client\nto\n.Ar target-session .\nAs a special case,\n.Fl t\nmay refer to a pane (a target that contains\n.Ql \\&: ,\n.Ql \\&.\nor\n.Ql % ) ,\nto change session, window and pane.\nIn that case,\n.Fl Z\nkeeps the window zoomed if it was zoomed.\nIf\n.Fl l ,\n.Fl n\nor\n.Fl p\nis used, the client is moved to the last, next or previous session\nrespectively.\n.Fl O\nmay be used with\n.Fl n\nand\n.Fl p\nto specify the field to sort on: one of\n.Ql name ,\n.Ql size ,\n.Ql creation\n(time), or\n.Ql activity\n(time).\n.Fl r\ntoggles the client\n.Ic read-only\nand\n.Ic ignore-size\nflags (see the\n.Ic attach-session\ncommand).\n.Pp\nIf\n.Fl E\nis used,\n.Ic update-environment\noption will not be applied.\n.Pp\n.Fl T\nsets the client's key table; the next key will be looked up using\n.Ar key-table .\nAfter that key, the client is returned to its default key table (normally\n.Em root ) .\nThis may be used to configure multiple prefix keys, or to bind commands to\nsequences of keys.\nFor example, to make typing\n.Ql abc\nrun the\n.Ic list-keys\ncommand:\n.Bd -literal -offset indent\nbind-key -Ttable2 c list-keys\nbind-key -Ttable1 b switch-client -Ttable2\nbind-key -Troot a switch-client -Ttable1\n.Ed\n.El\n.Sh WINDOWS AND PANES\nEach window displayed by\n.Nm\nmay be split into one or more\n.Em panes ;\neach pane takes up a certain area of the display and is a separate terminal.\nA window may be split into panes using the\n.Ic split-window\ncommand.\nWindows may be split horizontally (with the\n.Fl h\nflag) or vertically.\nPanes may be resized with the\n.Ic resize-pane\ncommand (bound to\n.Ql C-Up ,\n.Ql C-Down\n.Ql C-Left\nand\n.Ql C-Right\nby default), the current pane may be changed with the\n.Ic select-pane\ncommand and the\n.Ic rotate-window\nand\n.Ic swap-pane\ncommands may be used to swap panes without changing their position.\nPanes are numbered beginning from zero in the order they are created.\n.Pp\nBy default, a\n.Nm\npane permits direct access to the terminal contained in the pane.\nA pane may also be put into one of several modes:\n.Bl -dash -offset indent\n.It\nCopy mode, which permits a section of a window or its\nhistory to be copied to a\n.Em paste buffer\nfor later insertion into another window.\nThis mode is entered with the\n.Ic copy-mode\ncommand, bound to\n.Ql \\&[\nby default.\nCopied text can be pasted with the\n.Ic paste-buffer\ncommand, bound to\n.Ql \\&] .\n.It\nView mode, which is like copy mode but is entered when a command that produces\noutput, such as\n.Ic list-keys ,\nis executed from a key binding.\n.It\nChoose mode, which allows an item to be chosen from a list.\nThis may be a client, a session or window or pane, or a buffer.\nThis mode is entered with the\n.Ic choose-buffer ,\n.Ic choose-client\nand\n.Ic choose-tree\ncommands.\n.El\n.Pp\nIn copy mode an indicator is displayed in the top-right corner of the pane with\nthe current position and the number of lines in the history.\n.Pp\nCommands are sent to copy mode using the\n.Fl X\nflag to the\n.Ic send-keys\ncommand.\nWhen a key is pressed, copy mode automatically uses one of two key tables,\ndepending on the\n.Ic mode-keys\noption:\n.Ic copy-mode\nfor emacs, or\n.Ic copy-mode-vi\nfor vi.\nKey tables may be viewed with the\n.Ic list-keys\ncommand.\n.Pp\nThe following commands are supported in copy mode:\n.Bl -tag -width Ds\n.It Xo\n.Ic append-selection\n.Xc\nAppend the selection to the top paste buffer.\n.It Xo\n.Ic append-selection-and-cancel\n(vi: A)\n.Xc\nAppend the selection to the top paste buffer and exit copy mode.\n.It Xo\n.Ic back-to-indentation\n(vi: ^)\n(emacs: M-m)\n.Xc\nMove the cursor back to the indentation.\n.It Xo\n.Ic begin-selection\n(vi: Space)\n(emacs: C-Space)\n.Xc\nBegin selection.\n.It Xo\n.Ic bottom-line\n(vi: L)\n.Xc\nMove to the bottom line.\n.It Xo\n.Ic cancel\n(vi: q)\n(emacs: Escape)\n.Xc\nExit copy mode.\n.It Xo\n.Ic clear-selection\n(vi: Escape)\n(emacs: C-g)\n.Xc\nClear the current selection.\n.It Xo\n.Ic copy-end-of-line\n.Op Fl CP\n.Op Ar prefix\n.Xc\nCopy from the cursor position to the end of the line.\n.Ar prefix\nis used to name the new paste buffer.\n.It Xo\n.Ic copy-end-of-line-and-cancel\n.Op Fl CP\n.Op Ar prefix\n.Xc\nCopy from the cursor position and exit copy mode.\n.It Xo\n.Ic copy-pipe-end-of-line\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nCopy from the cursor position to the end of the line and pipe the text to\n.Ar command .\n.Ar prefix\nis used to name the new paste buffer.\n.It Xo\n.Ic copy-pipe-end-of-line-and-cancel\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nSame as\n.Ic copy-pipe-end-of-line\nbut also exit copy mode.\n.It Xo\n.Ic copy-line\n.Op Fl CP\n.Op Ar prefix\n.Xc\nCopy the entire line.\n.It Xo\n.Ic copy-line-and-cancel\n.Op Fl CP\n.Op Ar prefix\n.Xc\nCopy the entire line and exit copy mode.\n.It Xo\n.Ic copy-pipe-line\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nCopy the entire line and pipe the text to\n.Ar command .\n.Ar prefix\nis used to name the new paste buffer.\n.It Xo\n.Ic copy-pipe-line-and-cancel\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nSame as\n.Ic copy-pipe-line\nbut also exit copy mode.\n.It Xo\n.Ic copy-pipe\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nCopy the selection, clear it and pipe its text to\n.Ar command .\n.Ar prefix\nis used to name the new paste buffer.\n.It Xo\n.Ic copy-pipe-no-clear\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nSame as\n.Ic copy-pipe\nbut do not clear the selection.\n.It Xo\n.Ic copy-pipe-and-cancel\n.Op Fl CP\n.Op Ar command\n.Op Ar prefix\n.Xc\nSame as\n.Ic copy-pipe\nbut also exit copy mode.\n.It Xo\n.Ic copy-selection\n.Op Fl CP\n.Op Ar prefix\n.Xc\nCopies the current selection.\n.It Xo\n.Ic copy-selection-no-clear\n.Op Fl CP\n.Op Ar prefix\n.Xc\nSame as\n.Ic copy-selection\nbut do not clear the selection.\n.It Xo\n.Ic copy-selection-and-cancel\n.Op Fl CP\n.Op Ar prefix\n(vi: Enter)\n(emacs: M-w)\n.Xc\nCopy the current selection and exit copy mode.\n.It Xo\n.Ic cursor-down\n(vi: j)\n(emacs: Down)\n.Xc\nMove the cursor down.\n.It Xo\n.Ic cursor-down-and-cancel\n.Xc\nSame as\n.Ic cursor-down\nbut also exit copy mode if reaching the bottom.\n.It Xo\n.Ic cursor-left\n(vi: h)\n(emacs: Left)\n.Xc\nMove the cursor left.\n.It Xo\n.Ic cursor-right\n(vi: l)\n(emacs: Right)\n.Xc\nMove the cursor right.\n.It Xo\n.Ic cursor-up\n(vi: k)\n(emacs: Up)\n.Xc\nMove the cursor up.\n.It Xo\n.Ic cursor-centre-vertical\n(emacs: C-l)\n.Xc\nMoves the cursor to the vertical centre of the pane.\n.It Xo\n.Ic cursor-centre-horizontal\n(emacs: M-l)\n.Xc\nMoves the cursor to the horizontal centre of the pane.\n.It Xo\n.Ic end-of-line\n(vi: $)\n(emacs: C-e)\n.Xc\nMove the cursor to the end of the line.\n.It Xo\n.Ic goto-line\n.Ar line\n(vi: :)\n(emacs: g)\n.Xc\nMove the cursor to a specific line.\n.It Xo\n.Ic halfpage-down\n(vi: C-d)\n(emacs: M-Down)\n.Xc\nScroll down by half a page.\n.It Xo\n.Ic halfpage-down-and-cancel\n.Xc\nSame as\n.Ic halfpage-down\nbut also exit copy mode if reaching the bottom.\n.It Xo\n.Ic halfpage-up\n(vi: C-u)\n(emacs: M-Up)\n.Xc\nScroll up by half a page.\n.It Xo\n.Ic history-bottom\n(vi: G)\n(emacs: M->)\n.Xc\nScroll to the bottom of the history.\n.It Xo\n.Ic history-top\n(vi: g)\n(emacs: M-<)\n.Xc\nScroll to the top of the history.\n.It Xo\n.Ic jump-again\n(vi: ;)\n(emacs: ;)\n.Xc\nRepeat the last jump.\n.It Xo\n.Ic jump-backward\n.Ar to\n(vi: F)\n(emacs: F)\n.Xc\nJump backwards to the specified text.\n.It Xo\n.Ic jump-forward\n.Ar to\n(vi: f)\n(emacs: f)\n.Xc\nJump forward to the specified text.\n.It Xo\n.Ic jump-reverse\n(vi: ,)\n(emacs: ,)\n.Xc\nRepeat the last jump in the reverse direction (forward becomes backward and\nbackward becomes forward).\n.It Xo\n.Ic jump-to-backward\n.Ar to\n(vi: T)\n.Xc\nJump backwards, but one character less, placing the cursor on the character\nafter the target.\n.It Xo\n.Ic jump-to-forward\n.Ar to\n(vi: t)\n.Xc\nJump forward, but one character less, placing the cursor on the character\nbefore the target.\n.It Xo\n.Ic jump-to-mark\n(vi: M-x)\n(emacs: M-x)\n.Xc\nJump to the last mark.\n.It Xo\n.Ic middle-line\n(vi: M)\n(emacs: M-r)\n.Xc\nMove to the middle line.\n.It Xo\n.Ic next-matching-bracket\n(vi: %)\n(emacs: M-C-f)\n.Xc\nMove to the next matching bracket.\n.It Xo\n.Ic next-paragraph\n(vi: })\n(emacs: M-})\n.Xc\nMove to the next paragraph.\n.It Xo\n.Ic next-prompt\n.Op Fl o\n.Xc\nMove to the next prompt.\n.It Xo\n.Ic next-word\n(vi: w)\n.Xc\nMove to the next word.\n.It Xo\n.Ic next-word-end\n(vi: e)\n(emacs: M-f)\n.Xc\nMove to the end of the next word.\n.It Xo\n.Ic next-space\n(vi: W)\n.Xc\nSame as\n.Ic next-word\nbut use a space alone as the word separator.\n.It Xo\n.Ic next-space-end\n(vi: E)\n.Xc\nSame as\n.Ic next-word-end\nbut use a space alone as the word separator.\n.It Xo\n.Ic other-end\n(vi: o)\n.Xc\nSwitch at which end of the selection the cursor sits.\n.It Xo\n.Ic page-down\n(vi: C-f)\n(emacs: PageDown)\n.Xc\nScroll down by one page.\n.It Xo\n.Ic page-down-and-cancel\n.Xc\nSame as\n.Ic page-down\nbut also exit copy mode if reaching the bottom.\n.It Xo\n.Ic page-up\n(vi: C-b)\n(emacs: PageUp)\n.Xc\nScroll up by one page.\n.It Xo\n.Ic pipe\n.Op Ar command\n.Xc\nPipe the selected text to\n.Ar command\nand clear the selection.\n.It Xo\n.Ic pipe-no-clear\n.Op Ar command\n.Xc\nSame as\n.Ic pipe\nbut do not clear the selection.\n.It Xo\n.Ic pipe-and-cancel\n.Op Ar command\n.Op Ar prefix\n.Xc\nSame as\n.Ic pipe\nbut also exit copy mode.\n.It Xo\n.Ic previous-matching-bracket\n(emacs: M-C-b)\n.Xc\nMove to the previous matching bracket.\n.It Xo\n.Ic previous-paragraph\n(vi: {)\n(emacs: M-{)\n.Xc\nMove to the previous paragraph.\n.It Xo\n.Ic previous-prompt\n.Op Fl o\n.Xc\nMove to the previous prompt.\n.It Xo\n.Ic previous-word\n(vi: b)\n(emacs: M-b)\n.Xc\nMove to the previous word.\n.It Xo\n.Ic previous-space\n(vi: B)\n.Xc\nSame as\n.Ic previous-word\nbut use a space alone as the word separator.\n.It Xo\n.Ic rectangle-on\n.Xc\nTurn on rectangle selection mode.\n.It Xo\n.Ic rectangle-off\n.Xc\nTurn off rectangle selection mode.\n.It Xo\n.Ic rectangle-toggle\n(vi: v)\n(emacs: R)\n.Xc\nToggle rectangle selection mode.\n.It Xo\n.Ic refresh-from-pane\n(vi: r)\n(emacs: r)\n.Xc\nRefresh the content from the pane.\n.It Xo\n.Ic scroll-bottom\n.Xc\nScroll up until the current line is at the bottom while keeping the cursor on\nthat line.\n.It Xo\n.Ic scroll-down\n(vi: C-e)\n(emacs: C-Down)\n.Xc\nScroll down.\n.It Xo\n.Ic scroll-down-and-cancel\n.Xc\nSame as\n.Ic scroll-down\nbut also exit copy mode if the cursor reaches the bottom.\n.It Xo\n.Ic scroll-middle\n(vi: z)\n.Xc\nScroll so that the current line becomes the middle one while keeping the\ncursor on that line.\n.It Xo\n.Ic scroll-to-mouse\n.Xc\nScroll pane in copy-mode when bound to a mouse drag event.\n.Fl e\ncauses copy mode to exit when at the bottom.\n.Pp\n.It Xo\n.Ic scroll-top\n.Xc\nScroll down until the current line is at the top while keeping the cursor on\nthat line.\n.It Xo\n.Ic scroll-up\n(vi: C-y)\n(emacs: C-Up)\n.Xc\nScroll up.\n.It Xo\n.Ic search-again\n(vi: n)\n(emacs: n)\n.Xc\nRepeat the last search.\n.It Xo\n.Ic search-backward\n.Ar text\n(vi: ?)\n.Xc\nSearch backwards for the specified text.\n.It Xo\n.Ic search-backward-incremental\n.Ar text\n(emacs: C-r)\n.Xc\nSearch backwards incrementally for the specified text.\nIs expected to be used with the\n.Fl i\nflag to the\n.Ic command-prompt\ncommand.\n.It Xo\n.Ic search-backward-text\n.Ar text\n.Xc\nSearch backwards for the specified plain text.\n.It Xo\n.Ic search-forward\n.Ar text\n(vi: /)\n.Xc\nSearch forward for the specified text.\n.It Xo\n.Ic search-forward-incremental\n.Ar text\n(emacs: C-s)\n.Xc\nSearch forward incrementally for the specified text.\nIs expected to be used with the\n.Fl i\nflag to the\n.Ic command-prompt\ncommand.\n.It Xo\n.Ic search-forward-text\n.Ar text\n.Xc\nSearch forward for the specified plain text.\n.It Xo\n.Ic search-reverse\n(vi: N)\n(emacs: N)\n.Xc\nRepeat the last search in the reverse direction (forward becomes backward and\nbackward becomes forward).\n.It Xo\n.Ic select-line\n(vi: V)\n.Xc\nSelect the current line.\n.It Xo\n.Ic select-word\n.Xc\nSelect the current word.\n.It Xo\n.Ic selection-mode\n.Op Ic char | word | line\n.Xc\nChange the selection mode.\n.It Xo\n.Ic set-mark\n(vi: X)\n(emacs: X)\n.Xc\nMark the current line.\n.It Xo\n.Ic start-of-line\n(vi: 0)\n(emacs: C-a)\n.Xc\nMove the cursor to the start of the line.\n.It Xo\n.Ic stop-selection\n.Xc\nStop selecting without clearing the current selection.\n.It Xo\n.Ic toggle-position\n(vi: P)\n(emacs: P)\n.Xc\nToggle the visibility of the position indicator in the top right.\n.It Xo\n.Ic top-line\n(vi: H)\n(emacs: M-R)\n.Xc\nMove to the top line.\n.El\n.Pp\nThe search commands come in several varieties:\n.Ql search-forward\nand\n.Ql search-backward\nsearch for a regular expression;\nthe\n.Ql -text\nvariants search for a plain text string rather than a regular expression;\n.Ql -incremental\nperform an incremental search and expect to be used with the\n.Fl i\nflag to the\n.Ic command-prompt\ncommand.\n.Ql search-again\nrepeats the last search and\n.Ql search-reverse\ndoes the same but reverses the direction (forward becomes backward and backward\nbecomes forward).\n.Pp\nThe default incremental search key bindings,\n.Ql C-r\nand\n.Ql C-s ,\nare designed to emulate\n.Xr emacs 1 .\nWhen first pressed they allow a new search term to be entered; if pressed with\nan empty search term they repeat the previously used search term.\n.Pp\nThe\n.Ql next-prompt\nand\n.Ql previous-prompt\nmove between shell prompts, but require the shell to emit an escape sequence\n(\\e033]133;A\\e033\\e\\e) to tell\n.Nm\nwhere the prompts are located; if the shell does not do this, these commands\nwill do nothing.\nThe\n.Fl o\nflag jumps to the beginning of the command output instead of the shell prompt.\nFinding the beginning of command output requires the shell to emit an escape\nsequence (\\e033]133;C\\e033\\e\\e) to tell tmux where the output begins.\nIf the shell does not send these escape sequences, these commands do nothing.\n.Pp\nCopy commands may take an optional buffer prefix argument which is used\nto generate the buffer name (the default is\n.Ql buffer\nso buffers are named\n.Ql buffer0 ,\n.Ql buffer1\nand so on).\nPipe commands take a command argument which is the command to which the\nselected text is piped.\n.Ql copy-pipe\nvariants also copy the selection.\nThe\n.Ql -and-cancel\nvariants of some commands exit copy mode after they have completed (for copy\ncommands) or when the cursor reaches the bottom (for scrolling commands).\n.Ql -no-clear\nvariants do not clear the selection.\nAll the copy commands can take the\n.Fl C\nand\n.Fl P\nflags.\nThe\n.Fl C\nflag suppresses setting the terminal clipboard when copying, while the\n.Fl P\nflag suppresses adding a paste buffer with the text.\n.Pp\nThe next and previous word keys skip over whitespace and treat consecutive\nruns of either word separators or other letters as words.\nWord separators can be customized with the\n.Em word-separators\nsession option.\nNext word moves to the start of the next word, next word end to the end of the\nnext word and previous word to the start of the previous word.\nThe three next and previous space keys work similarly but use a space alone as\nthe word separator.\nSetting\n.Em word-separators\nto the empty string makes next/previous word equivalent to next/previous space.\n.Pp\nThe jump commands enable quick movement within a line.\nFor instance, typing\n.Ql f\nfollowed by\n.Ql /\nwill move the cursor to the next\n.Ql /\ncharacter on the current line.\nA\n.Ql \\&;\nwill then jump to the next occurrence.\n.Pp\nCommands in copy mode may be prefaced by an optional repeat count.\nWith vi key bindings, a prefix is entered using the number keys; with\nemacs, the Alt (meta) key and a number begins prefix entry.\n.Pp\nThe synopsis for the\n.Ic copy-mode\ncommand is:\n.Bl -tag -width Ds\n.It Xo Ic copy-mode\n.Op Fl deHMqSu\n.Op Fl s Ar src-pane\n.Op Fl t Ar target-pane\n.Xc\nEnter copy mode.\n.Pp\n.Fl u\nenters copy mode and scrolls one page up and\n.Fl d\none page down.\n.Fl H\nhides the position indicator in the top right.\n.Fl q\ncancels copy mode and any other modes.\n.Pp\n.Fl M\nbegins a mouse drag (only valid if bound to a mouse key binding, see\n.Sx MOUSE SUPPORT ) .\n.Pp\n.Fl S\nenters copy-mode and scrolls when bound to a mouse drag event; See\n.Ic scroll-to-mouse .\n.Pp\n.Fl s\ncopies from\n.Ar src-pane\ninstead of\n.Ar target-pane .\n.Pp\n.Fl e\nspecifies that scrolling to the bottom of the history (to the visible screen)\nshould exit copy mode.\nWhile in copy mode, pressing a key other than those used for scrolling will\ndisable this behaviour.\nThis is intended to allow fast scrolling through a pane's history, for\nexample with:\n.Bd -literal -offset indent\nbind PageUp copy-mode -eu\nbind PageDown copy-mode -ed\n.Ed\n.El\n.Pp\nA number of preset arrangements of panes are available, these are called\nlayouts.\nThese may be selected with the\n.Ic select-layout\ncommand or cycled with\n.Ic next-layout\n(bound to\n.Ql Space\nby default); once a layout is chosen, panes within it may be moved and resized\nas normal.\n.Pp\nThe following layouts are supported:\n.Bl -tag -width Ds\n.It Ic even-horizontal\nPanes are spread out evenly from left to right across the window.\n.It Ic even-vertical\nPanes are spread evenly from top to bottom.\n.It Ic main-horizontal\nA large (main) pane is shown at the top of the window and the remaining panes\nare spread from left to right in the leftover space at the bottom.\nUse the\n.Em main-pane-height\nwindow option to specify the height of the top pane.\n.It Ic main-horizontal-mirrored\nThe same as\n.Ic main-horizontal\nbut mirrored so the main pane is at the bottom of the window.\n.It Ic main-vertical\nA large (main) pane is shown on the left of the window and the remaining panes\nare spread from top to bottom in the leftover space on the right.\nUse the\n.Em main-pane-width\nwindow option to specify the width of the left pane.\n.It Ic main-vertical-mirrored\nThe same as\n.Ic main-vertical\nbut mirrored so the main pane is on the right of the window.\n.It Ic tiled\nPanes are spread out as evenly as possible over the window in both rows and\ncolumns.\n.El\n.Pp\nIn addition,\n.Ic select-layout\nmay be used to apply a previously used layout - the\n.Ic list-windows\ncommand displays the layout of each window in a form suitable for use with\n.Ic select-layout .\nFor example:\n.Bd -literal -offset indent\n$ tmux list-windows\n0: ksh [159x48]\n layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0}\n$ tmux select-layout \\[aq]bb62,159x48,0,0{79x48,0,0,79x48,80,0}\\[aq]\n.Ed\n.Pp\n.Nm\nautomatically adjusts the size of the layout for the current window size.\nNote that a layout cannot be applied to a window with more panes than that\nfrom which the layout was originally defined.\n.Pp\nCommands related to windows and panes are as follows:\n.Bl -tag -width Ds\n.Tg breakp\n.It Xo Ic break-pane\n.Op Fl abdP\n.Op Fl F Ar format\n.Op Fl n Ar window-name\n.Op Fl s Ar src-pane\n.Op Fl t Ar dst-window\n.Xc\n.D1 Pq alias: Ic breakp\nBreak\n.Ar src-pane\noff from its containing window to make it the only pane in\n.Ar dst-window .\nWith\n.Fl a\nor\n.Fl b ,\nthe window is moved to the next index after or before (existing windows are\nmoved if necessary).\nIf\n.Fl d\nis given, the new window does not become the current window.\nThe\n.Fl P\noption prints information about the new window after it has been created.\nBy default, it uses the format\n.Ql #{session_name}:#{window_index}.#{pane_index}\nbut a different format may be specified with\n.Fl F .\n.Tg capturep\n.It Xo Ic capture-pane\n.Op Fl aepPqCJMN\n.Op Fl b Ar buffer-name\n.Op Fl E Ar end-line\n.Op Fl S Ar start-line\n.Op Fl t Ar target-pane\n.Xc\n.D1 Pq alias: Ic capturep\nCapture the contents of a pane.\nIf\n.Fl p\nis given, the output goes to stdout, otherwise to the buffer specified with\n.Fl b\nor a new buffer if omitted.\nIf\n.Fl a\nis given, the alternate screen is used, and the history is not accessible.\nIf no alternate screen exists, an error will be returned unless\n.Fl q\nis given.\nSimilarly, if the pane is in a mode,\n.Fl M\nuses the screen for the mode.\nIf\n.Fl e\nis given, the output includes escape sequences for text and background\nattributes.\n.Fl C\nalso escapes non-printable characters as octal \\exxx.\n.Fl T\nignores trailing positions that do not contain a character.\n.Fl N\npreserves trailing spaces at each line's end and\n.Fl J\npreserves trailing spaces and joins any wrapped lines;\n.Fl J\nimplies\n.Fl T .\n.Fl P\ncaptures only any output that the pane has received that is the beginning of an\nas-yet incomplete escape sequence.\n.Pp\n.Fl S\nand\n.Fl E\nspecify the starting and ending line numbers, zero is the first line of the\nvisible pane and negative numbers are lines in the history.\n.Ql -\nto\n.Fl S\nis the start of the history and to\n.Fl E\nthe end of the visible pane.\nThe default is to capture only the visible contents of the pane.\n.It Xo\n.Ic choose-client\n.Op Fl NryZ\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl K Ar key-format\n.Op Fl O Ar sort-order\n.Op Fl t Ar target-pane\n.Op Ar template\n.Xc\nPut a pane into client mode, allowing a client to be selected interactively from\na list.\nEach client is shown on one line.\nA shortcut key is shown on the left in brackets allowing for immediate choice,\nor the list may be navigated and an item chosen or otherwise manipulated using\nthe keys below.\n.Fl Z\nzooms the pane.\n.Fl y\ndisables any confirmation prompts.\nThe following keys may be used in client mode:\n.Bl -column \"Key\" \"Function\" -offset indent\n.It Sy \"Key\" Ta Sy \"Function\"\n.It Li \"Enter\" Ta \"Choose selected client\"\n.It Li \"Up\" Ta \"Select previous client\"\n.It Li \"Down\" Ta \"Select next client\"\n.It Li \"C-s\" Ta \"Search by name\"\n.It Li \"n\" Ta \"Repeat last search forwards\"\n.It Li \"N\" Ta \"Repeat last search backwards\"\n.It Li \"t\" Ta \"Toggle if client is tagged\"\n.It Li \"T\" Ta \"Tag no clients\"\n.It Li \"C-t\" Ta \"Tag all clients\"\n.It Li \"d\" Ta \"Detach selected client\"\n.It Li \"D\" Ta \"Detach tagged clients\"\n.It Li \"x\" Ta \"Detach and HUP selected client\"\n.It Li \"X\" Ta \"Detach and HUP tagged clients\"\n.It Li \"z\" Ta \"Suspend selected client\"\n.It Li \"Z\" Ta \"Suspend tagged clients\"\n.It Li \"f\" Ta \"Enter a format to filter items\"\n.It Li \"O\" Ta \"Change sort order\"\n.It Li \"r\" Ta \"Reverse sort order\"\n.It Li \"v\" Ta \"Toggle preview\"\n.It Li \"q\" Ta \"Exit mode\"\n.El\n.Pp\nAfter a client is chosen,\n.Ql %%\nis replaced by the client name in\n.Ar template\nand the result executed as a command.\nIf\n.Ar template\nis not given, \"detach-client -t \\[aq]%%\\[aq]\" is used.\n.Pp\n.Fl O\nspecifies the initial sort order: one of\n.Ql name ,\n.Ql size ,\n.Ql creation\n(time), or\n.Ql activity\n(time).\n.Fl r\nreverses the sort order.\n.Fl f\nspecifies an initial filter: the filter is a format - if it evaluates to zero,\nthe item in the list is not shown, otherwise it is shown.\nIf a filter would lead to an empty list, it is ignored.\n.Fl F\nspecifies the format for each item in the list and\n.Fl K\na format for each shortcut key; both are evaluated once for each line.\n.Fl N\nstarts without the preview or if given twice with the larger preview.\nThis command works only if at least one client is attached.\n.It Xo\n.Ic choose-tree\n.Op Fl GNrswyZ\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl K Ar key-format\n.Op Fl O Ar sort-order\n.Op Fl t Ar target-pane\n.Op Ar template\n.Xc\nPut a pane into tree mode, where a session, window or pane may be chosen\ninteractively from a tree.\nEach session, window or pane is shown on one line.\nA shortcut key is shown on the left in brackets allowing for immediate choice,\nor the tree may be navigated and an item chosen or otherwise manipulated using\nthe keys below.\n.Fl s\nstarts with sessions collapsed and\n.Fl w\nwith windows collapsed.\n.Fl Z\nzooms the pane.\n.Fl y\ndisables any confirmation prompts.\nThe following keys may be used in tree mode:\n.Bl -column \"Key\" \"Function\" -offset indent\n.It Sy \"Key\" Ta Sy \"Function\"\n.It Li \"Enter\" Ta \"Choose selected item\"\n.It Li \"Up\" Ta \"Select previous item\"\n.It Li \"Down\" Ta \"Select next item\"\n.It Li \"S-Up\" Ta \"Swap the current window with the previous one\"\n.It Li \"S-Down\" Ta \"Swap the current window with the next one\"\n.It Li \"+\" Ta \"Expand selected item\"\n.It Li \"-\" Ta \"Collapse selected item\"\n.It Li \"M-+\" Ta \"Expand all items\"\n.It Li \"M--\" Ta \"Collapse all items\"\n.It Li \"x\" Ta \"Kill selected item\"\n.It Li \"X\" Ta \"Kill tagged items\"\n.It Li \"<\" Ta \"Scroll list of previews left\"\n.It Li \">\" Ta \"Scroll list of previews right\"\n.It Li \"C-s\" Ta \"Search by name\"\n.It Li \"m\" Ta \"Set the marked pane\"\n.It Li \"M\" Ta \"Clear the marked pane\"\n.It Li \"n\" Ta \"Repeat last search forwards\"\n.It Li \"N\" Ta \"Repeat last search backwards\"\n.It Li \"t\" Ta \"Toggle if item is tagged\"\n.It Li \"T\" Ta \"Tag no items\"\n.It Li \"C-t\" Ta \"Tag all items\"\n.It Li \"\\&:\" Ta \"Run a command for each tagged item\"\n.It Li \"f\" Ta \"Enter a format to filter items\"\n.It Li \"H\" Ta \"Jump to the starting pane\"\n.It Li \"O\" Ta \"Change sort order\"\n.It Li \"r\" Ta \"Reverse sort order\"\n.It Li \"v\" Ta \"Toggle preview\"\n.It Li \"q\" Ta \"Exit mode\"\n.El\n.Pp\nAfter a session, window or pane is chosen, the first instance of\n.Ql %%\nand all instances of\n.Ql %1\nare replaced by the target in\n.Ar template\nand the result executed as a command.\nIf\n.Ar template\nis not given, \"switch-client -t \\[aq]%%\\[aq]\" is used.\n.Pp\n.Fl O\nspecifies the initial sort order: one of\n.Ql index ,\n.Ql name ,\nor\n.Ql activity\n(time).\n.Fl r\nreverses the sort order.\n.Fl f\nspecifies an initial filter: the filter is a format - if it evaluates to zero,\nthe item in the list is not shown, otherwise it is shown.\nIf a filter would lead to an empty list, it is ignored.\n.Fl F\nspecifies the format for each item in the tree and\n.Fl K\na format for each shortcut key; both are evaluated once for each line.\n.Fl N\nstarts without the preview or if given twice with the larger preview.\n.Fl G\nincludes all sessions in any session groups in the tree rather than only the\nfirst.\nThis command works only if at least one client is attached.\n.It Xo\n.Ic customize-mode\n.Op Fl NZ\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl t Ar target-pane\n.Op Ar template\n.Xc\nPut a pane into customize mode, where options and key bindings may be browsed\nand modified from a list.\nOption values in the list are shown for the active pane in the current window.\n.Fl Z\nzooms the pane.\nThe following keys may be used in customize mode:\n.Bl -column \"Key\" \"Function\" -offset indent\n.It Sy \"Key\" Ta Sy \"Function\"\n.It Li \"Enter\" Ta \"Set pane, window, session or global option value\"\n.It Li \"Up\" Ta \"Select previous item\"\n.It Li \"Down\" Ta \"Select next item\"\n.It Li \"+\" Ta \"Expand selected item\"\n.It Li \"-\" Ta \"Collapse selected item\"\n.It Li \"M-+\" Ta \"Expand all items\"\n.It Li \"M--\" Ta \"Collapse all items\"\n.It Li \"s\" Ta \"Set option value or key attribute\"\n.It Li \"S\" Ta \"Set global option value\"\n.It Li \"w\" Ta \"Set window option value, if option is for pane and window\"\n.It Li \"d\" Ta \"Set an option or key to the default\"\n.It Li \"D\" Ta \"Set tagged options and tagged keys to the default\"\n.It Li \"u\" Ta \"Unset an option (set to default value if global) or unbind a key\"\n.It Li \"U\" Ta \"Unset tagged options and unbind tagged keys\"\n.It Li \"C-s\" Ta \"Search by name\"\n.It Li \"n\" Ta \"Repeat last search forwards\"\n.It Li \"N\" Ta \"Repeat last search backwards\"\n.It Li \"t\" Ta \"Toggle if item is tagged\"\n.It Li \"T\" Ta \"Tag no items\"\n.It Li \"C-t\" Ta \"Tag all items\"\n.It Li \"f\" Ta \"Enter a format to filter items\"\n.It Li \"v\" Ta \"Toggle option information\"\n.It Li \"q\" Ta \"Exit mode\"\n.El\n.Pp\n.Fl f\nspecifies an initial filter: the filter is a format - if it evaluates to zero,\nthe item in the list is not shown, otherwise it is shown.\nIf a filter would lead to an empty list, it is ignored.\n.Fl F\nspecifies the format for each item in the tree.\n.Fl N\nstarts without the option information.\nThis command works only if at least one client is attached.\n.It Xo\n.Tg displayp\n.Ic display-panes\n.Op Fl bN\n.Op Fl d Ar duration\n.Op Fl t Ar target-client\n.Op Ar template\n.Xc\n.D1 Pq alias: Ic displayp\nDisplay a visible indicator of each pane shown by\n.Ar target-client .\nSee the\n.Ic display-panes-colour\nand\n.Ic display-panes-active-colour\nsession options.\nThe indicator is closed when a key is pressed (unless\n.Fl N\nis given) or\n.Ar duration\nmilliseconds have passed.\nIf\n.Fl d\nis not given,\n.Ic display-panes-time\nis used.\nA duration of zero means the indicator stays until a key is pressed.\nWhile the indicator is on screen, a pane may be chosen with the\n.Ql 0\nto\n.Ql 9\nkeys, which will cause\n.Ar template\nto be executed as a command with\n.Ql %%\nsubstituted by the pane ID.\nThe default\n.Ar template\nis \"select-pane -t \\[aq]%%\\[aq]\".\nWith\n.Fl b ,\nother commands are not blocked from running until the indicator is closed.\n.Tg findw\n.It Xo Ic find-window\n.Op Fl iCNrTZ\n.Op Fl t Ar target-pane\n.Ar match-string\n.Xc\n.D1 Pq alias: Ic findw\nSearch for a\n.Xr glob 7\npattern or, with\n.Fl r ,\nregular expression\n.Ar match-string\nin window names, titles, and visible content (but not history).\nThe flags control matching behavior:\n.Fl C\nmatches only visible window contents,\n.Fl N\nmatches only the window name and\n.Fl T\nmatches only the window title.\n.Fl i\nmakes the search ignore case.\nThe default is\n.Fl CNT .\n.Fl Z\nzooms the pane.\n.Pp\nThis command works only if at least one client is attached.\n.Tg joinp\n.It Xo Ic join-pane\n.Op Fl bdfhv\n.Op Fl l Ar size\n.Op Fl s Ar src-pane\n.Op Fl t Ar dst-pane\n.Xc\n.D1 Pq alias: Ic joinp\nLike\n.Ic split-window ,\nbut instead of splitting\n.Ar dst-pane\nand creating a new pane, split it and move\n.Ar src-pane\ninto the space.\nThis can be used to reverse\n.Ic break-pane .\nThe\n.Fl b\noption causes\n.Ar src-pane\nto be joined to left of or above\n.Ar dst-pane .\n.Pp\nIf\n.Fl s\nis omitted and a marked pane is present (see\n.Ic select-pane\n.Fl m ) ,\nthe marked pane is used rather than the current pane.\n.Tg killp\n.It Xo Ic kill-pane\n.Op Fl a\n.Op Fl t Ar target-pane\n.Xc\n.D1 Pq alias: Ic killp\nDestroy the given pane.\nIf no panes remain in the containing window, it is also destroyed.\nThe\n.Fl a\noption kills all but the pane given with\n.Fl t .\n.Tg killw\n.It Xo Ic kill-window\n.Op Fl a\n.Op Fl t Ar target-window\n.Xc\n.D1 Pq alias: Ic killw\nKill the current window or the window at\n.Ar target-window ,\nremoving it from any sessions to which it is linked.\nThe\n.Fl a\noption kills all but the window given with\n.Fl t .\n.Tg lastp\n.It Xo Ic last-pane\n.Op Fl deZ\n.Op Fl t Ar target-window\n.Xc\n.D1 Pq alias: Ic lastp\nSelect the last (previously selected) pane.\n.Fl Z\nkeeps the window zoomed if it was zoomed.\n.Fl e\nenables or\n.Fl d\ndisables input to the pane.\n.Tg last\n.It Ic last-window Op Fl t Ar target-session\n.D1 Pq alias: Ic last\nSelect the last (previously selected) window.\nIf no\n.Ar target-session\nis specified, select the last window of the current session.\n.Tg link\n.It Xo Ic link-window\n.Op Fl abdk\n.Op Fl s Ar src-window\n.Op Fl t Ar dst-window\n.Xc\n.D1 Pq alias: Ic linkw\nLink the window at\n.Ar src-window\nto the specified\n.Ar dst-window .\nIf\n.Ar dst-window\nis specified and no such window exists, the\n.Ar src-window\nis linked there.\nWith\n.Fl a\nor\n.Fl b\nthe window is moved to the next index after or before\n.Ar dst-window\n(existing windows are moved if necessary).\nIf\n.Fl k\nis given and\n.Ar dst-window\nexists, it is killed, otherwise an error is generated.\nIf\n.Fl d\nis given, the newly linked window is not selected.\n.Tg lsp\n.It Xo Ic list-panes\n.Op Fl ars\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl O Ar sort-order\n.Op Fl t Ar target\n.Xc\n.D1 Pq alias: Ic lsp\nIf\n.Fl a\nis given,\n.Ar target\nis ignored and all panes on the server are listed.\nIf\n.Fl s\nis given,\n.Ar target\nis a session (or the current session).\nIf neither is given,\n.Ar target\nis a window (or the current window).\n.Fl F\nspecifies the format of each line and\n.Fl f\na filter.\nOnly panes for which the filter is true are shown.\nSee the\n.Sx FORMATS\nsection.\n.Fl O\nspecifies the sort order: one of\n.Ql name ,\n.Ql creation\n(time), or\n.Ql activity\n(time).\n.Fl r\nreverses the sort order.\n.Tg lsw\n.It Xo Ic list-windows\n.Op Fl ar\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl O Ar sort-order\n.Op Fl t Ar target-session\n.Xc\n.D1 Pq alias: Ic lsw\nIf\n.Fl a\nis given, list all windows on the server.\nOtherwise, list windows in the current session or in\n.Ar target-session .\n.Fl F\nspecifies the format of each line and\n.Fl f\na filter.\nOnly windows for which the filter is true are shown.\nSee the\n.Sx FORMATS\nsection.\n.Fl O\nspecifies the sort order: one of\n.Ql index ,\n.Ql name ,\nor\n.Ql activity\n(time).\n.Fl r\nreverses the sort order.\n.Tg movep\n.It Xo Ic move-pane\n.Op Fl bdfhv\n.Op Fl l Ar size\n.Op Fl s Ar src-pane\n.Op Fl t Ar dst-pane\n.Xc\n.D1 Pq alias: Ic movep\nDoes the same as\n.Ic join-pane .\n.Tg movew\n.It Xo Ic move-window\n.Op Fl abrdk\n.Op Fl s Ar src-window\n.Op Fl t Ar dst-window\n.Xc\n.D1 Pq alias: Ic movew\nThis is similar to\n.Ic link-window ,\nexcept the window at\n.Ar src-window\nis moved to\n.Ar dst-window .\nWith\n.Fl r ,\nall windows in the session are renumbered in sequential order, respecting\nthe\n.Ic base-index\noption.\n.Tg neww\n.It Xo Ic new-window\n.Op Fl abdkPS\n.Op Fl c Ar start-directory\n.Op Fl e Ar environment\n.Op Fl F Ar format\n.Op Fl n Ar window-name\n.Op Fl t Ar target-window\n.Op Ar shell-command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic neww\nCreate a new window.\nWith\n.Fl a\nor\n.Fl b ,\nthe new window is inserted at the next index after or before the specified\n.Ar target-window ,\nmoving windows up if necessary;\notherwise\n.Ar target-window\nis the new window location.\n.Pp\nIf\n.Fl d\nis given, the session does not make the new window the current window.\n.Ar target-window\nrepresents the window to be created; if the target already exists an error is\nshown, unless the\n.Fl k\nflag is used, in which case it is destroyed.\nIf\n.Fl S\nis given and a window named\n.Ar window-name\nalready exists, it is selected (unless\n.Fl d\nis also given in which case the command does nothing).\n.Pp\n.Ar shell-command\nis the command to execute.\nIf\n.Ar shell-command\nis not specified, the value of the\n.Ic default-command\noption is used.\n.Fl c\nspecifies the working directory in which the new window is created.\n.Pp\nWhen the shell command completes, the window closes.\nSee the\n.Ic remain-on-exit\noption to change this behaviour.\n.Pp\n.Fl e\ntakes the form\n.Ql VARIABLE=value\nand sets an environment variable for the newly created window; it may be\nspecified multiple times.\n.Pp\nThe\n.Ev TERM\nenvironment variable must be set to\n.Ql screen\nor\n.Ql tmux\nfor all programs running\n.Em inside\n.Nm .\nNew windows will automatically have\n.Ql TERM=screen\nadded to their environment, but care must be taken not to reset this in shell\nstart-up files or by the\n.Fl e\noption.\n.Pp\nThe\n.Fl P\noption prints information about the new window after it has been created.\nBy default, it uses the format\n.Ql #{session_name}:#{window_index}\nbut a different format may be specified with\n.Fl F .\n.Tg nextl\n.It Ic next-layout Op Fl t Ar target-window\n.D1 Pq alias: Ic nextl\nMove a window to the next layout and rearrange the panes to fit.\n.Tg next\n.It Xo Ic next-window\n.Op Fl a\n.Op Fl t Ar target-session\n.Xc\n.D1 Pq alias: Ic next\nMove to the next window in the session.\nIf\n.Fl a\nis used, move to the next window with an alert.\n.Tg pipep\n.It Xo Ic pipe-pane\n.Op Fl IOo\n.Op Fl t Ar target-pane\n.Op Ar shell-command\n.Xc\n.D1 Pq alias: Ic pipep\nPipe output sent by the program in\n.Ar target-pane\nto a shell command or vice versa.\nA pane may only be connected to one command at a time, any existing pipe is\nclosed before\n.Ar shell-command\nis executed.\nThe\n.Ar shell-command\nstring may contain the special character sequences supported by the\n.Ic status-left\noption.\nIf no\n.Ar shell-command\nis given, the current pipe (if any) is closed.\n.Pp\n.Fl I\nand\n.Fl O\nspecify which of the\n.Ar shell-command\noutput streams are connected to the pane:\nwith\n.Fl I\nstdout is connected (so anything\n.Ar shell-command\nprints is written to the pane as if it were typed);\nwith\n.Fl O\nstdin is connected (so any output in the pane is piped to\n.Ar shell-command ) .\nBoth may be used together and if neither are specified,\n.Fl O\nis used.\n.Pp\nThe\n.Fl o\noption only opens a new pipe if no previous pipe exists, allowing a pipe to\nbe toggled with a single key, for example:\n.Bd -literal -offset indent\nbind-key C-p pipe-pane -o \\[aq]cat >>\\[ti]/output.#I-#P\\[aq]\n.Ed\n.Tg prevl\n.It Xo Ic previous-layout\n.Op Fl t Ar target-window\n.Xc\n.D1 Pq alias: Ic prevl\nMove to the previous layout in the session.\n.Tg prev\n.It Xo Ic previous-window\n.Op Fl a\n.Op Fl t Ar target-session\n.Xc\n.D1 Pq alias: Ic prev\nMove to the previous window in the session.\nWith\n.Fl a ,\nmove to the previous window with an alert.\n.Tg renamew\n.It Xo Ic rename-window\n.Op Fl t Ar target-window\n.Ar new-name\n.Xc\n.D1 Pq alias: Ic renamew\nRename the current window, or the window at\n.Ar target-window\nif specified, to\n.Ar new-name .\n.Tg resizep\n.It Xo Ic resize-pane\n.Op Fl DLMRTUZ\n.Op Fl t Ar target-pane\n.Op Fl x Ar width\n.Op Fl y Ar height\n.Op Ar adjustment\n.Xc\n.D1 Pq alias: Ic resizep\nResize a pane, up, down, left or right by\n.Ar adjustment\nwith\n.Fl U ,\n.Fl D ,\n.Fl L\nor\n.Fl R ,\nor\nto an absolute size\nwith\n.Fl x\nor\n.Fl y .\nThe\n.Ar adjustment\nis given in lines or columns (the default is 1);\n.Fl x\nand\n.Fl y\nmay be a given as a number of lines or columns or followed by\n.Ql %\nfor a percentage of the window size (for example\n.Ql -x 10% ) .\nWith\n.Fl Z ,\nthe active pane is toggled between zoomed (occupying the whole of the window)\nand unzoomed (its normal position in the layout).\n.Pp\n.Fl M\nbegins mouse resizing (only valid if bound to a mouse key binding, see\n.Sx MOUSE SUPPORT ) .\n.Pp\n.Fl T\ntrims all lines below the current cursor position and moves lines out of the\nhistory to replace them.\n.Tg resizew\n.It Xo Ic resize-window\n.Op Fl aADLRU\n.Op Fl t Ar target-window\n.Op Fl x Ar width\n.Op Fl y Ar height\n.Op Ar adjustment\n.Xc\n.D1 Pq alias: Ic resizew\nResize a window, up, down, left or right by\n.Ar adjustment\nwith\n.Fl U ,\n.Fl D ,\n.Fl L\nor\n.Fl R ,\nor\nto an absolute size\nwith\n.Fl x\nor\n.Fl y .\nThe\n.Ar adjustment\nis given in lines or cells (the default is 1).\n.Fl A\nsets the size of the largest session containing the window;\n.Fl a\nthe size of the smallest.\nThis command will automatically set\n.Ic window-size\nto manual in the window options.\n.Tg respawnp\n.It Xo Ic respawn-pane\n.Op Fl k\n.Op Fl c Ar start-directory\n.Op Fl e Ar environment\n.Op Fl t Ar target-pane\n.Op Ar shell-command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic respawnp\nReactivate a pane in which the command has exited (see the\n.Ic remain-on-exit\nwindow option).\nIf\n.Ar shell-command\nis not given, the command used when the pane was created or last respawned is\nexecuted.\nThe pane must be already inactive, unless\n.Fl k\nis given, in which case any existing command is killed.\n.Fl c\nspecifies a new working directory for the pane.\nThe\n.Fl e\noption has the same meaning as for the\n.Ic new-window\ncommand.\n.Tg respawnw\n.It Xo Ic respawn-window\n.Op Fl k\n.Op Fl c Ar start-directory\n.Op Fl e Ar environment\n.Op Fl t Ar target-window\n.Op Ar shell-command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic respawnw\nReactivate a window in which the command has exited (see the\n.Ic remain-on-exit\nwindow option).\nIf\n.Ar shell-command\nis not given, the command used when the window was created or last respawned is\nexecuted.\nThe window must be already inactive, unless\n.Fl k\nis given, in which case any existing command is killed.\n.Fl c\nspecifies a new working directory for the window.\nThe\n.Fl e\noption has the same meaning as for the\n.Ic new-window\ncommand.\n.Tg rotatew\n.It Xo Ic rotate-window\n.Op Fl DUZ\n.Op Fl t Ar target-window\n.Xc\n.D1 Pq alias: Ic rotatew\nRotate the positions of the panes within a window, either upward (numerically\nlower) with\n.Fl U\nor downward (numerically higher).\n.Fl Z\nkeeps the window zoomed if it was zoomed.\n.Tg selectl\n.It Xo Ic select-layout\n.Op Fl Enop\n.Op Fl t Ar target-pane\n.Op Ar layout-name\n.Xc\n.D1 Pq alias: Ic selectl\nChoose a specific layout for a window.\nIf\n.Ar layout-name\nis not given, the last preset layout used (if any) is reapplied.\n.Fl n\nand\n.Fl p\nare equivalent to the\n.Ic next-layout\nand\n.Ic previous-layout\ncommands.\n.Fl o\napplies the last set layout if possible (undoes the most recent layout change).\n.Fl E\nspreads the current pane and any panes next to it out evenly.\n.Tg selectp\n.It Xo Ic select-pane\n.Op Fl DdeLlMmRUZ\n.Op Fl T Ar title\n.Op Fl t Ar target-pane\n.Xc\n.D1 Pq alias: Ic selectp\nMake pane\n.Ar target-pane\nthe active pane in its window.\nIf one of\n.Fl D ,\n.Fl L ,\n.Fl R ,\nor\n.Fl U\nis used, respectively the pane below, to the left, to the right, or above the\ntarget pane is used.\n.Fl Z\nkeeps the window zoomed if it was zoomed.\n.Fl l\nis the same as using the\n.Ic last-pane\ncommand.\n.Fl e\nenables or\n.Fl d\ndisables input to the pane.\n.Fl T\nsets the pane title.\n.Pp\n.Fl m\nand\n.Fl M\nare used to set and clear the\n.Em marked pane .\nThere is one marked pane at a time, setting a new marked pane clears the last.\nThe marked pane is the default target for\n.Fl s\nto\n.Ic join-pane ,\n.Ic move-pane ,\n.Ic swap-pane\nand\n.Ic swap-window .\n.Tg selectw\n.It Xo Ic select-window\n.Op Fl lnpT\n.Op Fl t Ar target-window\n.Xc\n.D1 Pq alias: Ic selectw\nSelect the window at\n.Ar target-window .\n.Fl l ,\n.Fl n\nand\n.Fl p\nare equivalent to the\n.Ic last-window ,\n.Ic next-window\nand\n.Ic previous-window\ncommands.\nIf\n.Fl T\nis given and the selected window is already the current window,\nthe command behaves like\n.Ic last-window .\n.Tg splitw\n.It Xo Ic split-window\n.Op Fl bdfhIvPZ\n.Op Fl c Ar start-directory\n.Op Fl e Ar environment\n.Op Fl F Ar format\n.Op Fl l Ar size\n.Op Fl t Ar target-pane\n.Op Ar shell-command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic splitw\nCreate a new pane by splitting\n.Ar target-pane :\n.Fl h\ndoes a horizontal split and\n.Fl v\na vertical split; if neither is specified,\n.Fl v\nis assumed.\nThe\n.Fl l\noption specifies the size of the new pane in lines (for vertical split) or in\ncolumns (for horizontal split);\n.Ar size\nmay be followed by\n.Ql %\nto specify a percentage of the available space.\nThe\n.Fl b\noption causes the new pane to be created to the left of or above\n.Ar target-pane .\nThe\n.Fl f\noption creates a new pane spanning the full window height (with\n.Fl h )\nor full window width (with\n.Fl v ) ,\ninstead of splitting the active pane.\n.Fl Z\nzooms if the window is not zoomed, or keeps it zoomed if already zoomed.\n.Pp\nAn empty\n.Ar shell-command\n(\\[aq]\\[aq]) will create a pane with no command running in it.\nOutput can be sent to such a pane with the\n.Ic display-message\ncommand.\nThe\n.Fl I\nflag (if\n.Ar shell-command\nis not specified or empty)\nwill create an empty pane and forward any output from stdin to it.\nFor example:\n.Bd -literal -offset indent\n$ make 2>&1|tmux splitw -dI &\n.Ed\n.Pp\nAll other options have the same meaning as for the\n.Ic new-window\ncommand.\n.Tg swapp\n.It Xo Ic swap-pane\n.Op Fl dDUZ\n.Op Fl s Ar src-pane\n.Op Fl t Ar dst-pane\n.Xc\n.D1 Pq alias: Ic swapp\nSwap two panes.\nIf\n.Fl U\nis used and no source pane is specified with\n.Fl s ,\n.Ar dst-pane\nis swapped with the previous pane (before it numerically);\n.Fl D\nswaps with the next pane (after it numerically).\n.Fl d\ninstructs\n.Nm\nnot to change the active pane and\n.Fl Z\nkeeps the window zoomed if it was zoomed.\n.Pp\nIf\n.Fl s\nis omitted and a marked pane is present (see\n.Ic select-pane\n.Fl m ) ,\nthe marked pane is used rather than the current pane.\n.Tg swapw\n.It Xo Ic swap-window\n.Op Fl d\n.Op Fl s Ar src-window\n.Op Fl t Ar dst-window\n.Xc\n.D1 Pq alias: Ic swapw\nThis is similar to\n.Ic link-window ,\nexcept the source and destination windows are swapped.\nIt is an error if no window exists at\n.Ar src-window .\nIf\n.Fl d\nis given, the new window does not become the current window.\n.Pp\nIf\n.Fl s\nis omitted and a marked pane is present (see\n.Ic select-pane\n.Fl m ) ,\nthe window containing the marked pane is used rather than the current window.\n.Tg unlinkw\n.It Xo Ic unlink-window\n.Op Fl k\n.Op Fl t Ar target-window\n.Xc\n.D1 Pq alias: Ic unlinkw\nUnlink\n.Ar target-window .\nUnless\n.Fl k\nis given, a window may be unlinked only if it is linked to multiple sessions -\nwindows may not be linked to no sessions;\nif\n.Fl k\nis specified and the window is linked to only one session, it is unlinked and\ndestroyed.\n.El\n.Sh KEY BINDINGS\n.Nm\nallows a command to be bound to most keys, with or without a prefix key.\nWhen specifying keys, most represent themselves (for example\n.Ql A\nto\n.Ql Z ) .\nCtrl keys may be prefixed with\n.Ql C-\nor\n.Ql ^ ,\nShift keys with\n.Ql S-\nand Alt (meta) with\n.Ql M- .\nIn addition, the following special key names are accepted:\n.Em Up ,\n.Em Down ,\n.Em Left ,\n.Em Right ,\n.Em BSpace ,\n.Em BTab ,\n.Em DC\n(Delete),\n.Em End ,\n.Em Enter ,\n.Em Escape ,\n.Em F1\nto\n.Em F12 ,\n.Em Home ,\n.Em IC\n(Insert),\n.Em NPage/PageDown/PgDn ,\n.Em PPage/PageUp/PgUp ,\n.Em Space ,\nand\n.Em Tab .\nNote that to bind the\n.Ql \\&\"\nor\n.Ql \\[aq]\nkeys, quotation marks are necessary, for example:\n.Bd -literal -offset indent\nbind-key \\[aq]\"\\[aq] split-window\nbind-key \"\\[aq]\" new-window\n.Ed\n.Pp\nA command bound to the\n.Em Any\nkey will execute for all keys which do not have a more specific binding.\n.Pp\nCommands related to key bindings are as follows:\n.Bl -tag -width Ds\n.Tg bind\n.It Xo Ic bind-key\n.Op Fl nr\n.Op Fl N Ar note\n.Op Fl T Ar key-table\n.Ar key\n.Op Ar command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic bind\nBind key\n.Ar key\nto\n.Ar command .\nKeys are bound in a key table.\nBy default (without -T), the key is bound in\nthe\n.Em prefix\nkey table.\nThis table is used for keys pressed after the prefix key (for example,\nby default\n.Ql c\nis bound to\n.Ic new-window\nin the\n.Em prefix\ntable, so\n.Ql C-b c\ncreates a new window).\nThe\n.Em root\ntable is used for keys pressed without the prefix key: binding\n.Ql c\nto\n.Ic new-window\nin the\n.Em root\ntable (not recommended) means a plain\n.Ql c\nwill create a new window.\n.Fl n\nis an alias\nfor\n.Fl T Ar root .\nKeys may also be bound in custom key tables and the\n.Ic switch-client\n.Fl T\ncommand used to switch to them from a key binding.\nThe\n.Fl r\nflag indicates this key may repeat, see the\n.Ic initial-repeat-time\nand\n.Ic repeat-time\noptions.\n.Fl N\nattaches a note to the key (shown with\n.Ic list-keys\n.Fl N ) ,\nwhich can be cleared by passing an empty string.\nThe\n.Fl r\nand\n.Fl N\nflags can be used without\n.Ar command\nto alter an existing binding.\n.Pp\nTo view the default bindings and possible commands, see the\n.Ic list-keys\ncommand.\n.Tg lsk\n.It Xo Ic list-keys\n.Op Fl 1aN\n.Op Fl P Ar prefix-string\n.Op Fl T Ar key-table\n.Op Ar key\n.Xc\n.D1 Pq alias: Ic lsk\nList key bindings.\nThere are two forms: the default lists keys as\n.Ic bind-key\ncommands;\n.Fl N\nlists only keys with attached notes and shows only the key and note for each\nkey.\n.Pp\nWith the default form, all key tables are listed by default.\n.Fl T\nlists only keys in\n.Ar key-table .\n.Pp\nWith the\n.Fl N\nform, only keys in the\n.Em root\nand\n.Em prefix\nkey tables are listed by default;\n.Fl T\nalso lists only keys in\n.Ar key-table .\n.Fl P\nspecifies a prefix to print before each key and\n.Fl 1\nlists only the first matching key.\n.Fl a\nlists the command for keys that do not have a note rather than skipping them.\n.Tg send\n.It Xo Ic send-keys\n.Op Fl FHKlMRX\n.Op Fl c Ar target-client\n.Op Fl N Ar repeat-count\n.Op Fl t Ar target-pane\n.Op Ar key ...\n.Xc\n.D1 Pq alias: Ic send\nSend a key or keys to a window or client.\nEach argument\n.Ar key\nis the name of the key (such as\n.Ql C-a\nor\n.Ql NPage )\nto send; if the string is not recognised as a key, it is sent as a series of\ncharacters.\nIf\n.Fl K\nis given, keys are sent to\n.Ar target-client ,\nso they are looked up in the client's key table, rather than to\n.Ar target-pane .\nAll arguments are sent sequentially from first to last.\nIf no keys are given and the command is bound to a key, then that key is used.\n.Pp\nThe\n.Fl l\nflag disables key name lookup and processes the keys as literal UTF-8\ncharacters.\nThe\n.Fl H\nflag expects each key to be a hexadecimal number for an ASCII character.\n.Pp\nThe\n.Fl R\nflag causes the terminal state to be reset.\n.Pp\n.Fl M\npasses through a mouse event (only valid if bound to a mouse key binding, see\n.Sx MOUSE SUPPORT ) .\n.Pp\n.Fl X\nis used to send a command into copy mode - see\nthe\n.Sx WINDOWS AND PANES\nsection.\n.Fl N\nspecifies a repeat count and\n.Fl F\nexpands formats in arguments where appropriate.\n.It Xo Ic send-prefix\n.Op Fl 2\n.Op Fl t Ar target-pane\n.Xc\nSend the prefix key, or with\n.Fl 2\nthe secondary prefix key, to a window as if it was pressed.\n.Tg unbind\n.It Xo Ic unbind-key\n.Op Fl anq\n.Op Fl T Ar key-table\n.Ar key\n.Xc\n.D1 Pq alias: Ic unbind\nUnbind the command bound to\n.Ar key .\n.Fl n\nand\n.Fl T\nare the same as for\n.Ic bind-key .\nIf\n.Fl a\nis present, all key bindings are removed.\nThe\n.Fl q\noption prevents errors being returned.\n.El\n.Sh OPTIONS\nThe appearance and behaviour of\n.Nm\nmay be modified by changing the value of various options.\nEach option belongs to one or multiple scopes\n.Po\n.Em server ,\n.Em session ,\n.Em window ,\nand\n.Em pane\n.Pc and has a type\n.Po\n.Em string ,\n.Em number ,\n.Em key ,\n.Em colour ,\n.Em flag ,\n.Em choice ,\nor\n.Em command\n.Pc . Values of\n.Em flag Ns -type\noptions may be one of:\n.Ic 1 ,\n.Ic on ,\n.Ic yes ,\n.Ic 0 ,\n.Ic off ,\nor\n.Ic no ;\nfor possible\n.Em choice\nvalues, see the respective option; for\n.Em key\noptions, the\n.Sx KEY BINDINGS\nsection; and for\n.Em colour\noptions, the\n.Sx STYLES\nsection.\n.Pp\nThe\n.Nm\nserver has a set of global server options which do not apply to any particular\nwindow or session or pane.\nThese are altered with the\n.Ic set-option\n.Fl s\ncommand, or displayed with the\n.Ic show-options\n.Fl s\ncommand.\n.Pp\nIn addition, each individual session may have a set of session options, and\nthere is a separate set of global session options.\nSessions which do not have a particular option configured inherit the value\nfrom the global session options.\nSession options are set or unset with the\n.Ic set-option\ncommand and may be listed with the\n.Ic show-options\ncommand.\nThe available server and session options are listed under the\n.Ic set-option\ncommand.\n.Pp\nSimilarly, a set of window options is attached to each window and a set of pane\noptions to each pane.\nPane options inherit from window options.\nThis means any pane option may be set as a window option to apply the option to\nall panes in the window without the option set, for example these commands will\nset the background colour to red for all panes except pane 0:\n.Bd -literal -offset indent\nset -w window-style bg=red\nset -pt:.0 window-style bg=blue\n.Ed\n.Pp\nThere is also a set of global window options from which any unset window or\npane options are inherited.\nWindow and pane options are altered with\n.Ic set-option\n.Fl w\nand\n.Fl p\ncommands and displayed with\n.Ic show-option\n.Fl w\nand\n.Fl p .\n.Pp\n.Nm\nalso supports user options which are prefixed with a\n.Ql \\&@ .\nUser options may have any name, so long as they are prefixed with\n.Ql \\&@ ,\nand be set to any string.\nFor example:\n.Bd -literal -offset indent\n$ tmux set -wq @foo \"abc123\"\n$ tmux show -wv @foo\nabc123\n.Ed\n.Pp\nOptions are managed with these commands:\n.Bl -tag -width Ds\n.Tg set\n.It Xo Ic set-option\n.Op Fl aFgopqsuUw\n.Op Fl t Ar target-pane\n.Ar option\n.Op Ar value\n.Xc\n.D1 Pq alias: Ic set\nSet a pane option with\n.Fl p ,\na window option with\n.Fl w ,\na server option with\n.Fl s ,\notherwise a session option.\nIf the option is not a user option,\n.Fl w\nor\n.Fl s\nmay be unnecessary -\n.Nm\nwill infer the scope from the option name, assuming\n.Fl w\nfor pane options.\nIf\n.Fl g\nis given, the global session or window option is set.\n.Pp\n.Fl F\nexpands formats in the option value.\nThe\n.Fl u\nflag unsets an option, so a session inherits the option from the global\noptions (or with\n.Fl g ,\nrestores a global option to the default).\n.Fl U\nunsets an option (like\n.Fl u )\nbut if the option is a pane option also unsets the option on any panes in the\nwindow.\n.Ar value\ndepends on the option and its type and can be omitted for flag and choice\noptions to toggle its value (choice options toggle between the first two\nchoices).\n.Pp\nThe\n.Fl o\nflag prevents setting an option that is already set and the\n.Fl q\nflag suppresses errors about unknown or ambiguous options.\n.Pp\nWith\n.Fl a ,\nand if the option expects a string or a style,\n.Ar value\nis appended to the existing setting.\nFor example:\n.Bd -literal -offset indent\nset -g status-left \"foo\"\nset -ag status-left \"bar\"\n.Ed\n.Pp\nWill result in\n.Ql foobar .\nAnd:\n.Bd -literal -offset indent\nset -g status-style \"bg=red\"\nset -ag status-style \"fg=blue\"\n.Ed\n.Pp\nWill result in a red background\n.Em and\nblue foreground.\nWithout\n.Fl a ,\nthe result would be the default background and a blue foreground.\n.Tg show\n.It Xo Ic show-options\n.Op Fl AgHpqsvw\n.Op Fl t Ar target-pane\n.Op Ar option\n.Xc\n.D1 Pq alias: Ic show\nShow the pane options (or a single option if\n.Ar option\nis provided) with\n.Fl p ,\nthe window options with\n.Fl w ,\nthe server options with\n.Fl s ,\notherwise the session options.\nIf the option is not a user option,\n.Fl w\nor\n.Fl s\nmay be unnecessary -\n.Nm\nwill infer the scope from the option name, assuming\n.Fl w\nfor pane options.\nGlobal session or window options are listed if\n.Fl g\nis used.\n.Fl v\nshows only the option value, not the name.\nIf\n.Fl q\nis set, no error will be returned if\n.Ar option\nis unset.\n.Fl H\nincludes hooks (omitted by default).\n.Fl A\nincludes options inherited from a parent set of options, such options are\nmarked with an asterisk.\n.El\n.Pp\nAvailable server options are:\n.Bl -tag -width Ds\n.It Ic backspace Ar key\nSet the key sent by\n.Nm\nfor backspace.\n.It Ic buffer-limit Ar number\nSet the number of buffers; as new buffers are added to the top of the stack,\nold ones are removed from the bottom if necessary to maintain this maximum\nlength.\n.It Xo Ic command-alias[]\n.Ar name=value\n.Xc\nThis is an array of custom aliases for commands.\nIf an unknown command matches\n.Ar name ,\nit is replaced with\n.Ar value .\nFor example, after:\n.Pp\n.Dl set -s command-alias[100] zoom=\\[aq]resize-pane -Z\\[aq]\n.Pp\nUsing:\n.Pp\n.Dl zoom -t:.1\n.Pp\nIs equivalent to:\n.Pp\n.Dl resize-pane -Z -t:.1\n.Pp\nNote that aliases are expanded when a command is parsed rather than when it is\nexecuted, so binding an alias with\n.Ic bind-key\nwill bind the expanded form.\n.It Ic codepoint-widths[] Ar string\nAn array option allowing widths of Unicode codepoints to be overridden.\nNote the new width applies to all clients.\nEach entry is of the form\n.Em codepoint=width ,\nwhere codepoint may be a UTF-8 character or an identifier of the form\n.Ql U+number\nwhere the number is a hexadecimal number.\n.It Ic copy-command Ar shell-command\nGive the command to pipe to if the\n.Ic copy-pipe\ncopy mode command is used without arguments.\n.It Ic default-client-command Ar command\nSet the default command to run when tmux is called without a command.\nThe default is\n.Ic new-session .\n.It Ic default-terminal Ar terminal\nSet the default terminal for new windows created in this session - the\ndefault value of the\n.Ev TERM\nenvironment variable.\nFor\n.Nm\nto work correctly, this\n.Em must\nbe set to\n.Ql screen ,\n.Ql tmux\nor a derivative of them.\n.It Ic escape-time Ar time\nSet the time in milliseconds for which\n.Nm\nwaits after an escape is input to determine if it is part of a function or meta\nkey sequences.\n.It Ic editor Ar shell-command\nSet the command used when\n.Nm\nruns an editor.\n.It Xo Ic exit-empty\n.Op Ic on | off\n.Xc\nIf enabled (the default), the server will exit when there are no active\nsessions.\n.It Xo Ic exit-unattached\n.Op Ic on | off\n.Xc\nIf enabled, the server will exit when there are no attached clients.\n.It Xo Ic extended-keys\n.Op Ic on | off | always\n.Xc\nControls how modified keys (keys pressed together with Control, Meta, or Shift)\nare reported.\nThis is the equivalent of the\n.Ic modifyOtherKeys\n.Xr xterm 1\nresource.\n.Pp\nWhen set to\n.Ic on ,\nthe program inside the pane can request one of two modes: mode 1 which changes\nthe sequence for only keys which lack an existing well-known representation; or\nmode 2 which changes the sequence for all keys.\nWhen set to\n.Ic always ,\nmodes 1 and 2 can still be requested by applications, but mode 1 will be forced\ninstead of the standard mode.\nWhen set to\n.Ic off ,\nthis feature is disabled and only standard keys are reported.\n.Pp\n.Nm\nwill always request extended keys itself if the terminal supports them.\nSee also the\n.Ic extkeys\nfeature for the\n.Ic terminal-features\noption, the\n.Ic extended-keys-format\noption and the\n.Ic pane_key_mode\nvariable.\n.It Xo Ic extended-keys-format\n.Op Ic csi-u | xterm\n.Xc\nSelects one of the two possible formats for reporting modified keys to\napplications.\nThis is the equivalent of the\n.Ic formatOtherKeys\n.Xr xterm 1\nresource.\nFor example, C-S-a will be reported as\n.Ql ^[[27;6;65~\nwhen set to\n.Ic xterm ,\nand as\n.Ql ^[[65;6u\nwhen set to\n.Ic csi-u .\n.It Xo Ic focus-events\n.Op Ic on | off\n.Xc\nWhen enabled, focus events are requested from the terminal if supported and\npassed through to applications running in\n.Nm .\nAttached clients should be detached and attached again after changing this\noption.\n.It Xo Ic focus-follows-mouse\n.Op Ic on | off\n.Xc\nWhen enabled and\n.Ic mouse\nis on, moving the mouse into a pane selects it.\n.It Xo Ic get-clipboard\n.Op Ic both | request | buffer | off\n.Xc\nControls the behaviour when an application requests the clipboard from\n.Nm .\n.Pp\nIf\n.Ic off ,\nthe request is ignored;\nif\n.Ic buffer ,\n.Nm\nresponds with the newest paste buffer;\n.Ic request\ncauses\n.Nm\nto request the clipboard from the most recently used client (if possible) and\nsend the reply (if any) back to the application;\n.Ic buffer\nis the same as\n.Ic request\nbut also creates a paste buffer.\n.Pp\nSee also the\n.Ic set-clipboard\noption.\n.It Ic history-file Ar path\nIf not empty, a file to which\n.Nm\nwill write command prompt history on exit and load it from on start.\n.It Ic input-buffer-size Ar bytes\nMaximum of bytes allowed to read in escape and control sequences.\nOnce reached, the sequence will be discarded.\n.It Ic message-limit Ar number\nSet the number of error or information messages to save in the message log for\neach client.\n.It Ic prompt-history-limit Ar number\nSet the number of history items to save in the history file for each type of\ncommand prompt.\n.It Xo Ic set-clipboard\n.Op Ic on | external | off\n.Xc\nAttempt to set the terminal clipboard content using the\n.Xr xterm 1\nescape sequence, if there is an\n.Em \\&Ms\nentry in the\n.Xr terminfo 5\ndescription (see the\n.Sx TERMINFO EXTENSIONS\nsection).\n.Pp\nIf set to\n.Ic on ,\n.Nm\nwill both accept the escape sequence to create a buffer and attempt to set\nthe terminal clipboard.\nIf set to\n.Ic external ,\n.Nm\nwill attempt to set the terminal clipboard but ignore attempts\nby applications to set\n.Nm\nbuffers.\nIf\n.Ic off ,\n.Nm\nwill neither accept the clipboard escape sequence nor attempt to set the\nclipboard.\n.Pp\nNote that this feature needs to be enabled in\n.Xr xterm 1\nby setting the resource:\n.Bd -literal -offset indent\ndisallowedWindowOps: 20,21,SetXprop\n.Ed\n.Pp\nOr changing this property from the\n.Xr xterm 1\ninteractive menu when required.\n.It Ic terminal-features[] Ar string\nSet terminal features for terminal types read from\n.Xr terminfo 5 .\n.Nm\nhas a set of named terminal features.\nEach will apply appropriate changes to the\n.Xr terminfo 5\nentry in use.\n.Pp\n.Nm\ncan detect features for a few common terminals; this option can be used to\neasily tell tmux about features supported by terminals it cannot detect.\nThe\n.Ic terminal-overrides\noption allows individual\n.Xr terminfo 5\ncapabilities to be set instead,\n.Ic terminal-features\nis intended for classes of functionality supported in a standard way but not\nreported by\n.Xr terminfo 5 .\nCare must be taken to configure this only with features the terminal actually\nsupports.\n.Pp\nThis is an array option where each entry is a colon-separated string made up\nof a terminal type pattern (matched using\n.Xr glob 7\npatterns) followed by a list of terminal features.\nThe available features are:\n.Bl -tag -width Ds\n.It 256\nSupports 256 colours with the SGR escape sequences.\n.It clipboard\nAllows setting the system clipboard.\n.It ccolour\nAllows setting the cursor colour.\n.It cstyle\nAllows setting the cursor style.\n.It extkeys\nSupports extended keys.\n.It focus\nSupports focus reporting.\n.It hyperlinks\nSupports OSC 8 hyperlinks.\n.It ignorefkeys\nIgnore function keys from\n.Xr terminfo 5\nand use the\n.Nm\ninternal set only.\n.It margins\nSupports DECSLRM margins.\n.It mouse\nSupports\n.Xr xterm 1\nmouse sequences.\n.It osc7\nSupports the OSC 7 working directory extension.\n.It overline\nSupports the overline SGR attribute.\n.It rectfill\nSupports the DECFRA rectangle fill escape sequence.\n.It RGB\nSupports RGB colour with the SGR escape sequences.\n.It sixel\nSupports SIXEL graphics.\n.It strikethrough\nSupports the strikethrough SGR escape sequence.\n.It sync\nSupports synchronized updates.\n.It title\nSupports\n.Xr xterm 1\ntitle setting.\n.It usstyle\nAllows underscore style and colour to be set.\n.El\n.It Ic terminal-overrides[] Ar string\nAllow terminal descriptions read using\n.Xr terminfo 5\nto be overridden.\nEach entry is a colon-separated string made up of a terminal type pattern\n(matched using\n.Xr glob 7\npatterns)\nand a set of\n.Em name=value\nentries.\n.Pp\nFor example, to set the\n.Ql clear\n.Xr terminfo 5\nentry to\n.Ql \\ee[H\\ee[2J\nfor all terminal types matching\n.Ql rxvt* :\n.Pp\n.Dl \"rxvt*:clear=\\ee[H\\ee[2J\"\n.Pp\nThe terminal entry value is passed through\n.Xr strunvis 3\nbefore interpretation.\n.It Ic user-keys[] Ar key\nSet list of user-defined key escape sequences.\nEach item is associated with a key named\n.Ql User0 ,\n.Ql User1 ,\nand so on.\n.Pp\nFor example:\n.Bd -literal -offset indent\nset -s user-keys[0] \"\\ee[5;30012\\[ti]\"\nbind User0 resize-pane -L 3\n.Ed\n.It Xo Ic variation-selector-always-wide\n.Op Ic on | off\n.Xc\nAlways treat Unicode variation selector 16 as marking a wide character.\nThis is a feature of some terminals as part of their Unicode 14 support.\n.El\n.Pp\nAvailable session options are:\n.Bl -tag -width Ds\n.It Xo Ic activity-action\n.Op Ic any | none | current | other\n.Xc\nSet action on window activity when\n.Ic monitor-activity\nis on.\n.Ic any\nmeans activity in any window linked to a session causes a bell or message\n(depending on\n.Ic visual-activity )\nin the current window of that session,\n.Ic none\nmeans all activity is ignored (equivalent to\n.Ic monitor-activity\nbeing off),\n.Ic current\nmeans only activity in windows other than the current window are ignored and\n.Ic other\nmeans activity in the current window is ignored but not those in other windows.\n.It Ic assume-paste-time Ar milliseconds\nIf keys are entered faster than one in\n.Ar milliseconds ,\nthey are assumed to have been pasted rather than typed and\n.Nm\nkey bindings are not processed.\nThe default is one millisecond and zero disables.\n.It Ic base-index Ar index\nSet the base index from which an unused index should be searched when a new\nwindow is created.\nThe default is zero.\n.It Xo Ic bell-action\n.Op Ic any | none | current | other\n.Xc\nSet action on a bell in a window when\n.Ic monitor-bell\nis on.\nThe values are the same as those for\n.Ic activity-action .\n.It Ic default-command Ar shell-command\nSet the command used for new windows (if not specified when the window is\ncreated) to\n.Ar shell-command ,\nwhich may be any\n.Xr sh 1\ncommand.\nThe default is an empty string, which instructs\n.Nm\nto create a login shell using the value of the\n.Ic default-shell\noption.\n.It Ic default-shell Ar path\nSpecify the default shell.\nThis is used as the login shell for new windows when the\n.Ic default-command\noption is set to empty, and must be the full path of the executable.\nWhen started\n.Nm\ntries to set a default value from the first suitable of the\n.Ev SHELL\nenvironment variable, the shell returned by\n.Xr getpwuid 3 ,\nor\n.Pa /bin/sh .\nThis option should be configured when\n.Nm\nis used as a login shell.\n.It Ic default-size Ar XxY\nSet the default size of new windows when the\n.Ic window-size\noption is set to manual or when a session is created with\n.Ic new-session\n.Fl d .\nThe value is the width and height separated by an\n.Ql x\ncharacter.\nThe default is 80x24.\n.It Xo Ic destroy-unattached\n.Op Ic off | on | keep-last | keep-group\n.Xc\nIf\n.Ic on ,\ndestroy the session after the last client has detached.\nIf\n.Ic off\n(the default), leave the session orphaned.\nIf\n.Ic keep-last ,\ndestroy the session only if it is in a group and has other sessions in that\ngroup.\nIf\n.Ic keep-group ,\ndestroy the session unless it is in a group and is the only session in that\ngroup.\n.It Xo Ic detach-on-destroy\n.Op Ic off | on | no-detached | previous | next\n.Xc\nIf\n.Ic on\n(the default), the client is detached when the session it is attached to\nis destroyed.\nIf\n.Ic off ,\nthe client is switched to the most recently active of the remaining\nsessions.\nIf\n.Ic no-detached ,\nthe client is detached only if there are no detached sessions; if detached\nsessions exist, the client is switched to the most recently active.\nIf\n.Ic previous\nor\n.Ic next ,\nthe client is switched to the previous or next session in alphabetical order.\n.It Ic display-panes-active-colour Ar colour\nSet the colour used by the\n.Ic display-panes\ncommand to show the indicator for the active pane.\n.It Ic display-panes-colour Ar colour\nSet the colour used by the\n.Ic display-panes\ncommand to show the indicators for inactive panes.\n.It Ic display-panes-time Ar time\nSet the time in milliseconds for which the indicators shown by the\n.Ic display-panes\ncommand appear.\n.It Ic display-time Ar time\nSet the amount of time for which status line messages and other on-screen\nindicators are displayed.\nIf set to 0, messages and indicators are displayed until a key is pressed.\n.Ar time\nis in milliseconds.\n.It Ic history-limit Ar lines\nSet the maximum number of lines held in pane history.\n.It Ic initial-repeat-time Ar time\nSet the time in milliseconds for the initial repeat when a key is bound with the\n.Fl r\nflag.\nThis allows multiple commands to be entered without pressing the prefix key\nagain.\nSee also the\n.Ic repeat-time\noption.\nIf\n.Ic initial-repeat-time\nis zero,\n.Ic repeat-time\nis used for the first key press.\n.It Ic key-table Ar key-table\nSet the default key table to\n.Ar key-table\ninstead of\n.Em root .\n.It Ic lock-after-time Ar number\nLock the session (like the\n.Ic lock-session\ncommand) after\n.Ar number\nseconds of inactivity.\nThe default is not to lock (set to 0).\n.It Ic lock-command Ar shell-command\nCommand to run when locking each client.\nThe default is to run\n.Xr lock 1\nwith\n.Fl np .\n.It Ic menu-style Ar style\nSet the menu style.\nSee the\n.Sx STYLES\nsection on how to specify\n.Ar style .\n.It Ic menu-selected-style Ar style\nSet the selected menu item style.\nSee the\n.Sx STYLES\nsection on how to specify\n.Ar style .\n.It Ic menu-border-style Ar style\nSet the menu border style.\nSee the\n.Sx STYLES\nsection on how to specify\n.Ar style .\n.It Ic menu-border-lines Ar type\nSet the type of characters used for drawing menu borders.\nSee\n.Ic popup-border-lines\nfor possible values for\n.Ar border-lines .\n.It Ic message-command-style Ar style\nSet status line message command style.\nThis is used for the command prompt with\n.Xr vi 1\nkeys when in command mode.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.It Xo Ic message-line\n.Op Ic 0 | 1 | 2 | 3 | 4\n.Xc\nSet line on which status line messages and the command prompt are shown.\n.It Ic message-style Ar style\nSet status line message style.\nThis is used for messages and for the command prompt.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.It Xo Ic mouse\n.Op Ic on | off\n.Xc\nIf on,\n.Nm\ncaptures the mouse and allows mouse events to be bound as key bindings.\nSee the\n.Sx MOUSE SUPPORT\nsection for details.\n.It Ic prefix Ar key\nSet the key accepted as a prefix key.\nIn addition to the standard keys described under\n.Sx KEY BINDINGS ,\n.Ic prefix\ncan be set to the special key\n.Ql None\nto set no prefix.\n.It Ic prefix2 Ar key\nSet a secondary key accepted as a prefix key.\nLike\n.Ic prefix ,\n.Ic prefix2\ncan be set to\n.Ql None .\n.It Ic prefix-timeout Ar time\nSet the time in milliseconds for which\n.Nm\nwaits after\n.Ic prefix\nis input before dismissing it.\nCan be set to zero to disable any timeout.\n.It Ic prompt-cursor-colour Ar colour\nSet the colour of the cursor in the command prompt.\n.It Ic prompt-cursor-style Ar style\nSet the style of the cursor in the command prompt.\nSee the\n.Ic cursor-style\noptions for available styles.\n.It Ic prompt-command-cursor-style Ar style\nSet the style of the cursor in the command prompt when vi keys are enabled and\nthe prompt is in command mode.\nSee the\n.Ic cursor-style\noptions for available styles.\n.It Xo Ic renumber-windows\n.Op Ic on | off\n.Xc\nIf on, when a window is closed in a session, automatically renumber the other\nwindows in numerical order.\nThis respects the\n.Ic base-index\noption if it has been set.\nIf off, do not renumber the windows.\n.It Ic repeat-time Ar time\nAllow multiple commands to be entered without pressing the prefix key again\nin the specified\n.Ar time\nmilliseconds (the default is 500).\nWhether a key repeats may be set when it is bound using the\n.Fl r\nflag to\n.Ic bind-key .\nRepeat is enabled for the default keys bound to the\n.Ic resize-pane\ncommand.\nSee also the\n.Ic initial-repeat-time\noption.\n.It Xo Ic set-titles\n.Op Ic on | off\n.Xc\nAttempt to set the client terminal title using the\n.Em tsl\nand\n.Em fsl\n.Xr terminfo 5\nentries if they exist.\n.Nm\nautomatically sets these to the \\ee]0;...\\e007 sequence if\nthe terminal appears to be\n.Xr xterm 1 .\nThis option is off by default.\n.It Ic set-titles-string Ar string\nString used to set the client terminal title if\n.Ic set-titles\nis on.\nFormats are expanded, see the\n.Sx FORMATS\nsection.\n.It Xo Ic silence-action\n.Op Ic any | none | current | other\n.Xc\nSet action on window silence when\n.Ic monitor-silence\nis on.\nThe values are the same as those for\n.Ic activity-action .\n.It Xo Ic status\n.Op Ic off | on | 2 | 3 | 4 | 5\n.Xc\nShow or hide the status line or specify its size.\nUsing\n.Ic on\ngives a status line one row in height;\n.Ic 2 ,\n.Ic 3 ,\n.Ic 4\nor\n.Ic 5\nmore rows.\n.It Ic status-format[] Ar format\nSpecify the format to be used for each line of the status line.\nThe default builds the top status line from the various individual status\noptions below.\n.It Ic status-interval Ar interval\nUpdate the status line every\n.Ar interval\nseconds.\nBy default, updates will occur every 15 seconds.\nA setting of zero disables redrawing at interval.\n.It Xo Ic status-justify\n.Op Ic left | centre | right | absolute-centre\n.Xc\nSet the position of the window list in the status line: left, centre or right.\ncentre puts the window list in the relative centre of the available free space;\nabsolute-centre uses the centre of the entire horizontal space.\n.It Xo Ic status-keys\n.Op Ic vi | emacs\n.Xc\nUse vi or emacs-style\nkey bindings in the status line, for example at the command prompt.\nThe default is emacs, unless the\n.Ev VISUAL\nor\n.Ev EDITOR\nenvironment variables are set and contain the string\n.Ql vi .\n.It Ic status-left Ar string\nDisplay\n.Ar string\n(by default the session name) to the left of the status line.\n.Ar string\nwill be passed through\n.Xr strftime 3 .\nAlso see the\n.Sx FORMATS\nand\n.Sx STYLES\nsections.\n.Pp\nFor details on how the names and titles can be set see the\n.Sx \"NAMES AND TITLES\"\nsection.\n.Pp\nExamples are:\n.Bd -literal -offset indent\n#(sysctl vm.loadavg)\n#[fg=yellow,bold]#(apm -l)%%#[default] [#S]\n.Ed\n.Pp\nThe default is\n.Ql \"[#S] \" .\n.It Ic status-left-length Ar length\nSet the maximum\n.Ar length\nof the left component of the status line.\nThe default is 10.\n.It Ic status-left-style Ar style\nSet the style of the left part of the status line.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.It Xo Ic status-position\n.Op Ic top | bottom\n.Xc\nSet the position of the status line.\n.It Ic status-right Ar string\nDisplay\n.Ar string\nto the right of the status line.\nBy default, the current pane title in double quotes, the date and the time\nare shown.\nAs with\n.Ic status-left ,\n.Ar string\nwill be passed to\n.Xr strftime 3\nand character pairs are replaced.\n.It Ic status-right-length Ar length\nSet the maximum\n.Ar length\nof the right component of the status line.\nThe default is 40.\n.It Ic status-right-style Ar style\nSet the style of the right part of the status line.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.It Ic status-style Ar style\nSet status line style.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.It Ic update-environment[] Ar variable\nSet list of environment variables to be copied into the session environment\nwhen a new session is created or an existing session is attached.\nAny variables that do not exist in the source environment are set to be\nremoved from the session environment (as if\n.Fl r\nwas given to the\n.Ic set-environment\ncommand).\n.It Xo Ic visual-activity\n.Op Ic on | off | both\n.Xc\nIf on, display a message instead of sending a bell when activity occurs in a\nwindow for which the\n.Ic monitor-activity\nwindow option is enabled.\nIf set to both, a bell and a message are produced.\n.It Xo Ic visual-bell\n.Op Ic on | off | both\n.Xc\nIf on, a message is shown on a bell in a window for which the\n.Ic monitor-bell\nwindow option is enabled instead of it being passed through to the\nterminal (which normally makes a sound).\nIf set to both, a bell and a message are produced.\nAlso see the\n.Ic bell-action\noption.\n.It Xo Ic visual-silence\n.Op Ic on | off | both\n.Xc\nIf\n.Ic monitor-silence\nis enabled, prints a message after the interval has expired on a given window\ninstead of sending a bell.\nIf set to both, a bell and a message are produced.\n.It Ic word-separators Ar string\nSets the session's conception of what characters are considered word\nseparators, for the purposes of the next and previous word commands in\ncopy mode.\n.El\n.Pp\nAvailable window options are:\n.Pp\n.Bl -tag -width Ds -compact\n.It Xo Ic aggressive-resize\n.Op Ic on | off\n.Xc\nAggressively resize the chosen window.\nThis means that\n.Nm\nwill resize the window to the size of the smallest or largest session\n(see the\n.Ic window-size\noption) for which it is the current window, rather than the session to\nwhich it is attached.\nThe window may resize when the current window is changed on another\nsession; this option is good for full-screen programs which support\n.Dv SIGWINCH\nand poor for interactive programs such as shells.\n.Pp\n.It Xo Ic automatic-rename\n.Op Ic on | off\n.Xc\nControl automatic window renaming.\nWhen this setting is enabled,\n.Nm\nwill rename the window automatically using the format specified by\n.Ic automatic-rename-format .\nThis flag is automatically disabled for an individual window when a name\nis specified at creation with\n.Ic new-window\nor\n.Ic new-session ,\nor later with\n.Ic rename-window ,\nor with a terminal escape sequence.\nIt may be switched off globally with:\n.Bd -literal -offset indent\nset-option -wg automatic-rename off\n.Ed\n.Pp\n.It Ic automatic-rename-format Ar format\nThe format (see\n.Sx FORMATS )\nused when the\n.Ic automatic-rename\noption is enabled.\n.Pp\n.It Ic clock-mode-colour Ar colour\nSet clock colour.\n.Pp\n.It Xo Ic clock-mode-style\n.Op Ic 12 | 24 | 12-with-seconds | 24-with-seconds\n.Xc\nSet clock hour format.\n.Pp\n.It Ic fill-character Ar character\nSet the character used to fill areas of the terminal unused by a window.\n.Pp\n.It Ic main-pane-height Ar height\n.It Ic main-pane-width Ar width\nSet the width or height of the main (left or top) pane in the\n.Ic main-horizontal ,\n.Ic main-horizontal-mirrored ,\n.Ic main-vertical ,\nor\n.Ic main-vertical-mirrored\nlayouts.\nIf suffixed by\n.Ql % ,\nthis is a percentage of the window size.\n.Pp\n.It Ic copy-mode-match-style Ar style\nSet the style of search matches in copy mode.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic copy-mode-mark-style Ar style\nSet the style of the line containing the mark in copy mode.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic copy-mode-current-match-style Ar style\nSet the style of the current search match in copy mode.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic copy-mode-position-format Ar format\nFormat of the position indicator in copy mode.\n.Pp\n.It Xo Ic mode-keys\n.Op Ic vi | emacs\n.Xc\nUse vi or emacs-style key bindings in copy mode.\nThe default is emacs, unless\n.Ev VISUAL\nor\n.Ev EDITOR\ncontains\n.Ql vi .\n.Pp\n.It Ic copy-mode-position-style Ar style\nSet the style of the position indicator in copy mode.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic copy-mode-selection-style Ar style\nSet the style of the selection in copy mode.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic mode-style Ar style\nSet window modes style.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Xo Ic monitor-activity\n.Op Ic on | off\n.Xc\nMonitor for activity in the window.\nWindows with activity are highlighted in the status line.\n.Pp\n.It Xo Ic monitor-bell\n.Op Ic on | off\n.Xc\nMonitor for a bell in the window.\nWindows with a bell are highlighted in the status line.\n.Pp\n.It Xo Ic monitor-silence\n.Op Ic interval\n.Xc\nMonitor for silence (no activity) in the window within\n.Ic interval\nseconds.\nWindows that have been silent for the interval are highlighted in the\nstatus line.\nAn interval of zero disables the monitoring.\n.Pp\n.It Ic other-pane-height Ar height\nSet the height of the other panes (not the main pane) in the\n.Ic main-horizontal\nand\n.Ic main-horizontal-mirrored\nlayouts.\nIf this option is set to 0 (the default), it will have no effect.\nIf both the\n.Ic main-pane-height\nand\n.Ic other-pane-height\noptions are set, the main pane will grow taller to make the other panes the\nspecified height, but will never shrink to do so.\nIf suffixed by\n.Ql % ,\nthis is a percentage of the window size.\n.Pp\n.It Ic other-pane-width Ar width\nLike\n.Ic other-pane-height ,\nbut set the width of other panes in the\n.Ic main-vertical\nand\n.Ic main-vertical-mirrored\nlayouts.\n.Pp\n.It Ic pane-active-border-style Ar style\nSet the pane border style for the currently active pane.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\nAttributes are ignored.\n.Pp\n.It Ic pane-base-index Ar index\nLike\n.Ic base-index ,\nbut set the starting index for pane numbers.\n.Pp\n.It Ic pane-border-format Ar format\nSet the text shown in pane border status lines.\n.Pp\n.It Xo Ic pane-border-indicators\n.Op Ic off | colour | arrows | both\n.Xc\nIndicate active pane by colouring only half of the border in windows with\nexactly two panes, by displaying arrow markers, by drawing both or neither.\n.Pp\n.It Ic pane-border-lines Ar type\nSet the type of characters used for drawing pane borders.\n.Ar type\nmay be one of:\n.Bl -tag -width Ds\n.It single\nsingle lines using ACS or UTF-8 characters\n.It double\ndouble lines using UTF-8 characters\n.It heavy\nheavy lines using UTF-8 characters\n.It simple\nsimple ASCII characters\n.It number\nthe pane number\n.It spaces\nspace characters\n.El\n.Pp\n.Ql double\nand\n.Ql heavy\nwill fall back to standard ACS line drawing when UTF-8 is not supported.\n.Pp\n.It Xo Ic pane-border-status\n.Op Ic off | top | bottom\n.Xc\nTurn pane border status lines off or set their position.\n.Pp\n.It Ic pane-border-style Ar style\nSet the pane border style for panes aside from the active pane.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\nAttributes are ignored.\n.Pp\n.It Ic popup-style Ar style\nSet the popup style.\nSee the\n.Sx STYLES\nsection on how to specify\n.Ar style .\nAttributes are ignored.\n.Pp\n.It Ic popup-border-style Ar style\nSet the popup border style.\nSee the\n.Sx STYLES\nsection on how to specify\n.Ar style .\nAttributes are ignored.\n.Pp\n.It Ic popup-border-lines Ar type\nSet the type of characters used for drawing popup borders.\n.Ar type\nmay be one of:\n.Bl -tag -width Ds\n.It single\nsingle lines using ACS or UTF-8 characters (default)\n.It rounded\nvariation of single with rounded corners using UTF-8 characters\n.It double\ndouble lines using UTF-8 characters\n.It heavy\nheavy lines using UTF-8 characters\n.It simple\nsimple ASCII characters\n.It padded\nsimple ASCII space character\n.It none\nno border\n.El\n.Pp\n.Ql double\nand\n.Ql heavy\nwill fall back to standard ACS line drawing when UTF-8 is not supported.\n.Pp\n.It Xo Ic pane-scrollbars\n.Op Ic off | modal | on\n.Xc\nWhen enabled, a character based scrollbar appears on the left or right\nof each pane.\nA filled section of the scrollbar, known as the\n.Ql slider ,\nrepresents the position and size of the visible part of the pane content.\n.Pp\nIf set to\n.Ic on\nthe scrollbar is visible all the time.\nIf set to\n.Ic modal\nthe scrollbar only appears when the pane is in copy mode or view mode.\nWhen the scrollbar is visible, the pane is narrowed by the width of the\nscrollbar and the text in the pane is reflowed.\nIf set to\n.Ic modal ,\nthe pane is narrowed only when the scrollbar is visible.\n.Pp\nSee also\n.Ic pane-scrollbars-style .\n.Pp\n.It Ic pane-scrollbars-style Ar style\nSet the scrollbars style.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\nThe foreground colour is used for the slider, the background for the rest of the\nscrollbar.\nThe\n.Ar width\nattribute sets the width of the scrollbar and the\n.Ar pad\nattribute the padding between the scrollbar and the pane.\nOther attributes are ignored.\n.Pp\n.It Xo Ic pane-scrollbars-position\n.Op Ic left | right\n.Xc\nSets which side of the pane to display pane scrollbars on.\n.Pp\n.It Ic pane-status-current-style Ar style\nSet status line style for the currently active pane.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic pane-status-style Ar style\nSet status line style for a single pane.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic session-status-current-style Ar style\nSet status line style for the currently active session.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic session-status-style Ar style\nSet status line style for a single session.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic tiled-layout-max-columns Ar number\nSet the maximum number of columns in the\n.Ic tiled\nlayout.\nA value of 0 (the default) means no limit.\nWhen a limit is set, panes are arranged to not exceed this number of columns,\nwith additional panes stacked in extra rows.\n.Pp\n.It Ic window-status-activity-style Ar style\nSet status line style for windows with an activity alert.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic window-status-bell-style Ar style\nSet status line style for windows with a bell alert.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic window-status-current-format Ar string\nLike\n.Ar window-status-format ,\nbut is the format used when the window is the current window.\n.Pp\n.It Ic window-status-current-style Ar style\nSet status line style for the currently active window.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic window-status-format Ar string\nSet the format in which the window is displayed in the status line window list.\nSee the\n.Sx FORMATS\nand\n.Sx STYLES\nsections.\n.Pp\n.It Ic window-status-last-style Ar style\nSet status line style for the last active window.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic window-status-separator Ar string\nSets the separator drawn between windows in the status line.\nThe default is a single space character.\n.Pp\n.It Ic window-status-style Ar style\nSet status line style for a single window.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Xo Ic window-size\n.Ar largest | Ar smallest | Ar manual | Ar latest\n.Xc\nConfigure how\n.Nm\ndetermines the window size.\nIf set to\n.Ar largest ,\nthe size of the largest attached session is used; if\n.Ar smallest ,\nthe size of the smallest.\nIf\n.Ar manual ,\nthe size of a new window is set from the\n.Ic default-size\noption and windows are resized automatically.\nWith\n.Ar latest ,\n.Nm\nuses the size of the client that had the most recent activity.\nSee also the\n.Ic resize-window\ncommand and the\n.Ic aggressive-resize\noption.\n.Pp\n.It Xo Ic wrap-search\n.Op Ic on | off\n.Xc\nIf this option is set, searches will wrap around the end of the pane contents.\nThe default is on.\n.El\n.Pp\nAvailable pane options are:\n.Pp\n.Bl -tag -width Ds -compact\n.It Xo Ic allow-passthrough\n.Op Ic on | off | all\n.Xc\nAllow programs in the pane to bypass\n.Nm\nusing a terminal escape sequence (\\eePtmux;...\\ee\\e\\e).\nIf set to\n.Ic on ,\npassthrough sequences will be allowed only if the pane is visible.\nIf set to\n.Ic all ,\nthey will be allowed even if the pane is invisible.\n.Pp\n.It Xo Ic allow-rename\n.Op Ic on | off\n.Xc\nAllow programs in the pane to change the window name using a terminal escape\nsequence (\\eek...\\ee\\e\\e).\n.Pp\n.It Xo Ic allow-set-title\n.Op Ic on | off\n.Xc\nAllow programs in the pane to change the title using the terminal escape\nsequences (\\ee]2;...\\ee\\e\\e or \\ee]0;...\\ee\\e\\e).\n.Pp\n.It Xo Ic alternate-screen\n.Op Ic on | off\n.Xc\nThis option configures whether programs running inside the pane may use the\nterminal alternate screen feature, which allows the\n.Em smcup\nand\n.Em rmcup\n.Xr terminfo 5\ncapabilities.\nThe alternate screen feature preserves the contents of the window when an\ninteractive application starts and restores it on exit, so that any output\nvisible before the application starts reappears unchanged after it exits.\n.Pp\n.It Ic cursor-colour Ar colour\nSet the colour of the cursor.\n.Pp\n.It Ic cursor-style Ar style\nSet the style of the cursor.\nAvailable styles are:\n.Ic default ,\n.Ic blinking-block ,\n.Ic block ,\n.Ic blinking-underline ,\n.Ic underline ,\n.Ic blinking-bar ,\n.Ic bar .\n.Pp\n.It Ic pane-colours[] Ar colour\nThe default colour palette.\nEach entry in the array defines the colour\n.Nm\nuses when the colour with that index is requested.\nThe index may be from zero to 255.\n.Pp\n.It Xo Ic remain-on-exit\n.Op Ic on | off | failed\n.Xc\nA pane with this flag set is not destroyed when the program running in it\nexits.\nIf set to\n.Ic failed ,\nthen only when the program exit status is not zero.\nThe pane may be reactivated with the\n.Ic respawn-pane\ncommand.\n.Pp\n.It Ic remain-on-exit-format Ar string\nSet the text shown at the bottom of exited panes when\n.Ic remain-on-exit\nis enabled.\n.Pp\n.It Xo Ic scroll-on-clear\n.Op Ic on | off\n.Xc\nWhen the entire screen is cleared and this option is on, scroll the contents of\nthe screen into history before clearing it.\n.Pp\n.It Xo Ic synchronize-panes\n.Op Ic on | off\n.Xc\nDuplicate input to all other panes in the same window where this option is also\non (only for panes that are not in any mode).\n.Pp\n.It Ic window-active-style Ar style\nSet the pane style when it is the active pane.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.Pp\n.It Ic window-style Ar style\nSet the pane style.\nFor how to specify\n.Ar style ,\nsee the\n.Sx STYLES\nsection.\n.El\n.Sh HOOKS\n.Nm\nallows commands to run on various triggers, called\n.Em hooks .\nMost\n.Nm\ncommands have an\n.Em after\nhook and there are a number of hooks not associated with commands.\n.Pp\nHooks are stored as array options, members of the array are executed in\norder when the hook is triggered.\nLike options different hooks may be global or belong to a session, window or\npane.\nHooks may be configured with the\n.Ic set-hook\nor\n.Ic set-option\ncommands and displayed with\n.Ic show-hooks\nor\n.Ic show-options\n.Fl H .\nThe following two commands are equivalent:\n.Bd -literal -offset indent.\nset-hook -g pane-mode-changed[42] \\[aq]set -g status-left-style bg=red\\[aq]\nset-option -g pane-mode-changed[42] \\[aq]set -g status-left-style bg=red\\[aq]\n.Ed\n.Pp\nSetting a hook without specifying an array index clears the hook and sets the\nfirst member of the array.\n.Pp\nA command's after\nhook is run after it completes, except when the command is run as part of a hook\nitself.\nThey are named with an\n.Ql after-\nprefix.\nFor example, the following command adds a hook to select the even-vertical\nlayout after every\n.Ic split-window :\n.Bd -literal -offset indent\nset-hook -g after-split-window \"selectl even-vertical\"\n.Ed\n.Pp\nIf a command fails, the\n.Ql command-error\nhook will be fired.\nFor example, this could be used to write to a log file:\n.Bd -literal -offset indent\nset-hook -g command-error \"run-shell \\\\\"echo 'a tmux command failed' >>/tmp/log\\\\\"\"\n.Ed\n.Pp\nAll the notifications listed in the\n.Sx CONTROL MODE\nsection are hooks (without any arguments), except\n.Ic %exit .\nThe following additional hooks are available:\n.Bl -tag -width \"XXXXXXXXXXXXXXXXXXXXXX\"\n.It alert-activity\nRun when a window has activity.\nSee\n.Ic monitor-activity .\n.It alert-bell\nRun when a window has received a bell.\nSee\n.Ic monitor-bell .\n.It alert-silence\nRun when a window has been silent.\nSee\n.Ic monitor-silence .\n.It client-active\nRun when a client becomes the latest active client of its session.\n.It client-attached\nRun when a client is attached.\n.It client-detached\nRun when a client is detached\n.It client-focus-in\nRun when focus enters a client\n.It client-focus-out\nRun when focus exits a client\n.It client-resized\nRun when a client is resized.\n.It client-session-changed\nRun when a client's attached session is changed.\n.It client-light-theme\nRun when a client switches to a light theme.\n.It client-dark-theme\nRun when a client switches to a dark theme.\n.It command-error\nRun when a command fails.\n.It pane-died\nRun when the program running in a pane exits, but\n.Ic remain-on-exit\nis on so the pane has not closed.\n.It pane-exited\nRun when the program running in a pane exits.\n.It pane-focus-in\nRun when the focus enters a pane, if the\n.Ic focus-events\noption is on.\n.It pane-focus-out\nRun when the focus exits a pane, if the\n.Ic focus-events\noption is on.\n.It pane-set-clipboard\nRun when the terminal clipboard is set using the\n.Xr xterm 1\nescape sequence.\n.It session-created\nRun when a new session created.\n.It session-closed\nRun when a session closed.\n.It session-renamed\nRun when a session is renamed.\n.It window-layout-changed\nRun when a window layout is changed.\n.It window-linked\nRun when a window is linked into a session.\n.It window-renamed\nRun when a window is renamed.\n.It window-resized\nRun when a window is resized.\nThis may be after the\n.Ar client-resized\nhook is run.\n.It window-unlinked\nRun when a window is unlinked from a session.\n.El\n.Pp\nHooks are managed with these commands:\n.Bl -tag -width Ds\n.It Xo Ic set-hook\n.Op Fl agpRuw\n.Op Fl t Ar target-pane\n.Ar hook-name\n.Op Ar command\n.Xc\nWithout\n.Fl R ,\nsets (or with\n.Fl u\nunsets) hook\n.Ar hook-name\nto\n.Ar command .\nThe flags are the same as for\n.Ic set-option .\n.Pp\nWith\n.Fl R ,\nrun\n.Ar hook-name\nimmediately.\n.It Xo Ic show-hooks\n.Op Fl gpw\n.Op Fl t Ar target-pane\n.Op Ar hook\n.Xc\nShows hooks.\nThe flags are the same as for\n.Ic show-options .\n.El\n.Sh MOUSE SUPPORT\nIf the\n.Ic mouse\noption is on (the default is off),\n.Nm\nallows mouse events to be bound as keys.\nThe name of each key is made up of a mouse event (such as\n.Ql MouseUp1 )\nand a location suffix, one of the following:\n.Bl -column \"XXXXXXXXXXXXX\" -offset indent\n.It Li \"Pane\" Ta \"the contents of a pane\"\n.It Li \"Border\" Ta \"a pane border\"\n.It Li \"Status\" Ta \"the status line window list\"\n.It Li \"StatusLeft\" Ta \"the left part of the status line\"\n.It Li \"StatusRight\" Ta \"the right part of the status line\"\n.It Li \"StatusDefault\" Ta \"any other part of the status line\"\n.It Li \"ScrollbarSlider\" Ta \"the scrollbar slider\"\n.It Li \"ScrollbarUp\" Ta \"above the scrollbar slider\"\n.It Li \"ScrollbarDown\" Ta \"below the scrollbar slider\"\n.El\n.Pp\nThe following mouse events are available:\n.Bl -column \"MouseDown1\" \"MouseDrag1\" \"WheelDown\" -offset indent\n.It Li \"WheelUp\" Ta \"WheelDown\" Ta \"\"\n.It Li \"MouseDown1\" Ta \"MouseUp1\" Ta \"MouseDrag1\" Ta \"MouseDragEnd1\"\n.It Li \"MouseDown2\" Ta \"MouseUp2\" Ta \"MouseDrag2\" Ta \"MouseDragEnd2\"\n.It Li \"MouseDown3\" Ta \"MouseUp3\" Ta \"MouseDrag3\" Ta \"MouseDragEnd3\"\n.It Li \"SecondClick1\" Ta \"SecondClick2\" Ta \"SecondClick3\"\n.It Li \"DoubleClick1\" Ta \"DoubleClick2\" Ta \"DoubleClick3\"\n.It Li \"TripleClick1\" Ta \"TripleClick2\" Ta \"TripleClick3\"\n.El\n.Pp\nThe\n.Ql SecondClick\nevents are fired for the second click of a double click, even if there may be a\nthird click which will fire\n.Ql TripleClick\ninstead of\n.Ql DoubleClick .\n.Pp\nEach should be suffixed with a location, for example\n.Ql MouseDown1Status .\n.Pp\nThe special token\n.Ql {mouse}\nor\n.Ql =\nmay be used as\n.Ar target-window\nor\n.Ar target-pane\nin commands bound to mouse key bindings.\nIt resolves to the window or pane over which the mouse event took place\n(for example, the window in the status line over which button 1 was released\nfor a\n.Ql MouseUp1Status\nbinding, or the pane over which the wheel was scrolled for a\n.Ql WheelDownPane\nbinding).\n.Pp\nThe\n.Ic send-keys\n.Fl M\nflag may be used to forward a mouse event to a pane.\n.Pp\nThe default key bindings allow the mouse to be used to select and resize panes,\nto copy text and to change window using the status line.\nThese take effect if the\n.Ic mouse\noption is turned on.\n.Sh FORMATS\nCertain commands accept the\n.Fl F\nflag with a\n.Ar format\nargument.\nThis is a string which controls the output format of the command.\nFormat variables are enclosed in\n.Ql #{\nand\n.Ql } ,\nfor example\n.Ql #{session_name} .\nThe possible variables are listed in the table below, or the name of a\n.Nm\noption may be used for an option's value, or the name of an environment\nvariable.\nSome variables have a shorter alias such as\n.Ql #S ;\n.Ql ##\nis replaced by a single\n.Ql # ,\n.Ql #,\nby a\n.Ql \\&,\nand\n.Ql #}\nby a\n.Ql } .\n.Pp\nConditionals are available by prefixing with\n.Ql \\&? .\nFor each pair of two arguments, if the variable in the first of the pair exists\nand is not zero, the second of the pair is chosen, otherwise it continues.\nIf no condition from paired arguments matches, the default value is chosen.\nIf there's an unpaired final argument, that is the default.\nIf not, the default is the empty string.\nFor example\n.Ql #{?session_attached,attached,not attached}\nwill include the string\n.Ql attached\nif the session is attached and the string\n.Ql not attached\nif it is unattached, or\n.Ql #{?automatic-rename,yes,no}\nwill include\n.Ql yes\nif\n.Ic automatic-rename\nis enabled, or\n.Ql no\nif not.\n.Ql #{?#{n:window_name},#{window_name} - }\nwill include the window name with a dash separator if there is a window name, or\nthe empty string if the window name is empty.\n.Ql #{?session_format,format1,window_format,format2,format3}\nwill include format1 for a session format, format2 for a window format, or\nformat3 for neither a session nor a window format.\nConditionals can be nested arbitrarily.\nInside a conditional,\n.Ql \\&,\nand\n.Ql }\nmust be escaped as\n.Ql #,\nand\n.Ql #} ,\nunless they are part of a\n.Ql #{...}\nreplacement.\nFor example:\n.Bd -literal -offset indent\n#{?pane_in_mode,#[fg=white#,bg=red],#[fg=red#,bg=white]}#W\n.Ed\n.Pp\nString comparisons may be expressed by prefixing two comma-separated\nalternatives by\n.Ql == ,\n.Ql != ,\n.Ql < ,\n.Ql > ,\n.Ql <=\nor\n.Ql >=\nand a colon.\nFor example\n.Ql #{==:#{host},myhost}\nwill be replaced by\n.Ql 1\nif running on\n.Ql myhost ,\notherwise by\n.Ql 0 .\n.Ql ||\nand\n.Ql &&\nevaluate to true if any or all of the comma-separated alternatives are\ntrue, for example\n.Ql #{||:#{pane_in_mode},#{alternate_on}} .\n.Ql \\&!\nevaluates to true if the value is false and vice versa, for example\n.Ql #{!:#{pane_in_mode}} .\n.Ql !!\nconverts a value to a canonical boolean form, 1 for true and 0 for false, for\nexample\n.Ql #{!!:non-empty string}\nevaluates to 1.\n.Pp\nAn\n.Ql m\nspecifies a\n.Xr glob 7\npattern or regular expression comparison.\nThe first argument is the pattern and the second the string to compare.\nAn optional argument specifies flags:\n.Ql r\nmeans the pattern is a regular expression instead of the default\n.Xr glob 7\npattern, and\n.Ql i\nmeans to ignore case.\nFor example:\n.Ql #{m:*foo*,#{host}}\nor\n.Ql #{m/ri:^A,MYVAR} .\nA\n.Ql C\nperforms a search for a\n.Xr glob 7\npattern or regular expression in the pane content and evaluates to zero if not\nfound, or a line number if found.\nLike\n.Ql m ,\nan\n.Ql r\nflag means search for a regular expression and\n.Ql i\nignores case.\nFor example:\n.Ql #{C/r:^Start}\n.Pp\nNumeric operators may be performed by prefixing two comma-separated alternatives\nwith an\n.Ql e\nand an operator.\nAn optional\n.Ql f\nflag may be given after the operator to use floating point numbers, otherwise\nintegers are used.\nThis may be followed by a number giving the number of decimal places to use for\nthe result.\nThe available operators are:\naddition\n.Ql + ,\nsubtraction\n.Ql - ,\nmultiplication\n.Ql * ,\ndivision\n.Ql / ,\nmodulus\n.Ql m\nor\n.Ql %\n(note that\n.Ql %\nmust be escaped as\n.Ql %%\nin formats which are also expanded by\n.Xr strftime 3 )\nand numeric comparison operators\n.Ql == ,\n.Ql != ,\n.Ql < ,\n.Ql <= ,\n.Ql >\nand\n.Ql >= .\nFor example,\n.Ql #{e|*|f|4:5.5,3}\nmultiplies 5.5 by 3 for a result with four decimal places and\n.Ql #{e|%%:7,3}\nreturns the modulus of 7 and 3.\n.Ql a\nreplaces a numeric argument by its ASCII equivalent, so\n.Ql #{a:98}\nresults in\n.Ql b .\n.Ql c\nreplaces a\n.Nm\ncolour by its six-digit hexadecimal RGB value.\n.Pp\nA limit may be placed on the length of the resultant string by prefixing it\nby an\n.Ql = ,\na number and a colon.\nPositive numbers count from the start of the string and negative from the end,\nso\n.Ql #{=5:pane_title}\nwill include at most the first five characters of the pane title, or\n.Ql #{=-5:pane_title}\nthe last five characters.\nA suffix or prefix may be given as a second argument - if provided then it is\nappended or prepended to the string if the length has been trimmed, for example\n.Ql #{=/5/...:pane_title}\nwill append\n.Ql ...\nif the pane title is more than five characters.\nSimilarly,\n.Ql p\npads the string to a given width, for example\n.Ql #{p10:pane_title}\nwill result in a width of at least 10 characters.\nA positive width pads on the left, a negative on the right.\n.Ql n\nexpands to the length of the variable and\n.Ql w\nto its width when displayed, for example\n.Ql #{n:window_name} .\n.Ql R\nrepeats the first argument by a number of times given by the second argument,\nso\n.Ql #{R:a,3}\nwill result in\n.Ql aaa .\n.Pp\nPrefixing a time variable with\n.Ql t:\\&\nwill convert it to a string, so if\n.Ql #{window_activity}\ngives\n.Ql 1445765102 ,\n.Ql #{t:window_activity}\ngives\n.Ql Sun Oct 25 09:25:02 2015 .\nAdding\n.Ql p (\n.Ql `t/p` )\nwill use shorter but less accurate time format for times in the past.\nA custom format may be given using an\n.Ql f\nsuffix (note that\n.Ql %\nmust be escaped as\n.Ql %%\nif the format is separately being passed through\n.Xr strftime 3 ,\nfor example in the\n.Ic status-left\noption):\n.Ql #{t/f/%%H#:%%M:window_activity} ,\nsee\n.Xr strftime 3 .\n.Pp\nThe\n.Ql b:\\&\nand\n.Ql d:\\&\nprefixes are\n.Xr basename 3\nand\n.Xr dirname 3\nof the variable respectively.\n.Ql q:\\&\nwill escape\n.Xr sh 1\nspecial characters or with a\n.Ql h\nsuffix, escape hash characters (so\n.Ql #\nbecomes\n.Ql ## ) .\n.Ql E:\\&\nwill expand the format twice, for example\n.Ql #{E:status-left}\nis the result of expanding the content of the\n.Ic status-left\noption rather than the option itself.\n.Ql T:\\&\nis like\n.Ql E:\\&\nbut also expands\n.Xr strftime 3\nspecifiers.\n.Ql S:\\& ,\n.Ql W:\\& ,\n.Ql P:\\&\nor\n.Ql L:\\&\nwill loop over each session, window, pane or client and insert the format once\nfor each.\n.Ql L:\\& ,\n.Ql S:\\&\nand\n.Ql W:\\&\ncan take an optional sort argument\n.Ql /i\\& ,\n.Ql /n\\& ,\n.Ql /t\\&\nto sort by index, name, or last activity time; additionally\n.Ql /r\\&\nto sort in reverse order.\n.Ql /r\\&\ncan also be used with\n.Ql P:\\&\nto reverse the sort order by pane index.\nFor example,\n.Ql S/nr:\\&\nto sort sessions by name in reverse order.\nFor each, two comma-separated formats may be given:\nthe second is used for the current window, active pane, or active session.\nFor example, to get a list of windows formatted like the status line:\n.Bd -literal -offset indent\n#{W:#{E:window-status-format} ,#{E:window-status-current-format} }\n.Ed\n.Pp\n.Ql N:\\&\nchecks if a window (without any suffix or with the\n.Ql w\nsuffix) or a session (with the\n.Ql s\nsuffix) name exists, for example\n.Ql `N/w:foo`\nis replaced with 1 if a window named\n.Ql foo\nexists.\n.Pp\nA prefix of the form\n.Ql s/foo/bar/:\\&\nwill substitute\n.Ql foo\nwith\n.Ql bar\nthroughout.\nThe first argument may be an extended regular expression and a final argument\nmay be\n.Ql i\nto ignore case, for example\n.Ql s/a(.)/\\e1x/i:\\&\nwould change\n.Ql abABab\ninto\n.Ql bxBxbx .\nA different delimiter character may also be used, to avoid collisions with\nliteral slashes in the pattern.\nFor example,\n.Ql s|foo/|bar/|:\\&\nwill substitute\n.Ql foo/\nwith\n.Ql bar/\nthroughout.\n.Pp\nMultiple modifiers may be separated with a semicolon (;) as in\n.Ql #{T;=10:status-left} ,\nwhich limits the resulting\n.Xr strftime 3 -expanded\nstring to at most 10 characters.\n.Pp\nIn addition, the last line of a shell command's output may be inserted using\n.Ql #() .\nFor example,\n.Ql #(uptime)\nwill insert the system's uptime.\nWhen constructing formats,\n.Nm\ndoes not wait for\n.Ql #()\ncommands to finish; instead, the previous result from running the same command\nis used, or a placeholder if the command has not been run before.\nIf the command hasn't exited, the most recent line of output will be used, but\nthe status line will not be updated more than once a second.\nCommands are executed using\n.Pa /bin/sh\nand with the\n.Nm\nglobal environment set (see the\n.Sx GLOBAL AND SESSION ENVIRONMENT\nsection).\n.Pp\nAn\n.Ql l\nspecifies that a string should be interpreted literally and not expanded.\nFor example\n.Ql #{l:#{?pane_in_mode,yes,no}}\nwill be replaced by\n.Ql #{?pane_in_mode,yes,no} .\n.Pp\nThe following variables are available, where appropriate:\n.Bl -column \"XXXXXXXXXXXXXXXXXXX\" \"XXXXX\"\n.It Sy \"Variable name\" Ta Sy \"Alias\" Ta Sy \"Replaced with\"\n.It Li \"active_window_index\" Ta \"\" Ta \"Index of active window in session\"\n.It Li \"alternate_on\" Ta \"\" Ta \"1 if pane is in alternate screen\"\n.It Li \"alternate_saved_x\" Ta \"\" Ta \"Saved cursor X in alternate screen\"\n.It Li \"alternate_saved_y\" Ta \"\" Ta \"Saved cursor Y in alternate screen\"\n.It Li \"buffer_created\" Ta \"\" Ta \"Time buffer created\"\n.It Li \"buffer_full\" Ta \"\" Ta \"Full buffer content\"\n.It Li \"buffer_name\" Ta \"\" Ta \"Name of buffer\"\n.It Li \"buffer_sample\" Ta \"\" Ta \"Sample of start of buffer\"\n.It Li \"buffer_size\" Ta \"\" Ta \"Size of the specified buffer in bytes\"\n.It Li \"client_activity\" Ta \"\" Ta \"Time client last had activity\"\n.It Li \"client_cell_height\" Ta \"\" Ta \"Height of each client cell in pixels\"\n.It Li \"client_cell_width\" Ta \"\" Ta \"Width of each client cell in pixels\"\n.It Li \"client_control_mode\" Ta \"\" Ta \"1 if client is in control mode\"\n.It Li \"client_created\" Ta \"\" Ta \"Time client created\"\n.It Li \"client_discarded\" Ta \"\" Ta \"Bytes discarded when client behind\"\n.It Li \"client_flags\" Ta \"\" Ta \"List of client flags\"\n.It Li \"client_height\" Ta \"\" Ta \"Height of client\"\n.It Li \"client_key_table\" Ta \"\" Ta \"Current key table\"\n.It Li \"client_last_session\" Ta \"\" Ta \"Name of the client's last session\"\n.It Li \"client_name\" Ta \"\" Ta \"Name of client\"\n.It Li \"client_pid\" Ta \"\" Ta \"PID of client process\"\n.It Li \"client_prefix\" Ta \"\" Ta \"1 if prefix key has been pressed\"\n.It Li \"client_readonly\" Ta \"\" Ta \"1 if client is read-only\"\n.It Li \"client_session\" Ta \"\" Ta \"Name of the client's session\"\n.It Li \"client_termfeatures\" Ta \"\" Ta \"Terminal features of client, if any\"\n.It Li \"client_termname\" Ta \"\" Ta \"Terminal name of client\"\n.It Li \"client_termtype\" Ta \"\" Ta \"Terminal type of client, if available\"\n.It Li \"client_tty\" Ta \"\" Ta \"Pseudo terminal of client\"\n.It Li \"client_uid\" Ta \"\" Ta \"UID of client process\"\n.It Li \"client_user\" Ta \"\" Ta \"User of client process\"\n.It Li \"client_utf8\" Ta \"\" Ta \"1 if client supports UTF-8\"\n.It Li \"client_width\" Ta \"\" Ta \"Width of client\"\n.It Li \"client_written\" Ta \"\" Ta \"Bytes written to client\"\n.It Li \"command\" Ta \"\" Ta \"Name of command in use, if any\"\n.It Li \"command_list_alias\" Ta \"\" Ta \"Command alias if listing commands\"\n.It Li \"command_list_name\" Ta \"\" Ta \"Command name if listing commands\"\n.It Li \"command_list_usage\" Ta \"\" Ta \"Command usage if listing commands\"\n.It Li \"config_files\" Ta \"\" Ta \"List of configuration files loaded\"\n.It Li \"cursor_blinking\" Ta \"\" Ta \"1 if the cursor is blinking\"\n.It Li \"copy_cursor_hyperlink\" Ta \"\" Ta \"Hyperlink under cursor in copy mode\"\n.It Li \"copy_cursor_line\" Ta \"\" Ta \"Line the cursor is on in copy mode\"\n.It Li \"copy_cursor_word\" Ta \"\" Ta \"Word under cursor in copy mode\"\n.It Li \"copy_cursor_x\" Ta \"\" Ta \"Cursor X position in copy mode\"\n.It Li \"copy_cursor_y\" Ta \"\" Ta \"Cursor Y position in copy mode\"\n.It Li \"current_file\" Ta \"\" Ta \"Current configuration file\"\n.It Li \"cursor_character\" Ta \"\" Ta \"Character at cursor in pane\"\n.It Li \"cursor_colour\" Ta \"\" Ta \"Cursor colour in pane\"\n.It Li \"cursor_flag\" Ta \"\" Ta \"Pane cursor flag\"\n.It Li \"cursor_shape\" Ta \"\" Ta \"Cursor shape in pane\"\n.It Li \"cursor_very_visible\" Ta \"\" Ta \"1 if the cursor is in very visible mode\"\n.It Li \"cursor_x\" Ta \"\" Ta \"Cursor X position in pane\"\n.It Li \"cursor_y\" Ta \"\" Ta \"Cursor Y position in pane\"\n.It Li \"history_bytes\" Ta \"\" Ta \"Number of bytes in window history\"\n.It Li \"history_limit\" Ta \"\" Ta \"Maximum window history lines\"\n.It Li \"history_size\" Ta \"\" Ta \"Size of history in lines\"\n.It Li \"hook\" Ta \"\" Ta \"Name of running hook, if any\"\n.It Li \"hook_client\" Ta \"\" Ta \"Name of client where hook was run, if any\"\n.It Li \"hook_pane\" Ta \"\" Ta \"ID of pane where hook was run, if any\"\n.It Li \"hook_session\" Ta \"\" Ta \"ID of session where hook was run, if any\"\n.It Li \"hook_session_name\" Ta \"\" Ta \"Name of session where hook was run, if any\"\n.It Li \"hook_window\" Ta \"\" Ta \"ID of window where hook was run, if any\"\n.It Li \"hook_window_name\" Ta \"\" Ta \"Name of window where hook was run, if any\"\n.It Li \"host\" Ta \"#H\" Ta \"Hostname of local host\"\n.It Li \"host_short\" Ta \"#h\" Ta \"Hostname of local host (no domain name)\"\n.It Li \"insert_flag\" Ta \"\" Ta \"Pane insert flag\"\n.It Li \"keypad_cursor_flag\" Ta \"\" Ta \"Pane keypad cursor flag\"\n.It Li \"keypad_flag\" Ta \"\" Ta \"Pane keypad flag\"\n.It Li \"last_window_index\" Ta \"\" Ta \"Index of last window in session\"\n.It Li \"line\" Ta \"\" Ta \"Line number in the list\"\n.It Li \"loop_last_flag\" Ta \"\" Ta \"1 if last window, pane, session, client in the W:, P:, S:, or L: loop\"\n.It Li \"mouse_all_flag\" Ta \"\" Ta \"Pane mouse all flag\"\n.It Li \"mouse_any_flag\" Ta \"\" Ta \"Pane mouse any flag\"\n.It Li \"mouse_button_flag\" Ta \"\" Ta \"Pane mouse button flag\"\n.It Li \"mouse_hyperlink\" Ta \"\" Ta \"Hyperlink under mouse, if any\"\n.It Li \"mouse_line\" Ta \"\" Ta \"Line under mouse, if any\"\n.It Li \"mouse_sgr_flag\" Ta \"\" Ta \"Pane mouse SGR flag\"\n.It Li \"mouse_standard_flag\" Ta \"\" Ta \"Pane mouse standard flag\"\n.It Li \"mouse_status_line\" Ta \"\" Ta \"Status line on which mouse event took place\"\n.It Li \"mouse_status_range\" Ta \"\" Ta \"Range type or argument of mouse event on status line\"\n.It Li \"mouse_utf8_flag\" Ta \"\" Ta \"Pane mouse UTF-8 flag\"\n.It Li \"mouse_word\" Ta \"\" Ta \"Word under mouse, if any\"\n.It Li \"mouse_x\" Ta \"\" Ta \"Mouse X position, if any\"\n.It Li \"mouse_y\" Ta \"\" Ta \"Mouse Y position, if any\"\n.It Li \"next_session_id\" Ta \"\" Ta \"Unique session ID for next new session\"\n.It Li \"origin_flag\" Ta \"\" Ta \"Pane origin flag\"\n.It Li \"pane_active\" Ta \"\" Ta \"1 if active pane\"\n.It Li \"pane_at_bottom\" Ta \"\" Ta \"1 if pane is at the bottom of window\"\n.It Li \"pane_at_left\" Ta \"\" Ta \"1 if pane is at the left of window\"\n.It Li \"pane_at_right\" Ta \"\" Ta \"1 if pane is at the right of window\"\n.It Li \"pane_at_top\" Ta \"\" Ta \"1 if pane is at the top of window\"\n.It Li \"pane_bg\" Ta \"\" Ta \"Pane background colour\"\n.It Li \"pane_bottom\" Ta \"\" Ta \"Bottom of pane\"\n.It Li \"pane_current_command\" Ta \"\" Ta \"Current command if available\"\n.It Li \"pane_current_path\" Ta \"\" Ta \"Current path if available\"\n.It Li \"pane_dead\" Ta \"\" Ta \"1 if pane is dead\"\n.It Li \"pane_dead_signal\" Ta \"\" Ta \"Exit signal of process in dead pane\"\n.It Li \"pane_dead_status\" Ta \"\" Ta \"Exit status of process in dead pane\"\n.It Li \"pane_dead_time\" Ta \"\" Ta \"Exit time of process in dead pane\"\n.It Li \"pane_fg\" Ta \"\" Ta \"Pane foreground colour\"\n.It Li \"pane_format\" Ta \"\" Ta \"1 if format is for a pane\"\n.It Li \"pane_height\" Ta \"\" Ta \"Height of pane\"\n.It Li \"pane_id\" Ta \"#D\" Ta \"Unique pane ID\"\n.It Li \"pane_in_mode\" Ta \"\" Ta \"Number of modes pane is in\"\n.It Li \"pane_index\" Ta \"#P\" Ta \"Index of pane\"\n.It Li \"pane_input_off\" Ta \"\" Ta \"1 if input to pane is disabled\"\n.It Li \"pane_key_mode\" Ta \"\" Ta \"Extended key reporting mode in this pane\"\n.It Li \"pane_last\" Ta \"\" Ta \"1 if last pane\"\n.It Li \"pane_left\" Ta \"\" Ta \"Left of pane\"\n.It Li \"pane_marked\" Ta \"\" Ta \"1 if this is the marked pane\"\n.It Li \"pane_marked_set\" Ta \"\" Ta \"1 if a marked pane is set\"\n.It Li \"pane_mode\" Ta \"\" Ta \"Name of pane mode, if any\"\n.It Li \"pane_path\" Ta \"\" Ta \"Path of pane (can be set by application)\"\n.It Li \"pane_pid\" Ta \"\" Ta \"PID of first process in pane\"\n.It Li \"pane_pipe\" Ta \"\" Ta \"1 if pane is being piped\"\n.It Li \"pane_right\" Ta \"\" Ta \"Right of pane\"\n.It Li \"pane_search_string\" Ta \"\" Ta \"Last search string in copy mode\"\n.It Li \"pane_start_command\" Ta \"\" Ta \"Command pane started with\"\n.It Li \"pane_start_path\" Ta \"\" Ta \"Path pane started with\"\n.It Li \"pane_synchronized\" Ta \"\" Ta \"1 if pane is synchronized\"\n.It Li \"pane_tabs\" Ta \"\" Ta \"Pane tab positions\"\n.It Li \"pane_title\" Ta \"#T\" Ta \"Title of pane (can be set by application)\"\n.It Li \"pane_top\" Ta \"\" Ta \"Top of pane\"\n.It Li \"pane_tty\" Ta \"\" Ta \"Pseudo terminal of pane\"\n.It Li \"pane_unseen_changes\" Ta \"\" Ta \"1 if there were changes in pane while in mode\"\n.It Li \"pane_width\" Ta \"\" Ta \"Width of pane\"\n.It Li \"pid\" Ta \"\" Ta \"Server PID\"\n.It Li \"rectangle_toggle\" Ta \"\" Ta \"1 if rectangle selection is activated\"\n.It Li \"scroll_position\" Ta \"\" Ta \"Scroll position in copy mode\"\n.It Li \"scroll_region_lower\" Ta \"\" Ta \"Bottom of scroll region in pane\"\n.It Li \"scroll_region_upper\" Ta \"\" Ta \"Top of scroll region in pane\"\n.It Li \"search_count\" Ta \"\" Ta \"Count of search results\"\n.It Li \"search_count_partial\" Ta \"\" Ta \"1 if search count is partial count\"\n.It Li \"search_match\" Ta \"\" Ta \"Search match if any\"\n.It Li \"search_present\" Ta \"\" Ta \"1 if search started in copy mode\"\n.It Li \"selection_active\" Ta \"\" Ta \"1 if selection started and changes with the cursor in copy mode\"\n.It Li \"selection_end_x\" Ta \"\" Ta \"X position of the end of the selection\"\n.It Li \"selection_end_y\" Ta \"\" Ta \"Y position of the end of the selection\"\n.It Li \"selection_mode\" Ta \"\" Ta \"Selection mode\"\n.It Li \"selection_present\" Ta \"\" Ta \"1 if selection started in copy mode\"\n.It Li \"selection_start_x\" Ta \"\" Ta \"X position of the start of the selection\"\n.It Li \"selection_start_y\" Ta \"\" Ta \"Y position of the start of the selection\"\n.It Li \"server_sessions\" Ta \"\" Ta \"Number of sessions\"\n.It Li \"session_active\" Ta \"\" Ta \"1 if session active\"\n.It Li \"session_activity\" Ta \"\" Ta \"Time of session last activity\"\n.It Li \"session_activity_flag\" Ta \"\" Ta \"1 if any window in session has activity\"\n.It Li \"session_alerts\" Ta \"\" Ta \"List of window indexes with alerts\"\n.It Li \"session_attached\" Ta \"\" Ta \"Number of clients session is attached to\"\n.It Li \"session_attached_list\" Ta \"\" Ta \"List of clients session is attached to\"\n.It Li \"session_bell_flag\" Ta \"\" Ta \"1 if any window in session has bell\"\n.It Li \"session_created\" Ta \"\" Ta \"Time session created\"\n.It Li \"session_format\" Ta \"\" Ta \"1 if format is for a session\"\n.It Li \"session_group\" Ta \"\" Ta \"Name of session group\"\n.It Li \"session_group_attached\" Ta \"\" Ta \"Number of clients sessions in group are attached to\"\n.It Li \"session_group_attached_list\" Ta \"\" Ta \"List of clients sessions in group are attached to\"\n.It Li \"session_group_list\" Ta \"\" Ta \"List of sessions in group\"\n.It Li \"session_group_many_attached\" Ta \"\" Ta \"1 if multiple clients attached to sessions in group\"\n.It Li \"session_group_size\" Ta \"\" Ta \"Size of session group\"\n.It Li \"session_grouped\" Ta \"\" Ta \"1 if session in a group\"\n.It Li \"session_id\" Ta \"\" Ta \"Unique session ID\"\n.It Li \"session_last_attached\" Ta \"\" Ta \"Time session last attached\"\n.It Li \"session_many_attached\" Ta \"\" Ta \"1 if multiple clients attached\"\n.It Li \"session_marked\" Ta \"\" Ta \"1 if this session contains the marked pane\"\n.It Li \"session_name\" Ta \"#S\" Ta \"Name of session\"\n.It Li \"session_path\" Ta \"\" Ta \"Working directory of session\"\n.It Li \"session_silence_flag\" Ta \"\" Ta \"1 if any window in session has silence alert\"\n.It Li \"session_stack\" Ta \"\" Ta \"Window indexes in most recent order\"\n.It Li \"session_windows\" Ta \"\" Ta \"Number of windows in session\"\n.It Li \"socket_path\" Ta \"\" Ta \"Server socket path\"\n.It Li \"sixel_support\" Ta \"\" Ta \"1 if server has support for SIXEL\"\n.It Li \"start_time\" Ta \"\" Ta \"Server start time\"\n.It Li \"synchronized_output_flag\" Ta \"\" Ta \"1 if pane has synchronized output enabled\"\n.It Li \"uid\" Ta \"\" Ta \"Server UID\"\n.It Li \"user\" Ta \"\" Ta \"Server user\"\n.It Li \"version\" Ta \"\" Ta \"Server version\"\n.It Li \"window_active\" Ta \"\" Ta \"1 if window active\"\n.It Li \"window_active_clients\" Ta \"\" Ta \"Number of clients viewing this window\"\n.It Li \"window_active_clients_list\" Ta \"\" Ta \"List of clients viewing this window\"\n.It Li \"window_active_sessions\" Ta \"\" Ta \"Number of sessions on which this window is active\"\n.It Li \"window_active_sessions_list\" Ta \"\" Ta \"List of sessions on which this window is active\"\n.It Li \"window_activity\" Ta \"\" Ta \"Time of window last activity\"\n.It Li \"window_activity_flag\" Ta \"\" Ta \"1 if window has activity\"\n.It Li \"window_bell_flag\" Ta \"\" Ta \"1 if window has bell\"\n.It Li \"window_bigger\" Ta \"\" Ta \"1 if window is larger than client\"\n.It Li \"window_cell_height\" Ta \"\" Ta \"Height of each cell in pixels\"\n.It Li \"window_cell_width\" Ta \"\" Ta \"Width of each cell in pixels\"\n.It Li \"window_end_flag\" Ta \"\" Ta \"1 if window has the highest index\"\n.It Li \"window_flags\" Ta \"#F\" Ta \"Window flags with # escaped as ##\"\n.It Li \"window_format\" Ta \"\" Ta \"1 if format is for a window\"\n.It Li \"window_height\" Ta \"\" Ta \"Height of window\"\n.It Li \"window_id\" Ta \"\" Ta \"Unique window ID\"\n.It Li \"window_index\" Ta \"#I\" Ta \"Index of window\"\n.It Li \"window_last_flag\" Ta \"\" Ta \"1 if window is the last used\"\n.It Li \"window_layout\" Ta \"\" Ta \"Window layout description, ignoring zoomed window panes\"\n.It Li \"window_linked\" Ta \"\" Ta \"1 if window is linked across sessions\"\n.It Li \"window_linked_sessions\" Ta \"\" Ta \"Number of sessions this window is linked to\"\n.It Li \"window_linked_sessions_list\" Ta \"\" Ta \"List of sessions this window is linked to\"\n.It Li \"window_marked_flag\" Ta \"\" Ta \"1 if window contains the marked pane\"\n.It Li \"window_name\" Ta \"#W\" Ta \"Name of window\"\n.It Li \"window_offset_x\" Ta \"\" Ta \"X offset into window if larger than client\"\n.It Li \"window_offset_y\" Ta \"\" Ta \"Y offset into window if larger than client\"\n.It Li \"window_panes\" Ta \"\" Ta \"Number of panes in window\"\n.It Li \"window_raw_flags\" Ta \"\" Ta \"Window flags with nothing escaped\"\n.It Li \"window_silence_flag\" Ta \"\" Ta \"1 if window has silence alert\"\n.It Li \"window_stack_index\" Ta \"\" Ta \"Index in session most recent stack\"\n.It Li \"window_start_flag\" Ta \"\" Ta \"1 if window has the lowest index\"\n.It Li \"window_visible_layout\" Ta \"\" Ta \"Window layout description, respecting zoomed window panes\"\n.It Li \"window_width\" Ta \"\" Ta \"Width of window\"\n.It Li \"window_zoomed_flag\" Ta \"\" Ta \"1 if window is zoomed\"\n.It Li \"wrap_flag\" Ta \"\" Ta \"Pane wrap flag\"\n.El\n.Sh STYLES\n.Nm\noffers various options to specify the colour and attributes of aspects of the\ninterface, for example\n.Ic status-style\nfor the status line.\nIn addition, embedded styles may be specified in format options, such as\n.Ic status-left ,\nby enclosing them in\n.Ql #[\nand\n.Ql \\&] .\n.Pp\nA style may be the single term\n.Ql default\nto specify the default style (which may come from an option, for example\n.Ic status-style\nin the status line) or a space\nor comma separated list of the following:\n.Bl -tag -width Ds\n.It Ic fg=colour\nSet the foreground colour.\nThe colour is one of:\n.Ic black ,\n.Ic red ,\n.Ic green ,\n.Ic yellow ,\n.Ic blue ,\n.Ic magenta ,\n.Ic cyan ,\n.Ic white ;\nif supported the bright variants\n.Ic brightblack ,\n.Ic brightred ,\n.Eo ...;\n.Ec\n.Ic colour0\nto\n.Ic colour255\nfrom the 256-colour set;\n.Ic default\nfor the default colour;\n.Ic terminal\nfor the terminal default colour; or a hexadecimal RGB string such as\n.Ql #ffffff .\n.It Ic bg=colour\nSet the background colour.\n.It Ic us=colour\nSet the underscore colour.\n.It Ic none\nSet no attributes (turn off any active attributes).\n.It Xo Ic acs ,\n.Ic bright\n(or\n.Ic bold ) ,\n.Ic dim ,\n.Ic underscore ,\n.Ic blink ,\n.Ic reverse ,\n.Ic hidden ,\n.Ic italics ,\n.Ic overline ,\n.Ic strikethrough ,\n.Ic double-underscore ,\n.Ic curly-underscore ,\n.Ic dotted-underscore ,\n.Ic dashed-underscore\n.Xc\nSet an attribute.\nAny of the attributes may be prefixed with\n.Ql no\nto unset.\n.Ic acs\nis the terminal alternate character set.\n.It Xo Ic align=left\n(or\n.Ic noalign ) ,\n.Ic align=centre ,\n.Ic align=right\n.Xc\nAlign text to the left, centre or right of the available space if appropriate.\n.It Ic fill=colour\nFill the available space with a background colour if appropriate.\n.It Xo Ic list=on ,\n.Ic list=focus ,\n.Ic list=left-marker ,\n.Ic list=right-marker ,\n.Ic nolist\n.Xc\nMark the position of the various window list components in the\n.Ic status-format\noption:\n.Ic list=on\nmarks the start of the list;\n.Ic list=focus\nis the part of the list that should be kept in focus if the entire list won't\nfit in the available space (typically the current window);\n.Ic list=left-marker\nand\n.Ic list=right-marker\nmark the text to be used to mark that text has been trimmed from the left or\nright of the list if there is not enough space.\n.It Ic noattr\nDo not copy attributes from the default style.\n.It Xo Ic push-default ,\n.Ic pop-default\n.Xc\nStore the current colours and attributes as the default or reset to the previous\ndefault.\nA\n.Ic push-default\naffects any subsequent use of the\n.Ic default\nterm until a\n.Ic pop-default .\nOnly one default may be pushed (each\n.Ic push-default\nreplaces the previous saved default).\n.It Xo Ic range=left ,\n.Ic range=right ,\n.Ic range=session|X ,\n.Ic range=window|X ,\n.Ic range=pane|X ,\n.Ic range=user|X ,\n.Ic norange\n.Xc\nMark a range for mouse events in the\n.Ic status-format\noption.\nWhen a mouse event occurs in the\n.Ic range=left\nor\n.Ic range=right\nrange, the\n.Ql StatusLeft\nand\n.Ql StatusRight\nkey bindings are triggered.\n.Pp\n.Ic range=session|X ,\n.Ic range=window|X\nand\n.Ic range=pane|X\nare ranges for a session, window or pane.\nThese trigger the\n.Ql Status\nmouse key with the target session, window or pane given by the\n.Ql X\nargument.\n.Ql X\nis a session ID, window index in the current session or a pane ID.\nFor these, the\n.Ic mouse_status_range\nformat variable will be set to\n.Ql session ,\n.Ql window\nor\n.Ql pane .\n.Pp\n.Ic range=user|X\nis a user-defined range; it triggers the\n.Ql Status\nmouse key.\nThe argument\n.Ql X\nwill be available in the\n.Ic mouse_status_range\nformat variable.\n.Ql X\nmust be at most 15 bytes in length.\n.It Ic set-default\nSet the current colours and attributes as the default, overwriting any previous\ndefault.\nThe previous default cannot be restored.\n.El\n.Pp\nExamples are:\n.Bd -literal -offset indent\nfg=yellow bold underscore blink\nbg=black,fg=default,noreverse\n.Ed\n.Sh NAMES AND TITLES\n.Nm\ndistinguishes between names and titles.\nWindows and sessions have names, which may be used to specify them in targets\nand are displayed in the status line and various lists: the name is the\n.Nm\nidentifier for a window or session.\nOnly panes have titles.\nA pane's title is typically set by the program running inside the pane using\nan escape sequence (like it would set the\n.Xr xterm 1\nwindow title in\n.Xr X 7 ) .\nWindows themselves do not have titles - a window's title is the title of its\nactive pane.\n.Nm\nitself may set the title of the terminal in which the client is running, see\nthe\n.Ic set-titles\noption.\n.Pp\nA session's name is set with the\n.Ic new-session\nand\n.Ic rename-session\ncommands.\nA window's name is set with one of:\n.Bl -enum -width Ds\n.It\nA command argument (such as\n.Fl n\nfor\n.Ic new-window\nor\n.Ic new-session ) .\n.It\nAn escape sequence (if the\n.Ic allow-rename\noption is turned on):\n.Bd -literal -offset indent\n$ printf \\[aq]\\e033kWINDOW_NAME\\e033\\e\\e\\[aq]\n.Ed\n.It\nAutomatic renaming, which sets the name to the active command in the window's\nactive pane.\nSee the\n.Ic automatic-rename\noption.\n.El\n.Pp\nWhen a pane is first created, its title is the hostname.\nA pane's title can be set via the title setting escape sequence, for example:\n.Bd -literal -offset indent\n$ printf \\[aq]\\e033]2;My Title\\e033\\e\\e\\[aq]\n.Ed\n.Pp\nIt can also be modified with the\n.Ic select-pane\n.Fl T\ncommand.\n.Sh GLOBAL AND SESSION ENVIRONMENT\nWhen the server is started,\n.Nm\ncopies the environment into the\n.Em global environment ;\nin addition, each session has a\n.Em session environment .\nWhen a window is created, the session and global environments are merged.\nIf a variable exists in both, the value from the session environment is used.\nThe result is the initial environment passed to the new process.\n.Pp\nThe\n.Ic update-environment\nsession option may be used to update the session environment from the client\nwhen a new session is created or an old reattached.\n.Nm\nalso initialises the\n.Ev TMUX\nvariable with some internal information to allow commands to be executed\nfrom inside, and the\n.Ev TERM\nvariable with the correct terminal setting of\n.Ql screen .\n.Pp\nVariables in both session and global environments may be marked as hidden.\nHidden variables are not passed into the environment of new processes and\ninstead can only be used by tmux itself (for example in formats, see the\n.Sx FORMATS\nsection).\n.Pp\nCommands to alter and view the environment are:\n.Bl -tag -width Ds\n.Tg setenv\n.It Xo Ic set-environment\n.Op Fl Fhgru\n.Op Fl t Ar target-session\n.Ar variable Op Ar value\n.Xc\n.D1 Pq alias: Ic setenv\nSet or unset an environment variable.\nIf\n.Fl g\nis used, the change is made in the global environment; otherwise, it is applied\nto the session environment for\n.Ar target-session .\nIf\n.Fl F\nis present, then\n.Ar value\nis expanded as a format.\nThe\n.Fl u\nflag unsets a variable.\n.Fl r\nindicates the variable is to be removed from the environment before starting a\nnew process.\n.Fl h\nmarks the variable as hidden.\n.Tg showenv\n.It Xo Ic show-environment\n.Op Fl hgs\n.Op Fl t Ar target-session\n.Op Ar variable\n.Xc\n.D1 Pq alias: Ic showenv\nDisplay the environment for\n.Ar target-session\nor the global environment with\n.Fl g .\nIf\n.Ar variable\nis omitted, all variables are shown.\nVariables removed from the environment are prefixed with\n.Ql - .\nIf\n.Fl s\nis used, the output is formatted as a set of Bourne shell commands.\n.Fl h\nshows hidden variables (omitted by default).\n.El\n.Sh STATUS LINE\n.Nm\nincludes an optional status line which is displayed in the bottom line of each\nterminal.\n.Pp\nBy default, the status line is enabled and one line in height (it may be\ndisabled or made multiple lines with the\n.Ic status\nsession option) and contains, from left-to-right: the name of the current\nsession in square brackets; the window list; the title of the active pane\nin double quotes; and the time and date.\n.Pp\nEach line of the status line is configured with the\n.Ic status-format\noption.\nThe default is made of three parts: configurable left and right sections (which\nmay contain dynamic content such as the time or output from a shell command,\nsee the\n.Ic status-left ,\n.Ic status-left-length ,\n.Ic status-right ,\nand\n.Ic status-right-length\noptions below), and a central window list.\nBy default, the window list shows the index, name and (if any) flag of the\nwindows present in the current session in ascending numerical order.\nIt may be customised with the\n.Ar window-status-format\nand\n.Ar window-status-current-format\noptions.\nThe flag is one of the following symbols appended to the window name:\n.Bl -column \"Symbol\" \"Meaning\" -offset indent\n.It Sy \"Symbol\" Ta Sy \"Meaning\"\n.It Li \"*\" Ta \"Denotes the current window.\"\n.It Li \"-\" Ta \"Marks the last window (previously selected).\"\n.It Li \"#\" Ta \"Window activity is monitored and activity has been detected.\"\n.It Li \"\\&!\" Ta \"Window bells are monitored and a bell has occurred in the window.\"\n.It Li \"\\[ti]\" Ta \"The window has been silent for the monitor-silence interval.\"\n.It Li \"M\" Ta \"The window contains the marked pane.\"\n.It Li \"Z\" Ta \"The window's active pane is zoomed.\"\n.El\n.Pp\nThe # symbol relates to the\n.Ic monitor-activity\nwindow option.\nThe window name is printed in inverted colours if an alert (bell, activity or\nsilence) is present.\n.Pp\nThe colour and attributes of the status line may be configured, the entire\nstatus line using the\n.Ic status-style\nsession option and individual windows using the\n.Ic window-status-style\nwindow option.\n.Pp\nThe status line is automatically refreshed at interval if it has changed, the\ninterval may be controlled with the\n.Ic status-interval\nsession option.\n.Pp\nCommands related to the status line are as follows:\n.Bl -tag -width Ds\n.Tg clearphist\n.It Xo Ic clear-prompt-history\n.Op Fl T Ar prompt-type\n.Xc\n.D1 Pq alias: Ic clearphist\nClear status prompt history for prompt type\n.Ar prompt-type .\nIf\n.Fl T\nis omitted, then clear history for all types.\nSee\n.Ic command-prompt\nfor possible values for\n.Ar prompt-type .\n.It Xo Ic command-prompt\n.Op Fl 1beFiklN\n.Op Fl I Ar inputs\n.Op Fl p Ar prompts\n.Op Fl t Ar target-client\n.Op Fl T Ar prompt-type\n.Op Ar template\n.Xc\nOpen the command prompt in a client.\nThis may be used from inside\n.Nm\nto execute commands interactively.\n.Pp\nIf\n.Ar template\nis specified, it is used as the command.\nWith\n.Fl F ,\n.Ar template\nis expanded as a format.\n.Pp\nIf\n.Fl I\nis present,\n.Ar inputs\nis a comma-separated list of the initial text for each prompt.\nIf\n.Fl p\nis given,\n.Ar prompts\nis a comma-separated list of prompts which are displayed in order; otherwise\na single prompt is displayed, constructed from\n.Ar template\nif it is present, or\n.Ql \\&:\nif not.\n.Fl l\ndisables splitting of\n.Ar inputs\nand\n.Ar prompts\nat commas and treats them literally.\n.Pp\nBefore the command is executed, the first occurrence of the string\n.Ql %%\nand all occurrences of\n.Ql %1\nare replaced by the response to the first prompt, all\n.Ql %2\nare replaced with the response to the second prompt, and so on for further\nprompts.\nUp to nine prompt responses may be replaced\n.Po\n.Ql %1\nto\n.Ql %9\n.Pc .\n.Ql %%%\nis like\n.Ql %%\nbut any quotation marks are escaped.\n.Pp\n.Fl 1\nmakes the prompt only accept one key press, in this case the resulting input\nis a single character.\n.Fl k\nis like\n.Fl 1\nbut the key press is translated to a key name.\n.Fl N\nmakes the prompt only accept numeric key presses.\n.Fl i\nexecutes the command every time the prompt input changes instead of when the\nuser exits the command prompt.\n.Fl e\nmakes\n.Em BSpace\ncancel an empty prompt.\n.Pp\n.Fl T\ntells\n.Nm\nthe prompt type.\nThis affects what completions are offered when\n.Em Tab\nis pressed.\nAvailable types are:\n.Ql command ,\n.Ql search ,\n.Ql target\nand\n.Ql window-target .\n.Pp\nThe following keys have a special meaning in the command prompt, depending\non the value of the\n.Ic status-keys\noption:\n.Bl -column \"FunctionXXXXXXXXXXXXXXXXXXXXXXXXX\" \"viXXXX\" \"emacsX\" -offset indent\n.It Sy \"Function\" Ta Sy \"vi\" Ta Sy \"emacs\"\n.It Li \"Cancel command prompt\" Ta \"q\" Ta \"Escape\"\n.It Li \"Delete from cursor to start of word\" Ta \"\" Ta \"C-w\"\n.It Li \"Delete entire command\" Ta \"d\" Ta \"C-u\"\n.It Li \"Delete from cursor to end\" Ta \"D\" Ta \"C-k\"\n.It Li \"Execute command\" Ta \"Enter\" Ta \"Enter\"\n.It Li \"Get next command from history\" Ta \"\" Ta \"Down\"\n.It Li \"Get previous command from history\" Ta \"\" Ta \"Up\"\n.It Li \"Insert top paste buffer\" Ta \"p\" Ta \"C-y\"\n.It Li \"Look for completions\" Ta \"Tab\" Ta \"Tab\"\n.It Li \"Move cursor left\" Ta \"h\" Ta \"Left\"\n.It Li \"Move cursor right\" Ta \"l\" Ta \"Right\"\n.It Li \"Move cursor to end\" Ta \"$\" Ta \"C-e\"\n.It Li \"Move cursor to next word\" Ta \"w\" Ta \"M-f\"\n.It Li \"Move cursor to previous word\" Ta \"b\" Ta \"M-b\"\n.It Li \"Move cursor to start\" Ta \"0\" Ta \"C-a\"\n.It Li \"Transpose characters\" Ta \"\" Ta \"C-t\"\n.El\n.Pp\nWith\n.Fl b ,\nthe prompt is shown in the background and the invoking client does not exit\nuntil it is dismissed.\n.Tg confirm\n.It Xo Ic confirm-before\n.Op Fl by\n.Op Fl c Ar confirm-key\n.Op Fl p Ar prompt\n.Op Fl t Ar target-client\n.Ar command\n.Xc\n.D1 Pq alias: Ic confirm\nAsk for confirmation before executing\n.Ar command .\nIf\n.Fl p\nis given,\n.Ar prompt\nis the prompt to display; otherwise a prompt is constructed from\n.Ar command .\nIt may contain the special character sequences supported by the\n.Ic status-left\noption.\nWith\n.Fl b ,\nthe prompt is shown in the background and the invoking client does not exit\nuntil it is dismissed.\n.Fl y\nchanges the default behaviour (if Enter alone is pressed) of the prompt to\nrun the command.\n.Fl c\nchanges the confirmation key to\n.Ar confirm-key ;\nthe default is\n.Ql y .\n.Tg menu\n.It Xo Ic display-menu\n.Op Fl OM\n.Op Fl b Ar border-lines\n.Op Fl c Ar target-client\n.Op Fl C Ar starting-choice\n.Op Fl H Ar selected-style\n.Op Fl s Ar style\n.Op Fl S Ar border-style\n.Op Fl t Ar target-pane\n.Op Fl T Ar title\n.Op Fl x Ar position\n.Op Fl y Ar position\n.Ar name\n.Ar key\n.Ar command\n.Op Ar name key command ...\n.Xc\n.D1 Pq alias: Ic menu\nDisplay a menu on\n.Ar target-client .\n.Ar target-pane\ngives the target for any commands run from the menu.\n.Pp\nA menu is passed as a series of arguments: first the menu item name,\nsecond the key shortcut (or empty for none) and third the command\nto run when the menu item is chosen.\nThe name and command are formats, see the\n.Sx FORMATS\nand\n.Sx STYLES\nsections.\nIf the name begins with a hyphen (-), then the item is disabled (shown dim) and\nmay not be chosen.\nThe name may be empty for a separator line, in which case both the key and\ncommand should be omitted.\n.Pp\n.Fl b\nsets the type of characters used for drawing menu borders.\nSee\n.Ic popup-border-lines\nfor possible values for\n.Ar border-lines .\n.Pp\n.Fl H\nsets the style for the selected menu item (see\n.Sx STYLES ) .\n.Pp\n.Fl s\nsets the style for the menu and\n.Fl S\nsets the style for the menu border (see\n.Sx STYLES ) .\n.Pp\n.Fl T\nis a format for the menu title (see\n.Sx FORMATS ) .\n.Pp\n.Fl C\nsets the menu item selected by default, if the menu is not bound to a mouse key\nbinding.\n.Pp\n.Fl x\nand\n.Fl y\ngive the position of the menu.\nBoth may be a row or column number, or one of the following special values:\n.Bl -column \"XXXXX\" \"XXXX\" -offset indent\n.It Sy \"Value\" Ta Sy \"Flag\" Ta Sy \"Meaning\"\n.It Li \"C\" Ta \"Both\" Ta \"The centre of the terminal\"\n.It Li \"R\" Ta Fl x Ta \"The right side of the terminal\"\n.It Li \"P\" Ta \"Both\" Ta \"The bottom left of the pane\"\n.It Li \"M\" Ta \"Both\" Ta \"The mouse position\"\n.It Li \"W\" Ta \"Both\" Ta \"The window position on the status line\"\n.It Li \"S\" Ta Fl y Ta \"The line above or below the status line\"\n.El\n.Pp\nOr a format, which is expanded including the following additional variables:\n.Bl -column \"XXXXXXXXXXXXXXXXXXXXXXXXXX\" -offset indent\n.It Sy \"Variable name\" Ta Sy \"Replaced with\"\n.It Li \"popup_centre_x\" Ta \"Centered in the client\"\n.It Li \"popup_centre_y\" Ta \"Centered in the client\"\n.It Li \"popup_height\" Ta \"Height of menu or popup\"\n.It Li \"popup_mouse_bottom\" Ta \"Bottom of at the mouse\"\n.It Li \"popup_mouse_centre_x\" Ta \"Horizontal centre at the mouse\"\n.It Li \"popup_mouse_centre_y\" Ta \"Vertical centre at the mouse\"\n.It Li \"popup_mouse_top\" Ta \"Top at the mouse\"\n.It Li \"popup_mouse_x\" Ta \"Mouse X position\"\n.It Li \"popup_mouse_y\" Ta \"Mouse Y position\"\n.It Li \"popup_pane_bottom\" Ta \"Bottom of the pane\"\n.It Li \"popup_pane_left\" Ta \"Left of the pane\"\n.It Li \"popup_pane_right\" Ta \"Right of the pane\"\n.It Li \"popup_pane_top\" Ta \"Top of the pane\"\n.It Li \"popup_status_line_y\" Ta \"Above or below the status line\"\n.It Li \"popup_width\" Ta \"Width of menu or popup\"\n.It Li \"popup_window_status_line_x\" Ta \"At the window position in status line\"\n.It Li \"popup_window_status_line_y\" Ta \"At the status line showing the window\"\n.El\n.Pp\nEach menu consists of items followed by a key shortcut shown in brackets.\nIf the menu is too large to fit on the terminal, it is not displayed.\nPressing the key shortcut chooses the corresponding item.\nIf the mouse is enabled and the menu is opened from a mouse key binding,\nreleasing the mouse button with an item selected chooses that item and\nreleasing the mouse button without an item selected closes the menu.\n.Fl O\nchanges this behaviour so that the menu does not close when the mouse button is\nreleased without an item selected the menu is not closed and a mouse button\nmust be clicked to choose an item.\n.Pp\n.Fl M\ntells\n.Nm\nthe menu should handle mouse events; by default only menus opened from mouse\nkey bindings do so.\n.Pp\nThe following keys are available in menus:\n.Bl -column \"Key\" \"Function\" -offset indent\n.It Sy \"Key\" Ta Sy \"Function\"\n.It Li \"Enter\" Ta \"Choose selected item\"\n.It Li \"Up\" Ta \"Select previous item\"\n.It Li \"Down\" Ta \"Select next item\"\n.It Li \"q\" Ta \"Exit menu\"\n.El\n.Tg display\n.It Xo Ic display-message\n.Op Fl aCIlNpv\n.Op Fl c Ar target-client\n.Op Fl d Ar delay\n.Op Fl t Ar target-pane\n.Op Ar message\n.Xc\n.D1 Pq alias: Ic display\nDisplay a message.\nIf\n.Fl p\nis given, the output is printed to stdout, otherwise it is displayed in the\n.Ar target-client\nstatus line for up to\n.Ar delay\nmilliseconds.\nIf\n.Ar delay\nis not given, the\n.Ic display-time\noption is used; a delay of zero waits for a key press.\n.Ql N\nignores key presses and closes only after the delay expires.\nIf\n.Fl C\nis given, the pane will continue to be updated while the message is displayed.\nIf\n.Fl l\nis given,\n.Ar message\nis printed unchanged.\nOtherwise, the format of\n.Ar message\nis described in the\n.Sx FORMATS\nsection; information is taken from\n.Ar target-pane\nif\n.Fl t\nis given, otherwise the active pane.\n.Pp\n.Fl v\nprints verbose logging as the format is parsed and\n.Fl a\nlists the format variables and their values.\n.Pp\n.Fl I\nforwards any input read from stdin to the empty pane given by\n.Ar target-pane .\n.Tg popup\n.It Xo Ic display-popup\n.Op Fl BCEkN\n.Op Fl b Ar border-lines\n.Op Fl c Ar target-client\n.Op Fl d Ar start-directory\n.Op Fl e Ar environment\n.Op Fl h Ar height\n.Op Fl s Ar style\n.Op Fl S Ar border-style\n.Op Fl t Ar target-pane\n.Op Fl T Ar title\n.Op Fl w Ar width\n.Op Fl x Ar position\n.Op Fl y Ar position\n.Op Ar shell-command Op Ar argument ...\n.Xc\n.D1 Pq alias: Ic popup\nDisplay a popup running\n.Ar shell-command\n(or\n.Ar default-command\nwhen omitted) on\n.Ar target-client .\nA popup is a rectangular box drawn over the top of any panes.\nPanes are not updated while a popup is present.\nIf the command is run inside an existing popup, that popup is modified.\nOnly the\n.Fl b ,\n.Fl B ,\n.Fl C ,\n.Fl E ,\n.Fl EE ,\n.Fl K ,\n.Fl N ,\n.Fl s ,\nand\n.Fl S\noptions are accepted in this case;\nall others are ignored.\n.Pp\n.Fl E\ncloses the popup automatically when\n.Ar shell-command\nexits.\nTwo\n.Fl E\ncloses the popup only if\n.Ar shell-command\nexited with success.\n.Fl k\nallows any key to dismiss the popup instead of only\n.Ql Escape\nor\n.Ql C-c .\n.Pp\n.Fl x\nand\n.Fl y\ngive the position of the popup, they have the same meaning as for the\n.Ic display-menu\ncommand.\n.Fl w\nand\n.Fl h\ngive the width and height - both may be a percentage (followed by\n.Ql % ) .\nIf omitted, half of the terminal size is used.\n.Pp\n.Fl B\ndoes not surround the popup by a border.\n.Pp\n.Fl b\nsets the type of characters used for drawing popup borders.\nWhen\n.Fl B\nis specified, the\n.Fl b\noption is ignored.\nSee\n.Ic popup-border-lines\nfor possible values for\n.Ar border-lines .\n.Pp\n.Fl s\nsets the style for the popup and\n.Fl S\nsets the style for the popup border (see\n.Sx STYLES ) .\n.Pp\n.Fl e\ntakes the form\n.Ql VARIABLE=value\nand sets an environment variable for the popup; it may be specified multiple\ntimes.\n.Pp\n.Fl T\nis a format for the popup title (see\n.Sx FORMATS ) .\n.Pp\nThe\n.Fl C\nflag closes any popup on the client.\n.Pp\n.Fl N\ndisables any previously specified -E, -EE, or -k option.\n.Tg showphist\n.It Xo Ic show-prompt-history\n.Op Fl T Ar prompt-type\n.Xc\n.D1 Pq alias: Ic showphist\nDisplay status prompt history for prompt type\n.Ar prompt-type .\nIf\n.Fl T\nis omitted, then show history for all types.\nSee\n.Ic command-prompt\nfor possible values for\n.Ar prompt-type .\n.El\n.Sh BUFFERS\n.Nm\nmaintains a set of named\n.Em paste buffers .\nEach buffer may be either explicitly or automatically named.\nExplicitly named buffers are named when created with the\n.Ic set-buffer\nor\n.Ic load-buffer\ncommands, or by renaming an automatically named buffer with\n.Ic set-buffer\n.Fl n .\nAutomatically named buffers are given a name such as\n.Ql buffer0001 ,\n.Ql buffer0002\nand so on.\nWhen the\n.Ic buffer-limit\noption is reached, the oldest automatically named buffer is deleted.\nExplicitly named buffers are not subject to\n.Ic buffer-limit\nand may be deleted with the\n.Ic delete-buffer\ncommand.\n.Pp\nBuffers may be added using\n.Ic copy-mode\nor the\n.Ic set-buffer\nand\n.Ic load-buffer\ncommands, and pasted into a window using the\n.Ic paste-buffer\ncommand.\nIf a buffer command is used and no buffer is specified, the most\nrecently added automatically named buffer is assumed.\n.Pp\nA configurable history buffer is also maintained for each window.\nBy default, up to 2000 lines are kept; this can be altered with the\n.Ic history-limit\noption (see the\n.Ic set-option\ncommand above).\n.Pp\nThe buffer commands are as follows:\n.Bl -tag -width Ds\n.It Xo\n.Ic choose-buffer\n.Op Fl NryZ\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl K Ar key-format\n.Op Fl O Ar sort-order\n.Op Fl t Ar target-pane\n.Op Ar template\n.Xc\nPut a pane into buffer mode, where a buffer may be chosen interactively from\na list.\nEach buffer is shown on one line.\nA shortcut key is shown on the left in brackets allowing for immediate choice,\nor the list may be navigated and an item chosen or otherwise manipulated using\nthe keys below.\n.Fl Z\nzooms the pane.\n.Fl y\ndisables any confirmation prompts.\nThe following keys may be used in buffer mode:\n.Bl -column \"Key\" \"Function\" -offset indent\n.It Sy \"Key\" Ta Sy \"Function\"\n.It Li \"Enter\" Ta \"Paste selected buffer\"\n.It Li \"Up\" Ta \"Select previous buffer\"\n.It Li \"Down\" Ta \"Select next buffer\"\n.It Li \"C-s\" Ta \"Search by name or content\"\n.It Li \"n\" Ta \"Repeat last search forwards\"\n.It Li \"N\" Ta \"Repeat last search backwards\"\n.It Li \"t\" Ta \"Toggle if buffer is tagged\"\n.It Li \"T\" Ta \"Tag no buffers\"\n.It Li \"C-t\" Ta \"Tag all buffers\"\n.It Li \"p\" Ta \"Paste selected buffer\"\n.It Li \"P\" Ta \"Paste tagged buffers\"\n.It Li \"d\" Ta \"Delete selected buffer\"\n.It Li \"D\" Ta \"Delete tagged buffers\"\n.It Li \"e\" Ta \"Open the buffer in an editor\"\n.It Li \"f\" Ta \"Enter a format to filter items\"\n.It Li \"O\" Ta \"Change sort order\"\n.It Li \"r\" Ta \"Reverse sort order\"\n.It Li \"v\" Ta \"Toggle preview\"\n.It Li \"q\" Ta \"Exit mode\"\n.El\n.Pp\nAfter a buffer is chosen,\n.Ql %%\nis replaced by the buffer name in\n.Ar template\nand the result executed as a command.\nIf\n.Ar template\nis not given, \"paste-buffer -p -b \\[aq]%%\\[aq]\" is used.\n.Pp\n.Fl O\nspecifies the initial sort order: one of\n.Ql creation\n(time),\n.Ql name ,\nor\n.Ql size .\n.Fl r\nreverses the sort order.\n.Fl f\nspecifies an initial filter: the filter is a format - if it evaluates to zero,\nthe item in the list is not shown, otherwise it is shown.\nIf a filter would lead to an empty list, it is ignored.\n.Fl F\nspecifies the format for each item in the list and\n.Fl K\na format for each shortcut key; both are evaluated once for each line.\n.Fl N\nstarts without the preview.\nThis command works only if at least one client is attached.\n.Tg clearhist\n.It Xo Ic clear-history\n.Op Fl H\n.Op Fl t Ar target-pane\n.Xc\n.D1 Pq alias: Ic clearhist\nRemove and free the history for the specified pane.\n.Fl H\nalso removes all hyperlinks.\n.Tg deleteb\n.It Ic delete-buffer Op Fl b Ar buffer-name\n.D1 Pq alias: Ic deleteb\nDelete the buffer named\n.Ar buffer-name ,\nor the most recently added automatically named buffer if not specified.\n.Tg lsb\n.It Xo Ic list-buffers\n.Op Fl r\n.Op Fl F Ar format\n.Op Fl f Ar filter\n.Op Fl O Ar sort-order\n.Xc\n.D1 Pq alias: Ic lsb\nList the global buffers.\n.Fl F\nspecifies the format of each line and\n.Fl f\na filter.\nOnly buffers for which the filter is true are shown.\nSee the\n.Sx FORMATS\nsection.\n.Fl O\nspecifies the sort order: one of\n.Ql name ,\n.Ql size ,\nor\n.Ql creation\n(time).\n.Fl r\nreverses the sort order.\n.It Xo Ic load-buffer\n.Op Fl w\n.Op Fl b Ar buffer-name\n.Op Fl t Ar target-client\n.Ar path\n.Xc\n.Tg loadb\n.D1 Pq alias: Ic loadb\nLoad the contents of the specified paste buffer from\n.Ar path .\nIf\n.Fl w\nis given, the buffer is also sent to the clipboard for\n.Ar target-client\nusing the\n.Xr xterm 1\nescape sequence, if possible.\nIf\n.Ar path\nis\n.Ql - ,\nthe contents are read from stdin.\n.Tg pasteb\n.It Xo Ic paste-buffer\n.Op Fl dpr\n.Op Fl b Ar buffer-name\n.Op Fl s Ar separator\n.Op Fl t Ar target-pane\n.Xc\n.D1 Pq alias: Ic pasteb\nInsert the contents of a paste buffer into the specified pane.\nIf not specified, paste into the current one.\nWith\n.Fl d ,\nalso delete the paste buffer.\nWhen output, any linefeed (LF) characters in the paste buffer are replaced with\na separator, by default carriage return (CR).\nA custom separator may be specified using the\n.Fl s\nflag.\nThe\n.Fl r\nflag means to do no replacement (equivalent to a separator of LF).\nIf\n.Fl p\nis specified, paste bracket control codes are inserted around the\nbuffer if the application has requested bracketed paste mode.\n.Tg saveb\n.It Xo Ic save-buffer\n.Op Fl a\n.Op Fl b Ar buffer-name\n.Ar path\n.Xc\n.D1 Pq alias: Ic saveb\nSave the contents of the specified paste buffer to\n.Ar path .\nThe\n.Fl a\noption appends to rather than overwriting the file.\nIf\n.Ar path\nis\n.Ql - ,\nthe contents are written to stdout.\n.It Xo Ic set-buffer\n.Op Fl aw\n.Op Fl b Ar buffer-name\n.Op Fl t Ar target-client\n.Tg setb\n.Op Fl n Ar new-buffer-name\n.Ar data\n.Xc\n.D1 Pq alias: Ic setb\nSet the contents of the specified buffer to\n.Ar data .\nIf\n.Fl w\nis given, the buffer is also sent to the clipboard for\n.Ar target-client\nusing the\n.Xr xterm 1\nescape sequence, if possible.\nThe\n.Fl a\noption appends to rather than overwriting the buffer.\nThe\n.Fl n\noption renames the buffer to\n.Ar new-buffer-name .\n.Tg showb\n.It Xo Ic show-buffer\n.Op Fl b Ar buffer-name\n.Xc\n.D1 Pq alias: Ic showb\nDisplay the contents of the specified buffer.\n.El\n.Sh MISCELLANEOUS\nMiscellaneous commands are as follows:\n.Bl -tag -width Ds\n.It Ic clock-mode Op Fl t Ar target-pane\nDisplay a large clock.\n.Tg if\n.It Xo Ic if-shell\n.Op Fl bF\n.Op Fl t Ar target-pane\n.Ar shell-command command\n.Op Ar command\n.Xc\n.D1 Pq alias: Ic if\nExecute the first\n.Ar command\nif\n.Ar shell-command\n(run with\n.Pa /bin/sh )\nreturns success or the second\n.Ar command\notherwise.\nBefore being executed,\n.Ar shell-command\nis expanded using the rules specified in the\n.Sx FORMATS\nsection, including those relevant to\n.Ar target-pane .\nWith\n.Fl b ,\n.Ar shell-command\nis run in the background.\n.Pp\nIf\n.Fl F\nis given,\n.Ar shell-command\nis not executed but considered success if neither empty nor zero (after formats\nare expanded).\n.Tg lock\n.It Ic lock-server\n.D1 Pq alias: Ic lock\nLock each client individually by running the command specified by the\n.Ic lock-command\noption.\n.Tg run\n.It Xo Ic run-shell\n.Op Fl bCE\n.Op Fl c Ar start-directory\n.Op Fl d Ar delay\n.Op Fl t Ar target-pane\n.Op Ar shell-command\n.Xc\n.D1 Pq alias: Ic run\nExecute\n.Ar shell-command\nusing\n.Pa /bin/sh\nor (with\n.Fl C )\na\n.Nm\ncommand in the background without creating a window.\nBefore being executed,\n.Ar shell-command\nis expanded using the rules specified in the\n.Sx FORMATS\nsection.\nWith\n.Fl b ,\nthe command is run in the background.\n.Fl d\nwaits for\n.Ar delay\nseconds before starting the command.\n.Fl E\nredirects the command's stderr to stdout instead of ignoring it.\nIf\n.Fl c\nis given, the current working directory is set to\n.Ar start-directory .\nIf\n.Fl C\nis not given, any output to stdout is displayed in view mode (in the pane\nspecified by\n.Fl t\nor the current pane if omitted) after the command finishes.\nIf the command fails, the exit status is also displayed.\n.Tg wait\n.It Xo Ic wait-for\n.Op Fl L | S | U\n.Ar channel\n.Xc\n.D1 Pq alias: Ic wait\nWhen used without options, prevents the client from exiting until woken using\n.Ic wait-for\n.Fl S\nwith the same channel.\nWhen\n.Fl L\nis used, the channel is locked and any clients that try to lock the same\nchannel are made to wait until the channel is unlocked with\n.Ic wait-for\n.Fl U .\n.El\n.Sh EXIT MESSAGES\nWhen a\n.Nm\nclient detaches, it prints a message.\nThis may be one of:\n.Bl -tag -width Ds\n.It detached (from session ...)\nThe client was detached normally.\n.It detached and SIGHUP\nThe client was detached and its parent sent the\n.Dv SIGHUP\nsignal (for example with\n.Ic detach-client\n.Fl P ) .\n.It lost tty\nThe client's\n.Xr tty 4\nor\n.Xr pty 4\nwas unexpectedly destroyed.\n.It terminated\nThe client was killed with\n.Dv SIGTERM .\n.It too far behind\nThe client is in control mode and became unable to keep up with the data from\n.Nm .\n.It exited\nThe server exited when it had no sessions.\n.It server exited\nThe server exited when it received\n.Dv SIGTERM .\n.It server exited unexpectedly\nThe server crashed or otherwise exited without telling the client the reason.\n.El\n.Sh TERMINFO EXTENSIONS\n.Nm\nunderstands some unofficial extensions to\n.Xr terminfo 5 .\nIt is not normally necessary to set these manually, instead the\n.Ic terminal-features\noption should be used.\n.Bl -tag -width Ds\n.It Em \\&AX\nAn existing extension that tells\n.Nm\nthe terminal supports default colours.\n.It Em \\&Bidi\nTell\n.Nm\nthat the terminal supports the VTE bidirectional text extensions.\n.It Em \\&Cs , Cr\nSet the cursor colour.\nThe first takes a single string argument and is used to set the colour;\nthe second takes no arguments and restores the default cursor colour.\nIf set, a sequence such as this may be used\nto change the cursor colour from inside\n.Nm :\n.Bd -literal -offset indent\n$ printf \\[aq]\\e033]12;red\\e033\\e\\e\\[aq]\n.Ed\n.Pp\nThe colour is an\n.Xr X 7\ncolour, see\n.Xr XParseColor 3 .\n.It Em \\&Cmg, \\&Clmg, \\&Dsmg , \\&Enmg\nSet, clear, disable or enable DECSLRM margins.\nThese are set automatically if the terminal reports it is\n.Em VT420\ncompatible.\n.It Em \\&Dsbp , \\&Enbp\nDisable and enable bracketed paste.\nThese are set automatically if the\n.Em XT\ncapability is present.\n.It Em \\&Dseks , \\&Eneks\nDisable and enable extended keys.\n.It Em \\&Dsfcs , \\&Enfcs\nDisable and enable focus reporting.\nThese are set automatically if the\n.Em XT\ncapability is present.\n.It Em \\&Hls\nSet or clear a hyperlink annotation.\n.It Em \\&Nobr\nTell\n.Nm\nthat the terminal does not use bright colors for bold display.\n.It Em \\&Rect\nTell\n.Nm\nthat the terminal supports rectangle operations.\n.It Em \\&Smol\nEnable the overline attribute.\n.It Em \\&Smulx\nSet a styled underscore.\nThe single parameter is one of: 0 for no underscore, 1 for normal\nunderscore, 2 for double underscore, 3 for curly underscore, 4 for dotted\nunderscore and 5 for dashed underscore.\n.It Em \\&Setulc , \\&Setulc1, \\&ol\nSet the underscore colour or reset to the default.\n.Em Setulc\nis for RGB colours and\n.Em Setulc1\nfor ANSI or 256 colours.\nThe\n.Em Setulc\nargument is (red * 65536) + (green * 256) + blue where each is between 0\nand 255.\n.It Em \\&Ss , Se\nSet or reset the cursor style.\nIf set, a sequence such as this may be used\nto change the cursor to an underline:\n.Bd -literal -offset indent\n$ printf \\[aq]\\e033[4 q\\[aq]\n.Ed\n.Pp\nIf\n.Em Se\nis not set, \\&Ss with argument 0 will be used to reset the cursor style instead.\n.It Em \\&Swd\nSet the opening sequence for the working directory notification.\nThe sequence is terminated using the standard\n.Em fsl\ncapability.\n.It Em \\&Sxl\nIndicates that the terminal supports SIXEL.\n.It Em \\&Sync\nStart (parameter is 1) or end (parameter is 2) a synchronized update.\n.It Em \\&Tc\nIndicate that the terminal supports the\n.Ql direct colour\nRGB escape sequence (for example, \\ee[38;2;255;255;255m).\n.Pp\nIf supported, this is used for the initialize colour escape sequence (which\nmay be enabled by adding the\n.Ql initc\nand\n.Ql ccc\ncapabilities to the\n.Nm\n.Xr terminfo 5\nentry).\n.Pp\nThis is equivalent to the\n.Em RGB\n.Xr terminfo 5\ncapability.\n.It Em \\&Ms\nStore the current buffer in the host terminal's selection (clipboard).\nSee the\n.Em set-clipboard\noption above and the\n.Xr xterm 1\nman page.\n.It Em \\&XT\nThis is an existing extension capability that tmux uses to mean that the\nterminal supports the\n.Xr xterm 1\ntitle set sequences and to automatically set some of the capabilities above.\n.El\n.Sh CONTROL MODE\n.Nm\noffers a textual interface called\n.Em control mode .\nThis allows applications to communicate with\n.Nm\nusing a simple text-only protocol.\n.Pp\nIn control mode, a client sends\n.Nm\ncommands or command sequences terminated by newlines on standard input.\nEach command will produce one block of output on standard output.\nAn output block consists of a\n.Em %begin\nline followed by the output (which may be empty).\nThe output block ends with a\n.Em %end\nor\n.Em %error .\n.Em %begin\nand matching\n.Em %end\nor\n.Em %error\nhave three arguments: an integer time (as seconds from epoch), command number\nand flags (currently not used).\nFor example:\n.Bd -literal -offset indent\n%begin 1363006971 2 1\n0: ksh* (1 panes) [80x24] [layout b25f,80x24,0,0,2] @2 (active)\n%end 1363006971 2 1\n.Ed\n.Pp\nThe\n.Ic refresh-client\n.Fl C\ncommand may be used to set the size of a client in control mode.\n.Pp\nIn control mode,\n.Nm\noutputs notifications.\nA notification will never occur inside an output block.\n.Pp\nThe following notifications are defined:\n.Bl -tag -width Ds\n.It Ic %client-detached Ar client\nThe client has detached.\n.It Ic %client-session-changed Ar client session-id name\nThe client is now attached to the session with ID\n.Ar session-id ,\nwhich is named\n.Ar name .\n.It Ic %config-error Ar error\nAn error has happened in a configuration file.\n.It Ic %continue Ar pane-id\nThe pane has been continued after being paused (if the\n.Ar pause-after\nflag is set, see\n.Ic refresh-client\n.Fl A ) .\n.It Ic %exit Op Ar reason\nThe\n.Nm\nclient is exiting immediately, either because it is not attached to any session\nor an error occurred.\nIf present,\n.Ar reason\ndescribes why the client exited.\n.It Ic %extended-output Ar pane-id Ar age Ar ... \\& : Ar value\nNew form of\n.Ic %output\nsent when the\n.Ar pause-after\nflag is set.\n.Ar age\nis the time in milliseconds for which tmux had buffered the output before it\nwas sent.\nAny subsequent arguments up until a single\n.Ql \\&:\nare for future use and should be ignored.\n.It Xo Ic %layout-change\n.Ar window-id\n.Ar window-layout\n.Ar window-visible-layout\n.Ar window-flags\n.Xc\nThe layout of a window with ID\n.Ar window-id\nchanged.\nThe new layout is\n.Ar window-layout .\nThe window's visible layout is\n.Ar window-visible-layout\nand the window flags are\n.Ar window-flags .\n.It Ic %message Ar message\nA message sent with the\n.Ic display-message\ncommand.\n.It Ic %output Ar pane-id Ar value\nA window pane produced output.\n.Ar value\nescapes non-printable characters and backslash as octal \\\\xxx.\n.It Ic %pane-mode-changed Ar pane-id\nThe pane with ID\n.Ar pane-id\nhas changed mode.\n.It Ic %paste-buffer-changed Ar name\nPaste buffer\n.Ar name\nhas been changed.\n.It Ic %paste-buffer-deleted Ar name\nPaste buffer\n.Ar name\nhas been deleted.\n.It Ic %pause Ar pane-id\nThe pane has been paused (if the\n.Ar pause-after\nflag is set).\n.It Ic %session-changed Ar session-id Ar name\nThe client is now attached to the session with ID\n.Ar session-id ,\nwhich is named\n.Ar name .\n.It Ic %session-renamed Ar name\nThe current session was renamed to\n.Ar name .\n.It Ic %session-window-changed Ar session-id Ar window-id\nThe session with ID\n.Ar session-id\nchanged its active window to the window with ID\n.Ar window-id .\n.It Ic %sessions-changed\nA session was created or destroyed.\n.It Xo Ic %subscription-changed\n.Ar name\n.Ar session-id\n.Ar window-id\n.Ar window-index\n.Ar pane-id ... \\& :\n.Ar value\n.Xc\nThe value of the format associated with subscription\n.Ar name\nhas changed to\n.Ar value .\nSee\n.Ic refresh-client\n.Fl B .\nAny arguments after\n.Ar pane-id\nup until a single\n.Ql \\&:\nare for future use and should be ignored.\n.It Ic %unlinked-window-add Ar window-id\nThe window with ID\n.Ar window-id\nwas created but is not linked to the current session.\n.It Ic %unlinked-window-close Ar window-id\nThe window with ID\n.Ar window-id ,\nwhich is not linked to the current session, was closed.\n.It Ic %unlinked-window-renamed Ar window-id\nThe window with ID\n.Ar window-id ,\nwhich is not linked to the current session, was renamed.\n.It Ic %window-add Ar window-id\nThe window with ID\n.Ar window-id\nwas linked to the current session.\n.It Ic %window-close Ar window-id\nThe window with ID\n.Ar window-id\nclosed.\n.It Ic %window-pane-changed Ar window-id Ar pane-id\nThe active pane in the window with ID\n.Ar window-id\nchanged to the pane with ID\n.Ar pane-id .\n.It Ic %window-renamed Ar window-id Ar name\nThe window with ID\n.Ar window-id\nwas renamed to\n.Ar name .\n.El\n.Sh ENVIRONMENT\nWhen\n.Nm\nis started, it inspects the following environment variables:\n.Bl -tag -width LC_CTYPE\n.It Ev EDITOR\nIf the command specified in this variable contains the string\n.Ql vi\nand\n.Ev VISUAL\nis unset, use vi-style key bindings.\nOverridden by the\n.Ic mode-keys\nand\n.Ic status-keys\noptions.\n.It Ev HOME\nThe user's login directory.\nIf unset, the\n.Xr passwd 5\ndatabase is consulted.\n.It Ev LC_CTYPE\nThe character encoding\n.Xr locale 1 .\nIt is used for two separate purposes.\nFor output to the terminal, UTF-8 is used if the\n.Fl u\noption is given or if\n.Ev LC_CTYPE\ncontains\n.Qq UTF-8\nor\n.Qq UTF8 .\nOtherwise, only ASCII characters are written and non-ASCII characters\nare replaced with underscores\n.Pq Ql _ .\nFor input,\n.Nm\nalways runs with a UTF-8 locale.\nIf en_US.UTF-8 is provided by the operating system, it is used and\n.Ev LC_CTYPE\nis ignored for input.\nOtherwise,\n.Ev LC_CTYPE\ntells\n.Nm\nwhat the UTF-8 locale is called on the current system.\nIf the locale specified by\n.Ev LC_CTYPE\nis not available or is not a UTF-8 locale,\n.Nm\nexits with an error message.\n.It Ev LC_TIME\nThe date and time format\n.Xr locale 1 .\nIt is used for locale-dependent\n.Xr strftime 3\nformat specifiers.\n.It Ev PWD\nThe current working directory to be set in the global environment.\nThis may be useful if it contains symbolic links.\nIf the value of the variable does not match the current working\ndirectory, the variable is ignored and the result of\n.Xr getcwd 3\nis used instead.\n.It Ev SHELL\nThe absolute path to the default shell for new windows.\nSee the\n.Ic default-shell\noption for details.\n.It Ev TMUX_TMPDIR\nThe parent directory of the directory containing the server sockets.\nSee the\n.Fl L\noption for details.\n.It Ev VISUAL\nIf the command specified in this variable contains the string\n.Ql vi ,\nuse vi-style key bindings.\nOverridden by the\n.Ic mode-keys\nand\n.Ic status-keys\noptions.\n.El\n.Sh FILES\n.Bl -tag -width \"@SYSCONFDIR@/tmux.confXXX\" -compact\n.It Pa \\[ti]/.tmux.conf\n.It Pa $XDG_CONFIG_HOME/tmux/tmux.conf\n.It Pa \\[ti]/.config/tmux/tmux.conf\nDefault\n.Nm\nconfiguration file.\n.It Pa @SYSCONFDIR@/tmux.conf\nSystem-wide configuration file.\n.El\n.Sh EXAMPLES\nTo create a new\n.Nm\nsession running\n.Xr vi 1 :\n.Pp\n.Dl $ tmux new-session vi\n.Pp\nMost commands have a shorter form, known as an alias.\nFor new-session, this is\n.Ic new :\n.Pp\n.Dl $ tmux new vi\n.Pp\nAlternatively, the shortest unambiguous form of a command is accepted.\nIf there are several options, they are listed:\n.Bd -literal -offset indent\n$ tmux n\nambiguous command: n, could be: new-session, new-window, next-window\n.Ed\n.Pp\nWithin an active session, a new window may be created by typing\n.Ql C-b c\n(Ctrl\nfollowed by the\n.Ql b\nkey\nfollowed by the\n.Ql c\nkey).\n.Pp\nWindows may be navigated with:\n.Ql C-b 0\n(to select window 0),\n.Ql C-b 1\n(to select window 1), and so on;\n.Ql C-b n\nto select the next window; and\n.Ql C-b p\nto select the previous window.\n.Pp\nA session may be detached using\n.Ql C-b d\n(or by an external event such as\n.Xr ssh 1\ndisconnection) and reattached with:\n.Pp\n.Dl $ tmux attach-session\n.Pp\nTyping\n.Ql C-b \\&?\nlists the current key bindings in the current window; up and down may be used\nto navigate the list or\n.Ql q\nto exit from it.\n.Pp\nCommands to be run when the\n.Nm\nserver is started may be placed in the\n.Pa \\[ti]/.tmux.conf\nconfiguration file.\nCommon examples include:\n.Pp\nChanging the default prefix key:\n.Bd -literal -offset indent\nset-option -g prefix C-a\nunbind-key C-b\nbind-key C-a send-prefix\n.Ed\n.Pp\nTurning the status line off, or changing its colour:\n.Bd -literal -offset indent\nset-option -g status off\nset-option -g status-style bg=blue\n.Ed\n.Pp\nSetting other options, such as the default command,\nor locking after 30 minutes of inactivity:\n.Bd -literal -offset indent\nset-option -g default-command \"exec /bin/ksh\"\nset-option -g lock-after-time 1800\n.Ed\n.Pp\nCreating new key bindings:\n.Bd -literal -offset indent\nbind-key b set-option status\nbind-key / command-prompt \"split-window \\[aq]exec man %%\\[aq]\"\nbind-key S command-prompt \"new-window -n %1 \\[aq]ssh %1\\[aq]\"\n.Ed\n.Sh SEE ALSO\n.Xr pty 4\n.Sh AUTHORS\n.An Nicholas Marriott Aq Mt nicholas.marriott@gmail.com\n",
"sha256": "f2966da7a8267abc9aaa216a7a7b46d4d914d60114058dc046c4ff1c75ac9422"
},
".github/tools/external/tmux/example_tmux.conf": {
"mode": "100644",
"encoding": "utf-8",
"data": "#\n# Example .tmux.conf\n#\n# By Nicholas Marriott. Public domain.\n#\n\n# Some tweaks to the status line\nset -g status-right \"%H:%M\"\nset -g window-status-current-style \"underscore\"\n\n# If running inside tmux ($TMUX is set), then change the status line to red\n%if #{TMUX}\nset -g status-bg red\n%endif\n\n# Enable RGB colour if running in xterm(1)\nset-option -sa terminal-features \",xterm*:RGB\"\n\n# Change the default $TERM to tmux-256color\nset -g default-terminal \"tmux-256color\"\n\n# No bells at all\nset -g bell-action none\n\n# Keep windows around after they exit\nset -g remain-on-exit on\n\n# Change the prefix key to C-a\nset -g prefix C-a\nunbind C-b\nbind C-a send-prefix\n\n# Turn the mouse on, but without copy mode dragging\nset -g mouse on\nunbind -n MouseDrag1Pane\nunbind -Tcopy-mode MouseDrag1Pane\n\n# Some extra key bindings to select higher numbered windows\nbind F1 selectw -t:10\nbind F2 selectw -t:11\nbind F3 selectw -t:12\nbind F4 selectw -t:13\nbind F5 selectw -t:14\nbind F6 selectw -t:15\nbind F7 selectw -t:16\nbind F8 selectw -t:17\nbind F9 selectw -t:18\nbind F10 selectw -t:19\nbind F11 selectw -t:20\nbind F12 selectw -t:21\n\n# A key to toggle between smallest and largest sizes if a window is visible in\n# multiple places\nbind F set -w window-size\n\n# Keys to toggle monitoring activity in a window and the synchronize-panes option\nbind m set monitor-activity\nbind y set synchronize-panes\\; display 'synchronize-panes #{?synchronize-panes,on,off}'\n\n# Create a single default session - because a session is created here, tmux\n# should be started with \"tmux attach\" rather than \"tmux new\"\nnew -d -s0 -nirssi 'exec irssi'\nset -t0:0 monitor-activity on\nset -t0:0 aggressive-resize on\nneww -d -ntodo 'exec emacs ~/TODO'\nsetw -t0:1 aggressive-resize on\nneww -d -nmutt 'exec mutt'\nsetw -t0:2 aggressive-resize on\nneww -d\nneww -d\nneww -d\n",
"sha256": "0ab7c28342180d485434c3d8e286508a1e1c87ac9a2c8f2dc78bcf477a2de437"
},
".github/tools/external/tmux/tools/24-bit-color.sh": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/bin/bash\n#\n# This file echoes four gradients with 24-bit color codes\n# to the terminal to demonstrate their functionality.\n# The foreground escape sequence is ^[38;2;;;m\n# The background escape sequence is ^[48;2;;;m\n# range from 0 to 255 inclusive.\n# The escape sequence ^[0m returns output to default\n\n#\n# From\n# https://github.com/gnachman/iTerm2/blob/master/tests/24-bit-color.sh\n# and presumably covered by\n# https://github.com/gnachman/iTerm2/blob/master/LICENSE\n#\n\nSEQ1=\nif which gseq >/dev/null 2>&1; then\n SEQ1=gseq\nelif seq --version|grep -q GNU; then\n SEQ1=seq\nfi\nif [ -n \"$SEQ1\" ]; then\n # GNU seq requires a -ve increment if going backwards\n seq1()\n {\n if [ $1 -gt $2 ]; then\n\t $SEQ1 $1 -1 $2\n\telse\n\t $SEQ1 $1 $2\n\tfi\n }\n SEQ=seq1\nelse\n SEQ=seq\nfi\t\nSEPARATOR=':'\n\nsetBackgroundColor()\n{\n echo -en \"\\033[48${SEPARATOR}2${SEPARATOR}$1${SEPARATOR}$2${SEPARATOR}$3\"\"m\"\n}\n\nresetOutput()\n{\n echo -en \"\\033[0m\\n\"\n}\n\n# Gives a color $1/255 % along HSV\n# Who knows what happens when $1 is outside 0-255\n# Echoes \"$red $green $blue\" where\n# $red $green and $blue are integers\n# ranging between 0 and 255 inclusive\nrainbowColor()\n{ \n let h=$1/43\n let f=$1-43*$h\n let t=$f*255/43\n let q=255-t\n\n if [ $h -eq 0 ]\n then\n echo \"255 $t 0\"\n elif [ $h -eq 1 ]\n then\n echo \"$q 255 0\"\n elif [ $h -eq 2 ]\n then\n echo \"0 255 $t\"\n elif [ $h -eq 3 ]\n then\n echo \"0 $q 255\"\n elif [ $h -eq 4 ]\n then\n echo \"$t 0 255\"\n elif [ $h -eq 5 ]\n then\n echo \"255 0 $q\"\n else\n # execution should never reach here\n echo \"0 0 0\"\n fi\n}\n\nfor i in `$SEQ 0 127`; do\n setBackgroundColor $i 0 0\n echo -en \" \"\ndone\nresetOutput\nfor i in `$SEQ 255 128`; do\n setBackgroundColor $i 0 0\n echo -en \" \"\ndone\nresetOutput\n\nfor i in `$SEQ 0 127`; do\n setBackgroundColor 0 $i 0\n echo -n \" \"\ndone\nresetOutput\nfor i in `$SEQ 255 128`; do\n setBackgroundColor 0 $i 0\n echo -n \" \"\ndone\nresetOutput\n\nfor i in `$SEQ 0 127`; do\n setBackgroundColor 0 0 $i\n echo -n \" \"\ndone\nresetOutput\nfor i in `$SEQ 255 128`; do\n setBackgroundColor 0 0 $i\n echo -n \" \"\ndone\nresetOutput\n\nfor i in `$SEQ 0 127`; do\n setBackgroundColor `rainbowColor $i`\n echo -n \" \"\ndone\nresetOutput\nfor i in `$SEQ 255 128`; do\n setBackgroundColor `rainbowColor $i`\n echo -n \" \"\ndone\nresetOutput\n",
"sha256": "cee34d321461577c2455573ec58537833f5968cebe7df8d53aabf08b0e0d9ccf"
},
".github/tools/external/tmux/README.ja": {
"mode": "100644",
"encoding": "utf-8",
"data": "tmuxへようこそ!\n\ntmuxはターミナルマルチプレクサーです。複数のターミナルを一つのスクリーン内に作成し、操作することができます。\nバックグラウンドで処理を実行中に一度スクリーンから離れて後から復帰することも可能です。\n\nOpenBSD、FreeBSD、NetBSD、Linux、macOS、Solarisで実行できます。\n\ntmuxはlibevent 2.x.に依存します。 下記からダウンロードしてください。\n\n\thttp://libevent.org\n\nまた、ncursesも必要です。こちらからどうぞ。\n\n\thttp://invisible-island.net/ncurses/\n\ntarballでのtmuxのビルドとインストール方法。\n\n\t$ ./configure && make\n\t$ sudo make install\n\ntmuxはutmp(5)をアップデートするためにutempterを使うことができます。もしインストール済みであればオプション「--enable-utempter」をつけて実行してください。\n\nリポジトリから最新バージョンを手に入れるためには下記を実行。\n\n\t$ git clone https://github.com/tmux/tmux.git\n\t$ cd tmux\n\t$ sh autogen.sh\n\t$ ./configure && make\n\n(ビルドのためにはlibevent、ncurses libraries、headersに加えて、C compiler、make、autoconf、automake、pkg-configが必要です。)\n\n詳しい情報はhttp://git-scm.comをご覧ください。修正はメール宛、もしくはhttps://github.com/tmux/tmux/issuesにて受け付けています。\n\ntmuxのドキュメントについてはtmux.1マニュアルをご覧ください。こちらのコマンドで参照可能です。\n\n\t$ nroff -mdoc tmux.1|less\n\nサンプル設定は本リポジトリのexample_tmux.confに\nまた、bash-completionファイルは下記にあります。\n\n\thttps://github.com/scop/bash-completion/blob/main/completions/tmux\n\n「-v」や「-vv」を指定することでデバッグモードでの起動が可能です。カレントディレクトリにサーバーやクライアントのログファイルが生成されます。\n\n議論やバグレポート用のメーリングリストにはこちらから参加可能です。\n\n\thttps://groups.google.com/forum/#!forum/tmux-users\n\ngitコミットについての連絡先\n\n\thttps://groups.google.com/forum/#!forum/tmux-git\n\n購読はまでメールをお願いします。\n\nバグレポートや機能追加(特にコードへの貢献)は大歓迎です。こちらにご連絡ください。\n\n\ttmux-users@googlegroups.com\n\n本ファイル、CHANGES、 FAQ、SYNCINGそしてTODOはISC licenseで保護されています。\nその他のファイルのライセンスや著作権については、ファイルの上部に明記されています。\n\n-- Nicholas Marriott \n",
"sha256": "c341a10636227e426a759da4b80b754258ef31f1554a9ac369a79c5afeeadeb6"
},
".github/tools/external/tmux/logo/tmux-logo-1-color.eps": {
"mode": "100644",
"encoding": "utf-8",
"data": "%!PS-Adobe-3.0 EPSF-3.0\n%APL_DSC_Encoding: UTF8\n%APLProducer: (Version 10.10.3 (Build 14D136) Quartz PS Context)\n%%Title: (Unknown)\n%%Creator: (Unknown)\n%%CreationDate: (Unknown)\n%%For: (Unknown)\n%%DocumentData: Clean7Bit\n%%LanguageLevel: 2\n%%Pages: 1\n%%BoundingBox: 0 0 608 160\n%%EndComments\n%%BeginProlog\n%%BeginFile: cg-pdf.ps\n%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.\n%%Copyright: All Rights Reserved.\ncurrentpacking true setpacking\n/cg_md 141 dict def\ncg_md begin\n/L3? languagelevel 3 ge def\n/bd{bind def}bind def\n/ld{load def}bd\n/xs{exch store}bd\n/xd{exch def}bd\n/cmmtx matrix def\nmark\n/sc/setcolor\n/scs/setcolorspace\n/dr/defineresource\n/fr/findresource\n/T/true\n/F/false\n/d/setdash\n/w/setlinewidth\n/J/setlinecap\n/j/setlinejoin\n/M/setmiterlimit\n/i/setflat\n/rc/rectclip\n/rf/rectfill\n/rs/rectstroke\n/f/fill\n/f*/eofill\n/sf/selectfont\n/s/show\n/xS/xshow\n/yS/yshow\n/xyS/xyshow\n/S/stroke\n/m/moveto\n/l/lineto\n/c/curveto\n/h/closepath\n/n/newpath\n/q/gsave\n/Q/grestore\ncounttomark 2 idiv\n{ld}repeat pop\n/SC{\t\n /ColorSpace fr scs\n}bd\n/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld\n/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld\n/cgmtx matrix def\n/sdmtx{cgmtx currentmatrix pop}bd\n/CM {cgmtx setmatrix}bd\t\t\n/cm {cmmtx astore CM concat}bd\t\n/W{clip newpath}bd\n/W*{eoclip newpath}bd\nstatusdict begin product end dup (HP) anchorsearch{\n pop pop pop\t\n true\n}{\n pop\t\n (hp) anchorsearch{\n\tpop pop true\n }{\n\tpop false\n }ifelse\n}ifelse\n{\t\n { \n\t{ \n\t pop pop \n\t (0)dup 0 4 -1 roll put\n\t F charpath\n\t}cshow\n }\n}{\n {F charpath}\n}ifelse\n/cply exch bd\n/cps {cply stroke}bd\n/pgsave 0 def\n/bp{/pgsave save store}bd\n/ep{pgsave restore showpage}def\t\t\n/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd\n/scrdict 10 dict def\n/scrmtx matrix def\n/patarray 0 def\n/createpat{patarray 3 1 roll put}bd\n/makepat{\nscrmtx astore pop\ngsave\ninitgraphics\nCM \npatarray exch get\nscrmtx\nmakepattern\ngrestore\nsetpattern\n}bd\n/cg_BeginEPSF{\n userdict save/cg_b4_Inc_state exch put\n userdict/cg_endepsf/cg_EndEPSF load put\n count userdict/cg_op_count 3 -1 roll put \n countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put\n 3 sub{end}repeat\n /showpage {} def\n 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin\n 10 setmiterlimit [] 0 setdash newpath\n false setstrokeadjust false setoverprint\t\n}bd\n/cg_EndEPSF{\n countdictstack 3 sub { end } repeat\n cg_dict_array 3 1 index length 3 sub getinterval\n {begin}forall\n count userdict/cg_op_count get sub{pop}repeat\n userdict/cg_b4_Inc_state get restore\n F setpacking\n}bd\n/cg_biproc{currentfile/RunLengthDecode filter}bd\n/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd\n/ImageDataSource 0 def\nL3?{\n /cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd\n /cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd\n}{\n /ImageBandMask 0 def\n /ImageBandData 0 def\n /cg_mibiproc{\n\tstring/ImageBandMask xs\n\tstring/ImageBandData xs\n\t/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx\n\t /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd\n }bd\n /cg_miaiproc{\t\n\tstring/ImageBandMask xs\n\tstring/ImageBandData xs\n\t/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter\n\t dup ImageBandMask/readstring cvx\n\t /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd\n }bd\n}ifelse\n/imsave 0 def\n/BI{save/imsave xd mark}bd\n/EI{imsave restore}bd\n/ID{\ncounttomark 2 idiv\ndup 2 add\t\ndict begin\n{def} repeat\npop\t\t\n/ImageType 1 def\n/ImageMatrix[Width 0 0 Height neg 0 Height]def\ncurrentdict dup/ImageMask known{ImageMask}{F}ifelse exch\nL3?{\n dup/MaskedImage known\n { \n\tpop\n\t<<\n\t /ImageType 3\n\t /InterleaveType 2\n\t /DataDict currentdict\n\t /MaskDict\n\t << /ImageType 1\n\t\t/Width Width\n\t\t/Height Height\n\t\t/ImageMatrix ImageMatrix\n\t\t/BitsPerComponent 1\n\t\t/Decode [0 1]\n\t\tcurrentdict/Interpolate known\n\t\t{/Interpolate Interpolate}if\n\t >>\n\t>>\n }if\n}if\nexch\n{imagemask}{image}ifelse\t\nend\t\n}bd\n/cguidfix{statusdict begin mark version end\n{cvr}stopped{cleartomark 0}{exch pop}ifelse\n2012 lt{dup findfont dup length dict begin\n{1 index/FID ne 2 index/UniqueID ne and\n{def} {pop pop} ifelse}forall\ncurrentdict end definefont pop\n}{pop}ifelse\n}bd\n/t_array 0 def\n/t_i 0 def\n/t_c 1 string def\n/x_proc{ \n exch t_array t_i get add exch moveto\n /t_i t_i 1 add store\n}bd\n/y_proc{ \n t_array t_i get add moveto\n /t_i t_i 1 add store\n}bd\n/xy_proc{\n \n\tt_array t_i 2 copy 1 add get 3 1 roll get \n\t4 -1 roll add 3 1 roll add moveto\n\t/t_i t_i 2 add store\n}bd\n/sop 0 def\t\t\n/cp_proc/x_proc ld \t\n/base_charpath\t\t\n{\n /t_array xs\n /t_i 0 def\n { \n\tt_c 0 3 -1 roll put\n currentpoint\n\tt_c cply sop\n cp_proc\n }forall\n /t_array 0 def\n}bd\n/sop/stroke ld\t\t\n/nop{}def\n/xsp/base_charpath ld\n/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd\n/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd\n/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd\n/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd\n/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd\n/refnt{ \nfindfont dup length dict copy dup\n/Encoding 4 -1 roll put \ndefinefont pop\n}bd\n/renmfont{ \nfindfont dup length dict copy definefont pop\n}bd\nL3? dup dup{save exch}if\n/Range 0 def\n/DataSource 0 def\n/val 0 def\n/nRange 0 def\n/mulRange 0 def\n/d0 0 def\n/r0 0 def\n/di 0 def\n/ri 0 def\n/a0 0 def\n/a1 0 def\n/r1 0 def\n/r2 0 def\n/dx 0 def\n/Nsteps 0 def\n/sh3tp 0 def\n/ymax 0 def\n/ymin 0 def\n/xmax 0 def\n/xmin 0 def\n/setupFunEval \n{\n begin\n\t/nRange Range length 2 idiv store\n\t/mulRange \n\t\t \n\t[ \n\t 0 1 nRange 1 sub\n\t { \n\t\t 2 mul/nDim2 xd\t\t\n\t\t Range nDim2 get\t\t\n\t\t Range nDim2 1 add get\t\n\t\t 1 index sub\t\t\t\n\t\t\t\t\t\t\n\t\t 255 div\t\t\t\n\t\t exch\t\t\t\n\t }for\n\t]store\n end\n}bd\n/FunEval \n{\n begin\n\t\n\tnRange mul /val xd\t\n\t\t\t\t\n\t0 1 nRange 1 sub\n\t{\n\t dup 2 mul/nDim2 xd \n\t val\t\n\t add DataSource exch get \n\t mulRange nDim2 get mul \t\n\t mulRange nDim2 1 add get \n\t add \n\t}for\t\n end\n}bd\n/max \n{\n\t2 copy lt\n\t{exch pop}{pop}ifelse\n}bd\n/sh2\n{\t\n\t/Coords load aload pop \t\n\t3 index 3 index translate\t\n\t\t\t\t\t\n\t3 -1 roll sub\t\n\t3 1 roll exch \t\n\tsub\t\t\t\t\n\t2 copy\n\tdup mul exch dup mul add sqrt\t\n\tdup\n\tscale \n\tatan\t\n\t\n\trotate\t\t\n\t\n\t/Function load setupFunEval\t\n\t\n\t\n\tclippath {pathbbox}stopped {0 0 0 0}if newpath \t\n\t/ymax xs\n\t/xmax xs\n\t/ymin xs\n\t/xmin xs\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 0 get\n\t\t{\t\n\t\t\t0/Function load FunEval sc\t\n\t\t\txmin ymin xmin abs ymax ymin sub rectfill\n\t\t}if\n\t}if\n\t\n\t/Nsteps/Function load/Size get 0 get 1 sub store\n\t/dx 1 Nsteps div store\n\tgsave\n\t\t/di ymax ymin sub store\n\t\t/Function load\n\t\t\n\t\t0 1 Nsteps\n\t\t{\n\t\t\t1 index FunEval sc\n\t\t\t0 ymin dx di rectfill\n\t\t\tdx 0 translate\n\t\t}for\n\t\tpop\t\n\tgrestore\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 1 get\n\t\t{\t\n\t\t\tNsteps/Function load FunEval sc\t\n\t\t\t1 ymin xmax 1 sub abs ymax ymin sub rectfill\n\t\t}if\n\t}if\n}bd\n/shp\t\n{\t\n\t4 copy\n\t\n\tdup 0 gt{\n\t\t0 exch a1 a0 arc\n\t}{\n\t\tpop 0 moveto\n\t}ifelse\n\tdup 0 gt{\n\t\t0 exch a0 a1 arcn\n\t}{\n\t\tpop 0 lineto\n\t}ifelse\n\t\n\tfill\n\t\n\tdup 0 gt{\n\t\t0 exch a0 a1 arc\n\t}{\n\t\tpop 0 moveto\n\t}ifelse\n\tdup 0 gt{\n\t\t0 exch a1 a0 arcn\n\t}{\n\t\tpop 0 lineto\n\t}ifelse\n\t\n\tfill\n}bd\n/calcmaxs\n{\t\n\t\n\txmin dup mul ymin dup mul add sqrt\t\t\n\txmax dup mul ymin dup mul add sqrt\t\t\n\txmin dup mul ymax dup mul add sqrt\t\t\n\txmax dup mul ymax dup mul add sqrt\t\t\n\tmax max max\t\t\t\t\t\t\t\t\n}bd\n/sh3\n{\t\n\t/Coords load aload pop \t\n\t5 index 5 index translate\t\n\t3 -1 roll 6 -1 roll sub\t\t\n\t3 -1 roll 5 -1 roll sub\t\t\n\t2 copy dup mul exch dup mul add sqrt\n\t/dx xs\t\t\t\t\t\t\n\t2 copy 0 ne exch 0 ne or\n\t{\n\t\t\n\t\texch atan rotate\t\n\t}{\n\t\tpop pop\n\t}ifelse\n\t\n\t/r2 xs\n\t/r1 xs\n\t/Function load \n\tdup/Size get 0 get 1 sub\t\n\t/Nsteps xs\t\t\n\tsetupFunEval\t\t\n\t\n\t\n\t\n\t\n\t\n\tdx r2 add r1 lt{\n\t\t\n\t\t0 \n\t}{\n\t\tdx r1 add r2 le\n\t\t{ \n\t\t\t1\n\t\t}{ \n\t\t\tr1 r2 eq\n\t\t\t{\t\n\t\t\t\t2\n\t\t\t}{ \n\t\t\t\t3\n\t\t\t}ifelse\t\t\n\t\t}ifelse\n\t}ifelse\n\t/sh3tp xs\t\t\n\tclippath {pathbbox}stopped {0 0 0 0}if \n\tnewpath \t\n\t/ymax xs\n\t/xmax xs\n\t/ymin xs\n\t/xmin xs\n\t\n\tdx dup mul r2 r1 sub dup mul sub dup 0 gt\n\t{\n\t\tsqrt r2 r1 sub atan\n\t\t/a0 exch 180 exch sub store \n\t\t/a1 a0 neg store \n\t}{\n\t\tpop\n\t\t/a0 0 store\n\t\t/a1 360 store\t\t\n\t}ifelse\t\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 0 get r1 0 gt and\t\n\t\t{\t\n\t\t\t0/Function load FunEval sc\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{ \n\t\t\t\t{\t\n\t\t\t\t\tdx 0 r1 360 0 arcn\n\t\t\t\t\txmin ymin moveto\n\t\t\t\t\txmax ymin lineto\n\t\t\t\t\txmax ymax lineto\n\t\t\t\t\txmin ymax lineto\n\t\t\t\t\txmin ymin lineto\n\t\t\t\t\teofill\t\t\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\tr1 0 gt{0 0 r1 0 360 arc fill}if\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t0 r1 xmin abs r1 add neg r1 shp\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tr2 r1 gt{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t0 r1\n\t\t\t\t\t\tr1 neg r2 r1 sub div dx mul\t\n\t\t\t\t\t\t0\t\n\t\t\t\t\t\tshp\t\n\t\t\t\t\t}{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t0 r1 calcmaxs\t\n\t\t\t\t\t\tdup\n\t\t\t\t\t\t\n\t\t\t\t\t\tr2 add dx mul dx r1 r2 sub sub div\n\t\t\t\t\t\tneg\t\t\t\t\n\t\t\t\t\t\texch 1 index\t\n\t\t\t\t\t\tabs exch sub\n\t\t\t\t\t\tshp\n\t\t\t\t\t}ifelse\n\t\t\t\t} \n\t\t\t}sh3tp get exec\t\n\t\t}if\n\t}if\n\t\n\t/d0 0 store\n\t/r0 r1 store\n\t/di dx Nsteps div store\n\t/ri r2 r1 sub Nsteps div store \n\t/Function load \n\t0 1 Nsteps\n\t{\t\n\t\t1 index FunEval sc\n\t\td0 di add r0 ri add d0 r0 shp\n\t\t{\n\t\t\n\t\td0 0 r0 a1 a0 arc\n\t\td0 di add 0 r0 ri add a0 a1 arcn\n\t\tfill\n\t\t\n\t\t\n\t\td0 0 r0 a0 a1 arc\n\t\td0 di add 0 r0 ri add a1 a0 arcn\n\t\tfill\n\t\t}pop\n\t\t\n\t\t\n\t\t/d0 d0 di add store\n\t\t/r0 r0 ri add store\n\t}for\n\tpop\t\n\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 1 get r2 0 gt and\t\n\t\t{\t\n\t\t\tNsteps/Function load FunEval sc\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{ \n\t\t\t\t{\n\t\t\t\t\tdx 0 r2 0 360 arc fill\n\t\t\t\t} \n\t\t\t\t{\n\t\t\t\t\tdx 0 r2 360 0 arcn\n\t\t\t\t\txmin ymin moveto\n\t\t\t\t\txmax ymin lineto\n\t\t\t\t\txmax ymax lineto\n\t\t\t\t\txmin ymax lineto\n\t\t\t\t\txmin ymin lineto\n\t\t\t\t\teofill\t\t\n\t\t\t\t} \n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\txmax abs r1 add r1 dx r1 shp\n\t\t\t\t}\t\n\t\t\t\t{\t\n\t\t\t\n\t\t\t\t\tr2 r1 gt{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tcalcmaxs dup\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tr1 add dx mul dx r2 r1 sub sub div\t\n\t\t\t\t\t\texch 1 index\t\n\t\t\t\t\t\texch sub\n\t\t\t\t\t\tdx r2\n\t\t\t\t\t\tshp\n\t\t\t\t\t}{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tr1 neg r2 r1 sub div dx mul\t\n\t\t\t\t\t\t0\t\t\n\t\t\t\t\t\tdx \t\t\n\t\t\t\t\t\tr2\t\t\n\t\t\t\t\t\tshp\n\t\t\t\t\t}ifelse\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t\tsh3tp get exec\t\n\t\t}if\n\t}if\n}bd\n/sh\t\t\n{\t\n\tbegin\n\t\t/ShadingType load dup dup 2 eq exch 3 eq or\n\t\t{\t\n\t\t\tgsave\n\t\t\t\tnewpath\n\t\t\t\t/ColorSpace load scs\n\t\t\t\tcurrentdict/BBox known\n\t\t\t\t{\n\t\t\t\t\t/BBox load aload pop\t\n\t\t\t\t\t2 index sub\t\t\t\t\n\t\t\t\t\t3 index\t\t\t\t\t\n\t\t\t\t\t3 -1 roll exch sub \n\t\t\t\t\texch rectclip\n\t\t\t\t}if\n\t\t\t\t2 eq\n\t\t\t\t{sh2}{sh3}ifelse\n\t\t\tgrestore\n\t\t}{\n\t\t\t\n\t\t\tpop \n\t\t\t(DEBUG: shading type unimplemented\\n)print flush\n\t\t}ifelse\n\tend\n}bd\n{restore}if not dup{save exch}if\n\tL3?{\t\n\t\t/sh/shfill ld\n\t\t/csq/clipsave ld\n\t\t/csQ/cliprestore ld\n\t}if\n{restore}if\nend\nsetpacking\n%%EndFile\n%%EndProlog\n%%BeginSetup\n%%EndSetup\n%%Page: 1 1\n%%PageBoundingBox: 0 0 608 160\n%%BeginPageSetup\ncg_md begin\nbp\nsdmtx\n[ /CIEBasedABC 4 dict dup begin \n/WhitePoint [ 0.9505 1.0000 1.0891 ] def \n/DecodeABC [ \n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n\n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n\n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n] def \n/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def \n/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def \nend ] /Cs1 exch/ColorSpace dr pop\n%%EndPageSetup\n0.60000002 i\n/Cs1 SC\n0.23529412 0.23529412 0.23529412 sc\nq\n2 15.003872 m\n2 7.8149743 7.8157911 2 14.998466 2 c\n145.00154 2 l\n152.17584 2 158 7.8244047 158 15.003872 c\n160 15.003872 m\n160 6.7174625 153.27803 0 145.00154 0 c\n14.998466 0 l\n6.7150416 0 0 6.7065849 0 15.003872 c\n2 14 m\n0 16 l\n160 16 l\n158 14 l\n160 14 m\n0 14 l\nW\n0 0 608 160 rc\n-5 21 m\n165 21 l\n165 -5 l\n-5 -5 l\nh\nf\nQ\nq\n83 90 m\n83 160 l\n77 160 l\n77 14 l\n83 14 l\n83 84 l\n160 84 l\n160 90 l\n83 90 l\nh\n0 144.99352 m\n0 153.28137 6.7219648 160 14.998466 160 c\n145.00154 160 l\n153.28496 160 160 153.27509 160 144.99352 c\n160 14 l\n0 14 l\n0 144.99352 l\nh\n0 144.99352 m\nW*\n0 0 608 160 rc\n-5 165 m\n165 165 l\n165 9 l\n-5 9 l\nh\nf\nQ\nq\n242 12 m\n230.85426 12.165432 222.63789 15.032893 217.12346 20.7679 c\n211.60902 26.502909 208.85185 34.995007 209 46.244446 c\n209 98 l\n189 98 l\n189 113 l\n209 113 l\n209 146 l\n225 146 l\n225 113 l\n262 112.91358 l\n262 98.024689 l\n225 98 l\n225 46.079014 l\n225.39507 39.571983 226.99422 34.802074 230.1926 31.769136 c\n233.39096 28.736198 237.58186 27.219753 242.76543 27.219753 c\n245.19179 27.219753 247.89381 27.49547 250.87161 28.046913 c\n253.8494 28.598356 256.88229 29.425508 259.97037 30.528395 c\n263.27902 15.97037 l\n259.52921 14.646907 255.86215 13.681896 252.27777 13.075309 c\n248.69341 12.468721 245.19179 12.165432 241.77284 12.165432 c\n242 12 l\nh\n295 14 m\n278.15918 14 l\n278 112.91358 l\n295 112.91358 l\n295 96.370369 l\n295 96.370369 304.76617 106.29628 309.67401 109.60493 c\n314.58185 112.9136 320.34436 114.5679 326.96167 114.5679 c\n332.80695 114.5679 337.79745 112.94117 341.93326 109.68765 c\n346.06909 106.43414 349.01926 101.99509 350.78387 96.370369 c\n350.78387 96.370369 361.92294 106.29628 366.99622 109.60493 c\n372.06952 112.9136 378.08014 114.5679 385.02832 114.5679 c\n392.74854 114.5679 398.92459 111.72801 403.55673 106.04815 c\n408.18884 100.36829 410.50488 92.730911 410 83.139999 c\n410 14 l\n394 14 l\n393.96167 80.488892 l\n393.96167 87.106209 392.69336 91.820976 390.15674 94.633331 c\n387.62009 97.445694 383.98062 98.851852 379.23822 98.851852 c\n374.49579 98.851852 369.78104 97.418121 365.09375 94.550621 c\n360.40649 91.683113 356.24316 87.878212 353 83.135803 c\n353 14 l\n336.06042 14 l\n336.06042 80.488892 l\n336.06042 87.106209 334.79211 91.820976 332.25549 94.633331 c\n329.71884 97.445694 326.07938 98.851852 321.33698 98.851852 c\n316.59457 98.851852 311.87979 97.418121 307.19254 94.550621 c\n302.50525 91.683113 298.34192 87.878212 295 83.135803 c\n295 14 l\nh\n438.9505 21.264198 m\n433.10519 27.440361 430.18259 35.656738 430 46 c\n430 113 l\n447 113 l\n447 49.220001 l\n446.7258 42.16375 448.3801 36.814835 451.68875 33.175308 c\n454.99741 29.535784 459.85004 27.716049 466.2468 27.716049 c\n471.32007 27.716049 476.36569 29.177351 481.38382 32.099998 c\n486.40195 35.022648 491.39243 39.35141 496 45.086418 c\n496 112.91358 l\n513 113 l\n512.89862 14 l\n496 14 l\n496 30.197531 l\n496 30.197531 485.13364 20.271622 479.89493 16.962963 c\n474.65622 13.654305 468.78345 12 462.2764 12 c\n452.57101 12 444.79578 15.088035 438.9505 21.264198 c\nh\n588.65784 14 m\n564.50476 51.041977 l\n541.84052 14 l\n523.4776 14 l\n556.56403 63.449383 l\n524.63562 113 l\n543.164 113 l\n566.15906 77.180244 l\n589.48499 113 l\n607.84796 113 l\n574.43066 64.441978 l\n607.18622 14 l\n588.65784 14 l\nh\n588.65784 14 m\nW*\n0 0 608 160 rc\n184 151 m\n612.84796 151 l\n612.84796 7 l\n184 7 l\nh\nf\nep\nend\n%%Trailer\n%%EOF\n",
"sha256": "f4da0cd411ea21140efbb3ebd5fc9a76c87183c8eceb7902e6f08d061c17235b"
},
".github/tools/external/tmux/logo/tmux-logo.eps": {
"mode": "100644",
"encoding": "utf-8",
"data": "%!PS-Adobe-3.0 EPSF-3.0\n%APL_DSC_Encoding: UTF8\n%APLProducer: (Version 10.10.3 (Build 14D136) Quartz PS Context)\n%%Title: (Unknown)\n%%Creator: (Unknown)\n%%CreationDate: (Unknown)\n%%For: (Unknown)\n%%DocumentData: Clean7Bit\n%%LanguageLevel: 2\n%%Pages: 1\n%%BoundingBox: 0 0 608 160\n%%EndComments\n%%BeginProlog\n%%BeginFile: cg-pdf.ps\n%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.\n%%Copyright: All Rights Reserved.\ncurrentpacking true setpacking\n/cg_md 141 dict def\ncg_md begin\n/L3? languagelevel 3 ge def\n/bd{bind def}bind def\n/ld{load def}bd\n/xs{exch store}bd\n/xd{exch def}bd\n/cmmtx matrix def\nmark\n/sc/setcolor\n/scs/setcolorspace\n/dr/defineresource\n/fr/findresource\n/T/true\n/F/false\n/d/setdash\n/w/setlinewidth\n/J/setlinecap\n/j/setlinejoin\n/M/setmiterlimit\n/i/setflat\n/rc/rectclip\n/rf/rectfill\n/rs/rectstroke\n/f/fill\n/f*/eofill\n/sf/selectfont\n/s/show\n/xS/xshow\n/yS/yshow\n/xyS/xyshow\n/S/stroke\n/m/moveto\n/l/lineto\n/c/curveto\n/h/closepath\n/n/newpath\n/q/gsave\n/Q/grestore\ncounttomark 2 idiv\n{ld}repeat pop\n/SC{\t\n /ColorSpace fr scs\n}bd\n/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld\n/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld\n/cgmtx matrix def\n/sdmtx{cgmtx currentmatrix pop}bd\n/CM {cgmtx setmatrix}bd\t\t\n/cm {cmmtx astore CM concat}bd\t\n/W{clip newpath}bd\n/W*{eoclip newpath}bd\nstatusdict begin product end dup (HP) anchorsearch{\n pop pop pop\t\n true\n}{\n pop\t\n (hp) anchorsearch{\n\tpop pop true\n }{\n\tpop false\n }ifelse\n}ifelse\n{\t\n { \n\t{ \n\t pop pop \n\t (0)dup 0 4 -1 roll put\n\t F charpath\n\t}cshow\n }\n}{\n {F charpath}\n}ifelse\n/cply exch bd\n/cps {cply stroke}bd\n/pgsave 0 def\n/bp{/pgsave save store}bd\n/ep{pgsave restore showpage}def\t\t\n/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd\n/scrdict 10 dict def\n/scrmtx matrix def\n/patarray 0 def\n/createpat{patarray 3 1 roll put}bd\n/makepat{\nscrmtx astore pop\ngsave\ninitgraphics\nCM \npatarray exch get\nscrmtx\nmakepattern\ngrestore\nsetpattern\n}bd\n/cg_BeginEPSF{\n userdict save/cg_b4_Inc_state exch put\n userdict/cg_endepsf/cg_EndEPSF load put\n count userdict/cg_op_count 3 -1 roll put \n countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put\n 3 sub{end}repeat\n /showpage {} def\n 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin\n 10 setmiterlimit [] 0 setdash newpath\n false setstrokeadjust false setoverprint\t\n}bd\n/cg_EndEPSF{\n countdictstack 3 sub { end } repeat\n cg_dict_array 3 1 index length 3 sub getinterval\n {begin}forall\n count userdict/cg_op_count get sub{pop}repeat\n userdict/cg_b4_Inc_state get restore\n F setpacking\n}bd\n/cg_biproc{currentfile/RunLengthDecode filter}bd\n/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd\n/ImageDataSource 0 def\nL3?{\n /cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd\n /cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd\n}{\n /ImageBandMask 0 def\n /ImageBandData 0 def\n /cg_mibiproc{\n\tstring/ImageBandMask xs\n\tstring/ImageBandData xs\n\t/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx\n\t /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd\n }bd\n /cg_miaiproc{\t\n\tstring/ImageBandMask xs\n\tstring/ImageBandData xs\n\t/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter\n\t dup ImageBandMask/readstring cvx\n\t /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd\n }bd\n}ifelse\n/imsave 0 def\n/BI{save/imsave xd mark}bd\n/EI{imsave restore}bd\n/ID{\ncounttomark 2 idiv\ndup 2 add\t\ndict begin\n{def} repeat\npop\t\t\n/ImageType 1 def\n/ImageMatrix[Width 0 0 Height neg 0 Height]def\ncurrentdict dup/ImageMask known{ImageMask}{F}ifelse exch\nL3?{\n dup/MaskedImage known\n { \n\tpop\n\t<<\n\t /ImageType 3\n\t /InterleaveType 2\n\t /DataDict currentdict\n\t /MaskDict\n\t << /ImageType 1\n\t\t/Width Width\n\t\t/Height Height\n\t\t/ImageMatrix ImageMatrix\n\t\t/BitsPerComponent 1\n\t\t/Decode [0 1]\n\t\tcurrentdict/Interpolate known\n\t\t{/Interpolate Interpolate}if\n\t >>\n\t>>\n }if\n}if\nexch\n{imagemask}{image}ifelse\t\nend\t\n}bd\n/cguidfix{statusdict begin mark version end\n{cvr}stopped{cleartomark 0}{exch pop}ifelse\n2012 lt{dup findfont dup length dict begin\n{1 index/FID ne 2 index/UniqueID ne and\n{def} {pop pop} ifelse}forall\ncurrentdict end definefont pop\n}{pop}ifelse\n}bd\n/t_array 0 def\n/t_i 0 def\n/t_c 1 string def\n/x_proc{ \n exch t_array t_i get add exch moveto\n /t_i t_i 1 add store\n}bd\n/y_proc{ \n t_array t_i get add moveto\n /t_i t_i 1 add store\n}bd\n/xy_proc{\n \n\tt_array t_i 2 copy 1 add get 3 1 roll get \n\t4 -1 roll add 3 1 roll add moveto\n\t/t_i t_i 2 add store\n}bd\n/sop 0 def\t\t\n/cp_proc/x_proc ld \t\n/base_charpath\t\t\n{\n /t_array xs\n /t_i 0 def\n { \n\tt_c 0 3 -1 roll put\n currentpoint\n\tt_c cply sop\n cp_proc\n }forall\n /t_array 0 def\n}bd\n/sop/stroke ld\t\t\n/nop{}def\n/xsp/base_charpath ld\n/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd\n/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd\n/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd\n/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd\n/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd\n/refnt{ \nfindfont dup length dict copy dup\n/Encoding 4 -1 roll put \ndefinefont pop\n}bd\n/renmfont{ \nfindfont dup length dict copy definefont pop\n}bd\nL3? dup dup{save exch}if\n/Range 0 def\n/DataSource 0 def\n/val 0 def\n/nRange 0 def\n/mulRange 0 def\n/d0 0 def\n/r0 0 def\n/di 0 def\n/ri 0 def\n/a0 0 def\n/a1 0 def\n/r1 0 def\n/r2 0 def\n/dx 0 def\n/Nsteps 0 def\n/sh3tp 0 def\n/ymax 0 def\n/ymin 0 def\n/xmax 0 def\n/xmin 0 def\n/setupFunEval \n{\n begin\n\t/nRange Range length 2 idiv store\n\t/mulRange \n\t\t \n\t[ \n\t 0 1 nRange 1 sub\n\t { \n\t\t 2 mul/nDim2 xd\t\t\n\t\t Range nDim2 get\t\t\n\t\t Range nDim2 1 add get\t\n\t\t 1 index sub\t\t\t\n\t\t\t\t\t\t\n\t\t 255 div\t\t\t\n\t\t exch\t\t\t\n\t }for\n\t]store\n end\n}bd\n/FunEval \n{\n begin\n\t\n\tnRange mul /val xd\t\n\t\t\t\t\n\t0 1 nRange 1 sub\n\t{\n\t dup 2 mul/nDim2 xd \n\t val\t\n\t add DataSource exch get \n\t mulRange nDim2 get mul \t\n\t mulRange nDim2 1 add get \n\t add \n\t}for\t\n end\n}bd\n/max \n{\n\t2 copy lt\n\t{exch pop}{pop}ifelse\n}bd\n/sh2\n{\t\n\t/Coords load aload pop \t\n\t3 index 3 index translate\t\n\t\t\t\t\t\n\t3 -1 roll sub\t\n\t3 1 roll exch \t\n\tsub\t\t\t\t\n\t2 copy\n\tdup mul exch dup mul add sqrt\t\n\tdup\n\tscale \n\tatan\t\n\t\n\trotate\t\t\n\t\n\t/Function load setupFunEval\t\n\t\n\t\n\tclippath {pathbbox}stopped {0 0 0 0}if newpath \t\n\t/ymax xs\n\t/xmax xs\n\t/ymin xs\n\t/xmin xs\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 0 get\n\t\t{\t\n\t\t\t0/Function load FunEval sc\t\n\t\t\txmin ymin xmin abs ymax ymin sub rectfill\n\t\t}if\n\t}if\n\t\n\t/Nsteps/Function load/Size get 0 get 1 sub store\n\t/dx 1 Nsteps div store\n\tgsave\n\t\t/di ymax ymin sub store\n\t\t/Function load\n\t\t\n\t\t0 1 Nsteps\n\t\t{\n\t\t\t1 index FunEval sc\n\t\t\t0 ymin dx di rectfill\n\t\t\tdx 0 translate\n\t\t}for\n\t\tpop\t\n\tgrestore\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 1 get\n\t\t{\t\n\t\t\tNsteps/Function load FunEval sc\t\n\t\t\t1 ymin xmax 1 sub abs ymax ymin sub rectfill\n\t\t}if\n\t}if\n}bd\n/shp\t\n{\t\n\t4 copy\n\t\n\tdup 0 gt{\n\t\t0 exch a1 a0 arc\n\t}{\n\t\tpop 0 moveto\n\t}ifelse\n\tdup 0 gt{\n\t\t0 exch a0 a1 arcn\n\t}{\n\t\tpop 0 lineto\n\t}ifelse\n\t\n\tfill\n\t\n\tdup 0 gt{\n\t\t0 exch a0 a1 arc\n\t}{\n\t\tpop 0 moveto\n\t}ifelse\n\tdup 0 gt{\n\t\t0 exch a1 a0 arcn\n\t}{\n\t\tpop 0 lineto\n\t}ifelse\n\t\n\tfill\n}bd\n/calcmaxs\n{\t\n\t\n\txmin dup mul ymin dup mul add sqrt\t\t\n\txmax dup mul ymin dup mul add sqrt\t\t\n\txmin dup mul ymax dup mul add sqrt\t\t\n\txmax dup mul ymax dup mul add sqrt\t\t\n\tmax max max\t\t\t\t\t\t\t\t\n}bd\n/sh3\n{\t\n\t/Coords load aload pop \t\n\t5 index 5 index translate\t\n\t3 -1 roll 6 -1 roll sub\t\t\n\t3 -1 roll 5 -1 roll sub\t\t\n\t2 copy dup mul exch dup mul add sqrt\n\t/dx xs\t\t\t\t\t\t\n\t2 copy 0 ne exch 0 ne or\n\t{\n\t\t\n\t\texch atan rotate\t\n\t}{\n\t\tpop pop\n\t}ifelse\n\t\n\t/r2 xs\n\t/r1 xs\n\t/Function load \n\tdup/Size get 0 get 1 sub\t\n\t/Nsteps xs\t\t\n\tsetupFunEval\t\t\n\t\n\t\n\t\n\t\n\t\n\tdx r2 add r1 lt{\n\t\t\n\t\t0 \n\t}{\n\t\tdx r1 add r2 le\n\t\t{ \n\t\t\t1\n\t\t}{ \n\t\t\tr1 r2 eq\n\t\t\t{\t\n\t\t\t\t2\n\t\t\t}{ \n\t\t\t\t3\n\t\t\t}ifelse\t\t\n\t\t}ifelse\n\t}ifelse\n\t/sh3tp xs\t\t\n\tclippath {pathbbox}stopped {0 0 0 0}if \n\tnewpath \t\n\t/ymax xs\n\t/xmax xs\n\t/ymin xs\n\t/xmin xs\n\t\n\tdx dup mul r2 r1 sub dup mul sub dup 0 gt\n\t{\n\t\tsqrt r2 r1 sub atan\n\t\t/a0 exch 180 exch sub store \n\t\t/a1 a0 neg store \n\t}{\n\t\tpop\n\t\t/a0 0 store\n\t\t/a1 360 store\t\t\n\t}ifelse\t\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 0 get r1 0 gt and\t\n\t\t{\t\n\t\t\t0/Function load FunEval sc\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{ \n\t\t\t\t{\t\n\t\t\t\t\tdx 0 r1 360 0 arcn\n\t\t\t\t\txmin ymin moveto\n\t\t\t\t\txmax ymin lineto\n\t\t\t\t\txmax ymax lineto\n\t\t\t\t\txmin ymax lineto\n\t\t\t\t\txmin ymin lineto\n\t\t\t\t\teofill\t\t\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\tr1 0 gt{0 0 r1 0 360 arc fill}if\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t0 r1 xmin abs r1 add neg r1 shp\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tr2 r1 gt{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t0 r1\n\t\t\t\t\t\tr1 neg r2 r1 sub div dx mul\t\n\t\t\t\t\t\t0\t\n\t\t\t\t\t\tshp\t\n\t\t\t\t\t}{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t0 r1 calcmaxs\t\n\t\t\t\t\t\tdup\n\t\t\t\t\t\t\n\t\t\t\t\t\tr2 add dx mul dx r1 r2 sub sub div\n\t\t\t\t\t\tneg\t\t\t\t\n\t\t\t\t\t\texch 1 index\t\n\t\t\t\t\t\tabs exch sub\n\t\t\t\t\t\tshp\n\t\t\t\t\t}ifelse\n\t\t\t\t} \n\t\t\t}sh3tp get exec\t\n\t\t}if\n\t}if\n\t\n\t/d0 0 store\n\t/r0 r1 store\n\t/di dx Nsteps div store\n\t/ri r2 r1 sub Nsteps div store \n\t/Function load \n\t0 1 Nsteps\n\t{\t\n\t\t1 index FunEval sc\n\t\td0 di add r0 ri add d0 r0 shp\n\t\t{\n\t\t\n\t\td0 0 r0 a1 a0 arc\n\t\td0 di add 0 r0 ri add a0 a1 arcn\n\t\tfill\n\t\t\n\t\t\n\t\td0 0 r0 a0 a1 arc\n\t\td0 di add 0 r0 ri add a1 a0 arcn\n\t\tfill\n\t\t}pop\n\t\t\n\t\t\n\t\t/d0 d0 di add store\n\t\t/r0 r0 ri add store\n\t}for\n\tpop\t\n\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 1 get r2 0 gt and\t\n\t\t{\t\n\t\t\tNsteps/Function load FunEval sc\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{ \n\t\t\t\t{\n\t\t\t\t\tdx 0 r2 0 360 arc fill\n\t\t\t\t} \n\t\t\t\t{\n\t\t\t\t\tdx 0 r2 360 0 arcn\n\t\t\t\t\txmin ymin moveto\n\t\t\t\t\txmax ymin lineto\n\t\t\t\t\txmax ymax lineto\n\t\t\t\t\txmin ymax lineto\n\t\t\t\t\txmin ymin lineto\n\t\t\t\t\teofill\t\t\n\t\t\t\t} \n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\txmax abs r1 add r1 dx r1 shp\n\t\t\t\t}\t\n\t\t\t\t{\t\n\t\t\t\n\t\t\t\t\tr2 r1 gt{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tcalcmaxs dup\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tr1 add dx mul dx r2 r1 sub sub div\t\n\t\t\t\t\t\texch 1 index\t\n\t\t\t\t\t\texch sub\n\t\t\t\t\t\tdx r2\n\t\t\t\t\t\tshp\n\t\t\t\t\t}{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tr1 neg r2 r1 sub div dx mul\t\n\t\t\t\t\t\t0\t\t\n\t\t\t\t\t\tdx \t\t\n\t\t\t\t\t\tr2\t\t\n\t\t\t\t\t\tshp\n\t\t\t\t\t}ifelse\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t\tsh3tp get exec\t\n\t\t}if\n\t}if\n}bd\n/sh\t\t\n{\t\n\tbegin\n\t\t/ShadingType load dup dup 2 eq exch 3 eq or\n\t\t{\t\n\t\t\tgsave\n\t\t\t\tnewpath\n\t\t\t\t/ColorSpace load scs\n\t\t\t\tcurrentdict/BBox known\n\t\t\t\t{\n\t\t\t\t\t/BBox load aload pop\t\n\t\t\t\t\t2 index sub\t\t\t\t\n\t\t\t\t\t3 index\t\t\t\t\t\n\t\t\t\t\t3 -1 roll exch sub \n\t\t\t\t\texch rectclip\n\t\t\t\t}if\n\t\t\t\t2 eq\n\t\t\t\t{sh2}{sh3}ifelse\n\t\t\tgrestore\n\t\t}{\n\t\t\t\n\t\t\tpop \n\t\t\t(DEBUG: shading type unimplemented\\n)print flush\n\t\t}ifelse\n\tend\n}bd\n{restore}if not dup{save exch}if\n\tL3?{\t\n\t\t/sh/shfill ld\n\t\t/csq/clipsave ld\n\t\t/csQ/cliprestore ld\n\t}if\n{restore}if\nend\nsetpacking\n%%EndFile\n%%EndProlog\n%%BeginSetup\n%%EndSetup\n%%Page: 1 1\n%%PageBoundingBox: 0 0 608 160\n%%BeginPageSetup\ncg_md begin\nbp\nsdmtx\n[ /CIEBasedABC 4 dict dup begin \n/WhitePoint [ 0.9505 1.0000 1.0891 ] def \n/DecodeABC [ \n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n\n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n\n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n] def \n/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def \n/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def \nend ] /Cs1 exch/ColorSpace dr pop\n%%EndPageSetup\n0.60000002 i\n/Cs1 SC\n0.10588235 0.72549021 0.12156863 sc\nq\n0 44 m\n160 44 l\n160 15.003872 l\n160 6.7174625 153.27803 0 145.00154 0 c\n14.998466 0 l\n6.7150416 0 0 6.7065849 0 15.003872 c\n0 44 l\nh\n0 44 m\n160 44 l\n160 14 l\n0 14 l\n0 44 l\nh\n0 44 m\nW*\n0 0 608 160 rc\n-5 49 m\n165 49 l\n165 -5 l\n-5 -5 l\nh\nf\nQ\n0.23529412 0.23529412 0.23529412 sc\nq\n83 90 m\n83 160 l\n77 160 l\n77 14 l\n83 14 l\n83 84 l\n160 84 l\n160 90 l\n83 90 l\nh\n0 144.99352 m\n0 153.28137 6.7219648 160 14.998466 160 c\n145.00154 160 l\n153.28496 160 160 153.27509 160 144.99352 c\n160 14 l\n0 14 l\n0 144.99352 l\nh\n0 144.99352 m\nW*\n0 0 608 160 rc\n-5 165 m\n165 165 l\n165 9 l\n-5 9 l\nh\nf\nQ\n0.10588235 0.72549021 0.12156863 sc\nq\n241.77284 12.165432 m\n230.85426 12.165432 222.63789 15.032893 217.12346 20.7679 c\n211.60902 26.502909 208.85185 34.995007 208.85185 46.244446 c\n208.85185 98.024689 l\n189 98.024689 l\n189 112.91358 l\n208.85185 112.91358 l\n208.85185 146 l\n225.39507 146 l\n225.39507 112.91358 l\n261.79013 112.91358 l\n261.79013 98.024689 l\n225.39507 98.024689 l\n225.39507 46.079014 l\n225.39507 39.571983 226.99422 34.802074 230.1926 31.769136 c\n233.39096 28.736198 237.58186 27.219753 242.76543 27.219753 c\n245.19179 27.219753 247.89381 27.49547 250.87161 28.046913 c\n253.8494 28.598356 256.88229 29.425508 259.97037 30.528395 c\n263.27902 15.97037 l\n259.52921 14.646907 255.86215 13.681896 252.27777 13.075309 c\n248.69341 12.468721 245.19179 12.165432 241.77284 12.165432 c\n241.77284 12.165432 l\nh\n294.70239 13.654321 m\n278.15918 13.654321 l\n278.15918 112.91358 l\n294.70239 112.91358 l\n294.70239 96.370369 l\n294.70239 96.370369 304.76617 106.29628 309.67401 109.60493 c\n314.58185 112.9136 320.34436 114.5679 326.96167 114.5679 c\n332.80695 114.5679 337.79745 112.94117 341.93326 109.68765 c\n346.06909 106.43414 349.01926 101.99509 350.78387 96.370369 c\n350.78387 96.370369 361.92294 106.29628 366.99622 109.60493 c\n372.06952 112.9136 378.08014 114.5679 385.02832 114.5679 c\n392.74854 114.5679 398.92459 111.72801 403.55673 106.04815 c\n408.18884 100.36829 410.50488 92.730911 410.50488 83.135803 c\n410.50488 13.654321 l\n393.96167 13.654321 l\n393.96167 80.488892 l\n393.96167 87.106209 392.69336 91.820976 390.15674 94.633331 c\n387.62009 97.445694 383.98062 98.851852 379.23822 98.851852 c\n374.49579 98.851852 369.78104 97.418121 365.09375 94.550621 c\n360.40649 91.683113 356.24316 87.878212 352.60364 83.135803 c\n352.60364 13.654321 l\n336.06042 13.654321 l\n336.06042 80.488892 l\n336.06042 87.106209 334.79211 91.820976 332.25549 94.633331 c\n329.71884 97.445694 326.07938 98.851852 321.33698 98.851852 c\n316.59457 98.851852 311.87979 97.418121 307.19254 94.550621 c\n302.50525 91.683113 298.34192 87.878212 294.70239 83.135803 c\n294.70239 13.654321 l\nh\n438.9505 21.264198 m\n433.10519 27.440361 430.18259 35.656738 430.18259 45.913582 c\n430.18259 112.91358 l\n446.7258 112.91358 l\n446.7258 49.222221 l\n446.7258 42.16375 448.3801 36.814835 451.68875 33.175308 c\n454.99741 29.535784 459.85004 27.716049 466.2468 27.716049 c\n471.32007 27.716049 476.36569 29.177351 481.38382 32.099998 c\n486.40195 35.022648 491.39243 39.35141 496.35544 45.086418 c\n496.35544 112.91358 l\n512.89862 112.91358 l\n512.89862 13.654321 l\n496.35544 13.654321 l\n496.35544 30.197531 l\n496.35544 30.197531 485.13364 20.271622 479.89493 16.962963 c\n474.65622 13.654305 468.78345 12 462.2764 12 c\n452.57101 12 444.79578 15.088035 438.9505 21.264198 c\nh\n588.65784 13.654321 m\n564.50476 51.041977 l\n541.84052 13.654321 l\n523.4776 13.654321 l\n556.56403 63.449383 l\n524.63562 112.91358 l\n543.164 112.91358 l\n566.15906 77.180244 l\n589.48499 112.91358 l\n607.84796 112.91358 l\n574.43066 64.441978 l\n607.18622 13.654321 l\n588.65784 13.654321 l\nh\n588.65784 13.654321 m\nW*\n0 0 608 160 rc\n184 151 m\n612.84796 151 l\n612.84796 7 l\n184 7 l\nh\nf\nep\nend\n%%Trailer\n%%EOF\n",
"sha256": "13ecb5c04f2b40f5dca7dc7e9be3986de3d7641c6494cc3f139669a3e90dd144"
},
".github/tools/external/tmux/logo/tmux-logomark.eps": {
"mode": "100644",
"encoding": "utf-8",
"data": "%!PS-Adobe-3.0 EPSF-3.0\n%APL_DSC_Encoding: UTF8\n%APLProducer: (Version 10.10.3 (Build 14D136) Quartz PS Context)\n%%Title: (Unknown)\n%%Creator: (Unknown)\n%%CreationDate: (Unknown)\n%%For: (Unknown)\n%%DocumentData: Clean7Bit\n%%LanguageLevel: 2\n%%Pages: 1\n%%BoundingBox: 0 0 160 160\n%%EndComments\n%%BeginProlog\n%%BeginFile: cg-pdf.ps\n%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.\n%%Copyright: All Rights Reserved.\ncurrentpacking true setpacking\n/cg_md 141 dict def\ncg_md begin\n/L3? languagelevel 3 ge def\n/bd{bind def}bind def\n/ld{load def}bd\n/xs{exch store}bd\n/xd{exch def}bd\n/cmmtx matrix def\nmark\n/sc/setcolor\n/scs/setcolorspace\n/dr/defineresource\n/fr/findresource\n/T/true\n/F/false\n/d/setdash\n/w/setlinewidth\n/J/setlinecap\n/j/setlinejoin\n/M/setmiterlimit\n/i/setflat\n/rc/rectclip\n/rf/rectfill\n/rs/rectstroke\n/f/fill\n/f*/eofill\n/sf/selectfont\n/s/show\n/xS/xshow\n/yS/yshow\n/xyS/xyshow\n/S/stroke\n/m/moveto\n/l/lineto\n/c/curveto\n/h/closepath\n/n/newpath\n/q/gsave\n/Q/grestore\ncounttomark 2 idiv\n{ld}repeat pop\n/SC{\t\n /ColorSpace fr scs\n}bd\n/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld\n/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld\n/cgmtx matrix def\n/sdmtx{cgmtx currentmatrix pop}bd\n/CM {cgmtx setmatrix}bd\t\t\n/cm {cmmtx astore CM concat}bd\t\n/W{clip newpath}bd\n/W*{eoclip newpath}bd\nstatusdict begin product end dup (HP) anchorsearch{\n pop pop pop\t\n true\n}{\n pop\t\n (hp) anchorsearch{\n\tpop pop true\n }{\n\tpop false\n }ifelse\n}ifelse\n{\t\n { \n\t{ \n\t pop pop \n\t (0)dup 0 4 -1 roll put\n\t F charpath\n\t}cshow\n }\n}{\n {F charpath}\n}ifelse\n/cply exch bd\n/cps {cply stroke}bd\n/pgsave 0 def\n/bp{/pgsave save store}bd\n/ep{pgsave restore showpage}def\t\t\n/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd\n/scrdict 10 dict def\n/scrmtx matrix def\n/patarray 0 def\n/createpat{patarray 3 1 roll put}bd\n/makepat{\nscrmtx astore pop\ngsave\ninitgraphics\nCM \npatarray exch get\nscrmtx\nmakepattern\ngrestore\nsetpattern\n}bd\n/cg_BeginEPSF{\n userdict save/cg_b4_Inc_state exch put\n userdict/cg_endepsf/cg_EndEPSF load put\n count userdict/cg_op_count 3 -1 roll put \n countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put\n 3 sub{end}repeat\n /showpage {} def\n 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin\n 10 setmiterlimit [] 0 setdash newpath\n false setstrokeadjust false setoverprint\t\n}bd\n/cg_EndEPSF{\n countdictstack 3 sub { end } repeat\n cg_dict_array 3 1 index length 3 sub getinterval\n {begin}forall\n count userdict/cg_op_count get sub{pop}repeat\n userdict/cg_b4_Inc_state get restore\n F setpacking\n}bd\n/cg_biproc{currentfile/RunLengthDecode filter}bd\n/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd\n/ImageDataSource 0 def\nL3?{\n /cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd\n /cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd\n}{\n /ImageBandMask 0 def\n /ImageBandData 0 def\n /cg_mibiproc{\n\tstring/ImageBandMask xs\n\tstring/ImageBandData xs\n\t/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx\n\t /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd\n }bd\n /cg_miaiproc{\t\n\tstring/ImageBandMask xs\n\tstring/ImageBandData xs\n\t/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter\n\t dup ImageBandMask/readstring cvx\n\t /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd\n }bd\n}ifelse\n/imsave 0 def\n/BI{save/imsave xd mark}bd\n/EI{imsave restore}bd\n/ID{\ncounttomark 2 idiv\ndup 2 add\t\ndict begin\n{def} repeat\npop\t\t\n/ImageType 1 def\n/ImageMatrix[Width 0 0 Height neg 0 Height]def\ncurrentdict dup/ImageMask known{ImageMask}{F}ifelse exch\nL3?{\n dup/MaskedImage known\n { \n\tpop\n\t<<\n\t /ImageType 3\n\t /InterleaveType 2\n\t /DataDict currentdict\n\t /MaskDict\n\t << /ImageType 1\n\t\t/Width Width\n\t\t/Height Height\n\t\t/ImageMatrix ImageMatrix\n\t\t/BitsPerComponent 1\n\t\t/Decode [0 1]\n\t\tcurrentdict/Interpolate known\n\t\t{/Interpolate Interpolate}if\n\t >>\n\t>>\n }if\n}if\nexch\n{imagemask}{image}ifelse\t\nend\t\n}bd\n/cguidfix{statusdict begin mark version end\n{cvr}stopped{cleartomark 0}{exch pop}ifelse\n2012 lt{dup findfont dup length dict begin\n{1 index/FID ne 2 index/UniqueID ne and\n{def} {pop pop} ifelse}forall\ncurrentdict end definefont pop\n}{pop}ifelse\n}bd\n/t_array 0 def\n/t_i 0 def\n/t_c 1 string def\n/x_proc{ \n exch t_array t_i get add exch moveto\n /t_i t_i 1 add store\n}bd\n/y_proc{ \n t_array t_i get add moveto\n /t_i t_i 1 add store\n}bd\n/xy_proc{\n \n\tt_array t_i 2 copy 1 add get 3 1 roll get \n\t4 -1 roll add 3 1 roll add moveto\n\t/t_i t_i 2 add store\n}bd\n/sop 0 def\t\t\n/cp_proc/x_proc ld \t\n/base_charpath\t\t\n{\n /t_array xs\n /t_i 0 def\n { \n\tt_c 0 3 -1 roll put\n currentpoint\n\tt_c cply sop\n cp_proc\n }forall\n /t_array 0 def\n}bd\n/sop/stroke ld\t\t\n/nop{}def\n/xsp/base_charpath ld\n/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd\n/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd\n/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd\n/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd\n/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd\n/refnt{ \nfindfont dup length dict copy dup\n/Encoding 4 -1 roll put \ndefinefont pop\n}bd\n/renmfont{ \nfindfont dup length dict copy definefont pop\n}bd\nL3? dup dup{save exch}if\n/Range 0 def\n/DataSource 0 def\n/val 0 def\n/nRange 0 def\n/mulRange 0 def\n/d0 0 def\n/r0 0 def\n/di 0 def\n/ri 0 def\n/a0 0 def\n/a1 0 def\n/r1 0 def\n/r2 0 def\n/dx 0 def\n/Nsteps 0 def\n/sh3tp 0 def\n/ymax 0 def\n/ymin 0 def\n/xmax 0 def\n/xmin 0 def\n/setupFunEval \n{\n begin\n\t/nRange Range length 2 idiv store\n\t/mulRange \n\t\t \n\t[ \n\t 0 1 nRange 1 sub\n\t { \n\t\t 2 mul/nDim2 xd\t\t\n\t\t Range nDim2 get\t\t\n\t\t Range nDim2 1 add get\t\n\t\t 1 index sub\t\t\t\n\t\t\t\t\t\t\n\t\t 255 div\t\t\t\n\t\t exch\t\t\t\n\t }for\n\t]store\n end\n}bd\n/FunEval \n{\n begin\n\t\n\tnRange mul /val xd\t\n\t\t\t\t\n\t0 1 nRange 1 sub\n\t{\n\t dup 2 mul/nDim2 xd \n\t val\t\n\t add DataSource exch get \n\t mulRange nDim2 get mul \t\n\t mulRange nDim2 1 add get \n\t add \n\t}for\t\n end\n}bd\n/max \n{\n\t2 copy lt\n\t{exch pop}{pop}ifelse\n}bd\n/sh2\n{\t\n\t/Coords load aload pop \t\n\t3 index 3 index translate\t\n\t\t\t\t\t\n\t3 -1 roll sub\t\n\t3 1 roll exch \t\n\tsub\t\t\t\t\n\t2 copy\n\tdup mul exch dup mul add sqrt\t\n\tdup\n\tscale \n\tatan\t\n\t\n\trotate\t\t\n\t\n\t/Function load setupFunEval\t\n\t\n\t\n\tclippath {pathbbox}stopped {0 0 0 0}if newpath \t\n\t/ymax xs\n\t/xmax xs\n\t/ymin xs\n\t/xmin xs\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 0 get\n\t\t{\t\n\t\t\t0/Function load FunEval sc\t\n\t\t\txmin ymin xmin abs ymax ymin sub rectfill\n\t\t}if\n\t}if\n\t\n\t/Nsteps/Function load/Size get 0 get 1 sub store\n\t/dx 1 Nsteps div store\n\tgsave\n\t\t/di ymax ymin sub store\n\t\t/Function load\n\t\t\n\t\t0 1 Nsteps\n\t\t{\n\t\t\t1 index FunEval sc\n\t\t\t0 ymin dx di rectfill\n\t\t\tdx 0 translate\n\t\t}for\n\t\tpop\t\n\tgrestore\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 1 get\n\t\t{\t\n\t\t\tNsteps/Function load FunEval sc\t\n\t\t\t1 ymin xmax 1 sub abs ymax ymin sub rectfill\n\t\t}if\n\t}if\n}bd\n/shp\t\n{\t\n\t4 copy\n\t\n\tdup 0 gt{\n\t\t0 exch a1 a0 arc\n\t}{\n\t\tpop 0 moveto\n\t}ifelse\n\tdup 0 gt{\n\t\t0 exch a0 a1 arcn\n\t}{\n\t\tpop 0 lineto\n\t}ifelse\n\t\n\tfill\n\t\n\tdup 0 gt{\n\t\t0 exch a0 a1 arc\n\t}{\n\t\tpop 0 moveto\n\t}ifelse\n\tdup 0 gt{\n\t\t0 exch a1 a0 arcn\n\t}{\n\t\tpop 0 lineto\n\t}ifelse\n\t\n\tfill\n}bd\n/calcmaxs\n{\t\n\t\n\txmin dup mul ymin dup mul add sqrt\t\t\n\txmax dup mul ymin dup mul add sqrt\t\t\n\txmin dup mul ymax dup mul add sqrt\t\t\n\txmax dup mul ymax dup mul add sqrt\t\t\n\tmax max max\t\t\t\t\t\t\t\t\n}bd\n/sh3\n{\t\n\t/Coords load aload pop \t\n\t5 index 5 index translate\t\n\t3 -1 roll 6 -1 roll sub\t\t\n\t3 -1 roll 5 -1 roll sub\t\t\n\t2 copy dup mul exch dup mul add sqrt\n\t/dx xs\t\t\t\t\t\t\n\t2 copy 0 ne exch 0 ne or\n\t{\n\t\t\n\t\texch atan rotate\t\n\t}{\n\t\tpop pop\n\t}ifelse\n\t\n\t/r2 xs\n\t/r1 xs\n\t/Function load \n\tdup/Size get 0 get 1 sub\t\n\t/Nsteps xs\t\t\n\tsetupFunEval\t\t\n\t\n\t\n\t\n\t\n\t\n\tdx r2 add r1 lt{\n\t\t\n\t\t0 \n\t}{\n\t\tdx r1 add r2 le\n\t\t{ \n\t\t\t1\n\t\t}{ \n\t\t\tr1 r2 eq\n\t\t\t{\t\n\t\t\t\t2\n\t\t\t}{ \n\t\t\t\t3\n\t\t\t}ifelse\t\t\n\t\t}ifelse\n\t}ifelse\n\t/sh3tp xs\t\t\n\tclippath {pathbbox}stopped {0 0 0 0}if \n\tnewpath \t\n\t/ymax xs\n\t/xmax xs\n\t/ymin xs\n\t/xmin xs\n\t\n\tdx dup mul r2 r1 sub dup mul sub dup 0 gt\n\t{\n\t\tsqrt r2 r1 sub atan\n\t\t/a0 exch 180 exch sub store \n\t\t/a1 a0 neg store \n\t}{\n\t\tpop\n\t\t/a0 0 store\n\t\t/a1 360 store\t\t\n\t}ifelse\t\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 0 get r1 0 gt and\t\n\t\t{\t\n\t\t\t0/Function load FunEval sc\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{ \n\t\t\t\t{\t\n\t\t\t\t\tdx 0 r1 360 0 arcn\n\t\t\t\t\txmin ymin moveto\n\t\t\t\t\txmax ymin lineto\n\t\t\t\t\txmax ymax lineto\n\t\t\t\t\txmin ymax lineto\n\t\t\t\t\txmin ymin lineto\n\t\t\t\t\teofill\t\t\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\tr1 0 gt{0 0 r1 0 360 arc fill}if\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t0 r1 xmin abs r1 add neg r1 shp\n\t\t\t\t}\n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tr2 r1 gt{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t0 r1\n\t\t\t\t\t\tr1 neg r2 r1 sub div dx mul\t\n\t\t\t\t\t\t0\t\n\t\t\t\t\t\tshp\t\n\t\t\t\t\t}{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t0 r1 calcmaxs\t\n\t\t\t\t\t\tdup\n\t\t\t\t\t\t\n\t\t\t\t\t\tr2 add dx mul dx r1 r2 sub sub div\n\t\t\t\t\t\tneg\t\t\t\t\n\t\t\t\t\t\texch 1 index\t\n\t\t\t\t\t\tabs exch sub\n\t\t\t\t\t\tshp\n\t\t\t\t\t}ifelse\n\t\t\t\t} \n\t\t\t}sh3tp get exec\t\n\t\t}if\n\t}if\n\t\n\t/d0 0 store\n\t/r0 r1 store\n\t/di dx Nsteps div store\n\t/ri r2 r1 sub Nsteps div store \n\t/Function load \n\t0 1 Nsteps\n\t{\t\n\t\t1 index FunEval sc\n\t\td0 di add r0 ri add d0 r0 shp\n\t\t{\n\t\t\n\t\td0 0 r0 a1 a0 arc\n\t\td0 di add 0 r0 ri add a0 a1 arcn\n\t\tfill\n\t\t\n\t\t\n\t\td0 0 r0 a0 a1 arc\n\t\td0 di add 0 r0 ri add a1 a0 arcn\n\t\tfill\n\t\t}pop\n\t\t\n\t\t\n\t\t/d0 d0 di add store\n\t\t/r0 r0 ri add store\n\t}for\n\tpop\t\n\t\n\tcurrentdict/Extend known\n\t{\n\t\t/Extend load 1 get r2 0 gt and\t\n\t\t{\t\n\t\t\tNsteps/Function load FunEval sc\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{ \n\t\t\t\t{\n\t\t\t\t\tdx 0 r2 0 360 arc fill\n\t\t\t\t} \n\t\t\t\t{\n\t\t\t\t\tdx 0 r2 360 0 arcn\n\t\t\t\t\txmin ymin moveto\n\t\t\t\t\txmax ymin lineto\n\t\t\t\t\txmax ymax lineto\n\t\t\t\t\txmin ymax lineto\n\t\t\t\t\txmin ymin lineto\n\t\t\t\t\teofill\t\t\n\t\t\t\t} \n\t\t\t\t{\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\txmax abs r1 add r1 dx r1 shp\n\t\t\t\t}\t\n\t\t\t\t{\t\n\t\t\t\n\t\t\t\t\tr2 r1 gt{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tcalcmaxs dup\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tr1 add dx mul dx r2 r1 sub sub div\t\n\t\t\t\t\t\texch 1 index\t\n\t\t\t\t\t\texch sub\n\t\t\t\t\t\tdx r2\n\t\t\t\t\t\tshp\n\t\t\t\t\t}{\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tr1 neg r2 r1 sub div dx mul\t\n\t\t\t\t\t\t0\t\t\n\t\t\t\t\t\tdx \t\t\n\t\t\t\t\t\tr2\t\t\n\t\t\t\t\t\tshp\n\t\t\t\t\t}ifelse\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t\tsh3tp get exec\t\n\t\t}if\n\t}if\n}bd\n/sh\t\t\n{\t\n\tbegin\n\t\t/ShadingType load dup dup 2 eq exch 3 eq or\n\t\t{\t\n\t\t\tgsave\n\t\t\t\tnewpath\n\t\t\t\t/ColorSpace load scs\n\t\t\t\tcurrentdict/BBox known\n\t\t\t\t{\n\t\t\t\t\t/BBox load aload pop\t\n\t\t\t\t\t2 index sub\t\t\t\t\n\t\t\t\t\t3 index\t\t\t\t\t\n\t\t\t\t\t3 -1 roll exch sub \n\t\t\t\t\texch rectclip\n\t\t\t\t}if\n\t\t\t\t2 eq\n\t\t\t\t{sh2}{sh3}ifelse\n\t\t\tgrestore\n\t\t}{\n\t\t\t\n\t\t\tpop \n\t\t\t(DEBUG: shading type unimplemented\\n)print flush\n\t\t}ifelse\n\tend\n}bd\n{restore}if not dup{save exch}if\n\tL3?{\t\n\t\t/sh/shfill ld\n\t\t/csq/clipsave ld\n\t\t/csQ/cliprestore ld\n\t}if\n{restore}if\nend\nsetpacking\n%%EndFile\n%%EndProlog\n%%BeginSetup\n%%EndSetup\n%%Page: 1 1\n%%PageBoundingBox: 0 0 160 160\n%%BeginPageSetup\ncg_md begin\nbp\nsdmtx\n[ /CIEBasedABC 4 dict dup begin \n/WhitePoint [ 0.9505 1.0000 1.0891 ] def \n/DecodeABC [ \n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n\n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n\n{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse \n 1 index 1 index ge { exch pop } { pop } ifelse < \n0000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000001010101010101010101010101\n0101010101010101010101010101010101010101010101020202020202020202\n0202020202020202020202020202020202030303030303030303030303030303\n0303030303030304040404040404040404040404040404040404050505050505\n0505050505050505050506060606060606060606060606060607070707070707\n0707070707070708080808080808080808080808090909090909090909090909\n0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c\n0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010\n1010101010111111111111111112121212121212121313131313131313141414\n1414141414151515151515151616161616161616171717171717171818181818\n18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d\n1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223\n2323232323242424242425252525252526262626262727272727282828282829\n292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f\n2f2f303030303131313131323232323333333333343434343535353535363636\n36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e\n3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646\n4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f\n4f50505051515151525252535353535454545555555656565657575758585859\n59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263\n63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e\n6e6e6f6f6f707070717171727273737374747475757576767677777878787979\n797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585\n86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292\n9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f\na0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae\naeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd\nbdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc\ncdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd\ndddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee\neeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff\n> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling \n cvi 3 index exch get 4 -1 roll 3 -1 roll get\n dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind \n] def \n/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def \n/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def \nend ] /Cs1 exch/ColorSpace dr pop\n%%EndPageSetup\n0.60000002 i\n/Cs1 SC\n0.10588235 0.72549021 0.12156863 sc\nq\n0 44 m\n160 44 l\n160 15.003872 l\n160 6.7174625 153.27803 0 145.00154 0 c\n14.998466 0 l\n6.7150416 0 0 6.7065849 0 15.003872 c\n0 44 l\nh\n0 44 m\n160 44 l\n160 14 l\n0 14 l\n0 44 l\nh\n0 44 m\nW*\n0 0 160 160 rc\n-5 49 m\n165 49 l\n165 -5 l\n-5 -5 l\nh\nf\nQ\n0.23529412 0.23529412 0.23529412 sc\nq\n83 90 m\n83 160 l\n77 160 l\n77 14 l\n83 14 l\n83 84 l\n160 84 l\n160 90 l\n83 90 l\nh\n0 144.99352 m\n0 153.28137 6.7219648 160 14.998466 160 c\n145.00154 160 l\n153.28496 160 160 153.27509 160 144.99352 c\n160 14 l\n0 14 l\n0 144.99352 l\nh\n0 144.99352 m\nW*\n0 0 160 160 rc\n-5 165 m\n165 165 l\n165 9 l\n-5 9 l\nh\nf\nep\nend\n%%Trailer\n%%EOF\n",
"sha256": "f5afbd939a1675b5b1293cd642273d8b0b9555b906683970b5e7a34f802674fd"
},
".github/tools/external/.tmux/.logo/LICENSE": {
"mode": "100644",
"encoding": "utf-8",
"data": "Oh my tmux! logo copyright (c) 2024, Gregory Pakosz \n\nOriginal tmux logo copyright (c) 2015, Jason Long \nSee https://github.com/tmux/tmux/tree/master/logo\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n",
"sha256": "6ae92da1ac8fc251f218491c42048d258d50d57bc685beb871fb09adf0bcea3e"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/server.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/usr/bin/env python3\n\"\"\"\nSkill Seeker MCP Server - Compatibility Shim\n\nThis file provides backward compatibility by delegating to the new server_fastmcp.py implementation.\n\nFor new installations, use server_fastmcp.py directly:\n python -m skill_seekers.mcp.server_fastmcp\n\nThis shim will be deprecated in v3.0.0 (6+ months after v2.4.0 release).\n\"\"\"\n\nimport sys\nimport warnings\n\n# Show deprecation warning (can be disabled with PYTHONWARNINGS=ignore)\nwarnings.warn(\n \"The legacy server.py is deprecated and will be removed in v4.0.0. \"\n \"Please update your MCP configuration to use 'server_fastmcp' instead:\\n\"\n \" OLD: python -m skill_seekers.mcp.server\\n\"\n \" NEW: python -m skill_seekers.mcp.server_fastmcp\\n\"\n \"The new server provides the same functionality with improved performance.\",\n DeprecationWarning,\n stacklevel=2,\n)\n\n# Re-export tool functions for backward compatibility with tests\ntry:\n from skill_seekers.mcp.tools.config_tools import (\n generate_config as generate_config_tool,\n )\n from skill_seekers.mcp.tools.config_tools import (\n list_configs as list_configs_tool,\n )\n from skill_seekers.mcp.tools.config_tools import (\n validate_config as validate_config_tool,\n )\n from skill_seekers.mcp.tools.packaging_tools import (\n install_skill_tool,\n package_skill_tool,\n upload_skill_tool,\n )\n from skill_seekers.mcp.tools.scraping_tools import (\n detect_patterns_tool,\n estimate_pages_tool,\n extract_config_patterns_tool,\n scrape_docs_tool,\n scrape_github_tool,\n scrape_pdf_tool,\n )\n from skill_seekers.mcp.tools.source_tools import (\n add_config_source_tool,\n fetch_config_tool,\n list_config_sources_tool,\n remove_config_source_tool,\n submit_config_tool,\n )\n from skill_seekers.mcp.tools.splitting_tools import (\n generate_router as generate_router_tool,\n )\n from skill_seekers.mcp.tools.splitting_tools import (\n split_config as split_config_tool,\n )\n\n # For test compatibility - create call_tool router function\n async def call_tool(name: str, arguments: dict):\n \"\"\"Route tool calls to appropriate handlers (backward compatibility).\"\"\"\n from mcp.types import TextContent\n\n try:\n if name == \"generate_config\":\n return await generate_config_tool(arguments)\n elif name == \"estimate_pages\":\n return await estimate_pages_tool(arguments)\n elif name == \"scrape_docs\":\n return await scrape_docs_tool(arguments)\n elif name == \"package_skill\":\n return await package_skill_tool(arguments)\n elif name == \"upload_skill\":\n return await upload_skill_tool(arguments)\n elif name == \"list_configs\":\n return await list_configs_tool(arguments)\n elif name == \"validate_config\":\n return await validate_config_tool(arguments)\n elif name == \"split_config\":\n return await split_config_tool(arguments)\n elif name == \"generate_router\":\n return await generate_router_tool(arguments)\n elif name == \"scrape_pdf\":\n return await scrape_pdf_tool(arguments)\n elif name == \"scrape_github\":\n return await scrape_github_tool(arguments)\n elif name == \"fetch_config\":\n return await fetch_config_tool(arguments)\n elif name == \"submit_config\":\n return await submit_config_tool(arguments)\n elif name == \"add_config_source\":\n return await add_config_source_tool(arguments)\n elif name == \"list_config_sources\":\n return await list_config_sources_tool(arguments)\n elif name == \"remove_config_source\":\n return await remove_config_source_tool(arguments)\n elif name == \"install_skill\":\n return await install_skill_tool(arguments)\n elif name == \"detect_patterns\":\n return await detect_patterns_tool(arguments)\n elif name == \"extract_config_patterns\":\n return await extract_config_patterns_tool(arguments)\n else:\n return [TextContent(type=\"text\", text=f\"Unknown tool: {name}\")]\n except Exception as e:\n return [TextContent(type=\"text\", text=f\"Error: {str(e)}\")]\n\n # For test compatibility - create a mock list_tools function\n async def list_tools():\n \"\"\"Mock list_tools for backward compatibility with tests.\"\"\"\n from mcp.types import Tool\n\n tools = [\n Tool(\n name=\"generate_config\",\n description=\"Generate config file\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"list_configs\",\n description=\"List available configs\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"validate_config\",\n description=\"Validate config file\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"estimate_pages\",\n description=\"Estimate page count\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"scrape_docs\",\n description=\"Scrape documentation\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"scrape_github\",\n description=\"Scrape GitHub repository\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"scrape_pdf\",\n description=\"Scrape PDF file\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"package_skill\",\n description=\"Package skill into .zip\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"upload_skill\",\n description=\"Upload skill to Claude\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"install_skill\",\n description=\"Install skill\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"split_config\",\n description=\"Split large config\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"generate_router\",\n description=\"Generate router skill\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"fetch_config\",\n description=\"Fetch config from source\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"submit_config\",\n description=\"Submit config to community\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"add_config_source\",\n description=\"Add config source\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"list_config_sources\",\n description=\"List config sources\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"remove_config_source\",\n description=\"Remove config source\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n Tool(\n name=\"extract_config_patterns\",\n description=\"Extract configuration patterns from config files\",\n inputSchema={\"type\": \"object\", \"properties\": {}},\n ),\n ]\n return tools\n\nexcept ImportError:\n # If imports fail, provide empty stubs\n pass\n\n# Delegate to the new FastMCP implementation\nif __name__ == \"__main__\":\n try:\n from skill_seekers.mcp import server_fastmcp\n\n # Run the new server\n server_fastmcp.main()\n except ImportError as e:\n print(f\"❌ Error: Could not import server_fastmcp: {e}\", file=sys.stderr)\n print(\"Ensure the package is installed correctly:\", file=sys.stderr)\n print(\" pip install -e .\", file=sys.stderr)\n sys.exit(1)\n except Exception as e:\n print(f\"❌ Error running server: {e}\", file=sys.stderr)\n sys.exit(1)\n",
"sha256": "cc6c4f24e5b91ab158f2bfbc4ebb27a38ce84d2937473dd85a6c2d035fc3b851"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/server_fastmcp.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "#!/usr/bin/env python3\n\"\"\"\nSkill Seeker MCP Server (FastMCP Implementation)\n\nModern, decorator-based MCP server using FastMCP for simplified tool registration.\nProvides 34 tools for generating LLM skills from documentation.\n\nThis is a streamlined alternative to server.py (2200 lines → 708 lines, 68% reduction).\nAll tool implementations are delegated to modular tool files in tools/ directory.\n\n**Architecture:**\n- FastMCP server with decorator-based tool registration\n- 34 tools organized into 7 categories:\n * Config tools (3): generate_config, list_configs, validate_config\n * Scraping tools (11): estimate_pages, scrape_docs, scrape_github, scrape_pdf, scrape_video, scrape_codebase, detect_patterns, extract_test_examples, build_how_to_guides, extract_config_patterns, scrape_generic\n * Packaging tools (4): package_skill, upload_skill, enhance_skill, install_skill\n * Splitting tools (2): split_config, generate_router\n * Source tools (6): fetch_config, submit_config, push_config, add_config_source, list_config_sources, remove_config_source\n * Marketplace tools (4): add_marketplace, list_marketplaces, remove_marketplace, publish_to_marketplace\n * Vector Database tools (4): export_to_weaviate, export_to_chroma, export_to_faiss, export_to_qdrant\n * Workflow tools (5): list_workflows, get_workflow, create_workflow, update_workflow, delete_workflow\n\n**Usage:**\n # Stdio transport (default, backward compatible)\n python -m skill_seekers.mcp.server_fastmcp\n\n # HTTP transport (new)\n python -m skill_seekers.mcp.server_fastmcp --http\n python -m skill_seekers.mcp.server_fastmcp --http --port 8080\n\n**MCP Integration:**\n Stdio (default):\n {\n \"mcpServers\": {\n \"skill-seeker\": {\n \"command\": \"python\",\n \"args\": [\"-m\", \"skill_seekers.mcp.server_fastmcp\"]\n }\n }\n }\n\n HTTP (alternative):\n {\n \"mcpServers\": {\n \"skill-seeker\": {\n \"url\": \"http://localhost:8000/sse\"\n }\n }\n }\n\"\"\"\n\nimport argparse\nimport logging\nimport sys\n\n# Import FastMCP\nMCP_AVAILABLE = False\nFastMCP = None\n\ntry:\n from mcp.server import FastMCP\n\n MCP_AVAILABLE = True\nexcept ImportError as e:\n # Only exit if running as main module, not when importing for tests\n if __name__ == \"__main__\":\n print(\"❌ Error: mcp package not installed\")\n print(\"Install with: pip install mcp\")\n print(f\"Import error: {e}\")\n sys.exit(1)\n\n# Import all tool implementations\ntry:\n from .tools import (\n add_config_source_impl,\n build_how_to_guides_impl,\n detect_patterns_impl,\n enhance_skill_impl,\n # Scraping tools\n estimate_pages_impl,\n # Vector database tools\n export_to_chroma_impl,\n export_to_faiss_impl,\n export_to_qdrant_impl,\n export_to_weaviate_impl,\n extract_config_patterns_impl,\n extract_test_examples_impl,\n # Source tools\n fetch_config_impl,\n # Marketplace tools\n add_marketplace_impl,\n list_marketplaces_impl,\n remove_marketplace_impl,\n publish_to_marketplace_impl,\n # Config tools\n generate_config_impl,\n generate_router_impl,\n install_skill_impl,\n list_config_sources_impl,\n list_configs_impl,\n # Packaging tools\n package_skill_impl,\n remove_config_source_impl,\n scrape_codebase_impl,\n scrape_docs_impl,\n scrape_generic_impl,\n scrape_github_impl,\n scrape_pdf_impl,\n scrape_video_impl,\n # Splitting tools\n split_config_impl,\n submit_config_impl,\n # Sync config tools\n sync_config_impl,\n upload_skill_impl,\n validate_config_impl,\n # Workflow tools\n list_workflows_impl,\n get_workflow_impl,\n create_workflow_impl,\n update_workflow_impl,\n delete_workflow_impl,\n )\nexcept ImportError:\n # Fallback for direct script execution\n import os\n\n sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))\n from tools import (\n add_config_source_impl,\n build_how_to_guides_impl,\n detect_patterns_impl,\n enhance_skill_impl,\n estimate_pages_impl,\n export_to_chroma_impl,\n export_to_faiss_impl,\n export_to_qdrant_impl,\n export_to_weaviate_impl,\n extract_config_patterns_impl,\n extract_test_examples_impl,\n fetch_config_impl,\n add_marketplace_impl,\n list_marketplaces_impl,\n remove_marketplace_impl,\n publish_to_marketplace_impl,\n generate_config_impl,\n generate_router_impl,\n install_skill_impl,\n list_config_sources_impl,\n list_configs_impl,\n package_skill_impl,\n remove_config_source_impl,\n scrape_codebase_impl,\n scrape_docs_impl,\n scrape_generic_impl,\n scrape_github_impl,\n scrape_pdf_impl,\n scrape_video_impl,\n split_config_impl,\n submit_config_impl,\n sync_config_impl,\n upload_skill_impl,\n validate_config_impl,\n list_workflows_impl,\n get_workflow_impl,\n create_workflow_impl,\n update_workflow_impl,\n delete_workflow_impl,\n )\n\n# Initialize FastMCP server\nmcp = None\nif MCP_AVAILABLE and FastMCP is not None:\n mcp = FastMCP(\n name=\"skill-seeker\",\n instructions=\"Skill Seeker MCP Server - Generate LLM skills from documentation\",\n )\n\n\n# Helper decorator for tests (when MCP is not available)\ndef safe_tool_decorator(*args, **kwargs):\n \"\"\"Decorator that works when mcp is None (for testing)\"\"\"\n if mcp is not None:\n return mcp.tool(*args, **kwargs)\n else:\n # Return a pass-through decorator for testing\n def wrapper(func):\n return func\n\n return wrapper\n\n\n# ============================================================================\n# CONFIG TOOLS (3 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Generate a config file for documentation scraping. Interactively creates a JSON config for any documentation website.\"\n)\nasync def generate_config(\n name: str,\n url: str,\n description: str,\n max_pages: int = 100,\n unlimited: bool = False,\n rate_limit: float = 0.5,\n) -> str:\n \"\"\"\n Generate a config file for documentation scraping.\n\n Args:\n name: Skill name (lowercase, alphanumeric, hyphens, underscores)\n url: Base documentation URL (must include http:// or https://)\n description: Description of when to use this skill\n max_pages: Maximum pages to scrape (default: 100, use -1 for unlimited)\n unlimited: Remove all limits - scrape all pages (default: false). Overrides max_pages.\n rate_limit: Delay between requests in seconds (default: 0.5)\n\n Returns:\n Success message with config path and next steps, or error message.\n \"\"\"\n args = {\n \"name\": name,\n \"url\": url,\n \"description\": description,\n \"max_pages\": max_pages,\n \"unlimited\": unlimited,\n \"rate_limit\": rate_limit,\n }\n result = await generate_config_impl(args)\n # Extract text from TextContent objects\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(description=\"List all available preset configurations.\")\nasync def list_configs() -> str:\n \"\"\"\n List all available preset configurations.\n\n Returns:\n List of available configs with categories and descriptions.\n \"\"\"\n result = await list_configs_impl({})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(description=\"Validate a config file for errors.\")\nasync def validate_config(config_path: str) -> str:\n \"\"\"\n Validate a config file for errors.\n\n Args:\n config_path: Path to config JSON file\n\n Returns:\n Validation result with any errors or success message.\n \"\"\"\n result = await validate_config_impl({\"config_path\": config_path})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# SYNC CONFIG TOOLS (1 tool)\n# ============================================================================\n\n\n@safe_tool_decorator(description=\"Sync a config's start_urls against what's live on the docs site.\")\nasync def sync_config(\n config_path: str,\n apply: bool = False,\n depth: int = 2,\n max_pages: int = 500,\n rate_limit: float | None = None,\n source_index: int = 0,\n) -> str:\n \"\"\"\n Sync a config file's start_urls against the live docs site.\n\n Crawls seed/nav pages, discovers internal links, and diffs against the\n config's existing start_urls. Optionally writes the update with apply=True.\n\n Args:\n config_path: Path to the config JSON file.\n apply: Write changes back to the config file (default: False).\n depth: BFS crawl depth from seed pages (default: 2).\n max_pages: Maximum URLs to discover (default: 500).\n rate_limit: Override config rate limit (seconds between requests).\n source_index: Index of the documentation source to sync (default: 0).\n\n Returns:\n Report of added/removed URLs.\n \"\"\"\n result = await sync_config_impl(\n {\n \"config_path\": config_path,\n \"apply\": apply,\n \"depth\": depth,\n \"max_pages\": max_pages,\n \"rate_limit\": rate_limit,\n \"source_index\": source_index,\n }\n )\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# SCRAPING TOOLS (11 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Estimate how many pages will be scraped from a config. Fast preview without downloading content.\"\n)\nasync def estimate_pages(\n config_path: str,\n max_discovery: int = 1000,\n unlimited: bool = False,\n) -> str:\n \"\"\"\n Estimate how many pages will be scraped from a config.\n\n Args:\n config_path: Path to config JSON file (e.g., configs/react.json)\n max_discovery: Maximum pages to discover during estimation (default: 1000, use -1 for unlimited)\n unlimited: Remove discovery limit - estimate all pages (default: false). Overrides max_discovery.\n\n Returns:\n Estimation results with page count and recommendations.\n \"\"\"\n args = {\n \"config_path\": config_path,\n \"max_discovery\": max_discovery,\n \"unlimited\": unlimited,\n }\n result = await estimate_pages_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Scrape documentation and build LLM skill. Supports both single-source (legacy) and unified multi-source configs. Creates SKILL.md and reference files. Automatically detects llms.txt files for 10x faster processing. Falls back to HTML scraping if not available.\"\n)\nasync def scrape_docs(\n config_path: str,\n unlimited: bool = False,\n enhance_local: bool = False,\n skip_scrape: bool = False,\n dry_run: bool = False,\n merge_mode: str | None = None,\n) -> str:\n \"\"\"\n Scrape documentation and build LLM skill.\n\n Args:\n config_path: Path to config JSON file (e.g., configs/react.json or configs/godot_unified.json)\n unlimited: Remove page limit - scrape all pages (default: false). Overrides max_pages in config.\n enhance_local: Open terminal for local enhancement with AI coding agent (default: false)\n skip_scrape: Skip scraping, use cached data (default: false)\n dry_run: Preview what will be scraped without saving (default: false)\n merge_mode: Override merge mode for unified configs: 'rule-based' or 'claude-enhanced' (default: from config)\n\n Returns:\n Scraping results with file paths and statistics.\n \"\"\"\n args = {\n \"config_path\": config_path,\n \"unlimited\": unlimited,\n \"enhance_local\": enhance_local,\n \"skip_scrape\": skip_scrape,\n \"dry_run\": dry_run,\n }\n if merge_mode:\n args[\"merge_mode\"] = merge_mode\n result = await scrape_docs_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Scrape GitHub repository and build Claude skill. Extracts README, Issues, Changelog, Releases, and code structure.\"\n)\nasync def scrape_github(\n repo: str | None = None,\n config_path: str | None = None,\n name: str | None = None,\n description: str | None = None,\n token: str | None = None,\n no_issues: bool = False,\n no_changelog: bool = False,\n no_releases: bool = False,\n max_issues: int = 100,\n scrape_only: bool = False,\n) -> str:\n \"\"\"\n Scrape GitHub repository and build Claude skill.\n\n Args:\n repo: GitHub repository (owner/repo, e.g., facebook/react)\n config_path: Path to GitHub config JSON file (e.g., configs/react_github.json)\n name: Skill name (default: repo name)\n description: Skill description\n token: GitHub personal access token (or use GITHUB_TOKEN env var)\n no_issues: Skip GitHub issues extraction (default: false)\n no_changelog: Skip CHANGELOG extraction (default: false)\n no_releases: Skip releases extraction (default: false)\n max_issues: Maximum issues to fetch (default: 100)\n scrape_only: Only scrape, don't build skill (default: false)\n\n Returns:\n GitHub scraping results with file paths.\n \"\"\"\n args = {}\n if repo:\n args[\"repo\"] = repo\n if config_path:\n args[\"config_path\"] = config_path\n if name:\n args[\"name\"] = name\n if description:\n args[\"description\"] = description\n if token:\n args[\"token\"] = token\n args[\"no_issues\"] = no_issues\n args[\"no_changelog\"] = no_changelog\n args[\"no_releases\"] = no_releases\n args[\"max_issues\"] = max_issues\n args[\"scrape_only\"] = scrape_only\n\n result = await scrape_github_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Scrape PDF documentation and build Claude skill. Extracts text, code, and images from PDF files.\"\n)\nasync def scrape_pdf(\n config_path: str | None = None,\n pdf_path: str | None = None,\n name: str | None = None,\n description: str | None = None,\n from_json: str | None = None,\n) -> str:\n \"\"\"\n Scrape PDF documentation and build Claude skill.\n\n Args:\n config_path: Path to PDF config JSON file (e.g., configs/manual_pdf.json)\n pdf_path: Direct PDF path (alternative to config_path)\n name: Skill name (required with pdf_path)\n description: Skill description (optional)\n from_json: Build from extracted JSON file (e.g., output/manual_extracted.json)\n\n Returns:\n PDF scraping results with file paths.\n \"\"\"\n args = {}\n if config_path:\n args[\"config_path\"] = config_path\n if pdf_path:\n args[\"pdf_path\"] = pdf_path\n if name:\n args[\"name\"] = name\n if description:\n args[\"description\"] = description\n if from_json:\n args[\"from_json\"] = from_json\n\n result = await scrape_pdf_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Extract transcripts and metadata from videos (YouTube, Vimeo, local files) and build Claude skill.\"\n)\nasync def scrape_video(\n url: str | None = None,\n video_file: str | None = None,\n playlist: str | None = None,\n name: str | None = None,\n description: str | None = None,\n languages: str | None = None,\n from_json: str | None = None,\n visual: bool = False,\n whisper_model: str | None = None,\n visual_interval: float | None = None,\n visual_min_gap: float | None = None,\n visual_similarity: float | None = None,\n vision_ocr: bool = False,\n start_time: str | None = None,\n end_time: str | None = None,\n setup: bool = False,\n) -> str:\n \"\"\"\n Scrape video content and build Claude skill.\n\n Args:\n url: Video URL (YouTube, Vimeo)\n video_file: Local video file path\n playlist: Playlist URL\n name: Skill name\n description: Skill description\n languages: Transcript language preferences (comma-separated)\n from_json: Build from extracted JSON file\n visual: Enable visual frame extraction (requires video-full extras)\n whisper_model: Whisper model size for local transcription (e.g., base, small, medium, large)\n visual_interval: Seconds between frame captures (default: 5.0)\n visual_min_gap: Minimum seconds between kept frames (default: 2.0)\n visual_similarity: Similarity threshold to skip duplicate frames 0.0-1.0 (default: 0.95)\n vision_ocr: Use vision model for OCR on extracted frames\n start_time: Start time for extraction (seconds, MM:SS, or HH:MM:SS). Single video only.\n end_time: End time for extraction (seconds, MM:SS, or HH:MM:SS). Single video only.\n setup: Auto-detect GPU and install visual extraction deps (PyTorch, easyocr, etc.)\n\n Returns:\n Video scraping results with file paths.\n \"\"\"\n if setup:\n from skill_seekers.cli.video_setup import run_setup\n\n rc = run_setup(interactive=False)\n return \"Setup completed successfully.\" if rc == 0 else \"Setup failed. Check logs.\"\n\n args = {}\n if url:\n args[\"url\"] = url\n if video_file:\n args[\"video_file\"] = video_file\n if playlist:\n args[\"playlist\"] = playlist\n if name:\n args[\"name\"] = name\n if description:\n args[\"description\"] = description\n if languages:\n args[\"languages\"] = languages\n if from_json:\n args[\"from_json\"] = from_json\n if start_time:\n args[\"start_time\"] = start_time\n if end_time:\n args[\"end_time\"] = end_time\n if visual:\n args[\"visual\"] = visual\n if whisper_model:\n args[\"whisper_model\"] = whisper_model\n if visual_interval is not None:\n args[\"visual_interval\"] = visual_interval\n if visual_min_gap is not None:\n args[\"visual_min_gap\"] = visual_min_gap\n if visual_similarity is not None:\n args[\"visual_similarity\"] = visual_similarity\n if vision_ocr:\n args[\"vision_ocr\"] = vision_ocr\n\n result = await scrape_video_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Analyze local codebase and extract code knowledge. Walks directory tree, analyzes code files, extracts signatures, docstrings, and optionally generates API reference documentation and dependency graphs.\"\n)\nasync def scrape_codebase(\n directory: str,\n output: str = \"output/codebase/\",\n depth: str = \"deep\",\n languages: str = \"\",\n file_patterns: str = \"\",\n build_api_reference: bool = False,\n build_dependency_graph: bool = False,\n) -> str:\n \"\"\"\n Analyze local codebase and extract code knowledge.\n\n Args:\n directory: Directory to analyze (required)\n output: Output directory for results (default: output/codebase/)\n depth: Analysis depth - surface, deep, full (default: deep)\n languages: Comma-separated languages to analyze (e.g., \"Python,JavaScript,C++\")\n file_patterns: Comma-separated file patterns (e.g., \"*.py,src/**/*.js\")\n build_api_reference: Generate API reference markdown (default: false)\n build_dependency_graph: Generate dependency graph and detect circular dependencies (default: false)\n\n Returns:\n Codebase analysis results with file paths.\n \"\"\"\n args = {\n \"directory\": directory,\n \"output\": output,\n \"depth\": depth,\n \"languages\": languages,\n \"file_patterns\": file_patterns,\n \"build_api_reference\": build_api_reference,\n \"build_dependency_graph\": build_dependency_graph,\n }\n\n result = await scrape_codebase_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Detect design patterns in source code (Singleton, Factory, Observer, Strategy, Decorator, Builder, Adapter, Command, Template Method, Chain of Responsibility). Supports 9 languages: Python, JavaScript, TypeScript, C++, C, C#, Go, Rust, Java, Ruby, PHP.\"\n)\nasync def detect_patterns(\n file: str = \"\",\n directory: str = \"\",\n output: str = \"\",\n depth: str = \"deep\",\n json: bool = False,\n) -> str:\n \"\"\"\n Detect design patterns in source code.\n\n Analyzes source files or directories to identify common design patterns.\n Provides confidence scores and evidence for each detected pattern.\n\n Args:\n file: Single file to analyze (optional)\n directory: Directory to analyze all source files (optional)\n output: Output directory for JSON results (optional)\n depth: Detection depth - surface (fast), deep (balanced), full (thorough). Default: deep\n json: Output JSON format instead of human-readable (default: false)\n\n Returns:\n Pattern detection results with confidence scores and evidence.\n\n Example:\n detect_patterns(file=\"src/database.py\", depth=\"deep\")\n detect_patterns(directory=\"src/\", output=\"patterns/\", json=true)\n \"\"\"\n args = {\n \"file\": file,\n \"directory\": directory,\n \"output\": output,\n \"depth\": depth,\n \"json\": json,\n }\n\n result = await detect_patterns_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Extract usage examples from test files. Analyzes test files to extract real API usage patterns including instantiation, method calls, configs, setup patterns, and workflows. Supports 9 languages (Python AST-based, others regex-based).\"\n)\nasync def extract_test_examples(\n file: str = \"\",\n directory: str = \"\",\n language: str = \"\",\n min_confidence: float = 0.5,\n max_per_file: int = 10,\n json: bool = False,\n markdown: bool = False,\n) -> str:\n \"\"\"\n Extract usage examples from test files.\n\n Analyzes test files to extract real API usage patterns including:\n - Object instantiation with real parameters\n - Method calls with expected behaviors\n - Configuration examples\n - Setup patterns from fixtures/setUp()\n - Multi-step workflows from integration tests\n\n Supports 9 languages: Python (AST-based), JavaScript, TypeScript, Go, Rust, Java, C#, PHP, Ruby.\n\n Args:\n file: Single test file to analyze (optional)\n directory: Directory containing test files (optional)\n language: Filter by language (python, javascript, etc.)\n min_confidence: Minimum confidence threshold 0.0-1.0 (default: 0.5)\n max_per_file: Maximum examples per file (default: 10)\n json: Output JSON format (default: false)\n markdown: Output Markdown format (default: false)\n\n Examples:\n extract_test_examples(directory=\"tests/\", language=\"python\")\n extract_test_examples(file=\"tests/test_scraper.py\", json=true)\n \"\"\"\n args = {\n \"file\": file,\n \"directory\": directory,\n \"language\": language,\n \"min_confidence\": min_confidence,\n \"max_per_file\": max_per_file,\n \"json\": json,\n \"markdown\": markdown,\n }\n\n result = await extract_test_examples_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Build how-to guides from workflow test examples. Transforms workflow examples extracted from test files into step-by-step educational guides with prerequisites, verification points, and troubleshooting tips.\"\n)\nasync def build_how_to_guides(\n input: str,\n output: str = \"output/codebase/tutorials\",\n group_by: str = \"ai-tutorial-group\",\n no_ai: bool = False,\n json_output: bool = False,\n) -> str:\n \"\"\"\n Build how-to guides from workflow test examples.\n\n Transforms workflow examples extracted from test files into step-by-step\n educational guides. Automatically groups related workflows, extracts steps,\n and generates comprehensive markdown guides.\n\n Features:\n - Python AST-based step extraction (heuristic for other languages)\n - 4 grouping strategies: ai-tutorial-group, file-path, test-name, complexity\n - Detects prerequisites, setup code, and verification points\n - Generates troubleshooting tips and next steps\n\n Args:\n input: Path to test_examples.json from extract_test_examples\n output: Output directory for guides (default: output/codebase/tutorials)\n group_by: Grouping strategy - ai-tutorial-group, file-path, test-name, complexity (default: ai-tutorial-group)\n no_ai: Disable AI enhancement for grouping (default: false)\n json_output: Output JSON format alongside markdown (default: false)\n\n Examples:\n build_how_to_guides(input=\"output/codebase/test_examples/test_examples.json\")\n build_how_to_guides(input=\"examples.json\", group_by=\"file-path\", no_ai=true)\n \"\"\"\n args = {\n \"input\": input,\n \"output\": output,\n \"group_by\": group_by,\n \"no_ai\": no_ai,\n \"json_output\": json_output,\n }\n\n result = await build_how_to_guides_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Extract configuration patterns from config files (C3.4) with optional AI enhancement. Analyzes config files, detects patterns (database, API, logging, etc.), generates documentation, and optionally enhances with AI insights (security analysis, best practices, migration suggestions). Supports 9 formats.\"\n)\nasync def extract_config_patterns(\n directory: str,\n output: str = \"output/codebase/config_patterns\",\n max_files: int = 100,\n enhance: bool = False,\n enhance_local: bool = False,\n ai_mode: str = \"none\",\n json: bool = True,\n markdown: bool = True,\n) -> str:\n \"\"\"\n Extract configuration patterns from config files with optional AI enhancement.\n\n Analyzes configuration files in the codebase to extract settings,\n detect common patterns, and generate comprehensive documentation.\n\n **AI Enhancement (NEW)**: Optional AI-powered insights including:\n - Explanations of what each config does\n - Best practice suggestions\n - Security analysis (hardcoded secrets, exposed credentials)\n - Migration suggestions (consolidation opportunities)\n - Context-aware documentation\n\n Supports 9 config formats: JSON, YAML, TOML, ENV, INI, Python modules,\n JavaScript/TypeScript configs, Dockerfile, Docker Compose.\n\n Detects 7 common patterns:\n - Database configuration (host, port, credentials)\n - API configuration (endpoints, keys, timeouts)\n - Logging configuration (level, format, handlers)\n - Cache configuration (backend, TTL, keys)\n - Email configuration (SMTP, credentials)\n - Authentication configuration (providers, secrets)\n - Server configuration (host, port, workers)\n\n Args:\n directory: Directory to analyze (required)\n output: Output directory for results (default: output/codebase/config_patterns)\n max_files: Maximum config files to process (default: 100)\n enhance: Enable AI enhancement - API mode (default: false, requires ANTHROPIC_API_KEY)\n enhance_local: Enable AI enhancement - LOCAL mode (default: false, uses Claude Code CLI)\n ai_mode: AI enhancement mode - auto, api, local, none (default: none)\n json: Output JSON format (default: true)\n markdown: Output Markdown format (default: true)\n\n Returns:\n Config extraction results with patterns, settings, and optional AI insights.\n\n Examples:\n extract_config_patterns(directory=\".\")\n extract_config_patterns(directory=\"/path/to/repo\", max_files=50)\n extract_config_patterns(directory=\".\", enhance_local=true) # With AI enhancement (LOCAL mode)\n extract_config_patterns(directory=\".\", ai_mode=\"api\") # With AI enhancement (API mode)\n \"\"\"\n args = {\n \"directory\": directory,\n \"output\": output,\n \"max_files\": max_files,\n \"enhance\": enhance,\n \"enhance_local\": enhance_local,\n \"ai_mode\": ai_mode,\n \"json\": json,\n \"markdown\": markdown,\n }\n\n result = await extract_config_patterns_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Scrape content from new source types: jupyter, html, openapi, asciidoc, pptx, confluence, notion, rss, manpage, chat. A generic entry point that delegates to the appropriate CLI scraper module.\"\n)\nasync def scrape_generic(\n source_type: str,\n name: str,\n path: str | None = None,\n url: str | None = None,\n) -> str:\n \"\"\"\n Scrape content from various source types and build a skill.\n\n A generic scraper that supports 10 new source types. It delegates to the\n corresponding CLI scraper module (e.g., skill_seekers.cli.jupyter_scraper).\n\n File-based types (jupyter, html, openapi, asciidoc, pptx, manpage, chat)\n typically use the 'path' parameter. URL-based types (confluence, notion, rss)\n typically use the 'url' parameter.\n\n Args:\n source_type: Source type to scrape. One of: jupyter, html, openapi,\n asciidoc, pptx, confluence, notion, rss, manpage, chat.\n name: Skill name for the output\n path: File or directory path (for file-based sources like jupyter, html, pptx)\n url: URL (for URL-based sources like confluence, notion, rss)\n\n Returns:\n Scraping results with file paths and statistics.\n \"\"\"\n args = {\n \"source_type\": source_type,\n \"name\": name,\n }\n if path:\n args[\"path\"] = path\n if url:\n args[\"url\"] = url\n\n result = await scrape_generic_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# PACKAGING TOOLS (4 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Package skill directory into platform-specific format (ZIP for Claude/OpenAI/Markdown, tar.gz for Gemini). Supports all platforms: claude, gemini, openai, markdown. Automatically uploads if platform API key is set.\"\n)\nasync def package_skill(\n skill_dir: str,\n target: str = \"auto\",\n auto_upload: bool = True,\n) -> str:\n \"\"\"\n Package skill directory for target LLM platform.\n\n Args:\n skill_dir: Path to skill directory to package (e.g., output/react/)\n target: Target platform (default: 'auto'). Options: auto, claude, gemini, openai, markdown\n auto_upload: Auto-upload after packaging if API key is available (default: true). Requires platform-specific API key: ANTHROPIC_API_KEY, GOOGLE_API_KEY, or OPENAI_API_KEY.\n\n Returns:\n Packaging results with file path and platform info.\n \"\"\"\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n args = {\n \"skill_dir\": skill_dir,\n \"target\": target,\n \"auto_upload\": auto_upload,\n }\n result = await package_skill_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Upload skill package to target LLM platform API. Requires platform-specific API key. Supports: claude (Anthropic Skills API), gemini (Google Files API), openai (Assistants API). Does NOT support markdown.\"\n)\nasync def upload_skill(\n skill_zip: str,\n target: str = \"auto\",\n api_key: str | None = None,\n) -> str:\n \"\"\"\n Upload skill package to target platform.\n\n Args:\n skill_zip: Path to skill package (.zip or .tar.gz, e.g., output/react.zip)\n target: Target platform (default: 'auto'). Options: auto, claude, gemini, openai\n api_key: Optional API key (uses env var if not provided: ANTHROPIC_API_KEY, GOOGLE_API_KEY, or OPENAI_API_KEY)\n\n Returns:\n Upload results with skill ID and platform URL.\n \"\"\"\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n args = {\n \"skill_zip\": skill_zip,\n \"target\": target,\n }\n if api_key:\n args[\"api_key\"] = api_key\n\n result = await upload_skill_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Enhance SKILL.md with AI using target platform's model. Local mode uses AI coding agent (no API key). API mode uses platform API (requires key). Transforms basic templates into comprehensive 500+ line guides with examples.\"\n)\nasync def enhance_skill(\n skill_dir: str,\n target: str = \"auto\",\n mode: str = \"local\",\n api_key: str | None = None,\n) -> str:\n \"\"\"\n Enhance SKILL.md with AI.\n\n Args:\n skill_dir: Path to skill directory containing SKILL.md (e.g., output/react/)\n target: Target platform (default: 'auto'). Options: auto, claude, gemini, openai\n mode: Enhancement mode (default: 'local'). Options: local (AI coding agent, no API), api (uses platform API)\n api_key: Optional API key for 'api' mode (uses env var if not provided: ANTHROPIC_API_KEY, GOOGLE_API_KEY, or OPENAI_API_KEY)\n\n Returns:\n Enhancement results with backup location.\n \"\"\"\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n args = {\n \"skill_dir\": skill_dir,\n \"target\": target,\n \"mode\": mode,\n }\n if api_key:\n args[\"api_key\"] = api_key\n\n result = await enhance_skill_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Complete one-command workflow: fetch config → scrape docs → AI enhance (MANDATORY) → package → upload. Enhancement required for quality (3/10→9/10). Takes 20-45 min depending on config size. Supports multiple LLM platforms: auto (detects from environment), claude, gemini, openai, markdown. Auto-uploads if platform API key is set.\"\n)\nasync def install_skill(\n config_name: str | None = None,\n config_path: str | None = None,\n destination: str = \"output\",\n auto_upload: bool = True,\n unlimited: bool = False,\n dry_run: bool = False,\n target: str = \"auto\",\n) -> str:\n \"\"\"\n Complete one-command workflow to install a skill.\n\n Args:\n config_name: Config name from API (e.g., 'react', 'django'). Mutually exclusive with config_path. Tool will fetch this config from the official API before scraping.\n config_path: Path to existing config JSON file (e.g., 'configs/custom.json'). Mutually exclusive with config_name. Use this if you already have a config file.\n destination: Output directory for skill files (default: 'output')\n auto_upload: Auto-upload after packaging (requires platform API key). Default: true. Set to false to skip upload.\n unlimited: Remove page limits during scraping (default: false). WARNING: Can take hours for large sites.\n dry_run: Preview workflow without executing (default: false). Shows all phases that would run.\n target: Target LLM platform (default: 'auto'). Options: auto, claude, gemini, openai, markdown. Requires corresponding API key: ANTHROPIC_API_KEY, GOOGLE_API_KEY, or OPENAI_API_KEY.\n\n Returns:\n Workflow results with all phase statuses.\n \"\"\"\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n args = {\n \"destination\": destination,\n \"auto_upload\": auto_upload,\n \"unlimited\": unlimited,\n \"dry_run\": dry_run,\n \"target\": target,\n }\n if config_name:\n args[\"config_name\"] = config_name\n if config_path:\n args[\"config_path\"] = config_path\n\n result = await install_skill_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# SPLITTING TOOLS (2 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Split large configs into multiple focused skills. Supports documentation (10K+ pages) and unified multi-source configs. Auto-detects config type and recommends best strategy.\"\n)\nasync def split_config(\n config_path: str,\n strategy: str = \"auto\",\n target_pages: int = 5000,\n dry_run: bool = False,\n) -> str:\n \"\"\"\n Split large configs into multiple skills.\n\n Supports:\n - Documentation configs: Split by categories, size, or create router skills\n - Unified configs: Split by source type (documentation, github, pdf)\n\n Args:\n config_path: Path to config JSON file (e.g., configs/godot.json or configs/react_unified.json)\n strategy: Split strategy: auto, none, source, category, router, size (default: auto). 'source' is for unified configs.\n target_pages: Target pages per skill for doc configs (default: 5000)\n dry_run: Preview without saving files (default: false)\n\n Returns:\n Splitting results with generated config paths.\n \"\"\"\n args = {\n \"config_path\": config_path,\n \"strategy\": strategy,\n \"target_pages\": target_pages,\n \"dry_run\": dry_run,\n }\n result = await split_config_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Generate router/hub skill for split documentation. Creates intelligent routing to sub-skills.\"\n)\nasync def generate_router(\n config_pattern: str,\n router_name: str | None = None,\n) -> str:\n \"\"\"\n Generate router/hub skill for split documentation.\n\n Args:\n config_pattern: Config pattern for sub-skills (e.g., 'configs/godot-*.json')\n router_name: Router skill name (optional, inferred from configs)\n\n Returns:\n Router generation results with file paths.\n \"\"\"\n args = {\"config_pattern\": config_pattern}\n if router_name:\n args[\"router_name\"] = router_name\n\n result = await generate_router_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# SOURCE TOOLS (5 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Fetch config from API, git URL, or registered source. Supports three modes: (1) Named source from registry, (2) Direct git URL, (3) API (default). List available configs or download a specific one by name.\"\n)\nasync def fetch_config(\n config_name: str | None = None,\n destination: str = \"configs\",\n list_available: bool = False,\n category: str | None = None,\n git_url: str | None = None,\n source: str | None = None,\n branch: str = \"main\",\n token: str | None = None,\n refresh: bool = False,\n) -> str:\n \"\"\"\n Fetch config from API, git URL, or registered source.\n\n Args:\n config_name: Name of the config to download (e.g., 'react', 'django', 'godot'). Required for git modes. Omit to list all available configs in API mode.\n destination: Directory to save the config file (default: 'configs/')\n list_available: List all available configs from the API (only works in API mode, default: false)\n category: Filter configs by category when listing in API mode (e.g., 'web-frameworks', 'game-engines', 'devops')\n git_url: Git repository URL containing configs. If provided, fetches from git instead of API. Supports HTTPS and SSH URLs. Example: 'https://github.com/myorg/configs.git'\n source: Named source from registry (highest priority). Use add_config_source to register sources first. Example: 'team', 'company'\n branch: Git branch to use (default: 'main'). Only used with git_url or source.\n token: Authentication token for private repos (optional). Prefer using environment variables (GITHUB_TOKEN, GITLAB_TOKEN, etc.).\n refresh: Force refresh cached git repository (default: false). Deletes cache and re-clones. Only used with git modes.\n\n Returns:\n Fetch results with config path or list of available configs.\n \"\"\"\n args = {\n \"destination\": destination,\n \"list_available\": list_available,\n \"branch\": branch,\n \"refresh\": refresh,\n }\n if config_name:\n args[\"config_name\"] = config_name\n if category:\n args[\"category\"] = category\n if git_url:\n args[\"git_url\"] = git_url\n if source:\n args[\"source\"] = source\n if token:\n args[\"token\"] = token\n\n result = await fetch_config_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Submit a custom config file to the community. Validates config (legacy or unified format) and creates a GitHub issue in skill-seekers-configs repo for review.\"\n)\nasync def submit_config(\n config_path: str | None = None,\n config_json: str | None = None,\n testing_notes: str | None = None,\n github_token: str | None = None,\n) -> str:\n \"\"\"\n Submit a custom config file to the community.\n\n Args:\n config_path: Path to config JSON file to submit (e.g., 'configs/myframework.json')\n config_json: Config JSON as string (alternative to config_path)\n testing_notes: Notes about testing (e.g., 'Tested with 20 pages, works well')\n github_token: GitHub personal access token (or use GITHUB_TOKEN env var)\n\n Returns:\n Submission results with GitHub issue URL.\n \"\"\"\n args = {}\n if config_path:\n args[\"config_path\"] = config_path\n if config_json:\n args[\"config_json\"] = config_json\n if testing_notes:\n args[\"testing_notes\"] = testing_notes\n if github_token:\n args[\"github_token\"] = github_token\n\n result = await submit_config_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Register a git repository as a config source. Allows fetching configs from private/team repos. Use this to set up named sources that can be referenced by fetch_config. Supports GitHub, GitLab, Gitea, Bitbucket, and custom git servers.\"\n)\nasync def add_config_source(\n name: str,\n git_url: str,\n source_type: str = \"github\",\n token_env: str | None = None,\n branch: str = \"main\",\n priority: int = 100,\n enabled: bool = True,\n) -> str:\n \"\"\"\n Register a git repository as a config source.\n\n Args:\n name: Source identifier (lowercase, alphanumeric, hyphens/underscores allowed). Example: 'team', 'company-internal', 'my_configs'\n git_url: Git repository URL (HTTPS or SSH). Example: 'https://github.com/myorg/configs.git' or 'git@github.com:myorg/configs.git'\n source_type: Source type (default: 'github'). Options: 'github', 'gitlab', 'gitea', 'bitbucket', 'custom'\n token_env: Environment variable name for auth token (optional). Auto-detected if not provided. Example: 'GITHUB_TOKEN', 'GITLAB_TOKEN', 'MY_CUSTOM_TOKEN'\n branch: Git branch to use (default: 'main'). Example: 'main', 'master', 'develop'\n priority: Source priority (lower = higher priority, default: 100). Used for conflict resolution when same config exists in multiple sources.\n enabled: Whether source is enabled (default: true)\n\n Returns:\n Registration results with source details.\n \"\"\"\n args = {\n \"name\": name,\n \"git_url\": git_url,\n \"source_type\": source_type,\n \"branch\": branch,\n \"priority\": priority,\n \"enabled\": enabled,\n }\n if token_env:\n args[\"token_env\"] = token_env\n\n result = await add_config_source_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"List all registered config sources. Shows git repositories that have been registered with add_config_source. Use this to see available sources for fetch_config.\"\n)\nasync def list_config_sources(enabled_only: bool = False) -> str:\n \"\"\"\n List all registered config sources.\n\n Args:\n enabled_only: Only show enabled sources (default: false)\n\n Returns:\n List of registered sources with details.\n \"\"\"\n result = await list_config_sources_impl({\"enabled_only\": enabled_only})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Remove a registered config source. Deletes the source from the registry. Does not delete cached git repository data.\"\n)\nasync def remove_config_source(name: str) -> str:\n \"\"\"\n Remove a registered config source.\n\n Args:\n name: Source identifier to remove. Example: 'team', 'company-internal'\n\n Returns:\n Removal results with success/error message.\n \"\"\"\n result = await remove_config_source_impl({\"name\": name})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Push a config to a registered config source repository. Validates, places in category directory, commits, and pushes.\"\n)\nasync def push_config(\n config_path: str,\n source_name: str,\n category: str = \"auto\",\n create_branch: bool = False,\n force: bool = False,\n) -> str:\n \"\"\"\n Push a config to a registered config source repository.\n\n Args:\n config_path: Path to config JSON file. Example: 'configs/unity-spine.json'\n source_name: Registered source name. Example: 'spyke'\n category: Category directory (e.g., 'game-engines'). Auto-detected if 'auto'.\n create_branch: Create feature branch instead of pushing to main. Default: false\n force: Overwrite existing config if it exists. Default: false\n\n Returns:\n Push results with commit SHA and config location.\n \"\"\"\n from skill_seekers.mcp.tools.source_tools import push_config_tool\n\n result = await push_config_tool(\n {\n \"config_path\": config_path,\n \"source_name\": source_name,\n \"category\": category,\n \"create_branch\": create_branch,\n \"force\": force,\n }\n )\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# MARKETPLACE TOOLS (4 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Register a plugin marketplace repository. Allows publishing skills to private/team plugin repos. Supports GitHub, GitLab, Bitbucket with per-repo authentication.\"\n)\nasync def add_marketplace(\n name: str,\n git_url: str,\n token_env: str = None,\n branch: str = \"main\",\n author_name: str = \"\",\n author_email: str = \"\",\n enabled: bool = True,\n) -> str:\n \"\"\"\n Register a plugin marketplace repository.\n\n Args:\n name: Marketplace identifier (lowercase, alphanumeric + hyphens/underscores). Example: 'spyke'\n git_url: Git repository URL. Example: 'https://github.com/myorg/plugins.git'\n token_env: Environment variable name for auth token (auto-detected from URL). Example: 'GITHUB_TOKEN'\n branch: Git branch to use (default: \"main\")\n author_name: Default author name for generated plugin.json files\n author_email: Default author email for generated plugin.json files\n enabled: Whether marketplace is enabled (default: true)\n \"\"\"\n result = await add_marketplace_impl(\n {\n \"name\": name,\n \"git_url\": git_url,\n \"token_env\": token_env,\n \"branch\": branch,\n \"author_name\": author_name,\n \"author_email\": author_email,\n \"enabled\": enabled,\n }\n )\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(description=\"List all registered plugin marketplace repositories.\")\nasync def list_marketplaces(enabled_only: bool = False) -> str:\n \"\"\"List all registered plugin marketplace repositories.\"\"\"\n result = await list_marketplaces_impl({\"enabled_only\": enabled_only})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Remove a registered plugin marketplace. Deletes from registry but not cached data.\"\n)\nasync def remove_marketplace(name: str) -> str:\n \"\"\"Remove a registered plugin marketplace.\"\"\"\n result = await remove_marketplace_impl({\"name\": name})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Publish a packaged skill to a plugin marketplace repository. Creates a Claude Code plugin in the target marketplace repo.\"\n)\nasync def publish_to_marketplace(\n skill_dir: str,\n marketplace: str,\n category: str = \"development\",\n skill_name: str = None,\n description: str = None,\n create_branch: bool = False,\n force: bool = False,\n) -> str:\n \"\"\"\n Publish a skill to a plugin marketplace repository.\n\n Args:\n skill_dir: Path to skill directory containing SKILL.md. Example: 'output/react/'\n marketplace: Registered marketplace name. Example: 'spyke'\n category: Plugin category (default: \"development\")\n skill_name: Override skill name (optional)\n description: Override description (optional)\n create_branch: Create feature branch instead of committing to main (default: false)\n force: Overwrite existing plugin (default: false)\n \"\"\"\n result = await publish_to_marketplace_impl(\n {\n \"skill_dir\": skill_dir,\n \"marketplace\": marketplace,\n \"category\": category,\n \"skill_name\": skill_name,\n \"description\": description,\n \"create_branch\": create_branch,\n \"force\": force,\n }\n )\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# VECTOR DATABASE TOOLS (4 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"Export skill to Weaviate vector database format. Weaviate supports hybrid search (vector + BM25 keyword) with 450K+ users. Ideal for production RAG applications.\"\n)\nasync def export_to_weaviate(\n skill_dir: str,\n output_dir: str | None = None,\n) -> str:\n \"\"\"\n Export skill to Weaviate vector database format.\n\n Args:\n skill_dir: Path to skill directory (e.g., output/react/)\n output_dir: Output directory (default: same as skill_dir parent)\n\n Returns:\n Export results with package path and usage instructions.\n \"\"\"\n args = {\"skill_dir\": skill_dir}\n if output_dir:\n args[\"output_dir\"] = output_dir\n\n result = await export_to_weaviate_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Export skill to Chroma vector database format. Chroma is a popular open-source embedding database designed for local-first development with 800K+ developers.\"\n)\nasync def export_to_chroma(\n skill_dir: str,\n output_dir: str | None = None,\n) -> str:\n \"\"\"\n Export skill to Chroma vector database format.\n\n Args:\n skill_dir: Path to skill directory (e.g., output/react/)\n output_dir: Output directory (default: same as skill_dir parent)\n\n Returns:\n Export results with package path and usage instructions.\n \"\"\"\n args = {\"skill_dir\": skill_dir}\n if output_dir:\n args[\"output_dir\"] = output_dir\n\n result = await export_to_chroma_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Export skill to FAISS vector index format. FAISS (Facebook AI Similarity Search) supports billion-scale vector search with GPU acceleration.\"\n)\nasync def export_to_faiss(\n skill_dir: str,\n output_dir: str | None = None,\n) -> str:\n \"\"\"\n Export skill to FAISS vector index format.\n\n Args:\n skill_dir: Path to skill directory (e.g., output/react/)\n output_dir: Output directory (default: same as skill_dir parent)\n\n Returns:\n Export results with package path and usage instructions.\n \"\"\"\n args = {\"skill_dir\": skill_dir}\n if output_dir:\n args[\"output_dir\"] = output_dir\n\n result = await export_to_faiss_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Export skill to Qdrant vector database format. Qdrant is a modern vector database with native payload filtering and high-performance search, serving 100K+ users.\"\n)\nasync def export_to_qdrant(\n skill_dir: str,\n output_dir: str | None = None,\n) -> str:\n \"\"\"\n Export skill to Qdrant vector database format.\n\n Args:\n skill_dir: Path to skill directory (e.g., output/react/)\n output_dir: Output directory (default: same as skill_dir parent)\n\n Returns:\n Export results with package path and usage instructions.\n \"\"\"\n args = {\"skill_dir\": skill_dir}\n if output_dir:\n args[\"output_dir\"] = output_dir\n\n result = await export_to_qdrant_impl(args)\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# WORKFLOW TOOLS (5 tools)\n# ============================================================================\n\n\n@safe_tool_decorator(\n description=\"List all available enhancement workflows (bundled defaults + user-created). Returns name, description, and source (bundled/user) for each.\"\n)\nasync def list_workflows() -> str:\n \"\"\"List all available enhancement workflow presets.\"\"\"\n result = list_workflows_impl({})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Get the full YAML content of a named enhancement workflow. Searches user dir first, then bundled defaults.\"\n)\nasync def get_workflow(name: str) -> str:\n \"\"\"\n Get full YAML content of a workflow.\n\n Args:\n name: Workflow name (e.g. 'security-focus', 'default')\n\n Returns:\n YAML content of the workflow, or error message if not found.\n \"\"\"\n result = get_workflow_impl({\"name\": name})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Create a new user workflow from YAML content. The workflow is saved to ~/.config/skill-seekers/workflows/.\"\n)\nasync def create_workflow(name: str, content: str) -> str:\n \"\"\"\n Create a new user workflow.\n\n Args:\n name: Workflow name (becomes the filename stem, e.g. 'my-custom')\n content: Full YAML content of the workflow\n\n Returns:\n Success message with file path, or error message.\n \"\"\"\n result = create_workflow_impl({\"name\": name, \"content\": content})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Update (overwrite) an existing user workflow. Cannot update bundled workflows.\"\n)\nasync def update_workflow(name: str, content: str) -> str:\n \"\"\"\n Update an existing user workflow.\n\n Args:\n name: Workflow name to update\n content: New YAML content\n\n Returns:\n Success message, or error if workflow is bundled or invalid.\n \"\"\"\n result = update_workflow_impl({\"name\": name, \"content\": content})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n@safe_tool_decorator(\n description=\"Delete a user workflow by name. Bundled workflows cannot be deleted.\"\n)\nasync def delete_workflow(name: str) -> str:\n \"\"\"\n Delete a user workflow.\n\n Args:\n name: Workflow name to delete\n\n Returns:\n Success message, or error if workflow is bundled or not found.\n \"\"\"\n result = delete_workflow_impl({\"name\": name})\n if isinstance(result, list) and result:\n return result[0].text if hasattr(result[0], \"text\") else str(result[0])\n return str(result)\n\n\n# ============================================================================\n# MAIN ENTRY POINT\n# ============================================================================\n\n\ndef parse_args():\n \"\"\"Parse command-line arguments.\"\"\"\n parser = argparse.ArgumentParser(\n description=\"Skill Seeker MCP Server - Generate Claude AI skills from documentation\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nTransport Modes:\n stdio (default): Standard input/output communication for Claude Desktop\n http: HTTP server with SSE for web-based MCP clients\n\nExamples:\n # Stdio transport (default, backward compatible)\n python -m skill_seekers.mcp.server_fastmcp\n\n # HTTP transport on default port 8000\n python -m skill_seekers.mcp.server_fastmcp --http\n\n # HTTP transport on custom port\n python -m skill_seekers.mcp.server_fastmcp --http --port 8080\n\n # Debug logging\n python -m skill_seekers.mcp.server_fastmcp --http --log-level DEBUG\n \"\"\",\n )\n\n parser.add_argument(\n \"--http\",\n action=\"store_true\",\n help=\"Use HTTP transport instead of stdio (default: stdio)\",\n )\n\n parser.add_argument(\n \"--port\",\n type=int,\n default=8000,\n help=\"Port for HTTP server (default: 8000)\",\n )\n\n parser.add_argument(\n \"--host\",\n type=str,\n default=\"127.0.0.1\",\n help=\"Host for HTTP server (default: 127.0.0.1)\",\n )\n\n parser.add_argument(\n \"--log-level\",\n type=str,\n default=\"INFO\",\n choices=[\"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\", \"CRITICAL\"],\n help=\"Logging level (default: INFO)\",\n )\n\n return parser.parse_args()\n\n\ndef setup_logging(log_level: str):\n \"\"\"Configure logging.\"\"\"\n logging.basicConfig(\n level=getattr(logging, log_level),\n format=\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n )\n\n\nasync def run_http_server(host: str, port: int):\n \"\"\"Run the MCP server with HTTP transport using uvicorn.\"\"\"\n try:\n import uvicorn\n except ImportError:\n logging.error(\"❌ Error: uvicorn package not installed\")\n logging.error(\"Install with: pip install uvicorn\")\n sys.exit(1)\n\n try:\n # Get the SSE Starlette app from FastMCP\n app = mcp.sse_app()\n\n # Add CORS middleware for cross-origin requests\n try:\n from starlette.middleware.cors import CORSMiddleware\n\n app.add_middleware(\n CORSMiddleware,\n allow_origins=[\"*\"],\n allow_credentials=True,\n allow_methods=[\"*\"],\n allow_headers=[\"*\"],\n )\n logging.info(\"✓ CORS middleware enabled\")\n except ImportError:\n logging.warning(\"⚠ CORS middleware not available (starlette not installed)\")\n\n # Add health check endpoint\n from starlette.responses import JSONResponse\n from starlette.routing import Route\n\n async def health_check(_request):\n \"\"\"Health check endpoint.\"\"\"\n return JSONResponse(\n {\n \"status\": \"healthy\",\n \"server\": \"skill-seeker-mcp\",\n \"version\": \"2.1.1\",\n \"transport\": \"http\",\n \"endpoints\": {\n \"health\": \"/health\",\n \"sse\": \"/sse\",\n \"messages\": \"/messages/\",\n },\n }\n )\n\n # Add route before the catch-all SSE route\n app.routes.insert(0, Route(\"/health\", health_check, methods=[\"GET\"]))\n\n logging.info(\"🚀 Starting Skill Seeker MCP Server (HTTP mode)\")\n logging.info(f\"📡 Server URL: http://{host}:{port}\")\n logging.info(f\"🔗 SSE Endpoint: http://{host}:{port}/sse\")\n logging.info(f\"💚 Health Check: http://{host}:{port}/health\")\n logging.info(f\"📝 Messages: http://{host}:{port}/messages/\")\n logging.info(\"\")\n logging.info(\"Claude Desktop Configuration (HTTP):\")\n logging.info(\"{\")\n logging.info(' \"mcpServers\": {')\n logging.info(' \"skill-seeker\": {')\n logging.info(f' \"url\": \"http://{host}:{port}/sse\"')\n logging.info(\" }\")\n logging.info(\" }\")\n logging.info(\"}\")\n logging.info(\"\")\n logging.info(\"Press Ctrl+C to stop the server\")\n\n # Run the uvicorn server\n config = uvicorn.Config(\n app=app,\n host=host,\n port=port,\n log_level=logging.getLogger().level,\n access_log=True,\n )\n server = uvicorn.Server(config)\n await server.serve()\n\n except Exception as e:\n logging.error(f\"❌ Failed to start HTTP server: {e}\")\n import traceback\n\n traceback.print_exc()\n sys.exit(1)\n\n\ndef main():\n \"\"\"Run the MCP server with stdio or HTTP transport.\"\"\"\n import asyncio\n\n # Check if MCP is available\n if not MCP_AVAILABLE or mcp is None:\n print(\"❌ Error: mcp package not installed or FastMCP not available\")\n print(\"Install with: pip install mcp>=1.25\")\n sys.exit(1)\n\n # Parse command-line arguments\n args = parse_args()\n\n # Setup logging\n setup_logging(args.log_level)\n\n if args.http:\n # HTTP transport mode\n logging.info(f\"🌐 Using HTTP transport on {args.host}:{args.port}\")\n try:\n asyncio.run(run_http_server(args.host, args.port))\n except KeyboardInterrupt:\n logging.info(\"\\n👋 Server stopped by user\")\n sys.exit(0)\n else:\n # Stdio transport mode (default, backward compatible)\n logging.info(\"📺 Using stdio transport (default)\")\n try:\n asyncio.run(mcp.run_stdio_async())\n except KeyboardInterrupt:\n logging.info(\"\\n👋 Server stopped by user\")\n sys.exit(0)\n\n\nif __name__ == \"__main__\":\n main()\n",
"sha256": "19ba3010ea3bc5101953e44070932ec239d67908e1a0e992437665f98b827200"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/tools/packaging_tools.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "\"\"\"\nPackaging tools for MCP server.\n\nThis module contains tools for packaging, uploading, and installing skills.\nExtracted from server.py for better modularity.\n\"\"\"\n\nimport json\nimport os\nimport re\nimport subprocess\nimport sys\nimport time\nfrom pathlib import Path\n\ntry:\n from mcp.types import TextContent\nexcept ImportError:\n # Graceful degradation: Create a simple fallback class for testing\n class TextContent:\n \"\"\"Fallback TextContent for when MCP is not installed\"\"\"\n\n def __init__(self, type: str, text: str):\n self.type = type\n self.text = text\n\n\n# Path to CLI tools\nCLI_DIR = Path(__file__).parent.parent.parent / \"cli\"\n\n\ndef run_subprocess_with_streaming(cmd: list[str], timeout: int = None) -> tuple[str, str, int]:\n \"\"\"\n Run subprocess with real-time output streaming.\n\n This solves the blocking issue where long-running processes (like scraping)\n would cause MCP to appear frozen. Now we stream output as it comes.\n\n Args:\n cmd: Command to run as list of strings\n timeout: Maximum time to wait in seconds (None for no timeout)\n\n Returns:\n Tuple of (stdout, stderr, returncode)\n \"\"\"\n try:\n process = subprocess.Popen(\n cmd,\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n text=True,\n bufsize=1, # Line buffered\n universal_newlines=True,\n )\n\n stdout_lines = []\n stderr_lines = []\n start_time = time.time()\n\n # Read output line by line as it comes\n while True:\n # Check timeout\n if timeout and (time.time() - start_time) > timeout:\n process.kill()\n stderr_lines.append(f\"\\n⚠️ Process killed after {timeout}s timeout\")\n break\n\n # Check if process finished\n if process.poll() is not None:\n break\n\n # Read available output (non-blocking)\n try:\n import select\n\n readable, _, _ = select.select([process.stdout, process.stderr], [], [], 0.1)\n\n if process.stdout in readable:\n line = process.stdout.readline()\n if line:\n stdout_lines.append(line)\n\n if process.stderr in readable:\n line = process.stderr.readline()\n if line:\n stderr_lines.append(line)\n except Exception:\n # Fallback for Windows (no select)\n time.sleep(0.1)\n\n # Get any remaining output\n remaining_stdout, remaining_stderr = process.communicate()\n if remaining_stdout:\n stdout_lines.append(remaining_stdout)\n if remaining_stderr:\n stderr_lines.append(remaining_stderr)\n\n stdout = \"\".join(stdout_lines)\n stderr = \"\".join(stderr_lines)\n returncode = process.returncode\n\n return stdout, stderr, returncode\n\n except Exception as e:\n return \"\", f\"Error running subprocess: {str(e)}\", 1\n\n\nasync def package_skill_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Package skill for target LLM platform and optionally auto-upload.\n\n Args:\n args: Dictionary with:\n - skill_dir (str): Path to skill directory (e.g., output/react/)\n - auto_upload (bool): Try to upload automatically if API key is available (default: True)\n - target (str): Target platform (default: 'auto')\n Options: 'auto', 'claude', 'gemini', 'openai', 'markdown'\n\n Returns:\n List of TextContent with packaging results\n \"\"\"\n from skill_seekers.cli.adaptors import get_adaptor\n\n skill_dir = args[\"skill_dir\"]\n auto_upload = args.get(\"auto_upload\", True)\n target = args.get(\"target\", \"auto\")\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n\n # Get platform adaptor\n try:\n adaptor = get_adaptor(target)\n except ValueError as e:\n return [\n TextContent(\n type=\"text\",\n text=f\"❌ Invalid platform: {str(e)}\\n\\nSupported platforms: claude, gemini, openai, markdown\",\n )\n ]\n\n # Check if platform-specific API key exists - only upload if available\n env_var_name = adaptor.get_env_var_name()\n has_api_key = os.environ.get(env_var_name, \"\").strip() if env_var_name else False\n should_upload = auto_upload and has_api_key\n\n # Run package_skill.py with target parameter\n cmd = [\n sys.executable,\n str(CLI_DIR / \"package_skill.py\"),\n skill_dir,\n \"--no-open\", # Don't open folder in MCP context\n \"--skip-quality-check\", # Skip interactive quality checks in MCP context\n \"--target\",\n target, # Add target platform\n ]\n\n # Add upload flag only if we have API key\n if should_upload:\n cmd.append(\"--upload\")\n\n # Timeout: 5 minutes for packaging + upload\n timeout = 300\n\n progress_msg = f\"📦 Packaging skill for {adaptor.PLATFORM_NAME}...\\n\"\n if should_upload:\n progress_msg += f\"📤 Will auto-upload to {adaptor.PLATFORM_NAME} if successful\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output = progress_msg + stdout\n\n if returncode == 0:\n if should_upload:\n # Upload succeeded\n output += f\"\\n\\n✅ Skill packaged and uploaded to {adaptor.PLATFORM_NAME}!\"\n if target == \"claude\":\n output += \"\\n Your skill is now available in Claude!\"\n output += \"\\n Go to https://claude.ai/skills to use it\"\n elif target == \"gemini\":\n output += \"\\n Your skill is now available in Gemini!\"\n output += \"\\n Go to https://aistudio.google.com/ to use it\"\n elif target == \"openai\":\n output += \"\\n Your assistant is now available in OpenAI!\"\n output += \"\\n Go to https://platform.openai.com/assistants/ to use it\"\n elif auto_upload and not has_api_key:\n # User wanted upload but no API key\n output += f\"\\n\\n📝 Skill packaged successfully for {adaptor.PLATFORM_NAME}!\"\n output += \"\\n\"\n output += \"\\n💡 To enable automatic upload:\"\n if target == \"claude\":\n output += \"\\n 1. Get API key from https://console.anthropic.com/\"\n output += \"\\n 2. Set: export ANTHROPIC_API_KEY=sk-ant-...\"\n output += \"\\n\\n📤 Manual upload:\"\n output += \"\\n 1. Find the .zip file in your output/ folder\"\n output += \"\\n 2. Go to https://claude.ai/skills\"\n output += \"\\n 3. Click 'Upload Skill' and select the .zip file\"\n elif target == \"gemini\":\n output += \"\\n 1. Get API key from https://aistudio.google.com/\"\n output += \"\\n 2. Set: export GOOGLE_API_KEY=AIza...\"\n output += \"\\n\\n📤 Manual upload:\"\n output += \"\\n 1. Go to https://aistudio.google.com/\"\n output += \"\\n 2. Upload the .tar.gz file from your output/ folder\"\n elif target == \"openai\":\n output += \"\\n 1. Get API key from https://platform.openai.com/\"\n output += \"\\n 2. Set: export OPENAI_API_KEY=sk-proj-...\"\n output += \"\\n\\n📤 Manual upload:\"\n output += \"\\n 1. Use OpenAI Assistants API\"\n output += \"\\n 2. Upload the .zip file from your output/ folder\"\n elif target == \"markdown\":\n output += \"\\n (No API key needed - markdown is export only)\"\n output += \"\\n Package created for manual distribution\"\n else:\n # auto_upload=False, just packaged\n output += f\"\\n\\n✅ Skill packaged successfully for {adaptor.PLATFORM_NAME}!\"\n if target == \"claude\":\n output += \"\\n Upload manually to https://claude.ai/skills\"\n elif target == \"gemini\":\n output += \"\\n Upload manually to https://aistudio.google.com/\"\n elif target == \"openai\":\n output += \"\\n Upload manually via OpenAI Assistants API\"\n elif target == \"markdown\":\n output += \"\\n Package ready for manual distribution\"\n\n return [TextContent(type=\"text\", text=output)]\n else:\n return [TextContent(type=\"text\", text=f\"{output}\\n\\n❌ Error:\\n{stderr}\")]\n\n\nasync def upload_skill_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Upload skill package to target LLM platform.\n\n Args:\n args: Dictionary with:\n - skill_zip (str): Path to skill package (.zip or .tar.gz)\n - target (str): Target platform (default: 'auto')\n Options: 'auto', 'claude', 'gemini', 'openai'\n Note: 'markdown' does not support upload\n - api_key (str, optional): API key (uses env var if not provided)\n\n Returns:\n List of TextContent with upload results\n \"\"\"\n from skill_seekers.cli.adaptors import get_adaptor\n\n skill_zip = args[\"skill_zip\"]\n target = args.get(\"target\", \"auto\")\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n api_key = args.get(\"api_key\")\n\n # Get platform adaptor\n try:\n adaptor = get_adaptor(target)\n except ValueError as e:\n return [\n TextContent(\n type=\"text\",\n text=f\"❌ Invalid platform: {str(e)}\\n\\nSupported platforms: claude, gemini, openai\",\n )\n ]\n\n # Check if upload is supported\n if target == \"markdown\":\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Markdown export does not support upload. Use the packaged file manually.\",\n )\n ]\n\n # Run upload_skill.py with target parameter\n cmd = [sys.executable, str(CLI_DIR / \"upload_skill.py\"), skill_zip, \"--target\", target]\n\n # Add API key if provided\n if api_key:\n cmd.extend([\"--api-key\", api_key])\n\n # Timeout: 5 minutes for upload\n timeout = 300\n\n progress_msg = f\"📤 Uploading skill to {adaptor.PLATFORM_NAME}...\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output = progress_msg + stdout\n\n if returncode == 0:\n return [TextContent(type=\"text\", text=output)]\n else:\n return [TextContent(type=\"text\", text=f\"{output}\\n\\n❌ Error:\\n{stderr}\")]\n\n\nasync def enhance_skill_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Enhance SKILL.md with AI using target platform's model.\n\n Args:\n args: Dictionary with:\n - skill_dir (str): Path to skill directory\n - target (str): Target platform (default: 'auto')\n Options: 'auto', 'claude', 'gemini', 'openai'\n Note: 'markdown' does not support enhancement\n - mode (str): Enhancement mode (default: 'local')\n 'local': Uses AI coding agent (no API key)\n 'api': Uses platform API (requires API key)\n - api_key (str, optional): API key for 'api' mode\n\n Returns:\n List of TextContent with enhancement results\n \"\"\"\n from skill_seekers.cli.adaptors import get_adaptor\n\n skill_dir = Path(args.get(\"skill_dir\"))\n target = args.get(\"target\", \"auto\")\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n mode = args.get(\"mode\", \"local\")\n api_key = args.get(\"api_key\")\n\n # Validate skill directory\n if not skill_dir.exists():\n return [TextContent(type=\"text\", text=f\"❌ Skill directory not found: {skill_dir}\")]\n\n if not (skill_dir / \"SKILL.md\").exists():\n return [TextContent(type=\"text\", text=f\"❌ SKILL.md not found in {skill_dir}\")]\n\n # Get platform adaptor\n try:\n adaptor = get_adaptor(target)\n except ValueError as e:\n return [\n TextContent(\n type=\"text\",\n text=f\"❌ Invalid platform: {str(e)}\\n\\nSupported platforms: claude, gemini, openai\",\n )\n ]\n\n # Check if enhancement is supported\n if not adaptor.supports_enhancement():\n return [\n TextContent(\n type=\"text\", text=f\"❌ {adaptor.PLATFORM_NAME} does not support AI enhancement\"\n )\n ]\n\n output_lines = []\n output_lines.append(f\"🚀 Enhancing skill with {adaptor.PLATFORM_NAME}\")\n output_lines.append(\"-\" * 70)\n output_lines.append(f\"Skill directory: {skill_dir}\")\n output_lines.append(f\"Mode: {mode}\")\n output_lines.append(\"\")\n\n if mode == \"local\":\n # Use local enhancement (AI coding agent)\n output_lines.append(\"Using AI coding agent (local, no API key required)\")\n output_lines.append(\"Running enhancement in headless mode...\")\n output_lines.append(\"\")\n\n cmd = [sys.executable, str(CLI_DIR / \"enhance_skill_local.py\"), str(skill_dir)]\n\n try:\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=900)\n\n if returncode == 0:\n output_lines.append(stdout)\n output_lines.append(\"\")\n output_lines.append(\"✅ Enhancement complete!\")\n output_lines.append(f\"Enhanced SKILL.md: {skill_dir / 'SKILL.md'}\")\n output_lines.append(f\"Backup: {skill_dir / 'SKILL.md.backup'}\")\n else:\n output_lines.append(f\"❌ Enhancement failed (exit code {returncode})\")\n output_lines.append(stderr if stderr else stdout)\n\n except Exception as e:\n output_lines.append(f\"❌ Error: {str(e)}\")\n\n elif mode == \"api\":\n # Use API enhancement\n output_lines.append(f\"Using {adaptor.PLATFORM_NAME} API\")\n\n # Get API key\n if not api_key:\n env_var = adaptor.get_env_var_name()\n api_key = os.environ.get(env_var)\n\n if not api_key:\n return [\n TextContent(\n type=\"text\",\n text=f\"❌ {env_var} not set. Set API key or pass via api_key parameter.\",\n )\n ]\n\n # Validate API key\n if not adaptor.validate_api_key(api_key):\n return [\n TextContent(\n type=\"text\", text=f\"❌ Invalid API key format for {adaptor.PLATFORM_NAME}\"\n )\n ]\n\n output_lines.append(\"Calling API for enhancement...\")\n output_lines.append(\"\")\n\n try:\n success = adaptor.enhance(skill_dir, api_key)\n\n if success:\n output_lines.append(\"✅ Enhancement complete!\")\n output_lines.append(f\"Enhanced SKILL.md: {skill_dir / 'SKILL.md'}\")\n output_lines.append(f\"Backup: {skill_dir / 'SKILL.md.backup'}\")\n else:\n output_lines.append(\"❌ Enhancement failed\")\n\n except Exception as e:\n output_lines.append(f\"❌ Error: {str(e)}\")\n\n else:\n return [TextContent(type=\"text\", text=f\"❌ Invalid mode: {mode}. Use 'local' or 'api'\")]\n\n return [TextContent(type=\"text\", text=\"\\n\".join(output_lines))]\n\n\nasync def install_skill_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Complete skill installation workflow.\n\n Orchestrates the complete workflow:\n 1. Fetch config (if config_name provided)\n 2. Scrape documentation\n 3. AI Enhancement (MANDATORY - no skip option)\n 4. Package for target platform (ZIP or tar.gz)\n 5. Upload to target platform (optional)\n\n Args:\n args: Dictionary with:\n - config_name (str, optional): Config to fetch from API (mutually exclusive with config_path)\n - config_path (str, optional): Path to existing config (mutually exclusive with config_name)\n - destination (str): Output directory (default: \"output\")\n - auto_upload (bool): Upload after packaging (default: True)\n - unlimited (bool): Remove page limits (default: False)\n - dry_run (bool): Preview only (default: False)\n - target (str): Target LLM platform (default: \"auto\")\n\n Returns:\n List of TextContent with workflow progress and results\n \"\"\"\n # Import these here to avoid circular imports\n from skill_seekers.cli.adaptors import get_adaptor\n\n from .scraping_tools import scrape_docs_tool\n from .source_tools import fetch_config_tool\n\n # Extract and validate inputs\n config_name = args.get(\"config_name\")\n config_path = args.get(\"config_path\")\n destination = args.get(\"destination\", \"output\")\n auto_upload = args.get(\"auto_upload\", True)\n unlimited = args.get(\"unlimited\", False)\n dry_run = args.get(\"dry_run\", False)\n target = args.get(\"target\", \"auto\")\n marketplace_arg = args.get(\"marketplace\")\n marketplace_category = args.get(\"marketplace_category\", \"development\")\n create_branch = args.get(\"create_branch\", False)\n if target == \"auto\":\n from skill_seekers.cli.agent_client import AgentClient\n\n target = AgentClient.detect_default_target()\n\n # Get platform adaptor\n try:\n adaptor = get_adaptor(target)\n except ValueError as e:\n return [\n TextContent(\n type=\"text\",\n text=f\"❌ Error: {str(e)}\\n\\nSupported platforms: claude, gemini, openai, markdown\",\n )\n ]\n\n # Validation: Must provide exactly one of config_name or config_path\n if not config_name and not config_path:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: Must provide either config_name or config_path\\n\\nExamples:\\n install_skill(config_name='react')\\n install_skill(config_path='configs/custom.json')\",\n )\n ]\n\n if config_name and config_path:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: Cannot provide both config_name and config_path\\n\\nChoose one:\\n - config_name: Fetch from API (e.g., 'react')\\n - config_path: Use existing file (e.g., 'configs/custom.json')\",\n )\n ]\n\n # Initialize output\n output_lines = []\n output_lines.append(\"🚀 SKILL INSTALLATION WORKFLOW\")\n output_lines.append(\"=\" * 70)\n output_lines.append(\"\")\n\n if dry_run:\n output_lines.append(\"🔍 DRY RUN MODE - Preview only, no actions taken\")\n output_lines.append(\"\")\n\n # Track workflow state\n workflow_state = {\n \"config_path\": config_path,\n \"skill_name\": None,\n \"skill_dir\": None,\n \"zip_path\": None,\n \"phases_completed\": [],\n }\n\n try:\n # ===== PHASE 1: Fetch Config (if needed) =====\n if config_name:\n output_lines.append(\"📥 PHASE 1/5: Fetch Config\")\n output_lines.append(\"-\" * 70)\n output_lines.append(f\"Config: {config_name}\")\n output_lines.append(f\"Destination: {destination}/\")\n output_lines.append(\"\")\n\n if not dry_run:\n # Call fetch_config_tool directly\n fetch_result = await fetch_config_tool(\n {\"config_name\": config_name, \"destination\": destination}\n )\n\n # Parse result to extract config path\n fetch_output = fetch_result[0].text\n output_lines.append(fetch_output)\n output_lines.append(\"\")\n\n # Extract config path from output\n # Expected format: \"📂 Saved to: configs/react.json\"\n match = re.search(r\"(?i)saved to:\\s*(.+\\.json)\", fetch_output)\n if match:\n workflow_state[\"config_path\"] = match.group(1).strip()\n output_lines.append(f\"✅ Config fetched: {workflow_state['config_path']}\")\n else:\n return [\n TextContent(\n type=\"text\",\n text=\"\\n\".join(output_lines) + \"\\n\\n❌ Failed to fetch config\",\n )\n ]\n\n workflow_state[\"phases_completed\"].append(\"fetch_config\")\n else:\n output_lines.append(\" [DRY RUN] Would fetch config from API\")\n workflow_state[\"config_path\"] = f\"{destination}/{config_name}.json\"\n\n output_lines.append(\"\")\n\n # ===== PHASE 2: Scrape Documentation =====\n phase_num = \"2/5\" if config_name else \"1/4\"\n output_lines.append(f\"📄 PHASE {phase_num}: Scrape Documentation\")\n output_lines.append(\"-\" * 70)\n output_lines.append(f\"Config: {workflow_state['config_path']}\")\n output_lines.append(f\"Unlimited mode: {unlimited}\")\n output_lines.append(\"\")\n\n if not dry_run:\n # Load config to get skill name\n try:\n with open(workflow_state[\"config_path\"]) as f:\n config = json.load(f)\n workflow_state[\"skill_name\"] = config.get(\"name\", \"unknown\")\n workflow_state[\"config_data\"] = config\n except Exception as e:\n return [\n TextContent(\n type=\"text\",\n text=\"\\n\".join(output_lines) + f\"\\n\\n❌ Failed to read config: {str(e)}\",\n )\n ]\n\n # Call scrape_docs_tool (does NOT include enhancement)\n output_lines.append(\"Scraping documentation (this may take 20-45 minutes)...\")\n output_lines.append(\"\")\n\n scrape_result = await scrape_docs_tool(\n {\n \"config_path\": workflow_state[\"config_path\"],\n \"unlimited\": unlimited,\n \"enhance_local\": False, # Enhancement is separate phase\n \"skip_scrape\": False,\n \"dry_run\": False,\n }\n )\n\n scrape_output = scrape_result[0].text\n output_lines.append(scrape_output)\n output_lines.append(\"\")\n\n # Check for success\n if \"❌\" in scrape_output:\n return [\n TextContent(\n type=\"text\",\n text=\"\\n\".join(output_lines) + \"\\n\\n❌ Scraping failed - see error above\",\n )\n ]\n\n workflow_state[\"skill_dir\"] = f\"{destination}/{workflow_state['skill_name']}\"\n workflow_state[\"phases_completed\"].append(\"scrape_docs\")\n else:\n output_lines.append(\" [DRY RUN] Would scrape documentation\")\n workflow_state[\"skill_name\"] = \"example\"\n workflow_state[\"skill_dir\"] = f\"{destination}/example\"\n\n output_lines.append(\"\")\n\n # ===== PHASE 3: AI Enhancement (MANDATORY) =====\n phase_num = \"3/5\" if config_name else \"2/4\"\n output_lines.append(f\"✨ PHASE {phase_num}: AI Enhancement (MANDATORY)\")\n output_lines.append(\"-\" * 70)\n output_lines.append(\"⚠️ Enhancement is REQUIRED for quality (3/10→9/10 boost)\")\n output_lines.append(f\"Skill directory: {workflow_state['skill_dir']}\")\n output_lines.append(\"Mode: Headless (runs in background)\")\n output_lines.append(\"Estimated time: 30-60 seconds\")\n output_lines.append(\"\")\n\n if not dry_run:\n # Run enhance_skill_local in headless mode\n # Build command directly\n cmd = [\n sys.executable,\n str(CLI_DIR / \"enhance_skill_local.py\"),\n workflow_state[\"skill_dir\"],\n # Headless is default, no flag needed\n ]\n\n timeout = 900 # 15 minutes max for enhancement\n\n output_lines.append(\"Running AI enhancement...\")\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n if returncode != 0:\n output_lines.append(f\"\\n❌ Enhancement failed (exit code {returncode}):\")\n output_lines.append(stderr if stderr else stdout)\n return [TextContent(type=\"text\", text=\"\\n\".join(output_lines))]\n\n output_lines.append(stdout)\n workflow_state[\"phases_completed\"].append(\"enhance_skill\")\n else:\n output_lines.append(\" [DRY RUN] Would enhance SKILL.md with AI agent\")\n\n output_lines.append(\"\")\n\n # ===== PHASE 4: Package Skill =====\n phase_num = \"4/5\" if config_name else \"3/4\"\n output_lines.append(f\"📦 PHASE {phase_num}: Package Skill for {adaptor.PLATFORM_NAME}\")\n output_lines.append(\"-\" * 70)\n output_lines.append(f\"Skill directory: {workflow_state['skill_dir']}\")\n output_lines.append(f\"Target platform: {adaptor.PLATFORM_NAME}\")\n output_lines.append(\"\")\n\n if not dry_run:\n # Call package_skill_tool with target\n package_result = await package_skill_tool(\n {\n \"skill_dir\": workflow_state[\"skill_dir\"],\n \"auto_upload\": False, # We handle upload in next phase\n \"target\": target,\n }\n )\n\n package_output = package_result[0].text\n output_lines.append(package_output)\n output_lines.append(\"\")\n\n # Extract package path from output (supports .zip and .tar.gz)\n # Expected format: \"Saved to: output/react.zip\" or \"Saved to: output/react-gemini.tar.gz\"\n match = re.search(r\"(?i)saved to:\\s*(.+\\.(?:zip|tar\\.gz))\", package_output)\n if match:\n workflow_state[\"zip_path\"] = match.group(1).strip()\n else:\n # Fallback: construct package path based on platform\n if target == \"gemini\":\n workflow_state[\"zip_path\"] = (\n f\"{destination}/{workflow_state['skill_name']}-gemini.tar.gz\"\n )\n elif target == \"openai\":\n workflow_state[\"zip_path\"] = (\n f\"{destination}/{workflow_state['skill_name']}-openai.zip\"\n )\n else:\n workflow_state[\"zip_path\"] = f\"{destination}/{workflow_state['skill_name']}.zip\"\n\n workflow_state[\"phases_completed\"].append(\"package_skill\")\n else:\n # Dry run - show expected package format\n if target == \"gemini\":\n pkg_ext = \"tar.gz\"\n pkg_file = f\"{destination}/{workflow_state['skill_name']}-gemini.tar.gz\"\n elif target == \"openai\":\n pkg_ext = \"zip\"\n pkg_file = f\"{destination}/{workflow_state['skill_name']}-openai.zip\"\n else:\n pkg_ext = \"zip\"\n pkg_file = f\"{destination}/{workflow_state['skill_name']}.zip\"\n\n output_lines.append(\n f\" [DRY RUN] Would package to {pkg_ext} file for {adaptor.PLATFORM_NAME}\"\n )\n workflow_state[\"zip_path\"] = pkg_file\n\n output_lines.append(\"\")\n\n # ===== PHASE 5: Upload (Optional) =====\n has_api_key = False # Initialize before conditional block\n if auto_upload:\n phase_num = \"5/5\" if config_name else \"4/4\"\n output_lines.append(f\"📤 PHASE {phase_num}: Upload to {adaptor.PLATFORM_NAME}\")\n output_lines.append(\"-\" * 70)\n output_lines.append(f\"Package file: {workflow_state['zip_path']}\")\n output_lines.append(\"\")\n\n # Check for platform-specific API key\n env_var_name = adaptor.get_env_var_name()\n has_api_key = os.environ.get(env_var_name, \"\").strip()\n\n if not dry_run:\n if has_api_key:\n # Upload not supported for markdown platform\n if target == \"markdown\":\n output_lines.append(\"⚠️ Markdown export does not support upload\")\n output_lines.append(\" Package has been created - use manually\")\n else:\n # Call upload_skill_tool with target\n upload_result = await upload_skill_tool(\n {\"skill_zip\": workflow_state[\"zip_path\"], \"target\": target}\n )\n\n upload_output = upload_result[0].text\n output_lines.append(upload_output)\n\n workflow_state[\"phases_completed\"].append(\"upload_skill\")\n else:\n # Platform-specific instructions for missing API key\n output_lines.append(f\"⚠️ {env_var_name} not set - skipping upload\")\n output_lines.append(\"\")\n output_lines.append(\"To enable automatic upload:\")\n\n if target == \"claude\":\n output_lines.append(\" 1. Get API key from https://console.anthropic.com/\")\n output_lines.append(\" 2. Set: export ANTHROPIC_API_KEY=sk-ant-...\")\n output_lines.append(\"\")\n output_lines.append(\"📤 Manual upload:\")\n output_lines.append(\" 1. Go to https://claude.ai/skills\")\n output_lines.append(\" 2. Click 'Upload Skill'\")\n output_lines.append(f\" 3. Select: {workflow_state['zip_path']}\")\n elif target == \"gemini\":\n output_lines.append(\" 1. Get API key from https://aistudio.google.com/\")\n output_lines.append(\" 2. Set: export GOOGLE_API_KEY=AIza...\")\n output_lines.append(\"\")\n output_lines.append(\"📤 Manual upload:\")\n output_lines.append(\" 1. Go to https://aistudio.google.com/\")\n output_lines.append(f\" 2. Upload package: {workflow_state['zip_path']}\")\n elif target == \"openai\":\n output_lines.append(\" 1. Get API key from https://platform.openai.com/\")\n output_lines.append(\" 2. Set: export OPENAI_API_KEY=sk-proj-...\")\n output_lines.append(\"\")\n output_lines.append(\"📤 Manual upload:\")\n output_lines.append(\" 1. Use OpenAI Assistants API\")\n output_lines.append(f\" 2. Upload package: {workflow_state['zip_path']}\")\n elif target == \"markdown\":\n output_lines.append(\" (No API key needed - markdown is export only)\")\n output_lines.append(f\" Package created: {workflow_state['zip_path']}\")\n else:\n output_lines.append(\n f\" [DRY RUN] Would upload to {adaptor.PLATFORM_NAME} (if API key set)\"\n )\n\n output_lines.append(\"\")\n\n # ===== PHASE 6: Publish to Marketplace (Optional) =====\n marketplace_targets = []\n if marketplace_arg:\n marketplace_targets.append(\n {\"marketplace\": marketplace_arg, \"category\": marketplace_category}\n )\n else:\n cd = workflow_state.get(\"config_data\", {})\n if isinstance(cd, dict):\n marketplace_targets = cd.get(\"marketplace_targets\", [])\n\n if marketplace_targets:\n phase_num = len(workflow_state[\"phases_completed\"]) + 1\n output_lines.append(f\"{'=' * 70}\")\n output_lines.append(\n f\"PHASE {phase_num}: Publish to Marketplace\"\n f\" ({len(marketplace_targets)} target{'s' if len(marketplace_targets) > 1 else ''})\"\n )\n output_lines.append(f\"{'=' * 70}\")\n output_lines.append(\"\")\n\n if not dry_run:\n from .marketplace_tools import publish_to_marketplace_tool\n\n for mp_target in marketplace_targets:\n mp_name = mp_target.get(\"marketplace\", \"\")\n mp_cat = mp_target.get(\"category\", \"development\")\n output_lines.append(f\"Publishing to marketplace '{mp_name}'...\")\n\n try:\n pub_result = await publish_to_marketplace_tool(\n {\n \"skill_dir\": workflow_state[\"skill_dir\"],\n \"marketplace\": mp_name,\n \"category\": mp_cat,\n \"create_branch\": create_branch,\n \"force\": True,\n }\n )\n pub_output = pub_result[0].text if pub_result else \"No output\"\n output_lines.append(pub_output)\n workflow_state[\"phases_completed\"].append(\n f\"publish_to_marketplace({mp_name})\"\n )\n except Exception as e:\n output_lines.append(f\"Failed to publish to '{mp_name}': {str(e)}\")\n output_lines.append(\"\")\n else:\n for mp_target in marketplace_targets:\n mp_name = mp_target.get(\"marketplace\", \"\")\n mp_cat = mp_target.get(\"category\", \"development\")\n output_lines.append(\n f\" [DRY RUN] Would publish to marketplace '{mp_name}' (category: {mp_cat})\"\n )\n output_lines.append(\"\")\n\n # ===== WORKFLOW SUMMARY =====\n output_lines.append(\"=\" * 70)\n output_lines.append(\"✅ WORKFLOW COMPLETE\")\n output_lines.append(\"=\" * 70)\n output_lines.append(\"\")\n\n if not dry_run:\n output_lines.append(\"Phases completed:\")\n for phase in workflow_state[\"phases_completed\"]:\n output_lines.append(f\" ✓ {phase}\")\n output_lines.append(\"\")\n\n output_lines.append(\"📁 Output:\")\n output_lines.append(f\" Skill directory: {workflow_state['skill_dir']}\")\n if workflow_state[\"zip_path\"]:\n output_lines.append(f\" Skill package: {workflow_state['zip_path']}\")\n output_lines.append(\"\")\n\n if auto_upload and has_api_key and target != \"markdown\":\n # Platform-specific success message\n if target == \"claude\":\n output_lines.append(\"🎉 Your skill is now available in Claude!\")\n output_lines.append(\" Go to https://claude.ai/skills to use it\")\n elif target == \"gemini\":\n output_lines.append(\"🎉 Your skill is now available in Gemini!\")\n output_lines.append(\" Go to https://aistudio.google.com/ to use it\")\n elif target == \"openai\":\n output_lines.append(\"🎉 Your assistant is now available in OpenAI!\")\n output_lines.append(\n \" Go to https://platform.openai.com/assistants/ to use it\"\n )\n elif auto_upload:\n output_lines.append(\"📝 Manual upload required (see instructions above)\")\n else:\n output_lines.append(\"📤 To upload:\")\n output_lines.append(\n f\" skill-seekers upload {workflow_state['zip_path']} --target {target}\"\n )\n else:\n output_lines.append(\"This was a dry run. No actions were taken.\")\n output_lines.append(\"\")\n output_lines.append(\"To execute for real, remove the --dry-run flag:\")\n if config_name:\n output_lines.append(f\" install_skill(config_name='{config_name}')\")\n else:\n output_lines.append(f\" install_skill(config_path='{config_path}')\")\n\n return [TextContent(type=\"text\", text=\"\\n\".join(output_lines))]\n\n except Exception as e:\n output_lines.append(\"\")\n output_lines.append(f\"❌ Workflow failed: {str(e)}\")\n output_lines.append(\"\")\n output_lines.append(\"Phases completed before failure:\")\n for phase in workflow_state[\"phases_completed\"]:\n output_lines.append(f\" ✓ {phase}\")\n return [TextContent(type=\"text\", text=\"\\n\".join(output_lines))]\n",
"sha256": "7654385b60889705d98a3cc8e92602d13cadaf920ead26561e7fbb3a349a1fab"
},
".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/tools/scraping_tools.py": {
"mode": "100644",
"encoding": "utf-8",
"data": "\"\"\"\nScraping Tools Module for MCP Server\n\nThis module contains all scraping-related MCP tool implementations:\n- estimate_pages_tool: Estimate page count before scraping\n- scrape_docs_tool: Scrape documentation (legacy or unified)\n- scrape_github_tool: Scrape GitHub repositories\n- scrape_pdf_tool: Scrape PDF documentation\n- scrape_codebase_tool: Analyze local codebase and extract code knowledge\n- scrape_generic_tool: Generic scraper for new source types (jupyter, html,\n openapi, asciidoc, pptx, confluence, notion, rss, manpage, chat)\n\nExtracted from server.py for better modularity and organization.\n\"\"\"\n\nimport io\nimport json\nimport logging\nimport sys\nfrom pathlib import Path\n\n# MCP types - with graceful fallback for testing\ntry:\n from mcp.types import TextContent\nexcept ImportError:\n # Graceful degradation: Create a simple fallback class for testing\n class TextContent:\n \"\"\"Fallback TextContent for when MCP is not installed\"\"\"\n\n def __init__(self, type: str, text: str):\n self.type = type\n self.text = text\n\n\n# Path to CLI tools\nCLI_DIR = Path(__file__).parent.parent.parent / \"cli\"\n\n\ndef _run_converter(converter, progress_msg: str) -> list:\n \"\"\"Run a converter in-process with log capture.\n\n Args:\n converter: An initialized SkillConverter instance.\n progress_msg: Progress message to prepend to output.\n\n Returns:\n List[TextContent] with success/error message.\n \"\"\"\n log_capture = io.StringIO()\n handler = logging.StreamHandler(log_capture)\n handler.setLevel(logging.INFO)\n sk_logger = logging.getLogger(\"skill_seekers\")\n sk_logger.addHandler(handler)\n try:\n result = converter.run()\n except Exception as exc:\n captured = log_capture.getvalue()\n return [\n TextContent(\n type=\"text\",\n text=f\"{progress_msg}{captured}\\n\\n❌ Converter raised an exception:\\n{exc}\",\n )\n ]\n finally:\n sk_logger.removeHandler(handler)\n\n captured = log_capture.getvalue()\n output = progress_msg + captured\n\n if result == 0:\n return [TextContent(type=\"text\", text=output)]\n else:\n return [\n TextContent(\n type=\"text\",\n text=f\"{output}\\n\\n❌ Converter returned non-zero exit code ({result})\",\n )\n ]\n\n\ndef run_subprocess_with_streaming(cmd: list[str], timeout: int = None) -> tuple:\n \"\"\"\n Run subprocess with real-time output streaming.\n\n This solves the blocking issue where long-running processes (like scraping)\n would cause MCP to appear frozen. Now we stream output as it comes.\n\n Args:\n cmd: Command list to execute\n timeout: Optional timeout in seconds\n\n Returns:\n Tuple of (stdout, stderr, returncode)\n \"\"\"\n import subprocess\n import time\n\n try:\n process = subprocess.Popen(\n cmd,\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n text=True,\n bufsize=1, # Line buffered\n universal_newlines=True,\n )\n\n stdout_lines = []\n stderr_lines = []\n start_time = time.time()\n\n # Read output line by line as it comes\n while True:\n # Check timeout\n if timeout and (time.time() - start_time) > timeout:\n process.kill()\n stderr_lines.append(f\"\\n⚠️ Process killed after {timeout}s timeout\")\n break\n\n # Check if process finished\n if process.poll() is not None:\n break\n\n # Read available output (non-blocking)\n try:\n import select\n\n readable, _, _ = select.select([process.stdout, process.stderr], [], [], 0.1)\n\n if process.stdout in readable:\n line = process.stdout.readline()\n if line:\n stdout_lines.append(line)\n\n if process.stderr in readable:\n line = process.stderr.readline()\n if line:\n stderr_lines.append(line)\n except Exception:\n # Fallback for Windows (no select)\n time.sleep(0.1)\n\n # Get any remaining output\n remaining_stdout, remaining_stderr = process.communicate()\n if remaining_stdout:\n stdout_lines.append(remaining_stdout)\n if remaining_stderr:\n stderr_lines.append(remaining_stderr)\n\n stdout = \"\".join(stdout_lines)\n stderr = \"\".join(stderr_lines)\n returncode = process.returncode\n\n return stdout, stderr, returncode\n\n except Exception as e:\n return \"\", f\"Error running subprocess: {str(e)}\", 1\n\n\nasync def estimate_pages_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Estimate page count from a config file.\n\n Performs fast preview without downloading content to estimate\n how many pages will be scraped.\n\n Args:\n args: Dictionary containing:\n - config_path (str): Path to config JSON file\n - max_discovery (int, optional): Maximum pages to discover (default: 1000)\n - unlimited (bool, optional): Remove discovery limit (default: False)\n\n Returns:\n List[TextContent]: Tool execution results\n \"\"\"\n config_path = args[\"config_path\"]\n max_discovery = args.get(\"max_discovery\", 1000)\n unlimited = args.get(\"unlimited\", False)\n\n # Handle unlimited mode\n if unlimited or max_discovery == -1:\n max_discovery = -1\n timeout = 1800 # 30 minutes for unlimited discovery\n else:\n # Estimate: 0.5s per page discovered\n timeout = max(300, max_discovery // 2) # Minimum 5 minutes\n\n # Run estimate_pages module\n cmd = [\n sys.executable,\n \"-m\",\n \"skill_seekers.cli.estimate_pages\",\n config_path,\n \"--max-discovery\",\n str(max_discovery),\n ]\n\n progress_msg = \"🔄 Estimating page count...\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output = progress_msg + stdout\n\n if returncode == 0:\n return [TextContent(type=\"text\", text=output)]\n else:\n return [TextContent(type=\"text\", text=f\"{output}\\n\\n❌ Error:\\n{stderr}\")]\n\n\nasync def scrape_docs_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Scrape documentation and build skill.\n\n Auto-detects unified vs legacy format and routes to appropriate scraper.\n Supports both single-source (legacy) and unified multi-source configs.\n Creates SKILL.md and reference files.\n\n Args:\n args: Dictionary containing:\n - config_path (str): Path to config JSON file\n - unlimited (bool, optional): Remove page limit (default: False)\n - enhance_local (bool, optional): Open terminal for local enhancement (default: False)\n - skip_scrape (bool, optional): Skip scraping, use cached data (default: False)\n - dry_run (bool, optional): Preview without saving (default: False)\n - merge_mode (str, optional): Override merge mode for unified configs\n\n Returns:\n List[TextContent]: Tool execution results\n \"\"\"\n config_path = args[\"config_path\"]\n unlimited = args.get(\"unlimited\", False)\n dry_run = args.get(\"dry_run\", False)\n merge_mode = args.get(\"merge_mode\")\n\n # Load config to detect format\n with open(config_path) as f:\n config = json.load(f)\n\n # Detect if unified format (has 'sources' array)\n is_unified = \"sources\" in config and isinstance(config[\"sources\"], list)\n\n # Handle unlimited mode by modifying config temporarily\n if unlimited:\n # Set max_pages to None (unlimited)\n if is_unified:\n # For unified configs, set max_pages on documentation sources\n for source in config.get(\"sources\", []):\n if source.get(\"type\") == \"documentation\":\n source[\"max_pages\"] = None\n else:\n # For legacy configs\n config[\"max_pages\"] = None\n\n # Create temporary config file\n temp_config_path = config_path.replace(\".json\", \"_unlimited_temp.json\")\n with open(temp_config_path, \"w\") as f:\n json.dump(config, f, indent=2)\n\n config_to_use = temp_config_path\n else:\n config_to_use = config_path\n\n # Build progress message\n if is_unified:\n progress_msg = \"🔄 Starting unified multi-source scraping...\\n\"\n progress_msg += \"📦 Config format: Unified (multiple sources)\\n\"\n else:\n progress_msg = \"🔄 Starting scraping process...\\n\"\n progress_msg += \"📦 Config format: Legacy (single source)\\n\"\n\n progress_msg += \"📝 Progress will be shown below:\\n\\n\"\n\n # Run converter in-process\n try:\n if is_unified:\n from skill_seekers.cli.unified_scraper import UnifiedScraper\n\n converter = UnifiedScraper(config_to_use, merge_mode=merge_mode)\n else:\n from skill_seekers.cli.skill_converter import get_converter\n\n # For legacy format, detect type from config keys\n with open(config_to_use) as f:\n config_to_pass = json.load(f)\n\n # Detect source type from config content\n if \"base_url\" in config_to_pass:\n source_type = \"web\"\n elif \"repo\" in config_to_pass:\n source_type = \"github\"\n elif \"pdf_path\" in config_to_pass:\n source_type = \"pdf\"\n elif \"directory\" in config_to_pass:\n source_type = \"local\"\n else:\n source_type = \"web\" # default fallback\n\n converter = get_converter(source_type, config_to_pass)\n if dry_run:\n converter.dry_run = True\n\n result = _run_converter(converter, progress_msg)\n finally:\n # Clean up temporary config\n if unlimited and Path(config_to_use).exists():\n Path(config_to_use).unlink()\n\n return result\n\n\nasync def scrape_pdf_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Scrape PDF documentation and build Claude skill.\n\n Extracts text, code, and images from PDF files and builds\n a skill package with organized references.\n\n Args:\n args: Dictionary containing:\n - config_path (str, optional): Path to PDF config JSON file\n - pdf_path (str, optional): Direct PDF path (alternative to config_path)\n - name (str, optional): Skill name (required with pdf_path)\n - description (str, optional): Skill description\n - from_json (str, optional): Build from extracted JSON file\n\n Returns:\n List[TextContent]: Tool execution results\n \"\"\"\n config_path = args.get(\"config_path\")\n pdf_path = args.get(\"pdf_path\")\n name = args.get(\"name\")\n description = args.get(\"description\")\n from_json = args.get(\"from_json\")\n\n progress_msg = \"📄 Scraping PDF documentation...\\n\\n\"\n\n # Mode 1: Config file\n if config_path:\n with open(config_path) as f:\n pdf_config = json.load(f)\n\n # Mode 2: Direct PDF\n elif pdf_path and name:\n pdf_config = {\"name\": name, \"pdf_path\": pdf_path}\n if description:\n pdf_config[\"description\"] = description\n\n # Mode 3: From JSON — use PDFToSkillConverter.load_extracted_data\n elif from_json:\n from skill_seekers.cli.pdf_scraper import PDFToSkillConverter\n\n # Build a minimal config; name is derived from the JSON filename\n json_name = Path(from_json).stem.replace(\"_extracted\", \"\")\n pdf_config = {\"name\": json_name}\n converter = PDFToSkillConverter(pdf_config)\n converter.load_extracted_data(from_json)\n converter.build_skill()\n return [\n TextContent(\n type=\"text\",\n text=f\"{progress_msg}✅ Skill built from extracted JSON: {from_json}\",\n )\n ]\n\n else:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: Must specify --config, --pdf + --name, or --from-json\",\n )\n ]\n\n from skill_seekers.cli.skill_converter import get_converter\n\n converter = get_converter(\"pdf\", pdf_config)\n return _run_converter(converter, progress_msg)\n\n\nasync def scrape_video_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Scrape video content (YouTube, local files) and build Claude skill.\n\n Extracts transcripts, metadata, and optionally visual content from videos\n to create skills.\n\n Args:\n args: Dictionary containing:\n - url (str, optional): Video URL (YouTube, Vimeo)\n - video_file (str, optional): Local video file path\n - playlist (str, optional): Playlist URL\n - name (str, optional): Skill name\n - description (str, optional): Skill description\n - languages (str, optional): Language preferences (comma-separated)\n - from_json (str, optional): Build from extracted JSON file\n - visual (bool, optional): Enable visual frame extraction (default: False)\n - whisper_model (str, optional): Whisper model size (default: base)\n - visual_interval (float, optional): Seconds between frame captures (default: 5.0)\n - visual_min_gap (float, optional): Minimum seconds between kept frames (default: 2.0)\n - visual_similarity (float, optional): Similarity threshold to skip duplicate frames (default: 0.95)\n - vision_ocr (bool, optional): Use vision model for OCR on frames (default: False)\n - start_time (str, optional): Start time for extraction (seconds, MM:SS, or HH:MM:SS)\n - end_time (str, optional): End time for extraction (seconds, MM:SS, or HH:MM:SS)\n - setup (bool, optional): Auto-detect GPU and install visual extraction deps\n\n Returns:\n List[TextContent]: Tool execution results\n \"\"\"\n # Handle --setup early exit\n if args.get(\"setup\", False):\n from skill_seekers.cli.video_setup import run_setup\n\n rc = run_setup(interactive=False)\n msg = \"Setup completed successfully.\" if rc == 0 else \"Setup failed. Check logs.\"\n return [TextContent(type=\"text\", text=msg)]\n\n url = args.get(\"url\")\n video_file = args.get(\"video_file\")\n playlist = args.get(\"playlist\")\n name = args.get(\"name\")\n description = args.get(\"description\")\n languages = args.get(\"languages\")\n from_json = args.get(\"from_json\")\n visual = args.get(\"visual\", False)\n whisper_model = args.get(\"whisper_model\")\n visual_interval = args.get(\"visual_interval\")\n visual_min_gap = args.get(\"visual_min_gap\")\n visual_similarity = args.get(\"visual_similarity\")\n vision_ocr = args.get(\"vision_ocr\", False)\n start_time = args.get(\"start_time\")\n end_time = args.get(\"end_time\")\n\n # Build config dict for the converter\n video_config: dict = {}\n\n if from_json:\n video_config[\"from_json\"] = from_json\n video_config[\"name\"] = name or Path(from_json).stem.replace(\"_video_extracted\", \"\")\n elif url:\n video_config[\"url\"] = url\n if not name:\n return [TextContent(type=\"text\", text=\"❌ Error: --name is required with --url\")]\n video_config[\"name\"] = name\n elif video_file:\n video_config[\"video_file\"] = video_file\n video_config[\"name\"] = name or Path(video_file).stem\n elif playlist:\n video_config[\"playlist\"] = playlist\n video_config[\"name\"] = name or \"playlist\"\n else:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: Must specify --url, --video-file, --playlist, or --from-json\",\n )\n ]\n\n if description:\n video_config[\"description\"] = description\n if languages:\n video_config[\"languages\"] = languages\n video_config[\"visual\"] = visual\n if whisper_model:\n video_config[\"whisper_model\"] = whisper_model\n if visual_interval is not None:\n video_config[\"visual_interval\"] = visual_interval\n if visual_min_gap is not None:\n video_config[\"visual_min_gap\"] = visual_min_gap\n if visual_similarity is not None:\n video_config[\"visual_similarity\"] = visual_similarity\n video_config[\"vision_ocr\"] = vision_ocr\n if start_time:\n video_config[\"start_time\"] = start_time\n if end_time:\n video_config[\"end_time\"] = end_time\n\n progress_msg = \"🎬 Scraping video content...\\n\\n\"\n\n from skill_seekers.cli.skill_converter import get_converter\n\n converter = get_converter(\"video\", video_config)\n return _run_converter(converter, progress_msg)\n\n\nasync def scrape_github_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Scrape GitHub repository and build Claude skill.\n\n Extracts README, Issues, Changelog, Releases, and code structure\n from GitHub repositories to create comprehensive skills.\n\n Args:\n args: Dictionary containing:\n - repo (str, optional): GitHub repository (owner/repo)\n - config_path (str, optional): Path to GitHub config JSON file\n - name (str, optional): Skill name (default: repo name)\n - description (str, optional): Skill description\n - token (str, optional): GitHub personal access token\n - no_issues (bool, optional): Skip GitHub issues extraction (default: False)\n - no_changelog (bool, optional): Skip CHANGELOG extraction (default: False)\n - no_releases (bool, optional): Skip releases extraction (default: False)\n - max_issues (int, optional): Maximum issues to fetch (default: 100)\n - scrape_only (bool, optional): Only scrape, don't build skill (default: False)\n\n Returns:\n List[TextContent]: Tool execution results\n \"\"\"\n repo = args.get(\"repo\")\n config_path = args.get(\"config_path\")\n name = args.get(\"name\")\n description = args.get(\"description\")\n token = args.get(\"token\")\n no_issues = args.get(\"no_issues\", False)\n no_changelog = args.get(\"no_changelog\", False)\n no_releases = args.get(\"no_releases\", False)\n max_issues = args.get(\"max_issues\", 100)\n scrape_only = args.get(\"scrape_only\", False)\n\n # Build config dict for the converter\n if config_path:\n with open(config_path) as f:\n github_config = json.load(f)\n elif repo:\n github_config: dict = {\"repo\": repo}\n if name:\n github_config[\"name\"] = name\n if description:\n github_config[\"description\"] = description\n if token:\n github_config[\"token\"] = token\n if no_issues:\n github_config[\"no_issues\"] = True\n if no_changelog:\n github_config[\"no_changelog\"] = True\n if no_releases:\n github_config[\"no_releases\"] = True\n if max_issues != 100:\n github_config[\"max_issues\"] = max_issues\n if scrape_only:\n github_config[\"scrape_only\"] = True\n else:\n return [TextContent(type=\"text\", text=\"❌ Error: Must specify --repo or --config\")]\n\n progress_msg = \"🐙 Scraping GitHub repository...\\n\\n\"\n\n from skill_seekers.cli.skill_converter import get_converter\n\n converter = get_converter(\"github\", github_config)\n return _run_converter(converter, progress_msg)\n\n\nasync def scrape_codebase_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Analyze local codebase and extract code knowledge.\n\n Walks directory tree, analyzes code files, extracts signatures,\n docstrings, and generates API reference documentation, dependency graphs,\n design patterns, test examples, and how-to guides.\n\n All features are ON by default. Use skip_* parameters to disable specific features.\n\n Args:\n args: Dictionary containing:\n - directory (str): Directory to analyze\n - output (str, optional): Output directory for results (default: output/codebase/)\n - depth (str, optional): Analysis depth - surface, deep, full (default: deep)\n - languages (str, optional): Comma-separated languages (e.g., \"Python,JavaScript,C++\")\n - file_patterns (str, optional): Comma-separated file patterns (e.g., \"*.py,src/**/*.js\")\n - enhance_level (int, optional): AI enhancement level 0-3 (default: 0)\n - 0: No AI enhancement\n - 1: SKILL.md enhancement only\n - 2: SKILL.md + Architecture + Config enhancement\n - 3: Full enhancement (patterns, tests, config, architecture, SKILL.md)\n - skip_api_reference (bool, optional): Skip API reference generation (default: False)\n - skip_dependency_graph (bool, optional): Skip dependency graph (default: False)\n - skip_patterns (bool, optional): Skip design pattern detection (default: False)\n - skip_test_examples (bool, optional): Skip test example extraction (default: False)\n - skip_how_to_guides (bool, optional): Skip how-to guide generation (default: False)\n - skip_config_patterns (bool, optional): Skip config pattern extraction (default: False)\n - skip_docs (bool, optional): Skip project documentation extraction (default: False)\n\n Returns:\n List[TextContent]: Tool execution results\n\n Example:\n scrape_codebase(\n directory=\"/path/to/repo\",\n depth=\"deep\",\n enhance_level=1\n )\n scrape_codebase(\n directory=\"/path/to/repo\",\n enhance_level=2,\n skip_patterns=True\n )\n \"\"\"\n directory = args.get(\"directory\")\n if not directory:\n return [TextContent(type=\"text\", text=\"❌ Error: directory parameter is required\")]\n\n output_dir = args.get(\"output\", \"output/codebase/\")\n depth = args.get(\"depth\", \"deep\")\n languages = args.get(\"languages\", \"\")\n file_patterns = args.get(\"file_patterns\", \"\")\n enhance_level = args.get(\"enhance_level\", 0)\n\n # Skip flags (features are ON by default)\n skip_api_reference = args.get(\"skip_api_reference\", False)\n skip_dependency_graph = args.get(\"skip_dependency_graph\", False)\n skip_patterns = args.get(\"skip_patterns\", False)\n skip_test_examples = args.get(\"skip_test_examples\", False)\n skip_how_to_guides = args.get(\"skip_how_to_guides\", False)\n skip_config_patterns = args.get(\"skip_config_patterns\", False)\n skip_docs = args.get(\"skip_docs\", False)\n\n # Derive a name from the directory for the converter\n dir_name = Path(directory).resolve().name or \"codebase\"\n\n # Build config dict for CodebaseAnalyzer\n codebase_config: dict = {\n \"name\": dir_name,\n \"directory\": directory,\n \"output_dir\": output_dir,\n \"depth\": depth,\n \"enhance_level\": enhance_level,\n \"build_api_reference\": not skip_api_reference,\n \"build_dependency_graph\": not skip_dependency_graph,\n \"detect_patterns\": not skip_patterns,\n \"extract_test_examples\": not skip_test_examples,\n \"build_how_to_guides\": not skip_how_to_guides,\n \"extract_config_patterns\": not skip_config_patterns,\n \"extract_docs\": not skip_docs,\n }\n if languages:\n codebase_config[\"languages\"] = languages\n if file_patterns:\n codebase_config[\"file_patterns\"] = file_patterns\n\n level_names = {0: \"off\", 1: \"SKILL.md only\", 2: \"standard\", 3: \"full\"}\n progress_msg = \"🔍 Analyzing local codebase...\\n\"\n progress_msg += f\"📁 Directory: {directory}\\n\"\n progress_msg += f\"📊 Depth: {depth}\\n\"\n if enhance_level > 0:\n progress_msg += f\"🤖 AI Enhancement: Level {enhance_level} ({level_names.get(enhance_level, 'unknown')})\\n\"\n progress_msg += \"\\n\"\n\n from skill_seekers.cli.skill_converter import get_converter\n\n converter = get_converter(\"local\", codebase_config)\n return _run_converter(converter, progress_msg)\n\n\nasync def detect_patterns_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Detect design patterns in source code.\n\n Analyzes source files or directories to detect common design patterns\n (Singleton, Factory, Observer, Strategy, Decorator, Builder, Adapter,\n Command, Template Method, Chain of Responsibility).\n\n Supports 9 languages: Python, JavaScript, TypeScript, C++, C, C#,\n Go, Rust, Java, Ruby, PHP.\n\n Args:\n args: Dictionary containing:\n - file (str, optional): Single file to analyze\n - directory (str, optional): Directory to analyze (analyzes all source files)\n - output (str, optional): Output directory for JSON results\n - depth (str, optional): Detection depth - surface, deep, full (default: deep)\n - json (bool, optional): Output JSON format (default: False)\n\n Returns:\n List[TextContent]: Pattern detection results\n\n Example:\n detect_patterns(file=\"src/database.py\", depth=\"deep\")\n detect_patterns(directory=\"src/\", output=\"patterns/\", json=True)\n \"\"\"\n file_path = args.get(\"file\")\n directory = args.get(\"directory\")\n\n if not file_path and not directory:\n return [\n TextContent(\n type=\"text\", text=\"❌ Error: Must specify either 'file' or 'directory' parameter\"\n )\n ]\n\n output = args.get(\"output\", \"\")\n depth = args.get(\"depth\", \"deep\")\n json_output = args.get(\"json\", False)\n\n # Build command\n cmd = [sys.executable, \"-m\", \"skill_seekers.cli.pattern_recognizer\"]\n\n if file_path:\n cmd.extend([\"--file\", file_path])\n if directory:\n cmd.extend([\"--directory\", directory])\n if output:\n cmd.extend([\"--output\", output])\n if depth:\n cmd.extend([\"--depth\", depth])\n if json_output:\n cmd.append(\"--json\")\n\n timeout = 300 # 5 minutes for pattern detection\n\n progress_msg = \"🔍 Detecting design patterns...\\n\"\n if file_path:\n progress_msg += f\"📄 File: {file_path}\\n\"\n if directory:\n progress_msg += f\"📁 Directory: {directory}\\n\"\n progress_msg += f\"🎯 Detection depth: {depth}\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output_text = progress_msg + stdout\n\n if returncode == 0:\n return [TextContent(type=\"text\", text=output_text)]\n else:\n return [TextContent(type=\"text\", text=f\"{output_text}\\n\\n❌ Error:\\n{stderr}\")]\n\n\nasync def extract_test_examples_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Extract usage examples from test files.\n\n Analyzes test files to extract real API usage patterns including:\n - Object instantiation with real parameters\n - Method calls with expected behaviors\n - Configuration examples\n - Setup patterns from fixtures/setUp()\n - Multi-step workflows from integration tests\n\n Supports 9 languages: Python (AST-based deep analysis), JavaScript,\n TypeScript, Go, Rust, Java, C#, PHP, Ruby (regex-based).\n\n Args:\n args: Dictionary containing:\n - file (str, optional): Single test file to analyze\n - directory (str, optional): Directory containing test files\n - language (str, optional): Filter by language (python, javascript, etc.)\n - min_confidence (float, optional): Minimum confidence threshold 0.0-1.0 (default: 0.5)\n - max_per_file (int, optional): Maximum examples per file (default: 10)\n - json (bool, optional): Output JSON format (default: False)\n - markdown (bool, optional): Output Markdown format (default: False)\n\n Returns:\n List[TextContent]: Extracted test examples\n\n Example:\n extract_test_examples(directory=\"tests/\", language=\"python\")\n extract_test_examples(file=\"tests/test_scraper.py\", json=True)\n \"\"\"\n file_path = args.get(\"file\")\n directory = args.get(\"directory\")\n\n if not file_path and not directory:\n return [\n TextContent(\n type=\"text\", text=\"❌ Error: Must specify either 'file' or 'directory' parameter\"\n )\n ]\n\n language = args.get(\"language\", \"\")\n min_confidence = args.get(\"min_confidence\", 0.5)\n max_per_file = args.get(\"max_per_file\", 10)\n json_output = args.get(\"json\", False)\n markdown_output = args.get(\"markdown\", False)\n\n # Build command\n cmd = [sys.executable, \"-m\", \"skill_seekers.cli.test_example_extractor\"]\n\n if directory:\n cmd.append(directory)\n if file_path:\n cmd.extend([\"--file\", file_path])\n if language:\n cmd.extend([\"--language\", language])\n if min_confidence:\n cmd.extend([\"--min-confidence\", str(min_confidence)])\n if max_per_file:\n cmd.extend([\"--max-per-file\", str(max_per_file)])\n if json_output:\n cmd.append(\"--json\")\n if markdown_output:\n cmd.append(\"--markdown\")\n\n timeout = 180 # 3 minutes for test example extraction\n\n progress_msg = \"🧪 Extracting usage examples from test files...\\n\"\n if file_path:\n progress_msg += f\"📄 File: {file_path}\\n\"\n if directory:\n progress_msg += f\"📁 Directory: {directory}\\n\"\n if language:\n progress_msg += f\"🔤 Language: {language}\\n\"\n progress_msg += f\"🎯 Min confidence: {min_confidence}\\n\"\n progress_msg += f\"📊 Max per file: {max_per_file}\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output_text = progress_msg + stdout\n\n if returncode == 0:\n return [TextContent(type=\"text\", text=output_text)]\n else:\n return [TextContent(type=\"text\", text=f\"{output_text}\\n\\n❌ Error:\\n{stderr}\")]\n\n\nasync def build_how_to_guides_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Build how-to guides from workflow test examples.\n\n Transforms workflow examples extracted from test files into step-by-step\n educational guides. Automatically groups related workflows, extracts steps,\n and generates comprehensive markdown guides.\n\n Features:\n - Python AST-based step extraction (heuristic for other languages)\n - 4 grouping strategies: ai-tutorial-group, file-path, test-name, complexity\n - Detects prerequisites, setup code, and verification points\n - Generates troubleshooting tips and next steps\n - Creates index with difficulty levels\n\n Args:\n args: Dictionary containing:\n - input (str): Path to test_examples.json from extract_test_examples\n - output (str, optional): Output directory for guides (default: output/codebase/tutorials)\n - group_by (str, optional): Grouping strategy - ai-tutorial-group, file-path, test-name, complexity\n - no_ai (bool, optional): Disable AI enhancement for grouping (default: False)\n - json_output (bool, optional): Output JSON format alongside markdown (default: False)\n\n Returns:\n List[TextContent]: Guide building results\n\n Example:\n build_how_to_guides(\n input=\"output/codebase/test_examples/test_examples.json\",\n group_by=\"ai-tutorial-group\",\n output=\"output/codebase/tutorials\"\n )\n \"\"\"\n input_file = args.get(\"input\")\n if not input_file:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: input parameter is required (path to test_examples.json)\",\n )\n ]\n\n output = args.get(\"output\", \"output/codebase/tutorials\")\n group_by = args.get(\"group_by\", \"ai-tutorial-group\")\n no_ai = args.get(\"no_ai\", False)\n json_output = args.get(\"json_output\", False)\n\n # Build command\n cmd = [sys.executable, \"-m\", \"skill_seekers.cli.how_to_guide_builder\"]\n cmd.append(input_file)\n\n if output:\n cmd.extend([\"--output\", output])\n if group_by:\n cmd.extend([\"--group-by\", group_by])\n if no_ai:\n cmd.append(\"--no-ai\")\n if json_output:\n cmd.append(\"--json-output\")\n\n timeout = 180 # 3 minutes for guide building\n\n progress_msg = \"📚 Building how-to guides from workflow examples...\\n\"\n progress_msg += f\"📄 Input: {input_file}\\n\"\n progress_msg += f\"📁 Output: {output}\\n\"\n progress_msg += f\"🔀 Grouping: {group_by}\\n\"\n if no_ai:\n progress_msg += \"🚫 AI enhancement disabled\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output_text = progress_msg + stdout\n\n if returncode == 0:\n return [TextContent(type=\"text\", text=output_text)]\n else:\n return [TextContent(type=\"text\", text=f\"{output_text}\\n\\n❌ Error:\\n{stderr}\")]\n\n\nasync def extract_config_patterns_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Extract configuration patterns from config files (C3.4).\n\n Analyzes configuration files in the codebase to extract settings,\n detect common patterns (database, API, logging, cache, etc.), and\n generate comprehensive documentation.\n\n Supports 9 config formats: JSON, YAML, TOML, ENV, INI, Python modules,\n JavaScript/TypeScript configs, Dockerfile, Docker Compose.\n\n Detects 7 common patterns:\n - Database configuration (host, port, credentials)\n - API configuration (endpoints, keys, timeouts)\n - Logging configuration (level, format, handlers)\n - Cache configuration (backend, TTL, keys)\n - Email configuration (SMTP, credentials)\n - Authentication configuration (providers, secrets)\n - Server configuration (host, port, workers)\n\n Args:\n args: Dictionary containing:\n - directory (str): Directory to analyze\n - output (str, optional): Output directory (default: output/codebase/config_patterns)\n - max_files (int, optional): Maximum config files to process (default: 100)\n - enhance (bool, optional): Enable AI enhancement - API mode (default: False, requires ANTHROPIC_API_KEY)\n - enhance_local (bool, optional): Enable AI enhancement - LOCAL mode (default: False, uses Claude Code CLI)\n - ai_mode (str, optional): AI mode - auto, api, local, none (default: none)\n - json (bool, optional): Output JSON format (default: True)\n - markdown (bool, optional): Output Markdown format (default: True)\n\n Returns:\n List[TextContent]: Config extraction results with optional AI enhancements\n\n Example:\n extract_config_patterns(directory=\".\", output=\"output/configs\")\n extract_config_patterns(directory=\"/path/to/repo\", max_files=50, enhance_local=True)\n \"\"\"\n directory = args.get(\"directory\")\n if not directory:\n return [TextContent(type=\"text\", text=\"❌ Error: directory parameter is required\")]\n\n output = args.get(\"output\", \"output/codebase/config_patterns\")\n max_files = args.get(\"max_files\", 100)\n enhance = args.get(\"enhance\", False)\n enhance_local = args.get(\"enhance_local\", False)\n ai_mode = args.get(\"ai_mode\", \"none\")\n json_output = args.get(\"json\", True)\n markdown_output = args.get(\"markdown\", True)\n\n # Build command\n cmd = [sys.executable, \"-m\", \"skill_seekers.cli.config_extractor\"]\n cmd.extend([\"--directory\", directory])\n\n if output:\n cmd.extend([\"--output\", output])\n if max_files:\n cmd.extend([\"--max-files\", str(max_files)])\n if enhance:\n cmd.append(\"--enhance\")\n if enhance_local:\n cmd.append(\"--enhance-local\")\n if ai_mode and ai_mode != \"none\":\n cmd.extend([\"--ai-mode\", ai_mode])\n if json_output:\n cmd.append(\"--json\")\n if markdown_output:\n cmd.append(\"--markdown\")\n\n # Adjust timeout for AI enhancement\n timeout = 180 # 3 minutes base\n if enhance or enhance_local or ai_mode != \"none\":\n timeout = 360 # 6 minutes with AI enhancement\n\n progress_msg = \"⚙️ Extracting configuration patterns...\\n\"\n progress_msg += f\"📁 Directory: {directory}\\n\"\n progress_msg += f\"📄 Max files: {max_files}\\n\"\n if enhance or enhance_local or (ai_mode and ai_mode != \"none\"):\n progress_msg += f\"🤖 AI enhancement: {ai_mode if ai_mode != 'none' else ('api' if enhance else 'local')}\\n\"\n progress_msg += f\"⏱️ Maximum time: {timeout // 60} minutes\\n\\n\"\n\n stdout, stderr, returncode = run_subprocess_with_streaming(cmd, timeout=timeout)\n\n output_text = progress_msg + stdout\n\n if returncode == 0:\n return [TextContent(type=\"text\", text=output_text)]\n else:\n return [TextContent(type=\"text\", text=f\"{output_text}\\n\\n❌ Error:\\n{stderr}\")]\n\n\n# Valid source types for the generic scraper\nGENERIC_SOURCE_TYPES = (\n \"jupyter\",\n \"html\",\n \"openapi\",\n \"asciidoc\",\n \"pptx\",\n \"confluence\",\n \"notion\",\n \"rss\",\n \"manpage\",\n \"chat\",\n)\n\n# Mapping from source type to the CLI flag used for the primary input argument.\n# URL-based types use --url; file/path-based types use --path.\n_URL_BASED_TYPES = {\"confluence\", \"notion\", \"rss\"}\n\n# Friendly emoji labels per source type\n_SOURCE_EMOJIS = {\n \"jupyter\": \"📓\",\n \"html\": \"🌐\",\n \"openapi\": \"📡\",\n \"asciidoc\": \"📄\",\n \"pptx\": \"📊\",\n \"confluence\": \"🏢\",\n \"notion\": \"📝\",\n \"rss\": \"📰\",\n \"manpage\": \"📖\",\n \"chat\": \"💬\",\n}\n\n\nasync def scrape_generic_tool(args: dict) -> list[TextContent]:\n \"\"\"\n Generic scraper for new source types.\n\n Handles all 10 new source types by building the appropriate subprocess\n command and delegating to the corresponding CLI scraper module.\n\n Supported source types: jupyter, html, openapi, asciidoc, pptx,\n confluence, notion, rss, manpage, chat.\n\n Args:\n args: Dictionary containing:\n - source_type (str): One of the supported source types\n - path (str, optional): File or directory path (for file-based sources)\n - url (str, optional): URL (for URL-based sources like confluence, notion, rss)\n - name (str): Skill name for the output\n\n Returns:\n List[TextContent]: Tool execution results\n \"\"\"\n source_type = args.get(\"source_type\", \"\")\n path = args.get(\"path\")\n url = args.get(\"url\")\n name = args.get(\"name\")\n\n # Validate source_type\n if source_type not in GENERIC_SOURCE_TYPES:\n return [\n TextContent(\n type=\"text\",\n text=(\n f\"❌ Error: Unknown source_type '{source_type}'. \"\n f\"Must be one of: {', '.join(GENERIC_SOURCE_TYPES)}\"\n ),\n )\n ]\n\n # Validate that we have either path or url\n if not path and not url:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: Must specify either 'path' (file/directory) or 'url'\",\n )\n ]\n\n if not name:\n return [\n TextContent(\n type=\"text\",\n text=\"❌ Error: 'name' parameter is required\",\n )\n ]\n\n # Build config dict for the converter — map MCP args to the keys\n # each converter expects in its __init__.\n _CONFIG_KEY: dict[str, str] = {\n \"jupyter\": \"notebook_path\",\n \"html\": \"html_path\",\n \"openapi\": \"spec_path\",\n \"asciidoc\": \"asciidoc_path\",\n \"pptx\": \"pptx_path\",\n \"manpage\": \"man_path\",\n \"confluence\": \"export_path\",\n \"notion\": \"export_path\",\n \"rss\": \"feed_path\",\n \"chat\": \"export_path\",\n }\n _URL_CONFIG_KEY: dict[str, str] = {\n \"confluence\": \"base_url\",\n \"notion\": \"page_id\",\n \"rss\": \"feed_url\",\n \"openapi\": \"spec_url\",\n }\n\n config: dict = {\"name\": name}\n\n if source_type in _URL_BASED_TYPES and url:\n config[_URL_CONFIG_KEY.get(source_type, \"url\")] = url\n elif path:\n config[_CONFIG_KEY.get(source_type, \"path\")] = path\n elif url:\n config[_URL_CONFIG_KEY.get(source_type, \"url\")] = url\n\n emoji = _SOURCE_EMOJIS.get(source_type, \"🔧\")\n progress_msg = f\"{emoji} Scraping {source_type} source...\\n\"\n if path:\n progress_msg += f\"📁 Path: {path}\\n\"\n if url:\n progress_msg += f\"🔗 URL: {url}\\n\"\n progress_msg += f\"📛 Name: {name}\\n\\n\"\n\n from skill_seekers.cli.skill_converter import get_converter\n\n converter = get_converter(source_type, config)\n return _run_converter(converter, progress_msg)\n",
"sha256": "0073daae89b191d907fb080daf78f044d55d6890a8c929e7dcdc10c9ff19a735"
},
".github/skills/auto-tmux/assets/oh-my-tmux": {
"mode": "120000",
"encoding": "utf-8",
"data": "../../../tools/external/.tmux",
"sha256": "dbf4ed04f7cb24b681ce652bfda4daaa5ebf3a7adcf6737fb1e96e1b33028744"
},
".github/skills/auto-tmux/assets/tmux-src": {
"mode": "120000",
"encoding": "utf-8",
"data": "../../../tools/external/tmux",
"sha256": "a8726831a2fb948341a0a650689ceac80b10689f345502c8c291e45373fde129"
},
".gitmodules": {
"mode": "100644",
"encoding": "utf-8",
"data": "[submodule \"tools/external/.tmux\"]\n\tpath = .github/tools/external/.tmux\n\turl = https://github.com/gpakosz/.tmux.git\n[submodule \"tools/external/tmux\"]\n\tpath = .github/tools/external/tmux\n\turl = https://github.com/tmux/tmux.git\n[submodule \"tools/external/claude-official-skills\"]\n\tpath = .github/tools/external/claude-official-skills\n\turl = https://github.com/anthropics/skills.git\n[submodule \"tools/external/Skill_Seekers-development\"]\n\tpath = .github/tools/external/Skill_Seekers-development\n\turl = https://github.com/yusufkaraaslan/Skill_Seekers.git\n",
"sha256": "068c1b0ead3390e7ea9144656fa4606697a4e81ec9f8d20adc78de4560690f0d"
},
".github/assets/external-resources/tools-platforms.yml": {
"mode": "100644",
"encoding": "utf-8",
"data": "# Generated from assets_csv.xlsx and later curated imports. Edit intentionally and keep schema.yml in sync.\nversion: 1\ncategory:\n id: tools-platforms\n name: 工具与平台\n description: 用于收录大模型、AI 对话平台、IDE、CLI、Agent 平台、通用工具网站等\n default_resource_type: tool_or_platform\ndefaults:\n imported_from: assets_csv.xlsx\n imported_at: '2026-07-03'\n verification_status: imported-unverified\n license: unknown\nresources:\n- id: tools-platforms-codex-cli-362bc20a\n name: Codex CLI\n description: 唯一推荐的苹果级工具,世界最强最强大模型(编码任务瞬秒其他全部的安卓级工具,.codex配置文件和系统提示词 https://github.com/tukuaiai/vibe-coding-cn/tree/main/.github/tools/config/.codex)\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://chatgpt.com/codex\n domain: chatgpt.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 2\n- id: tools-platforms-prompt-jsonl-8e9b2066\n name: prompt_jsonl\n description: 超级提示词资产在线表格\n resource_type: tool_or_platform\n link:\n kind: internal_reference\n locator: prompt_jsonl\n status: needs-review\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - non-url-locator\n source_row: 3\n- id: tools-platforms-apps-script-e6b8bbbb\n name: Apps Script\n description: Google 脚本\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://script.google.com/\n domain: script.google.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 4\n- id: tools-platforms-bilibili-23287176\n name: Bilibili\n description: 视频教程\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.bilibili.com/\n domain: www.bilibili.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 5\n- id: tools-platforms-claude-opus-4-6-f751380c\n name: Claude Opus 4.6\n description: 工具使用能力强,agent类任务首选\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://claude.ai/\n domain: claude.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 6\n- id: tools-platforms-droid-1b66f6e0\n name: Droid\n description: 多模型 CLI 访问\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://factory.ai/\n domain: factory.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 7\n- id: tools-platforms-gpt-5-1-codex-1ad522a5\n name: GPT-5.1 Codex\n description: 复杂逻辑处理\n resource_type: tool_or_platform\n link:\n kind: missing\n status: needs-review\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - missing-link\n source_row: 8\n- id: tools-platforms-gemini-2-5-pro-0661c69f\n name: Gemini 2.5 Pro\n description: 免费长上下文\n resource_type: tool_or_platform\n link:\n kind: missing\n status: needs-review\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - missing-link\n source_row: 9\n- id: tools-platforms-google-sheets-32b827b0\n name: Google Sheets\n description: 在线表格\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://docs.google.com/spreadsheets/\n domain: docs.google.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 10\n- id: tools-platforms-local-history-2b05b2c1\n name: Local History\n description: VS Code 本地历史插件\n resource_type: tool_or_platform\n link:\n kind: missing\n status: needs-review\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - missing-link\n source_row: 11\n- id: tools-platforms-mermaid-chart-302f49f0\n name: Mermaid Chart\n description: 文本转图表\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.mermaidchart.com/\n domain: www.mermaidchart.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 12\n- id: tools-platforms-partial-diff-4787875c\n name: Partial Diff\n description: VS Code 差异对比插件\n resource_type: tool_or_platform\n link:\n kind: missing\n status: needs-review\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - missing-link\n source_row: 13\n- id: tools-platforms-z-library-31b0d982\n name: Z-Library\n description: 电子书资源\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://z-lib.fm/\n domain: z-lib.fm\n access_review: required\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - access-legality-review\n source_row: 14\n- id: tools-platforms-docusaurus-09c54423\n name: Docusaurus\n description: Meta 开源文档框架\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://docusaurus.io/\n domain: docusaurus.io\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 15\n- id: tools-platforms-mintlify-0f0b6833\n name: Mintlify\n description: AI 文档生成\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://mintlify.com/\n domain: mintlify.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 16\n- id: tools-platforms-vitepress-da10a919\n name: VitePress\n description: Vue 驱动静态站点\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://vitepress.dev/\n domain: vitepress.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 17\n- id: tools-platforms-zread-6c1ee1d6\n name: Zread\n description: AI 仓库阅读工具\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://zread.ai/\n domain: zread.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 18\n- id: tools-platforms-lazyvim-2f22a781\n name: LazyVim\n description: Neovim 配置框架\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.lazyvim.org/\n domain: www.lazyvim.org\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 19\n- id: tools-platforms-neovim-a8b85739\n name: Neovim\n description: 键盘流首选\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://neovim.io/\n domain: neovim.io\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 20\n- id: tools-platforms-pearai-0683754c\n name: PearAI\n description: 开源 AI IDE\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://trypear.ai/\n domain: trypear.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 21\n- id: tools-platforms-vs-code-e8f2d385\n name: VS Code\n description: 主流编辑器\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://code.visualstudio.com/\n domain: code.visualstudio.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 22\n- id: tools-platforms-void-b1594346\n name: Void\n description: 开源 AI 代码编辑器\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://voideditor.com/\n domain: voideditor.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 23\n- id: tools-platforms-django-e05156b6\n name: Django\n description: Python 全栈 Web 框架\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.djangoproject.com/\n domain: www.djangoproject.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 24\n- id: tools-platforms-excalidraw-02ba0cb2\n name: Excalidraw\n description: 手绘风格图表\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://excalidraw.com/\n domain: excalidraw.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 25\n- id: tools-platforms-mermaid-cc6f6e7e\n name: Mermaid\n description: 文本转图表\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://mermaid.js.org/\n domain: mermaid.js.org\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 26\n- id: tools-platforms-notebooklm-e1b56ba1\n name: NotebookLM\n description: AI 笔记工具\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://notebooklm.google.com/\n domain: notebooklm.google.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 27\n- id: tools-platforms-dbeaver-aa2fc821\n name: DBeaver\n description: 通用数据库客户端\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://dbeaver.io/\n domain: dbeaver.io\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 28\n- id: tools-platforms-tableplus-9950f31a\n name: TablePlus\n description: 现代数据库 GUI\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://tableplus.com/\n domain: tableplus.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 29\n- id: tools-platforms-warp-14bec77a\n name: Warp\n description: AI 终端\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.warp.dev/\n domain: www.warp.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 30\n- id: tools-platforms-zsh-d6d24951\n name: zsh\n description: Shell 增强\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://ohmyz.sh/\n domain: ohmyz.sh\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 31\n- id: tools-platforms-claude-code-11b1e88d\n name: Claude Code\n description: Anthropic 官方 CLI\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://code.claude.com/docs/en/overview\n domain: code.claude.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 32\n- id: tools-platforms-gemini-cli-d077e5cc\n name: Gemini CLI\n description: Google 官方 CLI\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://geminicli.com/\n domain: geminicli.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 33\n- id: tools-platforms-opencode-ada070db\n name: OpenCode\n description: 开源终端 AI 助手,Go 编写\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://opencode.ai/\n domain: opencode.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 34\n- id: tools-platforms-kimi-53c18eae\n name: Kimi\n description: Kimi K2.5 / 长文本处理强\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://kimi.moonshot.cn/\n domain: kimi.moonshot.cn\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 35\n- id: tools-platforms-chatglm-cn-ebc410ba\n name: 智谱清言\n description: GLM-4 / 智谱 AI 出品\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://chatglm.cn/\n domain: chatglm.cn\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 36\n- id: tools-platforms-www-doubao-com-b4d6c78b\n name: 豆包\n description: 豆包 / 字节出品\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.doubao.com/\n domain: www.doubao.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 37\n- id: tools-platforms-tongyi-aliyun-com-a528848f\n name: 通义千问\n description: Qwen / 阿里出品,免费\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://tongyi.aliyun.com/\n domain: tongyi.aliyun.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 38\n- id: tools-platforms-ai-studio-2cd869be\n name: AI Studio\n description: Google 免费 Gemini\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://aistudio.google.com/\n domain: aistudio.google.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 39\n- id: tools-platforms-gemini-cli-row40-d077e5cc\n name: Gemini CLI\n description: 免费命令行访问\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://geminicli.com/\n domain: geminicli.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 40\n- id: tools-platforms-qwen-cli-a1b92a34\n name: Qwen CLI\n description: 阿里免费 CLI\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://qwenlm.github.io/qwen-code-docs/zh/cli/\n domain: qwenlm.github.io\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 41\n- id: tools-platforms-antigravity-528a772a\n name: antigravity\n description: Google 免费 AI 服务\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://antigravity.google/\n domain: antigravity.google\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 42\n- id: tools-platforms-bito-0c0619b5\n name: Bito\n description: 免费 AI 代码助手\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://bito.ai/\n domain: bito.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 43\n- id: tools-platforms-codeium-668488a9\n name: Codeium\n description: 免费 AI 代码补全\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://codeium.com/\n domain: codeium.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 44\n- id: tools-platforms-continue-edb7b3bf\n name: Continue\n description: 开源 AI 代码助手\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://continue.dev/\n domain: continue.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 45\n- id: tools-platforms-tabnine-0b2c09aa\n name: Tabnine\n description: 免费基础版\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.tabnine.com/\n domain: www.tabnine.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 46\n- id: tools-platforms-chatgpt-935111f5\n name: ChatGPT\n description: GPT-5.1 / 综合能力强,支持 Codex\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://chatgpt.com/\n domain: chatgpt.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 47\n- id: tools-platforms-claude-13dd5e3a\n name: Claude\n description: Claude Opus 4.6 / 代码能力强,支持 Artifacts\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://claude.ai/\n domain: claude.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 48\n- id: tools-platforms-gemini-dc8a36f7\n name: Gemini\n description: Gemini 3.0 Pro / 免费额度大,支持长上下文\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://gemini.google.com/\n domain: gemini.google.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 49\n- id: tools-platforms-dall-e-3-26dc583b\n name: DALL-E 3\n description: DALL-E 3\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://chatgpt.com/\n domain: chatgpt.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 50\n- id: tools-platforms-elevenlabs-5a58d635\n name: ElevenLabs\n description: ElevenLabs\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://elevenlabs.io/\n domain: elevenlabs.io\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 51\n- id: tools-platforms-ideogram-efb6a3b8\n name: Ideogram\n description: Ideogram\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://ideogram.ai/\n domain: ideogram.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 52\n- id: tools-platforms-kling-253d44f3\n name: Kling\n description: Kling\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://klingai.com/\n domain: klingai.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 53\n- id: tools-platforms-leonardo-ai-26816634\n name: Leonardo AI\n description: Leonardo AI\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://leonardo.ai/\n domain: leonardo.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 54\n- id: tools-platforms-meshy-549051bc\n name: Meshy\n description: Meshy\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.meshy.ai/\n domain: www.meshy.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 55\n- id: tools-platforms-midjourney-976ad67d\n name: Midjourney\n description: Midjourney\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://midjourney.com/\n domain: midjourney.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 56\n- id: tools-platforms-runway-6c8ab136\n name: Runway\n description: Runway\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://runwayml.com/\n domain: runwayml.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 57\n- id: tools-platforms-sora-3b1d49f7\n name: Sora\n description: Sora\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://sora.com/\n domain: sora.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 58\n- id: tools-platforms-suno-fb9344c5\n name: Suno\n description: Suno\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://suno.ai/\n domain: suno.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 59\n- id: tools-platforms-udio-0d39f909\n name: Udio\n description: Udio\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.udio.com/\n domain: www.udio.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 60\n- id: tools-platforms-cursor-8ebf3977\n name: Cursor\n description: AI 原生编辑器,基于 VS Code\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://cursor.com/\n domain: cursor.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 61\n- id: tools-platforms-kiro-47d2b0fc\n name: Kiro\n description: AWS 出品,免费 Claude Opus\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://kiro.dev/\n domain: kiro.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 62\n- id: tools-platforms-windsurf-fdd489a7\n name: Windsurf\n description: Codeium 出品\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://windsurf.com/\n domain: windsurf.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 63\n- id: tools-platforms-zed-07b4820e\n name: Zed\n description: 高性能编辑器,支持 AI\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://zed.dev/\n domain: zed.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 64\n- id: tools-platforms-bolt-new-06379d16\n name: Bolt.new\n description: 浏览器内全栈应用构建\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://bolt.new/\n domain: bolt.new\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 65\n- id: tools-platforms-devin-f5a69caf\n name: Devin\n description: 自主 AI 软件工程师,$20/月\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://devin.ai/\n domain: devin.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 66\n- id: tools-platforms-lovable-5eb584a1\n name: Lovable\n description: 原 GPT Engineer,自然语言建应用\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://lovable.dev/\n domain: lovable.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 67\n- id: tools-platforms-replit-agent-bbd1c2ac\n name: Replit Agent\n description: 端到端应用构建 Agent\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://replit.com/\n domain: replit.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 68\n- id: tools-platforms-v0-by-vercel-fe818ef0\n name: v0 by Vercel\n description: AI UI 生成,React + Tailwind\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://v0.dev/\n domain: v0.dev\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 69\n- id: tools-platforms-chatgpt-exporter-a03efe97\n name: ChatGPT Exporter\n description: ChatGPT 对话导出工具;本次 Markdown 导出文件的来源工具。\n resource_type: tool_or_platform\n link:\n kind: external_url\n url: https://www.chatgptexporter.com\n domain: www.chatgptexporter.com\n status: active\n verification_status: imported-unverified\n tags:\n - chatgpt\n - export\n risk_flags: []\n source_row: 166\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n",
"sha256": "07d51650bb219a071dd95c7e70bd30c6e8e247c660c457ddb268f0a0fedac351"
},
".github/assets/external-resources/repo-rules-scaffolds.yml": {
"mode": "100644",
"encoding": "utf-8",
"data": "# Generated from assets_csv.xlsx and later curated imports. Edit intentionally and keep schema.yml in sync.\nversion: 1\ncategory:\n id: repo-rules-scaffolds\n name: 仓库规则脚手架\n description: 用于收录 GitHub 仓库、Rules/规则文件集合、项目脚手架/模板\n default_resource_type: repository_rule_or_scaffold\ndefaults:\n imported_from: assets_csv.xlsx\n imported_at: '2026-07-03'\n verification_status: imported-unverified\n license: unknown\nresources:\n- id: repo-rules-scaffolds-vibe-coding-e16848e0\n name: Vibe Coding 指南\n description: 中文 Vibe Coding 主线仓库,覆盖 Prompt、Skill、Context、Quality Gate、Git、测试、CI 等完整 AI 编程闭环。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/tradecatlabs/vibe-coding-cn\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 2\n notes: Canonical owner updated from ChatGPT-中文Vibe Coding仓库 (2).md; source line 34.\n- id: repo-rules-scaffolds-scientific-skills-0f3f6b96\n name: scientific-skills\n description: 一套可直接使用的代理技能,适用于研究、科学、工程、分析、金融和写作\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/K-Dense-AI/claude-scientific-skills\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 3\n- id: repo-rules-scaffolds-github-e755441d\n name: GitHub\n description: 代码托管,远程仓库备份和共享你的代码,再也不怕ai删仓库了\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 4\n- id: repo-rules-scaffolds-github-com-e0a40b2e\n name: 开发者基础知识库\n description: 这是一份(主要)技术性知识的集合,每个软件开发人员都应该了解这些知识。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/mtdvio/every-programmer-should-know\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 5\n- id: repo-rules-scaffolds-mcaf-47f07717\n name: MCAF\n description: AI 编程框架,定义 AGENTS.md 规范\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://mcaf.managed-code.com/\n domain: mcaf.managed-code.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 6\n- id: repo-rules-scaffolds-autogen-fc00be5e\n name: autogen\n description: 多 Agent 对话框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/microsoft/autogen\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 7\n- id: repo-rules-scaffolds-browser-use-268f0f95\n name: browser-use\n description: AI 浏览器自动化\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/browser-use/browser-use\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 8\n- id: repo-rules-scaffolds-crewai-d9a56566\n name: crewai\n description: AI Agent 协作框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/joaomdmoura/crewAI\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 9\n- id: repo-rules-scaffolds-dspy-d8bdba82\n name: dspy\n description: 编程式 LLM 框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/stanfordnlp/dspy\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 10\n- id: repo-rules-scaffolds-langchain-089a07ab\n name: langchain\n description: LLM 应用开发框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/langchain-ai/langchain\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 11\n- id: repo-rules-scaffolds-pydantic-ai-cb69369e\n name: pydantic-ai\n description: 类型安全 AI Agent 框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/pydantic/pydantic-ai\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 12\n- id: repo-rules-scaffolds-smolagents-790ade5e\n name: smolagents\n description: HuggingFace 轻量 Agent 框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/huggingface/smolagents\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 13\n- id: repo-rules-scaffolds-aider-adccc23a\n name: aider\n description: 终端里的 AI 结对编程工具,适合练 Git 与本地项目修改。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/aider-ai/aider\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 14\n notes: Canonical owner updated from ChatGPT-中文Vibe Coding仓库 (2).md; source line 57.\n- id: repo-rules-scaffolds-claude-code-ef1ef8b6\n name: claude-code\n description: Anthropic 官方 CLI\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/anthropics/claude-code\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 15\n- id: repo-rules-scaffolds-cline-644a6623\n name: cline\n description: VS Code 自主编程 Agent\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/cline/cline\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 16\n- id: repo-rules-scaffolds-continue-d5516851\n name: continue\n description: 开源 AI 代码助手\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/continuedev/continue\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 17\n- id: repo-rules-scaffolds-gemini-cli-be45a9ce\n name: gemini-cli\n description: Google 官方 CLI\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/google-gemini/gemini-cli\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 18\n- id: repo-rules-scaffolds-gpt-engineer-eaa2e8a8\n name: gpt-engineer\n description: 自然语言生成代码\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/gpt-engineer-org/gpt-engineer\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 19\n- id: repo-rules-scaffolds-oh-my-opencode-0348827b\n name: oh-my-opencode\n description: OpenCode 配置与插件\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/code-yeongyu/oh-my-opencode\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 20\n- id: repo-rules-scaffolds-open-interpreter-a514262e\n name: open-interpreter\n description: 本地代码解释器\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/OpenInterpreter/open-interpreter\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 21\n- id: repo-rules-scaffolds-opencode-e1b762af\n name: opencode\n description: 开源终端 AI 助手,Go 编写\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/opencode-ai/opencode\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 22\n- id: repo-rules-scaffolds-spec-kit-a9a40ae2\n name: spec-kit\n description: GitHub 官方 Spec-Driven 开发工具包\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/github/spec-kit\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 23\n- id: repo-rules-scaffolds-github-topics-bcc7e192\n name: GitHub Topics\n description: 按主题浏览仓库\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/topics\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 24\n- id: repo-rules-scaffolds-github-trending-d46be94c\n name: GitHub Trending\n description: 热门仓库排行\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/trending\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 25\n- id: repo-rules-scaffolds-avante-nvim-29a0c49f\n name: avante.nvim\n description: Neovim AI 助手插件\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/yetone/avante.nvim\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 26\n- id: repo-rules-scaffolds-codecompanion-nvim-a6f68dc2\n name: codecompanion.nvim\n description: Neovim AI 编程伴侣\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/olimorris/codecompanion.nvim\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 27\n- id: repo-rules-scaffolds-codeium-b0b85053\n name: codeium\n description: 免费 AI 代码补全\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/Exafunction/codeium.vim\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 28\n- id: repo-rules-scaffolds-copilot-vim-c06b7933\n name: copilot.vim\n description: GitHub Copilot Vim 插件\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/github/copilot.vim\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 29\n- id: repo-rules-scaffolds-awesome-mcp-servers-d91d6430\n name: awesome-mcp-servers\n description: MCP 资源汇总\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/punkpeye/awesome-mcp-servers\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 30\n- id: repo-rules-scaffolds-mcp-servers-5d60dee4\n name: mcp-servers\n description: MCP 服务器集合\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/modelcontextprotocol/servers\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 31\n- id: repo-rules-scaffolds-2025-ai-engineer-reading-list-70f4fbd3\n name: 2025 AI Engineer Reading List\n description: 50篇必读论文,涵盖 LLM/RAG/Agent/CodeGen 等10个领域\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://www.latent.space/p/2025-papers\n domain: www.latent.space\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 32\n- id: repo-rules-scaffolds-ai-547bb859\n name: AI 编程最佳实践\n description: ninehills AI 编程经验\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/ninehills/blog/issues/97\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 33\n- id: repo-rules-scaffolds-ai-engineering-d04a5b40\n name: ai-engineering\n description: AI 工程实践\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/chiphuyen/aie-book\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 34\n- id: repo-rules-scaffolds-ai-for-grant-writing-0a634380\n name: ai-for-grant-writing\n description: AI 辅助撰写资助申请\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/eseckel/ai-for-grant-writing\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 35\n- id: repo-rules-scaffolds-awesome-explorables-2cedba5b\n name: awesome-explorables\n description: 交互式可视化学习资源汇总\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/blob42/awesome-explorables\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 36\n- id: repo-rules-scaffolds-awesome-llm-02e83378\n name: awesome-llm\n description: LLM 资源汇总\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/Hannibal046/Awesome-LLM\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 37\n- id: repo-rules-scaffolds-generative-ai-for-beginners-3b1db321\n name: generative-ai-for-beginners\n description: 微软生成式 AI 教程\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/microsoft/generative-ai-for-beginners\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 38\n- id: repo-rules-scaffolds-llm-course-9227aca8\n name: llm-course\n description: LLM 学习路线\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/mlabonne/llm-course\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 39\n- id: repo-rules-scaffolds-lovable-for-beginners-38de2782\n name: lovable-for-beginners\n description: Lovable 新手入门教程\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/cporter202/lovable-for-beginners\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 40\n- id: repo-rules-scaffolds-prompt-engineering-guide-5130a915\n name: prompt-engineering-guide\n description: 提示工程指南\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/dair-ai/Prompt-Engineering-Guide\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 41\n- id: repo-rules-scaffolds-vibe-vibe-c80a5961\n name: vibe-vibe\n description: Datawhale Vibe Coding 教程\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/datawhalechina/vibe-vibe\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 42\n- id: repo-rules-scaffolds-gitingest-ee7a3f76\n name: gitingest\n description: Git 仓库转 AI 友好格式\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/cyclotruc/gitingest\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 43\n- id: repo-rules-scaffolds-jan-c4cdcb50\n name: jan\n description: 开源本地 AI 助手\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/janhq/jan\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 44\n- id: repo-rules-scaffolds-lmstudio-8b9fe81d\n name: lmstudio\n description: 本地模型 GUI 工具\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://lmstudio.ai/\n domain: lmstudio.ai\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 45\n- id: repo-rules-scaffolds-localai-ea1fbd8b\n name: localai\n description: 本地 AI API\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/mudler/LocalAI\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 46\n- id: repo-rules-scaffolds-ollama-33222b83\n name: ollama\n description: 本地大模型运行\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/ollama/ollama\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 47\n- id: repo-rules-scaffolds-repomix-5aa70b79\n name: repomix\n description: 代码库打包为 AI 上下文\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/yamadashy/repomix\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 48\n- id: repo-rules-scaffolds-text-generation-webui-8ec0aebb\n name: text-generation-webui\n description: 文本生成 WebUI\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/oobabooga/text-generation-webui\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 49\n- id: repo-rules-scaffolds-awesome-chatgpt-prompts-ebaf3df7\n name: awesome-chatgpt-prompts\n description: ChatGPT 提示词集合\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/f/awesome-chatgpt-prompts\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 50\n- id: repo-rules-scaffolds-awesome-chatgpt-prompts-zh-966cbb5b\n name: awesome-chatgpt-prompts-zh\n description: 中文提示词\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/PlexPt/awesome-chatgpt-prompts-zh\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 51\n- id: repo-rules-scaffolds-claude-code-system-prompts-3f0438e1\n name: claude-code-system-prompts\n description: Claude Code 系统提示词\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/Piebald-AI/claude-code-system-prompts\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 52\n- id: repo-rules-scaffolds-system-prompts-and-models-of-ai-tools-8290b642\n name: system-prompts-and-models-of-ai-tools\n description: AI 工具系统提示词\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 53\n- id: repo-rules-scaffolds-awesome-cursorrules-7f259f16\n name: awesome-cursorrules\n description: Cursor Rules 集合\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/PatrickJS/awesome-cursorrules\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 54\n- id: repo-rules-scaffolds-cursor-directory-807839d9\n name: cursor.directory\n description: Cursor Rules 在线目录\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://cursor.directory/\n domain: cursor.directory\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 55\n- id: repo-rules-scaffolds-dotcursorrules-ad20d456\n name: dotcursorrules\n description: .cursorrules 模板\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/pontusab/dotcursorrules\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 56\n- id: repo-rules-scaffolds-anythingllm-a3e8a5fc\n name: AnythingLLM\n description: 私有文档 AI 助手\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/Mintplex-Labs/anything-llm\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 57\n- id: repo-rules-scaffolds-dify-4f89d10f\n name: Dify\n description: LLM 应用开发平台\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/langgenius/dify\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 58\n- id: repo-rules-scaffolds-privategpt-c615ca94\n name: PrivateGPT\n description: 私有文档问答\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/zylon-ai/private-gpt\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 59\n- id: repo-rules-scaffolds-quivr-5cc2ab96\n name: Quivr\n description: 个人知识库 AI\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/QuivrHQ/quivr\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 60\n- id: repo-rules-scaffolds-ragflow-c92a0918\n name: RAGFlow\n description: 开源 RAG 引擎\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/infiniflow/ragflow\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 61\n- id: repo-rules-scaffolds-devdocs-62126dcb\n name: DevDocs\n description: 多语言 API 文档聚合浏览器\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/freeCodeCamp/devdocs\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 62\n- id: repo-rules-scaffolds-langgpt-d6b7fb87\n name: LangGPT\n description: 结构化提示词框架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/langgptai/LangGPT\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 63\n- id: repo-rules-scaffolds-skills-cd973130\n name: Skills 制作器\n description: 生成定制化 Skills\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/yusufkaraaslan/Skill_Seekers\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 64\n- id: repo-rules-scaffolds-awesome-chatgpt-prompts-4c4b8064\n name: Awesome ChatGPT Prompts\n description: null\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/f/awesome-chatgpt-prompts\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 65\n- id: repo-rules-scaffolds-system-prompts-b5948bc8\n name: System Prompts 仓库\n description: null\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 66\n- id: repo-rules-scaffolds-create-next-app-1bebc93a\n name: create-next-app\n description: Next.js 官方脚手架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://nextjs.org/docs/app/api-reference/cli/create-next-app\n domain: nextjs.org\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 67\n- id: repo-rules-scaffolds-create-t3-app-daf8fe4b\n name: create-t3-app\n description: 全栈 TypeScript 脚手架\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/t3-oss/create-t3-app\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 68\n- id: repo-rules-scaffolds-fastapi-template-c97cc061\n name: fastapi-template\n description: FastAPI 全栈模板\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/tiangolo/full-stack-fastapi-template\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 69\n- id: repo-rules-scaffolds-shadcn-ui-d7cf613e\n name: shadcn/ui\n description: React UI 组件库\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://ui.shadcn.com/\n domain: ui.shadcn.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 70\n- id: repo-rules-scaffolds-vite-3e45b462\n name: vite\n description: 现代前端构建工具\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/vitejs/vite\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 71\n- id: repo-rules-scaffolds-tmux-9f36981a\n name: tmux\n description: 终端复用\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/tmux/tmux\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 72\n- id: repo-rules-scaffolds-github-copilot-102fb5f8\n name: GitHub Copilot\n description: 学生/开源免费\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/copilot\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 73\n- id: repo-rules-scaffolds-easy-vibe-3c217e96\n name: datawhalechina/easy-vibe\n description: “会说话就会做应用”,有学习地图和交互式教程入口。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/datawhalechina/easy-vibe\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - vibe-coding\n - learning-path\n risk_flags: []\n source_row: 26\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-ai-guide-c12bbbfd\n name: liyupi/ai-guide\n description: 鱼皮的 AI 资源大全和 Vibe Coding 零基础教程,偏实用和产品上线。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/liyupi/ai-guide\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - vibe-coding\n - learning-path\n risk_flags: []\n source_row: 27\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-vibe-coding-guide-cf65840a\n name: wendy7756/vibe-coding-guide\n description: 面向非程序员的自然语言编程指南。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/wendy7756/vibe-coding-guide\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - vibe-coding\n - learning-path\n risk_flags: []\n source_row: 28\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-ai-coding-c221421b\n name: Daotin/ai-coding\n description: AI Coding 方法论、Cursor、Claude Code、Codex、MCP、AGENTS.md 等实践经验汇总。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/Daotin/ai-coding\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - ai-coding\n - workflow\n risk_flags: []\n source_row: 35\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-vibe-coding-skill-a5e7c42d\n name: earyantLe/vibe-coding-skill\n description: 把 Vibe Coding 方法整理成 Skill 学习路径,适合沉淀可复用规范。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/earyantLe/vibe-coding-skill\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - vibe-coding\n - skill\n risk_flags: []\n source_row: 36\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-ai-coding-lab-6dc927c2\n name: luzhenqian/ai-coding-lab\n description: 从个人链接页、博客、看板到 RAG、Agent 的项目实战学习仓库。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/luzhenqian/ai-coding-lab\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - ai-coding\n - project-practice\n risk_flags: []\n source_row: 42\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-cs146s-cn-eaea3651\n name: ShouZhengAI/CS146S_CN\n description: 中文 CS146S 课程,包含 assignments 和 vibe coding 工具。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/ShouZhengAI/CS146S_CN\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - course\n - vibe-coding\n risk_flags: []\n source_row: 43\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-awesome-vibe-coding-e5ab67eb\n name: filipecalegario/awesome-vibe-coding\n description: 国际版 Vibe Coding 资源索引,覆盖概念、工具、IDE、CLI、任务管理和文档等分类。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/filipecalegario/awesome-vibe-coding\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - awesome-list\n - vibe-coding\n risk_flags: []\n source_row: 49\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-awesome-vibe-coding-e3ea2b5b\n name: ai-for-developers/awesome-vibe-coding\n description: 精选 Vibe Coding 工具与资料清单。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/ai-for-developers/awesome-vibe-coding\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - awesome-list\n - vibe-coding\n risk_flags: []\n source_row: 50\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-codex-e3c8be51\n name: openai/codex\n description: OpenAI Codex CLI,本地运行的 coding agent 源码仓库。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/openai/codex\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - coding-agent\n - tool-source\n risk_flags: []\n source_row: 56\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-roo-code-36e77dcc\n name: RooCodeInc/Roo-Code\n description: 编辑器里的多 Agent 编码工具;源文件提示该仓库已 archive,当前仅作参考资源。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/RooCodeInc/Roo-Code\n domain: github.com\n status: needs-review\n verification_status: imported-unverified\n tags:\n - coding-agent\n - reference-only\n risk_flags: []\n source_row: 59\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-claude-code-best-practice-01224898\n name: shanraisshan/claude-code-best-practice\n description: 从 Vibe Coding 到 Agentic Engineering 的 Claude Code 方法论与工作流仓库。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/shanraisshan/claude-code-best-practice\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - agentic-engineering\n - claude-code\n risk_flags: []\n source_row: 101\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n- id: repo-rules-scaffolds-awesome-claude-code-5e3406a1\n name: hesreallyhim/awesome-claude-code\n description: Claude Code 生态导航,覆盖 skills、hooks、slash commands、agent orchestrators 和 plugins 等资源。\n resource_type: repository_rule_or_scaffold\n link:\n kind: external_url\n url: https://github.com/hesreallyhim/awesome-claude-code\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags:\n - awesome-list\n - claude-code\n risk_flags: []\n source_row: 149\n notes: Imported from ChatGPT-中文Vibe Coding仓库 (2).md.\n",
"sha256": "69c2675a96f2e52bf24bfae66104d010b2958b0266f817f593c1a41745b87132"
},
".github/assets/external-resources/network-payment-services.yml": {
"mode": "100644",
"encoding": "utf-8",
"data": "# Generated from assets_csv.xlsx. Edit intentionally and keep schema.yml in sync.\nversion: 1\ncategory:\n id: network-payment-services\n name: 网络与支付服务\n description: 用于收录网络相关(代理客户端/服务)与支付相关(虚拟卡等)\n default_resource_type: network_or_payment_service\ndefaults:\n imported_from: assets_csv.xlsx\n imported_at: '2026-07-03'\n verification_status: imported-unverified\n license: unknown\nresources:\n- id: network-payment-services-www-bsmkweb-com-0960fe59\n name: 币安支付\n description: 必备,用于兑换加密货币,充值AI工具订阅\n resource_type: network_or_payment_service\n link:\n kind: external_url\n url: https://www.bsmkweb.com/join?ref=123OLP\n domain: www.bsmkweb.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - referral-or-tracking-link\n - financial-service-review\n source_row: 2\n- id: network-payment-services-flclash-a974428b\n name: FlClash\n description: 跨平台代理客户端\n resource_type: network_or_payment_service\n link:\n kind: external_url\n url: https://github.com/chen08209/FlClash/releases\n domain: github.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags: []\n source_row: 3\n- id: network-payment-services-xn-9kqz23b19z-com-a271e5a7\n name: 网络服务\n description: 云服务\n resource_type: network_or_payment_service\n link:\n kind: external_url\n url: https://xn--9kqz23b19z.com/#/register?code=35BcnKzl\n domain: xn--9kqz23b19z.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - referral-or-tracking-link\n source_row: 4\n- id: network-payment-services-bybit-81d32c91\n name: Bybit 虚拟卡\n description: 注册云服务等国际支付\n resource_type: network_or_payment_service\n link:\n kind: external_url\n url: https://www.bybit.com/cards/?ref=YDGAVPN&source=applet_invite\n domain: www.bybit.com\n status: active\n verification_status: imported-unverified\n tags: []\n risk_flags:\n - referral-or-tracking-link\n - financial-service-review\n source_row: 5\n",
"sha256": "2b1653c6239e9e5b7b0cfc9e9129a1938dc736c4d64049dde30af58cc9e7ed11"
}
},
"locations": {
".github/tools/external/.tmux": ".github/extensions/oh-my-tmux",
".github/tools/external/tmux": ".github/extensions/tmux",
".github/skills/auto-skill": ".github/skills/skill",
".github/skills/auto-skill/README.md": ".github/skills/skill/README.md"
},
"retired_submodules": [
".github/tools/external/Skill_Seekers-development",
".github/tools/external/claude-official-skills"
],
"live_sources": {
".github/skills/auto-skill/README.md": {
"path": ".github/skills/skill/README.md",
"sha256": "886c08b581e7022a6db08847e53ad360812927c60de7074daee79664a9f010bc"
},
".github/tools/external/.tmux/.logo/LICENSE": {
"path": ".github/extensions/oh-my-tmux/.logo/LICENSE",
"sha256": "6ae92da1ac8fc251f218491c42048d258d50d57bc685beb871fb09adf0bcea3e"
},
".github/tools/external/.tmux/.tmux.conf": {
"path": ".github/extensions/oh-my-tmux/.tmux.conf",
"sha256": "6807d44735b7b11e64c4488a0c3fdcbd2809cc73efedcc349d098e80a690aeeb"
},
".github/tools/external/.tmux/LICENSE.MIT": {
"path": ".github/extensions/oh-my-tmux/LICENSE.MIT",
"sha256": "f4c34427d3e29630cece9bca418eda48ac298867630cd6698d73e0f04642d1d0"
},
".github/tools/external/.tmux/LICENSE.WTFPLv2": {
"path": ".github/extensions/oh-my-tmux/LICENSE.WTFPLv2",
"sha256": "ee820ff0db4ce628569e0975ac27dc926052a9f85d102b101edb104311ef4d90"
},
".github/tools/external/.tmux/README.md": {
"path": ".github/extensions/oh-my-tmux/README.md",
"sha256": "10b0cca6bb2a4ab7af39d76d27f51b91ca1df4dead015315400041695c9471e7"
},
".github/tools/external/tmux/COPYING": {
"path": ".github/extensions/tmux/COPYING",
"sha256": "c031bd37f464c534277814f6aa38686fa023d094261d57fd2545ad592bb53ccd"
},
".github/tools/external/tmux/README": {
"path": ".github/extensions/tmux/README",
"sha256": "9fb75e6c7f10c25b73e41b8214336d0dc2acfbe4c99984514ccaf7327192d53e"
},
".github/tools/external/tmux/README.ja": {
"path": ".github/extensions/tmux/README.ja",
"sha256": "c341a10636227e426a759da4b80b754258ef31f1554a9ac369a79c5afeeadeb6"
},
".github/tools/external/tmux/compat/explicit_bzero.c": {
"path": ".github/extensions/tmux/compat/explicit_bzero.c",
"sha256": "7e30bc63946093cd6ed7cb4ce01d2f8c6e329ab173a20df250da60bb0a3c757b"
},
".github/tools/external/tmux/compat/getopt_long.c": {
"path": ".github/extensions/tmux/compat/getopt_long.c",
"sha256": "0486066fe70fb5a81d79971842f171e3bdcb570dbcab22ce51c1394235b8d21f"
},
".github/tools/external/tmux/example_tmux.conf": {
"path": ".github/extensions/tmux/example_tmux.conf",
"sha256": "0ab7c28342180d485434c3d8e286508a1e1c87ac9a2c8f2dc78bcf477a2de437"
},
".github/tools/external/tmux/logo/LICENSE": {
"path": ".github/extensions/tmux/logo/LICENSE",
"sha256": "5fdf604dee98da6f827ea924cf5ae19a9da31555d3814143f2cc6f8e7ee05752"
},
".github/tools/external/tmux/logo/tmux-logo-1-color.eps": {
"path": ".github/extensions/tmux/logo/tmux-logo-1-color.eps",
"sha256": "f4da0cd411ea21140efbb3ebd5fc9a76c87183c8eceb7902e6f08d061c17235b"
},
".github/tools/external/tmux/logo/tmux-logo.eps": {
"path": ".github/extensions/tmux/logo/tmux-logo.eps",
"sha256": "13ecb5c04f2b40f5dca7dc7e9be3986de3d7641c6494cc3f139669a3e90dd144"
},
".github/tools/external/tmux/logo/tmux-logomark.eps": {
"path": ".github/extensions/tmux/logo/tmux-logomark.eps",
"sha256": "f5afbd939a1675b5b1293cd642273d8b0b9555b906683970b5e7a34f802674fd"
},
".github/tools/external/tmux/mdoc2man.awk": {
"path": ".github/extensions/tmux/mdoc2man.awk",
"sha256": "602f3d31ffec414850e697b73f1885e967698ac0cbe8f09efd14800e55abe7ea"
},
".github/tools/external/tmux/tmux.1": {
"path": ".github/extensions/tmux/tmux.1",
"sha256": "f2966da7a8267abc9aaa216a7a7b46d4d914d60114058dc046c4ff1c75ac9422"
},
".github/tools/external/tmux/tmux.c": {
"path": ".github/extensions/tmux/tmux.c",
"sha256": "58a9bef0d1d424fd2e2a79c6d998dab96aab81ee771b7c2653928451f3bf11a8"
},
".github/tools/external/tmux/tools/24-bit-color.sh": {
"path": ".github/extensions/tmux/tools/24-bit-color.sh",
"sha256": "cee34d321461577c2455573ec58537833f5968cebe7df8d53aabf08b0e0d9ccf"
},
".github/tools/external/tmux/xmalloc.c": {
"path": ".github/extensions/tmux/xmalloc.c",
"sha256": "8ed468e9903b8abf18d5d5b76d99f030713fc479d02dc107ec3dbaa3a01c702b"
},
".gitmodules": {
"path": ".gitmodules",
"sha256": "0bcc9fbc19e7dd15d1b354226a74beea5237ae2119bc7f13bca8964ddc9eaec0"
}
},
"projections": [],
"explanations_v1": {
"template_sha256": "6b750444161e732ddba50e3067f45494f561e03711e9bea0475654aff4111973",
"items": [
{
"object_key": "faqi:faqi-prompt-converter",
"fields": [
{
"name": "工具的名称",
"content": "提示词格式转换程序"
},
{
"name": "是什么",
"content": "按登记边界,是提示词Excel、Markdown与JSONL转换入口的程序内容;README列出六种转换方向,main.py集中接收选择与模式并分派。实际转换是否正确尚未验证。"
},
{
"name": "为什么",
"content": "适用于需要在提示词表格、可读文档和JSONL数据间迁移资产而不手工重录的情境;这是从已记录转换功能归纳的用途,不是该程序历史采用决策或效果证明。"
},
{
"name": "怎么做",
"content": "历史README示例曾以`--select`指定.xlsx或文档目录,并用`--mode`选择转换;可交互选择,也支持`--non-interactive`但须同时给`--select`。该程序已退役,此处仅说明历史材料,不构成当前运行入口;未执行操作。"
},
{
"name": "扩展",
"content": "固定README列出Excel→Docs、Docs→Excel、Docs→JSONL、JSONL→Excel、Excel(JSONL)→JSONL及JSONL目录→Excel;这是登记实现的转换路径,不代表所有数据格式均无损互换。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-prompt-converter;本体类型=software-artifact;版本声明=未声明;本地入口=无(提示词格式转换程序已退役;退役前最后一个已发布主线快照为`b0e3454bb865b95bdc70127a431214c384542dee`);当前本机及仓外副本状态未知,未据此推断仍在使用或已卸载。\nVibe Coding 重要性暂定:黄阶初级(grade_id=faqi-huang-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:提示词资产格式迁移的辅助支路;分级依据:只负责格式转换,能维护和复用提示词资产但不参与模型推理或代码执行;替代方式多,属低重要性辅助。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n来源ID:S02, S01。\n历史输入/输出资产由Excel、Markdown、JSONL组成;历史main.py委托`start_convert.py`处理部分模式,README记录当时的默认目录及辅助脚本。原始快照仍保存在data.json;当前树不保留程序实现。"
},
{
"name": "出处",
"content": "登记固定实现为S02(main.py,历史revision `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`,lines 625–689,selection SHA `757b82c3bba30f1d62359c39f7c110d425463326e854acef2de085f14d90cf6d`);S01 README同revision作操作说明。其余流程描述取自当前归档中的完整历史main.py静态内容及README;没有运行工具。"
},
{
"name": "相关图书",
"content": "登记的程序源码与README未提供直接相关的作者、书名、版次或章节;Python库文档和格式名不是本条图书,本项不列书目。"
},
{
"name": "它要解决什么问题?",
"content": "在既有目录约定下,把提示词资产从Excel、Markdown和JSONL表示导出或还原;具体格式保真、异常处理和大文件边界尚未通过运行测试。"
},
{
"name": "为什么这样设计?",
"content": "历史源码显示main.py处理参数、候选选择和模式路由,并将部分转换委托给`start_convert.py`;可描述为历史实现分工,不能据此断言设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "以下仅描述data.json所存历史源码快照:静态路径包括解析`--select/--mode`、识别文件或目录、检测JSONL格式Excel、构建候选项,再分派到转换函数或子脚本;JSONL路径会读写记录并构造Excel工作表。程序已退役,不代表当前实现或可执行入口;没有执行这些代码,故不推断成功率或完整语义。"
},
{
"name": "付出了什么代价?",
"content": "需要Python及pandas/openpyxl等依赖,并会在目标目录创建或写入转换产物;README说明JSONL目录为生成物。没有运行测量、并发或大数据成本数据。"
},
{
"name": "比较不同技术与方法。",
"content": "本对象提供多表示间转换;Excel偏表格容器、Markdown偏人读、JSONL偏逐行数据交换,是不同表示的分工而非同一正确性标准。未找到与其同输入/输出合同对照的替代转换器,故不排名。"
},
{
"name": "提炼共同规律。",
"content": "编辑归纳:格式迁移要固定字段映射、输入选择与输出位置,并对可逆方向分别验证;存在多个转换方向不意味着两端语义完全等价。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "命令需指向预期Excel或文档/JSONL结构,依赖须安装,输出目录和文件权限须允许写入;转换是否保留所有字段、格式和异常数据需由真实样本合同验证。对象版本、安装状态及转换效果未由登记证明。"
},
{
"name": "结论",
"content": "结论(限第15项条件):编辑归纳:格式迁移要固定字段映射、输入选择与输出位置,并对可逆方向分别验证;存在多个转换方向不意味着两端语义完全等价。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:静态材料记录main.py按输入、模式分派Excel/Markdown/JSONL转换,并存在多种方向。推理根据:有两个方向或一条返回路径并不能证明字段映射无损或可逆;不同表示可丢失格式/语义,必须以目标字段合同和往返样本验证。由于多个转换方向只说明存在路径,不能单凭路径存在推出双向语义等价,因此第16项关于固定字段映射、输入/输出位置并分别验证可逆方向的局部规则。成立边界:第15项限定为“命令需指向预期Excel或文档/JSONL结构,依赖须安装,输出目录和文件权限须允许写入;转换是否保留所有字段、格式和异常数据需由真实样本合同验证。对象版本、安装状态及转换效果未由登记证明”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:固定来源 `S02`(main.py,历史revision `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`,lines 625–689,selection SHA `757b82c3bba30f1d62359c39f7c110d425463326e854acef2de085f14d90cf6d`);第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-codex-config-installer",
"fields": [
{
"name": "工具的名称",
"content": "Codex配置安装与恢复脚本"
},
{
"name": "是什么",
"content": "已退役的历史安装脚本:从本地目录或配置的URL取safe/power资产,备份目标文件,安装配置并生成恢复脚本。它不是Codex CLI,也不提供账号授权;当前不作为可执行入口。"
},
{
"name": "为什么",
"content": "历史README描述的用途是把公开配置基线安装到Codex Home并支持备份/恢复;为何最初选择脚本而非手动配置未记录。用途说明不构成再次运行或信任远端内容的建议。"
},
{
"name": "怎么做",
"content": "历史README展示默认safe、显式`--profile power`、`--codex-home`和restore命令;脚本还接受`--dry-run`。该安装器已退役,本文仅解释固定源码,不执行curl、安装、备份或恢复。"
},
{
"name": "扩展",
"content": "历史脚本提供safe/power两个profile、`CODEX_HOME`/`--codex-home`、本地/远程资源基址、`--restore-latest`与`--dry-run`;power会启用更高权限设置,不能当成安全默认扩展。源码显示dry-run仍先创建临时目录并由trap清理,README的“无文件变化”不等于零文件系统动作。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-codex-config-installer;本体类型=software-artifact;版本声明=未声明;本地入口=无(Codex配置安装与恢复脚本已退役;历史路径与来源见第7项);当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:玄阶初级(grade_id=faqi-xuan-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:特定Agent接入配置;分级依据:降低特定Agent初始配置成本,但只服务候选运行时且可手工替代;不属于核心模型推理或执行闭环。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n来源ID:S06, S05。\n与Codex CLI配置文件、AGENTS文本和Codex Home有关;配置与Agent指令不是CLI本身,profile不证明账户、安装版本或审批行为。对象及当前绑定已按退役状态记录。"
},
{
"name": "出处",
"content": "登记固定源码S06(历史revision `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`,install.sh lines 43–100及其选择SHA)和支持文档S05(同revision README lines 1–78);仅静态阅读固定归档内容。退役状态来自当前法器登记/说明,不将历史README中的命令视作现行入口。"
},
{
"name": "相关图书",
"content": "固定脚本与README没有提供直接关联的作者、书名、版次或章节;配置文件和CLI文档不自动构成本条图书,本项不列书目。"
},
{
"name": "它要解决什么问题?",
"content": "历史脚本针对将选定Codex配置写入指定Codex Home并保留恢复副本的操作;是否适配当前Codex版本、配置合同和用户环境未知,且该实现已退役。"
},
{
"name": "为什么这样设计?",
"content": "源码结构先选择profile与目标目录,再备份原配置、写恢复脚本、获取模板并安装;这是可观察控制流。README宣称备份/恢复用途,但无法证明当时的设计动机或实际恢复可靠性。"
},
{
"name": "内部如何实现?",
"content": "脚本解析profile/home/restore/dry-run;从本地目录复制或curl取文件;保存两份原配置或缺失标记;生成restore.sh;替换LATEST链接/目录;最后以权限0600安装模板。源码还会删除已有LATEST路径,恢复缺失标记时会删除目标文件。未执行。"
},
{
"name": "付出了什么代价?",
"content": "安装会读写用户Codex Home、创建备份及恢复脚本、联网获取模板并覆盖配置;dry-run也会创建临时目录再清理。源码中的`rm -rf \"$LATEST_LINK\"`和恢复时`rm -f`是明显副作用风险,不代表已发生;没有运行验证。"
},
{
"name": "比较不同技术与方法。",
"content": "历史README给出safe与power配置差异:safe不启用danger-full-access或approval_policy=never;power显式开放高权限。与手动安装相比脚本集中备份/安装流程,但增加远程来源与覆盖面;未对当前替代方案做比较。"
},
{
"name": "提炼共同规律。",
"content": "编辑归纳:配置自动化需要先明确目标路径、保存原状态、显示副作用并验证恢复;只存在恢复脚本不证明可正确回滚。该规律由本脚本控制流提炼,不推广为测试结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "仅适用于与固定源码一致的历史配置结构、正确Codex Home、可访问且可信的模板来源和合适文件权限;真实恢复还依赖备份完整、LATEST指向正确及目标文件状态。该脚本已退役,不代表当前Codex配置支持或应使用。"
},
{
"name": "结论",
"content": "结论(限第15项条件):编辑归纳:配置自动化需要先明确目标路径、保存原状态、显示副作用并验证恢复;只存在恢复脚本不证明可正确回滚。该规律由本脚本控制流提炼,不推广为测试结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定脚本既保存备份并生成restore.sh,也会替换LATEST路径,恢复缺失标记时可删除目标文件;未运行。推理根据:回滚成立依赖备份完整、目标状态与LATEST指针准确;存在恢复脚本不是成功恢复的观察证据。由于源码显示回滚依赖多个状态条件,而本次没有恢复执行结果,因此第16项关于先明确路径/保存状态并真实验证恢复、不能把脚本存在当作可回滚证明的结论。成立边界:第15项限定为“仅适用于与固定源码一致的历史配置结构、正确Codex Home、可访问且可信的模板来源和合适文件权限;真实恢复还依赖备份完整、LATEST指向正确及目标文件状态。该脚本已退役,不代表当前Codex配置支持或应使用”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:固定来源 `S06`(历史revision `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`,install.sh lines 43–100及其选择SHA)和支持文档S05(同revision README lines 1–78);第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-auto-skill-create",
"fields": [
{
"name": "工具的名称",
"content": "auto-skill模板生成脚本"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:指渲染Skill模板与建立目录的程序,不是生成出的Skill内容或整个元技能。--force可覆盖目标,未执行。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是生成Skill目录、SKILL.md模板及参考资源骨架。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "静态README/脚本显示用skill名选择--minimal或--full,可指定--output;目标已存在时默认失败,--force允许继续写入。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "提供minimal/full两种模板、输出目录和force选项;full额外创建getting-started、api、examples、troubleshooting参考页。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-auto-skill-create;本体类型=software-artifact;版本声明=未声明;本地入口=无(模板生成脚本已退役;历史路径与来源见第7项);相关Skill说明=.github/skills/skill(不同对象,不是该脚本);当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:玄阶中级(grade_id=faqi-xuan-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:技能资产扩展与复用;分级依据:把操作知识封装为可复用Agent技能,能扩展后续任务能力;属于增益支路,不是最小编码闭环的必需组件。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n来源ID:S08, S07。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S08\",\n \"purpose\": \"implementation\",\n \"path\": \".github/skills/auto-skill/scripts/create-skill.sh\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"3eb16d2f24cc2af3e7d7a0f4175e06b0258504795d079ba0920be9dd75f2f7fc\",\n \"lines\": [\n 80,\n 182\n ],\n \"selection_sha256\": \"e769660515ada48debbd022fdfb85ec934b4d3413cf3501e06ef075b6d36b1a4\"\n};{\n \"id\": \"S07\",\n \"purpose\": \"support\",\n \"path\": \".github/skills/auto-skill/README.md\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"2fd869316c0469d9c4079cd9a19c41698b501bca6ddd2b6cc03617e3f96218f0\",\n \"lines\": [\n 1,\n 21\n ],\n \"selection_sha256\": \"2fd869316c0469d9c4079cd9a19c41698b501bca6ddd2b6cc03617e3f96218f0\"\n}\n本地入口记录:{\n \"path\": \".github/skills/auto-skill\",\n \"objects\": [\n \"faqi-auto-skill-create\",\n \"faqi-auto-skill-validate\",\n \"faqi-skill-seekers-adapter\"\n ],\n \"sources\": [\n \"S07\",\n \"S08\",\n \"S09\",\n \"S10\"\n ],\n \"boundary\": \"Skill说明/规约与三个独立入口脚本分离,不把整Skill包登记成一件软件。\",\n \"pending\": [\n \"其他辅助模块未逐模块登记,不能将本次选区称为全包能力审查。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-auto-skill-create\",\n \"grade_id\": \"faqi-xuan-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:技能资产扩展与复用\",\n \"basis\": \"把操作知识封装为可复用Agent技能,能扩展后续任务能力;属于增益支路,不是最小编码闭环的必需组件。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是生成Skill目录、SKILL.md模板及参考资源骨架;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:检查skill名和模板路径,创建assets/scripts/references目录,用sed替换模板变量并写入索引/示例文件;不生成已完成的Skill语义内容。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "检查skill名和模板路径,创建assets/scripts/references目录,用sed替换模板变量并写入索引/示例文件;不生成已完成的Skill语义内容。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "会创建目录并写多个文件;force可覆盖SKILL.md和同名参考文件,保留的其他文件与重新生成文件需人工区分。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对手工建目录,该脚本统一初始骨架;手工方式不需模板依赖但更易漏项。结构一致不证明内容质量。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:生成Skill目录、SKILL.md模板及参考资源骨架时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "需bash、相邻assets模板和可写输出目录;skill名限定小写字母/数字/连字符并以字母开头;本说明依据静态源码,未执行;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:生成Skill目录、SKILL.md模板及参考资源骨架时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定脚本检查名称与模板路径后创建目录、模板、索引及示例文件,但不生成完成的Skill语义内容。推理根据:生成器的可观察输出是骨架文件;骨架不蕴含其内容已满足目标Skill的行为、合同或语义。由于脚本输出只覆盖目录与模板层,没有生成后的技能内容证据,因此第16项关于区分生成入口、输入模板、输出副作用及未完成语义内容的局部规则。成立边界:第15项限定为“需bash、相邻assets模板和可写输出目录;skill名限定小写字母/数字/连字符并以字母开头;本说明依据静态源码,未执行;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S08`;路径 `.github/skills/auto-skill/scripts/create-skill.sh`;选区SHA-256 `e769660515ada48debbd022fdfb85ec934b4d3413cf3501e06ef075b6d36b1a4`;修订 `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-auto-skill-validate",
"fields": [
{
"name": "工具的名称",
"content": "auto-skill结构校验脚本"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:指frontmatter和结构校验程序;成功结构检查不证明Skill语义、执行正确或效果。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是检查Skill的frontmatter与约定章节结构。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "静态README建议用目标目录调用脚本,并在需要严格模式时添加--strict;脚本读取SKILL.md并检查字段、目录名和章节。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "提供普通/strict检查;strict把部分推荐章节和样例数量升级为失败条件。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-auto-skill-validate;本体类型=software-artifact;版本声明=未声明;本地入口=无(结构校验脚本已退役;历史路径与来源见第7项);相关Skill说明=.github/skills/skill(不同对象,不是该脚本);当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:玄阶中级(grade_id=faqi-xuan-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:技能资产质量与可载入性;分级依据:降低扩展技能结构错误造成的接入阻断;不判断语义正确性,属于能力扩展的质量辅助。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n来源ID:S09, S07。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S09\",\n \"purpose\": \"implementation\",\n \"path\": \".github/skills/auto-skill/scripts/validate-skill.sh\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"deb5cf2529a93c87c8b7323b55ffc6d7798e6b59652351ba795340ac8c0061c9\",\n \"lines\": [\n 67,\n 160\n ],\n \"selection_sha256\": \"dbd460af6a32307709a11281c7b90925b9fd9820128eb04881c80c020a99f0dc\"\n};{\n \"id\": \"S07\",\n \"purpose\": \"support\",\n \"path\": \".github/skills/auto-skill/README.md\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"2fd869316c0469d9c4079cd9a19c41698b501bca6ddd2b6cc03617e3f96218f0\",\n \"lines\": [\n 1,\n 21\n ],\n \"selection_sha256\": \"2fd869316c0469d9c4079cd9a19c41698b501bca6ddd2b6cc03617e3f96218f0\"\n}\n本地入口记录:{\n \"path\": \".github/skills/auto-skill\",\n \"objects\": [\n \"faqi-auto-skill-create\",\n \"faqi-auto-skill-validate\",\n \"faqi-skill-seekers-adapter\"\n ],\n \"sources\": [\n \"S07\",\n \"S08\",\n \"S09\",\n \"S10\"\n ],\n \"boundary\": \"Skill说明/规约与三个独立入口脚本分离,不把整Skill包登记成一件软件。\",\n \"pending\": [\n \"其他辅助模块未逐模块登记,不能将本次选区称为全包能力审查。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-auto-skill-validate\",\n \"grade_id\": \"faqi-xuan-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:技能资产质量与可载入性\",\n \"basis\": \"降低扩展技能结构错误造成的接入阻断;不判断语义正确性,属于能力扩展的质量辅助。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是检查Skill的frontmatter与约定章节结构;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:用awk提取YAML frontmatter,检查name/description及strict规则;过滤代码围栏后检查要求章节、references/index、Quick Reference行数和Examples数量。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "用awk提取YAML frontmatter,检查name/description及strict规则;过滤代码围栏后检查要求章节、references/index、Quick Reference行数和Examples数量。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "读取Skill文档并创建/清理临时过滤文件;检查只覆盖脚本定义的格式规则,不验证Skill语义、调用效果或安全性。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "比人工快速浏览更一致地检查固定结构;与语义审查互补,不能代替真实使用和行为验证;无准确率比较数据。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:检查Skill的frontmatter与约定章节结构时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "需bash、awk、grep及目标Skill目录;frontmatter须从首行开始;strict的章节/示例门槛按固定脚本执行,未运行验证当前环境;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:检查Skill的frontmatter与约定章节结构时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定脚本检查frontmatter、章节、索引和示例等结构条件,不读取行为结果作为正确性证据。推理根据:结构条件只能证明被检查的形式约束;行为与语义正确需要独立内容审查或执行证据,不能由格式检查推出。由于校验器覆盖面限于结构,未覆盖Skill的目标行为,因此第16项关于把结构通过与语义/效果判断分开的结论。成立边界:第15项限定为“需bash、awk、grep及目标Skill目录;frontmatter须从首行开始;strict的章节/示例门槛按固定脚本执行,未运行验证当前环境;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S09`;路径 `.github/skills/auto-skill/scripts/validate-skill.sh`;选区SHA-256 `dbd460af6a32307709a11281c7b90925b9fd9820128eb04881c80c020a99f0dc`;修订 `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-skill-seekers-adapter",
"fields": [
{
"name": "工具的名称",
"content": "Skill Seekers本地运行适配脚本"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:设置venv/PYTHONPATH并exec上游CLI的本地适配程序。指令内容不同于上游核心,不能把封装当同一副本,也不因同一用途合并其他生成脚本。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是为本地Skill Seekers源码提供venv/PYTHONPATH启动适配。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "固定脚本语法为skill-seekers.sh [--venv dir] -- ;检查linked src目录,优先使用指定venv的python,否则python3,随后exec模块入口。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "可指定虚拟环境并透传上游CLI参数;引导脚本和实际上游功能是不同对象,不在此添加自动安装能力。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-skill-seekers-adapter;本体类型=software-artifact;版本声明=未声明;本地入口=无(Skill Seekers本地适配脚本已退役;历史路径与来源见第7项);相关Skill说明=.github/skills/skill(不同对象,不是该适配脚本);当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:玄阶初级(grade_id=faqi-xuan-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:Skill Seekers本地适配入口;分级依据:便于调用特定知识转技能工具;范围受上游工具限制,可直接调用或人工替代。不代表效能评级、运行结果或质量结论。\n既有关系记录:{\n \"subject\": \"faqi-skill-seekers-adapter\",\n \"predicate\": \"requires\",\n \"target_label\": \"链接源码中的skill_seekers.cli.main\",\n \"related_object_id\": \"faqi-skill-seekers\",\n \"evidence\": \"S10\",\n \"boundary\": \"源码路径确由软链接指到选定submodule;这是静态加载意图,venv实际依赖、Python解析和运行结果未核。\"\n}\n来源ID:S10, S07。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S10\",\n \"purpose\": \"implementation\",\n \"path\": \".github/skills/auto-skill/scripts/skill-seekers.sh\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"fdbf73b1faa1a0f445663b5c7c1c9792bbfb6dcdf5f5308198503e14ea0c64dc\",\n \"lines\": [\n 28,\n 66\n ],\n \"selection_sha256\": \"f678142dddda161372feb5c5af96bbbf5e1b3e76b9e2c7dc905a4d1ba18070f2\"\n};{\n \"id\": \"S07\",\n \"purpose\": \"support\",\n \"path\": \".github/skills/auto-skill/README.md\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"2fd869316c0469d9c4079cd9a19c41698b501bca6ddd2b6cc03617e3f96218f0\",\n \"lines\": [\n 1,\n 21\n ],\n \"selection_sha256\": \"2fd869316c0469d9c4079cd9a19c41698b501bca6ddd2b6cc03617e3f96218f0\"\n}\n本地入口记录:{\n \"path\": \".github/skills/auto-skill\",\n \"objects\": [\n \"faqi-auto-skill-create\",\n \"faqi-auto-skill-validate\",\n \"faqi-skill-seekers-adapter\"\n ],\n \"sources\": [\n \"S07\",\n \"S08\",\n \"S09\",\n \"S10\"\n ],\n \"boundary\": \"Skill说明/规约与三个独立入口脚本分离,不把整Skill包登记成一件软件。\",\n \"pending\": [\n \"其他辅助模块未逐模块登记,不能将本次选区称为全包能力审查。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-skill-seekers-adapter\",\n \"grade_id\": \"faqi-xuan-initial\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:Skill Seekers本地适配入口\",\n \"basis\": \"便于调用特定知识转技能工具;范围受上游工具限制,可直接调用或人工替代。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是为本地Skill Seekers源码提供venv/PYTHONPATH启动适配;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:解析venv和分隔符,设置PYTHONPATH指向linked src,再以python -m skill_seekers.cli.main替换当前进程;脚本明确不自动安装依赖。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "解析venv和分隔符,设置PYTHONPATH指向linked src,再以python -m skill_seekers.cli.main替换当前进程;脚本明确不自动安装依赖。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "依赖本地源码路径、Python解释器和预先安装的依赖;环境变量改变子进程导入搜索路径,调用后直接交出控制权。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对全局安装CLI,该适配让调用指向仓内源码并可选择venv;也增加路径/环境维护责任,不证明依赖隔离完备。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:为本地Skill Seekers源码提供venv/PYTHONPATH启动适配时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "linked src目录必须存在;venv可选,调用参数需放在--后;本脚本不联网、不安装包,后续CLI是否联网取决于上游命令;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:为本地Skill Seekers源码提供venv/PYTHONPATH启动适配时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:适配脚本设置venv/PYTHONPATH后exec上游CLI,并明确不自动安装依赖。推理根据:启动适配层控制的是本地解释器/导入路径和入口;上游CLI的能力、副作用与成功条件仍由上游具体命令决定。由于适配器边界没有替代上游合同、依赖或命令行为,因此第16项关于分别识别本地适配入口、linked源码及上游命令/副作用的局部规则。成立边界:第15项限定为“linked src目录必须存在;venv可选,调用参数需放在--后;本脚本不联网、不安装包,后续CLI是否联网取决于上游命令;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S10`;路径 `.github/skills/auto-skill/scripts/skill-seekers.sh`;选区SHA-256 `f678142dddda161372feb5c5af96bbbf5e1b3e76b9e2c7dc905a4d1ba18070f2`;修订 `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-auto-tmux",
"fields": [
{
"name": "工具的名称",
"content": "auto-tmux命令封装程序"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:指统一操控脚本,不是SKILL.md、tmux二进制、session/pane或某次操作;支持多命令不增加身份。未发送按键、创建会话或读取pane。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是历史Shell封装,用于以命令方式访问tmux检查、采集、发送和救援操作。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "源码静态列出help、doctor、topology、inspect、capture、send、paste、broadcast、rescue、scan、record、snapshot、hub、cleanup、wait等命令;该封装已退役,不执行。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "命令覆盖只读巡检、输出采集、按键/粘贴、广播、救援、记录与清理;命令清单不证明权限、安全或成功结果。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-auto-tmux;本体类型=software-artifact;版本声明=未声明;本地入口=无(auto-tmux命令封装脚本已退役;历史路径与来源见第7项);相关历史Skill说明原路径=.github/skills/auto-tmux(不同对象,不是该封装脚本;已从GitHub当前树移除,原始来源仍保留在documents和Git历史);当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:黄阶高级(grade_id=faqi-huang-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:多会话终端协作自动化;分级依据:多会话与worker协作在复杂并行时有用,但基础单Agent编码有替代路径;本级只表达工作流重要性,不评价实现质量或效能。不代表效能评级、运行结果或质量结论。\n既有关系记录:{\n \"subject\": \"faqi-auto-tmux\",\n \"predicate\": \"requires\",\n \"target_label\": \"tmux程序(运行版本未知)\",\n \"related_object_id\": \"faqi-tmux\",\n \"evidence\": \"S13\",\n \"boundary\": \"脚本调用PATH中的tmux;本地上游源码仅作相关参照,不证明实际安装二进制来自该修订。\"\n}\n来源ID:S12, S11。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S12\",\n \"purpose\": \"implementation\",\n \"path\": \".github/skills/auto-tmux/scripts/auto-tmux.sh\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"f473fddada7a7f5fd85afe94deccd16e2aba26195423dc87afbac176315b6567\",\n \"lines\": [\n 701,\n 725\n ],\n \"selection_sha256\": \"701db6430b20faa4bf2477001f584b15a1dea31e6c4a9d32747be343988dd3c2\"\n};{\n \"id\": \"S11\",\n \"purpose\": \"support\",\n \"path\": \".github/skills/auto-tmux/README.md\",\n \"repository\": \".\",\n \"revision\": \"0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2\",\n \"sha256\": \"d21ca4f1c4adb6a799a76f7a7446b1ebca70d2402f73e80600cda1c2a6d24c25\",\n \"lines\": [\n 1,\n 18\n ],\n \"selection_sha256\": \"0c0e46b950949789a6b85addd85f3a9ec0b2945e6a44134f82c7b46acc59b308\"\n}\n历史本地入口记录:{\n \"path\": \".github/skills/auto-tmux\",\n \"objects\": [\n \"faqi-auto-tmux\"\n ],\n \"sources\": [\n \"S11\",\n \"S12\",\n \"S13\"\n ],\n \"boundary\": \"历史入口绑定记录;Skill路径已从GitHub当前树移除;Skill方法/规约、执行脚本、被依赖程序及运行入口分别指认。\",\n \"pending\": [\n \"蜂群附属脚本不逐一登记,不启动蜂群,也不将蜂群状态/日志算软件。\",\n \"2026-10-13:将本工作分支内26个.sh入口的Git执行模式从100644改为100755;auto-tmux doctor、26个脚本bash -n及两个help入口通过。完整技能validator与tmux smoke未运行,运行效果仍待验证。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-auto-tmux\",\n \"grade_id\": \"faqi-huang-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:多会话终端协作自动化\",\n \"basis\": \"多会话与worker协作在复杂并行时有用,但基础单Agent编码有替代路径;本级只表达工作流重要性,不评价实现质量或效能。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是历史Shell封装,用于以命令方式访问tmux检查、采集、发送和救援操作;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:入口按子命令分派到独立函数;wait轮询模式并受timeout约束,失败时输出经redact处理的文本;其余命令涉及tmux pane/session控制,未实际调用。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "入口按子命令分派到独立函数;wait轮询模式并受timeout约束,失败时输出经redact处理的文本;其余命令涉及tmux pane/session控制,未实际调用。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "运行可能读取pane内容、发送按键、创建/清理tmux状态并启动等待轮询;这些副作用只由静态命令界面可见,本次未运行。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对直接使用tmux CLI,封装提供统一子命令与输出处理;直接CLI少一层封装,封装带来参数映射和权限审查成本;没有同工作负载比较。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:历史Shell封装,用于以命令方式访问tmux检查、采集、发送和救援操作时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "需要兼容的tmux、Shell和获准的pane/session权限;具体副作用取决于所选子命令;当前实现按退役状态记录;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:历史Shell封装,用于以命令方式访问tmux检查、采集、发送和救援操作时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定脚本把多个子命令分派到不同函数,包含只读巡检与可能读写tmux会话的操作;本次未调用。推理根据:封装入口相同不意味着各子命令副作用相同;风险与结果取决于具体命令、目标会话和权限。由于静态分派关系显示命令行为存在差异,且没有本次运行结果,因此第16项关于区分封装入口、输入资产与逐命令副作用的局部边界规则。成立边界:第15项限定为“需要兼容的tmux、Shell和获准的pane/session权限;具体副作用取决于所选子命令;当前实现按退役状态记录;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S12`;路径 `.github/skills/auto-tmux/scripts/auto-tmux.sh`;选区SHA-256 `701db6430b20faa4bf2477001f584b15a1dea31e6c4a9d32747be343988dd3c2`;修订 `0a7fdf4ca54d2bb327dcdfc13e816da57ee9c4c2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-skill-seekers",
"fields": [
{
"name": "工具的名称",
"content": "Skill Seekers程序"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:指固定submodule修订的软件实现;多个CLI入口及可选MCP模块不机械复制产品身份。3.5.1仅为pyproject源码声明,不是已核发布或运行版。MCP头注释34项与静态40个装饰函数、health返回2.1.1均不作为运行清单或身份版本证明。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是把文档、GitHub仓库、PDF等输入加工为可复用Skill,并提供CLI及可选MCP入口。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "固定CLI入口注册create、enhance、package、upload、install等命令;MCP源码另提供stdio/HTTP工具注册。具体调用需按对应命令与配置核对;没有运行。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "固定源码列出18个CLI命令并含可选MCP模块;源码注释工具数、静态装饰函数数和health版本文本不等同于运行工具清单或产品发布版本。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-skill-seekers;本体类型=software-artifact;版本声明=3.5.1(仅源码声明);本地入口=无(固定Gitlink已从当前树移除;冻结来源、SHA、初审及重要性记录保留);当前运行实例/部署状态未在对象记录中声明。;当前资源关联ID=repo-rules-scaffolds-skills-cd973130(关联不等于许可或运行证明)。固定修订许可观察:LICENSE文本标为MIT,但版权行仍为[Your Name/Username]占位符;同修订pyproject.toml的authors字段列为Yusuf Karaaslan。作者元数据不证明版权归属或授权;本项目仍未批准该许可证。\nVibe Coding 重要性暂定:玄阶中级(grade_id=faqi-xuan-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:外部知识转可复用技能;分级依据:增加Agent可复用的领域能力和上下文资产;需特定工作流,不能替代通用推理与工具执行。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n关联资源ID:repo-rules-scaffolds-skills-cd973130。资源链接/本地关联不证明许可、兼容性或功能等价。\n来源ID:S16, S14, S15, S42, S44, S45, S46, S47, S48, S49, S50, S66, S67, S68, S69, S70, S71, S72, S73。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S16\",\n \"purpose\": \"implementation\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/main.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"8c02660dacd304f51fe8c4a9685d3f6d5324a7eef7779b6baa7325827bf01985\",\n \"lines\": [\n 39,\n 116\n ],\n \"selection_sha256\": \"60fba27fbe444499a1e95b5dc69edc8b0d34d6c26a30039dcbf9d9205ffdfb14\"\n};{\n \"id\": \"S14\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/pyproject.toml\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"40820d20d8f56c1dc24c8f432141fa438d54473acbfecfa716fc9d188cbc8294\",\n \"lines\": [\n 1,\n 15\n ],\n \"selection_sha256\": \"8fc8e7df82f18edc826b13f63f097661c1f40b19d2e7ab576e25854b453919e3\"\n};{\n \"id\": \"S15\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/pyproject.toml\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"40820d20d8f56c1dc24c8f432141fa438d54473acbfecfa716fc9d188cbc8294\",\n \"lines\": [\n 301,\n 327\n ],\n \"selection_sha256\": \"ac6771e334ffad6fe8cb4934797de797375c87d4c33a16afff72de8d1642893f\"\n};{\n \"id\": \"S42\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/LICENSE\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"d131d0e96700cd78f8b3fa7ed79a47b019a0653066500faff376233246b6504d\",\n \"lines\": [\n 1,\n 22\n ],\n \"selection_sha256\": \"d131d0e96700cd78f8b3fa7ed79a47b019a0653066500faff376233246b6504d\"\n};{\n \"id\": \"S44\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/pyproject.toml\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"40820d20d8f56c1dc24c8f432141fa438d54473acbfecfa716fc9d188cbc8294\",\n \"lines\": [\n 45,\n 69\n ],\n \"selection_sha256\": \"e892c55c18d3d786696bf226eef30e4651216b0b71b89f35aa957f486ce0210f\"\n};{\n \"id\": \"S45\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/main.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"8c02660dacd304f51fe8c4a9685d3f6d5324a7eef7779b6baa7325827bf01985\",\n \"lines\": [\n 41,\n 66\n ],\n \"selection_sha256\": \"67527b228def54d21c5adc56b822ae446b51e24d18b4ca82b4a66669ca184d17\"\n};{\n \"id\": \"S46\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/agent_client.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"2fff7e6de630b6c8871db3419661195125c6128ac71d4d76f04e7561f7bdac17\",\n \"lines\": [\n 35,\n 91\n ],\n \"selection_sha256\": \"8273620e89e199a39cd5b2afd65dcfe4483d6b463ab3435f2dceb59270ec5a59\"\n};{\n \"id\": \"S47\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/agent_client.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"2fff7e6de630b6c8871db3419661195125c6128ac71d4d76f04e7561f7bdac17\",\n \"lines\": [\n 175,\n 200\n ],\n \"selection_sha256\": \"e1dffcec8fd29c41210478f2516c1a970fa0082d0c5666b8f2f47657e7226608\"\n};{\n \"id\": \"S48\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/agent_client.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"2fff7e6de630b6c8871db3419661195125c6128ac71d4d76f04e7561f7bdac17\",\n \"lines\": [\n 286,\n 415\n ],\n \"selection_sha256\": \"24bbde0e597053cc6a0430fb83f870b0007bc5d1fac7916645caa6687d65c153\"\n};{\n \"id\": \"S49\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/install_skill.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"146be443d3b73b1e5c706b105fd0780831275baa6d0d61424b3c10d03dfa79aa\",\n \"lines\": [\n 83,\n 156\n ],\n \"selection_sha256\": \"5d2fde106240cae8b78d502c274a07a764ff5a2f4e745f3f5a977af08dae7cf5\"\n};{\n \"id\": \"S50\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/cli/upload_skill.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"2967da60c32c2495ea993f9122c6472d76ab86d3bcae878831fbeb07c55b0d1e\",\n \"lines\": [\n 33,\n 89\n ],\n \"selection_sha256\": \"1893b3f3bfc12dc0ef7ff0b2f2e94d1c72e216bd9d229037f8a8d70b7a18b2f5\"\n};{\n \"id\": \"S66\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/server.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"cc6c4f24e5b91ab158f2bfbc4ebb27a38ce84d2937473dd85a6c2d035fc3b851\",\n \"lines\": [\n 217,\n 232\n ],\n \"selection_sha256\": \"3656ba540327c3b7a1d33dffb02caba7b39ad65539fedb8c1d4d653d6304c994\"\n};{\n \"id\": \"S67\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/server_fastmcp.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"19ba3010ea3bc5101953e44070932ec239d67908e1a0e992437665f98b827200\",\n \"lines\": [\n 1,\n 195\n ],\n \"selection_sha256\": \"4aac45465ef6f0be7dd815096a3b9a9fdd1d7dbb53022f407691cf5786305d89\"\n};{\n \"id\": \"S68\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/server_fastmcp.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"19ba3010ea3bc5101953e44070932ec239d67908e1a0e992437665f98b827200\",\n \"lines\": [\n 1648,\n 1835\n ],\n \"selection_sha256\": \"06302c5f4aeec783710f5fc8c98d27be93d48c13d10fab5b677a743590787a94\"\n};{\n \"id\": \"S69\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/server_fastmcp.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"19ba3010ea3bc5101953e44070932ec239d67908e1a0e992437665f98b827200\",\n \"lines\": [\n 887,\n 1050\n ],\n \"selection_sha256\": \"21c671d1565867a5787f19da94e5cebefbb52993f3833f323afcc324ed59fb5e\"\n};{\n \"id\": \"S70\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/tools/packaging_tools.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"7654385b60889705d98a3cc8e92602d13cadaf920ead26561e7fbb3a349a1fab\",\n \"lines\": [\n 32,\n 173\n ],\n \"selection_sha256\": \"a042393939aa45cc7c4b046630c5a32b418895e25421f49b070c66fc6d116f9f\"\n};{\n \"id\": \"S71\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/tools/packaging_tools.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"7654385b60889705d98a3cc8e92602d13cadaf920ead26561e7fbb3a349a1fab\",\n \"lines\": [\n 232,\n 298\n ],\n \"selection_sha256\": \"c1abd4a79a92647fd3a4044f1cddc566c6dd953c3aa5d6c6824db8d9e27ba109\"\n};{\n \"id\": \"S72\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/tools/scraping_tools.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"0073daae89b191d907fb080daf78f044d55d6890a8c929e7dcdc10c9ff19a735\",\n \"lines\": [\n 211,\n 310\n ],\n \"selection_sha256\": \"361fb788f3029d6990b596a7675a68eb4f81df8d1e70404a6489780f93276f9d\"\n};{\n \"id\": \"S73\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/Skill_Seekers-development/src/skill_seekers/mcp/tools/packaging_tools.py\",\n \"repository\": \".github/tools/external/Skill_Seekers-development\",\n \"revision\": \"26638b248279a3b001b651475e0f28975f5ff069\",\n \"sha256\": \"7654385b60889705d98a3cc8e92602d13cadaf920ead26561e7fbb3a349a1fab\",\n \"lines\": [\n 433,\n 904\n ],\n \"selection_sha256\": \"5eef32044bf73950d2c4168ff30faa18e8064400aa0ee4f78dff9029d4fae074\"\n}\n本地入口记录:{\n \"path\": \".github/tools/external/Skill_Seekers-development\",\n \"objects\": [\n \"faqi-skill-seekers\"\n ],\n \"sources\": [\n \"S14\",\n \"S15\",\n \"S16\",\n \"S42\",\n \"S44\",\n \"S45\",\n \"S46\",\n \"S47\",\n \"S48\",\n \"S49\",\n \"S50\",\n \"S66\",\n \"S67\",\n \"S68\",\n \"S69\",\n \"S70\",\n \"S71\",\n \"S72\",\n \"S73\"\n ],\n \"boundary\": \"源码内容与仓库载体、接口规范、抓取过程、输入资料和生成Skill分开。\",\n \"pending\": [\n \"2026-10-14:S45–S50绑定固定CLI路由、AgentClient与install/upload静态选区。CLI映射包含create/enhance/package/upload/install/install-agent等;AgentClient的auto模式按环境密钥选择API或本地代理,API路径将prompt发送给provider,本地subprocess.run未显式限制env;Claude预设含--dangerously-skip-permissions,Codex含--full-auto和--skip-git-repo-check。install将auto_upload设为默认true(可用--no-upload),upload路径调用目标adaptor并可从环境变量取key。仅静态审阅,未运行、联网、上传或读取凭据;完整MCP链路、数据范围/来源授权、子进程权限、环境隔离、外部与本地写入及恢复路径仍待审。\",\n \"仓库LICENSE标注MIT,但版权行保留[Your Name/Username]占位符;权利主体与授权未核,不作许可证批准依据。\",\n \"固定pyproject将PyMuPDF>=1.24.14列为核心依赖;2026-10-14本地Python 3.12.3环境未安装PyMuPDF(pip另有~umpy无效发行警告),运行/doctor/PDF路径未验证。这是环境观察,不等于上游实现缺陷。\",\n \"2026-10-15:在Python 3.12.3环境运行python3 -m pip show PyMuPDF仍显示未安装;未安装依赖、未运行Skill Seekers。运行验证仍为false;此项只是目标环境依赖存在性检查,不是程序测试。\",\n \"2026-10-16:S66–S73只静态复核固定pin的MCP兼容入口、FastMCP、抓取及package/upload/install选区。默认stdio,HTTP默认127.0.0.1:8000,选区配置通配CORS;回环监听与CORS不等于认证授权。package默认auto_upload=true,命中平台密钥时加入上传标志;upload显式api_key被放入--api-key进程参数,Popen未显式限定env,凭据暴露与环境继承边界尚未确认,未读取任何真实值。install除抓取、AI增强和打包外,还含条件上传及marketplace发布分支,auto_upload=false不关闭前序步骤或独立发布支路;scrape_docs的unlimited临时配置写入先于dry_run分支,不能把预览声明推广为零I/O或可完整回滚。源码注释34工具、静态40装饰函数和health的2.1.1字符串都不是运行清单或已核版本。未导入、执行、启服务、抓取、上传或安装;认证、数据来源授权、完整下游副作用、超时/取消及恢复仍待独立验证。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-skill-seekers\",\n \"grade_id\": \"faqi-xuan-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:外部知识转可复用技能\",\n \"basis\": \"增加Agent可复用的领域能力和上下文资产;需特定工作流,不能替代通用推理与工具执行。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是把文档、GitHub仓库、PDF等输入加工为可复用Skill,并提供CLI及可选MCP入口;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:静态实现由CLI路由到抓取、增强、打包、安装/上传模块;MCP入口把模块函数注册为工具,部分实现再调用子进程或外部API。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "静态实现由CLI路由到抓取、增强、打包、安装/上传模块;MCP入口把模块函数注册为工具,部分实现再调用子进程或外部API。所检FastMCP HTTP路径以host参数启动uvicorn,默认绑定127.0.0.1且可通过--host指定其他地址;所检server路径未配置应用层认证,并设置allow_origins=[\"*\"]与allow_credentials=True。以上仅为固定修订源码的静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "条件性安全风险:所检HTTP MCP入口未配置应用层认证;若服务绑定非回环地址或经端口转发并可被不可信调用者访问,部分工具可触发本地文件I/O、子进程及外部上传/发布。upload_skill的api_key参数最终加入子进程argv(--api-key),形成进程参数暴露面;操作系统中的实际可见范围未实测。package/install按默认设置可在检测到平台密钥时自动上传;抓取及增强还会产生网络、本地文件I/O和API配额消耗。未读取真实凭据、未执行程序或做资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对手工整理文档,程序把抓取、增强、打包流程自动化;相对只用CLI,MCP提供另一调用边界但增加服务依赖。仓内静态内容不支持质量/性能排名。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:把文档、GitHub仓库、PDF等输入加工为可复用Skill,并提供CLI及可选MCP入口时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "适用边界:仅固定修订26638b248279a3b001b651475e0f28975f5ff069的S67–S73选区静态审阅;HTTP暴露风险以服务可被不可信网络访问为前提,反向代理等外部防护未核;argv风险仅确认密钥进入子进程参数数组,操作系统进程可见范围未测。未运行服务、导入或执行上游代码、安装依赖、联网、抓取、上传、验证浏览器请求或读取真实凭据;未覆盖全包、依赖漏洞、来源授权、完整路径沙箱及取消/恢复。dry-run/关闭自动上传不代表所有上游步骤零I/O或完整回滚;不据此声称漏洞利用、运行安全或全包审查。"
},
{
"name": "结论",
"content": "静态审阅结果:WARN(范围与限制见第15项)。从本程序可归纳的局部规则是:把文档、GitHub仓库、PDF等输入加工为可复用Skill,并提供CLI及可选MCP入口时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。针对固定修订,不要向不可信网络暴露HTTP MCP;在未配置身份认证/授权和调用边界前仅限回环监听;不要通过MCP api_key参数向子进程argv传递秘密,应改用受控的非argv注入并核对目标系统的进程可见边界。以上是静态风险使用建议,不是漏洞利用或运行行为证明。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定源码表明CLI/MCP路由到抓取、文件I/O、子进程、API及上传等不同处理环节;来源S67/S68显示FastMCP入口及可配置HTTP监听,所检路径默认回环、允许任意Origin且未配置应用层认证;S69提供MCP工具参数,S70以Popen启动子进程,S71把api_key放入--api-key参数,S73显示install含抓取、AI增强、打包及条件上传/发布路径。推理根据:观察到的调用边界支持区分程序入口、输入资产和副作用的局部规则;若HTTP端点可被不可信调用者访问且无其他外部访问控制,工具权限会转化为本地文件/子进程和外部副作用风险;把密钥置于argv则形成进程参数暴露面。由于这些是固定源码可观察的调用关系而非运行或利用结果,因此第16项仅给出局部规则、条件性风险与使用建议。成立边界:以第15项列出的适用条件、限制及其待核状态为准;本节仅覆盖固定修订S67–S73静态选区,实际网络可达性、外部防护和进程可见范围未知;不据此外推未观察效果、许可或正式评级。附加限定:不证明漏洞利用或运行安全。"
},
{
"name": "依据",
"content": "依据:来源ID S67, S68, S69, S70, S71, S72, S73;固定submodule修订26638b248279a3b001b651475e0f28975f5ff069;第7项载完整历史路径、源码SHA及选区SHA。S67/S68为FastMCP与HTTP监听,S69为MCP接口,S70/S71为子进程与API key参数流,S72为抓取,S73为install编排;对应第11项内部实现说明,边界按第15项。只读静态审阅,未运行scanner或上游代码;不证明利用、运行安全、依赖安全、许可或正式评级。"
}
]
},
{
"object_key": "faqi:faqi-oh-my-tmux",
"fields": [
{
"name": "工具的名称",
"content": "oh-my-tmux可执行配置程序"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:配置文件含run、cut|sh调用链及可执行shell指令,按实际程序内容归software-artifact,不能仅因.conf后缀归纯规约;不是tmux本身。仓内.logo许可证另由S65绑定;其指向可变tmux/master路径,具体SVG来源关系与许可覆盖范围未核,不能据此批准仓库整体再分发。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是固定oh-my-tmux仓库中的tmux配置文件,含tmux run与shell执行链,不是tmux本体。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "配置在tmux上下文中使用,按源码run指令设置TMUX_SOCKET/TMUX_CONF等环境并source本地配置,随后将配置文本经cut送入sh;本文不加载配置。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "配置支持socket、配置文件和本地配置路径等环境分支;这些是固定配置的条件行为,不证明运行环境实际启用。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-oh-my-tmux;本体类型=software-artifact;版本声明=未声明;本地入口=.github/extensions/oh-my-tmux;当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:黄阶中级(grade_id=faqi-huang-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:终端复用器体验配置;分级依据:改善tmux使用便利性,但不提供模型推理或核心代码执行能力,可由其他终端配置替代。不代表效能评级、运行结果或质量结论。\n既有关系记录:{\n \"subject\": \"faqi-oh-my-tmux\",\n \"predicate\": \"requires\",\n \"target_label\": \"tmux>=2.6及awk/perl/grep/sed\",\n \"related_object_id\": \"faqi-tmux\",\n \"evidence\": \"S17\",\n \"boundary\": \"README声明版本下限,不将配置修订误写成tmux版本,也不保证当前环境满足依赖。\"\n}\n来源ID:S18, S17, S19, S37, S38, S39, S65。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S18\",\n \"purpose\": \"implementation\",\n \"path\": \".github/tools/external/.tmux/.tmux.conf\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"6807d44735b7b11e64c4488a0c3fdcbd2809cc73efedcc349d098e80a690aeeb\",\n \"lines\": [\n 150,\n 190\n ],\n \"selection_sha256\": \"e39dd4f98da410b88e110772d21d1eb14d3bfb6e2c6e8c36e2cb19129d9c98f8\"\n};{\n \"id\": \"S17\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/.tmux/README.md\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"10b0cca6bb2a4ab7af39d76d27f51b91ca1df4dead015315400041695c9471e7\",\n \"lines\": [\n 9,\n 78\n ],\n \"selection_sha256\": \"243d5ab2936723c61f781dd6906e61de92cceea6069e570ca107b6c19236aeb7\"\n};{\n \"id\": \"S19\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/.tmux/.tmux.conf\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"6807d44735b7b11e64c4488a0c3fdcbd2809cc73efedcc349d098e80a690aeeb\",\n \"lines\": [\n 1829,\n 1891\n ],\n \"selection_sha256\": \"3065f39bd62e8cb3bb4095dfaf9784840368d5760137ad01d3f96eb55ede68a1\"\n};{\n \"id\": \"S37\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/.tmux/.tmux.conf\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"6807d44735b7b11e64c4488a0c3fdcbd2809cc73efedcc349d098e80a690aeeb\",\n \"lines\": [\n 1,\n 8\n ],\n \"selection_sha256\": \"e9e4b5dd6be906cfd6c4e4fe0a1063332cad79bf10898087c7c88eee87fb11aa\"\n};{\n \"id\": \"S38\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/.tmux/LICENSE.MIT\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"f4c34427d3e29630cece9bca418eda48ac298867630cd6698d73e0f04642d1d0\",\n \"lines\": [\n 1,\n 19\n ],\n \"selection_sha256\": \"f4c34427d3e29630cece9bca418eda48ac298867630cd6698d73e0f04642d1d0\"\n};{\n \"id\": \"S39\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/.tmux/LICENSE.WTFPLv2\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"ee820ff0db4ce628569e0975ac27dc926052a9f85d102b101edb104311ef4d90\",\n \"lines\": [\n 1,\n 14\n ],\n \"selection_sha256\": \"ee820ff0db4ce628569e0975ac27dc926052a9f85d102b101edb104311ef4d90\"\n};{\n \"id\": \"S65\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/.tmux/.logo/LICENSE\",\n \"repository\": \".github/tools/external/.tmux\",\n \"revision\": \"87dcd13a28aeb5f18baee630e24b3f5765ae3a4f\",\n \"sha256\": \"6ae92da1ac8fc251f218491c42048d258d50d57bc685beb871fb09adf0bcea3e\",\n \"lines\": [\n 1,\n 17\n ],\n \"selection_sha256\": \"6ae92da1ac8fc251f218491c42048d258d50d57bc685beb871fb09adf0bcea3e\"\n}\n本地入口记录:{\n \"path\": \".github/tools/external/.tmux\",\n \"objects\": [\n \"faqi-oh-my-tmux\"\n ],\n \"sources\": [\n \"S17\",\n \"S18\",\n \"S19\",\n \"S37\",\n \"S38\",\n \"S39\"\n ],\n \"boundary\": \"配置数据与嵌入程序按实际所指区分;本条纳入可执行配置程序,未安装或source配置。\",\n \"pending\": [\n \"源码含条件性kill-server;纳入不等于可安全对当前会话执行。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-oh-my-tmux\",\n \"grade_id\": \"faqi-huang-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:终端复用器体验配置\",\n \"basis\": \"改善tmux使用便利性,但不提供模型推理或核心代码执行能力,可由其他终端配置替代。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是固定oh-my-tmux仓库中的tmux配置文件,含tmux run与shell执行链,不是tmux本体;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:tmux解析配置与条件表达式,run调用shell命令,cut -c3-后的内容交给sh执行;配置依赖tmux、Shell、环境变量和本地配置路径。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "tmux解析配置与条件表达式,run调用shell命令,cut -c3-后的内容交给sh执行;配置依赖tmux、Shell、环境变量和本地配置路径。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "加载配置会触发tmux命令和Shell执行,扩大配置文件的执行边界;仓内另有多种许可证文件,单个logo许可证不足以证明全仓再分发许可。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对纯静态tmux配置,本文件含run与shell管道,具有命令执行行为;相对tmux程序源码,它是配置/脚本资产,不是复用器实现。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:固定oh-my-tmux仓库中的tmux配置文件,含tmux run与shell执行链,不是tmux本体时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "需要匹配的tmux语法、Shell、环境变量和配置路径;许可证范围须按每个源文件核验;静态源码说明不证明加载成功或许可结论;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:固定oh-my-tmux仓库中的tmux配置文件,含tmux run与shell执行链,不是tmux本体时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定配置包含tmux run和cut|sh执行链,配置文本会触发Shell命令;没有加载或执行。推理根据:含有命令执行语义的配置不是纯声明数据;静态命令链可支持其执行边界分类,但不能推出加载或运行结果。由于来源中可见主动执行链,而当前没有运行观察,因此第16项关于把该配置识别为可执行工件并区分其入口、依赖与副作用的局部结论。成立边界:第15项限定为“需要匹配的tmux语法、Shell、环境变量和配置路径;许可证范围须按每个源文件核验;静态源码说明不证明加载成功或许可结论;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S18`;路径 `.github/tools/external/.tmux/.tmux.conf`;选区SHA-256 `e39dd4f98da410b88e110772d21d1eb14d3bfb6e2c6e8c36e2cb19129d9c98f8`;修订 `87dcd13a28aeb5f18baee630e24b3f5765ae3a4f`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-tmux",
"fields": [
{
"name": "工具的名称",
"content": "tmux终端复用程序"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:指固定源码修订的程序内容,不是物理终端、pane、socket地址或一次会话。Git describe的邻近tag不作为已核发布版本。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是固定Git submodule修订中的tmux终端复用器源码,不等于本机3.4运行观察。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "上游README和man page描述通过tmux命令创建/管理会话、窗口和pane;本登记只静态审查固定源码选区,不据此宣称已构建或运行。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "固定源码含命令行、配置与终端功能;运行包、插件或未来版本的能力不由本源码对象自动继承。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-tmux;本体类型=software-artifact;版本声明=未声明;本地入口=.github/extensions/tmux;当前运行实例/部署状态未在对象记录中声明。;当前资源关联ID=repo-rules-scaffolds-tmux-9f36981a(关联不等于许可或运行证明)。\nVibe Coding 重要性暂定:黄阶高级(grade_id=faqi-huang-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:可选的多会话终端复用;分级依据:支持持久终端与多窗口工作流,复杂长任务可受益;普通编码闭环有替代方案,不属定义性核心。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n关联资源ID:repo-rules-scaffolds-tmux-9f36981a。资源链接/本地关联不证明许可、兼容性或功能等价。\n来源ID:S21, S20, S40, S41, S52, S53, S54, S55, S56, S57, S58, S59, S60, S61, S62, S63, S64。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S21\",\n \"purpose\": \"implementation\",\n \"path\": \".github/tools/external/tmux/tmux.c\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"58a9bef0d1d424fd2e2a79c6d998dab96aab81ee771b7c2653928451f3bf11a8\",\n \"lines\": [\n 350,\n 492\n ],\n \"selection_sha256\": \"cd3c886c9a155f70dcddaeec88b4a86253c565b2e18753327f83446d92a7e8f4\"\n};{\n \"id\": \"S20\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/README\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"9fb75e6c7f10c25b73e41b8214336d0dc2acfbe4c99984514ccaf7327192d53e\",\n \"lines\": [\n 1,\n 20\n ],\n \"selection_sha256\": \"68e51dd5a0148fa1d22f5c7565d3da74dc6619207d1c5238658d5fd873c63e5b\"\n};{\n \"id\": \"S40\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/tmux.c\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"58a9bef0d1d424fd2e2a79c6d998dab96aab81ee771b7c2653928451f3bf11a8\",\n \"lines\": [\n 1,\n 18\n ],\n \"selection_sha256\": \"26f34506da997905b214b2878416c618a92298533aca335c60c509e5e0993904\"\n};{\n \"id\": \"S41\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/COPYING\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"c031bd37f464c534277814f6aa38686fa023d094261d57fd2545ad592bb53ccd\",\n \"lines\": [\n 1,\n 19\n ],\n \"selection_sha256\": \"c031bd37f464c534277814f6aa38686fa023d094261d57fd2545ad592bb53ccd\"\n};{\n \"id\": \"S52\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/README\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"9fb75e6c7f10c25b73e41b8214336d0dc2acfbe4c99984514ccaf7327192d53e\",\n \"lines\": [\n 84,\n 88\n ],\n \"selection_sha256\": \"68980459b47c2af6f48f099a70fa4472b3b6e5066006f7fdf5f63f675dc1f02d\"\n};{\n \"id\": \"S53\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/compat/explicit_bzero.c\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"7e30bc63946093cd6ed7cb4ce01d2f8c6e329ab173a20df250da60bb0a3c757b\",\n \"lines\": [\n 1,\n 6\n ],\n \"selection_sha256\": \"02fedc95bf0da5dffe09623d9cb71bc7ebbb8bfd31f5e4fb5a23b135d7f36d0e\"\n};{\n \"id\": \"S54\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/compat/getopt_long.c\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"0486066fe70fb5a81d79971842f171e3bdcb570dbcab22ce51c1394235b8d21f\",\n \"lines\": [\n 1,\n 98\n ],\n \"selection_sha256\": \"32af441d6bffc37dbac1c14d03edf334137d91c95fa06c335479fd9c80d7fcb4\"\n};{\n \"id\": \"S55\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/xmalloc.c\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"8ed468e9903b8abf18d5d5b76d99f030713fc479d02dc107ec3dbaa3a01c702b\",\n \"lines\": [\n 1,\n 15\n ],\n \"selection_sha256\": \"f28a22fd0a1176583b24e17d8536acaba14afb635f4b253aa9653770cb1449ba\"\n};{\n \"id\": \"S56\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/logo/LICENSE\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"5fdf604dee98da6f827ea924cf5ae19a9da31555d3814143f2cc6f8e7ee05752\",\n \"lines\": [\n 1,\n 14\n ],\n \"selection_sha256\": \"5fdf604dee98da6f827ea924cf5ae19a9da31555d3814143f2cc6f8e7ee05752\"\n};{\n \"id\": \"S57\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/mdoc2man.awk\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"602f3d31ffec414850e697b73f1885e967698ac0cbe8f09efd14800e55abe7ea\",\n \"lines\": [\n 1,\n 23\n ],\n \"selection_sha256\": \"1d4514630b480519684226c19c6ead79afcc30d0a5857601aa2e40b3831f7b92\"\n};{\n \"id\": \"S58\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/tmux.1\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"f2966da7a8267abc9aaa216a7a7b46d4d914d60114058dc046c4ff1c75ac9422\",\n \"lines\": [\n 1,\n 15\n ],\n \"selection_sha256\": \"04972c3c428ff5c92813b5cc03ee0aca9fb4d67f9efcadc6b08ba9ae9ad1a6db\"\n};{\n \"id\": \"S59\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/example_tmux.conf\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"0ab7c28342180d485434c3d8e286508a1e1c87ac9a2c8f2dc78bcf477a2de437\",\n \"lines\": [\n 1,\n 5\n ],\n \"selection_sha256\": \"c29f86d0a16523c1ec7df3be70be2c1b0c7c60aa5da95abb23ff3239289beb78\"\n};{\n \"id\": \"S60\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/tools/24-bit-color.sh\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"cee34d321461577c2455573ec58537833f5968cebe7df8d53aabf08b0e0d9ccf\",\n \"lines\": [\n 1,\n 15\n ],\n \"selection_sha256\": \"d78c7405e325b792164f733359cfb3339460776aaee44586bddb7d221c15f354\"\n};{\n \"id\": \"S61\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/README.ja\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"c341a10636227e426a759da4b80b754258ef31f1554a9ac369a79c5afeeadeb6\",\n \"lines\": [\n 59,\n 60\n ],\n \"selection_sha256\": \"63f1ffb13bd10f6b3a2052d09b4d9c336c41c45262363e035e25a362ffd5c73a\"\n};{\n \"id\": \"S62\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/logo/tmux-logo-1-color.eps\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"f4da0cd411ea21140efbb3ebd5fc9a76c87183c8eceb7902e6f08d061c17235b\",\n \"lines\": [\n 1,\n 20\n ],\n \"selection_sha256\": \"2c23a57c4e1dfdf7fdf3d45d0d4cb092413835ab36eb320a3cc25d80b393f0d4\"\n};{\n \"id\": \"S63\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/logo/tmux-logo.eps\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"13ecb5c04f2b40f5dca7dc7e9be3986de3d7641c6494cc3f139669a3e90dd144\",\n \"lines\": [\n 1,\n 20\n ],\n \"selection_sha256\": \"2c23a57c4e1dfdf7fdf3d45d0d4cb092413835ab36eb320a3cc25d80b393f0d4\"\n};{\n \"id\": \"S64\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/tmux/logo/tmux-logomark.eps\",\n \"repository\": \".github/tools/external/tmux\",\n \"revision\": \"615c27c11789948df2db09e113e882f82dfb3e1c\",\n \"sha256\": \"f5afbd939a1675b5b1293cd642273d8b0b9555b906683970b5e7a34f802674fd\",\n \"lines\": [\n 1,\n 20\n ],\n \"selection_sha256\": \"ecbd0ccba3e5665b62c06509dd78ed90525ad60737c63c29d089fb8b54e23b5b\"\n}\n本地入口记录:{\n \"path\": \".github/tools/external/tmux\",\n \"objects\": [\n \"faqi-tmux\"\n ],\n \"sources\": [\n \"S20\",\n \"S21\",\n \"S40\",\n \"S41\",\n \"S52\",\n \"S53\",\n \"S54\",\n \"S55\",\n \"S56\",\n \"S57\",\n \"S58\",\n \"S59\",\n \"S60\",\n \"S61\",\n \"S62\",\n \"S63\",\n \"S64\"\n ],\n \"boundary\": \"tmux程序与配置、操控封装、终端会话和显示记录分开。\",\n \"pending\": [\n \"S40仅绑定tmux.c文件头许可选区;S41明确COPYING仅供信息参考、许可依文件头。2026-10-15第一轮固定pin许可清点见S52–S56;此轮未覆盖全部313文件、非C/H/Y资产、所有上游来源及再分发兼容性,limits.license_approved仍为false。\",\n \"2026-10-15:pin 615c27c11789948df2db09e113e882f82dfb3e1c有313个tracked文件、无嵌套gitlink。对196个C/H/Y文件作固定字面扫描:182个含ISC式授权句、13个含BSD式再分发句(compat/daemon-darwin.c与compat/getopt_long.c同时含两种),另有xmalloc.c(S55)/xmalloc.h(sha256 8d0a589c43e16549174b0ffb0b59a8581af00d99eb912205bfb4f293502bbeae)的Tatu Ylonen特殊使用与命名条件、compat/explicit_bzero.c的Public domain声明;BSD式文件为compat/bitstring.h、compat/daemon-darwin.c、compat/daemon.c、compat/getline.c、compat/getopt_long.c、compat/memmem.c、compat/queue.h、compat/strcasestr.c、compat/strsep.c、compat/tree.h、compat/unvis.c、compat/vis.c、compat/vis.h。README (S52)、COPYING (S41) 与 README.ja(sha256 c341a10636227e426a759da4b80b754258ef31f1554a9ac369a79c5afeeadeb6)列举的ISC例外不同;README.ja还列出SYNCING(sha256 5243f70e3adbb2f7554e99889d3ea9b5b719d50108ac127db1392ced65e7c61c),本轮未见该文件头许可声明;FAQ/TODO未跟踪。logo/LICENSE由S56单独绑定。getopt_long.c(S54)自述来源于OpenSSH commit b5b405fee7f3e79d44e2d2971a4b6b4cc53f112e,本轮未独立比对上游。该清点是有限静态检索而非法律兼容性意见;正式许可批准、完整文件级/第三方依赖审查仍未完成。\",\n \"2026-10-15第二轮固定pin非C/H/Y许可线索见S57–S64:仅审117个非C/H/Y tracked文件中的8个选区。mdoc2man.awk与tmux.1含逐文件版权、permission及免责声明;example_tmux.conf由作者声明Public domain;tools/24-bit-color.sh标注来源为iTerm2的master并称“presumably covered”于其LICENSE,未冻结或核对上游修订/条款;README.ja:59将本文件、CHANGES、FAQ、SYNCING、TODO列为ISC许可对象,与英文COPYING/README的列举不同;三个EPS文件头各自声明Apple 2000–2004 Copyright/All Rights Reserved,未证实logo/LICENSE是否覆盖。未审其余非C/H/Y文件、其他二进制资产及第三方依赖;不构成完整文件/权利/再分发兼容性审查,limits.license_approved仍为false。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-tmux\",\n \"grade_id\": \"faqi-huang-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:可选的多会话终端复用\",\n \"basis\": \"支持持久终端与多窗口工作流,复杂长任务可受益;普通编码闭环有替代方案,不属定义性核心。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是固定Git submodule修订中的tmux终端复用器源码,不等于本机3.4运行观察;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:固定源码在客户端/服务端进程、命令解析、socket和终端pane管理间组织功能;所选tmux.c段落需与整套源码及构建配置共同理解。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "固定源码在客户端/服务端进程、命令解析、socket和终端pane管理间组织功能;所选tmux.c段落需与整套源码及构建配置共同理解。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "需要编译/运行工具链、PTY、进程、socket及操作系统支持;本次未测CPU、内存、延迟或维护成本,固定源码版本也不代表安装状态。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对直接终端会话,tmux增加持久会话与窗口/pane复用层,也增加server/socket和配置复杂度;依赖图将其列为可选路径,不提供性能排名。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:固定Git submodule修订中的tmux终端复用器源码,不等于本机3.4运行观察时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "结论限定于固定submodule revision及其支持材料;不同运行版本、平台、编译选项和终端环境须另核;不借用tmux-runtime观察替代源码身份;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:固定Git submodule修订中的tmux终端复用器源码,不等于本机3.4运行观察时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定Git submodule源码显示客户端/服务端、命令解析、socket与pane管理;它绑定的是源码修订。推理根据:源码选区能支持该修订中代码组织的描述,却不能识别另一台机器当前安装的二进制或运行会话;源码身份与运行实例是不同对象。由于证据是固定源码而非目标主机的运行观察,因此第16项关于分开登记源码入口、输入和运行/副作用身份的局部边界规则。成立边界:第15项限定为“结论限定于固定submodule revision及其支持材料;不同运行版本、平台、编译选项和终端环境须另核;不借用tmux-runtime观察替代源码身份;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S21`;路径 `.github/tools/external/tmux/tmux.c`;选区SHA-256 `cd3c886c9a155f70dcddaeec88b4a86253c565b2e18753327f83446d92a7e8f4`;修订 `615c27c11789948df2db09e113e882f82dfb3e1c`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:faqi-claude-skill-init",
"fields": [
{
"name": "工具的名称",
"content": "官方Skill初始化脚本"
},
{
"name": "是什么",
"content": "现有登记将其界定为软件工件:只纳入skill-creator下生成目录/模板的独立Python程序,不把官方Skill集合、自然语言方法、模板或其他全部辅助脚本称作同一程序。\n此处复述登记边界,不证明当前可安装、可运行或有效。"
},
{
"name": "为什么",
"content": "在Vibe Coding流程中,本程序的具体用途是固定skill-creator目录中的Python初始化程序,生成新Skill目录及模板/示例文件。这是从固定README/源码可见功能解释使用场景,不声称它的历史采用动机或实际效果。"
},
{
"name": "怎么做",
"content": "固定Skill文档给出init_skill.py --path ;脚本验证参数后创建目标目录、SKILL.md及scripts/references/assets示例文件;未执行。以上是固定材料描述的历史/静态用法,未执行程序。"
},
{
"name": "扩展",
"content": "固定实现提供name/path参数及Skill模板资源骨架;生成内容仍需人工编辑,不把整个skill-creator Skill或其其他脚本并入本程序对象。"
},
{
"name": "关联信息",
"content": "法器对象ID=faqi-claude-skill-init;本体类型=software-artifact;版本声明=未声明;本地入口=无;Claude Skills固定Gitlink与独立初始化器已从当前树移除(2026-10-22);冻结来源字节、修订、SHA和历史初审仍保留于档案。当前运行实例/部署状态未在对象记录中声明。\nVibe Coding 重要性暂定:玄阶初级(grade_id=faqi-xuan-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:特定Skill模板初始化;分级依据:降低Claude Skill结构初始化成本,作用范围绑定特定生态,可手工完成且不影响其他Agent的基础闭环。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n来源ID:S23, S22, S43, S51。"
},
{
"name": "出处",
"content": "固定实现/佐证来源记录:{\n \"id\": \"S23\",\n \"purpose\": \"implementation\",\n \"path\": \".github/tools/external/claude-official-skills/skills/skill-creator/scripts/init_skill.py\",\n \"repository\": \".github/tools/external/claude-official-skills\",\n \"revision\": \"1ed29a03dc852d30fa6ef2ca53a67dc2c2c2c563\",\n \"sha256\": \"cf12790f1d4958799281920d599f56aea38fb5c26e2812a61dd740bf3d4b6b99\",\n \"lines\": [\n 194,\n 304\n ],\n \"selection_sha256\": \"f3ef6ff82946a9596d5cacfc1ed0405765187e5ffec5a4ede6c15f5e8dd248dd\"\n};{\n \"id\": \"S22\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/claude-official-skills/README.md\",\n \"repository\": \".github/tools/external/claude-official-skills\",\n \"revision\": \"1ed29a03dc852d30fa6ef2ca53a67dc2c2c2c563\",\n \"sha256\": \"d7c5c2f9b248c7c0b31f093cf22b9a7407f5b093c8ca9ebe75a5b6845b02b76e\",\n \"lines\": [\n 1,\n 28\n ],\n \"selection_sha256\": \"672c572d34a077a534754b7311d19db68a8402c86fe64e35be5e80da3ae7453a\"\n};{\n \"id\": \"S43\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/claude-official-skills/skills/skill-creator/LICENSE.txt\",\n \"repository\": \".github/tools/external/claude-official-skills\",\n \"revision\": \"1ed29a03dc852d30fa6ef2ca53a67dc2c2c2c563\",\n \"sha256\": \"58d1e17ffe5109a7ae296caafcadfdbe6a7d176f0bc4ab01e12a689b0499d8bd\",\n \"lines\": [\n 1,\n 203\n ],\n \"selection_sha256\": \"58d1e17ffe5109a7ae296caafcadfdbe6a7d176f0bc4ab01e12a689b0499d8bd\"\n};{\n \"id\": \"S51\",\n \"purpose\": \"support\",\n \"path\": \".github/tools/external/claude-official-skills/skills/skill-creator/SKILL.md\",\n \"repository\": \".github/tools/external/claude-official-skills\",\n \"revision\": \"1ed29a03dc852d30fa6ef2ca53a67dc2c2c2c563\",\n \"sha256\": \"d57b6e3a44535b9c0ef454dad5c86f5df78185fc80a65c7092885b4b5e10f81b\",\n \"lines\": [\n 263,\n 275\n ],\n \"selection_sha256\": \"a8130ff1f013777e2c076569f5567924a4a0f3b23df7134ab4b0b99dd1aa86e9\"\n}\n本地入口记录:{\n \"path\": \".github/tools/external/claude-official-skills\",\n \"objects\": [\n \"faqi-claude-skill-init\"\n ],\n \"sources\": [\n \"S22\",\n \"S23\",\n \"S43\",\n \"S51\"\n ],\n \"boundary\": \"集合入口不等于法器身份;指令内容与脚本实现分别判断。\",\n \"pending\": [\n \"README明确部分文档Skill仅source-available,不能把整个集合称为同一开源许可证;skill-creator/LICENSE.txt提供Apache 2.0文本,但其附录版权字段为通用占位符,不能单独证明权利主体或完成全量许可审查。\",\n \"本次不批准再分发/商用许可。\",\n \"S51绑定skill-creator/SKILL.md步骤3和调用形式,证实该文档要求执行S23;它不验证S23实际输入校验或路径限制,且本次未执行脚本。\",\n \"2026-10-14:固定pin 1ed29a03dc852d30fa6ef2ca53a67dc2c2c2c563的S23(init_skill.py:194-303)静态复核:CLI提示skill_name应为小写kebab-case,但main未校验;函数直接拼接Path(path).resolve()/skill_name且未检查目标仍在指定父目录内,若调用方传入含../或绝对路径的名称,输出可越出预期目录。目录/模板创建中途失败只返回错误,不回滚部分输出。风险取决于调用方输入控制;未运行脚本、未创建测试文件,不作可利用性或运行安全结论。其余辅助脚本仍未逐模块展开。\"\n ]\n}\n重要性分级记录:{\n \"subject_id\": \"faqi-claude-skill-init\",\n \"grade_id\": \"faqi-xuan-initial\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:特定Skill模板初始化\",\n \"basis\": \"降低Claude Skill结构初始化成本,作用范围绑定特定生态,可手工完成且不影响其他Agent的基础闭环。\"\n}\n运行/部署状态未由此登记证明;版本或路径记录不等于本次运行验证。"
},
{
"name": "相关图书",
"content": "本条所指是软件实现;固定来源是代码/README/Skill文档(见第7项),没有登记直接相关的图书书目,因此不把技术文档写成图书。"
},
{
"name": "它要解决什么问题?",
"content": "固定材料记录的目标用途是固定skill-creator目录中的Python初始化程序,生成新Skill目录及模板/示例文件;这说明该程序被设计/登记来处理的工作类型,不等于已验证的需求效果。具体输入、目标路径和副作用须按固定源码/README约定核对,不能把登记重要性当问题验收。"
},
{
"name": "为什么这样设计?",
"content": "源码可观察到的结构是:由name/path构造目标路径,已存在则返回错误;创建目录树,格式化SKILL_TEMPLATE与示例文件,设置example.py为可执行权限,并输出后续编辑指引。这说明当前控制流如何分工,不推断源码未记载的作者历史设计意图。"
},
{
"name": "内部如何实现?",
"content": "由name/path构造目标路径,已存在则返回错误;创建目录树,格式化SKILL_TEMPLATE与示例文件,设置example.py为可执行权限,并输出后续编辑指引。仅为固定源码静态说明,不表示已运行或完整审查全部上游实现。"
},
{
"name": "付出了什么代价?",
"content": "会在指定路径创建目录和多个文件,可能部分写入后失败;需要用户检查模板并维护生成内容,当前没有执行或测量。未执行程序,也没有资源/性能实测。"
},
{
"name": "比较不同技术与方法。",
"content": "相对手工创建文件,该脚本统一目录和示例骨架;手工方式更灵活但容易漏文件。初始化成功不证明生成的Skill符合质量要求。"
},
{
"name": "提炼共同规律。",
"content": "从本程序可归纳的局部规则是:固定skill-creator目录中的Python初始化程序,生成新Skill目录及模板/示例文件时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "需Python运行时、可写目标路径和符合约定的skill名;目标目录若已存在会拒绝创建;后续内容须按Skill规范完善并校验;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署。"
},
{
"name": "结论",
"content": "结论(限第15项条件):从本程序可归纳的局部规则是:固定skill-creator目录中的Python初始化程序,生成新Skill目录及模板/示例文件时必须区分程序入口、输入资产和输出/副作用;本条只总结该固定实现边界,不推广为所有工具的效能规律。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:固定Python脚本由名称和路径创建目录树、模板与示例文件,并在目标目录已存在时拒绝创建。推理根据:目录/模板初始化只产生待编辑的骨架;它不蕴含新Skill已经具有完整语义或通过验证。由于静态源码只支持生成流程和前提,不支持生成物的语义验收,因此第16项关于区分初始化程序、模板输入、文件输出和后续完善/校验的局部规则。成立边界:第15项限定为“需Python运行时、可写目标路径和符合约定的skill名;目标目录若已存在会拒绝创建;后续内容须按Skill规范完善并校验;结论限定于第7项绑定的源码修订和说明,不扩展到未观察版本或实际部署”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:来源ID `S23`;路径 `.github/tools/external/claude-official-skills/skills/skill-creator/scripts/init_skill.py`;选区SHA-256 `f3ef6ff82946a9596d5cacfc1ed0405765187e5ffec5a4ede6c15f5e8dd248dd`;修订 `1ed29a03dc852d30fa6ef2ca53a67dc2c2c2c563`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-pi-cli",
"fields": [
{
"name": "工具的名称",
"content": "Pi Agent CLI(当前 PATH 实例)"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为2.1 Agent运行时 / Pi Agent节点;身份状态与证据字段:pi --version 输出 1.1.0;type -a 显示多个同名入口,本记录只绑定当前 shell 选中的入口;先前环境记录为 1.0.4,宿主/路径差异尚未确认,不将此版本绑定到会话服务端。"
},
{
"name": "为什么",
"content": "依赖图将Pi Agent CLI(当前 PATH 实例)放在“2.1 Agent运行时 / Pi Agent”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“2.1 Agent运行时 / Pi Agent”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-pi-cli;图节点=2.1 Agent运行时 / Pi Agent;身份状态=runtime_observed;观测版本=1.1.0;相关本地对象=未关联。\nVibe Coding 重要性暂定:天阶高级(grade_id=faqi-tian-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:当前核心Agent运行与工具编排;分级依据:直接承接需求、上下文、模型调用和工具执行循环;当前环境的核心交互入口,缺失会改变Vibe Coding核心形态。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-pi-cli\",\n \"name\": \"Pi Agent CLI(当前 PATH 实例)\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"2.1 Agent运行时 / Pi Agent\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"1.1.0\",\n \"evidence\": \"pi --version 输出 1.1.0;type -a 显示多个同名入口,本记录只绑定当前 shell 选中的入口;先前环境记录为 1.0.4,宿主/路径差异尚未确认,不将此版本绑定到会话服务端。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"分级量表仍为 draft,初/中/高结果带阈值未校准;本条未建立任务族效果合同。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-pi-cli\",\n \"grade_id\": \"faqi-tian-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:当前核心Agent运行与工具编排\",\n \"basis\": \"直接承接需求、上下文、模型调用和工具执行循环;当前环境的核心交互入口,缺失会改变Vibe Coding核心形态。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“2.1 Agent运行时 / Pi Agent”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“2.1 Agent运行时 / Pi Agent”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:pi --version 输出 1.1.0;type -a 显示多个同名入口,本记录只绑定当前 shell 选中的入口;先前环境记录为 1.0.4,宿主/路径差异尚未确认,不将此版本绑定到会话服务端。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“2.1 Agent运行时 / Pi Agent”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "Pi与依赖图中命名的Codex候选是替代Agent运行时;本条只观察当前shell选中的Pi入口,不含同任务效能比较"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“2.1 Agent运行时 / Pi Agent”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:pi --version 输出 1.1.0;type -a 显示多个同名入口,本记录只绑定当前 shell 选中的入口;先前环境记录为 1.0.4,宿主/路径差异尚未确认,不将此版本绑定到会话服务端。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“2.1 Agent运行时 / Pi Agent”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“pi --version 输出 1.1.0;type -a 显示多个同名入口,本记录只绑定当前 shell 选中的入口;先前环境记录为 1.0.4,宿主/路径差异尚未确认,不将此版本绑定到会话服务端”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述Pi Agent CLI(当前 PATH 实例)在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:pi --version 输出 1.1.0;type -a 显示多个同名入口,本记录只绑定当前 shell 选中的入口;先前环境记录为 1.0.4,宿主/路径差异尚未确认,不将此版本绑定到会话服务端。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-codex-cli",
"fields": [
{
"name": "工具的名称",
"content": "Codex CLI(依赖图替代项)"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为2.1 Agent运行时 / Codex替代项节点;身份状态与证据字段:依赖图及外部资源行指向 Codex CLI 候选;当前安装身份、可执行入口、版本与来源未核。"
},
{
"name": "为什么",
"content": "依赖图将Codex CLI(依赖图替代项)放在“2.1 Agent运行时 / Codex替代项”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是具名候选,不是安装说明。依赖图把它放在“2.1 Agent运行时 / Codex替代项”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-codex-cli;图节点=2.1 Agent运行时 / Codex替代项;身份状态=named_candidate;观测版本=未记录;相关本地对象=未关联。;关联资源ID=tools-platforms-codex-cli-362bc20a。\nVibe Coding 重要性暂定:天阶中级(grade_id=faqi-tian-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:替代Agent运行时;分级依据:若选用可承担AI代码协作与工具编排核心;当前仅具名候选且可与其他运行时替换,低于已用核心路径。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n关联资源ID:tools-platforms-codex-cli-362bc20a。资源链接/本地关联不证明许可、兼容性或功能等价。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-codex-cli\",\n \"name\": \"Codex CLI(依赖图替代项)\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"2.1 Agent运行时 / Codex替代项\",\n \"identity_status\": \"named_candidate\",\n \"version\": null,\n \"evidence\": \"依赖图及外部资源行指向 Codex CLI 候选;当前安装身份、可执行入口、版本与来源未核。\",\n \"resource_ids\": [\n \"tools-platforms-codex-cli-362bc20a\"\n ],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"精确实现/版本、任务合同及分级量表阈值尚未确认。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-codex-cli\",\n \"grade_id\": \"faqi-tian-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:替代Agent运行时\",\n \"basis\": \"若选用可承担AI代码协作与工具编排核心;当前仅具名候选且可与其他运行时替换,低于已用核心路径。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的named_candidate对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“2.1 Agent运行时 / Codex替代项”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“2.1 Agent运行时 / Codex替代项”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:依赖图及外部资源行指向 Codex CLI 候选;当前安装身份、可执行入口、版本与来源未核。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "若采用该候选,会有版本兼容、配置、权限和维护责任;具体成本取决于“2.1 Agent运行时 / Codex替代项”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "依赖图列为Agent运行时替代项;与Pi观察实例比较时,Codex只具候选身份,当前版本/入口未记录"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“2.1 Agent运行时 / Codex替代项”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条只支持具名候选关系:依赖图及外部资源行指向 Codex CLI 候选;当前安装身份、可执行入口、版本与来源未核。未提供安装身份、版本、入口或运行记录;只有在补齐这些事实并匹配项目合同后,才能描述具体用法或效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“2.1 Agent运行时 / Codex替代项”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:依赖图与第7项所定位资源只把Codex CLI(依赖图替代项)记作候选,原说明明确当前安装身份、入口、版本与来源未核。推理根据:候选/关系记录能证明登记了一个候选对象,但不能证明本机安装了它;具体实例结论需要可识别的入口和版本观察。由于当前记录缺少安装实例的身份和版本证据,因此第16项所限的候选身份与待核边界:Codex CLI(依赖图替代项)不是已确认的本机依赖。成立边界:第15项限定为“本条只支持具名候选关系:依赖图及外部资源行指向 Codex CLI 候选;当前安装身份、可执行入口、版本与来源未核。未提供安装身份、版本、入口或运行记录;只有在补齐这些事实并匹配项目合同后,才能描述具体用法或效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-wsl2-platform",
"fields": [
{
"name": "工具的名称",
"content": "WSL 2 承载平台"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为6.1 Windows主机 / WSL节点;身份状态与证据字段:uname -r 含 microsoft-standard-WSL2,确认当前 Linux 内核运行在 WSL2 兼容环境;Windows宿主版本及 WSL 产品版本未核。"
},
{
"name": "为什么",
"content": "依赖图将WSL 2 承载平台放在“6.1 Windows主机 / WSL”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“6.1 Windows主机 / WSL”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-wsl2-platform;图节点=6.1 Windows主机 / WSL;身份状态=runtime_observed;观测版本=未记录;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶初级(grade_id=faqi-di-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:当前宿主环境实现;分级依据:为当前工具链提供运行宿主,但Linux、macOS或原生Windows等环境可替代,不是Vibe Coding定义性能力。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-wsl2-platform\",\n \"name\": \"WSL 2 承载平台\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"6.1 Windows主机 / WSL\",\n \"identity_status\": \"runtime_observed\",\n \"version\": null,\n \"evidence\": \"uname -r 含 microsoft-standard-WSL2,确认当前 Linux 内核运行在 WSL2 兼容环境;Windows宿主版本及 WSL 产品版本未核。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"承载平台精确版本、任务合同及分级量表阈值尚未确认。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-wsl2-platform\",\n \"grade_id\": \"faqi-di-initial\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:当前宿主环境实现\",\n \"basis\": \"为当前工具链提供运行宿主,但Linux、macOS或原生Windows等环境可替代,不是Vibe Coding定义性能力。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“6.1 Windows主机 / WSL”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“6.1 Windows主机 / WSL”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:uname -r 含 microsoft-standard-WSL2,确认当前 Linux 内核运行在 WSL2 兼容环境;Windows宿主版本及 WSL 产品版本未核。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“6.1 Windows主机 / WSL”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "图中与原生主机、VM/远程机及容器承载路径并列;WSL2观察不代表其他路径不可用"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“6.1 Windows主机 / WSL”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:uname -r 含 microsoft-standard-WSL2,确认当前 Linux 内核运行在 WSL2 兼容环境;Windows宿主版本及 WSL 产品版本未核。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“6.1 Windows主机 / WSL”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“uname -r 含 microsoft-standard-WSL2,确认当前 Linux 内核运行在 WSL2 兼容环境;Windows宿主版本及 WSL 产品版本未核”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述WSL 2 承载平台在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:uname -r 含 microsoft-standard-WSL2,确认当前 Linux 内核运行在 WSL2 兼容环境;Windows宿主版本及 WSL 产品版本未核。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-ubuntu-userland",
"fields": [
{
"name": "工具的名称",
"content": "Ubuntu 用户空间发行版"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为6.1 Linux发行版 / Ubuntu节点;身份状态与证据字段:/etc/os-release 报告 Ubuntu 24.04.3 LTS(VERSION_ID=24.04)。"
},
{
"name": "为什么",
"content": "依赖图将Ubuntu 用户空间发行版放在“6.1 Linux发行版 / Ubuntu”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“6.1 Linux发行版 / Ubuntu”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-ubuntu-userland;图节点=6.1 Linux发行版 / Ubuntu;身份状态=runtime_observed;观测版本=24.04.3 LTS;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶初级(grade_id=faqi-di-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:当前Linux用户空间;分级依据:承载当前工具链和本地命令,但同类操作系统环境可以替代,重要性来自运行基座而非该发行版身份。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-ubuntu-userland\",\n \"name\": \"Ubuntu 用户空间发行版\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"6.1 Linux发行版 / Ubuntu\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"24.04.3 LTS\",\n \"evidence\": \"/etc/os-release 报告 Ubuntu 24.04.3 LTS(VERSION_ID=24.04)。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-ubuntu-userland\",\n \"grade_id\": \"faqi-di-initial\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:当前Linux用户空间\",\n \"basis\": \"承载当前工具链和本地命令,但同类操作系统环境可以替代,重要性来自运行基座而非该发行版身份。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“6.1 Linux发行版 / Ubuntu”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“6.1 Linux发行版 / Ubuntu”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:/etc/os-release 报告 Ubuntu 24.04.3 LTS(VERSION_ID=24.04)。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“6.1 Linux发行版 / Ubuntu”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "图中Ubuntu是Linux发行版/用户空间的一种选择,其他发行版为替代;当前只记录此环境版本"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“6.1 Linux发行版 / Ubuntu”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:/etc/os-release 报告 Ubuntu 24.04.3 LTS(VERSION_ID=24.04)。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“6.1 Linux发行版 / Ubuntu”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“/etc/os-release 报告 Ubuntu 24.04.3 LTS(VERSION_ID=24.04)”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述Ubuntu 用户空间发行版在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:/etc/os-release 报告 Ubuntu 24.04.3 LTS(VERSION_ID=24.04)。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-wsl2-kernel",
"fields": [
{
"name": "工具的名称",
"content": "WSL2 Linux 内核"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为6.1 WSL / 版本对应的Linux内核节点;身份状态与证据字段:uname -r 输出 6.6.87.2-microsoft-standard-WSL2;不据内核版本推断 Windows/WSL 产品版本。"
},
{
"name": "为什么",
"content": "依赖图将WSL2 Linux 内核放在“6.1 WSL / 版本对应的Linux内核”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“6.1 WSL / 版本对应的Linux内核”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-wsl2-kernel;图节点=6.1 WSL / 版本对应的Linux内核;身份状态=runtime_observed;观测版本=6.6.87.2-microsoft-standard-WSL2;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶初级(grade_id=faqi-di-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:当前运行环境内核;分级依据:提供当前WSL用户空间的执行底座,但存在其他内核和宿主替代,不属于AI编程核心能力。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-wsl2-kernel\",\n \"name\": \"WSL2 Linux 内核\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"6.1 WSL / 版本对应的Linux内核\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"6.6.87.2-microsoft-standard-WSL2\",\n \"evidence\": \"uname -r 输出 6.6.87.2-microsoft-standard-WSL2;不据内核版本推断 Windows/WSL 产品版本。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-wsl2-kernel\",\n \"grade_id\": \"faqi-di-initial\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:当前运行环境内核\",\n \"basis\": \"提供当前WSL用户空间的执行底座,但存在其他内核和宿主替代,不属于AI编程核心能力。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“6.1 WSL / 版本对应的Linux内核”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“6.1 WSL / 版本对应的Linux内核”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:uname -r 输出 6.6.87.2-microsoft-standard-WSL2;不据内核版本推断 Windows/WSL 产品版本。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“6.1 WSL / 版本对应的Linux内核”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "图中为WSL2承载的版本对应内核;不能与Ubuntu用户空间或Windows产品版本混为一项"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“6.1 WSL / 版本对应的Linux内核”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:uname -r 输出 6.6.87.2-microsoft-standard-WSL2;不据内核版本推断 Windows/WSL 产品版本。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“6.1 WSL / 版本对应的Linux内核”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“uname -r 输出 6.6.87.2-microsoft-standard-WSL2;不据内核版本推断 Windows/WSL 产品版本”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述WSL2 Linux 内核在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:uname -r 输出 6.6.87.2-microsoft-standard-WSL2;不据内核版本推断 Windows/WSL 产品版本。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-bash",
"fields": [
{
"name": "工具的名称",
"content": "GNU Bash"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为6.2 Shell与命令解释器节点;身份状态与证据字段:bash --version 输出 GNU bash 5.2.21。"
},
{
"name": "为什么",
"content": "依赖图将GNU Bash放在“6.2 Shell与命令解释器”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“6.2 Shell与命令解释器”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-bash;图节点=6.2 Shell与命令解释器;身份状态=runtime_observed;观测版本=5.2.21;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶高级(grade_id=faqi-di-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:Agent命令执行与脚本交互;分级依据:直接承接终端命令、开发脚本和验证操作,是当前Agent落地代码动作的高重要性接口;Shell实现可替代但该角色不可缺。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-bash\",\n \"name\": \"GNU Bash\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"6.2 Shell与命令解释器\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"5.2.21\",\n \"evidence\": \"bash --version 输出 GNU bash 5.2.21。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-bash\",\n \"grade_id\": \"faqi-di-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:Agent命令执行与脚本交互\",\n \"basis\": \"直接承接终端命令、开发脚本和验证操作,是当前Agent落地代码动作的高重要性接口;Shell实现可替代但该角色不可缺。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“6.2 Shell与命令解释器”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“6.2 Shell与命令解释器”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:bash --version 输出 GNU bash 5.2.21。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“6.2 Shell与命令解释器”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "Shell/命令解释器层可替换为其他Shell;版本观察不证明脚本在所有Shell兼容"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“6.2 Shell与命令解释器”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:bash --version 输出 GNU bash 5.2.21。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“6.2 Shell与命令解释器”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“bash --version 输出 GNU bash 5.2.21”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述GNU Bash在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:bash --version 输出 GNU bash 5.2.21。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-python-runtime",
"fields": [
{
"name": "工具的名称",
"content": "Python 运行时"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为4.3 语言与运行时节点;身份状态与证据字段:python3 --version 输出 Python 3.12.3。"
},
{
"name": "为什么",
"content": "依赖图将Python 运行时放在“4.3 语言与运行时”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“4.3 语言与运行时”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-python-runtime;图节点=4.3 语言与运行时;身份状态=runtime_observed;观测版本=3.12.3;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶中级(grade_id=faqi-di-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:脚本、工具与项目代码运行;分级依据:支撑本仓工具及大量Python项目的执行和验证;语言运行时可按项目替代,重要但非所有Vibe Coding任务必需。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-python-runtime\",\n \"name\": \"Python 运行时\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"4.3 语言与运行时\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"3.12.3\",\n \"evidence\": \"python3 --version 输出 Python 3.12.3。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-python-runtime\",\n \"grade_id\": \"faqi-di-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:脚本、工具与项目代码运行\",\n \"basis\": \"支撑本仓工具及大量Python项目的执行和验证;语言运行时可按项目替代,重要但非所有Vibe Coding任务必需。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“4.3 语言与运行时”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“4.3 语言与运行时”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:python3 --version 输出 Python 3.12.3。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“4.3 语言与运行时”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "语言/运行时选择依赖项目;与Node等运行时不是通用互换关系,本条只记录Python版本"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“4.3 语言与运行时”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:python3 --version 输出 Python 3.12.3。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“4.3 语言与运行时”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“python3 --version 输出 Python 3.12.3”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述Python 运行时在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:python3 --version 输出 Python 3.12.3。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-nodejs-runtime",
"fields": [
{
"name": "工具的名称",
"content": "Node.js 运行时"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为4.3 语言与运行时节点;身份状态与证据字段:node --version 输出 v22.23.2。"
},
{
"name": "为什么",
"content": "依赖图将Node.js 运行时放在“4.3 语言与运行时”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“4.3 语言与运行时”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-nodejs-runtime;图节点=4.3 语言与运行时;身份状态=runtime_observed;观测版本=22.23.2;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶中级(grade_id=faqi-di-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:前端及工具链代码运行;分级依据:支撑前端、Node项目和本仓Markdown工具链;具体语言环境可替代,重要性低于通用Agent与终端执行核心。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-nodejs-runtime\",\n \"name\": \"Node.js 运行时\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"4.3 语言与运行时\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"22.23.2\",\n \"evidence\": \"node --version 输出 v22.23.2。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-nodejs-runtime\",\n \"grade_id\": \"faqi-di-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:前端及工具链代码运行\",\n \"basis\": \"支撑前端、Node项目和本仓Markdown工具链;具体语言环境可替代,重要性低于通用Agent与终端执行核心。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“4.3 语言与运行时”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“4.3 语言与运行时”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:node --version 输出 v22.23.2。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“4.3 语言与运行时”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "语言/运行时选择依赖项目;与Python等运行时面向不同工具链,本条只记录Node版本"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“4.3 语言与运行时”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:node --version 输出 v22.23.2。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“4.3 语言与运行时”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“node --version 输出 v22.23.2”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述Node.js 运行时在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:node --version 输出 v22.23.2。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-npm-npx",
"fields": [
{
"name": "工具的名称",
"content": "npm / npx 工具"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为4.2 包管理器与依赖解析器节点;身份状态与证据字段:npm --version 与 npx --version 均输出 10.9.8;登记为同一当前工具链版本观测,不把命令入口重复计数为两件法器。"
},
{
"name": "为什么",
"content": "依赖图将npm / npx 工具放在“4.2 包管理器与依赖解析器”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“4.2 包管理器与依赖解析器”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-npm-npx;图节点=4.2 包管理器与依赖解析器;身份状态=runtime_observed;观测版本=10.9.8;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶中级(grade_id=faqi-di-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:Node依赖解析与工具调用;分级依据:让Node生态依赖和命令行工具可安装、解析与调用;作用范围依赖项目技术栈,可由其他生态包管理器替代。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-npm-npx\",\n \"name\": \"npm / npx 工具\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"4.2 包管理器与依赖解析器\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"10.9.8\",\n \"evidence\": \"npm --version 与 npx --version 均输出 10.9.8;登记为同一当前工具链版本观测,不把命令入口重复计数为两件法器。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-npm-npx\",\n \"grade_id\": \"faqi-di-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:Node依赖解析与工具调用\",\n \"basis\": \"让Node生态依赖和命令行工具可安装、解析与调用;作用范围依赖项目技术栈,可由其他生态包管理器替代。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“4.2 包管理器与依赖解析器”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“4.2 包管理器与依赖解析器”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:npm --version 与 npx --version 均输出 10.9.8;登记为同一当前工具链版本观测,不把命令入口重复计数为两件法器。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“4.2 包管理器与依赖解析器”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "包管理/命令执行入口可与其他生态包管理器或可信缓存路径比较;本条记录npm/npx同一版本观察"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“4.2 包管理器与依赖解析器”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:npm --version 与 npx --version 均输出 10.9.8;登记为同一当前工具链版本观测,不把命令入口重复计数为两件法器。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“4.2 包管理器与依赖解析器”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“npm --version 与 npx --version 均输出 10.9.8;登记为同一当前工具链版本观测,不把命令入口重复计数为两件法器”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述npm / npx 工具在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:npm --version 与 npx --version 均输出 10.9.8;登记为同一当前工具链版本观测,不把命令入口重复计数为两件法器。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-git-client",
"fields": [
{
"name": "工具的名称",
"content": "Git 本地客户端"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为3.2 文件与代码 / Git本地客户端与工作树节点;身份状态与证据字段:git --version 输出 git version 2.43.0。"
},
{
"name": "为什么",
"content": "依赖图将Git 本地客户端放在“3.2 文件与代码 / Git本地客户端与工作树”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“3.2 文件与代码 / Git本地客户端与工作树”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-git-client;图节点=3.2 文件与代码 / Git本地客户端与工作树;身份状态=runtime_observed;观测版本=2.43.0;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶高级(grade_id=faqi-di-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:代码变更追踪、比较与恢复;分级依据:支撑审查AI改动、保留版本历史和安全回退,是可维护代码生成闭环的高重要性基础;版本控制实现可替代。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-git-client\",\n \"name\": \"Git 本地客户端\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"3.2 文件与代码 / Git本地客户端与工作树\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"2.43.0\",\n \"evidence\": \"git --version 输出 git version 2.43.0。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-git-client\",\n \"grade_id\": \"faqi-di-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:代码变更追踪、比较与恢复\",\n \"basis\": \"支撑审查AI改动、保留版本历史和安全回退,是可维护代码生成闭环的高重要性基础;版本控制实现可替代。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“3.2 文件与代码 / Git本地客户端与工作树”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“3.2 文件与代码 / Git本地客户端与工作树”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:git --version 输出 git version 2.43.0。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“3.2 文件与代码 / Git本地客户端与工作树”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "用于本地版本追踪的Git客户端,与其他版本控制或无版本控制工作流不同;本条无同工作负载对照"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“3.2 文件与代码 / Git本地客户端与工作树”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:git --version 输出 git version 2.43.0。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“3.2 文件与代码 / Git本地客户端与工作树”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“git --version 输出 git version 2.43.0”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述Git 本地客户端在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:git --version 输出 git version 2.43.0。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-gnu-make",
"fields": [
{
"name": "工具的名称",
"content": "GNU Make"
},
{
"name": "是什么",
"content": "现有依赖图将其记录为4.3 构建系统节点;身份状态与证据字段:make --version 输出 GNU Make 4.3。"
},
{
"name": "为什么",
"content": "依赖图将GNU Make放在“4.3 构建系统”,用于表示该层提供的能力或承载关系。此为架构角色说明,不反推本机选择动机,也不证明该依赖对所有任务必需。"
},
{
"name": "怎么做",
"content": "本条是环境观察记录,不是安装说明。依赖图把它放在“4.3 构建系统”职责层;若要采用,具体操作必须依具名产品、版本与项目合同确定,不能从该记录反推已安装或运行。"
},
{
"name": "扩展",
"content": "本对象表示单个依赖图节点(运行观察或具名候选),不是插件/扩展集合;其他版本、替代实现和配置应按各自身份另行说明,不从本条自动继承能力。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-gnu-make;图节点=4.3 构建系统;身份状态=runtime_observed;观测版本=4.3;相关本地对象=未关联。\nVibe Coding 重要性暂定:地阶初级(grade_id=faqi-di-initial;状态=user_directed_provisional);范围:Vibe Coding重要性:可重复构建与检查入口;分级依据:把构建和验证命令组织成可重复入口有助于交付,但Make可由其他任务运行器或脚本替代。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖图来源:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n依赖图对象记录:{\n \"id\": \"dep-gnu-make\",\n \"name\": \"GNU Make\",\n \"type_id\": \"software-artifact\",\n \"graph_node\": \"4.3 构建系统\",\n \"identity_status\": \"runtime_observed\",\n \"version\": \"4.3\",\n \"evidence\": \"make --version 输出 GNU Make 4.3。\",\n \"resource_ids\": [],\n \"related_object_id\": null,\n \"grade_id\": null,\n \"grade_status\": \"pending\",\n \"grade_reason\": \"版本观测不等于具体任务效果;分级量表阈值未校准。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-gnu-make\",\n \"grade_id\": \"faqi-di-initial\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:可重复构建与检查入口\",\n \"basis\": \"把构建和验证命令组织成可重复入口有助于交付,但Make可由其他任务运行器或脚本替代。\"\n}\n版本/身份字段仅按依赖图记录呈现;未据此推断当前环境中正在运行。"
},
{
"name": "相关图书",
"content": "本条指向依赖图中的runtime_observed对象或观察记录,不是图书主题;固定来源为技术栈依赖图及其环境证据(见第7项),本项不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在依赖图中,本节点承担“4.3 构建系统”的环境/工具职责;它回答的是系统如何提供该层能力,不单独定义某个业务问题或验收目标。"
},
{
"name": "为什么这样设计?",
"content": "依赖图将“4.3 构建系统”与其他层分开记录,避免把运行实例、源码、类别和承载平台混为一体。这解释登记结构,不声称上游软件设计者的历史动机。"
},
{
"name": "内部如何实现?",
"content": "依赖图记录的证据是:make --version 输出 GNU Make 4.3。这只描述登记的入口、身份或观察,不扩展为未观察的内部调用链或产品实现。"
},
{
"name": "付出了什么代价?",
"content": "该观察对象对应的环境层,会有版本兼容、配置、权限和维护责任;具体成本取决于“4.3 构建系统”所承载的工作负载。登记没有该实例的资源/延迟/维护测量,不据等级推断成本。"
},
{
"name": "比较不同技术与方法。",
"content": "Make是依赖图所列构建任务组织方式之一,可由其他构建入口替代;本条不比较速度或项目适配度"
},
{
"name": "提炼共同规律。",
"content": "依赖图层面的共同规则是:将“4.3 构建系统”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "本条限定于依赖图记录的环境观察:make --version 输出 GNU Make 4.3。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):依赖图层面的共同规则是:将“4.3 构建系统”的运行身份、观测版本、来源与关系分开记录;版本观察不等同于持续运行,也不等同于固定源码版本。该规则是登记边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项/第18项对应的一次环境记录是“make --version 输出 GNU Make 4.3”。推理根据:命令输出或环境文件读取只支持所记录环境、入口或文件在该时点的有限事实;它不证明其他同名入口、后续持续运行、固定源码修订或任务效果。由于该记录只描述GNU Make在所列命令/文件和环境中的观察时点,不是永久或跨环境属性,因此第16项所述运行身份、版本、来源与关系分开记录的边界适用于该观察;具体值仅限上述记录。成立边界:第15项限定为“本条限定于依赖图记录的环境观察:make --version 输出 GNU Make 4.3。不得将该版本/入口外推到其他主机、后续时点、固定源码版本或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-tmux-runtime",
"fields": [
{
"name": "工具的名称",
"content": "tmux 当前运行实例"
},
{
"name": "是什么",
"content": "这是依赖图中的一次历史运行实例观察:2026-10-15记录PATH/realpath为`/usr/bin/tmux`,dpkg包为tmux 3.4-1ubuntu0.1(amd64),并记录二进制SHA。该观察不证明当前仍安装或运行。"
},
{
"name": "为什么",
"content": "依赖图将tmux复用支路列为多会话终端工作的一种可选路径;其为何在该历史环境被选用未记录。重要性分级是工作流位置,不是采用动机或实测必要性。"
},
{
"name": "怎么做",
"content": "登记只记录版本/路径观察,没有同版本操作步骤或真实工作负载记录;因此本条不陈述启动、会话管理或权限行为。固定submodule手册属于另一个源码对象,不能替代该实例的操作证据。"
},
{
"name": "扩展",
"content": "本对象表示单一运行实例观察,不适用把配置插件或源码扩展算作实例自身的能力;相关配置与固定tmux源码分别登记。"
},
{
"name": "关联信息",
"content": "依赖图对象ID=dep-tmux-runtime;图节点=3.2 命令/终端 / tmux复用支路;身份状态=runtime_observed;观测版本=3.4;相关本地对象=faqi-tmux。\nVibe Coding 重要性暂定:黄阶高级(grade_id=faqi-huang-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:长任务与多会话终端复用;分级依据:可持久化和并行组织终端工作,复杂协作时有价值;普通单会话开发可替代,不属于核心生成链。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n依赖图关联固定源码对象`faqi-tmux`及终端/PTY类别;运行包3.4与固定submodule修订不是同一版本,不能合并身份或相互借用行为结论。"
},
{
"name": "出处",
"content": "依赖图观察记录时间`2026-10-15T00:45:37Z`,路径`/usr/bin/tmux`,dpkg `3.4-1ubuntu0.1`、amd64及二进制SHA见原观察字段;依赖树来源为technology-stack.md锚点`reference-technology-stack-十六技术栈的层级结构`(SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`)。固定submodule `615c27c11789948df2db09e113e882f82dfb3e1c`另属源码对象。"
},
{
"name": "相关图书",
"content": "本条是带时间戳的软件运行观察,不是书目对象;记录未提供直接关联的作者、书名、版次或章节,故不列图书。"
},
{
"name": "它要解决什么问题?",
"content": "在历史依赖图中表示终端复用分支所观察到的tmux运行实例;该记录没有证明某次任务因它而解决了什么问题,也未比较单终端替代方案。"
},
{
"name": "为什么这样设计?",
"content": "不适用:本条是运行实例观察,不是tmux产品设计。依赖图将其置于可选复用支路的理由属于系统架构说明,不能反推上游设计者意图。"
},
{
"name": "内部如何实现?",
"content": "本条记录的是运行实例观察而非源码审查;固定submodule声明next-3.7,与观察到的3.4包版本不同,不能据该源码说明本实例的内部实现。"
},
{
"name": "付出了什么代价?",
"content": "没有记录本实例的CPU、内存、延迟、维护或终端故障测量;源码包版本和重要性分级不能替代运行成本。额外复用层的具体成本待同工作负载测量。"
},
{
"name": "比较不同技术与方法。",
"content": "当前只可确认历史运行实例与固定submodule源码身份不同;没有同任务、同环境下与直接Terminal/PTY或其他复用工具的比较数据,不能排名。"
},
{
"name": "提炼共同规律。",
"content": "单条环境观察不足以归纳多方案的效能规律;本条只支持一个登记规则:版本/路径需绑定观测时间,源码与运行实例分开登记。此项是数据身份边界,不是效能结论。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "上述路径、包版本、架构及SHA只适用于2026-10-15记录的机器状态;系统升级、PATH或包变化后须重新观察。固定源码和本机二进制不可互换,且该观察不证明当前运行、权限或任务效果。"
},
{
"name": "结论",
"content": "结论(限第15项条件):单条环境观察不足以归纳多方案的效能规律;本条只支持一个登记规则:版本/路径需绑定观测时间,源码与运行实例分开登记。此项是数据身份边界,不是效能结论。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:第7项记录的是2026-10-15的/usr/bin/tmux路径、dpkg 3.4-1ubuntu0.1版本及二进制SHA;同时固定submodule源码修订声明next-3.7。推理根据:运行二进制和固定源码是不同对象,且路径/版本/SHA是时点观察;不能从旧记录推出当前仍安装、运行或由该源码构建。由于记录时间与对象身份不同,源码pin也不等于本机二进制来源,因此第16项所限的版本/路径按观察时点绑定、源码与运行实例分开登记。成立边界:第15项限定为“上述路径、包版本、架构及SHA只适用于2026-10-15记录的机器状态;系统升级、PATH或包变化后须重新观察。固定源码和本机二进制不可互换,且该观察不证明当前运行、权限或任务效果”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-cloud-model-api",
"fields": [
{
"name": "工具的名称",
"content": "2.2 云端模型服务/API与固定模型版本"
},
{
"name": "是什么",
"content": "依赖图中的抽象类别,指云端模型服务/API与固定模型版本;不指某家供应商、账号、已部署endpoint或一个模型权重文件。服务/API、模型制品和Tokenizer在来源中分开建模。"
},
{
"name": "为什么",
"content": "技术栈文档将模型推理列为AI编码循环的本地或云端替代路径;云端类别用于表示经服务/API取得推理能力。此处解释类别在架构中的作用,不代表该类别对每个任务必需或已被具体采用。"
},
{
"name": "怎么做",
"content": "作为抽象类别没有唯一安装步骤。具体采用时需先选定服务/API和固定模型版本,再按实际契约核对认证、配额、限流、计费、DNS/TLS/网络、错误和数据边界;当前登记未绑定具体产品。"
},
{
"name": "扩展",
"content": "来源允许与本地模型权重/Tokenizer/推理引擎形成替代路径;供应商、模型版本和服务契约需另立具体对象,不能把替代实现当成本类别的已启用扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-cloud-model-api;类别节点=2.2 云端模型服务/API与固定模型版本;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:天阶高级(grade_id=faqi-tian-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:核心模型推理与代码生成;分级依据:提供理解需求、推理和生成代码的核心智能能力;没有模型推理路径即失去Vibe Coding的定义性特征,供应商与模型可替换。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。\n与Agent模型请求/响应、固定模型版本、身份认证、配额、网络、服务端模型制品和推理基础设施有关;这些是依赖图关系,不是同一登记对象。"
},
{
"name": "出处",
"content": "依赖类别记录`dep-category-cloud-model-api`及user_confirmed_in_scope范围见法器登记;分类依据来自`.github/docs/gongfa/technology-stack.md`锚点`reference-technology-stack-十六技术栈的层级结构`(SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`)。本条不绑定供应商文档或运行实例。"
},
{
"name": "相关图书",
"content": "类别来源没有指向与该抽象类别直接相关的作者、书名、版本或章节;模型及供应商文档不是图书,本项不列书目。"
},
{
"name": "它要解决什么问题?",
"content": "表示Agent获得模型推理能力的一种托管依赖路径,并显式留下模型版本、服务契约和网络/身份边界;具体业务任务仍由用户目标和验收定义。"
},
{
"name": "为什么这样设计?",
"content": "依赖图把云端推理API与模型制品、Tokenizer和本地硬件分开,并将本地/云端作为替代分支,以免把服务接口、模型文件和承载资源混成一种身份;这是架构图的分层表达。"
},
{
"name": "内部如何实现?",
"content": "不适用:本条是依赖类别,没有单一内部实现。具体服务可能采用不同请求协议、模型服务和基础设施,须对具名实现单独核验。"
},
{
"name": "付出了什么代价?",
"content": "来源列出认证、配额、限流、计费、DNS/TLS/网络和托管基础设施;这些是需要核查的成本/依赖维度,不是本类别已经测得的延迟、费用或可用性。数据处理与隐私条件也须按具体服务合同核验。"
},
{
"name": "比较不同技术与方法。",
"content": "来源只给出云端与本地推理两类替代路径:前者依赖服务/API、网络和服务商基础设施;后者依赖本地权重、Tokenizer、推理引擎、驱动及设备资源。未按具体工作负载、预算或隐私合同比较胜负。"
},
{
"name": "提炼共同规律。",
"content": "编辑归纳:模型能力、服务接口、模型制品和承载基础设施应分别识别;类别层比较只能提出共同维度,不能替代固定版本、环境和服务合同的验证。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "只有在具体服务/API、模型版本、认证权限、配额、错误/超时、网络、数据处理和费用合同已核实后,才能描述某一实现。类别本身不证明任何供应商可用、已部署或对目标任务有效;本地推理是替代路径而非自动回退保证。"
},
{
"name": "结论",
"content": "结论(限第15项条件):编辑归纳:模型能力、服务接口、模型制品和承载基础设施应分别识别;类别层比较只能提出共同维度,不能替代固定版本、环境和服务合同的验证。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“2.2 云端模型服务/API与固定模型版本”明确列作抽象依赖类别;第11项说明“本条是依赖类别,没有单一内部实现。具体服务可能采用不同请求协议、模型服务和基础设施,须对具名实现单独核验”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“模型能力、服务接口、模型制品和承载基础设施应分别识别”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“只有在具体服务/API、模型版本、认证权限、配额、错误/超时、网络、数据处理和费用合同已核实后,才能描述某一实现。类别本身不证明任何供应商可用、已部署或对目标任务有效;本地推理是替代路径而非自动回退保证”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-local-model-stack",
"fields": [
{
"name": "工具的名称",
"content": "2.2 本地模型权重、Tokenizer与推理引擎"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:2.2 本地模型权重、Tokenizer与推理引擎;纳入依据:用户确认此依赖类别已核并要求纳入;模型制品、Tokenizer与推理程序分别判断;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“在本地加载模型权重、Tokenizer和推理引擎”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“在本地加载模型权重、Tokenizer和推理引擎”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-local-model-stack;类别节点=2.2 本地模型权重、Tokenizer与推理引擎;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:天阶中级(grade_id=faqi-tian-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:本地/离线模型推理路径;分级依据:可提供核心模型推理并支持本地化、隐私或离线需求;在通用工作流中可由云端推理替代,故低于定义性核心路径。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-local-model-stack\",\n \"node\": \"2.2 本地模型权重、Tokenizer与推理引擎\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此依赖类别已核并要求纳入;模型制品、Tokenizer与推理程序分别判断;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-local-model-stack\",\n \"grade_id\": \"faqi-tian-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:本地/离线模型推理路径\",\n \"basis\": \"可提供核心模型推理并支持本地化、隐私或离线需求;在通用工作流中可由云端推理替代,故低于定义性核心路径。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“在本地加载模型权重、Tokenizer和推理引擎”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(模型/Tokenizer/量化版本、运行库、驱动、OS、CPU/GPU、内存、存储、散热与供电);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "云端API是另一条推理路径;本地路径增加本机资源与维护责任,未给出同负载比较。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分在本地加载模型权重、Tokenizer和推理引擎与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此依赖类别已核并要求纳入;模型制品、Tokenizer与推理程序分别判断;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分在本地加载模型权重、Tokenizer和推理引擎与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“2.2 本地模型权重、Tokenizer与推理引擎”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分在本地加载模型权重、Tokenizer和推理引擎与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此依赖类别已核并要求纳入;模型制品、Tokenizer与推理程序分别判断;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-terminal-pty",
"fields": [
{
"name": "工具的名称",
"content": "3.2 Terminal Emulator / PTY"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:3.2 Terminal Emulator / PTY;纳入依据:用户确认此依赖类别已核并要求纳入;终端模拟器与PTY系统接口分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“为工具进程提供终端模拟器、PTY、Shell和标准I/O边界”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“为工具进程提供终端模拟器、PTY、Shell和标准I/O边界”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-terminal-pty;类别节点=3.2 Terminal Emulator / PTY;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:地阶高级(grade_id=faqi-di-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:Agent调用工具与执行开发命令;分级依据:把Agent计划转成真实文件、构建和测试操作的关键执行边界;没有等价工具执行通道,代码闭环无法完成。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-terminal-pty\",\n \"node\": \"3.2 Terminal Emulator / PTY\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此依赖类别已核并要求纳入;终端模拟器与PTY系统接口分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-terminal-pty\",\n \"grade_id\": \"faqi-di-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:Agent调用工具与执行开发命令\",\n \"basis\": \"把Agent计划转成真实文件、构建和测试操作的关键执行边界;没有等价工具执行通道,代码闭环无法完成。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“为工具进程提供终端模拟器、PTY、Shell和标准I/O边界”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(OS PTY、终端模拟器、Shell、进程与文件句柄);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "直接终端与tmux复用是替代层次;PTY系统接口不等于某个具体终端产品。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分为工具进程提供终端模拟器、PTY、Shell和标准I/O边界与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此依赖类别已核并要求纳入;终端模拟器与PTY系统接口分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分为工具进程提供终端模拟器、PTY、Shell和标准I/O边界与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“3.2 Terminal Emulator / PTY”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分为工具进程提供终端模拟器、PTY、Shell和标准I/O边界与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此依赖类别已核并要求纳入;终端模拟器与PTY系统接口分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-package-sources",
"fields": [
{
"name": "工具的名称",
"content": "4.2 包注册表、Git源与可信缓存"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:4.2 包注册表、Git源与可信缓存;纳入依据:用户确认此依赖类别已核并要求纳入;注册表、Git来源与缓存分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“取得并解析项目依赖的包注册表、Git源或可信缓存”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“取得并解析项目依赖的包注册表、Git源或可信缓存”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-package-sources;类别节点=4.2 包注册表、Git源与可信缓存;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:地阶中级(grade_id=faqi-di-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:依赖获取、锁定与复现;分级依据:支持安装成熟组件、解析代码依赖和重建开发环境;具体注册表与来源有替代,不直接承担AI生成。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-package-sources\",\n \"node\": \"4.2 包注册表、Git源与可信缓存\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此依赖类别已核并要求纳入;注册表、Git来源与缓存分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-package-sources\",\n \"grade_id\": \"faqi-di-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:依赖获取、锁定与复现\",\n \"basis\": \"支持安装成熟组件、解析代码依赖和重建开发环境;具体注册表与来源有替代,不直接承担AI生成。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“取得并解析项目依赖的包注册表、Git源或可信缓存”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(解析器、来源身份、TLS/认证、完整性校验、锁定版本与缓存状态);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "网络仓库和可信缓存是替代获取路径;选择需核对完整性、可复现性与可用性。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分取得并解析项目依赖的包注册表、Git源或可信缓存与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此依赖类别已核并要求纳入;注册表、Git来源与缓存分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分取得并解析项目依赖的包注册表、Git源或可信缓存与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“4.2 包注册表、Git源与可信缓存”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分取得并解析项目依赖的包注册表、Git源或可信缓存与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此依赖类别已核并要求纳入;注册表、Git来源与缓存分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-ci-platform",
"fields": [
{
"name": "工具的名称",
"content": "7.1 Git托管、CI Runner与CI/CD平台"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:7.1 Git托管、CI Runner与CI/CD平台;纳入依据:用户确认此依赖类别已核并要求纳入;托管服务、Runner执行环境与CI/CD平台分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“托管代码变更触发器、Runner和自动构建/验证工作流”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“托管代码变更触发器、Runner和自动构建/验证工作流”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-ci-platform;类别节点=7.1 Git托管、CI Runner与CI/CD平台;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:玄阶高级(grade_id=faqi-xuan-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:自动化验证、协作与持续交付;分级依据:把代码生成接入可重复测试、审查和协作交付,显著扩展可靠使用范围;本地闭环可运行但难以替代团队级持续验证。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-ci-platform\",\n \"node\": \"7.1 Git托管、CI Runner与CI/CD平台\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此依赖类别已核并要求纳入;托管服务、Runner执行环境与CI/CD平台分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-ci-platform\",\n \"grade_id\": \"faqi-xuan-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:自动化验证、协作与持续交付\",\n \"basis\": \"把代码生成接入可重复测试、审查和协作交付,显著扩展可靠使用范围;本地闭环可运行但难以替代团队级持续验证。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“托管代码变更触发器、Runner和自动构建/验证工作流”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(Git托管、Runner OS/工具链、权限、验证脚本、制品签名/发布策略);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "本地验证可替代部分CI执行但不提供同一触发/托管边界;不代表特定平台已配置。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分托管代码变更触发器、Runner和自动构建/验证工作流与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此依赖类别已核并要求纳入;托管服务、Runner执行环境与CI/CD平台分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分托管代码变更触发器、Runner和自动构建/验证工作流与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“7.1 Git托管、CI Runner与CI/CD平台”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分托管代码变更触发器、Runner和自动构建/验证工作流与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此依赖类别已核并要求纳入;托管服务、Runner执行环境与CI/CD平台分开分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-deployment-data",
"fields": [
{
"name": "工具的名称",
"content": "7.2-7.3 制品注册表、部署目标、产品运行时、数据库与外部API"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:7.2-7.3 制品注册表、部署目标、产品运行时、数据库与外部API;纳入依据:用户确认此可选依赖类别已核并要求纳入;注册表、部署环境、运行时、数据库与外部API分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“为上线任务提供制品登记、部署目标、产品运行时及数据库/外部API边界”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“为上线任务提供制品登记、部署目标、产品运行时及数据库/外部API边界”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-deployment-data;类别节点=7.2-7.3 制品注册表、部署目标、产品运行时、数据库与外部API;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:玄阶中级(grade_id=faqi-xuan-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:从代码到产品运行与外部集成;分级依据:支撑部署、数据库和API集成,使代码进入真实产品场景;并非每次编码必需,故属于重要交付扩展而非核心生成。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-deployment-data\",\n \"node\": \"7.2-7.3 制品注册表、部署目标、产品运行时、数据库与外部API\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此可选依赖类别已核并要求纳入;注册表、部署环境、运行时、数据库与外部API分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-deployment-data\",\n \"grade_id\": \"faqi-xuan-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:从代码到产品运行与外部集成\",\n \"basis\": \"支撑部署、数据库和API集成,使代码进入真实产品场景;并非每次编码必需,故属于重要交付扩展而非核心生成。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“为上线任务提供制品登记、部署目标、产品运行时及数据库/外部API边界”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(部署权限、密钥注入、运行时、数据库/对象存储/队列/API、备份和回滚);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "仅在目标包含交付/上线时需要;本地开发不是所有场景的部署替代证明。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分为上线任务提供制品登记、部署目标、产品运行时及数据库/外部API边界与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此可选依赖类别已核并要求纳入;注册表、部署环境、运行时、数据库与外部API分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分为上线任务提供制品登记、部署目标、产品运行时及数据库/外部API边界与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“7.2-7.3 制品注册表、部署目标、产品运行时、数据库与外部API”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分为上线任务提供制品登记、部署目标、产品运行时及数据库/外部API边界与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此可选依赖类别已核并要求纳入;注册表、部署环境、运行时、数据库与外部API分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-infrastructure",
"fields": [
{
"name": "工具的名称",
"content": "8 CPU/GPU、内存、存储、网络、电力与数据中心"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:8 CPU/GPU、内存、存储、网络、电力与数据中心;纳入依据:用户确认此资源类别已核并要求纳入;物理设备、基础设施与供给服务按所指分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“承载本地或托管计算所需的CPU/GPU、内存、存储、网络、电力和数据中心资源”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“承载本地或托管计算所需的CPU/GPU、内存、存储、网络、电力和数据中心资源”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-infrastructure;类别节点=8 CPU/GPU、内存、存储、网络、电力与数据中心;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:地阶中级(grade_id=faqi-di-intermediate;状态=user_directed_provisional);范围:Vibe Coding重要性:计算、存储与网络承载;分级依据:为模型调用、代码执行及数据交换提供资源底座;实现可跨云、主机和本地环境替换,故不是单一核心产品。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-infrastructure\",\n \"node\": \"8 CPU/GPU、内存、存储、网络、电力与数据中心\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此资源类别已核并要求纳入;物理设备、基础设施与供给服务按所指分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-infrastructure\",\n \"grade_id\": \"faqi-di-intermediate\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:计算、存储与网络承载\",\n \"basis\": \"为模型调用、代码执行及数据交换提供资源底座;实现可跨云、主机和本地环境替换,故不是单一核心产品。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“承载本地或托管计算所需的CPU/GPU、内存、存储、网络、电力和数据中心资源”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(具体工作负载所需硬件、驱动、散热、网络链路和供电);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "本地与云端资源的所有权/成本/可见性不同;类别记录不表示某资源已经分配或测量。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分承载本地或托管计算所需的CPU/GPU、内存、存储、网络、电力和数据中心资源与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此资源类别已核并要求纳入;物理设备、基础设施与供给服务按所指分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分承载本地或托管计算所需的CPU/GPU、内存、存储、网络、电力和数据中心资源与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“8 CPU/GPU、内存、存储、网络、电力与数据中心”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分承载本地或托管计算所需的CPU/GPU、内存、存储、网络、电力和数据中心资源与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此资源类别已核并要求纳入;物理设备、基础设施与供给服务按所指分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
},
{
"object_key": "faqi:dep-category-retrieval-memory",
"fields": [
{
"name": "工具的名称",
"content": "2.3 检索/索引/记忆与向量库"
},
{
"name": "是什么",
"content": "依赖图将其作为抽象依赖类别登记:2.3 检索/索引/记忆与向量库;纳入依据:用户确认此可选依赖类别已核并要求纳入;检索过程、索引、记忆内容与向量存储分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。"
},
{
"name": "为什么",
"content": "依赖图纳入该类别是为了表示“按需提供文档/代码索引、检索、过滤、记忆与向量存储”这一系统能力层;它是用户确认范围内的抽象类别,不代表任一具体产品被采用。"
},
{
"name": "怎么做",
"content": "不适用:本条是抽象依赖类别,不指定唯一可执行产品、安装步骤或操作流程;具体实现需另行识别。"
},
{
"name": "扩展",
"content": "类别层只定义“按需提供文档/代码索引、检索、过滤、记忆与向量存储”的边界;供应商、软件、版本、插件和部署属于具体实现或独立依赖对象,不作为本类别的默认扩展。"
},
{
"name": "关联信息",
"content": "依赖类别ID=dep-category-retrieval-memory;类别节点=2.3 检索/索引/记忆与向量库;纳入状态=user_confirmed_in_scope。这是抽象类别,不是具体产品或运行实例。\nVibe Coding 重要性暂定:玄阶高级(grade_id=faqi-xuan-advanced;状态=user_directed_provisional);范围:Vibe Coding重要性:长程上下文、知识检索与记忆;分级依据:支撑跨文件和长任务上下文保持、历史知识复用,提升复杂任务可处理范围;短任务仍可不依赖,且实现可替换。不代表效能评级、运行结果或质量结论。\n既有关系记录:未记录对象关系。"
},
{
"name": "出处",
"content": "依赖类别来源与登记记录:{\n \"source_path\": \".github/docs/gongfa/technology-stack.md\",\n \"source_sha256\": \"88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2\",\n \"source_anchor\": \"reference-technology-stack-十六技术栈的层级结构\",\n \"observed_at\": \"2026-10-10T12:14:00Z\"\n}\n类别登记:{\n \"id\": \"dep-category-retrieval-memory\",\n \"node\": \"2.3 检索/索引/记忆与向量库\",\n \"disposition\": \"user_confirmed_in_scope\",\n \"reason\": \"用户确认此可选依赖类别已核并要求纳入;检索过程、索引、记忆内容与向量存储分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\"\n}\n重要性分级记录:{\n \"subject_id\": \"dep-category-retrieval-memory\",\n \"grade_id\": \"faqi-xuan-advanced\",\n \"assignment_status\": \"user_directed_provisional\",\n \"scope\": \"Vibe Coding重要性:长程上下文、知识检索与记忆\",\n \"basis\": \"支撑跨文件和长任务上下文保持、历史知识复用,提升复杂任务可处理范围;短任务仍可不依赖,且实现可替换。\"\n}\n类别纳入状态仅表示范围登记,不指向已部署的具体产品。"
},
{
"name": "相关图书",
"content": "本条是依赖图抽象类别,不是书目对象;来源是技术栈的架构节点定义(见第7项),不列产品文档为图书。"
},
{
"name": "它要解决什么问题?",
"content": "该类别覆盖的系统问题是:在工作流中提供“按需提供文档/代码索引、检索、过滤、记忆与向量存储”所需的依赖位置。它不单独定义业务输入、结果或特定供应商的服务能力。"
},
{
"name": "为什么这样设计?",
"content": "不适用:该条是类别节点而非具名实现,当前材料不能支持具体设计选择解释。"
},
{
"name": "内部如何实现?",
"content": "不适用:抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别。"
},
{
"name": "付出了什么代价?",
"content": "该类别会带来与其组成相符的资源、身份、版本、权限和维护责任(索引来源、更新、权限过滤、检索器、缓存/存储及证据进入上下文的链路);实际费用/性能随具体实现与工作负载变化,依赖图未提供测量。"
},
{
"name": "比较不同技术与方法。",
"content": "文档直读或搜索可作为替代/互补路径;索引存在不证明召回质量或证据被模型使用。比较须固定任务、数据、权限、版本和预算;类别信息不支持供应商/产品排名。"
},
{
"name": "提炼共同规律。",
"content": "该类别可归纳的架构规则是:先区分按需提供文档/代码索引、检索、过滤、记忆与向量存储与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。"
},
{
"name": "明确这些规律成立的前提与适用条件。",
"content": "类别依据(原记录):用户确认此可选依赖类别已核并要求纳入;检索过程、索引、记忆内容与向量存储分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。\n纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。\n若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件。"
},
{
"name": "结论",
"content": "结论(限第15项条件):该类别可归纳的架构规则是:先区分按需提供文档/代码索引、检索、过滤、记忆与向量存储与具体实现,再按任务选择并验证;类别纳入、依赖存在或调用成功都不证明能力效果。\n非效果、许可或正式评级证明。"
},
{
"name": "连接规则",
"content": "推理桥梁:证据命题:登记把“2.3 检索/索引/记忆与向量库”明确列作抽象依赖类别;第11项说明“抽象类别没有单一内部实现;不得以任一供应商/实现代表整个类别”,没有单一实现。类别范围见第7项/第18项。推理根据:类别描述的是职责/边界集合,不指定某个实现的接口、协议、权限或效果;同一类别中的具体实现须以各自证据判断。由于本条来源只支持分类与职责区分,没有绑定一个具名部署实例,因此第16项对“先区分按需提供文档/代码索引、检索、过滤、记忆与向量存储与具体实现,再按任务选择并验证”的类别层架构归纳,不把它外推为具体产品能力或效果。成立边界:第15项限定为“类别依据(原记录):用户确认此可选依赖类别已核并要求纳入;检索过程、索引、记忆内容与向量存储分别分类;本次品级按Vibe Coding重要性分组,正式效能评级另行判断。 纳入状态:user_confirmed_in_scope;类别不是具体实现或部署。 若建立共同规律,须先核实同一问题、版本、环境、权限、协议及工作负载,并记录反例/不适用条件”;不据此外推未观察效果、许可或正式评级。"
},
{
"name": "依据",
"content": "依据:路径 `.github/docs/gongfa/technology-stack.md`;选区/锚点 `reference-technology-stack-十六技术栈的层级结构`;来源SHA-256 `88ff3494095c2a794acf130d5d2ccc4eb4b67ccdc8c174e7ef09f35c11a450a2`;第7项载完整出处;对应第11项,边界按第15项。快照/静态仅支持记录,不代表独立核验或效果/许可/评级证据。"
}
]
}
]
}
}