From c61d3d5418aeb486a4810c7992b904f22e7be56b Mon Sep 17 00:00:00 2001 From: MarkXian Date: Tue, 28 Jul 2026 11:24:10 +0800 Subject: [PATCH] fix(kaos): match globstar zero directories --- .changeset/globstar-zero-directories.md | 5 +++++ packages/kaos/src/internal.ts | 5 +++++ packages/kaos/test/internal.test.ts | 11 ++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .changeset/globstar-zero-directories.md diff --git a/.changeset/globstar-zero-directories.md b/.changeset/globstar-zero-directories.md new file mode 100644 index 0000000000..5807cf61ee --- /dev/null +++ b/.changeset/globstar-zero-directories.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Fix glob patterns with `**/` so they also match files in the starting directory. diff --git a/packages/kaos/src/internal.ts b/packages/kaos/src/internal.ts index 6c89acf27e..f0bcbfdf0b 100644 --- a/packages/kaos/src/internal.ts +++ b/packages/kaos/src/internal.ts @@ -190,6 +190,11 @@ export function globPatternToRegex(pattern: string, caseSensitive: boolean): Reg if (ch === undefined) break; switch (ch) { case '*': + if (pattern[i + 1] === '*' && pattern[i + 2] === '/') { + regex += '(?:[^/]+/)*'; + i += 2; + break; + } regex += '[^/]*'; break; case '?': diff --git a/packages/kaos/test/internal.test.ts b/packages/kaos/test/internal.test.ts index f38d3107cb..46913a7144 100644 --- a/packages/kaos/test/internal.test.ts +++ b/packages/kaos/test/internal.test.ts @@ -264,7 +264,7 @@ describe('globPatternToRegex', () => { expect(regex.test('.config')).toBe(true); }); - it.skip('Python treats **/foo.txt as recursive; current helper is segment-based and does not implement zero-or-more directories', () => { + it('treats **/foo.txt as recursive with zero-or-more directories', () => { const regex = globPatternToRegex('**/foo.txt', true); expect(regex.test('foo.txt')).toBe(true); @@ -272,6 +272,15 @@ describe('globPatternToRegex', () => { expect(regex.test('a/b/foo.txt')).toBe(true); }); + it('treats middle ** segments as zero-or-more directories', () => { + const regex = globPatternToRegex('root/**/foo.txt', true); + + expect(regex.test('root/foo.txt')).toBe(true); + expect(regex.test('root/a/foo.txt')).toBe(true); + expect(regex.test('root/a/b/foo.txt')).toBe(true); + expect(regex.test('other/a/foo.txt')).toBe(false); + }); + it('keeps single-star matching to a single path segment', () => { const regex = globPatternToRegex('*/foo.txt', true);