smart-commit-copilot-cli 0.1.0 → 0.1.2

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 (42) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +145 -220
  3. package/docs/configuration.md +7 -1
  4. package/docs/getting-started.md +2 -0
  5. package/docs/publish.md +35 -32
  6. package/docs/release-checklist.md +9 -5
  7. package/docs/releases/0.1.1-draft.md +56 -0
  8. package/docs/releases/0.1.2-draft.md +73 -0
  9. package/docs/verification.md +50 -0
  10. package/examples/config/smart-commit.json +1 -1
  11. package/out/commands/bridge.js +12 -4
  12. package/out/commands/bridge.js.map +1 -1
  13. package/out/commitMessage/index.js +1 -0
  14. package/out/commitMessage/index.js.map +1 -1
  15. package/out/commitMessage/openaiProvider.js +4 -2
  16. package/out/commitMessage/openaiProvider.js.map +1 -1
  17. package/out/commitMessage/prompt.js +36 -0
  18. package/out/commitMessage/prompt.js.map +1 -1
  19. package/out/config/schema.js +1 -1
  20. package/out/contracts.js +17 -1
  21. package/out/contracts.js.map +1 -1
  22. package/out/passHistory/index.js +14 -14
  23. package/out/passHistory/index.js.map +1 -1
  24. package/out/passHistory/store.js +14 -14
  25. package/out/passHistory/store.js.map +1 -1
  26. package/out/promptContext.js +68 -2
  27. package/out/promptContext.js.map +1 -1
  28. package/out/renderOutput.js +24 -0
  29. package/out/renderOutput.js.map +1 -1
  30. package/out/review/mockProvider.js +13 -0
  31. package/out/review/mockProvider.js.map +1 -1
  32. package/out/review/parser.js +4 -4
  33. package/out/review/parser.js.map +1 -1
  34. package/out/review/prompt.js +4 -0
  35. package/out/review/prompt.js.map +1 -1
  36. package/package.json +12 -5
  37. package/src/git-commit-message-skills/conventional/SKILL.md +156 -0
  38. package/src/git-commit-message-skills/conventional/references/examples.md +57 -0
  39. package/src/git-commit-message-skills/gitmoji/SKILL.md +157 -0
  40. package/src/git-commit-message-skills/gitmoji/references/examples.md +71 -0
  41. package/src/git-commit-message-skills/semantic/SKILL.md +158 -0
  42. package/src/git-commit-message-skills/semantic/references/examples.md +71 -0
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: conventional
3
+ description: Generate a single-line Conventional Commits subject from staged changes and the current branch name. Use when the user asks to write a commit message, generate a commit message, summarize staged changes, write a git commit subject, 根据暂存区生成提交信息, 生成 commit message, 写提交说明, or produce a commit subject based on the git staging area, branch name, Jira ID, or work item ID.
4
+ commit-message-protocol: conventional
5
+ ---
6
+
7
+ # Conventional Commits
8
+
9
+ ## Purpose
10
+
11
+ Generate a commit message from the current git staged changes.
12
+
13
+ Requirements:
14
+ - Follow Conventional Commits.
15
+ - Follow the configured commit message language for the summary.
16
+ - Extract a Jira ID or work item ID from the current branch name when possible and prepend it to the summary.
17
+ - Ignore branch tokens that are clearly version numbers, release numbers, dates, or pure numeric identifiers.
18
+
19
+ ## Workflow
20
+
21
+ 1. Confirm there are staged changes before drafting the message.
22
+ 2. Read the staged diff, not the full working tree, and summarize only what is staged.
23
+ 3. Read the current branch name.
24
+ 4. Extract a ticket-like identifier from the branch name.
25
+ 5. Choose the best Conventional Commit type.
26
+ 6. Generate a concise subject line.
27
+
28
+ ## Commands
29
+
30
+ Use git commands that inspect only the staged area:
31
+
32
+ ```bash
33
+ git branch --show-current
34
+ git diff --cached --name-only
35
+ git diff --cached --stat
36
+ git diff --cached
37
+ ```
38
+
39
+ If there are no staged changes, do not invent a message. Tell the user there is nothing staged to commit.
40
+
41
+ ## Ticket Extraction
42
+
43
+ Extract a meaningful ticket-like token from the branch name.
44
+
45
+ Preferred pattern:
46
+
47
+ ```text
48
+ [A-Za-z][A-Za-z0-9]+-\d+
49
+ ```
50
+
51
+ Rules:
52
+ - If the branch contains **multiple** substrings that match this pattern, use the **last** match. Prefix segments are often release or iteration noise; the real work item ID is usually at the end (for example `...-CZGZH-SCP-7921` → `SCP-7921`).
53
+ - Keep the extracted ticket exactly as it appears in the branch name.
54
+ - The pattern requires a **leading letter** in the key, so a numeric prefix such as `202-` before the key is not treated as the project key (for example `feature/202-SCP-7921` → `SCP-7921`).
55
+ - Ignore tokens that look like versions or releases when interpreting the branch, for example `1.2.3`, `v2.0.1`, `2026.03`, `release-1.0.0`.
56
+ - Ignore pure numbers such as `1234`.
57
+ - **Do not** substitute unrelated acronyms from the diff or summary (for example `SCA`) for the branch ticket. If the branch yields a `Key-123` token, the subject must include that exact ticket form.
58
+ - If no valid ticket is found, omit it.
59
+
60
+ ## Type Selection
61
+
62
+ Choose the commit type from the staged change intent:
63
+
64
+ - `feat`: new feature or user-visible capability
65
+ - `fix`: bug fix or behavior correction
66
+ - `refactor`: code restructuring without behavior change
67
+ - `perf`: performance improvement
68
+ - `docs`: documentation only
69
+ - `test`: tests only
70
+ - `style`: formatting or non-functional style changes
71
+ - `build`: build tooling or dependency packaging changes
72
+ - `ci`: CI workflow or pipeline changes
73
+ - `chore`: routine maintenance that does not fit the types above
74
+ - `revert`: reverting an earlier commit
75
+
76
+ Do not guess `feat` by default. Pick the narrowest accurate type from the staged diff.
77
+
78
+ ## Output Format
79
+
80
+ Always output a single-line subject only.
81
+
82
+ Subject template:
83
+
84
+ ```text
85
+ <type>: <ticket-id> <summary>
86
+ ```
87
+
88
+ If there is no ticket:
89
+
90
+ ```text
91
+ <type>: <summary>
92
+ ```
93
+
94
+ Subject rules:
95
+ - Keep it concise and specific.
96
+ - Follow the configured commit message language.
97
+ - Focus on the purpose of the staged change, not a file list.
98
+ - Do not end the subject with punctuation.
99
+
100
+ ## Examples
101
+
102
+ Branch: `feature/ABC-5690-user-center-sync`
103
+ Staged intent: user center integration
104
+
105
+ Output:
106
+
107
+ ```text
108
+ feat: ABC-5690 用户中心模块数据联调
109
+ ```
110
+
111
+ Branch: `fix/abc-6021-order-status`
112
+ Staged intent: fix incorrect status mapping
113
+
114
+ Output:
115
+
116
+ ```text
117
+ fix: abc-6021 修复订单状态映射错误
118
+ ```
119
+
120
+ Branch: `release/1.3.0`
121
+ Staged intent: update README
122
+
123
+ Output:
124
+
125
+ ```text
126
+ docs: 更新接诊流程说明
127
+ ```
128
+
129
+ Branch: `feature/202SP5-CZGZH-SCP-7921`
130
+ Staged intent: add SCA security component types
131
+
132
+ Output:
133
+
134
+ ```text
135
+ feat: SCP-7921 新增 SCA 安全组件类型支持
136
+ ```
137
+
138
+ Branch: `feature/202-SCP-7921`
139
+ Staged intent: same as above
140
+
141
+ Output:
142
+
143
+ ```text
144
+ feat: SCP-7921 新增 SCA 安全组件类型支持
145
+ ```
146
+
147
+ ## Response Style
148
+
149
+ When returning the result to the user:
150
+ - Return the final commit message directly.
151
+ - If useful, add one short sentence explaining the chosen type or why the ticket was omitted.
152
+ - If the staged diff is ambiguous, offer 2 to 3 candidate messages and say what differs between them.
153
+
154
+ ## Additional Resources
155
+
156
+ - For more examples, see [references/examples.md](references/examples.md)
@@ -0,0 +1,57 @@
1
+ # Examples
2
+
3
+ ## With Jira ID
4
+
5
+ Branch:
6
+
7
+ ```text
8
+ feature/ABC-5690-user-center-sync
9
+ ```
10
+
11
+ Output:
12
+
13
+ ```text
14
+ feat: ABC-5690 用户中心模块数据联调
15
+ ```
16
+
17
+ ## Lowercase ticket in branch
18
+
19
+ Branch:
20
+
21
+ ```text
22
+ fix/abc-6021-order-status
23
+ ```
24
+
25
+ Output:
26
+
27
+ ```text
28
+ fix: abc-6021 修复订单状态映射错误
29
+ ```
30
+
31
+ ## No ticket in branch
32
+
33
+ Branch:
34
+
35
+ ```text
36
+ chore/update-readme
37
+ ```
38
+
39
+ Output:
40
+
41
+ ```text
42
+ docs: 更新项目接入说明
43
+ ```
44
+
45
+ ## Version-like branch should be ignored
46
+
47
+ Branch:
48
+
49
+ ```text
50
+ release/1.3.0
51
+ ```
52
+
53
+ Output:
54
+
55
+ ```text
56
+ docs: 更新发版说明
57
+ ```
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: gitmoji
3
+ description: Generate a single-line Gitmoji commit subject from staged changes and the current branch name. Use when the user asks to write a gitmoji commit message, generate a gitmoji subject, 生成 gitmoji 提交信息, 写 gitmoji 风格提交说明, or wants a commit message with an emoji prefix instead of a typed commit prefix such as Conventional Commits or Semantic Commits.
4
+ commit-message-protocol: gitmoji
5
+ ---
6
+
7
+ # Gitmoji Commit Message
8
+
9
+ ## Purpose
10
+
11
+ Generate a single-line Gitmoji commit subject from the current staged changes.
12
+
13
+ Requirements:
14
+ - Follow the configured commit message language for the summary.
15
+ - Start the subject with one Gitmoji emoji that best matches the staged change intent.
16
+ - Extract a Jira ID or work item ID from the current branch name when possible and place it after the emoji.
17
+ - Ignore branch tokens that are clearly version numbers, release numbers, dates, or pure numeric identifiers.
18
+ - Do not output a typed commit prefix such as `feat:` or `fix:`.
19
+
20
+ ## Workflow
21
+
22
+ 1. Confirm there are staged changes before drafting the message.
23
+ 2. Read the staged diff, not the full working tree, and summarize only what is staged.
24
+ 3. Read the current branch name.
25
+ 4. Extract a ticket-like identifier from the branch name.
26
+ 5. Choose the Gitmoji that best matches the staged change intent.
27
+ 6. Generate a concise subject line.
28
+
29
+ ## Commands
30
+
31
+ Use git commands that inspect only the staged area:
32
+
33
+ ```bash
34
+ git branch --show-current
35
+ git diff --cached --name-only
36
+ git diff --cached --stat
37
+ git diff --cached
38
+ ```
39
+
40
+ If there are no staged changes, do not invent a message. Tell the user there is nothing staged to commit.
41
+
42
+ ## Ticket Extraction
43
+
44
+ Extract a meaningful ticket-like token from the branch name.
45
+
46
+ Preferred pattern:
47
+
48
+ ```text
49
+ [A-Za-z][A-Za-z0-9]+-\d+
50
+ ```
51
+
52
+ Rules:
53
+ - If the branch contains **multiple** substrings that match this pattern, use the **last** match. Prefix segments are often release or iteration noise; the real work item ID is usually at the end (for example `...-CZGZH-SCP-7921` → `SCP-7921`).
54
+ - Keep the extracted ticket exactly as it appears in the branch name.
55
+ - The pattern requires a **leading letter** in the key, so a numeric prefix such as `202-` before the key is not treated as the project key (for example `feature/202-SCP-7921` → `SCP-7921`).
56
+ - Ignore tokens that look like versions or releases when interpreting the branch, for example `1.2.3`, `v2.0.1`, `2026.03`, `release-1.0.0`.
57
+ - Ignore pure numbers such as `1234`.
58
+ - **Do not** substitute unrelated acronyms from the diff or summary (for example `SCA`) for the branch ticket. If the branch yields a `Key-123` token, the subject must include that exact ticket form after the Gitmoji.
59
+ - If no valid ticket is found, omit it.
60
+
61
+ ## Gitmoji Selection
62
+
63
+ Choose the narrowest Gitmoji that matches the staged change intent:
64
+
65
+ - `✨` new feature or user-visible capability
66
+ - `🐛` bug fix or behavior correction
67
+ - `♻️` refactoring without behavior change
68
+ - `📝` documentation only
69
+ - `✅` tests only
70
+ - `🚀` performance improvement
71
+ - `🔧` tooling, configuration, or maintenance changes
72
+ - `🔥` removing obsolete code or files
73
+ - `🚑️` urgent production fix
74
+ - `💄` UI or style-only adjustments
75
+
76
+ Do not default to `✨`. Match the actual staged diff.
77
+
78
+ ## Output Format
79
+
80
+ Always output a single-line subject only.
81
+
82
+ Subject template with ticket:
83
+
84
+ ```text
85
+ <gitmoji> <ticket-id> <summary>
86
+ ```
87
+
88
+ Subject template without ticket:
89
+
90
+ ```text
91
+ <gitmoji> <summary>
92
+ ```
93
+
94
+ Subject rules:
95
+ - Keep it concise and specific.
96
+ - Follow the configured commit message language.
97
+ - Focus on the purpose of the staged change, not a file list.
98
+ - Do not end the subject with punctuation.
99
+ - Do not add extra labels, explanations, or markdown.
100
+
101
+ ## Examples
102
+
103
+ Branch: `feature/ABC-5690-user-center-sync`
104
+ Staged intent: user center integration
105
+
106
+ Output:
107
+
108
+ ```text
109
+ ✨ ABC-5690 用户中心模块数据联调
110
+ ```
111
+
112
+ Branch: `fix/abc-6021-order-status`
113
+ Staged intent: fix incorrect status mapping
114
+
115
+ Output:
116
+
117
+ ```text
118
+ 🐛 abc-6021 修复订单状态映射错误
119
+ ```
120
+
121
+ Branch: `chore/update-readme`
122
+ Staged intent: update README
123
+
124
+ Output:
125
+
126
+ ```text
127
+ 📝 更新项目接入说明
128
+ ```
129
+
130
+ Branch: `feature/202SP5-CZGZH-SCP-7921`
131
+ Staged intent: add SCA security component types
132
+
133
+ Output:
134
+
135
+ ```text
136
+ ✨ SCP-7921 新增 SCA 安全组件类型支持
137
+ ```
138
+
139
+ Branch: `feature/202-SCP-7921`
140
+ Staged intent: same as above
141
+
142
+ Output:
143
+
144
+ ```text
145
+ ✨ SCP-7921 新增 SCA 安全组件类型支持
146
+ ```
147
+
148
+ ## Response Style
149
+
150
+ When returning the result to the user:
151
+ - Return the final commit message directly.
152
+ - If useful, add one short sentence explaining the chosen Gitmoji or why the ticket was omitted.
153
+ - If the staged diff is ambiguous, offer 2 to 3 candidate messages and say what differs between them.
154
+
155
+ ## Additional Resources
156
+
157
+ - For more examples, see [references/examples.md](references/examples.md)
@@ -0,0 +1,71 @@
1
+ # Examples
2
+
3
+ ## With Jira ID
4
+
5
+ Branch:
6
+
7
+ ```text
8
+ feature/ABC-5690-user-center-sync
9
+ ```
10
+
11
+ Output:
12
+
13
+ ```text
14
+ ✨ ABC-5690 用户中心模块数据联调
15
+ ```
16
+
17
+ ## Lowercase ticket in branch
18
+
19
+ Branch:
20
+
21
+ ```text
22
+ fix/abc-6021-order-status
23
+ ```
24
+
25
+ Output:
26
+
27
+ ```text
28
+ 🐛 abc-6021 修复订单状态映射错误
29
+ ```
30
+
31
+ ## No ticket in branch
32
+
33
+ Branch:
34
+
35
+ ```text
36
+ chore/update-readme
37
+ ```
38
+
39
+ Output:
40
+
41
+ ```text
42
+ 📝 更新项目接入说明
43
+ ```
44
+
45
+ ## English summary
46
+
47
+ Branch:
48
+
49
+ ```text
50
+ feature/ABC-123-login-flow
51
+ ```
52
+
53
+ Output:
54
+
55
+ ```text
56
+ ✨ ABC-123 add login flow
57
+ ```
58
+
59
+ ## Version-like branch should be ignored
60
+
61
+ Branch:
62
+
63
+ ```text
64
+ release/1.3.0
65
+ ```
66
+
67
+ Output:
68
+
69
+ ```text
70
+ 📝 update release notes
71
+ ```
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: semantic
3
+ description: Generate a single-line Semantic Commits subject from staged changes and the current branch name. Use when the user asks to write a semantic commit message, generate a semantic subject, summarize staged changes with a typed commit prefix, 生成 semantic 提交信息, 写 semantic 风格提交说明, or wants an Angular-style `type(scope): summary` subject that is tracked separately from Conventional Commits.
4
+ commit-message-protocol: semantic
5
+ ---
6
+
7
+ # Semantic Commits
8
+
9
+ ## Purpose
10
+
11
+ Generate a commit message from the current git staged changes.
12
+
13
+ Requirements:
14
+ - Follow Semantic Commits.
15
+ - Use the `type(scope): summary` structure when a scope is useful.
16
+ - Follow the configured commit message language for the summary.
17
+ - Extract a Jira ID or work item ID from the current branch name when possible and prepend it to the summary.
18
+ - Ignore branch tokens that are clearly version numbers, release numbers, dates, or pure numeric identifiers.
19
+
20
+ ## Workflow
21
+
22
+ 1. Confirm there are staged changes before drafting the message.
23
+ 2. Read the staged diff, not the full working tree, and summarize only what is staged.
24
+ 3. Read the current branch name.
25
+ 4. Extract a ticket-like identifier from the branch name.
26
+ 5. Choose the narrowest semantic commit type.
27
+ 6. Generate a concise subject line.
28
+
29
+ ## Commands
30
+
31
+ Use git commands that inspect only the staged area:
32
+
33
+ ```bash
34
+ git branch --show-current
35
+ git diff --cached --name-only
36
+ git diff --cached --stat
37
+ git diff --cached
38
+ ```
39
+
40
+ If there are no staged changes, do not invent a message. Tell the user there is nothing staged to commit.
41
+
42
+ ## Ticket Extraction
43
+
44
+ Extract a meaningful ticket-like token from the branch name.
45
+
46
+ Preferred pattern:
47
+
48
+ ```text
49
+ [A-Za-z][A-Za-z0-9]+-\d+
50
+ ```
51
+
52
+ Rules:
53
+ - If the branch contains **multiple** substrings that match this pattern, use the **last** match. Prefix segments are often release or iteration noise; the real work item ID is usually at the end (for example `...-CZGZH-SCP-7921` → `SCP-7921`).
54
+ - Keep the extracted ticket exactly as it appears in the branch name.
55
+ - The pattern requires a **leading letter** in the key, so a numeric prefix such as `202-` before the key is not treated as the project key (for example `feature/202-SCP-7921` → `SCP-7921`).
56
+ - Ignore tokens that look like versions or releases when interpreting the branch, for example `1.2.3`, `v2.0.1`, `2026.03`, `release-1.0.0`.
57
+ - Ignore pure numbers such as `1234`.
58
+ - **Do not** substitute unrelated acronyms from the diff or summary for the branch ticket. If the branch yields a `Key-123` token, the subject must include that exact ticket form.
59
+ - If no valid ticket is found, omit it.
60
+
61
+ ## Type Selection
62
+
63
+ Choose the commit type from the staged change intent:
64
+
65
+ - `feat`: new feature or user-visible capability
66
+ - `fix`: bug fix or behavior correction
67
+ - `refactor`: code restructuring without behavior change
68
+ - `perf`: performance improvement
69
+ - `docs`: documentation only
70
+ - `test`: tests only
71
+ - `style`: formatting or non-functional style changes
72
+ - `build`: build tooling or dependency packaging changes
73
+ - `ci`: CI workflow or pipeline changes
74
+ - `chore`: routine maintenance that does not fit the types above
75
+ - `revert`: reverting an earlier commit
76
+
77
+ Do not guess `feat` by default. Pick the narrowest accurate type from the staged diff.
78
+
79
+ ## Output Format
80
+
81
+ Always output a single-line subject only.
82
+
83
+ Subject template:
84
+
85
+ ```text
86
+ <type>(<scope>)?: <ticket-id> <summary>
87
+ ```
88
+
89
+ If there is no ticket:
90
+
91
+ ```text
92
+ <type>(<scope>)?: <summary>
93
+ ```
94
+
95
+ Subject rules:
96
+ - Keep it concise and specific.
97
+ - Follow the configured commit message language.
98
+ - Focus on the purpose of the staged change, not a file list.
99
+ - Do not end the subject with punctuation.
100
+ - Keep the type keyword in English.
101
+
102
+ ## Examples
103
+
104
+ Branch: `feature/ABC-5690-user-center-sync`
105
+ Staged intent: user center integration
106
+
107
+ Output:
108
+
109
+ ```text
110
+ feat(user-center): ABC-5690 用户中心模块数据联调
111
+ ```
112
+
113
+ Branch: `fix/abc-6021-order-status`
114
+ Staged intent: fix incorrect status mapping
115
+
116
+ Output:
117
+
118
+ ```text
119
+ fix(order): abc-6021 修复订单状态映射错误
120
+ ```
121
+
122
+ Branch: `release/1.3.0`
123
+ Staged intent: update README
124
+
125
+ Output:
126
+
127
+ ```text
128
+ docs(readme): 更新接诊流程说明
129
+ ```
130
+
131
+ Branch: `feature/202SP5-CZGZH-SCP-7921`
132
+ Staged intent: add SCA security component types
133
+
134
+ Output:
135
+
136
+ ```text
137
+ feat(sca): SCP-7921 新增 SCA 安全组件类型支持
138
+ ```
139
+
140
+ Branch: `feature/202-SCP-7921`
141
+ Staged intent: same as above
142
+
143
+ Output:
144
+
145
+ ```text
146
+ feat(sca): SCP-7921 新增 SCA 安全组件类型支持
147
+ ```
148
+
149
+ ## Response Style
150
+
151
+ When returning the result to the user:
152
+ - Return the final commit message directly.
153
+ - If useful, add one short sentence explaining the chosen type, scope, or why the ticket was omitted.
154
+ - If the staged diff is ambiguous, offer 2 to 3 candidate messages and say what differs between them.
155
+
156
+ ## Additional Resources
157
+
158
+ - For more examples, see [references/examples.md](references/examples.md)
@@ -0,0 +1,71 @@
1
+ # Examples
2
+
3
+ ## With Jira ID and scope
4
+
5
+ Branch:
6
+
7
+ ```text
8
+ feature/ABC-5690-user-center-sync
9
+ ```
10
+
11
+ Output:
12
+
13
+ ```text
14
+ feat(user-center): ABC-5690 用户中心模块数据联调
15
+ ```
16
+
17
+ ## Lowercase ticket in branch
18
+
19
+ Branch:
20
+
21
+ ```text
22
+ fix/abc-6021-order-status
23
+ ```
24
+
25
+ Output:
26
+
27
+ ```text
28
+ fix(order): abc-6021 修复订单状态映射错误
29
+ ```
30
+
31
+ ## No ticket in branch
32
+
33
+ Branch:
34
+
35
+ ```text
36
+ chore/update-readme
37
+ ```
38
+
39
+ Output:
40
+
41
+ ```text
42
+ docs(readme): 更新项目接入说明
43
+ ```
44
+
45
+ ## English summary
46
+
47
+ Branch:
48
+
49
+ ```text
50
+ feature/ABC-123-login-flow
51
+ ```
52
+
53
+ Output:
54
+
55
+ ```text
56
+ feat(auth): ABC-123 add login flow
57
+ ```
58
+
59
+ ## Version-like branch should be ignored
60
+
61
+ Branch:
62
+
63
+ ```text
64
+ release/1.3.0
65
+ ```
66
+
67
+ Output:
68
+
69
+ ```text
70
+ docs(release): update release notes
71
+ ```