@entelligentsia/forgecli 0.8.4 → 0.9.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 (169) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/bin/argv.d.ts +2 -2
  3. package/dist/bin/argv.js +17 -0
  4. package/dist/bin/argv.js.map +1 -1
  5. package/dist/bin/config.d.ts +69 -0
  6. package/dist/bin/config.js +315 -0
  7. package/dist/bin/config.js.map +1 -0
  8. package/dist/bin/doctor.d.ts +1 -0
  9. package/dist/bin/doctor.js +12 -0
  10. package/dist/bin/doctor.js.map +1 -1
  11. package/dist/bin/forge.js +7 -0
  12. package/dist/bin/forge.js.map +1 -1
  13. package/dist/extensions/forgecli/config-command.d.ts +8 -0
  14. package/dist/extensions/forgecli/config-command.js +66 -0
  15. package/dist/extensions/forgecli/config-command.js.map +1 -0
  16. package/dist/extensions/forgecli/config-layer.d.ts +38 -0
  17. package/dist/extensions/forgecli/config-layer.js +68 -0
  18. package/dist/extensions/forgecli/config-layer.js.map +1 -0
  19. package/dist/extensions/forgecli/config-tui/component.d.ts +35 -0
  20. package/dist/extensions/forgecli/config-tui/component.js +236 -0
  21. package/dist/extensions/forgecli/config-tui/component.js.map +1 -0
  22. package/dist/extensions/forgecli/config-tui/handler.d.ts +40 -0
  23. package/dist/extensions/forgecli/config-tui/handler.js +240 -0
  24. package/dist/extensions/forgecli/config-tui/handler.js.map +1 -0
  25. package/dist/extensions/forgecli/config-tui/index.d.ts +5 -0
  26. package/dist/extensions/forgecli/config-tui/index.js +5 -0
  27. package/dist/extensions/forgecli/config-tui/index.js.map +1 -0
  28. package/dist/extensions/forgecli/config-tui/keys.d.ts +26 -0
  29. package/dist/extensions/forgecli/config-tui/keys.js +33 -0
  30. package/dist/extensions/forgecli/config-tui/keys.js.map +1 -0
  31. package/dist/extensions/forgecli/config-tui/plugin-config-reader.d.ts +23 -0
  32. package/dist/extensions/forgecli/config-tui/plugin-config-reader.js +58 -0
  33. package/dist/extensions/forgecli/config-tui/plugin-config-reader.js.map +1 -0
  34. package/dist/extensions/forgecli/config-tui/screens/advanced-menu.d.ts +7 -0
  35. package/dist/extensions/forgecli/config-tui/screens/advanced-menu.js +83 -0
  36. package/dist/extensions/forgecli/config-tui/screens/advanced-menu.js.map +1 -0
  37. package/dist/extensions/forgecli/config-tui/screens/confirm-quit.d.ts +11 -0
  38. package/dist/extensions/forgecli/config-tui/screens/confirm-quit.js +54 -0
  39. package/dist/extensions/forgecli/config-tui/screens/confirm-quit.js.map +1 -0
  40. package/dist/extensions/forgecli/config-tui/screens/override-editor.d.ts +11 -0
  41. package/dist/extensions/forgecli/config-tui/screens/override-editor.js +233 -0
  42. package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -0
  43. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.d.ts +7 -0
  44. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +91 -0
  45. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -0
  46. package/dist/extensions/forgecli/config-tui/screens/overrides-list.d.ts +7 -0
  47. package/dist/extensions/forgecli/config-tui/screens/overrides-list.js +71 -0
  48. package/dist/extensions/forgecli/config-tui/screens/overrides-list.js.map +1 -0
  49. package/dist/extensions/forgecli/config-tui/screens/persona-editor.d.ts +10 -0
  50. package/dist/extensions/forgecli/config-tui/screens/persona-editor.js +182 -0
  51. package/dist/extensions/forgecli/config-tui/screens/persona-editor.js.map +1 -0
  52. package/dist/extensions/forgecli/config-tui/screens/persona-picker.d.ts +7 -0
  53. package/dist/extensions/forgecli/config-tui/screens/persona-picker.js +76 -0
  54. package/dist/extensions/forgecli/config-tui/screens/persona-picker.js.map +1 -0
  55. package/dist/extensions/forgecli/config-tui/screens/personas-list.d.ts +7 -0
  56. package/dist/extensions/forgecli/config-tui/screens/personas-list.js +98 -0
  57. package/dist/extensions/forgecli/config-tui/screens/personas-list.js.map +1 -0
  58. package/dist/extensions/forgecli/config-tui/screens/shared.d.ts +29 -0
  59. package/dist/extensions/forgecli/config-tui/screens/shared.js +100 -0
  60. package/dist/extensions/forgecli/config-tui/screens/shared.js.map +1 -0
  61. package/dist/extensions/forgecli/config-tui/screens/show-resolved.d.ts +23 -0
  62. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +128 -0
  63. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -0
  64. package/dist/extensions/forgecli/config-tui/screens/tier-menu.d.ts +7 -0
  65. package/dist/extensions/forgecli/config-tui/screens/tier-menu.js +135 -0
  66. package/dist/extensions/forgecli/config-tui/screens/tier-menu.js.map +1 -0
  67. package/dist/extensions/forgecli/config-tui/screens/tier-picker.d.ts +9 -0
  68. package/dist/extensions/forgecli/config-tui/screens/tier-picker.js +122 -0
  69. package/dist/extensions/forgecli/config-tui/screens/tier-picker.js.map +1 -0
  70. package/dist/extensions/forgecli/config-tui/screens/types.d.ts +24 -0
  71. package/dist/extensions/forgecli/config-tui/screens/types.js +5 -0
  72. package/dist/extensions/forgecli/config-tui/screens/types.js.map +1 -0
  73. package/dist/extensions/forgecli/config-tui/screens.d.ts +24 -0
  74. package/dist/extensions/forgecli/config-tui/screens.js +78 -0
  75. package/dist/extensions/forgecli/config-tui/screens.js.map +1 -0
  76. package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +11 -0
  77. package/dist/extensions/forgecli/config-tui/state/buffer.js +91 -0
  78. package/dist/extensions/forgecli/config-tui/state/buffer.js.map +1 -0
  79. package/dist/extensions/forgecli/config-tui/state/constants.d.ts +4 -0
  80. package/dist/extensions/forgecli/config-tui/state/constants.js +14 -0
  81. package/dist/extensions/forgecli/config-tui/state/constants.js.map +1 -0
  82. package/dist/extensions/forgecli/config-tui/state/index.d.ts +6 -0
  83. package/dist/extensions/forgecli/config-tui/state/index.js +9 -0
  84. package/dist/extensions/forgecli/config-tui/state/index.js.map +1 -0
  85. package/dist/extensions/forgecli/config-tui/state/init.d.ts +2 -0
  86. package/dist/extensions/forgecli/config-tui/state/init.js +30 -0
  87. package/dist/extensions/forgecli/config-tui/state/init.js.map +1 -0
  88. package/dist/extensions/forgecli/config-tui/state/model.d.ts +192 -0
  89. package/dist/extensions/forgecli/config-tui/state/model.js +4 -0
  90. package/dist/extensions/forgecli/config-tui/state/model.js.map +1 -0
  91. package/dist/extensions/forgecli/config-tui/state/reducer.d.ts +2 -0
  92. package/dist/extensions/forgecli/config-tui/state/reducer.js +212 -0
  93. package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -0
  94. package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +91 -0
  95. package/dist/extensions/forgecli/config-tui/state/selectors.js +231 -0
  96. package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -0
  97. package/dist/extensions/forgecli/config-tui/state.d.ts +6 -0
  98. package/dist/extensions/forgecli/config-tui/state.js +11 -0
  99. package/dist/extensions/forgecli/config-tui/state.js.map +1 -0
  100. package/dist/extensions/forgecli/config-tui/theme.d.ts +37 -0
  101. package/dist/extensions/forgecli/config-tui/theme.js +88 -0
  102. package/dist/extensions/forgecli/config-tui/theme.js.map +1 -0
  103. package/dist/extensions/forgecli/config-tui/tier-meta.d.ts +28 -0
  104. package/dist/extensions/forgecli/config-tui/tier-meta.js +69 -0
  105. package/dist/extensions/forgecli/config-tui/tier-meta.js.map +1 -0
  106. package/dist/extensions/forgecli/config-writer.d.ts +16 -0
  107. package/dist/extensions/forgecli/config-writer.js +63 -0
  108. package/dist/extensions/forgecli/config-writer.js.map +1 -0
  109. package/dist/extensions/forgecli/fix-bug.js +85 -1
  110. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  111. package/dist/extensions/forgecli/forge-cli-schema.json +54 -0
  112. package/dist/extensions/forgecli/forge-commands.js +3 -8
  113. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  114. package/dist/extensions/forgecli/forge-subagent.d.ts +13 -0
  115. package/dist/extensions/forgecli/forge-subagent.js +19 -0
  116. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  117. package/dist/extensions/forgecli/index.js +16 -0
  118. package/dist/extensions/forgecli/index.js.map +1 -1
  119. package/dist/extensions/forgecli/input-router.d.ts +33 -0
  120. package/dist/extensions/forgecli/input-router.js +133 -0
  121. package/dist/extensions/forgecli/input-router.js.map +1 -0
  122. package/dist/extensions/forgecli/model-resolver.d.ts +32 -0
  123. package/dist/extensions/forgecli/model-resolver.js +65 -0
  124. package/dist/extensions/forgecli/model-resolver.js.map +1 -0
  125. package/dist/extensions/forgecli/model-validator.d.ts +29 -0
  126. package/dist/extensions/forgecli/model-validator.js +107 -0
  127. package/dist/extensions/forgecli/model-validator.js.map +1 -0
  128. package/dist/extensions/forgecli/run-sprint.js +59 -0
  129. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  130. package/dist/extensions/forgecli/run-task.js +93 -1
  131. package/dist/extensions/forgecli/run-task.js.map +1 -1
  132. package/dist/extensions/forgecli/thread-switcher.js +5 -2
  133. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  134. package/dist/extensions/forgecli/whats-new-widget.js +5 -2
  135. package/dist/extensions/forgecli/whats-new-widget.js.map +1 -1
  136. package/package.json +11 -3
  137. package/dist/extensions/forgecli/review-command.d.ts +0 -2
  138. package/dist/extensions/forgecli/review-command.js +0 -184
  139. package/dist/extensions/forgecli/review-command.js.map +0 -1
  140. package/dist/forge-payload/.tools/banners.cjs +0 -435
  141. package/dist/forge-payload/.tools/build-context-pack.cjs +0 -290
  142. package/dist/forge-payload/.tools/build-init-context.cjs +0 -322
  143. package/dist/forge-payload/.tools/build-overlay.cjs +0 -326
  144. package/dist/forge-payload/.tools/build-persona-pack.cjs +0 -226
  145. package/dist/forge-payload/.tools/collate.cjs +0 -1041
  146. package/dist/forge-payload/.tools/generation-manifest.cjs +0 -311
  147. package/dist/forge-payload/.tools/lib/forge-root.cjs +0 -59
  148. package/dist/forge-payload/.tools/lib/paths.cjs +0 -29
  149. package/dist/forge-payload/.tools/lib/pricing.cjs +0 -165
  150. package/dist/forge-payload/.tools/lib/project-root.cjs +0 -32
  151. package/dist/forge-payload/.tools/lib/result.js +0 -40
  152. package/dist/forge-payload/.tools/lib/store-facade.cjs +0 -162
  153. package/dist/forge-payload/.tools/lib/store-nlp.cjs +0 -250
  154. package/dist/forge-payload/.tools/lib/store-query-exec.cjs +0 -272
  155. package/dist/forge-payload/.tools/lib/validate.js +0 -141
  156. package/dist/forge-payload/.tools/manage-config.cjs +0 -340
  157. package/dist/forge-payload/.tools/manage-versions.cjs +0 -365
  158. package/dist/forge-payload/.tools/package.json +0 -3
  159. package/dist/forge-payload/.tools/parse-gates.cjs +0 -151
  160. package/dist/forge-payload/.tools/parse-verdict.cjs +0 -67
  161. package/dist/forge-payload/.tools/preflight-gate.cjs +0 -350
  162. package/dist/forge-payload/.tools/prompts/sprint-plan-prompt.md +0 -70
  163. package/dist/forge-payload/.tools/schemas/task-list.schema.json +0 -53
  164. package/dist/forge-payload/.tools/seed-store.cjs +0 -237
  165. package/dist/forge-payload/.tools/store-cli.cjs +0 -1226
  166. package/dist/forge-payload/.tools/store-query.cjs +0 -319
  167. package/dist/forge-payload/.tools/store.cjs +0 -315
  168. package/dist/forge-payload/.tools/substitute-placeholders.cjs +0 -625
  169. package/dist/forge-payload/.tools/validate-store.cjs +0 -593
@@ -1,237 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- // Forge tool: seed-store
5
- // Bootstrap the JSON store from an existing engineering/ directory structure.
6
- // Supports slug-named directories (e.g., FORGE-S06-T07-slug-aware-seed-store/)
7
- // as well as legacy bare-ID directories (e.g., S01/, T01/, B01/).
8
- // Usage: seed-store [--dry-run]
9
-
10
- const fs = require('fs');
11
- const path = require('path');
12
- const Store = require('./store.cjs');
13
-
14
- const DRY_RUN = process.argv.includes('--dry-run');
15
-
16
- /**
17
- * Convert a title string to a lower-kebab-case slug, truncated to 30 chars.
18
- * Non-alphanumeric characters are collapsed to a single hyphen.
19
- */
20
- function deriveSlug(title) {
21
- return title
22
- .toLowerCase()
23
- .replace(/[^a-z0-9]+/g, '-')
24
- .replace(/^-+|-+$/g, '')
25
- .slice(0, 30)
26
- .replace(/-+$/g, ''); // trim trailing hyphens after truncation
27
- }
28
-
29
- // ── Exports for testing ────────────────────────────────────────────────────────
30
-
31
- module.exports = { deriveSlug };
32
-
33
- // ── CLI (only when run directly) ──────────────────────────────────────────────
34
-
35
- if (require.main === module) {
36
- const cwd = process.cwd();
37
-
38
- function extractTitle(dir, fallback) {
39
- for (const file of ['PLAN.md', 'PROGRESS.md', 'INDEX.md', 'README.md']) {
40
- const p = path.join(dir, file);
41
- if (!fs.existsSync(p)) continue;
42
- const m = fs.readFileSync(p, 'utf8').match(/^#\s+(.+)/m);
43
- if (m) return m[1].trim();
44
- }
45
- return fallback;
46
- }
47
-
48
- function inferTaskStatus(taskDir) {
49
- const p = path.join(taskDir, 'PROGRESS.md');
50
- if (!fs.existsSync(p)) return 'planned';
51
- const content = fs.readFileSync(p, 'utf8').toLowerCase();
52
- if (content.includes('committed')) return 'committed';
53
- if (content.includes('approved')) return 'approved';
54
- if (content.includes('implemented')) return 'implemented';
55
- if (content.includes('implementing')) return 'implementing';
56
- return 'planned';
57
- }
58
-
59
- function inferSprintStatus(sprintPath, taskDirs) {
60
- if (taskDirs.length === 0) return 'planning';
61
- const allCommitted = taskDirs.every(t => inferTaskStatus(path.join(sprintPath, t)) === 'committed');
62
- return allCommitted ? 'completed' : 'active';
63
- }
64
-
65
- try {
66
- const config = JSON.parse(fs.readFileSync(path.join(cwd, '.forge', 'config.json'), 'utf8'));
67
- const prefix = config.project?.prefix || 'PROJ';
68
- const engPath = config.paths?.engineering || 'engineering';
69
-
70
- const sprintsDir = path.join(cwd, engPath, 'sprints');
71
- const bugsDir = path.join(cwd, engPath, 'bugs');
72
- const featuresDir = path.join(cwd, engPath, 'features');
73
-
74
- let sprintCount = 0, taskCount = 0, bugCount = 0;
75
-
76
- // --- Scaffold features/ ---
77
- if (!DRY_RUN) {
78
- if (!fs.existsSync(featuresDir)) {
79
- fs.mkdirSync(featuresDir, { recursive: true });
80
- }
81
- } else {
82
- if (!fs.existsSync(featuresDir)) {
83
- console.log(`[dry-run] would scaffold directory: ${path.relative(cwd, featuresDir)}/`);
84
- }
85
- }
86
-
87
- // --- Sprints and Tasks ---
88
- if (fs.existsSync(sprintsDir)) {
89
- // Three-tier sprint discovery:
90
- // 1. {PREFIX}-S{NN}-* (slug-named, e.g. FORGE-S06-post-07-feedback)
91
- // 2. {PREFIX}-S{NN} (full ID, no slug, e.g. FORGE-S06)
92
- // 3. S{NN} (bare legacy, e.g. S01)
93
- const prefixEscaped = prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
94
- const slugSprintRe = new RegExp(`^${prefixEscaped}-(S\\d+)-.+$`, 'i');
95
- const fullSprintRe = new RegExp(`^${prefixEscaped}-(S\\d+)$`, 'i');
96
- const bareSprintRe = /^S\d+$/i;
97
-
98
- const sprintDirs = fs.readdirSync(sprintsDir)
99
- .filter(e => fs.statSync(path.join(sprintsDir, e)).isDirectory())
100
- .map(e => {
101
- let match;
102
- if ((match = e.match(slugSprintRe))) {
103
- return { dirName: e, sprintNum: match[1], sortKey: parseInt(match[1].slice(1), 10) };
104
- }
105
- if ((match = e.match(fullSprintRe))) {
106
- return { dirName: e, sprintNum: match[1], sortKey: parseInt(match[1].slice(1), 10) };
107
- }
108
- if ((match = e.match(bareSprintRe))) {
109
- return { dirName: e, sprintNum: match[0].toUpperCase(), sortKey: parseInt(match[0].slice(1), 10) };
110
- }
111
- return null;
112
- })
113
- .filter(Boolean)
114
- .sort((a, b) => a.sortKey - b.sortKey);
115
-
116
- for (const { dirName: sprintDir, sprintNum } of sprintDirs) {
117
- const sprintFullPath = path.join(sprintsDir, sprintDir);
118
- const sprintId = `${prefix}-${sprintNum.toUpperCase()}`;
119
-
120
- // Three-tier task discovery:
121
- // 1. T{NN}-* (bare task ID with slug, e.g. T01-fix-persona-lookup)
122
- // 2. {PREFIX}-S{NN}-T{NN}-* (full task ID with slug, e.g. FORGE-S06-T01-fix-persona)
123
- // 3. T{NN} (bare legacy, e.g. T01)
124
- const bareTaskSlugRe = new RegExp(`^T(\\d+)-.+$`, 'i');
125
- const fullTaskSlugRe = new RegExp(`^${prefixEscaped}-${sprintNum.toUpperCase()}-T(\\d+)-.+$`, 'i');
126
- const bareTaskRe = /^T(\d+)$/i;
127
-
128
- const taskDirs = fs.readdirSync(sprintFullPath)
129
- .filter(e => fs.statSync(path.join(sprintFullPath, e)).isDirectory())
130
- .map(e => {
131
- let match;
132
- if ((match = e.match(fullTaskSlugRe))) {
133
- return { dirName: e, taskNum: match[1], sortKey: parseInt(match[1], 10) };
134
- }
135
- if ((match = e.match(bareTaskSlugRe))) {
136
- return { dirName: e, taskNum: match[1], sortKey: parseInt(match[1], 10) };
137
- }
138
- if ((match = e.match(bareTaskRe))) {
139
- return { dirName: e, taskNum: String(parseInt(match[1], 10)), sortKey: parseInt(match[1], 10) };
140
- }
141
- return null;
142
- })
143
- .filter(Boolean)
144
- .sort((a, b) => a.sortKey - b.sortKey);
145
-
146
- if (process.env.DEBUG_SEED) console.log(`DEBUG ${sprintId} taskDirs:`, JSON.stringify(taskDirs));
147
- const taskIds = taskDirs.map(t => `${prefix}-${sprintNum.toUpperCase()}-T${t.taskNum.padStart(2, '0')}`);
148
-
149
- if (DRY_RUN) {
150
- console.log(`[dry-run] would write sprint: ${sprintId}`);
151
- } else {
152
- Store.writeSprint({
153
- sprintId,
154
- title: extractTitle(sprintFullPath, `Sprint ${sprintNum}`),
155
- status: inferSprintStatus(sprintFullPath, taskDirs.map(t => t.dirName)),
156
- taskIds,
157
- createdAt: new Date().toISOString(),
158
- path: path.join(engPath, 'sprints', sprintDir),
159
- });
160
- }
161
- sprintCount++;
162
-
163
- for (const { dirName: taskDir, taskNum } of taskDirs) {
164
- const taskFullPath = path.join(sprintFullPath, taskDir);
165
- const taskId = `${prefix}-${sprintNum.toUpperCase()}-T${taskNum.padStart(2, '0')}`;
166
- if (DRY_RUN) {
167
- console.log(`[dry-run] would write task: ${taskId}`);
168
- } else {
169
- Store.writeTask({
170
- taskId,
171
- sprintId,
172
- title: extractTitle(taskFullPath, `Task T${taskNum}`),
173
- status: inferTaskStatus(taskFullPath),
174
- path: path.join(engPath, 'sprints', sprintDir, taskDir),
175
- });
176
- }
177
- taskCount++;
178
- }
179
- }
180
- }
181
-
182
- // --- Bugs ---
183
- if (fs.existsSync(bugsDir)) {
184
- // Three-tier bug discovery:
185
- // 1. {PREFIX}-BUG-{NNN}-* (full slug, e.g. FORGE-BUG-001-sprint-runner-context)
186
- // 2. BUG-{NNN}-* (partial slug, e.g. BUG-001-sprint-runner-context)
187
- // 3. B{NN} (bare legacy, e.g. B01)
188
- const prefixEscaped = prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
189
- const fullSlugBugRe = new RegExp(`^${prefixEscaped}-BUG-(\\d+)-.+$`, 'i');
190
- const partialSlugBugRe = /^BUG-(\d+)-.+$/i;
191
- const bareBugRe = /^B(\d+)$/i;
192
-
193
- const bugDirs = fs.readdirSync(bugsDir)
194
- .filter(e => fs.statSync(path.join(bugsDir, e)).isDirectory())
195
- .map(e => {
196
- let match;
197
- if ((match = e.match(fullSlugBugRe))) {
198
- return { dirName: e, bugNum: match[1], sortKey: parseInt(match[1], 10) };
199
- }
200
- if ((match = e.match(partialSlugBugRe))) {
201
- return { dirName: e, bugNum: match[1], sortKey: parseInt(match[1], 10) };
202
- }
203
- if ((match = e.match(bareBugRe))) {
204
- return { dirName: e, bugNum: match[1], sortKey: parseInt(match[1], 10) };
205
- }
206
- return null;
207
- })
208
- .filter(Boolean)
209
- .sort((a, b) => a.sortKey - b.sortKey);
210
-
211
- for (const { dirName: bugDir, bugNum } of bugDirs) {
212
- const bugFullPath = path.join(bugsDir, bugDir);
213
- const bugId = `${prefix}-BUG-${bugNum.padStart(2, '0')}`;
214
- if (DRY_RUN) {
215
- console.log(`[dry-run] would write bug: ${bugId}`);
216
- } else {
217
- Store.writeBug({
218
- bugId,
219
- title: extractTitle(bugFullPath, `Bug ${bugNum}`),
220
- severity: 'minor',
221
- status: 'reported',
222
- path: path.join(engPath, 'bugs', bugDir),
223
- reportedAt: new Date().toISOString(),
224
- });
225
- }
226
- bugCount++;
227
- }
228
- }
229
-
230
- const prefix_ = DRY_RUN ? '[dry-run] ' : '';
231
- console.log(`${prefix_}Seeded: ${sprintCount} sprint(s), ${taskCount} task(s), ${bugCount} bug(s)`);
232
- } catch (e) {
233
- console.error(`Error seeding store: ${e.message}`);
234
- process.exit(1);
235
- }
236
-
237
- } // end if (require.main === module)