@intentsolutionsio/plane 0.1.1

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,24 @@
1
+ {
2
+ "name": "plane",
3
+ "version": "0.1.0",
4
+ "description": "Plane is a team behavior observatory — synthesize Plane API data into observations about how teams actually behave under pressure (cycle velocity vs. plan, ownership churn, reviewer gate strength, priority drift, cross-project load). Reads from the live mcp__plane MCP server.",
5
+ "author": {
6
+ "name": "Jeremy Longshore",
7
+ "email": "jeremy@intentsolutions.io"
8
+ },
9
+ "repository": "https://github.com/jeremylongshore/claude-code-plugins-plus-skills",
10
+ "homepage": "https://tonsofskills.com/plugins/plane",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "plane",
14
+ "project-management",
15
+ "team-behavior",
16
+ "observability",
17
+ "productivity",
18
+ "agent-skills",
19
+ "forge-generated"
20
+ ],
21
+ "skills": "./skills",
22
+ "generated": true,
23
+ "author_type": "forge"
24
+ }
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # Plane — Team Behavior Observatory
2
+
3
+ > **Plane is a team behavior observatory.** Most Plane integrations wrap the API for ticket entry; this one synthesizes the data Plane already has into observations about how a team actually behaves under pressure — cycle velocity vs. plan, ownership churn on stuck tickets, reviewer gate strength, stated-vs-actual priority drift, and cross-project workload concentration.
4
+
5
+ ## What this plugin is
6
+
7
+ A behavioral observation layer on top of Plane's project-tracking API. It does **not** replicate `mcp__plane`'s CRUD surface; that's the data-retrieval layer. This plugin sits one level up — it asks behavioral questions that require JOINing across multiple Plane endpoints to answer.
8
+
9
+ ## What this plugin is not
10
+
11
+ - Not a Plane CLI (use `mcp__plane` MCP directly for ticket CRUD)
12
+ - Not a clone of the Plane web dashboard (the dashboard already shows you ticket state)
13
+ - Not a generic project-tracker skill (the framing is specifically behavioral, anchored in the NOI)
14
+
15
+ ## The five compound commands
16
+
17
+ Each answers a question that **cannot** be answered from any single Plane API endpoint:
18
+
19
+ | Command | Question |
20
+ |---|---|
21
+ | `/plane-cycle-velocity` | Does cycle close-out match cycle planning? |
22
+ | `/plane-stale-tickets` | Which `In Progress` tickets are quietly failing under shared ownership? |
23
+ | `/plane-reviewer-gate-strength` | Which reviewers gate-keep harder than the spec demands? |
24
+ | `/plane-priority-drift` | Does the team plan high-priority work but ship low-priority work? |
25
+ | `/plane-cross-project-load` | Which engineers are spread across too many active projects? |
26
+
27
+ Each command's exact endpoint sequence, scoring formula, and output table format is documented in [`skills/plane/references/compound-commands.md`](skills/plane/references/compound-commands.md).
28
+
29
+ ## Install
30
+
31
+ ```
32
+ /plugin install plane@claude-code-plugins-plus
33
+ ```
34
+
35
+ ## Prerequisites
36
+
37
+ - `mcp__plane` MCP server installed and configured (env vars `PLANE_API_KEY`, `PLANE_WORKSPACE_SLUG`, `PLANE_API_HOST_URL`). Without it, the skill returns documentation-only output + an install hint.
38
+ - A Plane workspace with at least one project, cycle, and active issues — empty workspaces return informative empty states.
39
+
40
+ ## How it works
41
+
42
+ The orchestrator skill (`skills/plane/SKILL.md`) routes user intent to one of two agents:
43
+
44
+ - `plane-expert` — answers "how do I query X in Plane" without firing live API calls
45
+ - `plane-analyst` — orchestrates the compound commands, calling `mcp__plane__*` tools in the documented sequence and synthesizing the result
46
+
47
+ Both agents read from the references in `skills/plane/references/` as their ground truth — `noi.md` is the design anchor; `api-surface.md` is the documented endpoint subset; `compound-commands.md` is the per-command playbook.
48
+
49
+ ## Provenance
50
+
51
+ This plugin was produced by `/skill-creator --forge plane` on 2026-05-07. The forge run's audit trail lives in [`.forge/`](.forge/) — research notes, ecosystem analysis, validation evidence — visible to anyone reviewing how the plugin came to exist.
52
+
53
+ `plugin.json` carries `"generated": true` and `"author_type": "forge"` so the marketplace surfaces a "Forge-generated" provenance pill on the detail page.
54
+
55
+ ## License
56
+
57
+ MIT. See `LICENSE` (project-wide root file).
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@intentsolutionsio/plane",
3
+ "version": "0.1.1",
4
+ "description": "Plane is a team behavior observatory — synthesize Plane API data into observations about how teams actually behave under pressure (cycle velocity vs. plan, ownership churn, reviewer gate strength, pri",
5
+ "keywords": [
6
+ "plane",
7
+ "project-management",
8
+ "team-behavior",
9
+ "observability",
10
+ "productivity",
11
+ "agent-skills",
12
+ "forge-generated",
13
+ "claude-code",
14
+ "claude-plugin",
15
+ "tonsofskills"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/jeremylongshore/claude-code-plugins-plus-skills.git",
20
+ "directory": "plugins/productivity/plane"
21
+ },
22
+ "homepage": "https://tonsofskills.com/plugins/plane",
23
+ "bugs": "https://github.com/jeremylongshore/claude-code-plugins-plus-skills/issues",
24
+ "license": "MIT",
25
+ "author": {
26
+ "name": "Jeremy Longshore",
27
+ "email": "jeremy@intentsolutions.io"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "files": [
33
+ "README.md",
34
+ ".claude-plugin",
35
+ "skills"
36
+ ],
37
+ "scripts": {
38
+ "postinstall": "node -e \"console.log(\\\"\\\\n→ This npm package is a tracking/proof artifact. Install the plugin via:\\\\n ccpi install plane\\\\n or /plugin install plane@claude-code-plugins-plus in Claude Code\\\\n\\\")\""
39
+ }
40
+ }
@@ -0,0 +1,150 @@
1
+ ---
2
+ name: plane
3
+ description: |
4
+ Plane is a team behavior observatory — synthesize Plane API data into observations
5
+ about how teams actually behave under pressure, not just ticket state. Five compound
6
+ commands surface cycle velocity vs. plan, stale-ticket ownership churn, reviewer gate
7
+ strength, stated-vs-actual priority drift, and cross-project workload concentration.
8
+ Reads from the live mcp__plane MCP server when present; documentation-only otherwise.
9
+ Use when investigating "why is this team's plan diverging from reality", auditing cycle
10
+ health, finding orphan tickets, identifying review bottlenecks, or onboarding to a
11
+ new project. Trigger with "/plane-cycle-velocity", "/plane-stale-tickets",
12
+ "/plane-reviewer-gate-strength", "/plane-priority-drift", "/plane-cross-project-load",
13
+ "audit Plane cycle", "team behavior plane", "how is my team behaving".
14
+ allowed-tools: "Read,Bash(jq:*),Bash(date:*),AskUserQuestion"
15
+ version: 0.1.0
16
+ author: Jeremy Longshore <jeremy@intentsolutions.io>
17
+ license: MIT
18
+ compatibility: Designed for Claude Code; requires mcp__plane MCP server configured (PLANE_API_KEY, PLANE_WORKSPACE_SLUG, PLANE_API_HOST_URL env vars)
19
+ tags: [plane, project-management, team-behavior, observability, productivity]
20
+ model: inherit
21
+ ---
22
+
23
+ # Plane — Team Behavior Observatory
24
+
25
+ A behavioral observation layer on top of Plane's project-tracking API. This skill **does not** wrap Plane CRUD — `mcp__plane` already does that and you should call it directly for ticket entry, status changes, etc.
26
+
27
+ Instead, this skill answers behavioral questions about how a team is actually performing under pressure: cycle velocity vs. plan, ownership churn, reviewer gate strength, priority drift, and cross-project load. Each question is answered by a compound command that synthesizes data across multiple Plane endpoints — observations no single endpoint exposes.
28
+
29
+ ## Overview
30
+
31
+ The NOI (`references/noi.md`) is the design anchor: **Plane is a team behavior observatory**. Five compound commands derive from that framing:
32
+
33
+ 1. `/plane-cycle-velocity` — does cycle close-out match cycle planning?
34
+ 2. `/plane-stale-tickets` — which `In Progress` tickets are quietly failing under shared ownership?
35
+ 3. `/plane-reviewer-gate-strength` — which reviewers gate-keep harder than the spec demands?
36
+ 4. `/plane-priority-drift` — does the team plan high-priority work but ship low-priority work?
37
+ 5. `/plane-cross-project-load` — which engineers are spread across too many active projects?
38
+
39
+ None of these are answerable from any single Plane API call. Each requires cross-endpoint synthesis. That synthesis is the value.
40
+
41
+ ## Prerequisites
42
+
43
+ - `mcp__plane` MCP server installed and configured (env vars `PLANE_API_KEY`, `PLANE_WORKSPACE_SLUG`, `PLANE_API_HOST_URL`)
44
+ - A Plane workspace with at least one project, cycle, and active issues (otherwise the commands return informative empty states)
45
+
46
+ ## Authentication
47
+
48
+ This skill does not handle credentials directly. Auth is delegated to the MCP server. See `references/api-surface.md` for the env-var setup; if `mcp__plane` returns an auth error, the skill surfaces the error verbatim and instructs the user to verify their token.
49
+
50
+ ## Instructions
51
+
52
+ ### Mode detection
53
+
54
+ Determine user intent from their prompt:
55
+
56
+ - **Compound query mode** (default): user asks about cycle health, team behavior, stale tickets, reviewer patterns, priority drift, or workload distribution → route to `plane-analyst` agent (see `agents/plane-analyst.md`) which orchestrates the compound commands.
57
+ - **API help mode**: user asks "how do I query X in Plane" or "what endpoint does Y" → route to `plane-expert` agent (see `agents/plane-expert.md`) which answers from `references/api-surface.md` without firing live API calls.
58
+ - **Skill metadata**: user asks "what does this skill do" / "explain plane skill" → return the Overview above + the 5 commands.
59
+
60
+ If unclear, use `AskUserQuestion`:
61
+
62
+ > Are you asking about (a) team behavior / cycle health / patterns, or (b) how to use a specific Plane API endpoint?
63
+
64
+ ### Step 1: Resolve target project
65
+
66
+ Most compound commands operate on a specific project. Extract the project slug or readable identifier (e.g., `BRAVES`, `OPS`) from the user's prompt.
67
+
68
+ If absent, list available projects via `mcp__plane__get_projects` and ask which one. Cache the chosen project for the rest of the conversation.
69
+
70
+ ### Step 2: Route to compound command
71
+
72
+ Match user intent to one of the five commands:
73
+
74
+ | User asks about... | Command |
75
+ |---|---|
76
+ | cycle velocity, sprint completion, overrun | `/plane-cycle-velocity` |
77
+ | stale tickets, orphan work, ownership churn | `/plane-stale-tickets` |
78
+ | reviewer bottlenecks, blocked PRs, gate-keeping | `/plane-reviewer-gate-strength` |
79
+ | priority drift, planning vs. reality, P1 vs. P3 | `/plane-priority-drift` |
80
+ | workload distribution, project sprawl, focus | `/plane-cross-project-load` |
81
+
82
+ Read `references/compound-commands.md` for the exact endpoint sequence and output format per command.
83
+
84
+ ### Step 3: Execute via `plane-analyst` agent
85
+
86
+ Invoke the analyst agent (`agents/plane-analyst.md`) with the chosen command + project. The agent:
87
+
88
+ 1. Calls the relevant `mcp__plane__*` tools in sequence
89
+ 2. Performs the JOIN logic
90
+ 3. Computes the behavioral score per the command's formula
91
+ 4. Renders the output table per the format in `compound-commands.md`
92
+ 5. Adds a "Behavioral signal" interpretation paragraph
93
+
94
+ If `mcp__plane` is unavailable, the agent emits a documentation-only response: shows what the command WOULD return, plus the install hint.
95
+
96
+ ### Step 4: Interpret the signal
97
+
98
+ The output is observations, not prescriptions. The skill says "this team plans P1s and ships P3s — the planning conversation is theater." It does NOT say "fire the planner." Interpretation belongs to the human reading the report.
99
+
100
+ ## Output
101
+
102
+ Each compound command produces:
103
+
104
+ - A table of metrics specific to that observation
105
+ - A "Behavioral signal" paragraph that names the pattern in plain language
106
+ - Optionally, a follow-up suggestion (e.g., "consolidate projects" / "split this queue") — framed as a question the team can take to its retro
107
+
108
+ ## Error Handling
109
+
110
+ | Error | Recovery |
111
+ |---|---|
112
+ | `mcp__plane` unavailable | Emit documentation-only output + install hint pointing at `~/.claude.json` MCP config |
113
+ | API rate limit (429) | Back off + retry with exponential delay; if persistent, advise user to wait and re-run |
114
+ | Empty project (no cycles / issues) | Return informative empty state explaining why the command can't compute |
115
+ | Auth error (401/403) | Surface verbatim + instruct user to verify env vars or re-issue token |
116
+ | Workspace member lookup fails | Fall back to assignee UUIDs in output (less readable but functional) |
117
+
118
+ ## Examples
119
+
120
+ **"How is my team performing on cycle velocity?"**
121
+
122
+ ```
123
+ /plane-cycle-velocity BRAVES
124
+ ```
125
+
126
+ → Renders the cycle-velocity table from `references/compound-commands.md` § Command 1.
127
+
128
+ **"Are we shipping what we plan?"**
129
+
130
+ ```
131
+ /plane-priority-drift BRAVES
132
+ ```
133
+
134
+ → Renders the priority-drift table; surfaces the gap between planned and shipped priorities.
135
+
136
+ **"Which engineers are stretched too thin?"**
137
+
138
+ ```
139
+ /plane-cross-project-load
140
+ ```
141
+
142
+ → Walks the entire workspace; lists engineers with their active-project / active-cycle / open-issue counts; flags crisis-level stretch.
143
+
144
+ ## Resources
145
+
146
+ - [NOI](references/noi.md) — the secret-identity statement that anchors every command
147
+ - [API surface](references/api-surface.md) — endpoints consumed + auth + pagination
148
+ - [Compound commands](references/compound-commands.md) — exact endpoint sequence + output format per command
149
+ - [Plane docs](https://docs.plane.so/) — upstream API reference
150
+ - `mcp__plane` MCP server — direct CRUD wrapper this skill builds on top of
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: plane-analyst
3
+ description: |
4
+ Plane behavioral synthesis agent. Orchestrates the five compound commands
5
+ (cycle-velocity, stale-tickets, reviewer-gate-strength, priority-drift,
6
+ cross-project-load) by calling mcp__plane endpoints in sequence, applying
7
+ the JOIN + scoring logic, and rendering the output tables per the NOI.
8
+ Use when the user asks behavioral questions about a team's Plane workspace
9
+ — cycle health, stuck work, review bottlenecks, planning vs. reality,
10
+ workload distribution.
11
+ allowed-tools: "Read,Glob,Grep"
12
+ model: inherit
13
+ ---
14
+
15
+ # Plane Analyst (Behavioral Synthesis)
16
+
17
+ > **Parent skill**: `skills/plane/SKILL.md`
18
+
19
+ The synthesis agent that turns Plane API data into behavioral observations. Reads the NOI as its design anchor; runs the compound-command logic; renders interpretable output.
20
+
21
+ ## Overview
22
+
23
+ The orchestrator skill delegates here when the user asks behavioral questions. This agent:
24
+
25
+ 1. Reads `references/noi.md` to stay on-mission (every output should tie back to behavioral signal, not data dump)
26
+ 2. Reads `references/compound-commands.md` for the specific endpoint sequence + output format per command
27
+ 3. Calls `mcp__plane__*` tools in the documented sequence (the orchestrator authorizes the tool calls)
28
+ 4. Performs the JOIN + scoring logic
29
+ 5. Emits the table + "Behavioral signal" interpretation paragraph
30
+
31
+ ## NOI anchor
32
+
33
+ **Plane is a team behavior observatory.** Every output frames its observations in terms of how the team is actually behaving — not in terms of ticket counts. If a draft response would land equally well on a stand-up note, rewrite it. The signal is behavioral.
34
+
35
+ ## Instructions
36
+
37
+ ### Step 1: Match user intent to a compound command
38
+
39
+ Per the routing table in the parent skill:
40
+
41
+ | User asks about | Command |
42
+ |---|---|
43
+ | cycle velocity, sprint completion, overrun | cycle-velocity |
44
+ | stale tickets, orphan work, ownership churn | stale-tickets |
45
+ | reviewer bottlenecks, blocked PRs | reviewer-gate-strength |
46
+ | priority drift, planning vs. reality | priority-drift |
47
+ | workload distribution, project sprawl | cross-project-load |
48
+
49
+ If none match, fall back to the orchestrator with a clarifying question.
50
+
51
+ ### Step 2: Read the command's playbook
52
+
53
+ Read the relevant `## Command N` section in `references/compound-commands.md`. The section specifies:
54
+
55
+ - Endpoints to call (in order)
56
+ - JOIN logic
57
+ - Scoring formula
58
+ - Output table format
59
+
60
+ Do not improvise. The playbook IS the contract.
61
+
62
+ ### Step 3: Execute
63
+
64
+ Call `mcp__plane__*` tools per the playbook. For each batch:
65
+
66
+ - Honor the rate limit (60 req/min) — back off on 429
67
+ - Paginate to completion when scoring requires the full set
68
+ - For sample-mode invocations, stop at first page and label output as "(sampled)"
69
+
70
+ ### Step 4: Score + render
71
+
72
+ Apply the scoring formula. Render the table verbatim per the playbook format.
73
+
74
+ ### Step 5: Append the behavioral signal
75
+
76
+ After the table, write a 1–3 sentence "Behavioral signal" paragraph that names the pattern in plain language. Reference the NOI framing — what does this observation say about how the team behaves under pressure?
77
+
78
+ ## Output discipline
79
+
80
+ - **No prescriptions**. The agent surfaces patterns; the human interprets and acts.
81
+ - **No moralizing**. "Bob takes 6.8 days to clear blockers" is an observation. "Bob is bad at his job" is not — the same pattern can be intentional security review or unintentional overload, and the agent can't tell which.
82
+ - **No raw dumps**. If you'd rather render 200 issue rows than the 6-row score-summary, you've lost the NOI thread. Compress.
83
+ - **Frame outputs as questions the team can take to retro**. "67% of urgents don't ship — is the planning conversation reality-rooted, or theatrical?" is more useful than "67% of urgents don't ship."
84
+
85
+ ## Error Handling
86
+
87
+ | Error | Recovery |
88
+ |---|---|
89
+ | Empty project | Return informative empty state — "no cycles closed in the last 90 days, can't compute velocity" |
90
+ | API rate limit hit | Back off + retry; if persistent, return partial result with sampling note |
91
+ | Auth error | Surface to orchestrator; user fixes credentials and re-runs |
92
+ | Unfamiliar workflow (e.g., team doesn't use cycles) | Fall back to issue-level metrics where possible; otherwise return empty state |
93
+
94
+ ## Resources
95
+
96
+ - Parent skill: `skills/plane/SKILL.md`
97
+ - Sibling agent: `skills/plane/agents/plane-expert.md` — for API-surface help
98
+ - NOI: `skills/plane/references/noi.md`
99
+ - Compound commands playbook: `skills/plane/references/compound-commands.md`
100
+ - API surface: `skills/plane/references/api-surface.md`
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: plane-expert
3
+ description: |
4
+ Plane API surface specialist. Answers "how do I query X in Plane" / "what endpoint
5
+ does Y" / "what is the response shape for Z" without firing live API calls.
6
+ Reads from the parent skill's references/api-surface.md as ground truth. Use when
7
+ the user wants to understand the API surface before running a compound command,
8
+ or when debugging an unexpected response shape from mcp__plane.
9
+ allowed-tools: "Read,Glob,Grep"
10
+ model: inherit
11
+ ---
12
+
13
+ # Plane Expert (Domain Specialist)
14
+
15
+ > **Parent skill**: `skills/plane/SKILL.md`
16
+
17
+ A read-only agent that answers questions about Plane's API surface from the documented references. Does NOT call `mcp__plane` tools — its job is to teach the surface, not to query it.
18
+
19
+ ## Overview
20
+
21
+ When the orchestrator skill detects an "API help mode" prompt — the user wants to understand the surface, not run a behavioral query — it delegates here. This agent reads `references/api-surface.md` and `references/compound-commands.md` and produces an answer grounded in those documents.
22
+
23
+ ## When to use
24
+
25
+ - "What endpoint returns issues for a cycle?" → list_cycle_issues
26
+ - "How do I get worklog data?" → get_total_worklogs / get_issue_worklogs
27
+ - "Does Plane support webhook subscriptions?" → answer from documented surface
28
+ - "What's the response shape of get_cycle?" → from api-surface.md
29
+ - "Why does mcp__plane return uuids instead of names?" → because Plane normalizes by UUID; member/state/label resolution requires a follow-up call
30
+
31
+ ## Instructions
32
+
33
+ ### Step 1: Identify the API question type
34
+
35
+ Three sub-types:
36
+
37
+ 1. **Endpoint discovery**: "what tool does X" — match user intent to a tool listed in api-surface.md
38
+ 2. **Response shape**: "what fields are in Y" — quote the schema excerpt from api-surface.md
39
+ 3. **Pagination / auth / rate-limit**: "how do I handle Z" — answer from the relevant section
40
+
41
+ ### Step 2: Answer from references
42
+
43
+ Always cite the section of api-surface.md the answer came from. If the user's question isn't covered (e.g., they ask about an endpoint not in the documented subset), say so and direct them to the upstream Plane docs.
44
+
45
+ ### Step 3: Suggest the compound command if applicable
46
+
47
+ If the user's question hints at a behavioral pattern (e.g., "how do I find stale tickets" or "which engineers are overloaded"), suggest the matching compound command from compound-commands.md instead of explaining the raw endpoint sequence.
48
+
49
+ ## Output
50
+
51
+ Concise, citation-grounded answer. Format:
52
+
53
+ ```
54
+ [Direct answer to the question]
55
+
56
+ Per `references/api-surface.md` § [section]:
57
+ [relevant excerpt]
58
+
59
+ [Optional: "If you're trying to do X behaviorally, consider /plane-cycle-velocity instead"]
60
+ ```
61
+
62
+ ## Error Handling
63
+
64
+ | Error | Recovery |
65
+ |---|---|
66
+ | Question references an undocumented endpoint | Acknowledge gap; point at upstream Plane docs |
67
+ | Question is actually a behavioral query in disguise | Redirect to `plane-analyst` via the orchestrator skill |
68
+ | References file missing | Report the gap; suggest re-forging the plugin |
69
+
70
+ ## Resources
71
+
72
+ - Parent skill: `skills/plane/SKILL.md`
73
+ - Sibling agent: `skills/plane/agents/plane-analyst.md` — for behavioral queries
74
+ - API surface: `skills/plane/references/api-surface.md`
75
+ - Compound commands: `skills/plane/references/compound-commands.md`
@@ -0,0 +1,121 @@
1
+ # Plane API Surface
2
+
3
+ **Captured**: 2026-05-07
4
+ **Source of truth**: `mcp__plane` MCP server tool list + Plane open-source repo (`makeplane/plane`)
5
+ **Plane version targeted**: API v1, current production at `projects.intentsolutions.io`
6
+
7
+ This skill operates against Plane's public REST API. It does NOT implement the API client itself — instead it delegates to `mcp__plane` MCP tools (already wired in the user's environment). When `mcp__plane` is unavailable, the skill degrades to a documentation-only mode and instructs the user how to install it.
8
+
9
+ ## Authentication
10
+
11
+ Three environment variables, all required:
12
+
13
+ ```bash
14
+ PLANE_API_KEY="<your_personal_access_token>"
15
+ PLANE_WORKSPACE_SLUG="<workspace_slug>"
16
+ PLANE_API_HOST_URL="https://projects.intentsolutions.io"
17
+ ```
18
+
19
+ Mirror these into the MCP server config (already done in user's `~/.claude.json` per `reference_plane_setup.md` memory).
20
+
21
+ **Rate limits**: 60 requests/minute on the standard tier. Compound commands batch where possible and back off on 429.
22
+
23
+ ## Endpoint groups consumed
24
+
25
+ ### Issues
26
+
27
+ | Tool | Purpose | Used by compound command |
28
+ |---|---|---|
29
+ | `mcp__plane__list_project_issues` | Enumerate issues per project | All — base query |
30
+ | `mcp__plane__get_issue_using_readable_identifier` | Full issue detail by `PROJECT-N` ID | priority-drift, stale-tickets |
31
+ | `mcp__plane__list_states` | Project state enum (Backlog / In Progress / Done / etc.) | stale-tickets, cycle-velocity |
32
+ | `mcp__plane__update_issue` | Mutation — used only when explicitly requested by user | (none — this skill is read-mostly) |
33
+
34
+ ### Cycles
35
+
36
+ | Tool | Purpose | Used by compound command |
37
+ |---|---|---|
38
+ | `mcp__plane__list_cycles` | Cycle list per project | cycle-velocity, priority-drift |
39
+ | `mcp__plane__get_cycle` | Cycle details (start/end dates, completion stats) | cycle-velocity |
40
+ | `mcp__plane__list_cycle_issues` | Issues planned in a specific cycle | cycle-velocity, priority-drift |
41
+ | `mcp__plane__transfer_cycle_issues` | Track issues moved between cycles (re-planning signal) | priority-drift (read-side via list_cycle_issues + diff over time) |
42
+
43
+ ### Modules
44
+
45
+ | Tool | Purpose | Used by compound command |
46
+ |---|---|---|
47
+ | `mcp__plane__list_modules` | Module enumeration | cross-project-load |
48
+ | `mcp__plane__list_module_issues` | Issues per module | cross-project-load |
49
+
50
+ ### Comments / Activity
51
+
52
+ | Tool | Purpose | Used by compound command |
53
+ |---|---|---|
54
+ | `mcp__plane__get_issue_comments` | Comment thread on an issue | reviewer-gate-strength |
55
+
56
+ ### Workspace + Worklogs
57
+
58
+ | Tool | Purpose | Used by compound command |
59
+ |---|---|---|
60
+ | `mcp__plane__get_workspace_members` | Engineer roster | engineer-velocity, cross-project-load |
61
+ | `mcp__plane__get_total_worklogs` | Time tracked per assignee | engineer-velocity |
62
+ | `mcp__plane__get_issue_worklogs` | Time tracked per issue | cycle-velocity (estimate-vs-actual) |
63
+
64
+ ## Response shapes (excerpts)
65
+
66
+ Full schemas live at `mcp__plane`'s tool-detail descriptions; these are the shapes the compound commands JOIN against.
67
+
68
+ ### Issue (excerpt)
69
+
70
+ ```jsonc
71
+ {
72
+ "id": "uuid",
73
+ "name": "Issue title",
74
+ "state": "uuid", // → joined against list_states
75
+ "priority": "urgent|high|medium|low|none",
76
+ "assignees": ["uuid", ...], // → joined against get_workspace_members
77
+ "created_at": "ISO-8601",
78
+ "updated_at": "ISO-8601",
79
+ "completed_at": "ISO-8601 | null",
80
+ "estimate_point": 5, // → estimate-vs-actual signal
81
+ "cycle_id": "uuid | null",
82
+ "module_ids": ["uuid", ...],
83
+ "labels": ["uuid", ...]
84
+ }
85
+ ```
86
+
87
+ ### Cycle (excerpt)
88
+
89
+ ```jsonc
90
+ {
91
+ "id": "uuid",
92
+ "name": "Sprint 14",
93
+ "start_date": "ISO-8601",
94
+ "end_date": "ISO-8601",
95
+ "total_issues": 23,
96
+ "completed_issues": 18,
97
+ "cancelled_issues": 1,
98
+ "started_issues": 4, // still open at close — overrun signal
99
+ "unstarted_issues": 0
100
+ }
101
+ ```
102
+
103
+ ## Pagination
104
+
105
+ All `list_*` endpoints return cursor-based pagination:
106
+
107
+ ```jsonc
108
+ {
109
+ "results": [...],
110
+ "next_cursor": "<opaque-token>",
111
+ "prev_cursor": "<opaque-token>"
112
+ }
113
+ ```
114
+
115
+ Compound commands paginate to completion when scoring requires the full set; sample-mode (first page only) is supported via the `--sample` flag for fast iteration.
116
+
117
+ ## When the API surface drifts
118
+
119
+ Re-run via `/skill-creator --reforge plane` (see `/skill-creator` SKILL.md § Reforge Mode Workflow). Auto-bumps version per detected change scope.
120
+
121
+ Future enhancement (Phase 5C cron): scheduled daily diff against the live API surface, opens a GitHub issue tagged `forge-drift` when an endpoint adds / removes / changes shape.
@@ -0,0 +1,164 @@
1
+ # Compound Commands — Plane Behavior Observatory
2
+
3
+ Each command answers a question that **cannot** be answered from any single Plane API endpoint. Each is derived from the NOI (`references/noi.md`) and the Project / Workflow archetype's default `velocity / stale / bottleneck` triplet, adapted to Plane's behavioral observatory framing.
4
+
5
+ ## Command 1 — `/plane-cycle-velocity`
6
+
7
+ **Question**: Does this team's cycle velocity match its planning?
8
+
9
+ **Synthesizes**:
10
+ - `list_cycles` → enumerate completed cycles
11
+ - `get_cycle` (per cycle) → planned start/end + actual completion counts
12
+ - `list_cycle_issues` (per cycle) → estimate_point sum vs. completed_issues sum
13
+ - `get_issue_worklogs` (sample) → actual time spent per issue (if estimate_point unset)
14
+
15
+ **Output**:
16
+
17
+ ```
18
+ PROJECT: braves-booth
19
+ Cycles analyzed: 8 most recent
20
+
21
+ Cycle Planned Completed Overrun Estimate Actual Variance
22
+ ───────────────── ──────── ───────── ──────── ───────── ──────── ────────
23
+ Sprint 14 14d 18d +4d 42 pts 58 pts +38%
24
+ Sprint 13 14d 14d 0d 38 pts 34 pts -10%
25
+ Sprint 12 14d 21d +7d 45 pts 61 pts +36%
26
+ Sprint 11 14d 14d 0d 40 pts 42 pts +5%
27
+ ...
28
+
29
+ Pattern: 4/8 cycles overrun by ≥ 4 days. Mean variance: +21%.
30
+ Behavioral signal: cycle planning is ~20% optimistic — either reduce
31
+ scope per cycle or extend cycle length.
32
+ ```
33
+
34
+ **Caching**: cycle data is immutable once a cycle closes; cache by cycle ID in `~/.cache/plane-skill/cycles.sqlite`.
35
+
36
+ ## Command 2 — `/plane-stale-tickets`
37
+
38
+ **Question**: Which tickets are quietly failing under shared ownership?
39
+
40
+ **Synthesizes**:
41
+ - `list_project_issues` → open issues
42
+ - `list_states` → identify "In Progress" state UUIDs
43
+ - `get_issue_comments` (per stale candidate) → assignee changes during the open window
44
+
45
+ **Output**:
46
+
47
+ ```
48
+ PROJECT: braves-booth
49
+ Threshold: In Progress > 14 days
50
+
51
+ Issue Days In Assignee Churn Last Comment Score
52
+ ─────────────── ──────── ─────────────── ───────────── ─────
53
+ BRAVES-78 29d 3 assignees 11d ago 9.2 ⚠
54
+ BRAVES-91 21d 2 assignees 4d ago 5.1
55
+ BRAVES-85 18d 1 assignee 2d ago 2.8
56
+
57
+ Score = days_in × (1 + assignee_churn) × (days_since_last_comment / 7)
58
+
59
+ Behavioral signal: BRAVES-78 has 3 assignees and hasn't moved in 11 days
60
+ — classic shared-ownership orphan. Assign one owner or close as won't-do.
61
+ ```
62
+
63
+ **Caching**: open-issue list is mutable; refresh on each invocation.
64
+
65
+ ## Command 3 — `/plane-reviewer-gate-strength`
66
+
67
+ **Question**: Which reviewers gate-keep harder than the spec demands?
68
+
69
+ **Synthesizes**:
70
+ - `list_project_issues` filtered to recently-closed
71
+ - `get_issue_comments` (per closed issue) → look for "blocked by reviewer" pattern + reviewer assignment timing
72
+
73
+ Heuristic for blocker detection: a comment containing a state-change to "blocked" or text matching `/blocked|review|approval/i`, followed by a comment lifting the block.
74
+
75
+ **Output**:
76
+
77
+ ```
78
+ PROJECT: braves-booth
79
+ Period: last 30 days
80
+
81
+ Reviewer Issues Gated Mean Time Blocked Verdict
82
+ ────────── ───────────── ────────────────── ──────────────────────
83
+ Alice 12 1.2 days Engineer-fast clearance
84
+ Bob 8 6.8 days Bottleneck — not a senior
85
+ Carol 15 2.1 days Healthy review cadence
86
+
87
+ Behavioral signal: Bob's 6.8-day mean indicates a process bottleneck.
88
+ Either re-route reviews, define explicit review SLAs, or split Bob's
89
+ queue.
90
+ ```
91
+
92
+ **Note**: this command doesn't define "good" or "bad" reviewer behavior — the score surfaces friction, the human decides whether the friction is intentional (security review) or unintentional (overload).
93
+
94
+ ## Command 4 — `/plane-priority-drift`
95
+
96
+ **Question**: Does the team plan high-priority work but ship low-priority work?
97
+
98
+ **Synthesizes**:
99
+ - `list_cycles` → recent closed cycles
100
+ - `list_cycle_issues` (per cycle) → priority distribution at planning time
101
+ - Cross-reference with `get_issue_using_readable_identifier` for issues marked `completed` in the cycle
102
+
103
+ **Output**:
104
+
105
+ ```
106
+ PROJECT: braves-booth
107
+ Cycles analyzed: 8 most recent
108
+
109
+ Priority Planned Shipped Drift
110
+ ───────── ───────── ───────── ─────────
111
+ urgent 12 4 -67%
112
+ high 38 18 -53%
113
+ medium 24 31 +29%
114
+ low 8 29 +263%
115
+
116
+ Pattern: 67% of planned urgents and 53% of planned highs do not ship
117
+ in the cycle they're planned in. Meanwhile low-priority work ships
118
+ +263% above plan.
119
+
120
+ Behavioral signal: the planning conversation does not reflect what
121
+ actually gets done. Either the team plans theatrically and ships
122
+ opportunistically, or planning is happening at the wrong time/place.
123
+ ```
124
+
125
+ **This is the NOI-specific compound command** — not in the default Project/Workflow archetype set; added because the NOI's "stated-vs-actual priority drift" framing demands it.
126
+
127
+ ## Command 5 — `/plane-cross-project-load`
128
+
129
+ **Question**: Which engineers are spread across too many active projects?
130
+
131
+ **Synthesizes**:
132
+ - `get_workspace_members` → engineer roster
133
+ - `list_project_issues` (across all active projects, filtered to assignee × open state)
134
+ - `list_modules` (used as a project-internal grouping signal)
135
+
136
+ **Output**:
137
+
138
+ ```
139
+ WORKSPACE: internal
140
+ Active projects: 14
141
+
142
+ Engineer Projects Active Cycles Open Issues Verdict
143
+ ────────────── ───────── ────────────── ──────────── ─────────────
144
+ Alice 7 6 42 Stretched
145
+ Bob 4 4 23 Healthy
146
+ Carol 11 9 68 Crisis ⚠
147
+ David 2 2 9 Focused
148
+
149
+ Behavioral signal: Carol is on 11 active projects and 9 active cycles
150
+ — that's not focus, that's project-management debt. Either consolidate
151
+ projects or rotate Carol off most.
152
+ ```
153
+
154
+ **Caching**: assignment data is mutable; refresh on each invocation.
155
+
156
+ ## How agents consume this
157
+
158
+ `plane-expert` agent reads from `api-surface.md` and answers "how do I query X" questions about the Plane API.
159
+
160
+ `plane-analyst` agent reads from `noi.md` + this file and orchestrates the compound commands above. The orchestrator skill (`SKILL.md`) routes to one or the other based on user intent: "tell me about Plane endpoint X" → expert; "how is my team behaving in cycle Y" → analyst.
161
+
162
+ ## When new compound commands are added
163
+
164
+ Constraint: any new command must answer a behavioral question that the NOI implies. If a command can be answered by a single endpoint call (e.g., "list issues assigned to me"), it does not belong here. Add it to a separate utility skill or call `mcp__plane` directly.
@@ -0,0 +1,35 @@
1
+ # NOI — Plane
2
+
3
+ > **Plane is a team behavior observatory.**
4
+
5
+ ## What this NOI claims
6
+
7
+ Plane describes itself as an open-source project tracker — issues, cycles, modules, projects, work-in-progress. That's the **claimed identity**. It's accurate but it's the floor, not the ceiling.
8
+
9
+ The **secret identity** is what you can read off Plane that nobody talks about: how a team actually behaves under pressure. Cycle close-out velocity, the gap between estimate and actual, which workflows quietly orphan tickets in `In Progress`, which engineers consistently ship under the wire and which stack up at the deadline, which reviewers gate-keep harder than the spec demands, which projects burn cycles on rework versus on net-new work, and where the team's stated priorities diverge from what's actually getting closed.
10
+
11
+ That's not project tracking. That's an observatory pointed at organizational behavior, with Plane's API as the telescope.
12
+
13
+ ## What this NOI unlocks that the obvious wrapper doesn't
14
+
15
+ A "Plane wrapper" skill calls `list_project_issues` and renders results. Useful but generic — every Plane SDK does that. The team-behavior-observatory framing demands compound queries that synthesize multiple endpoints into observations no single endpoint exposes:
16
+
17
+ - **Cycle close velocity vs. estimate**: cross-reference cycle close dates with cycle planning dates and issue-level estimate vs. actual time-to-close. Surfaces "the team consistently overruns 2-week cycles by 4 days" — invisible from any single endpoint.
18
+ - **Stale-ticket drift**: `In Progress` tickets older than the cycle they were planned in, scored by ownership churn (assignee changes during the open window). Surfaces "the cluster of tickets that quietly fail every two weeks because three people share ownership."
19
+ - **Reviewer gate strength**: time-from-blocker-flagged to blocker-cleared, sliced by reviewer. Distinguishes reviewers who clear blockers fast (engineers) from reviewers who serve as control points (process gatekeeping). Surfaces "PRs assigned to X close in 1.4 days; PRs assigned to Y close in 6.8 — Y is a bottleneck, not a senior."
20
+ - **Stated-vs-actual priority drift**: the priority labels on planned issues vs. the priority labels on issues that actually closed in the cycle. Surfaces "the team plans P1s and ships P3s — the planning conversation is theater."
21
+ - **Cross-project workload concentration**: aggregate `assigned_to` counts across all active projects per engineer. Surfaces "Alice is on 7 active cycles across 4 projects; that's not focus, that's project-management debt."
22
+
23
+ None of these are visible in Plane's dashboard. None are accessible from a single API endpoint. Each requires the skill to JOIN data the API only exposes per-resource — which is the compound-command discipline the forge mandates.
24
+
25
+ ## Why this NOI matters for downstream design
26
+
27
+ Every gate downstream of this point reads from `noi.md`. The compound commands designed in `compound-commands.md` are derived from these specific observations, not from "what endpoints does Plane have." The agents (`plane-expert`, `plane-analyst`) carry this framing in their system prompts — they answer behavioral questions about teams, not ticket-CRUD questions.
28
+
29
+ If a future maintainer asks "should we add X to this skill?" — the answer is: **does X surface team-behavior signal?** If yes, design it as a compound query. If no (e.g., "create issue from CLI"), add it to a separate utility skill instead. The NOI is the gate that keeps this skill from sprawling into a generic Plane wrapper.
30
+
31
+ ## Not what this NOI claims
32
+
33
+ - Not a CRUD wrapper for Plane (that's `mcp__plane` directly)
34
+ - Not a CLI alternative to `projects.intentsolutions.io` (the web UI is fine for ticket entry)
35
+ - Not a Plane-specific clone of standard project-tracker skills (the framing rejects that direction)