pluribus-context 0.2.0

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 ADDED
@@ -0,0 +1,40 @@
1
+ # Changelog
2
+
3
+ All notable changes to Pluribus are documented here.
4
+
5
+ ## 0.2.0 — Package-ready CLI release
6
+
7
+ Pluribus 0.2.0 is the first npm-ready release of the CLI for keeping intentional AI context in one versioned source and syncing it to the files each tool expects. It supersedes the earlier GitHub-only v0.1.0 alpha release from March.
8
+
9
+ ### Added
10
+
11
+ - `pluribus init` to scaffold a project `pluribus.md` context file.
12
+ - `pluribus validate` to catch missing sections, unresolved imports, duplicated top-level sections, and invalid tool names before syncing.
13
+ - `pluribus sync` to generate tool-specific context files.
14
+ - `pluribus watch` to debounce edits to `pluribus.md` and keep generated files fresh during local development.
15
+ - Built-in adapters for:
16
+ - Claude Code (`CLAUDE.md`)
17
+ - Cursor (`.cursorrules`)
18
+ - GitHub Copilot (`.github/copilot-instructions.md`)
19
+ - OpenClaw (`AGENTS.md`)
20
+ - Zed (`.rules`)
21
+ - Windsurf (`.windsurf/rules/pluribus.md`)
22
+ - Continue (`.continue/rules/pluribus.md`)
23
+ - Local composable contexts via `# @import ./relative-file.md`.
24
+ - Explicit remote imports via `github:owner/repo/path.md[@ref]` and HTTPS URLs when running with `--update-imports`.
25
+ - Deterministic remote import lock/cache support through `pluribus.lock.json` and `.pluribus/cache/remote/`.
26
+ - Optional GitHub authentication for private GitHub imports through `GH_TOKEN`, `GITHUB_TOKEN`, or the logged-in GitHub CLI.
27
+ - Specs, examples, and docs for context format, adapter behavior, and composable contexts.
28
+
29
+ ### Notes
30
+
31
+ - The npm package name is `pluribus-context` because `pluribus` is already occupied on npm by an unrelated package.
32
+ - The installed binary is still `pluribus`.
33
+ - Remote imports never fetch during normal `sync`/`validate`; network refresh is explicit via `--update-imports`.
34
+ - Tokens are never written to the lockfile or cache.
35
+
36
+ ### Verification
37
+
38
+ - Local test suite: `npm test`.
39
+ - Package check: `npm pack --dry-run`.
40
+ - Publish check before release: `npm publish --dry-run`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Caio Ribeiro
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.
package/README.md ADDED
@@ -0,0 +1,294 @@
1
+ # Pluribus
2
+
3
+ [![Building in Public](https://img.shields.io/badge/building-in%20public-orange?style=flat-square)](https://x.com/RibeiroCaioCLW)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)
5
+
6
+ > Intentional context across every AI tool you use.
7
+
8
+ Pluribus keeps project instructions, conventions, constraints, and team context in one versioned source of truth, then syncs that context into the formats each AI tool expects.
9
+
10
+ It is **not** a persistent memory layer, retrieval system, agent orchestrator, or agent-merging framework. Think `CLAUDE.md`, `.cursorrules`, `copilot-instructions.md`, `AGENTS.md` — one intentional context, multiple generated outputs.
11
+
12
+ ---
13
+
14
+ ## The Problem
15
+
16
+ You use Claude, Copilot, Cursor, Windsurf, Continue, Zed, ChatGPT, and whatever ships next Tuesday.
17
+
18
+ Each one has its own way of understanding your project:
19
+ - `CLAUDE.md` for Claude Code
20
+ - `copilot-instructions.md` for GitHub Copilot
21
+ - `.cursorrules` for Cursor
22
+ - `AGENTS.md` for OpenClaw
23
+ - `.windsurf/rules/pluribus.md` for Windsurf Cascade
24
+ - `.continue/rules/pluribus.md` for Continue
25
+ - `.rules` for Zed
26
+
27
+ You end up maintaining **5+ files** that say roughly the same thing — your project's architecture, conventions, tech stack, who you are, what matters. Copy-paste across files. They drift. They rot. You forget to update one. Your AI gives you wrong answers because it's reading stale context.
28
+
29
+ **This is a multiplying problem.** Every new AI tool = another context file = more maintenance = more drift.
30
+
31
+ ## The Vision
32
+
33
+ **Pluribus** is a universal format for intentional context in AI-assisted development.
34
+
35
+ Write your project context **once**, in simple `.md` files. Pluribus syncs it to every tool you use — formatted exactly how each tool expects it.
36
+
37
+ ```
38
+ pluribus/
39
+ ├── context.md # Your project: stack, architecture, conventions
40
+ ├── identity.md # Who you are, your preferences, tone
41
+ ├── skills.md # What your AI should be good at
42
+ └── rules.md # Guardrails and constraints
43
+ ```
44
+
45
+ Then:
46
+
47
+ ```bash
48
+ npx pluribus-context sync
49
+ ```
50
+
51
+ And it generates the right files for each tool:
52
+ - `CLAUDE.md` ← for Claude Code
53
+ - `.github/copilot-instructions.md` ← for Copilot
54
+ - `.cursorrules` ← for Cursor
55
+ - `AGENTS.md` ← for OpenClaw
56
+ - `.windsurf/rules/pluribus.md` ← for Windsurf Cascade
57
+ - `.continue/rules/pluribus.md` ← for Continue
58
+ - `.rules` ← for Zed
59
+
60
+ **One source of truth. Zero drift.**
61
+
62
+ ## Why `.md`?
63
+
64
+ - It's **human-readable** — you can review it, version it, PR it
65
+ - It's **universal** — every tool already parses markdown
66
+ - It's **composable** — import shared contexts across projects
67
+ - It's **versionable** — git diff your AI context like you diff your code
68
+ - It's **simple** — no YAML schemas, minimal JSON only when you opt into locked remote imports
69
+
70
+ ## Getting Started
71
+
72
+ ### Install
73
+
74
+ ```bash
75
+ # From npm (once published)
76
+ npm install -g pluribus-context
77
+
78
+ # Or run directly with npx
79
+ npx pluribus-context
80
+
81
+ # Or clone and link locally
82
+ git clone https://github.com/caioribeiroclw-pixel/pluribus.git
83
+ cd pluribus
84
+ npm link
85
+ ```
86
+
87
+ ### Usage
88
+
89
+ **1. Initialize your context file**
90
+
91
+ ```bash
92
+ cd your-project/
93
+ pluribus init
94
+ ```
95
+
96
+ This creates `pluribus.md` with all required sections scaffolded. Fill in your project context.
97
+
98
+ You can also use flags for non-interactive init:
99
+
100
+ ```bash
101
+ pluribus init --name "Ana" --description "A background job runner" --tools claude,cursor,openclaw
102
+ ```
103
+
104
+ **2. Edit `pluribus.md`**
105
+
106
+ Fill in your context once:
107
+
108
+ ```markdown
109
+ # Identity
110
+ I am Ana, building **Conduit** — a background job runner for Node.js.
111
+
112
+ # Stack
113
+ - Language: TypeScript 5.4
114
+ - Runtime: Node.js 22 LTS
115
+ - ...
116
+
117
+ # Conventions
118
+ - async/await everywhere — no .then()/.catch()
119
+ - ...
120
+
121
+ # Goals
122
+ 1. Zero external infrastructure
123
+ 2. Type safety end-to-end
124
+ ...
125
+
126
+ # Constraints
127
+ - Never introduce native-compile dependencies
128
+ - ...
129
+ ```
130
+
131
+ **3. Compose shared context when needed**
132
+
133
+ For team or org-wide conventions, import shared Markdown files before your local project sections:
134
+
135
+ ```markdown
136
+ # @import ./shared/team-context.md
137
+ # @import ./shared/security-constraints.md
138
+
139
+ # Identity
140
+ I am Ana, building **Conduit** — a background job runner for Node.js.
141
+ ```
142
+
143
+ Local sections are applied after imported sections, so project-specific context can override shared context. See [Composable Contexts](docs/composable-contexts.md) for details.
144
+
145
+ **4. Validate before syncing**
146
+
147
+ ```bash
148
+ pluribus validate
149
+ ```
150
+
151
+ This checks that `pluribus.md` exists, imports resolve, required sections are present, top-level sections are not duplicated, and any `pluribus:tools` comment uses supported tool names.
152
+
153
+ If you use remote imports and want to refresh the lock/cache while validating:
154
+
155
+ ```bash
156
+ pluribus validate --update-imports
157
+ ```
158
+
159
+ **5. Sync to all your tools**
160
+
161
+ ```bash
162
+ pluribus sync
163
+ ```
164
+
165
+ If you use remote imports, refresh and pin them explicitly:
166
+
167
+ ```bash
168
+ pluribus sync --update-imports
169
+ ```
170
+
171
+ That writes `pluribus.lock.json` plus a local `.pluribus/cache/remote/` content cache. Future plain `pluribus sync` runs resolve those remote imports from the lock/cache without network access, and fail if cached bytes no longer match the recorded digest.
172
+
173
+ Private `github:` imports use existing GitHub credentials only during `--update-imports`: `GH_TOKEN`/`GITHUB_TOKEN` if set, otherwise the logged-in GitHub CLI (`gh auth token`). Tokens are never stored in the lockfile or cache. Commit `pluribus.lock.json`; treat `.pluribus/cache/remote/` as local, regenerable cache.
174
+
175
+ Output:
176
+ ```
177
+ 🔄 Syncing pluribus.md → claude, cursor, openclaw
178
+
179
+ ✅ [claude] → CLAUDE.md
180
+ ✅ [cursor] → .cursorrules
181
+ ✅ [openclaw] → AGENTS.md
182
+
183
+ ✅ Sync complete — 3 file(s) written.
184
+ ```
185
+
186
+ **Preview without writing (dry run):**
187
+
188
+ ```bash
189
+ pluribus sync --dry-run
190
+ ```
191
+
192
+ **Sync specific tools only:**
193
+
194
+ ```bash
195
+ pluribus sync --tools claude,openclaw
196
+ ```
197
+
198
+ **Keep tool files fresh while editing:**
199
+
200
+ ```bash
201
+ pluribus watch
202
+ ```
203
+
204
+ `watch` monitors `pluribus.md`, debounces rapid editor saves, and re-runs `sync` automatically. It accepts the same `--source`, `--tools`, and `--update-imports` options as `sync`.
205
+
206
+ For scripts/hooks that should exit after the first detected change-triggered sync:
207
+
208
+ ```bash
209
+ pluribus watch --once --tools claude,cursor
210
+ ```
211
+
212
+ ### Supported Tools
213
+
214
+ | Flag | Output file | AI Tool |
215
+ |---|---|---|
216
+ | `claude` | `CLAUDE.md` | Claude Code (Anthropic) |
217
+ | `cursor` | `.cursorrules` | Cursor AI editor |
218
+ | `openclaw` | `AGENTS.md` | OpenClaw agent runner |
219
+ | `copilot` | `.github/copilot-instructions.md` | GitHub Copilot |
220
+ | `zed` | `.rules` | Zed Editor |
221
+ | `windsurf` | `.windsurf/rules/pluribus.md` | Windsurf Cascade workspace rules |
222
+ | `continue` | `.continue/rules/pluribus.md` | Continue workspace rules |
223
+
224
+ ### Custom Skills
225
+
226
+ Add a `pluribus/skills/<tool>.md` file to override or extend any built-in skill.
227
+ See `spec/skills-format.md` for the skill file format.
228
+
229
+ ---
230
+
231
+ ## Status
232
+
233
+ 🚧 **Early development** — the spec and CLI are being built in public.
234
+
235
+ ### Roadmap
236
+
237
+ - [x] Problem definition & vision
238
+ - [x] Context format spec (`pluribus.md` flat format)
239
+ - [x] Skills format spec (extensible adapter system)
240
+ - [x] CLI: `pluribus init` — scaffold your context
241
+ - [x] CLI: `pluribus sync` — generate tool-specific files
242
+ - [x] OpenClaw integration (built-in skill)
243
+ - [x] Cursor integration (built-in skill)
244
+ - [x] Copilot integration (built-in skill)
245
+ - [x] Claude Code integration (built-in skill)
246
+ - [x] Zed Editor integration (built-in skill)
247
+ - [ ] Custom skill overrides (local `pluribus/skills/`)
248
+ - [x] Windsurf integration (built-in workspace rule)
249
+ - [x] Continue integration (built-in workspace rule)
250
+ - [x] `pluribus validate` command
251
+ - [x] `pluribus watch` command (debounced auto-sync on context changes)
252
+ - [x] Composable contexts MVP (local `# @import ./file.md`)
253
+ - [x] Remote composable contexts MVP (explicit `--update-imports`, public GitHub/HTTPS, safety limits)
254
+ - [x] Remote imports hardening (lockfile/cache/digest offline mode, optional GitHub auth, and CI coverage)
255
+ - [ ] CI/CD: auto-sync on commit
256
+ - [ ] Published to npm
257
+
258
+ ## Building in Public
259
+
260
+ I'm documenting every step of building Pluribus — the decisions, the trade-offs, the mistakes.
261
+
262
+ Follow along: [@RibeiroCaioCLW](https://x.com/RibeiroCaioCLW)
263
+
264
+ If you've felt this pain, [open an issue](https://github.com/caioribeiroclw-pixel/pluribus/issues) and tell me about your setup. What tools do you use? How do you manage context today? What's broken?
265
+
266
+ ## Docs
267
+
268
+ - [OpenClaw Integration](docs/openclaw-integration.md) — how Pluribus generates `AGENTS.md` for OpenClaw
269
+ - [Composable Contexts](docs/composable-contexts.md) — local/remote imports, merge behavior, and safety rules
270
+ - [Remote Composable Context Imports](docs/remote-composable-context-imports.md) — design notes for lockfile/cache/auth hardening
271
+ - [Context Format Spec](spec/context-format.md) — the `pluribus.md` format reference
272
+ - [Skills Format Spec](spec/skills-format.md) — how adapters work and how to write custom skills
273
+ - [Release Checklist](docs/release-checklist.md) — reproducible npm/GitHub release steps
274
+ - [Changelog](CHANGELOG.md) — user-facing release notes
275
+
276
+ ---
277
+
278
+ ## Contributing
279
+
280
+ This project is just getting started. The best way to help right now:
281
+
282
+ 1. ⭐ Star the repo if the problem resonates
283
+ 2. 🗣️ [Open an issue](https://github.com/caioribeiroclw-pixel/pluribus/issues) describing your context management pain
284
+ 3. 📣 Share with someone who maintains 3+ AI context files
285
+
286
+ Looking for first contributions? Check out the [open issues](https://github.com/caioribeiroclw-pixel/pluribus/issues). The next good contributions are release polish, CI/CD workflow examples, and real-world adapter feedback.
287
+
288
+ ## License
289
+
290
+ [MIT](LICENSE) — use it, fork it, build on it.
291
+
292
+ ---
293
+
294
+ *"E pluribus unum" — out of many, one.*
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Pluribus CLI — Write your AI context once. Sync it to every tool.
5
+ * Entry point: bin/pluribus.js
6
+ */
7
+
8
+ import { runInit } from '../src/commands/init.js'
9
+ import { runSync } from '../src/commands/sync.js'
10
+ import { runValidate } from '../src/commands/validate.js'
11
+ import { runWatch } from '../src/commands/watch.js'
12
+ import { parseArgs } from '../src/utils/args.js'
13
+ import { VERSION } from '../src/utils/version.js'
14
+
15
+ const HELP = `
16
+ Pluribus v${VERSION} — Write your AI context once. Sync it to every tool.
17
+
18
+ USAGE
19
+ pluribus <command> [options]
20
+
21
+ COMMANDS
22
+ init Create a pluribus.md file in the current directory
23
+ sync Read pluribus.md and generate tool-specific output files
24
+ validate Validate pluribus.md before syncing
25
+ watch Watch pluribus.md and auto-sync after changes
26
+ help Show this help message
27
+
28
+ OPTIONS (init)
29
+ --name Project/author name
30
+ --description One-line project description
31
+ --tools Comma-separated list of tools to enable (claude,cursor,openclaw)
32
+
33
+ OPTIONS (sync)
34
+ --dry-run Preview output without writing files
35
+ --tools Override which tools to sync (comma-separated)
36
+ --source Path to pluribus.md (default: ./pluribus.md)
37
+ --update-imports Explicitly allow fetching remote github:/https:// imports
38
+
39
+ OPTIONS (validate)
40
+ --source Path to pluribus.md (default: ./pluribus.md)
41
+ --update-imports Refresh remote github:/https:// imports before validating
42
+
43
+ OPTIONS (watch)
44
+ --source Path to pluribus.md (default: ./pluribus.md)
45
+ --tools Override which tools to sync (comma-separated)
46
+ --update-imports Explicitly allow fetching remote github:/https:// imports
47
+ --once Exit after the first change-triggered sync
48
+ --debounce Debounce delay in ms (minimum 300, default 400)
49
+
50
+ EXAMPLES
51
+ pluribus init
52
+ pluribus init --name "Ana" --description "A task manager" --tools claude,cursor
53
+ pluribus sync
54
+ pluribus sync --dry-run
55
+ pluribus sync --tools claude,openclaw
56
+ pluribus sync --update-imports
57
+ pluribus validate
58
+ pluribus watch --tools claude,cursor
59
+
60
+ DOCS
61
+ https://github.com/caioribeiroclw-pixel/pluribus
62
+ `
63
+
64
+ async function main() {
65
+ const args = process.argv.slice(2)
66
+
67
+ if (args.length === 0 || args[0] === 'help' || args[0] === '--help' || args[0] === '-h') {
68
+ console.log(HELP)
69
+ process.exit(0)
70
+ }
71
+
72
+ if (args[0] === '--version' || args[0] === '-v') {
73
+ console.log(VERSION)
74
+ process.exit(0)
75
+ }
76
+
77
+ const command = args[0]
78
+ const parsedArgs = parseArgs(args.slice(1))
79
+
80
+ try {
81
+ switch (command) {
82
+ case 'init':
83
+ await runInit(parsedArgs)
84
+ break
85
+ case 'sync':
86
+ await runSync(parsedArgs)
87
+ break
88
+ case 'validate':
89
+ await runValidate(parsedArgs)
90
+ break
91
+ case 'watch':
92
+ await runWatch(parsedArgs)
93
+ break
94
+ default:
95
+ console.error(`❌ Unknown command: "${command}"`)
96
+ console.log(`Run \`pluribus help\` for usage.`)
97
+ process.exit(1)
98
+ }
99
+ } catch (err) {
100
+ console.error(`❌ ${err.message || err}`)
101
+ if (process.env.DEBUG) {
102
+ console.error(err)
103
+ }
104
+ process.exit(1)
105
+ }
106
+ }
107
+
108
+ main()
@@ -0,0 +1,124 @@
1
+ # Composable Contexts
2
+
3
+ Pluribus supports context imports so teams can share a base context and let each project add or override what is specific to that repo.
4
+
5
+ Use this when you have one set of org/team conventions that should be inherited by multiple projects, but each project still needs its own stack, goals, constraints, or examples.
6
+
7
+ ## Import syntax
8
+
9
+ Add import directives near the top of `pluribus.md`:
10
+
11
+ ```markdown
12
+ # @import ./shared/team-context.md
13
+ # @import ./shared/security-constraints.md
14
+
15
+ # Identity
16
+ I am Ana, building **Conduit** — a background job runner for Node.js.
17
+
18
+ # Goals
19
+ 1. Ship a small, reliable CLI first
20
+ 2. Keep runtime dependencies minimal
21
+ ```
22
+
23
+ Import paths are resolved relative to the file that contains the directive.
24
+
25
+ ## Merge behavior
26
+
27
+ Imported files are expanded before the local file content. That means local sections win when a section appears in both places:
28
+
29
+ ```markdown
30
+ # @import ./shared/base-context.md
31
+
32
+ # Conventions
33
+ Project-specific conventions override the shared `# Conventions` section.
34
+ ```
35
+
36
+ This keeps the inheritance model simple:
37
+
38
+ 1. shared/org context first
39
+ 2. team context next
40
+ 3. project-local context last
41
+
42
+ ## Safety rules
43
+
44
+ Local imports are deterministic by default:
45
+
46
+ - ✅ `# @import ./relative/path.md`
47
+ - ✅ nested imports up to depth `5`
48
+ - ✅ cycle detection
49
+ - ✅ path-escape protection outside the project root
50
+ - ❌ shell execution during import resolution
51
+
52
+ Remote imports are explicit opt-in via `pluribus sync --update-imports`:
53
+
54
+ - ✅ `github:owner/repo/path.md[@ref]` public raw imports
55
+ - ✅ optional private `github:` imports via existing `GH_TOKEN`/`GITHUB_TOKEN` or logged-in `gh`
56
+ - ✅ direct `https://...` Markdown/text imports
57
+ - ✅ HTTPS only; `http://` is rejected
58
+ - ✅ request timeout, redirect limit, UTF-8/text content checks, per-file and merged-size limits
59
+ - ✅ credential-bearing URLs are rejected/redacted in errors
60
+ - ✅ nested relative imports inside `github:` resources stay in the same repo/ref
61
+ - ✅ `pluribus sync --update-imports` writes `pluribus.lock.json` and `.pluribus/cache/remote/`
62
+ - ✅ later plain `pluribus sync` runs reuse the locked cache offline with SHA-256 verification
63
+ - ❌ relative imports from arbitrary HTTPS documents
64
+ - ❌ inline tokens in import specs, CLI flags, lockfiles, cache metadata, logs, or errors
65
+
66
+ Remote imports are deliberately disabled unless `--update-imports` is passed so normal sync runs do not perform silent network access. Once a remote import is locked, normal sync runs read it from the local cache instead of the network. If a remote import has no lock entry/cache yet, sync fails closed and asks you to refresh with `--update-imports`. GitHub credentials are used only while refreshing private `github:` imports; tokens are never written to `pluribus.lock.json` or `.pluribus/cache/remote/`. Commit the lockfile for deterministic CI/offline syncs; treat the cache as local and regenerable.
67
+
68
+ ## Example layout
69
+
70
+ ```text
71
+ my-project/
72
+ ├── pluribus.md
73
+ └── shared/
74
+ ├── team-context.md
75
+ └── security-constraints.md
76
+ ```
77
+
78
+ `pluribus.md`:
79
+
80
+ ```markdown
81
+ # @import ./shared/team-context.md
82
+ # @import ./shared/security-constraints.md
83
+
84
+ # Identity
85
+ I am Ana, building **Conduit** — a background job runner for Node.js.
86
+
87
+ # Stack
88
+ - Node.js 22 LTS
89
+ - TypeScript strict mode
90
+
91
+ # Goals
92
+ 1. Ship the CLI first
93
+ 2. Keep install size small
94
+ ```
95
+
96
+ `shared/team-context.md`:
97
+
98
+ ```markdown
99
+ # Conventions
100
+ - Prefer small, explicit functions
101
+ - Use named exports only
102
+ - Tests live next to the source file
103
+ ```
104
+
105
+ `shared/security-constraints.md`:
106
+
107
+ ```markdown
108
+ # Constraints
109
+ - Never execute shell commands from context files
110
+ - Never write outside the project root
111
+ - Never add network calls without explicit review
112
+ ```
113
+
114
+ Then run:
115
+
116
+ ```bash
117
+ pluribus sync --dry-run
118
+ ```
119
+
120
+ Pluribus resolves the imports, parses the merged context, and generates the selected tool files from the resolved content.
121
+
122
+ ## Current limitation
123
+
124
+ The current parser treats top-level section names as unique, and the later section wins if a duplicate appears after imports. Use duplicate sections deliberately for overrides; if you want additive behavior, put shared and local details under different section names such as `# Team` and `# Workflow`.