# 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-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 | ### 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/.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/" ~/sbin/ ``` ## Milestones | # | Description | Status | |---|-------------|--------| | M1 | Project setup, first script | In progress |