symlegion 0.1.0__tar.gz
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.
- symlegion-0.1.0/LICENSE +21 -0
- symlegion-0.1.0/PKG-INFO +226 -0
- symlegion-0.1.0/README.md +197 -0
- symlegion-0.1.0/pyproject.toml +44 -0
- symlegion-0.1.0/setup.cfg +4 -0
- symlegion-0.1.0/symlegion.egg-info/PKG-INFO +226 -0
- symlegion-0.1.0/symlegion.egg-info/SOURCES.txt +12 -0
- symlegion-0.1.0/symlegion.egg-info/dependency_links.txt +1 -0
- symlegion-0.1.0/symlegion.egg-info/entry_points.txt +2 -0
- symlegion-0.1.0/symlegion.egg-info/top_level.txt +1 -0
- symlegion-0.1.0/symlegion.py +568 -0
- symlegion-0.1.0/tests/test_config.py +27 -0
- symlegion-0.1.0/tests/test_integration.py +44 -0
- symlegion-0.1.0/tests/test_symlink.py +15 -0
symlegion-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Martin Mose Facondini
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
symlegion-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: symlegion
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Keep AI instruction files in sync using symlinks
|
|
5
|
+
Author: Martin Mose Facondini
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/jmb-yolo-mode/symlegion
|
|
8
|
+
Project-URL: Repository, https://github.com/jmb-yolo-mode/symlegion
|
|
9
|
+
Project-URL: Issues, https://github.com/jmb-yolo-mode/symlegion/issues
|
|
10
|
+
Keywords: ai,cli,instructions,symlink,tooling
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
23
|
+
Classifier: Topic :: Software Development :: Version Control
|
|
24
|
+
Classifier: Topic :: Utilities
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
# Symlegion
|
|
31
|
+
|
|
32
|
+
Keep your AI instruction files in sync with **zero magic** — just symlinks.
|
|
33
|
+
|
|
34
|
+
> Credit: **Symlegion** is a Python port of the original [`agentlink`](https://github.com/martinmose/agentlink) tool by Martin Mose Hansen.
|
|
35
|
+
|
|
36
|
+
Different tools want different files at project root: `AGENTS.md` (OpenAI/Codex, OpenCode), `CLAUDE.md` (Claude Code), `GEMINI.md`, etc. There's no standard, and I'm not waiting for one. **Symlegion** solves the basic need: keep your **personal** instruction files (in `~`) and your **project** instruction files in sync **without generators**. Edit one, they all reflect it.
|
|
37
|
+
|
|
38
|
+
Creating instruction files is easy with `/init` commands, but keeping them up to date is the hard part — and expensive too. Good instruction files are often crucial and make a huge difference when using agentic tools. Since they're so important, these files are typically generated with expensive models. Why pay repeatedly to regenerate similar content across different tools?
|
|
39
|
+
|
|
40
|
+
**Future-proof by design:** We don't know what tomorrow brings in the AI tooling space, but symlegion is ready. New tool expects `.newtool/ai-config.md`? Just add it to your config. Complex nested structure like `workspace/ai/tools/newframework/instructions.md`? No problem. Symlegion automatically creates the directories and symlinks without any code changes needed.
|
|
41
|
+
|
|
42
|
+
> Scope: **instruction files only**. No MCP `.mcp.json` or chain configs. Simple on purpose.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Why Symlegion?
|
|
47
|
+
|
|
48
|
+
- **One real file, many aliases** — pick a *source* (`CLAUDE.md` or `AGENTS.md` or whatever), symlink the rest.
|
|
49
|
+
- **No codegen** — no templates, no transforms, no surprise diffs.
|
|
50
|
+
- **Project + global** — works in repos *and* under `~/.config/…`.
|
|
51
|
+
- **Idempotent** — re-run safely; it fixes broken/misdirected links.
|
|
52
|
+
- **Portable** — works on macOS and Linux.
|
|
53
|
+
- **Future-ready** — handles any directory structure, automatically creates paths. Tomorrow's AI tool? Just add its path.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## How it works
|
|
58
|
+
|
|
59
|
+
You tell Symlegion which file is the **source**, and which other files should **link** to it. Symlegion creates/fixes symlinks accordingly.
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
# .symlegion.yaml (in project root)
|
|
63
|
+
source: CLAUDE.md
|
|
64
|
+
links:
|
|
65
|
+
- AGENTS.md # OpenCode, Codex
|
|
66
|
+
- .github/copilot-instructions.md # GitHub Copilot
|
|
67
|
+
- .cursorrules # Cursor AI
|
|
68
|
+
- GEMINI.md # Gemini CLI
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Result:
|
|
72
|
+
```
|
|
73
|
+
./CLAUDE.md # real file you edit
|
|
74
|
+
./AGENTS.md -> CLAUDE.md (symlink)
|
|
75
|
+
./.github/copilot-instructions.md -> ../CLAUDE.md (symlink)
|
|
76
|
+
./.cursorrules -> CLAUDE.md (symlink)
|
|
77
|
+
./GEMINI.md -> CLAUDE.md (symlink)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Global mode (in HOME) is the same idea:
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
# ~/.config/symlegion/config.yaml
|
|
84
|
+
source: ~/.config/claude/CLAUDE.md
|
|
85
|
+
links:
|
|
86
|
+
- ~/.config/opencode/AGENTS.md
|
|
87
|
+
- ~/.config/some-tool/INSTRUCTIONS.md
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Install
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
uv tool install symlegion
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Or run without installing:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
uv run symlegion.py --help
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Usage
|
|
107
|
+
|
|
108
|
+
### Getting started
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Initialize in your project
|
|
112
|
+
symlegion init
|
|
113
|
+
|
|
114
|
+
# Edit the created .symlegion.yaml to match your needs
|
|
115
|
+
# Create your source file (e.g., CLAUDE.md)
|
|
116
|
+
|
|
117
|
+
# Sync to create symlinks
|
|
118
|
+
symlegion sync
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Commands
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
symlegion init
|
|
125
|
+
symlegion sync
|
|
126
|
+
symlegion check
|
|
127
|
+
symlegion clean
|
|
128
|
+
symlegion doctor
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Helpful flags
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
symlegion sync --dry-run
|
|
135
|
+
symlegion sync --force
|
|
136
|
+
symlegion --verbose sync
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Without init (auto-config)
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
symlegion sync
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
What it does:
|
|
146
|
+
- Reads `.symlegion.yaml` in CWD.
|
|
147
|
+
- Creates/fixes symlinks listed under `links:` so they point to `source`.
|
|
148
|
+
|
|
149
|
+
If there's **no** `.symlegion.yaml` in CWD:
|
|
150
|
+
- Falls back to `~/.config/symlegion/config.yaml` (global).
|
|
151
|
+
- If missing, it **auto-creates** a sane default and tells you.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Config
|
|
156
|
+
|
|
157
|
+
### Project config (recommended)
|
|
158
|
+
|
|
159
|
+
Place a single file at repo root:
|
|
160
|
+
|
|
161
|
+
`.symlegion.yaml`
|
|
162
|
+
```yaml
|
|
163
|
+
source: CLAUDE.md
|
|
164
|
+
links:
|
|
165
|
+
- AGENTS.md
|
|
166
|
+
- OPENCODE.md
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Notes:
|
|
170
|
+
- **`source` must be a real file**, not a symlink (Symlegion warns if it is).
|
|
171
|
+
- Paths in `links` are relative to the project root.
|
|
172
|
+
|
|
173
|
+
### Global config
|
|
174
|
+
|
|
175
|
+
`~/.config/symlegion/config.yaml`
|
|
176
|
+
```yaml
|
|
177
|
+
source: ~/.config/claude/CLAUDE.md
|
|
178
|
+
links:
|
|
179
|
+
- ~/.config/opencode/AGENTS.md
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Platform notes
|
|
185
|
+
|
|
186
|
+
- **macOS + Linux**: standard POSIX symlinks (`ln -s`) — works the same.
|
|
187
|
+
- **Git**: symlinks are stored as links (not file copies). That's fine; teams who dislike that can add them to `.gitignore`.
|
|
188
|
+
|
|
189
|
+
### Gitignore patterns
|
|
190
|
+
|
|
191
|
+
Since symlegion creates multiple instruction files but only one is the real source, you can gitignore all AI instruction files except your chosen source:
|
|
192
|
+
|
|
193
|
+
```gitignore
|
|
194
|
+
# Ignore all AI instruction files
|
|
195
|
+
AGENTS.md
|
|
196
|
+
CLAUDE.md
|
|
197
|
+
GEMINI.md
|
|
198
|
+
OPENCODE.md
|
|
199
|
+
.cursorrules
|
|
200
|
+
.github/copilot-instructions.md
|
|
201
|
+
|
|
202
|
+
# But track your chosen source file (example: tracking CLAUDE.md)
|
|
203
|
+
!CLAUDE.md
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
This keeps your repository clean while ensuring your source file is version controlled. Symlegion will create the source file if it doesn't exist when running `sync`.
|
|
207
|
+
- **Editors/IDEs**: most follow symlinks transparently.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## FAQ
|
|
212
|
+
|
|
213
|
+
**Why not templates or generators?**
|
|
214
|
+
Because 90% of the time the files **should be identical**. When they're not, this tool isn't the right fit (or add a second source and stop linking that one).
|
|
215
|
+
|
|
216
|
+
**What if my source differs per project?**
|
|
217
|
+
Perfect—put a `.symlegion.yaml` in each repo and choose the source you actually edit there.
|
|
218
|
+
|
|
219
|
+
**Can the source be `AGENTS.md` instead of `CLAUDE.md`?**
|
|
220
|
+
Yes. The source is *whatever you want to edit*. The others link to it.
|
|
221
|
+
|
|
222
|
+
**What happens when a new AI tool comes out?**
|
|
223
|
+
Just add its expected path to your config. If "SuperCoder AI" expects `.supercoder/prompts/main.md`, add that path and run `symlegion sync`. Directories are created automatically, symlink points to your source file. Zero code changes, zero updates needed.
|
|
224
|
+
|
|
225
|
+
**MCP / `.mcp.json`?**
|
|
226
|
+
Out of scope. Formats differ between tools; symlinking a single JSON to multiple consumers usually doesn't make sense.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Symlegion
|
|
2
|
+
|
|
3
|
+
Keep your AI instruction files in sync with **zero magic** — just symlinks.
|
|
4
|
+
|
|
5
|
+
> Credit: **Symlegion** is a Python port of the original [`agentlink`](https://github.com/martinmose/agentlink) tool by Martin Mose Hansen.
|
|
6
|
+
|
|
7
|
+
Different tools want different files at project root: `AGENTS.md` (OpenAI/Codex, OpenCode), `CLAUDE.md` (Claude Code), `GEMINI.md`, etc. There's no standard, and I'm not waiting for one. **Symlegion** solves the basic need: keep your **personal** instruction files (in `~`) and your **project** instruction files in sync **without generators**. Edit one, they all reflect it.
|
|
8
|
+
|
|
9
|
+
Creating instruction files is easy with `/init` commands, but keeping them up to date is the hard part — and expensive too. Good instruction files are often crucial and make a huge difference when using agentic tools. Since they're so important, these files are typically generated with expensive models. Why pay repeatedly to regenerate similar content across different tools?
|
|
10
|
+
|
|
11
|
+
**Future-proof by design:** We don't know what tomorrow brings in the AI tooling space, but symlegion is ready. New tool expects `.newtool/ai-config.md`? Just add it to your config. Complex nested structure like `workspace/ai/tools/newframework/instructions.md`? No problem. Symlegion automatically creates the directories and symlinks without any code changes needed.
|
|
12
|
+
|
|
13
|
+
> Scope: **instruction files only**. No MCP `.mcp.json` or chain configs. Simple on purpose.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Why Symlegion?
|
|
18
|
+
|
|
19
|
+
- **One real file, many aliases** — pick a *source* (`CLAUDE.md` or `AGENTS.md` or whatever), symlink the rest.
|
|
20
|
+
- **No codegen** — no templates, no transforms, no surprise diffs.
|
|
21
|
+
- **Project + global** — works in repos *and* under `~/.config/…`.
|
|
22
|
+
- **Idempotent** — re-run safely; it fixes broken/misdirected links.
|
|
23
|
+
- **Portable** — works on macOS and Linux.
|
|
24
|
+
- **Future-ready** — handles any directory structure, automatically creates paths. Tomorrow's AI tool? Just add its path.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## How it works
|
|
29
|
+
|
|
30
|
+
You tell Symlegion which file is the **source**, and which other files should **link** to it. Symlegion creates/fixes symlinks accordingly.
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
# .symlegion.yaml (in project root)
|
|
34
|
+
source: CLAUDE.md
|
|
35
|
+
links:
|
|
36
|
+
- AGENTS.md # OpenCode, Codex
|
|
37
|
+
- .github/copilot-instructions.md # GitHub Copilot
|
|
38
|
+
- .cursorrules # Cursor AI
|
|
39
|
+
- GEMINI.md # Gemini CLI
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Result:
|
|
43
|
+
```
|
|
44
|
+
./CLAUDE.md # real file you edit
|
|
45
|
+
./AGENTS.md -> CLAUDE.md (symlink)
|
|
46
|
+
./.github/copilot-instructions.md -> ../CLAUDE.md (symlink)
|
|
47
|
+
./.cursorrules -> CLAUDE.md (symlink)
|
|
48
|
+
./GEMINI.md -> CLAUDE.md (symlink)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Global mode (in HOME) is the same idea:
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
# ~/.config/symlegion/config.yaml
|
|
55
|
+
source: ~/.config/claude/CLAUDE.md
|
|
56
|
+
links:
|
|
57
|
+
- ~/.config/opencode/AGENTS.md
|
|
58
|
+
- ~/.config/some-tool/INSTRUCTIONS.md
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Install
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
uv tool install symlegion
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Or run without installing:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
uv run symlegion.py --help
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Usage
|
|
78
|
+
|
|
79
|
+
### Getting started
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Initialize in your project
|
|
83
|
+
symlegion init
|
|
84
|
+
|
|
85
|
+
# Edit the created .symlegion.yaml to match your needs
|
|
86
|
+
# Create your source file (e.g., CLAUDE.md)
|
|
87
|
+
|
|
88
|
+
# Sync to create symlinks
|
|
89
|
+
symlegion sync
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Commands
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
symlegion init
|
|
96
|
+
symlegion sync
|
|
97
|
+
symlegion check
|
|
98
|
+
symlegion clean
|
|
99
|
+
symlegion doctor
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Helpful flags
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
symlegion sync --dry-run
|
|
106
|
+
symlegion sync --force
|
|
107
|
+
symlegion --verbose sync
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Without init (auto-config)
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
symlegion sync
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
What it does:
|
|
117
|
+
- Reads `.symlegion.yaml` in CWD.
|
|
118
|
+
- Creates/fixes symlinks listed under `links:` so they point to `source`.
|
|
119
|
+
|
|
120
|
+
If there's **no** `.symlegion.yaml` in CWD:
|
|
121
|
+
- Falls back to `~/.config/symlegion/config.yaml` (global).
|
|
122
|
+
- If missing, it **auto-creates** a sane default and tells you.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Config
|
|
127
|
+
|
|
128
|
+
### Project config (recommended)
|
|
129
|
+
|
|
130
|
+
Place a single file at repo root:
|
|
131
|
+
|
|
132
|
+
`.symlegion.yaml`
|
|
133
|
+
```yaml
|
|
134
|
+
source: CLAUDE.md
|
|
135
|
+
links:
|
|
136
|
+
- AGENTS.md
|
|
137
|
+
- OPENCODE.md
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Notes:
|
|
141
|
+
- **`source` must be a real file**, not a symlink (Symlegion warns if it is).
|
|
142
|
+
- Paths in `links` are relative to the project root.
|
|
143
|
+
|
|
144
|
+
### Global config
|
|
145
|
+
|
|
146
|
+
`~/.config/symlegion/config.yaml`
|
|
147
|
+
```yaml
|
|
148
|
+
source: ~/.config/claude/CLAUDE.md
|
|
149
|
+
links:
|
|
150
|
+
- ~/.config/opencode/AGENTS.md
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Platform notes
|
|
156
|
+
|
|
157
|
+
- **macOS + Linux**: standard POSIX symlinks (`ln -s`) — works the same.
|
|
158
|
+
- **Git**: symlinks are stored as links (not file copies). That's fine; teams who dislike that can add them to `.gitignore`.
|
|
159
|
+
|
|
160
|
+
### Gitignore patterns
|
|
161
|
+
|
|
162
|
+
Since symlegion creates multiple instruction files but only one is the real source, you can gitignore all AI instruction files except your chosen source:
|
|
163
|
+
|
|
164
|
+
```gitignore
|
|
165
|
+
# Ignore all AI instruction files
|
|
166
|
+
AGENTS.md
|
|
167
|
+
CLAUDE.md
|
|
168
|
+
GEMINI.md
|
|
169
|
+
OPENCODE.md
|
|
170
|
+
.cursorrules
|
|
171
|
+
.github/copilot-instructions.md
|
|
172
|
+
|
|
173
|
+
# But track your chosen source file (example: tracking CLAUDE.md)
|
|
174
|
+
!CLAUDE.md
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
This keeps your repository clean while ensuring your source file is version controlled. Symlegion will create the source file if it doesn't exist when running `sync`.
|
|
178
|
+
- **Editors/IDEs**: most follow symlinks transparently.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## FAQ
|
|
183
|
+
|
|
184
|
+
**Why not templates or generators?**
|
|
185
|
+
Because 90% of the time the files **should be identical**. When they're not, this tool isn't the right fit (or add a second source and stop linking that one).
|
|
186
|
+
|
|
187
|
+
**What if my source differs per project?**
|
|
188
|
+
Perfect—put a `.symlegion.yaml` in each repo and choose the source you actually edit there.
|
|
189
|
+
|
|
190
|
+
**Can the source be `AGENTS.md` instead of `CLAUDE.md`?**
|
|
191
|
+
Yes. The source is *whatever you want to edit*. The others link to it.
|
|
192
|
+
|
|
193
|
+
**What happens when a new AI tool comes out?**
|
|
194
|
+
Just add its expected path to your config. If "SuperCoder AI" expects `.supercoder/prompts/main.md`, add that path and run `symlegion sync`. Directories are created automatically, symlink points to your source file. Zero code changes, zero updates needed.
|
|
195
|
+
|
|
196
|
+
**MCP / `.mcp.json`?**
|
|
197
|
+
Out of scope. Formats differ between tools; symlinking a single JSON to multiple consumers usually doesn't make sense.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "symlegion"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Keep AI instruction files in sync using symlinks"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
license-files = ["LICENSE"]
|
|
9
|
+
authors = [
|
|
10
|
+
{ name = "Martin Mose Facondini" },
|
|
11
|
+
]
|
|
12
|
+
keywords = ["ai", "cli", "instructions", "symlink", "tooling"]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 3 - Alpha",
|
|
15
|
+
"Environment :: Console",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"Operating System :: MacOS",
|
|
18
|
+
"Operating System :: POSIX :: Linux",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Topic :: Software Development :: Build Tools",
|
|
26
|
+
"Topic :: Software Development :: Version Control",
|
|
27
|
+
"Topic :: Utilities",
|
|
28
|
+
]
|
|
29
|
+
dependencies = []
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
Homepage = "https://github.com/jmb-yolo-mode/symlegion"
|
|
33
|
+
Repository = "https://github.com/jmb-yolo-mode/symlegion"
|
|
34
|
+
Issues = "https://github.com/jmb-yolo-mode/symlegion/issues"
|
|
35
|
+
|
|
36
|
+
[project.scripts]
|
|
37
|
+
symlegion = "symlegion:main"
|
|
38
|
+
|
|
39
|
+
[tool.setuptools]
|
|
40
|
+
py-modules = ["symlegion"]
|
|
41
|
+
|
|
42
|
+
[build-system]
|
|
43
|
+
requires = ["setuptools>=69", "wheel"]
|
|
44
|
+
build-backend = "setuptools.build_meta"
|