fix(ci): resolve regex complexity lint error and Windows path test failure
- Simplify LAUNCH_RE by pre-stripping optional (resume) prefix to bring regex complexity from 23 to within the allowed 20 - Use RegExp.exec() instead of String.match() per lint rules - Use path.normalize() in BranchStatusService tests for cross-platform compatibility (fixes \repo vs /repo on Windows)
This commit is contained in:
parent
16238276fb
commit
388a24d715
2 changed files with 22 additions and 17 deletions
|
|
@ -20,9 +20,9 @@ export interface ParsedSessionTitle {
|
||||||
const PROVISION_RE =
|
const PROVISION_RE =
|
||||||
/^agent_teams_ui\s+\[Agent Team:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Project:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Lead:\s*["\u201C]([^"\u201D]+)["\u201D]\]/;
|
/^agent_teams_ui\s+\[Agent Team:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Project:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Lead:\s*["\u201C]([^"\u201D]+)["\u201D]\]/;
|
||||||
|
|
||||||
// Matches: Team Start [Agent Team: ...] or Team Start (resume) [Agent Team: ...]
|
// Matches: Team Start [Agent Team: ...] (after stripping optional "(resume)" prefix)
|
||||||
const LAUNCH_RE =
|
const LAUNCH_RE =
|
||||||
/^Team Start(?:\s*\(resume\))?\s+\[Agent Team:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Project:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Lead:\s*["\u201C]([^"\u201D]+)["\u201D]\]/;
|
/^Team Start\s+\[Agent Team:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Project:\s*["\u201C]([^"\u201D]+)["\u201D]\s*\|\s*Lead:\s*["\u201C]([^"\u201D]+)["\u201D]\]/;
|
||||||
|
|
||||||
// Matches one or more [Image #N] prefixes
|
// Matches one or more [Image #N] prefixes
|
||||||
const IMAGE_PREFIX_RE = /^(?:\[Image\s+#\d+\]\s*)+/;
|
const IMAGE_PREFIX_RE = /^(?:\[Image\s+#\d+\]\s*)+/;
|
||||||
|
|
@ -33,7 +33,7 @@ export function parseSessionTitle(firstMessage: string | undefined): ParsedSessi
|
||||||
}
|
}
|
||||||
|
|
||||||
// New team provisioning: agent_teams_ui [Agent Team: ...]
|
// New team provisioning: agent_teams_ui [Agent Team: ...]
|
||||||
const provisionMatch = firstMessage.match(PROVISION_RE);
|
const provisionMatch = PROVISION_RE.exec(firstMessage);
|
||||||
if (provisionMatch) {
|
if (provisionMatch) {
|
||||||
return {
|
return {
|
||||||
kind: 'team-new',
|
kind: 'team-new',
|
||||||
|
|
@ -43,8 +43,9 @@ export function parseSessionTitle(firstMessage: string | undefined): ParsedSessi
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Team resume/launch: Team Start [Agent Team: ...]
|
// Team resume/launch: Team Start [Agent Team: ...] or Team Start (resume) [...]
|
||||||
const launchMatch = firstMessage.match(LAUNCH_RE);
|
const launchMsg = firstMessage.replace(/^(Team Start)\s*\(resume\)/, '$1');
|
||||||
|
const launchMatch = LAUNCH_RE.exec(launchMsg);
|
||||||
if (launchMatch) {
|
if (launchMatch) {
|
||||||
return {
|
return {
|
||||||
kind: 'team-resume',
|
kind: 'team-resume',
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,13 @@
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
|
||||||
import { BranchStatusService } from '@main/services/team/BranchStatusService';
|
import { BranchStatusService } from '@main/services/team/BranchStatusService';
|
||||||
|
|
||||||
import type { ProjectBranchChangeEvent } from '@shared/types';
|
import type { ProjectBranchChangeEvent } from '@shared/types';
|
||||||
|
|
||||||
|
const REPO = path.normalize('/repo');
|
||||||
|
|
||||||
interface Deferred<T> {
|
interface Deferred<T> {
|
||||||
promise: Promise<T>;
|
promise: Promise<T>;
|
||||||
resolve: (value: T) => void;
|
resolve: (value: T) => void;
|
||||||
|
|
@ -33,16 +37,16 @@ describe('BranchStatusService', () => {
|
||||||
const events: ProjectBranchChangeEvent[] = [];
|
const events: ProjectBranchChangeEvent[] = [];
|
||||||
const service = new BranchStatusService((event) => events.push(event), { getBranch });
|
const service = new BranchStatusService((event) => events.push(event), { getBranch });
|
||||||
|
|
||||||
await service.setTracking('/repo', true);
|
await service.setTracking(REPO, true);
|
||||||
expect(events).toEqual([{ projectPath: '/repo', branch: 'main' }]);
|
expect(events).toEqual([{ projectPath: REPO, branch: 'main' }]);
|
||||||
|
|
||||||
await vi.advanceTimersByTimeAsync(20_000);
|
await vi.advanceTimersByTimeAsync(20_000);
|
||||||
expect(events).toHaveLength(1);
|
expect(events).toHaveLength(1);
|
||||||
|
|
||||||
await vi.advanceTimersByTimeAsync(20_000);
|
await vi.advanceTimersByTimeAsync(20_000);
|
||||||
expect(events).toEqual([
|
expect(events).toEqual([
|
||||||
{ projectPath: '/repo', branch: 'main' },
|
{ projectPath: REPO, branch: 'main' },
|
||||||
{ projectPath: '/repo', branch: 'feature/refactor' },
|
{ projectPath: REPO, branch: 'feature/refactor' },
|
||||||
]);
|
]);
|
||||||
|
|
||||||
service.dispose();
|
service.dispose();
|
||||||
|
|
@ -54,15 +58,15 @@ describe('BranchStatusService', () => {
|
||||||
const getBranch = vi.fn().mockResolvedValue('main');
|
const getBranch = vi.fn().mockResolvedValue('main');
|
||||||
const service = new BranchStatusService(() => undefined, { getBranch });
|
const service = new BranchStatusService(() => undefined, { getBranch });
|
||||||
|
|
||||||
await service.setTracking('/repo', true);
|
await service.setTracking(REPO, true);
|
||||||
await service.setTracking('/repo', true);
|
await service.setTracking(REPO, true);
|
||||||
expect(getBranch).toHaveBeenCalledTimes(1);
|
expect(getBranch).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
await service.setTracking('/repo', false);
|
await service.setTracking(REPO, false);
|
||||||
await vi.advanceTimersByTimeAsync(20_000);
|
await vi.advanceTimersByTimeAsync(20_000);
|
||||||
expect(getBranch).toHaveBeenCalledTimes(2);
|
expect(getBranch).toHaveBeenCalledTimes(2);
|
||||||
|
|
||||||
await service.setTracking('/repo', false);
|
await service.setTracking(REPO, false);
|
||||||
await vi.advanceTimersByTimeAsync(40_000);
|
await vi.advanceTimersByTimeAsync(40_000);
|
||||||
expect(getBranch).toHaveBeenCalledTimes(2);
|
expect(getBranch).toHaveBeenCalledTimes(2);
|
||||||
|
|
||||||
|
|
@ -79,11 +83,11 @@ describe('BranchStatusService', () => {
|
||||||
const events: ProjectBranchChangeEvent[] = [];
|
const events: ProjectBranchChangeEvent[] = [];
|
||||||
const service = new BranchStatusService((event) => events.push(event), { getBranch });
|
const service = new BranchStatusService((event) => events.push(event), { getBranch });
|
||||||
|
|
||||||
const firstEnable = service.setTracking('/repo', true);
|
const firstEnable = service.setTracking(REPO, true);
|
||||||
await Promise.resolve();
|
await Promise.resolve();
|
||||||
|
|
||||||
await service.setTracking('/repo', false);
|
await service.setTracking(REPO, false);
|
||||||
const secondEnable = service.setTracking('/repo', true);
|
const secondEnable = service.setTracking(REPO, true);
|
||||||
await Promise.resolve();
|
await Promise.resolve();
|
||||||
|
|
||||||
first.resolve('main');
|
first.resolve('main');
|
||||||
|
|
@ -92,7 +96,7 @@ describe('BranchStatusService', () => {
|
||||||
|
|
||||||
second.resolve('feature/refactor');
|
second.resolve('feature/refactor');
|
||||||
await secondEnable;
|
await secondEnable;
|
||||||
expect(events).toEqual([{ projectPath: '/repo', branch: 'feature/refactor' }]);
|
expect(events).toEqual([{ projectPath: REPO, branch: 'feature/refactor' }]);
|
||||||
|
|
||||||
service.dispose();
|
service.dispose();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue