mcp-git-issue-priority 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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +412 -0
  3. package/dist/config/index.d.ts +20 -0
  4. package/dist/config/index.d.ts.map +1 -0
  5. package/dist/config/index.js +76 -0
  6. package/dist/config/index.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +54 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/models/audit-log.d.ts +57 -0
  12. package/dist/models/audit-log.d.ts.map +1 -0
  13. package/dist/models/audit-log.js +50 -0
  14. package/dist/models/audit-log.js.map +1 -0
  15. package/dist/models/batch-state.d.ts +81 -0
  16. package/dist/models/batch-state.d.ts.map +1 -0
  17. package/dist/models/batch-state.js +38 -0
  18. package/dist/models/batch-state.js.map +1 -0
  19. package/dist/models/index.d.ts +9 -0
  20. package/dist/models/index.d.ts.map +1 -0
  21. package/dist/models/index.js +9 -0
  22. package/dist/models/index.js.map +1 -0
  23. package/dist/models/issue.d.ts +193 -0
  24. package/dist/models/issue.d.ts.map +1 -0
  25. package/dist/models/issue.js +86 -0
  26. package/dist/models/issue.js.map +1 -0
  27. package/dist/models/lock.d.ts +35 -0
  28. package/dist/models/lock.d.ts.map +1 -0
  29. package/dist/models/lock.js +48 -0
  30. package/dist/models/lock.js.map +1 -0
  31. package/dist/models/pr-status.d.ts +152 -0
  32. package/dist/models/pr-status.d.ts.map +1 -0
  33. package/dist/models/pr-status.js +36 -0
  34. package/dist/models/pr-status.js.map +1 -0
  35. package/dist/models/priority-score.d.ts +41 -0
  36. package/dist/models/priority-score.d.ts.map +1 -0
  37. package/dist/models/priority-score.js +64 -0
  38. package/dist/models/priority-score.js.map +1 -0
  39. package/dist/models/selection-filter.d.ts +16 -0
  40. package/dist/models/selection-filter.d.ts.map +1 -0
  41. package/dist/models/selection-filter.js +40 -0
  42. package/dist/models/selection-filter.js.map +1 -0
  43. package/dist/models/workflow-state.d.ts +126 -0
  44. package/dist/models/workflow-state.d.ts.map +1 -0
  45. package/dist/models/workflow-state.js +106 -0
  46. package/dist/models/workflow-state.js.map +1 -0
  47. package/dist/services/batch.d.ts +23 -0
  48. package/dist/services/batch.d.ts.map +1 -0
  49. package/dist/services/batch.js +126 -0
  50. package/dist/services/batch.js.map +1 -0
  51. package/dist/services/github.d.ts +48 -0
  52. package/dist/services/github.d.ts.map +1 -0
  53. package/dist/services/github.js +315 -0
  54. package/dist/services/github.js.map +1 -0
  55. package/dist/services/index.d.ts +7 -0
  56. package/dist/services/index.d.ts.map +1 -0
  57. package/dist/services/index.js +7 -0
  58. package/dist/services/index.js.map +1 -0
  59. package/dist/services/locking.d.ts +42 -0
  60. package/dist/services/locking.d.ts.map +1 -0
  61. package/dist/services/locking.js +195 -0
  62. package/dist/services/locking.js.map +1 -0
  63. package/dist/services/logging.d.ts +40 -0
  64. package/dist/services/logging.d.ts.map +1 -0
  65. package/dist/services/logging.js +80 -0
  66. package/dist/services/logging.js.map +1 -0
  67. package/dist/services/priority.d.ts +18 -0
  68. package/dist/services/priority.d.ts.map +1 -0
  69. package/dist/services/priority.js +33 -0
  70. package/dist/services/priority.js.map +1 -0
  71. package/dist/services/workflow.d.ts +39 -0
  72. package/dist/services/workflow.d.ts.map +1 -0
  73. package/dist/services/workflow.js +201 -0
  74. package/dist/services/workflow.js.map +1 -0
  75. package/dist/tools/advance-workflow.d.ts +3 -0
  76. package/dist/tools/advance-workflow.d.ts.map +1 -0
  77. package/dist/tools/advance-workflow.js +120 -0
  78. package/dist/tools/advance-workflow.js.map +1 -0
  79. package/dist/tools/batch-continue.d.ts +3 -0
  80. package/dist/tools/batch-continue.d.ts.map +1 -0
  81. package/dist/tools/batch-continue.js +133 -0
  82. package/dist/tools/batch-continue.js.map +1 -0
  83. package/dist/tools/bulk-update-issues.d.ts +3 -0
  84. package/dist/tools/bulk-update-issues.d.ts.map +1 -0
  85. package/dist/tools/bulk-update-issues.js +87 -0
  86. package/dist/tools/bulk-update-issues.js.map +1 -0
  87. package/dist/tools/create-issue.d.ts +41 -0
  88. package/dist/tools/create-issue.d.ts.map +1 -0
  89. package/dist/tools/create-issue.js +186 -0
  90. package/dist/tools/create-issue.js.map +1 -0
  91. package/dist/tools/force-claim.d.ts +3 -0
  92. package/dist/tools/force-claim.d.ts.map +1 -0
  93. package/dist/tools/force-claim.js +99 -0
  94. package/dist/tools/force-claim.js.map +1 -0
  95. package/dist/tools/get-pr-status.d.ts +3 -0
  96. package/dist/tools/get-pr-status.d.ts.map +1 -0
  97. package/dist/tools/get-pr-status.js +51 -0
  98. package/dist/tools/get-pr-status.js.map +1 -0
  99. package/dist/tools/get-workflow-analytics.d.ts +3 -0
  100. package/dist/tools/get-workflow-analytics.d.ts.map +1 -0
  101. package/dist/tools/get-workflow-analytics.js +264 -0
  102. package/dist/tools/get-workflow-analytics.js.map +1 -0
  103. package/dist/tools/get-workflow-status.d.ts +3 -0
  104. package/dist/tools/get-workflow-status.d.ts.map +1 -0
  105. package/dist/tools/get-workflow-status.js +103 -0
  106. package/dist/tools/get-workflow-status.js.map +1 -0
  107. package/dist/tools/implement-batch.d.ts +3 -0
  108. package/dist/tools/implement-batch.d.ts.map +1 -0
  109. package/dist/tools/implement-batch.js +124 -0
  110. package/dist/tools/implement-batch.js.map +1 -0
  111. package/dist/tools/list-backlog.d.ts +3 -0
  112. package/dist/tools/list-backlog.d.ts.map +1 -0
  113. package/dist/tools/list-backlog.js +146 -0
  114. package/dist/tools/list-backlog.js.map +1 -0
  115. package/dist/tools/release-lock.d.ts +3 -0
  116. package/dist/tools/release-lock.d.ts.map +1 -0
  117. package/dist/tools/release-lock.js +95 -0
  118. package/dist/tools/release-lock.js.map +1 -0
  119. package/dist/tools/select-next-issue.d.ts +3 -0
  120. package/dist/tools/select-next-issue.d.ts.map +1 -0
  121. package/dist/tools/select-next-issue.js +192 -0
  122. package/dist/tools/select-next-issue.js.map +1 -0
  123. package/dist/tools/sync-backlog-labels.d.ts +3 -0
  124. package/dist/tools/sync-backlog-labels.d.ts.map +1 -0
  125. package/dist/tools/sync-backlog-labels.js +164 -0
  126. package/dist/tools/sync-backlog-labels.js.map +1 -0
  127. package/package.json +70 -0
@@ -0,0 +1,152 @@
1
+ import { z } from 'zod';
2
+ export declare const CheckStatusSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ status: z.ZodEnum<["queued", "in_progress", "success", "failure", "neutral", "skipped"]>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ name: string;
7
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
8
+ }, {
9
+ name: string;
10
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
11
+ }>;
12
+ export type CheckStatus = z.infer<typeof CheckStatusSchema>;
13
+ export declare const CiStatusSchema: z.ZodObject<{
14
+ status: z.ZodEnum<["pending", "passing", "failing", "none"]>;
15
+ checks: z.ZodArray<z.ZodObject<{
16
+ name: z.ZodString;
17
+ status: z.ZodEnum<["queued", "in_progress", "success", "failure", "neutral", "skipped"]>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ name: string;
20
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
21
+ }, {
22
+ name: string;
23
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
24
+ }>, "many">;
25
+ }, "strip", z.ZodTypeAny, {
26
+ status: "pending" | "passing" | "failing" | "none";
27
+ checks: {
28
+ name: string;
29
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
30
+ }[];
31
+ }, {
32
+ status: "pending" | "passing" | "failing" | "none";
33
+ checks: {
34
+ name: string;
35
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
36
+ }[];
37
+ }>;
38
+ export type CiStatus = z.infer<typeof CiStatusSchema>;
39
+ export declare const ReviewStatusSchema: z.ZodObject<{
40
+ approved: z.ZodBoolean;
41
+ changesRequested: z.ZodBoolean;
42
+ reviewers: z.ZodArray<z.ZodString, "many">;
43
+ }, "strip", z.ZodTypeAny, {
44
+ approved: boolean;
45
+ changesRequested: boolean;
46
+ reviewers: string[];
47
+ }, {
48
+ approved: boolean;
49
+ changesRequested: boolean;
50
+ reviewers: string[];
51
+ }>;
52
+ export type ReviewStatus = z.infer<typeof ReviewStatusSchema>;
53
+ export declare const AutoMergeStatusSchema: z.ZodObject<{
54
+ enabled: z.ZodBoolean;
55
+ }, "strip", z.ZodTypeAny, {
56
+ enabled: boolean;
57
+ }, {
58
+ enabled: boolean;
59
+ }>;
60
+ export type AutoMergeStatus = z.infer<typeof AutoMergeStatusSchema>;
61
+ export declare const PrStatusSchema: z.ZodObject<{
62
+ prNumber: z.ZodNumber;
63
+ state: z.ZodEnum<["open", "closed", "merged"]>;
64
+ mergeable: z.ZodNullable<z.ZodBoolean>;
65
+ ci: z.ZodObject<{
66
+ status: z.ZodEnum<["pending", "passing", "failing", "none"]>;
67
+ checks: z.ZodArray<z.ZodObject<{
68
+ name: z.ZodString;
69
+ status: z.ZodEnum<["queued", "in_progress", "success", "failure", "neutral", "skipped"]>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ name: string;
72
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
73
+ }, {
74
+ name: string;
75
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
76
+ }>, "many">;
77
+ }, "strip", z.ZodTypeAny, {
78
+ status: "pending" | "passing" | "failing" | "none";
79
+ checks: {
80
+ name: string;
81
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
82
+ }[];
83
+ }, {
84
+ status: "pending" | "passing" | "failing" | "none";
85
+ checks: {
86
+ name: string;
87
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
88
+ }[];
89
+ }>;
90
+ reviews: z.ZodObject<{
91
+ approved: z.ZodBoolean;
92
+ changesRequested: z.ZodBoolean;
93
+ reviewers: z.ZodArray<z.ZodString, "many">;
94
+ }, "strip", z.ZodTypeAny, {
95
+ approved: boolean;
96
+ changesRequested: boolean;
97
+ reviewers: string[];
98
+ }, {
99
+ approved: boolean;
100
+ changesRequested: boolean;
101
+ reviewers: string[];
102
+ }>;
103
+ autoMerge: z.ZodObject<{
104
+ enabled: z.ZodBoolean;
105
+ }, "strip", z.ZodTypeAny, {
106
+ enabled: boolean;
107
+ }, {
108
+ enabled: boolean;
109
+ }>;
110
+ }, "strip", z.ZodTypeAny, {
111
+ state: "open" | "closed" | "merged";
112
+ prNumber: number;
113
+ mergeable: boolean | null;
114
+ ci: {
115
+ status: "pending" | "passing" | "failing" | "none";
116
+ checks: {
117
+ name: string;
118
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
119
+ }[];
120
+ };
121
+ reviews: {
122
+ approved: boolean;
123
+ changesRequested: boolean;
124
+ reviewers: string[];
125
+ };
126
+ autoMerge: {
127
+ enabled: boolean;
128
+ };
129
+ }, {
130
+ state: "open" | "closed" | "merged";
131
+ prNumber: number;
132
+ mergeable: boolean | null;
133
+ ci: {
134
+ status: "pending" | "passing" | "failing" | "none";
135
+ checks: {
136
+ name: string;
137
+ status: "success" | "failure" | "skipped" | "in_progress" | "queued" | "neutral";
138
+ }[];
139
+ };
140
+ reviews: {
141
+ approved: boolean;
142
+ changesRequested: boolean;
143
+ reviewers: string[];
144
+ };
145
+ autoMerge: {
146
+ enabled: boolean;
147
+ };
148
+ }>;
149
+ export type PrStatus = z.infer<typeof PrStatusSchema>;
150
+ export declare function validatePrStatus(data: unknown): PrStatus | null;
151
+ export declare function isPrReadyToMerge(status: PrStatus): boolean;
152
+ //# sourceMappingURL=pr-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-status.d.ts","sourceRoot":"","sources":["../../src/models/pr-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EAGzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAG/D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAO1D"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ export const CheckStatusSchema = z.object({
3
+ name: z.string(),
4
+ status: z.enum(['queued', 'in_progress', 'success', 'failure', 'neutral', 'skipped']),
5
+ });
6
+ export const CiStatusSchema = z.object({
7
+ status: z.enum(['pending', 'passing', 'failing', 'none']),
8
+ checks: z.array(CheckStatusSchema),
9
+ });
10
+ export const ReviewStatusSchema = z.object({
11
+ approved: z.boolean(),
12
+ changesRequested: z.boolean(),
13
+ reviewers: z.array(z.string()),
14
+ });
15
+ export const AutoMergeStatusSchema = z.object({
16
+ enabled: z.boolean(),
17
+ });
18
+ export const PrStatusSchema = z.object({
19
+ prNumber: z.number().int().positive(),
20
+ state: z.enum(['open', 'closed', 'merged']),
21
+ mergeable: z.boolean().nullable(),
22
+ ci: CiStatusSchema,
23
+ reviews: ReviewStatusSchema,
24
+ autoMerge: AutoMergeStatusSchema,
25
+ });
26
+ export function validatePrStatus(data) {
27
+ const result = PrStatusSchema.safeParse(data);
28
+ return result.success ? result.data : null;
29
+ }
30
+ export function isPrReadyToMerge(status) {
31
+ return (status.state === 'merged' ||
32
+ (status.ci.status === 'passing' &&
33
+ status.reviews.approved &&
34
+ !status.reviews.changesRequested));
35
+ }
36
+ //# sourceMappingURL=pr-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-status.js","sourceRoot":"","sources":["../../src/models/pr-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;CACtF,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;CACnC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;CACrB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,kBAAkB;IAC3B,SAAS,EAAE,qBAAqB;CACjC,CAAC,CAAC;AAIH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAgB;IAC/C,OAAO,CACL,MAAM,CAAC,KAAK,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS;YAC7B,MAAM,CAAC,OAAO,CAAC,QAAQ;YACvB,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ import type { Issue, PriorityLabel } from './issue.js';
3
+ export declare const PriorityScoreSchema: z.ZodObject<{
4
+ issueNumber: z.ZodNumber;
5
+ basePoints: z.ZodNumber;
6
+ ageBonus: z.ZodNumber;
7
+ blockingMultiplier: z.ZodNumber;
8
+ blockedPenalty: z.ZodNumber;
9
+ blockedByIssue: z.ZodNullable<z.ZodNumber>;
10
+ totalScore: z.ZodNumber;
11
+ }, "strip", z.ZodTypeAny, {
12
+ issueNumber: number;
13
+ basePoints: number;
14
+ ageBonus: number;
15
+ blockingMultiplier: number;
16
+ blockedPenalty: number;
17
+ blockedByIssue: number | null;
18
+ totalScore: number;
19
+ }, {
20
+ issueNumber: number;
21
+ basePoints: number;
22
+ ageBonus: number;
23
+ blockingMultiplier: number;
24
+ blockedPenalty: number;
25
+ blockedByIssue: number | null;
26
+ totalScore: number;
27
+ }>;
28
+ export type PriorityScore = z.infer<typeof PriorityScoreSchema>;
29
+ export declare const PRIORITY_BASE_POINTS: Record<PriorityLabel, number>;
30
+ export declare const MAX_AGE_BONUS = 30;
31
+ export declare const BLOCKING_MULTIPLIER = 1.5;
32
+ export declare const BLOCKED_PENALTY = 0.1;
33
+ export declare function calculateAgeInDays(createdAt: string): number;
34
+ export declare function hasBlockingRelationship(issue: Issue): boolean;
35
+ export interface PriorityScoreOptions {
36
+ blockedByIssue?: number | null;
37
+ }
38
+ export declare function calculatePriorityScore(issue: Issue, options?: PriorityScoreOptions): PriorityScore;
39
+ export declare function comparePriorityScores(a: PriorityScore, b: PriorityScore): number;
40
+ export declare function sortByPriority(issues: Issue[]): Issue[];
41
+ //# sourceMappingURL=priority-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority-score.d.ts","sourceRoot":"","sources":["../../src/models/priority-score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;EAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAK9D,CAAC;AAEF,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE7D;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,oBAAoB,GAC7B,aAAa,CAwBf;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAKhF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CASvD"}
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+ import { getPriorityLabel, hasLabel } from './issue.js';
3
+ export const PriorityScoreSchema = z.object({
4
+ issueNumber: z.number().int().positive(),
5
+ basePoints: z.number().int().nonnegative(),
6
+ ageBonus: z.number().int().nonnegative(),
7
+ blockingMultiplier: z.number().positive(),
8
+ blockedPenalty: z.number().positive(),
9
+ blockedByIssue: z.number().int().positive().nullable(),
10
+ totalScore: z.number().nonnegative(),
11
+ });
12
+ export const PRIORITY_BASE_POINTS = {
13
+ 'priority:critical': 1000,
14
+ 'priority:high': 100,
15
+ 'priority:medium': 10,
16
+ 'priority:low': 1,
17
+ };
18
+ export const MAX_AGE_BONUS = 30;
19
+ export const BLOCKING_MULTIPLIER = 1.5;
20
+ export const BLOCKED_PENALTY = 0.1;
21
+ export function calculateAgeInDays(createdAt) {
22
+ const created = new Date(createdAt);
23
+ const now = new Date();
24
+ const diffMs = now.getTime() - created.getTime();
25
+ return Math.floor(diffMs / (1000 * 60 * 60 * 24));
26
+ }
27
+ export function hasBlockingRelationship(issue) {
28
+ return hasLabel(issue, 'blocking') || hasLabel(issue, 'blocker');
29
+ }
30
+ export function calculatePriorityScore(issue, options) {
31
+ const priorityLabel = getPriorityLabel(issue);
32
+ const basePoints = priorityLabel ? PRIORITY_BASE_POINTS[priorityLabel] : 0;
33
+ const ageInDays = calculateAgeInDays(issue.created_at);
34
+ const ageBonus = Math.min(ageInDays, MAX_AGE_BONUS);
35
+ const blocksOthers = hasBlockingRelationship(issue);
36
+ const blockingMultiplier = blocksOthers ? BLOCKING_MULTIPLIER : 1.0;
37
+ const blockedByIssue = options?.blockedByIssue ?? null;
38
+ const blockedPenalty = blockedByIssue ? BLOCKED_PENALTY : 1.0;
39
+ const totalScore = (basePoints + ageBonus) * blockingMultiplier * blockedPenalty;
40
+ return {
41
+ issueNumber: issue.number,
42
+ basePoints,
43
+ ageBonus,
44
+ blockingMultiplier,
45
+ blockedPenalty,
46
+ blockedByIssue,
47
+ totalScore,
48
+ };
49
+ }
50
+ export function comparePriorityScores(a, b) {
51
+ if (a.totalScore !== b.totalScore) {
52
+ return b.totalScore - a.totalScore;
53
+ }
54
+ return a.issueNumber - b.issueNumber;
55
+ }
56
+ export function sortByPriority(issues) {
57
+ const scored = issues.map((issue) => ({
58
+ issue,
59
+ score: calculatePriorityScore(issue),
60
+ }));
61
+ scored.sort((a, b) => comparePriorityScores(a.score, b.score));
62
+ return scored.map(({ issue }) => issue);
63
+ }
64
+ //# sourceMappingURL=priority-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority-score.js","sourceRoot":"","sources":["../../src/models/priority-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ import type { Issue } from './issue.js';
3
+ export declare const SelectionFilterSchema: z.ZodObject<{
4
+ includeTypes: z.ZodOptional<z.ZodArray<z.ZodEnum<["bug", "feature", "chore", "docs"]>, "many">>;
5
+ excludeTypes: z.ZodOptional<z.ZodArray<z.ZodEnum<["bug", "feature", "chore", "docs"]>, "many">>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ includeTypes?: ("bug" | "feature" | "chore" | "docs")[] | undefined;
8
+ excludeTypes?: ("bug" | "feature" | "chore" | "docs")[] | undefined;
9
+ }, {
10
+ includeTypes?: ("bug" | "feature" | "chore" | "docs")[] | undefined;
11
+ excludeTypes?: ("bug" | "feature" | "chore" | "docs")[] | undefined;
12
+ }>;
13
+ export type SelectionFilter = z.infer<typeof SelectionFilterSchema>;
14
+ export declare function applyFilters(issues: Issue[], filter: SelectionFilter): Issue[];
15
+ export declare function validateFilter(data: unknown): SelectionFilter | null;
16
+ //# sourceMappingURL=selection-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-filter.d.ts","sourceRoot":"","sources":["../../src/models/selection-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AAGnD,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,CA+B9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAGpE"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ import { IssueTypeSchema, getTypeLabel, getStatusLabel } from './issue.js';
3
+ export const SelectionFilterSchema = z.object({
4
+ includeTypes: z.array(IssueTypeSchema).optional(),
5
+ excludeTypes: z.array(IssueTypeSchema).optional(),
6
+ });
7
+ export function applyFilters(issues, filter) {
8
+ let filtered = issues;
9
+ filtered = filtered.filter((issue) => {
10
+ const status = getStatusLabel(issue);
11
+ return status !== 'status:in-progress';
12
+ });
13
+ filtered = filtered.filter((issue) => !issue.assignees?.length);
14
+ if (filter.includeTypes && filter.includeTypes.length > 0) {
15
+ const includeSet = new Set(filter.includeTypes);
16
+ filtered = filtered.filter((issue) => {
17
+ const typeLabel = getTypeLabel(issue);
18
+ if (!typeLabel)
19
+ return false;
20
+ const type = typeLabel.replace('type:', '');
21
+ return includeSet.has(type);
22
+ });
23
+ }
24
+ if (filter.excludeTypes && filter.excludeTypes.length > 0) {
25
+ const excludeSet = new Set(filter.excludeTypes);
26
+ filtered = filtered.filter((issue) => {
27
+ const typeLabel = getTypeLabel(issue);
28
+ if (!typeLabel)
29
+ return true;
30
+ const type = typeLabel.replace('type:', '');
31
+ return !excludeSet.has(type);
32
+ });
33
+ }
34
+ return filtered;
35
+ }
36
+ export function validateFilter(data) {
37
+ const result = SelectionFilterSchema.safeParse(data);
38
+ return result.success ? result.data : null;
39
+ }
40
+ //# sourceMappingURL=selection-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-filter.js","sourceRoot":"","sources":["../../src/models/selection-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;IACjD,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAIH,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,MAAuB;IACnE,IAAI,QAAQ,GAAG,MAAM,CAAC;IAEtB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,MAAM,KAAK,oBAAoB,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEhE,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAChD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAc,CAAC;YACzD,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAChD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAc,CAAC;YACzD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { z } from 'zod';
2
+ export declare const WorkflowPhaseSchema: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
3
+ export type WorkflowPhase = z.infer<typeof WorkflowPhaseSchema>;
4
+ export declare const PhaseTransitionSchema: z.ZodObject<{
5
+ from: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
6
+ to: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
7
+ timestamp: z.ZodString;
8
+ triggeredBy: z.ZodString;
9
+ }, "strip", z.ZodTypeAny, {
10
+ from: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
11
+ to: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
12
+ timestamp: string;
13
+ triggeredBy: string;
14
+ }, {
15
+ from: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
16
+ to: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
17
+ timestamp: string;
18
+ triggeredBy: string;
19
+ }>;
20
+ export type PhaseTransition = z.infer<typeof PhaseTransitionSchema>;
21
+ export declare const SkipJustificationSchema: z.ZodObject<{
22
+ skippedPhase: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
23
+ justification: z.ZodString;
24
+ timestamp: z.ZodString;
25
+ sessionId: z.ZodString;
26
+ }, "strip", z.ZodTypeAny, {
27
+ sessionId: string;
28
+ timestamp: string;
29
+ skippedPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
30
+ justification: string;
31
+ }, {
32
+ sessionId: string;
33
+ timestamp: string;
34
+ skippedPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
35
+ justification: string;
36
+ }>;
37
+ export type SkipJustification = z.infer<typeof SkipJustificationSchema>;
38
+ export declare const WorkflowStateSchema: z.ZodObject<{
39
+ issueNumber: z.ZodNumber;
40
+ repoFullName: z.ZodString;
41
+ currentPhase: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
42
+ phaseHistory: z.ZodArray<z.ZodObject<{
43
+ from: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
44
+ to: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
45
+ timestamp: z.ZodString;
46
+ triggeredBy: z.ZodString;
47
+ }, "strip", z.ZodTypeAny, {
48
+ from: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
49
+ to: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
50
+ timestamp: string;
51
+ triggeredBy: string;
52
+ }, {
53
+ from: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
54
+ to: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
55
+ timestamp: string;
56
+ triggeredBy: string;
57
+ }>, "many">;
58
+ skipJustifications: z.ZodArray<z.ZodObject<{
59
+ skippedPhase: z.ZodEnum<["selection", "research", "branch", "implementation", "testing", "commit", "pr", "review", "merged", "abandoned"]>;
60
+ justification: z.ZodString;
61
+ timestamp: z.ZodString;
62
+ sessionId: z.ZodString;
63
+ }, "strip", z.ZodTypeAny, {
64
+ sessionId: string;
65
+ timestamp: string;
66
+ skippedPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
67
+ justification: string;
68
+ }, {
69
+ sessionId: string;
70
+ timestamp: string;
71
+ skippedPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
72
+ justification: string;
73
+ }>, "many">;
74
+ branchName: z.ZodNullable<z.ZodString>;
75
+ testsPassed: z.ZodNullable<z.ZodBoolean>;
76
+ prNumber: z.ZodNullable<z.ZodNumber>;
77
+ }, "strip", z.ZodTypeAny, {
78
+ issueNumber: number;
79
+ repoFullName: string;
80
+ currentPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
81
+ phaseHistory: {
82
+ from: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
83
+ to: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
84
+ timestamp: string;
85
+ triggeredBy: string;
86
+ }[];
87
+ skipJustifications: {
88
+ sessionId: string;
89
+ timestamp: string;
90
+ skippedPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
91
+ justification: string;
92
+ }[];
93
+ branchName: string | null;
94
+ testsPassed: boolean | null;
95
+ prNumber: number | null;
96
+ }, {
97
+ issueNumber: number;
98
+ repoFullName: string;
99
+ currentPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
100
+ phaseHistory: {
101
+ from: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
102
+ to: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
103
+ timestamp: string;
104
+ triggeredBy: string;
105
+ }[];
106
+ skipJustifications: {
107
+ sessionId: string;
108
+ timestamp: string;
109
+ skippedPhase: "selection" | "research" | "branch" | "implementation" | "testing" | "commit" | "pr" | "review" | "merged" | "abandoned";
110
+ justification: string;
111
+ }[];
112
+ branchName: string | null;
113
+ testsPassed: boolean | null;
114
+ prNumber: number | null;
115
+ }>;
116
+ export type WorkflowState = z.infer<typeof WorkflowStateSchema>;
117
+ export declare function createWorkflowState(issueNumber: number, repoFullName: string, triggeredBy: string): WorkflowState;
118
+ export declare const PHASE_ORDER: WorkflowPhase[];
119
+ export declare const VALID_TRANSITIONS: Record<WorkflowPhase, WorkflowPhase[]>;
120
+ export declare function isValidTransition(from: WorkflowPhase, to: WorkflowPhase): boolean;
121
+ export declare function canSkipTo(from: WorkflowPhase, to: WorkflowPhase): boolean;
122
+ export declare function getSkippedPhases(from: WorkflowPhase, to: WorkflowPhase): WorkflowPhase[];
123
+ export declare function requiresTestsForTransition(to: WorkflowPhase): boolean;
124
+ export declare function getWorkflowFileName(owner: string, repo: string, issueNumber: number): string;
125
+ export declare function validateWorkflowState(data: unknown): WorkflowState | null;
126
+ //# sourceMappingURL=workflow-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../../src/models/workflow-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB,8HAW9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAKhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,aAAa,CAmBf;AAED,eAAO,MAAM,WAAW,EAAE,aAAa,EAUtC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,CAWpE,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAEjF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAKzE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,GAAG,aAAa,EAAE,CAKxF;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAErE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAGzE"}
@@ -0,0 +1,106 @@
1
+ import { z } from 'zod';
2
+ export const WorkflowPhaseSchema = z.enum([
3
+ 'selection',
4
+ 'research',
5
+ 'branch',
6
+ 'implementation',
7
+ 'testing',
8
+ 'commit',
9
+ 'pr',
10
+ 'review',
11
+ 'merged',
12
+ 'abandoned',
13
+ ]);
14
+ export const PhaseTransitionSchema = z.object({
15
+ from: WorkflowPhaseSchema,
16
+ to: WorkflowPhaseSchema,
17
+ timestamp: z.string().datetime(),
18
+ triggeredBy: z.string(),
19
+ });
20
+ export const SkipJustificationSchema = z.object({
21
+ skippedPhase: WorkflowPhaseSchema,
22
+ justification: z.string(),
23
+ timestamp: z.string().datetime(),
24
+ sessionId: z.string().uuid(),
25
+ });
26
+ export const WorkflowStateSchema = z.object({
27
+ issueNumber: z.number().int().positive(),
28
+ repoFullName: z.string(),
29
+ currentPhase: WorkflowPhaseSchema,
30
+ phaseHistory: z.array(PhaseTransitionSchema),
31
+ skipJustifications: z.array(SkipJustificationSchema),
32
+ branchName: z.string().nullable(),
33
+ testsPassed: z.boolean().nullable(),
34
+ prNumber: z.number().int().positive().nullable(),
35
+ });
36
+ export function createWorkflowState(issueNumber, repoFullName, triggeredBy) {
37
+ const now = new Date().toISOString();
38
+ return {
39
+ issueNumber,
40
+ repoFullName,
41
+ currentPhase: 'selection',
42
+ phaseHistory: [
43
+ {
44
+ from: 'selection',
45
+ to: 'selection',
46
+ timestamp: now,
47
+ triggeredBy,
48
+ },
49
+ ],
50
+ skipJustifications: [],
51
+ branchName: null,
52
+ testsPassed: null,
53
+ prNumber: null,
54
+ };
55
+ }
56
+ export const PHASE_ORDER = [
57
+ 'selection',
58
+ 'research',
59
+ 'branch',
60
+ 'implementation',
61
+ 'testing',
62
+ 'commit',
63
+ 'pr',
64
+ 'review',
65
+ 'merged',
66
+ ];
67
+ export const VALID_TRANSITIONS = {
68
+ selection: ['research', 'abandoned'],
69
+ research: ['branch', 'abandoned'],
70
+ branch: ['implementation', 'abandoned'],
71
+ implementation: ['testing', 'abandoned'],
72
+ testing: ['commit', 'abandoned'],
73
+ commit: ['pr', 'abandoned'],
74
+ pr: ['review', 'abandoned'],
75
+ review: ['merged', 'abandoned'],
76
+ merged: [],
77
+ abandoned: [],
78
+ };
79
+ export function isValidTransition(from, to) {
80
+ return VALID_TRANSITIONS[from].includes(to);
81
+ }
82
+ export function canSkipTo(from, to) {
83
+ if (to === 'abandoned')
84
+ return true;
85
+ const fromIndex = PHASE_ORDER.indexOf(from);
86
+ const toIndex = PHASE_ORDER.indexOf(to);
87
+ return toIndex > fromIndex;
88
+ }
89
+ export function getSkippedPhases(from, to) {
90
+ const fromIndex = PHASE_ORDER.indexOf(from);
91
+ const toIndex = PHASE_ORDER.indexOf(to);
92
+ if (toIndex <= fromIndex + 1)
93
+ return [];
94
+ return PHASE_ORDER.slice(fromIndex + 1, toIndex);
95
+ }
96
+ export function requiresTestsForTransition(to) {
97
+ return to === 'commit' || to === 'pr';
98
+ }
99
+ export function getWorkflowFileName(owner, repo, issueNumber) {
100
+ return `${owner}_${repo}_${issueNumber}.json`;
101
+ }
102
+ export function validateWorkflowState(data) {
103
+ const result = WorkflowStateSchema.safeParse(data);
104
+ return result.success ? result.data : null;
105
+ }
106
+ //# sourceMappingURL=workflow-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/models/workflow-state.ts"],"names":[],"mappings":"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"}