@lusipad/pmspec 1.0.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 (60) hide show
  1. package/README.md +306 -0
  2. package/README.zh.md +304 -0
  3. package/bin/pmspec.js +5 -0
  4. package/dist/cli/index.d.ts +3 -0
  5. package/dist/cli/index.js +39 -0
  6. package/dist/commands/analyze.d.ts +4 -0
  7. package/dist/commands/analyze.js +240 -0
  8. package/dist/commands/breakdown.d.ts +4 -0
  9. package/dist/commands/breakdown.js +194 -0
  10. package/dist/commands/create.d.ts +4 -0
  11. package/dist/commands/create.js +529 -0
  12. package/dist/commands/history.d.ts +4 -0
  13. package/dist/commands/history.js +213 -0
  14. package/dist/commands/import.d.ts +4 -0
  15. package/dist/commands/import.js +196 -0
  16. package/dist/commands/index-legacy.d.ts +4 -0
  17. package/dist/commands/index-legacy.js +27 -0
  18. package/dist/commands/init.d.ts +3 -0
  19. package/dist/commands/init.js +60 -0
  20. package/dist/commands/list.d.ts +3 -0
  21. package/dist/commands/list.js +127 -0
  22. package/dist/commands/search.d.ts +7 -0
  23. package/dist/commands/search.js +183 -0
  24. package/dist/commands/serve.d.ts +3 -0
  25. package/dist/commands/serve.js +68 -0
  26. package/dist/commands/show.d.ts +3 -0
  27. package/dist/commands/show.js +152 -0
  28. package/dist/commands/simple.d.ts +7 -0
  29. package/dist/commands/simple.js +360 -0
  30. package/dist/commands/update.d.ts +4 -0
  31. package/dist/commands/update.js +247 -0
  32. package/dist/commands/validate.d.ts +3 -0
  33. package/dist/commands/validate.js +74 -0
  34. package/dist/core/changelog-service.d.ts +88 -0
  35. package/dist/core/changelog-service.js +208 -0
  36. package/dist/core/changelog.d.ts +113 -0
  37. package/dist/core/changelog.js +147 -0
  38. package/dist/core/importers.d.ts +343 -0
  39. package/dist/core/importers.js +715 -0
  40. package/dist/core/parser.d.ts +50 -0
  41. package/dist/core/parser.js +246 -0
  42. package/dist/core/project.d.ts +155 -0
  43. package/dist/core/project.js +138 -0
  44. package/dist/core/search.d.ts +119 -0
  45. package/dist/core/search.js +299 -0
  46. package/dist/core/simple-model.d.ts +54 -0
  47. package/dist/core/simple-model.js +20 -0
  48. package/dist/core/team.d.ts +41 -0
  49. package/dist/core/team.js +57 -0
  50. package/dist/core/workload.d.ts +49 -0
  51. package/dist/core/workload.js +116 -0
  52. package/dist/index.d.ts +15 -0
  53. package/dist/index.js +11 -0
  54. package/dist/utils/csv-handler.d.ts +15 -0
  55. package/dist/utils/csv-handler.js +224 -0
  56. package/dist/utils/markdown.d.ts +43 -0
  57. package/dist/utils/markdown.js +202 -0
  58. package/dist/utils/validation.d.ts +35 -0
  59. package/dist/utils/validation.js +178 -0
  60. package/package.json +71 -0
@@ -0,0 +1,343 @@
1
+ /**
2
+ * External Tool Importers Module
3
+ *
4
+ * Provides import functionality from external project management tools:
5
+ * - Jira: Epic → Category, Story/Task → Feature
6
+ * - Linear: Project → Epic, Issue → Feature
7
+ * - GitHub Issues: Milestone → Milestone, Issue → Feature, Labels → Skills/Tags
8
+ *
9
+ * Run `node setup-importers.js` from project root to extract this into
10
+ * separate files under src/importers/ directory.
11
+ */
12
+ import { z } from 'zod';
13
+ import type { SimpleFeature } from './simple-model.js';
14
+ export type ImportSource = 'jira' | 'linear' | 'github';
15
+ export declare const ImportOptionsSchema: z.ZodObject<{
16
+ file: z.ZodOptional<z.ZodString>;
17
+ content: z.ZodOptional<z.ZodString>;
18
+ dryRun: z.ZodDefault<z.ZodBoolean>;
19
+ merge: z.ZodDefault<z.ZodBoolean>;
20
+ outputFile: z.ZodDefault<z.ZodString>;
21
+ }, z.core.$strip>;
22
+ export type ImportOptions = z.infer<typeof ImportOptionsSchema>;
23
+ export interface ImportResult {
24
+ success: boolean;
25
+ source: ImportSource;
26
+ features: SimpleFeature[];
27
+ epics: ImportedEpic[];
28
+ milestones: ImportedMilestone[];
29
+ errors: ImportError[];
30
+ warnings: ImportWarning[];
31
+ stats: ImportStats;
32
+ }
33
+ export interface ImportedEpic {
34
+ id: string;
35
+ name: string;
36
+ description: string;
37
+ originalId?: string;
38
+ originalType?: string;
39
+ }
40
+ export interface ImportedMilestone {
41
+ id: string;
42
+ name: string;
43
+ description: string;
44
+ dueDate?: string;
45
+ originalId?: string;
46
+ }
47
+ export interface ImportError {
48
+ row?: number;
49
+ field?: string;
50
+ message: string;
51
+ originalItem?: unknown;
52
+ }
53
+ export interface ImportWarning {
54
+ row?: number;
55
+ field?: string;
56
+ message: string;
57
+ }
58
+ export interface ImportStats {
59
+ totalItems: number;
60
+ featuresImported: number;
61
+ epicsImported: number;
62
+ milestonesImported: number;
63
+ skipped: number;
64
+ errors: number;
65
+ }
66
+ export interface Importer {
67
+ name: string;
68
+ source: ImportSource;
69
+ description: string;
70
+ validate(content: string): Promise<{
71
+ valid: boolean;
72
+ errors: string[];
73
+ }>;
74
+ import(options: ImportOptions): Promise<ImportResult>;
75
+ preview(options: ImportOptions): Promise<ImportResult>;
76
+ }
77
+ export declare const JiraIssueSchema: z.ZodObject<{
78
+ key: z.ZodString;
79
+ fields: z.ZodObject<{
80
+ summary: z.ZodString;
81
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
+ issuetype: z.ZodObject<{
83
+ name: z.ZodString;
84
+ }, z.core.$strip>;
85
+ status: z.ZodObject<{
86
+ name: z.ZodString;
87
+ }, z.core.$strip>;
88
+ priority: z.ZodOptional<z.ZodObject<{
89
+ name: z.ZodString;
90
+ }, z.core.$strip>>;
91
+ assignee: z.ZodOptional<z.ZodNullable<z.ZodObject<{
92
+ displayName: z.ZodString;
93
+ }, z.core.$strip>>>;
94
+ labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
95
+ timeoriginalestimate: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
96
+ created: z.ZodOptional<z.ZodString>;
97
+ duedate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
98
+ parent: z.ZodOptional<z.ZodObject<{
99
+ key: z.ZodString;
100
+ fields: z.ZodObject<{
101
+ summary: z.ZodString;
102
+ issuetype: z.ZodObject<{
103
+ name: z.ZodString;
104
+ }, z.core.$strip>;
105
+ }, z.core.$strip>;
106
+ }, z.core.$strip>>;
107
+ customfield_10014: z.ZodOptional<z.ZodNullable<z.ZodString>>;
108
+ }, z.core.$strip>;
109
+ }, z.core.$strip>;
110
+ export type JiraIssue = z.infer<typeof JiraIssueSchema>;
111
+ export declare const JiraExportSchema: z.ZodObject<{
112
+ issues: z.ZodArray<z.ZodObject<{
113
+ key: z.ZodString;
114
+ fields: z.ZodObject<{
115
+ summary: z.ZodString;
116
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
117
+ issuetype: z.ZodObject<{
118
+ name: z.ZodString;
119
+ }, z.core.$strip>;
120
+ status: z.ZodObject<{
121
+ name: z.ZodString;
122
+ }, z.core.$strip>;
123
+ priority: z.ZodOptional<z.ZodObject<{
124
+ name: z.ZodString;
125
+ }, z.core.$strip>>;
126
+ assignee: z.ZodOptional<z.ZodNullable<z.ZodObject<{
127
+ displayName: z.ZodString;
128
+ }, z.core.$strip>>>;
129
+ labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
130
+ timeoriginalestimate: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
131
+ created: z.ZodOptional<z.ZodString>;
132
+ duedate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
133
+ parent: z.ZodOptional<z.ZodObject<{
134
+ key: z.ZodString;
135
+ fields: z.ZodObject<{
136
+ summary: z.ZodString;
137
+ issuetype: z.ZodObject<{
138
+ name: z.ZodString;
139
+ }, z.core.$strip>;
140
+ }, z.core.$strip>;
141
+ }, z.core.$strip>>;
142
+ customfield_10014: z.ZodOptional<z.ZodNullable<z.ZodString>>;
143
+ }, z.core.$strip>;
144
+ }, z.core.$strip>>;
145
+ }, z.core.$strip>;
146
+ export type JiraExport = z.infer<typeof JiraExportSchema>;
147
+ export declare const LinearIssueSchema: z.ZodObject<{
148
+ id: z.ZodString;
149
+ identifier: z.ZodString;
150
+ title: z.ZodString;
151
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
152
+ state: z.ZodObject<{
153
+ name: z.ZodString;
154
+ type: z.ZodString;
155
+ }, z.core.$strip>;
156
+ priority: z.ZodNumber;
157
+ priorityLabel: z.ZodString;
158
+ estimate: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
159
+ assignee: z.ZodOptional<z.ZodNullable<z.ZodObject<{
160
+ name: z.ZodString;
161
+ }, z.core.$strip>>>;
162
+ labels: z.ZodOptional<z.ZodObject<{
163
+ nodes: z.ZodArray<z.ZodObject<{
164
+ name: z.ZodString;
165
+ }, z.core.$strip>>;
166
+ }, z.core.$strip>>;
167
+ createdAt: z.ZodOptional<z.ZodString>;
168
+ dueDate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
169
+ project: z.ZodOptional<z.ZodNullable<z.ZodObject<{
170
+ id: z.ZodString;
171
+ name: z.ZodString;
172
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
173
+ }, z.core.$strip>>>;
174
+ }, z.core.$strip>;
175
+ export type LinearIssue = z.infer<typeof LinearIssueSchema>;
176
+ export declare const LinearExportSchema: z.ZodObject<{
177
+ issues: z.ZodArray<z.ZodObject<{
178
+ id: z.ZodString;
179
+ identifier: z.ZodString;
180
+ title: z.ZodString;
181
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
182
+ state: z.ZodObject<{
183
+ name: z.ZodString;
184
+ type: z.ZodString;
185
+ }, z.core.$strip>;
186
+ priority: z.ZodNumber;
187
+ priorityLabel: z.ZodString;
188
+ estimate: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
189
+ assignee: z.ZodOptional<z.ZodNullable<z.ZodObject<{
190
+ name: z.ZodString;
191
+ }, z.core.$strip>>>;
192
+ labels: z.ZodOptional<z.ZodObject<{
193
+ nodes: z.ZodArray<z.ZodObject<{
194
+ name: z.ZodString;
195
+ }, z.core.$strip>>;
196
+ }, z.core.$strip>>;
197
+ createdAt: z.ZodOptional<z.ZodString>;
198
+ dueDate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
199
+ project: z.ZodOptional<z.ZodNullable<z.ZodObject<{
200
+ id: z.ZodString;
201
+ name: z.ZodString;
202
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
203
+ }, z.core.$strip>>>;
204
+ }, z.core.$strip>>;
205
+ projects: z.ZodOptional<z.ZodArray<z.ZodObject<{
206
+ id: z.ZodString;
207
+ name: z.ZodString;
208
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
209
+ }, z.core.$strip>>>;
210
+ }, z.core.$strip>;
211
+ export type LinearExport = z.infer<typeof LinearExportSchema>;
212
+ export declare const GitHubIssueSchema: z.ZodObject<{
213
+ number: z.ZodNumber;
214
+ title: z.ZodString;
215
+ body: z.ZodOptional<z.ZodNullable<z.ZodString>>;
216
+ state: z.ZodEnum<{
217
+ open: "open";
218
+ closed: "closed";
219
+ }>;
220
+ labels: z.ZodDefault<z.ZodArray<z.ZodObject<{
221
+ name: z.ZodString;
222
+ }, z.core.$strip>>>;
223
+ assignee: z.ZodOptional<z.ZodNullable<z.ZodObject<{
224
+ login: z.ZodString;
225
+ }, z.core.$strip>>>;
226
+ assignees: z.ZodOptional<z.ZodArray<z.ZodObject<{
227
+ login: z.ZodString;
228
+ }, z.core.$strip>>>;
229
+ milestone: z.ZodOptional<z.ZodNullable<z.ZodObject<{
230
+ number: z.ZodNumber;
231
+ title: z.ZodString;
232
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
233
+ due_on: z.ZodOptional<z.ZodNullable<z.ZodString>>;
234
+ }, z.core.$strip>>>;
235
+ created_at: z.ZodOptional<z.ZodString>;
236
+ }, z.core.$strip>;
237
+ export type GitHubIssue = z.infer<typeof GitHubIssueSchema>;
238
+ export declare const GitHubExportSchema: z.ZodObject<{
239
+ issues: z.ZodArray<z.ZodObject<{
240
+ number: z.ZodNumber;
241
+ title: z.ZodString;
242
+ body: z.ZodOptional<z.ZodNullable<z.ZodString>>;
243
+ state: z.ZodEnum<{
244
+ open: "open";
245
+ closed: "closed";
246
+ }>;
247
+ labels: z.ZodDefault<z.ZodArray<z.ZodObject<{
248
+ name: z.ZodString;
249
+ }, z.core.$strip>>>;
250
+ assignee: z.ZodOptional<z.ZodNullable<z.ZodObject<{
251
+ login: z.ZodString;
252
+ }, z.core.$strip>>>;
253
+ assignees: z.ZodOptional<z.ZodArray<z.ZodObject<{
254
+ login: z.ZodString;
255
+ }, z.core.$strip>>>;
256
+ milestone: z.ZodOptional<z.ZodNullable<z.ZodObject<{
257
+ number: z.ZodNumber;
258
+ title: z.ZodString;
259
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
260
+ due_on: z.ZodOptional<z.ZodNullable<z.ZodString>>;
261
+ }, z.core.$strip>>>;
262
+ created_at: z.ZodOptional<z.ZodString>;
263
+ }, z.core.$strip>>;
264
+ milestones: z.ZodOptional<z.ZodArray<z.ZodObject<{
265
+ number: z.ZodNumber;
266
+ title: z.ZodString;
267
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
268
+ due_on: z.ZodOptional<z.ZodNullable<z.ZodString>>;
269
+ }, z.core.$strip>>>;
270
+ }, z.core.$strip>;
271
+ export type GitHubExport = z.infer<typeof GitHubExportSchema>;
272
+ declare abstract class BaseImporter implements Importer {
273
+ abstract name: string;
274
+ abstract source: ImportSource;
275
+ abstract description: string;
276
+ protected getContent(options: ImportOptions): Promise<string>;
277
+ protected parseJSON<T>(content: string): T;
278
+ protected createEmptyResult(): ImportResult;
279
+ protected generateFeatureId(prefix: string, index: number): string;
280
+ protected mapPriority(priority: string): 'low' | 'medium' | 'high' | 'critical';
281
+ protected mapStatus(status: string): 'todo' | 'in-progress' | 'done' | 'blocked';
282
+ protected formatDate(date: string | null | undefined): string | undefined;
283
+ protected convertToHours(seconds: number | null | undefined): number;
284
+ protected sanitizeId(name: string): string;
285
+ abstract validate(content: string): Promise<{
286
+ valid: boolean;
287
+ errors: string[];
288
+ }>;
289
+ abstract import(options: ImportOptions): Promise<ImportResult>;
290
+ preview(options: ImportOptions): Promise<ImportResult>;
291
+ protected writeFeatures(features: SimpleFeature[], outputFile: string, merge: boolean): Promise<void>;
292
+ }
293
+ export declare class JiraImporter extends BaseImporter {
294
+ name: string;
295
+ source: ImportSource;
296
+ description: string;
297
+ validate(content: string): Promise<{
298
+ valid: boolean;
299
+ errors: string[];
300
+ }>;
301
+ import(options: ImportOptions): Promise<ImportResult>;
302
+ private extractEpics;
303
+ private mapIssueToFeature;
304
+ }
305
+ export declare class LinearImporter extends BaseImporter {
306
+ name: string;
307
+ source: ImportSource;
308
+ description: string;
309
+ validate(content: string): Promise<{
310
+ valid: boolean;
311
+ errors: string[];
312
+ }>;
313
+ import(options: ImportOptions): Promise<ImportResult>;
314
+ private extractProjects;
315
+ private mapLinearPriority;
316
+ private mapLinearState;
317
+ private mapIssueToFeature;
318
+ }
319
+ export declare class GitHubImporter extends BaseImporter {
320
+ name: string;
321
+ source: ImportSource;
322
+ description: string;
323
+ validate(content: string): Promise<{
324
+ valid: boolean;
325
+ errors: string[];
326
+ }>;
327
+ import(options: ImportOptions): Promise<ImportResult>;
328
+ private extractMilestones;
329
+ private extractEpicsFromLabels;
330
+ private extractSkillsFromLabels;
331
+ private extractCategoryFromLabels;
332
+ private extractPriorityFromLabels;
333
+ private extractEstimateFromLabels;
334
+ private mapIssueToFeature;
335
+ }
336
+ export declare const jiraImporter: JiraImporter;
337
+ export declare const linearImporter: LinearImporter;
338
+ export declare const githubImporter: GitHubImporter;
339
+ export declare function getImporter(source: ImportSource): Importer;
340
+ export declare function getAllImporters(): Importer[];
341
+ export declare function isValidSource(source: string): source is ImportSource;
342
+ export {};
343
+ //# sourceMappingURL=importers.d.ts.map