@yottameta/yotta-workflow 0.2.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/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/README.md ADDED
@@ -0,0 +1,196 @@
1
+ <p align="center">
2
+ <img src="assets/banner.png" alt="yotta-workflow banner" width="100%" />
3
+ </p>
4
+
5
+ <h1 align="center">yotta-workflow · 跨会话 / 跨项目工作流标准</h1>
6
+
7
+ <p align="center">一套面向所有 AI 智能体的通用工作流标准:<b>流程全局定、状态就近存;开工必读状态,收工必留锚点</b>。让任何 AI 会话都能无痛接续,避免单会话拉长而失忆。</p>
8
+ <p align="center">状态目录统一 <code>.workflow</code>——同一项目所有智能体会话读写同一份状态(一个真相源);开工读状态恢复上下文、进行中主动落盘流水 / 任务 / 决策、收工生成自包含交接锚点。</p>
9
+ <p align="center">纯 Markdown 文本,零依赖、不注入、不锁平台;安装一次,Claude Code / Codex / Cursor / OpenCode 等 78+ 智能体通用。</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-workflow"><img alt="npm package" src="https://img.shields.io/npm/v/@yottameta/yotta-workflow" /></a>
15
+ <a href="https://github.com/YottaMeta/yotta-workflow"><img alt="GitHub stars" src="https://img.shields.io/github/stars/YottaMeta/yotta-workflow" /></a>
16
+ <a href="https://github.com/YottaMeta/yotta-workflow/commits/main"><img alt="last commit" src="https://img.shields.io/github/last-commit/YottaMeta/yotta-workflow" /></a>
17
+ <a href="https://github.com/YottaMeta/yotta-workflow"><img alt="PRs welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen" /></a>
18
+ </p>
19
+
20
+ ## 这是什么
21
+
22
+ AI 会话本身是无状态的:每次对话相互独立,聊得越长越容易失忆,换个会话或换个智能体就接不上前文。各平台自带的记忆方案通常只服务单一智能体,不同智能体各记各的,还会产生多个「真相源」。
23
+
24
+ yotta-workflow 把「跨会话协作」沉淀为一套与智能体无关的协议,回答三个问题:
25
+
26
+ - **状态放哪里、以什么格式记录**——统一由规则判定,不靠各智能体自由发挥。
27
+ - **什么时候读、什么时候写**——开工必读、进行中主动写、收工必留锚点。
28
+ - **交接怎么交**——固定模板生成自包含交接锚点,下个会话只凭锚点即可无痛接续。
29
+
30
+ 它不依赖任何特定智能体或平台:状态就是项目目录下的 Markdown 文件,任何智能体、任何工具都能读能写。
31
+
32
+ ## 核心价值
33
+
34
+ - **一个真相源**:同一项目所有智能体会话读写同一份 `.workflow\` 状态目录,不再各建目录、各记各的。
35
+ - **状态就近存**:以会话 cwd 为基准判定状态位置,不写死任何默认路径;项目根就近存、工作区按项目名分开存。
36
+ - **主动防失忆**:进行中每完成一件事就落盘流水 / 任务 / 决策,不靠对话记忆(上下文会被自动压缩)。
37
+ - **自包含交接**:收工生成固定格式交接锚点,下个会话只凭锚点 + 状态文件即可恢复全部上下文。
38
+ - **与既有机制兼容**:项目已有自己的交接 / 状态机制时沿用原机制,只需满足两个强制点——开工先读状态、收工更新状态并留锚点。
39
+
40
+ ## 核心优势
41
+
42
+ | 优势 | 说明 |
43
+ |---|---|
44
+ | **跨智能体统一** | 符合 Agent Skills 开放标准(agentskills.io),安装一次,78+ 智能体共用同一套状态协议 |
45
+ | **一个真相源** | 状态目录统一 `.workflow`,同一项目任何智能体读写同一份状态,杜绝多真相源 |
46
+ | **路径判定自动化** | 先取 cwd → 判断是项目根还是工作区 → 就近存或按项目名分开存;全程不写死路径 |
47
+ | **主动式落盘** | 进行中即时写流水 / 任务 / 决策,上下文压缩也不丢关键状态 |
48
+ | **自包含交接锚点** | 固定模板 + 强制校验(内容必须与状态文件一致),下个会话无痛接续 |
49
+ | **轻量零依赖** | 纯 Markdown 文件,无 daemon / 无数据库 / 无注入;任何平台可读可写 |
50
+ | **渐进采用** | 已有状态机制的项目可沿用原机制,只需满足两个强制点,迁移成本低 |
51
+ | **生态分发** | GitHub + npm 双源同步发布;npx / install.sh / 手动复制三种安装方式,覆盖 17+ 类智能体目录 |
52
+
53
+ ## 协议详解
54
+
55
+ ### 状态文件位置判定(口诀)
56
+
57
+ **先取 cwd,再看它是不是项目根;是项目根就就近存,是工作区就按项目名分开存;状态目录统一用 `.workflow`,与所用智能体无关;全程不写死任何默认 / 固定路径。**
58
+
59
+ | base 形态 | 状态目录 |
60
+ |---|---|
61
+ | 项目根目录(含 `.git`、项目配置,或用户明确指向的单一项目) | `<base>\.workflow\` |
62
+ | 工作区根目录(下面并列多个项目子目录) | `<base>\<项目名>\.workflow\` |
63
+
64
+ > 用户指定的项目目录 / 统一工作区根目录按用户约定作为基准;未指定时以会话开始时的 cwd 为基准。
65
+
66
+ ### 项目状态体系(五类文件)
67
+
68
+ | 文件 | 内容 |
69
+ |---|---|
70
+ | `STATE.md` | 当前进度 / 最近决定 / 遗留问题 / 下一步(下个会话恢复的关键) |
71
+ | `TASKS.md` | 任务清单(`- [ ]` 待办 / `- [x]` 已完成 / `- [~]` 进行中) |
72
+ | `DECISIONS.md` | 决策记录(每条含背景 / 决定 / 理由 / 备选) |
73
+ | `ROADMAP.md` | 长期目标 + 下一步计划 |
74
+ | `logs\YYYY-MM-DD.md` | 每天一份流水(做了什么 / 产出什么 / 踩了什么坑) |
75
+
76
+ ### 三段式协议
77
+
78
+ **开工(每次会话开始必做)**:按判定规则定位状态目录 → 存在则完整读取 STATE / TASKS / ROADMAP / DECISIONS 与近期 logs 恢复上下文;不存在则初始化全部文件并向用户确认;一个会话只交付一个里程碑。
79
+
80
+ **进行中(主动及时写,不靠记忆)**:每完成一件事就追加当天流水;任务状态实时更新 TASKS;方向性决定当场写入 DECISIONS;STATE 的「当前进度」保持最新;关键信息必须已落盘,不能只留在对话里。
81
+
82
+ **收工(每次会话结束必做)**:更新 STATE / TASKS / ROADMAP → 追加当天流水 → 按模板生成交接锚点,原样输出给用户复制。
83
+
84
+ ### 交接锚点格式
85
+
86
+ 收工时按固定模板输出,锚点必须自包含,内容必须与状态文件一致、不得凭空编写。完整模板见 SKILL.md「五、交接话术模板」,结构要点:
87
+
88
+ | 段 | 内容 |
89
+ |---|---|
90
+ | 头部 | 项目名(一句话定位)、项目根目录绝对路径、上次会话结束日期 |
91
+ | 进度 | 当前进度、已完成(与 STATE.md 一致) |
92
+ | 后续 | 下一步(按优先级)、关键决定、遗留问题 / 注意 |
93
+ | 结尾 | 开工请先读取:`.workflow\STATE.md`、TASKS.md、ROADMAP.md |
94
+
95
+ ## 使用示例
96
+
97
+ **开工**——先读状态,再谈任务:
98
+
99
+ ```text
100
+ 请先读取 .workflow\STATE.md、TASKS.md、ROADMAP.md,恢复项目上下文。
101
+ ```
102
+
103
+ **进行中**——完成一件事,立即落盘:
104
+
105
+ ```text
106
+ 已完成「xxx」,追加到 logs\2026-08-25.md;勾选 TASKS.md 对应项;更新 STATE.md 当前进度。
107
+ ```
108
+
109
+ **收工**——按模板生成交接锚点:
110
+
111
+ ```text
112
+ 给你的下个会话锚点
113
+
114
+ 【会话交接锚点】
115
+ 项目:<项目名>(<一句话定位>)
116
+ 路径:<项目根目录绝对路径>
117
+ 上次会话结束于:<日期>
118
+ 当前进度:…
119
+ 下一步(按优先级):…
120
+ 开工请先读取:.workflow\STATE.md、TASKS.md、ROADMAP.md
121
+ ```
122
+
123
+ ## 触发方式
124
+
125
+ 在以下场景使用本技能:
126
+
127
+ - 开始或结束一个工作会话,或恢复一个项目时。
128
+ - 项目状态发生变化时(完成任务 / 记录决策 / 更新路线图)。
129
+ - 需要给下一个会话留下自包含交接锚点,或读取已有交接锚点时。
130
+
131
+ 针对一次性的只读提问(如「这个函数什么意思」)不必触发本技能。
132
+
133
+ ## 安装
134
+
135
+ 三种方式任选其一,技能文件统一从 **npm** 获取(GitHub 无代理时较慢,npm 可配国内镜像加速)。
136
+
137
+ ### 方式一:npm(推荐,一行安装)
138
+ ```bash
139
+ # 国内加速(可选):npm config set registry https://registry.npmmirror.com
140
+ npx -y @yottameta/yotta-workflow -g
141
+ npx -y @yottameta/yotta-workflow --dir <你的技能目录> # 任意智能体:指定目录安装
142
+ ```
143
+ > 智能体不在预置列表里?用 `--dir` 指定它的 skills 目录,或手动复制(方式三)。`--list` 可查看各智能体对应的默认目录。
144
+
145
+ ### 方式二:install.sh 一键安装
146
+ 获取技能文件夹后(`npm pack` 解包或 `git clone`),进入技能文件夹:
147
+ ```bash
148
+ bash install.sh -g # 用户级;bash install.sh --list 查看全部目录
149
+ bash install.sh --agent codex # 指定智能体(--list 可查看可用项)
150
+ bash install.sh # 项目级:自动检测已存在的 .claude/.cursor/.codex 等 skills 目录
151
+ bash install.sh --dir /path/to/skills
152
+ ```
153
+ > 覆盖 17 类智能体,含国内 Trae / Qwen / Comate / CodeBuddy / Kimi。Windows 用户:装有 Git Bash 即可用;否则用方式三手动复制。
154
+
155
+ ### 方式三:手动复制
156
+ 把整个 `yotta-workflow` 文件夹复制到目标智能体的 skills 目录。常见位置(用户级;Windows 用 `%USERPROFILE%`,Linux/macOS 用 `~`):
157
+
158
+ | 智能体 | 用户级目录 | 项目级目录 |
159
+ |---|---|---|
160
+ | Codex | `%USERPROFILE%\.codex\skills\yotta-workflow\` | `.codex\skills\` |
161
+ | Claude Code | `%USERPROFILE%\.claude\skills\yotta-workflow\` | `.claude\skills\` |
162
+ | Cursor | `%USERPROFILE%\.cursor\skills\yotta-workflow\` | `.cursor\skills\` |
163
+ | Windsurf | `%USERPROFILE%\.codeium\windsurf\skills\yotta-workflow\` | `.windsurf\skills\` |
164
+ | opencode | `%USERPROFILE%\.config\opencode\skills\yotta-workflow\` | `.opencode\skills\` |
165
+ | Gemini | `%USERPROFILE%\.gemini\skills\yotta-workflow\` | `.gemini\skills\` |
166
+ | Goose | `%USERPROFILE%\.config\goose\skills\yotta-workflow\` | `.goose\skills\` |
167
+ | Amp | `%USERPROFILE%\.config\agents\skills\yotta-workflow\` | `.agents\skills\` |
168
+ | Kiro | `%USERPROFILE%\.kiro\skills\yotta-workflow\` | `.kiro\skills\` |
169
+ | WorkBuddy | `%USERPROFILE%\.workbuddy\skills\yotta-workflow\` | `.workbuddy\skills\` |
170
+ | Trae Code CLI | `%USERPROFILE%\.traecli\skills\yotta-workflow\` | `.traecli\skills\` |
171
+ | Trae IDE(国内) | `%USERPROFILE%\.trae-cn\skills\yotta-workflow\` | `.trae\skills\` |
172
+ | Qwen Code | `%USERPROFILE%\.qwen\skills\yotta-workflow\` | `.qwen\skills\` |
173
+ | Comate 文心快码 | `%USERPROFILE%\.comate\skills\yotta-workflow\` | `.comate\skills\` |
174
+ | CodeBuddy Code | `%USERPROFILE%\.codebuddy\skills\yotta-workflow\` | `.codebuddy\skills\` |
175
+ | Kimi Code CLI | `%USERPROFILE%\.kimi\skills\yotta-workflow\` | `.kimi\skills\` |
176
+
177
+ > 通用约定:`.agents/skills` 并非所有智能体都读取(Claude Code 与 Codex 默认不读),仅为 OpenCode / Cursor / Cline / Amp / Kimi / Gemini CLI 等智能体识别。已修改默认目录的智能体,请用 `--dir` 指定实际路径。
178
+
179
+ ## 升级 / 卸载
180
+
181
+ - **升级**:重新安装最新版覆盖即可——`npx -y @yottameta/yotta-workflow -g` 或重跑 `bash install.sh -g`。技能目录内的旧文件会被覆盖;项目里的状态文件(`.workflow\`)不受影响。
182
+ - **卸载**:删除目标智能体 skills 目录下的 `yotta-workflow` 文件夹(各智能体目录见上表)。卸载不影响已写入项目的状态文件。
183
+
184
+ ## 常见问题
185
+
186
+ - **状态目录在哪?** 先看项目下是否存在 `.workflow\`;不存在时按「状态文件位置判定」规则以会话 cwd 为基准定位。
187
+ - **多个智能体状态不同步?** 确认它们指向同一项目目录(同一份 `.workflow\`)。本技能设计为共享一份状态;若各自建了 `.workflow`,说明项目目录不一致。
188
+ - **项目已有自己的交接机制?** 沿用原机制即可,只需满足两个强制点:开工先读状态、收工更新状态并留锚点。
189
+
190
+ ## 开发与校验
191
+
192
+ 本项目内运行:`python tools/validate-skill.py yotta-workflow`。
193
+
194
+ ## 许可证
195
+
196
+ MIT © YottaMeta
package/SKILL.md ADDED
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: yotta-workflow
3
+ description: "Universal cross-session, cross-project workflow standard for AI agents: 开工必读状态、状态就近存、进行中自动记流水/任务/决策、收工必留交接锚点。Use when starting or ending a working session, resuming a project, or whenever project state changes. 适合所有 AI 智能体的通用工作流。Not for one-off read-only questions."
4
+ version: 0.1.3
5
+ license: MIT
6
+ agent_created: true
7
+ metadata:
8
+ short-description: 跨会话/跨项目通用工作流:开工读状态、收工留锚点
9
+ ---
10
+
11
+ # 全局工作流标准(跨会话项目协作协议)
12
+
13
+ 本文件是**全局层标准**:所有项目共享同一套工作流程。状态文件位置按规则判定(见下)。
14
+
15
+ 核心原则:**流程全局定,状态就近存。开工必读状态,收工必留锚点。**
16
+
17
+ ---
18
+
19
+ ## 〇、状态文件位置判定规则
20
+
21
+ > 说明:**状态目录**是项目内的共享隐藏目录,统一固定为 `.workflow\`(名称以 `.` 开头)。**对同一项目,任何智能体会话(无论 Codex / Cursor / Hermes / OpenCode…)都读写这一份共享状态目录**,以此保证"不同智能体协作共用一套状态"成立——而不是各智能体各建一份(那样会产生多个真相源,上一程记的状态下一程读不到)。技能可被安装分发到多个智能体,但状态目录命名与所用智能体无关,永远落在同一个 `.workflow\`。
22
+
23
+ **不要假设存在一个固定的"默认项目目录"。** 各个智能体/宿主给"未指定项目"的会话分配的默认工作目录并不相同(有的按会话自动建临时目录,有的叫 `projects` 等),因此必须以**本次会话开始时的当前工作目录(cwd)**为基准来定位状态,而不是写死某个路径。
24
+
25
+ > 「统一工作区根目录」常为用户自己建的(如为了把项目数据集中到某个盘目录方便备份),那属于**用户的工作约定**,不是智能体默认;用户给了就用它做基准,但在通用技能里不要写成任何具体路径。
26
+
27
+ **第一步,确定基准目录(base):**
28
+ - **已指定 / 已锚定项目目录**(含用户自建的统一工作区根目录)→ `base` = 用户指定的项目根目录 / 工作区根目录。
29
+ - **未指定项目目录**(临时会话 / 无固定工作目录)→ `base` = 会话开始时宿主给的**当前工作目录(cwd)**,AI 启动时读取即可,不要写死。
30
+
31
+ **第二步,根据 base 的形态定状态目录:**
32
+ - `base` **本身就是一个项目根目录**(含项目标识,如 `.git`、项目配置、或用户明确指向的单一项目)→ 状态文件放 `base` 下 `.workflow\`
33
+ ```
34
+ <base>\.workflow\
35
+ ├── STATE.md
36
+ ├── TASKS.md
37
+ ├── DECISIONS.md
38
+ ├── ROADMAP.md
39
+ └── logs\
40
+ └── YYYY-MM-DD.md
41
+ ```
42
+ - `base` 是**工作区根目录**(下面并列多个项目子目录)→ 按项目名建子目录:`<base>\<项目名>\.workflow\`(结构同上)。
43
+
44
+ 判定口诀:**先取 cwd,再看它是不是项目根;是项目根就就近存,是工作区就按项目名分开存;状态目录统一用 `.workflow`,与所用智能体无关;全程不写死任何默认/固定路径。**
45
+
46
+ 项目名取项目根目录名(同名冲突时附加路径哈希)。
47
+
48
+ ---
49
+
50
+ ## 一、项目状态体系
51
+
52
+ 状态文件结构(两种位置下结构一致)。**所有状态文件与流水日志都存放在本项目自己的 `.workflow\` 状态目录下**(位置见「〇」),项目之间互不共享、互不读写:
53
+
54
+ 文件首行格式约定:
55
+ - `STATE.md` 首行:`# 项目状态`,下面依次为 `## 当前进度`、`## 最近决定`、`## 遗留问题`、`## 下一步`
56
+ - `TASKS.md` 首行:`# 任务清单`,用 `- [ ] 待办 / - [x] 已完成 / - [~] 进行中`
57
+ - `logs/`:**每天一个文件**,文件名用日期 `YYYY-MM-DD.md`(如 `2026-08-05.md`)。首行 `# 流水日志 YYYY-MM-DD`,同一天内按时间先后顺序追加;跨天则新建当天文件。短期回顾读当天文件,长期回顾用目录按需翻查
58
+ - `DECISIONS.md` 首行:`# 决策记录`,每条 `### 决策:一句话 | 日期`,含背景、决定、理由、备选
59
+ - `ROADMAP.md` 首行:`# 路线图`,分 `## 长期目标`、`## 下一步计划`
60
+
61
+ ---
62
+
63
+ ## 二、开工协议(每次会话开始必做)
64
+
65
+ 1. 按「〇、状态文件位置判定规则」确定状态目录,检查 `.workflow\STATE.md` 是否存在。
66
+ 2. **存在** → 完整读取 `STATE.md`、`TASKS.md`、`ROADMAP.md`、`DECISIONS.md`,最近几天的 `logs/*.md` 首屏,恢复上下文。
67
+ 3. **不存在** → 视为新项目,按「一、项目状态体系」初始化全部文件,写入项目背景和首个目标,然后向用户确认定位是否准确。
68
+ 4. **一个会话一个里程碑**:根据 `ROADMAP.md` 确定本次只交付一个里程碑/目标,不散开做多件事;做完就收工开新会话,别让单个会话聊太长而失忆。
69
+ 5. 若用户给了交接话术(收工锚点),优先按锚点内容恢复上下文,再与状态文件交叉核对。
70
+
71
+ ---
72
+
73
+ ## 三、进行中协议(主动及时写,不靠记忆)
74
+
75
+ 整个会话过程中主动维护状态,**不靠对话记忆**(上下文会被自动压缩):
76
+
77
+ 1. **任务推进**:每开始/完成一项任务,同步更新 `TASKS.md`(勾选、移状态),用 todo 工具辅助跟踪。
78
+ 2. **主动及时写流水**:**每做完一件事就追加**到当天的 `logs/YYYY-MM-DD.md`(不存在则新建),不攒到收工。流水记"做了什么、产出什么、踩了什么坑"。
79
+ 3. **决策落盘**:做出影响项目方向的决定(技术选型、命名、放弃某方案)时,当场写入 `DECISIONS.md`,写明背景和理由。
80
+ 4. **进度快照**:`STATE.md` 的"当前进度"保持最新,这是下个会话恢复的关键,不能滞后。
81
+ 5. **记忆分层**(按"重要性 + 范围"分三档,别都堆进一个文件):
82
+ - **流水**:每件事的即时记录 → `logs/YYYY-MM-DD.md`(项目内)。
83
+ - **重要 / 长期记忆**:跨会话仍要用的项目事实、决定、进度 → 项目记忆文件 `STATE.md`、`TASKS.md`、`DECISIONS.md`、`ROADMAP.md`(项目内)。
84
+ - **跨项目记忆**:跨项目/跨会话都要用的通用知识、环境事实、红线 → **永久记忆文件**(如全局 `AGENTS.md`)。该文件保持精简,用**锚点**指向具体文件,不无限堆内容。
85
+ 6. **防上下文压缩失忆**:凡是"下一个会话需要记得"的关键信息,**必须已经写进上面的文件**,不能只留在对话里;发现上下文变长/将被压缩时,先把关键状态落盘再继续。
86
+
87
+ ---
88
+
89
+ ## 四、收工协议(每次会话结束必做)
90
+
91
+ 用户说 **"收工"** 或接近收尾的表述时,依次执行;**完成一个里程碑/一个任务后,也主动抛出下个会话的交接锚点**,引导用户开新会话,避免单会话聊太长失忆。
92
+
93
+ 1. 更新 `STATE.md`:重写"当前进度""最近决定""遗留问题""下一步"。
94
+ 2. 更新 `TASKS.md`:核对所有任务状态。
95
+ 3. 追加 `logs/YYYY-MM-DD.md`:写一条本次会话流水(做了什么、产出什么、遗留什么),跨天则新建当天文件。
96
+ 4. 更新 `ROADMAP.md`:勾掉已完成项,调整下一步。
97
+ 5. 生成 **交接话术**(下文的锚点),原样输出给用户复制。
98
+
99
+ ---
100
+
101
+ ## 五、交接话术模板(收工锚点)
102
+
103
+ 收工时给用户**原样输出下面这段**,用户直接复制发给下一个会话。**锚点必须自包含**——新会话只凭这段文字就能无痛接续。
104
+
105
+ **全局统一格式(必须遵守,所有项目/会话完全一致)**:
106
+ - 先输出一行标题:`给你的下个会话锚点`。
107
+ - 再用 **markdown 语言围栏**把锚点正文包起来(三层反引号:开头 ```markdown、结尾 ```)。
108
+ - 禁止用普通段落、非围栏代码块或其它语言标签;确保可一键复制、格式统一。
109
+
110
+ 给你的下个会话锚点
111
+
112
+ ```markdown
113
+ 【会话交接锚点】
114
+ 项目:<项目名>(<一句话定位>)
115
+ 路径:<项目根目录绝对路径>
116
+
117
+ 上次会话结束于:<日期>
118
+
119
+ 当前进度:
120
+ - <要点 1>
121
+ - <要点 2>
122
+
123
+ 已完成:
124
+ - <要点 1>
125
+ - <要点 2>
126
+
127
+ 下一步(按优先级):
128
+ 1. <事项>
129
+ 2. <事项>
130
+
131
+ 关键决定(详情见 DECISIONS.md):
132
+ - <决定 1 及理由>
133
+
134
+ 遗留问题 / 注意:
135
+ - <风险、坑、待确认事项>
136
+
137
+ 开工请先读取:`.workflow\STATE.md`、TASKS.md、ROADMAP.md(状态目录位置见「〇、判定规则」)
138
+ ```
139
+
140
+ 收工时锚点里的内容**必须与状态文件一致**,不得凭空编写。
141
+ ## 六、强制执行条款
142
+
143
+ - 任何项目会话,未读状态文件前不得声称"了解项目情况"。
144
+ - 任何会话结束,未更新状态文件前不得声称"已保存进度"。
145
+ - 交接锚点未生成,不得说"下次继续也行"。
146
+ - 状态文件是唯一真相源,与对话记忆冲突时以状态文件为准。
147
+
148
+ ---
149
+
150
+ ## 七、与既有项目机制的协调
151
+
152
+ - **项目已有自己的交接/状态机制**:沿用其机制,不必强制迁移到本标准结构,但必须满足两个强制点——开工先读状态再声称了解;收工更新状态并留锚点。
153
+ - **新项目 / 无既有机制**:按「〇、判定规则」初始化状态目录,完整执行本协议。
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "工作流标准"
3
+ short_description: "跨会话/跨项目通用工作流:开工读状态、进行中记流水、收工留锚点"
4
+ brand_color: "#3B82F6"
5
+ default_prompt: "Use $yotta-workflow to start this working session: read the project state, then plan and execute per the standard."
Binary file
package/bin/install.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * yotta-workflow 跨平台安装器(YottaSkills)
4
+ * 用法:
5
+ * npx -y @yottameta/yotta-workflow --agent <name> # 按智能体默认用户级目录安装(推荐)
6
+ * npx -y @yottameta/yotta-workflow --dir PATH # 装到指定目录(用户改了目录的智能体)
7
+ * npx -y @yottameta/yotta-workflow -g # 安装到全部已知智能体用户级目录
8
+ * npx -y @yottameta/yotta-workflow # 安装到检测到的项目级目录
9
+ * npx -y @yottameta/yotta-workflow --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-workflow';
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-workflow 多智能体安装脚本(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-workflow"
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,34 @@
1
+ {
2
+ "name": "@yottameta/yotta-workflow",
3
+ "version": "0.2.0",
4
+ "description": "Universal cross-session, cross-project workflow standard for AI agents: 开工读状态、状态就近存、进行中记流水/任务/决策、收工留交接锚点。适合所有 AI 智能体的通用工作流。",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "agent-skills",
8
+ "yotta-workflow",
9
+ "workflow",
10
+ "project-state",
11
+ "handoff"
12
+ ],
13
+ "files": [
14
+ "SKILL.md",
15
+ "LICENSE",
16
+ "README.md",
17
+ "install.sh",
18
+ "agents",
19
+ "references",
20
+ "scripts",
21
+ "assets",
22
+ "bin"
23
+ ],
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/YottaMeta/yotta-workflow.git"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "bin": {
32
+ "yotta-workflow": "bin/install.js"
33
+ }
34
+ }