issuer 0.1.1 → 0.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b9eef4a9d197d93d73741916ac3b33667eeedbd8f2bdc4bb7efc15a81bace2f
4
- data.tar.gz: d638d611dfece68b9a9492be2a8355b14603aabf4f70e6d2212b9b73b3085775
3
+ metadata.gz: 4fd7532708ed57245a8e2721d299cd2931c24737da8a156bd238cc5977e4691c
4
+ data.tar.gz: 7f277c821b7fe8bb7eda03b5e85718202409fe54bd84d8b4e50bb8911fcce337
5
5
  SHA512:
6
- metadata.gz: 5dd29f7a22ef465afa9888dd4342c46f838298598d79ef0008f0567103030ea45a4fb3882c47460730486a4d5da4794d321fd25db9fc588e4e0a64c023fd67c4
7
- data.tar.gz: 1d47716be2e67809b08dee0e11a65ef32f87f8ba1a61291759b958c6f7ab9f357fbad8b80ea5a567cf643e9f6721527c9b57e6ee5bbc9f0c373dff306cc609ed
6
+ metadata.gz: 381f003520f2c514445bbea944589839a189fa3afee7126d0567d61d680b1a4b79b407886db97749e1cdf9efcb2bb46679e33002700604ed64fa054ee8bcc245
7
+ data.tar.gz: ff486e3bc512907226b7f4fadf454f091cf853dad7c1492f0d5e410b82a3b4584d63a6a817c5fbe6c8d3437770b3ad59ba1b78070cac3cc4559996df6fb75f3a
data/README.adoc CHANGED
@@ -1,18 +1,23 @@
1
1
  = Issuer: Bulk GitHub Issue Creator
2
2
  :toc: macro
3
3
  :toclevels: 3
4
- :this_prod_vrsn: 0.1.1
5
- :next_prod_vrsn: 0.2.0
6
- :docker_base_command: docker run -it --rm -v $(pwd):/workdir -e GITHUB_TOKEN=$ISSUER_API_TOKEN docopslab/issuer
4
+ :this_prod_vrsn: 0.2.1
5
+ :next_prod_vrsn: 0.3.0
6
+ :docker_base_command: docker run -it --rm -v $(pwd):/workdir -e ISSUER_API_TOKEN=$GITHUB_TOKEN docopslab/issuer
7
7
  :append_or_impose: Prepend items with `+` to indicate they should be appended to existing labels. Items without `+` will only be used for issues with no `tags` designated.
8
8
  ifdef::env-github[]
9
9
  :icons: font
10
+ :caution-caption: :fire:
11
+ :important-caption: :exclamation:
12
+ :note-caption: :paperclip:
13
+ :tip-caption: :bulb:
14
+ :warning-caption: :warning:
10
15
  endif::[]
11
16
 
12
17
 
13
18
  == Overview
14
19
 
15
- _Issuer_ lets you define all your work tickets in one place as YAML, apply defaults, and post them to GitHub Issues in bulk.
20
+ _Issuer_ lets you define all your GitHub Issues work tickets in one place as YAML, apply defaults, and post them to GitHub Issues in bulk.
16
21
 
17
22
  === Features
18
23
 
@@ -22,12 +27,26 @@ _Issuer_ lets you define all your work tickets in one place as YAML, apply defau
22
27
  * *Configurable defaults* and label application
23
28
  * *Environment variable support* for authentication
24
29
  * *Issue validation* with helpful error messages
25
- * *GitHub API integration* via Octokit
30
+ * *GitHub API integration*
26
31
 
27
- Future plans include extending this capability to *JIRA*, *GitLab* Issues, GitHub *Projects*, and other services.
32
+ Future plans include extending this capability to *Jira* (link:https://github.com/DocOps/issuer/issues/9[#9]), *GitLab* Issues (link:https://github.com/DocOps/issuer/issues/33[#33]), GitHub *Projects*, and other services.
28
33
 
29
34
  toc::[]
30
35
 
36
+ === Who Is This For?
37
+
38
+ This tool is oriented as much for _project managers_ as it is for _software developers_, but the target audience is probably *people who manage software development cycles*, especially using Git tools and GitHub Issues (or soon Jira Issues and GitLab Issues).
39
+
40
+ [NOTE]
41
+ Issuer does not require Git be installed on your local workstation.
42
+ The only direct use of Git would be if you commit and share the batch-configuration file with your team for collective editing.
43
+
44
+ This tool is great at creating "`stub`" issues for entire teams, based on user-story documents, task lists, or other planning documents.
45
+ Once you convert such documents to our special YAML-based definition format (IMYML), use `issuer` to post them to your GitHub Issues system via GitHub's API.
46
+
47
+ Individual issue entries can be as basic or as detailed as you wish.
48
+ They may consist of as little as just a title (summary) line, or that plus an assignee responsible for filling out the rest and adding metadata.
49
+ Or they can be complete with labels, milestones, a type designation, and a complete explanation of the issue.
31
50
 
32
51
  == Installation
33
52
 
@@ -57,15 +76,18 @@ With Docker installed and running...
57
76
  For actual issue creation, use something like:
58
77
 
59
78
  [.prompt,subs=+attributes]
60
- {docker_base_command} your-issues.yml --dry
79
+ {docker_base_command} your-issues.yml
61
80
 
62
81
  The above command:
63
82
 
64
83
  * mounts your local directory to be readable by the Docker container
65
- * passes your GitHub access token environment variable into the container (`$ISSUER_API_TOKEN` could be `$ISSER_GITHUB_TOKEN`, `$GITHUB_ACCESS_TOKEN`, or `$GITHUB_TOKEN`).
84
+ * passes your GitHub access token environment variable into the container (`$ISSUER_API_TOKEN` could be `$ISSUER_GITHUB_TOKEN`, `$GITHUB_ACCESS_TOKEN`, or `$GITHUB_TOKEN`).
85
+ * connects to GitHub and creates issue entries one at a time from `your-issues.yml`
66
86
 
67
87
  Everything after `docopslab/issuer` accepts the standard arguments and options of the issuer CLI.
68
88
 
89
+ See <<usage>> for more.
90
+
69
91
  [[docker-alias]]
70
92
  ==== Alias the Docker Command
71
93
 
@@ -82,7 +104,7 @@ Reload your shell configuration for the alias to take effect:
82
104
 
83
105
  === For Ruby Users
84
106
 
85
- If you have Ruby on your workstation, there are two common ways to install thi gem.
107
+ If you have Ruby on your workstation, there are two common ways to install this gem.
86
108
 
87
109
  ==== Global Installation
88
110
 
@@ -91,7 +113,7 @@ If you have Ruby on your workstation, there are two common ways to install thi g
91
113
 
92
114
  Then you can use the `issuer` command from anywhere in your system.
93
115
 
94
- ==== Local/Applicaition Installation
116
+ ==== Local/Application Installation
95
117
 
96
118
  Add this line to your Gemfile:
97
119
 
@@ -106,14 +128,14 @@ And then execute:
106
128
 
107
129
  Now you can use `bundle exec issuer` to perform operations inside the project directory.
108
130
 
109
-
131
+ [[usage]]
110
132
  == Usage
111
133
 
112
134
  Once installed, you can start using `issuer` to create issues in GitHub.
113
135
 
114
136
  === Quickstart Overview
115
137
 
116
- The following steps assume the gem is either installed globally or `issuer` is <<docker-alias,established as an alias>>.
138
+ The following steps assume the gem is either installed globally or `issuer` is <<docker-alias,established as an alias>> (Docker method).
117
139
  For Ruby Bundler usage, prepend `bundle exec ` and for un-aliased Docker usage, prepend `{docker_base_command}`.
118
140
 
119
141
  . Prepare your issue definitions in an IMYML file (see <<imyml-format,examples and docs>> below).
@@ -122,7 +144,7 @@ For Ruby Bundler usage, prepend `bundle exec ` and for un-aliased Docker usage,
122
144
  +
123
145
  issuer example.yml --dry
124
146
 
125
- . Establish a Personal Access Token for GitHub (see <<authentication,Authentication>> below).
147
+ . Establish a Personal Access Token for GitHub and store it as an environment variable (see <<authentication>> below).
126
148
 
127
149
  . Post issues to GitHub:
128
150
  +
@@ -143,7 +165,8 @@ $meta: # optional block for establishing general modes/settings
143
165
  defaults: # value to infer when given property missing
144
166
  vrsn: 0.1.0 # milestone/version
145
167
  user: alice # assigned user
146
- tags: [needs_labels,+posted_by_issuer] # labels
168
+ type: Bug # type of issue (must already be registered)
169
+ tags: [needs:labels, +posted_by_issuer, +needs:docs] # labels
147
170
  stub: true # whether to auto-insert stub texts
148
171
  head: | # header stub text to prepend when indicated
149
172
  Below the next line is the body...
@@ -152,9 +175,10 @@ $meta: # optional block for establishing general modes/settings
152
175
  ---
153
176
  This issue was automatically generated by issuer.
154
177
  body: | # body text to impose when no body provided
155
- This is the default text that will appear if an issue record is a _stub_ and no `body` field is designated.
178
+ This is the default text that will appear if an issue record is a _stub_ and no `body` field is designated.
156
179
  issues: # block for listing issues to post to cloud
157
180
  - summ: Issue title # title/summary field
181
+ type: Task # type of issue (must already be registered)
158
182
  body: | # description/body field
159
183
  Markdown-formatted description.
160
184
  tags: [label1, 'component:api'] # labels to create/assign
@@ -167,14 +191,20 @@ issues: # block for listing issues to post to cloud
167
191
  # ---
168
192
  # This is the default text that will appear if an issue record is a _stub_ and no `body` field is designated.
169
193
  # ---
170
- # This issue was automatically generated by issuer.
194
+ # This issue was automatically generated by issuer.
195
+ - summ: Documentation issue
196
+ tags: [-needs:docs] # skip the default needs:docs label
171
197
  ----
172
198
 
173
199
  The `$meta` block is entirely optional, but if it is absent, your `issuer` command will need a `--proj` flag to designate the GitHub repo to which your issues should post.
174
200
 
175
- Only the `summ` property is required for each issue record, and issue records (Array items) that are simple strings that will be treated as summary-only.
201
+ Only the `summ` property is required for each issue record, and issue records (Array items) that are simple strings will be treated as summary-only.
176
202
  Therefore, the following example would yield 3 tickets with unique summaries and the same body, based on `$meta.defaults.body`.
177
203
 
204
+ Issuer will prompt the creation of tags (labels) or versions (milestones) if they do not already exist in the target repository.
205
+
206
+ Any `type` entry must correspond to an existing issue type.
207
+
178
208
  [source,yaml]
179
209
  ----
180
210
  $meta:
@@ -192,83 +222,102 @@ issues:
192
222
  ----
193
223
 
194
224
  [TIP]
195
- This repository contains numerous link:lib/examples/README.adoc[example files] to use for inspiration.
225
+ This repository contains numerous link:examples/README.adoc[example files] to use for inspiration.
196
226
 
197
227
  The IMYML format will be standardized and formally specified in a future release of _issuer_, but it will remain an _open standard_ adoptable by anyone who wants to exploit or extend it.
198
228
 
199
229
  [[imyml-ref]]
200
230
  ==== IMYML Properties Reference
201
231
 
202
- `$meta`::
232
+ $meta::
203
233
  Optional block for establishing operation-wide modes and settings.
204
234
 
205
- `$meta.proj`:::
235
+ $meta.proj:::
206
236
  (String)
207
237
  Designates the target project/repository.
208
238
 
209
- `$meta.defaults`:::
210
- Designates the default values to use for any issue record that does not specify a value for a given property.
239
+ $meta.defaults:::
240
+ Properties in this block establish the default values to be used for any issue record that does not specify a value for the given property.
211
241
 
212
- `$meta.defaults.vrsn`::::
242
+ $meta.defaults.vrsn::::
213
243
  (String)
214
244
  Sets default version or milestone for all issues.
215
245
 
216
- `$meta.defaults.user`::::
246
+ $meta.defaults.user::::
217
247
  (String)
218
248
  Sets default assignee (GitHub username).
219
249
 
220
- `$meta.defaults.tags`::::
250
+ $meta.defaults.type::::
251
+ (String)
252
+ Sets default issue type to apply to all issues when no `type` property is specified in the issue record.
253
+
254
+ $meta.defaults.tags::::
221
255
  (Array):
222
256
  Labels to append to issues (comma-separated).
223
257
  {append_or_impose}
224
258
 
225
- `$meta.defaults.stub`::::
259
+ $meta.defaults.stub::::
226
260
  (Boolean)
227
261
  Establishes the state whether to insert stub texts (`body` / `head` / `tail`).
228
262
 
229
- `$meta.defaults.body`::::
263
+ $meta.defaults.body::::
230
264
  (String)
231
265
  Sets default body text to apply to all issues when no `body` property is specified in the issue record.
232
266
 
233
- `$meta.defaults.head`::::
267
+ $meta.defaults.head::::
234
268
  (String)
235
269
  Sets default text to insert before the body of all issues for which `stub`.
236
270
 
237
- `$meta.defaults.tail`::::
271
+ $meta.defaults.tail::::
238
272
  (String)
239
273
  Sets default text to insert after the body of all issues for which `stub`.
240
274
 
241
- `issues`::
242
- (Array) Tabular listing of issue records as Array itmes.
275
+ issues::
276
+ (Array)
277
+ Tabular listing of *issue records* as Array items.
243
278
  If an item is Scalar (not a Map with named keys), the value must be a String and it will be treated as the `summ` (summary/title) property.
244
279
  +
245
280
  Otherwise, any `issues` Array items must be Map-formatted "`dictionaries`" with the following properties:
246
281
 
247
- `summ`:::
282
+ summ:::
248
283
  (String, *required*)
249
284
  A one-line title or summary of the issue.
250
285
 
251
- `body`:::
286
+ body:::
252
287
  (String)
253
288
  The main body or description text for the issue.
254
289
  Defaults to `$meta.defaults.body` if `stub == true` for the record, in which case, upon submission, will also incorporate any values for `$meta.defaults.head` and `$meta.defaults.tail`.
255
290
 
256
- `vrsn`:::
291
+ vrsn:::
257
292
  (String)
258
293
  The milestone associated with the issue.
259
294
  +
260
295
  Defaults to `$meta.defaults.vrsn` or else `null`.
261
296
 
262
- `tags`:::
297
+ type:::
298
+ (String)
299
+ The type of issue, which must already be registered in the target project or repository.
300
+ Defaults to `$meta.defaults.type` or else `null`.
301
+
302
+ tags:::
263
303
  (Array of Strings)
264
304
  A listing of specific labels to assign to the issue.
305
+ +
306
+ Supports special prefix notation for label management:
307
+ +
308
+ * Regular labels (example: `bug`, `priority:high`) are applied based on default tag logic
309
+ * Append labels (example: `+urgent`) are always applied to all issues
310
+ * Removal labels (example: `-needs:docs`) remove the specified label from the default/appended labels list
311
+ +
312
+ Example: `tags: [documentation, +critical, -needs:review]` would add `documentation` and `critical` labels while removing any `needs:review` label from defaults.
265
313
 
266
- `user`:::
314
+ user:::
267
315
  (String)
268
316
  The system username of the person or bot to which the ticket is assigned.
269
317
 
270
- `stub [true+++*+++|false]`:::
318
+ stub:::
271
319
  (Boolean)
320
+ Accepts `true` or `false`.
272
321
  Whether to treat the issue as a stub entry, meaning prepend any `$meta.defaults.head` text or append any `$meta.defaults.tail` text, and in case the ticket has no `body` property, insert the text of `$meta.defaults.body`.
273
322
 
274
323
  [[cli-usage]]
@@ -301,13 +350,13 @@ IMYML file path (alternative to positional argument).
301
350
  The target project (org/repo or user/repo format for GitHub).
302
351
 
303
352
  --vrsn _VERSION_::
304
- Argues default milestone for all issues.
353
+ Sets default milestone for all issues.
305
354
 
306
355
  --user _USERNAME_::
307
- Argues default assignee (GitHub username).
356
+ Sets default assignee (GitHub username).
308
357
 
309
358
  --tags _TAG_[,_TAG_]::
310
- Argues labels to impose or add issues (comma-separated).
359
+ Sets labels to apply to issues (comma-separated).
311
360
  {append_or_impose}
312
361
 
313
362
  --stub [_true_+++*+++|_false_]::
@@ -315,7 +364,7 @@ Whether to treat all issues as stubs, meaning prepend any `$meta.defaults.head`
315
364
 
316
365
  ==== Mode Options
317
366
 
318
- --dry::
367
+ --dry, --dry-run::
319
368
  Dry-run: print actions but do not post to GitHub.
320
369
 
321
370
  --auto-versions, --auto-milestones::
@@ -327,7 +376,7 @@ Automatically create missing labels/tags without prompting for confirmation.
327
376
  --auto-metadata::
328
377
  Automatically create all missing metadata (milestones and labels) without prompting for confirmation. Equivalent to using both `--auto-versions` and `--auto-tags`.
329
378
 
330
- --help::
379
+ --help, -h::
331
380
  Prints the usage screen.
332
381
 
333
382
  --version::
@@ -348,7 +397,7 @@ The application will check for environment variables in the following order:
348
397
  To *create and set a token*:
349
398
 
350
399
  . In the GitHub Web interface, go to *Settings* (under your user icon) → *Developer Settings* (bottom of left menu) → *Personal Access Tokens* → *Fine-grained tokens*.
351
- . Generate a new token with access to *All repositoriess* or any *Select repositories* you wish to post to, and include read/write permissions GitHub Issues (under *Repository permissions*).
400
+ . Generate a new token with access to *All repositories* or any *Select repositories* you wish to post to, and include read/write permissions GitHub Issues (under *Repository permissions*).
352
401
  . Copy the token and set it as an environment variable.
353
402
  +
354
403
  .Example
@@ -356,6 +405,13 @@ To *create and set a token*:
356
405
  +
357
406
  Where `github_pat_xxxxxxxxxxxxxxxxxxxxxxxx` is your actual token.
358
407
 
408
+ If your GitHub token is stored under *any other name*, you can alias it inline by prepending to your `issuer` command.
409
+ For example:
410
+
411
+ ISSUER_API_TOKEN=$MY_GITHUB_API_KEY issuer my-issues.yml
412
+
413
+ When using Docker, you can pass any such key into the container this way, using the `-e` option: `-e ISSUER_API_TOKEN=$MY_GITHUB_API_KEY`.
414
+
359
415
 
360
416
  == Advanced Usage
361
417
 
@@ -416,19 +472,19 @@ Logs are simply kept for easy reversal of mis-postings.
416
472
  I developed the 0.1.0 version of this application after trying to use GitHub Copilot to automatically bulk-create issue tickets, which it promises to be able to do but failed me pretty hard at it.
417
473
 
418
474
  That facility seems like a perfectly inappropriate use of generative AI.
419
- It accepted my plan request and pre-drafted ticket content, but then it wanted me to manually add labels and milestones to them, as well as manually click *create* on each one -- even though I had already taken the time to plan and instruct the milestones and labels and the contents were fullly prepared.
475
+ It accepted my plan request and pre-drafted ticket content, but then it wanted me to manually add labels and milestones to them, as well as manually click *create* on each one -- even though I had already taken the time to plan and instruct the milestones and labels and the contents were fully prepared.
420
476
 
421
- Additionally, I find myself using different issue-management systems (JIRA, GitLab Issues, etc), so I wanted a more platform-agnostic way to handle this problem.
477
+ Additionally, I find myself using different issue-management systems (Jira, GitLab Issues, etc), so I wanted a more platform-agnostic way to handle this problem.
422
478
  With that in mind, I have left the Ruby API and the IMYML model fairly "`generic`" for extensibility.
423
479
  I will probably adapt the API to other systems in future releases, and I welcome <<contributing,contributions>> to that effect.
424
480
 
425
481
  === Methodology Confession
426
482
 
427
- I should note up front that this is the closest I have come to "`vibe coding`" anything bigger than a local script, let alone a shippable production code.
428
- Nevertheless, I intervened to make substantial and specific changes at least 100 times, and I rearranged major aspects of the codebase.
483
+ I should note up front that this is the closest I have come to "`vibe coding`" anything bigger than a local script, let alone shippable production code.
484
+ Nevertheless, I intervened to make substantial and specific changes at least 100 times before the 0.1.0 release alone, and I rearranged major aspects of the codebase.
429
485
 
430
- I designed the IMYML format and the CLI up front, then I let Claud 4 (via GH Copilot) draft most of the code.
431
- It committed lots of rookie mistakes during this process, and it even confessed to "`cargo-cult programming`" when I pointed out it was introduing some anti-patterns.
486
+ I designed the IMYML format and the CLI up front, then I let Claude 4 (via GH Copilot) draft most of the code.
487
+ It committed lots of rookie mistakes during this process, and it even confessed to "`cargo-cult programming`" when I pointed out it was introducing some anti-patterns.
432
488
 
433
489
  In the end, the only thing that is mainly untouched by me are the rspec tests, which I will more fully examine and approve before any 1.0 release, but for now they'll have to do.
434
490
 
@@ -479,10 +535,10 @@ bundle exec rspec --pattern "*ops*"
479
535
 
480
536
  The `pr_test` task runs the exact same tests that GitHub Actions runs for pull requests:
481
537
 
482
- * **RSpec Tests**: All unit tests (`bundle exec rake spec`)
483
- * **CLI Tests**: Command-line interface functionality tests
484
- * **YAML Validation**: Validates all example YAML files
485
- * **Documentation Quality**: Vale linting on all documentation files
538
+ * *RSpec Tests*: All unit tests (`bundle exec rake spec`)
539
+ * *CLI Tests*: Command-line interface functionality tests
540
+ * *YAML Validation*: Validates all example YAML files
541
+ * *Documentation Quality*: Vale linting on all documentation files
486
542
 
487
543
  This ensures you can validate your changes locally before pushing to GitHub.
488
544
 
@@ -528,6 +584,47 @@ The GitHub API test suite validates:
528
584
  * Automation flags (`--auto-metadata`, `--auto-versions`, etc.)
529
585
  * Error handling and edge cases
530
586
 
587
+ === API Reference
588
+
589
+ For detailed API documentation, see the automatically generated documentation at https://gemdocs.org/gems/issuer/{this_prod_vrsn}[GemDocs].
590
+
591
+ The API reference includes:
592
+
593
+ * Complete class and method documentation
594
+ * Method signatures and parameters
595
+ * Return types and examples
596
+ * Internal implementation details
597
+
598
+ This documentation is automatically updated with each gem release.
599
+
600
+ === Release History Management
601
+
602
+ As of version 0.2.0, the Release Notes and Changelog are generated using the _ReleaseHx_ tool, which is still in pre-release.
603
+ You can find the release history assets in the `docs/releasehx/` directory, which contains a configuration file and the 0.2.0 "`RHYML`" file that was auto-modified and then manually edited to produce the GitHub link:https://github.com/DocOps/issuer/releases[release announcement].
604
+
605
+ ReleaseHx will be available soon, but for now the following is only usable by DocOps Lab.
606
+
607
+ . Add local releasehx gem to `Gemfile`:
608
+ +
609
+ [source,ruby]
610
+ gem 'releasehx', path: '../releasehx'
611
+
612
+ . Draft RHYML draft file from the online GitHub Issues for the given version:
613
+ +
614
+ [.prompt,subs=+attributes]
615
+ ./releasehx-install.sh && bundle exec rhx {this_prod_vrsn} --yaml docs/releasehx/release-{this_prod_vrsn}.yml --config docs/releasehx/config.yml
616
+ +
617
+ The `releasehx-install.sh` ensures ReleaseHx is up to date.
618
+
619
+ . Manually edit the RHYML draft file.
620
+
621
+ . Generate the release history as Markdown.
622
+ +
623
+ [.prompt,subs=+attributes]
624
+ bundle exec rhx docs/releasehx/release-{this_prod_vrsn}.yml --md docs/releasehx/{this_prod_vrsn}.md --config docs/releasehx/config.yml
625
+
626
+ . Copy and paste the contents of `docs/releasehx/{this_prod_vrsn}.md` into the GitHub release form at https://github.com/DocOps/issuer/releases/new.
627
+
531
628
  [[contributing]]
532
629
  === Contributing
533
630
 
@@ -5,6 +5,7 @@ $meta:
5
5
  vrsn: 1.0.0
6
6
  user: project-manager
7
7
  tags: [enhancement]
8
+ type: Task
8
9
 
9
10
  issues:
10
11
  - summ: Add user authentication
@@ -15,6 +16,7 @@ issues:
15
16
  - Password hashing
16
17
  - Session management
17
18
  - Two-factor authentication support
19
+ type: Feature
18
20
  tags: [security, authentication]
19
21
  user: backend-dev
20
22
 
@@ -22,6 +24,7 @@ issues:
22
24
  body: |
23
25
  The current layout breaks on mobile devices.
24
26
  Need to ensure proper responsive behavior.
27
+ type: Bug
25
28
  tags: [bug, ui, mobile]
26
29
  user: frontend-dev
27
30
 
@@ -6,6 +6,7 @@ $meta:
6
6
  defaults:
7
7
  vrsn: 0.1.0
8
8
  user: project-lead
9
+ type: Task
9
10
  tags: [project-setup, +new-project]
10
11
  stub: true
11
12
  head: |
@@ -34,6 +35,7 @@ issues:
34
35
  - Set up .gitignore file
35
36
  - Add initial directory structure
36
37
  - Configure repository settings and permissions
38
+ type: Epic
37
39
  tags: [infrastructure, repository]
38
40
  user: devops-lead
39
41
 
@@ -110,6 +112,7 @@ issues:
110
112
  - Static code analysis for security issues
111
113
  - Secrets management setup
112
114
  - Security policy documentation
115
+ type: Story
113
116
  tags: [security, compliance, +critical]
114
117
  user: security-team
115
118
 
@@ -0,0 +1,41 @@
1
+ # Tag Removal Example - Issue #4 Implementation
2
+ #
3
+ # This example demonstrates the new tag removal functionality where
4
+ # tags prefixed with '-' are removed from the default/appended tags list.
5
+
6
+ $meta:
7
+ proj: myorg/myrepo
8
+ defaults:
9
+ tags: [+posted-by-issuer, needs:label, +needs:docs]
10
+
11
+ issues:
12
+ - summ: Fix misstatement in the README
13
+ body: |
14
+ Correct that really bad typo on the first paragraph.
15
+ No docs needed for this change since it's a docs change.
16
+ tags: [documentation, -needs:docs]
17
+
18
+ - summ: Issue that will be fixed immediately
19
+ tags:
20
+ - '-needs:label'
21
+
22
+ - summ: Complex issue with multiple tag operations
23
+ body: |
24
+ This issue demonstrates multiple tag operations:
25
+ - Adds bug and enhancement tags
26
+ - Removes the default needs:label tag
27
+ - Removes the appended needs:docs tag
28
+ - Keeps the posted-by-issuer tag (append)
29
+ tags: [bug, enhancement, -needs:label, -needs:docs]
30
+
31
+ - summ: Issue with no custom tags
32
+ body: |
33
+ This issue has no custom tags, so it gets all default tags
34
+ including both regular defaults and append tags.
35
+ # No tags specified - gets all defaults
36
+
37
+ - summ: Issue that only removes tags
38
+ body: |
39
+ This issue only removes tags, so it gets default tags
40
+ minus the removed ones.
41
+ tags: [-needs:docs]
@@ -1,8 +1,10 @@
1
1
  issues:
2
2
  - summ: Test milestone validation
3
3
  desc: This issue has a milestone that probably doesn't exist
4
+ type: Bug
4
5
  vrsn: test-milestone-v1.0
5
6
  tags: [test-label-1, existing-bug]
6
7
  - summ: Test label validation
7
8
  desc: This issue has labels that probably don't exist
9
+ type: Task
8
10
  tags: [test-label-2, test-label-3, enhancement]
data/issuer.gemspec CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.metadata["homepage_uri"] = spec.homepage
16
16
  spec.metadata["source_code_uri"] = "https://github.com/DocOps/issuer"
17
17
  spec.metadata["changelog_uri"] = "https://github.com/DocOps/issuer/blob/main/CHANGELOG.md"
18
+ spec.metadata["documentation_uri"] = "https://gemdocs.org/gems/issuer/#{Issuer::VERSION}"
18
19
 
19
20
  # Specify which files should be added to the gem when it is released.
20
21
  spec.files = Dir['lib/**/*.rb'] +