test(skills): add regression test for global-value restore on skill release

Covers the P1 scenario: session A holds SHARED_KEY via global env,
session B overrides it with a per-skill value. After B reverts,
process.env.SHARED_KEY must revert to 'global-value' (not remain as
the skill value). After A reverts, the key must be cleaned up entirely.
This commit is contained in:
yangyitao 2026-03-13 15:14:38 +00:00 committed by 杨艺韬(yangyitao)
parent 051eb7b8d0
commit fe655febf6

View File

@ -187,6 +187,40 @@ describe("skills global env", () => {
expect(process.env["SHARED_KEY"]).toBeUndefined();
});
it("restores global value after last skill override releases (concurrent sessions)", () => {
// Session A: holds SHARED_KEY via global env only.
const configA = makeConfig({
skills: { env: { SHARED_KEY: "global-value" } },
});
const revertA = applySkillEnvOverrides({
skills: [makeSkillEntry("skill-a")],
config: configA,
});
expect(process.env["SHARED_KEY"]).toBe("global-value");
// Session B: overrides SHARED_KEY with a per-skill value.
const configB = makeConfig({
skills: {
env: { SHARED_KEY: "global-value" },
entries: { "skill-b": { env: { SHARED_KEY: "skill-b-value" } } },
},
});
const revertB = applySkillEnvOverrides({
skills: [makeSkillEntry("skill-b")],
config: configB,
});
expect(process.env["SHARED_KEY"]).toBe("skill-b-value");
// B reverts: A still holds a global reference, so the key must revert to
// "global-value" rather than staying as "skill-b-value".
revertB();
expect(process.env["SHARED_KEY"]).toBe("global-value");
// A reverts: no more owners, key must be cleaned up entirely.
revertA();
expect(process.env["SHARED_KEY"]).toBeUndefined();
});
it("applySkillEnvOverridesFromSnapshot injects global env for a skill with no entries config", () => {
const config = makeConfig({
skills: {