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.
@@ -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.
@@ -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"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+