From 1932257f8217ea56652f3a2214208229501fc469 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Tue, 9 Dec 2025 21:47:01 +0900 Subject: [PATCH] docs(readme): add comprehensive Claude Code compatibility documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add new 'Claude Code Compatibility' section to both README.md and README.ko.md - Document hooks integration (PreToolUse, PostToolUse, UserPromptSubmit, Stop) - Document configuration loaders (Command, Skill, Agent, MCP loaders) - Document data storage (Todo management, Transcript logging) - Simplify 'Other Features' section by moving loaders to new section - Clean up temporary planning files in local-ignore/ πŸ€– GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) --- README.ko.md | 72 +++++++++-- README.md | 84 +++++++++--- local-ignore/comment-checker-ts-plan.md | 162 ------------------------ local-ignore/push-and-release.sh | 12 -- 4 files changed, 128 insertions(+), 202 deletions(-) delete mode 100644 local-ignore/comment-checker-ts-plan.md delete mode 100755 local-ignore/push-and-release.sh diff --git a/README.ko.md b/README.ko.md index 365e6a6..7a594ca 100644 --- a/README.ko.md +++ b/README.ko.md @@ -15,6 +15,7 @@ - [λ‚΄μž₯ AST-Grep Tools](#λ‚΄μž₯-ast-grep-tools) - [Grep](#grep) - [λ‚΄μž₯ MCPs](#λ‚΄μž₯-mcps) + - [Claude Code ν˜Έν™˜μ„±](#claude-code-ν˜Έν™˜μ„±) - [기타 편의 κΈ°λŠ₯](#기타-편의-κΈ°λŠ₯) - [μ„€μ •](#μ„€μ •) - [μž‘μ„±μžμ˜ λ…ΈνŠΈ](#μž‘μ„±μžμ˜-λ…ΈνŠΈ) @@ -224,17 +225,72 @@ OpenCode λŠ” μ•„μ£Ό ν™•μž₯κ°€λŠ₯ν•˜κ³  μ•„μ£Ό μ»€μŠ€ν„°λ§ˆμ΄μ €λΈ”ν•©λ‹ˆλ‹€. } ``` +### Claude Code ν˜Έν™˜μ„± + +Oh My OpenCodeλŠ” Claude Code μ„€μ •κ³Ό μ™„λ²½ν•˜κ²Œ ν˜Έν™˜λ©λ‹ˆλ‹€. Claude Codeλ₯Ό μ‚¬μš©ν•˜μ…¨λ‹€λ©΄, κΈ°μ‘΄ 섀정을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. + +#### Hooks 톡합 + +Claude Code의 `settings.json` ν›… μ‹œμŠ€ν…œμ„ 톡해 μ»€μŠ€ν…€ 슀크립트λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. Oh My OpenCodeλŠ” λ‹€μŒ μœ„μΉ˜μ˜ 훅을 읽고 μ‹€ν–‰ν•©λ‹ˆλ‹€: + +- `~/.claude/settings.json` (μ‚¬μš©μž) +- `./.claude/settings.json` (ν”„λ‘œμ νŠΈ) +- `./.claude/settings.local.json` (둜컬, git-ignored) + +μ§€μ›λ˜λŠ” ν›… 이벀트: +- **PreToolUse**: 도ꡬ μ‹€ν–‰ 전에 μ‹€ν–‰. μ°¨λ‹¨ν•˜κ±°λ‚˜ 도ꡬ μž…λ ₯을 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. +- **PostToolUse**: 도ꡬ μ‹€ν–‰ 후에 μ‹€ν–‰. κ²½κ³ λ‚˜ μ»¨ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. +- **UserPromptSubmit**: μ‚¬μš©μžκ°€ ν”„λ‘¬ν”„νŠΈλ₯Ό μ œμΆœν•  λ•Œ μ‹€ν–‰. μ°¨λ‹¨ν•˜κ±°λ‚˜ λ©”μ‹œμ§€λ₯Ό μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. +- **Stop**: μ„Έμ…˜μ΄ 유휴 μƒνƒœκ°€ 될 λ•Œ μ‹€ν–‰. 후속 ν”„λ‘¬ν”„νŠΈλ₯Ό μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. + +`settings.json` μ˜ˆμ‹œ: +```json +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write|Edit", + "hooks": [{ "type": "command", "command": "eslint --fix $FILE" }] + } + ] + } +} +``` + +#### μ„€μ • λ‘œλ” + +**Command Loader**: 4개 λ””λ ‰ν† λ¦¬μ—μ„œ λ§ˆν¬λ‹€μš΄ 기반 μŠ¬λž˜μ‹œ λͺ…λ Ήμ–΄λ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€: +- `~/.claude/commands/` (μ‚¬μš©μž) +- `./.claude/commands/` (ν”„λ‘œμ νŠΈ) +- `~/.config/opencode/command/` (opencode μ „μ—­) +- `./.opencode/command/` (opencode ν”„λ‘œμ νŠΈ) + +**Skill Loader**: `SKILL.md`κ°€ μžˆλŠ” 디렉토리 기반 μŠ€ν‚¬μ„ λ‘œλ“œν•©λ‹ˆλ‹€: +- `~/.claude/skills/` (μ‚¬μš©μž) +- `./.claude/skills/` (ν”„λ‘œμ νŠΈ) + +**Agent Loader**: λ§ˆν¬λ‹€μš΄ νŒŒμΌμ—μ„œ μ»€μŠ€ν…€ μ—μ΄μ „νŠΈ μ •μ˜λ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€: +- `~/.claude/agents/*.md` (μ‚¬μš©μž) +- `./.claude/agents/*.md` (ν”„λ‘œμ νŠΈ) + +**MCP Loader**: `.mcp.json` νŒŒμΌμ—μ„œ MCP μ„œλ²„ 섀정을 λ‘œλ“œν•©λ‹ˆλ‹€: +- `~/.claude/.mcp.json` (μ‚¬μš©μž) +- `./.mcp.json` (ν”„λ‘œμ νŠΈ) +- `./.claude/.mcp.json` (둜컬) +- ν™˜κ²½λ³€μˆ˜ ν™•μž₯ 지원 (`${VAR}` 문법) + +#### 데이터 μ €μž₯μ†Œ + +**Todo 관리**: μ„Έμ…˜ todoκ°€ `~/.claude/todos/`에 Claude Code ν˜Έν™˜ ν˜•μ‹μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€. + +**Transcript**: μ„Έμ…˜ ν™œλ™μ΄ `~/.claude/transcripts/`에 JSONL ν˜•μ‹μœΌλ‘œ κΈ°λ‘λ˜μ–΄ μž¬μƒ 및 뢄석이 κ°€λŠ₯ν•©λ‹ˆλ‹€. + +> **`claude-code-*` 넀이밍에 λŒ€ν•΄**: `src/features/claude-code-*/` μ•„λž˜μ˜ κΈ°λŠ₯듀은 Claude Code의 μ„€μ • μ‹œμŠ€ν…œμ—μ„œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 넀이밍 κ·œμΉ™μ€ μ–΄λ–€ κΈ°λŠ₯이 Claude Codeμ—μ„œ μœ λž˜ν–ˆλŠ”μ§€ λͺ…ν™•νžˆ μ‹λ³„ν•©λ‹ˆλ‹€. + ### 기타 편의 κΈ°λŠ₯ - **Terminal Title**: μ„Έμ…˜ μƒνƒœμ— 따라 터미널 타이틀을 μžλ™ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€ (유휴 β—‹, μ²˜λ¦¬μ€‘ ◐, 도ꡬ ⚑, μ—λŸ¬ βœ–). tmuxλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. -- **Command Loader**: λ‹€μŒ λ””λ ‰ν† λ¦¬λ“€μ—μ„œ λ§ˆν¬λ‹€μš΄ 기반의 μ»€μŠ€ν…€ λͺ…령어듀을 λ‘œλ“œν•©λ‹ˆλ‹€: - - User scope: `~/.claude/commands/` - - Project scope: `./.claude/commands/` - - OpenCode global: `~/.config/opencode/command/` - - OpenCode project: `./.opencode/command/` -- **Skill Loader**: λ‹€μŒ λ””λ ‰ν† λ¦¬λ“€μ—μ„œ 디렉토리 기반의 μŠ€ν‚¬λ“€μ„ μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ…λ Ήμ–΄λ‘œ λ‘œλ“œν•©λ‹ˆλ‹€: - - User scope: `~/.claude/skills/` - - Project scope: `./.claude/skills/` +- **Session State**: 이벀트 ν›…κ³Ό 터미널 타이틀 μ—…λ°μ΄νŠΈμ— μ‚¬μš©λ˜λŠ” 쀑앙집쀑식 μ„Έμ…˜ 좔적 λͺ¨λ“ˆμž…λ‹ˆλ‹€. ## μ„€μ • diff --git a/README.md b/README.md index 8fceceb..bc50597 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ English | [ν•œκ΅­μ–΄](README.ko.md) - [Built-in AST-Grep Tools](#built-in-ast-grep-tools) - [Grep](#grep) - [Built-in MCPs](#built-in-mcps) + - [Claude Code Compatibility](#claude-code-compatibility) - [Other Features](#other-features) - [Configuration](#configuration) - [Author's Note](#authors-note) @@ -221,29 +222,72 @@ Don't need these? Disable them via `oh-my-opencode.json`: } ``` +### Claude Code Compatibility + +Oh My OpenCode provides seamless Claude Code configuration compatibility. If you've been using Claude Code, your existing setup works out of the box. + +#### Hooks Integration + +Execute custom scripts via Claude Code's `settings.json` hook system. Oh My OpenCode reads and executes hooks defined in: + +- `~/.claude/settings.json` (user) +- `./.claude/settings.json` (project) +- `./.claude/settings.local.json` (local, git-ignored) + +Supported hook events: +- **PreToolUse**: Runs before tool execution. Can block or modify tool input. +- **PostToolUse**: Runs after tool execution. Can add warnings or context. +- **UserPromptSubmit**: Runs when user submits a prompt. Can block or inject messages. +- **Stop**: Runs when session goes idle. Can inject follow-up prompts. + +Example `settings.json`: +```json +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write|Edit", + "hooks": [{ "type": "command", "command": "eslint --fix $FILE" }] + } + ] + } +} +``` + +#### Configuration Loaders + +**Command Loader**: Loads markdown-based slash commands from 4 directories: +- `~/.claude/commands/` (user) +- `./.claude/commands/` (project) +- `~/.config/opencode/command/` (opencode global) +- `./.opencode/command/` (opencode project) + +**Skill Loader**: Loads directory-based skills with `SKILL.md`: +- `~/.claude/skills/` (user) +- `./.claude/skills/` (project) + +**Agent Loader**: Loads custom agent definitions from markdown files: +- `~/.claude/agents/*.md` (user) +- `./.claude/agents/*.md` (project) + +**MCP Loader**: Loads MCP server configurations from `.mcp.json` files: +- `~/.claude/.mcp.json` (user) +- `./.mcp.json` (project) +- `./.claude/.mcp.json` (local) +- Supports environment variable expansion (`${VAR}` syntax) + +#### Data Storage + +**Todo Management**: Session todos are stored in Claude Code compatible format at `~/.claude/todos/`. + +**Transcript**: Session activity is logged to `~/.claude/transcripts/` in JSONL format, enabling replay and analysis. + +> **Note on `claude-code-*` naming**: Features under `src/features/claude-code-*/` are migrated from Claude Code's configuration system. This naming convention clearly identifies which features originated from Claude Code. + ### Other Features - **Terminal Title**: Auto-updates terminal title with session status (idle β—‹, processing ◐, tool ⚑, error βœ–). Supports tmux. -- **Command Loader** (`src/features/claude-code-command-loader/`): Loads markdown-based commands from multiple directories: - - User scope: `~/.claude/commands/` - - Project scope: `./.claude/commands/` - - OpenCode global: `~/.config/opencode/command/` - - OpenCode project: `./.opencode/command/` -- **Skill Loader** (`src/features/claude-code-skill-loader/`): Loads directory-based skills as executable commands: - - User scope: `~/.claude/skills/` - - Project scope: `./.claude/skills/` -- **Agent Loader** (`src/features/claude-code-agent-loader/`): Loads agent definitions from markdown files with YAML frontmatter: - - User scope: `~/.claude/agents/` - - Project scope: `./.claude/agents/` - - Format: `*.md` files with frontmatter (name, description, tools) -- **Session State** (`src/features/claude-code-session-state/`): Centralized session tracking module used by event hooks and terminal title updates. -- **MCP Loader** (`src/features/claude-code-mcp-loader/`): Loads MCP server configurations from `.mcp.json` files: - - User scope: `~/.claude/.mcp.json` - - Project scope: `./.mcp.json` - - Local scope: `./.claude/.mcp.json` - - Supports environment variable expansion (`${VAR}` syntax) - -> **Note on `claude-code-*` naming**: Features under `src/features/claude-code-*/` are migrated from Claude Code's configuration system. This naming convention clearly identifies which features originated from Claude Code, such as `claude-code-command-loader`, `claude-code-skill-loader`, `claude-code-agent-loader`, and `claude-code-mcp-loader`. +- **Session State**: Centralized session tracking module used by event hooks and terminal title updates. ## Configuration diff --git a/local-ignore/comment-checker-ts-plan.md b/local-ignore/comment-checker-ts-plan.md deleted file mode 100644 index c0f648f..0000000 --- a/local-ignore/comment-checker-ts-plan.md +++ /dev/null @@ -1,162 +0,0 @@ -# Comment-Checker TypeScript Port κ΅¬ν˜„ κ³„νš - -## 1. μ•„ν‚€ν…μ²˜ κ°œμš” - -### 1.1 핡심 도전 과제 - -**OpenCode Hook의 μ œμ•½μ‚¬ν•­:** -- `tool.execute.before`: `output.args`μ—μ„œ 파일 경둜/λ‚΄μš© μ ‘κ·Ό κ°€λŠ₯ -- `tool.execute.after`: `tool_input`이 **μ œκ³΅λ˜μ§€ μ•ŠμŒ** (Claude Codeμ™€μ˜ 핡심 차이점) -- **ν•΄κ²°μ±…**: Before hookμ—μ„œ 데이터λ₯Ό μΊ‘μ²˜ν•˜μ—¬ callID둜 ν‚€μž‰λœ Map에 μ €μž₯, After hookμ—μ„œ 쑰회 - -### 1.2 디렉토리 ꡬ쑰 - -``` -src/hooks/comment-checker/ -β”œβ”€β”€ index.ts # Hook factory, 메인 μ—”νŠΈλ¦¬ν¬μΈνŠΈ -β”œβ”€β”€ types.ts # λͺ¨λ“  νƒ€μž… μ •μ˜ -β”œβ”€β”€ constants.ts # μ–Έμ–΄ λ ˆμ§€μŠ€νŠΈλ¦¬, 쿼리 ν…œν”Œλ¦Ώ, λ””λ ‰ν‹°λΈŒ λͺ©λ‘ -β”œβ”€β”€ detector.ts # CommentDetector - web-tree-sitter 기반 μ½”λ©˜νŠΈ 감지 -β”œβ”€β”€ filters/ -β”‚ β”œβ”€β”€ index.ts # ν•„ν„° barrel export -β”‚ β”œβ”€β”€ bdd.ts # BDD νŒ¨ν„΄ ν•„ν„° -β”‚ β”œβ”€β”€ directive.ts # λ¦°ν„°/νƒ€μž…μ²΄μ»€ λ””λ ‰ν‹°λΈŒ ν•„ν„° -β”‚ β”œβ”€β”€ docstring.ts # λ…μŠ€νŠΈλ§ ν•„ν„° -β”‚ └── shebang.ts # Shebang ν•„ν„° -β”œβ”€β”€ output/ -β”‚ β”œβ”€β”€ index.ts # 좜λ ₯ barrel export -β”‚ β”œβ”€β”€ formatter.ts # FormatHookMessage -β”‚ └── xml-builder.ts # BuildCommentsXML -└── utils.ts # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ -``` - -### 1.3 데이터 흐름 - -``` -[write/edit 도ꡬ μ‹€ν–‰] - β”‚ - β–Ό -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ tool.execute.before β”‚ -β”‚ - 파일 경둜 캑처 β”‚ -β”‚ - pendingCalls Map β”‚ -β”‚ 에 μ €μž₯ β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ - β–Ό - [도ꡬ μ‹€μ œ μ‹€ν–‰] - β”‚ - β–Ό -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ tool.execute.after β”‚ -β”‚ - pendingCallsμ—μ„œ β”‚ -β”‚ 데이터 쑰회 β”‚ -β”‚ - 파일 읽기 β”‚ -β”‚ - μ½”λ©˜νŠΈ 감지 β”‚ -β”‚ - ν•„ν„° 적용 β”‚ -β”‚ - λ©”μ‹œμ§€ μ£Όμž… β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -``` - ---- - -## 2. κ΅¬ν˜„ μˆœμ„œ - -### Phase 1: 기반 ꡬ쑰 -1. `src/hooks/comment-checker/` 디렉토리 생성 -2. `types.ts` - λͺ¨λ“  νƒ€μž… μ •μ˜ -3. `constants.ts` - μ–Έμ–΄ λ ˆμ§€μŠ€νŠΈλ¦¬, λ””λ ‰ν‹°λΈŒ νŒ¨ν„΄ - -### Phase 2: ν•„ν„° κ΅¬ν˜„ -4. `filters/bdd.ts` - BDD νŒ¨ν„΄ ν•„ν„° -5. `filters/directive.ts` - λ””λ ‰ν‹°λΈŒ ν•„ν„° -6. `filters/docstring.ts` - λ…μŠ€νŠΈλ§ ν•„ν„° -7. `filters/shebang.ts` - Shebang ν•„ν„° -8. `filters/index.ts` - ν•„ν„° μ‘°ν•© - -### Phase 3: μ½”μ–΄ 둜직 -9. `detector.ts` - web-tree-sitter 기반 μ½”λ©˜νŠΈ 감지 -10. `output/xml-builder.ts` - XML 좜λ ₯ -11. `output/formatter.ts` - λ©”μ‹œμ§€ ν¬λ§€νŒ… - -### Phase 4: Hook 톡합 -12. `index.ts` - Hook factory 및 μƒνƒœ 관리 -13. `src/hooks/index.ts` μ—…λ°μ΄νŠΈ - export μΆ”κ°€ - -### Phase 5: μ˜μ‘΄μ„± 및 λΉŒλ“œ -14. `package.json` μ—…λ°μ΄νŠΈ - web-tree-sitter μΆ”κ°€ -15. typecheck 및 build 검증 - ---- - -## 3. 핡심 κ΅¬ν˜„ 사항 - -### 3.1 μ–Έμ–΄ λ ˆμ§€μŠ€νŠΈλ¦¬ (38개 μ–Έμ–΄) - -```typescript -const LANGUAGE_REGISTRY: Record = { - python: { extensions: [".py"], commentQuery: "(comment) @comment", docstringQuery: "..." }, - javascript: { extensions: [".js", ".jsx"], commentQuery: "(comment) @comment" }, - typescript: { extensions: [".ts"], commentQuery: "(comment) @comment" }, - tsx: { extensions: [".tsx"], commentQuery: "(comment) @comment" }, - go: { extensions: [".go"], commentQuery: "(comment) @comment" }, - rust: { extensions: [".rs"], commentQuery: "(line_comment) @comment (block_comment) @comment" }, - // ... 38개 전체 -} -``` - -### 3.2 ν•„ν„° 둜직 - -**BDD ν•„ν„°**: `given, when, then, arrange, act, assert` -**Directive ν•„ν„°**: `noqa, pyright:, eslint-disable, @ts-ignore` λ“± 30+ -**Docstring ν•„ν„°**: `IsDocstring || starts with /**` -**Shebang ν•„ν„°**: `starts with #!` - -### 3.3 좜λ ₯ ν˜•μ‹ (Go 버전과 100% 동일) - -``` -COMMENT/DOCSTRING DETECTED - IMMEDIATE ACTION REQUIRED - -Your recent changes contain comments or docstrings, which triggered this hook. -You need to take immediate action. You must follow the conditions below. -(Listed in priority order - you must always act according to this priority order) - -CRITICAL WARNING: This hook message MUST NEVER be ignored... - - - // comment text - -``` - ---- - -## 4. 생성할 파일 λͺ©λ‘ - -1. `src/hooks/comment-checker/types.ts` -2. `src/hooks/comment-checker/constants.ts` -3. `src/hooks/comment-checker/filters/bdd.ts` -4. `src/hooks/comment-checker/filters/directive.ts` -5. `src/hooks/comment-checker/filters/docstring.ts` -6. `src/hooks/comment-checker/filters/shebang.ts` -7. `src/hooks/comment-checker/filters/index.ts` -8. `src/hooks/comment-checker/output/xml-builder.ts` -9. `src/hooks/comment-checker/output/formatter.ts` -10. `src/hooks/comment-checker/output/index.ts` -11. `src/hooks/comment-checker/detector.ts` -12. `src/hooks/comment-checker/index.ts` - -## 5. μˆ˜μ •ν•  파일 λͺ©λ‘ - -1. `src/hooks/index.ts` - export μΆ”κ°€ -2. `package.json` - web-tree-sitter μ˜μ‘΄μ„± - ---- - -## 6. Definition of Done - -- [ ] write/edit 도ꡬ μ‹€ν–‰ μ‹œ μ½”λ©˜νŠΈ 감지 λ™μž‘ -- [ ] 4개 ν•„ν„° λͺ¨λ‘ 정상 μž‘λ™ -- [ ] μ΅œμ†Œ 5개 μ–Έμ–΄ 지원 (Python, JS, TS, TSX, Go) -- [ ] Go 버전과 λ™μΌν•œ 좜λ ₯ ν˜•μ‹ -- [ ] typecheck 톡과 -- [ ] build 성곡 diff --git a/local-ignore/push-and-release.sh b/local-ignore/push-and-release.sh deleted file mode 100755 index 170f3b5..0000000 --- a/local-ignore/push-and-release.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e -cd /Users/yeongyu/local-workspaces/oh-my-opencode - -echo "=== Pushing to origin ===" -git push -f origin master - -echo "=== Triggering workflow ===" -gh workflow run publish.yml --repo code-yeongyu/oh-my-opencode --ref master -f bump=patch -f version=$1 - -echo "=== Done! ===" -echo "Usage: ./local-ignore/push-and-release.sh 0.1.6"