@kaydash9999/banker-plugins 0.13.0 → 0.15.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.
Files changed (82) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +82 -0
  4. package/README.md +50 -17
  5. package/codex/manifest.json +11 -8
  6. package/codex/transform-matrix.md +16 -4
  7. package/commands/front-qa.md +8 -5
  8. package/commands/setup.md +13 -4
  9. package/hooks/graceful-pause.mjs +222 -0
  10. package/hooks/hooks.json +2 -1
  11. package/hooks/register.mjs +12 -0
  12. package/package.json +4 -1
  13. package/skills/3d-intro-build/SKILL.md +1 -1
  14. package/skills/3d-intro-setup/SKILL.md +1 -1
  15. package/skills/all-in-one/SKILL.md +160 -55
  16. package/skills/append_wiki/SKILL.md +1 -1
  17. package/skills/arch-diagram/SKILL.md +1 -1
  18. package/skills/audit-mock/SKILL.md +1 -1
  19. package/skills/audit-security/SKILL.md +1 -1
  20. package/skills/audit-web-page/SKILL.md +1 -1
  21. package/skills/cleansing-memory/SKILL.md +1 -1
  22. package/skills/compact-copy/SKILL.md +14 -13
  23. package/skills/compact-wiki/SKILL.md +1 -1
  24. package/skills/curation/SKILL.md +36 -3
  25. package/skills/deep-init/SKILL.md +1 -1
  26. package/skills/deep-research/SKILL.md +1 -1
  27. package/skills/docs-setup/SKILL.md +1 -1
  28. package/skills/humanizer/SKILL.md +1 -1
  29. package/skills/interval-report/SKILL.md +1 -1
  30. package/skills/lineage/SKILL.md +146 -16
  31. package/skills/lineage/lineage.py +1091 -107
  32. package/skills/make-notion-guide/SKILL.md +1 -1
  33. package/skills/motion-graphic-make/SKILL.md +1 -1
  34. package/skills/motion-graphic-setup/SKILL.md +1 -1
  35. package/skills/nothing-design/SKILL.md +1 -1
  36. package/skills/obsidizer/SKILL.md +1 -1
  37. package/skills/omc-reference/SKILL.md +68 -33
  38. package/skills/payload-mon/SKILL.md +66 -0
  39. package/skills/payload-mon/scripts/payload-mon.mjs +377 -0
  40. package/skills/payload-mon/scripts/payload-size.mjs +238 -0
  41. package/skills/pdf-vision-extract/SKILL.md +1 -1
  42. package/skills/play-qa/SKILL.md +1 -1
  43. package/skills/ralph-qa/SKILL.md +263 -112
  44. package/skills/ralph-qa/references/gemini-read-only.toml +9 -0
  45. package/skills/ralph-qa/references/gemini-seat.mjs +175 -0
  46. package/skills/ralph-qa/references/payload-scan.mjs +130 -0
  47. package/skills/ralph-qa/references/verifier-probe.mjs +872 -780
  48. package/skills/ready-compact/SKILL.md +114 -67
  49. package/skills/refresh-git-ignore/SKILL.md +1 -1
  50. package/skills/refresh-readme/SKILL.md +3 -3
  51. package/skills/rfp-author/SKILL.md +3 -3
  52. package/skills/setup-bypass-permissions/SKILL.md +123 -0
  53. package/skills/setup-bypass-permissions/agents/openai.yaml +4 -0
  54. package/skills/setup-bypass-permissions/scripts/bypass-permissions.mjs +381 -0
  55. package/skills/setup-bypass-permissions/scripts/fallback/bypass-permissions.ps1 +247 -0
  56. package/skills/setup-bypass-permissions/scripts/fallback/bypass-permissions.py +241 -0
  57. package/skills/{harness-factory → setup-harness-factory}/SKILL.md +3 -3
  58. package/skills/setup-insane-search/SKILL.md +1 -1
  59. package/skills/setup-java/SKILL.md +1 -1
  60. package/skills/setup-lsp/SKILL.md +1 -1
  61. package/skills/setup-mcp/SKILL.md +1 -1
  62. package/skills/setup-node/SKILL.md +1 -1
  63. package/skills/setup-omc/SKILL.md +11 -4
  64. package/skills/setup-omc-hud/SKILL.md +26 -1
  65. package/skills/setup-omc-hud/scripts/claude-update-last.mjs +247 -0
  66. package/skills/setup-playwright/SKILL.md +1 -1
  67. package/skills/setup-pwsh/SKILL.md +1 -1
  68. package/skills/setup-python/SKILL.md +1 -1
  69. package/skills/setup-sandbox/SKILL.md +1 -1
  70. package/skills/setup-stitch/SKILL.md +1 -1
  71. package/skills/setup-tmux/SKILL.md +1 -1
  72. package/skills/smart-compact/SKILL.md +10 -9
  73. package/skills/summary-wiki/SKILL.md +1 -1
  74. package/skills/tone-compact/SKILL.md +203 -0
  75. package/skills/tone-compact/scripts/tone-compact.mjs +499 -0
  76. package/skills/ultra-init/SKILL.md +53 -42
  77. package/skills/ultra-interview/SKILL.md +1 -1
  78. package/skills/ultra-ui-qa/SKILL.md +1 -1
  79. package/skills/update-banker/SKILL.md +1 -1
  80. package/skills/vertical-pptx/SKILL.md +1 -1
  81. package/skills/vertical-pptx-setup/SKILL.md +1 -1
  82. package/skills/visual-ralph/SKILL.md +1 -1
@@ -0,0 +1,222 @@
1
+ /**
2
+ * /graceful-pause [memo]: ask the running work to finish only its current step, stop,
3
+ * report and wait for instructions, without cutting it off the way Esc does.
4
+ *
5
+ * A skill or plugin command typed while a turn runs waits until the turn ends. This one
6
+ * is registered `immediate`, so it runs at once, mid-turn. It appends one user-role row
7
+ * the person does not see (`$.session.append`); the running turn reads it from its next
8
+ * model request on, that is once the tool call in flight returns.
9
+ *
10
+ * Two ways the note could land wrong are closed here:
11
+ * - typed during the turn's last answer, no later request reads it, and the next
12
+ * prompt's turn would read a stale pause first: when the turn ends unread and no
13
+ * background work is left, a second row voids it;
14
+ * - typed while idle with background work or a scheduled wake-up still pending, the
15
+ * next notification or scheduled prompt would start the next step: the note goes out
16
+ * as a prompt of its own instead, read as the person's (`asUser`), from a timer,
17
+ * since the engine refuses a submission made inside the command's own hook (the
18
+ * submission would wait on the dispatch that hook holds).
19
+ *
20
+ * The background count (tasks in flight plus scheduled wake-ups) is what the last Stop
21
+ * or SubagentStop reported. A turn cut off
22
+ * by Esc reports none, so the count can stay high until the next one: the note's last
23
+ * line covers that, as it tells the model to follow a newer prompt. The module's
24
+ * variables start over when the plugin reloads; a turn already running then reads as
25
+ * idle until the next one starts.
26
+ *
27
+ * Function hooks run inside the engine with no Node and no DOM: everything goes
28
+ * through `$`. `immediate` is checked on Claude Code 2.1.289; an older engine gets no
29
+ * command (it would wait for the turn to end, then answer "nothing to stop"). Codex
30
+ * has no function hooks.
31
+ */
32
+ export const COMMAND = 'graceful-pause';
33
+ export const MIN_ENGINE = [2, 1, 289];
34
+
35
+ const SPEC = {
36
+ name: COMMAND,
37
+ description: '지금 단계만 끝내고 멈춘 뒤 보고하고 지시를 기다림. 작업 중에 입력해도 바로 전달',
38
+ argumentHint: '[멈춘 뒤 다룰 지시나 메모]',
39
+ immediate: true,
40
+ };
41
+
42
+ const IDLE = '진행 중인 작업이 없어 멈출 것이 없습니다. 지시를 바로 입력하면 됩니다.';
43
+ const SENT = '정지 요청을 진행 중인 작업에 전달했습니다. 지금 실행 중인 도구 호출이 끝나면 그 단계까지만 마무리하고 멈춥니다.';
44
+ const AGAIN = '이번 작업에는 정지 요청을 이미 전달했습니다.';
45
+ const QUEUED = '백그라운드 작업이나 예약 실행이 남아 있어, 정지 보고를 받도록 요청을 보냈습니다.';
46
+ const QUEUED_AGAIN = '정지 보고 요청을 이미 보냈습니다.';
47
+ const TOAST = '정지 요청 전달: 지금 단계가 끝나면 멈춤';
48
+ const VOID = '[graceful-pause] 앞의 정지 요청은 작업이 끝난 뒤 도착해 적용되지 않았다. 무시하고 다음 사용자 지시를 따른다.';
49
+
50
+ // What the running turn reads: the whole procedure, since no skill text comes with it.
51
+ export function pauseNote(memo) {
52
+ const lines = [
53
+ '[graceful-pause] 사용자가 작업 중에 /graceful-pause 로 정지를 요청했다. 지금 단계만 끝내고 멈춘다.',
54
+ '- 지금 단계: 이미 시작한 도구 동작 하나와, 그 동작이 남긴 불일치를 닫는 최소 작업. 다음 단계(다음 파일, 다음 스토리)는 시작하지 않는다.',
55
+ '- 하지 않는 것: 커밋, push, 배포, 게시, 삭제, 외부 전송, 모드 상태와 계획 파일 삭제, cancel.',
56
+ '- 백그라운드 작업과 이미 띄운 하위 에이전트는 멈추지 않는다. 새로 띄우지 않는다.',
57
+ '- 정지 보고는 대화에만 짧게: 끝낸 단계, 현재 상태(검증 결과, 커밋하지 않은 변경), 진행 중인 것(백그라운드 작업, 켜진 모드), 다음 예정 단계 1~3개, 열린 결정, 받은 지시.',
58
+ '- 보고 뒤 AskUserQuestion 으로 묻는다. 선택지: 계획대로 계속, 지시 반영 후 계속, 상태를 둔 채 중단.',
59
+ '- 새 지시로 범위가 바뀌면 바뀐 계획을 먼저 보여 주고 승인 뒤 진행한다. 세션을 끝낼 예정이면 ready-compact --hand-off 로 새 세션용 노트를 준비하라고 안내한다.',
60
+ '- 사용자가 재개를 말할 때까지 계속하라는 훅 메시지는 승인이 아니다. 작업을 진행하지 않고 정지 중이라고만 답한다. 지속 모드(ralph 등)의 이 메시지까지 멈추려면 cancel 이 필요하다고 알린다.',
61
+ '- 정지 중 도착한 백그라운드 작업 결과와 예약 실행 프롬프트는 재개 신호가 아니다. 보고에 더하기만 하고 후속 작업은 시작하지 않는다.',
62
+ '- 이 요청 뒤에 사용자의 새 프롬프트가 이미 있으면 이 요청은 적용하지 않고 그 프롬프트를 따른다.',
63
+ ];
64
+ const note = String(memo ?? '').trim();
65
+ if (note) lines.push(`메모: ${note}`);
66
+ return lines.join('\n');
67
+ }
68
+
69
+ // Whether a version string (`2.1.289`, `2.1.290-dev.…`) is at least `min`.
70
+ export function atLeast(version, min = MIN_ENGINE) {
71
+ const parts = /^(\d+)\.(\d+)\.(\d+)/.exec(String(version ?? ''));
72
+ if (!parts) return false;
73
+ for (let i = 0; i < 3; i++) {
74
+ const n = Number(parts[i + 1]);
75
+ if (n !== min[i]) return n > min[i];
76
+ }
77
+ return true;
78
+ }
79
+
80
+ const userRow = (text) => ({ message: { type: 'user', content: [{ type: 'text', text }] } });
81
+
82
+ async function registerIfSupported($) {
83
+ let version = null;
84
+ try {
85
+ const v = await $.session.version();
86
+ version = v?.base || v?.version || null;
87
+ } catch {
88
+ /* an engine without the call is older than the command needs */
89
+ }
90
+ if (!atLeast(version)) {
91
+ $.ui.log(`banker: /${COMMAND} 는 Claude Code ${MIN_ENGINE.join('.')} 이상에서만 켭니다 (이 엔진: ${version || '버전 미상'})`);
92
+ return;
93
+ }
94
+ try {
95
+ await $.command.register(SPEC);
96
+ } catch (err) {
97
+ $.ui.log(`banker: /${COMMAND} 를 등록하지 못했습니다 (${String(err?.message ?? err)})`);
98
+ }
99
+ }
100
+
101
+ // Appends the note to the running turn; the answer the command shows. The note counts
102
+ // as sent before the call returns: a model request starting meanwhile reads the stored
103
+ // row, and a second /graceful-pause meanwhile must not append another.
104
+ async function deliver($, state, memo) {
105
+ if (state.pending?.turnId === state.main) return { text: AGAIN };
106
+ const pending = { turnId: state.main, afterStep: state.step, read: false };
107
+ state.pending = pending;
108
+ let res;
109
+ try {
110
+ res = await $.session.append(userRow(pauseNote(memo)));
111
+ } catch (err) {
112
+ res = { deny: String(err?.message ?? err) };
113
+ }
114
+ if (res?.deny) {
115
+ if (state.pending === pending) state.pending = null;
116
+ return { text: `정지 요청을 전달하지 못했습니다: ${res.deny}` };
117
+ }
118
+ $.ui.toast(TOAST);
119
+ return { text: SENT };
120
+ }
121
+
122
+ // Idle with background work or a scheduled wake-up pending: the note as a prompt of its
123
+ // own, sent from a timer once the command has answered. A hook that drops the prompt
124
+ // resolves `{ drop }` rather than rejecting.
125
+ function queueReport($, state, memo) {
126
+ if (state.queued) return { text: QUEUED_AGAIN };
127
+ state.queued = true;
128
+ const failed = (why) => {
129
+ state.queued = false;
130
+ $.ui.log(`banker: /${COMMAND} 정지 보고 요청을 보내지 못했습니다 (${why})`);
131
+ };
132
+ $.clock.after(1, () => {
133
+ $.prompt.submit({ text: pauseNote(memo), asUser: true }).then(
134
+ (res) => res?.drop && failed(String(res.drop)),
135
+ (err) => failed(String(err?.message ?? err)),
136
+ );
137
+ });
138
+ return { text: QUEUED };
139
+ }
140
+
141
+ // At the main turn's end: a note no later request read is voided unless background
142
+ // work will wake the session (the turn it starts reads the note then).
143
+ async function settlePending($, state) {
144
+ const { pending } = state;
145
+ state.pending = null;
146
+ if (!pending || pending.read || state.background > 0) return;
147
+ try {
148
+ await $.session.append(userRow(VOID));
149
+ } catch {
150
+ /* nothing more to do: the log line below still tells the person */
151
+ }
152
+ $.ui.log('banker: /graceful-pause 요청이 작업 끝에 도착해 적용되지 않았습니다.');
153
+ }
154
+
155
+ // Nothing in flight: the state a fresh session, or one after /clear, starts from.
156
+ const fresh = () => ({ main: null, step: -1, pending: null, background: 0, queued: false });
157
+ const listed = (v) => (Array.isArray(v) ? v.length : 0);
158
+ const backgroundCount = (e) => listed(e.background_tasks) + listed(e.session_crons);
159
+
160
+ export function registerGracefulPause(on) {
161
+ // The main turn in flight and its latest model request; subagent loops raise no
162
+ // turn.start and end with an agentId. `queued`: a report prompt not started yet.
163
+ const state = fresh();
164
+ watchSession(on, state);
165
+ watchTurns(on, state);
166
+
167
+ on('command.run', { command: COMMAND }, async ($, e) => {
168
+ if (state.main) return deliver($, state, e.args);
169
+ if (state.background > 0) return queueReport($, state, e.args);
170
+ return { text: IDLE };
171
+ });
172
+ }
173
+
174
+ // The command's registration, a fresh state after /clear, and the background count the
175
+ // stop events report.
176
+ function watchSession(on, state) {
177
+ on('session.start', async ($, e, next) => {
178
+ await registerIfSupported($);
179
+ return next(e);
180
+ });
181
+
182
+ // `/clear` ends the conversation and raises no session.start for the next one.
183
+ on('session.end', async ($, e, next) => {
184
+ Object.assign(state, fresh());
185
+ return next(e);
186
+ });
187
+
188
+ on('classic.Stop', async ($, e, next) => {
189
+ state.background = backgroundCount(e);
190
+ return next(e);
191
+ });
192
+
193
+ on('classic.SubagentStop', async ($, e, next) => {
194
+ state.background = backgroundCount(e);
195
+ return next(e);
196
+ });
197
+ }
198
+
199
+ // The main turn in flight and the model requests it makes. turn.step wraps every
200
+ // request's stream, subagents' too: in the engine's kit that cost 25 to 45 µs a chunk,
201
+ // well under 1% of a request.
202
+ function watchTurns(on, state) {
203
+ on('turn.start', async ($, e, next) => {
204
+ Object.assign(state, { main: e.turnId, step: -1, queued: false });
205
+ return next(e);
206
+ });
207
+
208
+ on('turn.step', async function* ($, e, next) {
209
+ if (e.turnId === state.main) {
210
+ state.step = e.index;
211
+ if (state.pending?.turnId === e.turnId && e.index > state.pending.afterStep) state.pending.read = true;
212
+ }
213
+ return yield* next(e);
214
+ });
215
+
216
+ on('turn.complete', async ($, e, next) => {
217
+ if (e.agentId || e.turnId !== state.main) return next(e);
218
+ state.main = null;
219
+ await settlePending($, state);
220
+ return next(e);
221
+ });
222
+ }
package/hooks/hooks.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
- "description": "banker hooks: obsidizer wiki canonicalization (PostToolUse, inert until `obsidizer --enable`) + anonymous usage counting (PostToolUse Skill / UserPromptExpansion, count-default-on, opt-out BANKER_NO_TELEMETRY, no-op without endpoint) + update-check notification (SessionStart, opt-out BANKER_NO_UPDATE_CHECK).",
2
+ "description": "banker hooks: obsidizer wiki canonicalization (PostToolUse, inert until `obsidizer --enable`) + anonymous usage counting (PostToolUse Skill / UserPromptExpansion, count-default-on, opt-out BANKER_NO_TELEMETRY, no-op without endpoint) + update-check notification (SessionStart, opt-out BANKER_NO_UPDATE_CHECK). modules: function hooks (Claude Code 2.1.289+) serving /graceful-pause, which runs at once even mid-turn.",
3
+ "modules": ["./register.mjs"],
3
4
  "hooks": {
4
5
  "PostToolUse": [
5
6
  {
@@ -0,0 +1,12 @@
1
+ /**
2
+ * banker's function-hooks module: the one file hooks/hooks.json names under
3
+ * `modules`. Claude Code loads it beside the classic hooks in the same file;
4
+ * builds without function hooks, and Codex, leave it alone.
5
+ *
6
+ * Each feature registers its own hooks; this file only gathers them.
7
+ */
8
+ import { registerGracefulPause } from './graceful-pause.mjs';
9
+
10
+ export const register = (on) => {
11
+ registerGracefulPause(on);
12
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaydash9999/banker-plugins",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "banker — Claude Code + Codex CLI plugin (QA, audit, docs, architecture, wiki skills). Install via Claude Code marketplace, or `npm i -g @kaydash9999/banker-plugins` then `banker setup`.",
5
5
  "bin": {
6
6
  "banker": "bin/banker.js"
@@ -15,10 +15,13 @@
15
15
  "!skills/ultra-init-workspace/**",
16
16
  "commands",
17
17
  ".claude-plugin",
18
+ "!.claude-plugin/types",
19
+ "!.claude-plugin/types/**",
18
20
  "codex",
19
21
  "hooks",
20
22
  "bin",
21
23
  "!**/*.test.mjs",
24
+ "!**/*.test.ts",
22
25
  "!**/test_*.py",
23
26
  "!**/__pycache__",
24
27
  "!**/__pycache__/**",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: 3d-intro-build
3
- description: "(banker) 브랜드 인트로용 스크롤-스크럽 3D fly-through 사이트를 Azure(gpt-image-2 스틸 + Sora-2 forward-chaining)로 제작: 인터뷰 → 비용 승인 게이트 → 스틸 → fly-through → 로컬 프리뷰. '3d-intro-build'/'3D 인트로'/'스크롤 fly-through'/'인트로 영상 사이트' 시 사용."
3
+ description: "스크롤 위치에 맞춰 3D 플라이스루 영상이 움직이는 브랜드 인트로 사이트를 만듦. Azure 의 gpt-image-2 로 스틸을, Sora-2 로 영상을 생성. 인터뷰 뒤에 비용 승인 게이트에서 사용자가 승인해야만 유료 생성을 시작하고, 스틸, 영상, 로컬 프리뷰 순서로 진행. '3d-intro-build'/'3D 인트로'/'스크롤 fly-through'/'인트로 영상 사이트' 시 사용."
4
4
  ---
5
5
 
6
6
  # 3d-intro-build — 스크롤-스크럽 3D 인트로 제작 (Azure 파이프라인)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: 3d-intro-setup
3
- description: "(banker) Azure Sora-2/gpt-image-2 3D 인트로 제작용 크레덴셜·의존성 설치: Node≥18·ffmpeg 확보 + apikey/엔드포인트/배포명 직접입력 또는 콘솔 샘플 코드 붙여넣기로 크레덴셜 저장 + 무과금 프리플라이트(listVideos·images badreq)로 검증. 'setup-3d-intro'/'3d-intro-setup'/'3D 인트로 설정'/'Azure Sora 크레덴셜' 또는 /banker:setup 시 사용."
3
+ description: "`3d-intro-build` 에 필요한 Node 18 이상과 ffmpeg 를 갖추고 Azure 크레덴셜을 저장함. 크레덴셜은 직접 입력하거나 Azure 콘솔의 샘플 코드를 붙여 넣어 받고, 무과금 프리플라이트로 확인. 'setup-3d-intro'/'3d-intro-setup'/'3D 인트로 설정'/'Azure Sora 크레덴셜' 또는 `/banker:setup` 시 사용."
4
4
  ---
5
5
 
6
6
  # 3d-intro-setup — Azure Sora-2 / gpt-image-2 3D 인트로 제작 전제조건 설치
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: all-in-one
3
- description: "(banker) 한 명령으로 합의 계획→검증 구현→독립 테스트 게이트를 연쇄(ralplan→ralph→ultraqa). 코딩 작업을 계획부터 통과까지 최대 rigor로 한 번에. 'all-in-one'/'all in one' 시 사용(한 줄 수정은 ralph, 아이디어 확장은 autopilot)."
3
+ description: "코딩 작업을 한 명령으로 계획부터 QA 통과까지 엄격하게 진행. `ralplan` 으로 합의 계획, `ralph` 로 검증 구현을 하고 독립 QA 게이트(Claude Code 는 `verify` 순환, Codex 는 `ultraqa`)로 마무리. 'all-in-one'/'all in one' 시 사용. 한 줄 수정은 이 스킬 대신 `ralph`, 아이디어 확장은 `autopilot`."
4
4
  argument-hint: "[--short] [--checkpoint] [--critic=critic|architect|codex] [--qa=tests|build|lint|typecheck] [--no-deslop] <task description>"
5
5
  level: 4
6
6
  ---
@@ -9,18 +9,40 @@ level: 4
9
9
 
10
10
  [ALL-IN-ONE ACTIVATED — SEQUENTIAL 3-STAGE PIPELINE]
11
11
 
12
- ## 0. Prerequisite: OMC (install first if missing)
13
-
14
- This skill orchestrates OMC's `ralplan` → `ralph` → `ultraqa`. **Check the dependency before running**; if it is missing, **guide installation first** rather than failing mid-pipeline:
15
- - Check: `command -v omc` and whether `/oh-my-claudecode:*` skills are available.
16
- - If missing: install via `/banker:setup` → oh-my-claudecode (or the `setup-omc` skill / `omc update`), then resume. On Codex the equivalent is OMX (`omx setup`).
17
-
18
- **런타임 매핑 (Claude Code ↔ Codex).** 이 스킬이 부르는 `ralplan`·`ralph`·`ultraqa`는 Claude Code에선 OMC 스킬이고 **Codex에선 oh-my-codex(OMX)가 제공하는 동명 스킬**이다. 아래 Execution의 `Skill("oh-my-claudecode:<name>")` 표기는 Claude Code 기준 — **Codex 런타임에선 OMC 대신 OMX의 해당 스킬(`ralplan`/`ralph`/`ultraqa`)을 적용**한다.
12
+ ## 0. Prerequisite: OMC 5 with a matching `omc` CLI (check first)
13
+
14
+ This skill orchestrates OMC's `ralplan` → `ralph`, then a QA gate built on OMC's
15
+ `verify` workflow. **Check the dependency before Stage 1**; if it is missing or
16
+ stale, **guide installation first** rather than failing mid-pipeline. The `omc`
17
+ check below is for Claude Code; on Codex check OMX instead (`omx --version`), whose
18
+ `ralph` does not use the `omc` CLI.
19
+
20
+ - **The `omc` CLI must have `ralph verify` (Claude Code).** OMC 5's `ralph` runs
21
+ `omc ralph verify` on its first iteration and stops when the command is
22
+ missing, and a global `omc` CLI older than the plugin (4.x) does not have it.
23
+ Judge by the output, not the exit code: given `--help`, a 4.x CLI prints its
24
+ general help and still exits 0. Keep the `--help`: without it, an unknown
25
+ command makes the CLI launch Claude Code.
26
+ ```bash
27
+ omc ralph verify --help 2>&1 | grep -q 'Usage: omc ralph verify' && echo "omc ok" || echo "omc CLI missing or too old"
28
+ ```
29
+ ```powershell
30
+ if ((omc ralph verify --help 2>&1 | Out-String) -match 'Usage: omc ralph verify') { 'omc ok' } else { 'omc CLI missing or too old' }
31
+ ```
32
+ - **If the check fails:** stop before Stage 1 and guide the fix (`/banker:setup`
33
+ → oh-my-claudecode, the `setup-omc` skill, or
34
+ `npm install -g oh-my-claude-sisyphus@latest`), then resume. Do not start a
35
+ pipeline whose Stage 2 will stop.
36
+ - **`ultraqa` does not exist in OMC 5** (removed in 5.0.0, no alias), so a call
37
+ to `oh-my-claudecode:ultraqa` fails. Stage 3 below runs in its place.
38
+ - On Codex the equivalent framework is OMX (`omx setup`).
39
+
40
+ **런타임 매핑 (Claude Code ↔ Codex).** Stage 1·2 의 `ralplan`·`ralph` 는 Claude Code에선 OMC 스킬이고 **Codex에선 oh-my-codex(OMX)가 제공하는 동명 스킬**이다. Stage 3 은 런타임마다 다르다: Claude Code(OMC 5)는 `ultraqa` 가 없어 아래 verify 순환을 직접 돌리고, **Codex는 OMX 가 아직 제공하는 `ultraqa`** 를 쓴다. 아래 `Skill("oh-my-claudecode:<name>")`·`Task(subagent_type="oh-my-claudecode:<name>")` 표기는 Claude Code 기준이다.
19
41
 
20
42
  ## Purpose
21
43
 
22
44
  Run one substantial coding task through three independent quality gates in a
23
- fixed order, each delegated to an existing OMC skill:
45
+ fixed order:
24
46
 
25
47
  ```
26
48
  Stage 1 /ralplan --deliberate consensus plan (Planner → Architect → Critic)
@@ -29,15 +51,18 @@ Stage 1 /ralplan --deliberate consensus plan (Planner → Architect → Cri
29
51
  Stage 2 /ralph --critic=critic PRD-driven persistent build, critic-verified
30
52
  │ → implementation + deslop + regression, then ralph self-cancels
31
53
  ▼
32
- Stage 3 /ultraqa --tests independent test-cycling acceptance gate
33
- → PASS, or honest STOPPED-with-diagnosis
54
+ Stage 3 QA gate (--qa=tests) fresh verifier → diagnose → fix, bounded cycle
55
+ → PASS, or honest STOPPED-with-diagnosis (Codex: OMX /ultraqa)
34
56
  ```
35
57
 
36
58
  This skill is a **thin sequential orchestrator**. It does not implement, plan,
37
- or test directly, and it does **not** create its own persistence loop or state
38
- file — every loop, retry, and verification belongs to the sub-skill it
39
- delegates to. Its only job is to invoke the three skills in order, bridge their
40
- handoffs, gate each stage on the previous one's success, and report honestly.
59
+ or test directly, and it does **not** create its own state file. Stages 1 and 2
60
+ hand every loop, retry, and verification to the sub-skill they invoke. The one
61
+ loop all-in-one owns is Stage 3's bounded verify → fix cycle: OMC 5 removed
62
+ `ultraqa`, which used to own it, and its replacement `verify` gathers evidence
63
+ but does not fix. Beyond that, its only job is to run the stages in order,
64
+ bridge their handoffs, gate each stage on the previous one's success, and
65
+ report honestly.
41
66
 
42
67
  ## Why three stages (and not just ralph)
43
68
 
@@ -50,23 +75,24 @@ modes, and each stage's reviewer is independent of the previous stage's author
50
75
  2. **A partial or unverified build declared "done"** → Stage 2's PRD
51
76
  story-by-story persistence + critic verification catch this.
52
77
  3. **Integration / regression breakage slipping past the builder's own checks**
53
- → Stage 3's fresh, test-focused, fix-cycling loop catches this.
78
+ → Stage 3's fresh, test-focused, fix-cycling gate catches this.
54
79
 
55
80
  **On the apparent redundancy of Stage 3:** ralph (Stage 2) already runs its own
56
- Step-7 critic verification and Step-7.6 regression re-run on the changed-file
57
- set. ultraqa (Stage 3) is still worth running because it is *independent* (fresh
58
- agents, not the ones that built it), *test-suite-focused*, and *actively fixes*
59
- in a cycle. If ralph's regression already ran the full suite green, ultraqa
60
- usually confirms in cycle 1 (cheap); its value rises when the suite is broad,
61
- when changes touched many files, or when integration/flaky issues hide behind
62
- unit-level checks. Keeping it explicit gives a clean, separate PASS signal.
81
+ Step-7 reviewer verification and Step-7.6 regression re-run (`omc ralph verify`
82
+ against the baseline it recorded). Stage 3 is still worth running because it is
83
+ *independent* (a fresh verifier agent, not the context that built the change),
84
+ *test-suite-focused*, and *actively fixes* in a bounded cycle. If ralph's
85
+ regression already ran the suite green, the gate usually passes in cycle 1
86
+ (cheap); its value rises when the suite is broad, when changes touched many
87
+ files, or when integration/flaky issues hide behind unit-level checks. Keeping
88
+ it explicit gives a clean, separate PASS signal.
63
89
 
64
90
  ## When to use
65
91
 
66
92
  - A substantial, mostly-specified coding task you want carried from plan →
67
93
  verified implementation → green test gate in one step, with the most
68
94
  front-loaded rigor OMC offers.
69
- - You have been running `ralplan → ralph → ultraqa` by hand and want it as one
95
+ - You have been running `ralplan → ralph →` a QA pass by hand and want it as one
70
96
  command.
71
97
  - The task is moderately under-specified — that's fine: Stage 1's consensus
72
98
  planning absorbs scoping, so all-in-one tolerates vaguer input than raw ralph.
@@ -75,8 +101,9 @@ unit-level checks. Keeping it explicit gives a clean, separate PASS signal.
75
101
 
76
102
  - **One-line fix or tiny change** → use `/ralph` or delegate to an executor;
77
103
  three heavy multi-agent loops is overkill.
78
- - **Pure exploration / brainstorming** → use `/oh-my-claudecode:plan` or the
79
- brainstorming skill; nothing should be implemented yet.
104
+ - **Pure exploration / brainstorming** → use `/oh-my-claudecode:ralplan` on its
105
+ own (it stops at a `pending approval` plan) or the brainstorming skill;
106
+ nothing should be implemented yet.
80
107
  - **A 2-3 line product idea needing requirements expansion** → use
81
108
  `/autopilot` (it expands the idea first) or `/deep-interview`.
82
109
  - **Frontend spec / reference-parity work** → use the specialized `/front-qa`.
@@ -88,7 +115,7 @@ unit-level checks. Keeping it explicit gives a clean, separate PASS signal.
88
115
  | `--short` | Stage 1 runs ralplan **without** `--deliberate` (skips pre-mortem + expanded test plan) for lower-risk work | off → deliberate |
89
116
  | `--checkpoint` | Insert an `AskUserQuestion` approval gate between Stage 1 (plan) and Stage 2 (implement) | off → auto-proceed |
90
117
  | `--critic=critic\|architect\|codex` | Reviewer passed to ralph's verification | `critic` |
91
- | `--qa=tests\|build\|lint\|typecheck` | Goal passed to ultraqa in Stage 3 | `tests` |
118
+ | `--qa=tests\|build\|lint\|typecheck` | What the Stage 3 gate checks (Codex: the goal passed to ultraqa) | `tests` |
92
119
  | `--no-deslop` | Passed through to ralph (skip the post-review deslop pass) | off |
93
120
 
94
121
  Everything before the flags / after them that isn't a recognized flag is the
@@ -118,6 +145,21 @@ then **stops**.
118
145
  `APPROVE`): do not auto-proceed. Surface the best plan and ask the user how to
119
146
  proceed. Never build on an unapproved plan.
120
147
 
148
+ ### Before Stage 2 — record what already fails
149
+
150
+ Run the command(s) of the `--qa` goal once on the unchanged tree and keep the
151
+ failing items (test names, error lines) in this conversation. This
152
+ **pre-change record** is the gate's baseline: it covers checks that are not
153
+ among ralph's feedback commands, and on Codex it is the only baseline there is
154
+ (OMX `ralph` keeps none). Never use `git stash` or `git reset` to get a
155
+ pre-change state for it; if the tree already has changes, take the record from
156
+ a clean copy of HEAD (`git worktree add --detach <tmp> HEAD`, run there, then
157
+ `git worktree remove <tmp>`). A fresh worktree has no installed dependencies
158
+ (`node_modules`, a venv): link or install them there first, and confirm the
159
+ commands really ran — a record made only of "command not found" errors is no
160
+ baseline. The record lives only in this conversation; if the session may
161
+ compact or end before Stage 3, put it in the `ready-compact` note.
162
+
121
163
  ### Stage 2 — Implement: `/ralph`
122
164
 
123
165
  Precondition: a consensus plan exists and is approved (auto via the invocation,
@@ -131,33 +173,93 @@ its job is to turn the plan's stages into PRD stories and implement + verify
131
173
  them, not to re-plan. (This mirrors how autopilot consumes a ralplan plan and
132
174
  skips its own planning phase.)
133
175
 
134
- ralph runs its full loop on its own: PRD refinement → implement per story →
135
- verify acceptance criteria → Step-7 critic verification → Step-7.5 deslop →
136
- Step-7.6 regression → Step-8 `/oh-my-claudecode:cancel`.
176
+ ralph runs its full loop on its own: feedback baseline (`omc ralph verify
177
+ --write-baseline`) → PRD refinement → implement per story → verify acceptance
178
+ criteria → Step-7 reviewer verification → Step-7.5 deslop → Step-7.6 regression
179
+ → Step-8 closeout and `/oh-my-claudecode:cancel`.
137
180
 
138
- > ralph's Step-8 cancel clears **ralph/ultrawork** session state — it ends the
181
+ > ralph's Step-8 cancel clears **ralph's own** session state — it ends the
139
182
  > IMPLEMENTATION stage, not all-in-one. all-in-one is not a registered OMC mode,
140
183
  > so the cancel does not affect it. Let ralph fully finish (reviewer APPROVE +
141
- > deslop + regression + cancel) **before** Stage 3 — ralph and ultraqa share
142
- > mutually-exclusive session state, so they must not overlap.
143
-
184
+ > deslop + regression + cancel) **before** Stage 3, so the gate checks the final
185
+ > tree and no ralph continuation is still steering the session.
186
+
187
+ - **Settle ralph's questions up front.** ralph 5.6.1 asks the user once for the
188
+ PRD's `repoQualityClass` (`prototype`, `production` or `library`) when the task
189
+ does not say. Infer it from repo signals (CI config, test depth, published
190
+ package metadata) and put it in the handoff; let ralph ask only when the
191
+ signals conflict.
192
+ - **Give ralph feedback commands that print only failures.** OMC 5.6.1's
193
+ `omc ralph verify` fingerprints *every* output line of each feedback command,
194
+ and normalizes only durations written as `<number><unit>`, timestamps, `/tmp`
195
+ paths and hex ids. A line that changes between runs or when a story adds
196
+ tests therefore reads as a NEW failure: node:test's default reporter prints
197
+ `ℹ duration_ms 151.4` and `ℹ tests 8`, so its gate fails on every run with no
198
+ change at all. In the handoff, tell ralph to set the PRD's `feedbackCommands`
199
+ **before it records the baseline** to forms whose output is constant on
200
+ success and names each failure — for node:test,
201
+ `FORCE_COLOR=0 NODE_NO_WARNINGS=1 node --test --test-reporter=dot 2>&1 | grep -Ev '^[.X]+$'`
202
+ (the two variables keep color codes from slipping past the filter and
203
+ warnings with a process id out of the output; adapt the form on Windows);
204
+ keep build/lint commands that are silent on success. If the gate still flags
205
+ only such lines, fix the commands and re-record ralph's baseline on the
206
+ current tree (`omc ralph verify --write-baseline`) — the pre-change record
207
+ still tells old failures from new ones. Never edit the baseline file by
208
+ hand; never stash or reset.
209
+ - **Carry the baseline forward.** ralph's own baseline (first iteration) also
210
+ lists failures that existed before the change; ralph treats them as noise
211
+ and reports them at Step 8. Note its session id (the `<id>` in its PRD path
212
+ `.omc/state/sessions/<id>/`) for Stage 3.
144
213
  - **If ralph reports a fundamental blocker** (same issue across 3+ iterations,
145
- missing credentials, unclear requirement, external dependency down): stop and
146
- report. Do **not** run Stage 3 on a broken or partial build and call it done.
147
-
148
- ### Stage 3 — QA gate: `/ultraqa`
149
-
150
- Precondition: Stage 2's ralph has completed and self-cancelled (no session-state
151
- overlap).
152
-
153
- Invoke `Skill(oh-my-claudecode:ultraqa)` with args `--<qa goal>` (default
154
- `--tests`). ultraqa cycles run-QA → architect-diagnose → executor-fix → repeat
155
- (max 5; early-exit if the same failure appears 3×).
214
+ missing credentials, unclear requirement, external dependency down, or the
215
+ `omc ralph verify` command unavailable): stop and report. Do **not** run
216
+ Stage 3 on a broken or partial build and call it done.
217
+
218
+ ### Stage 3 — QA gate
219
+
220
+ Precondition: Stage 2's ralph has completed and self-cancelled.
221
+
222
+ **Claude Code (OMC 5):** run the bounded cycle that `ultraqa` used to own —
223
+ the same shape as OMC 5's autopilot QA phase. No state file: the cycle count
224
+ lives in this conversation.
225
+
226
+ 1. **Verify, independently.** `Task(subagent_type="oh-my-claudecode:verifier", ...)`
227
+ — a fresh context that did not build the change. Brief it to follow the
228
+ `oh-my-claudecode:verify` workflow for the `--qa` goal (`tests` by default;
229
+ `build`, `lint` or `typecheck` select that check), run the project's real
230
+ commands, and return **PASS** or **FAIL** with the commands, their output and
231
+ each failing item.
232
+ Whether a failure predates the change is not judged by eye. A failure is
233
+ **pre-existing only** when the pre-change record lists it, or — Claude
234
+ Code — when `omc ralph verify --session <ralph's session id> --json` leaves
235
+ it out of `newFailures` (cancel leaves the baseline in place; check that the
236
+ JSON reports `baselinePresent: true` — without a baseline it reports every
237
+ current failure as new). **Everything else is new**, and so is a
238
+ pre-existing failure that points at a file the change touched (as in ralph).
239
+ If ralph was run again in this session (a resumed run), its first iteration
240
+ rewrote that baseline on the half-changed tree; then judge by the
241
+ pre-change record alone.
242
+ 2. **PASS** → the gate is met; go to the final report.
243
+ 3. **FAIL** → `Task(subagent_type="oh-my-claudecode:architect", ...)` diagnoses
244
+ the root cause (read-only), then `Task(subagent_type="oh-my-claudecode:executor", ...)`
245
+ makes the smallest fix inside the change's scope. The next cycle verifies
246
+ again with a **fresh** verifier, never the one that saw the failure.
247
+
248
+ Limits: at most 5 verifications. When the 5th still fails, stop without
249
+ another fix (a fix nobody verified is not a result). Stop early when the same
250
+ failure (same test, same error signature) comes back 3 times — that is a
251
+ fundamental problem for the user, not for another cycle. Never fix a baseline
252
+ failure inside this gate; report it.
253
+
254
+ **Codex (OMX):** run OMX `$ultraqa` with the goal (OMX still ships it). OMX
255
+ keeps no feedback baseline, so hand it the pre-change record, tell it not to
256
+ fix those failures, and report them apart; treat its outcome the same way.
156
257
 
157
258
  Report the real outcome:
158
259
  - **Goal met** → "ALL-IN-ONE COMPLETE" with the cycle count.
159
- - **Max cycles / same failure 3×** → "STOPPED" with ultraqa's diagnosis. Do
160
- **not** claim success if the gate did not reach goal-met.
260
+ - **5 failed verifications / same failure 3×** → "STOPPED" with the verifier's
261
+ evidence and the architect's diagnosis. Do **not** claim success if the gate did not reach
262
+ goal-met.
161
263
 
162
264
  ## Orchestrator rules
163
265
 
@@ -165,8 +267,8 @@ Report the real outcome:
165
267
  next begins. No skipping, no reordering, no running two stages' loops at once.
166
268
  - Emit one clear progress line at each stage boundary so the user always knows
167
269
  where the pipeline is (`[all-in-one] Stage 1/3 — planning…`, etc.).
168
- - Do not add a competing persistence loop or all-in-one-specific state file; the
169
- sub-skills own all looping and state.
270
+ - Do not add an all-in-one state file or a second persistence loop. Stages 1–2
271
+ own their loops and state; Stage 3's bounded cycle is the only loop here.
170
272
  - Treat a sub-skill's internal "stop"/"cancel" as the end of *that stage*, never
171
273
  as the end of the pipeline (see the Stage 1 and Stage 2 notes above).
172
274
 
@@ -178,7 +280,8 @@ When the pipeline ends (complete or stopped), give a concise honest summary:
178
280
  (1 line).
179
281
  - **Implementation**: stories/stages completed, files changed, the ralph critic
180
282
  verdict.
181
- - **QA**: ultraqa goal, PASS after N cycles or STOPPED-with-diagnosis.
283
+ - **QA**: the gate's goal, PASS after N cycles or STOPPED-with-diagnosis, and
284
+ the baseline failures that predate the change, listed apart.
182
285
  - **Unmet / scope-limited / deferred**: state plainly — never paper over a gate
183
286
  that did not pass.
184
287
 
@@ -205,21 +308,23 @@ first to expand it into a spec.
205
308
 
206
309
  ## Stop conditions
207
310
 
311
+ - The `omc` CLI check in §0 fails → guide the install/update; do not start.
208
312
  - Stage 1 cannot reach consensus → surface best plan, ask the user (don't build).
209
313
  - Stage 2 ralph hits a fundamental blocker → stop and report (don't run QA).
210
- - Stage 3 ultraqa exhausts cycles / repeats a failure 3× → report the diagnosis
211
- honestly (don't claim success).
314
+ - Stage 3 fails its 5th verification / sees the same failure 3× → report the
315
+ diagnosis honestly (don't claim success).
212
316
  - User says "stop" / "cancel" / "abort" at any point → run
213
317
  `/oh-my-claudecode:cancel` and stop.
214
318
 
215
319
  ## Final checklist
216
320
 
321
+ - [ ] §0: on Claude Code the `omc` CLI answered `omc ralph verify --help` with its usage (Codex: `omx --version`)
217
322
  - [ ] Stage 1 produced a consensus plan in `.omc/plans/` (or stopped honestly on
218
323
  no-consensus / checkpoint rejection)
219
324
  - [ ] Stage 2 received the plan path, completed all PRD stories, passed critic
220
325
  verification, and self-cancelled before Stage 3
221
- - [ ] Stages did not overlap (ralph fully ended before ultraqa began)
222
- - [ ] Stage 3 ran the chosen QA goal and reached goal-met (or reported STOPPED
223
- with diagnosis)
326
+ - [ ] Stages did not overlap (ralph fully ended before the gate began)
327
+ - [ ] Stage 3: a fresh verifier reported the chosen goal met (or STOPPED with
328
+ diagnosis); baseline failures reported apart, not fixed
224
329
  - [ ] Final report states plan/implementation/QA outcomes and any unmet items
225
330
  plainly
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: append_wiki
3
- description: "(banker) 새로 배운 비자명 지식을 .omc/wiki에 구조화 적재·병합. 'append_wiki'/'위키 기록'/'wiki에 정리'/'알게 된 내용 기록' 시 사용."
3
+ description: "새로 알게 된 비자명한 지식을 `.omc/wiki` 에 구조화해 넣고 기존 페이지와 병합. 'append_wiki'/'위키 기록'/'wiki에 정리'/'알게 된 내용 기록' 시 사용."
4
4
  ---
5
5
 
6
6
  # append_wiki — 작업 지식을 wiki에 적재
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: arch-diagram
3
- description: "(banker) 시스템 아키텍처 구성도를 PlantUML과 편집 가능 PPTX로 산출. '아키텍처 다이어그램'/'plantuml'/'pptx 다이어그램'/'구성도' 시 사용."
3
+ description: "시스템 아키텍처 구성도를 PlantUML과 편집 가능 PPTX로 산출. '아키텍처 다이어그램'/'plantuml'/'pptx 다이어그램'/'구성도' 시 사용."
4
4
  ---
5
5
 
6
6
  # arch-diagram — PlantUML + PPTX 아키텍처 다이어그램 산출
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: audit-mock
3
- description: "(banker) 하드코딩·mock/stub·열거형을 read-only 정적 감사로 검출. 'audit-mock'/'하드코딩 검출'/'mock·stub 감사'/'SQL 없이 하드코딩 반환' 시 사용."
3
+ description: "하드코딩된 값, mock, stub, 열거형을 정적 감사로 검출. 코드는 읽기만 함. 'audit-mock'/'하드코딩 검출'/'mock 감사'/'stub 감사'/'SQL 없이 하드코딩 반환' 시 사용."
4
4
  ---
5
5
 
6
6
  # audit-mock — 하드코딩 / mock·stub / 열거형 read-only 정적 감사