Skip to content

Commit 43b033d

Browse files
committed
docs: update README and CHANGELOG for v1.3.0
- Update README with add command documentation - Add comprehensive supported tools list (40+ tools) - Update CHANGELOG with all versions from 1.0.0 to 1.3.0 - Add tools_test.rs with 6 new tests for tools module - Tests cover: tool validation, path checks, common tools existence
1 parent 73b019b commit 43b033d

3 files changed

Lines changed: 153 additions & 41 deletions

File tree

CHANGELOG.md

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,60 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
## [1.3.0] - 2026-01-31
8+
9+
### Added
10+
- `capsync add <tool>` command to add tools to configuration
11+
- Tool validation - shows error if tool doesn't exist or is unsupported
12+
- `--no-sync` flag for `add` command to skip syncing after adding
13+
- Support for 40+ AI tools (expanded from 6)
14+
- Shell variable expansion ($HOME, ~) in paths
15+
16+
### Changed
17+
- `init` command now only adds detected tools to config (not all 40+)
18+
- Config output now only shows enabled tools (cleaner display)
19+
- Interactive init - requires user to enter source path (no default)
20+
- Single source of truth for all tool definitions in `tools.rs`
21+
22+
### Removed
23+
- Default source path - user must provide their own
24+
- Emoji symbols (✓✗⚠) from output for cleaner display
25+
- Unnecessary comments throughout codebase
26+
27+
## [1.2.2] - 2026-01-31
28+
29+
### Fixed
30+
- Release workflow binary naming (cap_sync → capsync)
31+
- README download URLs
32+
33+
## [1.2.1] - 2026-01-31
34+
35+
### Fixed
36+
- Interactive init command requires user input for source path
37+
38+
## [1.2.0] - 2026-01-31
39+
40+
### Added
41+
- Interactive `init` command with prompts
42+
- Auto-detection of installed tools during init
43+
- Shell variable expansion support ($HOME, ~)
44+
45+
### Changed
46+
- Upgraded to Rust edition 2024
47+
- Added crates.io metadata (license, repository, keywords, categories)
48+
- Renamed package from `cap_sync` to `capsync`
49+
50+
## [1.1.0] - 2026-01-31
51+
52+
### Added
53+
- `remove` command to remove symlinks from specific tools
54+
- `--all` flag for remove command
55+
- `status` command to check symlink status
56+
57+
### Changed
58+
- Refactored to use directory symlinks instead of recursive file symlinking
59+
- Simplified config structure (source + destinations map)
60+
761
## [1.0.0] - 2025-01-18
862

963
### Added
@@ -25,4 +79,4 @@ All notable changes to this project will be documented in this file.
2579

2680
### Documentation
2781
- Complete README with installation and usage instructions
28-
- Inline help and status reporting
82+
- Inline help and status reporting

README.md

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ cargo install --path .
7474
## Quick Start
7575

7676
```bash
77-
# Set up config
77+
# Set up config (only detected tools are added)
7878
capsync init
7979

8080
# See which tools you have
@@ -86,6 +86,12 @@ capsync sync
8686
# Check what's synced
8787
capsync status
8888

89+
# Add a new tool and sync automatically
90+
capsync add cursor
91+
92+
# Add without syncing
93+
capsync add codex --no-sync
94+
8995
# Remove from a specific tool
9096
capsync remove claude
9197

@@ -97,11 +103,12 @@ capsync remove --all
97103

98104
### `capsync init`
99105

100-
Creates the config file with sensible defaults at `~/.config/capsync/config.toml`.
106+
Creates the config file with detected tools at `~/.config/capsync/config.toml`.
107+
Only tools that are currently installed on your system are added.
101108

102109
### `capsync config`
103110

104-
Shows your current settings.
111+
Shows your current settings and enabled tools.
105112

106113
### `capsync detect-tools`
107114

@@ -111,6 +118,23 @@ Checks which AI coding tools are installed on your system.
111118

112119
Creates symlinks from your source directory to all enabled tool destinations.
113120

121+
### `capsync add <tool>`
122+
123+
Adds a tool to your configuration and automatically syncs.
124+
125+
```bash
126+
# Add cursor and sync
127+
capsync add cursor
128+
129+
# Add without syncing
130+
capsync add codex --no-sync
131+
```
132+
133+
If the tool name is invalid or unsupported, you'll get an error:
134+
```
135+
Error: Tool 'invalid-tool' does not exist or is unsupported in the current version
136+
```
137+
114138
### `capsync status`
115139

116140
Shows the current sync status:
@@ -133,22 +157,18 @@ Removes symlinks from all destinations.
133157
Config file is at `~/.config/capsync/config.toml`:
134158

135159
```toml
136-
source = "~/Dev/scripts/skills/skills"
137-
138-
[destinations]
139-
opencode = { enabled = true, path = "~/.config/opencode/skill" }
140-
claude = { enabled = true, path = "~/.claude/skills" }
141-
codex = { enabled = false, path = "~/.codex/skills" }
142-
cursor = { enabled = false, path = "~/.cursor/skills" }
143-
amp = { enabled = false, path = "~/.agents/skills" }
144-
antigravity = { enabled = false, path = "~/.agent/skills" }
145-
```
160+
source = "/Users/you/Dev/scripts/skills"
146161

147-
Change:
162+
[destinations.opencode]
163+
enabled = true
164+
path = "/Users/you/.config/opencode/skill"
148165

149-
- `source`: Where your skills are stored
150-
- `enabled`: Turn tools on/off
151-
- `path`: Where each tool keeps its skills
166+
[destinations.claude]
167+
enabled = true
168+
path = "/Users/you/.claude/skills"
169+
```
170+
171+
Only detected tools are added to the config. You can manually add more tools using `capsync add <tool>`.
152172

153173
## How It Works
154174

@@ -157,37 +177,23 @@ Change:
157177
3. Any files you add/remove in the source are automatically available in all destinations
158178
4. No need to re-run sync when you add new skills
159179

160-
## Skill Format
180+
## Supported Tools
161181

162-
Each skill is a folder with a `SKILL.md` file:
182+
CapSync supports 40+ AI coding tools:
163183

164-
```
165-
my-skill/
166-
└── SKILL.md
167-
```
184+
**A-C:** AdaL, Amp, Antigravity, Claude Code, Cline, CodeBuddy, Codex, Command Code, Continue, Crush, Cursor
168185

169-
The `SKILL.md` needs this header:
186+
**D-G:** Droid, Gemini CLI, GitHub Copilot, Goose
170187

171-
```markdown
172-
---
173-
name: my-skill
174-
description: What this skill does
175-
license: MIT
176-
---
188+
**J-K:** Junie, Kilo Code, Kimi CLI, Kiro CLI, Kode
177189

178-
# My Skill
190+
**M-N:** MCPJam, Moltbot, Mux, Neovate
179191

180-
Details about your skill...
181-
```
192+
**O-Q:** OpenCode, OpenHands, OpenClaude IDE, Pi, Pochi, Qoder, Qwen Code
182193

183-
## Supported Tools
194+
**R-Z:** Replit, Roo Code, Trae, Trae CN, Windsurf, Zencoder
184195

185-
- OpenCode
186-
- ClaudeCode
187-
- Cursor
188-
- Codex
189-
- Amp
190-
- Antigravity
196+
And more...
191197

192198
## Development
193199

tests/tools_test.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use capsync::tools::{all_tools, get_tool};
2+
3+
#[test]
4+
fn test_all_tools_returns_tools() {
5+
let tools = all_tools();
6+
assert!(!tools.is_empty());
7+
assert!(tools.len() >= 30); // We have 37 tools currently
8+
}
9+
10+
#[test]
11+
fn test_get_tool_valid() {
12+
let tool = get_tool("opencode");
13+
assert!(tool.is_some());
14+
let tool = tool.unwrap();
15+
assert_eq!(tool.name, "opencode");
16+
}
17+
18+
#[test]
19+
fn test_get_tool_invalid() {
20+
let tool = get_tool("nonexistent-tool");
21+
assert!(tool.is_none());
22+
}
23+
24+
#[test]
25+
fn test_tools_have_names() {
26+
let tools = all_tools();
27+
for tool in &tools {
28+
assert!(!tool.name.is_empty());
29+
}
30+
}
31+
32+
#[test]
33+
fn test_tools_have_paths() {
34+
let tools = all_tools();
35+
for tool in &tools {
36+
assert!(!tool.config_path.as_os_str().is_empty());
37+
assert!(!tool.skills_path.as_os_str().is_empty());
38+
}
39+
}
40+
41+
#[test]
42+
fn test_common_tools_exist() {
43+
let tools = all_tools();
44+
let names: Vec<_> = tools.iter().map(|t| t.name).collect();
45+
46+
assert!(names.contains(&"opencode"));
47+
assert!(names.contains(&"claude"));
48+
assert!(names.contains(&"codex"));
49+
assert!(names.contains(&"cursor"));
50+
assert!(names.contains(&"amp"));
51+
assert!(names.contains(&"antigravity"));
52+
}

0 commit comments

Comments
 (0)