권한 규칙 호환성 확장: @/|/() 패턴 파싱 및 체인 회귀 강화
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
- AgentContext 권한 규칙 파서가 tool@pattern 외 tool|pattern, tool(pattern) 표기를 해석하도록 확장 - deny 우선순위 체인은 유지하면서 claw-code 계열 표기 차이로 인한 규칙 누락을 방지 - OperationModePolicyTests에 파이프/함수형 패턴 및 deny 우선 회귀 테스트 추가 - README/DEVELOPMENT에 2026-04-04 14:55(KST) 기준 이력 동기화
This commit is contained in:
@@ -222,7 +222,7 @@ public class MyHandler : IActionHandler
|
|||||||
|
|
||||||
### v0.7.3 — AX Agent 권한 코어 재구성 + 입력 계층 정리
|
### v0.7.3 — AX Agent 권한 코어 재구성 + 입력 계층 정리
|
||||||
|
|
||||||
업데이트: 2026-04-04 14:47 (KST)
|
업데이트: 2026-04-04 14:55 (KST)
|
||||||
|
|
||||||
| 분류 | 내용 |
|
| 분류 | 내용 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@@ -286,6 +286,7 @@ public class MyHandler : IActionHandler
|
|||||||
| 권한 팝업 밀도 압축 2단계 | 권한 팝업의 섹션/요약/예외/거부 카드와 권한 행 타이포를 압축해 슬래시 팝업과 동일한 컴팩트 리듬으로 정렬 |
|
| 권한 팝업 밀도 압축 2단계 | 권한 팝업의 섹션/요약/예외/거부 카드와 권한 행 타이포를 압축해 슬래시 팝업과 동일한 컴팩트 리듬으로 정렬 |
|
||||||
| 입력 하단/모델 선택 컴팩트 정렬 | 입력 박스·모델 선택 버튼·인라인 설정 패널·전송 버튼 크기를 축소해 Codex형 컴포저 밀도로 정렬 |
|
| 입력 하단/모델 선택 컴팩트 정렬 | 입력 박스·모델 선택 버튼·인라인 설정 패널·전송 버튼 크기를 축소해 Codex형 컴포저 밀도로 정렬 |
|
||||||
| 로직 안정화 회귀 보강 | `ContextCondenserTests`와 `LlmRuntimeOverrideTests`를 보강해 compact 실동작과 vLLM 암호화 API키/SSL 우회 해석 규칙을 회귀 검증 |
|
| 로직 안정화 회귀 보강 | `ContextCondenserTests`와 `LlmRuntimeOverrideTests`를 보강해 compact 실동작과 vLLM 암호화 API키/SSL 우회 해석 규칙을 회귀 검증 |
|
||||||
|
| 권한 패턴 구문 호환성 보강 | 권한 규칙 파서를 `tool@pattern` 외 `tool|pattern`, `tool(pattern)`도 해석하도록 확장하고 deny→allow 우선순위 회귀를 보강 |
|
||||||
| Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 |
|
| Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 |
|
||||||
| 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 |
|
| 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 |
|
||||||
| 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed |
|
| 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed |
|
||||||
|
|||||||
@@ -3513,3 +3513,20 @@ else:
|
|||||||
### 4) 품질 게이트
|
### 4) 품질 게이트
|
||||||
- `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0).
|
- `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0).
|
||||||
- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~ContextCondenserTests|FullyQualifiedName~LlmRuntimeOverrideTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~OperationModeReadinessTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` 통과 (65 passed, 0 failed).
|
- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~ContextCondenserTests|FullyQualifiedName~LlmRuntimeOverrideTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~OperationModeReadinessTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` 통과 (65 passed, 0 failed).
|
||||||
|
|
||||||
|
## 2026-04-04 추가 진행 기록 (연속 실행 36차: 권한 규칙 구문 호환성 확장)
|
||||||
|
|
||||||
|
업데이트: 2026-04-04 14:55 (KST)
|
||||||
|
|
||||||
|
### 1) 권한 패턴 파서 호환성 확장
|
||||||
|
- `AgentContext`의 패턴 규칙 파서를 확장해 기존 `tool@pattern`과 함께 `tool|pattern`, `tool(pattern)` 표기도 허용.
|
||||||
|
- 기존 deny 우선 평가 흐름은 유지하면서, claw-code 계열 표기 차이로 인한 규칙 미적용 케이스를 줄임.
|
||||||
|
|
||||||
|
### 2) 권한 체인 회귀 테스트 보강
|
||||||
|
- `OperationModePolicyTests`에 케이스 추가:
|
||||||
|
- `process|git *`, `process|git push *` 조합에서 allow/deny 우선순위 검증
|
||||||
|
- `process(git *)`, `process(git push *)` 조합에서 dontask/deny 해석 검증
|
||||||
|
|
||||||
|
### 3) 품질 게이트
|
||||||
|
- `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0).
|
||||||
|
- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests"` 통과 (45 passed, 0 failed).
|
||||||
|
|||||||
@@ -120,6 +120,40 @@ public class OperationModePolicyTests
|
|||||||
context.GetEffectiveToolPermission("process", "git push origin main").Should().Be("Deny");
|
context.GetEffectiveToolPermission("process", "git push origin main").Should().Be("Deny");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AgentContext_GetEffectiveToolPermission_SupportsPipePatternSyntax()
|
||||||
|
{
|
||||||
|
var context = new AgentContext
|
||||||
|
{
|
||||||
|
Permission = "Default",
|
||||||
|
ToolPermissions = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||||
|
{
|
||||||
|
["process|git *"] = "acceptedits",
|
||||||
|
["process|git push *"] = "deny",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
context.GetEffectiveToolPermission("process", "git status").Should().Be("Default");
|
||||||
|
context.GetEffectiveToolPermission("process", "git push origin main").Should().Be("Deny");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AgentContext_GetEffectiveToolPermission_SupportsFunctionPatternSyntax()
|
||||||
|
{
|
||||||
|
var context = new AgentContext
|
||||||
|
{
|
||||||
|
Permission = "Default",
|
||||||
|
ToolPermissions = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||||
|
{
|
||||||
|
["process(git *)"] = "dontask",
|
||||||
|
["process(git push *)"] = "deny",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
context.GetEffectiveToolPermission("process", "git status").Should().Be("DontAsk");
|
||||||
|
context.GetEffectiveToolPermission("process", "git push origin main").Should().Be("Deny");
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void AgentContext_GetEffectiveToolPermission_AcceptEditsAllowsWriteButKeepsProcessPrompted()
|
public void AgentContext_GetEffectiveToolPermission_AcceptEditsAllowsWriteButKeepsProcessPrompted()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -330,12 +330,30 @@ public class AgentContext
|
|||||||
|
|
||||||
var trimmed = key.Trim();
|
var trimmed = key.Trim();
|
||||||
var at = trimmed.IndexOf('@');
|
var at = trimmed.IndexOf('@');
|
||||||
if (at <= 0 || at == trimmed.Length - 1)
|
if (at > 0 && at < trimmed.Length - 1)
|
||||||
return false;
|
{
|
||||||
|
ruleTool = trimmed[..at].Trim();
|
||||||
|
rulePattern = trimmed[(at + 1)..].Trim();
|
||||||
|
return !string.IsNullOrWhiteSpace(ruleTool) && !string.IsNullOrWhiteSpace(rulePattern);
|
||||||
|
}
|
||||||
|
|
||||||
ruleTool = trimmed[..at].Trim();
|
var pipe = trimmed.IndexOf('|');
|
||||||
rulePattern = trimmed[(at + 1)..].Trim();
|
if (pipe > 0 && pipe < trimmed.Length - 1)
|
||||||
return !string.IsNullOrWhiteSpace(ruleTool) && !string.IsNullOrWhiteSpace(rulePattern);
|
{
|
||||||
|
ruleTool = trimmed[..pipe].Trim();
|
||||||
|
rulePattern = trimmed[(pipe + 1)..].Trim();
|
||||||
|
return !string.IsNullOrWhiteSpace(ruleTool) && !string.IsNullOrWhiteSpace(rulePattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
var open = trimmed.IndexOf('(');
|
||||||
|
if (open > 0 && trimmed.EndsWith(")", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
ruleTool = trimmed[..open].Trim();
|
||||||
|
rulePattern = trimmed[(open + 1)..^1].Trim();
|
||||||
|
return !string.IsNullOrWhiteSpace(ruleTool) && !string.IsNullOrWhiteSpace(rulePattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool WildcardMatch(string input, string pattern)
|
private static bool WildcardMatch(string input, string pattern)
|
||||||
|
|||||||
Reference in New Issue
Block a user