Merge pull request #783 from popododo0720/fix/ulw-boundary-and-skill-mcp-args
fix: ulw keyword word boundary and skill_mcp parseArguments object handling
This commit is contained in:
commit
caf50fc4c9
@ -192,7 +192,7 @@ THE USER ASKED FOR X. DELIVER EXACTLY X. NOT A SUBSET. NOT A DEMO. NOT A STARTIN
|
|||||||
|
|
||||||
export const KEYWORD_DETECTORS: Array<{ pattern: RegExp; message: string | ((agentName?: string) => string) }> = [
|
export const KEYWORD_DETECTORS: Array<{ pattern: RegExp; message: string | ((agentName?: string) => string) }> = [
|
||||||
{
|
{
|
||||||
pattern: /(ultrawork|ulw)/i,
|
pattern: /\b(ultrawork|ulw)\b/i,
|
||||||
message: getUltraworkMessage,
|
message: getUltraworkMessage,
|
||||||
},
|
},
|
||||||
// SEARCH: EN/KO/JP/CN/VN
|
// SEARCH: EN/KO/JP/CN/VN
|
||||||
|
|||||||
@ -93,16 +93,18 @@ describe("keyword-detector registers to ContextCollector", () => {
|
|||||||
|
|
||||||
describe("keyword-detector session filtering", () => {
|
describe("keyword-detector session filtering", () => {
|
||||||
let logCalls: Array<{ msg: string; data?: unknown }>
|
let logCalls: Array<{ msg: string; data?: unknown }>
|
||||||
|
let logSpy: ReturnType<typeof spyOn>
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
setMainSession(undefined)
|
setMainSession(undefined)
|
||||||
logCalls = []
|
logCalls = []
|
||||||
spyOn(sharedModule, "log").mockImplementation((msg: string, data?: unknown) => {
|
logSpy = spyOn(sharedModule, "log").mockImplementation((msg: string, data?: unknown) => {
|
||||||
logCalls.push({ msg, data })
|
logCalls.push({ msg, data })
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
logSpy?.mockRestore()
|
||||||
setMainSession(undefined)
|
setMainSession(undefined)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -233,3 +235,100 @@ describe("keyword-detector session filtering", () => {
|
|||||||
expect(toastCalls).toContain("Ultrawork Mode Activated")
|
expect(toastCalls).toContain("Ultrawork Mode Activated")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("keyword-detector word boundary", () => {
|
||||||
|
let logCalls: Array<{ msg: string; data?: unknown }>
|
||||||
|
let logSpy: ReturnType<typeof spyOn>
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
setMainSession(undefined)
|
||||||
|
logCalls = []
|
||||||
|
logSpy = spyOn(sharedModule, "log").mockImplementation((msg: string, data?: unknown) => {
|
||||||
|
logCalls.push({ msg, data })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
logSpy?.mockRestore()
|
||||||
|
setMainSession(undefined)
|
||||||
|
})
|
||||||
|
|
||||||
|
function createMockPluginInput(options: { toastCalls?: string[] } = {}) {
|
||||||
|
const toastCalls = options.toastCalls ?? []
|
||||||
|
return {
|
||||||
|
client: {
|
||||||
|
tui: {
|
||||||
|
showToast: async (opts: any) => {
|
||||||
|
toastCalls.push(opts.body.title)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as any
|
||||||
|
}
|
||||||
|
|
||||||
|
test("should NOT trigger ultrawork on partial matches like 'StatefulWidget' containing 'ulw'", async () => {
|
||||||
|
// #given - text contains 'ulw' as part of another word (StatefulWidget)
|
||||||
|
setMainSession(undefined)
|
||||||
|
|
||||||
|
const toastCalls: string[] = []
|
||||||
|
const hook = createKeywordDetectorHook(createMockPluginInput({ toastCalls }))
|
||||||
|
const output = {
|
||||||
|
message: {} as Record<string, unknown>,
|
||||||
|
parts: [{ type: "text", text: "refactor the StatefulWidget component" }],
|
||||||
|
}
|
||||||
|
|
||||||
|
// #when - message with partial 'ulw' match is processed
|
||||||
|
await hook["chat.message"](
|
||||||
|
{ sessionID: "any-session" },
|
||||||
|
output
|
||||||
|
)
|
||||||
|
|
||||||
|
// #then - ultrawork should NOT be triggered
|
||||||
|
expect(output.message.variant).toBeUndefined()
|
||||||
|
expect(toastCalls).not.toContain("Ultrawork Mode Activated")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should trigger ultrawork on standalone 'ulw' keyword", async () => {
|
||||||
|
// #given - text contains standalone 'ulw'
|
||||||
|
setMainSession(undefined)
|
||||||
|
|
||||||
|
const toastCalls: string[] = []
|
||||||
|
const hook = createKeywordDetectorHook(createMockPluginInput({ toastCalls }))
|
||||||
|
const output = {
|
||||||
|
message: {} as Record<string, unknown>,
|
||||||
|
parts: [{ type: "text", text: "ulw do this task" }],
|
||||||
|
}
|
||||||
|
|
||||||
|
// #when - message with standalone 'ulw' is processed
|
||||||
|
await hook["chat.message"](
|
||||||
|
{ sessionID: "any-session" },
|
||||||
|
output
|
||||||
|
)
|
||||||
|
|
||||||
|
// #then - ultrawork should be triggered
|
||||||
|
expect(output.message.variant).toBe("max")
|
||||||
|
expect(toastCalls).toContain("Ultrawork Mode Activated")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should NOT trigger ultrawork on file references containing 'ulw' substring", async () => {
|
||||||
|
// #given - file reference contains 'ulw' as substring
|
||||||
|
setMainSession(undefined)
|
||||||
|
|
||||||
|
const toastCalls: string[] = []
|
||||||
|
const hook = createKeywordDetectorHook(createMockPluginInput({ toastCalls }))
|
||||||
|
const output = {
|
||||||
|
message: {} as Record<string, unknown>,
|
||||||
|
parts: [{ type: "text", text: "@StatefulWidget.tsx please review this file" }],
|
||||||
|
}
|
||||||
|
|
||||||
|
// #when - message referencing file with 'ulw' substring is processed
|
||||||
|
await hook["chat.message"](
|
||||||
|
{ sessionID: "any-session" },
|
||||||
|
output
|
||||||
|
)
|
||||||
|
|
||||||
|
// #then - ultrawork should NOT be triggered
|
||||||
|
expect(output.message.variant).toBeUndefined()
|
||||||
|
expect(toastCalls).not.toContain("Ultrawork Mode Activated")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user