triflux 10.47.0 → 10.48.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/CLAUDE.md +68 -106
- package/bin/tfx-live.mjs +279 -19
- package/config/routing-policy.json +1 -1
- package/hooks/codex-session-hook.mjs +7 -0
- package/hub/dynamic-routing-engine.mjs +1 -1
- package/hub/lib/codex-session-registry.mjs +306 -0
- package/hub/workers/codex-mcp.mjs +1 -1
- package/hud/context-monitor.mjs +1 -1
- package/package.json +1 -1
- package/scripts/__tests__/tfx-route-bash-node-parity.test.mjs +1 -1
- package/scripts/__tests__/tfx-route-node-entry.test.mjs +4 -4
- package/scripts/lib/agent-route-policy.mjs +13 -13
- package/scripts/lib/codex-profile-config.mjs +10 -7
- package/scripts/setup.mjs +5 -5
- package/scripts/tfx-route.sh +74 -29
- package/skills/tfx-auto/SKILL.md +1 -1
- package/skills/tfx-live/SKILL.md +28 -0
- package/skills/tfx-plan/SKILL.md +2 -2
- package/skills/tfx-profile/SKILL.md +5 -5
- package/skills/tfx-setup/SKILL.md +1 -1
- package/tui/codex-profile.mjs +1 -0
- package/tui/setup.mjs +2 -2
package/CLAUDE.md
CHANGED
|
@@ -7,58 +7,20 @@
|
|
|
7
7
|
|
|
8
8
|
| 시스템 | 접두사 | 용도 | 스킬 수 |
|
|
9
9
|
|--------|--------|------|---------|
|
|
10
|
-
| **triflux** | `/tfx-*` | CLI
|
|
11
|
-
| **gstack** | `/` (접두사 없음) | QA
|
|
12
|
-
| **omc** | `/oh-my-claudecode:*` | autopilot
|
|
10
|
+
| **triflux** | `/tfx-*` | CLI 라우팅·다중 모델 조정·스웜·원격 실행 | ~40개 |
|
|
11
|
+
| **gstack** | `/` (접두사 없음) | QA·출시·조사·설계·검토·점검 지점 | ~35개 |
|
|
12
|
+
| **omc** | `/oh-my-claudecode:*` | autopilot·ralph·team·execute·ultragoal | ~37개 |
|
|
13
13
|
|
|
14
14
|
스킬을 모르면 자연어 라우팅(`.claude/rules/tfx-routing.md`)으로 자동 매핑된다.
|
|
15
15
|
세션 종료 전 메모리 파일이 3개+ 변경됐으면 `/memory-hygiene` 제안을 검토한다.
|
|
16
16
|
</core-systems>
|
|
17
17
|
|
|
18
18
|
<psmux-wt>
|
|
19
|
-
## psmux/WT 규칙
|
|
19
|
+
## psmux/WT 규칙 (Windows 한정)
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
psmux
|
|
24
|
-
WT 프리징 방지: exit → sleep 2 → kill 순서. 바로 kill하지 않는다.
|
|
25
|
-
|
|
26
|
-
### wt.exe → wt-manager 경유
|
|
27
|
-
|
|
28
|
-
safety-guard가 `wt.exe`, `wt new-tab`, `wt split-pane`, `Start-Process wt`를 차단한다.
|
|
29
|
-
`hub/team/wt-manager.mjs`의 API를 사용한다.
|
|
30
|
-
|
|
31
|
-
| 용도 | API |
|
|
32
|
-
|------|-----|
|
|
33
|
-
| 새 탭 | `createTab({ title, command, profile, cwd })` |
|
|
34
|
-
| 패인 분할 | `splitPane({ direction: 'H'\|'V', title, command })` |
|
|
35
|
-
| 다중 배치 | `applySplitLayout([{ title, command, direction }])` |
|
|
36
|
-
| 탭 정리 | `closeTab(title)` / `closeStale({ olderThanMs, titlePattern })` |
|
|
37
|
-
|
|
38
|
-
차단과 대안은 항상 쌍으로 존재해야 한다. 차단만 추가하고 대안을 안 만들면 데드락.
|
|
39
|
-
|
|
40
|
-
### raw `psmux kill-session` → psmux wrapper 경유
|
|
41
|
-
|
|
42
|
-
safety-guard가 raw `psmux kill-session`을 차단한다.
|
|
43
|
-
세션 정리는 `hub/team/psmux.mjs` 공개 API 또는 internal wrapper로 우회한다.
|
|
44
|
-
|
|
45
|
-
| 용도 | API / 래퍼 |
|
|
46
|
-
|------|------------|
|
|
47
|
-
| 세션 조회 | `listSessions({ filterTitle?, olderThanMs? })` |
|
|
48
|
-
| title prefix / regex kill | `killSessionByTitle(titlePattern)` |
|
|
49
|
-
| stale idle 세션 정리 | `pruneStale({ olderThanMs, dryRun })` |
|
|
50
|
-
| Bash 훅 우회용 래퍼 | `node hub/team/psmux.mjs --internal kill-by-title <prefix\|/regex/>` |
|
|
51
|
-
|
|
52
|
-
### psmux에서 Codex 실행
|
|
53
|
-
|
|
54
|
-
| 방식 | 동작 | 이유 |
|
|
55
|
-
|------|------|------|
|
|
56
|
-
| `codex` (interactive) | 불가 | psmux에서 TTY를 못 잡음 |
|
|
57
|
-
| `codex < prompt.md` | 불가 | "stdin is not a terminal" |
|
|
58
|
-
| `codex exec "$(cat prompt.md)" -s danger-full-access --dangerously-bypass-approvals-and-sandbox` | 사용 | 유일한 안전 경로 |
|
|
59
|
-
|
|
60
|
-
`codex exec`는 config.toml `approval_mode`를 무시하므로 `--dangerously-bypass-approvals-and-sandbox` 필수.
|
|
61
|
-
`-s` 유효값: read-only, workspace-write, danger-full-access.
|
|
21
|
+
macOS/Linux는 플랫폼 보호기가 아무 작업도 하지 않게 처리하므로 이 항목 자체를 건너뛰어도 된다. mac 인프라는
|
|
22
|
+
아래 `<macos-terminal>`을 참조한다. 정책·래퍼 API·Codex 호출 형태는 모두
|
|
23
|
+
`.claude/rules/tfx-psmux.md`의 규칙 1~8이 정본이며 Claude가 자동으로 불러온다.
|
|
62
24
|
</psmux-wt>
|
|
63
25
|
|
|
64
26
|
<macos-terminal>
|
|
@@ -66,69 +28,70 @@ safety-guard가 raw `psmux kill-session`을 차단한다.
|
|
|
66
28
|
|
|
67
29
|
위 `<psmux-wt>` 룰셋은 Windows 전용이다. macOS/Linux 환경에서 triflux가 터미널/세션을 다루는 방식.
|
|
68
30
|
|
|
69
|
-
### terminal-opener.mjs 3단계
|
|
31
|
+
### terminal-opener.mjs 3단계 대체 경로(`hub/team/terminal-opener.mjs:124~149`)
|
|
70
32
|
|
|
71
33
|
`openCommand()` 가 순차 평가하는 분기:
|
|
72
34
|
|
|
73
35
|
| 우선순위 | 조건 | 동작 | API |
|
|
74
36
|
|---------|------|------|-----|
|
|
75
|
-
| 1 | `platform === "win32"` | wt-manager.createTab | `hub/team/wt-manager.mjs` |
|
|
76
|
-
| 2 | `isTmuxLikeMux(mux, platform)` (`detectMultiplexer()` → `getMultiplexerType()`/`hasMultiplexer()`/`hasTmux()` +
|
|
77
|
-
| 3 | `platform === "darwin"` (
|
|
78
|
-
| — | Linux
|
|
37
|
+
| 1 | `platform === "win32"` | `wt-manager.createTab` | `hub/team/wt-manager.mjs` |
|
|
38
|
+
| 2 | `isTmuxLikeMux(mux, platform)` (`detectMultiplexer()` → `getMultiplexerType()`/`hasMultiplexer()`/`hasTmux()` + 리터럴 psmux 검사) | `tmux new-window -n <title> <command>` | 셸 직접 호출 |
|
|
39
|
+
| 3 | `platform === "darwin"` (대체 경로) | `open -a Terminal` | macOS `open` 명령 |
|
|
40
|
+
| — | Linux(멀티플렉서 없음) | 미지원(`false` 반환) | — |
|
|
79
41
|
|
|
80
42
|
### 별도 mac 매니저 불필요
|
|
81
43
|
|
|
82
44
|
| 후보 | 필요성 | 이유 |
|
|
83
45
|
|------|--------|------|
|
|
84
|
-
| iTerm2
|
|
85
|
-
| tmux
|
|
86
|
-
| psmux
|
|
46
|
+
| iTerm2 관리자 | **불필요** | `hub/lib/env-detect.mjs:96`이 `TERM_PROGRAM === "iTerm.app"`을 감지하지만 별도 GUI 패인 조작은 tmux/psmux로 처리한다. 새 창은 `open -a Terminal` 대체 경로로 충분하다. |
|
|
47
|
+
| tmux 관리자 | **불필요** | psmux 자체가 tmux 포크다. `terminal-opener.mjs`가 `tmux new-window`로 직접 호출한다. |
|
|
48
|
+
| psmux 관리자 | **이미 있음** | `hub/team/psmux.mjs`가 `IS_WINDOWS`/`IS_MAC`으로 플랫폼을 분기한다. |
|
|
87
49
|
|
|
88
|
-
참고 사례: OMC(`oh-my-claudecode`)도
|
|
50
|
+
참고 사례: OMC(`oh-my-claudecode`)도 운영체제별 관리자를 만들지 않고 Tmux 관리자·워크트리 관리자·Claude 실행기 세 구성 요소로 정리한다. 이 저장소 결정의 외부 근거가 아니라 비교 참고로만 본다.
|
|
89
51
|
|
|
90
|
-
###
|
|
52
|
+
### 플랫폼 보호기 위치(참고)
|
|
91
53
|
|
|
92
|
-
| 파일 |
|
|
54
|
+
| 파일 | 줄 | 보호기 |
|
|
93
55
|
|------|------|-------|
|
|
94
56
|
| `hub/team/wt-manager.mjs` | 199 | `if (platform() !== "win32") return createNonWindowsStubManager();` |
|
|
95
57
|
| `hub/team/headless.mjs` | 1725-1726 | `if (process.platform !== "win32") return false;` + `WT_SESSION` 체크 |
|
|
96
58
|
| `tfx-route.sh` | 86, 1662, 1681 | `case "$(uname -s)"` 분기 |
|
|
97
59
|
|
|
98
|
-
mac에서 위 코드가 호출돼도
|
|
60
|
+
mac에서 위 코드가 호출돼도 일찍 반환하므로 실행되지 않는 코드가 동작하지 않는다. **실행되지 않는 문서만 주입되는 것이 남은 불일치다.**
|
|
99
61
|
|
|
100
|
-
### macOS
|
|
62
|
+
### macOS 알림(참고)
|
|
101
63
|
|
|
102
|
-
`hub/team/notify.mjs:221~234
|
|
64
|
+
`hub/team/notify.mjs:221~234`가 `osascript`로 macOS 기본 알림을 보낸다. 별도 의존성은 없다.
|
|
103
65
|
</macos-terminal>
|
|
104
66
|
|
|
105
67
|
<codex-config>
|
|
106
|
-
## Codex config.toml
|
|
68
|
+
## Codex `config.toml`
|
|
107
69
|
|
|
108
|
-
config.toml
|
|
70
|
+
`config.toml`에 이미 설정된 값은 CLI 플래그로 중복 지정하지 않는다.
|
|
109
71
|
|
|
110
|
-
| config.toml
|
|
111
|
-
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
72
|
+
| `config.toml` 키 | 같은 뜻의 CLI 플래그 |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `approval_policy` (`on-request` / `never` / granular) | `--dangerously-bypass-approvals-and-sandbox` |
|
|
75
|
+
| `sandbox_mode` (`read-only` / `workspace-write` / `danger-full-access`) | `-s`, `--sandbox` |
|
|
114
76
|
|
|
115
|
-
|
|
77
|
+
`--full-auto` 는 Codex 0.147 에서 제거됐다. 안전한 방식: `config.toml`에 기본값을 두고 CLI에서는 `--profile`만 선택한다.
|
|
78
|
+
프로필은 `$CODEX_HOME/<이름>.config.toml` 파일이다(인라인 `[profiles.*]` 아님).
|
|
116
79
|
</codex-config>
|
|
117
80
|
|
|
118
81
|
<account-broker>
|
|
119
82
|
## AccountBroker (계정 브로커)
|
|
120
83
|
|
|
121
|
-
conductor
|
|
84
|
+
conductor·headless·swarm-hypervisor가 하나의 AccountBroker 단일 인스턴스를 공유한다.
|
|
122
85
|
|
|
123
86
|
| 항목 | 설명 |
|
|
124
87
|
|------|------|
|
|
125
|
-
| 계정별
|
|
126
|
-
|
|
|
127
|
-
| `/broker/reload` | 장시간 세션 중 accounts.json
|
|
128
|
-
|
|
|
129
|
-
| Conductor
|
|
130
|
-
|
|
|
131
|
-
|
|
|
88
|
+
| 계정별 회로 차단기 | 장애 격리 — 한 계정 오류가 다른 계정에 전파되지 않음 |
|
|
89
|
+
| 사용 중 플래그 | 동일 계정 이중 임대 방지 |
|
|
90
|
+
| `/broker/reload` | 장시간 세션 중 accounts.json을 다시 불러온다. 활성 임대 소유권은 다시 불러온 뒤에도 보존한다. |
|
|
91
|
+
| 어댑터의 임대 없음 정책 | headless 어댑터는 브로커가 비활성·비어 있음이면 기본 CLI 인증 경로로 실행하고, 브로커가 활성인데 임대가 없으면 `circuit_open`으로 실패한다. |
|
|
92
|
+
| Conductor의 임대 없음 정책 | 로컬 Conductor 세션은 `broker_no_lease`를 이벤트 로그에 남기고 생성을 계속한다. accountId가 없으므로 해제는 호출하지 않는다. |
|
|
93
|
+
| 공개 스냅숏 정책 | `/broker/snapshot`과 대시보드는 `publicSnapshot()`만 사용한다. `env`, `authFile`, `profile`, `host`, 파일 경로, 가공하지 않은 실패 시각은 공개하지 않는다. |
|
|
94
|
+
| 진단 이벤트 | `securityViolation`, `authSyncError`는 허브가 가린 경고 로그(`broker.security_violation`, `broker.auth_sync_error`)로 처리한다. |
|
|
132
95
|
| EventEmitter 이벤트 | `lease`, `release`, `cooldown`, `tierFallback`, `circuitOpen`, `circuitClose`, `noAvailableAccounts` — HUD 연동용 |
|
|
133
96
|
</account-broker>
|
|
134
97
|
|
|
@@ -139,54 +102,53 @@ conductor, headless, swarm-hypervisor가 하나의 AccountBroker 싱글턴을
|
|
|
139
102
|
|
|
140
103
|
| 스킬 | 대상 | 방식 |
|
|
141
104
|
|------|------|------|
|
|
142
|
-
| tfx-
|
|
105
|
+
| tfx-swarm | 로컬 worktree + shard `host:` 원격 분배 | PRD별 worktree, 다중 모델·기기 |
|
|
143
106
|
| tfx-remote | Claude Code 원격 | SSH → Claude Code 세션 → 내부 tfx 라우팅 |
|
|
144
|
-
| tfx-remote-spawn | deprecated alias | tfx-remote로 통합됨; 직접 호출 금지 |
|
|
145
107
|
|
|
146
|
-
|
|
147
|
-
원격에서
|
|
108
|
+
Codex를 SSH 너머로 직접 실행하지 않는다. `config.toml` 충돌과 TTY 문제가 있다.
|
|
109
|
+
원격에서 Codex가 필요하면 tfx-remote → Claude Code → Claude가 내부에서 Codex를 호출한다.
|
|
148
110
|
|
|
149
111
|
### SSH 패턴
|
|
150
112
|
|
|
151
|
-
hosts.json `os` 필드로 대상 셸을 판단한다. safety-guard
|
|
113
|
+
`hosts.json`의 `os` 필드로 대상 셸을 판단한다. `safety-guard`도 이 필드를 참조한다.
|
|
152
114
|
|
|
153
115
|
| 대상 OS | 셸 | 패턴 |
|
|
154
116
|
|---------|-----|------|
|
|
155
117
|
| windows | PowerShell | scp + `pwsh -File` 필수. `$var` → `$env:VAR`, `2>/dev/null` → `2>$null` |
|
|
156
|
-
| darwin | zsh | 인라인 가능. brew PATH
|
|
118
|
+
| darwin | zsh | 인라인 가능. brew의 `PATH`에 주의한다(`/opt/homebrew/bin`). |
|
|
157
119
|
| linux | bash | 인라인 가능. 표준 POSIX |
|
|
158
120
|
|
|
159
121
|
- `~` → `$HOME` 변환은 모든 OS 공통
|
|
160
122
|
</remote>
|
|
161
123
|
|
|
162
124
|
<headless-retrieval>
|
|
163
|
-
##
|
|
125
|
+
## 비대화식 결과 회수
|
|
164
126
|
|
|
165
|
-
|
|
127
|
+
백그라운드로 실행한 비대화식 결과는 **반드시 작업 알림 완료 후** 읽는다.
|
|
166
128
|
|
|
167
129
|
| 패턴 | 올바름 | 이유 |
|
|
168
130
|
|------|--------|------|
|
|
169
|
-
|
|
|
170
|
-
|
|
|
171
|
-
| psmux capture-pane
|
|
131
|
+
| 작업 알림 뒤 출력 파일 읽기 | 예 | 프로세스 종료 = 워커 전부 완료 |
|
|
132
|
+
| 작업 알림 전 출력 파일 끝부분 읽기 | 아니요 | 시작 메시지만 보이고 "실패"로 오진 |
|
|
133
|
+
| `psmux capture-pane`으로 중간 확인 | 아니요 | 워커 진행 중이면 빈 화면일 수 있음 |
|
|
172
134
|
|
|
173
135
|
완료 마커: `=== HEADLESS_COMPLETE succeeded=N failed=N total=N ===`
|
|
174
136
|
워커 상세: `$TMPDIR/tfx-headless/{sessionName}-worker-N.txt`
|
|
175
137
|
</headless-retrieval>
|
|
176
138
|
|
|
177
139
|
<native-bridge>
|
|
178
|
-
##
|
|
140
|
+
## 기본 연결 UI(`claude agents` 노출)
|
|
179
141
|
|
|
180
|
-
|
|
142
|
+
비대화식 워커는 기본적으로 `claude agents` 패널에 행으로 나타난다. 제외하려면 `--no-native-bridge-ui`를 쓴다.
|
|
181
143
|
|
|
182
|
-
| 모드 |
|
|
144
|
+
| 모드 | 기본값 | 행이 보이는 위치 |
|
|
183
145
|
|------|---------|--------------------|
|
|
184
|
-
| `tfx-auto` / `tfx multi`
|
|
185
|
-
| `tfx swarm` 로컬
|
|
186
|
-
| `tfx swarm` 원격
|
|
187
|
-
|
|
|
146
|
+
| `tfx-auto` / `tfx multi`(비대화식) | 켬 | 로컬 `claude agents` |
|
|
147
|
+
| `tfx swarm` 로컬 조각 | 켬 | 로컬 `claude agents`(`Triflux swarm <shard-name>`) |
|
|
148
|
+
| `tfx swarm` 원격 조각 | **건너뛰고 경고** | 해당 없음 — `registerSwarmShard()`가 host!=local일 때 `{ ok: true, skipped: true }`를 반환하고 `"remote launcher must register on that host"`만 경고한다. 원격 데몬 실제 등록은 후속 PRD다. |
|
|
149
|
+
| 대화식(tmux/wt) | 끔 | 해당 없음 |
|
|
188
150
|
|
|
189
|
-
|
|
151
|
+
감시자가 종료되면 즉시 데몬의 `sendKillBySessionId`를 실행해 오래된 행을 남기지 않는다. PRD: `.triflux/plans/native-bridge-ui-default-expansion.md`(PR #323으로 병합).
|
|
190
152
|
</native-bridge>
|
|
191
153
|
|
|
192
154
|
<cross-review>
|
|
@@ -194,8 +156,8 @@ sentinel exit 즉시 daemon `sendKillBySessionId` 발사 → stale row 잔존
|
|
|
194
156
|
|
|
195
157
|
- Claude 작성 코드 → Codex 리뷰
|
|
196
158
|
- Codex 작성 코드 → Claude 리뷰
|
|
197
|
-
- 동일
|
|
198
|
-
- git
|
|
159
|
+
- 동일 모델이 스스로 승인하지 않는다.
|
|
160
|
+
- git 커밋 전에 미검증 파일을 감지하면 알린다.
|
|
199
161
|
</cross-review>
|
|
200
162
|
|
|
201
163
|
<session-context>
|
|
@@ -205,7 +167,7 @@ sentinel exit 즉시 daemon `sendKillBySessionId` 발사 → stale row 잔존
|
|
|
205
167
|
|
|
206
168
|
| 확신도 | 신호 | 행동 |
|
|
207
169
|
|--------|------|------|
|
|
208
|
-
| 확실 | "새 탭", "별도로", "새 세션" | 바로 psmux
|
|
170
|
+
| 확실 | "새 탭", "별도로", "새 세션" | 바로 psmux 세션 생성 |
|
|
209
171
|
| 높음 | 다른 프로젝트/스택 언급 | 분리 제안 |
|
|
210
172
|
| 중간 | 작업 유형 전환 | 분리 제안 + 현재 세션 옵션 |
|
|
211
173
|
| 낮음 | 현재 작업 연장 | 세션 유지 |
|
|
@@ -217,17 +179,17 @@ sentinel exit 즉시 daemon `sendKillBySessionId` 발사 → stale row 잔존
|
|
|
217
179
|
|------|------|
|
|
218
180
|
| `.claude/rules/tfx-routing.md` | 자연어 → 스킬 라우팅, CLI 라우팅 Layer 1~3, 충돌 해소 |
|
|
219
181
|
| `.claude/rules/tfx-execution-skill-map.md` | tfx-auto / multi / swarm 실행 엔진 매핑, 격리 기준, 안티패턴 |
|
|
220
|
-
| `.claude/rules/tfx-autoplan-principles.md` | gstack autoplan의
|
|
182
|
+
| `.claude/rules/tfx-autoplan-principles.md` | gstack autoplan의 여섯 가지 결정 원칙·단계 우선순위·충돌 해소 규칙 추출본 |
|
|
221
183
|
| `.claude/rules/tfx-update-logic.md` | triflux / OMC / gstack / Codex / Antigravity 업데이트 로직 |
|
|
222
184
|
| `.claude/rules/tfx-stack-coexistence.md` | gstack / superpowers / triflux 공존 원칙, 레이어 분리, 의존 방향, 충돌 해소 |
|
|
223
|
-
| `.claude/rules/tfx-mirror-policy.md` | packages/ 3
|
|
185
|
+
| `.claude/rules/tfx-mirror-policy.md` | packages/ 3계층 미러 정책(핵심 단순 복사 / 원격 가져오기 변환 / triflux 바이트 동일), 테스트 제외 규칙, 불일치 차단 |
|
|
186
|
+
|
|
187
|
+
Claude Code는 `.claude/rules/*.md`를 자동으로 불러온다. Codex CLI는 `@import`를 지원하지 않으므로 필요하면 `AGENTS.md`를 독립적으로 유지한다.
|
|
188
|
+
|
|
189
|
+
## GBrain
|
|
224
190
|
|
|
225
|
-
|
|
191
|
+
설정 정본은 `~/Projects/CLAUDE.md` 한 곳이다. 여기 있던 사본은 `engine=pglite` /
|
|
192
|
+
`2026-04-25`로 오래되어 전역·Projects 블록과 서로 모순됐다(2026-07-26 제거).
|
|
193
|
+
실제 엔진은 postgres(Supabase), gbrain 0.42.51.0이다.
|
|
226
194
|
|
|
227
|
-
|
|
228
|
-
- Engine: pglite
|
|
229
|
-
- Config file: ~/.gbrain/config.json (mode 0600)
|
|
230
|
-
- Setup date: 2026-04-25
|
|
231
|
-
- MCP registered: yes (user scope, absolute path)
|
|
232
|
-
- Memory sync: artifacts-only (repo: github.com/tellang/gstack-brain-tellang)
|
|
233
|
-
- Current repo policy: read-write (github.com/tellang/triflux)
|
|
195
|
+
- 이 저장소 정책: 읽기·쓰기(github.com/tellang/triflux)
|