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 +40 -0
- package/LICENSE +21 -0
- package/README.md +294 -0
- package/bin/pluribus.js +108 -0
- package/docs/composable-contexts.md +124 -0
- package/docs/openclaw-integration.md +145 -0
- package/docs/release-checklist.md +91 -0
- package/docs/remote-composable-context-imports.md +233 -0
- package/examples/claude-cowork/.cursorrules +82 -0
- package/examples/claude-cowork/pluribus.md +137 -0
- package/examples/composable-contexts/pluribus.md +29 -0
- package/examples/composable-contexts/shared/security-constraints.md +6 -0
- package/examples/composable-contexts/shared/team-context.md +10 -0
- package/examples/openclaw/AGENTS.md +134 -0
- package/examples/openclaw/CLAUDE.md +132 -0
- package/examples/openclaw/pluribus.md +99 -0
- package/package.json +52 -0
- package/spec/context-format.md +356 -0
- package/spec/skills-format.md +325 -0
- package/src/commands/init.js +153 -0
- package/src/commands/sync.js +213 -0
- package/src/commands/validate.js +146 -0
- package/src/commands/watch.js +111 -0
- package/src/index.js +11 -0
- package/src/skills/built-in.js +345 -0
- package/src/utils/args.js +35 -0
- package/src/utils/imports.js +690 -0
- package/src/utils/parser.js +74 -0
- package/src/utils/renderer.js +123 -0
- package/src/utils/version.js +1 -0
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
|
+
[](https://x.com/RibeiroCaioCLW)
|
|
4
|
+
[](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.*
|
package/bin/pluribus.js
ADDED
|
@@ -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`.
|