-
Notifications
You must be signed in to change notification settings - Fork 0
project conf toml
Status: Draft, 2026-05-24.
The ticket-* skills currently identify their project via a single-word file .project-prefix at the working-directory root, containing MAZ, PLTF, etc. As multi-ticket, multi-backend (Linear / JIRA / GitHub Issues), and RAG-aware features land, that file needs to carry structured information. This document defines .project-conf.toml — a TOML file at the same path that replaces .project-prefix.
- Plugin-wide single source of truth for project-level configuration.
- TOML format for human readability and Python-native parsing (
tomllibin 3.11+). - Namespaced sections so future features can land their config under a
[<feature>]table without rev-ing the schema. - No auto-migration in skill code. The two existing legacy projects (mazzy/MAZ on Linear, lyos/PLTF on JIRA) are migrated by hand as one-off operations.
- Per-user / per-machine config.
.project-conf.tomlis the project's config; user preferences live elsewhere if they exist. - Schema validation in the first cut. Skills tolerate unknown keys; missing required keys produce a clear error.
- Hierarchical / inherited config (e.g. project-level + skill-level overlay). Single flat file.
- Auto-walk up the directory tree. The file must be in the current working directory (same behavior as
.project-prefix).
Three flavors, one per backend.
system = "linear"
key = "MAZ"system = "jira"
key = "PLTF"system = "github"
key = "iansmith/slopstop"
prefix = "BILL" # short identifier used in branch names + filesystem paths
[status_labels]
in_progress = "status:in-progress"
in_review = "status:in-review" # only present in the 4-state workflow; omit for 3-stateprefix is required for system = "github" because key (owner/repo) contains a slash and is too long for branch/path use. For Linear/JIRA, key already plays this role (MAZ, LOU, PLTF), so prefix is omitted.
[status_labels] is required for GitHub (no native state machine; states are encoded as labels). For Linear / JIRA, states are first-class and the section is omitted.
Optional sections that consumers may use:
[rag]
endpoint = "http://127.0.0.1:7777" # default = 127.0.0.1:7777
corpus_scope = "linear" # default = same as top-level `system`
[exp]
label = "experiment" # applied to :exp-created tickets
branch_prefix = "exp" # default
[branch_prefixes]
feature = "feat" # default
fix = "fix" # default
exp = "exp" # default; mirrors [exp].branch_prefixAll optional. First-cut implementations may ignore [branch_prefixes] and hardcode defaults.
| Key | Required? | Notes |
|---|---|---|
system |
yes |
"linear" / "jira" / "github"
|
key |
yes | system-specific identifier (Linear team key, JIRA project key, GH owner/repo) |
prefix |
required for system = "github"; omitted for Linear/JIRA |
short token (3-6 chars), filesystem/branch-safe, used in $PREFIX-N ticket IDs (e.g. BILL-2). For Linear/JIRA, key already plays this role. |
[status_labels].in_progress |
required for system = "github"
|
else N/A |
[status_labels].in_review |
required for system = "github" with 4-state workflow |
absent for 3-state |
[rag].* |
no | RAG behavior defaults if absent |
[exp].* |
no |
:exp defaults if absent |
[branch_prefixes].* |
no | hardcoded defaults if absent |
Skills read .project-conf.toml from the current working directory. If absent:
"No .project-conf.toml in cwd.
Run /slopstop:gh-init (for GitHub) or create the file manually."
…and stop. Skills do not auto-walk up the directory tree.
import tomllib
with open(".project-conf.toml", "rb") as f:
conf = tomllib.load(f)
system = conf["system"] # required
key = conf["key"] # required
labels = conf.get("status_labels", {})
rag = conf.get("rag", {})
exp = conf.get("exp", {})Skills only consume the namespaces they need. Unknown keys are tolerated.
Per-ticket runtime state lives in a separate file inside each ticket directory:
~/.claude/ticket-active/$TICKET/state.toml
Its schema and write rules are fully defined in multi-ticket.md; this doc points at it only for cross-reference.
The two files are deliberately separate:
| File | Scope | Lifetime | Where |
|---|---|---|---|
.project-conf.toml |
Project | Long-lived, slow-changing | Project cwd |
state.toml |
Per ticket | Runtime, transient | ~/.claude/ticket-active/$TICKET/ |
A standalone design doc for state.toml was considered and rejected for this slice:
- The schema is small (≤6 fields:
state,blocked_on,blocked_since,parent, plus reservations). - Its write rules are tightly coupled to the multi-ticket design — when
state.tomlis written or cleared is a per-skill decision in:start,:pause,:block,:archive, which are all defined in multi-ticket.md. - A separate doc would consist mostly of cross-references back to multi-ticket.md.
If state.toml grows non-trivial behavior independent of the skills that write it (e.g. an external watcher, schema versioning, migration tooling), a separate doc would become warranted. Until then, it lives inline.
No auto-migration code. For each existing legacy project, perform a one-off manual migration:
- Identify the correct
systemandkey:- mazzy/MAZ →
system = "linear",key = "MAZ". - lyos/PLTF →
system = "jira",key = "PLTF".
- mazzy/MAZ →
- Write
.project-conf.tomlin the new format. - Delete
.project-prefix.
The skills' new code expects the new format only. No fallback to single-word reads — if a project hasn't been migrated, the skill prints the missing-file error and stops. This forces the migration to happen explicitly and prevents quiet drift.
No explicit schema version field in the first cut. If the format ever needs incompatible evolution, add a schema_version = N key at the top and have skills branch on it. The TOML structure tolerates additions without breaking existing readers, so most evolution will be additive.
None. This file's format is consumed by the new code in every other prerequisite (skill restructure, multi-ticket, RAG, ticket-gh-init). It's the lowest-level config primitive.
-
multi-ticket.md — defines
state.tomlschema and the workflow that consumes[status_labels]. -
ticket-rag.md — defines the
[rag]namespace's runtime semantics. -
ticket-gh-init.md — the skill that writes
.project-conf.tomlfor new GitHub-backed projects.