ex-workflow 0.0.0-stage → 0.2.0-stage

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 (84) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +153 -2
  4. package/dist/adapters/index.cjs +2 -0
  5. package/dist/adapters/index.cjs.map +1 -0
  6. package/dist/adapters/index.d.cts +17 -0
  7. package/dist/adapters/index.d.ts +17 -0
  8. package/dist/adapters/index.mjs +2 -0
  9. package/dist/adapters/index.mjs.map +1 -0
  10. package/dist/chunk-2FRRD6A3.mjs +2 -0
  11. package/dist/chunk-2FRRD6A3.mjs.map +1 -0
  12. package/dist/chunk-472WEDPJ.cjs +2 -0
  13. package/dist/chunk-472WEDPJ.cjs.map +1 -0
  14. package/dist/chunk-6R3YFUUV.cjs +6 -0
  15. package/dist/chunk-6R3YFUUV.cjs.map +1 -0
  16. package/dist/chunk-D4HNETUL.cjs +2 -0
  17. package/dist/chunk-D4HNETUL.cjs.map +1 -0
  18. package/dist/chunk-DBR24RTX.cjs +2 -0
  19. package/dist/chunk-DBR24RTX.cjs.map +1 -0
  20. package/dist/chunk-IBRC36PE.mjs +2 -0
  21. package/dist/chunk-IBRC36PE.mjs.map +1 -0
  22. package/dist/chunk-JDVE7DQR.cjs +2 -0
  23. package/dist/chunk-JDVE7DQR.cjs.map +1 -0
  24. package/dist/chunk-KIQOUUEZ.mjs +2 -0
  25. package/dist/chunk-KIQOUUEZ.mjs.map +1 -0
  26. package/dist/chunk-NQU5TH3A.mjs +2 -0
  27. package/dist/chunk-NQU5TH3A.mjs.map +1 -0
  28. package/dist/chunk-NRAPI3GV.cjs +2 -0
  29. package/dist/chunk-NRAPI3GV.cjs.map +1 -0
  30. package/dist/chunk-PD5FBDN7.mjs +2 -0
  31. package/dist/chunk-PD5FBDN7.mjs.map +1 -0
  32. package/dist/chunk-PO2SPQJP.cjs +2 -0
  33. package/dist/chunk-PO2SPQJP.cjs.map +1 -0
  34. package/dist/chunk-QDT35LXB.cjs +2 -0
  35. package/dist/chunk-QDT35LXB.cjs.map +1 -0
  36. package/dist/chunk-S3BXVHO7.cjs +2 -0
  37. package/dist/chunk-S3BXVHO7.cjs.map +1 -0
  38. package/dist/chunk-VGD4V5BA.mjs +6 -0
  39. package/dist/chunk-VGD4V5BA.mjs.map +1 -0
  40. package/dist/chunk-VN2UYV2O.mjs +2 -0
  41. package/dist/chunk-VN2UYV2O.mjs.map +1 -0
  42. package/dist/chunk-XSXHEEJX.mjs +2 -0
  43. package/dist/chunk-XSXHEEJX.mjs.map +1 -0
  44. package/dist/chunk-YJNDBKIG.mjs +2 -0
  45. package/dist/chunk-YJNDBKIG.mjs.map +1 -0
  46. package/dist/cli/bin.cjs +5 -0
  47. package/dist/cli/bin.cjs.map +1 -0
  48. package/dist/cli/bin.d.cts +1 -0
  49. package/dist/cli/bin.d.ts +1 -0
  50. package/dist/cli/bin.mjs +5 -0
  51. package/dist/cli/bin.mjs.map +1 -0
  52. package/dist/cli/index.cjs +2 -0
  53. package/dist/cli/index.cjs.map +1 -0
  54. package/dist/cli/index.d.cts +13 -0
  55. package/dist/cli/index.d.ts +13 -0
  56. package/dist/cli/index.mjs +2 -0
  57. package/dist/cli/index.mjs.map +1 -0
  58. package/dist/index.cjs +2 -0
  59. package/dist/index.cjs.map +1 -0
  60. package/dist/index.d.cts +134 -0
  61. package/dist/index.d.ts +134 -0
  62. package/dist/index.mjs +2 -0
  63. package/dist/index.mjs.map +1 -0
  64. package/dist/kanban/index.cjs +2 -0
  65. package/dist/kanban/index.cjs.map +1 -0
  66. package/dist/kanban/index.d.cts +225 -0
  67. package/dist/kanban/index.d.ts +225 -0
  68. package/dist/kanban/index.mjs +2 -0
  69. package/dist/kanban/index.mjs.map +1 -0
  70. package/dist/roles-BLBRKhUZ.d.ts +14 -0
  71. package/dist/roles-aneKYJ3Z.d.cts +14 -0
  72. package/dist/scrum/index.cjs +2 -0
  73. package/dist/scrum/index.cjs.map +1 -0
  74. package/dist/scrum/index.d.cts +59 -0
  75. package/dist/scrum/index.d.ts +59 -0
  76. package/dist/scrum/index.mjs +2 -0
  77. package/dist/scrum/index.mjs.map +1 -0
  78. package/dist/types.cjs +2 -0
  79. package/dist/types.cjs.map +1 -0
  80. package/dist/types.d.cts +330 -0
  81. package/dist/types.d.ts +330 -0
  82. package/dist/types.mjs +2 -0
  83. package/dist/types.mjs.map +1 -0
  84. package/package.json +146 -4
@@ -0,0 +1,225 @@
1
+ import { ClassOfService, Policy, WorkflowState, Role, Stage, Rule, Methodology, Ceremony, CeremonyInput, ItemStatus, WorkItem, Event, CoreTerm } from '../types.js';
2
+
3
+ type KanbanCadence = "replenishment" | "delivery-planning" | "service-delivery-review" | "operations-review" | "risk-review" | "strategy-review";
4
+ declare const KANBAN_CADENCES: readonly KanbanCadence[];
5
+ declare const CLASSES: readonly ClassOfService[];
6
+ declare const DAY_MS = 86400000;
7
+ interface KanbanColumn {
8
+ id: string;
9
+ name: string;
10
+ wipLimit?: number;
11
+ /** Explicit policies a card must satisfy before it LEAVES the column (checked by complete()). */
12
+ policies: Policy[];
13
+ commitmentPoint?: boolean;
14
+ deliveryPoint?: boolean;
15
+ /** Cards entering this column wait for a reviewer (status "review"). */
16
+ review?: boolean;
17
+ }
18
+ interface ServiceLevel {
19
+ percentile: number;
20
+ targetMs: number;
21
+ }
22
+ interface ClassConfig {
23
+ wipBypass?: number;
24
+ sle?: ServiceLevel;
25
+ }
26
+ interface KanbanConfig {
27
+ columns: KanbanColumn[];
28
+ classesOfService: Partial<Record<ClassOfService, ClassConfig>>;
29
+ fairness: {
30
+ aging: boolean;
31
+ maxDeferralRounds: number;
32
+ };
33
+ cadences: Partial<Record<KanbanCadence, {
34
+ everyTurns?: number;
35
+ }>>;
36
+ throughputWindowMs: number;
37
+ maxExpedite: number;
38
+ }
39
+ declare function configOf(state: WorkflowState): KanbanConfig;
40
+ declare const DEFAULT_COLUMNS: KanbanColumn[];
41
+ declare function validateKanbanConfig(raw: unknown): KanbanConfig;
42
+
43
+ declare function kanbanRoles(): Role[];
44
+
45
+ declare function kanbanStages(config: KanbanConfig): Stage[];
46
+
47
+ declare function kanbanRules(): Rule[];
48
+
49
+ /** input.items as a non-empty, duplicate-free string[] of existing item ids. */
50
+ declare function wantItems(state: WorkflowState, input: CeremonyInput, cadence: string): string[];
51
+ declare function kanbanCeremonies(methodology: () => Methodology): Record<string, Ceremony>;
52
+
53
+ /** Statuses that hold a WIP slot. */
54
+ declare const ACTIVE: ReadonlySet<ItemStatus>;
55
+ /** Every status but done and dropped: the cards on the board. */
56
+ declare const OPEN: ReadonlySet<ItemStatus>;
57
+ declare function optionsColumn(state: WorkflowState): Stage;
58
+ declare function commitmentColumn(state: WorkflowState): Stage;
59
+ declare function deliveryColumn(state: WorkflowState): Stage;
60
+ declare function columnIndex(state: WorkflowState, stageId: string): number;
61
+ /** Committed and not yet delivered: column index in [commitment, delivery). */
62
+ declare function onBoard(state: WorkflowState, item: WorkItem): boolean;
63
+ declare function activeExpedites(state: WorkflowState): string[];
64
+ /** ISO time the item last entered its current column; undefined when it was added there and never moved. */
65
+ declare function enteredStageAt(item: WorkItem): string | undefined;
66
+
67
+ interface BoardCard {
68
+ id: string;
69
+ title: string;
70
+ type: string;
71
+ status: ItemStatus;
72
+ classOfService: string;
73
+ role: string | null;
74
+ ageMs: number;
75
+ blocked: boolean;
76
+ deadline: string | null;
77
+ }
78
+ interface BoardColumn {
79
+ id: string;
80
+ name: string;
81
+ wipLimit: number | null;
82
+ active: number;
83
+ queued: number;
84
+ overLimit: boolean;
85
+ commitmentPoint: boolean;
86
+ deliveryPoint: boolean;
87
+ cards: BoardCard[];
88
+ }
89
+ /** Time the item was added (its item.added event), else the first event's time. */
90
+ declare function addedAt(state: WorkflowState, id: string): string;
91
+ declare function cardAge(state: WorkflowState, item: WorkItem, now: string): number;
92
+ declare function board(state: WorkflowState, now: string): BoardColumn[];
93
+ declare const CADENCE_EVENT: (c: KanbanCadence) => string;
94
+ interface CadenceStatus {
95
+ cadence: KanbanCadence;
96
+ everyTurns: number | null;
97
+ lastAt: string | null;
98
+ turnsSince: number;
99
+ due: boolean;
100
+ }
101
+ declare function cadencesDue(state: WorkflowState): CadenceStatus[];
102
+
103
+ interface OpsReport {
104
+ blockers: Array<{
105
+ item: string;
106
+ blocker: string;
107
+ owner: string;
108
+ reason: string;
109
+ ageMs: number;
110
+ }>;
111
+ agingWip: Array<{
112
+ item: string;
113
+ column: string;
114
+ status: string;
115
+ ageMs: number;
116
+ p85Ms: number | null;
117
+ overP85: boolean;
118
+ }>;
119
+ queued: Record<string, number>;
120
+ active: Record<string, number>;
121
+ }
122
+ declare function opsReport(state: WorkflowState, now: string): OpsReport;
123
+ interface RiskReport {
124
+ fixedDate: Array<{
125
+ item: string;
126
+ deadline: string;
127
+ timeLeftMs: number;
128
+ projectedRemainingMs: number | null;
129
+ atRisk: boolean;
130
+ }>;
131
+ staleBlockers: Array<{
132
+ item: string;
133
+ blocker: string;
134
+ owner: string;
135
+ ageMs: number;
136
+ }>;
137
+ expediteActive: string[];
138
+ }
139
+ declare function riskReport(state: WorkflowState, now: string, staleAfterMs: number): RiskReport;
140
+
141
+ interface Stay {
142
+ stage: string;
143
+ enteredAt: string;
144
+ leftAt?: string;
145
+ }
146
+ interface ReplayedItem {
147
+ id: string;
148
+ /** item type from item.added; "question" items are escalations, not deliveries */
149
+ type: string;
150
+ stage: string;
151
+ status: ItemStatus;
152
+ /** one entry per contiguous visit to a column; status changes inside a column do not end a stay */
153
+ stays: Stay[];
154
+ /** first entry into the commitment column */
155
+ committedAt?: string;
156
+ /** first entry into the delivery column */
157
+ deliveredAt?: string;
158
+ /** from the replenishment payload; "standard" when never replenished */
159
+ classOfService: ClassOfService;
160
+ deadline?: string;
161
+ /** closed in_progress intervals */
162
+ activeMs: number;
163
+ /** closed blocked intervals */
164
+ blockedMs: number;
165
+ /** the open status interval */
166
+ since: {
167
+ status: ItemStatus;
168
+ at: string;
169
+ };
170
+ }
171
+ interface ReplayedBlocker {
172
+ item: string;
173
+ blocker: string;
174
+ raisedAt: string;
175
+ clearedAt?: string;
176
+ }
177
+ interface Replay {
178
+ items: Map<string, ReplayedItem>;
179
+ blockers: ReplayedBlocker[];
180
+ /** time of the last event: the clock every "still open" measurement uses */
181
+ lastAt: string;
182
+ }
183
+ declare function replay(events: Event[], commitment: string, delivery: string): Replay;
184
+
185
+ interface KanbanMetrics {
186
+ leadTimeMs: number[];
187
+ leadTimeP50: number;
188
+ leadTimeP85: number;
189
+ cycleTimeMsByColumn: Record<string, number>;
190
+ throughput: number[];
191
+ wipByColumn: Record<string, number>;
192
+ flowEfficiency: number;
193
+ agingWipMs: Record<string, number>;
194
+ cumulativeFlow: Record<string, number>;
195
+ sleCompliance: Record<string, number>;
196
+ blockerTimeMs: number;
197
+ meanBlockerTimeMs: number;
198
+ }
199
+ /** Nearest-rank percentile; 0 for an empty list. */
200
+ declare function percentile(values: number[], p: number): number;
201
+ /** Completed stay durations per column. */
202
+ declare function columnStays(state: WorkflowState): Record<string, number[]>;
203
+ declare function kanbanMetrics(state: WorkflowState): KanbanMetrics;
204
+
205
+ declare const KANBAN_VOCABULARY: Record<CoreTerm, string>;
206
+
207
+ /** What the priority function needs besides the card: how long it has been passed over, and the fairness config. */
208
+ interface PriorityContext {
209
+ /** next() rounds that resolved since the card entered its column */
210
+ deferrals: number;
211
+ aging: boolean;
212
+ maxDeferralRounds: number;
213
+ }
214
+ /**
215
+ * Class band x 1e15 + an in-band offset. Bands: question 5, expedite 4, fixed-date 3, standard 2,
216
+ * intangible 1. Fixed-date: earlier deadline = larger offset. Others: own priority (clamped to +-1e9)
217
+ * plus, with aging, 4e9 per full window of maxDeferralRounds deferrals (priority decides within a window). An intangible card deferred that many
218
+ * times is scored in the standard band, so it overtakes fresh standard cards.
219
+ */
220
+ declare function priorityByClass(item: WorkItem, ctx: PriorityContext): number;
221
+ /** Class rank, then the card that has waited longest in its column, then id (FIFO by aging). */
222
+ declare function byClassThenAge(a: WorkItem, b: WorkItem): number;
223
+ declare function kanban(): Methodology<KanbanConfig>;
224
+
225
+ export { ACTIVE, type BoardCard, type BoardColumn, CADENCE_EVENT, CLASSES, type CadenceStatus, type ClassConfig, DAY_MS, DEFAULT_COLUMNS, KANBAN_CADENCES, KANBAN_VOCABULARY, type KanbanCadence, type KanbanColumn, type KanbanConfig, type KanbanMetrics, OPEN, type OpsReport, type PriorityContext, type Replay, type ReplayedBlocker, type ReplayedItem, type RiskReport, type ServiceLevel, type Stay, activeExpedites, addedAt, board, byClassThenAge, cadencesDue, cardAge, columnIndex, columnStays, commitmentColumn, configOf, deliveryColumn, enteredStageAt, kanban, kanbanCeremonies, kanbanMetrics, kanbanRoles, kanbanRules, kanbanStages, onBoard, opsReport, optionsColumn, percentile, priorityByClass, replay, riskReport, validateKanbanConfig, wantItems };
@@ -0,0 +1,2 @@
1
+ export{a as ACTIVE,s as CADENCE_EVENT,k as CLASSES,l as DAY_MS,n as DEFAULT_COLUMNS,j as KANBAN_CADENCES,F as KANBAN_VOCABULARY,b as OPEN,h as activeExpedites,p as addedAt,r as board,H as byClassThenAge,t as cadencesDue,q as cardAge,f as columnIndex,w as columnStays,d as commitmentColumn,m as configOf,e as deliveryColumn,i as enteredStageAt,I as kanban,B as kanbanCeremonies,x as kanbanMetrics,C as kanbanRoles,D as kanbanRules,E as kanbanStages,g as onBoard,y as opsReport,c as optionsColumn,v as percentile,G as priorityByClass,u as replay,z as riskReport,o as validateKanbanConfig,A as wantItems}from'../chunk-XSXHEEJX.mjs';import'../chunk-NQU5TH3A.mjs';import'../chunk-2FRRD6A3.mjs';//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,14 @@
1
+ import { WorkflowState, Role, Capability } from './types.js';
2
+
3
+ declare function registerRole(state: WorkflowState, role: Role, by: string, now?: string): WorkflowState;
4
+ declare function retireRole(state: WorkflowState, roleId: string, by: string, now?: string): WorkflowState;
5
+ declare function hasCapability(role: Role, cap: Capability): boolean;
6
+ declare function rolesWith(state: WorkflowState, cap: Capability): Role[];
7
+ declare function approversFor(state: WorkflowState, gateId: string): Role[];
8
+ declare function requireCapabilities(state: WorkflowState, required: Capability[], exclusive: Capability[]): void;
9
+ declare function separationLost(state: WorkflowState, required: Capability[]): Role[];
10
+ /** `human` may do anything; a role must hold at least one of `caps`; unknown ids may do nothing. */
11
+ declare function canDo(state: WorkflowState, by: string, ...caps: Capability[]): boolean;
12
+ declare function requireCap(state: WorkflowState, by: string, ...caps: Capability[]): void;
13
+
14
+ export { approversFor as a, requireCap as b, canDo as c, requireCapabilities as d, retireRole as e, rolesWith as f, hasCapability as h, registerRole as r, separationLost as s };
@@ -0,0 +1,14 @@
1
+ import { WorkflowState, Role, Capability } from './types.cjs';
2
+
3
+ declare function registerRole(state: WorkflowState, role: Role, by: string, now?: string): WorkflowState;
4
+ declare function retireRole(state: WorkflowState, roleId: string, by: string, now?: string): WorkflowState;
5
+ declare function hasCapability(role: Role, cap: Capability): boolean;
6
+ declare function rolesWith(state: WorkflowState, cap: Capability): Role[];
7
+ declare function approversFor(state: WorkflowState, gateId: string): Role[];
8
+ declare function requireCapabilities(state: WorkflowState, required: Capability[], exclusive: Capability[]): void;
9
+ declare function separationLost(state: WorkflowState, required: Capability[]): Role[];
10
+ /** `human` may do anything; a role must hold at least one of `caps`; unknown ids may do nothing. */
11
+ declare function canDo(state: WorkflowState, by: string, ...caps: Capability[]): boolean;
12
+ declare function requireCap(state: WorkflowState, by: string, ...caps: Capability[]): void;
13
+
14
+ export { approversFor as a, requireCap as b, canDo as c, requireCapabilities as d, retireRole as e, rolesWith as f, hasCapability as h, registerRole as r, separationLost as s };
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunk472WEDPJ_cjs=require('../chunk-472WEDPJ.cjs');require('../chunk-QDT35LXB.cjs');var chunkJDVE7DQR_cjs=require('../chunk-JDVE7DQR.cjs');require('../chunk-S3BXVHO7.cjs');Object.defineProperty(exports,"SCRUM_VOCABULARY",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.h}});Object.defineProperty(exports,"closeSprint",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.j}});Object.defineProperty(exports,"configOf",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.i}});Object.defineProperty(exports,"dailyReport",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.a}});Object.defineProperty(exports,"scrum",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.k}});Object.defineProperty(exports,"scrumCeremonies",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.b}});Object.defineProperty(exports,"scrumMetrics",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.d}});Object.defineProperty(exports,"scrumRoles",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.e}});Object.defineProperty(exports,"scrumRules",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.f}});Object.defineProperty(exports,"scrumStages",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.g}});Object.defineProperty(exports,"validateScrumConfig",{enumerable:true,get:function(){return chunk472WEDPJ_cjs.c}});Object.defineProperty(exports,"canDo",{enumerable:true,get:function(){return chunkJDVE7DQR_cjs.n}});//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,59 @@
1
+ import { Budget, Policy, WorkflowState, Role, Rule, Stage, ItemStatus, Methodology, Ceremony, CoreTerm } from '../types.cjs';
2
+ export { c as canDo } from '../roles-aneKYJ3Z.cjs';
3
+
4
+ interface ScrumConfig {
5
+ sprintBudget: Budget;
6
+ productGoal: string;
7
+ definitionOfDone: Policy[];
8
+ refinementSharePct: number;
9
+ allowMidSprintAdd: "never" | "po-only" | "any";
10
+ inProgressWipLimit?: number;
11
+ }
12
+ declare function validateScrumConfig(raw: unknown): ScrumConfig;
13
+
14
+ interface ScrumMetrics {
15
+ velocity: number[];
16
+ meanVelocity: number;
17
+ burndown: number[];
18
+ commitmentReliability: number;
19
+ sprintGoalHitRate: number;
20
+ carryoverRatio: number;
21
+ budgetUtilisation: number;
22
+ costPerPoint: number;
23
+ }
24
+ declare function scrumMetrics(state: WorkflowState): ScrumMetrics;
25
+
26
+ declare function scrumRoles(): Role[];
27
+
28
+ declare function scrumRules(): Rule[];
29
+
30
+ declare function scrumStages(config: ScrumConfig): Stage[];
31
+
32
+ interface DailyReport {
33
+ sprint: string | null;
34
+ goal: string | null;
35
+ byStatus: Record<ItemStatus, number>;
36
+ blockers: Array<{
37
+ item: string;
38
+ blocker: string;
39
+ owner: string;
40
+ reason: string;
41
+ }>;
42
+ spent: Required<Budget>;
43
+ remaining: Budget;
44
+ remainingWeight: number;
45
+ raisedLessons: number;
46
+ velocity: number | null;
47
+ forecast: "on-track" | "at-risk" | "unknown";
48
+ }
49
+ declare function dailyReport(state: WorkflowState): DailyReport;
50
+ declare function scrumCeremonies(methodology: () => Methodology): Record<string, Ceremony>;
51
+
52
+ declare const SCRUM_VOCABULARY: Record<CoreTerm, string>;
53
+ /** Advanced; used by ceremonies. */
54
+ declare function configOf(state: WorkflowState): ScrumConfig;
55
+ /** Advanced; used by ceremonies. Closes the open sprint and returns unfinished work (and its open questions) to the backlog. */
56
+ declare function closeSprint(state: WorkflowState, reason: "budget" | "review" | "cancel", now: string): WorkflowState;
57
+ declare function scrum(): Methodology<ScrumConfig>;
58
+
59
+ export { type DailyReport, SCRUM_VOCABULARY, type ScrumConfig, type ScrumMetrics, closeSprint, configOf, dailyReport, scrum, scrumCeremonies, scrumMetrics, scrumRoles, scrumRules, scrumStages, validateScrumConfig };
@@ -0,0 +1,59 @@
1
+ import { Budget, Policy, WorkflowState, Role, Rule, Stage, ItemStatus, Methodology, Ceremony, CoreTerm } from '../types.js';
2
+ export { c as canDo } from '../roles-BLBRKhUZ.js';
3
+
4
+ interface ScrumConfig {
5
+ sprintBudget: Budget;
6
+ productGoal: string;
7
+ definitionOfDone: Policy[];
8
+ refinementSharePct: number;
9
+ allowMidSprintAdd: "never" | "po-only" | "any";
10
+ inProgressWipLimit?: number;
11
+ }
12
+ declare function validateScrumConfig(raw: unknown): ScrumConfig;
13
+
14
+ interface ScrumMetrics {
15
+ velocity: number[];
16
+ meanVelocity: number;
17
+ burndown: number[];
18
+ commitmentReliability: number;
19
+ sprintGoalHitRate: number;
20
+ carryoverRatio: number;
21
+ budgetUtilisation: number;
22
+ costPerPoint: number;
23
+ }
24
+ declare function scrumMetrics(state: WorkflowState): ScrumMetrics;
25
+
26
+ declare function scrumRoles(): Role[];
27
+
28
+ declare function scrumRules(): Rule[];
29
+
30
+ declare function scrumStages(config: ScrumConfig): Stage[];
31
+
32
+ interface DailyReport {
33
+ sprint: string | null;
34
+ goal: string | null;
35
+ byStatus: Record<ItemStatus, number>;
36
+ blockers: Array<{
37
+ item: string;
38
+ blocker: string;
39
+ owner: string;
40
+ reason: string;
41
+ }>;
42
+ spent: Required<Budget>;
43
+ remaining: Budget;
44
+ remainingWeight: number;
45
+ raisedLessons: number;
46
+ velocity: number | null;
47
+ forecast: "on-track" | "at-risk" | "unknown";
48
+ }
49
+ declare function dailyReport(state: WorkflowState): DailyReport;
50
+ declare function scrumCeremonies(methodology: () => Methodology): Record<string, Ceremony>;
51
+
52
+ declare const SCRUM_VOCABULARY: Record<CoreTerm, string>;
53
+ /** Advanced; used by ceremonies. */
54
+ declare function configOf(state: WorkflowState): ScrumConfig;
55
+ /** Advanced; used by ceremonies. Closes the open sprint and returns unfinished work (and its open questions) to the backlog. */
56
+ declare function closeSprint(state: WorkflowState, reason: "budget" | "review" | "cancel", now: string): WorkflowState;
57
+ declare function scrum(): Methodology<ScrumConfig>;
58
+
59
+ export { type DailyReport, SCRUM_VOCABULARY, type ScrumConfig, type ScrumMetrics, closeSprint, configOf, dailyReport, scrum, scrumCeremonies, scrumMetrics, scrumRoles, scrumRules, scrumStages, validateScrumConfig };
@@ -0,0 +1,2 @@
1
+ export{h as SCRUM_VOCABULARY,j as closeSprint,i as configOf,a as dailyReport,k as scrum,b as scrumCeremonies,d as scrumMetrics,e as scrumRoles,f as scrumRules,g as scrumStages,c as validateScrumConfig}from'../chunk-IBRC36PE.mjs';import'../chunk-PD5FBDN7.mjs';export{n as canDo}from'../chunk-NQU5TH3A.mjs';import'../chunk-2FRRD6A3.mjs';//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
package/dist/types.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';require('./chunk-PO2SPQJP.cjs');//# sourceMappingURL=types.cjs.map
2
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.cjs"}