@kaydash9999/banker-plugins 0.22.0 → 0.23.2

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.
Files changed (106) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +68 -0
  4. package/PRIVACY.md +1 -0
  5. package/README.md +39 -13
  6. package/bin/banker.js +118 -22
  7. package/bin/lib/codex-hooks.mjs +116 -18
  8. package/bin/lib/codex-names.mjs +4 -0
  9. package/bin/lib/codex-routes.mjs +93 -1
  10. package/bin/lib/command-skill.cjs +37 -6
  11. package/codex/command-skills/front-qa/SKILL.md +1 -1
  12. package/codex/command-skills/setup/SKILL.md +4 -4
  13. package/codex/hooks.json +5 -5
  14. package/codex/manifest.json +18 -15
  15. package/codex/skills/progress/scripts/progress.mjs +44 -14
  16. package/codex/skills/teamwork/SKILL.md +143 -0
  17. package/codex/skills/teamwork/scripts/teamwork.mjs +1007 -0
  18. package/codex/transform-matrix.md +5 -3
  19. package/hooks/obsidize-hook.mjs +75 -32
  20. package/hooks/telemetry-count-codex.mjs +238 -57
  21. package/hooks/update-fetch.mjs +2 -1
  22. package/hooks/update-notify.mjs +82 -20
  23. package/package.json +3 -1
  24. package/skills/3d-intro-build/SKILL.md +101 -20
  25. package/skills/3d-intro-build/references/NOTICE.md +9 -2
  26. package/skills/3d-intro-build/references/assemble.mjs +113 -22
  27. package/skills/3d-intro-build/references/azure-adapter.mjs +110 -24
  28. package/skills/3d-intro-build/references/clip-post.mjs +443 -0
  29. package/skills/3d-intro-build/references/dive-mode.mjs +299 -0
  30. package/skills/3d-intro-build/references/intro-fixes.css +11 -0
  31. package/skills/3d-intro-build/references/prompts.md +51 -4
  32. package/skills/3d-intro-build/references/scrub-engine.js +1 -0
  33. package/skills/3d-intro-build/references/step-nav.css +29 -0
  34. package/skills/3d-intro-build/references/step-nav.js +284 -106
  35. package/skills/3d-intro-build/references/verify-intro.mjs +373 -32
  36. package/skills/3d-intro-build/references/verify.md +6 -0
  37. package/skills/3d-intro-build/references/video-pool.mjs +142 -12
  38. package/skills/3d-intro-setup/SKILL.md +20 -7
  39. package/skills/3d-intro-setup/references/azure-adapter.mjs +110 -24
  40. package/skills/3d-intro-setup/references/video-pool.mjs +142 -12
  41. package/skills/all-in-one/SKILL.md +125 -86
  42. package/skills/omc-patch/SKILL.md +1 -1
  43. package/skills/payload-mon/SKILL.md +1 -1
  44. package/skills/play-qa/SKILL.md +6 -4
  45. package/skills/progress-mon/README.md +164 -0
  46. package/skills/progress-mon/SKILL.md +165 -0
  47. package/skills/progress-mon/assets/fixture/README.md +1 -0
  48. package/skills/progress-mon/assets/fixture/arch.json +33 -0
  49. package/skills/progress-mon/assets/fixture/commits.json +7 -0
  50. package/skills/progress-mon/assets/fixture/config.json +30 -0
  51. package/skills/progress-mon/assets/fixture/events.jsonl +7 -0
  52. package/skills/progress-mon/assets/fixture/flow.json +44 -0
  53. package/skills/progress-mon/assets/fixture/items.json +14 -0
  54. package/skills/progress-mon/assets/fixture/req-spec.json +31 -0
  55. package/skills/progress-mon/assets/fixture/reqs.json +11 -0
  56. package/skills/progress-mon/assets/fixture/variants/arch-auto/arch.json +58 -0
  57. package/skills/progress-mon/assets/fixture/variants/check-auto/arch.json +15 -0
  58. package/skills/progress-mon/assets/fixture/variants/check-overlap/arch.json +14 -0
  59. package/skills/progress-mon/assets/fixture/variants/history-manual/config.json +13 -0
  60. package/skills/progress-mon/assets/fixture/variants/history-manual/items.json +7 -0
  61. package/skills/progress-mon/assets/fixture/variants/workflow-wide/flow.json +35 -0
  62. package/skills/progress-mon/assets/fixture/workflows/wf_ex1/agent-a01.jsonl +1 -0
  63. package/skills/progress-mon/assets/fixture/workflows/wf_ex1/agent-a02.jsonl +1 -0
  64. package/skills/progress-mon/assets/fixture/workflows/wf_ex1/agent-a03.jsonl +1 -0
  65. package/skills/progress-mon/assets/fixture/workflows/wf_ex1/agent-a04.jsonl +1 -0
  66. package/skills/progress-mon/assets/fixture/workflows/wf_ex1/journal.jsonl +7 -0
  67. package/skills/progress-mon/references/arch.md +280 -0
  68. package/skills/progress-mon/references/authoring.md +199 -0
  69. package/skills/progress-mon/references/config.md +115 -0
  70. package/skills/progress-mon/references/flow.md +75 -0
  71. package/skills/progress-mon/references/inventory.md +58 -0
  72. package/skills/progress-mon/references/items.md +74 -0
  73. package/skills/progress-mon/references/req-spec.md +74 -0
  74. package/skills/progress-mon/references/reqs.md +30 -0
  75. package/skills/progress-mon/scripts/index.js +31 -0
  76. package/skills/progress-mon/scripts/pm-check.mjs +549 -0
  77. package/skills/progress-mon/scripts/pm-config.mjs +343 -0
  78. package/skills/progress-mon/scripts/pm-data.mjs +394 -0
  79. package/skills/progress-mon/scripts/pm-html.mjs +77 -0
  80. package/skills/progress-mon/scripts/pm-memory.mjs +333 -0
  81. package/skills/progress-mon/scripts/pm-render.mjs +1644 -0
  82. package/skills/progress-mon/scripts/pm-server.mjs +781 -0
  83. package/skills/progress-mon/scripts/pm-sources.mjs +501 -0
  84. package/skills/progress-mon/scripts/progress-mon.mjs +167 -0
  85. package/skills/ralph-qa/SKILL.md +107 -17
  86. package/skills/ralph-qa/references/gate-evidence.mjs +457 -0
  87. package/skills/ralph-qa/references/payload-scan.mjs +19 -2
  88. package/skills/ralph-qa/references/run-folder.mjs +299 -0
  89. package/skills/ralph-qa/references/seat-payload.mjs +60 -13
  90. package/skills/ralph-qa/references/seat-run.mjs +200 -159
  91. package/skills/remains/SKILL.md +2 -0
  92. package/skills/remains/scripts/boxes.mjs +6 -2
  93. package/skills/setup-bypass-permissions/scripts/codex-config.mjs +19 -8
  94. package/skills/setup-mcp/SKILL.md +1 -1
  95. package/skills/setup-omc-hud/SKILL.md +2 -1
  96. package/skills/setup-omc-hud/assets/codex-config.mjs +19 -8
  97. package/skills/ultra-chain/SKILL.md +32 -14
  98. package/skills/ultra-chain/references/chain-ledger.mjs +111 -3
  99. package/skills/ultra-init/SKILL.md +30 -22
  100. package/skills/ultraqa/NOTICE.md +34 -0
  101. package/skills/ultraqa/SKILL.md +197 -0
  102. package/skills/ultraqa/references/gate-evidence.mjs +457 -0
  103. package/skills/ultraqa/references/run-folder.mjs +299 -0
  104. package/skills/ultraqa/references/tmux-drive.md +52 -0
  105. package/skills/ultraqa/references/uqa-run.mjs +339 -0
  106. package/skills/update-banker/SKILL.md +1 -1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: payload-mon
3
- description: "OMC HUD 상태표시줄에 현재 세션이 보내는 API 요청의 페이로드 추정치를 32MB 한도 대비로 표시하는 기능을 켜고 끔. 래퍼 v4 는 `PL:` 칸으로 늘 보이고, 옛 래퍼는 8MB 부터 `ctx` 옆에 보임. 'payload-mon'/'payload 모니터 켜/꺼'/'상태표시줄 payload 표시'/'요청 크기 경고'/'32MB 한도 경고'/'payload 표시가 안 보여' 시 사용."
3
+ description: "Claude Code 의 OMC 를 다룸(Codex 에서 실행해도 같음). OMC HUD 상태표시줄에 현재 세션이 보내는 API 요청의 페이로드 추정치를 32MB 한도 대비로 표시하는 기능을 켜고 끔. 래퍼 v4 는 `PL:` 칸으로 늘 보이고, 옛 래퍼는 8MB 부터 `ctx` 옆에 보임. 'payload-mon'/'payload 모니터 켜/꺼'/'상태표시줄 payload 표시'/'요청 크기 경고'/'32MB 한도 경고'/'payload 표시가 안 보여' 시 사용."
4
4
  argument-hint: "on | off | status"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: play-qa
3
- description: "Godot 로 만든 HTML5 웹 게임을 실제 브라우저에서 Playwright 로 직접 플레이하며 렌더, 입력, 시작 결함을 찾음. 'play-qa'/'게임 직접 qa'/'네가 직접 플레이해봐'/'in-browser 플레이테스트' 시 사용."
3
+ description: "웹 기반 동작 컨텐츠(예: HTML5 웹 게임)를 실제 브라우저에서 Playwright 로 직접 플레이하며 렌더, 입력, 시작 결함을 찾음. 'play-qa'/'게임 직접 qa'/'네가 직접 플레이해봐'/'in-browser 플레이테스트' 시 사용."
4
4
  ---
5
5
 
6
6
  # play-qa: 에이전트가 직접 브라우저에서 게임을 플레이·QA
@@ -36,14 +36,16 @@ description: "Godot 로 만든 HTML5 웹 게임을 실제 브라우저에서 Pla
36
36
  6. 주관 항목 → 플레이테스트 체크리스트로 오너에게.
37
37
 
38
38
  ## ★입력 함정 (하드-원 교훈 — 모르면 멀쩡한 게임을 '고장'으로 오판)
39
- - **시작은 HELD click**: `mouse.move(x,y); mouse.down(); wait(~250ms); mouse.up()`. **instant `click()` 금지** — ①폴링형 입력(예: onebutton의 `Input.is_mouse_button_pressed`)은 instant down+up을 프레임 사이에서 놓침 ②Godot 캔버스 포커스.
40
- - **타이틀 `mouse_filter=STOP` 버그류 (실제 적발된 결함):** 타이틀 풀스크린 `ColorRect`/`Label`은 Godot 기본 `mouse_filter=STOP`이라 클릭/탭을 *삼켜* `_unhandled_input` 시작핸들러에 도달 못 함 → **키보드 Space만 시작**(터치기기엔 Space 없음 = 데드엔드). **증상: click/tap엔 시작 안 되고 Space엔 시작되면 이 버그.** 수정 = `_show_title()` 끝에 타이틀 Control(단 `Button` 제외)을 `MOUSE_FILTER_IGNORE`로.
39
+ - **시작은 HELD click**: `mouse.move(x,y); mouse.down(); wait(~250ms); mouse.up()`. **instant `click()` 금지** — ①폴링형 입력(예: onebutton의 `Input.is_mouse_button_pressed`)은 instant down+up을 프레임 사이에서 놓침 ②캔버스 포커스(예: Godot 웹 빌드).
41
40
  - **드롭/드로우/조준은 DRAG**(down+move+up), bare click 아님(머지 '드롭'=상단 드래그). 드래그는 인게임에서 잘 먹지만 bare click은 안 먹을 수 있다.
42
41
  - **시작 후 맹목 Space 금지**: Space가 일부 게임을 **PAUSE**시킨다(타이틀=시작, 인게임=일시정지일 수 있음 — 화면 우상단 `❚❚` 확인).
43
42
  - **헤드리스 맹점**: env-게이트 오토데모는 `_start_game()`를 *직접 호출* → 입력-시작 경로 우회 → 헤드리스는 시작/입력 버그를 **구조적으로 못 봄**. in-browser만이 잡는다.
44
- - **헤드리스 desktop Godot AUTOSHOTS는 일부 env서 GL 크래시**(rc139/segfault) → 웹빌드 in-browser로 대체.
45
43
  - 캔버스는 DOM이 아니라 canvas 렌더 → 점수/HUD는 DOM 스크랩 불가, **스크린샷 판독**으로만 평가.
46
44
 
45
+ ### 엔진별 예시: Godot 웹 빌드
46
+ - **타이틀 `mouse_filter=STOP` 버그류 (실제 적발된 결함):** 타이틀 풀스크린 `ColorRect`/`Label`은 Godot 기본 `mouse_filter=STOP`이라 클릭/탭을 *삼켜* `_unhandled_input` 시작핸들러에 도달 못 함 → **키보드 Space만 시작**(터치기기엔 Space 없음 = 데드엔드). **증상: click/tap엔 시작 안 되고 Space엔 시작되면 이 버그.** 수정 = `_show_title()` 끝에 타이틀 Control(단 `Button` 제외)을 `MOUSE_FILTER_IGNORE`로.
47
+ - **헤드리스 desktop Godot AUTOSHOTS는 일부 env서 GL 크래시**(rc139/segfault) → 웹빌드 in-browser로 대체.
48
+
47
49
  ## 게임별 구동 제스처 (장르별 예시)
48
50
  bullet-heaven=드래그 이동(자동사격)·merge=상단 DRAG 드롭·onebutton=held click/Space 패리(타이밍 정밀=합성한계)·driver=←/→ 키·stacker=탭/Space 드롭·slingshot=당겨 DRAG-릴리즈(정밀조준=합성한계)·gridfit=트레이→격자 DRAG(픽업=합성한계)·ward=가로 DRAG 잉크배리어.
49
51
 
@@ -0,0 +1,164 @@
1
+ # progress-mon
2
+
3
+ 프로젝트 진척도를 4탭 웹 화면(진척도, 구현요건, workflow, 구성도)으로 보이는 스킬. 사용 절차는 `SKILL.md`.
4
+ 이 폴더 하나를 banker 의 `skills/progress-mon/` 으로 그대로 옮긴다.
5
+
6
+ ## 구조
7
+
8
+ | 경로 | 역할 |
9
+ |---|---|
10
+ | `SKILL.md` | frontmatter `name`, `description` 만. 인자 없는 호출 절차, 하위 명령, init 절차, 런타임 표 |
11
+ | `README.md` | 이 문서. 구조, 시험, banker 통합 메모, 넘김 요청문 |
12
+ | `scripts/progress-mon.mjs` | CLI 진입. 인자 해석, 런타임 판별, 하위 명령 분기, `--help`, 종료 코드. 자료 폴더가 있으면 `state.json` 의 `skillDir` 갱신 |
13
+ | `scripts/pm-config.mjs` | 프로젝트 루트와 자료 폴더 결정, `config.json` 읽기, 기본값, 형식 검사, 원자적 쓰기(임시 파일과 rename, Windows 재시도) |
14
+ | `scripts/pm-sources.mjs` | events.jsonl, git log, 워크플로 journal, `items.json` 읽기. 스토리와 라벨 판정 함수, 시각 해석, 읽기 캐시 |
15
+ | `scripts/pm-html.mjs` | escape, 색 검사, 유한 수 검사, 글 폭 추정, 줄바꿈, 공통 CSS, 탭 머리 |
16
+ | `scripts/pm-render.mjs` | 4탭, 단일 HTML 스냅숏(`export`), workflow 배치, 구성도 자동 배치 |
17
+ | `scripts/pm-server.mjs` | `serve`, `start`, `stop`, `status`. 바인드, Host 검사, 신원 경로, 상태 파일, 포트 선택, 로그 |
18
+ | `scripts/pm-data.mjs` | `init`, `item`, `note`, `stage`, `story`(`items.json` 잠금과 낡은 잠금 정리) |
19
+ | `scripts/pm-memory.mjs` | 메모리 규칙 등록, 규칙 로드 한도 측정 |
20
+ | `scripts/pm-check.mjs` | 자료 형식, 상호 참조, 구성도와 workflow 기하, 밀도 검사 |
21
+ | `scripts/index.js` | `node --test <폴더>/` 진입 로더. 모든 `*.test.mjs` 적재, 마지막 시험 `all <n> test files loaded` |
22
+ | `scripts/*.test.mjs` | 모듈별 시험. 시험마다 `timeout: 60000` |
23
+ | `references/` | `config.md`, `items.md`, `req-spec.md`, `reqs.md`, `flow.md`, `arch.md`(스키마와 판정 규칙), `authoring.md`(init 작성 지침, 밀도 기준), `inventory.md` |
24
+ | `assets/fixture/` | 형식 시험용 최소 자료와 변형(`variants/`). 화면 수준의 견본이 아님 |
25
+
26
+ - 의존성: Node 18 이상 내장 모듈만. npm 의존 0
27
+ - 인코딩: UTF-8, BOM 없음, LF. 숨은 문자는 escape(`\u{...}`)로만
28
+ - 파일 이름 접두 `pm-`: banker 의 `hooks/progress*.mjs` 와 겹치지 않게
29
+
30
+ ## 시험
31
+
32
+ | 셸 | 명령 |
33
+ |---|---|
34
+ | cmd | `set CI=true&& node --test --test-reporter=tap skills/progress-mon/scripts/` |
35
+ | POSIX | `CI=true node --test --test-reporter=tap skills/progress-mon/scripts/` |
36
+
37
+ - 경로는 banker 저장소 기준. 원본 폴더(`skills-dev/`)에서는 그 경로로 바꾼다
38
+ - 폴더 인자: Node 24 는 폴더를 모듈로 풀어 `scripts/index.js` 를 적재한다. 판정은 `# fail 0` 과 `all <n> test files loaded` 시험 ok
39
+ - Node 18 은 폴더를 모듈로 풀지 않고 시험 파일을 직접 찾는다. 시험은 모두 돌고 `all <n> test files loaded` 시험 하나만 없다
40
+ - 시험은 임시 HOME, 임시 프로젝트, OS 가 고른 빈 포트에서 돈다. 포트 30000, 3456, 3458 은 쓰지 않는다
41
+ - 시험은 PATH 의 `git` 으로 임시 저장소를 만든다. git 이 없는 PC 에서는 그 시험 10개가 실패한다(2026-10-30, PATH 에 node 와 mkfifo 만 두고 실측). 스킬 자체는 git 이 없으면 커밋 기록 없이 동작
42
+ - FIFO 와 `/dev/zero` 시험은 POSIX 만. Windows 에서는 이유를 밝히고 건너뛴다
43
+
44
+ ## 개발
45
+
46
+ - 내부용 `serve`: `start` 와 같은 인자로 서버를 앞에서 실행(시험, 디버그, Codex 사용자 터미널 안내). `--help` 에는 나오지 않는다
47
+ - 시험 전용 환경 변수 `PROGRESS_MON_NOW`(ISO 시각): `serve` 가 요청마다 렌더에 넘기는 시각을 고정
48
+ - `PM_TEST_PRIVATE_IP=<이 PC 사설 IPv4>`: 있으면 사설 주소 바인드 시험을 실제로 돌린다. 없으면 그 시험은 TAP 진단 줄만 남기고 사설 바인드는 미검증
49
+ - cmd 예: `set PM_TEST_PRIVATE_IP=10.0.0.5&& set CI=true&& node --test --test-reporter=tap skills-dev/progress-mon/scripts/`
50
+
51
+ ## 대상 OS
52
+
53
+ 2026-10-30 banker 테스트박스 실측(시험 188개).
54
+
55
+ | 대상 | 상태 |
56
+ |---|---|
57
+ | Windows 10 x64 | 확인. 187 통과, 1 건너뜀(FIFO 와 `/dev/zero` 는 POSIX 만) |
58
+ | macOS | 확인. 188/188 |
59
+ | Linux(Rocky8, Node 22) | 확인. 188/188 |
60
+ | Node 18(v18.20.8, Rocky8) | 확인. 187/187. 폴더 진입 로더 확인 시험 1개는 Node 18 에 해당 없음 |
61
+ | 사설 IP 바인드(`PM_TEST_PRIVATE_IP`) | Linux PC 에서만 확인. 박스 주소가 사설 대역이 아니라 박스에서는 미검증 |
62
+
63
+ ## 보안 요약
64
+
65
+ - 기본 바인드 127.0.0.1. `--host` 는 사설 IPv4 만, 경고 한 줄. `0.0.0.0`, `::`, 공인, 링크 로컬, 100.64/10, 이름 거부
66
+ - Host 헤더 정확 일치 허용 목록, 그 밖 403. `GET`, `HEAD` 만(그 밖 405). `/`, `/index.html`, 신원 경로만(그 밖 404)
67
+ - 자료 폴더 파일(`server.json` 포함)은 서빙하지 않는다. 오류 응답은 일반 문구만, 스택은 `server.log` 에만
68
+ - 응답 머리: `cache-control: no-store`, `x-content-type-options: nosniff`, `referrer-policy: no-referrer`, `content-security-policy: default-src 'none'; style-src 'unsafe-inline'; img-src data:`
69
+ - `stop` 은 상태 파일 PID 와 신원 응답 PID 가 같을 때만
70
+ - 자료 폴더나 그 위 `.omc`, `.omx` 가 링크면 모든 명령을 거부한다(저장소가 심은 링크로 밖에 쓰거나 지우지 않게)
71
+ - `server.log` 가 링크, 특수 파일, 하드링크면 쓰지도 비우지도 않고, 기록이 멈춘 것을 status 경고로 한 번 알린다. 자료 파일(`config.json` 등)은 링크를 따라 읽되 일반 파일만 읽는다. 메모리 대상은 프로젝트(또는 `--memory-dir`) 밖을 가리키는 링크와 하드링크를 거부한다
72
+
73
+ ## Codex override 가려짐 해소
74
+
75
+ `AGENTS.override.md` 에 공백 아닌 글이 있으면 Codex 는 그 파일을 읽고 `AGENTS.md` 를 읽지 않는다. `init --memory agents-md` 는 규칙이 실제로 읽히도록 그 override 에 쓴다.
76
+ override 에 banker 블록이나 이 스킬 블록만 있으면 `init`, `status`, `check` 가 "AGENTS.override.md 에 블록만 있어 AGENTS.md 가 가려짐" 경고를 낸다. 해소 방법은 둘 중 하나.
77
+
78
+ - `AGENTS.md` 의 지시를 `AGENTS.override.md` 로 옮긴다(override 를 계속 씀)
79
+ - `AGENTS.override.md` 에서 블록을 지우고 파일이 비면 지운 뒤 `init --runtime codex --memory agents-md` 를 다시 실행한다(`AGENTS.md` 에 등록)
80
+
81
+ ## banker 통합 메모
82
+
83
+ 아래는 banker 에 넣기 전에 쓴 초안이다. 통합은 끝났다(banker 의 `codex/manifest.json`, `scripts/smoke-test.js`, `hooks/progress.test.mjs`, README 스킬 표).
84
+ 통합 뒤 이 폴더에서 고친 것(링크와 특수 파일 거부, 정규식 시간 상한, 실행 중 config 반영, start 잠금 등)은 banker 계획 문서 31절에 있다.
85
+
86
+ ### `/banker:progress` 와 차이
87
+
88
+ | 항목 | `/banker:progress` | `/banker:progress-mon` |
89
+ |---|---|---|
90
+ | 종류 | 명령(`commands/progress.md`)과 훅 | 스킬 |
91
+ | 보이는 곳 | Claude Mods 패널(세션 작업 목록) | 브라우저(로컬 포트 서버, 4탭) |
92
+ | 런타임 | mod 를 지원하는 Claude Code 만 | Claude Code 와 Codex |
93
+ | 서버 | 없음 | 있음(127.0.0.1 기본) |
94
+
95
+ - `hooks/hooks.json` 의 `UserPromptExpansion` matcher `^banker:progress$` 는 끝이 고정이라 `banker:progress-mon` 을 가로채지 않는다
96
+
97
+ ### manifest
98
+
99
+ `codex/manifest.json` 의 `surfaces` 에 넣을 항목 초안:
100
+
101
+ ```json
102
+ { "name": "progress-mon", "type": "skill", "target": "both",
103
+ "reason": "project progress web screen with four tabs (progress, requirements, workflow, architecture) on a local server; init reads the code and writes the tab data, registers a one-line update rule in project memory; item, note, stage, story keep it current; pure Node, no deps",
104
+ "supportingFiles": ["README.md", "references/arch.md", "references/authoring.md", "references/config.md", "references/flow.md", "references/inventory.md", "references/items.md", "references/req-spec.md", "references/reqs.md", "scripts/index.js", "scripts/pm-check.mjs", "scripts/pm-config.mjs", "scripts/pm-data.mjs", "scripts/pm-html.mjs", "scripts/pm-memory.mjs", "scripts/pm-render.mjs", "scripts/pm-server.mjs", "scripts/pm-sources.mjs", "scripts/progress-mon.mjs", "assets/fixture/README.md", "assets/fixture/config.json", "assets/fixture/events.jsonl", "assets/fixture/items.json", "assets/fixture/commits.json", "assets/fixture/req-spec.json", "assets/fixture/reqs.json", "assets/fixture/flow.json", "assets/fixture/arch.json", "assets/fixture/workflows/wf_ex1/journal.jsonl", "assets/fixture/workflows/wf_ex1/agent-a01.jsonl", "assets/fixture/workflows/wf_ex1/agent-a02.jsonl", "assets/fixture/workflows/wf_ex1/agent-a03.jsonl", "assets/fixture/workflows/wf_ex1/agent-a04.jsonl", "assets/fixture/variants/arch-auto/arch.json", "assets/fixture/variants/check-auto/arch.json", "assets/fixture/variants/check-overlap/arch.json", "assets/fixture/variants/history-manual/config.json", "assets/fixture/variants/history-manual/items.json", "assets/fixture/variants/workflow-wide/flow.json"],
105
+ "caveat": "needs Node 18 or later (above the package engines floor); binds 127.0.0.1 only by default, --host takes a private IPv4 with a warning; data lives in .omc/progress-mon/ (Codex .omx/progress-mon/); on Codex start, stop, status and init each ask for sandbox_permissions require_escalated, and a long-lived screen runs from the user's terminal (serve) since closing the session may stop the server" }
106
+ ```
107
+
108
+ ### Codex 변환
109
+
110
+ - 설치 위치 `~/.codex/skills/banker-progress-mon/`, frontmatter `name: banker-progress-mon`
111
+ - SKILL.md 런타임 표의 Codex 열이 이 경로를 쓴다
112
+
113
+ ### package
114
+
115
+ - `package.json` `files` 의 `skills` 에 포함된다. `!**/*.test.mjs` 로 시험 파일은 빠지고 `scripts/index.js` 는 실린다
116
+ - `engines`(`>=16.7.0`)보다 높은 Node 18 요구는 manifest `caveat` 에 적었다
117
+
118
+ ### 전역 시험
119
+
120
+ - banker `scripts/hidden-chars.test.mjs`(숨은 문자 0)와 `scripts/powershell-syntax.test.mjs`(PowerShell 블록 5.1 구문)를 통과하도록 썼다. 이 폴더의 문서에는 PowerShell 코드 블록이 없다
121
+
122
+ ### SKILL.md 표식 줄
123
+
124
+ - 본문의 평문 한 줄 `progress-mon skill body marker v1` 은 지우지 않는다
125
+ - 이유: 실제 스킬 호출 시운전이 이 줄로 본문 전개를 확인했다. 넘긴 파일과 그 증거가 같아야 한다
126
+
127
+ ### 이름 충돌 기록
128
+
129
+ banker 0.20.5 설치본(파일 239개)과 비교한 결과.
130
+
131
+ | 비교 | 결과 |
132
+ |---|---|
133
+ | 파일 이름이 `pm-` 또는 `progress-mon` 으로 시작하는 banker 파일 | 0 |
134
+ | 이 폴더의 파일 이름과 같은 banker 파일 이름(`pm-*`, `progress-mon*`) | 0 |
135
+ | banker 스킬 63개 이름과 `progress-mon` | 겹침 0 |
136
+ | banker 명령 3개(`front-qa`, `progress`, `setup`)와 `progress-mon` | 겹침 0 |
137
+ | banker 의 `progress` 로 시작하는 파일 | `commands/progress.md`, `hooks/progress.mjs`, `hooks/progress-plan.mjs`, `hooks/progress-fallback.mjs`, 그 시험 3개. 모두 `progress-mon` 과 이름이 다름 |
138
+
139
+ ### argument-hint
140
+
141
+ - 넣지 않았다. frontmatter 는 `name`, `description` 만이 이 스킬의 수용 기준이다
142
+ - banker SKILL.md 63개 가운데 13개만 `argument-hint` 를 쓴다. banker 쪽 판단으로 추가할 수 있다
143
+
144
+ ## 넘김 요청문
145
+
146
+ banker 플러그인 개발 세션에 붙여 넣는 글.
147
+
148
+ ```
149
+ banker 플러그인에 새 스킬 progress-mon 을 넣어 주세요.
150
+
151
+ - 원본: 함께 준 폴더 progress-mon/ 하나. skills/progress-mon/ 으로 그대로 복사
152
+ - 스크립트와 시험은 고치지 않음. 시험이 banker 환경에서 실패할 때만 고치고, 고친 내용을 알려 주세요
153
+ - 할 일
154
+ - codex/manifest.json surfaces 에 README.md 의 항목 초안 추가
155
+ - LIST.md, README.md, CHANGELOG.md, skill-changes.json 을 banker 관례대로 갱신
156
+ - 버전 올림은 RELEASING.md 절차
157
+ - 확인
158
+ - node --test skills/progress-mon/scripts/ 통과
159
+ - scripts/hidden-chars.test.mjs, scripts/powershell-syntax.test.mjs 통과
160
+ - banker setup --codex 뒤 ~/.codex/skills/banker-progress-mon/SKILL.md 의 name 이 banker-progress-mon
161
+ - /banker:progress 와 /banker:progress-mon 이 서로 가로채지 않음
162
+ - 기존 파일 이름과 겹침 없음(README.md 기록 참고)
163
+ - 대상 OS: Windows 10 x64 확인, macOS 와 Linux 는 미검증
164
+ ```
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: progress-mon
3
+ description: "프로젝트 진척도를 4탭 웹 화면(진척도, 구현요건, workflow, 구성도)으로 로컬 서버(기본 127.0.0.1:30000)에 띄움. 인자 없이 부르면 자료 폴더가 없을 때 init(코드를 읽어 4탭 자료를 쓰고 갱신 규칙 등록), 서버가 꺼져 있으면 start, 켜져 있으면 URL 보고. 하위 명령 init, start, stop, status, export, item, note, stage, story, check. 'progress-mon'/'진척도 화면'/'진척도 서버'/'진행 현황 웹 화면' 시 사용. 세션 작업 목록 패널은 이 스킬 대신 progress(Claude Code `/banker:progress`, Codex `$banker-progress`)."
4
+ ---
5
+
6
+ # progress-mon: 프로젝트 진척도 웹 화면
7
+
8
+ 프로젝트의 진척도를 4탭 웹 화면으로 보인다. 서버는 Node 내장 모듈만 쓰고 기본으로 127.0.0.1 에만 바인드한다.
9
+ 답변은 한글.
10
+
11
+ progress-mon skill body marker v1
12
+
13
+ | 탭 | 보이는 것 | 자료 |
14
+ |---|---|---|
15
+ | 진척도 | 단계, 스토리, 진행 중 에이전트, 기타 항목. 완료, 진행 중, 예정 순 | ultra-chain 실행 기록(`events.jsonl`), git log, 워크플로 journal, `items.json` |
16
+ | 구현요건 | 요구 원문, 기능 명세, 근거 AC, 담당 스토리, 구현 여부 | `req-spec.json`, `reqs.json` |
17
+ | workflow | 실행 흐름 그림, 분기, 외부 구성요소, 장면 대본 | `flow.json` |
18
+ | 구성도 | 영역, 구성요소, 연결, 범례, 장면 대본 | `arch.json` |
19
+
20
+ - 없는 출처는 건너뛴다. 자료가 없는 탭은 "자료 없음" 과 스키마 문서 경로를 보인다
21
+ - 진척도, 구현요건 탭은 30초마다 자동 갱신(meta refresh). 다른 갱신 연결은 없다
22
+
23
+ ## 언제 쓰나
24
+
25
+ - 다른 프로젝트에서도 같은 4탭 진척도 화면을 띄우고 싶을 때
26
+ - 단계, 스토리, 그 밖 작업의 진행을 에이전트가 세션마다 기록하게 하고 싶을 때
27
+ - 화면을 서버 없이 한 파일로 넘겨야 할 때(`export`)
28
+
29
+ ## 쓰지 않을 때
30
+
31
+ - 지금 세션의 작업 목록만 보고 싶을 때. progress 를 쓴다(Claude Code `/banker:progress` 의 Claude Mods 패널, Codex `$banker-progress`)
32
+ - 공인 주소나 `0.0.0.0` 으로 화면을 열어야 할 때. 이 스킬은 거부한다
33
+
34
+ ## 자리 표시
35
+
36
+ | 자리 | 뜻 |
37
+ |---|---|
38
+ | `<S>` | 이 스킬 디렉터리 절대경로(아래 런타임 표의 "스킬 디렉터리") |
39
+ | `<rt>` | `claude` 또는 `codex`(런타임 표의 `--runtime`) |
40
+ | `<data>` | 자료 폴더. Claude Code `.omc/progress-mon/`, Codex `.omx/progress-mon/` |
41
+
42
+ - 명령은 `node "<S>/scripts/progress-mon.mjs" <명령> --runtime <rt> [인자]` 꼴로 실행한다
43
+ - 프로젝트 루트는 작업 폴더의 `git rev-parse --show-toplevel`, 저장소가 아니면 작업 폴더. 다르면 `--project <dir>` 를 붙인다
44
+ - 셸 변수는 도구 호출 사이에 남지 않는다. 명령마다 실제 경로를 적는다
45
+ - `<S>` 는 프로젝트 스킬(`.claude/skills/progress-mon/`)이든 플러그인 안(`skills/progress-mon/`)이든 스킬을 불러온 위치다. 스크립트가 호출마다 자기 위치를 `<data>/state.json` 의 `skillDir` 에 맞춰 둔다
46
+
47
+ ## 런타임 표
48
+
49
+ | 항목 | Claude Code | Codex |
50
+ |---|---|---|
51
+ | 스킬 디렉터리 | 스킬 맨 위 "Base directory for this skill:" 경로 | Codex 스킬 목록이 보이는 이 SKILL.md 경로(file)의 폴더. npm 설치는 `~/.codex/skills/banker-progress-mon/`(프로젝트 범위 설치면 `./.codex/skills/banker-progress-mon/`), 플러그인 설치(`codex plugin add`)는 `~/.codex/plugins/cache/<마켓플레이스>/banker/<판>/skills/progress-mon/`. 절대경로로 씀 |
52
+ | `--runtime` | `claude` | `codex` |
53
+ | 자료 폴더 | `.omc/progress-mon/` | `.omx/progress-mon/` |
54
+ | `--memory` | 자동 메모리 폴더를 알면 `auto-memory`, 아니면 `claude-md` | `agents-md` |
55
+ | `start`, `stop`, `status` | 바로 실행 | 명령 하나씩 `sandbox_permissions: "require_escalated"` 로 승인 요청 |
56
+ | `init` | 바로 실행 | git 제외 목록 쓰기 때문에 승인 요청 |
57
+ | 서버 수명 | 세션과 무관하게 분리 실행 | 세션을 닫으면 서버가 꺼질 수 있음. 사용자 터미널 명령 안내(banker `ultra-chain` SKILL.md 의 "런타임 대응" 절 방식) |
58
+
59
+ - 사용자 터미널 안내 견본: `node "<스킬 디렉터리>/scripts/progress-mon.mjs" serve --runtime codex --project "<프로젝트>"`
60
+ - Codex 는 승인을 명령 하나씩 요청한다. `&&` 로 묶지 않는다
61
+ - Claude Code 의 자동 메모리 폴더: 세션 맥락에 자동 메모리 `MEMORY.md` 경로가 보이면 그 폴더. 보이지 않으면 모르는 것으로 보고 `claude-md` 를 쓴다
62
+
63
+ ## 인자 없는 호출
64
+
65
+ 1. `status` 를 실행한다
66
+ 2. 종료 코드와 첫 줄로 나눈다
67
+
68
+ | 결과 | 할 일 |
69
+ |---|---|
70
+ | 종료 3, `꺼짐(자료 폴더 없음: ...)` | 아래 "init 절차" 를 끝까지. 마지막 단계가 `start` 와 URL 보고 |
71
+ | 종료 3, `꺼짐(자료 폴더: ...)` | `start` 를 실행하고 출력의 URL 을 보고 |
72
+ | 종료 0, `실행 중: <URL> (PID n)` | URL 과 `탭 자료:` 줄을 보고 |
73
+ | 종료 1 또는 2 | 오류 줄을 그대로 보고하고 멈춤 |
74
+
75
+ 3. `status` 의 표준 오류에 경고 줄(규칙 로드 한도, override 가려짐, `workflowDirs`)이 있으면 그대로 전한다
76
+ - `WARN workflowDirs auto: 찾은 폴더 0` 은 이 프로젝트에서 Claude Code 워크플로를 돌린 적이 없으면 정상이다. 끄려면 `config.json` 의 `sources.workflowDirs` 를 `[]`(`references/config.md`)
77
+
78
+ - `start` 출력: `시작함: <URL>`, 이미 떠 있으면 `이미 실행 중(재사용): <URL>`. 포트가 차 있으면 다음 빈 포트를 쓰고 알림 줄을 낸다
79
+ - `--port 0`(OS 선택)은 받지 않는다. 특정 포트를 피해야 하면 OS 가 고른 빈 포트를 먼저 얻어 `--port` 로 넘긴다(`references/config.md` 의 "포트와 주소")
80
+ - 인자가 있는 호출(`/progress-mon status` 등)은 그 하위 명령을 `--runtime <rt>` 와 함께 그대로 실행하고 출력을 보고한다. `init` 만은 아래 절차를 따른다
81
+
82
+ ## 하위 명령
83
+
84
+ | 명령 | 인자 | 동작 |
85
+ |---|---|---|
86
+ | `init` | `--memory claude-md\|agents-md\|auto-memory\|none` `[--memory-dir <dir>] [--title <t>]` | 자료 폴더, `config.json`(있으면 그대로), 빈 `items.json`, `state.json` 생성. git 제외 목록에 자료 폴더 한 줄. 메모리 규칙 등록. `auto-memory` 는 `--memory-dir` 필수 |
87
+ | `start` | `[--port <n>] [--port-strict] [--host <사설 IPv4>]` | 서버를 분리 실행하고 URL 출력. 같은 프로젝트 서버가 떠 있으면 재사용. 동시에 부른 start 는 차례로 돌아 서버 하나를 같이 씀. `<n>` 은 1024~65535 |
88
+ | `stop` | 없음 | 상태 파일 PID 가 이 서버일 때만 끔 |
89
+ | `status` | 없음 | 실행 여부, URL, PID, 자료 폴더, 탭별 자료 유무(깨진 JSON 은 깨짐), 시작 시각, 요청 수, 마지막 오류 시각. 서버를 띄운 뒤 `config.json` 의 `port`, `portStrict`, `hosts` 가 바뀌었으면 경고(그 셋만 `stop` 뒤 `start` 해야 적용, 나머지는 다음 응답에 반영) |
90
+ | `export` | `<file> [--now <ISO>]` | 4탭을 한 HTML 파일로. 외부 자원 없음, `file://` 에서 탭 전환. 사용자가 지시할 때만 만든다 |
91
+ | `item` | `--key <k> --status todo\|doing\|done --text <t> [--note <t>] [--issue <t>] [--at <ISO>] [--commit <hash>]` | 기타 항목. 같은 key 는 대체하고 시작 시각 유지(시작 시각은 `doing` 으로 기록할 때만). `--at` 은 지금 대신 그 시각으로 기록(시간대 필수). `--commit` 은 4~40자 16진 해시(commit Hash 칸에 앞 7자리). 빼면 있던 해시 유지 |
92
+ | `note` | `--key <k> [--note <t>] [--issue <t>]` | 단계(`stage:<id>`)나 스토리 행의 비고, 문제점. 빈 값은 그 칸을 지움 |
93
+ | `stage` | `--id <id> --status started\|done\|skipped\|failed\|stopped [--label <t>]` | 단계 상태 기록. 설정에 없는 id 는 새 단계 행 |
94
+ | `story` | `--id <id> (--status todo\|doing\|done \| --commit <hash>) [--name <t>]` | 스토리 상태나 완료 커밋 기록. 설정에 없는 id 는 새 스토리 행 |
95
+ | `check` | 없음 | 자료 파일 검사. `FAIL <파일> <json 경로> <이유>`, `WARN ...` 한 줄씩, 끝에 `check: FAIL n, WARN m` 과 밀도 요약 `density <탭> ok\|low`. 밀도 미달 줄 `WARN density <탭> <항목> <값>/<하한>[: <못 채운 대상>]` |
96
+
97
+ - 공통 인자: `--runtime claude|codex`, `--project <dir>`, `--data <dir>`(자료 폴더 직접 지정)
98
+ - 종료 코드: 0 성공(이미 그 상태 포함), 1 거부나 사용법 오류나 `check` FAIL, 2 예기치 못한 오류, 3 `status` 꺼짐
99
+ - 자료 폴더가 없으면 `start`, `item`, `note`, `stage`, `story` 는 종료 1("init 먼저"). `status`, `check`, `export` 는 폴더를 만들지 않는다
100
+ - 내부용 `serve`: `start` 와 같은 인자로 서버를 앞에서 실행. Codex 사용자 터미널 안내와 디버그에만 쓴다
101
+ - 스키마와 규칙: `references/config.md`, `references/items.md`
102
+
103
+ ## init 절차
104
+
105
+ 1. `--memory` 를 런타임 표대로 고른다
106
+ 2. 실행: `node "<S>/scripts/progress-mon.mjs" init --runtime <rt> --memory <종류> [--memory-dir <자동 메모리 폴더>] [--title "<제목>"]`
107
+ 3. 출력을 사용자에게 알린다
108
+ - 쓴 파일과 줄 수: 자동 메모리는 파일 2개(`progress-mon.md`, `MEMORY.md` 색인 1줄), `CLAUDE.md` 는 1줄, Codex 는 3줄 블록
109
+ - `--memory claude-md` 는 프로젝트 루트 `CLAUDE.md` 를 만들거나 고친다. 새로 만들었으면 `git status` 에 추적하지 않는 파일로 보인다. 커밋할지는 사용자가 정한다고 알린다
110
+ - 출력에 `경고:` 줄(규칙 로드 한도, override 가려짐)이 있으면 그대로 전한다. Claude 면 `--memory claude-md` 로 다시 등록할지 묻고, Codex 면 프로젝트 지시 파일 정리(banker `cleansing-memory`)나 `config.toml` 의 `project_doc_max_bytes` 확인을 제안한다
111
+ - 출력 끝 `다음 할 일` 3줄은 요약이다. 그 목록이 아니라 이 절차 4~13 을 모두 따른다(`inventory.json`, `config.json` 의 `title`, `shortName`, `stories`, 진척도 기록은 요약에 없어도 한다)
112
+ 4. `<S>/references/authoring.md` 를 읽는다. 밀도 기준 표, 읽기 예산, 좋은 예가 거기 있다
113
+ 5. 읽기 예산 안에서 코드를 읽고 `<data>/inventory.json` 을 쓴다(`references/inventory.md`)
114
+ 6. `<data>/config.json` 의 `title`, `shortName`, `stories` 를 채운다. `shortName` 은 브라우저 탭 제목과 구성도 그림 이름에 쓰는 짧은 이름(기본은 폴더 이름). 스토리가 없으면 빈 목록(`references/config.md`)
115
+ 7. `<data>/req-spec.json`, `reqs.json`, `flow.json`, `arch.json` 을 쓴다. 구조만 쓰고 좌표는 쓰지 않는다(자동 배치). 스토리가 없으면 명세마다 `state` 와 `note`(`references/req-spec.md`, `reqs.md`, `flow.md`, `arch.md`)
116
+ 8. `check` 를 실행한다. FAIL 이 있으면 고쳐 7 과 8 을 다시. 8 의 `check` 는 FAIL 0 이 될 때까지 최대 3회
117
+ 9. FAIL 0 이 된 뒤 `WARN density ...` 가 남으면 읽기 예산 안에서 한 번 보충하고 `check` 를 한 번 더 실행한다
118
+ - 이 보충과 `check` 는 8 의 3회에 세지 않는다. 보충은 한 번만
119
+ - 보충 뒤 새 FAIL 이 나오면 그 보충 부분을 고치거나 되돌려 FAIL 0 으로 둔다
120
+ - 그래도 남은 `WARN density` 줄은 그대로 사용자에게 보고한다(실패 아님). 줄 끝의 대상 이름이 고칠 곳이다(`references/authoring.md`)
121
+ - 자동 배치 WARN(`이름표 덮음`, `이름표가 그림 밖`)은 배치 조언이다. 자동 배치 선은 상자와 영역 제목을 돌아가므로 `선이 상자 지남` 은 보통 없다. 연결을 하한 아래로 지우지 않는다(`references/arch.md` 의 "자동 배치 WARN 줄이기")
122
+ - `자기 연결` WARN 은 그 연결의 `from` 이나 `to` 를 실제 상대로 고친다
123
+ 10. 8 의 3회 뒤에도 FAIL 이 남으면 그 탭의 파일만 지워 "자료 없음" 으로 두고 남은 FAIL 을 보고한다
124
+ 11. 진척도 탭: 아는 단계와 작업을 적는다. 명령마다 `--note`(근거 커밋, 결과)를 쓴다. 문제점이 있으면 `--issue` 도 쓰고, 없으면 `--issue` 를 빼서 칸을 빈칸으로 둔다
125
+
126
+ | 프로젝트 | 쓸 명령 |
127
+ |---|---|
128
+ | `config.json` 에 `stories` 가 있음 | `story`(스토리 상태, 완료 커밋), 비고는 `note --key <스토리 id>` |
129
+ | 이름 붙은 단계(`stages` 목록이나 ultra-chain 실행 기록)가 있음 | `stage`, 비고는 `note --key stage:<id>` |
130
+ | 스토리와 단계가 없음 | `item` 만. 아는 작업(최근 커밋 묶음, 진행 중 작업, 남은 일)을 하나씩 |
131
+
132
+ - 스토리가 없는 프로젝트에서 `story` 를 쓰지 않는다. 설정에 없는 id 는 새 스토리 행이 되어 진척률이 켜진다. 단계도 같다(`stage` 는 새 단계 행)
133
+ - 지난 커밋은 커밋 시각과 해시로 기록한다. `git log -n <수> --format="%h %cI %s"` 의 `%cI` 를 `--at`, `%h` 를 `--commit` 에 넘긴다(예 `item --key c-1a2b3c4 --status done --text "<제목>" --at 2026-10-20T12:34:56+09:00 --commit 1a2b3c4`). `--at` 이 없으면 모든 항목이 기록한 지금 시각으로 보인다. `--commit` 이 없으면 commit Hash 칸이 빈다
134
+ 12. `check` 를 다시 실행한다. 11 의 기록으로 `history 비고` 같은 밀도 줄이 바뀐다. 새 FAIL 이 있으면 고친다. 남은 `WARN` 은 보고한다
135
+ 13. `start` 를 실행하고 URL 을 보고한다
136
+
137
+ - 자료가 없는 탭을 만들 수 없을 때(문서와 코드에 근거 없음)는 그 파일을 쓰지 않는다. 화면은 "자료 없음" 과 만드는 법을 보인다
138
+ - 사용자 문서는 덧붙이기만 한다. 표식 `<!-- progress-mon:rule -->` 이 이미 있으면 다시 쓰지 않는다
139
+
140
+ ## 갱신 규칙(init 뒤 세션)
141
+
142
+ `init` 이 메모리 파일에 규칙 한 줄을 남긴다. 다음 세션의 에이전트는 그 줄을 따라 갱신한다.
143
+
144
+ - 세션 시작 때 `status`. 꺼져 있으면 `start`(Codex 는 승인 요청)
145
+ - 스크립트 위치: `<data>/state.json` 의 `skillDir` 아래 `scripts/progress-mon.mjs`. 실행이 실패하면 이 스킬을 불러 `<S>` 를 다시 얻는다
146
+ - 기록
147
+
148
+ | 일 | 명령 |
149
+ |---|---|
150
+ | 단계 시작, 끝 | `stage --id <id> --status started` 뒤 `--status done` |
151
+ | 스토리 진행, 완료 | `story --id <id> --status doing`, 완료 커밋은 `story --id <id> --commit <hash>` |
152
+ | 그 밖 작업 | `item --key <k> --status doing\|done --text "<내용>" --note "<근거>" [--issue "<문제점>"]` |
153
+ | 단계, 스토리 행의 비고 | `note --key stage:<id> --note "<근거>"`, `note --key <스토리 id> --issue "<문제점>"` |
154
+
155
+ - Codex 는 모든 명령에 `--runtime codex` 를 붙인다. 세션을 닫아도 화면을 두려면 사용자 터미널의 `serve` 를 안내한다
156
+ - 스토리 상태 우선순위: 커밋(제목 판정 또는 `story --commit`) 있으면 완료, 없으면 `story --status`, 없으면 진행 중 에이전트가 있으면 진행 중, 그 밖 예정
157
+
158
+ ## 보안
159
+
160
+ - 바인드는 127.0.0.1 만. `--host` 는 사설 IPv4(10/8, 172.16/12, 192.168/16)만 받고 경고 한 줄을 낸다. `0.0.0.0`, `::`, 공인 IP, 링크 로컬, 100.64/10, 호스트 이름은 거부
161
+ - Host 헤더는 `127.0.0.1:<port>`, `localhost:<port>`, `[::1]:<port>`, 바인드한 `<ip>:<port>` 만 받는다. 그 밖은 403
162
+ - `GET`, `HEAD` 의 `/`, `/index.html` 만 화면을 준다. 자료 폴더 파일(`config.json`, `server.json` 등)은 어떤 경로로도 내보내지 않는다
163
+ - 오류 응답은 일반 문구만. 스택과 경로는 `<data>/server.log` 에만
164
+ - `stop` 은 상태 파일 PID 와 서버 신원 응답 PID 가 같을 때만 끈다
165
+ - 자료와 화면에 비밀값(키, 토큰, 비밀번호)을 적지 않는다. 모든 글은 escape 하고 색은 `#rrggbb` 만 받는다
@@ -0,0 +1 @@
1
+ 형식 시험용 최소 자료(시험 픽스처와 형식 시험 보기 fixture-*). 화면 수준의 견본이 아님.
@@ -0,0 +1,33 @@
1
+ {
2
+ "note": "예시 앱 구성.",
3
+ "width": 1000,
4
+ "height": 380,
5
+ "legend": ["주황 굵은 선: 요청 길", "점선: 파일 읽기와 쓰기"],
6
+ "main": ["browser", "server", "render"],
7
+ "zones": [
8
+ { "id": "user", "label": "사용자 쪽", "x": 20, "y": 40, "w": 200, "h": 320, "color": "#1565c0" },
9
+ { "id": "app", "label": "앱", "x": 320, "y": 40, "w": 360, "h": 320, "color": "#2e7d32" },
10
+ { "id": "store", "label": "저장", "x": 780, "y": 40, "w": 200, "h": 320, "color": "#6a1b9a", "dashed": true }
11
+ ],
12
+ "nodes": [
13
+ { "id": "browser", "zone": "user", "label": "브라우저", "x": 40, "y": 90, "w": 160, "h": 64, "kind": "사람", "detail": "탭을 고름" },
14
+ { "id": "cli", "zone": "user", "label": "CLI", "x": 40, "y": 250, "w": 160, "h": 64, "kind": "명령", "detail": "시작, 정지, 기록" },
15
+ { "id": "server", "zone": "app", "label": "서버", "x": 340, "y": 90, "w": 130, "h": 64, "kind": "프로세스", "detail": "Host 검사" },
16
+ { "id": "render", "zone": "app", "label": "렌더", "x": 530, "y": 90, "w": 130, "h": 64, "kind": "모듈", "detail": "네 탭 HTML" },
17
+ { "id": "files", "zone": "store", "label": "자료 파일", "x": 800, "y": 90, "w": 160, "h": 64, "kind": "파일", "detail": "JSON 네 개" },
18
+ { "id": "git", "zone": "store", "label": "git 저장소", "x": 800, "y": 250, "w": 160, "h": 64, "kind": "저장소", "detail": "커밋 제목" }
19
+ ],
20
+ "edges": [
21
+ { "id": "e-req", "from": "browser", "to": "server", "kind": "api", "label": "요청", "off": -12 },
22
+ { "id": "e-render", "from": "server", "to": "render", "kind": "control", "label": "" },
23
+ { "id": "e-read", "from": "render", "to": "files", "kind": "data", "label": "자료 읽기" },
24
+ { "id": "e-log", "from": "render", "to": "git", "kind": "data", "label": "" },
25
+ { "id": "e-ctl", "from": "cli", "to": "server", "kind": "control", "label": "시작, 정지" },
26
+ { "id": "e-write", "from": "cli", "to": "store", "kind": "data", "label": "자료 쓰기" },
27
+ { "id": "e-res", "from": "server", "to": "browser", "kind": "control", "label": "응답", "off": 12 }
28
+ ],
29
+ "scenes": [
30
+ { "n": 1, "sec": 2, "focus": ["browser", "server", "e-req"], "caption": "브라우저가 서버에 요청" },
31
+ { "n": 2, "sec": 3, "focus": ["render", "files", "git"], "caption": "렌더가 자료와 git 을 읽음" }
32
+ ]
33
+ }
@@ -0,0 +1,7 @@
1
+ [
2
+ { "t": "2026-10-26T01:00:00Z", "subject": "시작: 저장소 골격" },
3
+ { "t": "2026-10-27T02:00:00Z", "subject": "A1: 기본 화면" },
4
+ { "t": "2026-10-28T03:00:00Z", "subject": "A2(1/2): 설정 읽기" },
5
+ { "t": "2026-10-28T05:00:00Z", "subject": "A2(2/2): 설정 검사" },
6
+ { "t": "2026-10-28T06:00:00Z", "subject": "문서 정리" }
7
+ ]
@@ -0,0 +1,30 @@
1
+ {
2
+ "schema": 1,
3
+ "title": "예시 앱 진척도",
4
+ "shortName": "example-app",
5
+ "port": 30000,
6
+ "portStrict": false,
7
+ "hosts": [],
8
+ "refreshSec": 30,
9
+ "stages": "auto",
10
+ "stories": [
11
+ { "id": "A1", "name": "기본 화면" },
12
+ { "id": "A2", "name": "설정 읽기" },
13
+ { "id": "A3", "name": "자료 검사" },
14
+ { "id": "A4", "name": "내보내기" },
15
+ { "id": "A5", "name": "알림" }
16
+ ],
17
+ "sources": {
18
+ "events": "auto",
19
+ "git": true,
20
+ "gitMax": 5000,
21
+ "workflowDirs": [".omc/example-workflows"],
22
+ "agentStaleMin": 15,
23
+ "journalMaxAgeH": 24,
24
+ "journalMaxSessions": 20
25
+ },
26
+ "text": {
27
+ "reqRule": "구현 여부: 근거 AC 의 담당 스토리가 모두 커밋되면 완료, 일부만 커밋되면 일부, 남은 스토리에 에이전트가 돌면 진행 중, 커밋이 없으면 미구현. 담당 스토리가 없는 명세는 미검증. 비고에 근거를 적어 따로 판정한 명세는 그 판정이 앞섬. 대상 제외: 범위에서 뺌. 완료율에 넣지 않음.",
28
+ "plannedPrefix": "예정"
29
+ }
30
+ }
@@ -0,0 +1,7 @@
1
+ {"t":"2026-10-28T00:00:00Z","stage":"preflight","status":"started"}
2
+ {"t":"2026-10-28T00:10:00Z","stage":"preflight","status":"done","summary":"사전 점검"}
3
+ {"t":"2026-10-28T00:12:00Z","stage":"research","status":"started"}
4
+ {"t":"2026-10-28T01:30:00Z","stage":"research","status":"done","summary":"자료 조사"}
5
+ {"t":"2026-10-28T01:40:00Z","stage":"interview","status":"started"}
6
+ {"t":"2026-10-28T02:20:00Z","stage":"interview","status":"done","summary":"모호성 제거"}
7
+ {"t":"2026-10-29T01:00:00Z","stage":"plan","status":"started"}
@@ -0,0 +1,44 @@
1
+ {
2
+ "note": "예시 앱의 실행 순서.",
3
+ "lanes": [
4
+ {
5
+ "id": "main",
6
+ "title": "화면 만들기",
7
+ "color": "#1565c0",
8
+ "note": "요청 하나를 받아 화면을 돌려줄 때까지.",
9
+ "steps": [
10
+ { "id": "p1", "label": "인자 읽기", "detail": "포트와 자료 폴더 인자 확인", "actor": "cli.mjs", "refs": ["cli.mjs:10"], "planned": false },
11
+ { "id": "p2", "label": "설정 읽기", "detail": "config.json 을 읽고 기본값 채움", "actor": "config.mjs", "refs": ["config.mjs:5"], "planned": false },
12
+ { "id": "p3", "label": "자료 모으기", "detail": "기록 파일과 git log 읽기", "actor": "sources.mjs", "refs": ["sources.mjs:20"], "planned": false },
13
+ { "id": "p4", "label": "판정", "detail": "단계와 스토리 상태 계산", "actor": "sources.mjs", "refs": ["sources.mjs:60"], "planned": false },
14
+ { "id": "p5", "label": "화면 그리기", "detail": "탭 HTML 만들기", "actor": "render.mjs", "refs": ["render.mjs:1"], "planned": false },
15
+ { "id": "p6", "label": "응답", "detail": "HTML 을 브라우저로 보냄", "actor": "server.mjs", "refs": ["server.mjs:30"], "planned": false },
16
+ { "id": "p7", "label": "기록", "detail": "요청 수와 시각 기록", "actor": "server.mjs", "refs": ["server.mjs:40"], "planned": false }
17
+ ],
18
+ "branches": [
19
+ { "from": "p2", "to": "", "when": "설정 오류 종료 1", "note": "형식이 틀린 config.json" },
20
+ { "from": "p4", "to": "p1", "when": "자료 다시 읽기", "note": "자료 파일이 바뀜" }
21
+ ],
22
+ "externals": [
23
+ { "id": "x1", "label": "git log", "linkTo": "p3", "note": "커밋 제목으로 스토리 판정" }
24
+ ]
25
+ },
26
+ {
27
+ "id": "export",
28
+ "title": "내보내기",
29
+ "color": "#2e7d32",
30
+ "steps": [
31
+ { "id": "e1", "label": "인자 검사", "detail": "출력 파일 경로 확인", "actor": "cli.mjs", "refs": ["cli.mjs:80"], "planned": false },
32
+ { "id": "e2", "label": "네 탭 렌더", "detail": "네 탭을 한 파일에 담음", "actor": "render.mjs", "refs": ["render.mjs:200"], "planned": false },
33
+ { "id": "e3", "label": "파일 쓰기", "detail": "임시 파일에 쓰고 이름 바꿈", "actor": "cli.mjs", "refs": [], "planned": true }
34
+ ],
35
+ "branches": [],
36
+ "externals": []
37
+ }
38
+ ],
39
+ "scenes": [
40
+ { "n": 1, "sec": 2, "lane": "main", "focus": ["p1", "p2"], "caption": "인자와 설정을 읽음" },
41
+ { "n": 2, "sec": 3, "lane": "main", "focus": ["p4", "p5"], "caption": "상태를 판정해 화면을 그림" },
42
+ { "n": 3, "sec": 2, "lane": "export", "focus": ["e2"], "caption": "네 탭을 한 파일로" }
43
+ ]
44
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "notes": {
3
+ "stage:plan": { "note": "검토 2회차" },
4
+ "A3": { "note": "검사 규칙 정리 중", "issue": "예시 자료 부족" }
5
+ },
6
+ "items": [
7
+ { "key": "doc-guide", "t": "2026-10-28T04:00:00Z", "s": "2026-10-28T03:00:00Z", "status": "done", "text": "사용 안내 초안" },
8
+ { "key": "icon", "t": "2026-10-29T01:30:00Z", "s": "2026-10-29T01:30:00Z", "status": "doing", "text": "아이콘 정리", "note": "색 후보 2개" },
9
+ { "key": "bench", "t": "2026-10-29T02:00:00Z", "status": "todo", "text": "속도 측정", "issue": "측정 PC 미정" }
10
+ ],
11
+ "storyCommits": {},
12
+ "storyStates": {},
13
+ "stageEvents": []
14
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "excluded": "대상 제외 명세는 비고에 이유를 적음.",
3
+ "users": [
4
+ {
5
+ "text": "설치 없이 여는 진척도 화면",
6
+ "source": "요청 원문",
7
+ "specs": [
8
+ { "text": "기본 화면에 단계와 스토리 표시", "acs": ["AC-1"] },
9
+ { "text": "설정 파일로 제목과 스토리 지정", "acs": ["AC-2"] },
10
+ { "text": "자료 파일 형식 검사", "acs": ["AC-3"] },
11
+ { "text": "화면 글자 크기 조절", "acs": ["AC-6"] }
12
+ ]
13
+ },
14
+ {
15
+ "text": "결과를 파일로 공유",
16
+ "source": "사용자 답변",
17
+ "specs": [
18
+ { "text": "단일 HTML 내보내기", "acs": ["AC-4"] },
19
+ { "text": "인쇄용 쪽 나눔", "acs": ["AC-5"], "state": "excl", "note": "이 예시 범위 밖" },
20
+ { "text": "공유 링크 만료 안내", "acs": [] }
21
+ ]
22
+ }
23
+ ],
24
+ "stories": {
25
+ "A1": ["기본 화면", "단계, 스토리 표"],
26
+ "A2": ["설정 읽기", "config.json 읽기와 기본값"],
27
+ "A3": ["자료 검사", "형식, 상호 참조 검사"],
28
+ "A4": ["내보내기", "단일 HTML"],
29
+ "A5": ["알림", "완료 알림"]
30
+ }
31
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "generated": "예시 자료(모르는 키 허용 확인용)",
3
+ "acs": [
4
+ { "id": "AC-1", "title": "기본 화면", "stories": ["A1"] },
5
+ { "id": "AC-2", "title": "설정 파일", "stories": ["A2", "A4"] },
6
+ { "id": "AC-3", "title": "자료 검사", "stories": ["A3"] },
7
+ { "id": "AC-4", "title": "내보내기", "stories": ["A5"] },
8
+ { "id": "AC-5", "title": "인쇄", "stories": ["A5"] },
9
+ { "id": "AC-6", "title": "글자 크기", "stories": [] }
10
+ ]
11
+ }