ai-cr 3.2.1__py3-none-any.whl → 3.3.0__py3-none-any.whl

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.
Files changed (40) hide show
  1. {ai_cr-3.2.1.dist-info → ai_cr-3.3.0.dist-info}/LICENSE +21 -21
  2. {ai_cr-3.2.1.dist-info → ai_cr-3.3.0.dist-info}/METADATA +1 -1
  3. ai_cr-3.3.0.dist-info/RECORD +41 -0
  4. {ai_cr-3.2.1.dist-info → ai_cr-3.3.0.dist-info}/WHEEL +1 -1
  5. gito/__main__.py +4 -4
  6. gito/bootstrap.py +90 -90
  7. gito/cli.py +255 -244
  8. gito/cli_base.py +104 -94
  9. gito/commands/__init__.py +1 -1
  10. gito/commands/deploy.py +138 -138
  11. gito/commands/fix.py +160 -160
  12. gito/commands/gh_post_review_comment.py +111 -111
  13. gito/commands/gh_react_to_comment.py +217 -217
  14. gito/commands/linear_comment.py +53 -53
  15. gito/commands/repl.py +30 -30
  16. gito/commands/version.py +8 -8
  17. gito/config.toml +450 -448
  18. gito/constants.py +15 -14
  19. gito/context.py +19 -19
  20. gito/core.py +520 -508
  21. gito/env.py +8 -7
  22. gito/gh_api.py +116 -116
  23. gito/issue_trackers.py +50 -50
  24. gito/pipeline.py +83 -83
  25. gito/pipeline_steps/jira.py +62 -62
  26. gito/pipeline_steps/linear.py +85 -85
  27. gito/project_config.py +85 -85
  28. gito/report_struct.py +136 -136
  29. gito/tpl/answer.j2 +25 -25
  30. gito/tpl/github_workflows/components/env-vars.j2 +11 -11
  31. gito/tpl/github_workflows/components/installs.j2 +23 -23
  32. gito/tpl/github_workflows/gito-code-review.yml.j2 +32 -32
  33. gito/tpl/github_workflows/gito-react-to-comments.yml.j2 +70 -70
  34. gito/tpl/partial/aux_files.j2 +8 -8
  35. gito/tpl/questions/changes_summary.j2 +55 -55
  36. gito/tpl/questions/release_notes.j2 +26 -26
  37. gito/tpl/questions/test_cases.j2 +37 -37
  38. gito/utils.py +267 -242
  39. ai_cr-3.2.1.dist-info/RECORD +0 -41
  40. {ai_cr-3.2.1.dist-info → ai_cr-3.3.0.dist-info}/entry_points.txt +0 -0
@@ -1,11 +1,11 @@
1
-
2
- LLM_API_TYPE: {{ api_type }}
3
- LLM_API_KEY: {{ "${{ secrets." + secret_name + " }}" }}
4
- MODEL: {{ model }}
5
- {% raw -%}
6
- JIRA_TOKEN: ${{ secrets.JIRA_TOKEN }}
7
- JIRA_URL: ${{ secrets.JIRA_URL }}
8
- JIRA_USER: ${{ secrets.JIRA_USER }}
9
- LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
10
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
11
- {%- endraw %}
1
+
2
+ LLM_API_TYPE: {{ api_type }}
3
+ LLM_API_KEY: {{ "${{ secrets." + secret_name + " }}" }}
4
+ MODEL: {{ model }}
5
+ {% raw -%}
6
+ JIRA_TOKEN: ${{ secrets.JIRA_TOKEN }}
7
+ JIRA_URL: ${{ secrets.JIRA_URL }}
8
+ JIRA_USER: ${{ secrets.JIRA_USER }}
9
+ LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
10
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
11
+ {%- endraw %}
@@ -1,23 +1,23 @@
1
-
2
-
3
- - name: Set up Python
4
- uses: actions/setup-python@v5
5
- with: { python-version: "3.13" }
6
-
7
- - name: Fetch Latest Gito Version
8
- id: gito-version
9
- run: pip index versions gito.bot 2>/dev/null | head -1 | sed -n 's/.* (\([^)]*\)).*/version=\1/p' >> $GITHUB_OUTPUT
10
-
11
- {% raw -%}
12
- - uses: actions/cache@v4
13
- id: cache
14
- with:
15
- path: |
16
- ${{ env.pythonLocation }}/lib/python3.13/site-packages
17
- ${{ env.pythonLocation }}/bin
18
- key: gito_v${{ steps.gito-version.outputs.version }}
19
- {%- endraw %}
20
-
21
- - name: Install Gito
22
- if: steps.cache.outputs.cache-hit != 'true'
23
- run: pip install gito.bot~={{ major }}.{{ minor }}
1
+
2
+
3
+ - name: Set up Python
4
+ uses: actions/setup-python@v5
5
+ with: { python-version: "3.13" }
6
+
7
+ - name: Fetch Latest Gito Version
8
+ id: gito-version
9
+ run: pip index versions gito.bot 2>/dev/null | head -1 | sed -n 's/.* (\([^)]*\)).*/version=\1/p' >> $GITHUB_OUTPUT
10
+
11
+ {% raw -%}
12
+ - uses: actions/cache@v4
13
+ id: cache
14
+ with:
15
+ path: |
16
+ ${{ env.pythonLocation }}/lib/python3.13/site-packages
17
+ ${{ env.pythonLocation }}/bin
18
+ key: gito_v${{ steps.gito-version.outputs.version }}
19
+ {%- endraw %}
20
+
21
+ - name: Install Gito
22
+ if: steps.cache.outputs.cache-hit != 'true'
23
+ run: pip install gito.bot~={{ major }}.{{ minor }}
@@ -1,33 +1,33 @@
1
- name: "Gito: AI Code Reviewer"
2
- on:
3
- pull_request:
4
- types: [opened, synchronize, reopened]
5
- workflow_dispatch:
6
- inputs:
7
- pr_number:
8
- description: "Pull Request number"
9
- required: true
10
- jobs:
11
- review:
12
- runs-on: ubuntu-latest
13
- permissions: { contents: read, pull-requests: write } # 'write' for leaving the summary comment
14
- steps:
15
- - uses: actions/checkout@v4
16
- with: { fetch-depth: 0 }
17
-
18
- {%- include("github_workflows/components/installs.j2") %}
19
-
20
- - name: Run AI code review
21
- env:
22
- {%- include("github_workflows/components/env-vars.j2") %}
23
- PR_NUMBER_FROM_WORKFLOW_DISPATCH: {% raw %}${{ github.event.inputs.pr_number }}{% endraw %}
24
- run: |{% raw %}
25
- gito --verbose review
26
- gito github-comment{% endraw %}
27
-
28
- - uses: actions/upload-artifact@v4
29
- with:
30
- name: gito-code-review-results
31
- path: |
32
- code-review-report.md
1
+ name: "Gito: AI Code Reviewer"
2
+ on:
3
+ pull_request:
4
+ types: [opened, synchronize, reopened]
5
+ workflow_dispatch:
6
+ inputs:
7
+ pr_number:
8
+ description: "Pull Request number"
9
+ required: true
10
+ jobs:
11
+ review:
12
+ runs-on: ubuntu-latest
13
+ permissions: { contents: read, pull-requests: write } # 'write' for leaving the summary comment
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ with: { fetch-depth: 0 }
17
+
18
+ {%- include("github_workflows/components/installs.j2") %}
19
+
20
+ - name: Run AI code review
21
+ env:
22
+ {%- include("github_workflows/components/env-vars.j2") %}
23
+ PR_NUMBER_FROM_WORKFLOW_DISPATCH: {% raw %}${{ github.event.inputs.pr_number }}{% endraw %}
24
+ run: |{% raw %}
25
+ gito --verbose review
26
+ gito github-comment{% endraw %}
27
+
28
+ - uses: actions/upload-artifact@v4
29
+ with:
30
+ name: gito-code-review-results
31
+ path: |
32
+ code-review-report.md
33
33
  code-review-report.json
@@ -1,70 +1,70 @@
1
- name: "Gito: React to GitHub comment"
2
-
3
- on:
4
- issue_comment:
5
- types: [created]
6
-
7
- permissions:
8
- contents: write # to make PR
9
- issues: write
10
- pull-requests: write
11
- # read: to download the code review artifact
12
- # write: to trigger other actions
13
- actions: write
14
-
15
- jobs:
16
- process-comment:
17
- if: |
18
- github.event.issue.pull_request &&
19
- (
20
- github.event.comment.author_association == 'OWNER' ||
21
- github.event.comment.author_association == 'MEMBER' ||
22
- github.event.comment.author_association == 'COLLABORATOR'
23
- ) &&
24
- (
25
- startsWith(github.event.comment.body, '/') ||
26
- startsWith(github.event.comment.body, 'gito') ||
27
- startsWith(github.event.comment.body, 'ai') ||
28
- startsWith(github.event.comment.body, 'bot') ||
29
- contains(github.event.comment.body, '@gito') ||
30
- contains(github.event.comment.body, '@ai') ||
31
- contains(github.event.comment.body, '@bot')
32
- )
33
- runs-on: ubuntu-latest
34
-
35
- steps:
36
- - name: Get PR details
37
- id: pr
38
- uses: actions/github-script@v7
39
- with:
40
- script: |
41
- const pr = await github.rest.pulls.get({
42
- owner: context.repo.owner,
43
- repo: context.repo.repo,
44
- pull_number: context.issue.number
45
- });
46
- return {
47
- head_ref: pr.data.head.ref,
48
- head_sha: pr.data.head.sha,
49
- base_ref: pr.data.base.ref
50
- };
51
-
52
- - name: Checkout repository
53
- uses: actions/checkout@v4
54
- with:
55
- {% raw -%}
56
- repository: ${{ github.repository }}
57
- token: ${{ secrets.GITHUB_TOKEN }}
58
- ref: ${{ fromJson(steps.pr.outputs.result).head_ref }}
59
- fetch-depth: 0
60
- {%- endraw %}
61
-
62
- {%- include("github_workflows/components/installs.j2") %}
63
-
64
- - name: Run Gito react
65
- env:
66
- # LLM config is needed only if answer_github_comments = true in .gito/config.toml
67
- # Otherwise, use LLM_API_TYPE: none
68
- {%- include("github_workflows/components/env-vars.j2") %}
69
- run: |
70
- {% raw %}gito react-to-comment ${{ github.event.comment.id }}{%- endraw %}
1
+ name: "Gito: React to GitHub comment"
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+
7
+ permissions:
8
+ contents: write # to make PR
9
+ issues: write
10
+ pull-requests: write
11
+ # read: to download the code review artifact
12
+ # write: to trigger other actions
13
+ actions: write
14
+
15
+ jobs:
16
+ process-comment:
17
+ if: |
18
+ github.event.issue.pull_request &&
19
+ (
20
+ github.event.comment.author_association == 'OWNER' ||
21
+ github.event.comment.author_association == 'MEMBER' ||
22
+ github.event.comment.author_association == 'COLLABORATOR'
23
+ ) &&
24
+ (
25
+ startsWith(github.event.comment.body, '/') ||
26
+ startsWith(github.event.comment.body, 'gito') ||
27
+ startsWith(github.event.comment.body, 'ai') ||
28
+ startsWith(github.event.comment.body, 'bot') ||
29
+ contains(github.event.comment.body, '@gito') ||
30
+ contains(github.event.comment.body, '@ai') ||
31
+ contains(github.event.comment.body, '@bot')
32
+ )
33
+ runs-on: ubuntu-latest
34
+
35
+ steps:
36
+ - name: Get PR details
37
+ id: pr
38
+ uses: actions/github-script@v7
39
+ with:
40
+ script: |
41
+ const pr = await github.rest.pulls.get({
42
+ owner: context.repo.owner,
43
+ repo: context.repo.repo,
44
+ pull_number: context.issue.number
45
+ });
46
+ return {
47
+ head_ref: pr.data.head.ref,
48
+ head_sha: pr.data.head.sha,
49
+ base_ref: pr.data.base.ref
50
+ };
51
+
52
+ - name: Checkout repository
53
+ uses: actions/checkout@v4
54
+ with:
55
+ {% raw -%}
56
+ repository: ${{ github.repository }}
57
+ token: ${{ secrets.GITHUB_TOKEN }}
58
+ ref: ${{ fromJson(steps.pr.outputs.result).head_ref }}
59
+ fetch-depth: 0
60
+ {%- endraw %}
61
+
62
+ {%- include("github_workflows/components/installs.j2") %}
63
+
64
+ - name: Run Gito react
65
+ env:
66
+ # LLM config is needed only if answer_github_comments = true in .gito/config.toml
67
+ # Otherwise, use LLM_API_TYPE: none
68
+ {%- include("github_workflows/components/env-vars.j2") %}
69
+ run: |
70
+ {% raw %}gito react-to-comment ${{ github.event.comment.id }}{%- endraw %}
@@ -1,8 +1,8 @@
1
- {% if aux_files %}
2
- ----AUXILIARY INFORMATION----
3
- * Use if helpful for the task.
4
- {% for file, text in aux_files.items() %}
5
- --FILE: {{ file }}--
6
- {{ text.strip() }}
7
- {%- endfor -%}
8
- {%- endif -%}
1
+ {% if aux_files %}
2
+ ----AUXILIARY INFORMATION----
3
+ * Use if helpful for the task.
4
+ {% for file, text in aux_files.items() %}
5
+ --FILE: {{ file }}--
6
+ {{ text.strip() }}
7
+ {%- endfor -%}
8
+ {%- endif -%}
@@ -1,55 +1,55 @@
1
- {{ self_id }}
2
- ----TASK----
3
-
4
- ## Subtask 1:
5
- Write a codebase changes summary clearly describing and explaining it for the engineering managers.
6
- - It is intended to be posted into bug tracker for estimating work done in the pull request.
7
- - Summary should be in a form of compact changelist where each change is described by one sentence.
8
- - Caption should be: ## PR Summary: <3-10 words>
9
- - Each change summary BP list item should start from effort estimation icon:
10
- - - ◆◇◇ (up to 2 hours)
11
- - - ◆◆◇ (half day)
12
- - - ◆◆◆ (1-2 days and more)
13
-
14
- Also include this estimation legend below as "Pure Codebase Work Estimation Legend".
15
-
16
-
17
- ## Subtask 1 (Issue alignment sentence)
18
- Include one sentence about how the code changes address the requirements of the associated issue listed below.
19
- - Use ✅ or ⚠️ to indicate whether the implementation fully satisfies the issue requirements.
20
- - Put this sentence immediately below the PR Summary title
21
- Examples:
22
-
23
- If the implementation fully delivers the requested functionality:
24
- ```
25
- ✅ Implementation Satisfies [<ISSUE_KEY>](<ISSUE_URL>).
26
- ```
27
- If there are concerns about how thoroughly the code covers the requirements and technical description from the associated issue:
28
- ```
29
- ⚠️ <Describe specific gap or concern>.
30
- ⚠️ <Describe additional limitation or missing feature>.
31
- ```
32
-
33
- ## Subtask 3:
34
- Write release notes for public documentation.
35
- - Caption should be: ## Release Notes Proposal
36
- Summarize the following changes, focusing on what is new, improved, or fixed for the end user.
37
- Do not include internal or technical details.
38
- Structure release notes using clear sections: Added, Changed, Fixed.
39
- Avoid internal technical jargon or developer-specific details.
40
-
41
- ----RELATED CODEBASE CHANGES----
42
- {% for part in diff %}{{ part }}\n{% endfor %}
43
-
44
- ----FULL FILE CONTENT AFTER APPLYING CHANGES----
45
- {% for file, file_lines in all_file_lines.items() %}
46
- --FILE: {{ file }}--
47
- {{ file_lines }}
48
- {% endfor %}
49
-
50
- {%- if pipeline_out.associated_issue and pipeline_out.associated_issue.title %}
51
- ----ASSOCIATED ISSUE----
52
- # {{ pipeline_out.associated_issue.title }}
53
- {{ pipeline_out.associated_issue.description }}
54
- URL: {{ pipeline_out.associated_issue.url }}
55
- {%- endif -%}{{ '\n' }}
1
+ {{ self_id }}
2
+ ----TASK----
3
+
4
+ ## Subtask 1:
5
+ Write a codebase changes summary clearly describing and explaining it for the engineering managers.
6
+ - It is intended to be posted into bug tracker for estimating work done in the pull request.
7
+ - Summary should be in a form of compact changelist where each change is described by one sentence.
8
+ - Caption should be: ## PR Summary: <3-10 words>
9
+ - Each change summary BP list item should start from effort estimation icon:
10
+ - - ◆◇◇ (up to 2 hours)
11
+ - - ◆◆◇ (half day)
12
+ - - ◆◆◆ (1-2 days and more)
13
+
14
+ Also include this estimation legend below as "Pure Codebase Work Estimation Legend".
15
+
16
+
17
+ ## Subtask 1 (Issue alignment sentence)
18
+ Include one sentence about how the code changes address the requirements of the associated issue listed below.
19
+ - Use ✅ or ⚠️ to indicate whether the implementation fully satisfies the issue requirements.
20
+ - Put this sentence immediately below the PR Summary title
21
+ Examples:
22
+
23
+ If the implementation fully delivers the requested functionality:
24
+ ```
25
+ ✅ Implementation Satisfies [<ISSUE_KEY>](<ISSUE_URL>).
26
+ ```
27
+ If there are concerns about how thoroughly the code covers the requirements and technical description from the associated issue:
28
+ ```
29
+ ⚠️ <Describe specific gap or concern>.
30
+ ⚠️ <Describe additional limitation or missing feature>.
31
+ ```
32
+
33
+ ## Subtask 3:
34
+ Write release notes for public documentation.
35
+ - Caption should be: ## Release Notes Proposal
36
+ Summarize the following changes, focusing on what is new, improved, or fixed for the end user.
37
+ Do not include internal or technical details.
38
+ Structure release notes using clear sections: Added, Changed, Fixed.
39
+ Avoid internal technical jargon or developer-specific details.
40
+
41
+ ----RELATED CODEBASE CHANGES----
42
+ {% for part in diff %}{{ part }}\n{% endfor %}
43
+
44
+ ----FULL FILE CONTENT AFTER APPLYING CHANGES----
45
+ {% for file, file_lines in all_file_lines.items() %}
46
+ --FILE: {{ file }}--
47
+ {{ file_lines }}
48
+ {% endfor %}
49
+
50
+ {%- if pipeline_out.associated_issue and pipeline_out.associated_issue.title %}
51
+ ----ASSOCIATED ISSUE----
52
+ # {{ pipeline_out.associated_issue.title }}
53
+ {{ pipeline_out.associated_issue.description }}
54
+ URL: {{ pipeline_out.associated_issue.url }}
55
+ {%- endif -%}{{ '\n' }}
@@ -1,26 +1,26 @@
1
- {{ self_id }}
2
- ----TASK----
3
- Write release notes for public documentation.
4
- Summarize the following changes, focusing on what is new, improved, or fixed for the end user.
5
- Do not include internal or technical details.
6
- Structure release notes using clear sections: Added, Changed, Fixed.
7
- Avoid internal technical jargon or developer-specific details.
8
-
9
-
10
- ----RELATED CODEBASE CHANGES----
11
- {% for part in diff %}{{ part }}\n{% endfor %}
12
-
13
- ----FULL FILE CONTENT AFTER APPLYING CHANGES----
14
- {% for file, file_lines in all_file_lines.items() %}
15
- --FILE: {{ file }}--
16
- {{ file_lines }}
17
- {% endfor %}
18
-
19
- {%- include "partial/aux_files.j2" -%}
20
-
21
- {%- if pipeline_out.associated_issue and pipeline_out.associated_issue.title %}
22
- ----ASSOCIATED ISSUE----
23
- # {{ pipeline_out.associated_issue.title }}
24
- {{ pipeline_out.associated_issue.description }}
25
- URL: {{ pipeline_out.associated_issue.url }}
26
- {%- endif -%}{{ '\n' }}
1
+ {{ self_id }}
2
+ ----TASK----
3
+ Write release notes for public documentation.
4
+ Summarize the following changes, focusing on what is new, improved, or fixed for the end user.
5
+ Do not include internal or technical details.
6
+ Structure release notes using clear sections: Added, Changed, Fixed.
7
+ Avoid internal technical jargon or developer-specific details.
8
+
9
+
10
+ ----RELATED CODEBASE CHANGES----
11
+ {% for part in diff %}{{ part }}\n{% endfor %}
12
+
13
+ ----FULL FILE CONTENT AFTER APPLYING CHANGES----
14
+ {% for file, file_lines in all_file_lines.items() %}
15
+ --FILE: {{ file }}--
16
+ {{ file_lines }}
17
+ {% endfor %}
18
+
19
+ {%- include "partial/aux_files.j2" -%}
20
+
21
+ {%- if pipeline_out.associated_issue and pipeline_out.associated_issue.title %}
22
+ ----ASSOCIATED ISSUE----
23
+ # {{ pipeline_out.associated_issue.title }}
24
+ {{ pipeline_out.associated_issue.description }}
25
+ URL: {{ pipeline_out.associated_issue.url }}
26
+ {%- endif -%}{{ '\n' }}
@@ -1,37 +1,37 @@
1
- {{ self_id }}
2
- ----TASK----
3
- Create a concise list of manual QA test cases for the newly introduced codebase changes.
4
- The purpose of this document is to identify user journeys that could be disrupted by failures,
5
- cover security scenarios and edge cases, highlight potential risk areas introduced by the changes,
6
- and suggest focused testing to mitigate them.
7
-
8
- - Split the test cases into two categories:
9
- - Critical
10
- - Extended Coverage
11
-
12
- - Structure test cases using Markdown headers or bullet-point lists.
13
-
14
- - If the context includes the necessary details, describe the steps as thoroughly as possible—like for a junior QA
15
- seeing this project for the first time.
16
- If there are no details on how to perform a specific action, keep it abstract.
17
- It is extremely important not to invent information.
18
-
19
- - Number test cases sequentially (C-01, C-02, E-01, E-02, etc.).
20
-
21
- ----RELATED CODEBASE CHANGES----
22
- {% for part in diff %}{{ part }}\n{% endfor %}
23
-
24
- ----FULL FILE CONTENT AFTER APPLYING CHANGES----
25
- {% for file, file_lines in all_file_lines.items() %}
26
- --FILE: {{ file }}--
27
- {{ file_lines }}
28
- {% endfor %}
29
-
30
- {%- include "partial/aux_files.j2" -%}
31
-
32
- {%- if pipeline_out.associated_issue and pipeline_out.associated_issue.title %}
33
- ----ASSOCIATED ISSUE----
34
- # {{ pipeline_out.associated_issue.title }}
35
- {{ pipeline_out.associated_issue.description }}
36
- URL: {{ pipeline_out.associated_issue.url }}
37
- {%- endif -%}{{ '\n' }}
1
+ {{ self_id }}
2
+ ----TASK----
3
+ Create a concise list of manual QA test cases for the newly introduced codebase changes.
4
+ The purpose of this document is to identify user journeys that could be disrupted by failures,
5
+ cover security scenarios and edge cases, highlight potential risk areas introduced by the changes,
6
+ and suggest focused testing to mitigate them.
7
+
8
+ - Split the test cases into two categories:
9
+ - Critical
10
+ - Extended Coverage
11
+
12
+ - Structure test cases using Markdown headers or bullet-point lists.
13
+
14
+ - If the context includes the necessary details, describe the steps as thoroughly as possible—like for a junior QA
15
+ seeing this project for the first time.
16
+ If there are no details on how to perform a specific action, keep it abstract.
17
+ It is extremely important not to invent information.
18
+
19
+ - Number test cases sequentially (C-01, C-02, E-01, E-02, etc.).
20
+
21
+ ----RELATED CODEBASE CHANGES----
22
+ {% for part in diff %}{{ part }}\n{% endfor %}
23
+
24
+ ----FULL FILE CONTENT AFTER APPLYING CHANGES----
25
+ {% for file, file_lines in all_file_lines.items() %}
26
+ --FILE: {{ file }}--
27
+ {{ file_lines }}
28
+ {% endfor %}
29
+
30
+ {%- include "partial/aux_files.j2" -%}
31
+
32
+ {%- if pipeline_out.associated_issue and pipeline_out.associated_issue.title %}
33
+ ----ASSOCIATED ISSUE----
34
+ # {{ pipeline_out.associated_issue.title }}
35
+ {{ pipeline_out.associated_issue.description }}
36
+ URL: {{ pipeline_out.associated_issue.url }}
37
+ {%- endif -%}{{ '\n' }}