Skip to content
Open
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
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,37 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

---

## [0.10.0] — 2026-08-30

### Added

- `saddle reorg` one-shot migration command with interactive review, `--dry-run`, `--json`, `--check`, and headless `--yes` modes
- Configurable canonical roots through `--source`, `SADDLE_SOURCE_ROOT`, or `sourceRoot` in `config.yaml`; new installations no longer assume `~/dev/ai`
- Mutually exclusive `universal-first` and `provider-only` routing strategies
- Version 2 provider-rule schema for rule-based discovery of skills, agents, and commands
- Transaction manifests, verified imports and links, precondition checks, and automatic rollback on apply failure
- Idempotent drift planning: repeat runs are empty when clean and include only newly diverged items
- Reorganization rules for Claude Code, Codex, Copilot, Cursor, Gemini, Goose, OpenCode, and Reasonix (the supported DeepSeek coding harness)

### Changed

- Codex skill sync now targets the shared `~/.agents/skills` location
- Copilot detection now uses the standalone `copilot` CLI; skills support both current personal roots and the unsupported `~/.copilot/commands` mapping has been removed
- Bundled reorganization metadata is merged into older user-copied provider rules without overwriting custom sync mappings
- Dry-run, JSON, check, and rejected TUI plans do not initialize Saddle config or state
- The reorganization review now maps the canonical source to installed-agent destination blocks, dims paths already in place, and highlights links or cleanup still required

### Fixed

- Managed collection symlinks that already point to their canonical collection no longer trigger a false overlap error or risk changes through the alias

### Security

- Canonical paths are constrained to the selected source root, overlapping managed roots are rejected, and rule locations fail closed on malformed classifications
- Apply validates the complete plan before writing and revalidates each target immediately before mutation

---

## [0.9.3] — 2026-04-08

### Changed
Expand Down
21 changes: 15 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@ Thank you for considering a contribution. This document covers how to get set up
## Prerequisites

- **Node.js 18 or newer** (the project enforces `engines.node >= 18`)
- **npm** (comes with Node)
- **pnpm 10**
- **Git**

## Getting Started

```bash
git clone https://github.com/ndizazzo/saddle.git
cd saddle
npm install
pnpm install
```

Husky will install a pre-commit hook automatically during `npm install`.
Husky installs the Git hooks during `pnpm install`.

## Project Structure

Expand All @@ -25,6 +25,8 @@ Husky will install a pre-commit hook automatically during `npm install`.
| `bin/saddle.js` | CLI entry point |
| `scripts/install.js` | Main installer orchestrator |
| `scripts/install-core.js` | Core logic (profile discovery, linking, lockfile) |
| `scripts/reorg-core.js` | Reorganization scan, plan, transaction, rollback |
| `scripts/reorg.js` | `saddle reorg` CLI orchestration |
| `scripts/install-ui.mjs` | Ink TUI (ESM) |
| `scripts/load-config.js` | Config loading + rule normalisation |
| `scripts/tui/` | TUI components and utilities |
Expand All @@ -34,15 +36,16 @@ Husky will install a pre-commit hook automatically during `npm install`.
## Running Tests

```bash
npm test
pnpm test
```

All tests must pass before any PR is merged. The suite uses the Node.js built-in `node:test` runner — no additional test dependencies.

## Running the Linter

```bash
npm run lint:agents
pnpm lint
pnpm run lint:agents
```

This validates structural invariants (required files, executables, scripts, dependencies). It runs automatically on every commit via the Husky pre-commit hook.
Expand All @@ -57,6 +60,7 @@ saddle
saddle --dry-run --all
saddle --list
saddle --help
saddle reorg --source /tmp/saddle-fixture --dry-run
```

## Code Style
Expand All @@ -81,16 +85,21 @@ To add support for a new AI coding tool:

1. Create `rules/<toolname>.yaml` following the schema of an existing rule file
2. Add the tool to the support matrix in `README.md`
3. Run `npm test` to confirm nothing regressed
3. Add `schemaVersion: 2` and `reorg.assets` when the harness has reusable global definitions
4. Test both routing strategies and repeat-run idempotency
5. Run `pnpm test` to confirm nothing regressed

The installer picks up new rule files automatically via `loadRules()`.

See the **Writing Rules** section in `README.md` for the complete YAML schema, including:

- `tool`, `label`, `home`, `binary`, `enabled`, `mode`
- `mappings` for skills, files, and directories
- `reorg.assets` for canonical collections and universal/provider target locations
- `mode: single-select` for mutually exclusive options (vs. `multi-select` default)

Reorganization rules must use documented harness paths. A provider name such as DeepSeek is not itself a harness; map the actual client that owns the on-disk format (for example, Reasonix). Never include credential files or broad configuration homes in a reorganization asset.

## Reporting Issues

Please use the GitHub [issue tracker](https://github.com/ndizazzo/saddle/issues). Bug reports and feature requests are both welcome — use the templates provided.
Loading
Loading