commitgate 0.4.0 → 0.8.0
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/AGENTS.template.md +8 -0
- package/CHANGELOG.md +154 -0
- package/README.en.md +187 -20
- package/README.md +187 -20
- package/bin/commitgate.mjs +15 -6
- package/bin/dispatch.d.mts +6 -0
- package/bin/dispatch.mjs +38 -0
- package/bin/init.ts +965 -84
- package/bin/migrate.ts +244 -0
- package/bin/uninstall.ts +48 -1
- package/package.json +73 -69
- package/req.config.json.sample +3 -0
- package/scripts/req/lib/adapters.ts +56 -8
- package/scripts/req/lib/config.ts +55 -0
- package/scripts/req/lib/porcelain.ts +104 -0
- package/scripts/req/lib/scratch.ts +104 -0
- package/scripts/req/req-commit.ts +21 -7
- package/scripts/req/req-doctor.ts +135 -31
- package/scripts/req/req-new.ts +94 -15
- package/scripts/req/req-next.ts +94 -17
- package/scripts/req/review-codex.ts +851 -94
- package/scripts/verify-review-overrides.mjs +96 -0
- package/skills/ATTRIBUTION.md +85 -0
- package/skills/commitgate-diagnosing-bugs/SKILL.md +149 -0
- package/skills/commitgate-discovery/SKILL.md +93 -0
- package/skills/commitgate-research/SKILL.md +85 -0
- package/skills/commitgate-tdd/SKILL.md +113 -0
- package/templates/CLAUDE.template.md +2 -1
- package/templates/claude-command.md +5 -2
- package/templates/claude-skill.md +4 -1
- package/templates/cursor-rule.mdc +5 -2
- package/templates/workflow.gitignore +8 -0
- package/workflow/machine.schema.json +10 -1
- package/workflow/req.config.schema.json +90 -10
- package/workflow/review-persona.md +56 -1
package/AGENTS.template.md
CHANGED
|
@@ -46,6 +46,14 @@
|
|
|
46
46
|
|
|
47
47
|
> PR을 생략할 수 있다는 것과, 우회를 보고하지 않아도 된다는 것은 다르다. 경로는 선택이지만 **투명성은 선택이 아니다.**
|
|
48
48
|
|
|
49
|
+
### 6. 리뷰 전 staged 내용 확인 (외부 전송)
|
|
50
|
+
|
|
51
|
+
`req:review-codex`는 `git diff --cached` **전문**을 Codex(OpenAI)로 전송한다. codex는 `--sandbox read-only`로 저장소 루트를 읽으므로 diff에 없는 파일(`.env` 등)도 읽힐 수 있다. 마스킹·스크러빙·길이 상한은 **없다.**
|
|
52
|
+
|
|
53
|
+
- 리뷰를 실행하기 전에 staged 내용에 자격증명·토큰·개인정보가 없는지 확인한다.
|
|
54
|
+
- 민감 코드베이스(결제·인증·개인정보)라면 이 확인을 생략하지 않는다. 확인 없이 리뷰를 돌리지 않는다.
|
|
55
|
+
- 이 절은 도구가 강제하지 않는다. **Builder의 의무다.**
|
|
56
|
+
|
|
49
57
|
## 사람에게 보고해야 할 때
|
|
50
58
|
|
|
51
59
|
각 통제점은 **고유한 승인 문장**을 가진다. 그 문장 그대로 승인받지 못했으면 실행하지 않는다.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
이 프로젝트는 [Semantic Versioning](https://semver.org/lang/ko/)을 따릅니다.
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## 0.8.0
|
|
8
|
+
|
|
9
|
+
리뷰 루프 수렴 안정화와 design delta review가 핵심입니다. 모두 `0.7.0` 설치 모델 위의 **추가 기능**이라 기존
|
|
10
|
+
사용자는 별도 조치가 필요 없습니다 — 패키지를 업그레이드한 뒤 `commitgate init`으로 갱신된 관리 자산을 받습니다.
|
|
11
|
+
|
|
12
|
+
### Companion Skills
|
|
13
|
+
|
|
14
|
+
- **Companion Skills 추가 및 lifecycle 문서화** — `commitgate init`이 `.claude/skills/commitgate-*/SKILL.md` 4종
|
|
15
|
+
(`discovery`·`tdd`·`diagnosing-bugs`·`research`)을 함께 설치합니다. 설치·보존·경고·제거 계획·지원 범위는
|
|
16
|
+
[README](README.md#companion-skills) / [README (English)](README.en.md#companion-skills)를 참조하세요.
|
|
17
|
+
- **`init` 쓰기 경로 symlink confinement** — 설치 대상 전 경로에서 상위 디렉터리·leaf를 `lstat`으로 검사해
|
|
18
|
+
대상 루트 밖을 가리키는 symlink를 따라가지 않습니다(우발적 symlink로 인한 외부 파일 생성·덮어쓰기 차단).
|
|
19
|
+
|
|
20
|
+
### 리뷰 루프 수렴 안정화
|
|
21
|
+
|
|
22
|
+
- **리뷰 시도 계수·예산 게이트** — `(review_kind, phase_id)`별 review series로 시도를 계수하고, 자동 예산
|
|
23
|
+
(`reviewBudget.autoBudget`, 기본 5)을 넘으면 사람 예외 손기록이 있어야 진행, 하드캡(`reviewBudget.hardCap`,
|
|
24
|
+
기본 8)에서 완전 차단합니다. `req.config.json`의 `reviewBudget`로 조정합니다 — 무한 재리뷰 루프를 막습니다.
|
|
25
|
+
- **리뷰 배칭** — 한 라운드에서 여러 P1을 함께 반환하도록 유도해 라운드 수를 줄입니다.
|
|
26
|
+
- **대체 REQ lineage** — 미수렴 REQ를 사람 결정(`human-resolution`)으로 종료하고 `req:new --successor-of <REQ>`로
|
|
27
|
+
부모 이력을 보존한 대체 REQ를 만듭니다.
|
|
28
|
+
|
|
29
|
+
### Design delta review
|
|
30
|
+
|
|
31
|
+
- **design 재리뷰가 delta로 동작** — 승인된 설계 baseline 이후 **변경된 문서만** 심사하도록 리뷰 프롬프트를
|
|
32
|
+
구성합니다. 변경 문서는 `[변경됨]`, 미변경 문서는 `[승인 baseline]`으로 표시하고, "변경분·직접 영향만 심사,
|
|
33
|
+
승인 영역 재심사 금지" 계약을 리뷰어에게 겁니다. 미변경 문서 본문은 생략해 토큰을 절감합니다 — 승인 후
|
|
34
|
+
작은 편집이 전체 재리뷰를 유발해 승인이 되돌려지던 문제를 줄입니다.
|
|
35
|
+
- **full review escalation** — 변경이 너무 근본적이라 delta로 판단할 수 없으면 리뷰어가 `full_review_requested`로
|
|
36
|
+
전체 재리뷰를 요청할 수 있습니다(다음 라운드가 full 모드로 전환). `reviewPersonaPath: null`이어도 delta
|
|
37
|
+
design 리뷰에는 내장 delta 계약이 주입됩니다.
|
|
38
|
+
|
|
39
|
+
### 기타
|
|
40
|
+
|
|
41
|
+
- **ISO 타임스탬프 달력 검증** — 손기록·evidence의 ISO 타임스탬프를 형식뿐 아니라 달력 유효성까지 검사합니다
|
|
42
|
+
(`2026-99-99T…` 같은 달력상 불가능한 값을 거부).
|
|
43
|
+
|
|
44
|
+
## 0.7.0
|
|
45
|
+
|
|
46
|
+
**설치 모델이 바뀝니다 — 기존 사용자는 조치가 필요합니다.** 실행 코드와 런타임 의존성을 대상 프로젝트에 복사·주입하지 않고, `commitgate` 패키지에서 실행합니다. 프로젝트에는 거버넌스·감사 데이터만 남습니다.
|
|
47
|
+
|
|
48
|
+
> **npm 배포 이력**: `0.5.0`·`0.6.0`은 npm에 배포되지 않았습니다. `0.4.0` 다음 릴리스가 `0.7.0`이며, 아래 `0.5.0`·`0.6.0` 항목의 변경도 **전부 `0.7.0`에 포함**됩니다.
|
|
49
|
+
|
|
50
|
+
### ⚠️ Breaking
|
|
51
|
+
|
|
52
|
+
- **설치가 2단계가 됩니다.** `npx commitgate` 단독 실행으로는 더 이상 설치되지 않습니다.
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
npm install -D commitgate # 1) 런타임이 node_modules/commitgate 에 들어옵니다
|
|
56
|
+
npx commitgate init # 2) 설정·계약·스키마와 req:* 스크립트를 깝니다
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`init`은 대상 `package.json`에 `devDependencies.commitgate` 선언이 없으면 **중단**합니다 — `req:*`가 가리킬 런타임이 없기 때문입니다. 선언의 **존재만** 확인하고 값 형태는 검증하지 않습니다(`file:`·`link:`·`workspace:`·git URL 전부 정당한 설치 형태입니다).
|
|
60
|
+
|
|
61
|
+
- **`scripts/req/**`를 복사하지 않습니다.** 실행 코드는 `node_modules/commitgate`에만 있습니다.
|
|
62
|
+
- **`tsx`·`ajv`·`cross-spawn`을 대상 `package.json`에 주입하지 않습니다.** 이들은 `commitgate` 패키지의 runtime dependency로 전이 설치됩니다.
|
|
63
|
+
- **`req:*` 스크립트 값이 `commitgate <verb>`가 됩니다**(예: `req:new` → `commitgate req:new`). `npm run req:new -- <slug>` UX와 인자 전달은 그대로입니다.
|
|
64
|
+
|
|
65
|
+
### 기존 설치본(0.6.0 이하)에서 옮겨오기
|
|
66
|
+
|
|
67
|
+
기존 프로젝트에는 `scripts/req/`가 복사돼 있고 `req:*`가 `tsx scripts/req/*.ts`를 가리킵니다. `init`은 이 상태를 감지하면 조용히 섞이지 않도록 **중단하고** `migrate`를 안내합니다.
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
npm install -D commitgate
|
|
71
|
+
npx commitgate migrate # 계획만 출력 — 아무것도 쓰지 않습니다
|
|
72
|
+
npx commitgate migrate --apply # package.json 의 req:* 만 전환
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- **아무것도 삭제하지 않습니다.** `scripts/req/`·스키마·persona·설정·진입점·`workflow/REQ-*` 증거를 전부 그대로 둡니다. 남은 `scripts/req/`는 더 이상 실행되지 않으니, 정리하려면 `npx commitgate uninstall` 계획을 먼저 확인하세요.
|
|
76
|
+
- **직접 고친 스크립트는 덮어쓰지 않습니다.** 값이 **정확히** 기존 주입값일 때만 전환하고, 한 글자라도 다르면 사용자 값으로 보아 보존한 뒤 수동 조치를 안내합니다.
|
|
77
|
+
- **커밋하지 않습니다.** `package.json` 한 파일만 쓰고, 검토는 사용자 몫입니다.
|
|
78
|
+
|
|
79
|
+
### 추가
|
|
80
|
+
|
|
81
|
+
- **`commitgate migrate`** — 위 비파괴 전환 명령. 기본 dry-run.
|
|
82
|
+
- **`req:doctor` D19 — 설치 모드 진단.** `req:*` 값의 **형태만**으로 예전(vendored)/현재(런타임 패키지)/혼합/없음/사용자정의를 분류합니다. 혼합일 때만 WARN하며 **FAIL하지 않습니다** — 예전 설치 형태는 결함이 아니라 지원되는 상태이고, `req:commit`이 doctor를 하드 게이트로 실행하므로 FAIL로 두면 정당한 프로젝트의 커밋이 막힙니다. manifest·lockfile·`node_modules`·버전은 검증하지 않습니다.
|
|
83
|
+
- **verb dispatch** — `commitgate <verb>`가 패키지 내부 모듈로 라우팅됩니다. `npx commitgate --dry-run` 같은 기존 옵션 형태는 그대로 `init`으로 갑니다(하위호환).
|
|
84
|
+
- **`uninstall`에 런타임 제거 안내 추가** — `npm uninstall -D commitgate`. 이 명령은 여전히 **읽기 전용**이며 안내를 문자열로 출력만 합니다(npm을 실행하지 않습니다).
|
|
85
|
+
|
|
86
|
+
### 지원 범위
|
|
87
|
+
|
|
88
|
+
- **npm** — 완전 지원. 매 릴리스 packed tarball smoke로 검증합니다.
|
|
89
|
+
- **pnpm·yarn**(`node_modules` linker) — 지원. 표준 `node_modules/.bin/commitgate` 해소를 씁니다.
|
|
90
|
+
- **Yarn PnP** — **이번 릴리스 미지원**(검증하지 않았습니다). `nodeLinker: node-modules`를 쓰세요.
|
|
91
|
+
- **workspace/monorepo** — 워크스페이스 root 설치를 지원합니다. 하위 패키지 독립 설치는 미지원.
|
|
92
|
+
- 런타임 버전은 lockfile이 고정하므로 `package-lock.json`(pnpm/yarn은 각 lockfile)을 **커밋하세요**.
|
|
93
|
+
|
|
94
|
+
### 알려진 한계
|
|
95
|
+
|
|
96
|
+
- **관리 자산(스키마·persona)과 런타임 패키지의 버전 skew를 자동으로 감지하지 못합니다.** `npm update commitgate`는 런타임만 올리고 자산은 그대로 둡니다. D19는 스크립트 형태만 보므로 이 축을 잡지 못합니다. 자산 업그레이드·3-way merge는 이번 범위가 아닙니다.
|
|
97
|
+
|
|
98
|
+
## 0.6.0
|
|
99
|
+
|
|
100
|
+
리뷰 codex 호출을 도구가 통제합니다 — **모델·추론강도를 고정**하고 **재리뷰를 stateless**로. 다운스트림에서 리뷰가 사용자 전역 프로필을 상속해 느리고(11~13분) 토큰이 많던 문제를 해결합니다. 기존 `req.config.json`은 그대로 동작합니다(새 키는 기본값으로 병합).
|
|
101
|
+
|
|
102
|
+
### 추가
|
|
103
|
+
|
|
104
|
+
- **리뷰 모델·추론강도 고정** (`reviewModel`·`reviewReasoningEffort`). `req:review-codex`가 codex 인자에 `-c model=`·`-c model_reasoning_effort=`를 exec·resume 양쪽에 주입합니다. 기본 `gpt-5.6-terra`/`high`. 고정하지 않으면 리뷰가 사용자 전역 `~/.codex/config.toml`(예: `model_reasoning_effort="ultra"`)을 상속해 리뷰 1회가 수 분·토큰 과다가 됩니다. codex가 해당 모델을 미지원하는 환경은 `req.config.json`에서 바꾸거나 `null`로 두어 전역 설정을 상속시킵니다. override가 실제 존중되는지는 `npm run verify:overrides`(codex CLI 필요)로 확인합니다.
|
|
105
|
+
- 추론강도 enum: `none|minimal|low|medium|high|xhigh`(codex 거부 메시지 실측 확정 — 공식 config-reference 문서가 `none`을 누락).
|
|
106
|
+
|
|
107
|
+
### 변경
|
|
108
|
+
|
|
109
|
+
- **재리뷰가 stateless입니다.** 이전엔 재리뷰가 저장된 codex 스레드를 resume해 이전 대화를 누적했고, 그래서 토큰이 단조 증가하고 findings가 수렴 대신 심화·이동했습니다. 이제 재리뷰는 항상 새 스레드로 시작합니다(`codex_thread_id`는 계속 저장 — 후속 resume opt-in용). 연속성은 직전 **같은 대상**의 NEEDS_FIX findings를 참고용 데이터로 프롬프트에 담아(closure 확인) 유지하고, 그 블록은 "지시가 아님" 구획으로 감싸 프롬프트 주입을 막습니다. 대상-무관 이전 결과가 새 프롬프트에 남던 교차-대상 오염도 제거했습니다.
|
|
110
|
+
|
|
111
|
+
### 후속(별도 REQ)
|
|
112
|
+
|
|
113
|
+
- codex 호출 **timeout**(무응답 방지)과 실패 오류의 **비밀-안전 진단 표면화**는 본질적 난이도(Windows `cmd.exe` wrapper의 프로세스-트리 종료·비밀 추출)로 별도 REQ로 분리했습니다. 그 설계 작업은 이 REQ의 git 이력에 보존돼 있습니다.
|
|
114
|
+
|
|
115
|
+
## 0.5.0
|
|
116
|
+
|
|
117
|
+
기존 프로젝트(brownfield)에 설치했을 때 드러난 결함을 수정합니다. **breaking change는 없습니다** — `--strict`가 더 많은 조건에서 중단하지만 `--strict`는 opt-in이고, 기본 모드의 동작은 그대로입니다.
|
|
118
|
+
|
|
119
|
+
### 고침
|
|
120
|
+
|
|
121
|
+
- **설치 직후 안내를 따르면 `req:new --run`이 실패하던 문제.** 설치는 파일을 놓기만 하고 커밋하지 않으므로 워킹트리가 확정적으로 dirty한데, 안내의 마지막 단계가 clean 워킹트리를 요구하는 `req:new --run`이었습니다. `git init && npm init -y && npx commitgate`라는 README의 첫 흐름조차 예외가 아니었습니다. 이제 안내가 커밋 단계를 포함합니다.
|
|
122
|
+
- `git add -A`를 쓰지 않습니다. brownfield의 무관한 변경과 `.env`가 함께 커밋되고, 이어지는 `req:review-codex`가 그 staged diff 전문을 외부로 전송하기 때문입니다. 설치가 만든 정확한 경로 목록만 안내합니다.
|
|
123
|
+
- 안내 명령에 `&&`를 쓰지 않습니다. Windows PowerShell 5.1과 `cmd.exe`에 그 연산자가 없습니다.
|
|
124
|
+
- `<pm> install`이 갱신하는 lockfile과, 계약 마커가 없을 때 생성되는 `AGENTS.commitgate.md`를 stage 목록에 포함합니다. 빠뜨리면 커밋 뒤에도 워킹트리가 dirty로 남습니다.
|
|
125
|
+
- 설치 전부터 있던 무관한 변경은 `git stash push -u -- <경로>`로 안내합니다. 경로 없는 `git stash -u`는 gitignore되지 않은 `node_modules/`까지 쓸어 갑니다.
|
|
126
|
+
- 설치 전에 **staged 변경**이 있거나 **산출물과 겹치는 tracked 수정**이 있으면 `git add` 목록을 내지 않습니다. 전자는 커밋이 삼키고 후자는 사후 분리가 불가능합니다. 잘못된 안내보다 안내 없음이 낫습니다.
|
|
127
|
+
- `node_modules`가 무시되지 않으면 `.gitignore` 추가를 안내하고 그 파일을 설치 커밋에 담습니다. 무시 규칙은 **tracked 저장소 `.gitignore`**에서 온 것만 인정합니다 — `.git/info/exclude`와 전역 ignore는 clone에 따라오지 않습니다.
|
|
128
|
+
- 경로에 공백이 있으면 큰따옴표로 묶습니다. 큰따옴표·백틱·`$`·`%`·`!`가 든 경로는 어떤 셸 인용으로도 안전하지 않으므로 복붙 명령을 아예 내지 않습니다 — `cmd.exe`는 큰따옴표 안에서도 `%VAR%`와 `!VAR!`를 치환합니다.
|
|
129
|
+
- `git status --porcelain`이 C-인용해 주는 경로(`"notes today.txt"`)를 되돌립니다. 되돌리지 않으면 산출물 매칭이 실패하고 안내가 이중 인용을 냅니다.
|
|
130
|
+
|
|
131
|
+
- **`.claude`를 통짜로 무시하는 repo에서 진입점이 조용히 추적 제외되던 문제.** 설치는 "성공"을 출력했지만 팀원의 fresh clone과 CI에는 계약 포인터가 없었습니다. 이제 `git check-ignore`로 감지해 경고하고, 동작하는 `.gitignore` 패턴을 제시합니다(부모 디렉터리가 제외되면 하위 부정 패턴이 무효라는 함정 포함). `--strict`에서는 파일을 하나도 쓰기 전에 중단합니다.
|
|
132
|
+
|
|
133
|
+
- **진입점 템플릿이 `npm run …`을 하드코딩하던 문제.** pnpm/yarn 프로젝트에 틀린 명령이 깔렸습니다. 이제 계약(`AGENTS.md`)과 같은 pm-중립 표기를 씁니다. 치환 렌더링은 쓰지 않습니다 — `uninstall`이 설치본과 패키지 원본의 sha256을 비교하므로, 렌더하면 자기가 깐 파일을 지우지 못합니다.
|
|
134
|
+
|
|
135
|
+
- **런타임 문구의 pm 리터럴.** `req:next`는 npm을, `req:new`·`req:doctor`·`req:review-codex`는 pnpm을 박아 두어 어느 프로젝트에서든 최소 하나는 틀렸습니다. config 로드 이후의 안내·에러는 이제 감지한 패키지매니저로 렌더합니다.
|
|
136
|
+
|
|
137
|
+
- **`--`를 "알 수 없는 옵션"으로 거부하던 문제.** npm은 `npm run x -- a`에서 `--`를 제거하지만 pnpm/yarn은 그대로 전달합니다. 이제 POSIX end-of-options 구분자로 흡수합니다. `--` 이후 인자도 계속 옵션으로 파싱하므로 `req:commit <id> -- --run`이 조용히 dry-run이 되지 않습니다.
|
|
138
|
+
|
|
139
|
+
- **`uninstall`이 skip한 사용자 파일을 소유물로 오인하던 경로.** stage 목록은 패키지 원본과 byte-identical한 파일만 CommitGate 소유로 봅니다.
|
|
140
|
+
|
|
141
|
+
### 새로 알림
|
|
142
|
+
|
|
143
|
+
- `README`와 `AGENTS.template.md`에 **`req:review-codex`가 `git diff --cached` 전문을 Codex(OpenAI)로 전송한다**는 사실을 명시했습니다. codex는 `--sandbox read-only`로 저장소 루트를 읽으며, 마스킹·필터·길이 상한이 없습니다.
|
|
144
|
+
- **git hook을 설치하지 않으므로 `git commit`을 직접 치면 게이트가 우회된다**는 점도 README 상단에 명시했습니다. 이 도구의 강제력은 협조하는 에이전트를 계약 궤도에 유지하는 데 있습니다.
|
|
145
|
+
|
|
146
|
+
### 아직 하지 않은 것
|
|
147
|
+
|
|
148
|
+
- 트렁크 브랜치가 `'main'`으로 하드코딩되어 있습니다(`trunkBranch` config 없음).
|
|
149
|
+
- `req:review-codex`에 타임아웃이 없습니다.
|
|
150
|
+
- 리뷰 전 시크릿 스캔 훅(`preReviewCommand`)이 없습니다.
|
|
151
|
+
|
|
152
|
+
## 0.4.0 이전
|
|
153
|
+
|
|
154
|
+
`git log`를 참조하세요.
|
package/README.en.md
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
AI coding agents can move quickly, but unreviewed changes should not go straight into your history. CommitGate wraps each change in a REQ ticket and only allows the staged tree approved by Codex to be committed. If the code changes after approval, or if evidence is missing, it fails closed.
|
|
8
8
|
|
|
9
|
+
> **⚠️ Two things to know before you start.**
|
|
10
|
+
>
|
|
11
|
+
> 1. **Review sends your staged diff off-machine.** `req:review-codex` passes the **entire** `git diff --cached` to Codex (OpenAI). Codex reads your repository root under `--sandbox read-only`, so files outside the diff can be read too. There is **no** masking, filtering, or size cap. Check the staged content for credentials, tokens, and personal data before running a review.
|
|
12
|
+
> 2. **No git hook is installed.** Running `git commit` directly instead of `req:commit` bypasses the gate, the approval binding, and the evidence trail. CommitGate's enforcement keeps a **cooperating agent on the contract's rails** — it is not a barrier against a human going around it.
|
|
13
|
+
|
|
9
14
|
[](https://github.com/sol5288/commitgate/actions/workflows/ci.yml)
|
|
10
15
|
[](https://www.npmjs.com/package/commitgate)
|
|
11
16
|
[](./LICENSE)
|
|
@@ -21,19 +26,38 @@ Run this from your project root. The project must be a **git repository with a `
|
|
|
21
26
|
git init
|
|
22
27
|
npm init -y
|
|
23
28
|
|
|
24
|
-
#
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
# 1) Install CommitGate as a devDependency — this is where the runtime lives:
|
|
30
|
+
npm install -D commitgate
|
|
31
|
+
|
|
32
|
+
# 2) Add config, contract, schemas, and the req:* scripts to your project:
|
|
33
|
+
npx commitgate init
|
|
34
|
+
|
|
27
35
|
codex --version
|
|
28
36
|
codex login status
|
|
29
37
|
```
|
|
30
38
|
|
|
39
|
+
> **Why two steps?** CommitGate does **not** copy its runtime code into your project. Step 1 puts the runtime in `node_modules/commitgate`; step 2 adds only **governance assets** (config, contract, schemas, persona) plus `req:* = commitgate <verb>` scripts.
|
|
40
|
+
> That means updating is a single `npm update commitgate`, and removing the runtime is `npm uninstall -D commitgate`.
|
|
41
|
+
> `init` **stops** if `devDependencies.commitgate` is not declared — there would be no runtime for `req:*` to point at.
|
|
42
|
+
|
|
43
|
+
Installation writes files but never commits them. `req:new` **requires a clean working tree**, so commit the scaffold first. The installer's `다음:` (next steps) output prints the exact paths to stage.
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
git add -- <the paths the installer printed>
|
|
47
|
+
git status # confirm only what you intended is staged
|
|
48
|
+
git commit -m "chore: install commitgate"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
> **Do not stage everything (`-A` / `.`).** Unrelated changes and untracked files such as `.env` would be swept into the commit, and the next `req:review-codex` transmits that staged diff in full to an external service.
|
|
52
|
+
> Park any changes that predate the install **by pathspec** after the install commit: `git stash push -u -- <paths>`.
|
|
53
|
+
> Without `-u`, untracked files remain and `req:new` stays blocked; without the pathspec, a bare `git stash -u` also sweeps up directories that are not ignored, such as `node_modules/`. The installer prints that path list too.
|
|
54
|
+
|
|
31
55
|
**You do not paste a long prompt.** Installation lays down agent entrypoints for you.
|
|
32
56
|
|
|
33
57
|
| File | Read by |
|
|
34
58
|
|---|---|
|
|
35
59
|
| `AGENTS.md` | Codex CLI, Cursor — **the contract** |
|
|
36
|
-
| `.claude/skills/commitgate/SKILL.md` | Claude Code (auto-
|
|
60
|
+
| `.claude/skills/commitgate/SKILL.md` | Claude Code (auto-discovered — the model decides whether to use it) |
|
|
37
61
|
| `.claude/commands/req.md` | Claude Code (`/req` explicit call) |
|
|
38
62
|
| `.cursor/rules/commitgate.mdc` | Cursor (`alwaysApply`) |
|
|
39
63
|
| `CLAUDE.md` | Claude Code (always loaded) — created only if absent |
|
|
@@ -93,7 +117,7 @@ Repeat this loop without stopping and it drives design → Codex review → impl
|
|
|
93
117
|
|
|
94
118
|
`req:review-codex` puts `workflow/review-persona.md` in as the **first block** of the prompt. It is identical whether a human, Cursor, or Claude runs the command — it does not live where an agent can forget it. If the file is missing or empty, the review stops fail-closed.
|
|
95
119
|
|
|
96
|
-
Edit it for your project, or point `reviewPersonaPath` in `req.config.json` at a different file. Set it to `null` to disable.
|
|
120
|
+
Edit it for your project, or point `reviewPersonaPath` in `req.config.json` at a different file. Set it to `null` to disable — but **delta design reviews still inject the built-in delta contract** (the contract that tells the reviewer to re-check only what changed since the approved baseline, so it is attached regardless of the configured persona).
|
|
97
121
|
|
|
98
122
|
Both integration paths are valid: **through a PR (optional)** and **direct push**. A PR is not mandatory. But a direct push to a protected branch **bypasses the required status checks**, so it needs a separate "branch protection bypass를 사용한 direct push 승인" — holding bypass permission is not approval. In that case CI runs **after** the push, so its green is post-hoc verification, and the agent must not omit that from its report. tag, npm publish, and GitHub release are control points of their own, requested after CI is green and never bundled with the integration approval. See [AGENTS.template.md](AGENTS.template.md) and [docs/RELEASING.md](docs/RELEASING.md) for the full contract.
|
|
99
123
|
|
|
@@ -114,24 +138,91 @@ CommitGate is designed to block **unreviewed changes from being committed**, not
|
|
|
114
138
|
|
|
115
139
|
In short: **approved changes pass, ambiguous changes stop.**
|
|
116
140
|
|
|
141
|
+
### What It Does *Not* Enforce
|
|
142
|
+
|
|
143
|
+
So that you do not miscalculate where your real defenses are:
|
|
144
|
+
|
|
145
|
+
- **This is not hard enforcement.** No git hook is installed, so running `git commit` directly instead of `req:commit` bypasses doctor, the approval binding, and the evidence trail. Your real defense for production is still CI and the deployment pipeline.
|
|
146
|
+
- **It does not keep your staged content secret.** `req:review-codex` transmits the full `git diff --cached` to Codex (OpenAI), and codex reads the repository root under `--sandbox read-only`. There is no masking, scrubbing, or size cap. For payment or credential-bearing codebases, write a "inspect the staged diff before review" step into your contract (`AGENTS.md`).
|
|
147
|
+
- **It does not guarantee anything after the commit.** Approval binds the staged tree at commit time; merge, tag, and publish are each separate control points.
|
|
148
|
+
|
|
117
149
|
---
|
|
118
150
|
|
|
119
151
|
## What Installation Adds
|
|
120
152
|
|
|
121
|
-
`npx commitgate` adds the following to the target project. Existing files are not overwritten by default.
|
|
153
|
+
`npx commitgate init` adds the following to the target project. Existing files are not overwritten by default.
|
|
122
154
|
|
|
123
155
|
| Added item | Purpose |
|
|
124
156
|
|---|---|
|
|
125
|
-
| `scripts/req/` | `req:new`, `req:next`, `req:review-codex`, `req:doctor`, `req:commit` scripts |
|
|
126
157
|
| `workflow/*.schema.json` | Schemas for Codex responses and config |
|
|
127
|
-
| `workflow/review-persona.md` | Reviewer persona injected into the Codex review prompt |
|
|
158
|
+
| `workflow/review-persona.md` | Reviewer persona injected into the Codex review prompt (created only if absent) |
|
|
128
159
|
| `req.config.json` | Project-level configuration |
|
|
129
160
|
| `AGENTS.md` | The contract (created only if absent) |
|
|
130
161
|
| `CLAUDE.md` | Claude Code pointer (created only if absent) |
|
|
131
162
|
| `.claude/skills/commitgate/SKILL.md` | Claude Code skill (pointer) |
|
|
132
163
|
| `.claude/commands/req.md` | `/req` slash command (pointer) |
|
|
133
164
|
| `.cursor/rules/commitgate.mdc` | Cursor rule (pointer) |
|
|
134
|
-
|
|
|
165
|
+
| `.claude/skills/commitgate-*/SKILL.md` | **Companion Skills** — four of them, see below (existing files preserved) |
|
|
166
|
+
| `package.json` scripts | `req:new`·`req:next`·`req:review-codex`·`req:doctor`·`req:commit` = `commitgate <verb>` (missing keys only) |
|
|
167
|
+
|
|
168
|
+
### Companion Skills
|
|
169
|
+
|
|
170
|
+
CommitGate is a **governance layer** — `req:next` computes the next action, and review/approval/evidence gate the commit.
|
|
171
|
+
What was missing was **method**: how to sharpen a vague request, how to write the test first, how to corner a bug.
|
|
172
|
+
Four skills, adapted from Matt Pocock's public skills (MIT) to fit CommitGate's authority boundaries, ship with it.
|
|
173
|
+
|
|
174
|
+
| Skill | When |
|
|
175
|
+
|---|---|
|
|
176
|
+
| `commitgate-discovery` | **Before** `req:new` — turn a vague request into a REQ Brief. **User-invoked** |
|
|
177
|
+
| `commitgate-tdd` | When `req:next` returns `AGENT` — Red → Green → Refactor → stage |
|
|
178
|
+
| `commitgate-diagnosing-bugs` | Bugs, regressions, perf — feedback loop → reproduce/minimise → hypothesise → instrument → fix |
|
|
179
|
+
| `commitgate-research` | External technology choices — primary sources, findings with citations and limits |
|
|
180
|
+
|
|
181
|
+
**Auto-discovered, model-invoked.** The harness **discovers** skills automatically, but **the model decides**
|
|
182
|
+
whether to use one — that is probabilistic, so don't expect a skill to always fire. In Claude Code you can also
|
|
183
|
+
invoke one directly with `/commitgate-<name>`. On other harnesses, use whatever invocation that harness offers,
|
|
184
|
+
or follow the entry flow in `AGENTS.md`.
|
|
185
|
+
|
|
186
|
+
**Suggested flow**: `commitgate-discovery` to sharpen the request → `/req` (Claude Code) or the `AGENTS.md` entry
|
|
187
|
+
flow → `req:new` → repeat `req:next`.
|
|
188
|
+
|
|
189
|
+
#### Boundaries — read this
|
|
190
|
+
|
|
191
|
+
- 🔴 **`AGENTS.md` is the contract.** Skills carry **method**, not contract.
|
|
192
|
+
Without the skills installed, the **core workflow behaves identically**.
|
|
193
|
+
- 🔴 **Skill output is not approval evidence.** Neither a companion skill's output nor the result of running
|
|
194
|
+
Matt's external skills separately is **approval evidence** for CommitGate or Codex. Running the review, judging
|
|
195
|
+
approval, transitioning state, and committing are **CommitGate's alone**, and `req:next` is the authority on
|
|
196
|
+
what comes next.
|
|
197
|
+
- Skills are **cooperative text** — a skill doesn't block a commit; CommitGate's gate does.
|
|
198
|
+
|
|
199
|
+
#### Install, preservation, options
|
|
200
|
+
|
|
201
|
+
- **`--no-agent-entrypoints`**: skips the whole `.claude/` layer (including the four companion skills).
|
|
202
|
+
- **Existing files preserved (seed-once)**: skills are **meant to be edited**. A skill you modified is
|
|
203
|
+
**not overwritten, even with `--force`.** `AGENTS.md`, `CLAUDE.md`, and `workflow/.gitignore` follow the same policy.
|
|
204
|
+
- **gitignore warning**: if `.claude/` is gitignored, the skills never reach a teammate's fresh clone.
|
|
205
|
+
Install still proceeds, but CommitGate **warns** and tells you how to track them. **`--strict` stops before installing.**
|
|
206
|
+
- **Coexists with third-party skills**: third-party `tdd`, `grill-me`, etc. live at `.claude/skills/<name>/`, companions at
|
|
207
|
+
`.claude/skills/commitgate-<name>/` — **different paths, so neither touches the other.**
|
|
208
|
+
|
|
209
|
+
#### Attribution
|
|
210
|
+
|
|
211
|
+
Adapted from Matt Pocock's MIT-licensed public skills at baseline SHA `d574778f94cf620fcc8ce741584093bc650a61d3`
|
|
212
|
+
and **included as package payload**. CommitGate **does not run or depend on any external skill installer** at
|
|
213
|
+
runtime — these are pinned copies inside the package. Each SKILL.md carries the full MIT notice; see
|
|
214
|
+
`skills/ATTRIBUTION.md` in the package for details.
|
|
215
|
+
|
|
216
|
+
### What it does **not** install
|
|
217
|
+
|
|
218
|
+
| Item | Where it lives instead |
|
|
219
|
+
|---|---|
|
|
220
|
+
| `scripts/req/**` runtime code | `node_modules/commitgate` — never copied into your project |
|
|
221
|
+
| `tsx` · `ajv` · `cross-spawn` | runtime dependencies of the `commitgate` package — never injected into your `package.json` |
|
|
222
|
+
|
|
223
|
+
What stays in your project is **governance and audit data** only: config, contract, schemas, persona, and `workflow/REQ-*` evidence. Because the runtime lives in the package, `npm update commitgate` updates it in one step and vendored copies cannot drift.
|
|
224
|
+
|
|
225
|
+
The `req:*` scripts call the installed package bin — `npm run req:new -- <slug>` → `commitgate req:new <slug>` → `node_modules/.bin/commitgate`.
|
|
135
226
|
|
|
136
227
|
The entrypoint files are **thin pointers**. The contract itself lives only in `AGENTS.md`.
|
|
137
228
|
|
|
@@ -149,21 +240,87 @@ Preview without writing files:
|
|
|
149
240
|
npx commitgate --dry-run
|
|
150
241
|
```
|
|
151
242
|
|
|
152
|
-
Treat
|
|
243
|
+
Treat integrity warnings as an install failure:
|
|
153
244
|
|
|
154
245
|
```sh
|
|
155
246
|
npx commitgate --strict
|
|
156
247
|
```
|
|
157
248
|
|
|
158
|
-
|
|
249
|
+
CommitGate stops **before writing any file** if a contract pointer would be swallowed by `.gitignore`, if the `workflow/.gitignore` policy file would not reach a fresh clone, if the working tree makes a safe install commit impossible, or if an existing `cross-spawn` is below the verified floor.
|
|
250
|
+
|
|
251
|
+
> `--strict` also treats the `package.json`/lockfile changes left by the required `npm install -D commitgate` as pre-existing dirt. Recommended order: `npm i -D commitgate` → **commit** → `npx commitgate init --strict` → commit the scaffold.
|
|
159
252
|
|
|
160
253
|
> `workflow/machine.schema.json` and `workflow/req.config.schema.json` are always copied under `workflow/`, regardless of the `ticketRoot` setting in `req.config.json`.
|
|
161
254
|
|
|
162
255
|
---
|
|
163
256
|
|
|
257
|
+
## Migrating from an older install (`migrate`)
|
|
258
|
+
|
|
259
|
+
If `scripts/req/` is copied into your project and `req:*` points at `tsx scripts/req/*.ts`, you have an **older (vendored) install**. `init` detects this and **stops** rather than creating a silent mix, pointing you here.
|
|
260
|
+
|
|
261
|
+
```sh
|
|
262
|
+
npm install -D commitgate # first, if it is not a devDependency yet
|
|
263
|
+
npx commitgate migrate # plan only — writes nothing
|
|
264
|
+
npx commitgate migrate --apply # rewrites only the req:* scripts in package.json
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
`migrate` does exactly **one** thing: it rewrites the `req:*` keys **whose current value is byte-for-byte the old injected value** to `commitgate <verb>`.
|
|
268
|
+
|
|
269
|
+
- **It deletes nothing.** `scripts/req/`, schemas, persona, config, entrypoints, and `workflow/REQ-*` evidence are all left in place. The leftover `scripts/req/` is no longer executed; run `npx commitgate uninstall` to see a cleanup plan first.
|
|
270
|
+
- **It never overwrites scripts you edited.** Any value that differs — even by one character — is treated as yours, preserved, and reported for manual action.
|
|
271
|
+
- **It does not commit.** It writes `package.json` only; reviewing is up to you.
|
|
272
|
+
|
|
273
|
+
`req:doctor` also reports the install mode (old / current / mixed).
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Support scope
|
|
278
|
+
|
|
279
|
+
| Environment | Status |
|
|
280
|
+
|---|---|
|
|
281
|
+
| **npm** | Fully supported — verified on every release by a packed-tarball smoke test |
|
|
282
|
+
| **pnpm · yarn** (`node_modules` linker) | Supported — uses the standard `node_modules/.bin/commitgate` resolution |
|
|
283
|
+
| **Yarn PnP** | **Not supported in this release** (untested). Use `nodeLinker: node-modules` |
|
|
284
|
+
| **workspaces / monorepo** | **Workspace-root installs** are supported (`req.config.json` and `workflow/` at the root). Installing independently in a sub-package is not supported |
|
|
285
|
+
|
|
286
|
+
**Reproducibility**: the review model/effort pins in `req.config.json`, plus the schemas and persona, stay in your project, so past review inputs are reproducible from git history. Runtime versions are pinned by your lockfile — **commit `package-lock.json`** (or the pnpm/yarn equivalent).
|
|
287
|
+
|
|
288
|
+
### Companion Skills discovery scope
|
|
289
|
+
|
|
290
|
+
**Installation is identical everywhere.** What follows is about whether a harness **discovers** those files.
|
|
291
|
+
|
|
292
|
+
| harness | Discovery |
|
|
293
|
+
|---|---|
|
|
294
|
+
| **Claude Code** | Reads `.claude/skills/<name>/SKILL.md` natively |
|
|
295
|
+
| **Cursor (editor)** | Reads `.claude/skills` as a compatibility path |
|
|
296
|
+
| **Cursor (CLI)** | ⚠️ **May differ by version and run mode — not guaranteed** |
|
|
297
|
+
| **Codex** | **Out of product scope** — no companion entrypoint is installed. In CommitGate, Codex is the **Reviewer**; these four are **Builder aids** |
|
|
298
|
+
|
|
299
|
+
⚠️ **This is based on vendor primary documentation — the CommitGate team did not verify it empirically.**
|
|
300
|
+
Checked **2026-07-17** on win32 x64 / Node v20.19.5. If a vendor changes behaviour, this table goes stale.
|
|
301
|
+
|
|
302
|
+
⚠️ **We do not claim Cursor CLI is either supported or unsupported.** Cursor announced Agent Skills for both
|
|
303
|
+
editor and CLI, but discovery via the `.claude/skills` compatibility path is reported to differ by version and
|
|
304
|
+
run mode, and we could not verify it. If discovery doesn't happen, **the core workflow is unaffected** — skills
|
|
305
|
+
are a quality aid, and `AGENTS.md` is the contract.
|
|
306
|
+
|
|
307
|
+
We do **not** double-install into `.cursor/skills` to work around this: that path's CLI behaviour is also
|
|
308
|
+
uncertain, and the same content in two places invites drift. If the vendor fixes it, it works **with no change
|
|
309
|
+
on our side** — same path.
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
164
313
|
## Removing CommitGate
|
|
165
314
|
|
|
166
|
-
|
|
315
|
+
CommitGate lives in two places: the **runtime** (`node_modules/commitgate`) and the **governance files installed into your project**.
|
|
316
|
+
|
|
317
|
+
The package manager removes the runtime:
|
|
318
|
+
|
|
319
|
+
```sh
|
|
320
|
+
npm uninstall -D commitgate # pnpm remove -D commitgate · yarn remove commitgate
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
For the project files, review the plan below and clean up yourself. First, the important part: **`npx commitgate` is not a global install.** npx downloads the package into the npm cache (`_npx/<hash>/`) and runs it once; it leaves nothing in your global `node_modules` and nothing on your PATH.
|
|
167
324
|
|
|
168
325
|
Start by previewing the removal plan. This command **deletes nothing**:
|
|
169
326
|
|
|
@@ -302,11 +459,14 @@ npm run req:commit -- 2026-001 --run --message-file commit-message.txt
|
|
|
302
459
|
|
|
303
460
|
| Command | Purpose |
|
|
304
461
|
|---|---|
|
|
305
|
-
| `
|
|
306
|
-
| `npx commitgate
|
|
307
|
-
| `npx commitgate --
|
|
308
|
-
| `npx commitgate --
|
|
462
|
+
| `npm install -D commitgate` | **Install the runtime (required first)** — the executable code lives in `node_modules/commitgate` |
|
|
463
|
+
| `npx commitgate init` | Install config, contract, schemas, and the `req:*` scripts into a project |
|
|
464
|
+
| `npx commitgate init --dry-run` | Preview the install plan without writing files |
|
|
465
|
+
| `npx commitgate init --strict` | Treat integrity warnings as install failures — stops before writing any file |
|
|
466
|
+
| `npx commitgate init --no-agent-entrypoints` | Skip `.claude/`, `.cursor/`, and `CLAUDE.md` |
|
|
467
|
+
| `npx commitgate migrate [--apply]` | Move an older vendored install to the runtime package (plan-only by default, non-destructive) |
|
|
309
468
|
| `npx commitgate uninstall` | Preview the removal plan (read-only — deletes nothing) |
|
|
469
|
+
| `npm uninstall -D commitgate` | Remove the runtime |
|
|
310
470
|
| `npm run req:new -- <slug> --run` | Create a REQ ticket, branch, and design docs |
|
|
311
471
|
| `npm run req:next -- <id> [--json]` | **Compute the next action** (read-only) |
|
|
312
472
|
| `npm run req:review-codex -- <id> --kind design --run` | Review the design |
|
|
@@ -334,10 +494,16 @@ Defaults are enough for most projects. If needed, edit `req.config.json` in the
|
|
|
334
494
|
| `ticketRoot` | `"workflow"` | REQ ticket directory |
|
|
335
495
|
| `packageManager` | auto-detected | `npm`, `pnpm`, or `yarn` |
|
|
336
496
|
| `designDocs` | `00/01/02` docs | Design document filenames |
|
|
337
|
-
| `reviewPersonaPath` | `"workflow/review-persona.md"` | First block of the review prompt. `null` disables it |
|
|
497
|
+
| `reviewPersonaPath` | `"workflow/review-persona.md"` | First block of the review prompt. `null` disables it — but delta design reviews still inject the built-in delta contract |
|
|
498
|
+
| `reviewModel` | `"gpt-5.6-terra"` | codex review model (pinned via `-c model=`). `null` inherits your global codex config |
|
|
499
|
+
| `reviewReasoningEffort` | `"high"` | codex review reasoning effort. One of `none`, `minimal`, `low`, `medium`, `high`, `xhigh`. `null` inherits the global setting |
|
|
338
500
|
|
|
339
501
|
Empty `branchPrefix` values and paths that escape the project root are rejected.
|
|
340
502
|
|
|
503
|
+
**Pinned review model & effort**: `req:review-codex` injects `-c model=` and `-c model_reasoning_effort=` into the codex arguments to **pin the model and reasoning effort**. Without pinning, a review inherits your global `~/.codex/config.toml` (e.g. `model_reasoning_effort="ultra"`), making a single review take minutes and burn tokens. The defaults are `gpt-5.6-terra`/`high`; if your codex doesn't support that model, change it in `req.config.json` or set it to `null` to inherit the global config. Whether the overrides are actually honored can be checked with `npm run verify:overrides` (requires the codex CLI).
|
|
504
|
+
|
|
505
|
+
**Stateless re-reviews**: each re-review starts a **fresh codex thread** (it does not resume/accumulate the prior conversation — which drove token growth and goalpost drift). Only the previous same-target NEEDS_FIX findings are carried into the prompt as reference data, to confirm closure.
|
|
506
|
+
|
|
341
507
|
---
|
|
342
508
|
|
|
343
509
|
## FAQ
|
|
@@ -361,17 +527,18 @@ No. Existing files are skipped. Use `--force` if you intentionally want to refre
|
|
|
361
527
|
|
|
362
528
|
## Current Scope
|
|
363
529
|
|
|
364
|
-
The current release is **
|
|
530
|
+
The current release is a **runtime package model**. Executable code and runtime dependencies live only in `node_modules/commitgate`; your project keeps governance/audit data and the `req:* = commitgate <verb>` scripts. (Older vendored installs move over with [`migrate`](#migrating-from-an-older-install-migrate).)
|
|
365
531
|
|
|
366
532
|
Current verification:
|
|
367
533
|
|
|
368
534
|
- GitHub Actions runs a `ubuntu-latest`, `macos-latest`, `windows-latest` × Node 18/20/22 matrix.
|
|
369
|
-
- `npm run smoke` installs the packed tarball and
|
|
535
|
+
- `npm run smoke` installs the packed tarball into a throwaway project and asserts that the target has **no** `scripts/req/`, that `tsx`/`ajv`/`cross-spawn` are **not** injected, that all five `req:*` scripts point at the package bin, and that `npm run req:doctor` actually dispatches into the module inside the package. It verifies `migrate`'s non-destructiveness the same way.
|
|
370
536
|
- A Windows `.cmd` wrapper injection regression test protects package-manager and Codex wrapper paths.
|
|
371
537
|
|
|
372
538
|
Future scope:
|
|
373
539
|
|
|
374
|
-
-
|
|
540
|
+
- Yarn PnP support; independent installs in workspace sub-packages
|
|
541
|
+
- Asset↔runtime version drift detection
|
|
375
542
|
- Non-git VCS support
|
|
376
543
|
- More design document templates
|
|
377
544
|
|