@softspark/ai-toolkit 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/package.json +1 -1
- package/scripts/install_steps/symlinks.py +20 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,16 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## v1.3.1 — Patch (2026-04-07)
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Orphaned symlinks**: `install` and `update` now auto-clean broken agent/skill symlinks when components are removed or merged. Previously required manual `doctor --fix`.
|
|
14
|
+
- **`--auto-detect` without `--local`**: Now auto-adds `--local` with warning instead of scanning `$HOME` for language markers.
|
|
15
|
+
- **Session hooks concurrency**: `session-context.sh` writes per-session file (`${SESSION_ID}.json`) instead of single `current-context.json`. `pre-compact-save.sh` includes session ID in filename to avoid collisions.
|
|
16
|
+
- **Language rules injection**: `install --local --auto-detect` now actually injects detected language rules into project `.claude/CLAUDE.md` via `<!-- TOOLKIT:language-rules -->` markers.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
10
20
|
## v1.3.0 — Competitive Features Release (2026-04-07)
|
|
11
21
|
|
|
12
22
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softspark/ai-toolkit",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Professional-grade AI coding toolkit: 90 skills, 44 agents, multi-platform support (Claude, Cursor, Windsurf, Copilot, Gemini, Cline, Roo Code, Aider, Augment), machine-enforced safety constitution, persona presets, skill security auditor, expanded lifecycle hooks, 11 plugin packs, and benchmark tooling.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -36,7 +36,17 @@ def install_agents(claude_dir: Path, only: str, skip: str, dry_run: bool) -> Non
|
|
|
36
36
|
continue
|
|
37
37
|
target.symlink_to(agent_file)
|
|
38
38
|
linked += 1
|
|
39
|
+
|
|
40
|
+
# Clean orphaned symlinks (agents removed from toolkit)
|
|
41
|
+
orphaned = 0
|
|
42
|
+
for target in sorted(agents_dst.glob("*.md")):
|
|
43
|
+
if target.is_symlink() and not target.resolve().exists():
|
|
44
|
+
target.unlink()
|
|
45
|
+
orphaned += 1
|
|
46
|
+
|
|
39
47
|
print(f" Linked: .claude/agents/ ({linked} files)")
|
|
48
|
+
if orphaned > 0:
|
|
49
|
+
print(f" Cleaned: {orphaned} orphaned agent symlink(s)")
|
|
40
50
|
if skipped > 0:
|
|
41
51
|
print(f" Kept: {skipped} user agent(s) (name conflict)")
|
|
42
52
|
|
|
@@ -73,7 +83,17 @@ def install_skills(claude_dir: Path, only: str, skip: str, dry_run: bool) -> Non
|
|
|
73
83
|
continue
|
|
74
84
|
target.symlink_to(skill_dir)
|
|
75
85
|
linked += 1
|
|
86
|
+
|
|
87
|
+
# Clean orphaned symlinks (skills removed from toolkit)
|
|
88
|
+
orphaned = 0
|
|
89
|
+
for target in sorted(skills_dst.iterdir()):
|
|
90
|
+
if target.is_symlink() and not target.resolve().exists():
|
|
91
|
+
target.unlink()
|
|
92
|
+
orphaned += 1
|
|
93
|
+
|
|
76
94
|
print(f" Linked: .claude/skills/ ({linked} directories)")
|
|
95
|
+
if orphaned > 0:
|
|
96
|
+
print(f" Cleaned: {orphaned} orphaned skill symlink(s)")
|
|
77
97
|
if skipped > 0:
|
|
78
98
|
print(f" Kept: {skipped} user skill(s) (name conflict)")
|
|
79
99
|
|