Repository navigation
feat: 新增 step-context-archive 插件(上下文归档与召回,声明式) - #1
Conversation
补充:一个影响本仓库全部声明式插件的上游限制(已实测确认)在做 结论当前 Step Code(v0.1.1)不会加载已安装插件的 实测证据(本地 TUI,非推测)
源码侧的对应证据(Step-Code,2026-09-24 快照)
因此
我这边的自查本插件的功能层其实走的是扩展形态(TypeScript 扩展 + (本轮验证全部为本地命令与源码阅读,未产生模型调用。) |
|
补充一条后续修正:本插件在自有仓库的许可署名已本地化。 原先参考实现仓库的
本 PR 提交的声明式内容仍按本仓库 MIT 授权,与上述改动无关。 |
|
已同步上游 main(当时落后 50 个提交),并修好合并冲突,本 PR 现在可以干净合入了。合并过程中发现一个上游 main 自身的问题,同步给你: 同步结果
一个需要你修的问题:
|
|
@uos1231234 感谢这份高质量的社区贡献——PR #1 已合并进 main(merge commit c039372),插件本体几乎原样合入。评审结论:声明式形态合规、无安全风险(只写默认目录、不覆盖、召回只读、零依赖零网络)、诚实标注未完成项。 合并时与合并后的维护调整,同步给你:
另外三件事:
SCA-100-4 完成后随时可以走 v1.0.0 发布流程(roadmap/README 回填 → 自举 CHANGELOG → 打 step-context-archive-v1.0.0 标签 → 发布说明定稿)。欢迎继续贡献! |
|
@Neriah-Ado 更新 项目 1|Atlas Sync 长程任务(deepswe-eval 项目 2|Effect HttpApi SSE(deepswe-eval 过程中踩到一个可能对后续所有扩展作者都有用的点,如实同步给你: 想请你判断:按 §3.4「版本全部任务 done 才更新 |
|
@Neriah-Ado 一次性把 1. 许可表述更正上一条我写「这段代码在我们自己的仓库(MIT)」——发出时属实。此后我方 2. 补 acceptance 第三条
顺带一个与 3. 全量逐条对照项目:effect-sse-httpapi-streaming(Effect-TS/effect 的一部分,2240 文件 TypeScript monorepo),本轮数据全部由脚本从磁盘重算,未复用先前结论。 全量对比清单(SCA-100-4 逐条核对)
展开全量 165 条逐条对照(索引字节 / 磁盘字节 / 首行哈希 / 原文首行)
4. 校验脚本上面每一行都能用这份脚本在你的任一项目上独立复算。无第三方依赖,Node 18+: // 校验 .stepcode/context-archive 的 INDEX.md 索引与磁盘文件是否成对一致。
// 用法:node verify-archive.mjs [项目根目录] (默认当前目录)
import { readFileSync, readdirSync } from "node:fs";
import { createHash } from "node:crypto";
import path from "node:path";
const ARCH = path.resolve(process.argv[2] ?? ".", ".stepcode/context-archive");
const rows = readFileSync(path.join(ARCH, "INDEX.md"), "utf8")
.split(/\r?\n/)
.filter((l) => l.startsWith("| `"))
.map((l) => {
const p = l.replace(/^\|\s*/, "").replace(/\s*\|\s*$/, "").split(" | ");
return {
stamp: p[0].replace(/`/g, ""),
file: path.basename(p[1].replace(/`/g, "")),
bytes: +p[2],
preview: p.slice(3).join(" | ").trim(),
};
});
const disk = new Set(
readdirSync(ARCH).filter((f) => /^stamp-[0-9a-f]+\.md$/.test(f))
);
let missing = 0, byteBad = 0, firstLineBad = 0, total = 0;
const parts = [];
for (const r of rows) {
if (!disk.has(r.file)) { missing++; continue; }
const buf = readFileSync(path.join(ARCH, r.file));
const firstLine = buf.toString("utf8").split(/\r?\n/)[0];
total += buf.length;
if (buf.length !== r.bytes) byteBad++;
if (!firstLine.trimStart().startsWith(r.preview)) firstLineBad++;
const h16 = createHash("sha256").update(firstLine).digest("hex").slice(0, 16);
parts.push(`${r.stamp}:${buf.length}:${h16}`);
}
const orphan = [...disk].filter((f) => !rows.some((r) => r.file === f));
console.log({
indexRows: rows.length,
stampFiles: disk.size,
missingFromDisk: missing,
orphanOnDisk: orphan.length,
byteMismatch: byteBad,
firstLineMismatch: firstLineBad,
totalBytes: total,
});
console.log(
"manifest sha256:",
createHash("sha256").update(parts.join("\n")).digest("hex")
);在本项目上运行的实际输出: 5. 两个项目的触发方式不同(这点需要说清楚)
必须说明的差异:压缩接管来自我方那个独立的 TypeScript 扩展(自动触发、有界投影、算法去重),本仓库里这份声明式插件没有这个能力—— 换句话说:这份数据验证的是归档协议与产物格式的正确性(索引成对、路径可解析、原文未被摘要污染、召回不凭记忆),不是「宿主已能加载并运行本插件」——后者受宿主装载通道限制,与本插件质量无关。这一点我不含糊过去。 6. 请求
|
|
@Neriah-Ado 想请你帮个忙,不方便直接说就好。 我在给官方 Step Code 修一个 bug:插件清单里内联声明的 stdio MCP server 拿不到工作目录,相对 代码和测试都做好了,但官方仓库现在限制只有协作者能提 PR。我已经在他们 #204 下面留了完整 patch 和 想问你:知不知道联系官方的途径? 不需要担保或背书,多问一条路而已;觉得不方便完全没关系。 |
|
@uos1231234 SCA-100-4 的数据我们完整核了一遍,结论:按 §3.4 置 done,v1.0.0 已发布。分四部分回复。 1. SCA-100-4 审查结论与 v1.0.0 发布
另外,你 10/1 的审计修复提交(五个真缺陷)我们读了。其中两条对所有扩展作者都有用:turn_end 不再调 ctx.compact(宿主 2. 两个宿主问题:上游均已修复
对本仓库的影响已核实:6 个 MCP 插件的清单逐个查过,全是 3. 向官方仓提交代码的要求(AI 提交同样适用)你想继续给官方提代码,这些是 stepfun-ai/Step-Code 仓库规范( 四条铁律:
PR 前门禁: Issue 纪律(对你尤其重要):官方仓禁止批量 / 自动化开 issue,账号会被永久封禁;必须用 issue 模板、短而具体。你目前「一条线程 + 完整 patch + compare 链接」的密度正处在纪律允许的一侧,保持即可。 4. 联系官方的途径如实回答:我们没有什么官方特殊渠道可给。但你实际上已经走通了——#204 里维护者次日凌晨回应、采纳你的方案、修复合入 main 并公开致谢。在「PR 仅限协作者」的限制下(你实测的 CreatePullRequest 被拒与我们看到的现象一致),issue 评论附完整 patch + compare 链接就是当前有效通道,你的 #204 已经是成功案例。若后续要开新线程,沿用同一密度:一条线程一个问题、可复现证据齐全、不并行多开。 v1.0.0 之后 roadmap 上已无待办项,欢迎继续以任何形态贡献——声明式新插件、扩展实现,或继续给上游找 bug(看起来你很擅长后者)。 |
|
@Neriah-Ado 谢谢! 最受益的一点是:你把我那条「②是手工执行、验证的是协议不是宿主装载通道」的备注原样留在 「发出去之后主动复核并纠错,比一次说对更让人放心」这句我也收下了。 给上游找 bug 不敢当。我更愿意如实说:我只是习惯把每条发现都做成能复现的最小实验,能被复现的才算数。后面还会继续。 |
这个 PR 做什么
新增一个声明式插件
step-context-archive:长会话的上下文归档与召回。/archive—— 把已完成任务块的原文写入.stepcode/context-archive/stamp-<id>.md,对话中只保留一行带三点摘要(目标 / 关键决策 / 是否完成)的#STAMP索引,并在结尾明确汇报各任务是否完成;/recall <stamp>—— 按索引取回原文并基于原文回答(摘要只作导航,可能失真);skills/context-archive——#STAMP语义、三点摘要协议、召回纪律、适用与不适用边界。要解决的问题:长会话里早期任务的大段细节(报错堆栈、命令输出、被改动的完整代码)持续占用窗口,
但当下用不到、将来可能要引用。本插件把它们移出对话、留下可检索的索引,需要时再取回。
遵循本仓库规范
step.plugin.json+commands/+skills/),不含entry/hooks/lspServers(符合 C1 / C2);plugins/step-context-archive/plugin.yaml为该插件唯一事实源,任务 ID 前缀SCA-;.step-plugin/marketplace.json与roadmap.json,并更新根 README 索引表;验证
待完成 / 请维护者裁量
SCA-100-4(真实项目验证 ≥2 个非玩具仓库)尚未完成,因此status定为in-progress、未标done;或希望把它从 roadmap 的 12 项计划中单列,请直接改,我这边配合;
许可
uos1231234/step-context-archive,
采用其自身许可 agent-shell License v1.0
—— 并非 MIT(源自 PolyForm Small Business License 1.0.0,另加商用条款)。
不在本 PR 范围内、也未复制任何代码进来。
Note
2026-10-01 更正 —— 本节原表述已作废,请以本块为准。
原第 1 条写「本 PR 提交的内容按本仓库 MIT 授权」。已不成立:
本仓库根
LICENSE现在是 AGPL-3.0-only(根 README「## License」节亦已标 AGPL-3.0-only),本 PR 提交的清单 / 命令文本 / 技能提示词随仓库一并按 AGPL-3.0-only 提供。
原第 2 条写「参考实现采用其自身许可 agent-shell License v1.0(源自 PolyForm Small Business
License 1.0.0,另加商用条款)」——这一条是张冠李戴,现予撤回:
agent-shell是另一个项目(
uos1231234/agent-shell),不是本插件的参考实现,它的许可与本插件无关;本 PR 也不含其任何代码。
本插件自己的代码仓库是
uos1231234/step-context-archive,其许可历史为:自 v0.6.0 起 AGPL-3.0-only(与本仓库集合许可对齐),
≤ v0.5.2 为 MIT(著作权人后续另行许可,不构成追溯冲突)。
更早那条以「agent-shell License v1.0」描述本插件的记录(同 PR 合并后被写进
plugins/step-context-archive/plugin.yaml的 changelog)同样作废,以本块为准。