* fix(db): remove unique constraint on folder to support multi-channel agents * ci: implement automated skill drift detection and self-healing PRs * fix: align registration logic with Gavriel's feedback and fix build/test issues from Daniel Mi * style: conform to prettier standards for CI validation * test: fix branch naming inconsistency in CI (master vs main) * fix(ci): robust module resolution by removing file extensions in scripts * refactor(ci): simplify skill validation by removing redundant combination tests * style: conform skills-engine to prettier, unify logging in index.ts and cleanup unused imports * refactor: extract multi-channel DB changes to separate branch Move channel column, folder suffix logic, and related migrations to feat/multi-channel-db-v2 for independent review. This PR now contains only CI/CD optimizations, Prettier formatting, and logging improvements. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import path from 'path';
|
|
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
isValidGroupFolder,
|
|
resolveGroupFolderPath,
|
|
resolveGroupIpcPath,
|
|
} from './group-folder.js';
|
|
|
|
describe('group folder validation', () => {
|
|
it('accepts normal group folder names', () => {
|
|
expect(isValidGroupFolder('main')).toBe(true);
|
|
expect(isValidGroupFolder('family-chat')).toBe(true);
|
|
expect(isValidGroupFolder('Team_42')).toBe(true);
|
|
});
|
|
|
|
it('rejects traversal and reserved names', () => {
|
|
expect(isValidGroupFolder('../../etc')).toBe(false);
|
|
expect(isValidGroupFolder('/tmp')).toBe(false);
|
|
expect(isValidGroupFolder('global')).toBe(false);
|
|
expect(isValidGroupFolder('')).toBe(false);
|
|
});
|
|
|
|
it('resolves safe paths under groups directory', () => {
|
|
const resolved = resolveGroupFolderPath('family-chat');
|
|
expect(resolved.endsWith(`${path.sep}groups${path.sep}family-chat`)).toBe(
|
|
true,
|
|
);
|
|
});
|
|
|
|
it('resolves safe paths under data ipc directory', () => {
|
|
const resolved = resolveGroupIpcPath('family-chat');
|
|
expect(
|
|
resolved.endsWith(`${path.sep}data${path.sep}ipc${path.sep}family-chat`),
|
|
).toBe(true);
|
|
});
|
|
|
|
it('throws for unsafe folder names', () => {
|
|
expect(() => resolveGroupFolderPath('../../etc')).toThrow();
|
|
expect(() => resolveGroupIpcPath('/tmp')).toThrow();
|
|
});
|
|
});
|