project-roadmap-tracking 0.1.0 → 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.
Files changed (58) hide show
  1. package/README.md +293 -24
  2. package/dist/commands/add.d.ts +2 -0
  3. package/dist/commands/add.js +39 -31
  4. package/dist/commands/complete.d.ts +2 -0
  5. package/dist/commands/complete.js +35 -12
  6. package/dist/commands/init.d.ts +1 -0
  7. package/dist/commands/init.js +63 -46
  8. package/dist/commands/list.d.ts +3 -0
  9. package/dist/commands/list.js +65 -62
  10. package/dist/commands/pass-test.d.ts +4 -1
  11. package/dist/commands/pass-test.js +36 -13
  12. package/dist/commands/show.d.ts +4 -1
  13. package/dist/commands/show.js +38 -59
  14. package/dist/commands/update.d.ts +3 -0
  15. package/dist/commands/update.js +77 -32
  16. package/dist/commands/validate.d.ts +4 -1
  17. package/dist/commands/validate.js +74 -32
  18. package/dist/errors/base.error.d.ts +21 -0
  19. package/dist/errors/base.error.js +35 -0
  20. package/dist/errors/circular-dependency.error.d.ts +8 -0
  21. package/dist/errors/circular-dependency.error.js +13 -0
  22. package/dist/errors/config-not-found.error.d.ts +7 -0
  23. package/dist/errors/config-not-found.error.js +12 -0
  24. package/dist/errors/index.d.ts +16 -0
  25. package/dist/errors/index.js +26 -0
  26. package/dist/errors/invalid-task.error.d.ts +7 -0
  27. package/dist/errors/invalid-task.error.js +12 -0
  28. package/dist/errors/roadmap-not-found.error.d.ts +7 -0
  29. package/dist/errors/roadmap-not-found.error.js +12 -0
  30. package/dist/errors/task-not-found.error.d.ts +7 -0
  31. package/dist/errors/task-not-found.error.js +12 -0
  32. package/dist/errors/validation.error.d.ts +16 -0
  33. package/dist/errors/validation.error.js +16 -0
  34. package/dist/repositories/config.repository.d.ts +76 -0
  35. package/dist/repositories/config.repository.js +282 -0
  36. package/dist/repositories/index.d.ts +2 -0
  37. package/dist/repositories/index.js +2 -0
  38. package/dist/repositories/roadmap.repository.d.ts +82 -0
  39. package/dist/repositories/roadmap.repository.js +201 -0
  40. package/dist/services/display.service.d.ts +182 -0
  41. package/dist/services/display.service.js +320 -0
  42. package/dist/services/error-handler.service.d.ts +114 -0
  43. package/dist/services/error-handler.service.js +169 -0
  44. package/dist/services/roadmap.service.d.ts +142 -0
  45. package/dist/services/roadmap.service.js +269 -0
  46. package/dist/services/task-dependency.service.d.ts +210 -0
  47. package/dist/services/task-dependency.service.js +371 -0
  48. package/dist/services/task-query.service.d.ts +123 -0
  49. package/dist/services/task-query.service.js +259 -0
  50. package/dist/services/task.service.d.ts +155 -0
  51. package/dist/services/task.service.js +233 -0
  52. package/dist/util/read-config.js +12 -2
  53. package/dist/util/read-roadmap.js +12 -2
  54. package/dist/util/types.d.ts +5 -0
  55. package/dist/util/update-task.js +2 -1
  56. package/dist/util/validate-task.js +6 -5
  57. package/oclif.manifest.json +128 -5
  58. package/package.json +28 -4
package/README.md CHANGED
@@ -1,15 +1,161 @@
1
1
  # project-roadmap-tracking
2
2
 
3
- CLI based project task tracking
3
+ A modern, production-ready CLI tool for managing project tasks and roadmaps with advanced features like dependency tracking, validation, and comprehensive test coverage.
4
4
 
5
5
  [![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io)
6
6
  [![Version](https://img.shields.io/npm/v/project-roadmap-tracking.svg)](https://npmjs.org/package/project-roadmap-tracking)
7
7
  [![Downloads/week](https://img.shields.io/npm/dw/project-roadmap-tracking.svg)](https://npmjs.org/package/project-roadmap-tracking)
8
8
 
9
+ ## Features
10
+
11
+ - 📝 **Task Management**: Create, update, and track bugs, features, improvements, planning tasks, and research items
12
+ - 🔗 **Dependency Tracking**: Define task dependencies and detect circular dependencies
13
+ - 🎯 **Priority & Status**: Organize tasks by priority (high/medium/low) and status (not-started/in-progress/completed)
14
+ - ✅ **Test Tracking**: Mark tasks as passing tests to maintain quality
15
+ - 🔍 **Powerful Filtering**: Filter and sort tasks by multiple criteria
16
+ - 📊 **Validation**: Comprehensive roadmap validation with detailed error reporting
17
+ - ⚡ **Performance**: LRU caching and file watching for optimal performance
18
+ - 🏗️ **Modern Architecture**: Service layer, repository pattern, and 96.81% test coverage
19
+ - 📦 **Configuration**: Multi-level config inheritance (project → user → global)
20
+ - 🔄 **Backward Compatible**: Legacy mode via `--no-repo` flag
21
+
22
+ ## Quick Start
23
+
24
+ ### Installation
25
+
26
+ ```bash
27
+ npm install -g project-roadmap-tracking
28
+ ```
29
+
30
+ ### Initialize a Project
31
+
32
+ ```bash
33
+ # Initialize with sample tasks
34
+ prt init --name "My Project" --withSampleTasks
35
+
36
+ # Or create an empty roadmap
37
+ prt init --name "My Project"
38
+ ```
39
+
40
+ ### Basic Usage
41
+
42
+ ```bash
43
+ # Add a new feature
44
+ prt add "User authentication" -t feature -d "Implement JWT auth" -p high
45
+
46
+ # List all high-priority tasks
47
+ prt list -p high
48
+
49
+ # Show task details
50
+ prt show F-001
51
+
52
+ # Update task status
53
+ prt update F-001 --status=in-progress
54
+
55
+ # Complete a task
56
+ prt complete F-001 --tests
57
+
58
+ # Validate roadmap integrity
59
+ prt validate
60
+ ```
61
+
62
+ ## Architecture
63
+
64
+ PRT follows a modern layered architecture:
65
+
66
+ - **CLI Layer**: Thin command handlers using oclif
67
+ - **Service Layer**: Business logic (TaskService, RoadmapService, etc.)
68
+ - **Repository Layer**: Data access with caching and file watching
69
+ - **Error Handling**: Custom error hierarchy with error codes
70
+
71
+ For detailed architecture documentation, see [ARCHITECTURE.md](ARCHITECTURE.md).
72
+
73
+ ## Data Format
74
+
75
+ PRT uses two JSON files to manage your project:
76
+
77
+ ### `.prtrc.json` (Configuration)
78
+ Project configuration with optional caching settings:
79
+
80
+ ```json
81
+ {
82
+ "$schema": "https://raw.githubusercontent.com/ZacharyEggert/project-roadmap-tracking/master/schemas/config/v1.1.json",
83
+ "name": "My Project",
84
+ "description": "Project description",
85
+ "path": "./prt.json",
86
+ "cache": {
87
+ "enabled": true,
88
+ "maxSize": 10
89
+ }
90
+ }
91
+ ```
92
+
93
+ ### `prt.json` (Roadmap)
94
+ Your tasks and project data:
95
+
96
+ ```json
97
+ {
98
+ "$schema": "https://raw.githubusercontent.com/ZacharyEggert/project-roadmap-tracking/master/schemas/roadmap/v1.json",
99
+ "metadata": {
100
+ "name": "My Project",
101
+ "createdAt": "2026-01-22T10:00:00.000Z"
102
+ },
103
+ "tasks": [
104
+ {
105
+ "id": "F-001",
106
+ "title": "User authentication",
107
+ "type": "feature",
108
+ "status": "in-progress",
109
+ "priority": "high",
110
+ "details": "Implement JWT authentication",
111
+ "tags": ["auth", "security"],
112
+ "depends-on": [],
113
+ "blocks": [],
114
+ "passes-tests": false,
115
+ "createdAt": "2026-01-22T10:00:00.000Z",
116
+ "updatedAt": "2026-01-22T10:00:00.000Z"
117
+ }
118
+ ]
119
+ }
120
+ ```
121
+
122
+ ### Task ID Format
123
+
124
+ Task IDs follow the pattern `{TYPE}-{NUMBER}`:
125
+ - **B-001**: Bug
126
+ - **F-001**: Feature
127
+ - **I-001**: Improvement
128
+ - **P-001**: Planning
129
+ - **R-001**: Research
130
+
131
+ IDs are auto-generated sequentially per task type.
132
+
9
133
  <!-- toc -->
10
134
  * [project-roadmap-tracking](#project-roadmap-tracking)
135
+ * [Initialize with sample tasks](#initialize-with-sample-tasks)
136
+ * [Or create an empty roadmap](#or-create-an-empty-roadmap)
137
+ * [Add a new feature](#add-a-new-feature)
138
+ * [List all high-priority tasks](#list-all-high-priority-tasks)
139
+ * [Show task details](#show-task-details)
140
+ * [Update task status](#update-task-status)
141
+ * [Complete a task](#complete-a-task)
142
+ * [Validate roadmap integrity](#validate-roadmap-integrity)
11
143
  * [Usage](#usage)
12
144
  * [Commands](#commands)
145
+ * [Clone the repository](#clone-the-repository)
146
+ * [Install dependencies](#install-dependencies)
147
+ * [Build the project](#build-the-project)
148
+ * [Run tests](#run-tests)
149
+ * [Run tests with coverage](#run-tests-with-coverage)
150
+ * [Run linter](#run-linter)
151
+ * [Auto-fix linting issues](#auto-fix-linting-issues)
152
+ * [Format code](#format-code)
153
+ * [Run CLI locally without installing](#run-cli-locally-without-installing)
154
+ * [Link for global development testing](#link-for-global-development-testing)
155
+ * [Run all tests](#run-all-tests)
156
+ * [Run a specific test file](#run-a-specific-test-file)
157
+ * [Generate coverage report](#generate-coverage-report)
158
+ * [View coverage summary](#view-coverage-summary)
13
159
  <!-- tocstop -->
14
160
 
15
161
  # Usage
@@ -20,7 +166,7 @@ $ npm install -g project-roadmap-tracking
20
166
  $ prt COMMAND
21
167
  running command...
22
168
  $ prt (--version)
23
- project-roadmap-tracking/0.1.0 darwin-arm64 node-v25.2.1
169
+ project-roadmap-tracking/0.2.1 darwin-arm64 node-v25.2.1
24
170
  $ prt --help [COMMAND]
25
171
  USAGE
26
172
  $ prt COMMAND
@@ -57,8 +203,8 @@ add a new task to the roadmap
57
203
 
58
204
  ```
59
205
  USAGE
60
- $ prt add TITLE -d <value> -t bug|feature|improvement|planning|research [-p high|medium|low] [-s
61
- not-started|in-progress|completed] [-g <value>]
206
+ $ prt add TITLE -d <value> -t bug|feature|improvement|planning|research [--no-repo] [-p
207
+ high|medium|low] [-s not-started|in-progress|completed] [-g <value>] [-v]
62
208
 
63
209
  ARGUMENTS
64
210
  TITLE title of the task to add
@@ -72,6 +218,8 @@ FLAGS
72
218
  <options: not-started|in-progress|completed>
73
219
  -t, --type=<option> (required) type of the task to add
74
220
  <options: bug|feature|improvement|planning|research>
221
+ -v, --verbose show detailed error information including stack traces
222
+ --no-repo use legacy direct file I/O instead of repository pattern
75
223
 
76
224
  DESCRIPTION
77
225
  add a new task to the roadmap
@@ -80,7 +228,7 @@ EXAMPLES
80
228
  $ prt add
81
229
  ```
82
230
 
83
- _See code: [src/commands/add.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/add.ts)_
231
+ _See code: [src/commands/add.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/add.ts)_
84
232
 
85
233
  ## `prt complete TASKID`
86
234
 
@@ -88,13 +236,15 @@ Mark a task as completed
88
236
 
89
237
  ```
90
238
  USAGE
91
- $ prt complete TASKID [-t]
239
+ $ prt complete TASKID [--no-repo] [-t] [-v]
92
240
 
93
241
  ARGUMENTS
94
242
  TASKID ID of the task to complete
95
243
 
96
244
  FLAGS
97
- -t, --tests mark task as passes-tests
245
+ -t, --tests mark task as passes-tests
246
+ -v, --verbose show detailed error information including stack traces
247
+ --no-repo use legacy direct file I/O instead of repository pattern
98
248
 
99
249
  DESCRIPTION
100
250
  Mark a task as completed
@@ -103,7 +253,7 @@ EXAMPLES
103
253
  $ prt complete F-001 --tests
104
254
  ```
105
255
 
106
- _See code: [src/commands/complete.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/complete.ts)_
256
+ _See code: [src/commands/complete.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/complete.ts)_
107
257
 
108
258
  ## `prt help [COMMAND]`
109
259
 
@@ -131,7 +281,7 @@ initialize a new project roadmap (prt.json and prt.config.json)
131
281
 
132
282
  ```
133
283
  USAGE
134
- $ prt init [FOLDER] [-d <value>] [-f] [-n <value>] [--withSampleTasks]
284
+ $ prt init [FOLDER] [-d <value>] [-f] [-n <value>] [-v] [--withSampleTasks]
135
285
 
136
286
  ARGUMENTS
137
287
  [FOLDER] folder to initialize the project roadmap in
@@ -140,6 +290,7 @@ FLAGS
140
290
  -d, --description=<value> description to print
141
291
  -f, --force force initialization even if files already exist
142
292
  -n, --name=<value> name to print
293
+ -v, --verbose show detailed error information including stack traces
143
294
  --withSampleTasks include sample tasks in the initialized roadmap
144
295
 
145
296
  DESCRIPTION
@@ -149,7 +300,7 @@ EXAMPLES
149
300
  $ prt init [path/to/directory]
150
301
  ```
151
302
 
152
- _See code: [src/commands/init.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/init.ts)_
303
+ _See code: [src/commands/init.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/init.ts)_
153
304
 
154
305
  ## `prt list`
155
306
 
@@ -157,8 +308,8 @@ list tasks in the project roadmap
157
308
 
158
309
  ```
159
310
  USAGE
160
- $ prt list [-i] [-p high|medium|low|h|m|l] [-o dueDate|priority|createdAt] [-s
161
- completed|in-progress|not-started]
311
+ $ prt list [-i] [--no-repo] [-p high|medium|low|h|m|l] [-o dueDate|priority|createdAt] [-s
312
+ completed|in-progress|not-started] [-v]
162
313
 
163
314
  FLAGS
164
315
  -i, --incomplete filter tasks to show in-progress and not-started only
@@ -168,6 +319,8 @@ FLAGS
168
319
  <options: high|medium|low|h|m|l>
169
320
  -s, --status=<option> filter tasks by status (completed, in-progress, not-started)
170
321
  <options: completed|in-progress|not-started>
322
+ -v, --verbose show detailed error information including stack traces
323
+ --no-repo use legacy direct file I/O instead of repository pattern
171
324
 
172
325
  DESCRIPTION
173
326
  list tasks in the project roadmap
@@ -176,7 +329,7 @@ EXAMPLES
176
329
  $ prt list -p=h --incomplete --sort=createdAt
177
330
  ```
178
331
 
179
- _See code: [src/commands/list.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/list.ts)_
332
+ _See code: [src/commands/list.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/list.ts)_
180
333
 
181
334
  ## `prt pass-test TASKID`
182
335
 
@@ -184,11 +337,15 @@ Mark a task as passes-tests
184
337
 
185
338
  ```
186
339
  USAGE
187
- $ prt pass-test TASKID
340
+ $ prt pass-test TASKID [--no-repo] [-v]
188
341
 
189
342
  ARGUMENTS
190
343
  TASKID ID of the task to mark as passing tests
191
344
 
345
+ FLAGS
346
+ -v, --verbose show detailed error information including stack traces
347
+ --no-repo use legacy direct file I/O instead of repository pattern
348
+
192
349
  DESCRIPTION
193
350
  Mark a task as passes-tests
194
351
 
@@ -196,7 +353,7 @@ EXAMPLES
196
353
  $ prt pass-test F-001
197
354
  ```
198
355
 
199
- _See code: [src/commands/pass-test.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/pass-test.ts)_
356
+ _See code: [src/commands/pass-test.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/pass-test.ts)_
200
357
 
201
358
  ## `prt plugins`
202
359
 
@@ -494,11 +651,15 @@ show details of a specific task in the project roadmap
494
651
 
495
652
  ```
496
653
  USAGE
497
- $ prt show TASK
654
+ $ prt show TASK [--no-repo] [-v]
498
655
 
499
656
  ARGUMENTS
500
657
  TASK task ID to show
501
658
 
659
+ FLAGS
660
+ -v, --verbose show detailed error information including stack traces
661
+ --no-repo use legacy direct file I/O instead of repository pattern
662
+
502
663
  DESCRIPTION
503
664
  show details of a specific task in the project roadmap
504
665
 
@@ -506,7 +667,7 @@ EXAMPLES
506
667
  $ prt show F-001
507
668
  ```
508
669
 
509
- _See code: [src/commands/show.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/show.ts)_
670
+ _See code: [src/commands/show.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/show.ts)_
510
671
 
511
672
  ## `prt update TASKID`
512
673
 
@@ -514,8 +675,8 @@ Update a task in place
514
675
 
515
676
  ```
516
677
  USAGE
517
- $ prt update TASKID [--clear-notes] [-d <value>] [-n <value>] [-s completed|in-progress|not-started] [-t
518
- true|false]
678
+ $ prt update TASKID [--clear-notes] [-d <value>] [--no-repo] [-n <value>] [-s
679
+ completed|in-progress|not-started] [-t true|false] [--type bug|feature|improvement|planning|research] [-v]
519
680
 
520
681
  ARGUMENTS
521
682
  TASKID ID of the task to update
@@ -527,7 +688,11 @@ FLAGS
527
688
  <options: completed|in-progress|not-started>
528
689
  -t, --tested=<option> update whether the task passes tests
529
690
  <options: true|false>
691
+ -v, --verbose show detailed error information including stack traces
530
692
  --clear-notes clear all notes from the task
693
+ --no-repo use legacy direct file I/O instead of repository pattern
694
+ --type=<option> update the task type (reassigns task ID and cascades to all references)
695
+ <options: bug|feature|improvement|planning|research>
531
696
 
532
697
  DESCRIPTION
533
698
  Update a task in place
@@ -538,22 +703,126 @@ EXAMPLES
538
703
  $ prt update F-002 --deps="F-001" --clear-notes
539
704
  ```
540
705
 
541
- _See code: [src/commands/update.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/update.ts)_
706
+ _See code: [src/commands/update.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/update.ts)_
542
707
 
543
708
  ## `prt validate`
544
709
 
545
- describe the command here
710
+ Validate roadmap structure, task data, and check for circular dependencies
546
711
 
547
712
  ```
548
713
  USAGE
549
- $ prt validate
714
+ $ prt validate [--no-repo] [-v]
715
+
716
+ FLAGS
717
+ -v, --verbose show detailed error information including stack traces
718
+ --no-repo use legacy direct file I/O instead of repository pattern
550
719
 
551
720
  DESCRIPTION
552
- describe the command here
721
+ Validate roadmap structure, task data, and check for circular dependencies
553
722
 
554
723
  EXAMPLES
555
724
  $ prt validate
556
725
  ```
557
726
 
558
- _See code: [src/commands/validate.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.1.0/src/commands/validate.ts)_
727
+ _See code: [src/commands/validate.ts](https://github.com/ZacharyEggert/project-roadmap-tracking/blob/v0.2.1/src/commands/validate.ts)_
559
728
  <!-- commandsstop -->
729
+
730
+ ## Development
731
+
732
+ ### Setup
733
+
734
+ ```bash
735
+ # Clone the repository
736
+ git clone https://github.com/ZacharyEggert/project-roadmap-tracking.git
737
+ cd project-roadmap-tracking
738
+
739
+ # Install dependencies
740
+ yarn install
741
+
742
+ # Build the project
743
+ yarn build
744
+ ```
745
+
746
+ ### Development Commands
747
+
748
+ ```bash
749
+ # Run tests
750
+ yarn test
751
+
752
+ # Run tests with coverage
753
+ yarn test:coverage:summary
754
+
755
+ # Run linter
756
+ yarn lint
757
+
758
+ # Auto-fix linting issues
759
+ yarn lint:fix
760
+
761
+ # Format code
762
+ yarn format
763
+
764
+ # Run CLI locally without installing
765
+ ./bin/dev.js COMMAND
766
+
767
+ # Link for global development testing
768
+ yarn link
769
+ prt COMMAND
770
+ ```
771
+
772
+ ### Testing
773
+
774
+ PRT has comprehensive test coverage (96.81%):
775
+
776
+ - **Unit tests**: Services, repositories, utilities, errors
777
+ - **Command tests**: All CLI commands
778
+ - **Test runner**: Mocha + Chai
779
+ - **Coverage**: c8
780
+
781
+ ```bash
782
+ # Run all tests
783
+ yarn test
784
+
785
+ # Run a specific test file
786
+ yarn mocha --loader=tsx/esm "test/path/to/file.test.ts"
787
+
788
+ # Generate coverage report
789
+ yarn test:coverage
790
+
791
+ # View coverage summary
792
+ yarn test:coverage:summary
793
+ ```
794
+
795
+ ### Architecture
796
+
797
+ For detailed architecture documentation, including design patterns, service layer architecture, repository pattern, and migration path, see [ARCHITECTURE.md](ARCHITECTURE.md).
798
+
799
+ Key architectural features:
800
+ - ✓ Service layer for business logic (97.43% coverage)
801
+ - ✓ Repository pattern with caching and file watching (94.7% coverage)
802
+ - ✓ Custom error hierarchy with error codes (100% coverage)
803
+ - ✓ Comprehensive test suite (96.81% overall coverage)
804
+ - ✓ Backward compatible legacy mode
805
+
806
+ ### Contributing
807
+
808
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.
809
+
810
+ ### Release Process
811
+
812
+ 1. Update version in `package.json`
813
+ 2. Run `yarn prepack` (generates manifest and updates README)
814
+ 3. Commit changes
815
+ 4. Run `yarn pack` to create tarball
816
+ 5. Run `npm publish` to publish to npm registry
817
+
818
+ ## License
819
+
820
+ MIT
821
+
822
+ ## Links
823
+
824
+ - [GitHub Repository](https://github.com/ZacharyEggert/project-roadmap-tracking)
825
+ - [npm Package](https://www.npmjs.com/package/project-roadmap-tracking)
826
+ - [Issues](https://github.com/ZacharyEggert/project-roadmap-tracking/issues)
827
+ - [Architecture Documentation](ARCHITECTURE.md)
828
+ - [Contributing Guidelines](CONTRIBUTING.md)
@@ -7,10 +7,12 @@ export default class Add extends Command {
7
7
  static examples: string[];
8
8
  static flags: {
9
9
  details: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ 'no-repo': import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
11
  priority: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
12
  status: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
13
  tags: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  type: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
16
  };
15
17
  run(): Promise<void>;
16
18
  }
@@ -1,7 +1,11 @@
1
1
  import { Args, Command, Flags } from '@oclif/core';
2
+ import { getDefaultConfigRepository } from '../repositories/config.repository.js';
3
+ import { RoadmapRepository } from '../repositories/roadmap.repository.js';
4
+ import errorHandlerService from '../services/error-handler.service.js';
5
+ import taskService from '../services/task.service.js';
2
6
  import { readConfigFile } from '../util/read-config.js';
3
7
  import { readRoadmapFile } from '../util/read-roadmap.js';
4
- import { PRIORITY, STATUS, TASK_TYPE, TASK_TYPE_MAP } from '../util/types.js';
8
+ import { PRIORITY, STATUS, TASK_TYPE } from '../util/types.js';
5
9
  import { writeRoadmapFile } from '../util/write-roadmap.js';
6
10
  export default class Add extends Command {
7
11
  static args = {
@@ -13,6 +17,10 @@ export default class Add extends Command {
13
17
  // force: Flags.boolean({char: 'f'}),
14
18
  // name: Flags.string({char: 'n', description: 'name to print'}),
15
19
  details: Flags.string({ char: 'd', description: 'description of the task to add', required: true }),
20
+ 'no-repo': Flags.boolean({
21
+ default: false,
22
+ description: 'use legacy direct file I/O instead of repository pattern',
23
+ }),
16
24
  priority: Flags.string({
17
25
  char: 'p',
18
26
  default: PRIORITY.Medium,
@@ -38,39 +46,39 @@ export default class Add extends Command {
38
46
  options: [TASK_TYPE.Bug, TASK_TYPE.Feature, TASK_TYPE.Improvement, TASK_TYPE.Planning, TASK_TYPE.Research],
39
47
  required: true,
40
48
  }),
49
+ verbose: Flags.boolean({
50
+ char: 'v',
51
+ default: false,
52
+ description: 'show detailed error information including stack traces',
53
+ }),
41
54
  };
42
55
  async run() {
43
56
  const { args, flags } = await this.parse(Add);
44
- const config = await readConfigFile();
45
- const roadmapFile = await readRoadmapFile(config.path);
46
- const taskType = flags.type;
47
- const existingTaskIDs = new Set(roadmapFile.tasks.filter((task) => task.type === taskType).map((task) => task.id));
48
- let newIDNumber = 1;
49
- let newTaskID;
50
- while (true) {
51
- const potentialID = `${TASK_TYPE_MAP.get(taskType)}-${String(newIDNumber).padStart(3, '0')}`;
52
- if (!existingTaskIDs.has(potentialID)) {
53
- newTaskID = potentialID;
54
- break;
55
- }
56
- newIDNumber++;
57
+ try {
58
+ // Use repository pattern by default, unless --no-repo flag is set
59
+ const config = flags['no-repo'] ? await readConfigFile() : await getDefaultConfigRepository().load();
60
+ const roadmap = flags['no-repo']
61
+ ? await readRoadmapFile(config.path)
62
+ : await RoadmapRepository.fromConfig(config).load(config.path);
63
+ const taskType = flags.type;
64
+ const newTaskID = taskService.generateNextId(roadmap, taskType);
65
+ const newTask = taskService.createTask({
66
+ details: flags.details,
67
+ id: newTaskID,
68
+ priority: flags.priority,
69
+ status: flags.status,
70
+ tags: flags.tags ? flags.tags.split(',').map((tag) => tag.trim()) : [],
71
+ title: args.title,
72
+ type: taskType,
73
+ });
74
+ const updatedRoadmap = taskService.addTask(roadmap, newTask);
75
+ await (flags['no-repo']
76
+ ? writeRoadmapFile(config.path, updatedRoadmap)
77
+ : RoadmapRepository.fromConfig(config).save(config.path, updatedRoadmap));
78
+ }
79
+ catch (error) {
80
+ const exitCode = errorHandlerService.handleError(error);
81
+ this.error(errorHandlerService.formatErrorMessage(error, flags.verbose), { exit: exitCode });
57
82
  }
58
- const newTask = {
59
- blocks: [],
60
- createdAt: new Date().toISOString(),
61
- 'depends-on': [],
62
- details: flags.details,
63
- id: newTaskID,
64
- notes: '',
65
- 'passes-tests': false,
66
- priority: flags.priority,
67
- status: flags.status,
68
- tags: flags.tags ? flags.tags.split(',').map((tag) => tag.trim()) : [],
69
- title: args.title,
70
- type: taskType,
71
- updatedAt: new Date().toISOString(),
72
- };
73
- roadmapFile.tasks.push(newTask);
74
- await writeRoadmapFile(config.path, roadmapFile);
75
83
  }
76
84
  }
@@ -6,7 +6,9 @@ export default class Complete extends Command {
6
6
  static description: string;
7
7
  static examples: string[];
8
8
  static flags: {
9
+ 'no-repo': import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
10
  tests: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
12
  };
11
13
  run(): Promise<void>;
12
14
  }
@@ -1,4 +1,7 @@
1
1
  import { Args, Command, Flags } from '@oclif/core';
2
+ import { getDefaultConfigRepository } from '../repositories/config.repository.js';
3
+ import { RoadmapRepository } from '../repositories/roadmap.repository.js';
4
+ import errorHandlerService from '../services/error-handler.service.js';
2
5
  import { readConfigFile } from '../util/read-config.js';
3
6
  import { readRoadmapFile } from '../util/read-roadmap.js';
4
7
  import { STATUS } from '../util/types.js';
@@ -11,25 +14,45 @@ export default class Complete extends Command {
11
14
  static description = 'Mark a task as completed';
12
15
  static examples = ['<%= config.bin %> <%= command.id %> F-001 --tests'];
13
16
  static flags = {
17
+ 'no-repo': Flags.boolean({
18
+ default: false,
19
+ description: 'use legacy direct file I/O instead of repository pattern',
20
+ }),
14
21
  // flag with no value (-f, --force)
15
22
  // force: Flags.boolean({char: 'f'}),
16
23
  // flag with a value (-n, --name=VALUE)
17
24
  // name: Flags.string({char: 'n', description: 'name to print'}),
18
25
  tests: Flags.boolean({ char: 't', description: 'mark task as passes-tests' }),
26
+ verbose: Flags.boolean({
27
+ char: 'v',
28
+ default: false,
29
+ description: 'show detailed error information including stack traces',
30
+ }),
19
31
  };
20
32
  async run() {
21
33
  const { args, flags } = await this.parse(Complete);
22
- const config = await readConfigFile();
23
- const roadmap = await readRoadmapFile(config.path);
24
- const updatedRoadmap = await updateTaskInRoadmap(roadmap, args.taskID, flags.tests
25
- ? {
26
- 'passes-tests': true,
27
- status: STATUS.Completed,
28
- }
29
- : {
30
- status: STATUS.Completed,
31
- });
32
- await writeRoadmapFile(config.path, updatedRoadmap);
33
- this.log(`Task ${args.taskID} marked as completed.`);
34
+ try {
35
+ // Use repository pattern by default, unless --no-repo flag is set
36
+ const config = flags['no-repo'] ? await readConfigFile() : await getDefaultConfigRepository().load();
37
+ const roadmap = flags['no-repo']
38
+ ? await readRoadmapFile(config.path)
39
+ : await RoadmapRepository.fromConfig(config).load(config.path);
40
+ const updatedRoadmap = await updateTaskInRoadmap(roadmap, args.taskID, flags.tests
41
+ ? {
42
+ 'passes-tests': true,
43
+ status: STATUS.Completed,
44
+ }
45
+ : {
46
+ status: STATUS.Completed,
47
+ });
48
+ await (flags['no-repo']
49
+ ? writeRoadmapFile(config.path, updatedRoadmap)
50
+ : RoadmapRepository.fromConfig(config).save(config.path, updatedRoadmap));
51
+ this.log(`Task ${args.taskID} marked as completed.`);
52
+ }
53
+ catch (error) {
54
+ const exitCode = errorHandlerService.handleError(error);
55
+ this.error(errorHandlerService.formatErrorMessage(error, flags.verbose), { exit: exitCode });
56
+ }
34
57
  }
35
58
  }
@@ -10,6 +10,7 @@ export default class Init extends Command {
10
10
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
11
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
12
  name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
14
  withSampleTasks: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
15
  };
15
16
  buildBlankRoadmap({ description, name, withSampleTasks, }: {