e243b8f77b
- router: classify({skipPrefilter}) — наставник зовёт мозг роутера мимо detectMicro
(ловил 'format' подстрокой в имени модуля → роутер не доходил до LLM); recommendedChainOf
в on-plan-write маппит node/recommended_node/recommended_chain (рекомендация не теряется)
- skills в ПОДПИСАННУЮ печать (Вариант 1): sealablePlan/freezePlan/sealPlan
- стена: isPlanDeclaredSkill — объявленный в опломбированном плане навык вызываем (снимает дедлок)
- enforce-domain-skill-discipline (новый хук): объявил → обязан вызвать (журнал M1) до
первого мутирующего шага; поверх готового domain-skill-discipline
- гайд docs/superpowers/router-mentor-wall-GUIDE.md + дизайн/план-доки
- регрессия tools-only 3928 passed + 2 skip, 0 регрессий
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
24 lines
1.0 KiB
JavaScript
24 lines
1.0 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { isPlanDeclaredSkill } from './enforce-supreme-gate.mjs';
|
|
|
|
describe('стена: навык из печати разрешён к вызову', () => {
|
|
const fp = { skills: ['claude-md-management', 'test-driven-development'] };
|
|
|
|
it('Skill из skills печати → true (по суффиксу)', () => {
|
|
expect(isPlanDeclaredSkill({ name: 'Skill', input: { skill: 'claude-md-management:revise-claude-md' } }, fp)).toBe(true);
|
|
});
|
|
|
|
it('Skill вне печати → false', () => {
|
|
expect(isPlanDeclaredSkill({ name: 'Skill', input: { skill: 'brainstorming' } }, fp)).toBe(false);
|
|
});
|
|
|
|
it('не Skill → false', () => {
|
|
expect(isPlanDeclaredSkill({ name: 'Bash', input: { command: 'x' } }, fp)).toBe(false);
|
|
});
|
|
|
|
it('нет печати / нет skills → false', () => {
|
|
expect(isPlanDeclaredSkill({ name: 'Skill', input: { skill: 'x' } }, null)).toBe(false);
|
|
expect(isPlanDeclaredSkill({ name: 'Skill', input: { skill: 'x' } }, {})).toBe(false);
|
|
});
|
|
});
|