Skip to content

feat: 仮想ファイル状態をコミットできる ghost-commit CLI を追加#1

Merged
s4na merged 11 commits into
mainfrom
feat/ghost-commit-hello
Jun 13, 2026
Merged

feat: 仮想ファイル状態をコミットできる ghost-commit CLI を追加#1
s4na merged 11 commits into
mainfrom
feat/ghost-commit-hello

Conversation

@s4na

@s4na s4na commented Apr 9, 2026

Copy link
Copy Markdown
Owner

Summary

  • 実ファイルを書き換えずに、指定した別ファイルや標準入力の内容を任意のパスとしてコミットできる ghost-commit CLI を実装
  • --file PATH=SOURCE--file PATH=---delete PATH に対応し、指定していない staged 変更はコミットに混ぜない
  • GitHub Actions の Go CI と zizmor CI を追加
  • README を英語版にし、日本語版 README.ja.md を追加して相互リンクを設置
  • Homebrew Formula の説明・テストを本命機能に合わせて更新

Test plan

  • go test ./...
  • go build -o /tmp/ghost-commit-review .
  • 手動の一時 Git repo で、実ファイルを変更せず ghost 内容だけが commit されることを確認
  • ruby -c Formula/ghost-commit.rb
  • brew style Formula/ghost-commit.rb
  • actionlint
  • zizmor .github/workflows
  • README / README.ja.md の相互リンクと内容整合性をレビュー

s4na and others added 2 commits April 9, 2026 11:04
@s4na

s4na commented Apr 9, 2026

Copy link
Copy Markdown
Owner Author

Code Review (Google Style)

TL;DR

重要な指摘があります。修正を推奨します。

  • 🚨 Homebrew Formula で revision: "HEAD" が指定されているが、v0.1.0 タグが存在しないためインストールが失敗する
  • 🚨 Formula で license "MIT" と宣言しているが、LICENSE ファイルがリポジトリに存在しない
  • 💡 Go コードにユニットテストがない
Details

🚨 issue

Formula/ghost-commit.rb: revision: "HEAD" と存在しないタグ v0.1.0
Formula の url ブロックで tag: "v0.1.0"revision: "HEAD" が指定されていますが、リポジトリに v0.1.0 タグが存在しません。revision"HEAD" というリテラル文字列を指定するのも正しくありません。Homebrew の revision フィールドには実際の Git コミットハッシュ(SHA)を指定する必要があります。この状態では brew install ghost-commit が失敗します。PR をマージする前に v0.1.0 タグを作成し、revision にはそのタグが指すコミットの完全な SHA を設定してください。あるいは、まだタグを打てない段階であれば head のみの Formula として url/tag/revision ブロックを削除する方法もあります。

Formula/ghost-commit.rb: LICENSE ファイルが存在しない
Formula で license "MIT" と宣言していますが、リポジトリに LICENSE ファイルが含まれていません。ライセンスを宣言する以上、対応する LICENSE ファイルをリポジトリのルートに追加する必要があります。ファイルがないと、利用者がライセンス条件を確認できず、法的に不明確な状態になります。

💡 suggestion

main.go: ユニットテストがない
Go のプロダクションコードに対するテストファイル(main_test.go など)がありません。現在は Formula の test ブロックでバイナリ出力をチェックしていますが、Go 標準の go test で実行できるユニットテストも追加することを推奨します。現段階ではロジックが fmt.Println のみなので優先度は低いですが、今後機能が増えた場合に備えてテスト基盤を整えておくと良いでしょう。

go.mod: Go バージョンの互換性について
go 1.26.1 が指定されています。これは最新のバージョンですが、利用者の環境で古い Go がインストールされている場合にビルドできない可能性があります。Formula の depends_on "go" => :build はバージョン制約を指定していないため、古い Go でビルドを試みてエラーになるケースが考えられます。もし特定の Go バージョンが必要であれば、Formula 側で最小バージョンを明示するか、README に記載しておくと親切です。

🔧 nitpick

.gitignore: パターンの網羅性
現在 /ghost-commit のみが指定されていますが、Go 開発でよく生成される一時ファイル(例: *.test, *.out など)も追加しておくと、将来的にリポジトリがクリーンに保たれます。

README.md: Build from source セクション
go build ./... の後に ./ghost-commit を実行する例が記載されていますが、go build ./... はカレントディレクトリにバイナリを生成しない場合があります(Go のバージョンやモジュール設定による)。go build -o ghost-commit . のように明示的に出力先を指定する方がより確実です。

❓ question

Formula/ghost-commit.rb: head ブロックの意図について
head ブロック(head "https://github.com/s4na/ghost-commit.git", branch: "main")と通常の url/tag の両方が定義されていますが、現段階では安定リリースのタグが存在しません。開発初期は head-only の Formula にして、安定版リリース時に url/tag を追加する方が適切ではないでしょうか?

👏 praise

シンプルで明確なプロジェクト構成
Go の最小構成(main.go + go.mod)で、やりたいことが一目でわかる非常にクリーンなプロジェクトです。README も日本語で丁寧に書かれており、インストール方法・使い方・ビルド方法が簡潔にまとまっています。

Homebrew Formula の同梱
CLI ツールと一緒に Homebrew Formula を同梱しているのは、ユーザーの導入体験を考慮した良いアプローチです。テストブロックも含まれており、配布品質への意識が感じられます。

- Formula を head-only に変更(不正な revision: "HEAD" と未作成タグの問題を解消)
- MIT LICENSE ファイルを追加
- Go ユニットテストを追加
- .gitignore に *.exe を追加
- README の install/build コマンドを修正

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
@s4na

s4na commented Jun 13, 2026

Copy link
Copy Markdown
Owner Author

Code Review (Google Style) · Codex CLI 0.139.0 によってレビューが実行されました

TL;DR

重大な指摘はありませんでした。

Details

🚨 issue

(なし)

💡 suggestion

(なし)

🔧 nitpick

(なし)

❓ question

(なし)

👏 praise

  • Go CLI、Homebrew Formula、README、テストが小さくまとまっており、現在の機能範囲に対して読みやすい構成です。
  • main_test.go と Formula の test do がどちらも実際の出力を確認していて、最小 CLI としての期待動作が明確です。
  • 以前のレビューで挙がっていた LICENSE と Go テストの不足は、現在の PR head では解消されています。

🧭 triage notes

(なし)

🔎 reviewed areas

  • .gitignore, Formula/ghost-commit.rb, LICENSE, README.md, go.mod, main.go, main_test.go を対象に、PR feat: 仮想ファイル状態をコミットできる ghost-commit CLI を追加 #1 の head 74f231a9f6b6bc564460af96089036e02f2424ae と base 0cb3879ec488aa87d1281f3dd5f9640e57953b80 の差分を確認しました。
  • CLI の hello world 出力、README の install/usage/build 手順、Homebrew Formula の build/test 経路、MIT ライセンス追加を確認しました。
  • セキュリティレビューでは、入力処理、ファイル操作、ネットワーク、サブプロセス実行、認証、暗号、デシリアライズなどの高リスク面が追加されていないことを確認しました。
  • 既存レビューコメントは現在の head に対して再確認し、LICENSE とテスト不足に関する内容は現状では stale と判断しました。

✅ verification

  • gh pr view 1 --json headRefOid,baseRefOid,headRefName,baseRefName で投稿直前の head/base OID がレビュー対象と一致することを確認しました。
  • gh pr diff 1 --name-only と PR files API で変更ファイルと行数を確認しました。
  • git diff --check 0cb3879ec488aa87d1281f3dd5f9640e57953b80...74f231a9f6b6bc564460af96089036e02f2424ae は成功しました。
  • go test ./... は成功しました。
  • レビュー担当の検証で go build ./...go build -o /tmp/ghost-commit-review . && /tmp/ghost-commit-review が成功し、出力が hello world であることを確認しました。
  • 整合性レビュー担当の検証で brew style Formula/ghost-commit.rb は成功しました。
  • Homebrew の path-based brew audit / brew install は、この環境の Homebrew が直接パス指定を拒否したため結論なしです。

s4na added 4 commits June 13, 2026 22:39
Add Go build/test CI and zizmor workflow security scanning for the PR request to make merge readiness visible in GitHub Actions.
Use the commit SHA behind the checkout v6.0.3 tag so zizmor's ref-version check accepts the workflow pins.
Replace the placeholder CLI with the requested virtual staging workflow: commit supplied file contents and deletions without rewriting the working tree, while preserving unrelated staged changes.
Canonicalize requested repository paths before duplicate and staged-overlap checks so equivalent path spellings cannot bypass safety checks.
@s4na s4na changed the title feat: add ghost-commit Go CLI and Homebrew formula feat: 仮想ファイル状態をコミットできる ghost-commit CLI を追加 Jun 13, 2026
s4na added 3 commits June 13, 2026 23:13
Resolve reviewer findings by making CLI paths relative to the invocation directory inside the repository and rejecting parent/child staged overlaps before moving HEAD.
Allow subdirectory invocations to target parent paths that remain inside the repository and handle virtual file/directory replacements by clearing conflicting index entries first.
Make help exit successfully and refuse to move HEAD while merge, rebase, cherry-pick, or revert state files are present.
@s4na

s4na commented Jun 13, 2026

Copy link
Copy Markdown
Owner Author

Code Review (Google Style) · Codex CLI 0.139.0 によってレビューが実行されました

TL;DR

重大な指摘はありませんでした。

Details

🚨 issue

(なし)

💡 suggestion

(なし)

🔧 nitpick

(なし)

❓ question

(なし)

👏 praise

  • 実ファイルを書き換えずに仮想ファイル状態を commit する中核機能が、Git の plumbing を使って小さく実装されています。
  • サブディレクトリ実行、../ を含む repo 内パス、file/directory 置換、staged 変更との衝突、merge 中の拒否までテストされていて、CLI としての事故面がかなり抑えられています。
  • Go CI と zizmor CI が追加され、workflow 側も SHA pin と最小権限でまとまっています。

🧭 triage notes

  • ungrouped / code reviewer finding: original issue -> omitted because already addressed in current head — サブディレクトリ実行時のパス解決は、repo root/prefix を使う正規化と回帰テストで修正済みです。
  • ungrouped / code reviewer finding: original issue -> omitted because already addressed in current head — staged 変更との親子パス衝突は、HEAD を動かす前に拒否する実装と回帰テストで修正済みです。
  • ungrouped / code reviewer finding: original issue -> omitted because already addressed in current head — repo 内に留まる ../ パスと file/directory 置換は、正規化・conflict removal・回帰テストで修正済みです。
  • ungrouped / consistency reviewer finding: original issue -> omitted because already addressed in current head — --help は正常終了するよう修正済みです。
  • ungrouped / code reviewer finding: original issue -> omitted because already addressed in current head — merge/rebase/cherry-pick/revert 中は ghost commit を拒否するよう修正済みです。

🔎 reviewed areas

  • .github/workflows/ci.yml, .github/workflows/zizmor.yml, .gitignore, Formula/ghost-commit.rb, LICENSE, README.md, go.mod, main.go, main_test.go を確認しました。
  • CLI の --file PATH=SOURCE, --file PATH=-, --delete PATH、repo root/prefix 正規化、仮想 index 作成、file/directory conflict removal、commit-tree / update-ref、通常 index 同期を確認しました。
  • staged 変更の保護、親子パス衝突拒否、サブディレクトリ実行、repo 内 ../ パス、merge 中の拒否、README / Formula / CI の整合性を確認しました。

✅ verification

  • 投稿直前に gh pr view 1 --json headRefOid,baseRefOid,mergeStateStatus,mergeable,statusCheckRollup で head 13ef50a15e7af5184b4546f8198984b92de5f0b8、base 0cb3879ec488aa87d1281f3dd5f9640e57953b80MERGEABLE / CLEAN を確認しました。
  • GitHub checks は Go testzizmor がどちらも SUCCESS です。
  • ローカルで go test ./...go build -o /tmp/ghost-commit-review ./tmp/ghost-commit-review --helpruby -c Formula/ghost-commit.rbbrew style Formula/ghost-commit.rbactionlintzizmor .github/workflows を実行し成功しました。
  • 複数回のレビューで見つかった path handling、staged overlap、file/directory replacement、in-progress Git operation の問題は修正後に回帰テストを追加しています。

Add README.ja.md and cross-link the English and Japanese documentation for the PR request.
@s4na s4na merged commit 2de75af into main Jun 13, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant