From 9443731dc43ea393c0803bdb401cd5545da25193 Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Sat, 29 Aug 2026 16:39:27 +0800 Subject: [PATCH] fix(cli): stabilize namespace sync fingerprints Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- cli/src/services/skill-fingerprint.ts | 2 +- .../unit/services/skill-fingerprint.test.ts | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cli/src/services/skill-fingerprint.ts b/cli/src/services/skill-fingerprint.ts index 2460fec3..d73bfaa6 100644 --- a/cli/src/services/skill-fingerprint.ts +++ b/cli/src/services/skill-fingerprint.ts @@ -50,5 +50,5 @@ async function listSkillFiles(root: string): Promise { } await walk(root) - return files.sort((left, right) => left.localeCompare(right)) + return files.sort() } diff --git a/cli/test/unit/services/skill-fingerprint.test.ts b/cli/test/unit/services/skill-fingerprint.test.ts index dd995533..504b2c59 100644 --- a/cli/test/unit/services/skill-fingerprint.test.ts +++ b/cli/test/unit/services/skill-fingerprint.test.ts @@ -1,3 +1,4 @@ +import { createHash } from 'node:crypto' import { mkdir, writeFile } from 'node:fs/promises' import { join } from 'node:path' import { describe, expect, test } from 'bun:test' @@ -5,6 +6,25 @@ import { createTempHome } from '../../helpers/temp-env' import { diffSkillFiles, snapshotSkillDirectory } from '../../../src/services/skill-fingerprint' describe('skill fingerprint', () => { + test('matches the server fingerprint for mixed-case package paths', async () => { + const env = await createTempHome() + const skillDir = join(env.cwd, 'mixed-case-paths') + const skillContent = '# Mixed-case paths\n' + const referenceContent = 'Reference\n' + await mkdir(join(skillDir, 'references'), { recursive: true }) + await writeFile(join(skillDir, 'SKILL.md'), skillContent) + await writeFile(join(skillDir, 'references', 'guide.md'), referenceContent) + + const skillHash = createHash('sha256').update(skillContent).digest('hex') + const referenceHash = createHash('sha256').update(referenceContent).digest('hex') + const serverFingerprint = createHash('sha256') + .update(`SKILL.md:${skillHash}\n`) + .update(`references/guide.md:${referenceHash}\n`) + .digest('hex') + + expect((await snapshotSkillDirectory(skillDir)).fingerprint).toBe(`sha256:${serverFingerprint}`) + }) + test('ignores SkillHub metadata and reports changed files', async () => { const env = await createTempHome() const skillDir = join(env.cwd, 'demo')