본문으로 건너뛰기

Keyword Triggers

본 문서는 OMA의 Keyword Trigger 시스템을 설명합니다. 이 시스템은 사용자가 /oma:* 커맨드를 직접 기억하지 않고도 자연어 입력으로 적절한 Tier-0 워크플로우에 진입하도록 돕습니다.

개요

Keyword Trigger는 UserPromptSubmit 훅이 사용자 입력을 가로채서 .omao/triggers.json의 키워드 사전과 매칭한 뒤, 일치하는 Tier-0 커맨드를 시스템 메시지로 주입하는 구조입니다. 에이전트는 이 힌트를 받아 해당 커맨드를 호출하거나 사용자에게 확인을 요청합니다.

기본 매핑 테이블

OMA 설치 직후 기본 트리거는 다음과 같습니다(출처: CLAUDE.md <keyword_triggers>).

키워드매핑 커맨드예시 입력
autopilot (AIDLC 문맥)/oma:autopilot"이 feature를 autopilot으로 끝까지 진행해"
agenticops, ops-mode/oma:agenticops"prod를 ops-mode로 전환하라"
self-improving, feedback-loop/oma:self-improving"지난주 실패를 self-improving으로 반영해"
aidlc (단일 feature)/oma:aidlc-loop"이 요구사항을 aidlc 루프로 처리해"
eks-agentic, platform-bootstrap/oma:platform-bootstrap"eks-agentic 플랫폼을 구축해"
inception/oma:inception"inception 단계만 돌려줘"
construction/oma:construction"construction 단계를 시작해"

매핑은 소문자 기준 부분 문자열 매칭이며, 단어 경계를 존중합니다.

동작 원리

훅 파이프라인

훅 스크립트 흐름

hooks/user-prompt-submit.sh는 다음을 수행합니다.

  1. 사용자 입력을 stdin으로 수신
  2. 현재 프로젝트의 .omao/triggers.json을 로드 (없으면 기본값 <repo>/steering/triggers.default.json 사용)
  3. 입력에서 소문자 정규화된 단어 단위로 키워드 검색
  4. 매칭된 키워드가 있으면 {"systemMessage": "Trigger match: /oma:<workflow>"}를 stdout에 출력
  5. Claude Code가 systemMessage를 세션 컨텍스트에 주입

세션 초기화

hooks/session-start.sh는 Claude Code 세션이 시작될 때 실행되어 다음을 수행합니다.

  • .omao/state/active-mode.json에 활성 Tier-0 모드가 있는지 확인
  • 활성 모드가 있다면 "현재 /oma:autopilot 진행 중입니다" 등의 컨텍스트를 주입
  • .omao/notepad.md의 최근 메모를 세션 컨텍스트에 노출

triggers.json 구조

{
"version": "1.0",
"triggers": [
{
"keywords": ["autopilot"],
"command": "/oma:autopilot",
"context_hints": ["aidlc", "end-to-end", "full-loop"],
"priority": 10
},
{
"keywords": ["self-improving", "feedback-loop", "feedback loop"],
"command": "/oma:self-improving",
"priority": 8
},
{
"keywords": ["platform-bootstrap", "eks-agentic", "eks agentic"],
"command": "/oma:platform-bootstrap",
"priority": 9
}
]
}

필드 설명

필드타입설명
keywordsstring[]매칭할 키워드 목록. 공백 포함 가능
commandstring매칭 시 제안할 /oma:* 커맨드
context_hintsstring[]함께 등장해야 매칭되는 보조 키워드 (선택)
priorityint동시 매칭 시 높은 값 우선

context_hints의 역할

autopilot은 Tier-0 커맨드 이외의 문맥에서도 흔히 쓰이는 단어입니다. 이 오탐을 줄이기 위해 context_hints: ["aidlc", "end-to-end", "full-loop"]를 추가하면, autopilot 키워드는 해당 힌트와 함께 등장할 때만 매칭됩니다.

커스텀 트리거 추가

프로젝트 특화 워크플로우를 추가하려면 .omao/triggers.json에 항목을 추가합니다.

cd <your-project>
jq '.triggers += [
{
"keywords": ["payment-check", "결제 점검"],
"command": "/oma:aidlc-loop",
"context_hints": ["payment", "결제"],
"priority": 7
}
]' .omao/triggers.json > /tmp/triggers.new && mv /tmp/triggers.new .omao/triggers.json

프로젝트 레벨 트리거는 기본 트리거보다 우선합니다. 같은 키워드가 프로젝트와 기본에 모두 있다면 프로젝트 트리거가 먼저 매칭됩니다.

매크로 확장 예시

자주 사용하는 복합 명령을 단축 키워드로 등록할 수 있습니다.

{
"keywords": ["weekly-improve"],
"command": "/oma:self-improving",
"priority": 10
}

이후 weekly-improve 단어만 입력하면 에이전트가 자동으로 /oma:self-improving을 제안합니다.

트리거 비활성화

상황에 따라 트리거 시스템 전체를 끄거나 특정 세션에서만 비활성화할 수 있습니다.

환경 변수

export OMA_DISABLE_TRIGGERS=1
claude

OMA_DISABLE_TRIGGERS=1이 설정된 상태에서는 user-prompt-submit.sh 훅이 즉시 passthrough로 종료합니다.

영구 비활성화

~/.claude/settings.json에서 OMA 훅 항목을 삭제하면 됩니다.

jq 'del(.hooks.UserPromptSubmit[] | select(.hooks[].command | endswith("/hooks/user-prompt-submit.sh")))' \
~/.claude/settings.json > /tmp/settings.new && mv /tmp/settings.new ~/.claude/settings.json

단, 이 경우 SessionStart 훅까지 끄려면 동일 패턴으로 별도 처리해야 합니다.

단일 입력 우회

입력 앞에 #noauto를 붙이면 해당 프롬프트에 한해 트리거 매칭을 건너뜁니다.

#noauto autopilot 모드에 대한 일반 질문이 있어요

훅은 #noauto 프리픽스를 감지하면 즉시 passthrough하고, 프리픽스는 최종 입력에서 제거됩니다.

매칭 규칙 상세

정규화

  • 입력 텍스트를 소문자로 변환
  • 전후 공백 및 중복 공백 제거
  • 한국어·영어 혼합 처리 시 원문도 동시에 유지

단어 경계

  • 공백 없이 긴 문자열 내 매칭은 하지 않음 (예: automobile에서 auto가 매칭되지 않음)
  • 한국어는 조사 어간 분리를 수행하지 않으므로, 정확한 형태로 키워드 등록 필요 (예: "자동조종", "자율 모드")

복수 매칭

동시에 여러 트리거가 매칭되면 priority가 가장 높은 것을 선택합니다. 동일 priority 내에서는 triggers.json 배열 순서가 우선합니다.

대소문자

매칭은 대소문자 무시지만, 시스템 메시지에 주입되는 커맨드 문자열은 triggers.json에 등록된 그대로 출력됩니다.

디버깅

매칭 결과 확인

훅 스크립트를 수동 실행해 매칭 동작을 검증합니다.

echo "autopilot으로 AIDLC를 돌려줘" | bash ~/.oma/hooks/user-prompt-submit.sh
# 기대 출력: {"systemMessage":"Trigger match: /oma:autopilot"}

트리거 목록 점검

jq '.triggers[] | {keywords, command, priority}' .omao/triggers.json

로그 수집

훅 내부 디버그 출력을 활성화하려면:

export OMA_TRIGGER_DEBUG=1
claude
# 훅 호출 시 ~/.claude/logs/oma-triggers.log 에 매칭 결과 기록

베스트 프랙티스

고빈도 워크플로우에 짧은 키워드 할당

/oma:self-improving을 매주 호출한다면 "weekly-improve"처럼 기억하기 쉬운 키워드를 별도로 등록합니다.

민감한 커맨드는 context_hints 사용

/oma:platform-bootstrap은 장시간·비용 영향이 큰 작업입니다. "eks-agentic" 단독보다 context_hints: ["platform", "bootstrap", "eks"]를 요구하도록 구성해 오탐을 방지합니다.

팀 표준 triggers.json 버전 관리

프로젝트 .omao/triggers.json을 git에 포함시키면 팀 전체가 동일한 단축 명령을 공유합니다. 개인 특화 트리거는 .gitignore.omao/triggers.local.json을 추가해 분리합니다.

한국어·영어 혼용 고려

한국어 중심 팀이라면 ["자동조종", "autopilot"]처럼 양 언어를 함께 등록합니다. OMA_TRIGGER_DEBUG=1로 실제 어느 키워드가 매칭되는지 모니터링하는 것이 좋습니다.

보안·감사 고려사항

  • 트리거는 커맨드를 제안할 뿐 자동 실행하지 않습니다. 실행은 에이전트가 사용자에게 확인하는 방식으로 진행됩니다(정확한 UX는 Claude Code 버전에 따라 다름).
  • .omao/triggers.json은 프로젝트 소스로 관리되므로, 악의적인 커맨드 주입을 방지하려면 코드 리뷰 대상에 포함해야 합니다.
  • OMA_DISABLE_TRIGGERS=1을 CI 환경에서 기본 활성화하면, 자동화 파이프라인이 의도치 않은 커맨드를 실행하지 않도록 할 수 있습니다.

참고 자료

공식 문서

OMA 내부 문서