@basementuniverse/kanbn 2.0.0 → 2.5.0

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 (100) hide show
  1. package/README.md +3 -1
  2. package/coverage/tmp/coverage-916017-1788028598821-0.json +1 -0
  3. package/coverage/tmp/{coverage-214293-1787777184569-0.json → coverage-916018-1788028597179-0.json} +1 -1
  4. package/coverage/tmp/coverage-916036-1788028598796-0.json +1 -0
  5. package/docs/actions.md +337 -0
  6. package/docs/advanced-configuration.md +55 -0
  7. package/docs/commands/add.txt +17 -1
  8. package/docs/commands/archive.txt +11 -0
  9. package/docs/commands/board.txt +9 -0
  10. package/docs/commands/boards.txt +34 -0
  11. package/docs/commands/burndown.txt +7 -0
  12. package/docs/commands/comment.txt +13 -1
  13. package/docs/commands/contributors.txt +58 -0
  14. package/docs/commands/edit.txt +18 -1
  15. package/docs/commands/find.txt +39 -1
  16. package/docs/commands/gantt.txt +6 -0
  17. package/docs/commands/help.txt +2 -0
  18. package/docs/commands/history.txt +6 -0
  19. package/docs/commands/init.txt +13 -0
  20. package/docs/commands/move.txt +26 -0
  21. package/docs/commands/remove.txt +22 -1
  22. package/docs/commands/rename.txt +5 -0
  23. package/docs/commands/restore.txt +12 -0
  24. package/docs/commands/sort.txt +23 -0
  25. package/docs/commands/sprint.txt +9 -0
  26. package/docs/commands/status.txt +10 -1
  27. package/docs/commands/task.txt +9 -0
  28. package/docs/commands/validate.txt +29 -1
  29. package/docs/contributors.md +145 -0
  30. package/docs/filtering-and-sorting.md +60 -3
  31. package/docs/index-structure.md +145 -11
  32. package/docs/index.md +6 -2
  33. package/docs/multiple-boards.md +259 -0
  34. package/docs/quick-start.md +21 -1
  35. package/docs/task-structure.md +31 -3
  36. package/example/README.md +23 -0
  37. package/example/advanced/kanbn.yml +65 -0
  38. package/example/boards/.kanbn/design.md +31 -0
  39. package/example/boards/.kanbn/index.md +44 -0
  40. package/example/boards/.kanbn/tasks/add-usage-alert-emails.md +19 -0
  41. package/example/boards/.kanbn/tasks/build-tenant-settings-page.md +43 -0
  42. package/example/boards/.kanbn/tasks/create-organization-switcher.md +44 -0
  43. package/example/boards/.kanbn/tasks/design-onboarding-checklist.md +22 -0
  44. package/example/boards/.kanbn/tasks/refresh-marketing-site.md +28 -0
  45. package/example/boards/.kanbn/tasks/ship-billing-portal.md +29 -0
  46. package/package.json +9 -7
  47. package/routes/add.json +40 -12
  48. package/routes/archive.json +14 -2
  49. package/routes/board.json +11 -3
  50. package/routes/boards.json +30 -0
  51. package/routes/burndown.json +23 -7
  52. package/routes/comment.json +19 -5
  53. package/routes/contributors.json +18 -0
  54. package/routes/edit.json +37 -11
  55. package/routes/find.json +37 -12
  56. package/routes/gantt.json +20 -6
  57. package/routes/history.json +39 -25
  58. package/routes/init.json +3 -1
  59. package/routes/move.json +24 -6
  60. package/routes/remove.json +18 -3
  61. package/routes/rename.json +11 -3
  62. package/routes/restore.json +14 -2
  63. package/routes/sort.json +40 -11
  64. package/routes/sprint.json +14 -4
  65. package/routes/status.json +23 -7
  66. package/routes/task.json +10 -2
  67. package/routes/validate.json +18 -5
  68. package/skills/kanbn-plan/SKILL.md +10 -1
  69. package/skills/kanbn-replan/SKILL.md +6 -1
  70. package/src/actions.js +904 -0
  71. package/src/board.js +25 -2
  72. package/src/controller/add.js +72 -55
  73. package/src/controller/archive.js +9 -4
  74. package/src/controller/board.js +21 -13
  75. package/src/controller/boards.js +140 -0
  76. package/src/controller/burndown.js +14 -7
  77. package/src/controller/comment.js +13 -6
  78. package/src/controller/contributors.js +166 -0
  79. package/src/controller/edit.js +48 -18
  80. package/src/controller/find.js +87 -13
  81. package/src/controller/gantt.js +13 -6
  82. package/src/controller/history.js +13 -6
  83. package/src/controller/init.js +39 -4
  84. package/src/controller/move.js +153 -25
  85. package/src/controller/remove.js +73 -13
  86. package/src/controller/rename.js +8 -4
  87. package/src/controller/restore.js +24 -8
  88. package/src/controller/sort.js +59 -3
  89. package/src/controller/sprint.js +31 -7
  90. package/src/controller/status.js +8 -4
  91. package/src/controller/task.js +34 -10
  92. package/src/controller/validate.js +197 -7
  93. package/src/git-user-name.js +9 -0
  94. package/src/git-user.js +55 -0
  95. package/src/main.d.ts +387 -9
  96. package/src/main.js +2757 -113
  97. package/src/parse-index.js +219 -17
  98. package/src/parse-task.js +16 -0
  99. package/src/utility.js +274 -0
  100. package/coverage/tmp/coverage-214292-1787777191526-0.json +0 -1
@@ -53,6 +53,71 @@ columnSorting:
53
53
 
54
54
  dateFormat: yyyy-mm-dd
55
55
 
56
+ # The people who work on this workspace. A contributor can be a bare name or an
57
+ # object; `name` is the value written into a task's `assigned` field and a
58
+ # comment's `author`, and `aliases` catch the other spellings that mean the same
59
+ # person. The list is advisory - `assigned` stays free text and is never
60
+ # validated against it. Run `kanbn contributors --usage` to see which spellings
61
+ # are already in use. See docs/contributors.md.
62
+ contributors:
63
+ - name: Ana
64
+ email: ana@example.com
65
+ aliases:
66
+ - ana
67
+ - Ana Ruiz
68
+ - name: Ben
69
+ email: ben@example.com
70
+ aliases:
71
+ - ben
72
+
73
+ # Rules that fire when a task changes. Actions only run during commands that
74
+ # change something - never during `board`, `find` or `burndown` - and nothing a
75
+ # rule writes can fire another rule. `--no-actions` on any of those commands, or
76
+ # KANBN_NO_ACTIONS=1, steps around a rule that is misbehaving.
77
+ # See docs/actions.md.
78
+ actions:
79
+ # `task.started` is a transition rather than an operation: it fires when the
80
+ # task wasn't started before and is now, whatever caused it. It reads
81
+ # startedColumns above, so adding another started column doesn't break it.
82
+ - name: start-work
83
+ on: task.started
84
+ then:
85
+ - assign: '@me'
86
+ - addTag: active
87
+ - removeTag: ready
88
+
89
+ - name: close-out
90
+ on: task.completed
91
+ then:
92
+ - removeTag: active
93
+ - setProgress: 1
94
+ - set: { closedBy: '@me' }
95
+
96
+ # `reviewedAt` above is stamped by the column linkage; the rule runs after it,
97
+ # so it can see and override anything that stamping wrote.
98
+ - name: flag-review
99
+ on: task.moved
100
+ when:
101
+ toColumn: Review
102
+ then:
103
+ - addTag: needs-review
104
+ - comment: 'Review requested by @me'
105
+
106
+ # `for` points the verbs at related tasks instead of this one. Children carry
107
+ # the `child-of` relation, so `incoming` finds them from the epic.
108
+ - name: epic-blocks-children
109
+ on: task.moved
110
+ when:
111
+ tag: epic
112
+ toColumn: Blocked
113
+ for:
114
+ related: child-of
115
+ direction: incoming
116
+ where:
117
+ is-completed: false
118
+ then:
119
+ - addTag: blocked-by-epic
120
+
56
121
  # Custom fields (team, storyPoints, ...) can be interpolated here because they
57
122
  # are declared in customFields above. See docs/index-structure.md for the full
58
123
  # list of available variables.
@@ -0,0 +1,31 @@
1
+ ---
2
+ # Board-scoped: this board has its own workflow, and its own idea of started and completed
3
+ startedColumns:
4
+ - Designing
5
+ completedColumns:
6
+ - 'Signed Off'
7
+
8
+ # ...and its own state fields, so design progress is tracked separately from engineering progress on
9
+ # the same shared task files. Without these, moving a task to "Signed Off" here would set the
10
+ # shared `completed` date and mark it done on the engineering board too
11
+ startedField: designStartedAt
12
+ completedField: designSignedOffAt
13
+ ---
14
+
15
+ # Design Pipeline
16
+
17
+ Design work across the product, tracked separately from engineering delivery. Tasks here are the
18
+ same task files the engineering board uses - a task can sit in a different column on each.
19
+
20
+ ## Ideas
21
+
22
+ - [design-onboarding-checklist](tasks/design-onboarding-checklist.md)
23
+
24
+ ## Designing
25
+
26
+ - [build-tenant-settings-page](tasks/build-tenant-settings-page.md)
27
+ - [refresh-marketing-site](tasks/refresh-marketing-site.md)
28
+
29
+ ## Signed Off
30
+
31
+ - [create-organization-switcher](tasks/create-organization-switcher.md)
@@ -0,0 +1,44 @@
1
+ ---
2
+ # Board-scoped: these belong to the main board alone, and are NOT inherited by design.md
3
+ startedColumns:
4
+ - 'In Progress'
5
+ completedColumns:
6
+ - Done
7
+
8
+ # Workspace-scoped: with no config file these live here, and every board inherits them. A custom
9
+ # field has to be declared once for the whole workspace, because one task file has to parse
10
+ # identically for every board that references it
11
+ customFields:
12
+ - name: designStartedAt
13
+ type: date
14
+ - name: designSignedOffAt
15
+ type: date
16
+ taskWorkloadTags:
17
+ Tiny: 1
18
+ Small: 2
19
+ Medium: 3
20
+ Large: 5
21
+ Huge: 8
22
+ ---
23
+
24
+ # Example SaaS Project
25
+
26
+ The engineering board. Design work on the same tasks is tracked separately on the `design` board -
27
+ run `kanbn boards` to see both, and `kanbn boards --tasks` to see which tasks span them.
28
+
29
+ ## Backlog
30
+
31
+ - [refresh-marketing-site](tasks/refresh-marketing-site.md)
32
+ - [add-usage-alert-emails](tasks/add-usage-alert-emails.md)
33
+
34
+ ## Todo
35
+
36
+ - [create-organization-switcher](tasks/create-organization-switcher.md)
37
+
38
+ ## In Progress
39
+
40
+ - [build-tenant-settings-page](tasks/build-tenant-settings-page.md)
41
+
42
+ ## Done
43
+
44
+ - [ship-billing-portal](tasks/ship-billing-portal.md)
@@ -0,0 +1,19 @@
1
+ ---
2
+ created: 2026-07-09T15:00:00.000Z
3
+ tags:
4
+ - Medium
5
+ ---
6
+
7
+ # Add Usage Alert Emails
8
+
9
+ Warn an organisation by email when it crosses 80% and 100% of its plan's usage allowance.
10
+
11
+ Engineering-only work, so it never reaches the design board.
12
+
13
+ ## History
14
+
15
+ - type: created
16
+ date: 2026-07-09T15:00:00.000Z
17
+ column: Backlog
18
+ fromProgress: 0
19
+ toProgress: 0
@@ -0,0 +1,43 @@
1
+ ---
2
+ created: 2026-07-02T09:15:00.000Z
3
+ updated: 2026-07-14T11:30:00.000Z
4
+ started: 2026-07-10T09:00:00.000Z
5
+ designStartedAt: 2026-07-06T10:00:00.000Z
6
+ assigned: priya
7
+ tags:
8
+ - Medium
9
+ ---
10
+
11
+ # Build Tenant Settings Page
12
+
13
+ A single place for an organisation's owner to manage name, logo, timezone and default roles.
14
+
15
+ This task is on both boards: `In Progress` on the engineering board and `Designing` on the design
16
+ board. Its `started` date is the engineering start; `designStartedAt` is when design picked it up.
17
+
18
+ ## Sub-tasks
19
+
20
+ - [x] Settings form layout
21
+ - [ ] Logo upload and cropping
22
+ - [ ] Role defaults
23
+
24
+ ## History
25
+
26
+ - type: created
27
+ date: 2026-07-02T09:15:00.000Z
28
+ column: Backlog
29
+ fromProgress: 0
30
+ toProgress: 0
31
+ - type: added
32
+ date: 2026-07-06T10:00:00.000Z
33
+ column: Ideas
34
+ board: design
35
+ - type: moved
36
+ date: 2026-07-06T10:00:00.000Z
37
+ fromColumn: Ideas
38
+ toColumn: Designing
39
+ board: design
40
+ - type: moved
41
+ date: 2026-07-10T09:00:00.000Z
42
+ fromColumn: Backlog
43
+ toColumn: 'In Progress'
@@ -0,0 +1,44 @@
1
+ ---
2
+ created: 2026-07-03T14:00:00.000Z
3
+ updated: 2026-07-12T16:45:00.000Z
4
+ designStartedAt: 2026-07-05T09:30:00.000Z
5
+ designSignedOffAt: 2026-07-12T16:45:00.000Z
6
+ assigned: sam
7
+ tags:
8
+ - Small
9
+ ---
10
+
11
+ # Create Organization Switcher
12
+
13
+ A dropdown for moving between the organisations a user belongs to, without signing out.
14
+
15
+ Design has finished with this one - it sits in `Signed Off` on the design board - but engineering
16
+ hasn't started it, so it's still in `Todo` on the main board. Because the design board reads
17
+ `designSignedOffAt` rather than the shared `completed` field, finishing it here doesn't mark it done
18
+ for engineering.
19
+
20
+ ## Sub-tasks
21
+
22
+ - [ ] Switcher component
23
+ - [ ] Persist last-used organisation
24
+
25
+ ## History
26
+
27
+ - type: created
28
+ date: 2026-07-03T14:00:00.000Z
29
+ column: Backlog
30
+ fromProgress: 0
31
+ toProgress: 0
32
+ - type: added
33
+ date: 2026-07-05T09:30:00.000Z
34
+ column: Designing
35
+ board: design
36
+ - type: moved
37
+ date: 2026-07-08T10:00:00.000Z
38
+ fromColumn: Backlog
39
+ toColumn: Todo
40
+ - type: moved
41
+ date: 2026-07-12T16:45:00.000Z
42
+ fromColumn: Designing
43
+ toColumn: 'Signed Off'
44
+ board: design
@@ -0,0 +1,22 @@
1
+ ---
2
+ created: 2026-07-11T13:20:00.000Z
3
+ assigned: priya
4
+ tags:
5
+ - Small
6
+ ---
7
+
8
+ # Design Onboarding Checklist
9
+
10
+ An in-product checklist walking a new organisation through its first week.
11
+
12
+ This one is only on the design board - engineering hasn't picked it up, so it isn't on the main
13
+ board at all. `kanbn status --untracked` would not list it: it is tracked, just not here.
14
+
15
+ ## History
16
+
17
+ - type: created
18
+ date: 2026-07-11T13:20:00.000Z
19
+ column: Ideas
20
+ board: design
21
+ fromProgress: 0
22
+ toProgress: 0
@@ -0,0 +1,28 @@
1
+ ---
2
+ created: 2026-07-05T08:00:00.000Z
3
+ updated: 2026-07-13T09:00:00.000Z
4
+ designStartedAt: 2026-07-13T09:00:00.000Z
5
+ assigned: priya
6
+ tags:
7
+ - Large
8
+ ---
9
+
10
+ # Refresh Marketing Site
11
+
12
+ New landing page, pricing page and case studies, ahead of the autumn launch.
13
+
14
+ Design has started, engineering hasn't - `Designing` on the design board, `Backlog` on the main one.
15
+ This is the shape that makes per-board state fields worth having: the task genuinely is in flight on
16
+ one board and untouched on the other.
17
+
18
+ ## History
19
+
20
+ - type: created
21
+ date: 2026-07-05T08:00:00.000Z
22
+ column: Backlog
23
+ fromProgress: 0
24
+ toProgress: 0
25
+ - type: added
26
+ date: 2026-07-13T09:00:00.000Z
27
+ column: Designing
28
+ board: design
@@ -0,0 +1,29 @@
1
+ ---
2
+ created: 2026-06-24T10:00:00.000Z
3
+ updated: 2026-07-07T17:10:00.000Z
4
+ started: 2026-06-26T09:00:00.000Z
5
+ completed: 2026-07-07T17:10:00.000Z
6
+ assigned: sam
7
+ tags:
8
+ - Large
9
+ ---
10
+
11
+ # Ship Billing Portal
12
+
13
+ Self-serve plan changes, payment method updates and invoice history.
14
+
15
+ ## History
16
+
17
+ - type: created
18
+ date: 2026-06-24T10:00:00.000Z
19
+ column: Backlog
20
+ fromProgress: 0
21
+ toProgress: 0
22
+ - type: moved
23
+ date: 2026-06-26T09:00:00.000Z
24
+ fromColumn: Backlog
25
+ toColumn: 'In Progress'
26
+ - type: moved
27
+ date: 2026-07-07T17:10:00.000Z
28
+ fromColumn: 'In Progress'
29
+ toColumn: Done
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basementuniverse/kanbn",
3
- "version": "2.0.0",
3
+ "version": "2.5.0",
4
4
  "description": "A CLI Kanban application",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -18,7 +18,7 @@
18
18
  "url": "git+https://github.com/basementuniverse/kanbn.git"
19
19
  },
20
20
  "engines": {
21
- "node": ">=12.0.0"
21
+ "node": ">=16.13.0"
22
22
  },
23
23
  "keywords": [
24
24
  "kanbn",
@@ -38,7 +38,6 @@
38
38
  "dotenv": "^8.2.0",
39
39
  "front-matter": "^4.0.2",
40
40
  "fuzzy": "^0.1.3",
41
- "git-user-name": "^2.0.0",
42
41
  "glob-promise": "^3.4.0",
43
42
  "humanize-duration": "^3.25.0",
44
43
  "inquirer": "^7.3.3",
@@ -47,11 +46,11 @@
47
46
  "inquirer-recursive": "github:basementuniverse/inquirer-recursive",
48
47
  "inquirer-select-line": "github:basementuniverse/inquirer-select-line",
49
48
  "jsonschema": "^1.4.0",
50
- "marked": "^1.2.7",
51
- "marked-terminal": "^4.1.1",
52
- "minimist": "^1.2.5",
49
+ "marked": "^4.3.0",
50
+ "marked-terminal": "^5.2.0",
51
+ "minimist": "^1.2.8",
53
52
  "rimraf": "^3.0.2",
54
- "terminal-kit": "^1.44.0",
53
+ "terminal-kit": "^3.1.4",
55
54
  "yamljs": "^0.3.0"
56
55
  },
57
56
  "devDependencies": {
@@ -66,5 +65,8 @@
66
65
  "qunit": "^2.13.0",
67
66
  "strip-ansi": "^6.0.0",
68
67
  "typescript": "^4.9.3"
68
+ },
69
+ "overrides": {
70
+ "tmp": "^0.2.7"
69
71
  }
70
72
  }
package/routes/add.json CHANGED
@@ -6,7 +6,8 @@
6
6
  ],
7
7
  "args": {
8
8
  "boolean": [
9
- "interactive"
9
+ "interactive",
10
+ "actions"
10
11
  ],
11
12
  "string": [
12
13
  "name",
@@ -18,19 +19,46 @@
18
19
  "due",
19
20
  "plannedStart",
20
21
  "plannedFinish",
21
- "progress"
22
+ "progress",
23
+ "board"
22
24
  ],
23
25
  "alias": {
24
- "interactive": ["i"],
25
- "name": ["n"],
26
- "description": ["d"],
27
- "column": ["c"],
28
- "sub-task": ["s"],
29
- "tag": ["t"],
30
- "relation": ["r"],
31
- "due": ["e"],
32
- "assigned": ["a"],
33
- "untracked": ["u"]
26
+ "interactive": [
27
+ "i"
28
+ ],
29
+ "name": [
30
+ "n"
31
+ ],
32
+ "description": [
33
+ "d"
34
+ ],
35
+ "column": [
36
+ "c"
37
+ ],
38
+ "sub-task": [
39
+ "s"
40
+ ],
41
+ "tag": [
42
+ "t"
43
+ ],
44
+ "relation": [
45
+ "r"
46
+ ],
47
+ "due": [
48
+ "e"
49
+ ],
50
+ "assigned": [
51
+ "a"
52
+ ],
53
+ "untracked": [
54
+ "u"
55
+ ],
56
+ "board": [
57
+ "b"
58
+ ]
59
+ },
60
+ "default": {
61
+ "actions": true
34
62
  }
35
63
  },
36
64
  "controller": "./src/controller/add",
@@ -6,10 +6,22 @@
6
6
  ],
7
7
  "args": {
8
8
  "boolean": [
9
- "list"
9
+ "list",
10
+ "actions"
10
11
  ],
11
12
  "alias": {
12
- "list": ["l"]
13
+ "list": [
14
+ "l"
15
+ ],
16
+ "board": [
17
+ "b"
18
+ ]
19
+ },
20
+ "string": [
21
+ "board"
22
+ ],
23
+ "default": {
24
+ "actions": true
13
25
  }
14
26
  },
15
27
  "controller": "./src/controller/archive",
package/routes/board.json CHANGED
@@ -9,11 +9,19 @@
9
9
  "json"
10
10
  ],
11
11
  "string": [
12
- "view"
12
+ "view",
13
+ "board"
13
14
  ],
14
15
  "alias": {
15
- "view": ["v"],
16
- "json": ["j"]
16
+ "view": [
17
+ "v"
18
+ ],
19
+ "json": [
20
+ "j"
21
+ ],
22
+ "board": [
23
+ "b"
24
+ ]
17
25
  }
18
26
  },
19
27
  "controller": "./src/controller/board",
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "Boards",
3
+ "commands": [
4
+ "boards"
5
+ ],
6
+ "args": {
7
+ "boolean": [
8
+ "json",
9
+ "tasks",
10
+ "all",
11
+ "force"
12
+ ],
13
+ "string": [
14
+ "rename",
15
+ "delete",
16
+ "name"
17
+ ],
18
+ "alias": {
19
+ "json": ["j"],
20
+ "tasks": ["t"],
21
+ "all": ["a"],
22
+ "force": ["f"],
23
+ "rename": ["r"],
24
+ "delete": ["d"],
25
+ "name": ["n"]
26
+ }
27
+ },
28
+ "controller": "./src/controller/boards",
29
+ "help": "./docs/commands/boards.txt"
30
+ }
@@ -13,15 +13,31 @@
13
13
  "sprint",
14
14
  "assigned",
15
15
  "column",
16
- "normalise"
16
+ "normalise",
17
+ "board"
17
18
  ],
18
19
  "alias": {
19
- "json": ["j"],
20
- "date": ["d"],
21
- "sprint": ["p"],
22
- "assigned": ["a"],
23
- "column": ["c"],
24
- "normalise": ["n"]
20
+ "json": [
21
+ "j"
22
+ ],
23
+ "date": [
24
+ "d"
25
+ ],
26
+ "sprint": [
27
+ "p"
28
+ ],
29
+ "assigned": [
30
+ "a"
31
+ ],
32
+ "column": [
33
+ "c"
34
+ ],
35
+ "normalise": [
36
+ "n"
37
+ ],
38
+ "board": [
39
+ "b"
40
+ ]
25
41
  }
26
42
  },
27
43
  "controller": "./src/controller/burndown",
@@ -6,15 +6,29 @@
6
6
  ],
7
7
  "args": {
8
8
  "boolean": [
9
- "interactive"
9
+ "interactive",
10
+ "actions"
10
11
  ],
11
12
  "string": [
12
- "text"
13
+ "text",
14
+ "board"
13
15
  ],
14
16
  "alias": {
15
- "interactive": ["i"],
16
- "author": ["a"],
17
- "text": ["t"]
17
+ "interactive": [
18
+ "i"
19
+ ],
20
+ "author": [
21
+ "a"
22
+ ],
23
+ "text": [
24
+ "t"
25
+ ],
26
+ "board": [
27
+ "b"
28
+ ]
29
+ },
30
+ "default": {
31
+ "actions": true
18
32
  }
19
33
  },
20
34
  "controller": "./src/controller/comment",
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "Contributors",
3
+ "commands": [
4
+ "contributors"
5
+ ],
6
+ "args": {
7
+ "boolean": [
8
+ "json",
9
+ "usage"
10
+ ],
11
+ "alias": {
12
+ "json": ["j"],
13
+ "usage": ["u"]
14
+ }
15
+ },
16
+ "controller": "./src/controller/contributors",
17
+ "help": "./docs/commands/contributors.txt"
18
+ }