@nextsparkjs/ai-workflow 0.1.0-beta.100
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/LICENSE +21 -0
- package/README.md +115 -0
- package/claude/_docs/workflows-optimizations.md +359 -0
- package/claude/agents/api-tester.md +634 -0
- package/claude/agents/architecture-supervisor.md +1351 -0
- package/claude/agents/backend-developer.md +997 -0
- package/claude/agents/backend-validator.md +417 -0
- package/claude/agents/bdd-docs-writer.md +737 -0
- package/claude/agents/block-developer.md +677 -0
- package/claude/agents/code-reviewer.md +1432 -0
- package/claude/agents/db-developer.md +721 -0
- package/claude/agents/db-validator.md +407 -0
- package/claude/agents/demo-video-generator.md +493 -0
- package/claude/agents/documentation-writer.md +1268 -0
- package/claude/agents/frontend-developer.md +1234 -0
- package/claude/agents/frontend-validator.md +777 -0
- package/claude/agents/functional-validator.md +630 -0
- package/claude/agents/mock-analyst.md +387 -0
- package/claude/agents/product-manager.md +963 -0
- package/claude/agents/qa-automation.md +1762 -0
- package/claude/agents/release-manager.md +634 -0
- package/claude/agents/selectors-translator.md +262 -0
- package/claude/agents/unit-test-writer.md +785 -0
- package/claude/agents/visual-comparator.md +329 -0
- package/claude/agents/workflow-maintainer.md +352 -0
- package/claude/commands/do/README.md +88 -0
- package/claude/commands/do/create-api.md +64 -0
- package/claude/commands/do/create-entity.md +66 -0
- package/claude/commands/do/create-migration.md +64 -0
- package/claude/commands/do/create-plugin.md +56 -0
- package/claude/commands/do/create-theme.md +70 -0
- package/claude/commands/do/mock-data.md +67 -0
- package/claude/commands/do/reset-db.md +71 -0
- package/claude/commands/do/setup-scheduled-action.md +75 -0
- package/claude/commands/do/sync-code-review.md +117 -0
- package/claude/commands/do/update-selectors.md +112 -0
- package/claude/commands/do/use-skills.md +90 -0
- package/claude/commands/do/validate-blocks.md +69 -0
- package/claude/commands/how-to/README.md +261 -0
- package/claude/commands/how-to/add-metadata.md +692 -0
- package/claude/commands/how-to/add-taxonomies.md +806 -0
- package/claude/commands/how-to/add-translations.md +571 -0
- package/claude/commands/how-to/create-api.md +577 -0
- package/claude/commands/how-to/create-block.md +575 -0
- package/claude/commands/how-to/create-child-entities.md +771 -0
- package/claude/commands/how-to/create-entity.md +597 -0
- package/claude/commands/how-to/create-migrations.md +605 -0
- package/claude/commands/how-to/create-plugin.md +654 -0
- package/claude/commands/how-to/customize-app.md +481 -0
- package/claude/commands/how-to/customize-dashboard.md +553 -0
- package/claude/commands/how-to/customize-theme.md +438 -0
- package/claude/commands/how-to/define-features-flows.md +632 -0
- package/claude/commands/how-to/deploy.md +507 -0
- package/claude/commands/how-to/handle-file-uploads.md +746 -0
- package/claude/commands/how-to/implement-search.md +1001 -0
- package/claude/commands/how-to/install-plugins.md +352 -0
- package/claude/commands/how-to/manage-test-coverage.md +984 -0
- package/claude/commands/how-to/run-tests.md +400 -0
- package/claude/commands/how-to/set-app-languages.md +601 -0
- package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
- package/claude/commands/how-to/set-scheduled-actions.md +527 -0
- package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
- package/claude/commands/how-to/setup-authentication.md +388 -0
- package/claude/commands/how-to/setup-claude-code.md +440 -0
- package/claude/commands/how-to/setup-database.md +274 -0
- package/claude/commands/how-to/setup-email-providers.md +598 -0
- package/claude/commands/how-to/setup-mobile-dev.md +627 -0
- package/claude/commands/how-to/start.md +500 -0
- package/claude/commands/how-to/use-devtools.md +639 -0
- package/claude/commands/how-to/use-superadmin.md +622 -0
- package/claude/commands/session/README.md +193 -0
- package/claude/commands/session/block-create.md +190 -0
- package/claude/commands/session/block-list.md +203 -0
- package/claude/commands/session/block-update.md +192 -0
- package/claude/commands/session/block-validate.md +218 -0
- package/claude/commands/session/changelog.md +115 -0
- package/claude/commands/session/close.md +225 -0
- package/claude/commands/session/commit.md +174 -0
- package/claude/commands/session/db-entity.md +206 -0
- package/claude/commands/session/db-fix.md +212 -0
- package/claude/commands/session/db-sample.md +206 -0
- package/claude/commands/session/demo.md +178 -0
- package/claude/commands/session/doc-bdd.md +207 -0
- package/claude/commands/session/doc-feature.md +218 -0
- package/claude/commands/session/doc-read.md +225 -0
- package/claude/commands/session/execute.md +204 -0
- package/claude/commands/session/explain.md +202 -0
- package/claude/commands/session/fix-bug.md +210 -0
- package/claude/commands/session/fix-build.md +182 -0
- package/claude/commands/session/fix-test.md +189 -0
- package/claude/commands/session/pending.md +232 -0
- package/claude/commands/session/refine.md +188 -0
- package/claude/commands/session/resume.md +192 -0
- package/claude/commands/session/review.md +192 -0
- package/claude/commands/session/scope-change.md +181 -0
- package/claude/commands/session/start-blocks.md +347 -0
- package/claude/commands/session/start.md +604 -0
- package/claude/commands/session/status.md +169 -0
- package/claude/commands/session/test-fix.md +221 -0
- package/claude/commands/session/test-run.md +203 -0
- package/claude/commands/session/test-write.md +242 -0
- package/claude/commands/session/validate.md +162 -0
- package/claude/config/context.json +40 -0
- package/claude/config/github.json +69 -0
- package/claude/config/github.schema.json +106 -0
- package/claude/config/team.json +46 -0
- package/claude/config/team.schema.json +106 -0
- package/claude/config/workspace.json +43 -0
- package/claude/config/workspace.schema.json +75 -0
- package/claude/skills/README.md +228 -0
- package/claude/skills/accessibility/SKILL.md +573 -0
- package/claude/skills/api-bypass-layers/SKILL.md +550 -0
- package/claude/skills/asana-integration/SKILL.md +499 -0
- package/claude/skills/better-auth/SKILL.md +666 -0
- package/claude/skills/billing-subscriptions/SKILL.md +660 -0
- package/claude/skills/block-decision-matrix/SKILL.md +359 -0
- package/claude/skills/clickup-integration/SKILL.md +434 -0
- package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
- package/claude/skills/create-plugin/SKILL.md +425 -0
- package/claude/skills/create-theme/SKILL.md +331 -0
- package/claude/skills/cypress-api/SKILL.md +511 -0
- package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
- package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
- package/claude/skills/cypress-e2e/SKILL.md +526 -0
- package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
- package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
- package/claude/skills/cypress-selectors/SKILL.md +309 -0
- package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
- package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
- package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
- package/claude/skills/database-migrations/SKILL.md +335 -0
- package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
- package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
- package/claude/skills/design-system/SKILL.md +682 -0
- package/claude/skills/documentation/SKILL.md +540 -0
- package/claude/skills/entity-api/SKILL.md +482 -0
- package/claude/skills/entity-system/SKILL.md +635 -0
- package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
- package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
- package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
- package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
- package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
- package/claude/skills/github/SKILL.md +467 -0
- package/claude/skills/i18n-nextintl/SKILL.md +302 -0
- package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
- package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
- package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
- package/claude/skills/impact-analysis/SKILL.md +203 -0
- package/claude/skills/jest-unit/SKILL.md +306 -0
- package/claude/skills/jest-unit/references/component-testing.md +371 -0
- package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
- package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
- package/claude/skills/jira-integration/SKILL.md +539 -0
- package/claude/skills/media-library/SKILL.md +743 -0
- package/claude/skills/mock-analysis/SKILL.md +276 -0
- package/claude/skills/monorepo-architecture/SKILL.md +162 -0
- package/claude/skills/nextjs-api-development/SKILL.md +364 -0
- package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
- package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
- package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
- package/claude/skills/notion-integration/SKILL.md +641 -0
- package/claude/skills/npm-development-workflow/SKILL.md +480 -0
- package/claude/skills/page-builder-blocks/SKILL.md +530 -0
- package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
- package/claude/skills/permissions-system/SKILL.md +619 -0
- package/claude/skills/plugins/SKILL.md +340 -0
- package/claude/skills/plugins/references/plugin-templates.md +414 -0
- package/claude/skills/plugins/references/plugin-testing.md +353 -0
- package/claude/skills/plugins/references/plugin-types.md +198 -0
- package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
- package/claude/skills/pom-patterns/SKILL.md +452 -0
- package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
- package/claude/skills/rate-limiting/SKILL.md +342 -0
- package/claude/skills/react-best-practices/AGENTS.md +2410 -0
- package/claude/skills/react-best-practices/README.md +123 -0
- package/claude/skills/react-best-practices/SKILL.md +125 -0
- package/claude/skills/react-best-practices/metadata.json +15 -0
- package/claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/claude/skills/react-best-practices/rules/_template.md +28 -0
- package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/claude/skills/react-patterns/SKILL.md +688 -0
- package/claude/skills/registry-system/SKILL.md +331 -0
- package/claude/skills/scheduled-actions/SKILL.md +671 -0
- package/claude/skills/scope-enforcement/SKILL.md +542 -0
- package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
- package/claude/skills/server-actions/SKILL.md +493 -0
- package/claude/skills/service-layer/SKILL.md +587 -0
- package/claude/skills/session-management/SKILL.md +266 -0
- package/claude/skills/session-management/scripts/create-session.py +166 -0
- package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
- package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
- package/claude/skills/session-management/scripts/session-archive.sh +87 -0
- package/claude/skills/session-management/scripts/session-close.sh +133 -0
- package/claude/skills/session-management/scripts/session-init.sh +225 -0
- package/claude/skills/session-management/scripts/session-list.sh +163 -0
- package/claude/skills/session-management/scripts/split-plan.sh +116 -0
- package/claude/skills/shadcn-components/SKILL.md +586 -0
- package/claude/skills/shadcn-theming/SKILL.md +446 -0
- package/claude/skills/suspense-loading/SKILL.md +280 -0
- package/claude/skills/tailwind-theming/SKILL.md +507 -0
- package/claude/skills/tanstack-query/SKILL.md +608 -0
- package/claude/skills/test-coverage/SKILL.md +239 -0
- package/claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/claude/skills/zod-validation/SKILL.md +537 -0
- package/claude/templates/blocks/progress.md +86 -0
- package/claude/templates/iteration/changes.md +61 -0
- package/claude/templates/iteration/progress.md +55 -0
- package/claude/templates/log.md +31 -0
- package/claude/templates/story/context.md +77 -0
- package/claude/templates/story/pendings.md +37 -0
- package/claude/templates/story/plan.md +299 -0
- package/claude/templates/story/requirements.md +109 -0
- package/claude/templates/story/scope.json +10 -0
- package/claude/templates/story/tests.md +91 -0
- package/claude/templates/task/progress.md +58 -0
- package/claude/templates/task/requirements.md +54 -0
- package/claude/workflows/README.md +154 -0
- package/claude/workflows/blocks.md +614 -0
- package/claude/workflows/story.md +1207 -0
- package/claude/workflows/task.md +927 -0
- package/claude/workflows/tweak.md +527 -0
- package/cursor/.gitkeep +0 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +198 -0
- package/scripts/setup.mjs +282 -0
- package/scripts/sync.mjs +209 -0
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jira-integration
|
|
3
|
+
description: |
|
|
4
|
+
Jira integration patterns for project management.
|
|
5
|
+
Covers REST API, webhooks, JQL queries, and automation.
|
|
6
|
+
Use this skill when implementing Jira features or syncing sessions with issues.
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash
|
|
8
|
+
version: 1.0.0
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Jira Integration Skill
|
|
12
|
+
|
|
13
|
+
Integration patterns for syncing development sessions with Jira issues.
|
|
14
|
+
|
|
15
|
+
## Architecture Overview
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
19
|
+
│ JIRA INTEGRATION │
|
|
20
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
21
|
+
│ │
|
|
22
|
+
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
23
|
+
│ │ Claude │────►│ REST API │────►│ Jira │ │
|
|
24
|
+
│ │ Session │◄────│ Client │◄────│ Cloud │ │
|
|
25
|
+
│ └─────────────┘ └──────────────┘ └──────────────┘ │
|
|
26
|
+
│ │ │ │
|
|
27
|
+
│ ▼ ▼ │
|
|
28
|
+
│ ┌─────────────┐ ┌──────────────┐ │
|
|
29
|
+
│ │ Session │ │ Webhooks │ │
|
|
30
|
+
│ │ Files │ │ │ │
|
|
31
|
+
│ └─────────────┘ └──────────────┘ │
|
|
32
|
+
│ │
|
|
33
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## When to Use This Skill
|
|
39
|
+
|
|
40
|
+
- Setting up Jira integration for the first time
|
|
41
|
+
- Syncing development sessions with Jira issues
|
|
42
|
+
- Creating issues from Claude sessions
|
|
43
|
+
- Updating issue status via transitions
|
|
44
|
+
- Querying issues with JQL
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Configuration
|
|
49
|
+
|
|
50
|
+
### .claude/config/workspace.json
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"taskManager": {
|
|
55
|
+
"enabled": true,
|
|
56
|
+
"provider": "jira",
|
|
57
|
+
"syncWithSession": true,
|
|
58
|
+
"autoUpdateStatus": true,
|
|
59
|
+
"config": {
|
|
60
|
+
"domain": "your-domain.atlassian.net",
|
|
61
|
+
"email": "${JIRA_EMAIL}",
|
|
62
|
+
"apiToken": "${JIRA_API_TOKEN}",
|
|
63
|
+
"defaultProject": "PROJ"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Environment Variables
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# .env.local
|
|
73
|
+
JIRA_EMAIL=your-email@company.com
|
|
74
|
+
JIRA_API_TOKEN=ATATT3xFfGF0...
|
|
75
|
+
JIRA_DOMAIN=your-domain.atlassian.net
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Authentication
|
|
81
|
+
|
|
82
|
+
### API Token Authentication
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// Basic auth with email:token
|
|
86
|
+
const auth = Buffer.from(
|
|
87
|
+
`${process.env.JIRA_EMAIL}:${process.env.JIRA_API_TOKEN}`
|
|
88
|
+
).toString('base64');
|
|
89
|
+
|
|
90
|
+
const headers = {
|
|
91
|
+
'Authorization': `Basic ${auth}`,
|
|
92
|
+
'Content-Type': 'application/json',
|
|
93
|
+
'Accept': 'application/json'
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// Base URL
|
|
97
|
+
const BASE_URL = `https://${process.env.JIRA_DOMAIN}/rest/api/3`;
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### OAuth 2.0 (Atlassian Connect)
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// For Atlassian Connect apps
|
|
104
|
+
const headers = {
|
|
105
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
106
|
+
'Content-Type': 'application/json'
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## API Patterns
|
|
113
|
+
|
|
114
|
+
### Common Endpoints
|
|
115
|
+
|
|
116
|
+
| Endpoint | Method | Description |
|
|
117
|
+
|----------|--------|-------------|
|
|
118
|
+
| `/myself` | GET | Get current user |
|
|
119
|
+
| `/project` | GET | List all projects |
|
|
120
|
+
| `/project/{key}` | GET | Get project details |
|
|
121
|
+
| `/search` | GET/POST | Search issues (JQL) |
|
|
122
|
+
| `/issue` | POST | Create issue |
|
|
123
|
+
| `/issue/{issueKey}` | GET/PUT/DELETE | Issue operations |
|
|
124
|
+
| `/issue/{issueKey}/transitions` | GET/POST | Get/Execute transitions |
|
|
125
|
+
| `/issue/{issueKey}/comment` | GET/POST | Issue comments |
|
|
126
|
+
|
|
127
|
+
### Issue Structure
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
interface JiraIssue {
|
|
131
|
+
id: string;
|
|
132
|
+
key: string;
|
|
133
|
+
self: string;
|
|
134
|
+
fields: {
|
|
135
|
+
summary: string;
|
|
136
|
+
description: {
|
|
137
|
+
type: 'doc';
|
|
138
|
+
version: 1;
|
|
139
|
+
content: Array<any>; // Atlassian Document Format
|
|
140
|
+
};
|
|
141
|
+
issuetype: {
|
|
142
|
+
id: string;
|
|
143
|
+
name: string;
|
|
144
|
+
};
|
|
145
|
+
status: {
|
|
146
|
+
id: string;
|
|
147
|
+
name: string;
|
|
148
|
+
statusCategory: {
|
|
149
|
+
key: string;
|
|
150
|
+
name: string;
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
priority: {
|
|
154
|
+
id: string;
|
|
155
|
+
name: string;
|
|
156
|
+
};
|
|
157
|
+
assignee: {
|
|
158
|
+
accountId: string;
|
|
159
|
+
displayName: string;
|
|
160
|
+
emailAddress: string;
|
|
161
|
+
} | null;
|
|
162
|
+
reporter: {
|
|
163
|
+
accountId: string;
|
|
164
|
+
displayName: string;
|
|
165
|
+
};
|
|
166
|
+
labels: string[];
|
|
167
|
+
customfield_XXXXX: any; // Custom fields
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## JQL Query Patterns
|
|
175
|
+
|
|
176
|
+
### Basic Queries
|
|
177
|
+
|
|
178
|
+
```jql
|
|
179
|
+
-- Issues in project
|
|
180
|
+
project = PROJ
|
|
181
|
+
|
|
182
|
+
-- My open issues
|
|
183
|
+
assignee = currentUser() AND status != Done
|
|
184
|
+
|
|
185
|
+
-- Recent issues
|
|
186
|
+
created >= -7d
|
|
187
|
+
|
|
188
|
+
-- By status category
|
|
189
|
+
statusCategory = "In Progress"
|
|
190
|
+
|
|
191
|
+
-- With labels
|
|
192
|
+
labels in (feature, urgent)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Complex Queries
|
|
196
|
+
|
|
197
|
+
```jql
|
|
198
|
+
-- Issues for sprint
|
|
199
|
+
project = PROJ
|
|
200
|
+
AND sprint in openSprints()
|
|
201
|
+
AND status != Done
|
|
202
|
+
ORDER BY priority DESC
|
|
203
|
+
|
|
204
|
+
-- Blocked issues
|
|
205
|
+
project = PROJ
|
|
206
|
+
AND status = Blocked
|
|
207
|
+
AND updated <= -2d
|
|
208
|
+
|
|
209
|
+
-- Search in text
|
|
210
|
+
project = PROJ
|
|
211
|
+
AND (summary ~ "authentication" OR description ~ "authentication")
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### API Usage
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
// Search with JQL
|
|
218
|
+
const response = await fetch(
|
|
219
|
+
`${BASE_URL}/search?jql=${encodeURIComponent(jql)}&maxResults=50`,
|
|
220
|
+
{ headers }
|
|
221
|
+
);
|
|
222
|
+
const { issues, total } = await response.json();
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Session Sync Patterns
|
|
228
|
+
|
|
229
|
+
### Linking Session to Issue
|
|
230
|
+
|
|
231
|
+
```markdown
|
|
232
|
+
# In requirements.md
|
|
233
|
+
|
|
234
|
+
## Jira Issue
|
|
235
|
+
- **Issue Key:** PROJ-123
|
|
236
|
+
- **URL:** https://your-domain.atlassian.net/browse/PROJ-123
|
|
237
|
+
- **Status:** In Progress
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Status Transitions
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
// Get available transitions
|
|
244
|
+
const transitions = await fetch(
|
|
245
|
+
`${BASE_URL}/issue/PROJ-123/transitions`,
|
|
246
|
+
{ headers }
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
// Execute transition
|
|
250
|
+
await fetch(
|
|
251
|
+
`${BASE_URL}/issue/PROJ-123/transitions`,
|
|
252
|
+
{
|
|
253
|
+
method: 'POST',
|
|
254
|
+
headers,
|
|
255
|
+
body: JSON.stringify({
|
|
256
|
+
transition: { id: "31" }, // "In Progress" transition ID
|
|
257
|
+
fields: {
|
|
258
|
+
// Optional: update fields during transition
|
|
259
|
+
assignee: { accountId: "xxx" }
|
|
260
|
+
},
|
|
261
|
+
update: {
|
|
262
|
+
comment: [{
|
|
263
|
+
add: {
|
|
264
|
+
body: {
|
|
265
|
+
type: "doc",
|
|
266
|
+
version: 1,
|
|
267
|
+
content: [{
|
|
268
|
+
type: "paragraph",
|
|
269
|
+
content: [{
|
|
270
|
+
type: "text",
|
|
271
|
+
text: "Started development session"
|
|
272
|
+
}]
|
|
273
|
+
}]
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}]
|
|
277
|
+
}
|
|
278
|
+
})
|
|
279
|
+
}
|
|
280
|
+
);
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Auto-Update Status Map
|
|
284
|
+
|
|
285
|
+
| Session Event | Jira Transition |
|
|
286
|
+
|---------------|-----------------|
|
|
287
|
+
| Session created | "Start Progress" |
|
|
288
|
+
| Blocked | "Flag" or custom |
|
|
289
|
+
| Session closed (success) | "Done" |
|
|
290
|
+
| Session closed (partial) | "In Review" |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Atlassian Document Format (ADF)
|
|
295
|
+
|
|
296
|
+
Jira uses ADF for rich text fields.
|
|
297
|
+
|
|
298
|
+
### Basic Structure
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
const adfContent = {
|
|
302
|
+
type: "doc",
|
|
303
|
+
version: 1,
|
|
304
|
+
content: [
|
|
305
|
+
{
|
|
306
|
+
type: "paragraph",
|
|
307
|
+
content: [
|
|
308
|
+
{ type: "text", text: "Hello " },
|
|
309
|
+
{ type: "text", text: "world", marks: [{ type: "strong" }] }
|
|
310
|
+
]
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
type: "bulletList",
|
|
314
|
+
content: [
|
|
315
|
+
{
|
|
316
|
+
type: "listItem",
|
|
317
|
+
content: [
|
|
318
|
+
{
|
|
319
|
+
type: "paragraph",
|
|
320
|
+
content: [{ type: "text", text: "Item 1" }]
|
|
321
|
+
}
|
|
322
|
+
]
|
|
323
|
+
}
|
|
324
|
+
]
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
};
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Common Node Types
|
|
331
|
+
|
|
332
|
+
| Type | Usage |
|
|
333
|
+
|------|-------|
|
|
334
|
+
| `paragraph` | Text block |
|
|
335
|
+
| `heading` | H1-H6 headers |
|
|
336
|
+
| `bulletList` | Unordered list |
|
|
337
|
+
| `orderedList` | Numbered list |
|
|
338
|
+
| `codeBlock` | Code snippet |
|
|
339
|
+
| `table` | Table structure |
|
|
340
|
+
| `mention` | @mention user |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Webhook Configuration
|
|
345
|
+
|
|
346
|
+
### Setting Up Webhooks
|
|
347
|
+
|
|
348
|
+
Jira webhooks are configured in Project Settings > Webhooks.
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
// Webhook payload structure
|
|
352
|
+
interface JiraWebhook {
|
|
353
|
+
timestamp: number;
|
|
354
|
+
webhookEvent: string;
|
|
355
|
+
issue_event_type_name: string;
|
|
356
|
+
user: {
|
|
357
|
+
accountId: string;
|
|
358
|
+
displayName: string;
|
|
359
|
+
};
|
|
360
|
+
issue: JiraIssue;
|
|
361
|
+
changelog?: {
|
|
362
|
+
items: Array<{
|
|
363
|
+
field: string;
|
|
364
|
+
fromString: string;
|
|
365
|
+
toString: string;
|
|
366
|
+
}>;
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Webhook Events
|
|
372
|
+
|
|
373
|
+
| Event | Trigger |
|
|
374
|
+
|-------|---------|
|
|
375
|
+
| `jira:issue_created` | Issue created |
|
|
376
|
+
| `jira:issue_updated` | Issue updated |
|
|
377
|
+
| `jira:issue_deleted` | Issue deleted |
|
|
378
|
+
| `comment_created` | Comment added |
|
|
379
|
+
| `sprint_started` | Sprint started |
|
|
380
|
+
| `sprint_closed` | Sprint ended |
|
|
381
|
+
|
|
382
|
+
### Handling Webhooks
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// app/api/webhooks/jira/route.ts
|
|
386
|
+
export async function POST(request: Request) {
|
|
387
|
+
const payload: JiraWebhook = await request.json();
|
|
388
|
+
|
|
389
|
+
switch (payload.webhookEvent) {
|
|
390
|
+
case 'jira:issue_updated':
|
|
391
|
+
if (payload.changelog?.items.some(i => i.field === 'status')) {
|
|
392
|
+
// Handle status change
|
|
393
|
+
}
|
|
394
|
+
break;
|
|
395
|
+
case 'comment_created':
|
|
396
|
+
// Handle new comment
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return Response.json({ received: true });
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## Rate Limiting
|
|
407
|
+
|
|
408
|
+
### Limits
|
|
409
|
+
|
|
410
|
+
| Type | Limit |
|
|
411
|
+
|------|-------|
|
|
412
|
+
| REST API | 100 requests/minute (varies by plan) |
|
|
413
|
+
| Concurrent | 10 concurrent requests |
|
|
414
|
+
| Bulk operations | 1000 issues/request |
|
|
415
|
+
|
|
416
|
+
### Headers
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
// Check rate limit headers
|
|
420
|
+
const remaining = response.headers.get('X-RateLimit-Remaining');
|
|
421
|
+
const limit = response.headers.get('X-RateLimit-Limit');
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## Error Handling
|
|
427
|
+
|
|
428
|
+
### Common Error Codes
|
|
429
|
+
|
|
430
|
+
| Code | Description | Resolution |
|
|
431
|
+
|------|-------------|------------|
|
|
432
|
+
| 400 | Bad request | Check request body |
|
|
433
|
+
| 401 | Unauthorized | Check credentials |
|
|
434
|
+
| 403 | Forbidden | Check permissions |
|
|
435
|
+
| 404 | Not found | Verify issue key |
|
|
436
|
+
| 429 | Rate limited | Wait and retry |
|
|
437
|
+
|
|
438
|
+
### Error Response Format
|
|
439
|
+
|
|
440
|
+
```json
|
|
441
|
+
{
|
|
442
|
+
"errorMessages": ["Issue does not exist or you do not have permission to see it."],
|
|
443
|
+
"errors": {}
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## Testing Patterns
|
|
450
|
+
|
|
451
|
+
### Mock API Responses
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
// __mocks__/jira.ts
|
|
455
|
+
export const mockIssue = {
|
|
456
|
+
key: "PROJ-123",
|
|
457
|
+
fields: {
|
|
458
|
+
summary: "Test Issue",
|
|
459
|
+
status: { name: "Open" }
|
|
460
|
+
}
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
export const mockGetIssue = jest.fn().mockResolvedValue(mockIssue);
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Integration Tests
|
|
467
|
+
|
|
468
|
+
```typescript
|
|
469
|
+
describe('Jira Integration', () => {
|
|
470
|
+
it('should fetch issue details', async () => {
|
|
471
|
+
const issue = await jira.getIssue('PROJ-123');
|
|
472
|
+
expect(issue.key).toBe('PROJ-123');
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('should transition issue', async () => {
|
|
476
|
+
await jira.transitionIssue('PROJ-123', 'In Progress');
|
|
477
|
+
const issue = await jira.getIssue('PROJ-123');
|
|
478
|
+
expect(issue.fields.status.name).toBe('In Progress');
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Anti-Patterns
|
|
486
|
+
|
|
487
|
+
### DON'T: Use Basic Auth in Frontend
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
// BAD - Exposes credentials
|
|
491
|
+
fetch('/api/jira', {
|
|
492
|
+
headers: { 'Authorization': `Basic ${btoa(email + ':' + token)}` }
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
// GOOD - Use backend proxy
|
|
496
|
+
fetch('/api/jira/issue/PROJ-123');
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### DON'T: Ignore Pagination
|
|
500
|
+
|
|
501
|
+
```typescript
|
|
502
|
+
// BAD
|
|
503
|
+
const { issues } = await searchIssues(jql);
|
|
504
|
+
|
|
505
|
+
// GOOD
|
|
506
|
+
async function* getAllIssues(jql: string) {
|
|
507
|
+
let startAt = 0;
|
|
508
|
+
const maxResults = 100;
|
|
509
|
+
|
|
510
|
+
while (true) {
|
|
511
|
+
const { issues, total } = await searchIssues(jql, startAt, maxResults);
|
|
512
|
+
yield* issues;
|
|
513
|
+
startAt += issues.length;
|
|
514
|
+
if (startAt >= total) break;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
|
|
521
|
+
## Checklist
|
|
522
|
+
|
|
523
|
+
Before using Jira integration:
|
|
524
|
+
|
|
525
|
+
- [ ] API token generated in Atlassian account
|
|
526
|
+
- [ ] Domain configured in `.claude/config/workspace.json`
|
|
527
|
+
- [ ] Default project set
|
|
528
|
+
- [ ] Transition IDs mapped for your workflow
|
|
529
|
+
- [ ] Webhooks configured (if needed)
|
|
530
|
+
- [ ] ADF formatting implemented for descriptions
|
|
531
|
+
- [ ] Error handling for all API calls
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
## Related Skills
|
|
536
|
+
|
|
537
|
+
- `session-management` - Session lifecycle
|
|
538
|
+
- `scheduled-actions` - Background task processing
|
|
539
|
+
- `service-layer` - API implementation patterns
|