opencodekit 0.16.10 → 0.16.13
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/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +85 -32
- package/dist/template/.opencode/agent/build.md +24 -2
- package/dist/template/.opencode/command/handoff.md +37 -0
- package/dist/template/.opencode/command/start.md +6 -0
- package/dist/template/.opencode/command/status.md +33 -7
- package/dist/template/.opencode/dcp.jsonc +79 -79
- package/dist/template/.opencode/memory.db-shm +0 -0
- package/dist/template/.opencode/memory.db-wal +0 -0
- package/dist/template/.opencode/opencode.json +905 -885
- package/dist/template/.opencode/plugin/compaction.ts +52 -51
- package/dist/template/.opencode/plugin/memory.ts +22 -551
- package/dist/template/.opencode/plugin/skill-mcp.ts +514 -486
- package/dist/template/.opencode/plugin/swarm-enforcer.ts +43 -119
- package/dist/template/.opencode/skill/agent-teams/SKILL.md +242 -0
- package/dist/template/.opencode/skill/compaction/SKILL.md +338 -0
- package/dist/template/.opencode/skill/jira/SKILL.md +177 -50
- package/dist/template/.opencode/skill/jira/mcp.json +2 -10
- package/package.json +1 -1
- package/dist/template/.opencode/plugin/env-ctx.ts +0 -34
- package/dist/template/.opencode/plugin/lsp.ts +0 -301
- package/dist/template/.opencode/plugin/truncator.ts +0 -59
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: compaction
|
|
3
|
+
description: >
|
|
4
|
+
Use when context is growing large during long-running tasks and needs server-side or client-side
|
|
5
|
+
summarization to continue effectively. Covers compaction triggers, custom summarization patterns,
|
|
6
|
+
session handoff, and context preservation strategies.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
license: MIT
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Context Compaction - Managing Long-Running Sessions
|
|
12
|
+
|
|
13
|
+
Handle context growth in long-running sessions through proactive compaction, strategic summarization, and session handoff patterns.
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
**Compaction = Summarization + Preservation + Continuity**
|
|
18
|
+
|
|
19
|
+
Long-running sessions accumulate context (tool outputs, code reads, exploration results). When context approaches limits, compaction reduces it to essential information while preserving decision history and work state.
|
|
20
|
+
|
|
21
|
+
## Context Budget Awareness
|
|
22
|
+
|
|
23
|
+
### Token Thresholds
|
|
24
|
+
|
|
25
|
+
| Context Usage | Status | Action |
|
|
26
|
+
| ------------- | ----------- | --------------------------------------------- |
|
|
27
|
+
| 0-50% | 🟢 Normal | Work freely |
|
|
28
|
+
| 50-70% | 🟡 Watch | Start distilling completed explorations |
|
|
29
|
+
| 70-85% | 🟠 Compact | Actively compress/prune, consider handoff |
|
|
30
|
+
| 85-95% | 🔴 Critical | Emergency compaction, prepare session handoff |
|
|
31
|
+
| 95%+ | ⛔ Limit | Session handoff required |
|
|
32
|
+
|
|
33
|
+
### Monitoring
|
|
34
|
+
|
|
35
|
+
Pay attention to these signals:
|
|
36
|
+
|
|
37
|
+
- Tool outputs accumulating without being distilled
|
|
38
|
+
- Repeated file reads of the same content
|
|
39
|
+
- Large bash outputs from builds/tests
|
|
40
|
+
- Multiple exploration rounds without synthesis
|
|
41
|
+
|
|
42
|
+
## Compaction Strategies
|
|
43
|
+
|
|
44
|
+
### Strategy 1: Proactive Distillation (Preferred)
|
|
45
|
+
|
|
46
|
+
Distill tool outputs as you finish using them. This is the most granular and least lossy approach.
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
WHEN: You've read a file and extracted what you need
|
|
50
|
+
DO: distill({ targets: [{ id: "X", distillation: "..." }] })
|
|
51
|
+
|
|
52
|
+
WHEN: Bash output gave you the answer you needed
|
|
53
|
+
DO: distill({ targets: [{ id: "Y", distillation: "..." }] })
|
|
54
|
+
|
|
55
|
+
WHEN: Search results identified the relevant files
|
|
56
|
+
DO: distill({ targets: [{ id: "Z", distillation: "..." }] })
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Key principle**: Distill when you're DONE with the raw output, not while you still need it.
|
|
60
|
+
|
|
61
|
+
### Strategy 2: Phase Compression
|
|
62
|
+
|
|
63
|
+
Compress completed conversation phases into dense summaries.
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
WHEN: A research phase is complete and findings are clear
|
|
67
|
+
DO: compress({
|
|
68
|
+
topic: "Auth Research Complete",
|
|
69
|
+
content: {
|
|
70
|
+
startString: "unique text at phase start",
|
|
71
|
+
endString: "unique text at phase end",
|
|
72
|
+
summary: "Complete technical summary of findings..."
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Key principle**: Only compress CLOSED chapters. Never compress active work.
|
|
78
|
+
|
|
79
|
+
### Strategy 3: Noise Pruning
|
|
80
|
+
|
|
81
|
+
Remove tool outputs that add zero value.
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
WHEN: Tool output was irrelevant (wrong file, empty search results)
|
|
85
|
+
DO: prune({ ids: ["X", "Y", "Z"] })
|
|
86
|
+
|
|
87
|
+
WHEN: Earlier output is superseded by newer data
|
|
88
|
+
DO: prune({ ids: ["old_id"] })
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Key principle**: Prune noise, not signal. If in doubt, keep it.
|
|
92
|
+
|
|
93
|
+
### Strategy 4: Session Handoff
|
|
94
|
+
|
|
95
|
+
When context is too large to compact further, hand off to a new session.
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
WHEN: Context > 85% and significant work remains
|
|
99
|
+
DO:
|
|
100
|
+
1. Create handoff document with memory-update
|
|
101
|
+
2. Save all decisions with observation tool
|
|
102
|
+
3. Document current state and remaining work
|
|
103
|
+
4. Start new session with handoff reference
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Compaction Decision Tree
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
Is context growing large?
|
|
110
|
+
├── NO → Continue working normally
|
|
111
|
+
└── YES → What type of content is consuming space?
|
|
112
|
+
├── Tool outputs I'm done with → DISTILL
|
|
113
|
+
├── Completed conversation phases → COMPRESS
|
|
114
|
+
├── Irrelevant/superseded outputs → PRUNE
|
|
115
|
+
└── Everything is still relevant → SESSION HANDOFF
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Custom Summarization Patterns
|
|
119
|
+
|
|
120
|
+
### For Code Exploration
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
## Exploration Summary: [Component/Module]
|
|
124
|
+
|
|
125
|
+
### Architecture
|
|
126
|
+
|
|
127
|
+
- Entry point: `src/auth/index.ts`
|
|
128
|
+
- Key classes: AuthService, TokenManager, SessionStore
|
|
129
|
+
- Dependencies: jwt, bcrypt, redis
|
|
130
|
+
|
|
131
|
+
### Key Findings
|
|
132
|
+
|
|
133
|
+
- Auth flow: login → validate → issue JWT → store session
|
|
134
|
+
- Token rotation: every 15 minutes via refresh endpoint
|
|
135
|
+
- Session storage: Redis with 24h TTL
|
|
136
|
+
|
|
137
|
+
### Decisions Made
|
|
138
|
+
|
|
139
|
+
- Use existing TokenManager (don't replace)
|
|
140
|
+
- Add rate limiting to login endpoint
|
|
141
|
+
- Migrate session store from memory to Redis
|
|
142
|
+
|
|
143
|
+
### Files to Modify
|
|
144
|
+
|
|
145
|
+
- src/auth/service.ts (add rate limiting)
|
|
146
|
+
- src/auth/session.ts (Redis integration)
|
|
147
|
+
- src/config/redis.ts (new file)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### For Implementation Phase
|
|
151
|
+
|
|
152
|
+
```markdown
|
|
153
|
+
## Implementation Summary: [Feature]
|
|
154
|
+
|
|
155
|
+
### Completed
|
|
156
|
+
|
|
157
|
+
- [x] Database schema migration (src/db/migrations/004_auth.ts)
|
|
158
|
+
- [x] API endpoints (src/routes/auth.ts) - 3 new routes
|
|
159
|
+
- [x] Frontend forms (src/components/auth/) - Login, Register, Reset
|
|
160
|
+
|
|
161
|
+
### Verification
|
|
162
|
+
|
|
163
|
+
- TypeScript: ✅ passing
|
|
164
|
+
- Tests: ✅ 12/12 passing
|
|
165
|
+
- Lint: ✅ no issues
|
|
166
|
+
|
|
167
|
+
### Remaining
|
|
168
|
+
|
|
169
|
+
- [ ] Email verification flow
|
|
170
|
+
- [ ] Rate limiting middleware
|
|
171
|
+
|
|
172
|
+
### Key Decisions
|
|
173
|
+
|
|
174
|
+
- JWT expiry: 15 minutes (refresh: 7 days)
|
|
175
|
+
- Password hashing: bcrypt with 12 rounds
|
|
176
|
+
- Session storage: Redis (not in-memory)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### For Debugging
|
|
180
|
+
|
|
181
|
+
```markdown
|
|
182
|
+
## Debug Summary: [Issue]
|
|
183
|
+
|
|
184
|
+
### Symptoms
|
|
185
|
+
|
|
186
|
+
- Error: "TypeError: Cannot read property 'id' of undefined"
|
|
187
|
+
- Location: src/auth/middleware.ts:42
|
|
188
|
+
- Trigger: POST /api/protected when token is expired
|
|
189
|
+
|
|
190
|
+
### Root Cause
|
|
191
|
+
|
|
192
|
+
- Token validation returns null on expired tokens
|
|
193
|
+
- Middleware assumes valid token object, no null check
|
|
194
|
+
- Race condition: token expires between validation and use
|
|
195
|
+
|
|
196
|
+
### Fix Applied
|
|
197
|
+
|
|
198
|
+
- Added null check in middleware (src/auth/middleware.ts:42)
|
|
199
|
+
- Added token refresh attempt before rejecting (src/auth/refresh.ts)
|
|
200
|
+
- Added test for expired token scenario (src/auth/**tests**/middleware.test.ts)
|
|
201
|
+
|
|
202
|
+
### Verification
|
|
203
|
+
|
|
204
|
+
- Tests: ✅ all passing including new test
|
|
205
|
+
- Manual: ✅ expired token now triggers refresh
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Session Handoff Protocol
|
|
209
|
+
|
|
210
|
+
When you must hand off to a new session:
|
|
211
|
+
|
|
212
|
+
### 1. Create Handoff Document
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
memory -
|
|
216
|
+
update({
|
|
217
|
+
file: "handoffs/YYYY-MM-DD-feature-name",
|
|
218
|
+
content: `# Session Handoff: [Feature Name]
|
|
219
|
+
|
|
220
|
+
## Context
|
|
221
|
+
[Why this session started, what was the goal]
|
|
222
|
+
|
|
223
|
+
## Completed Work
|
|
224
|
+
[What was done, files changed, decisions made]
|
|
225
|
+
|
|
226
|
+
## Current State
|
|
227
|
+
[Where things stand right now]
|
|
228
|
+
|
|
229
|
+
## Remaining Work
|
|
230
|
+
[What still needs to be done]
|
|
231
|
+
|
|
232
|
+
## Key Decisions
|
|
233
|
+
[Important choices made and why]
|
|
234
|
+
|
|
235
|
+
## Files Modified
|
|
236
|
+
[List of all files changed with brief description]
|
|
237
|
+
|
|
238
|
+
## Gotchas
|
|
239
|
+
[Things the next session should know]
|
|
240
|
+
`,
|
|
241
|
+
mode: "replace",
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### 2. Save Key Observations
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
observation({
|
|
249
|
+
type: "decision",
|
|
250
|
+
title: "Auth implementation approach",
|
|
251
|
+
narrative: "Chose JWT with Redis sessions because...",
|
|
252
|
+
facts: "JWT 15min expiry, Redis 24h TTL, bcrypt 12 rounds",
|
|
253
|
+
concepts: "authentication, sessions, tokens",
|
|
254
|
+
confidence: "high",
|
|
255
|
+
});
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 3. Resume in New Session
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// In new session:
|
|
262
|
+
memory - read({ file: "handoffs/YYYY-MM-DD-feature-name" });
|
|
263
|
+
memory - search({ query: "auth implementation" });
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Integration with DCP Plugin
|
|
267
|
+
|
|
268
|
+
This project uses `@tarquinen/opencode-dcp` for always-on context management (injected via `experimental.chat.system.transform`):
|
|
269
|
+
|
|
270
|
+
- **distill**: High-fidelity extraction from tool outputs (favored instrument)
|
|
271
|
+
- **compress**: Phase-level conversation compression (sledgehammer — completed phases only)
|
|
272
|
+
- **prune**: Targeted removal of noise (last resort — batch wisely)
|
|
273
|
+
- **Prunable-tools list**: Auto-injected into messages with token estimates
|
|
274
|
+
- **Nudge system**: Reminders every N tool calls + critical limit warnings
|
|
275
|
+
|
|
276
|
+
**Division of responsibility:**
|
|
277
|
+
|
|
278
|
+
- **DCP plugin**: Context budget rules, tool guidance, prunable-tools list, nudges (always present via system prompt)
|
|
279
|
+
- **Compaction plugin** (`.opencode/plugin/compaction.ts`): Session continuity, beads state, handoff recovery, post-compaction protocol (fires during compaction events only)
|
|
280
|
+
|
|
281
|
+
## Anti-Patterns
|
|
282
|
+
|
|
283
|
+
### ❌ Premature Compaction
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
// DON'T compress a file you're about to edit
|
|
287
|
+
compress({ ... }) // Loses exact line numbers you need
|
|
288
|
+
edit({ ... }) // Now you can't find the right location
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Fix**: Keep raw content while actively editing. Compress AFTER the edit phase.
|
|
292
|
+
|
|
293
|
+
### ❌ Lossy Distillation
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
// DON'T distill without capturing key details
|
|
297
|
+
distill({ distillation: "Read the auth file, it has some functions" })
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Fix**: Include function signatures, types, key logic, constraints — everything you'd need to avoid re-reading.
|
|
301
|
+
|
|
302
|
+
### ❌ Compressing Active Work
|
|
303
|
+
|
|
304
|
+
```
|
|
305
|
+
// DON'T compress a conversation phase you might return to
|
|
306
|
+
compress({ summary: "Explored auth options" })
|
|
307
|
+
// Later: "Wait, which options did we consider?"
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Fix**: Only compress CLOSED chapters where findings are crystallized.
|
|
311
|
+
|
|
312
|
+
### ❌ Ignoring Context Growth
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
// DON'T let context grow unchecked until hitting limits
|
|
316
|
+
// By the time you notice, emergency compaction loses information
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Fix**: Monitor regularly. Distill as you go. Compress at natural breakpoints.
|
|
320
|
+
|
|
321
|
+
## Checklist
|
|
322
|
+
|
|
323
|
+
Before compacting:
|
|
324
|
+
|
|
325
|
+
- [ ] Identified what type of content is consuming context
|
|
326
|
+
- [ ] Chosen appropriate strategy (distill/compress/prune/handoff)
|
|
327
|
+
- [ ] Verified raw content is no longer needed for active work
|
|
328
|
+
- [ ] Captured all key details in distillation/summary
|
|
329
|
+
- [ ] Saved important decisions as observations
|
|
330
|
+
- [ ] Created handoff document if switching sessions
|
|
331
|
+
|
|
332
|
+
During long sessions:
|
|
333
|
+
|
|
334
|
+
- [ ] Distilling tool outputs after extracting insights
|
|
335
|
+
- [ ] Compressing completed phases at natural breakpoints
|
|
336
|
+
- [ ] Pruning noise and superseded outputs
|
|
337
|
+
- [ ] Monitoring context usage trends
|
|
338
|
+
- [ ] Planning session handoff if approaching limits
|
|
@@ -1,81 +1,143 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira
|
|
3
|
-
description: Jira and Confluence integration via MCP. Search issues, create tickets, update status,
|
|
3
|
+
description: Jira and Confluence integration via official Atlassian MCP. Search issues, create tickets, update status, and access Confluence docs. Uses OAuth 2.1 authorization with Rovo Search.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Jira & Confluence Integration (MCP)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Official Atlassian MCP Server integration via `atlassian/atlassian-mcp-server`.
|
|
9
|
+
|
|
10
|
+
## Key Features
|
|
11
|
+
|
|
12
|
+
- **OAuth 2.1 Authorization** - Secure browser-based authentication
|
|
13
|
+
- **Rovo Search** - Unified search across Jira and Confluence
|
|
14
|
+
- **Real-time Data** - Direct connection to Atlassian Cloud
|
|
15
|
+
- **Permission-aware** - Respects existing user access controls
|
|
9
16
|
|
|
10
17
|
## Available Tools
|
|
11
18
|
|
|
19
|
+
### Universal Search (Recommended)
|
|
20
|
+
|
|
21
|
+
- `search` - **Rovo Search** - Search Jira and Confluence content (use this by default)
|
|
22
|
+
- `fetch` - Get details by ARI (Atlassian Resource Identifier) from search results
|
|
23
|
+
|
|
12
24
|
### Jira
|
|
13
25
|
|
|
14
|
-
- `
|
|
15
|
-
- `
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
18
|
-
- `
|
|
19
|
-
- `
|
|
26
|
+
- `getJiraIssue` - Get issue details by key or ID
|
|
27
|
+
- `createJiraIssue` - Create new issues
|
|
28
|
+
- `editJiraIssue` - Update existing issues
|
|
29
|
+
- `transitionJiraIssue` - Change issue status
|
|
30
|
+
- `addCommentToJiraIssue` - Add comments to issues
|
|
31
|
+
- `addWorklogToJiraIssue` - Log work time
|
|
32
|
+
- `searchJiraIssuesUsingJql` - Search with JQL queries
|
|
33
|
+
- `getTransitionsForJiraIssue` - Get available status transitions
|
|
34
|
+
- `getVisibleJiraProjects` - List accessible projects
|
|
35
|
+
- `getJiraProjectIssueTypesMetadata` - Get issue types for a project
|
|
36
|
+
- `getJiraIssueTypeMetaWithFields` - Get field metadata for issue type
|
|
37
|
+
- `getJiraIssueRemoteIssueLinks` - Get remote links
|
|
38
|
+
- `lookupJiraAccountId` - Find user account IDs
|
|
20
39
|
|
|
21
40
|
### Confluence
|
|
22
41
|
|
|
23
|
-
- `
|
|
24
|
-
- `
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
42
|
+
- `getConfluencePage` - Get page content by ID
|
|
43
|
+
- `createConfluencePage` - Create new pages
|
|
44
|
+
- `updateConfluencePage` - Update existing pages
|
|
45
|
+
- `searchConfluenceUsingCql` - Search with CQL queries
|
|
46
|
+
- `getConfluenceSpaces` - List spaces
|
|
47
|
+
- `getPagesInConfluenceSpace` - List pages in a space
|
|
48
|
+
- `getConfluencePageDescendants` - Get child pages
|
|
49
|
+
- `getConfluencePageFooterComments` - Get footer comments
|
|
50
|
+
- `getConfluencePageInlineComments` - Get inline comments
|
|
51
|
+
- `createConfluenceFooterComment` - Add footer comment
|
|
52
|
+
- `createConfluenceInlineComment` - Add inline comment on specific text
|
|
53
|
+
|
|
54
|
+
### Utility
|
|
55
|
+
|
|
56
|
+
- `atlassianUserInfo` - Get current user info
|
|
57
|
+
- `getAccessibleAtlassianResources` - Get cloudId for API calls
|
|
28
58
|
|
|
29
59
|
## Quick Start
|
|
30
60
|
|
|
31
|
-
### 1.
|
|
61
|
+
### 1. Configuration
|
|
62
|
+
|
|
63
|
+
The MCP server uses OAuth 2.1 - no API tokens needed. Configuration in `mcp.json`:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"jira": {
|
|
68
|
+
"command": "npx",
|
|
69
|
+
"args": ["-y", "mcp-remote", "https://mcp.atlassian.com/v1/sse"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2. Get Cloud ID
|
|
32
75
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
76
|
+
Most tools require a `cloudId`. Get it from your site URL or use the utility:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// Get accessible resources and cloudId
|
|
80
|
+
skill_mcp(
|
|
81
|
+
(skill_name = "jira"),
|
|
82
|
+
(tool_name = "getAccessibleAtlassianResources"),
|
|
83
|
+
(arguments = "{}"),
|
|
84
|
+
);
|
|
39
85
|
```
|
|
40
86
|
|
|
41
|
-
|
|
87
|
+
Or use your site URL directly as cloudId (e.g., `"ibet.atlassian.net"`).
|
|
42
88
|
|
|
43
|
-
###
|
|
89
|
+
### 3. Use MCP Tools
|
|
44
90
|
|
|
45
91
|
```typescript
|
|
46
|
-
//
|
|
92
|
+
// Universal search (recommended for discovery)
|
|
47
93
|
skill_mcp(
|
|
48
94
|
(skill_name = "jira"),
|
|
49
|
-
(tool_name = "
|
|
50
|
-
(arguments = '{"
|
|
95
|
+
(tool_name = "search"),
|
|
96
|
+
(arguments = '{"query": "authentication bug"}'),
|
|
51
97
|
);
|
|
52
98
|
|
|
53
99
|
// Get issue details
|
|
54
100
|
skill_mcp(
|
|
55
101
|
(skill_name = "jira"),
|
|
56
|
-
(tool_name = "
|
|
57
|
-
(arguments = '{"
|
|
102
|
+
(tool_name = "getJiraIssue"),
|
|
103
|
+
(arguments = '{"cloudId": "your-site.atlassian.net", "issueIdOrKey": "PROJ-123"}'),
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
// Search with JQL
|
|
107
|
+
skill_mcp(
|
|
108
|
+
(skill_name = "jira"),
|
|
109
|
+
(tool_name = "searchJiraIssuesUsingJql"),
|
|
110
|
+
(arguments = '{"cloudId": "your-site.atlassian.net", "jql": "project = PROJ AND status = Open"}'),
|
|
58
111
|
);
|
|
59
112
|
|
|
60
113
|
// Create issue
|
|
61
114
|
skill_mcp(
|
|
62
115
|
(skill_name = "jira"),
|
|
63
|
-
(tool_name = "
|
|
64
|
-
(arguments =
|
|
116
|
+
(tool_name = "createJiraIssue"),
|
|
117
|
+
(arguments =
|
|
118
|
+
'{"cloudId": "your-site.atlassian.net", "projectKey": "PROJ", "issueTypeName": "Bug", "summary": "Login fails on mobile"}'),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// Transition issue status
|
|
122
|
+
skill_mcp(
|
|
123
|
+
(skill_name = "jira"),
|
|
124
|
+
(tool_name = "transitionJiraIssue"),
|
|
125
|
+
(arguments =
|
|
126
|
+
'{"cloudId": "your-site.atlassian.net", "issueIdOrKey": "PROJ-123", "transition": {"id": "21"}}'),
|
|
65
127
|
);
|
|
66
128
|
|
|
67
|
-
//
|
|
129
|
+
// Get Confluence page
|
|
68
130
|
skill_mcp(
|
|
69
131
|
(skill_name = "jira"),
|
|
70
|
-
(tool_name = "
|
|
71
|
-
(arguments = '{"
|
|
132
|
+
(tool_name = "getConfluencePage"),
|
|
133
|
+
(arguments = '{"cloudId": "your-site.atlassian.net", "pageId": "123456789"}'),
|
|
72
134
|
);
|
|
73
135
|
|
|
74
|
-
// Search Confluence
|
|
136
|
+
// Search Confluence with CQL
|
|
75
137
|
skill_mcp(
|
|
76
138
|
(skill_name = "jira"),
|
|
77
|
-
(tool_name = "
|
|
78
|
-
(arguments = '{"cql": "title ~ \"Onboarding\""}'),
|
|
139
|
+
(tool_name = "searchConfluenceUsingCql"),
|
|
140
|
+
(arguments = '{"cloudId": "your-site.atlassian.net", "cql": "title ~ \"Onboarding\""}'),
|
|
79
141
|
);
|
|
80
142
|
```
|
|
81
143
|
|
|
@@ -86,8 +148,9 @@ skill_mcp(
|
|
|
86
148
|
```typescript
|
|
87
149
|
skill_mcp(
|
|
88
150
|
(skill_name = "jira"),
|
|
89
|
-
(tool_name = "
|
|
90
|
-
(arguments =
|
|
151
|
+
(tool_name = "searchJiraIssuesUsingJql"),
|
|
152
|
+
(arguments =
|
|
153
|
+
'{"cloudId": "your-site.atlassian.net", "jql": "assignee = currentUser() AND updated >= -1d"}'),
|
|
91
154
|
);
|
|
92
155
|
```
|
|
93
156
|
|
|
@@ -96,8 +159,9 @@ skill_mcp(
|
|
|
96
159
|
```typescript
|
|
97
160
|
skill_mcp(
|
|
98
161
|
(skill_name = "jira"),
|
|
99
|
-
(tool_name = "
|
|
100
|
-
(arguments =
|
|
162
|
+
(tool_name = "searchJiraIssuesUsingJql"),
|
|
163
|
+
(arguments =
|
|
164
|
+
'{"cloudId": "your-site.atlassian.net", "jql": "type = Bug AND priority in (High, Critical) AND status != Done"}'),
|
|
101
165
|
);
|
|
102
166
|
```
|
|
103
167
|
|
|
@@ -106,9 +170,27 @@ skill_mcp(
|
|
|
106
170
|
```typescript
|
|
107
171
|
skill_mcp(
|
|
108
172
|
(skill_name = "jira"),
|
|
109
|
-
(tool_name = "
|
|
173
|
+
(tool_name = "searchJiraIssuesUsingJql"),
|
|
110
174
|
(arguments =
|
|
111
|
-
'{"
|
|
175
|
+
'{"cloudId": "your-site.atlassian.net", "jql": "project = PROJ AND sprint in openSprints()"}'),
|
|
176
|
+
);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Quick Discovery with Rovo Search
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
// Best for finding content when you don't know exact location
|
|
183
|
+
skill_mcp(
|
|
184
|
+
(skill_name = "jira"),
|
|
185
|
+
(tool_name = "search"),
|
|
186
|
+
(arguments = '{"query": "authentication implementation"}'),
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// Then fetch details using ARI from results
|
|
190
|
+
skill_mcp(
|
|
191
|
+
(skill_name = "jira"),
|
|
192
|
+
(tool_name = "fetch"),
|
|
193
|
+
(arguments = '{"id": "ari:cloud:jira:cloudId:issue/10107"}'),
|
|
112
194
|
);
|
|
113
195
|
```
|
|
114
196
|
|
|
@@ -126,21 +208,66 @@ project = PROJ AND updated >= -7d
|
|
|
126
208
|
|
|
127
209
|
-- Current sprint
|
|
128
210
|
project = PROJ AND sprint in openSprints()
|
|
211
|
+
|
|
212
|
+
-- Unassigned in backlog
|
|
213
|
+
project = PROJ AND assignee is EMPTY AND status = "To Do"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## CQL Examples (Confluence)
|
|
217
|
+
|
|
218
|
+
```sql
|
|
219
|
+
-- Pages with title containing "guide"
|
|
220
|
+
title ~ "guide"
|
|
221
|
+
|
|
222
|
+
-- Pages in specific space
|
|
223
|
+
space = "TEAM" AND type = page
|
|
224
|
+
|
|
225
|
+
-- Recently modified
|
|
226
|
+
lastModified >= now("-7d")
|
|
227
|
+
|
|
228
|
+
-- Pages by creator
|
|
229
|
+
creator = currentUser()
|
|
129
230
|
```
|
|
130
231
|
|
|
131
|
-
##
|
|
232
|
+
## Content Format Options
|
|
132
233
|
|
|
133
|
-
For
|
|
234
|
+
For Confluence pages, you can specify content format:
|
|
134
235
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
236
|
+
- `"markdown"` - Markdown format (easier to read/write)
|
|
237
|
+
- `"adf"` - Atlassian Document Format (native format)
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
skill_mcp(
|
|
241
|
+
(skill_name = "jira"),
|
|
242
|
+
(tool_name = "getConfluencePage"),
|
|
243
|
+
(arguments =
|
|
244
|
+
'{"cloudId": "your-site.atlassian.net", "pageId": "123456", "contentFormat": "markdown"}'),
|
|
245
|
+
);
|
|
139
246
|
```
|
|
140
247
|
|
|
141
|
-
|
|
248
|
+
## Transition Workflow
|
|
249
|
+
|
|
250
|
+
To change issue status, first get available transitions:
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// 1. Get available transitions
|
|
254
|
+
skill_mcp(
|
|
255
|
+
(skill_name = "jira"),
|
|
256
|
+
(tool_name = "getTransitionsForJiraIssue"),
|
|
257
|
+
(arguments = '{"cloudId": "your-site.atlassian.net", "issueIdOrKey": "PROJ-123"}'),
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
// 2. Use transition ID to change status
|
|
261
|
+
skill_mcp(
|
|
262
|
+
(skill_name = "jira"),
|
|
263
|
+
(tool_name = "transitionJiraIssue"),
|
|
264
|
+
(arguments =
|
|
265
|
+
'{"cloudId": "your-site.atlassian.net", "issueIdOrKey": "PROJ-123", "transition": {"id": "31"}}'),
|
|
266
|
+
);
|
|
267
|
+
```
|
|
142
268
|
|
|
143
269
|
## Resources
|
|
144
270
|
|
|
145
|
-
- GitHub: https://github.com/
|
|
146
|
-
- Docs: https://
|
|
271
|
+
- GitHub: https://github.com/atlassian/atlassian-mcp-server
|
|
272
|
+
- Docs: https://www.atlassian.com/platform/remote-mcp-server
|
|
273
|
+
- Admin Guide: https://support.atlassian.com/security-and-access-policies/docs/understand-atlassian-rovo-mcp-server/
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"jira": {
|
|
3
|
-
"command": "
|
|
4
|
-
"args": ["mcp-atlassian"]
|
|
5
|
-
"env": {
|
|
6
|
-
"JIRA_URL": "{env:JIRA_URL}",
|
|
7
|
-
"JIRA_USERNAME": "{env:JIRA_USERNAME}",
|
|
8
|
-
"JIRA_API_TOKEN": "{env:JIRA_API_TOKEN}",
|
|
9
|
-
"CONFLUENCE_URL": "{env:CONFLUENCE_URL}",
|
|
10
|
-
"CONFLUENCE_USERNAME": "{env:CONFLUENCE_USERNAME}",
|
|
11
|
-
"CONFLUENCE_API_TOKEN": "{env:CONFLUENCE_API_TOKEN}"
|
|
12
|
-
}
|
|
3
|
+
"command": "npx",
|
|
4
|
+
"args": ["-y", "mcp-remote", "https://mcp.atlassian.com/v1/sse"]
|
|
13
5
|
}
|
|
14
6
|
}
|
package/package.json
CHANGED