@kaydash9999/banker-plugins 0.20.5 → 0.22.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 +52 -0
- package/PRIVACY.md +25 -1
- package/README.md +63 -18
- package/bin/banker.js +173 -14
- package/bin/lib/codex-hooks.mjs +254 -0
- package/bin/lib/codex-routes.mjs +112 -0
- package/bin/lib/command-skill.cjs +19 -0
- package/bin/lib/telemetry-config.mjs +4 -1
- package/codex/command-skills/front-qa/SKILL.md +56 -0
- package/codex/command-skills/setup/SKILL.md +87 -0
- package/codex/hooks.json +29 -0
- package/codex/manifest.json +13 -10
- 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 +18 -13
- package/commands/setup.md +2 -2
- package/hooks/obsidize-hook.mjs +116 -4
- package/hooks/progress-plan.mjs +1 -1
- package/hooks/telemetry-count-codex.mjs +309 -0
- package/hooks/update-notify.mjs +105 -14
- package/package.json +1 -1
- package/skills/3d-intro-build/references/verify-intro.mjs +15 -1
- package/skills/anti-drm/SKILL.md +1 -1
- package/skills/anti-drm/scripts/instruction-toggle.mjs +57 -4
- package/skills/append_wiki/SKILL.md +34 -8
- package/skills/arch-diagram/build_pptx_template.py +47 -28
- package/skills/audit-web-page/SKILL.md +1 -1
- package/skills/audit-web-page/harness.py +0 -1
- package/skills/compact-wiki/SKILL.md +37 -6
- package/skills/deep-research/SKILL.md +6 -0
- package/skills/lfm/SKILL.md +148 -0
- package/skills/lineage/SKILL.md +14 -4
- package/skills/lineage/lineage.py +1582 -516
- package/skills/motion-graphic-make/SKILL.md +1 -1
- package/skills/obsidizer/SKILL.md +44 -10
- package/skills/obsidizer/obsidize.mjs +42 -11
- package/skills/omc-patch/SKILL.md +6 -0
- package/skills/payload-mon/SKILL.md +3 -1
- package/skills/play-qa/SKILL.md +1 -1
- package/skills/ralph-qa/SKILL.md +1 -1
- package/skills/remains/SKILL.md +1 -1
- package/skills/rfp-author/SKILL.md +5 -3
- package/skills/rfp-author/references/vendor-rfp-structure.md +1 -1
- package/skills/rfp-author/scripts/md2docx.py +63 -34
- package/skills/setup-bypass-permissions/SKILL.md +28 -10
- 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-bypass-permissions/scripts/fallback/bypass-permissions.py +66 -15
- package/skills/setup-omc-hud/SKILL.md +33 -3
- 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/smart-compact/SKILL.md +59 -13
- package/skills/smart-compact/scripts/codex-gate.mjs +385 -0
- package/skills/theme-selection/SKILL.md +1 -1
- package/skills/tone-compact/SKILL.md +1 -1
- package/skills/tone-compact/scripts/instruction-toggle.mjs +57 -4
- package/skills/ultra-chain/SKILL.md +10 -6
- package/skills/ultra-interview/SKILL.md +13 -2
- package/skills/ultra-ui-qa/SKILL.md +1 -1
- package/skills/update-banker/SKILL.md +31 -6
- package/skills/vertical-pptx/SKILL.md +1 -1
- package/skills/vertical-pptx/build_a4p.js +20 -2
- package/skills/vertical-pptx/build_a4p.py +560 -359
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: append_wiki
|
|
3
|
-
description: "새로 알게 된 비자명한 지식을 `.omc/wiki` 에 구조화해 넣고 기존 페이지와 병합. 'append_wiki'/'위키 기록'/'wiki에 정리'/'알게 된 내용 기록' 시 사용."
|
|
3
|
+
description: "새로 알게 된 비자명한 지식을 `.omc/wiki`(Codex 는 `omx_wiki/`) 에 구조화해 넣고 기존 페이지와 병합. 'append_wiki'/'위키 기록'/'wiki에 정리'/'알게 된 내용 기록' 시 사용."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# append_wiki — 작업 지식을 wiki에 적재
|
|
7
7
|
|
|
8
|
-
이번 작업에서 **새로 배운 비자명한 지식**을
|
|
9
|
-
OMC `wiki` 스킬의 MCP
|
|
10
|
-
기술 토큰은 영문 유지).
|
|
8
|
+
이번 작업에서 **새로 배운 비자명한 지식**을 위키에 구조화해 남기는 워크플로우.
|
|
9
|
+
Claude Code 는 OMC `wiki` 스킬의 MCP 도구로 `.omc/wiki/` 에, Codex 는 OMX 의 `omx wiki` CLI 로 `omx_wiki/` 에 쓴다.
|
|
10
|
+
답변·설명은 한글로 작성한다(도구명·경로·식별자 등 기술 토큰은 영문 유지).
|
|
11
11
|
|
|
12
12
|
## 언제 쓰나
|
|
13
13
|
- 기능 구현/디버깅/리팩터링 등 한 덩어리 작업이 끝났을 때.
|
|
@@ -21,12 +21,38 @@ OMC `wiki` 스킬의 MCP 도구를 사용하며, 답변·설명은 한글로 작
|
|
|
21
21
|
|
|
22
22
|
## 워크플로우
|
|
23
23
|
|
|
24
|
-
### 0) wiki 도구
|
|
25
|
-
`wiki_*` 는 deferred MCP 도구다. 호출 전에 ToolSearch로 스키마를 로드한다:
|
|
24
|
+
### 0) wiki 도구 준비 (런타임마다 다름 — 반드시 먼저)
|
|
25
|
+
**Claude Code:** `wiki_*` 는 deferred MCP 도구다. 호출 전에 ToolSearch로 스키마를 로드한다:
|
|
26
26
|
```
|
|
27
27
|
ToolSearch(query="select:mcp__plugin_oh-my-claudecode_t__wiki_ingest,mcp__plugin_oh-my-claudecode_t__wiki_query,mcp__plugin_oh-my-claudecode_t__wiki_list,mcp__plugin_oh-my-claudecode_t__wiki_lint")
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
+
**Codex:** `wiki_*` MCP 도 ToolSearch 도 없다. OMX 의 `omx wiki` CLI 가 같은 도구 이름과 입력을 받는다. 위키 폴더는 `.omc/wiki/` 가 아니라 프로젝트 루트의 `omx_wiki/` 다.
|
|
31
|
+
```bash
|
|
32
|
+
omx wiki wiki_list --json
|
|
33
|
+
omx wiki wiki_query --input '{"query":"<키워드>","tags":["<태그>"]}' --json
|
|
34
|
+
omx wiki wiki_ingest --input "$(cat <JSON 파일>)" --json
|
|
35
|
+
```
|
|
36
|
+
- 아래 단계의 `wiki_xxx({...})` 는 Codex 에서 `omx wiki wiki_xxx --input '<같은 JSON>' --json` 이다.
|
|
37
|
+
- 본문에 작은따옴표나 줄바꿈이 많으면 JSON 을 파일로 쓰고 `--input "$(cat <파일>)"` 로 넘긴다. 셸 인용이 깨지지 않게 하기 위해서다(bash).
|
|
38
|
+
- Windows 에서 PowerShell 로 `omx` 를 부를 때: Windows PowerShell 5.1 은 `omx.cmd` 에 넘기는 인자에서 큰따옴표를 지우고,
|
|
39
|
+
공백에서 인자를 나누고, 한글을 깨뜨린다(Windows 박스 실측). 그래서 JSON 을 아래 `Arg` 로 바꿔 넘긴다.
|
|
40
|
+
본문 속 큰따옴표와 공백, ASCII 밖 글자, cmd 가 읽는 `% & | < > ^ !` 는 `\uXXXX` 로, JSON 구조의 큰따옴표는 `\"` 로 바꾼다.
|
|
41
|
+
따옴표(홀수 개 포함), 역슬래시, `%TEMP%`, `&`, 한글, 줄바꿈이 든 본문도 그대로 왕복하고 명령으로 읽히지 않는다(박스 실측).
|
|
42
|
+
```powershell
|
|
43
|
+
function Arg([string]$s) {
|
|
44
|
+
$a = [regex]::Replace($s, '(?<!\\)((?:\\\\)*)\\"', '$1\u0022')
|
|
45
|
+
$a = [regex]::Replace($a, '[^\x21-\x7E]|[%&|<>^!]', { param($m) '\u{0:x4}' -f [int][char]$m.Value })
|
|
46
|
+
$a -replace '(\\*)"', '$1$1\"'
|
|
47
|
+
}
|
|
48
|
+
$j = @{ title = "<영문 제목>"; content = "<본문>"; tags = @("<태그>"); category = "pattern" } | ConvertTo-Json -Compress
|
|
49
|
+
omx wiki wiki_ingest --input (Arg $j) --json
|
|
50
|
+
omx wiki wiki_query --input (Arg '{"query":"<키워드>"}') --json
|
|
51
|
+
```
|
|
52
|
+
- 인자 하나는 Linux 에서 128KB 를 넘지 못한다. 본문이 그보다 크면 페이지를 나눈다.
|
|
53
|
+
- `omx` 가 없으면 멈추고 OMX 설치를 안내한다. 위키 파일을 손으로 쓰지 않는다(목차와 이력이 어긋난다).
|
|
54
|
+
- `omx wiki` 는 작업 폴더에만 쓰므로 샌드박스 승인이 필요 없다(Codex 0.144.5, OMX 0.20.2 에서 확인).
|
|
55
|
+
|
|
30
56
|
### 1) 무엇을 남길지 식별
|
|
31
57
|
이번 작업의 산출에서 다음을 추린다:
|
|
32
58
|
- **아키텍처/설계 결정**과 그 이유(대안 포함) → `architecture` / `decision`.
|
|
@@ -68,7 +94,7 @@ wiki_ingest({
|
|
|
68
94
|
`wiki_lint()` 로 broken cross-reference / orphan / stale / oversized 를 점검하고,
|
|
69
95
|
깨진 링크가 있으면 슬러그를 맞춰 다시 ingest 한다.
|
|
70
96
|
|
|
71
|
-
**environment.md 위생 (이식 가능 셀프힐 —
|
|
97
|
+
**environment.md 위생 (이식 가능 셀프힐 — Claude Code 만. Codex 의 `omx_wiki/` 에는 이 파일이 생기지 않으므로 건너뛴다).**
|
|
72
98
|
`.omc/wiki/environment.md` 는 append_wiki 가 아니라 OMC **SessionStart hook**
|
|
73
99
|
(`hooks/wiki/session-hooks`)이 `project-memory.json` 에서 자동생성한다. 이 hook 에는 **알려진 버그**가
|
|
74
100
|
있어 `techStack.frameworks`(객체 `{name,version}` 배열) 와 객체형 `build` 값(예: `scripts`)을 그대로
|
|
@@ -90,7 +116,7 @@ project-memory 가 안 바뀌면 hook 은 재생성을 건너뛰므로(`existing
|
|
|
90
116
|
- 생성/갱신된 페이지와 슬러그 목록.
|
|
91
117
|
- lint 결과.
|
|
92
118
|
- environment.md 위생: `[object Object]` 정화 여부(및 hook 소스 근본패치 시 그 사실).
|
|
93
|
-
- 저장 위치는 `.omc/wiki/*.md`(프로젝트 로컬, git-ignored), 목차 `index.md`, 이력 `log.md`.
|
|
119
|
+
- 저장 위치는 실제로 쓴 곳을 적는다. Claude Code 는 `.omc/wiki/*.md`(프로젝트 로컬, git-ignored), Codex 는 `omx_wiki/*.md` 다. 목차 `index.md`, 이력 `log.md`.
|
|
94
120
|
|
|
95
121
|
## 작성 원칙
|
|
96
122
|
- **삭제보다 보존, 중복보다 병합.** 같은 주제는 새 페이지 대신 기존 페이지에 append.
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
채워진 예시는 NODES/EDGES/OUT/TITLE 를 대상 시스템 값으로 교체해 사용.
|
|
8
8
|
검증: 빌드 후 재오픈해 슬라이드/커넥터(p:cxnSp)/화살촉(a:tailEnd)/경계 확인. soffice 無 → 픽셀렌더 Unknown.
|
|
9
9
|
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
|
|
10
13
|
from pptx import Presentation
|
|
11
14
|
from pptx.util import Inches, Pt
|
|
12
15
|
from pptx.dml.color import RGBColor
|
|
@@ -14,36 +17,40 @@ from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
|
|
|
14
17
|
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
|
|
15
18
|
from pptx.oxml.ns import qn
|
|
16
19
|
|
|
17
|
-
FONT =
|
|
18
|
-
OUT =
|
|
19
|
-
TITLE =
|
|
20
|
+
FONT = "맑은 고딕"
|
|
21
|
+
OUT = "output/architecture/diagram.pptx"
|
|
22
|
+
TITLE = "다이어그램 제목"
|
|
20
23
|
|
|
21
|
-
SHAPES = {
|
|
22
|
-
|
|
24
|
+
SHAPES = {
|
|
25
|
+
"rrect": MSO_SHAPE.ROUNDED_RECTANGLE,
|
|
26
|
+
"db": MSO_SHAPE.CAN,
|
|
27
|
+
"cube": MSO_SHAPE.CUBE,
|
|
28
|
+
"cloud": MSO_SHAPE.CLOUD,
|
|
29
|
+
}
|
|
23
30
|
|
|
24
31
|
# 색상 팔레트 예시: 서비스 파랑/보라/주황, DB 초록, 보안 분홍, HW 회색, 플랫폼 주황
|
|
25
32
|
# key: (label, sub, x, y, w, h, fill_hex, shape) — 단위 inch, 슬라이드 16:9 = 13.333 x 7.5
|
|
26
33
|
NODES = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
"FE": ("Frontend", ":8080", 0.4, 2.9, 2.1, 0.85, "E1F5FF", "rrect"),
|
|
35
|
+
"BE": ("Backend", ":8000", 3.1, 2.9, 2.2, 0.85, "F3E5F5", "rrect"),
|
|
36
|
+
"DB": ("Database", ":5432", 6.0, 2.9, 2.1, 0.85, "E8F5E9", "db"),
|
|
30
37
|
}
|
|
31
|
-
EDGES = [(
|
|
38
|
+
EDGES = [("FE", "BE"), ("BE", "DB")] # (parent, child)
|
|
32
39
|
|
|
33
40
|
|
|
34
|
-
def set_run(r, text, size, bold=False, color=
|
|
41
|
+
def set_run(r, text, size, bold=False, color="222222"):
|
|
35
42
|
r.text = text
|
|
36
43
|
r.font.size = Pt(size)
|
|
37
44
|
r.font.bold = bold
|
|
38
45
|
r.font.color.rgb = RGBColor.from_string(color)
|
|
39
46
|
r.font.name = FONT
|
|
40
47
|
rPr = r._r.get_or_add_rPr()
|
|
41
|
-
for tag in (
|
|
48
|
+
for tag in ("a:latin", "a:ea", "a:cs"): # ea 필수 — 누락 시 한글 tofu 위험
|
|
42
49
|
el = rPr.find(qn(tag))
|
|
43
50
|
if el is None:
|
|
44
51
|
el = rPr.makeelement(qn(tag), {})
|
|
45
52
|
rPr.append(el)
|
|
46
|
-
el.set(
|
|
53
|
+
el.set("typeface", FONT)
|
|
47
54
|
|
|
48
55
|
|
|
49
56
|
prs = Presentation()
|
|
@@ -52,39 +59,51 @@ prs.slide_height = Inches(7.5)
|
|
|
52
59
|
slide = prs.slides.add_slide(prs.slide_layouts[6]) # Blank
|
|
53
60
|
|
|
54
61
|
tb = slide.shapes.add_textbox(Inches(0.4), Inches(0.25), Inches(12.5), Inches(0.6))
|
|
55
|
-
p = tb.text_frame.paragraphs[0]
|
|
56
|
-
|
|
62
|
+
p = tb.text_frame.paragraphs[0]
|
|
63
|
+
p.alignment = PP_ALIGN.CENTER
|
|
64
|
+
set_run(p.add_run(), TITLE, 24, True, "1A1A1A")
|
|
57
65
|
|
|
58
66
|
rects = {}
|
|
59
67
|
for key, (label, sub, x, y, w, h, fill, shp) in NODES.items():
|
|
60
68
|
sp = slide.shapes.add_shape(SHAPES[shp], Inches(x), Inches(y), Inches(w), Inches(h))
|
|
61
|
-
sp.fill.solid()
|
|
62
|
-
sp.
|
|
69
|
+
sp.fill.solid()
|
|
70
|
+
sp.fill.fore_color.rgb = RGBColor.from_string(fill)
|
|
71
|
+
sp.line.color.rgb = RGBColor.from_string("9E9E9E")
|
|
72
|
+
sp.line.width = Pt(1)
|
|
63
73
|
try:
|
|
64
74
|
sp.shadow.inherit = False
|
|
65
75
|
except Exception:
|
|
66
76
|
pass
|
|
67
|
-
tf = sp.text_frame
|
|
68
|
-
|
|
69
|
-
|
|
77
|
+
tf = sp.text_frame
|
|
78
|
+
tf.word_wrap = True
|
|
79
|
+
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
|
|
80
|
+
pp = tf.paragraphs[0]
|
|
81
|
+
pp.alignment = PP_ALIGN.CENTER
|
|
82
|
+
set_run(pp.add_run(), label, 12.5, True, "1A1A1A")
|
|
70
83
|
if sub:
|
|
71
|
-
p2 = tf.add_paragraph()
|
|
72
|
-
|
|
84
|
+
p2 = tf.add_paragraph()
|
|
85
|
+
p2.alignment = PP_ALIGN.CENTER
|
|
86
|
+
set_run(p2.add_run(), sub, 9, False, "555555")
|
|
73
87
|
rects[key] = (x, y, w, h)
|
|
74
88
|
|
|
75
89
|
|
|
76
90
|
def arrow(x1, y1, x2, y2):
|
|
77
|
-
c = slide.shapes.add_connector(
|
|
78
|
-
|
|
91
|
+
c = slide.shapes.add_connector(
|
|
92
|
+
MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1), Inches(x2), Inches(y2)
|
|
93
|
+
)
|
|
94
|
+
c.line.color.rgb = RGBColor.from_string("5A5A5A")
|
|
95
|
+
c.line.width = Pt(1.5)
|
|
79
96
|
ln = c._element.spPr.get_or_add_ln() # 화살촉: ln 얻어 a:tailEnd append
|
|
80
|
-
ln.append(
|
|
97
|
+
ln.append(
|
|
98
|
+
ln.makeelement(qn("a:tailEnd"), {"type": "triangle", "w": "med", "len": "med"})
|
|
99
|
+
)
|
|
81
100
|
|
|
82
101
|
|
|
83
102
|
for a, b in EDGES: # parent.right-center -> child.left-center (좌->우)
|
|
84
|
-
ax, ay, aw, ah = rects[a]
|
|
103
|
+
ax, ay, aw, ah = rects[a]
|
|
104
|
+
bx, by, bw, bh = rects[b]
|
|
85
105
|
arrow(ax + aw, ay + ah / 2, bx, by + bh / 2)
|
|
86
106
|
|
|
87
|
-
|
|
88
|
-
os.makedirs(os.path.dirname(OUT) or '.', exist_ok=True)
|
|
107
|
+
os.makedirs(os.path.dirname(OUT) or ".", exist_ok=True)
|
|
89
108
|
prs.save(OUT)
|
|
90
|
-
print(
|
|
109
|
+
print("saved", OUT)
|
|
@@ -14,7 +14,7 @@ description: "가동 중인 웹 페이지를 Playwright 로 열어 버튼, DOM,
|
|
|
14
14
|
|
|
15
15
|
이 스킬은 playwright 브라우저가 있어야 동작한다. **진행 전 설치 여부를 먼저 확인**하고, 없으면 **설치부터 안내**한다(추정·임의 재설치 금지):
|
|
16
16
|
- 확인: `ls "${PLAYWRIGHT_BROWSERS_PATH:-$HOME/.cache/ms-playwright}" 2>/dev/null | grep -qi chromium && echo ok`
|
|
17
|
-
- 미설치면 먼저 `setup-playwright` 스킬로 설치(Claude Code: `/banker:setup` → setup-playwright / Codex: `banker-setup-playwright`). 설치·검증 후 이 스킬을 이어서 진행한다.
|
|
17
|
+
- 미설치면 먼저 `setup-playwright` 스킬로 설치(Claude Code: `/banker:setup` → setup-playwright / Codex: `banker-setup-playwright`, 플러그인 설치면 `banker:setup-playwright`). 설치·검증 후 이 스킬을 이어서 진행한다.
|
|
18
18
|
|
|
19
19
|
## 언제
|
|
20
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,6 +56,7 @@ URL 중복제거 후 상위 **≤15 소스**(`MAX_FETCH=15`) fetch → 각 소
|
|
|
51
56
|
## 출력 형식
|
|
52
57
|
- **요약**: 핵심 발견 3~5개(확신도 표기).
|
|
53
58
|
- **본문**: 주장별 근거 + 출처(URL/제목) + 확신도. 상충 증거는 병기.
|
|
59
|
+
- **전문가 작업 방식**(그 각도를 둔 경우): 고른 그룹과 선정 근거, 공통 관행, 계획 적용 항목 표(`lfm` 출력의 같은 이름 절과 같은 꼴).
|
|
54
60
|
- **출처 목록**: fetch·인용한 소스.
|
|
55
61
|
- **한계**: 검증 폐기된 주장, 미해결 불확실성, 조사 못 한 각도.
|
|
56
62
|
|
|
@@ -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
|
|
|
@@ -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` 가 검토자에게 턴을 빼지 말라고 알린다.
|
|
@@ -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
|
|
|
@@ -322,12 +330,14 @@ 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 한 번). 앞선 실행이 남긴 결정은 읽으므로, 그 결정이 없는 턴만 다시 검토한다.
|
|
340
|
+
- 캐시를 쓰려면 4단계(`--apply-review`) 명령을 샌드박스 밖 실행으로 승인을 요청하거나, Codex 를 `--add-dir ~/.cache/lineage` 로 시작한다(설정으로는 `sandbox_workspace_write.writable_roots`). 폴더가 없으면 샌드박스 밖에서 먼저 만든다. 쓰기 허용 폴더로 캐시가 저장되는 것은 Codex 0.144.5 에서 확인했다.
|
|
331
341
|
- 규칙 요약은 가린 본문에서 자른다(요약기 버전 4). lineage 3.0.8 까지 만든 요약 캐시는 쓰지 않는다. 그 캐시에는 평문 조각이 남아 있을 수 있어 `--purge-cache` 로 지운다.
|
|
332
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`). 가운데에만 있는 결론은 놓칠 수 있다.
|