@su-record/vibe 3.2.62 → 3.2.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CLAUDE.md +27 -4
- package/dist/tools/bench/benchCompare.d.ts +78 -0
- package/dist/tools/bench/benchCompare.d.ts.map +1 -0
- package/dist/tools/bench/benchCompare.js +113 -0
- package/dist/tools/bench/benchCompare.js.map +1 -0
- package/dist/tools/bench/benchDefinition.d.ts +37 -0
- package/dist/tools/bench/benchDefinition.d.ts.map +1 -0
- package/dist/tools/bench/benchDefinition.js +69 -0
- package/dist/tools/bench/benchDefinition.js.map +1 -0
- package/dist/tools/bench/benchReport.d.ts +16 -0
- package/dist/tools/bench/benchReport.d.ts.map +1 -0
- package/dist/tools/bench/benchReport.js +64 -0
- package/dist/tools/bench/benchReport.js.map +1 -0
- package/dist/tools/bench/index.d.ts +10 -0
- package/dist/tools/bench/index.d.ts.map +1 -0
- package/dist/tools/bench/index.js +7 -0
- package/dist/tools/bench/index.js.map +1 -0
- package/dist/tools/contract/agentContract.d.ts +86 -0
- package/dist/tools/contract/agentContract.d.ts.map +1 -0
- package/dist/tools/contract/agentContract.js +140 -0
- package/dist/tools/contract/agentContract.js.map +1 -0
- package/dist/tools/contract/index.d.ts +8 -0
- package/dist/tools/contract/index.d.ts.map +1 -0
- package/dist/tools/contract/index.js +6 -0
- package/dist/tools/contract/index.js.map +1 -0
- package/dist/tools/contract/reverseDrift.d.ts +71 -0
- package/dist/tools/contract/reverseDrift.d.ts.map +1 -0
- package/dist/tools/contract/reverseDrift.js +136 -0
- package/dist/tools/contract/reverseDrift.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/hooks/scripts/code-check.js +7 -0
- package/hooks/scripts/lib/ephemeral-lane.js +106 -0
- package/hooks/scripts/lib/iteration-cost.js +178 -0
- package/hooks/scripts/lib/loop-ledger.js +38 -5
- package/hooks/scripts/loop-ledger.js +9 -1
- package/hooks/scripts/pre-tool-guard.js +16 -0
- package/hooks/scripts/step-counter.js +29 -0
- package/package.json +1 -1
- package/skills/vibe.contract/SKILL.md +114 -1
- package/skills/vibe.loop/SKILL.md +47 -1
- package/skills/vibe.spec/SKILL.md +2 -1
- package/vibe/rules/loop-contract.md +25 -5
- package/vibe/templates/spec-template.md +15 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 에이전트 계약 — 런타임 축을 **빌드타임에** 잡는다.
|
|
3
|
+
*
|
|
4
|
+
* vibe 는 빌드타임만 다룬다. 그런데 사용자가 만드는 것이 에이전트 제품일 때, 그 에이전트가
|
|
5
|
+
* 사용자 앞에서 내리는 판단은 vibe 의 어떤 게이트도 보지 않는다. 그렇다고 vibe 를 런타임에
|
|
6
|
+
* 넣으면 loop-contract 의 push·release·배포 금지를 정면으로 깬다. 그래서 vibe 가 런타임에
|
|
7
|
+
* 들어가는 대신 **런타임 게이트를 빌드타임에 생성**한다.
|
|
8
|
+
*
|
|
9
|
+
* **판정 대상이 도구 호출 로그인 것이 핵심이다.** LLM 이 에이전트의 출력을 채점하는 형태였다면
|
|
10
|
+
* 그것은 Model Judge 이고 완료 권한이 없다 (loop-contract Judge 권한 경계). "금지된 도구를
|
|
11
|
+
* 불렀는가" 는 관측된 사실이라 차단할 수 있다.
|
|
12
|
+
*
|
|
13
|
+
* 그래서 이 모듈은 `reverseDrift.ts` 와 **반대 방향의 결정**을 한다. 거기서는 `blocking: false`
|
|
14
|
+
* 가 리터럴 타입이라 차단하는 분류를 만들 수 없다 — 판정 주체가 LLM 추출이기 때문이다.
|
|
15
|
+
* 여기서는 차단이 정당하다 — 판정 주체가 로그이기 때문이다. 두 파일의 차이가 곧 권한 경계의
|
|
16
|
+
* 예시다.
|
|
17
|
+
*
|
|
18
|
+
* 판정할 수 없는 것은 게이트로 만들지 않는다: 에스컬레이션 조건("결제가 임계를 넘으면 사람에게
|
|
19
|
+
* 묻는다")은 조건 충족 여부가 로그에 없다. 선언은 받되 advisory 로 낸다 — 억지로 게이트에
|
|
20
|
+
* 넣으면 통과 의식이 되고, 그건 없는 게이트보다 나쁘다.
|
|
21
|
+
*/
|
|
22
|
+
const SECTION = /^#{1,4}\s*(?:\d+\.\s*)?Agent Contract\s*$/im;
|
|
23
|
+
const FIELD_PATTERNS = [
|
|
24
|
+
['allowedTools', /^\s*[-*]\s*\*{0,2}Allowed(?:\s+tools)?\*{0,2}\s*[::]\s*(.+)$/gim],
|
|
25
|
+
['forbiddenTools', /^\s*[-*]\s*\*{0,2}Forbidden(?:\s+tools)?\*{0,2}\s*[::]\s*(.+)$/gim],
|
|
26
|
+
['irreversibleOps', /^\s*[-*]\s*\*{0,2}Irreversible\*{0,2}\s*[::]\s*(.+)$/gim],
|
|
27
|
+
['escalations', /^\s*[-*]\s*\*{0,2}Escalate\*{0,2}\s*[::]\s*(.+)$/gim],
|
|
28
|
+
];
|
|
29
|
+
/** 백틱·쉼표 표기를 견딘다. 글롭은 지원하지 않는다 — 정확히 일치만 인정한다 */
|
|
30
|
+
function splitList(raw) {
|
|
31
|
+
return raw
|
|
32
|
+
.split(',')
|
|
33
|
+
.map((part) => part.replace(/`/g, '').trim())
|
|
34
|
+
.filter((part) => part.length > 0);
|
|
35
|
+
}
|
|
36
|
+
/** `## Agent Contract` 부터 다음 같은 수준 이상 헤딩 전까지 */
|
|
37
|
+
function sectionBody(content) {
|
|
38
|
+
const match = content.match(SECTION);
|
|
39
|
+
if (!match || match.index === undefined)
|
|
40
|
+
return null;
|
|
41
|
+
const after = content.slice(match.index + match[0].length);
|
|
42
|
+
const next = after.search(/^#{1,4}\s+\S/m);
|
|
43
|
+
return next === -1 ? after : after.slice(0, next);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* SPEC 에서 에이전트 계약을 뽑는다.
|
|
47
|
+
*
|
|
48
|
+
* 섹션이 없으면 `null` — 모든 기능에 에이전트가 있는 것은 아니다. 섹션 존재가 곧 스위치인
|
|
49
|
+
* 관례는 `## API Contract` 와 같다 (spec-template).
|
|
50
|
+
*/
|
|
51
|
+
export function parseAgentContract(specContent) {
|
|
52
|
+
const body = sectionBody(specContent);
|
|
53
|
+
if (body === null)
|
|
54
|
+
return null;
|
|
55
|
+
const contract = {
|
|
56
|
+
allowedTools: [], forbiddenTools: [], irreversibleOps: [], escalations: [],
|
|
57
|
+
};
|
|
58
|
+
for (const [key, pattern] of FIELD_PATTERNS) {
|
|
59
|
+
for (const line of body.matchAll(pattern)) {
|
|
60
|
+
contract[key].push(...splitList(line[1]));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Escalate 는 자유 문장이라 쉼표로 쪼개면 문장이 잘린다 — 원문 줄을 그대로 쓴다
|
|
64
|
+
contract.escalations = [...body.matchAll(FIELD_PATTERNS[3][1])].map((m) => m[1].trim());
|
|
65
|
+
return contract;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 계약 정의 자체의 오류를 잡는다 (노드 가드).
|
|
69
|
+
*
|
|
70
|
+
* Allowed 와 Forbidden 이 겹칠 때 우선순위 규칙을 두지 않는 이유: 규칙을 기억해야 판정을
|
|
71
|
+
* 예측할 수 있고, 기억이 필요한 규칙은 틀린다. 정의 단계에서 막는다.
|
|
72
|
+
*/
|
|
73
|
+
export function validateAgentContract(contract) {
|
|
74
|
+
const findings = [];
|
|
75
|
+
const forbidden = new Set(contract.forbiddenTools);
|
|
76
|
+
const both = contract.allowedTools.filter((tool) => forbidden.has(tool));
|
|
77
|
+
if (both.length > 0) {
|
|
78
|
+
findings.push({
|
|
79
|
+
severity: 'P1',
|
|
80
|
+
code: 'tool-in-both-lists',
|
|
81
|
+
message: `Allowed 와 Forbidden 에 동시에 있는 도구: ${both.join(', ')} — 어느 쪽이 이기는지 정하지 않는다.`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const declared = contract.allowedTools.length + contract.forbiddenTools.length
|
|
85
|
+
+ contract.irreversibleOps.length + contract.escalations.length;
|
|
86
|
+
if (declared === 0) {
|
|
87
|
+
findings.push({
|
|
88
|
+
severity: 'P1',
|
|
89
|
+
code: 'empty-agent-contract',
|
|
90
|
+
message: 'Agent Contract 섹션이 비어 있다 — 섹션 존재가 검사 스위치인데 검사할 것이 없다.',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const orphanIrreversible = contract.irreversibleOps.filter((tool) => forbidden.has(tool));
|
|
94
|
+
if (orphanIrreversible.length > 0) {
|
|
95
|
+
findings.push({
|
|
96
|
+
severity: 'P2',
|
|
97
|
+
code: 'irreversible-also-forbidden',
|
|
98
|
+
message: `금지된 도구가 Irreversible 에도 있다: ${orphanIrreversible.join(', ')} — 승인 규칙이 사문이 된다.`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return { valid: !findings.some((f) => f.severity === 'P1'), findings };
|
|
102
|
+
}
|
|
103
|
+
function violationOf(call, index, contract) {
|
|
104
|
+
if (contract.forbiddenTools.includes(call.tool)) {
|
|
105
|
+
return { kind: 'forbidden-tool', tool: call.tool, index, detail: '계약이 금지한 도구를 호출했다.' };
|
|
106
|
+
}
|
|
107
|
+
if (contract.irreversibleOps.includes(call.tool) && call.approved !== true) {
|
|
108
|
+
return {
|
|
109
|
+
kind: 'unapproved-irreversible',
|
|
110
|
+
tool: call.tool,
|
|
111
|
+
index,
|
|
112
|
+
detail: '되돌릴 수 없는 작업을 승인 기록 없이 호출했다.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// allowlist 미선언(빈 목록)을 "아무것도 허용 안 함" 으로 읽으면 선언하지 않은 프로젝트가 전부 위반이 된다
|
|
116
|
+
if (contract.allowedTools.length > 0 && !contract.allowedTools.includes(call.tool)) {
|
|
117
|
+
return { kind: 'unlisted-tool', tool: call.tool, index, detail: 'allowlist 에 없는 도구를 호출했다.' };
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 도구 호출 로그에 대해 계약을 단언한다.
|
|
123
|
+
*
|
|
124
|
+
* 로그가 없으면 `checked: false` — **위반 0건으로 적지 않는다.** 안 본 것과 봤는데 깨끗한 것은
|
|
125
|
+
* 다르다 (회전 비용 계측 축과 같은 규약).
|
|
126
|
+
*/
|
|
127
|
+
export function checkAgentToolLog(contract, log) {
|
|
128
|
+
const advisory = contract.escalations.map((condition) => `에스컬레이션 조건은 도구 로그로 판정할 수 없다 — 사람이 확인한다: ${condition}`);
|
|
129
|
+
if (!log) {
|
|
130
|
+
return { checked: false, violations: [], advisory, blocking: false };
|
|
131
|
+
}
|
|
132
|
+
const violations = [];
|
|
133
|
+
log.forEach((call, index) => {
|
|
134
|
+
const violation = violationOf(call, index, contract);
|
|
135
|
+
if (violation)
|
|
136
|
+
violations.push(violation);
|
|
137
|
+
});
|
|
138
|
+
return { checked: true, violations, advisory, blocking: violations.length > 0 };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=agentContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentContract.js","sourceRoot":"","sources":["../../../src/tools/contract/agentContract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Tools — 계약 드리프트 판정의 귀결을 고정하는 순수 함수 모음.
|
|
3
|
+
*/
|
|
4
|
+
export { REVERSE_DRIFT_KINDS, isReverseDriftKind, classifyReverseDrift, summarizeReverseDrift, formatReverseReport, formatReverseInboxLines, } from './reverseDrift.js';
|
|
5
|
+
export type { ReverseDriftKind, ReverseDriftSeverity, ReverseDriftClassification, ReverseDriftFinding, ReverseDriftSummary, ReverseReportInput, } from './reverseDrift.js';
|
|
6
|
+
export { parseAgentContract, validateAgentContract, checkAgentToolLog, } from './agentContract.js';
|
|
7
|
+
export type { AgentContract, AgentContractCheck, AgentContractFinding, AgentContractFindingSeverity, AgentContractValidation, AgentToolCall, AgentViolation, AgentViolationKind, } from './agentContract.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/contract/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Tools — 계약 드리프트 판정의 귀결을 고정하는 순수 함수 모음.
|
|
3
|
+
*/
|
|
4
|
+
export { REVERSE_DRIFT_KINDS, isReverseDriftKind, classifyReverseDrift, summarizeReverseDrift, formatReverseReport, formatReverseInboxLines, } from './reverseDrift.js';
|
|
5
|
+
export { parseAgentContract, validateAgentContract, checkAgentToolLog, } from './agentContract.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/contract/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 역방향 계약 드리프트 — 구현에만 있고 SPEC 에 없는 표면의 분류·기록.
|
|
3
|
+
*
|
|
4
|
+
* 배경: `vibe.contract` 의 `check` 는 **SPEC → 구현** 한 방향만 본다. 구현이 SPEC 에 없는
|
|
5
|
+
* 엔드포인트·필드·상태 코드를 갖게 되어도 아무도 모르고, SPEC 은 승인 시점에 얼어붙는다.
|
|
6
|
+
*
|
|
7
|
+
* 방향만 뒤집는 것이 아니라 **등급 매핑을 뒤집는다.** 구현에만 있는 표면은 코드 실패가
|
|
8
|
+
* 아니라 SPEC 결손이다. 그리고 판정 주체가 LLM 추출이므로 loop-contract 의 Judge 권한
|
|
9
|
+
* 경계상 "판정된 P1" 이며 — 단독으로 루프를 차단할 권한이 없다.
|
|
10
|
+
*
|
|
11
|
+
* 그래서 이 모듈이 결정론으로 고정하는 것은 *판정* 이 아니라 **판정의 귀결**이다:
|
|
12
|
+
* 등급에 P1 이 없고(`ReverseDriftSeverity`), 차단이 타입 수준에서 불가능하며
|
|
13
|
+
* (`blocking: false` 리터럴), 목적지가 인박스로 고정된다. 규칙을 산문으로 적어두면
|
|
14
|
+
* 다음 사람이 P1 을 하나 추가하는 것으로 조용히 깨진다.
|
|
15
|
+
*/
|
|
16
|
+
/** 역방향 드리프트 종류 — `구현 ⊃ SPEC` 인 경우만. 구현이 SPEC 보다 좁은 것은 `check` 의 관할이다. */
|
|
17
|
+
export type ReverseDriftKind = 'unspecified-endpoint' | 'unspecified-field' | 'unspecified-status-code' | 'unspecified-parameter';
|
|
18
|
+
/** 분류기가 다루는 종류 전부 — 테스트가 순회 기준으로 읽는 SSOT */
|
|
19
|
+
export declare const REVERSE_DRIFT_KINDS: readonly ReverseDriftKind[];
|
|
20
|
+
/**
|
|
21
|
+
* 역방향 등급에는 P1 이 없다 — 타입 수준에서 없앤다.
|
|
22
|
+
* P1 이 존재하면 차단 권한 없는 판정이 차단하게 된다 (loop-contract Judge 권한 경계).
|
|
23
|
+
*/
|
|
24
|
+
export type ReverseDriftSeverity = 'P2' | 'P3';
|
|
25
|
+
export interface ReverseDriftClassification {
|
|
26
|
+
severity: ReverseDriftSeverity;
|
|
27
|
+
/** 리터럴 `false` — 차단하는 분류를 만들 수 없다 */
|
|
28
|
+
blocking: false;
|
|
29
|
+
/** 리터럴 `'inbox'` — 게이트는 답을 기다리는 질문이고, SPEC 결손은 답을 기다리지 않는다 */
|
|
30
|
+
destination: 'inbox';
|
|
31
|
+
reason: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function isReverseDriftKind(value: unknown): value is ReverseDriftKind;
|
|
34
|
+
export declare function classifyReverseDrift(kind: ReverseDriftKind): ReverseDriftClassification;
|
|
35
|
+
export interface ReverseDriftFinding {
|
|
36
|
+
kind: ReverseDriftKind;
|
|
37
|
+
/** 구현에서 발견한 표면 식별자 — 예: `GET /users/:id`, `get-user-by-id.response.200.phoneNumber` */
|
|
38
|
+
surface: string;
|
|
39
|
+
/** 구현 위치 `file:line` — 확인하지 못했으면 생략한다 (추측해 채우지 않는다) */
|
|
40
|
+
location?: string;
|
|
41
|
+
/** 한 줄 부연 */
|
|
42
|
+
note?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ReverseDriftSummary {
|
|
45
|
+
total: number;
|
|
46
|
+
byKind: Record<ReverseDriftKind, number>;
|
|
47
|
+
bySeverity: Record<ReverseDriftSeverity, number>;
|
|
48
|
+
}
|
|
49
|
+
export declare function summarizeReverseDrift(findings: readonly ReverseDriftFinding[]): ReverseDriftSummary;
|
|
50
|
+
export interface ReverseReportInput {
|
|
51
|
+
feature: string;
|
|
52
|
+
/** 대조 기준이 된 SPEC 경로 */
|
|
53
|
+
specPath: string;
|
|
54
|
+
/** ISO-8601 */
|
|
55
|
+
comparedAt: string;
|
|
56
|
+
findings: readonly ReverseDriftFinding[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* `.vibe/contracts/<feature>.reverse.md` 본문.
|
|
60
|
+
*
|
|
61
|
+
* 발견 0건이어도 파일을 낸다 — "대조했고 결손이 없었다" 는 증거이고, 파일이 없는 것과
|
|
62
|
+
* 구분되어야 한다 (아직 안 돌린 것 vs 돌렸는데 깨끗한 것).
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatReverseReport(input: ReverseReportInput): string;
|
|
65
|
+
/**
|
|
66
|
+
* `loop-ledger.js inbox <name> ok <line...>` 에 넘길 줄들.
|
|
67
|
+
*
|
|
68
|
+
* 발견 0건이면 **빈 배열** — 인박스에 빈 블록을 남기지 않는다.
|
|
69
|
+
*/
|
|
70
|
+
export declare function formatReverseInboxLines(feature: string, findings: readonly ReverseDriftFinding[]): string[];
|
|
71
|
+
//# sourceMappingURL=reverseDrift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverseDrift.d.ts","sourceRoot":"","sources":["../../../src/tools/contract/reverseDrift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,yEAAyE;AACzE,MAAM,MAAM,gBAAgB,GACxB,sBAAsB,GACtB,mBAAmB,GACnB,yBAAyB,GACzB,uBAAuB,CAAC;AAE5B,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAK1D,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,qCAAqC;IACrC,QAAQ,EAAE,KAAK,CAAC;IAChB,8DAA8D;IAC9D,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAgBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,0BAA0B,CAUvF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;CAClD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,mBAAmB,CAcnG;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C;AAsCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAgBrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GACvC,MAAM,EAAE,CAUV"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 역방향 계약 드리프트 — 구현에만 있고 SPEC 에 없는 표면의 분류·기록.
|
|
3
|
+
*
|
|
4
|
+
* 배경: `vibe.contract` 의 `check` 는 **SPEC → 구현** 한 방향만 본다. 구현이 SPEC 에 없는
|
|
5
|
+
* 엔드포인트·필드·상태 코드를 갖게 되어도 아무도 모르고, SPEC 은 승인 시점에 얼어붙는다.
|
|
6
|
+
*
|
|
7
|
+
* 방향만 뒤집는 것이 아니라 **등급 매핑을 뒤집는다.** 구현에만 있는 표면은 코드 실패가
|
|
8
|
+
* 아니라 SPEC 결손이다. 그리고 판정 주체가 LLM 추출이므로 loop-contract 의 Judge 권한
|
|
9
|
+
* 경계상 "판정된 P1" 이며 — 단독으로 루프를 차단할 권한이 없다.
|
|
10
|
+
*
|
|
11
|
+
* 그래서 이 모듈이 결정론으로 고정하는 것은 *판정* 이 아니라 **판정의 귀결**이다:
|
|
12
|
+
* 등급에 P1 이 없고(`ReverseDriftSeverity`), 차단이 타입 수준에서 불가능하며
|
|
13
|
+
* (`blocking: false` 리터럴), 목적지가 인박스로 고정된다. 규칙을 산문으로 적어두면
|
|
14
|
+
* 다음 사람이 P1 을 하나 추가하는 것으로 조용히 깨진다.
|
|
15
|
+
*/
|
|
16
|
+
/** 분류기가 다루는 종류 전부 — 테스트가 순회 기준으로 읽는 SSOT */
|
|
17
|
+
export const REVERSE_DRIFT_KINDS = [
|
|
18
|
+
'unspecified-endpoint',
|
|
19
|
+
'unspecified-field',
|
|
20
|
+
'unspecified-status-code',
|
|
21
|
+
'unspecified-parameter',
|
|
22
|
+
];
|
|
23
|
+
const KIND_SEVERITY = {
|
|
24
|
+
'unspecified-endpoint': 'P2',
|
|
25
|
+
'unspecified-field': 'P3',
|
|
26
|
+
'unspecified-status-code': 'P3',
|
|
27
|
+
'unspecified-parameter': 'P3',
|
|
28
|
+
};
|
|
29
|
+
const KIND_REASON = {
|
|
30
|
+
'unspecified-endpoint': 'SPEC 이 통째로 모르는 외부 표면 — 계약 리뷰 대상이 아니었다',
|
|
31
|
+
'unspecified-field': '응답/요청 필드가 SPEC 에 없다 — 소비자가 의존하기 시작하면 계약이 된다',
|
|
32
|
+
'unspecified-status-code': 'SPEC 에 없는 상태 코드 — 클라이언트가 처리 대상을 모른다',
|
|
33
|
+
'unspecified-parameter': 'SPEC 에 없는 파라미터 — 문서화되지 않은 입력 표면',
|
|
34
|
+
};
|
|
35
|
+
export function isReverseDriftKind(value) {
|
|
36
|
+
return typeof value === 'string' && REVERSE_DRIFT_KINDS.includes(value);
|
|
37
|
+
}
|
|
38
|
+
export function classifyReverseDrift(kind) {
|
|
39
|
+
if (!isReverseDriftKind(kind)) {
|
|
40
|
+
throw new Error(`[reverse-drift] 알 수 없는 종류: ${String(kind)}`);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
severity: KIND_SEVERITY[kind],
|
|
44
|
+
blocking: false,
|
|
45
|
+
destination: 'inbox',
|
|
46
|
+
reason: KIND_REASON[kind],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function summarizeReverseDrift(findings) {
|
|
50
|
+
const byKind = {
|
|
51
|
+
'unspecified-endpoint': 0,
|
|
52
|
+
'unspecified-field': 0,
|
|
53
|
+
'unspecified-status-code': 0,
|
|
54
|
+
'unspecified-parameter': 0,
|
|
55
|
+
};
|
|
56
|
+
const bySeverity = { P2: 0, P3: 0 };
|
|
57
|
+
for (const finding of findings) {
|
|
58
|
+
byKind[finding.kind] += 1;
|
|
59
|
+
bySeverity[classifyReverseDrift(finding.kind).severity] += 1;
|
|
60
|
+
}
|
|
61
|
+
return { total: findings.length, byKind, bySeverity };
|
|
62
|
+
}
|
|
63
|
+
function formatFrontmatter(input, summary) {
|
|
64
|
+
const counts = REVERSE_DRIFT_KINDS.map((kind) => ` ${kind}: ${summary.byKind[kind]}`);
|
|
65
|
+
return [
|
|
66
|
+
'---',
|
|
67
|
+
`feature: ${input.feature}`,
|
|
68
|
+
`spec: ${input.specPath}`,
|
|
69
|
+
`compared-at: ${input.comparedAt}`,
|
|
70
|
+
'direction: implementation-to-spec',
|
|
71
|
+
'blocking: false',
|
|
72
|
+
`total: ${summary.total}`,
|
|
73
|
+
'kind-counts:',
|
|
74
|
+
...counts,
|
|
75
|
+
'---',
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
function formatFindingLine(finding) {
|
|
79
|
+
const location = finding.location ? ` — ${finding.location}` : '';
|
|
80
|
+
const note = finding.note ? ` (${finding.note})` : '';
|
|
81
|
+
return `- \`${finding.surface}\`${location}${note}`;
|
|
82
|
+
}
|
|
83
|
+
function formatKindSection(kind, findings) {
|
|
84
|
+
const matched = findings.filter((f) => f.kind === kind);
|
|
85
|
+
if (matched.length === 0)
|
|
86
|
+
return [];
|
|
87
|
+
const { severity, reason } = classifyReverseDrift(kind);
|
|
88
|
+
return [
|
|
89
|
+
'',
|
|
90
|
+
`## ${severity} — ${kind} (${matched.length})`,
|
|
91
|
+
'',
|
|
92
|
+
reason,
|
|
93
|
+
'',
|
|
94
|
+
...matched.map(formatFindingLine),
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* `.vibe/contracts/<feature>.reverse.md` 본문.
|
|
99
|
+
*
|
|
100
|
+
* 발견 0건이어도 파일을 낸다 — "대조했고 결손이 없었다" 는 증거이고, 파일이 없는 것과
|
|
101
|
+
* 구분되어야 한다 (아직 안 돌린 것 vs 돌렸는데 깨끗한 것).
|
|
102
|
+
*/
|
|
103
|
+
export function formatReverseReport(input) {
|
|
104
|
+
const summary = summarizeReverseDrift(input.findings);
|
|
105
|
+
const body = summary.total === 0
|
|
106
|
+
? ['', '결손 없음 — 구현에서 발견한 모든 표면이 SPEC 에 존재한다.']
|
|
107
|
+
: REVERSE_DRIFT_KINDS.flatMap((kind) => formatKindSection(kind, input.findings));
|
|
108
|
+
return [
|
|
109
|
+
...formatFrontmatter(input, summary),
|
|
110
|
+
'',
|
|
111
|
+
`# Reverse contract drift — ${input.feature}`,
|
|
112
|
+
'',
|
|
113
|
+
'> 구현에만 있고 SPEC 에 없는 표면. **루프를 차단하지 않는다** — 코드 실패가 아니라',
|
|
114
|
+
'> SPEC 결손이므로 인박스(사람 리뷰 큐)로 간다. SPEC 갱신 여부는 사람이 정한다.',
|
|
115
|
+
...body,
|
|
116
|
+
'',
|
|
117
|
+
].join('\n');
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* `loop-ledger.js inbox <name> ok <line...>` 에 넘길 줄들.
|
|
121
|
+
*
|
|
122
|
+
* 발견 0건이면 **빈 배열** — 인박스에 빈 블록을 남기지 않는다.
|
|
123
|
+
*/
|
|
124
|
+
export function formatReverseInboxLines(feature, findings) {
|
|
125
|
+
if (findings.length === 0)
|
|
126
|
+
return [];
|
|
127
|
+
const summary = summarizeReverseDrift(findings);
|
|
128
|
+
const head = `SPEC 결손 ${summary.total}건 (P2 ${summary.bySeverity.P2} · P3 ${summary.bySeverity.P3})`
|
|
129
|
+
+ ` — 구현에만 있는 표면. 차단 아님, SPEC 갱신 여부는 사람이 정한다.`;
|
|
130
|
+
const items = findings.map((f) => {
|
|
131
|
+
const location = f.location ? ` @ ${f.location}` : '';
|
|
132
|
+
return `${classifyReverseDrift(f.kind).severity} ${f.kind}: ${f.surface}${location}`;
|
|
133
|
+
});
|
|
134
|
+
return [head, `근거: .vibe/contracts/${feature}.reverse.md`, ...items];
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=reverseDrift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverseDrift.js","sourceRoot":"","sources":["../../../src/tools/contract/reverseDrift.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -72,4 +72,10 @@ export type { DispatchSignals, ResumeState, StakesSignals, UrlKind, AttachmentKi
|
|
|
72
72
|
export { evaluateCostGate, formatCostGate } from './dispatch/index.js';
|
|
73
73
|
export type { CostOperation, CostGateConfig, CostGateDecision, } from './dispatch/index.js';
|
|
74
74
|
export type { ParsedLoopDefinition, LoopValidationResult, LoopTrigger, LoopVerify, LoopIsolation, LoopStatus, } from './loop/index.js';
|
|
75
|
+
export { REVERSE_DRIFT_KINDS, isReverseDriftKind, classifyReverseDrift, summarizeReverseDrift, formatReverseReport, formatReverseInboxLines, } from './contract/index.js';
|
|
76
|
+
export type { ReverseDriftKind, ReverseDriftSeverity, ReverseDriftClassification, ReverseDriftFinding, ReverseDriftSummary, ReverseReportInput, } from './contract/index.js';
|
|
77
|
+
export { validateBenchDefinition, DEFAULT_MIN_RUNS_PER_ARM, summarizeArm, compareArms, formatBenchReport, } from './bench/index.js';
|
|
78
|
+
export type { BenchArm, BenchDefinition, BenchFinding, BenchFindingSeverity, BenchValidationResult, ArmSummary, BenchComparison, BenchExclusion, BenchMetric, BenchRange, BenchRun, BenchVerdict, BenchReportInput, } from './bench/index.js';
|
|
79
|
+
export { parseAgentContract, validateAgentContract, checkAgentToolLog, } from './contract/index.js';
|
|
80
|
+
export type { AgentContract, AgentContractCheck, AgentContractFinding, AgentContractFindingSeverity, AgentContractValidation, AgentToolCall, AgentViolation, AgentViolationKind, } from './contract/index.js';
|
|
75
81
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -85,4 +85,10 @@ export { validateSpecDocument, formatSpecValidation, featureSlugFromPath, } from
|
|
|
85
85
|
// 디스패처 결정론 신호 — 파일 존재·URL 도메인·첨부 확장자는 모델이 아니라 코드가 판정한다
|
|
86
86
|
export { collectDispatchSignals, detectResumeState, detectStakesSignals, classifyUrl, classifyAttachment, } from './dispatch/index.js';
|
|
87
87
|
export { evaluateCostGate, formatCostGate } from './dispatch/index.js';
|
|
88
|
+
// Contract tools — 역방향 계약 드리프트(구현 → SPEC)의 등급·목적지 고정
|
|
89
|
+
export { REVERSE_DRIFT_KINDS, isReverseDriftKind, classifyReverseDrift, summarizeReverseDrift, formatReverseReport, formatReverseInboxLines, } from './contract/index.js';
|
|
90
|
+
// Bench tools — 루프 설정 자기 대조. 판정 불가를 코드가 낸다 (§3.5)
|
|
91
|
+
export { validateBenchDefinition, DEFAULT_MIN_RUNS_PER_ARM, summarizeArm, compareArms, formatBenchReport, } from './bench/index.js';
|
|
92
|
+
// Agent contract — 런타임 게이트를 빌드타임에 생성한다 (판정 대상은 도구 호출 로그)
|
|
93
|
+
export { parseAgentContract, validateAgentContract, checkAgentToolLog, } from './contract/index.js';
|
|
88
94
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { getToolsBaseUrl, PROJECT_DIR } from './utils.js';
|
|
|
14
14
|
import { readFileSync } from 'fs';
|
|
15
15
|
import { buildCliCtx, isDirectRun } from './lib/hook-context.js';
|
|
16
16
|
import { CODE_EXT_RE, shouldCheckConsole } from './lib/console-allow.js';
|
|
17
|
+
import { isEphemeralPath } from './lib/ephemeral-lane.js';
|
|
17
18
|
|
|
18
19
|
const BASE_URL = getToolsBaseUrl();
|
|
19
20
|
|
|
@@ -288,6 +289,12 @@ export async function run(ctx) {
|
|
|
288
289
|
const files = getModifiedFiles(ctx);
|
|
289
290
|
if (files.length === 0) return { exitCode: 0, findings };
|
|
290
291
|
|
|
292
|
+
// 일회성 레인 — 생성·실행 후 폐기되는 코드에 durable 코드의 무게를 지우지 않는다.
|
|
293
|
+
// 판정은 **경로가** 한다 (모델이 아니라) — `lib/ephemeral-lane.js` 참조.
|
|
294
|
+
// 이 면제가 안전한 이유는 그 경로가 커밋될 수 없기 때문이다: gitignore 가 1차,
|
|
295
|
+
// pre-tool-guard 가 `git add -f` 를 막는 심층 방어다.
|
|
296
|
+
if (isEphemeralPath(files[0], PROJECT_DIR)) return { exitCode: 0, findings };
|
|
297
|
+
|
|
291
298
|
// 1. 하드룰 탐지기 실행 (changed file only, regex only — 동적 import 없음) —
|
|
292
299
|
// additionalContext 주입만. 커밋 게이트(verifyRequired)는 태우지 않는다:
|
|
293
300
|
// 정규식 오탐 하나가 auto-commit을 차단하는 결합은 제거됨
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 일회성 코드 레인 — 생성·실행 후 폐기되는 코드에 durable 코드의 무게를 지우지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* ## 이 파일이 대부분 방어인 이유
|
|
5
|
+
*
|
|
6
|
+
* 이 레인은 원래 "열지 말자" 로 판단했던 것이다. 사유 둘 중 하나가 **게이트 회피 구멍**이었다:
|
|
7
|
+
* "이건 일회성이라 린트 면제" 를 모델이 판정하면 축이 아니라 뒷문이고, 뒷문은 바쁠 때 쓰인다.
|
|
8
|
+
*
|
|
9
|
+
* 그래서 단 하나의 규칙으로 막는다: **판정을 모델이 아니라 경로가 한다.**
|
|
10
|
+
* 경로가 판정하면 면제 대상이 `ls` 하나로 감사되고, 그 경로는 커밋될 수 없다.
|
|
11
|
+
*
|
|
12
|
+
* ## 방어 순서 (과장하지 않는다)
|
|
13
|
+
*
|
|
14
|
+
* 1. **`.gitignore`** — 1차 방어. `git add` 는 무시된 경로를 그냥 거부한다
|
|
15
|
+
* 2. **`pre-tool-guard`** — 심층 방어. 실제로 뚫리는 경로는 `git add -f` 하나뿐이고 그것을 막는다.
|
|
16
|
+
* 훅은 프로젝트 로컬이라 미설치가 흔하므로 이것을 1차라고 부르지 않는다
|
|
17
|
+
*
|
|
18
|
+
* ## fail-safe (fail-open 아님)
|
|
19
|
+
*
|
|
20
|
+
* 훅은 보통 fail-open 이다 — 판정 실패가 작업을 막지 않는다. 여기는 반대로 판정에 실패하면
|
|
21
|
+
* **일회성이 아니라고 답한다.** 모르면 면제하지 않는 쪽이 안전하다: 잘못된 면제는 조용히
|
|
22
|
+
* 품질 게이트를 끄지만, 잘못된 비면제는 검사가 한 번 더 도는 것뿐이다.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import path from 'path';
|
|
26
|
+
|
|
27
|
+
/** 유일한 일회성 경로 — 설정으로 열지 않는다. 설정 가능한 면제 경로는 프로젝트마다 다른 뒷문이 된다 */
|
|
28
|
+
export const EPHEMERAL_DIR = '.vibe/ephemeral';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 프로젝트 기준 상대 경로로 정규화한다 (구분자 통일 + `..` 해소 + 절대/상대 통일).
|
|
32
|
+
*
|
|
33
|
+
* `path.resolve` 로 양쪽을 절대 경로로 만든 뒤 `path.relative` 를 쓴다 — 문자열 접두사
|
|
34
|
+
* 비교로는 부족하다. 훅의 `PROJECT_DIR` 은 `CLAUDE_PROJECT_DIR` 미설정 시 `'.'` 이라
|
|
35
|
+
* (utils.js), 접두사만 보면 절대 경로로 들어온 파일이 프로젝트 밖으로 판정된다.
|
|
36
|
+
*/
|
|
37
|
+
function toProjectRelative(filePath, projectDir) {
|
|
38
|
+
const normalized = String(filePath).replace(/\\/g, '/');
|
|
39
|
+
const base = path.resolve(String(projectDir || '.').replace(/\\/g, '/'));
|
|
40
|
+
return path.relative(base, path.resolve(base, normalized)).replace(/\\/g, '/');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 이 경로가 일회성 레인 안인가.
|
|
45
|
+
*
|
|
46
|
+
* **정규화 후** 접두사를 본다 — `.vibe/ephemeral/../src/x.ts` 는 `.vibe/src/x.ts` 가 되어
|
|
47
|
+
* 거짓이다. 상위 탈출로 면제를 훔칠 수 없어야 한다.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} filePath
|
|
50
|
+
* @param {string} [projectDir] 주면 그 아래 절대 경로도 인식한다
|
|
51
|
+
* @returns {boolean}
|
|
52
|
+
*/
|
|
53
|
+
export function isEphemeralPath(filePath, projectDir) {
|
|
54
|
+
try {
|
|
55
|
+
if (!filePath) return false;
|
|
56
|
+
const rel = toProjectRelative(filePath, projectDir);
|
|
57
|
+
if (!rel || rel.startsWith('../') || path.isAbsolute(rel)) return false; // 프로젝트 밖
|
|
58
|
+
return rel === EPHEMERAL_DIR || rel.startsWith(`${EPHEMERAL_DIR}/`);
|
|
59
|
+
} catch {
|
|
60
|
+
return false; // fail-safe — 모르면 면제하지 않는다
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** `git add|stage|commit` 구간의 인자만 훑는다 (`;`·`&&`·`|` 로 끊는다) */
|
|
65
|
+
const GIT_STAGING_RE = /\bgit\s+(?:add|stage|commit)\b([^;&|]*)/gi;
|
|
66
|
+
|
|
67
|
+
/** 한 git 구간의 인자에서 일회성 경로만 고른다 (중첩을 얕게 유지하려고 분리했다) */
|
|
68
|
+
function ephemeralArgsIn(segment) {
|
|
69
|
+
const found = [];
|
|
70
|
+
for (const rawArg of String(segment).split(/\s+/)) {
|
|
71
|
+
const arg = rawArg.replace(/^["']|["']$/g, '').trim();
|
|
72
|
+
if (arg && !arg.startsWith('-') && isEphemeralPath(arg)) found.push(arg);
|
|
73
|
+
}
|
|
74
|
+
return found;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* git 스테이징 명령줄에서 일회성 경로를 뽑는다.
|
|
79
|
+
*
|
|
80
|
+
* `git add .` · `git add -A` 는 걸러내지 않는다 — gitignore 가 이미 거르고, 여기서 막으면
|
|
81
|
+
* 정상 커밋이 전부 멈춘다. 멈추는 게이트는 꺼진다.
|
|
82
|
+
*
|
|
83
|
+
* @param {string} command
|
|
84
|
+
* @returns {string[]} 명령에 명시된 일회성 경로들
|
|
85
|
+
*/
|
|
86
|
+
export function ephemeralPathsInGitCommand(command) {
|
|
87
|
+
try {
|
|
88
|
+
const found = [];
|
|
89
|
+
for (const match of String(command || '').matchAll(GIT_STAGING_RE)) {
|
|
90
|
+
found.push(...ephemeralArgsIn(match[1]));
|
|
91
|
+
}
|
|
92
|
+
return found;
|
|
93
|
+
} catch {
|
|
94
|
+
return []; // fail-safe — 판정 실패가 커밋을 막지 않는다
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** 차단 메시지 — 이유 없는 차단은 우회된다. 무엇을·왜·대안을 함께 낸다 */
|
|
99
|
+
export function formatEphemeralBlock(paths) {
|
|
100
|
+
return [
|
|
101
|
+
`[EPHEMERAL] 일회성 경로를 커밋하려 한다: ${paths.join(', ')}`,
|
|
102
|
+
` ${EPHEMERAL_DIR}/ 는 생성·실행 후 폐기되는 코드의 자리다. 품질 게이트를 면제받는 대신`,
|
|
103
|
+
' 커밋되지 않는다 — 면제받은 코드가 배포되면 그 면제가 곧 구멍이 된다.',
|
|
104
|
+
' 남겨야 하는 코드라면 이 경로 밖으로 옮기고 평소 게이트를 통과시켜라.',
|
|
105
|
+
].join('\n');
|
|
106
|
+
}
|