This repository ships under two licenses (see README.md → Licensing):
| Path | License | SPDX identifier |
|---|---|---|
pipeline/** |
Business Source License 1.1 (pipeline/LICENSE) |
BUSL-1.1 |
everything else (root files, plugin/**, gateway/**, docs/**, .github/**) |
MIT (root LICENSE) |
MIT |
By contributing you agree that your contribution is licensed under the license that governs the path it lands in.
Every source file that supports comments carries an SPDX license identifier as its first line (second line if the file starts with a shebang), matching the table above.
Formats per file type:
// SPDX-License-Identifier: MIT (.js — plugin/, gateway/)
// SPDX-License-Identifier: BUSL-1.1 (.js — pipeline/code/**)#!/usr/bin/env bash
# SPDX-License-Identifier: MIT (.sh — after the shebang)# SPDX-License-Identifier: MIT (.yaml / .yml / .toml / .toml.example)<!-- SPDX-License-Identifier: MIT --> (.md — invisible when rendered)Exemptions (files that cannot or should not carry a header):
*.json— JSON has no comments; JSON files are licensed by path per the table above. Do not add pseudo-comment keys for this.LICENSE,pipeline/LICENSE— they are the license texts.VERSION— single-line SemVer value, machine-read.- Vault templates under
plugin/templates/vault-skeleton/andplugin/templates/frontmatter/— these are copied verbatim into user vaults; a kit license header inside a user's own document would be wrong. They are MIT by path. - Synthetic fixtures under
pipeline/fixtures/(JSON anyway) — BUSL-1.1 by path.
CI lints SPDX headers against path (spdx-lint job in
.github/workflows/ci.yml); a missing or path-mismatched identifier fails the
build.
VERSION(root, SemVer) is the single source of truth. It must equalplugin/.claude-plugin/plugin.json .versionand the release tagvX.Y.Z— theversion-consistencyCI job enforces this.- Every user-visible change gets a
CHANGELOG.mdentry (Keep a Changelog format). - Release: bump
VERSION+plugin.json+ changelog in one PR → tagvX.Y.Z→ GitHub Release with the changelog excerpt.
- No secrets, ever — not in code, not in fixtures, not in tenant examples.
Placeholders (
__*_PLACEHOLDER__) only.sanitize-check.shand secret scanning run in CI on every PR. - No real-tenant data — fixtures use fictional teams only. Anything that looks like a real person, company coordinate, or live workflow ID fails the sanitize gate.
- Procedures (
plugin/procedures/*.md) are the single source of truth for skill logic;plugin/skills/*/SKILL.mdfiles are thin wrappers (≤40 lines, no procedure steps) — the procedure-sync CI lint enforces the split.