Files
memind/chat-skills.test.mjs
john e45c9300bf feat: LLM intent router, direct chat execution, and Memory V2 light intervention
Wire chat intent routing with direct_chat on regular sessions, skill-selected
short-circuit to Agent, memory light/heavy intervention tiers, and fix direct
chat UI stuck streaming after completion.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 22:32:57 +08:00

82 lines
3.7 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
buildAutoChatSkillPrefix,
buildChatSkillPrompt,
CHAT_SKILL_DEFINITIONS,
filterChatSkills,
} from './chat-skills.mjs';
test('filterChatSkills shows summarize and analyze without granted skills', () => {
const visible = filterChatSkills(CHAT_SKILL_DEFINITIONS, { canPublish: false });
assert.ok(visible.some((item) => item.id === 'summarize'));
assert.ok(visible.some((item) => item.id === 'analyze'));
assert.equal(visible.some((item) => item.id === 'generate-page'), false);
});
test('filterChatSkills gates platform skills by grantedSkills', () => {
const visible = filterChatSkills(CHAT_SKILL_DEFINITIONS, {
canPublish: false,
grantedSkills: ['web', 'search'],
});
assert.ok(visible.some((item) => item.id === 'web-search'));
assert.ok(visible.some((item) => item.id === 'code-search'));
assert.equal(visible.some((item) => item.id === 'form-collect'), false);
assert.equal(visible.some((item) => item.id === 'service-integration-smoke'), false);
assert.equal(visible.some((item) => item.id === 'product-campaign-page'), false);
});
test('filterChatSkills shows product campaign page when granted', () => {
const visible = filterChatSkills(CHAT_SKILL_DEFINITIONS, {
canPublish: false,
grantedSkills: ['product-campaign-page'],
});
assert.ok(visible.some((item) => item.id === 'product-campaign-page'));
});
test('filterChatSkills shows service integration smoke when granted', () => {
const visible = filterChatSkills(CHAT_SKILL_DEFINITIONS, {
canPublish: false,
grantedSkills: ['service-integration-smoke'],
});
assert.ok(visible.some((item) => item.id === 'service-integration-smoke'));
});
test('filterChatSkills shows generate-page when publish is allowed', () => {
const visible = filterChatSkills(CHAT_SKILL_DEFINITIONS, { canPublish: true });
assert.ok(visible.some((item) => item.id === 'generate-page'));
});
test('buildChatSkillPrompt includes skill name for platform skills', () => {
assert.match(buildChatSkillPrompt('web', 'web'), /请使用 web 技能/);
assert.match(buildChatSkillPrompt('service-integration-smoke'), /标准联调流程/);
assert.match(buildChatSkillPrompt('product-campaign-page'), /商品宣传 \/ 活动页/);
assert.match(buildChatSkillPrompt('generate-page'), /static-page-publish/);
assert.match(buildChatSkillPrompt('generate-page'), /docx-generate/);
assert.match(buildChatSkillPrompt('generate-page'), /public\/\*\.docx/);
assert.match(buildChatSkillPrompt('generate-page'), /long-image-download/);
assert.match(buildChatSkillPrompt('generate-page'), /generate_long_image/);
});
test('prefillOnly is set for open-ended chat skills', () => {
assert.equal(CHAT_SKILL_DEFINITIONS.find((item) => item.id === 'web-search')?.prefillOnly, true);
assert.equal(CHAT_SKILL_DEFINITIONS.find((item) => item.id === 'generate-page')?.prefillOnly, undefined);
});
test('buildAutoChatSkillPrefix enables web for news-like queries', () => {
assert.match(
buildAutoChatSkillPrefix('帮我搜索今天热点新闻', ['web', 'search']),
/先搜索今天\/最新相关的新闻与热点/,
);
assert.equal(buildAutoChatSkillPrefix('帮我总结一下这段话', ['web', 'search']), '');
assert.equal(buildAutoChatSkillPrefix('帮我搜索今天热点新闻', ['search']), '');
});
test('buildAutoChatSkillPrefix enables publish for page generation requests', () => {
const prefix = buildAutoChatSkillPrefix('帮我做一个 Hello 糖的 H5 页面', ['static-page-publish']);
assert.match(prefix, /static-page-publish/);
assert.match(prefix, /write_file\/edit_file/);
assert.match(prefix, /禁止只给本地路径/);
assert.equal(buildAutoChatSkillPrefix('帮我做一个 Hello 糖的 H5 页面', []), '');
});