Identities live in ~/.git-identities (alias|Name|email). Interactive menu to select, add, or remove identities; direct mode via alias argument; --global/-g scope flag (defaults to local inside a repo, global fallback outside); --list/--current helpers. Full --dryrun support and a 27-assertion test suite driven through dryrun. GIT_IDENTITIES_FILE env override for testability.
85 lines
4.2 KiB
Markdown
85 lines
4.2 KiB
Markdown
# small-scripts
|
||
|
||
A collection of small, standalone utility scripts for daily use. Scripts are symlinked into `~/sbin` for PATH availability.
|
||
|
||
## Approach
|
||
|
||
This project uses **spec-driven development** (OpenSpec) as a testbed for agent-driven development and refinement:
|
||
|
||
1. Every script starts with a spec in `specs/`
|
||
2. Every script supports `--dryrun` to preview actions without side effects
|
||
3. Every script has a test in `tests/` that validates dryrun behaviour against the spec
|
||
|
||
## Scripts
|
||
|
||
| Script | Purpose | Status |
|
||
|--------|---------|--------|
|
||
| `check-skills` | Verify Claude Code skill symlinks match source repo | Done |
|
||
| `claude-profile` | Claude Code profile + engagement-mode launcher | Done |
|
||
| `claude-tmux` | Spawn a detached tmux Claude Code session with Remote Control, named after a project (wraps `claude-profile`) | Done |
|
||
| `gen-secret` | Generate bash/YAML/JSON-safe random strings | Done |
|
||
| `git-identity` | Switch git user.name/email from a saved identity menu (`~/.git-identities`) | Done |
|
||
| `git-status-report` | Recursive git repo status with diff stats | Done |
|
||
| `md-to-docx` | Markdown to DOCX conversion | Done |
|
||
| `mp3-to-mp4` | Convert MP3 to MP4 with a static title card | Done |
|
||
| `split-wezterm` | Split WezTerm pane into a rows × cols grid | Done |
|
||
| `sync-repos` | Mirror git repos across remotes | Done |
|
||
| `unreflected-logs` | Scan projects for unreflected session logs | Done |
|
||
| `validate-skill` | Validate SKILL.md files against known Claude Code restrictions | Done |
|
||
| `semver-ci` | Compute `MAJOR.MINOR.PATCH.BUILD` from commit-message tokens, maintain `VERSION.md`, and (on main) tag/push/create a Gitea release — see [`docs/semver-ci.md`](docs/semver-ci.md) and template at [`templates/gitea-workflow-version.yml`](templates/gitea-workflow-version.yml) | Done |
|
||
| `wait-for-release` | Poll a Gitea repo's releases until a glob pattern matches or a timeout expires (default 600s) | Done |
|
||
| `wait-for-version` | Poll a Gitea repo's Actions runs until the named CI workflow completes on HEAD of main, then print the latest release tag — solves the push-then-update race condition for semver dependencies | Done |
|
||
|
||
### Engagement modes (claude-profile)
|
||
|
||
`claude-profile` launches Claude Code with both a configuration profile (selecting which `~/.claude-*` directory to use) and an **engagement mode** that bundles a driver model, subagent policy, async tolerance, and workflow stance:
|
||
|
||
| Mode | Driver | For |
|
||
|---|---|---|
|
||
| `chat` | Haiku | No project, just conversation |
|
||
| `quick` | Sonnet | Single small focused job, fully synchronous |
|
||
| `deep` | Sonnet (Opus via named workflows) | Hard design or debugging, plan + spec enforced |
|
||
| `hybrid` | Haiku (Opus/Sonnet on demand) | Long sessions, escalates only when needed |
|
||
| `orch` | Sonnet | Decompose work and dispatch container agents |
|
||
|
||
Mode definitions live in `data/claude-profile/modes/<name>.md` — YAML frontmatter (machine-parsed) plus a markdown body that becomes part of the system prompt.
|
||
|
||
```bash
|
||
claude-profile # interactive picker
|
||
claude-profile oreillyit --mode deep # explicit profile + mode
|
||
claude-profile --preset deep-cluster # named preset from presets.yaml
|
||
claude-profile --dryrun [...] # show resolved values, do not launch
|
||
```
|
||
|
||
Copy `data/claude-profile/presets.yaml.example` to `$CLAUDE_CONFIG_DIR/presets.yaml` to set up named presets.
|
||
|
||
## Repository Structure
|
||
|
||
```
|
||
small-scripts/
|
||
├── scripts/ # Executable scripts (symlinked into ~/sbin)
|
||
├── specs/ # OpenSpec files, one per script
|
||
├── tests/ # Test scripts that exercise --dryrun
|
||
├── data/ # Read-only data files used by scripts
|
||
│ └── claude-profile/
|
||
│ ├── modes/ # Engagement mode definitions
|
||
│ └── presets.yaml.example
|
||
└── memory/ # Tiered memory topic files
|
||
```
|
||
|
||
## Quick Start
|
||
|
||
```bash
|
||
# Run all tests
|
||
./tests/run-all.sh
|
||
|
||
# Symlink a script into ~/sbin
|
||
ln -sf "$(pwd)/scripts/<name>" ~/sbin/<name>
|
||
```
|
||
|
||
## Milestones
|
||
|
||
| # | Description | Status |
|
||
|---|-------------|--------|
|
||
| M1 | Project setup, first script | In progress |
|