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
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

---

## [0.9.3] — 2026-04-08

### Changed

- Renamed bundled rule `oh-my-opencode.yaml` → `oh-my-openagent.yaml` to reflect the upstream package rename; tool identifier, labels, source paths, and target config filename updated throughout

---

## [0.9.2] — 2026-03-25

### Added
Expand All @@ -19,7 +27,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

### Changed

- `oh-my-opencode.yaml` now uses `mode: single-select` to prevent accidental installation of multiple conflicting provider configs
- `oh-my-opencode.yaml` now uses `mode: single-select` to prevent accidental installation of multiple conflicting provider configs (now renamed to `oh-my-openagent.yaml`)

---

Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,27 +220,27 @@ Control how users can select items from this rule:

- **`single-select`** — User can select only one profile from this rule at a time. UI shows radio buttons `(•)` / `( )`. Useful when alternatives are mutually exclusive (e.g., multiple config files targeting the same destination).

**Example:** `oh-my-opencode.yaml` has 3 file mappings all targeting `oh-my-opencode.json`. Setting `mode: single-select` ensures only one alternative config gets installed:
**Example:** `oh-my-openagent.yaml` has 3 file mappings all targeting `oh-my-openagent.json`. Setting `mode: single-select` ensures only one alternative config gets installed:

```yaml
tool: oh-my-opencode
tool: oh-my-openagent
label: OpenCode Config
home: ~/.config/opencode
enabled: true
mode: single-select # Only allow ONE of the three files

mappings:
- type: file
source: oh-my-opencode/config.openai.json
target: oh-my-opencode.json
source: oh-my-openagent/config.openai.json
target: oh-my-openagent.json

- type: file
source: oh-my-opencode/config.claude.json
target: oh-my-opencode.json
source: oh-my-openagent/config.claude.json
target: oh-my-openagent.json

- type: file
source: oh-my-opencode/config.copilot.json
target: oh-my-opencode.json
source: oh-my-openagent/config.copilot.json
target: oh-my-openagent.json
Comment thread
ndizazzo marked this conversation as resolved.
```

### Mapping Types
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "saddle-cli",
"version": "0.9.2",
"version": "0.9.3",
"description": "CLI that syncs AI coding tool configs (Claude, Codex, Copilot, Cursor, Gemini, OpenCode) across machines via symlinks",
"author": "ndizazzo",
"license": "MIT",
Expand All @@ -19,6 +19,7 @@
"copilot",
"gemini",
"opencode",
"oh-my-openagent",
"symlinks"
],
"files": [
Expand Down
16 changes: 16 additions & 0 deletions rules/oh-my-openagent.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
tool: oh-my-openagent
label: Oh My Openagent
home: ~/.config/opencode
enabled: true
mode: single-select

mappings:
- type: file
source: oh-my-openagent/oh-my-openagent.json.claude
target: oh-my-openagent.json
- type: file
source: oh-my-openagent/oh-my-openagent.json.openai
target: oh-my-openagent.json
- type: file
source: oh-my-openagent/oh-my-openagent.json.copilot
target: oh-my-openagent.json
17 changes: 0 additions & 17 deletions rules/oh-my-opencode.yaml

This file was deleted.

32 changes: 16 additions & 16 deletions tests/install-core.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,20 +80,20 @@ before(() => {
path.join(testRulesDir, "delta.yaml"),
[
"tool: delta",
"label: Oh My Opencode",
"label: Oh My Openagent",
`home: ${homeDelta}`,
"enabled: true",
"mode: single-select",
"mappings:",
" - type: file",
" source: oh-my-opencode/oh-my-opencode.json.openai",
" target: oh-my-opencode.json",
" source: oh-my-openagent/oh-my-openagent.json.openai",
" target: oh-my-openagent.json",
" - type: file",
" source: oh-my-opencode/oh-my-opencode.json.claude",
" target: oh-my-opencode.json",
" source: oh-my-openagent/oh-my-openagent.json.claude",
" target: oh-my-openagent.json",
" - type: file",
" source: oh-my-opencode/oh-my-opencode.json.copilot",
" target: oh-my-opencode.json",
" source: oh-my-openagent/oh-my-openagent.json.copilot",
" target: oh-my-openagent.json",
].join("\n"),
);

Expand Down Expand Up @@ -559,21 +559,21 @@ describe("discoverProfiles", () => {
});

it("keeps file labels distinct when one tool exposes multiple file mappings", () => {
mkfile(path.join(repoRoot, "oh-my-opencode", "oh-my-opencode.json.openai"), "{}");
mkfile(path.join(repoRoot, "oh-my-opencode", "oh-my-opencode.json.claude"), "{}");
mkfile(path.join(repoRoot, "oh-my-opencode", "oh-my-opencode.json.copilot"), "{}");
mkfile(path.join(repoRoot, "oh-my-openagent", "oh-my-openagent.json.openai"), "{}");
mkfile(path.join(repoRoot, "oh-my-openagent", "oh-my-openagent.json.claude"), "{}");
mkfile(path.join(repoRoot, "oh-my-openagent", "oh-my-openagent.json.copilot"), "{}");

const profiles = core.discoverProfiles(repoRoot, { alpha: false, beta: false, gamma: false, delta: true });
const deltaProfiles = profiles.filter((p) => p.tool === "delta");

assert.deepStrictEqual(deltaProfiles.map((profile) => profile.label).sort(), [
"oh-my-opencode.json.claude",
"oh-my-opencode.json.copilot",
"oh-my-opencode.json.openai",
"oh-my-openagent.json.claude",
"oh-my-openagent.json.copilot",
"oh-my-openagent.json.openai",
]);
assert.ok(
deltaProfiles.every(
(profile) => profile.description === `Links to ${path.join(homeDelta, "oh-my-opencode.json")}`,
(profile) => profile.description === `Links to ${path.join(homeDelta, "oh-my-openagent.json")}`,
),
);
});
Expand Down Expand Up @@ -656,8 +656,8 @@ describe("discoverProfiles", () => {
});

it("profiles inherit single-select mode from their rule", () => {
mkfile(path.join(repoRoot, "oh-my-opencode", "oh-my-opencode.json.openai"), "{}");
mkfile(path.join(repoRoot, "oh-my-opencode", "oh-my-opencode.json.claude"), "{}");
mkfile(path.join(repoRoot, "oh-my-openagent", "oh-my-openagent.json.openai"), "{}");
mkfile(path.join(repoRoot, "oh-my-openagent", "oh-my-openagent.json.claude"), "{}");
const profiles = core.discoverProfiles(repoRoot, { alpha: false, beta: false, gamma: false, delta: true });
const deltaProfiles = profiles.filter((p) => p.tool === "delta");
assert.ok(deltaProfiles.length > 0, "should have delta profiles");
Expand Down
Loading