@kaydash9999/banker-plugins 0.20.2 → 0.21.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +203 -1
- package/PRIVACY.md +34 -4
- package/README.md +46 -15
- package/bin/banker.js +228 -51
- package/bin/lib/codex-hooks.mjs +249 -0
- package/bin/lib/telemetry-config.mjs +33 -16
- package/codex/manifest.json +14 -11
- package/codex/skills/graceful-pause/SKILL.md +30 -0
- package/codex/skills/progress/SKILL.md +42 -0
- package/codex/skills/progress/scripts/progress-plan.mjs +722 -0
- package/codex/skills/progress/scripts/progress.mjs +295 -0
- package/codex/transform-matrix.md +19 -14
- package/commands/setup.md +23 -0
- package/hooks/obsidize-hook.mjs +116 -4
- package/hooks/progress-plan.mjs +1 -1
- package/hooks/progress.mjs +143 -38
- package/hooks/register.mjs +13 -3
- package/hooks/telemetry-count-codex.mjs +222 -0
- package/hooks/update-checkin.mjs +15 -7
- package/hooks/update-fetch.mjs +15 -9
- package/hooks/update-notify.mjs +30 -17
- package/package.json +1 -1
- package/skills/3d-intro-build/SKILL.md +11 -5
- package/skills/3d-intro-build/references/azure-adapter.mjs +374 -81
- package/skills/3d-intro-build/references/curate.mjs +48 -14
- package/skills/3d-intro-build/references/preview-lib.mjs +51 -15
- package/skills/3d-intro-build/references/prompts.md +4 -4
- package/skills/3d-intro-build/references/serve.mjs +6 -1
- package/skills/3d-intro-build/references/verify-intro.mjs +16 -9
- package/skills/3d-intro-build/references/video-pool.mjs +250 -135
- package/skills/3d-intro-setup/SKILL.md +41 -10
- package/skills/3d-intro-setup/references/azure-adapter.mjs +374 -81
- package/skills/3d-intro-setup/references/video-pool.mjs +250 -135
- package/skills/anti-drm/SKILL.md +6 -3
- package/skills/anti-drm/scripts/anti-drm.mjs +49 -12
- package/skills/anti-drm/scripts/instruction-toggle.mjs +105 -20
- package/skills/append_wiki/SKILL.md +34 -8
- package/skills/audit-mock/SKILL.md +1 -1
- package/skills/audit-security/SKILL.md +64 -2
- package/skills/compact-wiki/SKILL.md +37 -6
- package/skills/deep-research/SKILL.md +11 -0
- package/skills/docs-setup/SKILL.md +37 -7
- package/skills/lfm/SKILL.md +148 -0
- package/skills/lineage/SKILL.md +25 -15
- package/skills/lineage/lineage.py +564 -301
- package/skills/motion-graphic-make/SKILL.md +1 -1
- package/skills/motion-graphic-make/references/curate.mjs +48 -14
- package/skills/motion-graphic-make/references/preview-lib.mjs +51 -15
- package/skills/motion-graphic-make/references/serve.mjs +6 -1
- package/skills/motion-graphic-setup/SKILL.md +58 -13
- package/skills/obsidizer/SKILL.md +30 -11
- package/skills/obsidizer/obsidize.mjs +50 -12
- package/skills/omc-patch/SKILL.md +86 -23
- package/skills/omc-patch/scripts/omc-patch.mjs +460 -116
- package/skills/payload-mon/SKILL.md +6 -2
- package/skills/payload-mon/scripts/payload-mon.mjs +88 -12
- package/skills/payload-mon/scripts/payload-size.mjs +4 -1
- package/skills/pdf-vision-extract/SKILL.md +11 -6
- package/skills/ralph-qa/SKILL.md +125 -151
- package/skills/ralph-qa/references/gemini-seat.mjs +67 -19
- package/skills/ralph-qa/references/payload-scan.mjs +22 -7
- package/skills/ralph-qa/references/seat-payload.mjs +646 -0
- package/skills/ralph-qa/references/seat-run.mjs +956 -0
- package/skills/ralph-qa/references/seat-spawn.mjs +205 -0
- package/skills/ralph-qa/references/verifier-probe.mjs +57 -16
- package/skills/rfp-author/SKILL.md +5 -3
- package/skills/rfp-author/references/vendor-rfp-structure.md +1 -1
- package/skills/setup-bypass-permissions/SKILL.md +27 -9
- package/skills/setup-bypass-permissions/scripts/codex-bypass.mjs +135 -0
- package/skills/setup-bypass-permissions/scripts/codex-config.mjs +210 -0
- package/skills/setup-harness-factory/SKILL.md +17 -1
- package/skills/setup-insane-search/SKILL.md +16 -0
- package/skills/setup-java/SKILL.md +20 -1
- package/skills/setup-lsp/SKILL.md +56 -13
- package/skills/setup-mcp/SKILL.md +73 -4
- package/skills/setup-node/SKILL.md +31 -6
- package/skills/setup-omc/SKILL.md +24 -0
- package/skills/setup-omc-hud/SKILL.md +42 -9
- package/skills/setup-omc-hud/assets/apply-hud.mjs +242 -27
- package/skills/setup-omc-hud/assets/codex-config.mjs +210 -0
- package/skills/setup-omc-hud/assets/codex-status-line.mjs +90 -0
- package/skills/setup-omc-hud/assets/omc-hud-custom.mjs +81 -14
- package/skills/setup-omc-hud/scripts/claude-update-last.mjs +5 -3
- package/skills/setup-playwright/SKILL.md +45 -2
- package/skills/setup-pwsh/SKILL.md +19 -0
- package/skills/setup-python/SKILL.md +45 -7
- package/skills/setup-sandbox/SKILL.md +30 -5
- package/skills/setup-stitch/SKILL.md +22 -0
- package/skills/setup-tmux/SKILL.md +24 -4
- package/skills/smart-compact/SKILL.md +58 -12
- package/skills/smart-compact/scripts/codex-gate.mjs +384 -0
- package/skills/tone-compact/SKILL.md +2 -1
- package/skills/tone-compact/scripts/instruction-toggle.mjs +105 -20
- package/skills/ultra-chain/SKILL.md +12 -7
- package/skills/ultra-chain/references/preview-lib.mjs +51 -15
- package/skills/ultra-chain/references/serve.mjs +6 -1
- package/skills/ultra-interview/SKILL.md +14 -2
- package/skills/update-banker/SKILL.md +19 -3
- package/skills/vertical-pptx/SKILL.md +6 -3
- package/skills/vertical-pptx-setup/SKILL.md +76 -20
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: compact-wiki
|
|
3
|
-
description: "`.omc/wiki` 페이지를 무손실로 정리. 중복은 지우고, 낡은 내용은 새 내용으로 대체하고, 겹치는 페이지는 병합. 'compact-wiki'/'위키 정리'/'위키 압축'/'wiki 중복 제거'/'위키 병합' 시 사용."
|
|
3
|
+
description: "`.omc/wiki`(Codex 는 `omx_wiki/`) 페이지를 무손실로 정리. 중복은 지우고, 낡은 내용은 새 내용으로 대체하고, 겹치는 페이지는 병합. 'compact-wiki'/'위키 정리'/'위키 압축'/'wiki 중복 제거'/'위키 병합' 시 사용."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# compact-wiki — wiki 정리·압축 (무손실)
|
|
7
7
|
|
|
8
8
|
`append-wiki` 가 `.omc/wiki/` 에 누적한 지식을 **중복 제거·supersede·병합**으로 압축한다.
|
|
9
|
-
append-wiki 가 "쌓기"라면 이 스킬은 "정리"다. 두 스킬 모두 OMC `wiki_*` MCP
|
|
10
|
-
답변·설명은 한글(도구명·슬러그·경로 등 기술 토큰은 영문).
|
|
9
|
+
append-wiki 가 "쌓기"라면 이 스킬은 "정리"다. 두 스킬 모두 Claude Code 는 OMC `wiki_*` MCP 도구로 `.omc/wiki/` 를,
|
|
10
|
+
Codex 는 OMX 의 `omx wiki` CLI 로 `omx_wiki/` 를 다룬다. 답변·설명은 한글(도구명·슬러그·경로 등 기술 토큰은 영문).
|
|
11
|
+
아래의 `.omc/wiki` 는 Codex 에서 `omx_wiki` 로 읽는다.
|
|
11
12
|
|
|
12
13
|
> ★**불변식 — 지식 무손실**: 이 스킬의 모든 destructive 동작(병합 후 삭제·supersede)은
|
|
13
14
|
> **스냅샷 → 병합본 작성 → 병합본이 원본의 모든 고유 사실을 담았는지 검증 → 그 다음에만 삭제**
|
|
@@ -25,17 +26,47 @@ append-wiki 가 "쌓기"라면 이 스킬은 "정리"다. 두 스킬 모두 OMC
|
|
|
25
26
|
|
|
26
27
|
## 워크플로우
|
|
27
28
|
|
|
28
|
-
### 0) wiki 도구
|
|
29
|
-
`wiki_*` 는 deferred MCP 도구다. 호출 전 ToolSearch로 스키마 로드:
|
|
29
|
+
### 0) wiki 도구 준비 (런타임마다 다름 — 먼저)
|
|
30
|
+
**Claude Code:** `wiki_*` 는 deferred MCP 도구다. 호출 전 ToolSearch로 스키마 로드:
|
|
30
31
|
```
|
|
31
32
|
ToolSearch(query="select:mcp__plugin_oh-my-claudecode_t__wiki_list,mcp__plugin_oh-my-claudecode_t__wiki_query,mcp__plugin_oh-my-claudecode_t__wiki_read,mcp__plugin_oh-my-claudecode_t__wiki_ingest,mcp__plugin_oh-my-claudecode_t__wiki_delete,mcp__plugin_oh-my-claudecode_t__wiki_lint")
|
|
32
33
|
```
|
|
33
34
|
|
|
35
|
+
**Codex:** `wiki_*` MCP 도 ToolSearch 도 없다. `omx wiki` CLI 가 같은 도구 이름과 입력을 받는다(`wiki_list`, `wiki_query`, `wiki_read`, `wiki_ingest`, `wiki_delete`, `wiki_lint`).
|
|
36
|
+
```bash
|
|
37
|
+
omx wiki wiki_list --json
|
|
38
|
+
omx wiki wiki_read --input '{"page":"<slug>"}' --json
|
|
39
|
+
omx wiki wiki_ingest --input "$(cat <JSON 파일>)" --json
|
|
40
|
+
omx wiki wiki_delete --input '{"page":"<slug>"}' --json
|
|
41
|
+
```
|
|
42
|
+
- 아래 단계의 `wiki_xxx({...})` 는 Codex 에서 `omx wiki wiki_xxx --input '<같은 JSON>' --json` 이다. `page` 는 슬러그나 파일 이름(`<slug>.md`)을 받는다.
|
|
43
|
+
- 병합본처럼 긴 본문은 JSON 을 파일로 쓰고 `--input "$(cat <파일>)"` 로 넘긴다. 셸 인용이 깨지지 않게 하기 위해서다(bash).
|
|
44
|
+
- Windows 에서 PowerShell 로 `omx` 를 부를 때: Windows PowerShell 5.1 은 `omx.cmd` 에 넘기는 인자에서 큰따옴표를 지우고,
|
|
45
|
+
공백에서 인자를 나누고, 한글을 깨뜨린다(Windows 박스 실측). 그래서 JSON 을 아래 `Arg` 로 바꿔 넘긴다.
|
|
46
|
+
본문 속 큰따옴표와 공백, ASCII 밖 글자, cmd 가 읽는 `% & | < > ^ !` 는 `\uXXXX` 로, JSON 구조의 큰따옴표는 `\"` 로 바꾼다.
|
|
47
|
+
따옴표(홀수 개 포함), 역슬래시, `%TEMP%`, `&`, 한글, 줄바꿈이 든 본문도 그대로 왕복하고 명령으로 읽히지 않는다(박스 실측).
|
|
48
|
+
```powershell
|
|
49
|
+
function Arg([string]$s) {
|
|
50
|
+
$a = [regex]::Replace($s, '(?<!\\)((?:\\\\)*)\\"', '$1\u0022')
|
|
51
|
+
$a = [regex]::Replace($a, '[^\x21-\x7E]|[%&|<>^!]', { param($m) '\u{0:x4}' -f [int][char]$m.Value })
|
|
52
|
+
$a -replace '(\\*)"', '$1$1\"'
|
|
53
|
+
}
|
|
54
|
+
$j = @{ title = "<영문 제목>"; content = "<본문>"; tags = @("<태그>"); category = "pattern" } | ConvertTo-Json -Compress
|
|
55
|
+
omx wiki wiki_ingest --input (Arg $j) --json
|
|
56
|
+
omx wiki wiki_query --input (Arg '{"query":"<키워드>"}') --json
|
|
57
|
+
```
|
|
58
|
+
- 인자 하나는 Linux 에서 128KB 를 넘지 못한다. 본문이 그보다 크면 페이지를 나눈다.
|
|
59
|
+
- `omx` 가 없으면 멈추고 OMX 설치를 안내한다. 위키 파일을 손으로 지우거나 쓰지 않는다(목차와 이력이 어긋난다).
|
|
60
|
+
- `omx wiki` 와 스냅샷은 작업 폴더에만 쓰므로 샌드박스 승인이 필요 없다(Codex 0.144.5, OMX 0.20.2 에서 확인).
|
|
61
|
+
|
|
34
62
|
### 1) 스냅샷 (★안전망 — 가장 먼저)
|
|
35
63
|
삭제·치환 전에 wiki 디렉터리를 통째로 백업해 복구 가능 상태를 만든다:
|
|
36
64
|
```bash
|
|
37
65
|
ts=$(date +%Y%m%d-%H%M%S); cp -r .omc/wiki ".omc/wiki.bak-$ts" && echo "backup: .omc/wiki.bak-$ts"
|
|
38
66
|
```
|
|
67
|
+
Codex 는 `omx_wiki/` 를 `.omx/` 아래로 떠 둔다(`mkdir -p .omx && cp -r omx_wiki ".omx/wiki.bak-$ts"`).
|
|
68
|
+
프로젝트 루트에 두지 않는 것은 OMX 가 `omx_wiki/` 를 커밋 대상으로 보아 옆의 백업 폴더가 커밋에 섞일 수 있기 때문이다.
|
|
69
|
+
`omx_wiki/` 가 없으면 정리할 위키가 없으니 그 사실을 알리고 멈춘다.
|
|
39
70
|
작업 완료·사용자 확인 전까지 백업을 지우지 않는다(보고에 위치 명시).
|
|
40
71
|
|
|
41
72
|
### 2) 인벤토리 + 현재 상태 채증
|
|
@@ -71,7 +102,7 @@ ts=$(date +%Y%m%d-%H%M%S); cp -r .omc/wiki ".omc/wiki.bak-$ts" && echo "backup:
|
|
|
71
102
|
### 8) 보고 (한글)
|
|
72
103
|
- 병합/supersede 매핑(어느 페이지 → 어느 정본), 삭제된 슬러그, 리포인트한 링크.
|
|
73
104
|
- before→after: 페이지 수·총 크기·lint 결과.
|
|
74
|
-
- **백업 위치**(`.omc/wiki.bak
|
|
105
|
+
- **백업 위치**(Claude Code `.omc/wiki.bak-*`, Codex `.omx/wiki.bak-*`, 실제로 만든 경로)와 "이상 없으면 삭제해도 됨" 안내.
|
|
75
106
|
|
|
76
107
|
## 작성 원칙 (append-wiki 와 정합)
|
|
77
108
|
- **보존 > 압축.** 압축은 중복·잡음 제거지 지식 삭제가 아니다. 고유 사실은 1건도 잃지 않는다.
|
|
@@ -32,6 +32,11 @@ description: "여러 출처를 병렬로 웹 리서치해 주장을 적대적으
|
|
|
32
32
|
### 1. Scope
|
|
33
33
|
질문을 **~5개 검색 각도**로 분해(상호보완적 관점: 정의/현황·반대근거·정량데이터·사례·시간축 등).
|
|
34
34
|
|
|
35
|
+
질문이 계획, 결정, 구현에 쓰이면 각도 하나를 **그 분야 최고 전문가 그룹의 작업 방식**으로 둔다.
|
|
36
|
+
- 방법은 `lfm` 의 2~5단계를 따른다: 근거가 있는 그룹 선정, 그 그룹이 공개한 1차 자료, 공통 관행과 그룹 고유 관행 구분, 계획 적용 판정(`M-1` …).
|
|
37
|
+
- 부른 쪽이 "전문가 작업 방식은 lfm 이 맡음" 이라고 넘기면 이 각도를 두지 않는다(같은 조사를 두 번 하지 않는다).
|
|
38
|
+
- 이 각도의 주장도 4단계의 적대적 검증을 거친다.
|
|
39
|
+
|
|
35
40
|
### 2. Search
|
|
36
41
|
각도마다 **병렬** 웹검색(Claude=병렬 `Task`+`WebSearch`, Codex=병렬 조사). 각 에이전트는 서로의
|
|
37
42
|
결과를 모른 채 독립 탐색.
|
|
@@ -51,9 +56,15 @@ URL 중복제거 후 상위 **≤15 소스**(`MAX_FETCH=15`) fetch → 각 소
|
|
|
51
56
|
## 출력 형식
|
|
52
57
|
- **요약**: 핵심 발견 3~5개(확신도 표기).
|
|
53
58
|
- **본문**: 주장별 근거 + 출처(URL/제목) + 확신도. 상충 증거는 병기.
|
|
59
|
+
- **전문가 작업 방식**(그 각도를 둔 경우): 고른 그룹과 선정 근거, 공통 관행, 계획 적용 항목 표(`lfm` 출력의 같은 이름 절과 같은 꼴).
|
|
54
60
|
- **출처 목록**: fetch·인용한 소스.
|
|
55
61
|
- **한계**: 검증 폐기된 주장, 미해결 불확실성, 조사 못 한 각도.
|
|
56
62
|
|
|
63
|
+
## 웹 도구가 모두 실패하면
|
|
64
|
+
검색과 fetch 가 모두 실패하면(네트워크 없음) 보고서를 만들지 않고 "웹 조사 불가: <오류>" 로 끝낸다.
|
|
65
|
+
- 모델이 이미 아는 내용을 보탤 때는 "출처 없음(모델 지식)" 으로 따로 표시하고, 검증된 주장처럼 쓰지 않는다.
|
|
66
|
+
- 일부 각도만 실패했으면 그 각도를 한계에 "조사 못 한 각도" 로 적고 나머지로 진행한다.
|
|
67
|
+
|
|
57
68
|
## 함정
|
|
58
69
|
- **적대적 검증 생략 금지** — 그럴듯하나 틀린 주장이 살아남는다(2/3 반증 게이트가 핵심).
|
|
59
70
|
- **단일 검색 각도 의존 금지** — 한 관점은 반드시 놓친다(5각도 병렬).
|
|
@@ -17,21 +17,50 @@ Claude=`AskUserQuestion`, Codex=후보 목록 제시 후 사용자 응답.
|
|
|
17
17
|
for t in python3 pip conda java dot; do command -v $t >/dev/null && echo "$t=yes" || echo "$t=no"; done
|
|
18
18
|
[ -f ~/bin/plantuml.jar ] && echo "plantuml.jar=yes" || echo "plantuml.jar=no"
|
|
19
19
|
[ -f /etc/os-release ] && . /etc/os-release && echo "distro=$ID ${VERSION_ID}"
|
|
20
|
-
python3 -c "import pptx" 2>/dev/null && echo "python-pptx=yes" || echo "python-pptx=no"
|
|
21
|
-
python3 -c "import fitz" 2>/dev/null && echo "pymupdf=yes" || echo "pymupdf=no"
|
|
20
|
+
(cd ~ && python3 -c "import pptx") 2>/dev/null && echo "python-pptx=yes" || echo "python-pptx=no" # 홈에서: -c, -m, 표준 입력 스크립트는 지금 폴더의 모듈을 먼저 불러온다
|
|
21
|
+
(cd ~ && python3 -c "import fitz") 2>/dev/null && echo "pymupdf=yes" || echo "pymupdf=no"
|
|
22
22
|
# 후보 python 스캔 (⚠️ pymupdf/playwright 는 python 3.8+ 필요 — 3.6/3.7 은 휠 없음)
|
|
23
23
|
for v in 3.13 3.12 3.11 3.10 3.9 3.8; do command -v python$v >/dev/null && echo "python$v=$(python$v --version 2>&1)"; done
|
|
24
24
|
ls -d ~/.venvs/*/bin/python ~/miniconda3/envs/*/bin/python /usr/bin/python3* 2>/dev/null
|
|
25
25
|
conda env list 2>/dev/null
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
### 네트워크 확인 (내려받기 전)
|
|
29
|
+
|
|
30
|
+
이 스킬이 내려받는 원천에 10초 안에 닿는지 먼저 본다. 닿지 않으면 그 원천에서 받는 단계는 하지 않고, 이미 설치된 것의 확인만 한 뒤 "오프라인이라 설치하지 않음(필요한 것: <못 깐 것>)" 으로 보고한다.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
[ "${CODEX_SANDBOX_NETWORK_DISABLED:-}" = 1 ] && echo "Codex sandbox 가 네트워크를 막음(아래 실패는 오프라인이 아님)"
|
|
34
|
+
# pip 이 읽는 설정 전부(PIP_CONFIG_FILE 포함)를 홈 폴더에서 읽는다. install 절이 global 절보다 앞선다
|
|
35
|
+
L=$( (cd ~ && { pip config list || pip3 config list || python3.13 -m pip config list || python3.12 -m pip config list || python3.11 -m pip config list || python3 -m pip config list; }) 2>/dev/null) || echo "pip 설정을 읽지 못함(pip 이 없거나 10 미만). 사내 미러를 쓰면 확인 주소를 그 미러로 바꿔 본다"
|
|
36
|
+
I="${PIP_INDEX_URL:-$(printf '%s\n' "$L" | sed -n "s/^install\.index-url='\(.*\)'$/\1/p")}"
|
|
37
|
+
I="${I:-$(printf '%s\n' "$L" | sed -n "s/^global\.index-url='\(.*\)'$/\1/p")}"
|
|
38
|
+
I=$(printf %s "${I:-https://pypi.org/simple}" | sed -E 's#^([A-Za-z][A-Za-z0-9+.-]*://)[^/]*@#\1#; s#/$##') # 주소의 사용자 정보는 뗌
|
|
39
|
+
printf 'url = "%s"\n' "$I/pip/" | curl --ssl-no-revoke -K - -sSI -o /dev/null --connect-timeout 5 --max-time 10 # python-pptx, pymupdf
|
|
40
|
+
curl --ssl-no-revoke -sSI -o /dev/null --connect-timeout 5 --max-time 10 https://github.com # plantuml.jar
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- `curl -sSI` 는 머리만 받는다(본문을 받지 않음). 닿지 못하면 종료 코드가 0 이 아니다(HTTP 상태와 관계없음). `curl` 은 `HTTPS_PROXY` 를 따른다. 확인 줄은 `--ssl-no-revoke` 를 준다. Windows 의 Git Bash curl 도 Schannel 이라, 폐지 목록 서버에 닿지 못하는 망에서 폐지 확인이 실패하면 종료 60 이다(Windows 박스 실측). 다른 curl 은 이 깃발을 받고 무시한다(macOS curl 8.7.1, Rocky 8.10 curl 7.61.1 실측).
|
|
44
|
+
- PyPI 는 pip 이 쓰는 색인(`PIP_INDEX_URL`, `pip config list` 의 `install.index-url` 이나 `global.index-url`, 없으면 pypi.org)의 작은 쪽(`<색인>/pip/`)을 본다.
|
|
45
|
+
- `pip config get` 은 `PIP_CONFIG_FILE` 로 준 파일을 읽지 않아(pip 25.0 실측) `pip config list` 를 읽는다.
|
|
46
|
+
- Rocky 8 의 기본 pip(9.0.3, `pip3`)은 `config` 명령이 없고 `pip` 이름은 없다(Rocky 8.10 실측). 그래서 판 붙은 python(3.13, 3.12, 3.11)의 pip 도 차례로 본다.
|
|
47
|
+
- 홈 폴더에서 읽는다. `python3 -m pip` 는 지금 폴더를 import 경로 맨 앞에 두어, 지금 폴더에 있는 남의 저장소의 `pip/` 가 실행될 수 있다.
|
|
48
|
+
- bash 블록은 주소를 명령 인자가 아니라 표준 입력의 curl 설정(`-K -`)으로 넘긴다. 명령 인자는 같은 PC 의 다른 사용자가 `ps` 로 볼 수 있어, 경로나 질의에 든 토큰도 거기 싣지 않는다. 사용자 정보(`사용자:토큰@`)는 떼고 묻는다. 닿는지만 보므로 인증은 필요 없다(401 도 닿은 것이다). Windows 에서도 뗀 주소를 쓴다.
|
|
49
|
+
- Windows PowerShell 에서는 같은 주소를 `curl.exe --ssl-no-revoke -sSI -o NUL --connect-timeout 5 --max-time 10 <주소>` 로 보고 `$LASTEXITCODE` 가 0 인지 본다(PowerShell 5.1 의 `curl` 은 `Invoke-WebRequest` 별칭이다). `curl.exe` 는 Windows 시스템 프록시를 따르지 않고 `HTTPS_PROXY` 만 따른다. `--ssl-no-revoke` 는 폐지 목록 서버에 닿지 못하는 망에서 Schannel 의 폐지 확인 실패를 오프라인으로 읽지 않게 한다. 닿는지만 보고 받은 내용은 쓰지 않으므로 이 확인에만 준다. `curl.exe` 가 없으면 `$LASTEXITCODE` 에 앞 명령의 값이 남으므로 `Get-Command curl.exe -ErrorAction SilentlyContinue` 로 먼저 보고, 없으면 확인하지 못한 것으로 적는다.
|
|
50
|
+
- 사내 미러만 열린 망이면 확인 주소를 그 미러로 바꿔 본다.
|
|
51
|
+
- dnf 단계(graphviz, java, Pillow 빌드 헤더)는 자기 설정의 미러를 쓰므로 이 확인과 관계없이 시도하고, 실패하면 그 단계를 실패로 보고한다.
|
|
52
|
+
- 패킷을 버리거나 답하지 않는 망에서 dnf 는 저장소마다 약 2분(SYN 을 버리는 망 실측 121초) 기다린 뒤 실패로 끝난다. 시간 제한은 관리자 설정을 따르므로 이 스킬이 바꾸지 않는다.
|
|
53
|
+
- Codex sandbox 가 네트워크를 막는 모드(기본 `workspace-write`, `read-only`)에서는 `CODEX_SANDBOX_NETWORK_DISABLED=1` 이 서고 확인이 모두 실패한다(curl 종료 7, npm `EPERM`). 블록의 첫 줄이 그렇다고 알린다. 그때는 '오프라인' 이 아니라 'sandbox 가 네트워크를 막음' 으로 보고하고, 승인을 받아 sandbox 밖에서 확인부터 다시 한다. Claude Code sandbox 안(`SANDBOX_RUNTIME=1`)에서는 허용 목록 밖 주소를 sandbox 프록시가 막는다. Windows PowerShell 에서는 `$env:CODEX_SANDBOX_NETWORK_DISABLED -eq '1'` 로 본다.
|
|
54
|
+
- 확인이 실패하면 보고에 그 명령, 종료 코드, stderr 첫 줄을 붙인다(예: `npm error code ETIMEDOUT`, `curl: (28) ...`). 원인을 '오프라인' 하나로 짐작하지 않는다.
|
|
55
|
+
- curl 의 종료 60(인증서 검증 실패)도 오프라인이 아니다. 망은 열려 있고, TLS 를 가로채는 사내 프록시의 인증서를 OS 가 믿지 않는 것이다. '인증서 문제로 설치하지 않음' 으로 보고한다.
|
|
56
|
+
|
|
28
57
|
## 1. python 환경 선택 (질문 또는 자동)
|
|
29
58
|
- **`--python <path>`**: 주어진 인터프리터 사용.
|
|
30
59
|
- **`--ask`**: 위 스캔 후보를 제시하고 사용자가 택함(Claude=`AskUserQuestion`, Codex=목록 제시).
|
|
31
60
|
- **자동(기본)**: **python 3.8+** 인터프리터로 전용 venv 를 만든다. ⚠️ **system `python3` 가 3.6/3.7 이면 pymupdf/playwright 휠이 없어 실패**(실측: RHEL8 기본 `python3`=3.6 → `No matching distribution`/sdist 빌드 실패) → 위 스캔의 `python3.12`/`python3.11` 등 최신을 우선. 우선순위 = 활성 conda 환경 > 기존 `~/.venvs/banker-docs` > **최신 python3.x 신규 venv**:
|
|
32
61
|
```bash
|
|
33
62
|
PY_BASE="$(command -v python3.12 || command -v python3.11 || command -v python3)" # 3.8+ 우선
|
|
34
|
-
"$PY_BASE" -m venv ~/.venvs/banker-docs
|
|
63
|
+
(cd ~ && "$PY_BASE" -m venv ~/.venvs/banker-docs)
|
|
35
64
|
~/.venvs/banker-docs/bin/pip install -U pip # 최신 pip = wheel 우선(빌드 회피)
|
|
36
65
|
PY=~/.venvs/banker-docs/bin/python
|
|
37
66
|
```
|
|
@@ -39,7 +68,7 @@ conda env list 2>/dev/null
|
|
|
39
68
|
|
|
40
69
|
## 2. python 라이브러리 설치
|
|
41
70
|
```bash
|
|
42
|
-
"$PY" -m pip install -U python-pptx pymupdf # 최신 pip 면 wheel 로 설치(빌드 없음)
|
|
71
|
+
(cd ~ && "$PY" -m pip install -U python-pptx pymupdf) # 최신 pip 면 wheel 로 설치(빌드 없음)
|
|
43
72
|
```
|
|
44
73
|
- 그래도 빌드 실패(휠 부재·헤더 부재)면 **정직 보고**: root 면 `dnf install -y gcc zlib-devel libjpeg-turbo-devel`(Pillow 빌드용) 후 재시도, 아니면 conda 경로 권장(가짜 성공 금지).
|
|
45
74
|
|
|
@@ -47,8 +76,9 @@ conda env list 2>/dev/null
|
|
|
47
76
|
java 필요(`java -version`). plantuml.jar + 래퍼:
|
|
48
77
|
```bash
|
|
49
78
|
mkdir -p ~/bin
|
|
50
|
-
[ -f ~/bin/plantuml.jar ] || curl -fsSL -o ~/bin/plantuml.jar \
|
|
51
|
-
https://github.com/plantuml/plantuml/releases/latest/download/plantuml.jar
|
|
79
|
+
[ -f ~/bin/plantuml.jar ] || { curl -fsSL --connect-timeout 10 --speed-limit 1000 --speed-time 30 -o ~/bin/plantuml.jar.part \
|
|
80
|
+
https://github.com/plantuml/plantuml/releases/latest/download/plantuml.jar && mv ~/bin/plantuml.jar.part ~/bin/plantuml.jar; }
|
|
81
|
+
rm -f ~/bin/plantuml.jar.part # 받다가 끊긴 조각(완성본만 plantuml.jar 이름을 얻는다)
|
|
52
82
|
cat > ~/bin/plantuml <<'EOF'
|
|
53
83
|
#!/bin/bash
|
|
54
84
|
exec java -jar "$HOME/bin/plantuml.jar" "$@"
|
|
@@ -66,7 +96,7 @@ grep -q 'HOME/bin' <<<"$PATH" || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bash
|
|
|
66
96
|
|
|
67
97
|
## 5. 검증 (보고 의무)
|
|
68
98
|
```bash
|
|
69
|
-
"$PY" -c "import pptx, fitz; print('pptx', pptx.__version__, '| pymupdf OK')"
|
|
99
|
+
(cd ~ && "$PY" -c "import pptx, fitz; print('pptx', pptx.__version__, '| pymupdf OK')")
|
|
70
100
|
~/bin/plantuml -version 2>/dev/null | head -1 || java -jar ~/bin/plantuml.jar -version 2>/dev/null | head -1
|
|
71
101
|
command -v dot >/dev/null && dot -V 2>&1 | head -1 || echo "graphviz(dot) 없음(시퀀스류는 OK)"
|
|
72
102
|
```
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lfm
|
|
3
|
+
description: "learn from master. 어떤 분야의 최고 전문가 그룹이 실제로 일하는 방식을 그들이 공개한 1차 자료로 조사함. 작업 순서, 역할, 품질 기준, 검토 관행, 도구, 흔한 실패와 대응을 정리하고, 계획에 바로 쓸 적용 항목으로 바꿈. 'lfm'/'learn from master'/'전문가 작업 방식'/'대가에게 배우기' 시 사용."
|
|
4
|
+
argument-hint: "<분야나 작업> [--out <파일>] [--no-questions]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# lfm: learn from master
|
|
8
|
+
|
|
9
|
+
어떤 분야의 최고 전문가 그룹이 그 일을 실제로 어떻게 하는지 조사한다. 답변은 한글.
|
|
10
|
+
결과는 읽을거리가 아니라 계획의 입력이다. 모든 관행은 "우리 계획에 어떻게 쓰는가" 한 줄로 끝난다.
|
|
11
|
+
|
|
12
|
+
다른 스킬(`ultra-interview`, `ultra-chain`, `deep-research`, `rfp-author`)이 리서치 단계에서 이 스킬을 부른다. 혼자 불러도 된다.
|
|
13
|
+
|
|
14
|
+
## 언제 쓰나
|
|
15
|
+
|
|
16
|
+
- 처음 하는 종류의 일을 계획하기 전에, 그 분야의 잘하는 사람들이 어떻게 하는지 알고 싶을 때
|
|
17
|
+
- 계획이나 기준이 혼자 정한 것인지, 분야의 검증된 관행에 맞는지 확인하고 싶을 때
|
|
18
|
+
- 사용자가 `lfm`, `learn from master`, `전문가 작업 방식`, `대가에게 배우기` 라고 할 때
|
|
19
|
+
|
|
20
|
+
## 쓰지 않을 때
|
|
21
|
+
|
|
22
|
+
- 사실 하나를 찾는 일. 그건 웹 검색 한 번이나 `deep-research` 다.
|
|
23
|
+
- 사내 비공개 절차처럼 공개 자료가 없는 일. 이 스킬은 공개된 것만 다룬다.
|
|
24
|
+
|
|
25
|
+
## 인자
|
|
26
|
+
|
|
27
|
+
- 첫 인자는 분야나 작업이다(예: `결제 API 설계`, `모바일 앱 출시 QA`, `소프트웨어 외주 RFP`).
|
|
28
|
+
- `--out <파일>`: 결과를 그 파일에도 쓴다. 다른 스킬이 부를 때 쓴다.
|
|
29
|
+
- `--no-questions`: 사용자에게 묻지 않는다. 분야가 넓으면 스스로 좁히고 그 판단을 결과의 "분야" 줄에 적는다. 다른 스킬이 부를 때는 언제나 이 인자를 준다.
|
|
30
|
+
|
|
31
|
+
## 절차
|
|
32
|
+
|
|
33
|
+
### 1. 분야 좁히기
|
|
34
|
+
|
|
35
|
+
- 요청에서 분야를 1~3개로 정한다. 작업이 두 분야에 걸치면 둘 다 둔다(예: `결제 API 설계` 는 결제 시스템 엔지니어링과 API 설계).
|
|
36
|
+
- 분야가 너무 넓으면(예: `개발`) 질문 하나로 좁힌다. `--no-questions` 면 요청의 맥락으로 좁히고 그 이유를 적는다.
|
|
37
|
+
- 적용 대상의 전제를 함께 정한다: 팀 규모, 조직 형태(사내, 오픈소스, 외주), 규제, 일정. 5단계의 판정이 이 전제에 크게 좌우된다. `--no-questions` 면 맥락에서 정하고 가정으로 적는다.
|
|
38
|
+
|
|
39
|
+
### 2. 최고 전문가 그룹 고르기 (분야마다 3~5곳)
|
|
40
|
+
|
|
41
|
+
이름값으로 고르지 않는다. 아래 근거 중 하나 이상이 공개 자료로 확인되는 곳만 고른다.
|
|
42
|
+
|
|
43
|
+
| 근거 | 예 |
|
|
44
|
+
|---|---|
|
|
45
|
+
| 그 분야의 표준, 사양, 지침을 쓰거나 관리함 | 표준 기구의 작업반, 사양 편집 조직 |
|
|
46
|
+
| 그 분야에서 널리 쓰이는 도구나 오픈소스를 만들고 유지함 | 주요 프레임워크 유지 조직 |
|
|
47
|
+
| 작업 방식을 직접 공개함 | 엔지니어링 핸드북, 설계 문서 관행, 공개 포스트모템 |
|
|
48
|
+
| 같은 분야 사람들이 기준으로 인용함 | 다른 그룹의 문서가 그 방식을 기준으로 삼음 |
|
|
49
|
+
|
|
50
|
+
- 그룹마다 선정 근거와 그 출처 URL 을 단다.
|
|
51
|
+
- 기업, 표준 기구, 오픈소스 프로젝트, 연구 그룹, 공공 기관 모두 될 수 있다. 한 종류로 치우치지 않게 한다.
|
|
52
|
+
|
|
53
|
+
### 3. 작업 방식 조사
|
|
54
|
+
|
|
55
|
+
그룹이 직접 공개한 1차 자료만 근거로 쓴다: 핸드북, 엔지니어링 블로그, 설계 문서와 RFC, 표준 문서, 포스트모템, 그 그룹 사람이 한 발표, 그 그룹이 쓴 책.
|
|
56
|
+
"OO 의 일하는 방식 10가지" 같은 남의 요약은 1차 자료를 찾는 길잡이로만 쓰고 근거로 달지 않는다.
|
|
57
|
+
|
|
58
|
+
그룹마다 아래 여섯 관점을 본다. 자료가 없는 관점은 비워 두고 "자료 없음" 으로 적는다.
|
|
59
|
+
|
|
60
|
+
| 관점 | 찾는 것 |
|
|
61
|
+
|---|---|
|
|
62
|
+
| 작업 순서 | 단계와 단계마다 나오는 산출물 |
|
|
63
|
+
| 역할과 결정 | 누가 정하고 누가 검토하는가, 결정 기록 방식 |
|
|
64
|
+
| 품질 기준 | 완료의 정의, 수치 기준(성능, 결함, 가용성 등) |
|
|
65
|
+
| 검토와 검증 | 리뷰 방식, 시험 범위, 단계적 출시, 되돌리기 |
|
|
66
|
+
| 도구와 형식 | 템플릿, 체크리스트, 문서 형식 |
|
|
67
|
+
| 흔한 실패와 대응 | 그 그룹이 공개한 실패와 그 뒤 바꾼 관행 |
|
|
68
|
+
|
|
69
|
+
- 1차 자료를 읽지 못하면(PDF 를 풀 도구가 없음, 접근 막힘) 한계에 적는다. 그 자료의 수치를 남의 요약으로만 알면 "모델 지식(미확인)" 과 같이 다룬다.
|
|
70
|
+
|
|
71
|
+
조사 수단:
|
|
72
|
+
- Claude Code: `WebSearch`, `WebFetch`. 분야나 그룹이 여럿이면 그룹마다 독립 에이전트를 병렬로 띄운다. 에이전트를 띄울 수 없거나 이미 하위 에이전트로 돌고 있으면 그룹을 차례로 조사한다.
|
|
73
|
+
- Codex: 런타임의 웹 검색과 가져오기. OMX `best-practice-research` 가 있으면 함께 쓴다.
|
|
74
|
+
|
|
75
|
+
### 4. 교차 확인
|
|
76
|
+
|
|
77
|
+
- 두 그룹 이상에서 같은 관행이 보이면 "공통 관행", 한 그룹에만 있으면 "그룹 고유 관행" 이다.
|
|
78
|
+
- 공통 관행마다 반대 근거를 한 번 찾는다(그 관행이 실패한 사례, 그 그룹이 나중에 버린 기록). 찾았으면 표의 "반대 근거" 칸에 적는다. 그룹 고유 관행은 적용 판정을 하기 전에만 찾는다.
|
|
79
|
+
- 같은 관행인데 그룹마다 숫자가 다르면(예: 변경 크기 상한) 차이를 "반대 근거" 칸에 적고, 판정은 "조정" 을 기본으로 한다.
|
|
80
|
+
- 그 그룹이 나중에 바꾼 관행은 지금 것을 적고 바뀐 시점을 남긴다.
|
|
81
|
+
- 출처 없이 알고 있는 내용은 "모델 지식(미확인)" 으로 따로 적고, 적용 항목의 근거로 쓰지 않는다.
|
|
82
|
+
|
|
83
|
+
### 5. 계획 적용 항목
|
|
84
|
+
|
|
85
|
+
관행마다 이 작업의 계획에 무엇을 할지 한 줄로 정한다. 번호는 `M-1`, `M-2` 처럼 단다.
|
|
86
|
+
|
|
87
|
+
| 판정 | 뜻 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| 적용 | 그대로 계획에 넣는다 |
|
|
90
|
+
| 조정 | 규모나 제약에 맞게 줄이거나 바꿔 넣는다. 무엇을 바꿨는지 적는다 |
|
|
91
|
+
| 제외 | 이 작업에는 맞지 않는다. 이유를 적는다(규모, 비용, 규제, 팀 구성 등) |
|
|
92
|
+
|
|
93
|
+
- 공통 관행은 적용이나 조정이 기본이다. 제외하면 이유가 더 구체적이어야 한다.
|
|
94
|
+
- 품질 기준은 숫자 그대로 옮기지 않는다. 이 작업의 수용 기준 후보로 적고, 그대로 쓸 수 있는지 판정한다.
|
|
95
|
+
|
|
96
|
+
## 출력
|
|
97
|
+
|
|
98
|
+
`--out` 이 있으면 그 파일에도 같은 내용을 쓴다.
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
# 전문가 작업 방식: <분야>
|
|
102
|
+
|
|
103
|
+
- 분야: <좁힌 분야와 그 이유>
|
|
104
|
+
- 적용 대상 전제: <팀 규모, 조직 형태, 규제, 일정. 가정이면 가정이라고 적음>
|
|
105
|
+
- 조사 시각: <YYYY-MM-DD>
|
|
106
|
+
|
|
107
|
+
## 고른 그룹
|
|
108
|
+
| 그룹 | 선정 근거 | 출처 |
|
|
109
|
+
|
|
110
|
+
## 관점별 자료
|
|
111
|
+
| 그룹 | 작업 순서 | 역할과 결정 | 품질 기준 | 검토와 검증 | 도구와 형식 | 실패와 대응 |
|
|
112
|
+
(칸마다 "있음" 이나 "자료 없음")
|
|
113
|
+
|
|
114
|
+
## 공통 관행
|
|
115
|
+
| 관행 | 관점 | 그룹 | 출처 | 반대 근거 |
|
|
116
|
+
|
|
117
|
+
## 그룹 고유 관행
|
|
118
|
+
| 관행 | 관점 | 그룹 | 출처 |
|
|
119
|
+
|
|
120
|
+
## 품질 기준 후보
|
|
121
|
+
| 기준 | 그룹 | 출처 |
|
|
122
|
+
|
|
123
|
+
## 흔한 실패와 대응
|
|
124
|
+
| 실패 | 대응 | 그룹 | 출처 |
|
|
125
|
+
|
|
126
|
+
## 계획 적용 항목
|
|
127
|
+
| 번호 | 관행 | 판정 | 계획에 넣을 것, 또는 제외 이유 |
|
|
128
|
+
|
|
129
|
+
## 한계
|
|
130
|
+
- 자료를 찾지 못한 관점과 그룹
|
|
131
|
+
- 읽지 못한 1차 자료
|
|
132
|
+
- 모델 지식(미확인)으로만 아는 것
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 웹 도구가 모두 실패하면
|
|
136
|
+
|
|
137
|
+
검색과 가져오기가 모두 실패하면(네트워크 없음) 결과를 만들지 않고 "웹 조사 불가: <오류>" 로 끝낸다.
|
|
138
|
+
모델이 아는 관행으로 표를 채우지 않는다. 부른 스킬은 이 결과를 "전문가 작업 방식 조사 못 함" 으로 기록하고 진행한다.
|
|
139
|
+
|
|
140
|
+
## 함정
|
|
141
|
+
|
|
142
|
+
- 이름값으로 그룹을 고르는 것. 근거 없는 "업계 최고" 는 쓰지 않는다.
|
|
143
|
+
- 남의 요약글을 1차 자료처럼 다는 것.
|
|
144
|
+
- 관행을 나열만 하고 계획 적용 판정을 빼는 것. 판정 없는 관행은 이 스킬의 결과가 아니다.
|
|
145
|
+
- 큰 조직의 관행을 작은 작업에 그대로 옮기는 것. 규모 차이는 "조정" 이나 "제외" 로 드러낸다.
|
|
146
|
+
- 공개되지 않은 사내 절차를 짐작해 채우는 것.
|
|
147
|
+
|
|
148
|
+
ARGUMENTS: <분야나 작업> [--out <파일>] [--no-questions]
|
package/skills/lineage/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: lineage
|
|
3
3
|
description: "현재 세션 대화를 카카오톡 스타일의 단일 HTML 로 내보냄. Claude 답변은 한 줄 요약 아래에 원문을 접어 두고, 펼치면 마크다운으로 렌더해 보여 줌. 기본은 세션 모델이 요약을 쓰고 노이즈 턴을 걸러 내며, `--rulebase` 는 모델 없이 규칙만 씀. 여러 세션을 합칠 수 있음. 'lineage'/'대화 export'/'카톡 스타일 html' 시 사용."
|
|
4
4
|
invocation: /lineage
|
|
5
|
-
version: 3.
|
|
5
|
+
version: 3.1.1
|
|
6
6
|
schema_version: 1
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -17,7 +17,7 @@ Claude 본문은 **마크다운으로 렌더**(헤딩·리스트·표·코드·
|
|
|
17
17
|
노이즈(스킬 본문·compaction 요약·조작 명령·에코 교환)는 **기본으로 걸러진다**.
|
|
18
18
|
Secret 자동 redaction. 규칙 단계는 결정론(turn uuid·요약기버전 캐시)이고, 세션 모델의 검토 결정은 캐시해 다음 실행에 다시 쓴다.
|
|
19
19
|
|
|
20
|
-
> **3.0.6** — 글자 방향을 바꾸는 제어 문자 9자(U+202A~202E, U+2066~2069)는 `--no-markdown` 이어도 `[U+202E]` 처럼 보이는 표지로
|
|
20
|
+
> **3.0.6** — 글자 방향을 바꾸는 제어 문자 9자(U+202A~202E, U+2066~2069)는 `--no-markdown` 이어도 `[U+202E]` 처럼 보이는 표지로 넣는다(3.0.9 부터 페이지 제목도). 화면의 글자 순서가 실제와 달라 보이는 속임수를 막기 위해서다. 방향 표시(LRM, RLM, ALM)는 그대로 둔다.
|
|
21
21
|
|
|
22
22
|
> **3.0.0 — 기본 흐름이 세션 모델 검토로 바뀌었습니다.**
|
|
23
23
|
> - 규칙이 1차로 정리한 턴을 세션 모델이 다시 검토한다. 요약 줄을 직접 쓰고, 남길 턴과 뺄 턴을 고른다.
|
|
@@ -41,7 +41,7 @@ Secret 자동 redaction. 규칙 단계는 결정론(turn uuid·요약기버전
|
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
/lineage # 자동: 최근 jsonl → 세션 모델 검토 → 접힌 채팅(권장 기본)
|
|
44
|
-
/lineage --rulebase # 규칙만, 한 번에 (2.x
|
|
44
|
+
/lineage --rulebase # 규칙만, 한 번에 (2.x 흐름, 모델 호출 없음. 가림과 표지는 3.x)
|
|
45
45
|
/lineage --open # 처음부터 전부 펼침 (기본은 접힘)
|
|
46
46
|
/lineage --all-sessions # 프로젝트 폴더의 모든 세션을 시간순 한 줄기로
|
|
47
47
|
/lineage --last 50 # 최근 50 turn
|
|
@@ -84,7 +84,7 @@ Python 은 3.7 이상을 쓴다(EL8 기본 `python3` 는 3.6 이라 `python3.11`
|
|
|
84
84
|
python3 "<스킬 폴더>/lineage.py" <사용자 인자> --emit-review work/.lineage-review.json
|
|
85
85
|
```
|
|
86
86
|
- stderr 의 `part K/N: <파트 파일> (to review: X) -> <결정 파일>` 한 줄이 검토 1건이다.
|
|
87
|
-
- 자동 탐색이 고른 기록(stderr 의 `auto-discovered session:`)을 사용자에게 알린다. Codex 에서는
|
|
87
|
+
- 자동 탐색이 고른 기록(stderr 의 `auto-discovered session:`)을 사용자에게 알린다. Codex 에서는 지금 Codex 세션의 기록(rollout)이 골라진다.
|
|
88
88
|
- 검토할 파트가 6개를 넘으면 진행 전에 묻는다. Claude Code 는 `AskUserQuestion` 으로 진행, `--last N`, `--rulebase` 중에서 고르게 한다. 물을 수 없는 실행이면 파트 수를 알리고 진행한다. 물을 때는 비용도 알린다: 파트 하나에 검토 에이전트 1개가 돌고, 이 저장소 실측은 40턴 파트 하나에 약 11만 토큰과 7분이었다.
|
|
89
89
|
- 묶음의 본문은 이미 redact 되어 있다. 검토자가 읽는 파트 파일은 `--redact-mode` 와 관계없이 전부 가린다(Cache & Secret Hygiene).
|
|
90
90
|
- 규칙이 확실한 노이즈(래퍼 블록, 훅 피드백, 중단 표시, 주입된 스킬과 워크플로 본문, 하네스 오류, 조작 명령)는 이미 빠져 있다. `--keep-trivia` 를 주면 규칙이 주입 본문, 하네스 오류, 조작 명령, 에코 교환을 남기고(래퍼 블록, 훅 피드백, 중단 표시는 그래도 빠진다), 파트 파일의 `keep_trivia: true` 가 검토자에게 턴을 빼지 말라고 알린다.
|
|
@@ -125,7 +125,7 @@ Python 은 3.7 이상을 쓴다(EL8 기본 `python3` 는 3.6 이라 `python3.11`
|
|
|
125
125
|
- 캐시 폴더에 쓸 수 없으면(예: Codex 의 `workspace-write` 샌드박스) 이번 결정을 저장하지 못한다는 WARN 을 한 번 낸다. 앞선 실행이 남긴 결정은 읽는다.
|
|
126
126
|
5. **마무리** — 출력 HTML 경로를 알린다.
|
|
127
127
|
- 렌더가 성공하면 스크립트가 묶음, 파트 파일, 결정 파일, 게이트 샘플을 지운다. redact 된 세션 본문이 들어 있기 때문이다. 실패(exit 2)면 남겨 둔다.
|
|
128
|
-
- 렌더가 `reviewers dropped N typed user turn(s)` WARN 을 내면, 검토자가 뺀 사용자 입력 턴의 수와 id 를 사용자에게 알린다. 검토자가 기록 속 주입 문장을 따랐을 수 있다.
|
|
128
|
+
- 렌더가 `reviewers dropped N typed user turn(s)` WARN 을 내면, 검토자가 뺀 사용자 입력 턴의 수와 id 를 사용자에게 알린다. 검토자가 기록 속 주입 문장을 따랐을 수 있다. `meta: true` 턴과 `!` 명령 뒤 하네스가 쓴 출력 턴(`<bash-stdout>` 블록 뒤 `<bash-stderr>` 블록, 실패하면 `<bash-stderr>` 블록 하나만 있는 턴. 가리기 전 글로 본다)은 세지 않는다.
|
|
129
129
|
- 렌더가 `the page still holds secret-like text (<패턴>=N)` WARN 을 내면, 패턴 이름과 수를 사용자에게 알리고 공유하기 전에 페이지를 확인하라고 말한다. 검토자 패턴이 렌더된 페이지 글에서 다시 찾은 값이다(예: 마크다운으로 꾸민 `**Password**: 값`). 그 값을 `LINEAGE_REDACT_EXTRA` 에 넣어 다시 만들 수 있다(값을 명령줄에 그대로 치면 셸 기록에 남는다). 다시 만들어도 앞서 만든 페이지(`--rulebase` 는 그 옆의 게이트 샘플도)는 그 값을 가진 채 남으므로 지우라고 알린다.
|
|
130
130
|
- 품질 게이트는 1단계나 4단계에 `--reviewer-output <판정 파일>` 을 줄 때만 돈다. 검토자가 이미 모든 턴을 봤으므로 기본 흐름은 샘플을 쓰지 않는다.
|
|
131
131
|
- 판정 파일에는 아직 없는 경로를 준다. 그 자리에 판정 목록이 아닌 것(사용자 파일, 폴더, 판정 모양이 아닌 JSON)이 있으면 스크립트는 샘플을 쓰기 전에 exit 2 로 멈추고 그 파일을 건드리지 않는다. 1단계에 준 경로도 검토자를 띄우기 전에 exit 2 로 멈춘다.
|
|
@@ -176,8 +176,10 @@ Python 은 3.7 이상을 쓴다(EL8 기본 `python3` 는 3.6 이라 `python3.11`
|
|
|
176
176
|
|
|
177
177
|
```
|
|
178
178
|
--all-sessions → 프로젝트 폴더의 모든 *.jsonl (레코드단위 시간순 병합)
|
|
179
|
+
Codex 안이면 첫 기록(session_meta)의 cwd 가 지금 폴더인 rollout 전부
|
|
179
180
|
또는 단일 세션:
|
|
180
|
-
auto-discover (
|
|
181
|
+
auto-discover: Codex 안이면(CODEX_THREAD_ID) <CODEX_HOME>/sessions/*/*/*/rollout-*-<그 id>.jsonl,
|
|
182
|
+
아니면 (~/.claude/projects/<encoded-cwd>/*.jsonl most-recent)
|
|
181
183
|
→ --session FILE 명시
|
|
182
184
|
→ --from-transcript - stdin paste
|
|
183
185
|
→ 모두 실패 시 exit 2 + 옵션 안내
|
|
@@ -187,6 +189,12 @@ auto-discover (~/.claude/projects/<encoded-cwd>/*.jsonl most-recent)
|
|
|
187
189
|
(Claude Code 의 실제 project-dir 명명과 일치 — `_` 도 `-` 로). 비-ASCII cwd(한글 등)는
|
|
188
190
|
자동탐색이 빗나갈 수 있으니 `--session` 을 쓴다.
|
|
189
191
|
|
|
192
|
+
기록 형식은 첫 레코드로 가린다. 첫 레코드가 `session_meta` 이면 Codex rollout 으로 읽는다.
|
|
193
|
+
- 사용자 턴: `event_msg` 의 `user_message`(사용자가 입력한 글). 모델 입력에 들어간 환경, 지침, 주입된 스킬 본문(`response_item` 의 사용자 메시지)은 턴이 아니다.
|
|
194
|
+
- 모델 턴: `event_msg` 의 `agent_message`.
|
|
195
|
+
- 도구 호출: `response_item` 의 `*_call`(이름은 `name`, 없으면 종류). 본문 없는 모델 레코드라 Claude Code 의 `tool_use` 처럼 앞뒤 모델 턴에 합쳐진다. 도구 결과(`*_call_output`)는 읽지 않는다.
|
|
196
|
+
- `compacted` 는 compaction 구분선이다.
|
|
197
|
+
|
|
190
198
|
Schema-tolerant 파서: 미지 record type → stderr WARN + 다음 line. `v1`/`v2` 같은 schema marker
|
|
191
199
|
발견 시 `--unsafe-schema` 명시 없으면 exit 2. UTF-8 디코드 실패 파일은 그 파일만 건너뛴다(전체 실패 X).
|
|
192
200
|
|
|
@@ -214,8 +222,8 @@ Schema-tolerant 파서: 미지 record type → stderr WARN + 다음 line. `v1`/`
|
|
|
214
222
|
|
|
215
223
|
기본 흐름에서는 검토자 요약이 우선이고, 검토자가 `null` 로 둔 턴만 아래 규칙 요약을 쓴다. `--rulebase` 는 규칙 요약만 쓴다.
|
|
216
224
|
|
|
217
|
-
- 캐시 hit(`~/.cache/lineage/<schema>/<sid>/<uuid>-<digest>.md
|
|
218
|
-
|
|
225
|
+
- 캐시 hit(`~/.cache/lineage/<schema>/<sid>/<uuid>-<digest>.md`. `.txt` 는 3.0.2 까지 쓴 이름이고, 요약기 버전 4 부터 그 캐시는 쓰지 않는다) → 그대로. digest 는 본문+요약기버전
|
|
226
|
+
해시다. 요약기나 가림을 바꾼 판은 요약기 버전(`SUMMARIZER_VERSION`)을 올려 옛 캐시를 쓰지 않는다. 버전을 그대로 두고 바꾸면 옛 요약이 다시 쓰인다(3.0.8 이 그랬다).
|
|
219
227
|
- 캐시는 64KiB 이하의 일반 파일만 읽고 링크는 따르지 않는다. 그 자리의 FIFO, 링크, 큰 파일, 깊게 중첩된 결정 캐시는 읽지 못한 것으로 보고 다시 요약한다(3.0.6).
|
|
220
228
|
- miss → head+tail 추출(도입이 순수 의도문이면 결론절을 끝에서 읽어 승격) + 0600 캐시 쓰기.
|
|
221
229
|
- 요약 저장은 항상 **redact 적용 후**(평문 secret 이 디스크에 남지 않음).
|
|
@@ -238,7 +246,7 @@ Schema-tolerant 파서: 미지 record type → stderr WARN + 다음 line. `v1`/`
|
|
|
238
246
|
(Ctrl/Cmd/Alt·한글 IME 안전 — `e.code` 우선이라 브라우저 기본 동작을 가로채지 않음.)
|
|
239
247
|
- 우하단 `?` 버튼으로 범례/단축키 오버레이(배경 클릭으로만 닫힘).
|
|
240
248
|
|
|
241
|
-
**출력 파일명**: 기본 `work/lineage-{session-name}.html`(`customTitle` 슬러그,
|
|
249
|
+
**출력 파일명**: 기본 `work/lineage-{session-name}.html`(`customTitle` 슬러그, 없거나 슬러그에 키 같은 비밀 모양이 남으면 sid 앞 8자;
|
|
242
250
|
`--all-sessions` 는 `all-sessions`). basename 끝에 `_YYMMDD+HHMM` 자동 부착(이미 있으면 그대로 — idempotent).
|
|
243
251
|
|
|
244
252
|
### 6. Verify (self-test)
|
|
@@ -273,12 +281,12 @@ WARN 발견 시 stderr 보고, 출력은 그대로 작성(인간 검토 가능).
|
|
|
273
281
|
검토자 결정 캐시(`<uuid>-<digest>-llm.json`)도 redact 하고 자른 요약만 담는다. digest 는 redact 된 본문, 그 턴의 규칙 결정, keep 플래그의 해시다. 본문이 바뀌면 다시 검토한다. `keep: null` 은 그 실행의 규칙을 따른다는 뜻이라, 규칙 결정이나 keep 플래그가 다른 실행(`--keep-trivia` 실행과 기본 실행, `--all-sessions` 실행과 단일 세션 실행)에서도 다시 검토한다.
|
|
274
282
|
검토 묶음과 파트 파일은 redact 된 본문만 담고 0600 으로 쓴다(임시 파일은 mkstemp). 렌더가 성공하면 스크립트가 지운다(실행 절차 5).
|
|
275
283
|
stdin(`--from-transcript -`)으로 넣은 기록의 턴 id 는 본문을 캐시 폴더의 무작위 키(`stdin-id.key`, 0600)로 HMAC 한 값이다. 같은 머신에서는 id 가 그대로라 캐시를 다시 쓰고, 파트 파일을 읽는 모델은 id 로 본문을 맞혀 볼 수 없다.
|
|
276
|
-
검토자가 읽는 파트 파일은 `--redact-mode mask` 여도 가린 자리에 값의 일부를 남기지 않는다. 페이지에는 없는 패턴(Anthropic, OpenAI, Google 키, 따옴표 없는 password·비밀번호, 16진 키, URL 안 자격 증명, Bearer 토큰, Basic 인증 헤더(따옴표 친 키, 첨자 대입, `=>`, 헤더 설정 호출과 HAR 의 name/value, nginx 처럼 공백 뒤 따옴표 포함), curl `-u` 의 사용자와 비밀번호(붙여 쓴 `-uUSER:PW`, `-su`, `-4u` 같은 묶음, 따로 감싼 `"USER":"PW"`, 따옴표 친 명령 속의 이스케이프한 따옴표(`\"USER:PW\"`, 여러 겹 JSON), bash 의 `'\''` 와 `shlex.quote` 의 `'"'"'`, cmd 의 `^"`, PowerShell 의 `` `" ``, bash 의 `$'…'`, `${API_USER}` 같은 변수 사용자와 변수에 이은 사용자(`"$USER"@corp.com`, `"${ENV}"-deployer`), 인라인 코드나 괄호 안, 인자 목록, 빈 사용자나 빈 비밀번호 포함))도 파트 파일에서는 가린다. URL 의 비밀번호는 호스트 앞 마지막 `@` 까지 가린다. 이 패턴은 엔트로피 규칙보다 먼저 적용해 키를 통째로 가린다. 3.0.2 부터 검토자 패턴은 모든 페이지(기본 흐름과 `--rulebase`)에도 건다. 페이지에서도 검토자 패턴이 찾은 값은 `--redact-mode mask` 여도 전부 가리고, 페이지 패턴만 mask 를 따른다. 본문, 요약, 접힌 요약, 에이전트 이름, 세션 이름, 기본 흐름 묶음에 걸고, 도구 이름은 `--redact-extra` 키워드를 가린다. 렌더 뒤 페이지 글에 검토자 패턴을 다시 돌려 남은 것이 있으면 WARN 을 낸다. `--rulebase` 출력은
|
|
284
|
+
검토자가 읽는 파트 파일은 `--redact-mode mask` 여도 가린 자리에 값의 일부를 남기지 않는다. 페이지에는 없는 패턴(Anthropic, OpenAI, Google 키, 따옴표 없는 password·비밀번호, 16진 키, URL 안 자격 증명, Bearer 토큰, Basic 인증 헤더(따옴표 친 키, 첨자 대입, `=>`, 헤더 설정 호출과 HAR 의 name/value, nginx 처럼 공백 뒤 따옴표 포함), curl `-u` 의 사용자와 비밀번호(붙여 쓴 `-uUSER:PW`, `-su`, `-4u` 같은 묶음, 따로 감싼 `"USER":"PW"`, 따옴표 친 명령 속의 이스케이프한 따옴표(`\"USER:PW\"`, 여러 겹 JSON), bash 의 `'\''` 와 `shlex.quote` 의 `'"'"'`, cmd 의 `^"`, PowerShell 의 `` `" ``, bash 의 `$'…'`, `${API_USER}` 같은 변수 사용자와 변수에 이은 사용자(`"$USER"@corp.com`, `"${ENV}"-deployer`), 인라인 코드나 괄호 안, 인자 목록, 빈 사용자나 빈 비밀번호 포함))도 파트 파일에서는 가린다. URL 의 비밀번호는 호스트 앞 마지막 `@` 까지 가린다. 이 패턴은 엔트로피 규칙보다 먼저 적용해 키를 통째로 가린다. 3.0.2 부터 검토자 패턴은 모든 페이지(기본 흐름과 `--rulebase`)에도 건다. 페이지에서도 검토자 패턴이 찾은 값은 `--redact-mode mask` 여도 전부 가리고, 페이지 패턴만 mask 를 따른다. 본문, 요약, 접힌 요약, 에이전트 이름, 세션 이름, 기본 흐름 묶음에 걸고, 도구 이름은 `--redact-extra` 키워드를 가린다. 렌더 뒤 페이지 글에 검토자 패턴을 다시 돌려 남은 것이 있으면 WARN 을 낸다. `--rulebase` 출력은 검토자 패턴과 쪼갠 값 잇기가 아무것도 찾지 않고 방향 제어 글자가 없는 턴에서 2.x 와 같다. 비밀을 가린 턴은 2.x 와 다를 수 있다. `password: string` 처럼 지나치게 가린 턴과 방향 제어 글자를 표지로 바꾼 턴도 그렇다.
|
|
277
285
|
파트 파일의 규칙 요약은 가린 본문에서 만든다. 요약을 자른 자리에 비밀이 걸쳐도 조각이 남지 않는다.
|
|
278
|
-
`--redact-extra` 키워드 목록은 묶음과 파트 파일에 쓰지 않고, 가린 수만 `custom` 으로 센다. 파트 파일의 본문, 요약, 에이전트 이름, 도구 이름에서는 키워드를 가린다.
|
|
286
|
+
`--redact-extra` 키워드 목록은 묶음과 파트 파일에 쓰지 않고, 가린 수만 `custom` 으로 센다. 파트 파일의 본문, 요약, 에이전트 이름, 도구 이름에서는 키워드를 가린다. 묶음의 에이전트 이름과 세션 이름은 페이지처럼 키워드를 가리고, 도구 이름, 페이지 제목(`--title`), 출력 경로는 그대로 둔다. 기록 파일 이름(세션 id)도 캐시 위치를 정하는 값이라 그대로 둔다(0600, 렌더 성공 뒤 삭제).
|
|
279
287
|
결정 파일은 세션이 파일 도구로 써서 umask 권한으로 생긴다. `--apply-review` 가 읽을 때 0600 으로 바꾼다.
|
|
280
288
|
검토자 요약은 `--redact-mode` 와 관계없이 검토자 패턴으로 먼저 전부 가린 뒤 페이지 redaction 을 건다. 캐시를 거쳐 다음 검토자와 게이트의 critic 에게 다시 가기 때문이다. 가린 것이 있으면 어느 턴인지 WARN 으로 알린다(`reviewer-summary` 로 집계).
|
|
281
|
-
캐시키에 요약기 버전이
|
|
289
|
+
캐시키에 요약기 버전이 포함된다. 요약기나 가림을 바꾼 판은 요약기 버전(`SUMMARIZER_VERSION`)을 올려 옛 캐시를 쓰지 않는다. 스키마 bump 시 옛 디렉토리는 참조 안 됨 —
|
|
282
290
|
`--purge-cache` 로 정리 권장.
|
|
283
291
|
|
|
284
292
|
## Testing
|
|
@@ -322,14 +330,16 @@ pip install 'detect-secrets>=1.5' # (선택) 강한 redaction
|
|
|
322
330
|
## 한계
|
|
323
331
|
|
|
324
332
|
- 자동탐색은 Claude Code 의 `~/.claude/projects/` 레이아웃을 가정 — 비-ASCII cwd 는 `--session` / `--from-transcript` 로 쓴다.
|
|
325
|
-
-
|
|
333
|
+
- 읽는 기록은 Claude Code 형식과 Codex rollout 이다. Codex rollout 에서는 사용자가 입력한 글, 모델의 답, 도구 호출 이름만 읽는다. 모델의 추론 요약과 도구 결과는 페이지에 없다.
|
|
334
|
+
- Codex 는 rollout 형식을 공개 약속으로 내놓지 않는다. 사용자 턴을 하나도 읽지 못한 rollout 은 빈 페이지 대신 exit 2(`no user turn was read`, Codex 버전 표시)로 멈춘다. 이 오류가 나면 사용자에게 banker 업데이트를 권하고, Codex 를 업데이트했다면 `banker doctor` 의 기록 형식 점검 결과를 함께 보인다. `--all-sessions` 는 그런 rollout 을 WARN 과 함께 뺀다.
|
|
326
335
|
- 기본 흐름은 redact 된 세션 본문을 세션 모델의 프로바이더로 보낸다. 모델에 보내지 않으려면 `--rulebase` 를 쓴다.
|
|
327
336
|
- `--rulebase` 요약은 추출식(head+tail) — 말미 정리 문장을 결론 대신 고르는 경우가 있다. 기본 흐름은 검토자가 이를 고쳐 쓴다.
|
|
328
337
|
- 기본 흐름은 파트(40턴 이하, 고르게 나눔)마다 검토 에이전트 1개가 돈다. 이 저장소 실측은 40턴 파트 하나에 약 11만 토큰과 7분이었다. 긴 세션은 `--last N` 으로 범위를 줄이거나 `--rulebase` 를 쓴다.
|
|
329
338
|
- Claude Code 검토자(`Plan`)는 Write·Edit 가 도구로 막혀 있지만 Bash 는 있다. 셸로 쓰지 않는 것은 지시로 선다. banker 는 에이전트 정의를 배포하지 않아(모든 표면이 두 런타임 대상) 도구를 더 막을 수 없다.
|
|
330
339
|
- Codex 의 `workspace-write` 샌드박스에서는 `~/.cache` 에 쓸 수 없어 이번 실행의 검토 결정을 캐시에 쓰지 못한다(WARN 한 번). 앞선 실행이 남긴 결정은 읽으므로, 그 결정이 없는 턴만 다시 검토한다.
|
|
331
|
-
-
|
|
332
|
-
- 규칙
|
|
340
|
+
- 캐시를 쓰려면 4단계(`--apply-review`) 명령을 샌드박스 밖 실행으로 승인을 요청하거나, Codex 를 `--add-dir ~/.cache/lineage` 로 시작한다(설정으로는 `sandbox_workspace_write.writable_roots`). 폴더가 없으면 샌드박스 밖에서 먼저 만든다. 쓰기 허용 폴더로 캐시가 저장되는 것은 Codex 0.144.5 에서 확인했다.
|
|
341
|
+
- 규칙 요약은 가린 본문에서 자른다(요약기 버전 4). lineage 3.0.8 까지 만든 요약 캐시는 쓰지 않는다. 그 캐시에는 평문 조각이 남아 있을 수 있어 `--purge-cache` 로 지운다.
|
|
342
|
+
- 규칙 요약 캐시는 본문만으로 키를 잡는다. `--redact-mode` 나 `--redact-extra` 를 바꿔 다시 돌린 `--rulebase` 는 앞선 실행의 요약을 쓸 수 있다(2.x 동작 그대로). `--redact-mode mask` 로 만든 요약은 뒤의 기본 실행에서도 mask(페이지 패턴이 찾은 값의 앞뒤 4글자)를 그대로 보인다. 키워드를 나중에 준 실행은 요약 끝에서 잘린 키워드 조각을 보일 수 있다. 설정을 바꿔 다시 돌릴 때는 `--rebuild-summaries` 를 함께 준다. 기본 흐름의 묶음은 요약을 매번 새로 만든다. 묶음 형식은 `lineage-review/2` 라 0.15.1 이 만든 묶음은 `--emit-review` 부터 다시 한다.
|
|
333
343
|
- 검토자는 긴 턴의 앞뒤만 본다(`clipped: true`). 가운데에만 있는 결론은 놓칠 수 있다.
|
|
334
344
|
- 검토자 패턴은 흔한 모양만 가린다. `/` 가 든 URL 비밀번호와 키 이름이 100자를 넘는 16진 키는 가리지 못한다(값이 길고 무작위면 엔트로피 규칙이 가릴 수 있다). curl `-u` 패턴은 값 전체가 `docker -u 1000:1000` 같은 uid:gid, `rsync -u host:/path`, `date -u +%H:%M` 같은 날짜 형식(`+%` 뒤에 글자가 오면 나머지는 보지 않는다), 양쪽 모두 변수인 꼴(`$UID:$GID`, `${UID}:${GID}`, `%USER%:%PASS%`, `$(id -u):$(id -g)`), 기본값이 콜론 없는 경로(`/`, `~`, `.` 로 시작)인 변수(`mktemp -u "${TMPDIR:-/tmp}/x"`), 앞선 가림이 남긴 표식(`-u [REDACTED:JWT]`)일 때만 둔다. 이스케이프한 따옴표 안에서도 같다. 다른 명령의 `-u 이름:값`(`-u root:root`, `ps -u postgres:postgres`, `rsync -avu host:dir/`, `ls -lu a:bcd`), 기본값이 경로가 아닌 변수(`${UID:-1000}:${GID:-1000}`, `${API_KEY:-…}`)는 가린다. 숫자만으로 된 이름과 비밀번호, `/` 로 시작하는 비밀번호, `$` 로 시작해 변수처럼 보이는 비밀번호(`$USER:$ecret`), `-U` 와 `--proxy-user`, 붙여 쓴 묶음(`-suUSER:PW`), `-u=USER:PW`, 공백이 든 비밀번호의 둘째 낱말부터, 인자 목록에서 다른 종류의 따옴표가 든 비밀번호(`'-u', "USER:P'W"`), 사용자 안에서 따옴표 뒤에 `-eu`, `--user` 같은 플래그 꼴과 따옴표가 오는 꼴(`"$USER"-eu":PW"`), requests 의 `auth=(...)`, value 가 name 보다 앞에 온 HAR 은 가리지 못한다. 백틱 명령 치환(`` `id -u`:`id -g` ``)과 `\$(id -u):\$(id -g)` 는 가운데 일부가 가려진다(3.0.0 과 같다). 값이 `/`, `~`, `$` 로 시작하는 password 값(`$PWD:/workspace`, `OLDPWD=/home/...`, `password=$DB_PASSWORD`), 이미 가린 표식, 값 전체가 마스크 꼴(`abcd****wxyz`, `****`)인 값은 두고, `PGPASSWORD=`, `MYSQL_PWD=` 의 값은 가린다. `password=os.environ[...]`, `암호: AES-256-GCM` 처럼 코드나 이름인 값과 `sk-` 로 시작하는 긴 세션 이름은 지나치게 가린다. Basic 인증 패턴은 `HTTP_AUTHORIZATION` 처럼 앞에 `_` 가 붙은 이름, 구분자 없는 `Authorization Basic …`, 백틱이나 대괄호(`["Basic …"]`) 안의 값을 가리지 못한다.
|
|
335
345
|
- 쪼갠 값 가운데 detect-secrets 만 찾는 값은 찾지 못한다. 키 바로 앞이 글자나 숫자이고 그 사이와 키 안에 쪼개는 글자가 있으면, 앞 글자 조건이 있는 검토자 패턴(Anthropic, OpenAI, Google 키, Bearer, Basic 인증)은 값 꼬리를 놓칠 수 있다. 태그 글자로 통째로 적거나 base64 로 감싼 값처럼 일부러 숨긴 값은 풀어 보지 않는다. ANSI 색 코드처럼 ESC 뒤에 `[01;31m` 같은 글자가 붙는 열은 ESC 만 쪼개는 글자라 다시 잇지 못한다. 3.0.7 한 번의 결과에서 이어 갈 때는 3.0.7 이 앞부분만 가린 키의 나머지가 남을 수 있다(3.0.7 과 같다). `--redact-mode mask` 의 앞뒤 4글자에는 쪼개는 글자도 한 글자로 든다. 쪼개는 글자가 있는 글은 이을 곳을 찾느라 3.0.7 의 약 3배 걸리고, 이은 곳이 있으면 가림을 몇 번 더 돌아 약 6배 걸린다(5MB 한 글에서 잼).
|