commitgate 0.3.0 → 0.3.1

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/bin/init.ts CHANGED
@@ -310,7 +310,7 @@ export function runInit(opts: InitOptions): InitResult {
310
310
  const packageManager = detectPackageManager(targetRoot)
311
311
 
312
312
  // req.config.json 계획(쓰기 없음). handoffPath:null·packageManager를 항상 보장 —
313
- // 코어 DEFAULTS의 palm 고유값(handoffPath) 기존 부분 config에서도 resurface하지 않도록(design R1 P2). 기존 키 보존.
313
+ // handoffPath는 프로젝트별 값이라 코어 기본이 비활성(null)이다 비활성을 config **명시 기록**한다(암묵 < 명시). 기존 키 보존.
314
314
  let configAction: 'created' | 'merged' | 'unchanged' = 'unchanged'
315
315
  const configKeysAdded: string[] = []
316
316
  let configToWrite: Record<string, unknown> | null = null
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commitgate",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "CommitGate — Builder↔Reviewer(Claude↔Codex) fail-closed 커밋 게이트: 리뷰·승인·증거 없인 커밋을 통과시키지 않는 AI REQ 워크플로 kit (req:new/review-codex/doctor/commit)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,8 +1,8 @@
1
1
  /**
2
- * req 워크플로 config 모듈 (REQ-2026-017 Phase 1, portability kit).
2
+ * req 워크플로 config 모듈 (portability kit).
3
3
  *
4
- * 목적: 경로·이름·패키지매니저를 `req.config.json`으로 외부화하되, **파일 부재 시 현재 동작 100% 유지**(DEFAULTS=현재 하드코딩 값).
5
- * Phase는 **모듈만** 제공 4 스크립트 배선·`--root` CLI는 Phase 2, 어댑터는 Phase 3.
4
+ * 목적: 경로·이름·패키지매니저를 `req.config.json`으로 외부화한다. 파일이 없으면 `DEFAULTS`로 해소된다.
5
+ * ⚠️ `DEFAULTS`는 **모든 프로젝트에 유효한 중립 기본값**만 담는다(REQ-2026-009). 프로젝트 고유 값은 config가 흡수한다.
6
6
  *
7
7
  * 안전(fail-closed): config가 게이트를 무력화하거나 경로를 탈출하지 못하도록 AJV 스키마 + 해상도 confinement로 강제.
8
8
  */
@@ -48,11 +48,21 @@ export interface ResolvedConfig {
48
48
  handoffPathAbs: string | null
49
49
  }
50
50
 
51
- /** ⚠️ 현재 하드코딩 값 — 변경 시 behavior-preserving(수용기준 #1) 깨짐. */
51
+ /**
52
+ * 코어 기본값. `req.config.json` 부재 시 이 값으로 해소된다.
53
+ *
54
+ * ⚠️ 여기 있는 값은 **모든 대상 프로젝트에 유효한 중립 기본값**이어야 한다.
55
+ * 특정 프로젝트에만 의미 있는 값(경로·문서 위치 등)은 코어가 아니라 `req.config.json`이 흡수한다.
56
+ * `handoffPath`가 그 예다 — 코어 기본은 **비활성(null)**이고, 쓰려면 config에 명시하거나 `--handoff <path>`로 준다.
57
+ * (REQ-2026-009: 이전 기본값은 특정 사설 프로젝트의 문서 경로였다.)
58
+ *
59
+ * `handoffPath`의 `as string | null`은 의도적이다. 없으면 TS가 리터럴 `null`로 좁혀
60
+ * `DEFAULTS`를 직접 import하는 소비자의 `string | null` 계약이 깨진다.
61
+ */
52
62
  export const DEFAULTS = {
53
63
  ticketRoot: 'workflow',
54
64
  schemaPath: 'workflow/machine.schema.json',
55
- handoffPath: '../palm-kiosk/docs/evaluation/project-memory/ai-handoff.md',
65
+ handoffPath: null as string | null,
56
66
  branchPrefix: 'feat/req-',
57
67
  packageManager: 'pnpm' as PackageManager,
58
68
  granularityMaxFiles: 8,
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * req:commit — AI REQ 워크플로우 Phase B (REQ-2026-016). 승인된 phase를 커밋하는 래퍼.
4
4
  *
5
- * SSOT 설계: ../palm-kiosk/docs/evaluation/ai-req-workflow-design.md / 본 티켓 01-design.md D-016-3·3b·7·8·9.
5
+ * 설계 근거: 본 티켓 01-design.md D-016-3·3b·7·8·9.
6
6
  * 책임(전체): req:doctor 통과 게이트 → HIGH 사람확인 게이트 → source 커밋(승인 코드만) →
7
7
  * commit_allowed 소비 → evidence-finalize(approvals.jsonl 매니페스트 append + responses chore 커밋) → 2-커밋.
8
8
  * 복구/finalize 모드(pending_evidence_for)·design-finalize 포함.
@@ -2,7 +2,6 @@
2
2
  /**
3
3
  * req:doctor — AI REQ 워크플로우 1차 (단계 4B): 일관성 점검(fail-closed).
4
4
  *
5
- * SSOT: palm-kiosk/docs/evaluation/ai-req-workflow-design.md §8.3.
6
5
  * 1차 최소셋(registry 비의존): D2·D3·D5·D6·D9·D10·D11 + D13(design 선행·freshness)·D15(NEEDS_FIX actionable). (D1/D7/D7b·D4a 등 registry/merge 의존은 2차)
7
6
  * FAIL 1건 이상 → exit 1, 자동 보정 금지(P9). review-codex 헬퍼 재사용.
8
7
  *
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * req:new — AI REQ 워크플로우 1차 (단계 4A): REQ 티켓 + feat/req-* 브랜치 생성.
4
4
  *
5
- * SSOT: palm-kiosk/docs/evaluation/ai-req-workflow-design.md §9.1·§9.2·DEC-WF-020(D11).
5
+ * 설계 근거: DEC-WF-020(D11) — REQ는 main에서 feat/req-* 브랜치로 시작한다.
6
6
  * - state.json은 **BOM 없이** 생성(Node, review-codex의 writeState 재사용).
7
7
  * - 기본 dry-run(계획 출력), `--run` 시 실제 브랜치 생성·티켓 파일·스캐폴드 커밋.
8
8
  * - REQ id 채번은 registry 미사용(1차) — workflow/REQ-* 디렉터리 스캔으로 max+1.
@@ -2,9 +2,7 @@
2
2
  /**
3
3
  * req:review-codex — AI REQ 워크플로우 1차 (단계 2: 조립·바인딩 캡처 + 기반 검증 로직)
4
4
  *
5
- * SSOT 설계: palm-kiosk/docs/evaluation/ai-req-workflow-design.md
6
- * §9.5 호출 문법 · §8.4 staged tree OID 바인딩 · §9.6 구조화 응답·도메인 검증
7
- * 0차 실측: palm-kiosk-app/workflow/00-spike/00-spike-report.md
5
+ * 설계 근거: 호출 문법 · staged tree OID 바인딩 · 구조화 응답·도메인 검증.
8
6
  * 리뷰 반영(Codex, 2단계): schema 버전 필드·STATUS↔COMMIT 모순 검증·state 부재 명확화·Review Context·AJV(단계3)
9
7
  *
10
8
  * 단계 2(완료): 조립(handoff·Review Context·request·staged diff) + git 바인딩(staged tree OID) + dry-run 미리보기,
@@ -17,7 +15,7 @@
17
15
  * 사용:
18
16
  * pnpm req:review-codex <REQ-id> # workflow/REQ-<id>/ 대상
19
17
  * pnpm req:review-codex --ticket <dir> # 임의 티켓 디렉터리
20
- * 옵션: --handoff <path> (기본: ../palm-kiosk/docs/evaluation/project-memory/ai-handoff.md, 없으면 생략)
18
+ * 옵션: --handoff <path> (미지정 시 req.config.json의 handoffPath. 둘 다 없으면 handoff 블록 생략 — 코어 기본은 비활성)
21
19
  */
22
20
  import { readFileSync, existsSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs'
23
21
  import { resolve, join, relative } from 'node:path'