ex-workflow 0.4.0-stage → 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.
- package/CHANGELOG.md +58 -2
- package/README.md +68 -32
- package/dist/adapters/index.cjs +1 -1
- package/dist/adapters/index.mjs +1 -1
- package/dist/{roles-BLBRKhUZ.d.ts → budget-Cx63FX2K.d.ts} +9 -2
- package/dist/{roles-aneKYJ3Z.d.cts → budget-JyNKxP5N.d.cts} +9 -2
- package/dist/chunk-3KFQPSRX.mjs +2 -0
- package/dist/chunk-3KFQPSRX.mjs.map +1 -0
- package/dist/chunk-5PHK72VM.cjs +2 -0
- package/dist/chunk-5PHK72VM.cjs.map +1 -0
- package/dist/chunk-5TXYMLBF.mjs +3 -0
- package/dist/chunk-5TXYMLBF.mjs.map +1 -0
- package/dist/chunk-7IG6EQI4.mjs +6 -0
- package/dist/chunk-7IG6EQI4.mjs.map +1 -0
- package/dist/chunk-CYXVGHQM.cjs +2 -0
- package/dist/chunk-CYXVGHQM.cjs.map +1 -0
- package/dist/chunk-FKTCGQYB.cjs +2 -0
- package/dist/chunk-FKTCGQYB.cjs.map +1 -0
- package/dist/chunk-HIHMBMB5.cjs +2 -0
- package/dist/chunk-HIHMBMB5.cjs.map +1 -0
- package/dist/chunk-MQWMQ4PD.mjs +2 -0
- package/dist/chunk-MQWMQ4PD.mjs.map +1 -0
- package/dist/chunk-QDMEM62U.mjs +2 -0
- package/dist/chunk-QDMEM62U.mjs.map +1 -0
- package/dist/chunk-U3OXAO67.mjs +2 -0
- package/dist/chunk-U3OXAO67.mjs.map +1 -0
- package/dist/chunk-UZQV73X7.mjs +2 -0
- package/dist/chunk-UZQV73X7.mjs.map +1 -0
- package/dist/chunk-VXH2FAKV.cjs +2 -0
- package/dist/chunk-VXH2FAKV.cjs.map +1 -0
- package/dist/chunk-WOGK54HB.cjs +3 -0
- package/dist/chunk-WOGK54HB.cjs.map +1 -0
- package/dist/chunk-XMO2RCXB.cjs +2 -0
- package/dist/chunk-XMO2RCXB.cjs.map +1 -0
- package/dist/chunk-YBHHICTZ.mjs +2 -0
- package/dist/chunk-YBHHICTZ.mjs.map +1 -0
- package/dist/chunk-YJN4JEJU.cjs +2 -0
- package/dist/chunk-YJN4JEJU.cjs.map +1 -0
- package/dist/chunk-YRATJT7P.cjs +6 -0
- package/dist/chunk-YRATJT7P.cjs.map +1 -0
- package/dist/chunk-Z2G7DGDF.mjs +2 -0
- package/dist/chunk-Z2G7DGDF.mjs.map +1 -0
- package/dist/cli/bin.cjs +1 -1
- package/dist/cli/bin.mjs +1 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -12
- package/dist/index.d.ts +35 -12
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/kanban/index.cjs +1 -1
- package/dist/kanban/index.mjs +1 -1
- package/dist/schema/index.cjs +1 -1
- package/dist/schema/index.mjs +1 -1
- package/dist/scrum/index.cjs +1 -1
- package/dist/scrum/index.d.cts +18 -3
- package/dist/scrum/index.d.ts +18 -3
- package/dist/scrum/index.mjs +1 -1
- package/dist/types.d.cts +23 -1
- package/dist/types.d.ts +23 -1
- package/dist/waterfall/index.cjs +1 -1
- package/dist/waterfall/index.d.cts +4 -1
- package/dist/waterfall/index.d.ts +4 -1
- package/dist/waterfall/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-36M6OVUJ.mjs +0 -2
- package/dist/chunk-36M6OVUJ.mjs.map +0 -1
- package/dist/chunk-7KF5K3L7.cjs +0 -2
- package/dist/chunk-7KF5K3L7.cjs.map +0 -1
- package/dist/chunk-CWBH7H52.cjs +0 -2
- package/dist/chunk-CWBH7H52.cjs.map +0 -1
- package/dist/chunk-DXC2RSN5.cjs +0 -3
- package/dist/chunk-DXC2RSN5.cjs.map +0 -1
- package/dist/chunk-GATJZYTB.mjs +0 -2
- package/dist/chunk-GATJZYTB.mjs.map +0 -1
- package/dist/chunk-GFH2FEZH.mjs +0 -2
- package/dist/chunk-GFH2FEZH.mjs.map +0 -1
- package/dist/chunk-HHC5EZ54.cjs +0 -2
- package/dist/chunk-HHC5EZ54.cjs.map +0 -1
- package/dist/chunk-KSKEFYY7.cjs +0 -2
- package/dist/chunk-KSKEFYY7.cjs.map +0 -1
- package/dist/chunk-KUUIAKEJ.cjs +0 -2
- package/dist/chunk-KUUIAKEJ.cjs.map +0 -1
- package/dist/chunk-L2ZN6HEL.mjs +0 -2
- package/dist/chunk-L2ZN6HEL.mjs.map +0 -1
- package/dist/chunk-NDORREWR.mjs +0 -2
- package/dist/chunk-NDORREWR.mjs.map +0 -1
- package/dist/chunk-NZ2DIDOD.mjs +0 -2
- package/dist/chunk-NZ2DIDOD.mjs.map +0 -1
- package/dist/chunk-OHSQ52DW.mjs +0 -6
- package/dist/chunk-OHSQ52DW.mjs.map +0 -1
- package/dist/chunk-RSKZVOYC.cjs +0 -6
- package/dist/chunk-RSKZVOYC.cjs.map +0 -1
- package/dist/chunk-S22CPYXJ.mjs +0 -3
- package/dist/chunk-S22CPYXJ.mjs.map +0 -1
- package/dist/chunk-SHAPFMVP.mjs +0 -2
- package/dist/chunk-SHAPFMVP.mjs.map +0 -1
- package/dist/chunk-SJRRQZ3R.cjs +0 -2
- package/dist/chunk-SJRRQZ3R.cjs.map +0 -1
- package/dist/chunk-UM5X2JHB.cjs +0 -2
- package/dist/chunk-UM5X2JHB.cjs.map +0 -1
package/dist/types.d.cts
CHANGED
|
@@ -177,6 +177,8 @@ interface Accounting {
|
|
|
177
177
|
durationMs: number;
|
|
178
178
|
startedAt: string;
|
|
179
179
|
endedAt: string;
|
|
180
|
+
/** The tokens are a placeholder the host will correct with correctAccounting, not the host's usage figures. */
|
|
181
|
+
estimate?: boolean;
|
|
180
182
|
}
|
|
181
183
|
interface Event {
|
|
182
184
|
seq: number;
|
|
@@ -196,6 +198,7 @@ interface PendingHuman {
|
|
|
196
198
|
type LessonChange = {
|
|
197
199
|
kind: "agreement";
|
|
198
200
|
text: string;
|
|
201
|
+
replaces?: string;
|
|
199
202
|
} | {
|
|
200
203
|
kind: "dod";
|
|
201
204
|
policy: Policy;
|
|
@@ -310,6 +313,15 @@ interface Brief {
|
|
|
310
313
|
}>;
|
|
311
314
|
budgetRemaining: Budget;
|
|
312
315
|
gateAhead?: Gate;
|
|
316
|
+
/** for a question item: the escalating item's last handoff */
|
|
317
|
+
parent?: {
|
|
318
|
+
item: string;
|
|
319
|
+
role: string;
|
|
320
|
+
notes: string;
|
|
321
|
+
produced: Handoff["produced"];
|
|
322
|
+
open_questions: string[];
|
|
323
|
+
do_not: string[];
|
|
324
|
+
};
|
|
313
325
|
}
|
|
314
326
|
type CoreTerm = "backlog" | "item" | "stage" | "iteration" | "increment" | "ceremony" | "gate";
|
|
315
327
|
type CeremonyInput = {
|
|
@@ -336,6 +348,10 @@ interface PlannerOptions {
|
|
|
336
348
|
wipLimitOf?(stage: Stage, item: WorkItem): number | undefined;
|
|
337
349
|
/** Role id to dispatch a todo item to (e.g. the phase's deliverer); undefined = default (item.role, then reviewer/deliverer by capability). */
|
|
338
350
|
roleFor?(item: WorkItem): string | undefined;
|
|
351
|
+
/** How estimateTokens prices a candidate; default "per-weight". */
|
|
352
|
+
estimateMode?: "per-weight" | "per-call";
|
|
353
|
+
/** Tokens per weight unit when no accounting history exists; default 20000. PlanOptions.fallbackTokensPerWeight wins. */
|
|
354
|
+
fallbackTokensPerWeight?: number;
|
|
339
355
|
}
|
|
340
356
|
interface Methodology<C = unknown> {
|
|
341
357
|
name: MethodologyName;
|
|
@@ -356,11 +372,17 @@ interface Methodology<C = unknown> {
|
|
|
356
372
|
};
|
|
357
373
|
/** Called after complete(); lets the methodology react (e.g. close a sprint when the budget is gone). */
|
|
358
374
|
afterComplete?(state: WorkflowState, itemId: string, now: string): WorkflowState;
|
|
375
|
+
/** Config keys that cannot change after init (changeConfig refuses them). */
|
|
376
|
+
lockedConfigKeys?: string[];
|
|
377
|
+
/** Called by changeConfig after the new config is stored; keeps derived state (e.g. stage policies) in step. */
|
|
378
|
+
afterConfigChange?(state: WorkflowState, now: string): WorkflowState;
|
|
359
379
|
/** Methodology-specific status for hosts (e.g. cadences due); printed by `exwf status`. */
|
|
360
380
|
report?(state: WorkflowState): Record<string, unknown>;
|
|
361
381
|
/** Called by decide() after a pending entry is resolved; lets the methodology act on it (e.g. baseline a phase gate, apply a change-request decision). */
|
|
362
382
|
afterDecide?(state: WorkflowState, entry: PendingHuman, decision: "approve" | "reject", by: string, note: string, now: string): WorkflowState;
|
|
363
383
|
}
|
|
364
|
-
type ErrorCode = "unknown-item" | "duplicate-item" | "unknown-role" | "duplicate-role" | "unknown-stage" | "missing-capability" | "exclusive-capability" | "role-has-open-items" | "invalid-transition" | "policy-unmet" | "gate-unmet"
|
|
384
|
+
type ErrorCode = "unknown-item" | "duplicate-item" | "unknown-role" | "duplicate-role" | "unknown-stage" | "missing-capability" | "exclusive-capability" | "role-has-open-items" | "invalid-transition" | "policy-unmet" | "gate-unmet"
|
|
385
|
+
/** reserved: never thrown; kept for type compatibility */
|
|
386
|
+
| "conflict-of-interest" | "handoff-invalid" | "accounting-invalid" | "rule-violation" | "planner-error" | "no-op" | "unknown-pending" | "unknown-ceremony" | "state-version" | "config-invalid" | "budget-exhausted" | "invalid-input";
|
|
365
387
|
|
|
366
388
|
export type { Accounting, Action, ApplyResult, Baseline, Blocker, Brief, Budget, Capability, Ceremony, CeremonyInput, ClassOfService, CoreTerm, ErrorCode, Event, Evidence, Gate, GateRequirement, Handoff, ImpactAnalysis, ItemPatch, ItemStatus, ItemType, Iteration, Lesson, LessonChange, Methodology, MethodologyName, ModelTier, NewItem, PendingHuman, Phase, PlannerOptions, Policy, Produced, Role, Rule, Spent, Stage, Transition, Verdict, Violation, WorkItem, WorkflowState };
|
package/dist/types.d.ts
CHANGED
|
@@ -177,6 +177,8 @@ interface Accounting {
|
|
|
177
177
|
durationMs: number;
|
|
178
178
|
startedAt: string;
|
|
179
179
|
endedAt: string;
|
|
180
|
+
/** The tokens are a placeholder the host will correct with correctAccounting, not the host's usage figures. */
|
|
181
|
+
estimate?: boolean;
|
|
180
182
|
}
|
|
181
183
|
interface Event {
|
|
182
184
|
seq: number;
|
|
@@ -196,6 +198,7 @@ interface PendingHuman {
|
|
|
196
198
|
type LessonChange = {
|
|
197
199
|
kind: "agreement";
|
|
198
200
|
text: string;
|
|
201
|
+
replaces?: string;
|
|
199
202
|
} | {
|
|
200
203
|
kind: "dod";
|
|
201
204
|
policy: Policy;
|
|
@@ -310,6 +313,15 @@ interface Brief {
|
|
|
310
313
|
}>;
|
|
311
314
|
budgetRemaining: Budget;
|
|
312
315
|
gateAhead?: Gate;
|
|
316
|
+
/** for a question item: the escalating item's last handoff */
|
|
317
|
+
parent?: {
|
|
318
|
+
item: string;
|
|
319
|
+
role: string;
|
|
320
|
+
notes: string;
|
|
321
|
+
produced: Handoff["produced"];
|
|
322
|
+
open_questions: string[];
|
|
323
|
+
do_not: string[];
|
|
324
|
+
};
|
|
313
325
|
}
|
|
314
326
|
type CoreTerm = "backlog" | "item" | "stage" | "iteration" | "increment" | "ceremony" | "gate";
|
|
315
327
|
type CeremonyInput = {
|
|
@@ -336,6 +348,10 @@ interface PlannerOptions {
|
|
|
336
348
|
wipLimitOf?(stage: Stage, item: WorkItem): number | undefined;
|
|
337
349
|
/** Role id to dispatch a todo item to (e.g. the phase's deliverer); undefined = default (item.role, then reviewer/deliverer by capability). */
|
|
338
350
|
roleFor?(item: WorkItem): string | undefined;
|
|
351
|
+
/** How estimateTokens prices a candidate; default "per-weight". */
|
|
352
|
+
estimateMode?: "per-weight" | "per-call";
|
|
353
|
+
/** Tokens per weight unit when no accounting history exists; default 20000. PlanOptions.fallbackTokensPerWeight wins. */
|
|
354
|
+
fallbackTokensPerWeight?: number;
|
|
339
355
|
}
|
|
340
356
|
interface Methodology<C = unknown> {
|
|
341
357
|
name: MethodologyName;
|
|
@@ -356,11 +372,17 @@ interface Methodology<C = unknown> {
|
|
|
356
372
|
};
|
|
357
373
|
/** Called after complete(); lets the methodology react (e.g. close a sprint when the budget is gone). */
|
|
358
374
|
afterComplete?(state: WorkflowState, itemId: string, now: string): WorkflowState;
|
|
375
|
+
/** Config keys that cannot change after init (changeConfig refuses them). */
|
|
376
|
+
lockedConfigKeys?: string[];
|
|
377
|
+
/** Called by changeConfig after the new config is stored; keeps derived state (e.g. stage policies) in step. */
|
|
378
|
+
afterConfigChange?(state: WorkflowState, now: string): WorkflowState;
|
|
359
379
|
/** Methodology-specific status for hosts (e.g. cadences due); printed by `exwf status`. */
|
|
360
380
|
report?(state: WorkflowState): Record<string, unknown>;
|
|
361
381
|
/** Called by decide() after a pending entry is resolved; lets the methodology act on it (e.g. baseline a phase gate, apply a change-request decision). */
|
|
362
382
|
afterDecide?(state: WorkflowState, entry: PendingHuman, decision: "approve" | "reject", by: string, note: string, now: string): WorkflowState;
|
|
363
383
|
}
|
|
364
|
-
type ErrorCode = "unknown-item" | "duplicate-item" | "unknown-role" | "duplicate-role" | "unknown-stage" | "missing-capability" | "exclusive-capability" | "role-has-open-items" | "invalid-transition" | "policy-unmet" | "gate-unmet"
|
|
384
|
+
type ErrorCode = "unknown-item" | "duplicate-item" | "unknown-role" | "duplicate-role" | "unknown-stage" | "missing-capability" | "exclusive-capability" | "role-has-open-items" | "invalid-transition" | "policy-unmet" | "gate-unmet"
|
|
385
|
+
/** reserved: never thrown; kept for type compatibility */
|
|
386
|
+
| "conflict-of-interest" | "handoff-invalid" | "accounting-invalid" | "rule-violation" | "planner-error" | "no-op" | "unknown-pending" | "unknown-ceremony" | "state-version" | "config-invalid" | "budget-exhausted" | "invalid-input";
|
|
365
387
|
|
|
366
388
|
export type { Accounting, Action, ApplyResult, Baseline, Blocker, Brief, Budget, Capability, Ceremony, CeremonyInput, ClassOfService, CoreTerm, ErrorCode, Event, Evidence, Gate, GateRequirement, Handoff, ImpactAnalysis, ItemPatch, ItemStatus, ItemType, Iteration, Lesson, LessonChange, Methodology, MethodologyName, ModelTier, NewItem, PendingHuman, Phase, PlannerOptions, Policy, Produced, Role, Rule, Spent, Stage, Transition, Verdict, Violation, WorkItem, WorkflowState };
|
package/dist/waterfall/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkFKTCGQYB_cjs=require('../chunk-FKTCGQYB.cjs');require('../chunk-VXH2FAKV.cjs'),require('../chunk-XMO2RCXB.cjs'),require('../chunk-S3BXVHO7.cjs');Object.defineProperty(exports,"CHANGE_GATE",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.e}});Object.defineProperty(exports,"DEFAULT_DELIVERABLES",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.b}});Object.defineProperty(exports,"DEFAULT_DELIVER_BY",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.c}});Object.defineProperty(exports,"DEFAULT_PHASE_IDS",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.a}});Object.defineProperty(exports,"DONE",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.k}});Object.defineProperty(exports,"GATE_ID",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.d}});Object.defineProperty(exports,"REVIEW",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.j}});Object.defineProperty(exports,"WATERFALL_VOCABULARY",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.K}});Object.defineProperty(exports,"WORK",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.i}});Object.defineProperty(exports,"approveChange",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.z}});Object.defineProperty(exports,"baselinePhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.x}});Object.defineProperty(exports,"configOf",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.g}});Object.defineProperty(exports,"currentPhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.s}});Object.defineProperty(exports,"defaultPhases",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.f}});Object.defineProperty(exports,"deliverRoleFor",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.L}});Object.defineProperty(exports,"getPhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.o}});Object.defineProperty(exports,"isFrozen",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.t}});Object.defineProperty(exports,"itemsInPhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.q}});Object.defineProperty(exports,"lastToPhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.w}});Object.defineProperty(exports,"missingDeliverables",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.v}});Object.defineProperty(exports,"missingTraces",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.C}});Object.defineProperty(exports,"openPhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.r}});Object.defineProperty(exports,"phaseIndex",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.n}});Object.defineProperty(exports,"phaseOf",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.p}});Object.defineProperty(exports,"phaseReport",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.M}});Object.defineProperty(exports,"phasesOf",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.l}});Object.defineProperty(exports,"producedKinds",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.u}});Object.defineProperty(exports,"rejectChange",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.A}});Object.defineProperty(exports,"reopenPhases",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.y}});Object.defineProperty(exports,"traceabilityMatrix",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.B}});Object.defineProperty(exports,"validateWaterfallConfig",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.h}});Object.defineProperty(exports,"wantPhase",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.D}});Object.defineProperty(exports,"waterfall",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.N}});Object.defineProperty(exports,"waterfallAfterDecide",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.F}});Object.defineProperty(exports,"waterfallCeremonies",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.E}});Object.defineProperty(exports,"waterfallMetrics",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.G}});Object.defineProperty(exports,"waterfallRoles",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.H}});Object.defineProperty(exports,"waterfallRules",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.I}});Object.defineProperty(exports,"waterfallStages",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.J}});Object.defineProperty(exports,"withPhases",{enumerable:true,get:function(){return chunkFKTCGQYB_cjs.m}});//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -21,6 +21,8 @@ interface WaterfallConfig {
|
|
|
21
21
|
to: string[];
|
|
22
22
|
};
|
|
23
23
|
humanGates: "all" | string[];
|
|
24
|
+
/** tokens per weight unit when there is no accounting history (default 20000, as Scrum) */
|
|
25
|
+
fallbackTokensPerWeight?: number;
|
|
24
26
|
}
|
|
25
27
|
declare const DEFAULT_PHASE_IDS: readonly string[];
|
|
26
28
|
declare const DEFAULT_DELIVERABLES: Record<string, string[]>;
|
|
@@ -76,7 +78,7 @@ interface WaterfallMetrics {
|
|
|
76
78
|
reworkWeight: number;
|
|
77
79
|
phasesReopened: number;
|
|
78
80
|
}
|
|
79
|
-
/** Phase metrics replayed from events
|
|
81
|
+
/** Phase metrics: membership and spend replayed from events (item.added, item.completed); requirement coverage read live from the traceability matrix. */
|
|
80
82
|
declare function waterfallMetrics(state: WorkflowState): WaterfallMetrics;
|
|
81
83
|
|
|
82
84
|
declare function approveChange(state: WorkflowState, changeId: string, by: string, note: string, now: string): WorkflowState;
|
|
@@ -131,6 +133,7 @@ interface PhaseReportRow {
|
|
|
131
133
|
items: number;
|
|
132
134
|
done: number;
|
|
133
135
|
missingDeliverables: string[];
|
|
136
|
+
missingTraces: string[];
|
|
134
137
|
readyForGate: boolean;
|
|
135
138
|
}
|
|
136
139
|
interface PhaseReport {
|
|
@@ -21,6 +21,8 @@ interface WaterfallConfig {
|
|
|
21
21
|
to: string[];
|
|
22
22
|
};
|
|
23
23
|
humanGates: "all" | string[];
|
|
24
|
+
/** tokens per weight unit when there is no accounting history (default 20000, as Scrum) */
|
|
25
|
+
fallbackTokensPerWeight?: number;
|
|
24
26
|
}
|
|
25
27
|
declare const DEFAULT_PHASE_IDS: readonly string[];
|
|
26
28
|
declare const DEFAULT_DELIVERABLES: Record<string, string[]>;
|
|
@@ -76,7 +78,7 @@ interface WaterfallMetrics {
|
|
|
76
78
|
reworkWeight: number;
|
|
77
79
|
phasesReopened: number;
|
|
78
80
|
}
|
|
79
|
-
/** Phase metrics replayed from events
|
|
81
|
+
/** Phase metrics: membership and spend replayed from events (item.added, item.completed); requirement coverage read live from the traceability matrix. */
|
|
80
82
|
declare function waterfallMetrics(state: WorkflowState): WaterfallMetrics;
|
|
81
83
|
|
|
82
84
|
declare function approveChange(state: WorkflowState, changeId: string, by: string, note: string, now: string): WorkflowState;
|
|
@@ -131,6 +133,7 @@ interface PhaseReportRow {
|
|
|
131
133
|
items: number;
|
|
132
134
|
done: number;
|
|
133
135
|
missingDeliverables: string[];
|
|
136
|
+
missingTraces: string[];
|
|
134
137
|
readyForGate: boolean;
|
|
135
138
|
}
|
|
136
139
|
interface PhaseReport {
|
package/dist/waterfall/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{e as CHANGE_GATE,b as DEFAULT_DELIVERABLES,c as DEFAULT_DELIVER_BY,a as DEFAULT_PHASE_IDS,k as DONE,d as GATE_ID,j as REVIEW,K as WATERFALL_VOCABULARY,i as WORK,z as approveChange,x as baselinePhase,g as configOf,s as currentPhase,f as defaultPhases,L as deliverRoleFor,o as getPhase,t as isFrozen,q as itemsInPhase,w as lastToPhase,v as missingDeliverables,C as missingTraces,r as openPhase,n as phaseIndex,p as phaseOf,M as phaseReport,l as phasesOf,u as producedKinds,A as rejectChange,y as reopenPhases,B as traceabilityMatrix,h as validateWaterfallConfig,D as wantPhase,N as waterfall,F as waterfallAfterDecide,E as waterfallCeremonies,G as waterfallMetrics,H as waterfallRoles,I as waterfallRules,J as waterfallStages,m as withPhases}from'../chunk-
|
|
1
|
+
export{e as CHANGE_GATE,b as DEFAULT_DELIVERABLES,c as DEFAULT_DELIVER_BY,a as DEFAULT_PHASE_IDS,k as DONE,d as GATE_ID,j as REVIEW,K as WATERFALL_VOCABULARY,i as WORK,z as approveChange,x as baselinePhase,g as configOf,s as currentPhase,f as defaultPhases,L as deliverRoleFor,o as getPhase,t as isFrozen,q as itemsInPhase,w as lastToPhase,v as missingDeliverables,C as missingTraces,r as openPhase,n as phaseIndex,p as phaseOf,M as phaseReport,l as phasesOf,u as producedKinds,A as rejectChange,y as reopenPhases,B as traceabilityMatrix,h as validateWaterfallConfig,D as wantPhase,N as waterfall,F as waterfallAfterDecide,E as waterfallCeremonies,G as waterfallMetrics,H as waterfallRoles,I as waterfallRules,J as waterfallStages,m as withPhases}from'../chunk-3KFQPSRX.mjs';import'../chunk-U3OXAO67.mjs';import'../chunk-YBHHICTZ.mjs';import'../chunk-2FRRD6A3.mjs';//# sourceMappingURL=index.mjs.map
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
package/dist/chunk-36M6OVUJ.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import {c as c$1,b as b$2}from'./chunk-NZ2DIDOD.mjs';import {k as k$1}from'./chunk-L2ZN6HEL.mjs';import {I}from'./chunk-GATJZYTB.mjs';import {N as N$1}from'./chunk-NDORREWR.mjs';import {f as f$1}from'./chunk-GFH2FEZH.mjs';import {f,L,d as d$1,J,u,M,w,v,N}from'./chunk-SHAPFMVP.mjs';import {c,e,d,g as g$1,f as f$2,b as b$3}from'./chunk-OHSQ52DW.mjs';import {b,e as e$1,h as h$1,g as g$2,f as f$3}from'./chunk-S22CPYXJ.mjs';import {a,b as b$1}from'./chunk-2FRRD6A3.mjs';import {stat,readFile}from'fs/promises';import x from'path';var O={scrum:k$1,kanban:I,waterfall:N$1},g=["exwf init <scrum|kanban|waterfall> --config <file> [--roles <file>]","exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]","exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"];function K(r){let t=[],d={};for(let i=0;i<r.length;i++){let y=r[i];if(y.startsWith("--")){let e=y.slice(2),m=r[i+1];m!==void 0&&!m.startsWith("--")?(d[e]=m,i++):d[e]="true";}else t.push(y);}return {positional:t,flags:d}}async function k(r){try{return JSON.parse(await readFile(r,"utf8"))}catch(t){return b$1("invalid-input",`cannot read JSON from ${r}: ${t.message}`,"check the path and that the file is valid JSON")}}function h(r){let t=Object.hasOwn(O,r.methodology)?O[r.methodology]:void 0;return t||b$1("config-invalid",`methodology "${r.methodology}" is not available in this build`,`available: ${Object.keys(O).join(", ")}`),t()}function S(r,t){let d=Number(r[t]);return Number.isFinite(d)||b$1("invalid-input",`--${t} must be a number (got ${JSON.stringify(r[t])})`,`pass --${t} <n>`),d}var Y=new Set(["init","add","edit","next","complete","ceremony","decide"]);async function gt(r,t){let[d,i]=K(r).positional,y=d!==void 0&&(Y.has(d)||d==="role"&&i==="add");try{return y?await c(t,()=>z(r,t)):await z(r,t)}catch(e){if(e instanceof a)return {exit:1,out:{ok:false,error:e.toJSON()}};throw e}}async function z(r,t){let{positional:d$2,flags:i}=K(r),[y,...e$2]=d$2,m=i.by??"human",u$1=new Date().toISOString();switch(y){case "init":{let[o]=e$2,n=o&&Object.hasOwn(O,o)?O[o]:void 0;if(!n||!i.config)return {exit:2,out:{ok:false,usage:g}};try{await stat(b$3(t)),b$1("invalid-input",`${b$3(t)} already exists`,"delete .workflow/state.json to start over");}catch(f){if(f instanceof a||f.code!=="ENOENT")throw f}let s=await k(x.resolve(t,i.config)),a$1=i.roles?await k(x.resolve(t,i.roles)):void 0;if(a$1!==void 0){Array.isArray(a$1)||b$1("invalid-input",`roles file ${i.roles} must contain an array of role manifests`,"wrap the manifests in [ ... ]");for(let f of a$1)b(e$1,f,`roles file ${i.roles}`);}let c=N(a$1?{methodology:n(),config:s,roles:a$1,by:m,now:u$1}:{methodology:n(),config:s,by:m,now:u$1});return await d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,state:{methodology:c.state.methodology,stages:c.state.stages.map(f=>f.id),roles:Object.keys(c.state.roles)}}}}case "add":{if(!e$2[0])return {exit:2,out:{ok:false,usage:g}};let o=await e(t),n=await k(x.resolve(t,e$2[0]));b(f$3,n,`item file ${e$2[0]}`);let s=M(o,h(o),{type:"item.add",by:m,payload:{item:n}},a=>v(a,n,m,u$1));return await d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,item:u(s.state,n.id)}}}case "edit":{if(!e$2[0]||!e$2[1])return {exit:2,out:{ok:false,usage:g}};let o=await e(t),n=e$2[0],s=await k(x.resolve(t,e$2[1]));b(g$2,s,`patch file ${e$2[1]}`);let a=M(o,h(o),{type:"item.edit",by:m,payload:{id:n,patch:s}},c=>w(c,n,s,m,u$1));return await d(t,a.state),{exit:0,out:{ok:true,warnings:a.warnings,item:u(a.state,n)}}}case "next":{let o=await e(t),n=i.max?{max:S(i,"max"),now:u$1}:{now:u$1},s=b$2(o,h(o),n);await d(t,s.state);for(let a of s.briefs)await f$2(t,a);return {exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!e$2[0]||!e$2[1])return {exit:2,out:{ok:false,usage:g}};let o=await e(t),n=await k(x.resolve(t,e$2[1]));b(h$1,n,`handoff file ${e$2[1]}`),n.item!==e$2[0]&&b$1("handoff-invalid",`handoff.item "${n.item}" differs from the command's item "${e$2[0]}"`,"make them match");let s=i.role??n.role,a=S(i,"duration-ms"),c={item:e$2[0],role:s,model:i.model??"",tokensIn:S(i,"tokens-in"),tokensOut:S(i,"tokens-out"),durationMs:a,startedAt:new Date(Date.parse(u$1)-a).toISOString(),endedAt:u$1},f=c$1(o,h(o),{...n,role:s},c,u$1);return await d(t,f.state),await g$1(t,n,f.state.events.length),{exit:0,out:{ok:true,warnings:f.warnings,item:u(f.state,e$2[0])}}}case "ceremony":{if(!e$2[0])return {exit:2,out:{ok:false,usage:g}};let o=await e(t),n=h(o),s=Object.hasOwn(n.ceremonies,e$2[0])?n.ceremonies[e$2[0]]:void 0;s||b$1("unknown-ceremony",`"${e$2[0]}" is not a ${n.name} ceremony`,`available: ${Object.keys(n.ceremonies).join(", ")}`);let a=e$2[1]?await k(x.resolve(t,e$2[1])):{},c=s(o,{...a,by:m,now:u$1});return await d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,lastEvent:d$1(c.state)}}}case "decide":{if(!e$2[0]||e$2[1]!=="approve"&&e$2[1]!=="reject")return {exit:2,out:{ok:false,usage:g}};let o=await e(t),n=o.pending.find(a=>a.id===e$2[0]),s=J(o,e$2[0],e$2[1],m,i.note??"",u$1,h(o));return await d(t,s),{exit:0,out:{ok:true,item:n?.item?u(s,n.item):null}}}case "status":{let o=await e(t),n=h(o),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let a of Object.values(o.items))s[a.status]+=1;return {exit:0,out:{ok:true,methodology:o.methodology,openIteration:f$1(o)??null,counts:s,pending:o.pending,lastEvent:d$1(o),report:n.report?n.report(o):null}}}case "board":{let o=await e(t);return {exit:0,out:{ok:true,columns:o.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(o.items).filter(a=>a.stage===s.id&&a.status!=="dropped").map(a=>({id:a.id,title:a.title,status:a.status,role:a.role??null,age:a.transitions.length?Date.parse(u$1)-Date.parse(a.transitions[a.transitions.length-1].at):null}))}))}}}case "metrics":{let o=await e(t);return {exit:0,out:{ok:true,metrics:h(o).metrics(o)}}}case "pending":return {exit:0,out:{ok:true,pending:(await e(t)).pending}};case "lessons":return {exit:0,out:{ok:true,lessons:(await e(t)).lessons}};case "validate":{if(!e$2[0])return {exit:2,out:{ok:false,usage:g}};let o=await e(t),n=await k(x.resolve(t,e$2[0]));return {exit:0,out:{ok:true,violations:L(o,h(o),n)}}}case "role":{let o=await e(t);if(e$2[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(o.roles),detail:o.roles}};if(e$2[0]==="add"&&e$2[1]){let n=await k(x.resolve(t,e$2[1]));b(e$1,n,`role manifest ${e$2[1]}`);let s=f(o,n,m,u$1);return await d(t,s),{exit:0,out:{ok:true,roles:Object.keys(s.roles)}}}return {exit:2,out:{ok:false,usage:g}}}default:return {exit:2,out:{ok:false,usage:g}}}}export{g as a,K as b,gt as c};//# sourceMappingURL=chunk-36M6OVUJ.mjs.map
|
|
2
|
-
//# sourceMappingURL=chunk-36M6OVUJ.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","waterfall","USAGE","parseArgs","argv","positional","flags","a","key","val","readJson","file","readFile","e","fail","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","writes","withStateLock","execute","WorkflowError","rest","by","now","name","stat","statePath","config","path","roles","r","assertValid","roleSchema","res","init","saveState","s","loadState","item","newItemSchema","applyAction","addItem","getItem","id","patch","itemPatchSchema","editItem","opts","next","b","saveBrief","handoff","handoffSchema","role","durationMs","acc","complete","saveHandoff","m","c","input","lastEvent","entry","p","s2","decide","counts","i","openIteration","st","action","validateAction","manifest","registerRole"],"mappings":"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","file":"chunk-36M6OVUJ.mjs","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n loadState,\n saveBrief,\n saveHandoff,\n saveState,\n statePath,\n withStateLock,\n} from \"../adapters/file.ts\";\nimport { next as planNext } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { applyAction, init, validateAction } from \"../methodology.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { registerRole } from \"../roles.ts\";\nimport {\n assertValid,\n handoffSchema,\n itemPatchSchema,\n newItemSchema,\n roleSchema,\n} from \"../schema/index.ts\";\nimport { lastEvent } from \"../state.ts\";\nimport { scrum } from \"../scrum/index.ts\";\nimport { kanban } from \"../kanban/index.ts\";\nimport { waterfall } from \"../waterfall/index.ts\";\nimport type {\n Accounting,\n Action,\n Handoff,\n ItemStatus,\n Methodology,\n NewItem,\n Role,\n WorkflowState,\n} from \"../types.ts\";\n\nconst METHODOLOGIES: Record<string, () => Methodology> = {\n scrum: scrum as () => Methodology,\n kanban: kanban as () => Methodology,\n waterfall: waterfall as () => Methodology,\n};\n\nexport const USAGE = [\n \"exwf init <scrum|kanban|waterfall> --config <file> [--roles <file>]\",\n \"exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]\",\n \"exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf status | board | metrics | pending | lessons\",\n \"exwf validate <action.json> exwf role add <manifest.json> | role list\",\n];\n\nexport interface Parsed {\n positional: string[];\n flags: Record<string, string>;\n}\nexport function parseArgs(argv: string[]): Parsed {\n const positional: string[] = [];\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n const val = argv[i + 1];\n if (val !== undefined && !val.startsWith(\"--\")) {\n flags[key] = val;\n i++;\n } else flags[key] = \"true\";\n } else positional.push(a);\n }\n return { positional, flags };\n}\n\nasync function readJson<T>(file: string): Promise<T> {\n try {\n return JSON.parse(await readFile(file, \"utf8\")) as T;\n } catch (e) {\n return fail(\n \"invalid-input\",\n `cannot read JSON from ${file}: ${(e as Error).message}`,\n \"check the path and that the file is valid JSON\",\n );\n }\n}\n\nfunction methodologyOf(state: WorkflowState): Methodology {\n const f = Object.hasOwn(METHODOLOGIES, state.methodology)\n ? METHODOLOGIES[state.methodology]\n : undefined;\n if (!f)\n fail(\n \"config-invalid\",\n `methodology \"${state.methodology}\" is not available in this build`,\n `available: ${Object.keys(METHODOLOGIES).join(\", \")}`,\n );\n return f();\n}\n\nfunction num(flags: Record<string, string>, key: string): number {\n const v = Number(flags[key]);\n if (!Number.isFinite(v))\n fail(\n \"invalid-input\",\n `--${key} must be a number (got ${JSON.stringify(flags[key])})`,\n `pass --${key} <n>`,\n );\n return v;\n}\n\nexport interface CommandResult {\n exit: 0 | 1 | 2;\n out: unknown;\n}\n\n/** Commands that load, change and save the state: they run under .workflow/state.lock. */\nconst WRITERS = new Set([\"init\", \"add\", \"edit\", \"next\", \"complete\", \"ceremony\", \"decide\"]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes = cmd !== undefined && (WRITERS.has(cmd) || (cmd === \"role\" && sub === \"add\"));\n try {\n return writes ? await withStateLock(cwd, () => execute(argv, cwd)) : await execute(argv, cwd);\n } catch (e) {\n if (e instanceof WorkflowError) return { exit: 1, out: { ok: false, error: e.toJSON() } };\n throw e;\n }\n}\n\nasync function execute(argv: string[], cwd: string): Promise<CommandResult> {\n const { positional, flags } = parseArgs(argv);\n const [cmd, ...rest] = positional;\n const by = flags[\"by\"] ?? \"human\";\n const now = new Date().toISOString();\n switch (cmd) {\n case \"init\": {\n const [name] = rest;\n const f = name && Object.hasOwn(METHODOLOGIES, name) ? METHODOLOGIES[name] : undefined;\n if (!f || !flags[\"config\"]) return { exit: 2, out: { ok: false, usage: USAGE } };\n try {\n await stat(statePath(cwd));\n fail(\n \"invalid-input\",\n `${statePath(cwd)} already exists`,\n \"delete .workflow/state.json to start over\",\n );\n } catch (e) {\n if (e instanceof WorkflowError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n }\n const config = await readJson<unknown>(path.resolve(cwd, flags[\"config\"]));\n const roles = flags[\"roles\"]\n ? await readJson<Role[]>(path.resolve(cwd, flags[\"roles\"]))\n : undefined;\n if (roles !== undefined) {\n if (!Array.isArray(roles))\n fail(\n \"invalid-input\",\n `roles file ${flags[\"roles\"]} must contain an array of role manifests`,\n \"wrap the manifests in [ ... ]\",\n );\n for (const r of roles) assertValid(roleSchema, r, `roles file ${flags[\"roles\"]}`);\n }\n const res = init(\n roles\n ? { methodology: f(), config, roles, by, now }\n : { methodology: f(), config, by, now },\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n state: {\n methodology: res.state.methodology,\n stages: res.state.stages.map((s) => s.id),\n roles: Object.keys(res.state.roles),\n },\n },\n };\n }\n case \"add\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const item = await readJson<NewItem>(path.resolve(cwd, rest[0]));\n assertValid(newItemSchema, item, `item file ${rest[0]}`);\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"item.add\", by, payload: { item } },\n (s) => addItem(s, item, by, now),\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, item.id) },\n };\n }\n case \"edit\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const id = rest[0];\n const patch = await readJson<ItemPatch>(path.resolve(cwd, rest[1]));\n assertValid(itemPatchSchema, patch, `patch file ${rest[1]}`);\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"item.edit\", by, payload: { id, patch } },\n (s) => editItem(s, id, patch, by, now),\n );\n await saveState(cwd, res.state);\n return { exit: 0, out: { ok: true, warnings: res.warnings, item: getItem(res.state, id) } };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts = flags[\"max\"] ? { max: num(flags, \"max\"), now } : { now };\n const res = planNext(state, methodologyOf(state), opts);\n await saveState(cwd, res.state);\n for (const b of res.briefs) await saveBrief(cwd, b);\n return {\n exit: 0,\n out: { ok: true, reason: res.reason ?? null, skipped: res.skipped, briefs: res.briefs },\n };\n }\n case \"complete\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const handoff = await readJson<Handoff>(path.resolve(cwd, rest[1]));\n assertValid(handoffSchema, handoff, `handoff file ${rest[1]}`);\n if (handoff.item !== rest[0])\n fail(\n \"handoff-invalid\",\n `handoff.item \"${handoff.item}\" differs from the command's item \"${rest[0]}\"`,\n \"make them match\",\n );\n const role = flags[\"role\"] ?? handoff.role;\n const durationMs = num(flags, \"duration-ms\");\n const acc: Accounting = {\n item: rest[0],\n role,\n model: flags[\"model\"] ?? \"\",\n tokensIn: num(flags, \"tokens-in\"),\n tokensOut: num(flags, \"tokens-out\"),\n durationMs,\n startedAt: new Date(Date.parse(now) - durationMs).toISOString(),\n endedAt: now,\n };\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n await saveState(cwd, res.state);\n await saveHandoff(cwd, handoff, res.state.events.length);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, rest[0]) },\n };\n }\n case \"ceremony\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const c = Object.hasOwn(m.ceremonies, rest[0]) ? m.ceremonies[rest[0]] : undefined;\n if (!c)\n fail(\n \"unknown-ceremony\",\n `\"${rest[0]}\" is not a ${m.name} ceremony`,\n `available: ${Object.keys(m.ceremonies).join(\", \")}`,\n );\n const input = rest[1]\n ? await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]))\n : {};\n const res = c(state, { ...input, by, now });\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, lastEvent: lastEvent(res.state) },\n };\n }\n case \"decide\": {\n if (!rest[0] || (rest[1] !== \"approve\" && rest[1] !== \"reject\"))\n return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const entry = state.pending.find((p) => p.id === rest[0]);\n const s2 = decide(\n state,\n rest[0],\n rest[1],\n by,\n flags[\"note\"] ?? \"\",\n now,\n methodologyOf(state),\n );\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null } };\n }\n case \"status\": {\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const counts: Record<ItemStatus, number> = {\n todo: 0,\n in_progress: 0,\n blocked: 0,\n review: 0,\n awaiting_human: 0,\n done: 0,\n dropped: 0,\n };\n for (const i of Object.values(state.items)) counts[i.status] += 1;\n return {\n exit: 0,\n out: {\n ok: true,\n methodology: state.methodology,\n openIteration: openIteration(state) ?? null,\n counts,\n pending: state.pending,\n lastEvent: lastEvent(state),\n report: m.report ? m.report(state) : null,\n },\n };\n }\n case \"board\": {\n const state = await loadState(cwd);\n const columns = state.stages.map((st) => ({\n stage: st.id,\n wipLimit: st.wipLimit ?? null,\n items: Object.values(state.items)\n .filter((i) => i.stage === st.id && i.status !== \"dropped\")\n .map((i) => ({\n id: i.id,\n title: i.title,\n status: i.status,\n role: i.role ?? null,\n age: i.transitions.length\n ? Date.parse(now) - Date.parse(i.transitions[i.transitions.length - 1]!.at)\n : null,\n })),\n }));\n return { exit: 0, out: { ok: true, columns } };\n }\n case \"metrics\": {\n const state = await loadState(cwd);\n return { exit: 0, out: { ok: true, metrics: methodologyOf(state).metrics(state) } };\n }\n case \"pending\":\n return { exit: 0, out: { ok: true, pending: (await loadState(cwd)).pending } };\n case \"lessons\":\n return { exit: 0, out: { ok: true, lessons: (await loadState(cwd)).lessons } };\n case \"validate\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const action = await readJson<Action>(path.resolve(cwd, rest[0]));\n return {\n exit: 0,\n out: { ok: true, violations: validateAction(state, methodologyOf(state), action) },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: { ok: true, roles: Object.keys(state.roles), detail: state.roles },\n };\n if (rest[0] === \"add\" && rest[1]) {\n const manifest = await readJson<Role>(path.resolve(cwd, rest[1]));\n assertValid(roleSchema, manifest, `role manifest ${rest[1]}`);\n const s2 = registerRole(state, manifest, by, now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, roles: Object.keys(s2.roles) } };\n }\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n default:\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n}\n"]}
|
package/dist/chunk-7KF5K3L7.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
'use strict';var chunkCWBH7H52_cjs=require('./chunk-CWBH7H52.cjs'),chunkSJRRQZ3R_cjs=require('./chunk-SJRRQZ3R.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exsorted=require('exsorted');var ue=["todo","in_progress","blocked","review","awaiting_human","done","dropped"];function fe(o){let t=o.events.filter(r=>r.type==="sprint.closed"&&r.payload.reason!=="cancel");return t.length===0?null:t.reduce((r,i)=>r+i.payload.doneWeight,0)/t.length}function ie(o){let t=chunkCWBH7H52_cjs.f(o),r=Object.fromEntries(ue.map(n=>[n,0])),i=[],y=0;for(let n of t?.committed??[]){let e=o.items[n];if(e){r[e.status]+=1,e.status!=="done"&&(y+=e.weight??0);for(let a of e.blockers)a.clearedAt||i.push({item:n,blocker:a.id,owner:a.owner,reason:a.reason});}}let u=t?.spent??{tokens:0,turns:0,wallclockMs:0},g=t?chunkCWBH7H52_cjs.c(t.budget,t.spent):{},m=fe(o),h="unknown";if(t&&m!==null&&t.budget.tokens){let n=(g.tokens??0)/t.budget.tokens;h=y<=m*n?"on-track":"at-risk";}let s=o.lessons.filter(n=>n.status==="raised").length;return {sprint:t?.id??null,goal:t?.goal??null,byStatus:r,blockers:i,spent:u,remaining:g,remainingWeight:y,raisedLessons:s,velocity:m,forecast:h}}function V(o){for(let t=o.iterations.length-1;t>=0;t--){let r=o.iterations[t];if(r.endedAt!==void 0)return r}}function F(o,t){return o.events.find(r=>r.type==="sprint.closed"&&r.payload.id===t)?.seq??Number.POSITIVE_INFINITY}function ge(o){let t=new Set(V(o)?.carryover??[]),r=Object.values(o.items).filter(i=>i.stage==="backlog"&&i.status==="todo"&&i.type!=="question");return exsorted.timSort([...r],(i,y)=>{let u=t.has(i.id)?1:0,g=t.has(y.id)?1:0;return u!==g?g-u:(y.priority??0)-(i.priority??0)})}function ne(o,t){let r=chunkSJRRQZ3R_cjs.u(o,t);(r.stage!=="backlog"||r.status!=="todo")&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${t}" is not in the Product Backlog (${r.stage}/${r.status})`,"only backlog items can be committed",{items:[t]}),chunkSJRRQZ3R_cjs.E(o,r,chunkSJRRQZ3R_cjs.p(o,"backlog").exitPolicy,"enter the Sprint Backlog");}function oe(o,t,r,i,y){let u=o;for(let g of Object.values(o.items))g.type!=="question"||g.parent===void 0||!t.includes(g.parent)||g.status==="done"||g.status==="dropped"||((g.stage!=="sprint"||g.status!=="todo")&&(u=chunkSJRRQZ3R_cjs.x(u,g.id,{stage:"sprint",status:"todo"},i,y)),u=chunkSJRRQZ3R_cjs.s(u,g.id,m=>({...m,iteration:r})));return u}function re(o,t){return {...o,config:{...O(o),definitionOfDone:t},stages:o.stages.map(r=>r.id==="review"?{...r,exitPolicy:t}:r)}}function ye(o,t){let r=[],i=0;for(let y of ge(o)){if(t.tokens!==void 0){let u=chunkCWBH7H52_cjs.e(o,y.weight);if(i+u>t.tokens)break;i+=u;}else if(t.turns!==void 0&&r.length>=t.turns)break;r.push(y.id);}return r}function J(o){let t=(n,e,a,l)=>chunkSJRRQZ3R_cjs.M(n,o(),{type:e,by:a.by,payload:a},p=>l(p,chunkSJRRQZ3R_cjs.a(a.now)));return {refine:(n,e)=>{chunkSJRRQZ3R_cjs.o(n,e.by,"define-acceptance","deliver");let a=e.items??[],l=e.split??[];return a.length===0&&l.length===0&&chunkS3BXVHO7_cjs.b("invalid-input","refine needs items[] or split[]","pass at least one patch or split"),t(n,"ceremony.refine",e,(p,c)=>{for(let{id:d,patch:v}of a)p=chunkSJRRQZ3R_cjs.w(p,d,v,e.by,c);for(let d of l){chunkSJRRQZ3R_cjs.u(p,d.from);for(let v of d.into)p=chunkSJRRQZ3R_cjs.v(p,{...v,parent:d.from},e.by,c);p=chunkSJRRQZ3R_cjs.x(p,d.from,{status:"dropped"},e.by,c);}return chunkSJRRQZ3R_cjs.c(p,"ceremony.refine",e.by,{edited:a.map(d=>d.id),split:l.map(d=>({from:d.from,into:d.into.map(v=>v.id)}))},c)})},plan:(n,e)=>{chunkSJRRQZ3R_cjs.o(n,e.by,"facilitate");let a=e.goal;(typeof a!="string"||a.trim()==="")&&chunkS3BXVHO7_cjs.b("invalid-input","sprint planning needs a non-empty goal","state the Sprint Goal in one sentence");let l=O(n),p=e.budget??l.sprintBudget,c=e.items==="auto"?ye(n,p):e.items;Array.isArray(c)||chunkS3BXVHO7_cjs.b("invalid-input",'sprint planning needs items: string[] or "auto"','pass ["A","B"] or "auto"'),c.length===0&&chunkS3BXVHO7_cjs.b("invalid-input","no backlog items fit the sprint","refine the backlog (acceptance + estimates) or raise the budget in config");for(let d of c)ne(n,d);return t(n,"ceremony.plan",e,(d,v)=>{let w=`S${d.iterations.length+1}`,q=V(d),f=c.filter(S=>q?.carryover.includes(S));for(let S of c)d=chunkSJRRQZ3R_cjs.x(d,S,{stage:"sprint",status:"todo"},e.by,v),d=chunkSJRRQZ3R_cjs.s(d,S,B=>({...B,iteration:w}));d=oe(d,c,w,e.by,v);let W=c.reduce((S,B)=>S+(d.items[B]?.weight??0),0);return d={...d,iterations:[...d.iterations,{id:w,goal:a,budget:p,spent:{tokens:0,turns:0,wallclockMs:0},startedAt:v,committed:[...c],carryover:f}]},chunkSJRRQZ3R_cjs.c(d,"sprint.opened",e.by,{id:w,goal:a,committed:c,committedWeight:W,budget:p},v)})},commit:(n,e)=>{let a=chunkCWBH7H52_cjs.f(n);a||chunkS3BXVHO7_cjs.b("invalid-input","no open sprint to commit into","run the plan ceremony first");let l=e.items;(!Array.isArray(l)||l.length===0)&&chunkS3BXVHO7_cjs.b("invalid-input","commit needs items[]",'pass ["A"]');let p=new Set;for(let c of l)p.has(c)&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${c}" appears twice in items[]`,"list each item once",{items:[c]}),p.add(c),chunkSJRRQZ3R_cjs.u(n,c),a.committed.includes(c)&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${c}" is already committed to ${a.id}`,"nothing to do",{items:[c]}),ne(n,c);return t(n,"ceremony.commit",e,(c,d)=>{for(let v of l)c=chunkSJRRQZ3R_cjs.x(c,v,{stage:"sprint",status:"todo"},e.by,d),c=chunkSJRRQZ3R_cjs.s(c,v,w=>({...w,iteration:a.id}));return c=oe(c,l,a.id,e.by,d),c={...c,iterations:c.iterations.map(v=>v.id===a.id?{...v,committed:[...v.committed,...l]}:v)},chunkSJRRQZ3R_cjs.c(c,"sprint.committed",e.by,{id:a.id,items:l,goalImpact:e.goalImpact??null},d)})},uncommit:(n,e)=>{chunkSJRRQZ3R_cjs.o(n,e.by,"order-backlog");let a=chunkCWBH7H52_cjs.f(n);a||chunkS3BXVHO7_cjs.b("invalid-input","no open sprint","nothing to uncommit from");let l=e.items;(!Array.isArray(l)||l.length===0)&&chunkS3BXVHO7_cjs.b("invalid-input","uncommit needs items[]",'pass ["A"]');for(let p of l)chunkSJRRQZ3R_cjs.u(n,p).status==="done"&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${p}" is done`,"finished work cannot be uncommitted",{items:[p]});for(let p of l)a.committed.includes(p)||chunkS3BXVHO7_cjs.b("invalid-input",`item "${p}" is not committed to ${a.id}`,`committed: ${a.committed.join(", ")}`,{items:[p]});return t(n,"ceremony.uncommit",e,(p,c)=>{for(let d of l)p=chunkSJRRQZ3R_cjs.x(p,d,{stage:"backlog",status:"todo"},e.by,c),p=chunkSJRRQZ3R_cjs.t(p,d,["iteration","role"]);return p={...p,iterations:p.iterations.map(d=>d.id===a.id?{...d,committed:d.committed.filter(v=>!l.includes(v))}:d)},chunkSJRRQZ3R_cjs.c(p,"sprint.uncommitted",e.by,{id:a.id,items:l,reason:e.reason??""},c)})},daily:(n,e)=>t(n,"ceremony.daily",e,(a,l)=>chunkSJRRQZ3R_cjs.c(a,"daily",e.by,ie(a),l)),review:(n,e)=>{let a=chunkCWBH7H52_cjs.f(n);a||chunkS3BXVHO7_cjs.b("invalid-input","no open sprint to review","run the plan ceremony first");let l=chunkSJRRQZ3R_cjs.j(n,"sprint-review");e.by!=="human"&&!l.includes(e.by)&&chunkS3BXVHO7_cjs.b("gate-unmet",`"${e.by}" may not accept the Sprint Review`,`run review as "human" or as ${l.join(", ")||"a role with canApprove sprint-review"}`,{rule:"sprint-review"});let p=e.feedback??[];return t(n,"ceremony.review",e,(c,d)=>{for(let w of p)c=chunkSJRRQZ3R_cjs.v(c,{...w,stage:"backlog"},e.by,d);let v=a.committed.filter(w=>c.items[w]?.status==="done");return c=chunkSJRRQZ3R_cjs.c(c,"increment",e.by,{sprint:a.id,done:v,goalMet:e.goalMet===true,accepted:e.accepted===true,feedback:p.map(w=>w.id)},d),T(c,"review",d)})},retro:(n,e)=>{chunkSJRRQZ3R_cjs.o(n,e.by,"facilitate");let a=V(n);a||chunkS3BXVHO7_cjs.b("invalid-input","no closed sprint to retrospect","close the sprint (review or cancel) first"),chunkCWBH7H52_cjs.f(n)&&chunkS3BXVHO7_cjs.b("invalid-input","a sprint is still open","retro runs between sprints; review or cancel the open one");let l=F(n,a.id);n.events.some(f=>f.type==="retro"&&f.seq>l)&&chunkS3BXVHO7_cjs.b("invalid-input",`sprint ${a.id} already has a retrospective`,"plan the next sprint");let p=e.lessons??[],c=e.adopt??[],d=e.dismiss??[],v=e.dodChanges,w=[...c.map(f=>f.id),...d],q=w.find((f,W)=>w.indexOf(f)!==W);q&&chunkS3BXVHO7_cjs.b("invalid-input",`lesson "${q}" is referenced more than once`,"adopt or dismiss each lesson once");for(let f of w){let W=n.lessons.find(S=>S.id===f);W||chunkS3BXVHO7_cjs.b("invalid-input",`no lesson "${f}"`,`raised lessons: ${n.lessons.filter(S=>S.status==="raised").map(S=>S.id).join(", ")||"(none)"}`),W.status!=="raised"&&chunkS3BXVHO7_cjs.b("invalid-input",`lesson "${f}" is already ${W.status}`,"only raised lessons can be adopted or dismissed");}return t(n,"ceremony.retro",e,(f,W)=>{let S=[],B=[],U=[],E=false,H=k=>{if(k)if(k.kind==="agreement")f.agreements.includes(k.text)||(f={...f,agreements:[...f.agreements,k.text]}),B.push(k.text);else if(k.kind==="dod"){let I=O(f).definitionOfDone;I.some(_=>JSON.stringify(_)===JSON.stringify(k.policy))||(E=true,f=re(f,[...I,k.policy]));}else k.kind==="backlog"&&(f=chunkSJRRQZ3R_cjs.v(f,{...k.item,stage:"backlog",tags:[...k.item.tags??[],"retro"]},e.by,W),U.push(k.item.id));};for(let k of p){let I=`L${f.lessons.length+1}`,_={id:I,at:W,text:k.text,scope:k.scope,status:"adopted",from:e.by};k.suggestedChange&&(_.suggestedChange=k.suggestedChange),f={...f,lessons:[...f.lessons,_]},S.push(I),H(k.suggestedChange);}for(let k of c)f={...f,lessons:f.lessons.map(I=>I.id===k.id?{...I,status:"adopted",...k.suggestedChange?{suggestedChange:k.suggestedChange}:{}}:I)},S.push(k.id),H(k.suggestedChange??f.lessons.find(I=>I.id===k.id)?.suggestedChange);for(let k of d)f={...f,lessons:f.lessons.map(I=>I.id===k?{...I,status:"dismissed"}:I)};return v&&(E=true,f=re(f,v)),chunkSJRRQZ3R_cjs.c(f,"retro",e.by,{sprint:a.id,adopted:S,dismissed:d,agreements:B,dodChanged:E,backlogAdded:U},W)})},cancel:(n,e)=>{chunkSJRRQZ3R_cjs.o(n,e.by,"order-backlog");let a=chunkCWBH7H52_cjs.f(n);return a||chunkS3BXVHO7_cjs.b("invalid-input","no open sprint to cancel","nothing to do"),t(n,"ceremony.cancel",e,(l,p)=>(l=chunkSJRRQZ3R_cjs.c(l,"sprint.cancelled",e.by,{id:a.id,reason:e.reason??""},p),T(l,"cancel",p)))}}}var he=new Set(["never","po-only","any"]);function se(o){let t=o??{},r=t.sprintBudget;(!r||typeof r!="object"||r.tokens===void 0&&r.turns===void 0&&r.wallclockMs===void 0)&&chunkS3BXVHO7_cjs.b("config-invalid","scrum config.sprintBudget must define tokens, turns or wallclockMs",'e.g. { "sprintBudget": { "tokens": 400000, "turns": 60 } }'),(typeof t.productGoal!="string"||t.productGoal.trim()==="")&&chunkS3BXVHO7_cjs.b("config-invalid","scrum config.productGoal must be a non-empty string","state the Product Goal in one sentence"),Array.isArray(t.definitionOfDone)||chunkS3BXVHO7_cjs.b("config-invalid","scrum config.definitionOfDone must be a Policy[]",'e.g. [{ "kind": "evidence", "evidenceKind": "test-output" }]');let i=t.refinementSharePct??10;(typeof i!="number"||i<0||i>100)&&chunkS3BXVHO7_cjs.b("config-invalid","scrum config.refinementSharePct must be 0..100","omit it for the default 10");let y=t.allowMidSprintAdd??"po-only";(typeof y!="string"||!he.has(y))&&chunkS3BXVHO7_cjs.b("config-invalid",`scrum config.allowMidSprintAdd must be never | po-only | any (got ${JSON.stringify(y)})`,'use "po-only" unless you have a reason');let u=t.inProgressWipLimit;u!==void 0&&(typeof u!="number"||u<1)&&chunkS3BXVHO7_cjs.b("config-invalid","scrum config.inProgressWipLimit must be a positive number","omit it for no limit");let g={sprintBudget:r,productGoal:t.productGoal,definitionOfDone:t.definitionOfDone,refinementSharePct:i,allowMidSprintAdd:y};return u!==void 0&&(g.inProgressWipLimit=u),g}var D=(o,t)=>t===0?0:o/t;function ae(o){let t=o.events.filter(s=>s.type==="sprint.closed").map(s=>s.payload),r=t.filter(s=>s.reason!=="cancel"),i=r.map(s=>s.doneWeight),y=r.reduce((s,n)=>s+n.doneWeight,0),u=r.reduce((s,n)=>s+n.committedWeight,0),g=o.events.filter(s=>s.type==="increment").map(s=>s.payload),m=t.filter(s=>s.budget.tokens!==void 0),h=r.reduce((s,n)=>s+n.spent.tokens,0);return {velocity:i,meanVelocity:D(i.reduce((s,n)=>s+n,0),i.length),burndown:o.events.filter(s=>s.type==="daily").map(s=>s.payload.remainingWeight),commitmentReliability:D(y,u),sprintGoalHitRate:D(g.filter(s=>s.goalMet).length,g.length),carryoverRatio:D(t.reduce((s,n)=>s+n.carryover.length,0),t.reduce((s,n)=>s+n.done.length+n.carryover.length,0)),budgetUtilisation:D(m.reduce((s,n)=>s+n.spent.tokens,0),m.reduce((s,n)=>s+(n.budget.tokens??0),0)),costPerPoint:D(h,y)}}function ce(){return [{id:"product-owner",name:"Product Owner",modelTier:"large",capabilities:["order-backlog","define-acceptance","escalate"],canApprove:["sprint-review"],inputs:["stakeholder-needs","product-goal"],outputs:["ordered-backlog","acceptance-criteria"],do_not:["do not implement items yourself"]},{id:"scrum-master",name:"Scrum Master",modelTier:"large",capabilities:["facilitate","escalate"],canApprove:[],inputs:["board","blockers"],outputs:["ceremony-records","lessons"],do_not:["do not reorder the Product Backlog","do not assign work; the planner pulls"]},{id:"developer",name:"Developer",modelTier:"small",capabilities:["deliver","review","verify"],canApprove:[],inputs:["brief"],outputs:["code","test-output"],do_not:["do not change acceptance criteria","do not touch items outside your brief"]}]}var R=(o,t,r,i,y)=>y?{rule:o,severity:t,item:y,message:r,fix:i}:{rule:o,severity:t,message:r,fix:i};function de(o){for(let t=o.iterations.length-1;t>=0;t--){let r=o.iterations[t];if(r.endedAt!==void 0)return r}}function le(){return [{id:"one-open-sprint",severity:"error",check:(m,h)=>h.type==="ceremony.plan"&&chunkCWBH7H52_cjs.f(m)?[R("one-open-sprint","error",`sprint ${chunkCWBH7H52_cjs.f(m).id} is still open`,"review or cancel it before planning the next sprint")]:[]},{id:"retro-before-plan",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=de(m);if(!s)return [];let n=F(m,s.id);if(m.events.some(a=>a.type==="retro"&&a.seq>n))return [];let e=s.outcome==="cancelled"?"warning":"error";return [R("retro-before-plan",e,`sprint ${s.id} has no retrospective yet`,"run the retro ceremony first (lessons may be empty)")]}},{id:"sprint-budget-fixed",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=h.payload?.budget;return s===void 0||JSON.stringify(s)===JSON.stringify(O(m).sprintBudget)?[]:[R("sprint-budget-fixed","error","sprint length is fixed by config.sprintBudget","change sprintBudget in the config between sprints instead of per plan")]}},{id:"scope-protects-goal",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.commit")return [];let s=O(m),n=h.payload??{};return s.allowMidSprintAdd==="never"?[R("scope-protects-goal","error","mid-sprint additions are disabled",'set allowMidSprintAdd to "po-only" or wait for the next sprint')]:s.allowMidSprintAdd==="po-only"&&!chunkSJRRQZ3R_cjs.n(m,h.by,"order-backlog")?[R("scope-protects-goal","error",`"${h.by}" may not add work mid-sprint`,"ask the Product Owner (order-backlog) to commit it")]:n.goalImpact!=="none"?[R("scope-protects-goal","error",`adding work with goalImpact "${n.goalImpact??"unset"}" endangers the Sprint Goal`,'only commit items with goalImpact: "none"; otherwise cancel and re-plan')]:[]}},{id:"po-orders-backlog",severity:"error",check:(m,h)=>h.type!=="ceremony.refine"||chunkSJRRQZ3R_cjs.n(m,h.by,"order-backlog")?[]:((h.payload??{}).items??[]).filter(n=>n.patch.priority!==void 0).map(n=>R("po-orders-backlog","error",`"${h.by}" may not change the priority of "${n.id}"`,"only the Product Owner orders the backlog; drop priority from the patch",n.id))},{id:"dod-not-weakened",severity:"error",check:(m,h)=>h.type==="ceremony.retro"&&h.payload?.dodChanges!==void 0&&chunkCWBH7H52_cjs.f(m)?[R("dod-not-weakened","error","Definition of Done cannot change while a sprint is open","close the sprint first; DoD changes apply to the next sprint")]:[]},{id:"carryover-reestimated",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=h.payload?.items;if(!Array.isArray(s))return [];let n=de(m);if(!n)return [];let e=F(m,n.id);return s.filter(a=>n.carryover.includes(a)&&!m.events.some(l=>l.type==="item.edited"&&l.seq>e&&l.payload.id===a&&l.payload.changed.includes("weight"))).map(a=>R("carryover-reestimated","error",`carried-over item "${a}" was not re-estimated after ${n.id}`,"refine it with a new weight before committing",a))}}]}function me(o){let t={id:"in_progress",name:"In progress",entryPolicy:[{kind:"dependencies-done"}],exitPolicy:[]};return o.inProgressWipLimit!==void 0&&(t.wipLimit=o.inProgressWipLimit),[{id:"backlog",name:"Product Backlog",entryPolicy:[],exitPolicy:[{kind:"acceptance-written"},{kind:"estimate-present"}]},{id:"sprint",name:"Sprint Backlog",entryPolicy:[],exitPolicy:[]},t,{id:"review",name:"Review",entryPolicy:[],exitPolicy:o.definitionOfDone,review:true},{id:"done",name:"Increment",entryPolicy:[],exitPolicy:[]}]}var be={backlog:"Product Backlog",item:"Product Backlog Item",stage:"Column",iteration:"Sprint",increment:"Increment",ceremony:"Scrum Event",gate:"Sprint Review"};function O(o){return o.config}function ke(o,t,r){let i=o,y=chunkSJRRQZ3R_cjs.u(i,t).blockers.filter(g=>!g.clearedAt);if(y.length){i=chunkSJRRQZ3R_cjs.s(i,t,g=>({...g,blockers:g.blockers.map(m=>m.clearedAt?m:{...m,clearedAt:r})}));for(let g of y)i=chunkSJRRQZ3R_cjs.c(i,"blocker.cleared","system",{id:t,blocker:g.id,reason:"sprint closed"},r);}for(let g of i.pending.filter(m=>m.item===t))i={...i,pending:i.pending.filter(m=>m.id!==g.id)},i=chunkSJRRQZ3R_cjs.c(i,"pending.dropped","system",{id:g.id,item:t,reason:"sprint closed"},r);let u=chunkSJRRQZ3R_cjs.u(i,t);return (u.stage!=="backlog"||u.status!=="todo")&&(i=chunkSJRRQZ3R_cjs.x(i,t,{stage:"backlog",status:"todo"},"system",r)),chunkSJRRQZ3R_cjs.t(i,t,u.type==="question"?["iteration"]:["iteration","role"])}function T(o,t,r){let i=chunkCWBH7H52_cjs.f(o);if(!i)return o;let y=i.committed.map(e=>chunkSJRRQZ3R_cjs.u(o,e)),u=y.filter(e=>e.status==="done").map(e=>e.id),g=y.filter(e=>e.status==="dropped").map(e=>e.id),m=y.filter(e=>e.status!=="done"&&e.status!=="dropped").map(e=>e.id),h=Object.values(o.items).filter(e=>e.type==="question"&&e.parent!==void 0&&m.includes(e.parent)&&e.status!=="done"&&e.status!=="dropped").map(e=>e.id),s=o;for(let e of [...m,...h])s=ke(s,e,r);let n=e=>e.reduce((a,l)=>a+(o.items[l]?.weight??0),0);return s={...s,iterations:s.iterations.map(e=>{if(e.id!==i.id)return e;let{closing:a,...l}=e;return {...l,endedAt:r,outcome:t==="cancel"?"cancelled":"completed",carryover:m}})},chunkSJRRQZ3R_cjs.c(s,"sprint.closed","system",{id:i.id,reason:t,done:u,carryover:m,carriedQuestions:h,dropped:g,doneWeight:n(u),committedWeight:n(i.committed),spent:i.spent,budget:i.budget},r)}function ve(){return {name:"scrum",vocabulary:be,validateConfig:se,defaultStages:me,defaultRoles:ce,requiredCapabilities:["order-backlog","facilitate","deliver"],exclusiveCapabilities:["order-backlog"],plannerOptions(o){let t=O(o).inProgressWipLimit;return t===void 0?{schedulerMode:"level",dispatchStage:"in_progress"}:{schedulerMode:"level",dispatchStage:"in_progress",concurrencyCap:t}},candidates(o){let t=chunkCWBH7H52_cjs.f(o);return !t||t.closing?[]:Object.values(o.items).filter(r=>r.iteration===t.id&&(r.status==="todo"||r.status==="review")&&(r.stage==="sprint"||r.stage==="review"))},invariants(o,t){let r=chunkCWBH7H52_cjs.f(o),i=O(o),y=r?chunkCWBH7H52_cjs.c(r.budget,r.spent):{};return [`Sprint Goal: ${r?.goal??"(no open sprint)"}; Product Goal: ${i.productGoal}`,`Budget remaining: ${JSON.stringify(y)}; stop and hand off when it is gone`,`Definition of Done: ${i.definitionOfDone.map(u=>u.kind==="evidence"?`evidence ${u.evidenceKind}`:u.kind).join(", ")||"(none)"}`,`Do not change the scope of "${t.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:J(ve),rules:le(),metrics:o=>({...ae(o)}),humanDefaults:{gates:["sprint-review"]},afterComplete(o,t,r){let i=chunkCWBH7H52_cjs.f(o);return !i||!i.closing&&!chunkCWBH7H52_cjs.d(i.budget,i.spent)?o:Object.values(o.items).some(u=>u.iteration===i.id&&u.status==="in_progress")?i.closing?o:chunkSJRRQZ3R_cjs.c({...o,iterations:o.iterations.map(u=>u.id===i.id?{...u,closing:true}:u)},"sprint.closing","system",{id:i.id},r):T(o,"budget",r)}}}exports.a=ie;exports.b=J;exports.c=se;exports.d=ae;exports.e=ce;exports.f=le;exports.g=me;exports.h=be;exports.i=O;exports.j=T;exports.k=ve;//# sourceMappingURL=chunk-7KF5K3L7.cjs.map
|
|
2
|
-
//# sourceMappingURL=chunk-7KF5K3L7.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scrum/ceremonies.ts","../src/scrum/config.ts","../src/scrum/metrics.ts","../src/scrum/roles.ts","../src/scrum/rules.ts","../src/scrum/stages.ts","../src/scrum/index.ts"],"names":["STATUSES","velocityOf","state","closed","e","sum","dailyReport","it","openIteration","byStatus","s","blockers","remainingWeight","id","item","b","spent","rem","remaining","velocity","forecast","share","raisedLessons","l","lastClosedIteration","i","closedSeq","backlogOrdered","carry","items","timSort","x","cx","cy","assertCommittable","getItem","fail","assertPolicies","stageOf","attachQuestions","parentIds","iterationId","by","now","q","moveItem","patchItem","setDod","policies","configOf","st","selectAuto","budget","out","tokens","est","estimateTokens","scrumCeremonies","methodology","act","type","input","reduce","applyAction","nowOf","requireCap","split","patch","editItem","sp","n","addItem","appendEvent","goal","cfg","wanted","last","carryover","w","committedWeight","seen","stripItemFields","c","approvers","approverIds","feedback","done","f","closeSprint","closedAt","newLessons","adopt","dismiss","dod","refs","a","dupe","r","ref","adopted","agreements","backlogAdded","dodChanged","applyChange","cur","p","lesson","d","ADD_MODES","validateScrumConfig","raw","add","wip","ratio","num","den","scrumMetrics","counted","doneWeight","increments","withTokens","tokensSpent","scrumRoles","v","rule","severity","message","fix","lastClosed","scrumRules","seq","sev","canDo","scrumStages","config","inProgress","SCRUM_VOCABULARY","toBacklog","open","reason","committed","dropped","carriedQuestions","weightOf","ids","_c","rest","scrum","cap","left","_itemId","isExhausted"],"mappings":"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","file":"chunk-7KF5K3L7.cjs","sourcesContent":["import { timSort } from \"exsorted\";\nimport { estimateTokens, remaining } from \"../budget.ts\";\nimport { fail } from \"../errors.ts\";\nimport {\n addItem,\n editItem,\n getItem,\n moveItem,\n patchItem,\n stageOf,\n stripItemFields,\n type ItemPatch,\n} from \"../items.ts\";\nimport { applyAction } from \"../methodology.ts\";\nimport { assertPolicies } from \"../policies.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { approverIds, canDo, requireCap } from \"../roles.ts\";\nexport { canDo };\nimport { appendEvent, nowOf } from \"../state.ts\";\nimport type {\n Budget,\n Ceremony,\n CeremonyInput,\n ItemStatus,\n Iteration,\n Lesson,\n LessonChange,\n Methodology,\n NewItem,\n Policy,\n WorkItem,\n WorkflowState,\n} from \"../types.ts\";\nimport { closeSprint, configOf } from \"./index.ts\";\n\nconst STATUSES: ItemStatus[] = [\n \"todo\",\n \"in_progress\",\n \"blocked\",\n \"review\",\n \"awaiting_human\",\n \"done\",\n \"dropped\",\n];\n\nexport interface DailyReport {\n sprint: string | null;\n goal: string | null;\n byStatus: Record<ItemStatus, number>;\n blockers: Array<{ item: string; blocker: string; owner: string; reason: string }>;\n spent: Required<Budget>;\n remaining: Budget;\n remainingWeight: number;\n raisedLessons: number;\n velocity: number | null;\n forecast: \"on-track\" | \"at-risk\" | \"unknown\";\n}\n\nexport function velocityOf(state: WorkflowState): number | null {\n const closed = state.events.filter(\n (e) => e.type === \"sprint.closed\" && (e.payload as { reason: string }).reason !== \"cancel\",\n );\n if (closed.length === 0) return null;\n return (\n closed.reduce((sum, e) => sum + (e.payload as { doneWeight: number }).doneWeight, 0) /\n closed.length\n );\n}\n\nexport function dailyReport(state: WorkflowState): DailyReport {\n const it = openIteration(state);\n const byStatus = Object.fromEntries(STATUSES.map((s) => [s, 0])) as Record<ItemStatus, number>;\n const blockers: DailyReport[\"blockers\"] = [];\n let remainingWeight = 0;\n for (const id of it?.committed ?? []) {\n const item = state.items[id];\n if (!item) continue;\n byStatus[item.status] += 1;\n if (item.status !== \"done\") remainingWeight += item.weight ?? 0;\n for (const b of item.blockers)\n if (!b.clearedAt)\n blockers.push({ item: id, blocker: b.id, owner: b.owner, reason: b.reason });\n }\n const spent = it?.spent ?? { tokens: 0, turns: 0, wallclockMs: 0 };\n const rem = it ? remaining(it.budget, it.spent) : {};\n const velocity = velocityOf(state);\n let forecast: DailyReport[\"forecast\"] = \"unknown\";\n if (it && velocity !== null && it.budget.tokens) {\n const share = (rem.tokens ?? 0) / it.budget.tokens;\n forecast = remainingWeight <= velocity * share ? \"on-track\" : \"at-risk\";\n }\n const raisedLessons = state.lessons.filter((l) => l.status === \"raised\").length;\n return {\n sprint: it?.id ?? null,\n goal: it?.goal ?? null,\n byStatus,\n blockers,\n spent,\n remaining: rem,\n remainingWeight,\n raisedLessons,\n velocity,\n forecast,\n };\n}\n\nfunction lastClosedIteration(state: WorkflowState): Iteration | undefined {\n for (let i = state.iterations.length - 1; i >= 0; i--) {\n const it = state.iterations[i]!;\n if (it.endedAt !== undefined) return it;\n }\n return undefined;\n}\n\n/** Event seq of the sprint.closed event of `id`; infinity when it is missing, so nothing counts as \"after\" it. */\nexport function closedSeq(state: WorkflowState, id: string): number {\n return (\n state.events.find((e) => e.type === \"sprint.closed\" && (e.payload as { id: string }).id === id)\n ?.seq ?? Number.POSITIVE_INFINITY\n );\n}\n\nfunction backlogOrdered(state: WorkflowState): WorkItem[] {\n const carry = new Set(lastClosedIteration(state)?.carryover ?? []);\n const items = Object.values(state.items).filter(\n (i) => i.stage === \"backlog\" && i.status === \"todo\" && i.type !== \"question\",\n );\n return timSort([...items], (x, y) => {\n const cx = carry.has(x.id) ? 1 : 0;\n const cy = carry.has(y.id) ? 1 : 0;\n if (cx !== cy) return cy - cx;\n return (y.priority ?? 0) - (x.priority ?? 0);\n });\n}\n\n/** Throw unless the item sits in the Product Backlog and meets the backlog exit policy. */\nfunction assertCommittable(state: WorkflowState, id: string): void {\n const item = getItem(state, id);\n if (item.stage !== \"backlog\" || item.status !== \"todo\")\n fail(\n \"invalid-input\",\n `item \"${id}\" is not in the Product Backlog (${item.stage}/${item.status})`,\n \"only backlog items can be committed\",\n { items: [id] },\n );\n assertPolicies(state, item, stageOf(state, \"backlog\").exitPolicy, \"enter the Sprint Backlog\");\n}\n\n/** Open questions raised by the given parents travel with them into the sprint (they carry no weight). */\nfunction attachQuestions(\n state: WorkflowState,\n parentIds: string[],\n iterationId: string,\n by: string,\n now: string,\n): WorkflowState {\n let s = state;\n for (const q of Object.values(state.items)) {\n if (\n q.type !== \"question\" ||\n q.parent === undefined ||\n !parentIds.includes(q.parent) ||\n q.status === \"done\" ||\n q.status === \"dropped\"\n )\n continue;\n if (q.stage !== \"sprint\" || q.status !== \"todo\")\n s = moveItem(s, q.id, { stage: \"sprint\", status: \"todo\" }, by, now);\n s = patchItem(s, q.id, (it) => ({ ...it, iteration: iterationId }));\n }\n return s;\n}\n\n/** Set the Definition of Done in the config and on the review stage. */\nfunction setDod(state: WorkflowState, policies: Policy[]): WorkflowState {\n return {\n ...state,\n config: { ...configOf(state), definitionOfDone: policies },\n stages: state.stages.map((st) => (st.id === \"review\" ? { ...st, exitPolicy: policies } : st)),\n };\n}\n\nfunction selectAuto(state: WorkflowState, budget: Budget): string[] {\n const out: string[] = [];\n let tokens = 0;\n for (const item of backlogOrdered(state)) {\n if (budget.tokens !== undefined) {\n const est = estimateTokens(state, item.weight);\n if (tokens + est > budget.tokens) break;\n tokens += est;\n } else if (budget.turns !== undefined && out.length >= budget.turns) break;\n out.push(item.id);\n }\n return out;\n}\n\nexport function scrumCeremonies(methodology: () => Methodology): Record<string, Ceremony> {\n const act = (\n state: WorkflowState,\n type: string,\n input: CeremonyInput,\n reduce: (s: WorkflowState, now: string) => WorkflowState,\n ) =>\n applyAction(state, methodology(), { type, by: input.by, payload: input }, (s) =>\n reduce(s, nowOf(input.now)),\n );\n\n const refine: Ceremony = (state, input) => {\n requireCap(state, input.by, \"define-acceptance\", \"deliver\");\n const items = (input[\"items\"] ?? []) as Array<{ id: string; patch: ItemPatch }>;\n const split = (input[\"split\"] ?? []) as Array<{ from: string; into: NewItem[] }>;\n if (items.length === 0 && split.length === 0)\n fail(\"invalid-input\", \"refine needs items[] or split[]\", \"pass at least one patch or split\");\n return act(state, \"ceremony.refine\", input, (s, now) => {\n for (const { id, patch } of items) s = editItem(s, id, patch, input.by, now);\n for (const sp of split) {\n getItem(s, sp.from);\n for (const n of sp.into) s = addItem(s, { ...n, parent: sp.from }, input.by, now);\n s = moveItem(s, sp.from, { status: \"dropped\" }, input.by, now);\n }\n return appendEvent(\n s,\n \"ceremony.refine\",\n input.by,\n {\n edited: items.map((i) => i.id),\n split: split.map((x) => ({ from: x.from, into: x.into.map((n) => n.id) })),\n },\n now,\n );\n });\n };\n\n const plan: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\");\n const goal = input[\"goal\"];\n if (typeof goal !== \"string\" || goal.trim() === \"\")\n fail(\n \"invalid-input\",\n \"sprint planning needs a non-empty goal\",\n \"state the Sprint Goal in one sentence\",\n );\n const cfg = configOf(state);\n const budget = (input[\"budget\"] as Budget | undefined) ?? cfg.sprintBudget;\n const wanted =\n input[\"items\"] === \"auto\"\n ? selectAuto(state, budget)\n : (input[\"items\"] as string[] | undefined);\n if (!Array.isArray(wanted))\n fail(\n \"invalid-input\",\n 'sprint planning needs items: string[] or \"auto\"',\n 'pass [\"A\",\"B\"] or \"auto\"',\n );\n if (wanted.length === 0)\n fail(\n \"invalid-input\",\n \"no backlog items fit the sprint\",\n \"refine the backlog (acceptance + estimates) or raise the budget in config\",\n );\n for (const id of wanted) assertCommittable(state, id);\n return act(state, \"ceremony.plan\", input, (s, now) => {\n const id = `S${s.iterations.length + 1}`;\n const last = lastClosedIteration(s);\n const carryover = wanted.filter((w) => last?.carryover.includes(w));\n for (const w of wanted) {\n s = moveItem(s, w, { stage: \"sprint\", status: \"todo\" }, input.by, now);\n s = patchItem(s, w, (it) => ({ ...it, iteration: id }));\n }\n s = attachQuestions(s, wanted, id, input.by, now);\n const committedWeight = wanted.reduce((sum, w) => sum + (s.items[w]?.weight ?? 0), 0);\n s = {\n ...s,\n iterations: [\n ...s.iterations,\n {\n id,\n goal,\n budget,\n spent: { tokens: 0, turns: 0, wallclockMs: 0 },\n startedAt: now,\n committed: [...wanted],\n carryover,\n },\n ],\n };\n return appendEvent(\n s,\n \"sprint.opened\",\n input.by,\n { id, goal, committed: wanted, committedWeight, budget },\n now,\n );\n });\n };\n\n const commit: Ceremony = (state, input) => {\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint to commit into\", \"run the plan ceremony first\");\n const items = input[\"items\"] as string[] | undefined;\n if (!Array.isArray(items) || items.length === 0)\n fail(\"invalid-input\", \"commit needs items[]\", 'pass [\"A\"]');\n const seen = new Set<string>();\n for (const id of items) {\n if (seen.has(id))\n fail(\"invalid-input\", `item \"${id}\" appears twice in items[]`, \"list each item once\", {\n items: [id],\n });\n seen.add(id);\n getItem(state, id);\n if (it.committed.includes(id))\n fail(\"invalid-input\", `item \"${id}\" is already committed to ${it.id}`, \"nothing to do\", {\n items: [id],\n });\n assertCommittable(state, id);\n }\n return act(state, \"ceremony.commit\", input, (s, now) => {\n for (const id of items) {\n s = moveItem(s, id, { stage: \"sprint\", status: \"todo\" }, input.by, now);\n s = patchItem(s, id, (x) => ({ ...x, iteration: it.id }));\n }\n s = attachQuestions(s, items, it.id, input.by, now);\n s = {\n ...s,\n iterations: s.iterations.map((x) =>\n x.id === it.id ? { ...x, committed: [...x.committed, ...items] } : x,\n ),\n };\n return appendEvent(\n s,\n \"sprint.committed\",\n input.by,\n { id: it.id, items, goalImpact: input[\"goalImpact\"] ?? null },\n now,\n );\n });\n };\n\n const uncommit: Ceremony = (state, input) => {\n requireCap(state, input.by, \"order-backlog\");\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint\", \"nothing to uncommit from\");\n const items = input[\"items\"] as string[] | undefined;\n if (!Array.isArray(items) || items.length === 0)\n fail(\"invalid-input\", \"uncommit needs items[]\", 'pass [\"A\"]');\n for (const id of items) {\n if (getItem(state, id).status === \"done\")\n fail(\"invalid-input\", `item \"${id}\" is done`, \"finished work cannot be uncommitted\", {\n items: [id],\n });\n }\n for (const id of items)\n if (!it.committed.includes(id))\n fail(\n \"invalid-input\",\n `item \"${id}\" is not committed to ${it.id}`,\n `committed: ${it.committed.join(\", \")}`,\n { items: [id] },\n );\n return act(state, \"ceremony.uncommit\", input, (s, now) => {\n for (const id of items) {\n s = moveItem(s, id, { stage: \"backlog\", status: \"todo\" }, input.by, now);\n s = stripItemFields(s, id, [\"iteration\", \"role\"]);\n }\n s = {\n ...s,\n iterations: s.iterations.map((x) =>\n x.id === it.id ? { ...x, committed: x.committed.filter((c) => !items.includes(c)) } : x,\n ),\n };\n return appendEvent(\n s,\n \"sprint.uncommitted\",\n input.by,\n { id: it.id, items, reason: input[\"reason\"] ?? \"\" },\n now,\n );\n });\n };\n\n const daily: Ceremony = (state, input) =>\n act(state, \"ceremony.daily\", input, (s, now) =>\n appendEvent(s, \"daily\", input.by, dailyReport(s), now),\n );\n\n const review: Ceremony = (state, input) => {\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint to review\", \"run the plan ceremony first\");\n const approvers = approverIds(state, \"sprint-review\");\n if (input.by !== \"human\" && !approvers.includes(input.by)) {\n fail(\n \"gate-unmet\",\n `\"${input.by}\" may not accept the Sprint Review`,\n `run review as \"human\" or as ${approvers.join(\", \") || \"a role with canApprove sprint-review\"}`,\n { rule: \"sprint-review\" },\n );\n }\n const feedback = (input[\"feedback\"] ?? []) as NewItem[];\n return act(state, \"ceremony.review\", input, (s, now) => {\n for (const n of feedback) s = addItem(s, { ...n, stage: \"backlog\" }, input.by, now);\n const done = it.committed.filter((id) => s.items[id]?.status === \"done\");\n s = appendEvent(\n s,\n \"increment\",\n input.by,\n {\n sprint: it.id,\n done,\n goalMet: input[\"goalMet\"] === true,\n accepted: input[\"accepted\"] === true,\n feedback: feedback.map((f) => f.id),\n },\n now,\n );\n return closeSprint(s, \"review\", now);\n });\n };\n\n const retro: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\");\n const last = lastClosedIteration(state);\n if (!last)\n fail(\n \"invalid-input\",\n \"no closed sprint to retrospect\",\n \"close the sprint (review or cancel) first\",\n );\n if (openIteration(state))\n fail(\n \"invalid-input\",\n \"a sprint is still open\",\n \"retro runs between sprints; review or cancel the open one\",\n );\n const closedAt = closedSeq(state, last.id);\n if (state.events.some((e) => e.type === \"retro\" && e.seq > closedAt))\n fail(\n \"invalid-input\",\n `sprint ${last.id} already has a retrospective`,\n \"plan the next sprint\",\n );\n const newLessons = (input[\"lessons\"] ?? []) as Array<{\n text: string;\n scope: Lesson[\"scope\"];\n suggestedChange?: LessonChange;\n }>;\n const adopt = (input[\"adopt\"] ?? []) as Array<{ id: string; suggestedChange?: LessonChange }>;\n const dismiss = (input[\"dismiss\"] ?? []) as string[];\n const dod = input[\"dodChanges\"] as Policy[] | undefined;\n const refs = [...adopt.map((a) => a.id), ...dismiss];\n const dupe = refs.find((r, i) => refs.indexOf(r) !== i);\n if (dupe)\n fail(\n \"invalid-input\",\n `lesson \"${dupe}\" is referenced more than once`,\n \"adopt or dismiss each lesson once\",\n );\n for (const ref of refs) {\n const l = state.lessons.find((x) => x.id === ref);\n if (!l)\n fail(\n \"invalid-input\",\n `no lesson \"${ref}\"`,\n `raised lessons: ${\n state.lessons\n .filter((x) => x.status === \"raised\")\n .map((x) => x.id)\n .join(\", \") || \"(none)\"\n }`,\n );\n if (l.status !== \"raised\")\n fail(\n \"invalid-input\",\n `lesson \"${ref}\" is already ${l.status}`,\n \"only raised lessons can be adopted or dismissed\",\n );\n }\n return act(state, \"ceremony.retro\", input, (s, now) => {\n const adopted: string[] = [];\n const agreements: string[] = [];\n const backlogAdded: string[] = [];\n let dodChanged = false;\n const applyChange = (c: LessonChange | undefined) => {\n if (!c) return;\n if (c.kind === \"agreement\") {\n if (!s.agreements.includes(c.text)) s = { ...s, agreements: [...s.agreements, c.text] };\n agreements.push(c.text);\n } else if (c.kind === \"dod\") {\n const cur = configOf(s).definitionOfDone;\n if (!cur.some((p) => JSON.stringify(p) === JSON.stringify(c.policy))) {\n dodChanged = true;\n s = setDod(s, [...cur, c.policy]);\n }\n } else if (c.kind === \"backlog\") {\n s = addItem(\n s,\n { ...c.item, stage: \"backlog\", tags: [...(c.item.tags ?? []), \"retro\"] },\n input.by,\n now,\n );\n backlogAdded.push(c.item.id);\n }\n };\n for (const l of newLessons) {\n const id = `L${s.lessons.length + 1}`;\n const lesson: Lesson = {\n id,\n at: now,\n text: l.text,\n scope: l.scope,\n status: \"adopted\",\n from: input.by,\n };\n if (l.suggestedChange) lesson.suggestedChange = l.suggestedChange;\n s = { ...s, lessons: [...s.lessons, lesson] };\n adopted.push(id);\n applyChange(l.suggestedChange);\n }\n for (const a of adopt) {\n s = {\n ...s,\n lessons: s.lessons.map((x) =>\n x.id === a.id\n ? {\n ...x,\n status: \"adopted\" as const,\n ...(a.suggestedChange ? { suggestedChange: a.suggestedChange } : {}),\n }\n : x,\n ),\n };\n adopted.push(a.id);\n applyChange(a.suggestedChange ?? s.lessons.find((x) => x.id === a.id)?.suggestedChange);\n }\n for (const d of dismiss)\n s = {\n ...s,\n lessons: s.lessons.map((x) => (x.id === d ? { ...x, status: \"dismissed\" as const } : x)),\n };\n if (dod) {\n dodChanged = true;\n s = setDod(s, dod);\n }\n return appendEvent(\n s,\n \"retro\",\n input.by,\n {\n sprint: last.id,\n adopted,\n dismissed: dismiss,\n agreements,\n dodChanged,\n backlogAdded,\n },\n now,\n );\n });\n };\n\n const cancel: Ceremony = (state, input) => {\n requireCap(state, input.by, \"order-backlog\");\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint to cancel\", \"nothing to do\");\n return act(state, \"ceremony.cancel\", input, (s, now) => {\n s = appendEvent(\n s,\n \"sprint.cancelled\",\n input.by,\n { id: it.id, reason: input[\"reason\"] ?? \"\" },\n now,\n );\n return closeSprint(s, \"cancel\", now);\n });\n };\n\n return { refine, plan, commit, uncommit, daily, review, retro, cancel };\n}\n","import { fail } from \"../errors.ts\";\nimport type { Budget, Policy } from \"../types.ts\";\n\nexport interface ScrumConfig {\n sprintBudget: Budget;\n productGoal: string;\n definitionOfDone: Policy[];\n refinementSharePct: number;\n allowMidSprintAdd: \"never\" | \"po-only\" | \"any\";\n inProgressWipLimit?: number;\n}\n\nconst ADD_MODES = new Set([\"never\", \"po-only\", \"any\"]);\n\nexport function validateScrumConfig(raw: unknown): ScrumConfig {\n const c = (raw ?? {}) as Record<string, unknown>;\n const budget = c[\"sprintBudget\"] as Budget | undefined;\n if (\n !budget ||\n typeof budget !== \"object\" ||\n (budget.tokens === undefined && budget.turns === undefined && budget.wallclockMs === undefined)\n ) {\n fail(\n \"config-invalid\",\n \"scrum config.sprintBudget must define tokens, turns or wallclockMs\",\n 'e.g. { \"sprintBudget\": { \"tokens\": 400000, \"turns\": 60 } }',\n );\n }\n if (typeof c[\"productGoal\"] !== \"string\" || c[\"productGoal\"].trim() === \"\")\n fail(\n \"config-invalid\",\n \"scrum config.productGoal must be a non-empty string\",\n \"state the Product Goal in one sentence\",\n );\n if (!Array.isArray(c[\"definitionOfDone\"]))\n fail(\n \"config-invalid\",\n \"scrum config.definitionOfDone must be a Policy[]\",\n 'e.g. [{ \"kind\": \"evidence\", \"evidenceKind\": \"test-output\" }]',\n );\n const share = c[\"refinementSharePct\"] ?? 10;\n if (typeof share !== \"number\" || share < 0 || share > 100)\n fail(\n \"config-invalid\",\n \"scrum config.refinementSharePct must be 0..100\",\n \"omit it for the default 10\",\n );\n const add = c[\"allowMidSprintAdd\"] ?? \"po-only\";\n if (typeof add !== \"string\" || !ADD_MODES.has(add))\n fail(\n \"config-invalid\",\n `scrum config.allowMidSprintAdd must be never | po-only | any (got ${JSON.stringify(add)})`,\n 'use \"po-only\" unless you have a reason',\n );\n const wip = c[\"inProgressWipLimit\"];\n if (wip !== undefined && (typeof wip !== \"number\" || wip < 1))\n fail(\n \"config-invalid\",\n \"scrum config.inProgressWipLimit must be a positive number\",\n \"omit it for no limit\",\n );\n const out: ScrumConfig = {\n sprintBudget: budget,\n productGoal: c[\"productGoal\"],\n definitionOfDone: c[\"definitionOfDone\"] as Policy[],\n refinementSharePct: share,\n allowMidSprintAdd: add as ScrumConfig[\"allowMidSprintAdd\"],\n };\n if (wip !== undefined) out.inProgressWipLimit = wip as number;\n return out;\n}\n","import type { Budget, WorkflowState } from \"../types.ts\";\n\ninterface Closed {\n reason: string;\n done: string[];\n carryover: string[];\n doneWeight: number;\n committedWeight: number;\n spent: Required<Budget>;\n budget: Budget;\n}\n\nexport interface ScrumMetrics {\n velocity: number[];\n meanVelocity: number;\n burndown: number[];\n commitmentReliability: number;\n sprintGoalHitRate: number;\n carryoverRatio: number;\n budgetUtilisation: number;\n costPerPoint: number;\n}\n\nconst ratio = (num: number, den: number) => (den === 0 ? 0 : num / den);\n\nexport function scrumMetrics(state: WorkflowState): ScrumMetrics {\n const closed = state.events\n .filter((e) => e.type === \"sprint.closed\")\n .map((e) => e.payload as Closed);\n const counted = closed.filter((c) => c.reason !== \"cancel\");\n const velocity = counted.map((c) => c.doneWeight);\n const doneWeight = counted.reduce((s, c) => s + c.doneWeight, 0);\n const committedWeight = counted.reduce((s, c) => s + c.committedWeight, 0);\n const increments = state.events\n .filter((e) => e.type === \"increment\")\n .map((e) => e.payload as { goalMet: boolean });\n const withTokens = closed.filter((c) => c.budget.tokens !== undefined);\n const tokensSpent = counted.reduce((s, c) => s + c.spent.tokens, 0);\n return {\n velocity,\n meanVelocity: ratio(\n velocity.reduce((s, x) => s + x, 0),\n velocity.length,\n ),\n burndown: state.events\n .filter((e) => e.type === \"daily\")\n .map((e) => (e.payload as { remainingWeight: number }).remainingWeight),\n commitmentReliability: ratio(doneWeight, committedWeight),\n sprintGoalHitRate: ratio(increments.filter((i) => i.goalMet).length, increments.length),\n carryoverRatio: ratio(\n closed.reduce((s, c) => s + c.carryover.length, 0),\n closed.reduce((s, c) => s + c.done.length + c.carryover.length, 0),\n ),\n budgetUtilisation: ratio(\n withTokens.reduce((s, c) => s + c.spent.tokens, 0),\n withTokens.reduce((s, c) => s + (c.budget.tokens ?? 0), 0),\n ),\n costPerPoint: ratio(tokensSpent, doneWeight), // cost per delivered point over completed sprints\n };\n}\n","import type { Role } from \"../types.ts\";\n\nexport function scrumRoles(): Role[] {\n return [\n {\n id: \"product-owner\",\n name: \"Product Owner\",\n modelTier: \"large\",\n capabilities: [\"order-backlog\", \"define-acceptance\", \"escalate\"],\n canApprove: [\"sprint-review\"],\n inputs: [\"stakeholder-needs\", \"product-goal\"],\n outputs: [\"ordered-backlog\", \"acceptance-criteria\"],\n do_not: [\"do not implement items yourself\"],\n },\n {\n id: \"scrum-master\",\n name: \"Scrum Master\",\n modelTier: \"large\",\n capabilities: [\"facilitate\", \"escalate\"],\n canApprove: [],\n inputs: [\"board\", \"blockers\"],\n outputs: [\"ceremony-records\", \"lessons\"],\n do_not: [\"do not reorder the Product Backlog\", \"do not assign work; the planner pulls\"],\n },\n {\n id: \"developer\",\n name: \"Developer\",\n modelTier: \"small\",\n capabilities: [\"deliver\", \"review\", \"verify\"],\n canApprove: [],\n inputs: [\"brief\"],\n outputs: [\"code\", \"test-output\"],\n do_not: [\"do not change acceptance criteria\", \"do not touch items outside your brief\"],\n },\n ];\n}\n","import { openIteration } from \"../planner.ts\";\nimport type { Budget, Iteration, Rule, Violation, WorkflowState } from \"../types.ts\";\nimport type { ItemPatch } from \"../items.ts\";\nimport { canDo, closedSeq } from \"./ceremonies.ts\";\nimport { configOf } from \"./index.ts\";\n\nconst v = (\n rule: string,\n severity: Violation[\"severity\"],\n message: string,\n fix: string,\n item?: string,\n): Violation => (item ? { rule, severity, item, message, fix } : { rule, severity, message, fix });\n\nfunction lastClosed(state: WorkflowState): Iteration | undefined {\n for (let i = state.iterations.length - 1; i >= 0; i--) {\n const it = state.iterations[i]!;\n if (it.endedAt !== undefined) return it;\n }\n return undefined;\n}\nexport function scrumRules(): Rule[] {\n const oneOpen: Rule = {\n id: \"one-open-sprint\",\n severity: \"error\",\n check: (s, a) =>\n a.type === \"ceremony.plan\" && openIteration(s)\n ? [\n v(\n \"one-open-sprint\",\n \"error\",\n `sprint ${openIteration(s)!.id} is still open`,\n \"review or cancel it before planning the next sprint\",\n ),\n ]\n : [],\n };\n\n const retroFirst: Rule = {\n id: \"retro-before-plan\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.plan\") return [];\n const last = lastClosed(s);\n if (!last) return [];\n const seq = closedSeq(s, last.id);\n if (s.events.some((e) => e.type === \"retro\" && e.seq > seq)) return [];\n const sev = last.outcome === \"cancelled\" ? \"warning\" : \"error\";\n return [\n v(\n \"retro-before-plan\",\n sev,\n `sprint ${last.id} has no retrospective yet`,\n \"run the retro ceremony first (lessons may be empty)\",\n ),\n ];\n },\n };\n\n const budgetFixed: Rule = {\n id: \"sprint-budget-fixed\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.plan\") return [];\n const b = (a.payload as { budget?: Budget } | undefined)?.budget;\n if (b === undefined || JSON.stringify(b) === JSON.stringify(configOf(s).sprintBudget))\n return [];\n return [\n v(\n \"sprint-budget-fixed\",\n \"error\",\n \"sprint length is fixed by config.sprintBudget\",\n \"change sprintBudget in the config between sprints instead of per plan\",\n ),\n ];\n },\n };\n\n const scope: Rule = {\n id: \"scope-protects-goal\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.commit\") return [];\n const cfg = configOf(s);\n const p = (a.payload ?? {}) as { goalImpact?: string };\n if (cfg.allowMidSprintAdd === \"never\")\n return [\n v(\n \"scope-protects-goal\",\n \"error\",\n \"mid-sprint additions are disabled\",\n 'set allowMidSprintAdd to \"po-only\" or wait for the next sprint',\n ),\n ];\n if (cfg.allowMidSprintAdd === \"po-only\" && !canDo(s, a.by, \"order-backlog\"))\n return [\n v(\n \"scope-protects-goal\",\n \"error\",\n `\"${a.by}\" may not add work mid-sprint`,\n \"ask the Product Owner (order-backlog) to commit it\",\n ),\n ];\n if (p.goalImpact !== \"none\")\n return [\n v(\n \"scope-protects-goal\",\n \"error\",\n `adding work with goalImpact \"${p.goalImpact ?? \"unset\"}\" endangers the Sprint Goal`,\n 'only commit items with goalImpact: \"none\"; otherwise cancel and re-plan',\n ),\n ];\n return [];\n },\n };\n\n const poOrders: Rule = {\n id: \"po-orders-backlog\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.refine\" || canDo(s, a.by, \"order-backlog\")) return [];\n const items =\n ((a.payload ?? {}) as { items?: Array<{ id: string; patch: ItemPatch }> }).items ?? [];\n return items\n .filter((i) => i.patch.priority !== undefined)\n .map((i) =>\n v(\n \"po-orders-backlog\",\n \"error\",\n `\"${a.by}\" may not change the priority of \"${i.id}\"`,\n \"only the Product Owner orders the backlog; drop priority from the patch\",\n i.id,\n ),\n );\n },\n };\n\n const dod: Rule = {\n id: \"dod-not-weakened\",\n severity: \"error\",\n check: (s, a) =>\n a.type === \"ceremony.retro\" &&\n (a.payload as { dodChanges?: unknown } | undefined)?.dodChanges !== undefined &&\n openIteration(s)\n ? [\n v(\n \"dod-not-weakened\",\n \"error\",\n \"Definition of Done cannot change while a sprint is open\",\n \"close the sprint first; DoD changes apply to the next sprint\",\n ),\n ]\n : [],\n };\n\n const carry: Rule = {\n id: \"carryover-reestimated\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.plan\") return [];\n const items = (a.payload as { items?: string[] | \"auto\" } | undefined)?.items;\n if (!Array.isArray(items)) return [];\n const last = lastClosed(s);\n if (!last) return [];\n const seq = closedSeq(s, last.id);\n return items\n .filter(\n (id) =>\n last.carryover.includes(id) &&\n !s.events.some(\n (e) =>\n e.type === \"item.edited\" &&\n e.seq > seq &&\n (e.payload as { id: string; changed: string[] }).id === id &&\n (e.payload as { changed: string[] }).changed.includes(\"weight\"),\n ),\n )\n .map((id) =>\n v(\n \"carryover-reestimated\",\n \"error\",\n `carried-over item \"${id}\" was not re-estimated after ${last.id}`,\n \"refine it with a new weight before committing\",\n id,\n ),\n );\n },\n };\n\n return [oneOpen, retroFirst, budgetFixed, scope, poOrders, dod, carry];\n}\n","import type { Stage } from \"../types.ts\";\nimport type { ScrumConfig } from \"./config.ts\";\n\nexport function scrumStages(config: ScrumConfig): Stage[] {\n const inProgress: Stage = {\n id: \"in_progress\",\n name: \"In progress\",\n entryPolicy: [{ kind: \"dependencies-done\" }],\n exitPolicy: [],\n };\n if (config.inProgressWipLimit !== undefined) inProgress.wipLimit = config.inProgressWipLimit;\n return [\n {\n id: \"backlog\",\n name: \"Product Backlog\",\n entryPolicy: [],\n exitPolicy: [{ kind: \"acceptance-written\" }, { kind: \"estimate-present\" }],\n },\n { id: \"sprint\", name: \"Sprint Backlog\", entryPolicy: [], exitPolicy: [] },\n inProgress,\n {\n id: \"review\",\n name: \"Review\",\n entryPolicy: [],\n exitPolicy: config.definitionOfDone,\n review: true,\n },\n { id: \"done\", name: \"Increment\", entryPolicy: [], exitPolicy: [] },\n ];\n}\n","import { isExhausted, remaining } from \"../budget.ts\";\nimport { getItem, moveItem, patchItem, stripItemFields } from \"../items.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { appendEvent } from \"../state.ts\";\nimport type { CoreTerm, Methodology, PlannerOptions, WorkItem, WorkflowState } from \"../types.ts\";\nimport { scrumCeremonies } from \"./ceremonies.ts\";\nimport { validateScrumConfig, type ScrumConfig } from \"./config.ts\";\nimport { scrumMetrics, type ScrumMetrics } from \"./metrics.ts\";\nimport { scrumRoles } from \"./roles.ts\";\nimport { scrumRules } from \"./rules.ts\";\nimport { scrumStages } from \"./stages.ts\";\n\nexport { validateScrumConfig, scrumRoles, scrumRules, scrumStages, scrumMetrics };\nexport type { ScrumMetrics };\nexport type { ScrumConfig };\nexport { scrumCeremonies, dailyReport, canDo } from \"./ceremonies.ts\";\nexport type { DailyReport } from \"./ceremonies.ts\";\n\nexport const SCRUM_VOCABULARY: Record<CoreTerm, string> = {\n backlog: \"Product Backlog\",\n item: \"Product Backlog Item\",\n stage: \"Column\",\n iteration: \"Sprint\",\n increment: \"Increment\",\n ceremony: \"Scrum Event\",\n gate: \"Sprint Review\",\n};\n\n/** Advanced; used by ceremonies. */\nexport function configOf(state: WorkflowState): ScrumConfig {\n return state.config as ScrumConfig;\n}\n\n/** Send an item back to the backlog: clear its open blockers and pending decisions, strip iteration and role. */\nfunction toBacklog(state: WorkflowState, id: string, now: string): WorkflowState {\n let s = state;\n const open = getItem(s, id).blockers.filter((b) => !b.clearedAt);\n if (open.length) {\n s = patchItem(s, id, (it) => ({\n ...it,\n blockers: it.blockers.map((b) => (b.clearedAt ? b : { ...b, clearedAt: now })),\n }));\n for (const b of open)\n s = appendEvent(\n s,\n \"blocker.cleared\",\n \"system\",\n { id, blocker: b.id, reason: \"sprint closed\" },\n now,\n );\n }\n for (const p of s.pending.filter((x) => x.item === id)) {\n s = { ...s, pending: s.pending.filter((x) => x.id !== p.id) };\n s = appendEvent(\n s,\n \"pending.dropped\",\n \"system\",\n { id: p.id, item: id, reason: \"sprint closed\" },\n now,\n );\n }\n const cur = getItem(s, id);\n if (cur.stage !== \"backlog\" || cur.status !== \"todo\")\n s = moveItem(s, id, { stage: \"backlog\", status: \"todo\" }, \"system\", now);\n // a question keeps its role: only the escalation target can answer it\n return stripItemFields(s, id, cur.type === \"question\" ? [\"iteration\"] : [\"iteration\", \"role\"]);\n}\n\n/** Advanced; used by ceremonies. Closes the open sprint and returns unfinished work (and its open questions) to the backlog. */\nexport function closeSprint(\n state: WorkflowState,\n reason: \"budget\" | \"review\" | \"cancel\",\n now: string,\n): WorkflowState {\n const it = openIteration(state);\n if (!it) return state;\n const committed = it.committed.map((id) => getItem(state, id));\n const done = committed.filter((i) => i.status === \"done\").map((i) => i.id);\n const dropped = committed.filter((i) => i.status === \"dropped\").map((i) => i.id);\n const carryover = committed\n .filter((i) => i.status !== \"done\" && i.status !== \"dropped\")\n .map((i) => i.id);\n const carriedQuestions = Object.values(state.items)\n .filter(\n (i) =>\n i.type === \"question\" &&\n i.parent !== undefined &&\n carryover.includes(i.parent) &&\n i.status !== \"done\" &&\n i.status !== \"dropped\",\n )\n .map((i) => i.id);\n let s: WorkflowState = state;\n for (const id of [...carryover, ...carriedQuestions]) s = toBacklog(s, id, now);\n const weightOf = (ids: string[]) =>\n ids.reduce((sum, id) => sum + (state.items[id]?.weight ?? 0), 0);\n s = {\n ...s,\n iterations: s.iterations.map((x) => {\n if (x.id !== it.id) return x;\n const { closing: _c, ...rest } = x;\n return {\n ...rest,\n endedAt: now,\n outcome: reason === \"cancel\" ? \"cancelled\" : \"completed\",\n carryover,\n };\n }),\n };\n return appendEvent(\n s,\n \"sprint.closed\",\n \"system\",\n {\n id: it.id,\n reason,\n done,\n carryover,\n carriedQuestions,\n dropped,\n doneWeight: weightOf(done),\n committedWeight: weightOf(it.committed),\n spent: it.spent,\n budget: it.budget,\n },\n now,\n );\n}\n\nexport function scrum(): Methodology<ScrumConfig> {\n return {\n name: \"scrum\",\n vocabulary: SCRUM_VOCABULARY,\n validateConfig: validateScrumConfig,\n defaultStages: scrumStages,\n defaultRoles: scrumRoles,\n requiredCapabilities: [\"order-backlog\", \"facilitate\", \"deliver\"],\n exclusiveCapabilities: [\"order-backlog\"],\n plannerOptions(state): PlannerOptions {\n const cap = configOf(state).inProgressWipLimit;\n return cap === undefined\n ? { schedulerMode: \"level\", dispatchStage: \"in_progress\" }\n : { schedulerMode: \"level\", dispatchStage: \"in_progress\", concurrencyCap: cap };\n },\n candidates(state): WorkItem[] {\n const it = openIteration(state);\n if (!it || it.closing) return [];\n return Object.values(state.items).filter(\n (i) =>\n i.iteration === it.id &&\n (i.status === \"todo\" || i.status === \"review\") &&\n (i.stage === \"sprint\" || i.stage === \"review\"),\n );\n },\n invariants(state, item): string[] {\n const it = openIteration(state);\n const cfg = configOf(state);\n const left = it ? remaining(it.budget, it.spent) : {};\n return [\n `Sprint Goal: ${it?.goal ?? \"(no open sprint)\"}; Product Goal: ${cfg.productGoal}`,\n `Budget remaining: ${JSON.stringify(left)}; stop and hand off when it is gone`,\n `Definition of Done: ${cfg.definitionOfDone.map((p) => (p.kind === \"evidence\" ? `evidence ${p.evidenceKind}` : p.kind)).join(\", \") || \"(none)\"}`,\n `Do not change the scope of \"${item.id}\" or its acceptance criteria; raise open_questions instead`,\n ];\n },\n ceremonies: scrumCeremonies(scrum),\n rules: scrumRules(),\n metrics: (state) => ({ ...scrumMetrics(state) }),\n humanDefaults: { gates: [\"sprint-review\"] },\n afterComplete(state, _itemId, now) {\n const it = openIteration(state);\n if (!it || (!it.closing && !isExhausted(it.budget, it.spent))) return state;\n const inFlight = Object.values(state.items).some(\n (i) => i.iteration === it.id && i.status === \"in_progress\",\n );\n if (!inFlight) return closeSprint(state, \"budget\", now);\n if (it.closing) return state;\n return appendEvent(\n {\n ...state,\n iterations: state.iterations.map((x) => (x.id === it.id ? { ...x, closing: true } : x)),\n },\n \"sprint.closing\",\n \"system\",\n { id: it.id },\n now,\n );\n },\n };\n}\n"]}
|
package/dist/chunk-CWBH7H52.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
'use strict';var chunkSJRRQZ3R_cjs=require('./chunk-SJRRQZ3R.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exFlow=require('ex-flow');var U={tokens:0,turns:0,wallclockMs:0};function V(e,t){return {tokens:e.tokens+t.tokensIn+t.tokensOut,turns:e.turns+1,wallclockMs:e.wallclockMs+t.durationMs}}function q(e,t){let r={};return e.tokens!==void 0&&(r.tokens=Math.max(0,e.tokens-t.tokens)),e.turns!==void 0&&(r.turns=Math.max(0,e.turns-t.turns)),e.wallclockMs!==void 0&&(r.wallclockMs=Math.max(0,e.wallclockMs-t.wallclockMs)),r}function X(e,t){return e.tokens!==void 0&&t.tokens>=e.tokens||e.turns!==void 0&&t.turns>=e.turns||e.wallclockMs!==void 0&&t.wallclockMs>=e.wallclockMs}function F(e,t,r=2e4){let u=t??1,a=[];for(let i of e.accounting){let d=e.items[i.item]?.weight;d===void 0||d<=0||a.push((i.tokensIn+i.tokensOut)/d);}if(a.length===0)return r*u;a.sort((i,d)=>i-d);let o=Math.floor(a.length/2),p=a.length%2?a[o]:(a[o-1]+a[o])/2;return Math.round(p*u)}function K(e){return e.iterations.find(t=>t.endedAt===void 0)}function A(e,t,r){if(t.role){let o=chunkSJRRQZ3R_cjs.e(e,t.role);return o||chunkS3BXVHO7_cjs.b("unknown-role",`item "${t.id}" is assigned to unknown role "${t.role}"`,"editItem with an existing role id"),o}let u=r?r(t):void 0;if(u!==void 0){let o=chunkSJRRQZ3R_cjs.e(e,u);return o||chunkS3BXVHO7_cjs.b("unknown-role",`the methodology picked unknown role "${u}" for item "${t.id}"`,`registered roles: ${Object.keys(e.roles).join(", ")||"(none)"}`,{items:[t.id]}),o}if(t.status==="review"){let o=chunkSJRRQZ3R_cjs.G(e,t),p=chunkSJRRQZ3R_cjs.i(e,"review"),d=p.find(w=>w.id!==o)??(p.length===1?p[0]:void 0);return d||chunkS3BXVHO7_cjs.b("missing-capability",`no role has capability "review" for item "${t.id}"`,"register a role with capability review",{items:[t.id]}),d}let a=chunkSJRRQZ3R_cjs.i(e,"deliver")[0];return a||chunkS3BXVHO7_cjs.b("missing-capability",`no role has capability "deliver" for item "${t.id}"`,"register a role with capability deliver",{items:[t.id]}),a}function T(e){let t={};for(let r of Object.values(e.roles))r.maxConcurrent!==void 0&&(t[r.resourceClass??r.id]=r.maxConcurrent);return t}function Q(e,t,r,u){let a=new Set(e.map(o=>o.id));return e.map(o=>{let p=A(t,o,u),i={id:o.id,data:{id:o.id},dependsOn:o.dependsOn.filter(w=>a.has(w)),resourceClass:p.resourceClass??p.id},d=r?r(o):o.priority;return d!==void 0&&(i.priority=d),o.weight!==void 0&&(i.weight=o.weight),o.deadline!==void 0&&(i.deadline=Date.parse(o.deadline)),i})}function ae(e,t,r={}){let u=chunkSJRRQZ3R_cjs.a(r.now),a=t.candidates(e),o=a.filter(n=>n.dependsOn.every(s=>e.items[s]?.status==="done"||a.some(c=>c.id===s))),p=a.filter(n=>n.dependsOn.every(s=>e.items[s]?.status==="done"));if(o.length===0)return {state:e,dispatched:[],skipped:[],reason:"no-candidates"};let i=t.plannerOptions(e),d={schedulerMode:i.schedulerMode,resourceCaps:T(e)};if(i.concurrencyCap!==void 0&&(d.concurrencyCap=i.concurrencyCap),i.fairnessPolicy!==void 0&&(d.fairnessPolicy=i.fairnessPolicy),i.maxDeferralRounds!==void 0&&(d.maxDeferralRounds=i.maxDeferralRounds),i.deadlineStrategy!==void 0&&(d.deadlineStrategy=i.deadlineStrategy),i.weightStrategy!==void 0&&(d.weightStrategy=i.weightStrategy),i.tieBreaker!==void 0){let n=i.tieBreaker;d.tieBreaker=(s,c)=>n(e.items[s.data.id],e.items[c.data.id]);}let w,P;try{let n=new exFlow.ExFlow(d);for(let c of Q(o,e,i.priorityOf,i.roleFor))n.addEntity(c);let s=n.resolveExecutionDetails();w=(s.plan.batches[0]??[]).map(c=>c.id),P=s.metrics;}catch(n){throw n instanceof exFlow.ExFlowRuntimeError&&chunkS3BXVHO7_cjs.b("planner-error",`ex-flow refused the graph: [${n.code}] ${n.message}`,"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message",{items:o.map(s=>s.id)}),n}let L=w.map(n=>e.items[n]).filter(n=>n.dependsOn.every(s=>e.items[s]?.status==="done")),_=Object.values(e.items).filter(n=>n.status==="in_progress"),H=new Set(i.wipCounts??["in_progress"]),Z=Object.values(e.items).filter(n=>H.has(n.status)),S={};for(let n of _){let s=n.role?chunkSJRRQZ3R_cjs.e(e,n.role):void 0,c=s?s.resourceClass??s.id:"?";S[c]=(S[c]??0)+1;}let M=T(e),R=K(e),b=R?q(R.budget,R.spent).tokens:void 0,z=Math.min(r.max??1/0,i.concurrencyCap??1/0),g=[],h=[],l,f=e;for(let n of L){if(g.length>=z){l="wip-full";break}let s=typeof i.dispatchStage=="function"?i.dispatchStage(n):i.dispatchStage,c=n.status==="todo"&&s!==void 0?s:n.stage,y=chunkSJRRQZ3R_cjs.p(e,c),C=n.type==="question"?[]:chunkSJRRQZ3R_cjs.D(e,n,y.entryPolicy);if(C.length>0){h.push({id:n.id,reason:"entry-policy",detail:C.map(m=>m.message).join("; ")});continue}let W=i.wipLimitOf?i.wipLimitOf(y,n):y.wipLimit;if(W!==void 0&&Z.filter(m=>m.stage===y.id&&m.id!==n.id).length+g.filter(m=>m.stage===y.id).length>=W){l="wip-full",h.push({id:n.id,reason:"wip",detail:`stage "${y.id}" is at its WIP limit of ${W}`});continue}let O=A(e,n,i.roleFor),k=O.resourceClass??O.id;if(M[k]!==void 0&&(S[k]??0)>=M[k]){l="wip-full",h.push({id:n.id,reason:"resource-cap",detail:`resource class "${k}" is at its cap of ${M[k]}`});continue}if(b!==void 0){let m=F(e,n.weight,r.fallbackTokensPerWeight);if(m>b){l="budget-exhausted",h.push({id:n.id,reason:"budget",detail:`needs about ${m} tokens, ${b} left in the iteration`});continue}b-=m;}S[k]=(S[k]??0)+1,f=chunkSJRRQZ3R_cjs.x(f,n.id,{stage:c,status:"in_progress"},O.id,u),f={...f,items:{...f.items,[n.id]:{...f.items[n.id],role:O.id}}},g.push(f.items[n.id]);}return l===void 0&&h.some(n=>n.reason==="entry-policy")&&(l="policy-blocked"),l===void 0&&g.length<p.length&&(l="wip-full"),g.length===0&&l===void 0&&(l="no-candidates"),f=chunkSJRRQZ3R_cjs.c(f,"planner.resolved","planner",{dispatched:g.map(n=>n.id),reason:l??null,skipped:h,metrics:P},u),l?{state:f,dispatched:g,skipped:h,reason:l}:{state:f,dispatched:g,skipped:h}}exports.a=U;exports.b=V;exports.c=q;exports.d=X;exports.e=F;exports.f=K;exports.g=A;exports.h=T;exports.i=Q;exports.j=ae;//# sourceMappingURL=chunk-CWBH7H52.cjs.map
|
|
2
|
-
//# sourceMappingURL=chunk-CWBH7H52.cjs.map
|