@yottameta/yotta-logs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # 更新日志
2
+
3
+ ## v0.1.0 (2026-08-27)
4
+
5
+ YottaMeta 自有实现首版(历史会话日志检索方向参考开源社区 session-logs 类技能思路,已完全重写,无上游代码):
6
+
7
+ - 元史(yotta-logs)—— 零依赖跨智能体会话日志检索引擎(Python 3.8+ 标准库)。
8
+ - 能力:locate / scan / search / session / stats / tools / version;关键词 / 正则 / 日期 / 会话 ID / 别名 / 角色过滤;默认脱敏(--no-redact 关闭);--json 结构化输出;只读安全;容错 JSONL 解析(含 sessions.json 索引别名)。
9
+ - 测试:scripts/test_yotta_logs.py 75 项全绿。
10
+ - 版权:YottaMeta 纯自有 MIT + NOTICE 品牌声明;README 一行上游致谢。
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 YottaMeta
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE ADDED
@@ -0,0 +1,11 @@
1
+ # NOTICE — YottaMeta 品牌声明
2
+
3
+ 「YottaMeta」「元忆」「yotta-memory」「元史」「yotta-logs」「元阁」以及本家族各技能名称(yotta-* 前缀)是 YottaMeta 的品牌与标识。
4
+
5
+ 本软件以 MIT 许可证开源,任何人均可自由使用、修改与分发。若你在其基础上制作派生作品:
6
+
7
+ 1. 不得继续使用 YottaMeta 或本家族名称(yotta-*、元忆、元史 等)作为派生作品的名称;
8
+ 2. 不得暗示派生作品由 YottaMeta 官方维护、认可或与之存在关联;
9
+ 3. 建议在派生作品中明确声明「与 YottaMeta 官方无关联」。
10
+
11
+ 上游来源致谢:本技能由 YottaMeta 全新实现,历史会话日志检索方向参考开源社区的 session-logs 类技能思路,无上游代码。
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ <p align="center">
2
+ <img src="assets/banner.png" alt="yotta-logs banner" width="100%" />
3
+ </p>
4
+
5
+ <h1 align="center">yotta-logs · 元史</h1>
6
+
7
+ <p align="center">YottaMeta 自有的历史会话日志检索技能:<b>零依赖检索 / 分析会话 JSONL 记录</b>,回溯旧对话与父会话上下文,为跨会话追溯提供原始日志依据。适用于查以前说过的结论、定位某段决策、回顾某次讨论。</p>
8
+ <p align="center">用户引用先前聊过的内容 / 父会话 / 历史上下文时自动激活——<b>不依赖 jq / rg,纯标准库确定性检索</b>。</p>
9
+ <p align="center">纯 Python 3.8+ 标准库实现,零外部依赖;Windows + Linux + macOS 通用;只读本地日志,默认脱敏,不联网上传。</p>
10
+
11
+ <p align="center">
12
+ <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-blue" /></a>
13
+ <a href="https://agentskills.io/"><img alt="Standard: agentskills.io" src="https://img.shields.io/badge/standard-agentskills.io-orange" /></a>
14
+ <a href="https://www.npmjs.com/package/@yottameta/yotta-logs"><img alt="npm package" src="https://img.shields.io/npm/v/@yottameta/yotta-logs" /></a>
15
+ <a href="https://github.com/YottaMeta/yotta-logs"><img alt="GitHub stars" src="https://img.shields.io/github/stars/YottaMeta/yotta-logs" /></a>
16
+ <a href="https://github.com/YottaMeta/yotta-logs/commits/main"><img alt="last commit" src="https://img.shields.io/github/last-commit/YottaMeta/yotta-logs" /></a>
17
+ <a href="https://github.com/YottaMeta/yotta-logs"><img alt="PRs welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen" /></a>
18
+ </p>
19
+
20
+ ## 这是什么
21
+
22
+ 智能体每天产生大量会话日志(JSONL),跨会话追溯时最缺的不是「记得发生过」,而是「原文在哪、谁说的、什么时候说的」。元史把这些日志做成**确定性检索引擎**:定位会话日志目录 → 按关键词 / 正则 / 日期 / 会话 / 角色检索 → 提取会话原文 → 统计消息、token、成本与工具调用。
23
+
24
+ 它不是某个平台的专属功能,而是一份与智能体无关的工具包:装进任何支持 Agent Skills 的智能体即可按需调用。全程零依赖、只读本地、不联网;输出默认脱敏,避免把日志里的密钥 / token 带到上下文。
25
+
26
+ ## 核心价值
27
+
28
+ - **零依赖检索**:Python 3.8+ 标准库,不依赖 jq / rg / ripgrep 等外部工具,Windows + Linux + macOS 开箱即用。
29
+ - **容错解析**:JSONL 字段形态差异(message.content 为列表或字符串、role 在顶层或 message 内、toolResult / toolCall 命名差异)均可容忍;坏行自动跳过并计数,不中断检索。
30
+ - **默认脱敏**:输出自动打码疑似密钥 / token / 口令(sk-、ghp_、AKIA、JWT、Bearer、URL 口令、key=value 赋值、超长 token),--no-redact 关闭。
31
+ - **多维度过滤**:关键词(不区分大小写)/ 正则 / 日期 / 会话 ID / sessions.json 别名 / 角色(user / assistant / tool / system)。
32
+ - **结构化输出**:--json 输出纯净 JSON,含会话 ID、行号、时间戳、角色,适合程序化核对出处。
33
+ - **只读安全**:只读本地日志,不修改、不删除、不联网上传,与元忆(语义记忆)互补分工。
34
+
35
+ ## 核心优势
36
+
37
+ | 优势 | 说明 |
38
+ |---|---|
39
+ | **零依赖** | Python 3.8+ 标准库,无模型、无数据库、无外部服务;Windows + Linux + macOS 通用 |
40
+ | **确定性** | 检索逻辑可复现、可解释;命中即原文片段 + 行号,不靠模型猜测 |
41
+ | **默认脱敏** | 疑似密钥 / token / 口令自动打码,降低日志原文外泄风险 |
42
+ | **容错** | 不同智能体的 JSONL 形态差异可容忍,坏行跳过不中断 |
43
+ | **定位准确** | 命中结果带会话 ID / 行号 / 时间戳 / 角色,可精确回溯出处 |
44
+ | **生态分发** | GitHub + npm + ClawHub 三源同步发布;npx / install.sh / 手动复制三种安装方式 |
45
+
46
+ ## 功能体系
47
+
48
+ | 命令 | 说明 |
49
+ |---|---|
50
+ | locate | 自动发现本机常见的会话日志目录(Codex / Claude Code / Clawdbot 等) |
51
+ | scan | 列出目录下所有会话:ID / 日期 / 消息数 / 大小 / sessions.json 别名 |
52
+ | search | 跨会话检索:关键词 / 正则 + 日期 / 会话 / 角色过滤,输出时间线命中(--json 结构化) |
53
+ | session | 提取单个会话原文:时间线 + 角色 + 文本,--role 过滤,--tools 标注工具调用 |
54
+ | stats | 会话统计:消息 / 角色分布 / token / 成本 / 时间范围 / 每日汇总(--daily) |
55
+ | tools | 工具调用次数排行 |
56
+ | version | 打印版本 |
57
+
58
+ ## 快速使用
59
+
60
+ Windows 用 python,Linux/macOS 用 python3。
61
+
62
+ ```bash
63
+ # 自动发现本机常见会话日志目录
64
+ python3 scripts/yotta_logs.py locate
65
+
66
+ # 列出目录下所有会话
67
+ python3 scripts/yotta_logs.py scan --dir ~/.clawdbot/agents/<agentId>/sessions
68
+
69
+ # 跨会话检索关键词(时间线命中,默认脱敏)
70
+ python3 scripts/yotta_logs.py search "部署方案" --dir /path/to/sessions
71
+
72
+ # 正则 + 日期 + 会话过滤
73
+ python3 scripts/yotta_logs.py search "CI 失败" --regex --date 2026-08-26 --dir /path/to/sessions
74
+
75
+ # 提取单个会话原文
76
+ python3 scripts/yotta_logs.py session abc123 --dir /path/to/sessions
77
+
78
+ # 统计(消息 / token / 成本 / 每日汇总)
79
+ python3 scripts/yotta_logs.py stats --dir /path/to/sessions --daily
80
+
81
+ # 工具调用排行
82
+ python3 scripts/yotta_logs.py tools --dir /path/to/sessions
83
+
84
+ # JSON 结构化输出(适合程序化核对)
85
+ python3 scripts/yotta_logs.py search "部署方案" --dir /path/to/sessions --json
86
+ ```
87
+
88
+ 退出码语义(与元安 / 元审 / 元盾 / 元真家族一致):0 = 成功;1 = 无匹配 / 空结果集;4 = 用法错误 / 致命异常。
89
+
90
+ 未指定 --dir 时,依次尝试环境变量 YOTTA_LOGS_DIR → 自动定位首个已知日志目录;找不到则退出码 4 并提示。
91
+
92
+ ## 安装
93
+
94
+ 三种方式任选其一,技能文件统一从 **npm** 获取(GitHub 无代理时较慢,npm 可配国内镜像加速)。
95
+
96
+ ### 方式一:npm(推荐,一行安装)
97
+ ```bash
98
+ # 国内加速(可选):npm config set registry https://registry.npmmirror.com
99
+ npx -y @yottameta/yotta-logs -g
100
+ npx -y @yottameta/yotta-logs --dir <你的技能目录> # 任意智能体:指定目录安装
101
+ ```
102
+ > 智能体不在预置列表里?用 --dir 指定它的 skills 目录,或手动复制(方式三)。--list 可查看各智能体对应的默认目录。想手动拿文件也可 npm pack @yottameta/yotta-logs 解包后按方式二/三安装。
103
+
104
+ ### 方式二:install.sh 一键安装
105
+ 获取技能文件夹后(npm pack 解包或 git clone),进入技能文件夹:
106
+ ```bash
107
+ bash install.sh -g # 用户级;bash install.sh --list 查看全部目录
108
+ bash install.sh --agent codex # 指定智能体(--list 可查看可用项)
109
+ bash install.sh # 项目级:自动检测已存在的 .claude/.cursor/.codex 等 skills 目录
110
+ bash install.sh --dir /path/to/skills
111
+ ```
112
+ > 覆盖 17 类智能体,含国内 Trae / Qwen / Comate / CodeBuddy / Kimi。Windows 用户:装有 Git Bash 即可用;否则用方式三手动复制。
113
+
114
+ ### 方式三:手动复制
115
+ 把整个 yotta-logs 文件夹复制到目标智能体的 skills 目录。常见位置(用户级;Windows 用 %USERPROFILE%,Linux/macOS 用 ~):
116
+
117
+ | 智能体 | 用户级目录 | 项目级目录 |
118
+ |---|---|---|
119
+ | Codex | %USERPROFILE%\.codex\skills\yotta-logs\ | .codex\skills\ |
120
+ | Claude Code | %USERPROFILE%\.claude\skills\yotta-logs\ | .claude\skills\ |
121
+ | Cursor | %USERPROFILE%\.cursor\skills\yotta-logs\ | .cursor\skills\ |
122
+ | Windsurf | %USERPROFILE%\.codeium\windsurf\skills\yotta-logs\ | .windsurf\skills\ |
123
+ | opencode | %USERPROFILE%\.config\opencode\skills\yotta-logs\ | .opencode\skills\ |
124
+ | Gemini | %USERPROFILE%\.gemini\skills\yotta-logs\ | .gemini\skills\ |
125
+ | Goose | %USERPROFILE%\.config\goose\skills\yotta-logs\ | .goose\skills\ |
126
+ | Amp | %USERPROFILE%\.config\agents\skills\yotta-logs\ | .agents\skills\ |
127
+ | Kiro | %USERPROFILE%\.kiro\skills\yotta-logs\ | .kiro\skills\ |
128
+ | WorkBuddy | %USERPROFILE%\.workbuddy\skills\yotta-logs\ | .workbuddy\skills\ |
129
+ | Trae Code CLI | %USERPROFILE%\.traecli\skills\yotta-logs\ | .traecli\skills\ |
130
+ | Trae IDE(国内) | %USERPROFILE%\.trae-cn\skills\yotta-logs\ | .trae\skills\ |
131
+ | Qwen Code | %USERPROFILE%\.qwen\skills\yotta-logs\ | .qwen\skills\ |
132
+ | Comate | %USERPROFILE%\.comate\skills\yotta-logs\ | .comate\skills\ |
133
+ | CodeBuddy | %USERPROFILE%\.codebuddy\skills\yotta-logs\ | .codebuddy\skills\ |
134
+ | Kimi | %USERPROFILE%\.kimi\skills\yotta-logs\ | .kimi\skills\ |
135
+ | 通用 AGENTS.md | %USERPROFILE%\.agents\skills\yotta-logs\ | .agents\skills\ |
136
+
137
+ > Codex 默认目录若设置了环境变量 CODEX_HOME,以该变量为准;opencode 若设置 XDG_CONFIG_HOME 同理。.agents\skills 并非通用目录,仅 OpenCode / Cursor / Cline / Amp / Kimi / Gemini CLI / GitHub Copilot 等会读取,Claude Code 与 Codex 默认不读。不确定时用 --dir 指定,或让该智能体自行安装。
138
+
139
+ ## 使用示例(AI 智能体)
140
+
141
+ 1. 将本仓库的 SKILL.md 接入任意 AI 智能体的技能/规则系统(见上方安装)。
142
+ 2. 用户问「上次说的部署方案是什么」时,先定位并检索:
143
+ ```bash
144
+ python3 scripts/yotta_logs.py locate
145
+ python3 scripts/yotta_logs.py search "部署方案" --dir <日志目录>
146
+ ```
147
+ 得到命中时间线(会话 / 时间 / 角色 / 原文片段)。
148
+ 3. 需要完整上下文时提取对应会话:
149
+ ```bash
150
+ python3 scripts/yotta_logs.py session <会话ID> --dir <日志目录>
151
+ ```
152
+ 4. 需要精确出处时用 --json 拿会话 ID / 行号 / 时间戳,回答时给出依据。
153
+ 5. 需要回顾某次会话成本或工具使用分布时用 stats / tools。
154
+
155
+ ## 开发与校验
156
+
157
+ - 测试:python scripts/test_yotta_logs.py(75 项)
158
+ - 基础校验:python tools/validate-skill.py yotta-logs(在仓库根目录运行)
159
+ - CLI 协议:references/cli.md;日志格式:references/format.md;安全边界:references/security.md
160
+
161
+ ## 许可证
162
+
163
+ MIT © YottaMeta —— 详见 [LICENSE](./LICENSE)。
package/SKILL.md ADDED
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: yotta-logs
3
+ version: 0.1.0
4
+ description: 元史 —— 跨智能体的历史会话日志检索技能:零依赖检索 / 分析会话 JSONL 记录,回溯旧对话与父会话上下文,为跨会话追溯提供原始日志依据。触发:用户问起先前聊过的内容 / 父会话 / 历史上下文、要查以前说过的结论、跨会话回溯某次讨论、需要从会话日志定位某段决策时。边界:仅读取本机自己的会话日志文件;不修改、不删除会话记录;只查本地日志不联网上传;与元忆(语义记忆)互补,本技能只做原始日志检索。
5
+ license: MIT
6
+ ---
7
+
8
+ # 元史(yotta-logs)
9
+
10
+ 跨智能体的历史会话日志检索技能:**零依赖检索 / 分析会话 JSONL 记录**,回溯旧对话与父会话上下文,为跨会话追溯提供原始日志依据。
11
+
12
+ 零依赖(Python 3.8+ 标准库),Windows + Linux + macOS 通用;Claude Code / Cursor / Codex / 通用 Agent 均可调用。
13
+
14
+ ## 何时使用
15
+
16
+ - 用户引用先前聊过的内容 / 父会话 / 历史上下文;
17
+ - 要查以前说过的结论、决策、命令或结果;
18
+ - 需要从会话日志定位某段讨论发生在哪个会话、什么时间、谁说的。
19
+
20
+ **Do NOT trigger**:
21
+
22
+ - 只读:不修改、不删除任何会话记录;
23
+ - 只查本地日志,不联网上传;
24
+ - 语义记忆 / 长期知识请用元忆(yotta-memory);本技能只管原始会话日志检索,二者互补。
25
+
26
+ ## 快速使用
27
+
28
+ Windows 用 python,Linux/macOS 用 python3。
29
+
30
+ ```bash
31
+ # 自动发现本机常见会话日志目录
32
+ python3 scripts/yotta_logs.py locate
33
+
34
+ # 列出目录下所有会话(ID / 日期 / 消息数 / 大小)
35
+ python3 scripts/yotta_logs.py scan --dir ~/.clawdbot/agents/<agentId>/sessions
36
+
37
+ # 跨会话检索关键词(时间线命中,默认脱敏)
38
+ python3 scripts/yotta_logs.py search "部署方案" --dir /path/to/sessions
39
+
40
+ # 正则 + 日期 + 会话过滤
41
+ python3 scripts/yotta_logs.py search "CI 失败" --regex --date 2026-08-26 --dir /path/to/sessions
42
+
43
+ # 提取单个会话原文
44
+ python3 scripts/yotta_logs.py session abc123 --dir /path/to/sessions
45
+
46
+ # 统计(消息 / token / 成本 / 每日汇总)
47
+ python3 scripts/yotta_logs.py stats --dir /path/to/sessions --daily
48
+
49
+ # 工具调用排行
50
+ python3 scripts/yotta_logs.py tools --dir /path/to/sessions
51
+ ```
52
+
53
+ 退出码(与元安 / 元审 / 元盾 / 元真家族一致):0 = 成功;1 = 无匹配 / 空结果集;4 = 用法错误 / 致命异常。
54
+
55
+ ## 工作流程(AI 智能体回溯历史时)
56
+
57
+ 1. **定位**:locate 或 scan 找到会话日志目录与会话 ID;
58
+ 2. **检索**:search 按关键词 / 正则跨会话命中,先看时间线片段;
59
+ 3. **提取**:命中后 session <sid> 提取该会话原文;
60
+ 4. **核对**:需要精确出处时用 --json 拿结构化结果(会话 ID / 行号 / 时间戳 / 角色);
61
+ 5. **统计**:需要成本 / token / 工具使用回顾时用 stats / tools。
62
+
63
+ ## 能力
64
+
65
+ - **零依赖检索**:Python 3.8+ 标准库,不依赖 jq / rg 等外部工具;
66
+ - **容错解析**:字段缺失 / 坏行自动跳过并计数,可容忍不同智能体的 JSONL 形态差异;
67
+ - **默认脱敏**:输出自动打码疑似密钥 / token / 口令(--no-redact 关闭);
68
+ - **多维度过滤**:关键词 / 正则 / 日期 / 会话 ID / 别名 / 角色;
69
+ - **结构化输出**:--json 输出纯净 JSON(含行号 / 时间戳 / 角色);
70
+ - **只读安全**:只读本地日志,不修改、不删除、不联网。
71
+
72
+ ## 参考文档
73
+
74
+ - references/format.md — 会话日志 JSONL 格式与 sessions.json 索引说明
75
+ - references/cli.md — CLI 子命令 / 参数 / 退出码 / JSON schema 详解
76
+ - references/security.md — 安全边界 / 脱敏规则 / 与元忆的差异化
77
+
78
+ ## 责任声明
79
+
80
+ 本技能只做本地会话日志的只读检索;输出原文片段可能包含隐私,默认脱敏且仅用于本机回溯,请勿将检索结果外传。
Binary file
package/bin/install.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * yotta-logs 跨平台安装器(YottaSkills)
4
+ * 用法:
5
+ * npx -y @yottameta/yotta-logs --agent <name> # 按智能体默认用户级目录安装(推荐)
6
+ * npx -y @yottameta/yotta-logs --dir PATH # 装到指定目录(用户改了目录的智能体)
7
+ * npx -y @yottameta/yotta-logs -g # 安装到全部已知智能体用户级目录
8
+ * npx -y @yottameta/yotta-logs # 安装到检测到的项目级目录
9
+ * npx -y @yottameta/yotta-logs --list # 列出智能体 -> 默认目录
10
+ */
11
+ 'use strict';
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const os = require('os');
15
+
16
+ const SKILL_NAME = 'yotta-logs';
17
+ const PKG_ROOT = path.join(__dirname, '..');
18
+
19
+ // 智能体 -> 用户级默认技能目录(dirs 按优先级排列;--agent 装到第一个)
20
+ // 依据官方文档:.agents/skills 并非通用目录,被 OpenCode / Cursor / Cline / Amp /
21
+ // Kimi / Gemini CLI / GitHub Copilot 等读取;Claude Code 与 Codex 默认不读 .agents。
22
+ const AGENT_DIRS = {
23
+ claude: { label: 'Claude Code', dirs: ['.claude/skills'] },
24
+ cursor: { label: 'Cursor', dirs: ['.cursor/skills', '.agents/skills'] },
25
+ codex: { label: 'Codex', dirs: ['.codex/skills'] }, // 特判:$CODEX_HOME/skills
26
+ gemini: { label: 'Gemini CLI', dirs: ['.gemini/skills', '.agents/skills'] },
27
+ goose: { label: 'Goose', dirs: ['.config/goose/skills', '.agents/skills'] },
28
+ amp: { label: 'Amp', dirs: ['.config/agents/skills', '.agents/skills'] },
29
+ opencode: { label: 'OpenCode', dirs: ['.config/opencode/skills'] }, // 特判:$XDG_CONFIG_HOME
30
+ windsurf: { label: 'Windsurf', dirs: ['.codeium/windsurf/skills'] },
31
+ workbuddy: { label: 'WorkBuddy', dirs: ['.workbuddy/skills'] },
32
+ kiro: { label: 'Kiro', dirs: ['.kiro/skills'] },
33
+ trae: { label: 'Trae Code CLI', dirs: ['.traecli/skills'] },
34
+ 'trae-cn': { label: 'Trae IDE(国内)', dirs: ['.trae-cn/skills'] },
35
+ qwen: { label: 'Qwen Code', dirs: ['.qwen/skills'] },
36
+ comate: { label: 'Comate 文心快码', dirs: ['.comate/skills'] },
37
+ codebuddy: { label: 'CodeBuddy Code', dirs: ['.codebuddy/skills'] },
38
+ kimi: { label: 'Kimi Code CLI', dirs: ['.kimi/skills'] },
39
+ agents: { label: '通用 AGENTS.md', dirs: ['.agents/skills'] },
40
+ };
41
+
42
+ // Codex 用户级目录特判:优先 $CODEX_HOME/skills,否则 ~/.codex/skills
43
+ function codexUserDir() {
44
+ const base = process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
45
+ return path.join(base, 'skills');
46
+ }
47
+
48
+ // OpenCode 用户级目录特判:优先 $XDG_CONFIG_HOME/opencode/skills,否则 ~/.config/opencode/skills
49
+ function opencodeUserDir() {
50
+ const base = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config');
51
+ return path.join(base, 'opencode', 'skills');
52
+ }
53
+
54
+ function resolveUserDir(rel) {
55
+ if (rel === '.codex/skills') return codexUserDir();
56
+ if (rel === '.config/opencode/skills') return opencodeUserDir();
57
+ return path.join(os.homedir(), rel);
58
+ }
59
+
60
+ function installTo(dest) {
61
+ const target = path.join(dest, SKILL_NAME);
62
+ fs.mkdirSync(target, { recursive: true });
63
+ copyDir(PKG_ROOT, target, new Set(['package.json', 'bin', 'node_modules', '.git']));
64
+ console.log('installed -> ' + target);
65
+ }
66
+
67
+ function copyDir(src, dst, skip) {
68
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
69
+ if (skip.has(entry.name)) continue;
70
+ const s = path.join(src, entry.name);
71
+ const d = path.join(dst, entry.name);
72
+ if (entry.isDirectory()) {
73
+ fs.mkdirSync(d, { recursive: true });
74
+ copyDir(s, d, skip);
75
+ } else if (entry.isFile()) {
76
+ fs.copyFileSync(s, d);
77
+ }
78
+ }
79
+ }
80
+
81
+ function displayDir(rel) {
82
+ if (process.platform === 'win32') return '%USERPROFILE%\\' + rel.replace(/\//g, '\\');
83
+ return '~/' + rel;
84
+ }
85
+
86
+ function main() {
87
+ const args = process.argv.slice(2);
88
+ const isGlobal = args.includes('-g') || args.includes('--global');
89
+ const list = args.includes('--list') || args.includes('-l');
90
+ let explicitDir = null;
91
+ const di = args.indexOf('--dir');
92
+ if (di !== -1 && args[di + 1]) explicitDir = args[di + 1];
93
+ let agent = null;
94
+ const ai = args.indexOf('--agent');
95
+ if (ai !== -1 && args[ai + 1]) agent = String(args[ai + 1]).toLowerCase();
96
+
97
+ if (list) {
98
+ console.log('智能体 -> 默认技能目录(--agent <name> 装到第一个,用户级):');
99
+ for (const [key, v] of Object.entries(AGENT_DIRS)) {
100
+ const resolved = v.dirs.map(displayDir);
101
+ console.log(' ' + key.padEnd(10) + v.label.padEnd(18) + resolved.join('、'));
102
+ }
103
+ console.log('\n说明:Windows 用 %USERPROFILE%,Linux/macOS 用 ~;仅收录有官方默认目录的智能体。');
104
+ console.log('改了目录的请用 --dir <路径>,不要依赖默认位置;若设置了 CODEX_HOME / XDG_CONFIG_HOME,安装自动以该变量为准。');
105
+ return;
106
+ }
107
+
108
+ if (explicitDir) { installTo(explicitDir); return; }
109
+
110
+ if (agent) {
111
+ const info = AGENT_DIRS[agent];
112
+ if (!info) {
113
+ console.log('未收录智能体: ' + agent + '。请用 --dir <路径> 指定技能目录。');
114
+ console.log('可用: ' + Object.keys(AGENT_DIRS).join(', '));
115
+ return;
116
+ }
117
+ installTo(resolveUserDir(info.dirs[0]));
118
+ console.log('完成。');
119
+ return;
120
+ }
121
+
122
+ if (isGlobal) {
123
+ const seen = new Set();
124
+ for (const v of Object.values(AGENT_DIRS)) {
125
+ for (const d of v.dirs) {
126
+ if (seen.has(d)) continue;
127
+ seen.add(d);
128
+ installTo(resolveUserDir(d));
129
+ }
130
+ }
131
+ console.log('完成。');
132
+ return;
133
+ }
134
+
135
+ const PROJECT_DIRS = [
136
+ '.claude/skills',
137
+ '.cursor/skills',
138
+ '.codex/skills',
139
+ '.config/goose/skills',
140
+ '.config/agents/skills',
141
+ '.opencode/skills',
142
+ '.codeium/windsurf/skills',
143
+ '.workbuddy/skills',
144
+ '.kiro/skills',
145
+ '.traecli/skills',
146
+ '.gemini/skills',
147
+ '.trae-cn/skills',
148
+ '.qwen/skills',
149
+ '.comate/skills',
150
+ '.codebuddy/skills',
151
+ '.kimi/skills',
152
+ '.agents/skills',
153
+ ];
154
+ let installedAny = false;
155
+ for (const d of PROJECT_DIRS) {
156
+ if (fs.existsSync(d)) { installTo(d); installedAny = true; }
157
+ }
158
+ if (!installedAny) {
159
+ console.log('未检测到项目级智能体目录。可手动复制,或用 --agent <name> / -g 装到用户级。');
160
+ }
161
+ }
162
+
163
+ main();
package/install.sh ADDED
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env bash
2
+ # yotta-logs 多智能体安装脚本(YottaSkills 模板)
3
+ # 用法:
4
+ # bash install.sh --agent <name> # 按智能体默认用户级目录安装
5
+ # bash install.sh --dir <path> # 装到指定目录(用户改过目录的智能体)
6
+ # bash install.sh -g # 装到全部已知智能体用户级目录
7
+ # bash install.sh # 检测并安装到已存在的项目级目录
8
+ # bash install.sh --list # 列出智能体 -> 默认目录
9
+ set -euo pipefail
10
+
11
+ SKILL_NAME="yotta-logs"
12
+ SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
+ case "$(uname -s)" in
14
+ MINGW*|MSYS*)
15
+ SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
16
+ ;;
17
+ esac
18
+
19
+ # 智能体 -> 用户级默认目录(--agent 装到第一个)
20
+ # .agents/skills 并非通用目录:OpenCode / Cursor / Cline / Amp / Kimi / Gemini CLI / GitHub Copilot 读取。
21
+ # 判断当前环境:Windows Git Bash 用 %USERPROFILE%,Unix 用 ~
22
+ _IS_WINDOWS=0
23
+ case "$(uname -s)" in
24
+ MINGW*|MSYS*|CYGWIN*) _IS_WINDOWS=1 ;;
25
+ esac
26
+ dirs_for() {
27
+ case "$1" in
28
+ claude) echo ".claude/skills" ;;
29
+ cursor) echo ".cursor/skills .agents/skills" ;;
30
+ codex) echo "__CODEX__" ;;
31
+ gemini) echo ".gemini/skills .agents/skills" ;;
32
+ goose) echo ".config/goose/skills .agents/skills" ;;
33
+ amp) echo ".config/agents/skills .agents/skills" ;;
34
+ opencode) echo "__OPENCODE__" ;;
35
+ windsurf) echo ".codeium/windsurf/skills" ;;
36
+ workbuddy) echo ".workbuddy/skills" ;;
37
+ kiro) echo ".kiro/skills" ;;
38
+ trae) echo ".traecli/skills" ;;
39
+ trae-cn) echo ".trae-cn/skills" ;;
40
+ qwen) echo ".qwen/skills" ;;
41
+ comate) echo ".comate/skills" ;;
42
+ codebuddy) echo ".codebuddy/skills" ;;
43
+ kimi) echo ".kimi/skills" ;;
44
+ agents) echo ".agents/skills" ;;
45
+ *) return 1 ;;
46
+ esac
47
+ }
48
+
49
+ codex_dir() {
50
+ if [ -n "${CODEX_HOME:-}" ]; then printf '%s' "$CODEX_HOME/skills"; else printf '%s' "$HOME/.codex/skills"; fi
51
+ }
52
+ opencode_dir() {
53
+ if [ -n "${XDG_CONFIG_HOME:-}" ]; then printf '%s' "$XDG_CONFIG_HOME/opencode/skills"; else printf '%s' "$HOME/.config/opencode/skills"; fi
54
+ }
55
+ resolve_user() {
56
+ case "$1" in
57
+ __CODEX__) codex_dir ;;
58
+ __OPENCODE__) opencode_dir ;;
59
+ *) printf '%s' "$HOME/$1" ;;
60
+ esac
61
+ }
62
+
63
+ install_to() {
64
+ mkdir -p "$1/$SKILL_NAME"
65
+ cp -r "$SOURCE_DIR/." "$1/$SKILL_NAME/"
66
+ rm -rf "$1/$SKILL_NAME/.git"
67
+ echo "installed -> $1/$SKILL_NAME"
68
+ }
69
+
70
+ list() {
71
+ echo "智能体 -> 默认技能目录(--agent <name> 装到第一个,用户级):"
72
+ for a in claude cursor codex gemini goose amp opencode windsurf workbuddy kiro trae trae-cn qwen comate codebuddy kimi agents; do
73
+ local dirs first
74
+ dirs="$(dirs_for "$a")"
75
+ first="${dirs%% *}"
76
+ case "$first" in
77
+ __CODEX__) first=".codex/skills" ;;
78
+ __OPENCODE__) first=".config/opencode/skills" ;;
79
+ esac
80
+ if [ "$_IS_WINDOWS" = "1" ]; then
81
+ first="%USERPROFILE%\\${first//\//\\}"
82
+ else
83
+ first="~/$first"
84
+ fi
85
+ printf ' %-10s %s\n' "$a" "$first"
86
+ done
87
+ echo '说明:Windows 用 %USERPROFILE%,Linux/macOS 用 ~;仅收录有官方默认目录的智能体。'
88
+ echo '改了目录的请用 --dir <路径>,不要依赖默认位置;若设置了 CODEX_HOME / XDG_CONFIG_HOME,安装自动以该变量为准。'
89
+ }
90
+
91
+ main() {
92
+ local agent="" dir="" global=0 show_list=0
93
+ while [ $# -gt 0 ]; do
94
+ case "$1" in
95
+ --agent) shift; agent="${1:-}" ;;
96
+ --dir) shift; dir="${1:-}" ;;
97
+ -g|--global) global=1 ;;
98
+ --list|-l) show_list=1 ;;
99
+ *) echo "未知参数: $1" >&2; exit 2 ;;
100
+ esac
101
+ shift
102
+ done
103
+
104
+ if [ "$show_list" = "1" ]; then list; return; fi
105
+ if [ -n "$dir" ]; then install_to "$dir"; echo "完成。"; return; fi
106
+ if [ -n "$agent" ]; then
107
+ local dirs first
108
+ if ! dirs="$(dirs_for "$agent")"; then
109
+ echo "未收录智能体: $agent。请用 --dir <路径> 指定技能目录。" >&2; exit 2
110
+ fi
111
+ first="${dirs%% *}"
112
+ install_to "$(resolve_user "$first")"; echo "完成。"; return
113
+ fi
114
+ if [ "$global" = "1" ]; then
115
+ echo "安装到全部已知智能体用户级目录..."
116
+ local dirs rel
117
+ for a in claude cursor codex gemini goose amp opencode windsurf workbuddy kiro trae trae-cn qwen comate codebuddy kimi agents; do
118
+ dirs="$(dirs_for "$a")"
119
+ for rel in $dirs; do install_to "$(resolve_user "$rel")"; done
120
+ done
121
+ echo "完成。"; return
122
+ fi
123
+ local installed=0 d
124
+ for d in .claude/skills .cursor/skills .codex/skills .config/goose/skills .config/agents/skills .opencode/skills .codeium/windsurf/skills .workbuddy/skills .kiro/skills .traecli/skills .gemini/skills .trae-cn/skills .qwen/skills .comate/skills .codebuddy/skills .kimi/skills .agents/skills; do
125
+ if [ -d "$d" ]; then install_to "$d"; installed=1; fi
126
+ done
127
+ if [ "$installed" = "0" ]; then
128
+ echo "未检测到项目级智能体目录。可用 --agent <name> / -g 装到用户级,或 --dir 指定。"
129
+ fi
130
+ }
131
+
132
+ main "$@"
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@yottameta/yotta-logs",
3
+ "version": "0.1.0",
4
+ "description": "元史 —— 跨智能体的历史会话日志检索技能:零依赖检索 / 分析会话 JSONL 记录,回溯旧对话与父会话上下文,为跨会话追溯提供原始日志依据。触发:用户问起先前聊过的内容 / 父会话 / 历史上下文、要查以前说过的结论、跨会话回溯某次讨论、需要从会话日志定位某段决策时。边界:仅读取本机自己的会话日志文件;不修改、不删除会话记录;只查本地日志不联网上传。",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "agent-skills",
8
+ "yotta-logs"
9
+ ],
10
+ "files": [
11
+ "SKILL.md",
12
+ "LICENSE",
13
+ "README.md",
14
+ "install.sh",
15
+ "references",
16
+ "scripts",
17
+ "assets",
18
+ "bin",
19
+ "NOTICE",
20
+ "CHANGELOG.md"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/YottaMeta/yotta-logs.git"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "bin": {
30
+ "yotta-logs": "bin/install.js"
31
+ }
32
+ }