From 2064fdf014d4cf57f3327c2454f4fb395126a766 Mon Sep 17 00:00:00 2001 From: sunlei Date: Tue, 16 Jun 2026 01:09:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DAPI=E5=8F=91=E5=B8=83C?= =?UTF-8?q?I=E9=98=BB=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/qqbot-plugin/cli.ts | 3 +- .../modules/qqbot/plugin-platform/cli.spec.ts | 34 +++++++++++++++++++ .../bangdream/search/fuzzy-search.spec.ts | 10 ++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/scripts/qqbot-plugin/cli.ts b/scripts/qqbot-plugin/cli.ts index ae60d1e..2114d00 100644 --- a/scripts/qqbot-plugin/cli.ts +++ b/scripts/qqbot-plugin/cli.ts @@ -119,7 +119,8 @@ const getControlledRoots = (options: Required) => { if (fs.existsSync(path.join(cwd, 'package.json'))) { const workspaceRoot = findWorkspaceRoot(cwd); - if (workspaceRoot) roots.push(path.join(workspaceRoot, '.kt-workspace')); + const artifactRoot = workspaceRoot || path.resolve(cwd, '..', '..'); + roots.push(path.join(artifactRoot, '.kt-workspace')); } return roots; diff --git a/test/modules/qqbot/plugin-platform/cli.spec.ts b/test/modules/qqbot/plugin-platform/cli.spec.ts index 115bc68..2ae97e6 100644 --- a/test/modules/qqbot/plugin-platform/cli.spec.ts +++ b/test/modules/qqbot/plugin-platform/cli.spec.ts @@ -151,6 +151,40 @@ describe('QQBot plugin CLI', () => { expect(path.dirname(packed.packagePath || '')).toBe(packageRoot); }); + it('allows Jenkins single-repo checkout artifact roots without root AGENTS.md', async () => { + const ciProjectRoot = path.join( + sandbox, + 'agent', + 'workspace', + 'KT-Template_KT-Template-API_main', + ); + fs.mkdirSync(ciProjectRoot, { recursive: true }); + fs.writeFileSync( + path.join(ciProjectRoot, 'package.json'), + JSON.stringify({ name: 'kt-template-online-api' }), + ); + + const pluginRoot = path.resolve( + ciProjectRoot, + '..', + '..', + '.kt-workspace', + 'tmp', + 'smoke-plugin', + ); + const created = await runQqbotPluginCli( + ['create', 'smoke-plugin', '--out', pluginRoot], + silentCliOptions(ciProjectRoot), + ); + + expect(created).toMatchObject({ + command: 'create', + exitCode: 0, + pluginRoot, + }); + expect(fs.existsSync(path.join(pluginRoot, 'plugin.json'))).toBe(true); + }); + it('rejects unsafe create output paths before writing files', async () => { const outsideRoot = path.resolve(sandbox, '..', 'outside-plugin'); diff --git a/test/qqbot/plugins/bangdream/search/fuzzy-search.spec.ts b/test/qqbot/plugins/bangdream/search/fuzzy-search.spec.ts index d08128b..a0db79a 100644 --- a/test/qqbot/plugins/bangdream/search/fuzzy-search.spec.ts +++ b/test/qqbot/plugins/bangdream/search/fuzzy-search.spec.ts @@ -1,3 +1,5 @@ +import * as fs from 'fs'; + import { checkRelationList, fuzzySearch, @@ -9,6 +11,14 @@ import { } from '@/modules/qqbot/plugins/bangdream/src/domain/search/fuzzy-search-rule.registry'; import type { FuzzySearchResult } from '@/modules/qqbot/plugins/bangdream/src/domain/search/fuzzy-search.types'; import { createBangDreamEntityMatcher } from '@/modules/qqbot/plugins/bangdream/src/domain/search/entity-list-matcher'; +import { configureBangDreamRuntimeIo } from '@/modules/qqbot/plugins/bangdream/src/infrastructure/integration/runtime-io'; + +beforeAll(() => { + configureBangDreamRuntimeIo({ + readJsonFileSync: (filePath) => + JSON.parse(fs.readFileSync(filePath, 'utf8')), + }); +}); describe('BangDream fuzzy search helpers', () => { it('parses number, level, relation and quoted fallback keywords', () => {