seokang-sk 0.6.2 → 0.7.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/README.MD +18 -12
- package/docs/playbooks/backend-implementation.md +9 -0
- package/docs/playbooks/harness-workflow.md +9 -5
- package/docs/policies/context-and-track.md +11 -9
- package/docs/policies/core-safety.md +36 -51
- package/docs/setup/codex-workflows.md +8 -0
- package/docs/setup/fork-contributor-guide.md +32 -13
- package/docs/setup/github-free-collaboration.md +7 -5
- package/docs/setup/sk-cli-guide.md +19 -21
- package/docs/templates/impact-map.md +2 -2
- package/docs/templates/task-contract.md +3 -3
- package/package.json +3 -2
- package/profiles/seokang/backend.json +5 -14
- package/profiles/seokang/operator-access.json +9 -2
- package/scripts/check_automation_safety.mjs +41 -0
- package/scripts/check_db_execution_boundary.mjs +325 -0
- package/scripts/check_db_execution_boundary_smoke.mjs +212 -0
- package/scripts/check_deploy_actor_guard.mjs +119 -32
- package/scripts/check_docs_integrity.mjs +30 -22
- package/scripts/check_fork_contribution.mjs +26 -8
- package/scripts/check_git_pr_merge.mjs +131 -0
- package/scripts/check_git_pr_merge_integration.mjs +187 -0
- package/scripts/check_git_secret_guard.mjs +2 -2
- package/scripts/check_git_secret_guard_smoke.mjs +4 -0
- package/scripts/check_operator_guard.mjs +54 -46
- package/scripts/check_sk_cli_smoke.mjs +95 -120
- package/scripts/check_work_start_preflight.mjs +106 -12
- package/scripts/git_fork_sync.mjs +127 -0
- package/scripts/git_pr_merge.mjs +287 -0
- package/scripts/git_pr_merge_core.mjs +158 -0
- package/scripts/operator_identity.mjs +22 -48
- package/scripts/sk.mjs +105 -65
- package/starters/backend/build.gradle +0 -1
- package/starters/backend/src/main/resources/application.properties +1 -0
- package/starters/backend/src/test/kotlin/__PACKAGE_PATH__/{SecurityIntegrationTest.kt → SecurityWebSliceTest.kt} +7 -7
- package/starters/backend/src/test/kotlin/__PACKAGE_PATH__/ApplicationContextTest.kt +0 -12
- package/starters/backend/src/test/resources/application-test.properties +0 -6
package/README.MD
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- [Node.js](https://nodejs.org/) 20 이상
|
|
13
13
|
- [Git](https://git-scm.com/downloads)
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
개인 fork push와 PR을 만들 때는 [GitHub CLI](https://cli.github.com/)를 설치하고 `gh auth login`으로 계정을 연결합니다. GitHub CLI가 없거나 session이 만료되어도 local 코드·DB 코드 작성과 commit은 계속할 수 있으며, push/PR만 복구 뒤 이어서 진행합니다.
|
|
16
16
|
|
|
17
17
|
Windows에서는 Git을 설치할 때 함께 제공되는 **Git Bash**를 사용하세요. macOS에서는 **터미널**을 사용하면 됩니다.
|
|
18
18
|
|
|
@@ -63,7 +63,7 @@ sk help
|
|
|
63
63
|
|
|
64
64
|
GitHub Free에서는 repository별 최소 권한을 적용합니다. `km-*` 4개는 접근 없음, `seokang-codex-setting`은 Read 전용·fork 금지, 나머지 승인된 4개만 개인 private fork와 PR을 허용합니다. SeoKang OWNER는 `fork-contributors` team에 넣지 않습니다.
|
|
65
65
|
|
|
66
|
-
새 스레드의 첫 작업에서는
|
|
66
|
+
새 스레드의 첫 작업에서는 local remote topology와 worktree를 먼저 확인합니다. 개인 fork 작업자는 `selink-lab` upstream default branch를 `--ff-only`로 갱신하고, `$sk-git`은 기존 PR을 확인한 뒤 없으면 제목·본문을 만들어 PR까지 자동 생성합니다.
|
|
67
67
|
|
|
68
68
|
`$sk-git`은 add 전 worktree와 commit 전 staged index를 검사하며, 새 secret 파일이나 고신뢰 token을 탐지하면 로컬 파일을 삭제하지 않고 commit/push를 hard-fail합니다.
|
|
69
69
|
|
|
@@ -260,12 +260,14 @@ Windows Git Bash에서는 사용자 경로에 맞춰 `cd /c/Users/<user>/.agents
|
|
|
260
260
|
- `sk help <command>`: 명령별 옵션과 예시 확인
|
|
261
261
|
- `sk init --cwd /path/to/project`: 다른 프로젝트 초기화
|
|
262
262
|
- `sk status --cwd /path/to/project`: 다른 프로젝트 상태 확인
|
|
263
|
-
- `sk identity status`:
|
|
264
|
-
- `sk guard implementation --db-impact`: DB
|
|
265
|
-
- `sk guard
|
|
263
|
+
- `sk identity status`: 선택적 GitHub operator 진단 정보 확인
|
|
264
|
+
- `sk guard implementation --db-impact`: 이전 버전 호환용 안내. DB 코드 작성은 허용하고 실행은 금지
|
|
265
|
+
- `sk guard db-execution`: local test/CI/일반 build 전에 production DB 자동 실행 경로를 strict 검사. `$sk-deploy`는 내부 deploy-packaging mode로 실행되지 않는 DB test source를 허용하고 실제 test/migration 실행만 차단
|
|
266
|
+
- `sk guard git --action push --branch <name> --repo <name>`: OWNER main push와 NON_OWNER 작업 branch/PR 경계 확인
|
|
266
267
|
- `sk guard stage pre-add|pre-commit <path ...>`: intended commit path와 Git index 일치 검사
|
|
267
268
|
- `sk guard secrets --worktree` / `--staged` / `--outbound --remote origin`: add, commit, push 직전 secret hard-fail
|
|
268
|
-
- `sk guard deploy --environment <name> --artifact <type> --action <action> --db-impact-status <status>`: 배포
|
|
269
|
+
- `sk guard deploy --environment <name> --artifact <type> --action <action> --db-impact-status <status>`: 배포 credential 및 DB 무실행 경계 안내
|
|
270
|
+
- 구현/commit/작업 branch는 identity 확인이나 cache를 요구하지 않는다. OWNER의 canonical `main`/`master` 직접 push는 GitHub ACL을 사용하고, 배포는 사용자 유형이 아니라 local credential과 원격 권한으로 실행한다. NON_OWNER Git 작업은 개인 fork PR까지만 진행한다.
|
|
269
271
|
- [상세 CLI 가이드](docs/setup/sk-cli-guide.md)를 기준 문서로 사용
|
|
270
272
|
|
|
271
273
|
---
|
|
@@ -410,15 +412,19 @@ sk search "reviewer"
|
|
|
410
412
|
- 일반 서버 프로젝트: 원격 서버/NAS 업로드 + 재시작
|
|
411
413
|
- `.agents/skills` 같은 `seokang-skill` 프로젝트: `npm publish`
|
|
412
414
|
|
|
413
|
-
|
|
415
|
+
권한은 아래처럼 분리합니다.
|
|
414
416
|
|
|
415
|
-
-
|
|
416
|
-
- OWNER: main
|
|
417
|
-
-
|
|
417
|
+
- contributor: DB 코드와 SQL까지 개인 private fork의 작업 branch에 작성·push하고 `selink-lab` 원본 PR 생성
|
|
418
|
+
- OWNER: canonical `main`/`master` 직접 push, contributor PR 검토·merge, production 배포, npm publish, rollback, tag/release
|
|
419
|
+
- NON_OWNER: canonical `main`/`master` push와 모든 배포 mutation 금지, 개인 fork 작업 branch와 원본 PR까지만 허용
|
|
418
420
|
|
|
419
|
-
|
|
421
|
+
PR 처리는 예약 Inbox 자동화 없이 `$sk-git`에서 끝냅니다. OWNER가 canonical product repository에서 plain `$sk-git`을 호출하면 현재 저장소의 허용된 contributor PR을 자동 발견해 remote diff를 검토하고 안전조건을 재검증한 뒤 순차 squash merge합니다. 특정 PR 하나만 처리하려면 `$sk-git PR #<number> 병합`을 사용합니다. 친구는 personal fork에서 commit/push/PR까지만 수행하고, merge 뒤 다음 `$sk-git`/feature/bugfix 시작 시 clean/ff-only 조건에서 원본 최신 main을 local default branch에 반영합니다. `sk update`는 제품 코드 pull이 아니라 공용 skill 업데이트에만 사용합니다.
|
|
420
422
|
|
|
421
|
-
|
|
423
|
+
모든 배포 스크립트는 build/upload/restart/publish 전에 DB execution boundary를 확인합니다. OWNER/NON_OWNER/root/seokang 같은 사용자 유형은 판정하지 않으며, local config의 SSH/npm/API/CDN credential로 실제 명령을 실행한 결과만 사용합니다.
|
|
424
|
+
|
|
425
|
+
별도 테스트/개발/로컬 DB는 없습니다. DB 코드·SQL·migration 파일은 작성하고 PR로 검토할 수 있지만 Codex, local test, CI, deploy, start/restart script는 migration/DDL/DML/backfill/seed를 실행하지 않습니다. 실제 반영은 OWNER 사용자가 별도 IDE/DB 도구에서 수동 실행합니다.
|
|
426
|
+
|
|
427
|
+
이 로컬 guard는 실수 방지층입니다. GitHub Free private 저장소의 실제 Git 차단은 `selink-lab` 원본 Read 권한과 개인 private fork/PR로 구성합니다. 배포는 local config에 credential이 설정된 환경에서만 가능하며 fork PR Actions에는 write token, secrets, variables를 전달하지 않습니다.
|
|
422
428
|
|
|
423
429
|
예시 설정 파일:
|
|
424
430
|
|
|
@@ -47,6 +47,15 @@
|
|
|
47
47
|
- 복잡한 분기 이유
|
|
48
48
|
- 위험한 query 의도
|
|
49
49
|
|
|
50
|
+
## 3-1. Production-Only DB Boundary
|
|
51
|
+
|
|
52
|
+
- SeoKang 환경에는 별도 테스트/개발/로컬 DB가 없으므로 모든 DB 연결 target을 production으로 간주한다.
|
|
53
|
+
- repository/query/SQL/migration 코드는 작성할 수 있지만 local test, CI, runtime verification에서 실제 DB에 실행하지 않는다.
|
|
54
|
+
- DB 영향 검증은 compile/typecheck, mock 단위 테스트, SQL 정적 lint/comment 검토로 제한한다.
|
|
55
|
+
- local compile/test/build 전에는 `sk guard db-execution`을 통과하고, CI에서도 test/build보다 먼저 같은 검사를 실행한다.
|
|
56
|
+
- Flyway/Liquibase, ORM schema sync, seed/backfill, startup migration을 실행하지 않는다.
|
|
57
|
+
- 실제 schema/data 변경은 `$sk-db` 산출물을 OWNER 사용자가 별도 IDE/DB 도구에서 수동 실행한다.
|
|
58
|
+
|
|
50
59
|
## 4. Cleanup And Naming
|
|
51
60
|
|
|
52
61
|
- 변경 범위 안의 미사용 service/helper/query/config 코드는 같은 턴에 제거한다.
|
|
@@ -36,14 +36,18 @@
|
|
|
36
36
|
|
|
37
37
|
## 3. Deterministic Check Selection
|
|
38
38
|
|
|
39
|
-
- impact map에서 DB 영향이 `있음` 또는
|
|
40
|
-
|
|
41
|
-
-
|
|
39
|
+
- impact map에서 DB 영향이 `있음` 또는 `미확인`이어도 GitHub actor/cache 상태로 코드나 SQL 파일 작성을 차단하지 않는다.
|
|
40
|
+
- DB 영향 검증은 production DB 연결 없이 compile/typecheck, mock test, SQL 정적 검사로 제한한다.
|
|
41
|
+
- local test/build를 선택했다면 실행 직전에 `sk guard db-execution`을 통과시킨다. CI workflow도 실제 test/build 앞에 이 command가 없으면 완료 처리하지 않는다.
|
|
42
42
|
- 아래 체크는 `필요한 파일을 실제로 건드렸을 때만` 실행한다.
|
|
43
43
|
- config / env / properties / application 설정을 수정했으면:
|
|
44
44
|
- `node scripts/check_no_unauthorized_defaults.mjs <path ...>`
|
|
45
45
|
- DDL / migration SQL을 수정했으면:
|
|
46
46
|
- `node scripts/check_ddl_comments.mjs <path ...>`
|
|
47
|
+
- CI/deploy/startup DB 실행 경계를 수정했으면:
|
|
48
|
+
- `sk guard db-execution`
|
|
49
|
+
- `node scripts/check_db_execution_boundary.mjs <project-root>`
|
|
50
|
+
- `node scripts/check_db_execution_boundary_smoke.mjs`
|
|
47
51
|
- `docs/**`, `skills/**`, `README*`를 수정했으면:
|
|
48
52
|
- `node scripts/check_docs_integrity.mjs <path ...>`
|
|
49
53
|
- `sk` CLI 또는 bootstrap/status 동작을 수정했으면:
|
|
@@ -54,10 +58,10 @@
|
|
|
54
58
|
- `node scripts/check_automation_safety.mjs`
|
|
55
59
|
- Codex 기본/agent 모델 설정을 수정했으면:
|
|
56
60
|
- `node scripts/check_codex_model_routing.mjs`
|
|
57
|
-
- operator identity
|
|
61
|
+
- 선택적 operator identity 진단 또는 Git/배포 guard CLI를 수정했으면:
|
|
58
62
|
- `node scripts/check_operator_guard.mjs`
|
|
59
63
|
- `node scripts/check_sk_cli_smoke.mjs`
|
|
60
|
-
- deploy
|
|
64
|
+
- deploy credential / DB 무실행 preflight를 수정했으면:
|
|
61
65
|
- `node scripts/check_deploy_actor_guard.mjs`
|
|
62
66
|
- `node scripts/check_operator_guard.mjs`
|
|
63
67
|
- `node scripts/check_sk_cli_smoke.mjs`
|
|
@@ -30,34 +30,36 @@
|
|
|
30
30
|
- `git status --porcelain=v2 --branch`
|
|
31
31
|
- `git branch --show-current`
|
|
32
32
|
- `git remote -v`
|
|
33
|
-
|
|
34
|
-
- remote URL에서 repository name
|
|
33
|
+
- 작업 시작에는 GitHub identity/cache를 확인하지 않는다. `gh` 미설치, 미인증, session 만료는 local edit/test/commit과 DB 코드 작성을 막지 않는다.
|
|
34
|
+
- remote URL에서 repository name과 `canonical origin` 또는 `개인 fork origin + selink-lab upstream` topology를 확인한다. remote/repository name을 확인할 수 없으면 자동 동기화하지 않는다.
|
|
35
35
|
- 원본 default branch는 hardcode하지 않고 아래처럼 조회한다.
|
|
36
36
|
- `gh repo view selink-lab/<repo> --json defaultBranchRef --jq '.defaultBranchRef.name'`
|
|
37
37
|
- dirty worktree, detached HEAD, 진행 중인 merge/rebase가 있으면 branch switch나 fast-forward merge를 실행하지 않고 현재 상태를 먼저 보고한다.
|
|
38
38
|
- merge: `git rev-parse -q --verify MERGE_HEAD`
|
|
39
39
|
- rebase: `git rev-parse --git-path rebase-merge`, `git rev-parse --git-path rebase-apply`로 경로를 구한 뒤 directory 존재 확인
|
|
40
40
|
|
|
41
|
-
####
|
|
41
|
+
#### Canonical origin 시작 순서
|
|
42
42
|
|
|
43
43
|
1. `origin=github.com/selink-lab/<repo>`이고 확인한 repository name과 일치하는지 먼저 검증한다. 개인 fork나 다른 host의 origin이면 fetch/merge하지 않는다.
|
|
44
44
|
2. 새 작업 전에 원본의 열린 PR을 최대 100건 조회한다.
|
|
45
45
|
- `gh pr list --repo selink-lab/<repo> --state open --limit 100 --json number,title,author,headRefName,baseRefName,url,reviewDecision`
|
|
46
|
-
3. 열린 PR이 현재 요청과 같은 파일/도메인에 영향을 줄 수 있으면 PR diff와 checks를 먼저 읽고 새 작업과의 충돌 여부를 보고한다.
|
|
46
|
+
3. 열린 PR이 현재 요청과 같은 파일/도메인에 영향을 줄 수 있으면 PR diff와 checks를 먼저 읽고 새 작업과의 충돌 여부를 보고한다. 일반 작업 bootstrap은 PR을 merge/close하지 않는다. 단, OWNER가 현재 canonical product repository에서 plain `$sk-git`을 호출하면 현재 저장소의 허용된 contributor PR을 발견·검토·순차 squash merge하고, `$sk-git PR #<number> 병합`은 지정 PR 하나만 처리한다. 두 경로 모두 GitHub Free protection 미지원/check 완전 부재를 검토 위험으로 공개하고 나머지 CI/head/main 안전조건을 재검증한다.
|
|
47
47
|
4. worktree가 clean하고 현재 branch가 원본 default branch일 때만 `git fetch origin --prune` 후 `git merge --ff-only origin/<default-branch>`로 동기화한다.
|
|
48
48
|
5. merge 뒤 `git rev-list --left-right --count HEAD...origin/<default-branch>`가 정확히 `0 0`인지 확인한다. local default가 ahead/diverged면 reset/rebase하지 않고 중단한다.
|
|
49
49
|
6. 다른 작업 branch에 있으면 원격 fetch와 비교까지만 수행하고 임의로 branch를 전환하지 않는다.
|
|
50
50
|
|
|
51
|
-
####
|
|
51
|
+
#### Private fork 시작 순서
|
|
52
52
|
|
|
53
|
-
1. `origin=github.com/<
|
|
54
|
-
2. 현재 branch의 PR을 `gh pr list --repo selink-lab/<repo> --state all --limit 100 --head <
|
|
53
|
+
1. `origin=github.com/<fork-owner>/<repo>`, `upstream=github.com/selink-lab/<repo>` private-fork topology를 remote URL로 확인한다.
|
|
54
|
+
2. push/PR handoff 시 현재 branch의 PR을 `gh pr list --repo selink-lab/<repo> --state all --limit 100 --head <fork-owner>:<current-branch> --json number,state,mergedAt,url,baseRefName`으로 확인한다. OPEN이면 기존 PR을 보고하고, CLOSED/MERGED 이력이 있으면 반드시 새 branch를 사용한다.
|
|
55
55
|
3. worktree가 clean할 때 `git fetch upstream --prune` → `git switch <default-branch>` → `git merge --ff-only upstream/<default-branch>` 순서로 원본 최신 코드를 로컬에 반영한다.
|
|
56
56
|
4. merge 뒤 `git rev-list --left-right --count HEAD...upstream/<default-branch>`가 정확히 `0 0`인지 확인한다. local default가 ahead/diverged면 reset/rebase하지 않고 중단한다.
|
|
57
|
-
5. 동기화된 default branch에서 허용 prefix의 새 작업 branch를 만든다.
|
|
57
|
+
5. 동기화된 default branch에서 허용 prefix의 새 작업 branch를 만든다. private fork 작업자는 fork의 default branch나 upstream에 push하지 않는다.
|
|
58
58
|
6. fast-forward가 불가능하거나 conflict가 예상되면 merge commit, rebase, force push로 임의 해결하지 않고 OWNER에게 전달한다.
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
OWNER가 원본 PR을 merge해도 친구의 fork default branch를 강제로 수정하지 않는다. 친구가 다음 `$sk-git`, `$sk-feature`, `$sk-bugfix`를 호출하면 clean default branch 또는 merge 완료된 작업 branch에서만 위 fast-forward 절차로 `upstream/<default-branch>`를 local default branch에 반영한다.
|
|
61
|
+
|
|
62
|
+
- network/API 오류를 최신 상태로 간주하지 않는다. fetch/PR 조회가 실패해도 local edit/test/commit은 진행하고, remote sync/push/PR만 `pending`으로 남기며 실패 범위와 stale-base 위험을 밝힌다.
|
|
61
63
|
|
|
62
64
|
## 2. Track Mapping
|
|
63
65
|
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
- 직접 허용 범위는 read-only 증거 확보 목적의 `SELECT`, `SHOW`, `DESCRIBE`, `EXPLAIN`으로 한정한다.
|
|
30
30
|
- 직접 조회 전 필수 조건:
|
|
31
31
|
- read-only 권한 또는 동등한 안전장치 확인
|
|
32
|
-
-
|
|
32
|
+
- SeoKang 환경에는 별도 로컬/개발/테스트 DB가 없으므로 연결 대상을 production으로 간주
|
|
33
33
|
- `LIMIT`, 선택적 `WHERE`, timeout 우선
|
|
34
34
|
- 민감정보 최소 조회, 필요 시 마스킹/샘플링
|
|
35
35
|
- 금지 범위:
|
|
@@ -77,57 +77,42 @@
|
|
|
77
77
|
- 같은 문장을 여러 skill에 다시 복제하지 않는다.
|
|
78
78
|
- 반복 마찰의 기본 대응은 `append-only`가 아니라 `이관 / 축소 / 교체`다.
|
|
79
79
|
|
|
80
|
-
## 8.
|
|
81
|
-
|
|
82
|
-
- DB
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
- DB
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
- `
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
- `OWNER`: `main`/`master` write, tag/release, production 배포, npm publish, rollback 허용
|
|
115
|
-
- `NON_OWNER`: 개인 private fork의 이름이 확인된 작업 branch push와 원본 저장소 PR까지만 허용. 모든 배포 mutation은 차단
|
|
116
|
-
- `UNKNOWN`: Git write와 모든 배포 mutation 차단
|
|
117
|
-
- Git write 전에는 현재 branch를 확인하고 아래를 실행한다.
|
|
118
|
-
- `sk guard git --action push --branch <current-branch> --repo <repo>`
|
|
119
|
-
- tag/release 전에는 같은 명령의 `--action tag` 또는 `--action release`를 별도로 통과한다.
|
|
120
|
-
- `NON_OWNER`는 원본 `selink-lab` 저장소에 직접 add/commit/push하지 않는다. 개인 private fork의 `origin`에 작업 branch를 push하고 `upstream` 원본으로 PR을 전달하며 merge는 OWNER가 담당한다.
|
|
121
|
-
- NON_OWNER remote topology는 `origin=github.com/<authenticated-login>/<repo>`, `upstream=github.com/selink-lab/<repo>`로 고정한다. host/owner/repository/fork parent 확인이 실패하면 push하지 않는다.
|
|
122
|
-
- GitHub Free private 저장소에서는 branch ruleset이 실제 차단 경계가 아니다. 원본 저장소의 NON_OWNER 권한을 Read로 유지하고 production SSH/npm/DB/API/CDN credential을 제공하지 않는 것이 실제 보호 경계다.
|
|
123
|
-
- Organization에서 private repository forking을 허용하되 fork PR Actions에는 write token, Actions secrets, variables를 전달하지 않는다. fork PR workflow는 OWNER 승인 후에만 실행한다.
|
|
80
|
+
## 8. DB Authoring / Production Execution Boundary
|
|
81
|
+
|
|
82
|
+
- DB 관련 코드, repository/query, SQL, migration, DDL/DML, verification, rollback 파일은 OWNER/NON_OWNER/UNKNOWN 구분 없이 작성·검토·commit·개인 fork PR까지 진행할 수 있다.
|
|
83
|
+
- DB 영향 구현을 시작하기 위한 GitHub identity/cache/actor gate는 사용하지 않는다. `sk guard implementation --db-impact`는 이전 설치 호환용 안내 명령일 뿐 권한 판정이 아니다.
|
|
84
|
+
- SeoKang 환경에는 테스트/개발/로컬 DB가 따로 없고, 연결 가능한 모든 DB는 production으로 간주한다.
|
|
85
|
+
- Codex, 로컬 테스트, CI, deploy, start/restart script는 schema/data 변경을 절대 실행하지 않는다.
|
|
86
|
+
- 금지되는 자동 실행에는 migration CLI, seed/backfill, SQL client write 실행, Flyway/Liquibase startup migration, Hibernate DDL create/update, ORM synchronize가 포함된다.
|
|
87
|
+
- DB 영향 코드 검증은 DB 연결 없이 compile/typecheck, mock 단위 테스트, SQL 정적 lint/comment 검토로 제한한다. Testcontainers나 임시 DB를 새로 가정하지 않는다.
|
|
88
|
+
- local test와 test를 포함할 수 있는 일반 build 전, 그리고 CI workflow의 첫 검증 단계에서 strict `sk guard db-execution`을 통과해야 한다. CI에 이 단계가 없거나 DB credential marker가 있으면 실행하지 않는다.
|
|
89
|
+
- `$sk-deploy`의 고정 no-test packaging은 deploy helper가 `check_db_execution_boundary.mjs --mode deploy-packaging`으로 검사한다. 이 모드에서는 DB 연결 test source의 존재만 허용하되 packaging/lifecycle이 test를 실행하거나 migration/DDL/DML/startup schema mutation 경로가 있으면 hard-fail한다.
|
|
90
|
+
- fork PR workflow에는 production DB connection string, SSH/npm/API/CDN credential, write token, Actions secrets/variables를 전달하지 않는다.
|
|
91
|
+
- 모든 deploy artifact는 literal key/value local config와 project/package root를 `scripts/check_db_execution_boundary.mjs`로 검사한다. migration framework가 있으면 production startup disable 근거를 확인하지 못한 상태로 배포하지 않는다.
|
|
92
|
+
- 일반 애플리케이션 query/DML은 OWNER가 PR을 검토하고 배포한 뒤 production runtime에서만 동작한다. 로컬/CI 검증을 위해 production DB에 실행하지 않는다.
|
|
93
|
+
- 실제 migration/DDL/DML/backfill이 필요하면 `$sk-db`가 실행 가능한 파일, 검증 쿼리, 락/성능 위험, rollback을 제공하고 OWNER 사용자가 별도 IDE/DB 도구에서 수동 실행한다.
|
|
94
|
+
- 이 절은 제2절의 명시적 read-only safe-read를 막지 않지만 safe-read 결과를 DB mutation 실행 허가로 사용하지 않는다.
|
|
95
|
+
|
|
96
|
+
## 8-1. Git / Deploy Capability Boundary
|
|
97
|
+
|
|
98
|
+
- 로컬 GitHub numeric identity 확인은 선택 진단일 뿐이며 enrollment cache를 생성하거나 작업 권한 근거로 사용하지 않는다. 작업 시작, DB 코드 작성, commit, 작업 branch push, deploy에는 이를 요구하지 않는다.
|
|
99
|
+
- 일반 Git 흐름은 local remote topology와 실제 GitHub repository ACL로 판단한다.
|
|
100
|
+
- OWNER + canonical origin: `main`/`master`에 직접 push 가능
|
|
101
|
+
- NON_OWNER + 개인 fork origin + `selink-lab` upstream: 개인 fork 작업 branch push 후 upstream PR
|
|
102
|
+
- PR merge는 OWNER가 현재 canonical repository에서 plain `$sk-git` 또는 `$sk-git PR #<number> 병합`을 호출한 턴에만 실행한다. plain 호출은 현재 저장소의 허용된 contributor PR을 발견·검토·순차 squash merge하고, 번호 지정 호출은 해당 PR 하나만 처리한다. 예약 자동 병합, 다른 저장소 일괄 조회/병합, NON_OWNER merge는 금지하며 GitHub OWNER credential과 ACL을 다시 확인한다.
|
|
103
|
+
- NON_OWNER의 `$sk-git`은 clean 상태에서만 개인 fork `origin` + `selink-lab` `upstream` topology를 확인하고, 병합 완료된 작업 branch 또는 local default branch를 `upstream/<default>`에 `--ff-only`로 맞춘다. reset/rebase/force push와 fork default push는 하지 않는다.
|
|
104
|
+
- `$sk-git`과 `sk guard git`은 로컬 `gh` session으로 OWNER를 재판정하지 않는다. canonical `main`/`master` push는 GitHub ACL이 OWNER credential만 승인하고, NON_OWNER는 개인 fork PR로 요청한다.
|
|
105
|
+
- 사용자가 `$sk-git`을 호출한 것은 현재 변경을 분석하고 허용된 경로로 add → commit → push하라는 명시적 실행 승인이다. OWNER canonical origin의 `main`/`master` push가 local guard에서 ALLOW이고 secret/stage hard-fail을 모두 통과하면, agent는 같은 push를 위해 두 번째 자연어 승인 문구를 요구하지 않는다.
|
|
106
|
+
- live Codex runtime의 sandbox/network 정책이 실제 tool approval을 요구하면 agent가 해당 push 명령에 대한 범위가 좁은 approval/escalation 요청을 즉시 호출한다. 사용자에게 “승인한다고 다시 말해 달라”고 요구하거나 GitHub 권한 문제로 바꾸어 설명하지 않는다.
|
|
107
|
+
- tag/release와 canonical mutation은 GitHub ACL이 최종 승인한다. 배포를 유발하는 tag/release는 OWNER가 main 반영 후 수행한다.
|
|
108
|
+
- GitHub CLI 인증이나 network가 없으면 local edit/test/commit을 중단하지 않는다. push/PR 조회·생성만 `push pending`으로 보존한다.
|
|
109
|
+
- 배포 preflight는 GitHub actor/session, OWNER/NON_OWNER, local user, process owner를 조회하거나 분류하지 않는다. local config의 SSH key, npm/API/CDN credential과 원격 시스템의 실제 명령 결과만 사용한다.
|
|
110
|
+
- deploy helper와 `sk guard deploy`는 별도 restart wrapper, sudoers, 사용자 프로필을 실행 권한 gate로 요구하지 않는다.
|
|
111
|
+
- server/front/npm deploy script는 credential/config 확인 실패 시 upload/restart/publish 전에 종료한다.
|
|
112
|
+
- GitHub Free private 저장소에서는 원본 저장소의 contributor 권한을 Read로 유지하고 production credential을 제공하지 않는 것이 실제 보호 경계다.
|
|
113
|
+
- Organization에서 private repository forking을 허용하되 fork PR Actions에는 write token, Actions secrets, variables를 전달하지 않는다. fork PR workflow는 OWNER 검토 후 실행한다.
|
|
124
114
|
- 조직 전체 2FA 강제는 모든 active member가 2FA를 활성화한 것을 확인한 뒤에만 켠다. 미활성 member가 있는 상태에서는 접근 상실을 막기 위해 강제하지 않는다.
|
|
125
|
-
-
|
|
126
|
-
- `sk guard deploy --environment <name> --artifact <frontend|server|npm> --action <deploy|rollback> --db-impact-status <none|yes|unknown>`
|
|
127
|
-
- local/preview/staging/production, frontend/server/npm, deploy/rollback을 포함한 모든 배포 mutation은 DB 영향 유무와 관계없이 OWNER 전용이다. NON_OWNER는 로컬 build/test까지만 수행할 수 있다.
|
|
128
|
-
- `NON_OWNER` 작업 branch는 `codex/`, `feature/`, `fix/` 등 policy에 고정된 작업 prefix만 허용한다. develop/release/production/gh-pages/ref-qualified 이름은 허용하지 않는다.
|
|
129
|
-
- DB impact가 `yes` 또는 `unknown`이면 deploy capability gate와 별도로 `sk guard implementation --db-impact`도 통과해야 한다.
|
|
130
|
-
- 로컬 guard는 직접 `git`, `ssh`, `npm` 명령이나 파일 수정으로 우회할 수 있는 협조적 안전장치다. 실제 보호는 upstream Read 권한, private fork/PR, OWNER만 보유한 배포 credential, 보호된 production CI 승인으로 구성한다.
|
|
115
|
+
- 로컬 guard는 협조적인 실수 방지층이며 실제 GitHub ACL과 credential 분리를 대신하지 않는다.
|
|
131
116
|
|
|
132
117
|
### Repository Access Matrix
|
|
133
118
|
|
|
@@ -53,6 +53,14 @@ Automation은 아래를 고정한 뒤 만든다.
|
|
|
53
53
|
- Archive condition: 보고할 내용이 없을 때 자동 archive할 조건을 적는다.
|
|
54
54
|
- Safety: read-only 점검인지, file edit이 필요한지, worktree 격리가 필요한지 적는다.
|
|
55
55
|
|
|
56
|
+
현재 공용 automation 기준:
|
|
57
|
+
|
|
58
|
+
- `docs/automations/daily-thread-retrospective.md`: 일일 task 회고
|
|
59
|
+
- `docs/automations/notion-outbox-publish.md`: Notion outbox publish
|
|
60
|
+
- `docs/automations/server-log-check.md`: 서버 로그 점검
|
|
61
|
+
|
|
62
|
+
반복 결과를 한 곳에 계속 쌓아야 하는 heartbeat는 일반 개발 채팅에 붙이지 않고 Automations 프로젝트의 전용 채팅을 먼저 만든 뒤 그 thread를 target으로 고정한다. `Daily Server Log Check`, `Notion Outbox Publish`가 이 방식을 사용한다. PR merge와 contributor upstream 동기화는 예약 자동화가 아니라 `$sk-git`의 역할별 흐름으로 처리한다. OWNER의 canonical plain `$sk-git`은 현재 저장소 PR을 발견·검토·merge하고, NON_OWNER의 `$sk-git`은 merge 후 clean/ff-only 조건에서 upstream main을 반영한다.
|
|
63
|
+
|
|
56
64
|
기본 프롬프트:
|
|
57
65
|
|
|
58
66
|
```text
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- GitHub Free를 유지하면서 NON_OWNER가 `selink-lab` 원본 저장소를 직접 수정하지 않게 한다.
|
|
6
6
|
- 친구는 개인 private fork에서 작업 브랜치를 push하고 원본 저장소로 Pull Request만 보낸다.
|
|
7
|
-
- `main` 병합, 모든 배포, tag/release, npm publish, rollback, DB
|
|
7
|
+
- DB 관련 코드와 SQL까지 작성해 PR로 전달할 수 있다. `main` 병합, 모든 배포, tag/release, npm publish, rollback, 실제 DB 변경 실행은 SeoKang이 맡는다.
|
|
8
8
|
|
|
9
9
|
## 1. 최초 계정 준비
|
|
10
10
|
|
|
@@ -14,7 +14,7 @@ GitHub CLI와 SeoKang 스킬을 설치한다. Organization 2FA 강제는 현재
|
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
brew install gh
|
|
17
|
-
gh auth login
|
|
17
|
+
gh auth login -h github.com
|
|
18
18
|
npm install -g seokang-sk@latest
|
|
19
19
|
sk setup --skip-notion
|
|
20
20
|
```
|
|
@@ -23,19 +23,18 @@ sk setup --skip-notion
|
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
winget install --id GitHub.cli
|
|
26
|
-
gh auth login
|
|
26
|
+
gh auth login -h github.com
|
|
27
27
|
npm install -g seokang-sk@latest
|
|
28
28
|
sk setup --skip-notion
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
설치 후
|
|
31
|
+
설치 후 상태를 확인한다.
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
sk identity status
|
|
35
34
|
sk check
|
|
36
35
|
```
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
GitHub identity 등록은 local 구현의 선행 조건이 아니다. `gh` 인증이 끊겨도 코드 작성과 commit을 계속하고 push/PR만 인증 복구 후 이어서 진행한다.
|
|
39
38
|
|
|
40
39
|
## 2. 작업 가능한 저장소 확인
|
|
41
40
|
|
|
@@ -98,12 +97,11 @@ $sk-bugfix 문제가 발생한 부분을 고쳐줘
|
|
|
98
97
|
$sk-git
|
|
99
98
|
```
|
|
100
99
|
|
|
101
|
-
DB
|
|
102
|
-
`$sk-deploy`는
|
|
100
|
+
DB 관련 코드, repository/query, SQL, migration, verification, rollback 파일까지 작성해 PR로 전달할 수 있다. 단 모든 DB target은 production이므로 Codex/local test/CI에서 실행하지 않는다.
|
|
101
|
+
`$sk-deploy`는 사용자 유형을 판정하지 않는다. 친구 PC의 local config에 SSH/npm/배포 credential이 없으므로 실제 mutation은 원격 시스템에서 거부되며, 필요한 배포는 credential이 설정된 환경에서 실행한다.
|
|
103
102
|
|
|
104
103
|
`$sk-git`은 아래를 확인해야 한다.
|
|
105
104
|
|
|
106
|
-
- GitHub actor가 `NON_OWNER`
|
|
107
105
|
- 현재 branch가 허용된 작업 prefix
|
|
108
106
|
- `origin`이 친구 개인 fork
|
|
109
107
|
- `upstream`이 `selink-lab` 원본
|
|
@@ -112,6 +110,10 @@ DB 영향 구현은 친구 계정에서 차단된다. DB 변경이 필요해 보
|
|
|
112
110
|
|
|
113
111
|
조건을 통과하면 `$sk-git`은 commit/push 뒤 OPEN PR URL을 반환하거나, PR 이력이 없을 때 제목과 본문을 자동 생성해 `selink-lab` 원본 PR까지 만든다. CLOSED/MERGED PR branch는 재사용하지 않고 새 branch를 요구한다.
|
|
114
112
|
|
|
113
|
+
PR 생성 뒤 친구가 GitHub나 `git status`를 반복 확인할 필요는 없다. SeoKang이 canonical product repository에서 plain `$sk-git`을 호출하면 현재 저장소의 허용된 contributor PR을 자동 발견해 remote diff를 검토하고, script가 CI·author·base·conflict·head/main SHA를 재검증한 뒤 순차 squash merge한다. 특정 PR 하나만 처리하려면 `$sk-git PR #<number> 병합`을 사용한다. 친구 계정은 원본 merge 권한이 없고 personal fork topology에서 merge helper도 호출하지 않는다.
|
|
114
|
+
|
|
115
|
+
일반 작업 branch와 local commit은 identity/cache 없이 진행한다. push나 PR 인증이 실패하면 local commit을 보존한 채 `push pending`으로 보고하며, 인증 복구 후 이어서 처리한다.
|
|
116
|
+
|
|
115
117
|
`$sk-git`은 add 전에 worktree, commit 전에 staged index, push 전에 outbound commit history를 각각 검사한다. 새 `.env*`, deploy local config, private key/keystore/credential 파일 또는 고신뢰 token이 탐지되면 확인 없이 hard-fail하며 push하지 않는다. 탐지된 값은 출력하지 않고 로컬 파일도 삭제하지 않는다. 기존 staged path도 intended commit path와 다르면 commit하지 않는다.
|
|
116
118
|
|
|
117
119
|
## 6. 원본 저장소로 PR 생성
|
|
@@ -129,7 +131,9 @@ gh pr create \
|
|
|
129
131
|
|
|
130
132
|
친구는 PR 작성까지만 수행한다. merge, tag, release, local/preview/staging/production 배포는 하지 않는다.
|
|
131
133
|
|
|
132
|
-
## 7. 다음
|
|
134
|
+
## 7. Git skill과 다음 작업의 fork 동기화
|
|
135
|
+
|
|
136
|
+
SeoKang이 PR을 merge해도 친구의 개인 fork default branch를 강제로 변경하지 않는다. 친구가 merge 뒤 `$sk-git`을 다시 호출하거나 다음 `$sk-feature`/`$sk-bugfix`를 시작하면 Codex가 아래 upstream fast-forward를 수행해 원본 최신 main을 local default branch에 반영한다.
|
|
133
137
|
|
|
134
138
|
```bash
|
|
135
139
|
git switch <default-branch>
|
|
@@ -141,6 +145,20 @@ git switch -c feature/<다음-작업명>
|
|
|
141
145
|
|
|
142
146
|
충돌이 있으면 `main`에 임의 merge commit을 만들거나 force push하지 말고 SeoKang에게 전달한다.
|
|
143
147
|
|
|
148
|
+
`$sk-git`은 이 과정을 `node ~/.agents/skills/scripts/git_fork_sync.mjs --cwd "$PWD" --json`으로 실행한다. worktree/index가 dirty하거나 local default가 ahead/diverged이면 fetch/switch/merge를 실행하지 않는다. 작업 branch의 PR이 아직 OPEN이면 현재 branch를 유지하고, MERGED일 때만 local default로 이동한다.
|
|
149
|
+
|
|
150
|
+
## 7-1. 공용 스킬 업데이트
|
|
151
|
+
|
|
152
|
+
SeoKang이 새 workflow를 canonical 저장소에 반영한 뒤 친구는 아래 명령으로 새 규칙과 script를 받는다.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
sk update --dry-run
|
|
156
|
+
sk update
|
|
157
|
+
sk check
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
친구가 수정하는 product repository와 `~/.agents/skills` canonical clone은 별개다. `sk update`가 dirty/ahead/diverged를 보고하면 skills clone을 자동 reset하지 말고 SeoKang에게 전달한다.
|
|
161
|
+
|
|
144
162
|
## 8. 허용/차단 기준
|
|
145
163
|
|
|
146
164
|
| 작업 | 친구 계정 |
|
|
@@ -151,9 +169,10 @@ git switch -c feature/<다음-작업명>
|
|
|
151
169
|
| `Read 전용` 저장소 분석 | 허용 |
|
|
152
170
|
| `접근 없음` 저장소 clone/fetch | GitHub 권한으로 차단 |
|
|
153
171
|
| 원본 main/feature branch 직접 push | GitHub Read 권한으로 차단 |
|
|
154
|
-
| DB
|
|
155
|
-
|
|
|
156
|
-
|
|
|
172
|
+
| DB 코드·SQL·migration 작성과 PR | 허용, production DB 실행 금지 |
|
|
173
|
+
| 실제 DB schema/data 변경 | credential 미지급 + OWNER 수동 실행으로 차단 |
|
|
174
|
+
| local/preview/staging/production 배포 | local credential 미설정이면 실제 원격 명령에서 차단 |
|
|
175
|
+
| npm/tag/release/rollback | GitHub/npm/배포 ACL과 credential로 차단 |
|
|
157
176
|
|
|
158
177
|
## 9. 계정 또는 접근 제거 시
|
|
159
178
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
- GitHub Team 요금제로 업그레이드하지 않고 Organization의 무료 team 기능을 사용한다.
|
|
7
7
|
- 친구는 `fork-contributors` team을 통해 승인된 원본 private repository만 Read로 본다.
|
|
8
8
|
- fork/PR 대상으로 승인된 repository에서만 개인 private fork에 작업 branch를 push하고 원본으로 PR을 만든다.
|
|
9
|
-
- SeoKang만 merge, 모든 배포, tag/release, npm publish, rollback을 수행한다.
|
|
9
|
+
- SeoKang만 merge, 모든 배포, tag/release, npm publish, rollback을 수행한다. canonical product repository의 plain `$sk-git`은 현재 저장소의 허용된 contributor PR을 자동 발견·검토·순차 merge한다.
|
|
10
10
|
|
|
11
11
|
## Organization 설정
|
|
12
12
|
|
|
@@ -53,9 +53,11 @@ GitHub Free private repository에는 branch ruleset을 강제할 수 없으므
|
|
|
53
53
|
|
|
54
54
|
- 원본 upstream repository의 친구 권한은 Read (`upstream Read`)
|
|
55
55
|
- 친구 push 대상은 개인 private fork뿐
|
|
56
|
-
- 원본 반영은 PR과 OWNER merge만
|
|
56
|
+
- 친구 계정의 원본 반영은 개인 fork PR과 OWNER merge만 사용하며, OWNER 자신의 작업은 canonical main에 직접 반영 가능
|
|
57
57
|
- DB write 및 SSH/npm/API/CDN/production credential은 친구에게 제공하지 않음
|
|
58
|
-
- 모든 배포 mutation은
|
|
58
|
+
- 모든 배포 mutation은 사용자 유형 판정 없이 local config의 SSH/npm/API/CDN credential과 원격 ACL로 실행
|
|
59
|
+
- DB 코드·SQL 작성은 fork PR로 허용하되 Codex/local test/CI/deploy/startup의 DB schema/data 실행은 금지
|
|
60
|
+
- 실제 DB 변경은 OWNER가 별도 IDE/DB 도구에서 수동 실행
|
|
59
61
|
|
|
60
62
|
로컬 skill guard는 실수 방지층이며 GitHub 권한과 credential 분리를 대신하지 않는다.
|
|
61
63
|
|
|
@@ -74,6 +76,6 @@ GitHub Free private repository에는 branch ruleset을 강제할 수 없으므
|
|
|
74
76
|
|
|
75
77
|
## 새 작업 시작 역할
|
|
76
78
|
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
+
- Canonical origin: 원본 저장소의 열린 PR과 diff/checks를 확인하되 GitHub session 실패가 local 작업을 막지 않게 한다.
|
|
80
|
+
- Private fork origin: upstream의 실제 default branch를 fetch하고 local default branch를 `--ff-only`로 갱신한 뒤 새 작업 branch를 만든다.
|
|
79
81
|
- 두 계정 모두 dirty worktree, merge/rebase 진행 상태, API/fetch 실패를 무시하고 자동 branch 전환하지 않는다.
|
|
@@ -80,7 +80,7 @@ sk setup
|
|
|
80
80
|
- `sk setup --configure-notion`으로 사용자별 Notion workspace 위치를 로컬 파일에 분리할 수 있다.
|
|
81
81
|
- `.sk/project-memory.json`, `.sk/notepad.md`를 통해 다음 세션이 이전 맥락을 먼저 읽을 수 있다.
|
|
82
82
|
- `sk search`로 예전 Codex transcript를 다시 찾을 수 있다.
|
|
83
|
-
- `sk
|
|
83
|
+
- `sk guard`로 DB 자동 실행과 Git secret을 차단하고, canonical main push는 GitHub ACL로 제한한다. 배포는 사용자 유형이 아니라 설정된 credential과 원격 권한으로 실행한다.
|
|
84
84
|
|
|
85
85
|
## 3. 처음 한 번만 해야 하는 것
|
|
86
86
|
|
|
@@ -264,35 +264,34 @@ sk status
|
|
|
264
264
|
|
|
265
265
|
이 명령은 현재 프로젝트 기준 `.sk` 상태, 메모 파일 존재 여부, 최근 backup을 보여준다.
|
|
266
266
|
|
|
267
|
-
### 4-5.
|
|
267
|
+
### 4-5. PR / DB 무실행 / 배포 credential 경계
|
|
268
268
|
|
|
269
|
-
|
|
269
|
+
`sk identity status`는 현재 GitHub numeric identity를 보고 싶을 때만 쓰는 선택 진단 명령이다. cache를 생성하지 않으며 구현, DB 코드 작성, local commit, 작업 branch의 필수 preflight로 사용하지 않는다.
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
schema/migration/DML/repository/ORM/query/transaction/persistence 코드와 SQL 파일은 누구나 작성하고 개인 fork PR로 전달할 수 있다. 이전 버전 호환을 위한 아래 명령도 GitHub를 조회하지 않고 작성 허용/실행 금지만 안내한다.
|
|
272
272
|
|
|
273
273
|
```bash
|
|
274
|
-
|
|
275
|
-
sk identity status
|
|
274
|
+
sk guard implementation --db-impact
|
|
276
275
|
```
|
|
277
276
|
|
|
278
|
-
|
|
277
|
+
별도 테스트/개발/로컬 DB는 없으며 모든 DB target은 production으로 간주한다. Codex, local test, CI, deploy, start/restart script는 migration/DDL/DML/backfill/seed를 실행하지 않는다. 검증은 compile/typecheck, mock 단위 테스트, SQL 정적 검사로 제한하고 실제 반영은 OWNER 사용자가 IDE/DB 도구에서 수동 실행한다.
|
|
278
|
+
|
|
279
|
+
local test/build 전과 CI의 첫 검증 단계에는 아래 명령을 둔다. 이 검사는 DB 연결 test, Testcontainers, migration CLI, startup schema sync, CI DB credential을 탐지하면 종료 코드 `2`로 중단한다.
|
|
279
280
|
|
|
280
281
|
```bash
|
|
281
|
-
sk guard
|
|
282
|
+
sk guard db-execution
|
|
282
283
|
```
|
|
283
284
|
|
|
284
|
-
|
|
285
|
-
- `NON_OWNER`: 구현 차단
|
|
286
|
-
- `UNKNOWN`: GitHub CLI 부재, 미인증, 네트워크/API 오류, 정책 오류를 포함하며 구현 차단
|
|
287
|
-
|
|
288
|
-
Git write는 현재 branch와 action을 함께 검사한다.
|
|
285
|
+
Git write는 identity가 아니라 현재 branch와 remote topology를 검사한다.
|
|
289
286
|
|
|
290
287
|
```bash
|
|
291
288
|
sk guard git --action push --branch codex/my-feature --repo price-advisor-spinks
|
|
292
289
|
sk guard git --action tag --branch main --repo seokang-codex-setting
|
|
293
290
|
```
|
|
294
291
|
|
|
295
|
-
-
|
|
292
|
+
- 개인 fork 작업자는 remote URL에서 확인한 `<fork-owner>`의 작업 branch를 `origin`에 push하고 `selink-lab` 원본 `upstream`으로 PR을 만든다.
|
|
293
|
+
- 일반 작업 branch와 `main`/`master` guard는 GitHub identity/cache를 사용하지 않는다. OWNER는 canonical main에 직접 push하고, NON_OWNER는 개인 fork 작업 branch와 PR까지만 진행하며 실제 구분은 GitHub ACL이 담당한다.
|
|
294
|
+
- push 인증/network 실패가 나도 local commit은 보존하고 `push pending`으로 보고한다.
|
|
296
295
|
|
|
297
296
|
Git add 전과 commit 전에는 아래 두 검사를 순서대로 실행한다.
|
|
298
297
|
|
|
@@ -307,12 +306,11 @@ sk guard secrets --outbound --remote origin
|
|
|
307
306
|
```
|
|
308
307
|
|
|
309
308
|
새 `.env*`, deploy local config, private key/credential 파일, 고신뢰 token 또는 outbound commit history의 secret이 탐지되면 종료 코드 `2`로 hard-fail한다. 출력에는 redaction된 파일과 rule name만 남기며 로컬 파일은 삭제하지 않는다.
|
|
310
|
-
-
|
|
311
|
-
- UNKNOWN은 feature branch를 포함한 모든 Git write가 차단된다.
|
|
309
|
+
- tag/release와 canonical mutation은 실제 GitHub ACL이 최종 승인하며 배포를 유발하는 작업은 OWNER가 수행한다.
|
|
312
310
|
|
|
313
311
|
친구 계정의 최초 설치, remote 구성, Codex 스킬 사용, PR 생성 절차는 [친구 계정 Private Fork 개발 가이드](./fork-contributor-guide.md)를 따른다.
|
|
314
312
|
|
|
315
|
-
배포는
|
|
313
|
+
배포는 live GitHub identity, local OWNER profile, 실행 사용자, process owner를 검사하거나 분류하지 않는다. 설정된 SSH/npm/production credential과 원격 시스템의 실제 명령 결과만 사용한다. `sk guard deploy`도 사용자 유형을 판정하지 않는 경계 진단이다.
|
|
316
314
|
|
|
317
315
|
```bash
|
|
318
316
|
sk guard deploy \
|
|
@@ -324,11 +322,11 @@ sk guard deploy \
|
|
|
324
322
|
--db-impact-status none
|
|
325
323
|
```
|
|
326
324
|
|
|
327
|
-
-
|
|
328
|
-
- production, npm publish, rollback을 포함한 모든
|
|
329
|
-
-
|
|
325
|
+
- server/front/npm deploy는 helper가 `scripts/check_db_execution_boundary.mjs --mode deploy-packaging <project-root>`를 먼저 실행한다. DB 연결 test source가 존재해도 고정 packaging command에서 실행되지 않으면 허용하지만, test task 연결·npm lifecycle test·startup migration/ORM schema sync 근거가 발견되면 중단한다.
|
|
326
|
+
- production, npm publish, rollback을 포함한 모든 배포 credential은 OWNER 환경에만 둔다.
|
|
327
|
+
- fork PR/CI에는 production DB/SSH/npm/API/CDN secret과 write token을 전달하지 않는다.
|
|
330
328
|
|
|
331
|
-
|
|
329
|
+
실제 보호에는 원본 저장소 Read 권한, 개인 private fork/PR, DB write 및 모든 배포 credential 미지급을 함께 사용한다.
|
|
332
330
|
|
|
333
331
|
### 4-6. DB safe-read alias 맞추기
|
|
334
332
|
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
## 4. Check Selection
|
|
33
33
|
|
|
34
34
|
- DB impact 결론 (`있음` | `없음` | `미확인`):
|
|
35
|
-
-
|
|
36
|
-
- Git/deploy
|
|
35
|
+
- production DB 무실행 검증과 수동 실행 handoff:
|
|
36
|
+
- Git PR/deploy credential 경계 적용 시점:
|
|
37
37
|
- 실행할 deterministic checks:
|
|
38
38
|
- 해당 없음으로 닫는 checks:
|
|
@@ -24,9 +24,8 @@
|
|
|
24
24
|
### 반응형 작업 여부 (`요청 없음` | `명시 요청`)
|
|
25
25
|
### 보안 최종 점검 필요 여부 (`해당 없음` | `필수`)
|
|
26
26
|
### DB impact (`있음` | `없음` | `미확인`)
|
|
27
|
-
###
|
|
28
|
-
###
|
|
29
|
-
### Git/deploy gate (`해당 없음` | `Git write 시 sk-git에서 실행` | `배포 시 sk-deploy에서 실행`)
|
|
27
|
+
### DB 실행 경계 (`해당 없음` | `production 무실행 검증` | `OWNER 수동 실행 handoff`)
|
|
28
|
+
### Git/deploy gate (`해당 없음` | `OWNER main 직접 반영` | `NON_OWNER PR` | `configured credential`)
|
|
30
29
|
|
|
31
30
|
## 4. 검증 계획
|
|
32
31
|
|
|
@@ -41,6 +40,7 @@
|
|
|
41
40
|
| `check_no_unauthorized_defaults.mjs` | | | |
|
|
42
41
|
| `check_codex_model_routing.mjs` | | | |
|
|
43
42
|
| `check_ddl_comments.mjs` | | | |
|
|
43
|
+
| `check_db_execution_boundary.mjs` | | | |
|
|
44
44
|
| `check_docs_integrity.mjs` | | | |
|
|
45
45
|
| `check_operator_guard.mjs` | | | |
|
|
46
46
|
| `check_deploy_actor_guard.mjs` | | | |
|