mixdog 0.9.19 → 0.9.21
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/LICENSE +21 -0
- package/README.md +100 -34
- package/package.json +3 -2
- package/scripts/build-tui.mjs +6 -0
- package/scripts/hook-bus-test.mjs +8 -0
- package/scripts/log-writer-guard-smoke.mjs +131 -0
- package/scripts/reactive-compact-persist-smoke.mjs +22 -6
- package/scripts/recall-bench-cases.json +0 -1
- package/scripts/recall-quality-cases.json +1 -2
- package/scripts/session-ingest-compaction-smoke.mjs +241 -0
- package/scripts/tool-smoke.mjs +150 -45
- package/src/defaults/skills/setup/SKILL.md +327 -0
- package/src/help.mjs +2 -5
- package/src/lib/mixdog-debug.cjs +13 -0
- package/src/mixdog-session-runtime.mjs +7 -3328
- package/src/runtime/agent/orchestrator/context/collect.mjs +33 -9
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +34 -2
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +67 -10
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +40 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +73 -3
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +663 -0
- package/src/runtime/agent/orchestrator/session/compact/engine.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +153 -0
- package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/loop.mjs +8 -1860
- package/src/runtime/agent/orchestrator/session/manager/agent-runtime-singleton.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +686 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +60 -12
- package/src/runtime/agent/orchestrator/session/manager/env-utils.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +159 -0
- package/src/runtime/agent/orchestrator/session/manager/message-sanitize.mjs +143 -0
- package/src/runtime/agent/orchestrator/session/manager/prefetch-bridge.mjs +268 -0
- package/src/runtime/agent/orchestrator/session/manager/provider-cache-key.mjs +22 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-loaders.mjs +26 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +124 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +258 -0
- package/src/runtime/agent/orchestrator/session/manager/session-errors.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/session-id.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +475 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +88 -2285
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +440 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +153 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/tool-batch.mjs +642 -0
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +23 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +108 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +15 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +7 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +24 -2
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +72 -8
- package/src/runtime/agent/orchestrator/tools/shell-policy-danger-target.mjs +5 -1
- package/src/runtime/channels/index.mjs +6 -2183
- package/src/runtime/channels/lib/inbound-handler.mjs +328 -0
- package/src/runtime/channels/lib/interaction-handlers.mjs +260 -0
- package/src/runtime/channels/lib/network-retry.mjs +23 -0
- package/src/runtime/channels/lib/owned-runtime.mjs +627 -0
- package/src/runtime/channels/lib/runtime-paths.mjs +20 -9
- package/src/runtime/channels/lib/transcript-binding.mjs +336 -0
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +39 -2
- package/src/runtime/channels/lib/worker-bootstrap.mjs +97 -0
- package/src/runtime/channels/lib/worker-ipc.mjs +201 -0
- package/src/runtime/channels/lib/worker-main.mjs +777 -0
- package/src/runtime/memory/index.mjs +163 -1725
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -2
- package/src/runtime/memory/lib/embedding-worker.mjs +47 -6
- package/src/runtime/memory/lib/http-router.mjs +811 -0
- package/src/runtime/memory/lib/memory-action-handlers.mjs +901 -0
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +6 -0
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +46 -9
- package/src/runtime/memory/lib/memory-cycle2.mjs +87 -11
- package/src/runtime/memory/lib/memory-embed.mjs +28 -7
- package/src/runtime/memory/lib/memory-recall-store.mjs +4 -4
- package/src/runtime/memory/lib/memory.mjs +39 -0
- package/src/runtime/memory/lib/query-handlers.mjs +2 -2
- package/src/runtime/memory/lib/session-ingest-runtime.mjs +401 -0
- package/src/runtime/shared/atomic-file.mjs +138 -80
- package/src/runtime/shared/child-guardian.mjs +61 -3
- package/src/session-runtime/boot-profile.mjs +36 -0
- package/src/session-runtime/channel-config-api.mjs +70 -0
- package/src/session-runtime/context-status.mjs +181 -0
- package/src/session-runtime/env.mjs +17 -0
- package/src/session-runtime/lifecycle-api.mjs +242 -0
- package/src/session-runtime/model-route-api.mjs +198 -0
- package/src/session-runtime/provider-auth-api.mjs +135 -0
- package/src/session-runtime/resource-api.mjs +282 -0
- package/src/session-runtime/runtime-core.mjs +2104 -0
- package/src/session-runtime/session-turn-api.mjs +274 -0
- package/src/session-runtime/tool-catalog.mjs +18 -264
- package/src/session-runtime/tool-defs.mjs +2 -2
- package/src/session-runtime/workflow-agents-api.mjs +238 -0
- package/src/standalone/agent-tool.mjs +2 -2
- package/src/standalone/channel-worker.mjs +67 -7
- package/src/standalone/folder-dialog.mjs +4 -1
- package/src/standalone/memory-runtime-proxy.mjs +154 -17
- package/src/standalone/seeds.mjs +28 -1
- package/src/tui/App.jsx +40 -28
- package/src/tui/app/core-memory-picker.mjs +1 -1
- package/src/tui/app/doctor.mjs +175 -0
- package/src/tui/app/slash-commands.mjs +1 -0
- package/src/tui/app/slash-dispatch.mjs +9 -0
- package/src/tui/app/use-mouse-input.mjs +6 -0
- package/src/tui/app/use-transcript-scroll.mjs +77 -3
- package/src/tui/dist/index.mjs +2851 -2162
- package/src/tui/engine/context-state.mjs +145 -0
- package/src/tui/engine/prompt-history.mjs +27 -0
- package/src/tui/engine/session-api-ext.mjs +478 -0
- package/src/tui/engine/session-api.mjs +564 -0
- package/src/tui/engine/session-flow.mjs +485 -0
- package/src/tui/engine/turn.mjs +1078 -0
- package/src/tui/engine.mjs +68 -2620
- package/src/tui/index.jsx +7 -0
- package/vendor/ink/build/ink.js +16 -1
- package/vendor/ink/build/output.js +30 -4
- package/vendor/ink/build/render.js +5 -0
- package/src/workflows/sequential/WORKFLOW.md +0 -51
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup
|
|
3
|
+
description: Use this skill to configure a mixdog installation — request-driven recipes for models, MCP, channels, output style, memory/recap, skills, and secrets. Triggers on "셋업", "세팅 도와줘", "setup", "환경 구성", "모델 바꿔줘", "MCP 추가", "출력 스타일", "디스코드 토큰". Skip for non-configuration tasks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# mixdog Setup Runbook
|
|
7
|
+
|
|
8
|
+
사용자 요청 → 아래 **레시피**에서 매칭 → 확인 → 변경 → 검증 순서로 진행한다.
|
|
9
|
+
|
|
10
|
+
> **METHOD·POINTER만** 기록한다. 모델명·토큰·URL·채널 ID 등 **라이브 값은 문서에 넣지 않는다** — 항상 config·런타임 status·환경변수에서 그때 읽는다.
|
|
11
|
+
|
|
12
|
+
**공통 진단 (편집 전)**
|
|
13
|
+
- Config: `<mixdogData>/mixdog-config.json` (`MIXDOG_DATA_DIR` / `MIXDOG_HOME`로 경로 변경 가능; 정의 `src/runtime/shared/config.mjs`)
|
|
14
|
+
- MCP: TUI `/mcp` 목록 또는 런타임 `mcpStatus()`
|
|
15
|
+
- Skills: `skillsStatus()` 또는 경로 스캔 (§부록)
|
|
16
|
+
- 비밀 존재: `hasStoredSecret(account)` (값 미노출) 또는 `MIXDOG_*` / 표준 provider env
|
|
17
|
+
|
|
18
|
+
**TUI 진입 공통**
|
|
19
|
+
- 슬래시 명령: `src/tui/app/slash-commands.mjs`
|
|
20
|
+
- 설정 허브: `/setting` (별칭 `/settings`, `/config`) → `src/tui/app/settings-picker.mjs`
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 요청별 레시피
|
|
25
|
+
|
|
26
|
+
**인덱스 — 요청 키워드 → 레시피/명령**
|
|
27
|
+
|
|
28
|
+
| 요청 | 경로 |
|
|
29
|
+
|------|------|
|
|
30
|
+
| 메인 모델 변경 | `/model` (아래 레시피) |
|
|
31
|
+
| 특정 에이전트 모델 | `/agents` (아래 레시피) |
|
|
32
|
+
| 워크플로 슬롯 라우트 | 아래 레시피 표 |
|
|
33
|
+
| 웹서치 모델 | `/search` (아래 레시피) |
|
|
34
|
+
| reasoning effort | `/effort [level]` (아래 레시피) |
|
|
35
|
+
| Fast 모드 | `/fast [on\|off]` (아래 레시피) |
|
|
36
|
+
| Provider API 키 | `/providers` (아래 레시피) |
|
|
37
|
+
| Provider OAuth 로그인/해제 | `/providers` → Login/Forget (아래 레시피) |
|
|
38
|
+
| 로컬/커스텀 엔드포인트 | `/providers` → local (아래 레시피) |
|
|
39
|
+
| Usage 로그인 | `/providers` → Usage login (아래 레시피) |
|
|
40
|
+
| 출력 스타일 | `/OutputStyle`·`/style` (아래 레시피) |
|
|
41
|
+
| TUI 테마 | `/theme [id]` (아래 레시피) |
|
|
42
|
+
| 프로필(호칭·언어) | `/profile` (아래 레시피) |
|
|
43
|
+
| 음성(채널 보이스 전사) | `/channels` → **Voice** (아래 레시피) |
|
|
44
|
+
| autoclear | `/autoclear` (아래 레시피) |
|
|
45
|
+
| auto-compact | `/setting` → Auto-compact 토글 (compact type은 고정, 아래 레시피) |
|
|
46
|
+
| Recap/메모리 | `/memory` 토글 (아래 레시피) |
|
|
47
|
+
| memory interval | config 편집 (아래 레시피) |
|
|
48
|
+
| MCP 추가/삭제/재연결/진단 | `/mcp` + config (아래 레시피) |
|
|
49
|
+
| 채널/토큰/스케줄/웹훅 | `/channels`, `/schedules`, `/webhooks` (아래 레시피) |
|
|
50
|
+
| 원격 세션 클레임 | `/remote` (아래 레시피) |
|
|
51
|
+
| 채널 백엔드(Discord↔Telegram) | `/setting` → Channel (아래 레시피) |
|
|
52
|
+
| 시스템 셸 | config `shell` (아래 레시피) |
|
|
53
|
+
| before-tool hooks | `/hooks` (아래 레시피) |
|
|
54
|
+
| 플러그인 | `/plugins` (아래 레시피) |
|
|
55
|
+
| 스킬 생성 | 아래 레시피 |
|
|
56
|
+
| 워크플로 팩 | `/workflow` (아래 레시피) |
|
|
57
|
+
| 프로젝트(작업 디렉터리) | `/project` (아래 레시피) |
|
|
58
|
+
| 업데이트 | `/update` (아래 레시피) |
|
|
59
|
+
| 조회·세션 조작(레시피 없음) | `/context`(컨텍스트 표면) `/usage`(쿼터) `/resume`(이어하기) `/compact`(컨텍스트 압축) `/clear`(새 채팅) `/autoclear status` `/quit` |
|
|
60
|
+
|
|
61
|
+
### 메인 모델 변경 ("메인 모델 바꿔줘", "모델 변경")
|
|
62
|
+
|
|
63
|
+
1. **확인**: TUI 상태줄 또는 `/setting` → **Model** 메타; config `workflowRoutes.lead` / preset `workflow-lead` / 현재 `setRoute` 반영 여부는 `mixdog-config.json`에서 교차 확인.
|
|
64
|
+
2. **변경 (사용자 경로)**
|
|
65
|
+
- `/model` → 모델 피커 (`openModelPicker` → `store.setModel` → `runtime.setRoute`)
|
|
66
|
+
- 또는 `/setting` → **Model**
|
|
67
|
+
- 온보딩 일괄: `mixdog --onboarding` Step 2 **Main** (`completeOnboarding` + `defaultRoute`)
|
|
68
|
+
3. **검증**: 다음 턴부터 적용(진행 중 세션의 라이브 route는 유지). 새 채팅 `/clear` 후 provider/model 표시 확인.
|
|
69
|
+
|
|
70
|
+
### 특정 에이전트만 모델 변경 ("리뷰어만 다른 모델", "worker 모델")
|
|
71
|
+
|
|
72
|
+
1. **확인**: `/agents` 목록의 **Reviewer** 등 메타 = `config.agents[<id>]` override; 없으면 Main Model 동적 상속.
|
|
73
|
+
2. **변경**: `/agents` → 에이전트 선택 → 모델 피커 → `store.setAgentRoute` (`src/mixdog-session-runtime.mjs`: `agents`, `presets` `agent-<id>`, workflow-backed면 `workflowRoutes` + `maintenance` 미러).
|
|
74
|
+
3. **검증**: `/agents`에서 해당 에이전트 메타 갱신; config에 `agents.reviewer` (예) 및 일관된 preset 존재.
|
|
75
|
+
|
|
76
|
+
**Main으로 되돌리기**: TUI `/agents`에는 “Default” 행 없음 → config에서 `agents.<id>` 키 삭제 후 저장, 또는 `mixdog --onboarding` Step 2에서 해당 에이전트 **Default** (onboarding만 override 제거 UI 제공).
|
|
77
|
+
|
|
78
|
+
### 워크플로 슬롯 라우트 ("lead/agent/explorer/memory 슬롯", "에이전트 라우트")
|
|
79
|
+
|
|
80
|
+
슬롯 정의: `WORKFLOW_ROUTE_SLOTS = ['lead','agent','explorer','memory']` (`src/session-runtime/workflow.mjs`).
|
|
81
|
+
|
|
82
|
+
| 슬롯 | 사용자-facing 변경 |
|
|
83
|
+
|------|-------------------|
|
|
84
|
+
| **lead** | **메인 모델 변경** 레시피 (`/model`) |
|
|
85
|
+
| **explorer** | `/agents` → **Explore** |
|
|
86
|
+
| **memory** | `/agents` → **Maintainer** |
|
|
87
|
+
| **agent** | 전용 TUI 슬롯 피커 없음 → `mixdog --onboarding` Step 2 또는 config `workflowRoutes.agent` + preset `workflow-agent` 수동 일관 편집 |
|
|
88
|
+
|
|
89
|
+
1. **확인**: config `workflowRoutes`, `presets` (`workflow-<slot>`, `agent-<id>`), `maintenance.explore` / `maintenance.memory`.
|
|
90
|
+
2. **변경**: 위 표 경로; 대량·최초 설정은 `mixdog --onboarding` → `completeOnboarding` → `saveConfigAndAdopt`.
|
|
91
|
+
3. **검증**: **3키 일관성** — `workflowRoutes`, `agents`, `presets`가 서로 모순 없는지 (파일 직접 편집 시 필수).
|
|
92
|
+
|
|
93
|
+
### Provider API 키 ("API 키 설정", "OpenAI 키")
|
|
94
|
+
|
|
95
|
+
1. **확인**: `/providers` 또는 `/setting` → **Providers**; provider 행의 authenticated/env 상태.
|
|
96
|
+
2. **변경**: `/providers` → API provider → **Add/Replace API key** → 마스크 입력 (`provider-setup-picker.mjs` → keychain `agent.<provider>.apiKey`). OAuth/local provider는 동일 피커 내 해당 액션.
|
|
97
|
+
3. **검증**: `/providers`에서 authenticated; 필요 시 `/model` 목록 로드 성공.
|
|
98
|
+
**대안**: 표준 env 최우선 (`OPENAI_API_KEY` 등 — §부록 secrets).
|
|
99
|
+
|
|
100
|
+
### Provider OAuth 로그인 ("클로드 로그인", "OAuth 인증", "구독 계정 연결")
|
|
101
|
+
|
|
102
|
+
1. **확인**: `/providers` — OAuth provider 행(예: anthropic-oauth, openai-oauth, grok-oauth)의 authenticated 상태.
|
|
103
|
+
2. **변경**: `/providers` → OAuth provider 선택 → **Login** (`login-oauth` → `startOAuthLogin`, 브라우저 로그인 플로우) / 해제는 **Forget** (`forget-oauth`). 자격은 `<mixdogData>`의 provider별 credential 파일(예: `anthropic-oauth-credentials.json`)에 저장.
|
|
104
|
+
3. **검증**: `/providers` authenticated 표시; `/model`에서 해당 provider 모델 목록 로드.
|
|
105
|
+
|
|
106
|
+
### 로컬/커스텀 엔드포인트 ("로컬 모델", "ollama 연결")
|
|
107
|
+
|
|
108
|
+
1. **확인**: `/providers` — local provider 행.
|
|
109
|
+
2. **변경**: `/providers` → local provider 선택 → 로컬 엔드포인트 액션 피커(`openLocalProviderActions` — URL 등 설정).
|
|
110
|
+
3. **검증**: `/providers` 상태; `/model` 목록에 로컬 모델 노출.
|
|
111
|
+
|
|
112
|
+
### Usage 로그인 (OpenCode Go 등) ("사용량 인증")
|
|
113
|
+
|
|
114
|
+
- `/providers` → 해당 provider → **Usage login (browser)** — 브라우저 로그인 후 auth cookie 자동 캡처(keychain `agent.opencode-go.authCookie`). `/usage`가 쿼터를 못 읽을 때 이 경로.
|
|
115
|
+
|
|
116
|
+
### 출력 스타일 변경 ("출력 스타일 바꿔", "minimal로")
|
|
117
|
+
|
|
118
|
+
1. **확인**: config 루트 `outputStyle` (레거시 `agent.outputStyle` 제거 권장); `outputStyleStatus()` / `/OutputStyle status`.
|
|
119
|
+
2. **변경**: `/OutputStyle` 또는 `/style` (인자 없으면 피커); 직접 `/OutputStyle minimal` → `setOutputStyle` (`output-styles.mjs` id·별칭). 사용자 정의: `<mixdogData>/output-styles/<id>.md`.
|
|
120
|
+
3. **검증**: notice의 label; 대화가 있으면 “Use /clear to apply” — 빈 세션은 자동 세션 재생성.
|
|
121
|
+
|
|
122
|
+
### Recap / 메모리 배경 주기 ("메모리 꺼줘", "recap off")
|
|
123
|
+
|
|
124
|
+
**구분**: 코어 메모리 도구는 상시; UI **Recap** = config `recap.enabled` (`setMemoryEnabled` → `setRecapEnabled`, `settings-api.mjs`). 전용 `/recap` 명령·`/setting` Recap 행은 **없음** — 진입점은 `/memory` 피커 토글뿐.
|
|
125
|
+
|
|
126
|
+
1. **확인**: `/memory` → 코어 메모리 피커 상단 토글 메타; config `recap.enabled`.
|
|
127
|
+
2. **변경**: `/memory` 피커 상단 토글 (`core-memory-picker.mjs` → `store.setMemoryEnabled`); 또는 config `recap.enabled` 직접 편집.
|
|
128
|
+
3. **검증**: 토글 후 피커 메타/notice; config `recap.enabled`.
|
|
129
|
+
|
|
130
|
+
### memory interval ("사이클 간격", "10m 간격")
|
|
131
|
+
|
|
132
|
+
TUI 전용 interval 피커 없음.
|
|
133
|
+
|
|
134
|
+
1. **확인**: config `memory.cycle1.interval`, `memory.cycle2.interval` (duration 문자열, 템플릿 `src/defaults/mixdog-config.template.json`).
|
|
135
|
+
2. **변경**: `mixdog-config.json`의 `memory` 섹션 편집 (유효 JSON 유지).
|
|
136
|
+
3. **검증**: 파일 재읽기; memory 데몬은 config 리로드 정책에 따름(변경 후 mixdog 재시작이 가장 확실).
|
|
137
|
+
|
|
138
|
+
### MCP 서버 추가 — stdio / http ("MCP 추가해줘", "stdio MCP")
|
|
139
|
+
|
|
140
|
+
**소스**: config `mcpServers` + 프로젝트 `.mcp.json` 병합; 이름 충돌 시 **프로젝트 승** (`mcp-glue.mjs`).
|
|
141
|
+
|
|
142
|
+
1. **확인**: `/mcp` 연결 수; 프로젝트 `<cwd>/.mcp.json` 존재 여부.
|
|
143
|
+
2. **변경**
|
|
144
|
+
- **사용자 config**: `mixdog-config.json` → `mcpServers.<name>` 추가 (stdio: `type`,`command`,`args`,`cwd` 프로젝트 하위만; http: `type`,`url`,`headers`) 후 **mixdog TUI 재시작** (런타임 `addMcpServer` / `reconnectMcp`는 `engine.mjs`에 있으나 **TUI 메뉴에서 호출처 없음**; `App.jsx`의 `mcp-add` 텍스트 프롬프트 핸들러만 존재하고 진입 UI 미연결).
|
|
145
|
+
- **프로젝트 전용**: `<cwd>/.mcp.json` 편집 → 저장 후 TUI 재시작 또는 cwd 변경 시 자동 재연결.
|
|
146
|
+
3. **검증**: `/mcp`에서 `connected`, `toolCount>0`, `source` (config vs project).
|
|
147
|
+
|
|
148
|
+
### MCP 비활성화 / 삭제 / 재연결
|
|
149
|
+
|
|
150
|
+
1. **확인**: `/mcp` 서버 행 status·error.
|
|
151
|
+
2. **변경**
|
|
152
|
+
- **비활성화 (config `mcpServers`만)**: `/mcp` → 서버 선택/←→ → `setMcpServerEnabled` (config 항목). 프로젝트 `.mcp.json` 항목은 파일에서 `enabled:false` 또는 항목 제거.
|
|
153
|
+
- **삭제**: config면 `mcpServers`에서 키 제거 (`removeMcpServer` — TUI 미노출 → 파일 편집); 프로젝트면 `.mcp.json`에서 제거.
|
|
154
|
+
- **재연결**: 파일 직접 편집 후 **mixdog 재시작** (`reconnectMcp` TUI 미연결).
|
|
155
|
+
3. **검증**: `/mcp` connected 비율; 실패 시 error 문자열.
|
|
156
|
+
|
|
157
|
+
### MCP 연결 안 됨 — Unity MCP 등 ("유니티 MCP 연결 안 돼")
|
|
158
|
+
|
|
159
|
+
1. **확인**: `/mcp`에서 서버명·`source:project`·`transport`·`error`; `<cwd>/.mcp.json` url/command; config 동일 이름 덮어쓰기 여부.
|
|
160
|
+
2. **조치**: HTTP면 URL·방화벽·Unity 쪽 MCP 프로세스 기동; stdio면 `cwd`가 **프로젝트 하위**인지 (`normalizeMcpServerInput`); 충돌 시 프로젝트 정의가 우선인지 확인; `env`는 서버 프로세스용(민감값은 호스트 env 참조).
|
|
161
|
+
3. **검증**: `connected:true`, 기대 tool 노출.
|
|
162
|
+
|
|
163
|
+
### Discord / Telegram 토큰 ("디스코드 토큰 설정", "채널 설정")
|
|
164
|
+
|
|
165
|
+
1. **확인**: `/channels` 또는 `/setting` → **Setting** / **Channel**; `getChannelSetup()` authenticated·main target.
|
|
166
|
+
2. **변경**: `/channels` → **Discord** 또는 **Telegram** → **Bot token** → 붙여넣기 (keychain `discord.token` / `telegram.token`, `channel-pickers.mjs`). Main channel/chat ID는 동 피커 **Main channel/chat**.
|
|
167
|
+
3. **검증**: 피커 description “Ready”; `hasStoredSecret('discord.token')` 등 (값 미노출).
|
|
168
|
+
**참고**: `/setting` → **Channels enabled** = 채널 모듈 on/off (`channels` 섹션).
|
|
169
|
+
|
|
170
|
+
### 스킬 만들기 ("스킬 만들어줘")
|
|
171
|
+
|
|
172
|
+
1. **확인**: `/skills` 목록; 우선순위 프로젝트 vs 글로벌 (§부록).
|
|
173
|
+
2. **변경**
|
|
174
|
+
- **프로젝트**: `<cwd>/.mixdog/skills/<name>/SKILL.md` 생성 (frontmatter `name`, `description`).
|
|
175
|
+
- **글로벌**: `<mixdogData>/skills/<name>/SKILL.md` (이 setup 스킬과 동일 트리).
|
|
176
|
+
- 런타임 `addSkill` / TUI `skill-add` 프롬프트: **핸들러만 존재, 메뉴 진입 없음** → 파일 생성이 기본 사용자 경로.
|
|
177
|
+
3. **검증**: `/skills`에 표시; 트리거 문구를 `description`에 포함.
|
|
178
|
+
|
|
179
|
+
### 워크플로 팩 변경 ("워크플로 바꿔")
|
|
180
|
+
|
|
181
|
+
1. **확인**: `/workflow` 또는 `/setting` → **Workflow** active 표시.
|
|
182
|
+
2. **변경**: `/workflow` → 팩 선택 → `setWorkflow` (`config.workflow.active`).
|
|
183
|
+
3. **검증**: notice + active ✓.
|
|
184
|
+
|
|
185
|
+
### 웹서치 모델 ("서치 모델 바꿔", "search provider")
|
|
186
|
+
|
|
187
|
+
1. **확인**: config `searchRoute` (`{ provider, model, effort? }`); 상태줄/`/setting`.
|
|
188
|
+
2. **변경**: `/search` → 모델 피커 → `store.setSearchRoute` (`route-pickers.mjs` `openSearchPicker`). 인자 없이 피커만 지원.
|
|
189
|
+
3. **검증**: config `searchRoute` 갱신; search 툴 호출 시 해당 모델 사용.
|
|
190
|
+
|
|
191
|
+
### reasoning effort ("effort 올려", "high로")
|
|
192
|
+
|
|
193
|
+
1. **확인**: 상태줄 effort 표시.
|
|
194
|
+
2. **변경**: `/effort [level]` → `store.setEffort` (현재 라우트/preset에 `effort` 기록). busy 중에는 거부됨.
|
|
195
|
+
3. **검증**: notice "Effort set to <level>"; config 해당 route의 `effort`.
|
|
196
|
+
|
|
197
|
+
### Fast 모드 ("fast 켜줘")
|
|
198
|
+
|
|
199
|
+
1. **확인**: 상태줄 fast 표시.
|
|
200
|
+
2. **변경**: `/fast [on|off]` (인자 없으면 토글). busy 중 거부.
|
|
201
|
+
3. **검증**: notice; 다음 턴부터 적용.
|
|
202
|
+
|
|
203
|
+
### TUI 테마 ("테마 바꿔", "다크 테마")
|
|
204
|
+
|
|
205
|
+
1. **확인**: `store.getTheme()` / `/theme` 피커의 ✓ 표시.
|
|
206
|
+
2. **변경**: `/theme` (피커) 또는 `/theme <id>` → `setThemeSetting` — **TUI 로컬 설정**, config `ui.theme`에 persist (`src/tui/theme.mjs`). 런타임 왕복 없음, 즉시 적용.
|
|
207
|
+
3. **검증**: 화면 팔레트 즉시 변경 + notice "Theme set to ...".
|
|
208
|
+
|
|
209
|
+
### 프로필 — 호칭·응답 언어 ("이름 불러줘", "영어로 답해")
|
|
210
|
+
|
|
211
|
+
1. **확인**: `/setting` → **Profile** 메타.
|
|
212
|
+
2. **변경**: `/profile` (또는 `/setting` → Profile) → title 입력 / 언어 선택 → `setProfile` (`settings-api.mjs`) — config `profile` 섹션 (`title`, `language`; 미지원 언어 id는 `system`으로 정규화, 목록 `PROFILE_LANGUAGES`).
|
|
213
|
+
3. **검증**: config `profile`; 프롬프트 주입은 `composeSystemPrompt` 경유 — 새 세션부터 반영.
|
|
214
|
+
|
|
215
|
+
### 음성 — 채널 보이스 메시지 전사 ("보이스 켜줘")
|
|
216
|
+
|
|
217
|
+
전용 `/voice` 명령 **없음** — `/channels` 허브의 **Voice** 행.
|
|
218
|
+
|
|
219
|
+
1. **확인**: `/channels` → **Voice** 행 meta (On/Off); config `voice.enabled`.
|
|
220
|
+
2. **변경**: **Voice** 행 ←/→ 또는 Enter → `toggleVoice` (`src/tui/lib/voice-setup.mjs`) — config `voice.enabled` persist + 미설치 whisper/ffmpeg 자동 설치 시퀀스 (진행/실패 notice 자체 출력, 설치 중 재토글 거부).
|
|
221
|
+
3. **검증**: Voice 행 meta 갱신; 켜지면 채널로 온 음성 메시지가 전사되어 처리됨.
|
|
222
|
+
|
|
223
|
+
### autoclear ("자동 클리어", "idle 정리")
|
|
224
|
+
|
|
225
|
+
1. **확인**: `/autoclear status` 또는 `/setting` → **Auto-clear**.
|
|
226
|
+
2. **변경**: `/autoclear [on|off|<duration>]` (예 `90m`, `1h`) 또는 피커 — `setAutoClear` (`settings-api.mjs`) → config `autoClear` (`enabled`, `idleMs`, provider별 `providerIdleMs`; 최소 1분, 빈 값 리셋=provider 기본).
|
|
227
|
+
3. **검증**: notice "autoclear on · idle <duration>"; idle 초과 시 제출 전 자동 클리어 동작.
|
|
228
|
+
|
|
229
|
+
### auto-compact ("자동 압축", "컴팩트 방식")
|
|
230
|
+
|
|
231
|
+
1. **확인**: `/setting` → **Auto-compact** (On/Off); **Compact type** 행은 `Fast-track (fixed)` 고정 표시 — 토글 불가(`_action:null`, `settings-picker.mjs`).
|
|
232
|
+
2. **변경**: `/setting` **Auto-compact** 행에서 ←/→ 또는 Enter 토글 — `applyCompaction({ auto })` → config `compaction.auto`. compact type은 UI에서 변경 불가(Fast-track 고정).
|
|
233
|
+
3. **검증**: `/setting` Auto-compact 메타 갱신; 컨텍스트 높을 때 자동 압축 발동 여부.
|
|
234
|
+
|
|
235
|
+
### 채널 백엔드 전환 ("텔레그램으로 바꿔", "디스코드로")
|
|
236
|
+
|
|
237
|
+
1. **확인**: `/setting` → **Channel** 메타 (Discord/Telegram).
|
|
238
|
+
2. **변경**: `/setting` → **Channel** 행에서 ←/→ 순환(`cycleChannelBackend`) → 활성 백엔드 전환; 자격/메인 대상은 바로 아래 **Setting** 행(=`/channels` 딥링크).
|
|
239
|
+
3. **검증**: 메타 표시; 해당 백엔드 토큰이 있으면 remote에서 그 채널로 응답.
|
|
240
|
+
|
|
241
|
+
### 시스템 셸 ("셸 바꿔", "bash로")
|
|
242
|
+
|
|
243
|
+
TUI 피커 없음 (settings-api `setSystemShell`만 존재).
|
|
244
|
+
|
|
245
|
+
1. **확인**: 상태줄/`state.systemShell` (`source: auto|config`, `command`).
|
|
246
|
+
2. **변경**: config `shell` 키 편집 (`normalizeSystemShellConfig`) 후 재시작 — 셸 명령 경로 지정; 비우면 auto 감지.
|
|
247
|
+
3. **검증**: shell 툴 실행 시 해당 셸 사용.
|
|
248
|
+
|
|
249
|
+
### before-tool hooks ("툴 훅 규칙", "hook 추가")
|
|
250
|
+
|
|
251
|
+
1. **확인**: `/hooks` → 규칙 목록·최근 이벤트 (`hooksStatus`).
|
|
252
|
+
2. **변경**: `/hooks` 피커에서 규칙 관리 — 저장소: `<mixdogData>/hooks.json` — 표준 형태 `{ "hooks": { <Event>: [{ matcher, hooks:[...] }] } }`(우선) 또는 레거시 `{ "toolBefore":[...] }` 배열도 읽음 (`normalizeRules`/`isStandardConfig`, `src/standalone/hook-bus/config.mjs`). 파일 직접 편집도 가능(mtime 감지로 자동 리로드).
|
|
253
|
+
3. **검증**: `/hooks` 목록 반영; 대상 툴 호출 시 규칙 발동.
|
|
254
|
+
|
|
255
|
+
### 플러그인 ("플러그인 관리")
|
|
256
|
+
|
|
257
|
+
1. **확인**: `/plugins` 목록 (manifest·MCP script·skills 감지).
|
|
258
|
+
2. **변경**: `/plugins` 피커에서 활성/비활성 — 플러그인 루트의 `.mcp.json`/`skills/`가 자동 인식됨 (`plugin-mcp.mjs`).
|
|
259
|
+
3. **검증**: `/plugins` 상태 + 해당 플러그인 MCP/스킬 노출 여부.
|
|
260
|
+
|
|
261
|
+
### 스케줄 / 웹훅 ("스케줄 추가", "웹훅")
|
|
262
|
+
|
|
263
|
+
1. **확인**: `/schedules` / `/webhooks` (둘 다 `/channels` 허브의 섹션 딥링크).
|
|
264
|
+
2. **변경**: 해당 피커에서 추가/편집 — 채널 모듈 설정에 저장.
|
|
265
|
+
3. **검증**: 피커 목록 반영; 스케줄은 다음 발동 시각 표시.
|
|
266
|
+
|
|
267
|
+
### 원격 세션 ("리모트 가져와")
|
|
268
|
+
|
|
269
|
+
1. **확인**: 상태줄 remote 표시.
|
|
270
|
+
2. **변경**: `/remote` = **강제 클레임(항상 ON)** — 다른 세션 좌석을 뺏어옴(그쪽은 자동 OFF). 끄기는 `/channels`에서.
|
|
271
|
+
**시작 시 자동 클레임**: config `remote.autoStart: true` → 모든 세션이 부팅 때 자동으로 remote 클레임 (`mixdog --remote`와 동일 의미, 마지막에 뜬 세션이 좌석 소유).
|
|
272
|
+
**토글형**: `/setting` → **Remote Runtime** ←/→ (`applyRemoteRuntime`) — 이 세션의 remote ON/OFF 토글(클레임과 달리 OFF도 가능).
|
|
273
|
+
3. **검증**: notice "Remote mode ON — this session owns remote now."
|
|
274
|
+
|
|
275
|
+
### 프로젝트 전환 ("프로젝트 바꿔", "cwd 변경")
|
|
276
|
+
|
|
277
|
+
1. **확인**: 상태줄 cwd; `/project` 피커 목록.
|
|
278
|
+
2. **변경**: `/project [경로]` (인자 없으면 피커) → cwd 전환 — 프로젝트별 `.mcp.json`/skills 자동 재로드·MCP 재연결, 마지막 cwd persist.
|
|
279
|
+
3. **검증**: 상태줄 cwd; `/mcp`에서 프로젝트 서버 반영.
|
|
280
|
+
|
|
281
|
+
### 업데이트 ("업데이트 확인")
|
|
282
|
+
|
|
283
|
+
1. **확인/변경**: `/update` → 버전 확인·업데이트 피커 (`openUpdatePicker`; 자동 체크 설정은 update settings).
|
|
284
|
+
2. **검증**: 피커에 현재/최신 버전 표시.
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 부록 — 경로·스키마 (압축)
|
|
289
|
+
|
|
290
|
+
| 항목 | 위치 |
|
|
291
|
+
|------|------|
|
|
292
|
+
| Config | `<mixdogData>/mixdog-config.json` |
|
|
293
|
+
| 템플릿 | `src/defaults/mixdog-config.template.json` |
|
|
294
|
+
| Skills | `<cwd>/.mixdog/skills/<n>/SKILL.md` → `<mixdogData>/skills/<n>/SKILL.md` (프로젝트 우선) |
|
|
295
|
+
| 프로젝트 MCP | `<cwd>/.mcp.json` |
|
|
296
|
+
| Mixdog.md | 자동 프롬프트 로드 **없음** — skill/core memory로 대체 |
|
|
297
|
+
|
|
298
|
+
**outputStyle** — 루트 문자열; id: `default`, `simple`, `minimal`, `extreme-minimal` (+ 별칭 `output-styles.mjs`).
|
|
299
|
+
|
|
300
|
+
**memory** — `{ enabled, user, cycle1: { interval }, cycle2: { interval } }` (interval은 duration 문자열).
|
|
301
|
+
|
|
302
|
+
**channels** — `{ promptInjection: { mode, targetPath } }`; 식별·백엔드는 `channel`, `channelsConfig`, `discord.applicationId` 등 (진단 로직 참조).
|
|
303
|
+
|
|
304
|
+
**MCP config 예시 (shape만)**
|
|
305
|
+
- stdio: `{ "type":"stdio", "command":"...", "args":[], "cwd":"<프로젝트 하위>", "env":{} }`
|
|
306
|
+
- http: `{ "type":"http", "url":"https://...", "headers":{} }`
|
|
307
|
+
- 비활성: `"enabled": false`
|
|
308
|
+
|
|
309
|
+
**라우트 스키마** — `{ provider, model, effort? }`; 키: `workflowRoutes`, `agents`, `presets`, `maintenance`, `searchRoute`.
|
|
310
|
+
|
|
311
|
+
**Secrets / env (`SECRET_ACCOUNTS`)** — config에 비밀 저장 금지; OS keychain.
|
|
312
|
+
|
|
313
|
+
| account | env (예) |
|
|
314
|
+
|---------|----------|
|
|
315
|
+
| `discord.token` | `MIXDOG_DISCORD_TOKEN` |
|
|
316
|
+
| `telegram.token` | `MIXDOG_TELEGRAM_TOKEN` |
|
|
317
|
+
| `webhook.authtoken` | `MIXDOG_WEBHOOK_AUTHTOKEN` |
|
|
318
|
+
| `agent.<provider>.apiKey` | provider별 표준 env 우선 (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `DEEPSEEK_API_KEY`, `XAI_API_KEY` / `GROK_API_KEY`, `OPENCODE_API_KEY` 등 — `config.mjs`) |
|
|
319
|
+
| `agent.openai.usageSessionKey`, `agent.opencode-go.authCookie` | (provider 피커 전용) |
|
|
320
|
+
|
|
321
|
+
MCP 항목 `env` = 서버 자식 프로세스 환경 (keychain 아님).
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## 규칙
|
|
326
|
+
|
|
327
|
+
METHOD·POINTER만 유지. 확인되지 않은 키는 추측하지 말고 TODO. TUI에 없는 런타임 API(`addMcpServer`, `removeMcpServer`, `reconnectMcp`)는 **config 편집 + mixdog 재시작**으로 문서화한다.
|
package/src/help.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { stdout } from 'node:process';
|
|
2
2
|
|
|
3
|
-
/** Help text
|
|
3
|
+
/** Help text printed by `--help`. */
|
|
4
4
|
export const HELP_LINES = [
|
|
5
5
|
'mixdog — standalone mixdog CLI/TUI coding agent.',
|
|
6
6
|
'',
|
|
@@ -11,16 +11,13 @@ export const HELP_LINES = [
|
|
|
11
11
|
' mixdog --help',
|
|
12
12
|
'',
|
|
13
13
|
'Slash commands (inside mixdog):',
|
|
14
|
-
' /help show this help',
|
|
15
14
|
' /clear reset the conversation and clear the screen',
|
|
16
15
|
' /compact compact older conversation context',
|
|
17
16
|
' /model <name> switch model/preset for subsequent turns',
|
|
18
17
|
' /OutputStyle [name] show or switch Lead output style',
|
|
19
18
|
' /providers manage provider auth and local endpoints',
|
|
20
19
|
' /agents show available workflow agents',
|
|
21
|
-
' /
|
|
22
|
-
' /mode <name> switch tool surface: full | readonly',
|
|
23
|
-
' /exit quit',
|
|
20
|
+
' /quit quit (aliases: /exit, /q)',
|
|
24
21
|
'',
|
|
25
22
|
'History: use ↑ / ↓ to recall previous inputs.',
|
|
26
23
|
];
|
package/src/lib/mixdog-debug.cjs
CHANGED
|
@@ -36,6 +36,10 @@ const CANONICAL_PLUGIN_LOG_NAMES = new Set([
|
|
|
36
36
|
'session-start-critical.log',
|
|
37
37
|
'webhook.log',
|
|
38
38
|
'perf.log',
|
|
39
|
+
'tool-events.log',
|
|
40
|
+
'memory-runtime-proxy.log',
|
|
41
|
+
'channels-worker-standalone.log',
|
|
42
|
+
'mixdog-tui.stderr.log',
|
|
39
43
|
]);
|
|
40
44
|
|
|
41
45
|
/**
|
|
@@ -113,6 +117,12 @@ function rotateBoundedLog(filePath, maxBytes, keepBytes) {
|
|
|
113
117
|
} catch { /* missing file ok */ }
|
|
114
118
|
}
|
|
115
119
|
|
|
120
|
+
// Shared bound for unbounded per-writer plugin logs (tool-events,
|
|
121
|
+
// memory-runtime-proxy, channels-worker-standalone). Keep a tail so recent
|
|
122
|
+
// context survives rotation while the file stays under the 10 MB cap.
|
|
123
|
+
const PLUGIN_LOG_MAX_BYTES = 10 * 1024 * 1024;
|
|
124
|
+
const PLUGIN_LOG_KEEP_BYTES = 2 * 1024 * 1024;
|
|
125
|
+
|
|
116
126
|
/**
|
|
117
127
|
* Ship-mode durable fail-open record (size-capped). No-op when line empty.
|
|
118
128
|
*/
|
|
@@ -131,4 +141,7 @@ module.exports = {
|
|
|
131
141
|
pruneStalePluginDataLogSiblings,
|
|
132
142
|
appendSessionStartCriticalLog,
|
|
133
143
|
DEFAULT_STALE_LOG_SIBLING_MAX,
|
|
144
|
+
rotateBoundedLog,
|
|
145
|
+
PLUGIN_LOG_MAX_BYTES,
|
|
146
|
+
PLUGIN_LOG_KEEP_BYTES,
|
|
134
147
|
};
|