flower-trellis 0.6.7 → 0.6.8-beta.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/README.md +4 -2
- package/enhancements/0.6/.agents/skills/trellis-check-all/SKILL.md +1 -9
- package/enhancements/0.6/.agents/skills/trellis-check-all/references/document-drift-auto-remediation.md +2 -0
- package/enhancements/0.6/.agents/skills/trellis-check-all/references/reporting-and-disposition.md +8 -12
- package/enhancements/0.6/.agents/skills/trellis-push/SKILL.md +3 -1
- package/enhancements/0.6/.agents/skills/trellis-push/references/output-templates.md +8 -9
- package/enhancements/0.6/.claude/skills/trellis-check-all/SKILL.md +1 -9
- package/enhancements/0.6/.claude/skills/trellis-check-all/references/document-drift-auto-remediation.md +2 -0
- package/enhancements/0.6/.claude/skills/trellis-check-all/references/reporting-and-disposition.md +8 -12
- package/enhancements/0.6/.claude/skills/trellis-push/SKILL.md +3 -1
- package/enhancements/0.6/.claude/skills/trellis-push/references/output-templates.md +8 -9
- package/enhancements/MANIFEST.json +2 -2
- package/package.json +3 -3
- package/src/lib/skill-catalog.js +35 -25
package/README.md
CHANGED
|
@@ -172,7 +172,7 @@ flower-trellis plugin
|
|
|
172
172
|
|
|
173
173
|
交互管理器采用 `发现 / 已安装 / 来源 / 问题` 四个页签。Trellis 项目的 `发现` 页会展示 `flower/skill-garden` 内置入口,按 Enter 直接管理工作流强化与可选通用技能;原 `flower-trellis skill` 命令继续保留为高级兼容入口。`发现` 同时合并全部已启用来源的 Plugin,并保留来源标签和即时搜索;未登录 GitLab 来源会直接进入 Device Flow,GitHub 公共来源无需登录。`来源` 页的“新增来源”可选择 GitHub 公共仓库或 GitLab Marketplace;GitHub 会先在临时缓存中下载固定快照、检测格式、展示可导入与忽略组件,确认后才保存。ref 留空时使用仓库默认分支;出现多个格式入口时会要求选择,公开 GitHub 跨仓 Marketplace 条目和 `plugins/*` 多 Plugin 仓库也可识别。
|
|
174
174
|
|
|
175
|
-
可选通用技能包含 `aliyun-
|
|
175
|
+
可选通用技能包含 `aliyun-ops`,统一提供阿里云 DMS、SLS 与 MSE 查询和排障能力,DMS 写操作通过数据变更工单进入审批流。通用技能需手动选择启用,不会复制用户私有 AK/SK 配置。Codex 通用技能安装到 `.agents/skills`,Claude 安装到 `.claude/skills`;已有 `.codex` 或 `.agents` 时使用共享目标,已有 `.claude` 时使用 Claude 目标,三个目录都不存在时默认同时安装两份。空目录也可通过 Skill Garden 入口管理通用技能,无需初始化 Trellis。
|
|
176
176
|
|
|
177
177
|
安装、更新和卸载都会先展示 dry-run、依赖、capability 和目标文件变化,确认后才写入项目。Plugin 作者使用的 `plugin init`、`plugin validate` 继续保留在高级命令中,不占用普通用户的管理器首页。
|
|
178
178
|
|
|
@@ -381,7 +381,9 @@ flower banner → 平台多选菜单 → Trellis 原生交互(模板 / monorepo
|
|
|
381
381
|
|
|
382
382
|
- **通用技能**:`flower-trellis update` 会用新版快照覆盖仓库中已经启用的 common skill,
|
|
383
383
|
未启用项不会自动安装;若某个已安装 common skill 已从新版快照移除,更新会精确删除其
|
|
384
|
-
`.
|
|
384
|
+
`.agents/skills` / `.claude/skills` 或历史 `.codex/skills` 副本。安装或更新对应技能时,
|
|
385
|
+
旧 `.codex/skills` 会迁移到 `.agents/skills`,兼容旧技能名称;新副本写入成功后才清理旧目录。
|
|
386
|
+
新旧同名技能仍按随包快照替换,不合并自定义内容;停用会清理该技能的新旧精确目录。
|
|
385
387
|
|
|
386
388
|
## 开发
|
|
387
389
|
|
|
@@ -85,15 +85,7 @@ untracked helper 只存游标:findings 或新编辑回 `implement`;通过且
|
|
|
85
85
|
|
|
86
86
|
### Step 4:统一报告与分流
|
|
87
87
|
|
|
88
|
-
读取 `references/reporting-and-disposition.md
|
|
89
|
-
|
|
90
|
-
- `check_profile`;
|
|
91
|
-
- 三个维度状态;
|
|
92
|
-
- 自动修复的 `DOC-*` 内容;
|
|
93
|
-
- 剩余 `CHK-*` 主路径问题与 `FBK-*` 兜底问题;
|
|
94
|
-
- 每个剩余问题的未处置或已接受风险状态;
|
|
95
|
-
- 已执行验证、未覆盖风险和 `[上线后验证]`;
|
|
96
|
-
- 与当前结论匹配的唯一下一步。
|
|
88
|
+
读取 `references/reporting-and-disposition.md`,按其完整模板与分流规则在对话中输出报告;默认不新建报告文件,落盘例外由该 reference 定义。
|
|
97
89
|
|
|
98
90
|
---
|
|
99
91
|
|
|
@@ -34,6 +34,8 @@
|
|
|
34
34
|
- 不改操作步骤、责任边界、安全提示、协议字段或对外承诺,且可由重读或静态检查验证;
|
|
35
35
|
- 用户没有明确要求本轮绝对只读。
|
|
36
36
|
|
|
37
|
+
任务状态同步只更新已有文档中的过期事实;不得借 `task-status`、`check-record` 或 `mechanical-link` 新建检查报告并追加引用。报告落盘条件见 `references/reporting-and-disposition.md`。
|
|
38
|
+
|
|
37
39
|
典型例子:
|
|
38
40
|
|
|
39
41
|
- `brief.md` 漏掉 diff 已证明的实现范围,或 `implement.md` 状态机械过期;
|
package/enhancements/0.6/.agents/skills/trellis-check-all/references/reporting-and-disposition.md
CHANGED
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
4. 已接受问题继续完整展示证据、影响、建议和验证,标题行末尾追加 `` `[已接受风险]` `` 标签;不得删除条目、改列 `DOC-*` 或伪报已修复。
|
|
57
57
|
5. `strict pass` 只用于剩余 `CHK-*` / `FBK-*` 均为 0。所有剩余问题均已被有效接受,且无 blocked、无阻断型部分验证、无未接受的实质剩余风险时,结论为 `通过·已接受风险`。
|
|
58
58
|
6. blocked、阻断型部分验证和无法唯一对应当前报告范围的实质剩余风险不是 `CHK-*` / `FBK-*` 处置状态,不能借风险接受绕过;`[上线后验证]` 不属于风险接受对象。
|
|
59
|
-
7. `仅保留报告`
|
|
59
|
+
7. `仅保留报告` 表示停止处置并等待,不等于接受风险,也不授权写文件;只有带明确接受语义的用户回复才改变问题处置状态。
|
|
60
60
|
|
|
61
61
|
## 验证阶段
|
|
62
62
|
|
|
@@ -68,6 +68,10 @@
|
|
|
68
68
|
|
|
69
69
|
## 输出:统一检查报告
|
|
70
70
|
|
|
71
|
+
报告默认在对话中完整展示,不得为了缩短回复、提供链接、留存结论或同步任务状态新建 `check-report.md` 等附件,也不得用附件链接代替应展示的内容。
|
|
72
|
+
|
|
73
|
+
仅用户明确要求导出或已确认的交付约定要求文件时,由主会话保存,不得自行补写约定。Maven、auto-loop 沿用各自机器证据契约,不额外生成 Markdown。已有报告不自动删除或复制。
|
|
74
|
+
|
|
71
75
|
interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动、行为影响和结论,再展示证据与问题:
|
|
72
76
|
|
|
73
77
|
- 依据当前审查范围的最终 diff 和已读实现,覆盖 staged、unstaged、未跟踪文件及必要的子仓;复用检查时收集的材料,不额外启动 Diff Brief 流程或重复扫描。
|
|
@@ -150,6 +154,7 @@ interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动
|
|
|
150
154
|
|
|
151
155
|
展示规则:
|
|
152
156
|
|
|
157
|
+
- strict pass 且无剩余问题时可紧凑表述,保留模板顺序、画像、维度、实际验证、DOC(如有)、风险和下一步,省略空区块;不得缩减实际检查范围。有问题或已接受风险时完整展示问题字段与处置。
|
|
153
158
|
- 报告头部“工作/范围/画像/结论”和“修复批次”必须使用 `- ` 列表项,不得改为裸行或依赖行尾空格。
|
|
154
159
|
- 每个问题必须由一个四级标题承载,固定顺序为 `` #### `<ID>` `<严重度>` `<来源>` <标题> ``。仅 `已接受风险` 的问题在标题末尾追加 `` `[已接受风险]` ``;待处理不加标签。`来源` 与 `处置` 都不再单独占行。
|
|
155
160
|
- 不得改用 `- [ ]` / `- [x]` 列表项承载问题条目。终端渲染器会把松散列表压平,相邻条目会糊成一段无法分辨;只有标题这类块级元素才能稳定产生视觉分隔。修复状态由“修复结果”表格表达,不靠 checkbox。
|
|
@@ -161,7 +166,6 @@ interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动
|
|
|
161
166
|
- 存在未处置 `CHK-*` 或 `FBK-*` 时展示“修复批次”,并只在报告末尾提供一次处置选择,不再逐项提问。
|
|
162
167
|
- `修复全部` 始终覆盖全部 `CHK-*` 与 `FBK-*`;精确修复可以混合两类 ID。
|
|
163
168
|
- 风险接受可混合两类 ID;“接受当前报告全部风险”覆盖全部剩余问题,包括 P0,无固定句式。全部有效接受后才形成“通过·已接受风险”。
|
|
164
|
-
- `仅保留报告` 只表示停止处置,不改变未通过结论或剩余风险。
|
|
165
169
|
- interactive 标准报告必须以“下一步”段结束;停止等待不等于省略引导。
|
|
166
170
|
- 独立 `CHK-*` 或 `FBK-*` 不得因数量多而静默省略;先合并同根因重复项,再完整列出剩余项。
|
|
167
171
|
- 报告不得包含 commit message、拟提交/暂存文件、commit-only 决策或提交确认。
|
|
@@ -205,7 +209,7 @@ interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动
|
|
|
205
209
|
<按下方 `Interactive Post-Check Stop Gate` 输出一个明确、可执行的主动作>
|
|
206
210
|
```
|
|
207
211
|
|
|
208
|
-
|
|
212
|
+
重检后按下方 `Interactive Post-Check Stop Gate` 分流;仍有未处置 `CHK-*` 或 `FBK-*` 时停留在处置/重检循环。
|
|
209
213
|
|
|
210
214
|
untracked helper 不存检查证据或风险接受。普通通过后保持 `stage=check`;direct Git 同轮继续或用户明确继续才 `advance --stage spec`。未处置 `CHK-*` / `FBK-*`、阻断型部分验证、阻塞或新编辑先 `advance --stage implement`;仅 `[上线后验证]` 不回退。
|
|
211
215
|
|
|
@@ -246,14 +250,6 @@ subagent 只返回结构化 `CHK-*`、`FBK-*`、`DOC-*` 候选、报告和 `chec
|
|
|
246
250
|
|
|
247
251
|
停止边界只控制是否自动推进,不能让报告在没有下一步提示的情况下结束。
|
|
248
252
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
- 各维度状态、问题数和问题清单;
|
|
252
|
-
- `CHK-*` 主路径问题和 `FBK-*` 兜底问题的证据、影响与验证;
|
|
253
|
-
- `DOC-*` 自动修复内容和验证;
|
|
254
|
-
- 已执行验证及结果;
|
|
255
|
-
- 未覆盖验证、`[上线后验证]` 和剩余风险;
|
|
256
|
-
- 总体结论;
|
|
257
|
-
- 与当前结论匹配的唯一主动作引导;有未处置 `CHK-*` 或 `FBK-*` 时是一次修复或风险接受选择,部分验证/阻塞时是补充决策或验证,通过时是 Phase 3.3 / Phase 3.4 指向。
|
|
253
|
+
标准报告仅包含上方统一模板定义的检查内容和本 Gate 的唯一主动作。
|
|
258
254
|
|
|
259
255
|
Check-All 不新增 direct Git 摘要或 Git 计划;这些仍由 Update-Spec 与 Push 所有。`[上线后验证]` 交给 Push 风险摘要和既有 `trellis-release` / `release.md`。
|
|
@@ -118,7 +118,9 @@ git log @{u}..HEAD --oneline 2>/dev/null || true
|
|
|
118
118
|
|
|
119
119
|
命令必须是受版本控制的稳定入口,并且本地、确定性、可重复、无外部副作用。工作目录和预期影响路径必须可审计;只有名称相似、mtime、目录邻近或惯例不足以执行。禁止任意 shell 字符串、管道、重定向、命令替换、push、release、deploy、archive、凭证和生产数据操作;证据不足时失败关闭。
|
|
120
120
|
|
|
121
|
-
`retained` 只是内部集合名。用户可见输出统一写“保留未提交的变更(dirty
|
|
121
|
+
`retained` 只是内部集合名。用户可见输出统一写“保留未提交的变更(dirty)”,按输出 reference 的阈值展示;内部始终保留 exact paths 和 Git 状态,分组摘要不得用于 pathspec 或替代校验。unknown ahead、branch/upstream 异常、归属不确定等真正需要处理的事项单独进入“风险”区;普通 retained dirty 不默认视为阻塞。
|
|
122
|
+
|
|
123
|
+
普通模式和用户 `commit-only` 的计划与校验基线默认保存在当前执行上下文。仅跨进程校验或中断恢复确需落盘时,才在 Git 忽略的 runtime 目录保存一份必要的临时 JSON;已有可复用记录时不另建副本。不得仅为缩短对话、提供链接或展示完整清单生成 `retained.md` 等清单附件,也不把临时计划写入任务产物或提交范围。auto-loop 沿用 runner 的既有持久化契约,不增加额外清单。
|
|
122
124
|
|
|
123
125
|
普通模式允许 `retained` 存在。执行前记录计划外 staged set,提交后确认这些 staged 文件仍保持原状。用户明确要求新增文件时,重新生成计划并确认,不能在执行中静默扩大范围。
|
|
124
126
|
|
|
@@ -30,9 +30,8 @@
|
|
|
30
30
|
[生成(多仓需要时显示):前置仓成功后,在 `<working-directory>` 运行 `<exact local command>`;预计只影响 <后续仓 exact files 或分组摘要>]
|
|
31
31
|
|
|
32
32
|
### 保留未提交的变更(dirty,仅数量大于 0 时显示)
|
|
33
|
-
-
|
|
34
|
-
- [
|
|
35
|
-
- [staged] <path>
|
|
33
|
+
- <按共用规则逐项展示或按仓库、目录、Git 状态汇总数量>
|
|
34
|
+
- [staged] <repository/path>(仅存在时逐项显示,兼有未暂存修改时同时标注 [unstaged])
|
|
36
35
|
|
|
37
36
|
### 风险(仅数量大于 0 时显示)
|
|
38
37
|
- <Check-All / Update-Spec 风险,或 unknown ahead / branch-upstream / attribution risk>
|
|
@@ -45,7 +44,7 @@
|
|
|
45
44
|
- **进度**:completed=<...> | partial=<...> | next=<...>
|
|
46
45
|
- **执行**:<business commit/push -> `task_progress.py write --complete` -> task-record commit -> task-record push>
|
|
47
46
|
|
|
48
|
-
确认执行请回复 `确认`。可调整:`只提交`、`修改 message
|
|
47
|
+
确认执行请回复 `确认`。可调整:`只提交`、`修改 message`、`展开文件`、`展开保留变更`。
|
|
49
48
|
```
|
|
50
49
|
|
|
51
50
|
## 共用展示规则
|
|
@@ -55,7 +54,9 @@
|
|
|
55
54
|
- 单仓 `planned` 不超过 8 个文件时完整列出。
|
|
56
55
|
- 超过 8 个时按目录归组,最多 12 行;用户要求展开时展示同一 exact set。
|
|
57
56
|
- 顶部仓库/commit/file 总数包含独立任务记录提交所在 Git root、该提交及其 exact files;任务记录文件使用相同的 8 文件展示阈值和展开规则。
|
|
58
|
-
-
|
|
57
|
+
- 计划中的保留变更按仓库计数:不超过 8 项时逐项标注 `[untracked]`、`[unstaged]`、`[staged]`;超过 8 项时将非 staged 项按目录与 Git 状态汇总数量,每仓最多 12 行,必要时合并到上级目录。同一路径计数一次,兼有 staged/unstaged 时同时标注。
|
|
58
|
+
- 计划外 staged 项始终逐项单列,不计入分组摘要;真正风险在独立“风险”区逐项展示,两者均不受行数限制。分组、展开均只改变展示,不改变 exact set 或确认范围。
|
|
59
|
+
- 用户要求“展开保留变更”时在对话中列出同一 exact set 与 Git 状态,不生成清单附件;“展开文件”仍指 planned files。
|
|
59
60
|
- 完成链证据始终显示当前状态,但不重复 Check-All 报告或 Spec review 正文;`未运行`、`已失效`、任一未处置 `CHK-*` / `FBK-*`、blocked、部分验证或 `needs-review` 同时计入风险区。已接受风险的问题也必须按 ID、严重度和影响进入风险区,但不得改标为阻断 finding。`[上线后验证]` 作为非阻断风险逐项保留动作、环境/责任边界和预期结果,不改变 Check-All 状态,并注明由既有 `trellis-release` / `release.md` 流程承接。
|
|
60
61
|
- 无活动 task、untracked 或 `commit-only` 时省略进度动作。
|
|
61
62
|
- 不重复展示检查结果、规范复核、归档或其他阶段的详细信息。
|
|
@@ -85,15 +86,13 @@
|
|
|
85
86
|
- **失败原因**:<原因和恢复动作>(仅失败时显示)
|
|
86
87
|
|
|
87
88
|
### 保留未提交的变更(dirty,仅存在时显示)
|
|
88
|
-
-
|
|
89
|
-
- [unstaged] <path>
|
|
90
|
-
- [staged] <path>
|
|
89
|
+
- <按仓库报告保留数量与实际核对结论;异常或未核验项逐项说明>
|
|
91
90
|
```
|
|
92
91
|
|
|
93
92
|
## 结果补充规则
|
|
94
93
|
|
|
95
94
|
- untracked 结果用“无任务状态”替代“任务进度”,展示 work id 与 `<已清理/保留待恢复>`;不生成或暗示 task progress commit。
|
|
96
95
|
- 部分完成时必须明确列出已成功仓库、失败仓库/步骤、当前分支和下一恢复动作。业务结果与 progress sync 状态不得合并成一个模糊结论。
|
|
97
|
-
- 普通成功结果必须确认本任务产生的当前任务目录变更 clean
|
|
96
|
+
- 普通成功结果必须确认本任务产生的当前任务目录变更 clean。其它 retained dirty 已核对保持原状时,每仓只报告数量与结论,不重复清单;计划外 staged 项仍逐项确认保留状态。异常或未核验项列出路径、实际状态和处理情况,不得笼统声称全部保持原状;用户要求展开时沿用共用规则。
|
|
98
97
|
- helper 成功但任务记录 commit 失败时,结果写“任务记录 commit 待恢复”,说明本地 `completed` 与 exact task dirty 已保留;任务记录 commit 成功但 push 失败时写“任务记录 push 待恢复”,说明 clean ahead commit 已保留。两种情况都不得暗示需要重复业务提交或 helper 写入。
|
|
99
98
|
- validated auto-loop local completion 不渲染本模板,也不得被普通结果文案描述为任务记录 push 待恢复。
|
|
@@ -85,15 +85,7 @@ untracked helper 只存游标:findings 或新编辑回 `implement`;通过且
|
|
|
85
85
|
|
|
86
86
|
### Step 4:统一报告与分流
|
|
87
87
|
|
|
88
|
-
读取 `references/reporting-and-disposition.md
|
|
89
|
-
|
|
90
|
-
- `check_profile`;
|
|
91
|
-
- 三个维度状态;
|
|
92
|
-
- 自动修复的 `DOC-*` 内容;
|
|
93
|
-
- 剩余 `CHK-*` 主路径问题与 `FBK-*` 兜底问题;
|
|
94
|
-
- 每个剩余问题的未处置或已接受风险状态;
|
|
95
|
-
- 已执行验证、未覆盖风险和 `[上线后验证]`;
|
|
96
|
-
- 与当前结论匹配的唯一下一步。
|
|
88
|
+
读取 `references/reporting-and-disposition.md`,按其完整模板与分流规则在对话中输出报告;默认不新建报告文件,落盘例外由该 reference 定义。
|
|
97
89
|
|
|
98
90
|
---
|
|
99
91
|
|
|
@@ -34,6 +34,8 @@
|
|
|
34
34
|
- 不改操作步骤、责任边界、安全提示、协议字段或对外承诺,且可由重读或静态检查验证;
|
|
35
35
|
- 用户没有明确要求本轮绝对只读。
|
|
36
36
|
|
|
37
|
+
任务状态同步只更新已有文档中的过期事实;不得借 `task-status`、`check-record` 或 `mechanical-link` 新建检查报告并追加引用。报告落盘条件见 `references/reporting-and-disposition.md`。
|
|
38
|
+
|
|
37
39
|
典型例子:
|
|
38
40
|
|
|
39
41
|
- `brief.md` 漏掉 diff 已证明的实现范围,或 `implement.md` 状态机械过期;
|
package/enhancements/0.6/.claude/skills/trellis-check-all/references/reporting-and-disposition.md
CHANGED
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
4. 已接受问题继续完整展示证据、影响、建议和验证,标题行末尾追加 `` `[已接受风险]` `` 标签;不得删除条目、改列 `DOC-*` 或伪报已修复。
|
|
57
57
|
5. `strict pass` 只用于剩余 `CHK-*` / `FBK-*` 均为 0。所有剩余问题均已被有效接受,且无 blocked、无阻断型部分验证、无未接受的实质剩余风险时,结论为 `通过·已接受风险`。
|
|
58
58
|
6. blocked、阻断型部分验证和无法唯一对应当前报告范围的实质剩余风险不是 `CHK-*` / `FBK-*` 处置状态,不能借风险接受绕过;`[上线后验证]` 不属于风险接受对象。
|
|
59
|
-
7. `仅保留报告`
|
|
59
|
+
7. `仅保留报告` 表示停止处置并等待,不等于接受风险,也不授权写文件;只有带明确接受语义的用户回复才改变问题处置状态。
|
|
60
60
|
|
|
61
61
|
## 验证阶段
|
|
62
62
|
|
|
@@ -68,6 +68,10 @@
|
|
|
68
68
|
|
|
69
69
|
## 输出:统一检查报告
|
|
70
70
|
|
|
71
|
+
报告默认在对话中完整展示,不得为了缩短回复、提供链接、留存结论或同步任务状态新建 `check-report.md` 等附件,也不得用附件链接代替应展示的内容。
|
|
72
|
+
|
|
73
|
+
仅用户明确要求导出或已确认的交付约定要求文件时,由主会话保存,不得自行补写约定。Maven、auto-loop 沿用各自机器证据契约,不额外生成 Markdown。已有报告不自动删除或复制。
|
|
74
|
+
|
|
71
75
|
interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动、行为影响和结论,再展示证据与问题:
|
|
72
76
|
|
|
73
77
|
- 依据当前审查范围的最终 diff 和已读实现,覆盖 staged、unstaged、未跟踪文件及必要的子仓;复用检查时收集的材料,不额外启动 Diff Brief 流程或重复扫描。
|
|
@@ -150,6 +154,7 @@ interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动
|
|
|
150
154
|
|
|
151
155
|
展示规则:
|
|
152
156
|
|
|
157
|
+
- strict pass 且无剩余问题时可紧凑表述,保留模板顺序、画像、维度、实际验证、DOC(如有)、风险和下一步,省略空区块;不得缩减实际检查范围。有问题或已接受风险时完整展示问题字段与处置。
|
|
153
158
|
- 报告头部“工作/范围/画像/结论”和“修复批次”必须使用 `- ` 列表项,不得改为裸行或依赖行尾空格。
|
|
154
159
|
- 每个问题必须由一个四级标题承载,固定顺序为 `` #### `<ID>` `<严重度>` `<来源>` <标题> ``。仅 `已接受风险` 的问题在标题末尾追加 `` `[已接受风险]` ``;待处理不加标签。`来源` 与 `处置` 都不再单独占行。
|
|
155
160
|
- 不得改用 `- [ ]` / `- [x]` 列表项承载问题条目。终端渲染器会把松散列表压平,相邻条目会糊成一段无法分辨;只有标题这类块级元素才能稳定产生视觉分隔。修复状态由“修复结果”表格表达,不靠 checkbox。
|
|
@@ -161,7 +166,6 @@ interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动
|
|
|
161
166
|
- 存在未处置 `CHK-*` 或 `FBK-*` 时展示“修复批次”,并只在报告末尾提供一次处置选择,不再逐项提问。
|
|
162
167
|
- `修复全部` 始终覆盖全部 `CHK-*` 与 `FBK-*`;精确修复可以混合两类 ID。
|
|
163
168
|
- 风险接受可混合两类 ID;“接受当前报告全部风险”覆盖全部剩余问题,包括 P0,无固定句式。全部有效接受后才形成“通过·已接受风险”。
|
|
164
|
-
- `仅保留报告` 只表示停止处置,不改变未通过结论或剩余风险。
|
|
165
169
|
- interactive 标准报告必须以“下一步”段结束;停止等待不等于省略引导。
|
|
166
170
|
- 独立 `CHK-*` 或 `FBK-*` 不得因数量多而静默省略;先合并同根因重复项,再完整列出剩余项。
|
|
167
171
|
- 报告不得包含 commit message、拟提交/暂存文件、commit-only 决策或提交确认。
|
|
@@ -205,7 +209,7 @@ interactive 完成检查与允许的 DOC 修复后,先自然说明实际改动
|
|
|
205
209
|
<按下方 `Interactive Post-Check Stop Gate` 输出一个明确、可执行的主动作>
|
|
206
210
|
```
|
|
207
211
|
|
|
208
|
-
|
|
212
|
+
重检后按下方 `Interactive Post-Check Stop Gate` 分流;仍有未处置 `CHK-*` 或 `FBK-*` 时停留在处置/重检循环。
|
|
209
213
|
|
|
210
214
|
untracked helper 不存检查证据或风险接受。普通通过后保持 `stage=check`;direct Git 同轮继续或用户明确继续才 `advance --stage spec`。未处置 `CHK-*` / `FBK-*`、阻断型部分验证、阻塞或新编辑先 `advance --stage implement`;仅 `[上线后验证]` 不回退。
|
|
211
215
|
|
|
@@ -246,14 +250,6 @@ subagent 只返回结构化 `CHK-*`、`FBK-*`、`DOC-*` 候选、报告和 `chec
|
|
|
246
250
|
|
|
247
251
|
停止边界只控制是否自动推进,不能让报告在没有下一步提示的情况下结束。
|
|
248
252
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
- 各维度状态、问题数和问题清单;
|
|
252
|
-
- `CHK-*` 主路径问题和 `FBK-*` 兜底问题的证据、影响与验证;
|
|
253
|
-
- `DOC-*` 自动修复内容和验证;
|
|
254
|
-
- 已执行验证及结果;
|
|
255
|
-
- 未覆盖验证、`[上线后验证]` 和剩余风险;
|
|
256
|
-
- 总体结论;
|
|
257
|
-
- 与当前结论匹配的唯一主动作引导;有未处置 `CHK-*` 或 `FBK-*` 时是一次修复或风险接受选择,部分验证/阻塞时是补充决策或验证,通过时是 Phase 3.3 / Phase 3.4 指向。
|
|
253
|
+
标准报告仅包含上方统一模板定义的检查内容和本 Gate 的唯一主动作。
|
|
258
254
|
|
|
259
255
|
Check-All 不新增 direct Git 摘要或 Git 计划;这些仍由 Update-Spec 与 Push 所有。`[上线后验证]` 交给 Push 风险摘要和既有 `trellis-release` / `release.md`。
|
|
@@ -118,7 +118,9 @@ git log @{u}..HEAD --oneline 2>/dev/null || true
|
|
|
118
118
|
|
|
119
119
|
命令必须是受版本控制的稳定入口,并且本地、确定性、可重复、无外部副作用。工作目录和预期影响路径必须可审计;只有名称相似、mtime、目录邻近或惯例不足以执行。禁止任意 shell 字符串、管道、重定向、命令替换、push、release、deploy、archive、凭证和生产数据操作;证据不足时失败关闭。
|
|
120
120
|
|
|
121
|
-
`retained` 只是内部集合名。用户可见输出统一写“保留未提交的变更(dirty
|
|
121
|
+
`retained` 只是内部集合名。用户可见输出统一写“保留未提交的变更(dirty)”,按输出 reference 的阈值展示;内部始终保留 exact paths 和 Git 状态,分组摘要不得用于 pathspec 或替代校验。unknown ahead、branch/upstream 异常、归属不确定等真正需要处理的事项单独进入“风险”区;普通 retained dirty 不默认视为阻塞。
|
|
122
|
+
|
|
123
|
+
普通模式和用户 `commit-only` 的计划与校验基线默认保存在当前执行上下文。仅跨进程校验或中断恢复确需落盘时,才在 Git 忽略的 runtime 目录保存一份必要的临时 JSON;已有可复用记录时不另建副本。不得仅为缩短对话、提供链接或展示完整清单生成 `retained.md` 等清单附件,也不把临时计划写入任务产物或提交范围。auto-loop 沿用 runner 的既有持久化契约,不增加额外清单。
|
|
122
124
|
|
|
123
125
|
普通模式允许 `retained` 存在。执行前记录计划外 staged set,提交后确认这些 staged 文件仍保持原状。用户明确要求新增文件时,重新生成计划并确认,不能在执行中静默扩大范围。
|
|
124
126
|
|
|
@@ -30,9 +30,8 @@
|
|
|
30
30
|
[生成(多仓需要时显示):前置仓成功后,在 `<working-directory>` 运行 `<exact local command>`;预计只影响 <后续仓 exact files 或分组摘要>]
|
|
31
31
|
|
|
32
32
|
### 保留未提交的变更(dirty,仅数量大于 0 时显示)
|
|
33
|
-
-
|
|
34
|
-
- [
|
|
35
|
-
- [staged] <path>
|
|
33
|
+
- <按共用规则逐项展示或按仓库、目录、Git 状态汇总数量>
|
|
34
|
+
- [staged] <repository/path>(仅存在时逐项显示,兼有未暂存修改时同时标注 [unstaged])
|
|
36
35
|
|
|
37
36
|
### 风险(仅数量大于 0 时显示)
|
|
38
37
|
- <Check-All / Update-Spec 风险,或 unknown ahead / branch-upstream / attribution risk>
|
|
@@ -45,7 +44,7 @@
|
|
|
45
44
|
- **进度**:completed=<...> | partial=<...> | next=<...>
|
|
46
45
|
- **执行**:<business commit/push -> `task_progress.py write --complete` -> task-record commit -> task-record push>
|
|
47
46
|
|
|
48
|
-
确认执行请回复 `确认`。可调整:`只提交`、`修改 message
|
|
47
|
+
确认执行请回复 `确认`。可调整:`只提交`、`修改 message`、`展开文件`、`展开保留变更`。
|
|
49
48
|
```
|
|
50
49
|
|
|
51
50
|
## 共用展示规则
|
|
@@ -55,7 +54,9 @@
|
|
|
55
54
|
- 单仓 `planned` 不超过 8 个文件时完整列出。
|
|
56
55
|
- 超过 8 个时按目录归组,最多 12 行;用户要求展开时展示同一 exact set。
|
|
57
56
|
- 顶部仓库/commit/file 总数包含独立任务记录提交所在 Git root、该提交及其 exact files;任务记录文件使用相同的 8 文件展示阈值和展开规则。
|
|
58
|
-
-
|
|
57
|
+
- 计划中的保留变更按仓库计数:不超过 8 项时逐项标注 `[untracked]`、`[unstaged]`、`[staged]`;超过 8 项时将非 staged 项按目录与 Git 状态汇总数量,每仓最多 12 行,必要时合并到上级目录。同一路径计数一次,兼有 staged/unstaged 时同时标注。
|
|
58
|
+
- 计划外 staged 项始终逐项单列,不计入分组摘要;真正风险在独立“风险”区逐项展示,两者均不受行数限制。分组、展开均只改变展示,不改变 exact set 或确认范围。
|
|
59
|
+
- 用户要求“展开保留变更”时在对话中列出同一 exact set 与 Git 状态,不生成清单附件;“展开文件”仍指 planned files。
|
|
59
60
|
- 完成链证据始终显示当前状态,但不重复 Check-All 报告或 Spec review 正文;`未运行`、`已失效`、任一未处置 `CHK-*` / `FBK-*`、blocked、部分验证或 `needs-review` 同时计入风险区。已接受风险的问题也必须按 ID、严重度和影响进入风险区,但不得改标为阻断 finding。`[上线后验证]` 作为非阻断风险逐项保留动作、环境/责任边界和预期结果,不改变 Check-All 状态,并注明由既有 `trellis-release` / `release.md` 流程承接。
|
|
60
61
|
- 无活动 task、untracked 或 `commit-only` 时省略进度动作。
|
|
61
62
|
- 不重复展示检查结果、规范复核、归档或其他阶段的详细信息。
|
|
@@ -85,15 +86,13 @@
|
|
|
85
86
|
- **失败原因**:<原因和恢复动作>(仅失败时显示)
|
|
86
87
|
|
|
87
88
|
### 保留未提交的变更(dirty,仅存在时显示)
|
|
88
|
-
-
|
|
89
|
-
- [unstaged] <path>
|
|
90
|
-
- [staged] <path>
|
|
89
|
+
- <按仓库报告保留数量与实际核对结论;异常或未核验项逐项说明>
|
|
91
90
|
```
|
|
92
91
|
|
|
93
92
|
## 结果补充规则
|
|
94
93
|
|
|
95
94
|
- untracked 结果用“无任务状态”替代“任务进度”,展示 work id 与 `<已清理/保留待恢复>`;不生成或暗示 task progress commit。
|
|
96
95
|
- 部分完成时必须明确列出已成功仓库、失败仓库/步骤、当前分支和下一恢复动作。业务结果与 progress sync 状态不得合并成一个模糊结论。
|
|
97
|
-
- 普通成功结果必须确认本任务产生的当前任务目录变更 clean
|
|
96
|
+
- 普通成功结果必须确认本任务产生的当前任务目录变更 clean。其它 retained dirty 已核对保持原状时,每仓只报告数量与结论,不重复清单;计划外 staged 项仍逐项确认保留状态。异常或未核验项列出路径、实际状态和处理情况,不得笼统声称全部保持原状;用户要求展开时沿用共用规则。
|
|
98
97
|
- helper 成功但任务记录 commit 失败时,结果写“任务记录 commit 待恢复”,说明本地 `completed` 与 exact task dirty 已保留;任务记录 commit 成功但 push 失败时写“任务记录 push 待恢复”,说明 clean ahead commit 已保留。两种情况都不得暗示需要重复业务提交或 helper 写入。
|
|
99
98
|
- validated auto-loop local completion 不渲染本模板,也不得被普通结果文案描述为任务记录 push 待恢复。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"syncedAt": "2026-09-
|
|
2
|
+
"syncedAt": "2026-09-10T07:55:11.069Z",
|
|
3
3
|
"syncedFrom": "vendor/skill-garden",
|
|
4
|
-
"sourceCommit": "
|
|
4
|
+
"sourceCommit": "09ae575735b67ba0c72e988154884c97600b2f9d",
|
|
5
5
|
"common": {
|
|
6
6
|
"codexSkills": [
|
|
7
7
|
"aliyun-ops",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flower-trellis",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8-beta.0",
|
|
4
4
|
"description": "一键安装/升级 Trellis 并自动融合 skill-garden 强化包(默认 Claude + agents)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -70,9 +70,9 @@
|
|
|
70
70
|
"commit-and-tag-version": "^12.7.3"
|
|
71
71
|
},
|
|
72
72
|
"flowerReleaseNotes": {
|
|
73
|
-
"version": "0.6.
|
|
73
|
+
"version": "0.6.8-beta.0",
|
|
74
74
|
"source": "CHANGELOG.md",
|
|
75
|
-
"body": "###
|
|
75
|
+
"body": "### 🐛 修复 Bug Fixes\n\n* **check-all:** 同步报告落盘规则与规范 ([0477456](https://github.com/SilentFlower/flower-trellis/commit/04774560d8cde20b6bb6abe025bcaa0bf1bb5514))\n* **push:** 同步保留变更展示与落盘规则 ([9bcd747](https://github.com/SilentFlower/flower-trellis/commit/9bcd74761777f108be0a7286f0e253c06b0cb0ba))\n* **skills:** 迁移通用技能到共享 agents 目录 ([7ebdf05](https://github.com/SilentFlower/flower-trellis/commit/7ebdf0560ccc53ecd252f6e8b259d417d0a53d78))\n\n\n### 🧰 维护 Maintenance\n\n* **trellis:** 同步 Flower 0.6.7 与插件安装记录 ([690f1b4](https://github.com/SilentFlower/flower-trellis/commit/690f1b4e87d4bffdb02800e576acf882382de566))",
|
|
76
76
|
"truncated": false
|
|
77
77
|
},
|
|
78
78
|
"optionalDependencies": {
|
package/src/lib/skill-catalog.js
CHANGED
|
@@ -11,22 +11,21 @@ import { ENHANCEMENTS_ROOT } from "./paths.js";
|
|
|
11
11
|
const COMMON_SKILL_DIRS = [
|
|
12
12
|
{
|
|
13
13
|
source: ".common/.codex/skills",
|
|
14
|
-
target: ".
|
|
15
|
-
|
|
16
|
-
fallback: false,
|
|
14
|
+
target: ".agents/skills",
|
|
15
|
+
platformDirs: [".codex", ".agents"],
|
|
17
16
|
},
|
|
18
17
|
{
|
|
19
18
|
source: ".common/.claude/skills",
|
|
20
19
|
target: ".claude/skills",
|
|
21
|
-
|
|
22
|
-
fallback: true,
|
|
20
|
+
platformDirs: [".claude"],
|
|
23
21
|
},
|
|
24
22
|
];
|
|
25
23
|
|
|
26
24
|
const LEGACY_COMMON_SKILL_DIRS = [
|
|
27
25
|
{
|
|
28
26
|
source: ".common/.codex/skills",
|
|
29
|
-
target: ".
|
|
27
|
+
target: ".codex/skills",
|
|
28
|
+
canonicalTarget: ".agents/skills",
|
|
30
29
|
},
|
|
31
30
|
];
|
|
32
31
|
|
|
@@ -192,10 +191,10 @@ function listCommonSnapshotNames() {
|
|
|
192
191
|
/**
|
|
193
192
|
* 汇总 common skill 的 canonical 与历史目标映射。
|
|
194
193
|
*
|
|
195
|
-
* 历史 `.
|
|
196
|
-
* `.
|
|
194
|
+
* 历史 `.codex/skills` 仍用于识别和卸载;安装与更新统一迁往
|
|
195
|
+
* `.agents/skills`,避免同一技能留下双副本。
|
|
197
196
|
*
|
|
198
|
-
* @returns {Array<{source:string,target:string}>} common skill 目标映射
|
|
197
|
+
* @returns {Array<{source:string,target:string,canonicalTarget?:string}>} common skill 目标映射
|
|
199
198
|
*/
|
|
200
199
|
function allCommonSkillDirs() {
|
|
201
200
|
return [...COMMON_SKILL_DIRS, ...LEGACY_COMMON_SKILL_DIRS];
|
|
@@ -296,23 +295,28 @@ function readCommonSkillMigrationState() {
|
|
|
296
295
|
* 描述当前项目中已启用 common skill 的无写入同步输入。
|
|
297
296
|
*
|
|
298
297
|
* @param {string} target 目标项目根目录
|
|
299
|
-
* @returns {{refreshes:Array<{source:string,target:string,name:string}>,removedTargets:string[]}}
|
|
298
|
+
* @returns {{refreshes:Array<{source:string,target:string,name:string}>,removedTargets:string[]}} 快照来源与迁移或 tombstone 删除目标
|
|
300
299
|
*/
|
|
301
300
|
export function describeInstalledCommonSkillSync(target) {
|
|
302
301
|
const refreshesByTarget = new Map();
|
|
303
302
|
const currentNames = new Set(listCommonSnapshotNames());
|
|
304
303
|
const migrationState = readCommonSkillMigrationState();
|
|
304
|
+
const removedTargets = new Set();
|
|
305
305
|
for (const name of currentNames) {
|
|
306
306
|
for (const dir of allCommonSkillDirs()) {
|
|
307
307
|
const targetPath = `${dir.target}/${name}`;
|
|
308
308
|
if (!fs.existsSync(path.join(target, ...targetPath.split("/")))) continue;
|
|
309
309
|
const source = path.join(ENHANCEMENTS_ROOT, "common", dir.source, name);
|
|
310
|
-
if (!fs.existsSync(source)) continue;
|
|
311
|
-
|
|
310
|
+
if (!fs.existsSync(path.join(source, "SKILL.md"))) continue;
|
|
311
|
+
// 显式迁移声明损坏时只原地刷新,不能绕过删除保护去迁移目录。
|
|
312
|
+
const newTarget = migrationState.valid
|
|
313
|
+
? `${dir.canonicalTarget || dir.target}/${name}`
|
|
314
|
+
: targetPath;
|
|
315
|
+
refreshesByTarget.set(newTarget, { source, target: newTarget, name });
|
|
316
|
+
if (newTarget !== targetPath) removedTargets.add(targetPath);
|
|
312
317
|
}
|
|
313
318
|
}
|
|
314
319
|
const migrationSources = new Set();
|
|
315
|
-
const removedTargets = new Set();
|
|
316
320
|
for (const { from, to } of migrationState.migrations) {
|
|
317
321
|
migrationSources.add(from);
|
|
318
322
|
for (const dir of allCommonSkillDirs()) {
|
|
@@ -320,7 +324,7 @@ export function describeInstalledCommonSkillSync(target) {
|
|
|
320
324
|
if (!fs.existsSync(path.join(target, ...oldTarget.split("/")))) continue;
|
|
321
325
|
const source = path.join(ENHANCEMENTS_ROOT, "common", dir.source, to);
|
|
322
326
|
if (!fs.existsSync(path.join(source, "SKILL.md"))) continue;
|
|
323
|
-
const newTarget = `${dir.target}/${to}`;
|
|
327
|
+
const newTarget = `${dir.canonicalTarget || dir.target}/${to}`;
|
|
324
328
|
refreshesByTarget.set(newTarget, { source, target: newTarget, name: to });
|
|
325
329
|
removedTargets.add(oldTarget);
|
|
326
330
|
}
|
|
@@ -541,10 +545,10 @@ export function listSkillCatalog(target, variantOverride) {
|
|
|
541
545
|
*/
|
|
542
546
|
function activeCommonTargets(target) {
|
|
543
547
|
const active = COMMON_SKILL_DIRS.filter((dir) =>
|
|
544
|
-
fs.existsSync(path.join(target,
|
|
548
|
+
dir.platformDirs.some((platformDir) => fs.existsSync(path.join(target, platformDir))),
|
|
545
549
|
);
|
|
546
550
|
if (active.length > 0) return active;
|
|
547
|
-
return COMMON_SKILL_DIRS
|
|
551
|
+
return COMMON_SKILL_DIRS;
|
|
548
552
|
}
|
|
549
553
|
|
|
550
554
|
/**
|
|
@@ -556,12 +560,14 @@ function activeCommonTargets(target) {
|
|
|
556
560
|
*/
|
|
557
561
|
export function installCommonSkills(target, names) {
|
|
558
562
|
const available = new Set(listCommonSnapshotNames());
|
|
559
|
-
const migrations = readCommonSkillMigrationState()
|
|
563
|
+
const { valid, migrations } = readCommonSkillMigrationState();
|
|
560
564
|
const aliases = new Map(migrations.map(({ from, to }) => [from, to]));
|
|
561
565
|
const installed = new Set();
|
|
562
566
|
const processed = new Set();
|
|
563
567
|
const paths = [];
|
|
564
568
|
const skipped = [];
|
|
569
|
+
// 首个技能会创建平台目录;固定整批目标,避免后续技能因新目录而丢失默认平台。
|
|
570
|
+
const targets = activeCommonTargets(target);
|
|
565
571
|
|
|
566
572
|
for (const requestedName of names) {
|
|
567
573
|
const name = aliases.get(requestedName) || requestedName;
|
|
@@ -573,17 +579,21 @@ export function installCommonSkills(target, names) {
|
|
|
573
579
|
processed.add(name);
|
|
574
580
|
|
|
575
581
|
let installedOne = false;
|
|
576
|
-
for (const dir of
|
|
582
|
+
for (const dir of targets) {
|
|
577
583
|
const src = path.join(ENHANCEMENTS_ROOT, "common", dir.source, name);
|
|
578
|
-
if (!fs.existsSync(src)) continue;
|
|
584
|
+
if (!fs.existsSync(path.join(src, "SKILL.md"))) continue;
|
|
579
585
|
|
|
580
586
|
const dst = path.join(target, ...dir.target.split("/"), name);
|
|
581
587
|
ensureDir(path.dirname(dst));
|
|
582
588
|
copyPath(src, dst);
|
|
583
|
-
|
|
584
|
-
const
|
|
585
|
-
|
|
586
|
-
|
|
589
|
+
if (valid && fs.existsSync(path.join(dst, "SKILL.md"))) {
|
|
590
|
+
const oldNames = [name, ...migrations.filter(({ to }) => to === name).map(({ from }) => from)];
|
|
591
|
+
for (const oldDir of allCommonSkillDirs()) {
|
|
592
|
+
if ((oldDir.canonicalTarget || oldDir.target) !== dir.target) continue;
|
|
593
|
+
for (const oldName of oldNames) {
|
|
594
|
+
const oldPath = path.join(target, ...oldDir.target.split("/"), oldName);
|
|
595
|
+
if (oldPath !== dst && fs.existsSync(oldPath)) rmrf(oldPath);
|
|
596
|
+
}
|
|
587
597
|
}
|
|
588
598
|
}
|
|
589
599
|
installed.add(name);
|
|
@@ -600,8 +610,8 @@ export function installCommonSkills(target, names) {
|
|
|
600
610
|
/**
|
|
601
611
|
* 用当前随包快照同步目标仓库中已经启用的 common skill。
|
|
602
612
|
*
|
|
603
|
-
*
|
|
604
|
-
* tombstone 只删除固定 common
|
|
613
|
+
* 当前快照只刷新已启用技能,并将历史 Codex 目录迁往共享目标;
|
|
614
|
+
* 迁移和 tombstone 只删除固定 common 根中的精确目录,避免误删其它用户内容。
|
|
605
615
|
*
|
|
606
616
|
* @param {string} target 目标项目根目录
|
|
607
617
|
* @returns {{refreshed:string[],removed:string[],refreshedPaths:string[],removedPaths:string[]}} 同步结果
|