Jira Syntax Jira wiki markup syntax, templates, and validation. For API operations, use the jira-communication skill. Quick Syntax Reference | Jira Syntax | Purpose | NOT this (Markdown) | |-------------|---------|---------------------| | | Heading | | | | Bold | | | | Italic | | | | Inline code | | | | Code block | java bash ${CLAUDE SKILL DIR}/scripts/validate-jira-syntax.sh path/to/content.txt h2. Title text {code:language}...{code} # [label|url] [PROJ-123] ||Header|| |Cell| {color:red}text{color} {panel:title=X}...{panel} ## Heading h2. Heading bold bold code {{code}} text [text\|url] - b…

| head -1)\n fi\n : \"${scan_locale:=C}\"\n\n local dash_hits\n # AWK-DASH-SCAN-BEGIN (marker: tests/test_validator_parity.py extracts the\n # program between these two markers and runs it over the whole corpus in\n # one pass. Keep them.)\n dash_hits=$(LC_ALL=\"$scan_locale\" awk '\n function fold(line) {\n # NBSP becomes \\002, a sentinel that is neither space nor word.\n # It has to be BOTH at once, because Jira treats U+00A0 as two\n # different things: an ordinary character for the dash delimiters\n # (`a -x\u003cNBSP>- y` IS struck through, measured) and a terminator\n # for the URL autolinker (`https://h/a\u003cNBSP>/-/b` links only\n # `https://h/a`). Python gets this from `\\s` matching U+00A0 while\n # _is_delimiter_space does not; here \\002 is excluded from the\n # region classes below and from isword(). Folding it to a space\n # instead would break the delimiters, and folding it to punctuation\n # - which this did - let a region swallow the dashes after it.\n gsub(/\\xc2\\xa0/, \"\\002\", line)\n gsub(/\\xe2\\x80\\x9e|\\xe2\\x80\\x9c|\\xe2\\x80\\x9d|\\xe2\\x80\\x98|\\xe2\\x80\\x99|\\xe2\\x80\\x9a/, \"\\\"\", line)\n gsub(/\\xc2\\xab|\\xc2\\xbb|\\xe2\\x80\\xb9|\\xe2\\x80\\xba/, \"\\\"\", line)\n gsub(/\\xe2\\x80\\x93|\\xe2\\x80\\x94|\\xe2\\x80\\x90|\\xe2\\x80\\xa6|\\xe2\\x80\\xa2/, \"\\\"\", line)\n # Common non-ASCII symbols. Not exhaustive and cannot be - this is\n # the C-locale fallback only; where a UTF-8 locale exists the\n # scan runs under it and gawk classifies these itself.\n gsub(/\\xc2\\xa7|\\xe2\\x82\\xac|\\xc2\\xb0|\\xc2\\xb1|\\xc2\\xb5|\\xc3\\x97|\\xc3\\xb7/, \"\\\"\", line)\n gsub(/\\xc2\\xa9|\\xc2\\xae|\\xe2\\x84\\xa2|\\xe2\\x80\\xa0|\\xe2\\x80\\xa1|\\xe2\\x80\\xb0/, \"\\\"\", line)\n return line\n }\n # The \\001 test comes first: a masked region must read as a boundary, and a\n # control character is neither space nor punct, so it would otherwise\n # count as a word character and swallow the opener after a link.\n function isword(c) { return (c != \"\" && c != \"\\001\" && c != \"\\002\" && c !~ /[[:space:][:punct:]]/) }\n # Replace protected regions with \\001, preserving length. Mirrors\n # _mask_protected() in lib/markup.py: a bare URL, mailto or image needs\n # an ASCII non-alphanumeric before it (one glued to a word is not\n # autolinked, so it keeps its dashes live) while a square-bracketed\n # link resolves anywhere, and a region starting exactly where the\n # previous one ended does not resolve either.\n function mask(line, out, pos, rest, start, len_, before, kind, i, prev_end) {\n out = \"\"\n pos = 1\n prev_end = 0\n while (pos \u003c= length(line)) {\n rest = substr(line, pos)\n if (!match(rest, /(\\[[^]\\n]*\\])|((https?|ftp):\\/\\/[^][:space:]{}|\\002]+)|(mailto:[^][:space:]{}|\\002]+)|(![^[:space:]!\\002]+!)/)) {\n out = out rest\n break\n }\n start = pos + RSTART - 1\n len_ = RLENGTH\n before = (start > 1) ? substr(line, start - 1, 1) : \"\"\n kind = substr(line, start, 1)\n\n # A backslash-escaped bracket or bang is not a macro, so its\n # content is ordinary prose and its dashes stay live. Same for a\n # region that does not sit at a boundary: a bare URL, mailto or\n # image needs a non-alphanumeric before it (and a URL must not\n # follow a pipe), while a square-bracketed link resolves\n # anywhere. In both cases the region is not a region, so the\n # scan resumes one character in - which is what the Python\n # regex does by simply not matching there.\n if (before == \"\\\\\" || (kind != \"[\" && (before ~ /[A-Za-z0-9]/ || (kind != \"!\" && (before == \"|\" || before == \"!\"))))) {\n out = out substr(line, pos, RSTART)\n pos = start + 1\n continue\n }\n\n # Two regions written back to back do not both resolve: Jira\n # renders the first and leaves the second literal. The SECOND\n # one is skipped whole, not one character at a time - resuming\n # inside it would let a shorter region nested within it be\n # masked, which loses the dashes around it. That was a real\n # miss: `!i.png!https://h/a/-/b[t|...]` comes back struck and\n # the scan reported nothing. prev_end deliberately does not\n # advance here, so a third region is masked again, matching\n # _mask_protected() in lib/markup.py.\n if (start == prev_end) {\n out = out substr(line, pos, RSTART - 1 + len_)\n pos = start + len_\n continue\n }\n\n out = out substr(line, pos, RSTART - 1)\n for (i = 0; i \u003c len_; i++) out = out \"\\001\"\n pos = start + len_\n prev_end = pos\n }\n return out\n }\n function strikes(raw, line, n, i, j, prev, nxt, after) {\n line = mask(raw)\n n = length(line)\n for (i = 1; i \u003c= n; i++) {\n if (substr(line, i, 1) != \"-\") continue\n if (i > 1 && substr(line, i - 1, 1) == \"\\\\\") continue\n prev = (i > 1) ? substr(line, i - 1, 1) : \"\"\n if (isword(prev)) continue\n nxt = (i \u003c n) ? substr(line, i + 1, 1) : \"\"\n if (nxt == \"\" || nxt ~ /[[:space:]]/ || nxt == \"-\") continue\n for (j = i + 2; j \u003c= n; j++) {\n if (substr(line, j, 1) != \"-\") continue\n if (substr(line, j - 1, 1) == \"\\\\\") continue\n if (substr(line, j - 1, 1) ~ /[[:space:]]/) continue\n after = (j \u003c n) ? substr(line, j + 1, 1) : \"\"\n if (isword(after)) continue\n return 1\n }\n }\n return 0\n }\n # Only the SAME tag closes a block, exactly as the Jira renderer does\n # and as _split_verbatim() in lib/markup.py does. Toggling on either tag\n # loses track after `{noformat}` / `{code}` / `{noformat}`, and then\n # misses every span in the rest of the file.\n /^[[:space:]]*\\{(code|noformat)(:[^}]*)?\\}[[:space:]]*$/ {\n tag = $0\n sub(/^[[:space:]]*\\{/, \"\", tag)\n sub(/[:}].*$/, \"\", tag)\n if (opentag == \"\") opentag = tag\n else if (opentag == tag) opentag = \"\"\n next\n }\n /^[[:space:]]*```/ { infence = !infence; next }\n opentag != \"\" || infence { next }\n strikes(fold($0)) { printf \"%d:%s\\n\", NR, $0 }' \u003c\u003c\u003c \"$content\") && dash_rc=0 || dash_rc=$?\n # The `&& … || …` is load-bearing under `set -e` (line 6): a bare assignment\n # takes the command substitution's status, so a failing awk aborted the\n # whole script before this branch could run. It exited non-zero, so nothing\n # was silently passed - but the ERROR below never printed and the remaining\n # files in a multi-file run were skipped. A compound command is exempt from\n # set -e, which is what lets the branch execute.\n # awk's status must not be swallowed by the pipe: a scan that never ran\n # (no awk, a syntax error, a killed process) produces no hits, and no hits\n # is what a clean draft looks like. That is the same \"a failure reads as\n # clean\" shape RenderVerdict.available exists to prevent on the Python\n # side, and it is an ERROR here rather than silence.\n if [ \"$dash_rc\" -ne 0 ]; then\n error \"The dash-strikethrough scan did not run (awk exited $dash_rc) - this draft was NOT checked for spans Jira would render struck through.\"\n dash_hits=\"\"\n else\n dash_hits=$(printf '%s\\n' \"$dash_hits\" | grep -v '^

Jira Syntax Jira wiki markup syntax, templates, and validation. For API operations, use the jira-communication skill. Quick Syntax Reference | Jira Syntax | Purpose | NOT this (Markdown) | |-------------|---------|---------------------| | | Heading | | | | Bold | | | | Italic | | | | Inline code | | | | Code block | java bash ${CLAUDE SKILL DIR}/scripts/validate-jira-syntax.sh path/to/content.txt h2. Title text {code:language}...{code} # [label|url] [PROJ-123] ||Header|| |Cell| {color:red}text{color} {panel:title=X}...{panel} ## Heading h2. Heading bold bold code {{code}} text [text\|url] - b…

| head -3)\n fi\n # AWK-DASH-SCAN-END\n if [ -n \"$dash_hits\" ]; then\n warning \"Found a dash pair that renders struck through outside a code block — Jira reads a dash after a non-word character (including the {{}}, *, _, ] or ! that ends an inline element) as a strikethrough opener, and a dash before one as the closer. Escape the opener as \\\\-foo; a backslash-escaped dash still prints as a plain hyphen.\"\n echo \" Lines with issue:\"\n echo \"$dash_hits\"\n fi\n\n # Check for Markdown-style links ([text](url) instead of [text|url])\n if echo \"$content\" | grep -qE \"\\[([^\\]]+)\\]\\(([^)]+)\\)\"; then\n error \"Found Markdown-style links ([text](url)). Use Jira format: [text|url]\"\n echo \" Examples found:\"\n echo \"$content\" | grep -oE \"\\[([^\\]]+)\\]\\(([^)]+)\\)\" | head -3\n fi\n\n # Check for headings without space after period (h2.Title instead of h2. Title)\n if echo \"$content\" | grep -qE \"^h[1-6]\\.[^ ]\"; then\n error \"Found headings without space after period. Use: h2. Title (not h2.Title)\"\n echo \" Lines with issue:\"\n echo \"$content\" | grep -nE \"^h[1-6]\\.[^ ]\" | head -5\n fi\n\n # Check for code blocks without language specification\n # (skip escaped \\{code\\} literals and inline-monospace {{code}})\n if grep -qE '(^|[^\\\\{])\\{code\\}[^{]' \u003c\u003c\u003c \"$content\"; then\n warning \"Found {code} blocks without language. Consider: {code:java} for syntax highlighting\"\n fi\n\n # Check for {code:LANG} using a language Jira Server's formatter does not recognize.\n # Authoritative list from the server error message (\"Available languages are: ...\").\n # Anything outside this set causes \"Unable to find source-code formatter for language: X\".\n # Use Bash built-in pattern matching with literal-quoted needle so identifiers\n # containing shell-significant characters (c#, c++) are compared verbatim.\n local valid_langs=\"actionscript ada applescript bash c c# c++ cpp css erlang go groovy haskell html java javascript js json lua none nyan objc perl php python r rainbow ruby scala sh sql swift visualbasic xml yaml\"\n local search_langs=\" $valid_langs \"\n while IFS= read -r lang; do\n [ -z \"$lang\" ] && continue\n # Templates ship `{code:language}` as a fill-in placeholder; warn rather than\n # error so templates stay validatable until users substitute a real lang.\n if [ \"$lang\" = \"language\" ]; then\n warning \"Found {code:language} placeholder — replace with an actual language before submitting to Jira\"\n continue\n fi\n if [[ \"$search_langs\" != *\" $lang \"* ]]; then\n # Suggest the closest-fit valid language for common stumbles before\n # falling back to the generic \"use {code:none} or ...\" message.\n # Lower-case the identifier so `Dockerfile`, `Makefile` etc. match\n # without per-variant case entries.\n local hint=\"\"\n case \"${lang,,}\" in\n hcl|tf|terraform|tofu) hint=\"{code:none} for HCL / Terraform / OpenTofu\" ;;\n dockerfile|containerfile) hint=\"{code:bash} (Dockerfile RUN lines lex acceptably as bash) or {code:none}\" ;;\n rust|rs) hint=\"{code:none} for Rust\" ;;\n kotlin|kt) hint=\"{code:java} (Kotlin lexes acceptably as Java) or {code:none}\" ;;\n typescript|ts|tsx) hint=\"{code:javascript} or {code:none}\" ;;\n shell|zsh|fish|console) hint=\"{code:bash} or {code:none}\" ;;\n powershell|ps1|pwsh) hint=\"{code:none} for PowerShell\" ;;\n make|makefile) hint=\"{code:none} for Makefile\" ;;\n ini|toml|conf|properties) hint=\"{code:none} for INI / TOML / config\" ;;\n diff|patch) hint=\"{code:none}\" ;;\n go-template|gotmpl|jinja|jinja2) hint=\"{code:none}\" ;;\n esac\n if [ -n \"$hint\" ]; then\n error \"Unsupported {code:$lang} language. Jira Server rejects this; use $hint\"\n else\n error \"Unsupported {code:$lang} language. Jira Server rejects this; use {code:none} or one of: $valid_langs\"\n fi\n fi\n done \u003c \u003c(grep -oE '(^|[^\\\\{])\\{code:[^}|\\\\]+' \u003c\u003c\u003c \"$content\" | sed 's/.*{code://' | sort -u)\n\n # Check for tables with incorrect header syntax (|Header| instead of ||Header||)\n if echo \"$content\" | grep -qE \"^\\|[^|]+\\|$\" && ! echo \"$content\" | grep -qE \"^\\|\\|\"; then\n warning \"Potential table header without double pipes. Headers should use: ||Header||\"\n fi\n\n # Check for unclosed {code} blocks\n # Jira wiki markup uses {code} as both the opening and closing tag, so a\n # correctly paired block always produces an even occurrence count.\n # Use `grep -o ... | wc -l` to count each occurrence (not just matching\n # lines), matching the {color} check below for consistency and to catch\n # multiple tags on the same line.\n # `(^|[^\\\\{])` skips escaped literals (\\{code\\}) and inline-monospace\n # lookalikes ({{code}}) — both are prose, not block markup.\n local code_count\n code_count=$(grep -oE '(^|[^\\\\{])\\{code[}:]' \u003c\u003c\u003c \"$content\" | wc -l)\n if [ $((code_count % 2)) -ne 0 ]; then\n error \"Mismatched {code} tags: odd number ($code_count) of occurrences (expected pairs)\"\n fi\n\n # Check for unclosed {panel} blocks\n # Same rule applies: {panel} opens and closes the block.\n local panel_count\n panel_count=$(grep -oE '(^|[^\\\\{])\\{panel[}:]' \u003c\u003c\u003c \"$content\" | wc -l)\n if [ $((panel_count % 2)) -ne 0 ]; then\n error \"Mismatched {panel} tags: odd number ($panel_count) of occurrences (expected pairs)\"\n fi\n\n # Check for unclosed {color} blocks\n local color_count\n color_count=$(echo \"$content\" | grep -o \"{color\" | wc -l)\n if [ $((color_count % 2)) -ne 0 ]; then\n warning \"Potential unclosed {color} tag (odd number of occurrences)\"\n fi\n\n # Check for unclosed {noformat}, {quote}, {anchor} blocks\n # Same single-token open/close rule as {code}, {panel}, {color}: an odd\n # occurrence count signals an unescaped literal in prose or a missing close.\n for macro in noformat quote anchor; do\n local mcount\n mcount=$(grep -oE \"(^|[^\\\\\\\\{])\\{${macro}[}:]\" \u003c\u003c\u003c \"$content\" | wc -l)\n if [ $((mcount % 2)) -ne 0 ]; then\n warning \"Potential unclosed {${macro}} tag (odd number of occurrences)\"\n fi\n done\n\n # Check for block-markup tags used inline. {code}, {noformat}, {quote} and\n # {panel} are block-level macros: the tag must stand alone on its own line.\n # An unescaped tag with other text on the same line opens the block\n # mid-prose and swallows the rest of the line (classic case: writing\n # *about* {code} in a sentence). Escape literal mentions as \\{code\\}.\n # Escaped tags (\\{code\\}) and {{monospace}} lookalikes ({{code}}) are\n # stripped per line BEFORE testing — a line-level exclusion would hide a\n # genuine unescaped tag sharing a line with an escaped/monospace mention.\n local inline_hits\n inline_hits=$(awk '\n {\n line = $0\n gsub(/\\\\\\{(code|noformat|quote|panel)[^}]*\\\\\\}/, \"\", line)\n gsub(/\\{\\{(code|noformat|quote|panel)(:[^}]*)?\\}\\}/, \"\", line)\n if (line ~ /\\{(code|noformat|quote|panel)(:[^}]*)?\\}/ &&\n line !~ /^[[:space:]]*\\{(code|noformat|quote|panel)(:[^}]*)?\\}[[:space:]]*$/)\n printf \"%d:%s\\n\", NR, $0\n }' \u003c\u003c\u003c \"$content\" | head -3)\n if [ -n \"$inline_hits\" ]; then\n error \"Block tag used inline — {code}/{noformat}/{quote}/{panel} must stand alone on their own line; escape literal mentions as \\\\{code\\\\}\"\n echo \" Lines with issue:\"\n echo \"$inline_hits\"\n fi\n\n # Check for Markdown-style lists (- item instead of * item)\n if echo \"$content\" | grep -qE \"^- [^-]\"; then\n warning \"Found Markdown-style bullets (- item). Jira prefers: * item\"\n fi\n\n # Positive checks\n if echo \"$content\" | grep -qE \"^h[1-6]\\. \"; then\n success \"Found correctly formatted Jira headings\"\n fi\n\n if echo \"$content\" | grep -qE \"{code:[a-z]+}\"; then\n success \"Found code blocks with language specification\"\n fi\n\n if echo \"$content\" | grep -qE \"\\[~[a-z.]+\\]\"; then\n success \"Found user mentions ([~username])\"\n fi\n\n if echo \"$content\" | grep -qE \"\\[[A-Z]+-[0-9]+\\]\"; then\n success \"Found issue links ([PROJ-123])\"\n fi\n}\n\n# Main script\necho \"Jira Wiki Markup Syntax Validator\"\necho \"==================================\"\n\nif [ $# -eq 0 ]; then\n echo \"Usage: $0 \u003cfile1> [file2] [file3] ...\"\n echo \"\"\n echo \"Validates Jira wiki markup syntax in text files\"\n echo \"\"\n echo \"Example:\"\n echo \" $0 issue-description.txt\"\n echo \" $0 templates/*.md\"\n exit 1\nfi\n\n# Validate each file\nfor file in \"$@\"; do\n validate_file \"$file\"\ndone\n\n# Summary\necho \"\"\necho \"==========================================\"\necho \"Validation Summary\"\necho \"==========================================\"\necho \"Files checked: $#\"\necho -e \"${RED}Errors: $ERRORS${NC}\"\necho -e \"${YELLOW}Warnings: $WARNINGS${NC}\"\n\nif [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then\n echo -e \"${GREEN}✅ All checks passed!${NC}\"\n exit 0\nelif [ $ERRORS -eq 0 ]; then\n echo -e \"${YELLOW}⚠️ No errors, but $WARNINGS warnings found${NC}\"\n exit 0\nelse\n echo -e \"${RED}❌ $ERRORS errors found - please fix before submitting to Jira${NC}\"\n exit 1\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":26754,"content_sha256":"2119bc803e2c87a6fb9d88982d4f2aca47edcc86978d19cd56ae107e17bab548"},{"filename":"templates/bug-report-template.md","content":"# Jira Bug Report Template\n\nUse this template when creating bug reports in Jira with proper wiki markup syntax.\n\n## Template\n\n```\nh2. Bug Description\n\n[Provide a clear, concise description of the bug]\n\nh3. Environment\n* *Browser:* Chrome 120.0\n* *OS:* Windows 11\n* *Version:* 2.1.0\n* *Environment:* Production\n\nh3. Steps to Reproduce\n# Navigate to [specific page/feature]\n# Perform [specific action]\n# Observe [unexpected behavior]\n\nh3. Expected Behavior\n[Describe what should happen]\n\nh3. Actual Behavior\n[Describe what actually happens]\n\n{panel:title=Error Message|bgColor=#FFEBE9}\n{code:java}\n[Paste error message or stack trace here]\n{code}\n{panel}\n\nh3. Additional Context\n* Frequency: [Always/Sometimes/Rare]\n* User Impact: [Critical/High/Medium/Low]\n* Workaround Available: [Yes/No]\n\nh3. Screenshots\n[^screenshot1.png]\n[^screenshot2.png]\n\nh3. Related Issues\n* Blocks [PROJ-XXX]\n* Related to [PROJ-YYY]\n\nh3. Technical Notes\n{code:javascript}\n// Code snippet showing the issue\nfunction problematicCode() {\n // Details here\n}\n{code}\n\n---\n*Reported by:* [~username]\n*Date:* YYYY-MM-DD\n```\n\n## Example - Filled Template\n\n```\nh2. Bug Description\n\nLogin button becomes unresponsive after failed authentication attempt, requiring page refresh to retry.\n\nh3. Environment\n* *Browser:* Chrome 120.0.6099.109\n* *OS:* Windows 11\n* *Version:* 2.3.1\n* *Environment:* Production\n\nh3. Steps to Reproduce\n# Navigate to {{/login}} page\n# Enter invalid credentials\n# Click *Login* button\n# Observe error message\n# Try to enter correct credentials\n# Click *Login* button again\n# Button remains disabled\n\nh3. Expected Behavior\nAfter a failed login attempt, the login button should become active again, allowing users to retry with different credentials.\n\nh3. Actual Behavior\nThe login button remains in a disabled state after the first failed attempt. Users must refresh the page to attempt login again.\n\n{panel:title=Error in Browser Console|bgColor=#FFEBE9}\n{code:javascript}\nTypeError: Cannot read property 'reset' of null\n at LoginForm.handleSubmit (login.js:45)\n at onClick (login.js:23)\n{code}\n{panel}\n\nh3. Additional Context\n* Frequency: Always (100% reproduction rate)\n* User Impact: High (blocks login functionality)\n* Workaround Available: Yes (page refresh)\n* Affects ~1000 daily users based on error logs\n\nh3. Screenshots\n[^login-disabled-state.png] - Login button stuck in disabled state\n[^console-error.png] - Browser console showing error\n\nh3. Related Issues\n* Blocks [PROJ-234] - User authentication improvements\n* Related to [PROJ-189] - Form validation refactoring\n\nh3. Technical Notes\n{code:javascript}\n// Problem in LoginForm component\nhandleSubmit(event) {\n event.preventDefault();\n this.setState({ isSubmitting: true });\n\n // Error occurs here if form ref is null\n this.formRef.reset(); // BUG: formRef can be null\n\n // Rest of submission logic\n}\n{code}\n\nSuggested fix: Add null check before calling {{reset()}} method.\n\n---\n*Reported by:* [~john.smith]\n*Date:* 2025-11-06\n```\n\n## Usage with jira-communication Skill\n\n```bash\n# Create the bug report using the script\nuv run scripts/workflow/jira-create.py issue PROJ \\\n \"Login button unresponsive after failed authentication\" \\\n --type Bug \\\n --priority High \\\n --labels frontend,authentication,ux \\\n --description-file bug-description.txt\n\n# Or with inline description (short version)\nuv run scripts/workflow/jira-create.py issue PROJ \\\n \"Login button unresponsive after failed authentication\" \\\n --type Bug \\\n --priority High\n```\n\n## Checklist Before Submitting\n\n- [ ] h2. heading for main Description section\n- [ ] h3. headings for subsections\n- [ ] Numbered list (#) for Steps to Reproduce\n- [ ] Bulleted list (*) for Environment details\n- [ ] \\{panel\\} for error messages with appropriate bgColor\n- [ ] \\{code:language\\} for code snippets with correct language\n- [ ] [^filename] format for attachment references\n- [ ] [PROJ-XXX] format for issue links\n- [ ] [~username] format for user mentions\n- [ ] *bold* for emphasis on key terms\n- [ ] {{monospace}} for UI elements and paths\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4074,"content_sha256":"5911df8ba4034b059978634965695e6200f438c047ab6a19b27184694ef2b0c0"},{"filename":"templates/feature-request-template.md","content":"# Jira Feature Request Template\n\nUse this template when creating feature requests in Jira with proper wiki markup syntax.\n\n## Template\n\n```\nh2. Feature Overview\n\n[Provide a brief summary of the feature]\n\nh3. Business Value\n* *User Impact:* [Describe who benefits and how]\n* *Business Goal:* [Align with strategic objectives]\n* *Priority Justification:* [Why this should be prioritized]\n\nh3. User Stories\n\nh4. As a [user type]\n* I want to [action]\n* So that [benefit]\n\nh4. As a [another user type]\n* I want to [action]\n* So that [benefit]\n\nh3. Acceptance Criteria\n# [Specific, testable criterion]\n# [Specific, testable criterion]\n# [Specific, testable criterion]\n\nh3. Functional Requirements\n\nh4. Must Have\n* Requirement 1\n* Requirement 2\n\nh4. Should Have\n* Requirement 3\n* Requirement 4\n\nh4. Could Have\n* Requirement 5\n* Requirement 6\n\nh3. Non-Functional Requirements\n* *Performance:* [Response time requirements]\n* *Security:* [Security considerations]\n* *Scalability:* [Scale requirements]\n* *Accessibility:* [WCAG compliance level]\n\nh3. Technical Considerations\n{code:language}\n// Pseudocode or technical notes\n{code}\n\nh3. UI/UX Mockups\n[^wireframe-01.png] - Main interface mockup\n[^user-flow.png] - User journey diagram\n\nh3. Dependencies\n* Requires [PROJ-XXX] to be completed first\n* Impacts [PROJ-YYY] - needs coordination\n\nh3. Open Questions\n? Question 1 - needs clarification\n? Question 2 - requires decision\n\nh3. Success Metrics\n||Metric||Target||Measurement Method||\n|User Adoption|80% of active users|Analytics tracking|\n|Performance|\u003c 200ms response|Performance monitoring|\n|Satisfaction|4.5/5 rating|User surveys|\n\n---\n*Requested by:* [~username]\n*Stakeholders:* [~pm], [~designer], [~engineer]\n```\n\n## Example - Filled Template\n\n```\nh2. Feature Overview\n\nImplement bulk export functionality allowing users to export multiple projects to various formats (CSV, JSON, Excel) with customizable field selection.\n\nh3. Business Value\n* *User Impact:* 500+ power users currently export data manually one project at a time (30+ clicks per export)\n* *Business Goal:* Reduce data export time by 90%, improving productivity and user satisfaction\n* *Priority Justification:* #1 requested feature in Q4 2024 user survey (78% of respondents), competitive gap vs competitors\n\nh3. User Stories\n\nh4. As a Project Manager\n* I want to export multiple projects at once with selected fields\n* So that I can create consolidated reports without manual data entry\n\nh4. As a Data Analyst\n* I want to export historical project data in machine-readable formats\n* So that I can perform advanced analytics in external tools\n\nh4. As a Team Lead\n* I want to schedule automated exports to run daily\n* So that stakeholders receive up-to-date reports without manual intervention\n\nh3. Acceptance Criteria\n# User can select 1-100 projects for bulk export from project list\n# Export supports CSV, JSON, and Excel formats\n# User can customize which fields to include in export\n# Export progress is shown with cancel option\n# Completed exports are downloadable from exports history page\n# Export file size limit is 50MB with pagination for larger datasets\n# Exports are available for 30 days before auto-deletion\n\nh3. Functional Requirements\n\nh4. Must Have\n* Multi-select checkbox interface for project selection\n* Format selector (CSV, JSON, Excel)\n* Field customization with drag-and-drop ordering\n* Progress indicator during export generation\n* Download link with expiration notice\n* Export history page showing last 10 exports\n\nh4. Should Have\n* Search and filter for project selection\n* Save field configurations as templates\n* Email notification when export completes\n* Preview sample data before full export\n\nh4. Could Have\n* Schedule recurring exports\n* Share export links with team members\n* Export directly to cloud storage (Google Drive, Dropbox)\n* Advanced filtering within export data\n\nh3. Non-Functional Requirements\n* *Performance:* Export generation completes within 30 seconds for 50 projects\n* *Security:* Exports encrypted at rest, only accessible to authorized users with audit trail\n* *Scalability:* Support 1000 concurrent export requests\n* *Accessibility:* WCAG 2.1 AA compliance for export interface\n* *Browser Support:* Chrome 90+, Firefox 88+, Safari 14+, Edge 90+\n\nh3. Technical Considerations\n{code:python}\n# Proposed export architecture\nclass BulkExporter:\n def export_projects(self, project_ids, format, fields):\n # Use async task queue for processing\n task = ExportTask.create(\n projects=project_ids,\n format=format,\n fields=fields,\n user=current_user\n )\n\n # Process in background\n celery.send_task('exports.process_bulk', args=[task.id])\n\n return task.id\n\n def get_export_status(self, task_id):\n # Return progress percentage and download link when complete\n return ExportTask.get(task_id).status\n{code}\n\n*Database Impact:* New {{exports}} table for tracking, ~1GB storage for 30-day retention\n*API Endpoints:*\n* {{POST /api/exports}} - Initiate export\n* {{GET /api/exports/:id}} - Check status\n* {{GET /api/exports/:id/download}} - Download file\n\nh3. UI/UX Mockups\n[^bulk-export-interface.png] - Main export dialog with project selection\n[^field-customization.png] - Field selector with drag-and-drop ordering\n[^export-progress.png] - Progress indicator during generation\n[^export-history.png] - Export history page design\n\nh3. Dependencies\n* Requires [PROJ-456] - Background task queue infrastructure\n* Impacts [PROJ-789] - Storage quota system (needs capacity planning)\n* Coordinates with [PROJ-321] - API rate limiting (exports count as API calls)\n\nh3. Open Questions\n? Should exports include archived projects or only active ones?\n? What permission level is required to export data? (View vs Export permission)\n? Should we support incremental exports (only new/changed data)?\n? How to handle very large exports exceeding 50MB limit?\n\nh3. Success Metrics\n||Metric||Target||Measurement Method||\n|User Adoption|60% of power users within 3 months|Analytics event tracking|\n|Time Savings|90% reduction in export time|User session timing comparison|\n|User Satisfaction|4.5/5 feature rating|In-app feedback survey|\n|Export Volume|5000+ exports per month|Export usage dashboard|\n|Error Rate|\u003c 1% failed exports|Error monitoring logs|\n\n{panel:title=Launch Plan|bgColor=#DEEBFF}\nh4. Phase 1 - Beta (Week 1-2)\n* Release to 50 beta users\n* Gather feedback and fix critical bugs\n\nh4. Phase 2 - Limited Release (Week 3-4)\n* Release to 20% of user base\n* Monitor performance and error rates\n\nh4. Phase 3 - Full Release (Week 5+)\n* Release to all users\n* Announce via email and in-app notifications\n{panel}\n\n---\n*Requested by:* [~sarah.johnson]\n*Stakeholders:* [~product.manager], [~ux.designer], [~backend.lead], [~frontend.lead]\n*Estimated Effort:* 3 sprints (6 weeks)\n*Target Release:* Q1 2025\n```\n\n## Usage with jira-communication Skill\n\n```bash\n# Create the feature request using the script\nuv run scripts/workflow/jira-create.py issue PROJ \\\n \"Bulk export functionality for multiple projects\" \\\n --type Story \\\n --priority High \\\n --labels feature-request,export,productivity \\\n --description-file feature-description.txt\n\n# Or with inline description (short version)\nuv run scripts/workflow/jira-create.py issue PROJ \\\n \"Bulk export functionality for multiple projects\" \\\n --type Story \\\n --priority High\n```\n\n## Checklist Before Submitting\n\n- [ ] h2. heading for Feature Overview\n- [ ] h3. headings for all major sections\n- [ ] h4. headings for User Stories and subsections\n- [ ] Bulleted lists (*) for requirements and criteria\n- [ ] Numbered lists (#) for Acceptance Criteria\n- [ ] Tables (||header|| syntax) for Success Metrics\n- [ ] \\{code:language\\} blocks for technical details\n- [ ] \\{panel\\} for important launch/timeline information\n- [ ] [^filename] for mockup/wireframe references\n- [ ] [PROJ-XXX] format for dependency links\n- [ ] [~username] format for stakeholder mentions\n- [ ] *bold* for emphasis on metrics and targets\n- [ ] {{monospace}} for technical terms and paths\n- [ ] ? prefix for Open Questions\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8135,"content_sha256":"44754b7bc895891403b7a82b755e2d962a80a77b8dcbd8bd74808844d8291677"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Jira Syntax","type":"text"}]},{"type":"paragraph","content":[{"text":"Jira wiki markup syntax, templates, and validation. For API operations, use the ","type":"text"},{"text":"jira-communication","type":"text","marks":[{"type":"strong"}]},{"text":" skill.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Syntax Reference","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Jira Syntax","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"NOT this (Markdown)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"h2. Title","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Heading","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"## Title","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"*bold*","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bold","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"**bold**","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"_italic_","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Italic","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"*italic*","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{{code}}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Inline code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"`code`","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{code:java}...{code}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Code block","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":" ","type":"text","marks":[{"type":"code_inline"}]},{"text":"java ```","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[text|url]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Link","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[text](url)","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[PROJ-123]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Issue link","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[~username]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User mention","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@username","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"* item","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bullet list","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"- item","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"# item","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Numbered list","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1. item","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"||Header||","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Table header","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"|Header|","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/jira-syntax-quick-reference.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for complete syntax documentation.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Available Templates","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Bug Report","type":"text"}]},{"type":"paragraph","content":[{"text":"Path","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"templates/bug-report-template.md","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"Sections: Environment, Steps to Reproduce, Expected/Actual Behavior, Error Messages, Technical Notes","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Feature Request","type":"text"}]},{"type":"paragraph","content":[{"text":"Path","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"templates/feature-request-template.md","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"Sections: Overview, User Stories, Acceptance Criteria, Technical Approach, Success Metrics","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Syntax Validation","type":"text"}]},{"type":"paragraph","content":[{"text":"Run before submitting to Jira:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"${CLAUDE_SKILL_DIR}/scripts/validate-jira-syntax.sh path/to/content.txt","type":"text"}]},{"type":"paragraph","content":[{"text":"It gates the post","type":"text","marks":[{"type":"strong"}]},{"text":" — run it as its own step, never chained with the posting command.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Validation Checklist","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Headings: ","type":"text"},{"text":"h2. Title","type":"text","marks":[{"type":"code_inline"}]},{"text":" (space after period)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Bold: ","type":"text"},{"text":"*text*","type":"text","marks":[{"type":"code_inline"}]},{"text":" (single asterisk)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Code blocks: ","type":"text"},{"text":"{code:language}...{code}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Lists: ","type":"text"},{"text":"*","type":"text","marks":[{"type":"code_inline"}]},{"text":" for bullets, ","type":"text"},{"text":"#","type":"text","marks":[{"type":"code_inline"}]},{"text":" for numbers","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Links: ","type":"text"},{"text":"[label|url]","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"[PROJ-123]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Tables: ","type":"text"},{"text":"||Header||","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"|Cell|","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Colors: ","type":"text"},{"text":"{color:red}text{color}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Panels: ","type":"text"},{"text":"{panel:title=X}...{panel}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Common Mistakes","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ Correct","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"## Heading","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"h2. Heading","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"**bold**","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"*bold*","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"`code`","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{{code}}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[text](url)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[text|url]","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"- bullet","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"* bullet","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"h2.Title","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"h2. Title","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"MR !42","type":"text","marks":[{"type":"code_inline"}]},{"text":" (bare GitLab ref)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[MR 42|url]","type":"text","marks":[{"type":"code_inline"}]},{"text":" or full ","type":"text"},{"text":"group/project!42","type":"text","marks":[{"type":"code_inline"}]},{"text":" — a bare ","type":"text"},{"text":"!…!","type":"text","marks":[{"type":"code_inline"}]},{"text":" is image markup","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(/)","type":"text","marks":[{"type":"code_inline"}]},{"text":" on an open/proposed item","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(x)","type":"text","marks":[{"type":"code_inline"}]},{"text":" — ","type":"text"},{"text":"(/)","type":"text","marks":[{"type":"code_inline"}]},{"text":" renders as a green check (done); use ","type":"text"},{"text":"(x)","type":"text","marks":[{"type":"code_inline"}]},{"text":" for open items","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"( )","type":"text","marks":[{"type":"code_inline"}]},{"text":" as a checkbox","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(x)","type":"text","marks":[{"type":"code_inline"}]},{"text":" — ","type":"text"},{"text":"( )","type":"text","marks":[{"type":"code_inline"}]},{"text":" is not a macro and renders literally","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(-)","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"(x)","type":"text","marks":[{"type":"code_inline"}]},{"text":" on a pending step in a review","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(i) pending: …","type":"text","marks":[{"type":"code_inline"}]},{"text":" — ","type":"text"},{"text":"(-)","type":"text","marks":[{"type":"code_inline"}]},{"text":" renders as a red no-entry sign, and in a review ","type":"text"},{"text":"(x)","type":"text","marks":[{"type":"code_inline"}]},{"text":" means a failure","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Integration with jira-communication Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"Workflow:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Get template from jira-syntax","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fill content using Jira wiki markup","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate with ","type":"text"},{"text":"${CLAUDE_SKILL_DIR}/scripts/validate-jira-syntax.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Submit via jira-communication skill","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"References","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/jira-syntax-quick-reference.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Complete syntax documentation Includes ","type":"text"},{"text":"Ask the renderer instead of reasoning about it","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"POST /rest/api/1.0/render","type":"text","marks":[{"type":"code_inline"}]},{"text":" returns the HTML Jira will produce for any markup, before anything is posted. Use it to settle a markup question rather than deriving the answer.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/cross-project-refs.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - GitLab cross-project ref convention (","type":"text"},{"text":"group/project!N","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"group/project#N","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"group/project@tag","type":"text","marks":[{"type":"code_inline"}]},{"text":") when linking to GitLab from Jira","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"templates/bug-report-template.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Bug report template","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"templates/feature-request-template.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Feature request template","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"${CLAUDE_SKILL_DIR}/scripts/validate-jira-syntax.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Automated syntax checker","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Official Jira Wiki Markup","type":"text","marks":[{"type":"link","attrs":{"href":"https://jira.atlassian.com/secure/WikiRendererHelpAction.jspa?section=all","title":null}}]}]}]}]}]},"metadata":{"date":"2026-11-02","name":"jira-syntax","author":"@skillopedia","source":{"stars":90,"repo_name":"jira-skill","origin_url":"https://github.com/netresearch/jira-skill/blob/HEAD/skills/jira-syntax/SKILL.md","repo_owner":"netresearch","body_sha256":"b259ee9a94629dd21c0eb46c330123476dfd4fdb75c8c394661dc5b7bbf43a78","cluster_key":"41f61defd8dcc0cd7a98fe07cc55ec6608296beefc62183463b8aadd8e6078df","clean_bundle":{"format":"clean-skill-bundle-v1","source":"netresearch/jira-skill/skills/jira-syntax/SKILL.md","text_bytes":68131,"source_commit":"123911b6710204e48756dc8296a5e9ef0550f709","skills_sh_rank":17808,"attachment_count":7,"text_attachments":7,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/jira-syntax/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":0},"license":"(MIT AND CC-BY-SA-4.0). See LICENSE-MIT and LICENSE-CC-BY-SA-4.0","version":"v1","category":"integrations-apis","metadata":{"author":"Netresearch DTT GmbH","version":"4.3.1","repository":"https://github.com/netresearch/jira-skill"},"import_tag":"skills-sh-top20k-2026-11","description":"Use when writing or formatting Jira descriptions, comments, or any text destined for Jira. Converts Markdown to Jira wiki markup, provides templates (bug reports, feature requests), and validates syntax before submission. Trigger on any Jira content authoring task."}},"renderedAt":1793666334130}

Jira Syntax Jira wiki markup syntax, templates, and validation. For API operations, use the jira-communication skill. Quick Syntax Reference | Jira Syntax | Purpose | NOT this (Markdown) | |-------------|---------|---------------------| | | Heading | | | | Bold | | | | Italic | | | | Inline code | | | | Code block | java bash ${CLAUDE SKILL DIR}/scripts/validate-jira-syntax.sh path/to/content.txt h2. Title text {code:language}...{code} # [label|url] [PROJ-123] ||Header|| |Cell| {color:red}text{color} {panel:title=X}...{panel} ## Heading h2. Heading bold bold code {{code}} text [text\|url] - b…