Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# env-init が現在の git worktree 用に .env を生成するためのテンプレート(書式の参照例)。
# このファイルは bash として 1 回だけ source される。書式の要点:
# - env-init が worktree 番号 N を export 済み(primary=0 / 派生 worktree=1..99)。
# - 代入行 NAME=... のみが「評価後の値」で .env に出力される。
# - コメント行・空行はそのまま素通し。代入以外のロジック行は .env に出力されない。
# - 先に宣言した変数は後続行から ${NAME} で展開できる(bash 評価のため)。
# これは書式の参照例。利用側 repo は自分のポート・secret に合わせて独自の .env.template を用意する
# (.env.sample を一次ソースにして .env.template を作る運用も good practice。プロジェクト次第)。

# 文字列リテラル
APP_NAME="devtools"

# N を使った算術。worktree ごとにポートをずらす(例: primary=3000, N=1 の worktree=3001)。
PORT_APP=$((3000 + N))

# 先に宣言した変数の展開。APP_NAME と PORT_APP を参照して URL / DB 名を組み立てる。
APP_URL="http://localhost:${PORT_APP}"
DATABASE_URL="postgres://localhost:$((5432 + N))/${APP_NAME}"

# コマンド置換による乱数 secret 生成。openssl は利用側 repo の環境(devbox 等)が供給する。
SESSION_SECRET=$(openssl rand -base64 32)
20 changes: 20 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: check

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install devbox
uses: jetify-com/devbox-install-action@8c6a66ed6273138b1915457069de78cb52fe3bd7 # v0.15.0
- name: nix flake check
run: devbox run check
26 changes: 26 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: release

# SemVer タグ (vX.Y.Z) を push すると、check を通したうえで
# GitHub Release を自動生成ノート付きで作成する。
on:
push:
tags:
- "v*"

permissions:
contents: write

jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install devbox
uses: jetify-com/devbox-install-action@8c6a66ed6273138b1915457069de78cb52fe3bd7 # v0.15.0
- name: nix flake check
run: devbox run check
- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: gh release create "$GITHUB_REF_NAME" --generate-notes --verify-tag
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,10 @@ result-*
# devbox
.devbox/
.local/

# エディタ / ローカルツール
.obsidian/

# Claude Code のローカル状態
.claude/settings.local.json
.claude/scheduled_tasks.lock
10 changes: 10 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@

org 横断で共有する汎用 dev ツールの集約先。ツールはまず各利用 repo で実運用に揉んで枯らし、repo 非依存(特定のポート名・secret 名・repo 固有パスを知らない)になったものから本リポジトリへ移設する。

## 構成と開発の前提

- パッケージは `pkgs/<name>/` に `package.nix` と生スクリプトを同居させる。生スクリプトは `#!/usr/bin/env bash`
始まりで単体実行可能なまま保ち、wrap は外側に被せるだけで中身を書き換えない(env-init は `runCommand` + `makeWrapper`
で PATH を被せ、shebang のみビルド時に絶対 bash へ固定する)。`writeShellApplication` はスクリプト本文前に
プリアンブルを差し込み `$0` 依存の挙動を壊しうるため、本文を保ちたいツールでは避ける。
- test / lint の真実は `flake.nix` の `checks`(shellcheck・bats・statix・deadnix・nixfmt)に一元化する。
`devbox.json` の scripts はそれへの薄い委譲。
- 開発環境は devbox(`devbox run check` など)。ツール一覧の二重管理を避けるため flake の devShell は設けない。

## 公開リポジトリの制約

本リポジトリは public 公開する。成果物(ドキュメント・コード・コミット等)に、プライベートリポジトリや非公開 Issue への言及を入れない。設計の背景が非公開リソースにある場合でも、公開成果物は自己完結した記述にする。
63 changes: 61 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,65 @@ org 横断で共有する汎用 dev ツールの集約リポジトリ。各利

Nix flake × devbox。言語非依存でツールを PATH へ配布し、`flake.lock` / `devbox.lock` で版とコンテナ build を再現可能に固定する。利用側 repo は同一の flake 参照を `devbox.json` の `packages` に足すだけでよい。

## 状態
## 構成

初期化フェーズ。worktree 用の `.env` 生成エンジン `env-init` の移設を先頭バッチに、repo 非依存に枯れたツールから順次集約していく。
```
flake.nix # packages / checks (test・lint) / formatter を公開
devbox.json # 開発環境(Nix の test/lint ツール)と自己 dogfooding
.env.template # env-init 用テンプレートの書式例(本 repo の dogfood でも使用)
pkgs/
env-init/
package.nix # env-init を makeWrapper で wrap する派生
env-init # エンジン本体(単体実行可能な生スクリプト)
tests/ # bats テスト
```

## 開発

devbox 経由で開発する。

```sh
devbox shell # 開発シェルに入る(初回は .env を自動生成し env-init を dogfood)
devbox run check # nix flake check(shellcheck・bats・statix・deadnix・nixfmt)
devbox run build # nix build .#env-init
devbox run fmt # nix fmt(nixfmt-tree でツリー全体を整形)
```

## バージョニング

リリースはリポジトリ単位の [SemVer](https://semver.org/lang/ja/) タグ `vMAJOR.MINOR.PATCH`(例 `v1.0.0`)で行う。複数ツールが入るが**タグは共通の 1 本**で、ツールは flake output 名(`#env-init` 等)で区別する。利用側は `<ref>` にタグ(または commit SHA)をピンし、実際の再現性は利用側の lock が固定する。

安定版は [GitHub Releases](https://github.com/airs/devtools/releases) の最新(Latest)を参照し、その `vX.Y.Z` を `<ref>` に pin する。

SemVer は各ツールの CLI 契約(引数・出力・終了コード)で判断する。

- **MAJOR**: 破壊的変更(フラグ改名・出力フォーマット変更・終了コード変更・ツール削除)
- **MINOR**: 後方互換の追加(新ツール追加・新しい任意フラグ)
- **PATCH**: 挙動を変えないバグ修正

## ツール

### env-init

現在の git worktree 用に `.env` を生成する汎用エンジン。worktree 番号 N を計算し、リポジトリルートの
`.env.template`(bash として 1 回評価される)から `.env` を書き出す。プロジェクト非依存設計で、実行時依存は
`bash` / `git` / `gawk` / `gnused` + coreutils。

**利用側 repo での使い方**:

1. `devbox.json` の `packages` に flake 参照を足し、init_hook で起動する。

```jsonc
{
"packages": ["github:airs/devtools/<ref>#env-init"],
"shell": { "init_hook": ["[ -f .env ] || env-init"] }
}
```

`<ref>` は tag / commit でピンする。本リポジトリ自身の `devbox.json` は、ローカル flake を dogfood するため
`path:.#env-init` を使う点だけが利用側と異なる。Nix を使わない環境では `pkgs/env-init/env-init` を直接実行できる
(生スクリプトは単体実行可能なまま)。

2. **利用側 repo がルートに `.env.template` を用意する**(中央には持ち込まない repo 固有ファイル)。各 worktree で
`N` を参照し、ポートを `$((BASE + N))` でずらし、secret を `openssl rand` / `op read` 等で書く。書式は本リポジトリ
ルートの [`.env.template`](.env.template) を参照(コピー用ではなく書式例)。
26 changes: 26 additions & 0 deletions devbox.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.17.2/.schema/devbox.schema.json",
"packages": [
"git@2",
"openssl@3",
"shellcheck@0",
"statix@0",
"deadnix@1",
"nixfmt@1",
"bats@1",
"path:.#env-init"
],
"env": {
"NIX_CONFIG": "experimental-features = nix-command flakes"
},
"shell": {
"init_hook": [
"[ -f .env ] || env-init"
],
"scripts": {
"check": "nix flake check",
"build": "nix build .#env-init",
"fmt": "nix fmt"
}
}
}
Loading