ex-workflow 0.6.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +17 -2
  2. package/README.md +12 -6
  3. package/dist/chunk-3KFQPSRX.mjs +2 -0
  4. package/dist/chunk-3KFQPSRX.mjs.map +1 -0
  5. package/dist/{chunk-MH66G5KV.cjs → chunk-5PHK72VM.cjs} +2 -2
  6. package/dist/{chunk-MH66G5KV.cjs.map → chunk-5PHK72VM.cjs.map} +1 -1
  7. package/dist/chunk-CYXVGHQM.cjs +2 -0
  8. package/dist/chunk-CYXVGHQM.cjs.map +1 -0
  9. package/dist/chunk-FKTCGQYB.cjs +2 -0
  10. package/dist/chunk-FKTCGQYB.cjs.map +1 -0
  11. package/dist/chunk-HIHMBMB5.cjs +2 -0
  12. package/dist/chunk-HIHMBMB5.cjs.map +1 -0
  13. package/dist/{chunk-KF5VQH3M.mjs → chunk-MQWMQ4PD.mjs} +2 -2
  14. package/dist/{chunk-KF5VQH3M.mjs.map → chunk-MQWMQ4PD.mjs.map} +1 -1
  15. package/dist/chunk-QDMEM62U.mjs +2 -0
  16. package/dist/chunk-QDMEM62U.mjs.map +1 -0
  17. package/dist/chunk-U3OXAO67.mjs +2 -0
  18. package/dist/chunk-U3OXAO67.mjs.map +1 -0
  19. package/dist/chunk-UZQV73X7.mjs +2 -0
  20. package/dist/chunk-UZQV73X7.mjs.map +1 -0
  21. package/dist/chunk-VXH2FAKV.cjs +2 -0
  22. package/dist/chunk-VXH2FAKV.cjs.map +1 -0
  23. package/dist/chunk-XMO2RCXB.cjs +2 -0
  24. package/dist/chunk-XMO2RCXB.cjs.map +1 -0
  25. package/dist/chunk-YBHHICTZ.mjs +2 -0
  26. package/dist/chunk-YBHHICTZ.mjs.map +1 -0
  27. package/dist/{chunk-3CLDZCHN.cjs → chunk-YJN4JEJU.cjs} +2 -2
  28. package/dist/{chunk-3CLDZCHN.cjs.map → chunk-YJN4JEJU.cjs.map} +1 -1
  29. package/dist/chunk-Z2G7DGDF.mjs +2 -0
  30. package/dist/{chunk-TEPK5Y36.mjs.map → chunk-Z2G7DGDF.mjs.map} +1 -1
  31. package/dist/cli/bin.cjs +1 -1
  32. package/dist/cli/bin.mjs +1 -1
  33. package/dist/cli/index.cjs +1 -1
  34. package/dist/cli/index.mjs +1 -1
  35. package/dist/index.cjs +1 -1
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.mjs +1 -1
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/kanban/index.cjs +1 -1
  42. package/dist/kanban/index.mjs +1 -1
  43. package/dist/scrum/index.cjs +1 -1
  44. package/dist/scrum/index.mjs +1 -1
  45. package/dist/waterfall/index.cjs +1 -1
  46. package/dist/waterfall/index.d.cts +2 -1
  47. package/dist/waterfall/index.d.ts +2 -1
  48. package/dist/waterfall/index.mjs +1 -1
  49. package/package.json +1 -1
  50. package/dist/chunk-2OVYXXNV.cjs +0 -2
  51. package/dist/chunk-2OVYXXNV.cjs.map +0 -1
  52. package/dist/chunk-7CDGPTEJ.mjs +0 -2
  53. package/dist/chunk-7CDGPTEJ.mjs.map +0 -1
  54. package/dist/chunk-GT57PLUT.mjs +0 -2
  55. package/dist/chunk-GT57PLUT.mjs.map +0 -1
  56. package/dist/chunk-IHE5K4X3.mjs +0 -2
  57. package/dist/chunk-IHE5K4X3.mjs.map +0 -1
  58. package/dist/chunk-N3QB2S7R.cjs +0 -2
  59. package/dist/chunk-N3QB2S7R.cjs.map +0 -1
  60. package/dist/chunk-NA53TZE4.mjs +0 -2
  61. package/dist/chunk-NA53TZE4.mjs.map +0 -1
  62. package/dist/chunk-TEPK5Y36.mjs +0 -2
  63. package/dist/chunk-UBFIKDIP.cjs +0 -2
  64. package/dist/chunk-UBFIKDIP.cjs.map +0 -1
  65. package/dist/chunk-UUOMQMWT.cjs +0 -2
  66. package/dist/chunk-UUOMQMWT.cjs.map +0 -1
  67. package/dist/chunk-Z3PU6EBI.mjs +0 -2
  68. package/dist/chunk-Z3PU6EBI.mjs.map +0 -1
  69. package/dist/chunk-ZTE7LREB.cjs +0 -2
  70. package/dist/chunk-ZTE7LREB.cjs.map +0 -1
@@ -0,0 +1 @@
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","y","cx","cy","assertCommittable","getItem","fail","assertPolicies","stageOf","attachQuestions","parentIds","iterationId","by","now","q","moveItem","patchItem","setDod","policies","configOf","st","selectAuto","budget","cfg","ids","skipped","exit","tokens","unmet","evaluatePolicies","u","est","estimateTokens","scrumCeremonies","methodology","act","type","input","reduce","applyAction","nowOf","requireCap","split","reestimateRaw","reestimate","patch","editItem","appendEvent","sp","n","addItem","goal","auto","wanted","last","carryover","w","resumed","rs","resumeStageOf","committedWeight","seen","stripItemFields","c","approvers","approverIds","feedback","done","f","closeSprint","closedAt","parsed","parseLessonInput","dod","backlogAdded","dodChanged","out","applyLessonInput","cur","defs","p","ADD_MODES","validateScrumConfig","raw","add","wip","autoClose","mode","fallback","ratio","num","den","scrumMetrics","corrections","late","counted","doneWeight","increments","withTokens","tokensSpent","currentSprint","weight","list","spentTokens","budgetTokens","scrumRoles","v","rule","severity","message","fix","lastClosed","policyKey","scrumRules","a","seq","sev","missing","canDo","next","kept","removed","describe","scrumStages","config","inProgress","SCRUM_VOCABULARY","t","toBacklog","open","reason","committed","dropped","carriedQuestions","weightOf","_c","rest","scrum","po","left","_itemId","isExhausted"],"mappings":"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","file":"chunk-HIHMBMB5.cjs","sourcesContent":["import { timSort } from \"exsorted\";\nimport { estimateTokens, remaining } from \"../budget.ts\";\nimport { fail } from \"../errors.ts\";\nimport { applyLessonInput, parseLessonInput } from \"../lessons.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, evaluatePolicies } 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 Methodology,\n NewItem,\n Policy,\n WorkItem,\n WorkflowState,\n} from \"../types.ts\";\nimport { closeSprint, configOf, resumeStageOf } 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. */\nexport function 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\ninterface Skipped {\n id: string;\n reason: \"policy\" | \"budget\";\n detail: string;\n}\n\nfunction selectAuto(state: WorkflowState, budget: Budget): { ids: string[]; skipped: Skipped[] } {\n const cfg = configOf(state);\n const ids: string[] = [];\n const skipped: Skipped[] = [];\n const exit = stageOf(state, \"backlog\").exitPolicy;\n let tokens = 0;\n for (const item of backlogOrdered(state)) {\n const unmet = evaluatePolicies(state, item, exit);\n if (unmet.length > 0) {\n skipped.push({\n id: item.id,\n reason: \"policy\",\n detail: unmet.map((u) => u.message).join(\"; \"),\n });\n continue;\n }\n if (budget.turns !== undefined && ids.length >= budget.turns) {\n skipped.push({ id: item.id, reason: \"budget\", detail: \"turns budget full\" });\n continue;\n }\n if (budget.tokens !== undefined) {\n const est = estimateTokens(state, item.weight, cfg.fallbackTokensPerWeight, cfg.estimateMode);\n if (tokens + est > budget.tokens) {\n skipped.push({\n id: item.id,\n reason: \"budget\",\n detail: `needs about ${est} tokens, ${budget.tokens - tokens} left`,\n });\n continue;\n }\n tokens += est;\n }\n ids.push(item.id);\n }\n return { ids, skipped };\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 const reestimateRaw: unknown = input[\"reestimate\"] ?? [];\n if (!Array.isArray(reestimateRaw) || !reestimateRaw.every((x) => typeof x === \"string\"))\n fail(\n \"invalid-input\",\n \"refine.reestimate must be a list of item ids\",\n 'pass reestimate: [\"A\"]',\n );\n const reestimate = reestimateRaw as string[];\n if (items.length === 0 && split.length === 0 && reestimate.length === 0)\n fail(\n \"invalid-input\",\n \"refine needs items[], split[] or reestimate[]\",\n \"pass at least one patch, split or reestimate\",\n );\n for (const id of reestimate) {\n const it = getItem(state, id);\n if (it.stage !== \"backlog\" || it.status !== \"todo\" || it.weight === undefined)\n fail(\n \"invalid-input\",\n `item \"${id}\" has no weight to confirm in the Product Backlog`,\n \"refine it with a patch { weight } instead\",\n { items: [id] },\n );\n }\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 id of reestimate)\n s = appendEvent(\n s,\n \"item.reestimated\",\n input.by,\n { id, weight: getItem(s, id).weight },\n now,\n );\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 reestimated: reestimate,\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 auto = input[\"items\"] === \"auto\" ? selectAuto(state, budget) : undefined;\n const skipped = auto?.skipped ?? [];\n const wanted = auto ? auto.ids : (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 skipped.length\n ? `; skipped: ${skipped.map((x) => `${x.id} (${x.reason}: ${x.detail})`).join(\", \")}`\n : \"\"\n }`,\n \"refine the backlog (acceptance + estimates) or raise the budget with exwf config set\",\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 const resumed: string[] = [];\n for (const w of wanted) {\n const rs = resumeStageOf(getItem(s, w), s);\n if (rs) resumed.push(w);\n s = moveItem(\n s,\n w,\n rs ? { stage: rs, status: \"review\" } : { stage: \"sprint\", status: \"todo\" },\n input.by,\n now,\n );\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, skipped, resumed },\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 const resumed: string[] = [];\n for (const id of items) {\n const rs = resumeStageOf(getItem(s, id), s);\n if (rs) resumed.push(id);\n s = moveItem(\n s,\n id,\n rs ? { stage: rs, status: \"review\" } : { stage: \"sprint\", status: \"todo\" },\n input.by,\n now,\n );\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, resumed },\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 parsed = parseLessonInput(state, input, \"retro\");\n const dod = input[\"dodChanges\"] as Policy[] | undefined;\n return act(state, \"ceremony.retro\", input, (s, now) => {\n const backlogAdded: string[] = [];\n let dodChanged = false;\n const out = applyLessonInput(s, parsed, input.by, now, (cur, c) => {\n if (c.kind === \"dod\") {\n const defs = configOf(cur).definitionOfDone;\n if (defs.some((p) => JSON.stringify(p) === JSON.stringify(c.policy))) return cur;\n dodChanged = true;\n return setDod(cur, [...defs, c.policy]);\n }\n if (c.kind === \"backlog\") {\n backlogAdded.push(c.item.id);\n return addItem(\n cur,\n { ...c.item, stage: \"backlog\", tags: [...(c.item.tags ?? []), \"retro\"] },\n input.by,\n now,\n );\n }\n return cur;\n });\n s = out.state;\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: out.adopted,\n dismissed: out.dismissed,\n agreements: out.agreements,\n retired: out.retired,\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 type { EstimateMode } from \"../budget.ts\";\nimport { 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 /** Close the sprint automatically when its budget is spent and nothing is in flight; default true. */\n autoClose?: boolean;\n /** How the planner and sprint planning price a candidate; default \"per-weight\". */\n estimateMode?: EstimateMode;\n /** Tokens per weight unit when no accounting history exists; default 20000. */\n fallbackTokensPerWeight?: 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 autoClose = c[\"autoClose\"];\n if (autoClose !== undefined && typeof autoClose !== \"boolean\")\n fail(\n \"config-invalid\",\n \"scrum config.autoClose must be true or false\",\n \"omit it for the default true\",\n );\n const mode = c[\"estimateMode\"];\n if (mode !== undefined && mode !== \"per-weight\" && mode !== \"per-call\")\n fail(\n \"config-invalid\",\n `scrum config.estimateMode must be per-weight | per-call (got ${JSON.stringify(mode)})`,\n 'use \"per-weight\" (the default) or \"per-call\"',\n );\n const fallback = c[\"fallbackTokensPerWeight\"];\n if (\n fallback !== undefined &&\n (typeof fallback !== \"number\" || !Number.isFinite(fallback) || fallback <= 0)\n )\n fail(\n \"config-invalid\",\n \"scrum config.fallbackTokensPerWeight must be a positive finite number\",\n \"omit it for the default 20000\",\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 if (autoClose !== undefined) out.autoClose = autoClose as boolean;\n if (mode !== undefined) out.estimateMode = mode as EstimateMode;\n if (fallback !== undefined) out.fallbackTokensPerWeight = fallback as number;\n return out;\n}\n","import { openIteration } from \"../planner.ts\";\nimport type { Budget, WorkflowState } from \"../types.ts\";\n\ninterface Closed {\n id?: string;\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 /** The open sprint right now; all zeros when none is open. */\n current: Record<string, number>;\n}\n\nconst ratio = (num: number, den: number) => (den === 0 ? 0 : num / den);\n\nexport function scrumMetrics(state: WorkflowState): ScrumMetrics {\n const corrections = state.events.filter((e) => e.type === \"accounting.corrected\");\n const closed = state.events\n .filter((e) => e.type === \"sprint.closed\")\n .map((e) => {\n const c = e.payload as Closed;\n // corrections recorded after the close still belong to that sprint's spend\n const late = corrections\n .filter(\n (x) =>\n x.seq > e.seq &&\n c.id !== undefined &&\n (x.payload as { iteration: string | null }).iteration === c.id,\n )\n .reduce((sum, x) => sum + (x.payload as { delta: { tokens: number } }).delta.tokens, 0);\n return late === 0 ? c : { ...c, spent: { ...c.spent, tokens: c.spent.tokens + late } };\n });\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 current: currentSprint(state),\n };\n}\n\nfunction currentSprint(state: WorkflowState): Record<string, number> {\n const it = openIteration(state);\n const items = (it?.committed ?? []).map((id) => state.items[id]).filter((i) => i !== undefined);\n const weight = (list: typeof items) => list.reduce((sum, i) => sum + (i.weight ?? 0), 0);\n const committedWeight = weight(items);\n const doneWeight = weight(items.filter((i) => i.status === \"done\"));\n const spentTokens = it?.spent.tokens ?? 0;\n const budgetTokens = it?.budget.tokens ?? 0;\n return {\n spentTokens,\n spentTurns: it?.spent.turns ?? 0,\n budgetTokens,\n committedWeight,\n doneWeight,\n remainingWeight: committedWeight - doneWeight,\n costPerPoint: ratio(spentTokens, doneWeight),\n budgetUtilisation: ratio(spentTokens, budgetTokens),\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 { fail } from \"../errors.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport type { Budget, Iteration, Policy, Rule, Violation, WorkflowState } from \"../types.ts\";\nimport type { ItemPatch } from \"../items.ts\";\nimport { canDo, closedSeq } from \"./ceremonies.ts\";\nimport { configOf, resumeStageOf } 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}\n/** Canonical identity of a Definition of Done policy, independent of JSON key order. */\nconst policyKey = (p: Policy): string =>\n p.kind === \"evidence\"\n ? `evidence:${p.evidenceKind}`\n : p.kind === \"custom\"\n ? `custom:${p.id}`\n : p.kind;\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 between sprints with changeConfig / exwf config set, not 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 closing: Rule = {\n id: \"sprint-closing\",\n severity: \"error\",\n check: (s, a) => {\n const it = openIteration(s);\n return a.type === \"ceremony.commit\" && it?.closing\n ? [\n v(\n \"sprint-closing\",\n \"error\",\n `sprint ${it.id} is closing: its budget is spent and no new work can start`,\n \"run ceremony review or cancel first, then plan the next sprint\",\n ),\n ]\n : [];\n },\n };\n\n const stageIds: Rule = {\n id: \"scrum-stage-ids\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"init\") return [];\n const missing = [\"backlog\", \"sprint\", \"review\"].filter(\n (id) => !s.stages.some((st) => st.id === id),\n );\n if (missing.length)\n fail(\n \"config-invalid\",\n `scrum stages lack the required id(s): ${missing.join(\", \")}`,\n \"keep the stages backlog, sprint and review (omit stages to use the defaults), then run exwf init scrum again\",\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 if (a.type !== \"ceremony.retro\") return [];\n const p = (a.payload ?? {}) as { dodChanges?: unknown; allowWeaken?: boolean };\n if (p.dodChanges === undefined) return [];\n if (openIteration(s))\n return [\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 if (!Array.isArray(p.dodChanges) || p.allowWeaken === true) return [];\n const next = p.dodChanges as Policy[];\n const kept = new Set(next.map(policyKey));\n const removed = configOf(s).definitionOfDone.filter((q) => !kept.has(policyKey(q)));\n if (removed.length === 0) return [];\n const describe = removed.map((q) => policyKey(q).replace(\":\", \" \"));\n return [\n v(\n \"dod-not-weakened\",\n \"error\",\n `retro dodChanges drops ${removed.length} Definition of Done policy(ies): ${describe.join(\", \")}`,\n 'keep them in dodChanges (it replaces the whole list; suggestedChange { kind: \"dod\" } appends one), or pass allowWeaken: true to weaken the Definition of Done knowingly',\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.items[id] && resumeStageOf(s.items[id], s) !== undefined) &&\n !s.events.some(\n (e) =>\n e.seq > seq &&\n (e.payload as { id: string }).id === id &&\n ((e.type === \"item.edited\" &&\n (e.payload as { changed: string[] }).changed.includes(\"weight\")) ||\n e.type === \"item.reestimated\"),\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, closing, stageIds, 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, setDod } 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/**\n * The stage a carried-over item was returned from when it was in a review stage: it resumes there, not at the\n * sprint start. closeSprint releases blocked and awaiting_human items, so the stage (its `review` flag) is read from\n * the last system transition, not the status. Without `state` only a `review` status is recognised.\n */\nexport function resumeStageOf(item: WorkItem, state?: WorkflowState): string | undefined {\n const t = item.transitions.at(-1);\n if (!t || t.by !== \"system\" || t.to.stage !== \"backlog\" || t.to.status !== \"todo\")\n return undefined;\n if (!state) return t.from.status === \"review\" ? t.from.stage : undefined;\n const st = state.stages.find((x) => x.id === t.from.stage);\n return st?.review || t.from.status === \"review\" ? t.from.stage : undefined;\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 cfg = configOf(state);\n const po: PlannerOptions = { schedulerMode: \"level\", dispatchStage: \"in_progress\" };\n if (cfg.inProgressWipLimit !== undefined) po.concurrencyCap = cfg.inProgressWipLimit;\n if (cfg.estimateMode !== undefined) po.estimateMode = cfg.estimateMode;\n if (cfg.fallbackTokensPerWeight !== undefined)\n po.fallbackTokensPerWeight = cfg.fallbackTokensPerWeight;\n return po;\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 report(state) {\n const it = openIteration(state);\n return {\n closing: it?.closing === true,\n sprint: it?.id ?? null,\n reason: it?.closing ? \"budget\" : null,\n inFlight: it\n ? Object.values(state.items)\n .filter(\n (i) =>\n (i.iteration === it.id || it.committed.includes(i.id)) &&\n i.status === \"in_progress\",\n )\n .map((i) => i.id)\n : [],\n };\n },\n humanDefaults: { gates: [\"sprint-review\"] },\n afterConfigChange(state) {\n return setDod(state, configOf(state).definitionOfDone);\n },\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 || it.committed.includes(i.id)) && i.status === \"in_progress\",\n );\n if (!inFlight && configOf(state).autoClose !== false)\n 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"]}
@@ -1,2 +1,2 @@
1
- import {b as b$2,e as e$2,d as d$2,c as c$1}from'./chunk-TEPK5Y36.mjs';import {l}from'./chunk-7CDGPTEJ.mjs';import {I}from'./chunk-GT57PLUT.mjs';import {N}from'./chunk-NA53TZE4.mjs';import {f,V,d as d$1,P,J,u,W,A,Y,w as w$1,v,X}from'./chunk-Z3PU6EBI.mjs';import {c,e,d,g,f as f$1,b as b$3}from'./chunk-7IG6EQI4.mjs';import {b as b$1,e as e$1,h as h$1,g as g$1,f as f$2}from'./chunk-5TXYMLBF.mjs';import {b,a}from'./chunk-2FRRD6A3.mjs';import {stat,readFile}from'fs/promises';import w from'path';var $={scrum:l,kanban:I,waterfall:N},p=["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] [--fallback-tokens-per-weight n]","exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--estimate] [--role r]","exwf account <item> [--line n] [--tokens-in n] [--tokens-out n] [--duration-ms n] [--model m] [--by who]","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf config set <patch.json> [--by who] exwf unblock <item> [--blocker id] [--note text] [--by who]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"],at=new Set(["estimate"]);function et(l){let t=[],u={};for(let a=0;a<l.length;a++){let v=l[a];if(v.startsWith("--")){let n=v.slice(2);if(at.has(n)){u[n]="true";continue}let m=l[a+1];(m===void 0||m.startsWith("--"))&&b("invalid-input",`--${n} needs a value`,`pass --${n} <text>`),u[n]=m,a++;}else t.push(v);}return {positional:t,flags:u}}async function x(l){try{return JSON.parse(await readFile(l,"utf8"))}catch(t){return b("invalid-input",`cannot read JSON from ${l}: ${t.message}`,"check the path and that the file is valid JSON")}}function h(l){let t=Object.hasOwn($,l.methodology)?$[l.methodology]:void 0;return t||b("config-invalid",`methodology "${l.methodology}" is not available in this build`,`available: ${Object.keys($).join(", ")}`),t()}function y(l,t){let u=Number(l[t]);return Number.isFinite(u)||b("invalid-input",`--${t} must be a number (got ${JSON.stringify(l[t])})`,`pass --${t} <n>`),u}var it=new Set(["init","add","edit","next","complete","account","ceremony","decide","unblock"]);async function St(l,t){try{let[u,a]=et(l).positional;return u!==void 0&&(it.has(u)||u==="role"&&a==="add"||u==="config"&&a==="set")?await c(t,()=>tt(l,t)):await tt(l,t)}catch(u){if(u instanceof a)return {exit:1,out:{ok:false,error:u.toJSON()}};throw u}}async function tt(l,t){let{positional:u$1,flags:a$1}=et(l),[v$1,...n]=u$1,m=a$1.by??"human",d$3=new Date().toISOString();switch(v$1){case "init":{let[e]=n,o=e&&Object.hasOwn($,e)?$[e]:void 0;if(!o||!a$1.config)return {exit:2,out:{ok:false,usage:p}};try{await stat(b$3(t)),b("invalid-input",`${b$3(t)} already exists`,"delete .workflow/state.json to start over");}catch(c){if(c instanceof a||c.code!=="ENOENT")throw c}let s=await x(w.resolve(t,a$1.config)),i=a$1.roles?await x(w.resolve(t,a$1.roles)):void 0;if(i!==void 0){Array.isArray(i)||b("invalid-input",`roles file ${a$1.roles} must contain an array of role manifests`,"wrap the manifests in [ ... ]");for(let c of i)b$1(e$1,c,`roles file ${a$1.roles}`);}let r=X(i?{methodology:o(),config:s,roles:i,by:m,now:d$3}:{methodology:o(),config:s,by:m,now:d$3});return await d(t,r.state),{exit:0,out:{ok:true,warnings:r.warnings,state:{methodology:r.state.methodology,stages:r.state.stages.map(c=>c.id),roles:Object.keys(r.state.roles)}}}}case "add":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[0]));b$1(f$2,o,`item file ${n[0]}`);let s=W(e$1,h(e$1),{type:"item.add",by:m,payload:{item:o}},i=>v(i,o,m,d$3));return await d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,item:u(s.state,o.id)}}}case "edit":{if(!n[0]||!n[1])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=n[0],s=await x(w.resolve(t,n[1]));b$1(g$1,s,`patch file ${n[1]}`);let i=W(e$1,h(e$1),{type:"item.edit",by:m,payload:{id:o,patch:s}},r=>w$1(r,o,s,m,d$3));return await d(t,i.state),{exit:0,out:{ok:true,warnings:i.warnings,item:u(i.state,o)}}}case "next":{let e$1=await e(t),o={now:d$3};a$1.max&&(o.max=y(a$1,"max")),a$1["fallback-tokens-per-weight"]&&(o.fallbackTokensPerWeight=y(a$1,"fallback-tokens-per-weight"));let s=c$1(e$1,h(e$1),o);for(let i of s.briefs)await f$1(t,i);return await d(t,s.state),{exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!n[0]||!n[1])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[1]));b$1(h$1,o,`handoff file ${n[1]}`),o.item!==n[0]&&b("handoff-invalid",`handoff.item "${o.item}" differs from the command's item "${n[0]}"`,"make them match");let s=a$1.role??o.role,i=y(a$1,"duration-ms"),r={item:n[0],role:s,model:a$1.model??"",tokensIn:y(a$1,"tokens-in"),tokensOut:y(a$1,"tokens-out"),durationMs:i,startedAt:new Date(Date.parse(d$3)-i).toISOString(),endedAt:d$3};a$1.estimate==="true"&&(r.estimate=true);let c=d$2(e$1,h(e$1),{...o,role:s},r,d$3);return await g(t,o,c.state.events.length),await d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,item:u(c.state,n[0])}}}case "account":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o={};a$1["tokens-in"]!==void 0&&(o.tokensIn=y(a$1,"tokens-in")),a$1["tokens-out"]!==void 0&&(o.tokensOut=y(a$1,"tokens-out")),a$1["duration-ms"]!==void 0&&(o.durationMs=y(a$1,"duration-ms")),a$1.model!==void 0&&(o.model=a$1.model);let s=a$1.line!==void 0?y(a$1,"line"):void 0,i=e$2(e$1,n[0],o,a$1.by??"human",d$3,s);await d(t,i);let r=d$1(i),c=r.payload.line;return {exit:0,out:{ok:true,line:i.accounting.filter(A=>A.item===n[0])[c-1],event:r}}}case "ceremony":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=h(e$1),s=Object.hasOwn(o.ceremonies,n[0])?o.ceremonies[n[0]]:void 0;s||b("unknown-ceremony",`"${n[0]}" is not a ${o.name} ceremony`,`available: ${Object.keys(o.ceremonies).join(", ")}`);let i=n[1]?await x(w.resolve(t,n[1])):{},r=s(e$1,{...i,by:m,now:d$3});return await d(t,r.state),{exit:0,out:{ok:true,warnings:r.warnings,lastEvent:d$1(r.state)}}}case "config":{if(n[0]!=="set"||!n[1])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[1])),s=Y(e$1,h(e$1),o,m,d$3);return await d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,changed:d$1(s.state).payload.changed,config:s.state.config}}}case "unblock":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=n[0],o=await e(t),s=u(o,e$1).blockers.filter(O=>!O.clearedAt).map(O=>O.id);s.length===0&&b("invalid-input",`item ${e$1} has no open blocker`,"nothing to clear; check exwf board");let i=a$1.blocker!==void 0?[a$1.blocker]:s,r=a$1.note,c=W(o,h(o),{type:"blocker.clear",by:m,payload:{id:e$1,blockers:i,note:r??null}},O=>i.reduce((A$1,ot)=>A(A$1,e$1,ot,m,d$3,r),O));return await d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,item:u(c.state,e$1)}}}case "decide":{if(!n[0]||n[1]!=="approve"&&n[1]!=="reject")return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=e$1.pending.find(i=>i.id===n[0]),s=J(e$1,n[0],n[1],m,a$1.note??"",d$3,h(e$1));return await d(t,s),{exit:0,out:{ok:true,item:o?.item?u(s,o.item):null}}}case "status":{let e$1=await e(t),o=h(e$1),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let i of Object.values(e$1.items))s[i.status]+=1;return {exit:0,out:{ok:true,methodology:e$1.methodology,openIteration:P(e$1)??null,counts:s,pending:e$1.pending,openQuestions:b$2(e$1),lastEvent:d$1(e$1),report:o.report?o.report(e$1):null}}}case "board":{let e$1=await e(t);return {exit:0,out:{ok:true,columns:e$1.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(e$1.items).filter(i=>i.stage===s.id&&i.status!=="dropped").map(i=>({id:i.id,title:i.title,status:i.status,role:i.role??null,age:i.transitions.length?Date.parse(d$3)-Date.parse(i.transitions[i.transitions.length-1].at):null}))}))}}}case "metrics":{let e$1=await e(t);return {exit:0,out:{ok:true,metrics:h(e$1).metrics(e$1)}}}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(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[0]));return {exit:0,out:{ok:true,violations:V(e$1,h(e$1),o)}}}case "role":{let e$2=await e(t);if(n[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(e$2.roles),detail:e$2.roles}};if(n[0]==="add"&&n[1]){let o=await x(w.resolve(t,n[1]));b$1(e$1,o,`role manifest ${n[1]}`);let s=f(e$2,o,m,d$3);return await d(t,s),{exit:0,out:{ok:true,roles:Object.keys(s.roles)}}}return {exit:2,out:{ok:false,usage:p}}}default:return {exit:2,out:{ok:false,usage:p}}}}export{p as a,et as b,St as c};//# sourceMappingURL=chunk-KF5VQH3M.mjs.map
2
- //# sourceMappingURL=chunk-KF5VQH3M.mjs.map
1
+ import {b as b$2,e as e$2,d as d$2,c as c$1}from'./chunk-Z2G7DGDF.mjs';import {l}from'./chunk-QDMEM62U.mjs';import {I}from'./chunk-UZQV73X7.mjs';import {N}from'./chunk-3KFQPSRX.mjs';import {f,X,d as d$1,R,L,u,Y,A,_,w as w$1,v,Z}from'./chunk-YBHHICTZ.mjs';import {c,e,d,g,f as f$1,b as b$3}from'./chunk-7IG6EQI4.mjs';import {b as b$1,e as e$1,h as h$1,g as g$1,f as f$2}from'./chunk-5TXYMLBF.mjs';import {b,a}from'./chunk-2FRRD6A3.mjs';import {stat,readFile}from'fs/promises';import w from'path';var $={scrum:l,kanban:I,waterfall:N},p=["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] [--fallback-tokens-per-weight n]","exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--estimate] [--role r]","exwf account <item> [--line n] [--tokens-in n] [--tokens-out n] [--duration-ms n] [--model m] [--by who]","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf config set <patch.json> [--by who] exwf unblock <item> [--blocker id] [--note text] [--by who]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"],at=new Set(["estimate"]);function et(l){let t=[],u={};for(let a=0;a<l.length;a++){let v=l[a];if(v.startsWith("--")){let n=v.slice(2);if(at.has(n)){u[n]="true";continue}let m=l[a+1];(m===void 0||m.startsWith("--"))&&b("invalid-input",`--${n} needs a value`,`pass --${n} <text>`),u[n]=m,a++;}else t.push(v);}return {positional:t,flags:u}}async function x(l){try{return JSON.parse(await readFile(l,"utf8"))}catch(t){return b("invalid-input",`cannot read JSON from ${l}: ${t.message}`,"check the path and that the file is valid JSON")}}function h(l){let t=Object.hasOwn($,l.methodology)?$[l.methodology]:void 0;return t||b("config-invalid",`methodology "${l.methodology}" is not available in this build`,`available: ${Object.keys($).join(", ")}`),t()}function y(l,t){let u=Number(l[t]);return Number.isFinite(u)||b("invalid-input",`--${t} must be a number (got ${JSON.stringify(l[t])})`,`pass --${t} <n>`),u}var it=new Set(["init","add","edit","next","complete","account","ceremony","decide","unblock"]);async function St(l,t){try{let[u,a]=et(l).positional;return u!==void 0&&(it.has(u)||u==="role"&&a==="add"||u==="config"&&a==="set")?await c(t,()=>tt(l,t)):await tt(l,t)}catch(u){if(u instanceof a)return {exit:1,out:{ok:false,error:u.toJSON()}};throw u}}async function tt(l,t){let{positional:u$1,flags:a$1}=et(l),[v$1,...n]=u$1,m=a$1.by??"human",d$3=new Date().toISOString();switch(v$1){case "init":{let[e]=n,o=e&&Object.hasOwn($,e)?$[e]:void 0;if(!o||!a$1.config)return {exit:2,out:{ok:false,usage:p}};try{await stat(b$3(t)),b("invalid-input",`${b$3(t)} already exists`,"delete .workflow/state.json to start over");}catch(c){if(c instanceof a||c.code!=="ENOENT")throw c}let s=await x(w.resolve(t,a$1.config)),i=a$1.roles?await x(w.resolve(t,a$1.roles)):void 0;if(i!==void 0){Array.isArray(i)||b("invalid-input",`roles file ${a$1.roles} must contain an array of role manifests`,"wrap the manifests in [ ... ]");for(let c of i)b$1(e$1,c,`roles file ${a$1.roles}`);}let r=Z(i?{methodology:o(),config:s,roles:i,by:m,now:d$3}:{methodology:o(),config:s,by:m,now:d$3});return await d(t,r.state),{exit:0,out:{ok:true,warnings:r.warnings,state:{methodology:r.state.methodology,stages:r.state.stages.map(c=>c.id),roles:Object.keys(r.state.roles)}}}}case "add":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[0]));b$1(f$2,o,`item file ${n[0]}`);let s=Y(e$1,h(e$1),{type:"item.add",by:m,payload:{item:o}},i=>v(i,o,m,d$3));return await d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,item:u(s.state,o.id)}}}case "edit":{if(!n[0]||!n[1])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=n[0],s=await x(w.resolve(t,n[1]));b$1(g$1,s,`patch file ${n[1]}`);let i=Y(e$1,h(e$1),{type:"item.edit",by:m,payload:{id:o,patch:s}},r=>w$1(r,o,s,m,d$3));return await d(t,i.state),{exit:0,out:{ok:true,warnings:i.warnings,item:u(i.state,o)}}}case "next":{let e$1=await e(t),o={now:d$3};a$1.max&&(o.max=y(a$1,"max")),a$1["fallback-tokens-per-weight"]&&(o.fallbackTokensPerWeight=y(a$1,"fallback-tokens-per-weight"));let s=c$1(e$1,h(e$1),o);for(let i of s.briefs)await f$1(t,i);return await d(t,s.state),{exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!n[0]||!n[1])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[1]));b$1(h$1,o,`handoff file ${n[1]}`),o.item!==n[0]&&b("handoff-invalid",`handoff.item "${o.item}" differs from the command's item "${n[0]}"`,"make them match");let s=a$1.role??o.role,i=y(a$1,"duration-ms"),r={item:n[0],role:s,model:a$1.model??"",tokensIn:y(a$1,"tokens-in"),tokensOut:y(a$1,"tokens-out"),durationMs:i,startedAt:new Date(Date.parse(d$3)-i).toISOString(),endedAt:d$3};a$1.estimate==="true"&&(r.estimate=true);let c=d$2(e$1,h(e$1),{...o,role:s},r,d$3);return await g(t,o,c.state.events.length),await d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,item:u(c.state,n[0])}}}case "account":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o={};a$1["tokens-in"]!==void 0&&(o.tokensIn=y(a$1,"tokens-in")),a$1["tokens-out"]!==void 0&&(o.tokensOut=y(a$1,"tokens-out")),a$1["duration-ms"]!==void 0&&(o.durationMs=y(a$1,"duration-ms")),a$1.model!==void 0&&(o.model=a$1.model);let s=a$1.line!==void 0?y(a$1,"line"):void 0,i=e$2(e$1,n[0],o,a$1.by??"human",d$3,s);await d(t,i);let r=d$1(i),c=r.payload.line;return {exit:0,out:{ok:true,line:i.accounting.filter(A=>A.item===n[0])[c-1],event:r}}}case "ceremony":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=h(e$1),s=Object.hasOwn(o.ceremonies,n[0])?o.ceremonies[n[0]]:void 0;s||b("unknown-ceremony",`"${n[0]}" is not a ${o.name} ceremony`,`available: ${Object.keys(o.ceremonies).join(", ")}`);let i=n[1]?await x(w.resolve(t,n[1])):{},r=s(e$1,{...i,by:m,now:d$3});return await d(t,r.state),{exit:0,out:{ok:true,warnings:r.warnings,lastEvent:d$1(r.state)}}}case "config":{if(n[0]!=="set"||!n[1])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[1])),s=_(e$1,h(e$1),o,m,d$3);return await d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,changed:d$1(s.state).payload.changed,config:s.state.config}}}case "unblock":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=n[0],o=await e(t),s=u(o,e$1).blockers.filter(O=>!O.clearedAt).map(O=>O.id);s.length===0&&b("invalid-input",`item ${e$1} has no open blocker`,"nothing to clear; check exwf board");let i=a$1.blocker!==void 0?[a$1.blocker]:s,r=a$1.note,c=Y(o,h(o),{type:"blocker.clear",by:m,payload:{id:e$1,blockers:i,note:r??null}},O=>i.reduce((A$1,ot)=>A(A$1,e$1,ot,m,d$3,r),O));return await d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,item:u(c.state,e$1)}}}case "decide":{if(!n[0]||n[1]!=="approve"&&n[1]!=="reject")return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=e$1.pending.find(i=>i.id===n[0]),s=L(e$1,n[0],n[1],m,a$1.note??"",d$3,h(e$1));return await d(t,s),{exit:0,out:{ok:true,item:o?.item?u(s,o.item):null}}}case "status":{let e$1=await e(t),o=h(e$1),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let i of Object.values(e$1.items))s[i.status]+=1;return {exit:0,out:{ok:true,methodology:e$1.methodology,openIteration:R(e$1)??null,counts:s,pending:e$1.pending,openQuestions:b$2(e$1),lastEvent:d$1(e$1),report:o.report?o.report(e$1):null}}}case "board":{let e$1=await e(t);return {exit:0,out:{ok:true,columns:e$1.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(e$1.items).filter(i=>i.stage===s.id&&i.status!=="dropped").map(i=>({id:i.id,title:i.title,status:i.status,role:i.role??null,age:i.transitions.length?Date.parse(d$3)-Date.parse(i.transitions[i.transitions.length-1].at):null}))}))}}}case "metrics":{let e$1=await e(t);return {exit:0,out:{ok:true,metrics:h(e$1).metrics(e$1)}}}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(!n[0])return {exit:2,out:{ok:false,usage:p}};let e$1=await e(t),o=await x(w.resolve(t,n[0]));return {exit:0,out:{ok:true,violations:X(e$1,h(e$1),o)}}}case "role":{let e$2=await e(t);if(n[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(e$2.roles),detail:e$2.roles}};if(n[0]==="add"&&n[1]){let o=await x(w.resolve(t,n[1]));b$1(e$1,o,`role manifest ${n[1]}`);let s=f(e$2,o,m,d$3);return await d(t,s),{exit:0,out:{ok:true,roles:Object.keys(s.roles)}}}return {exit:2,out:{ok:false,usage:p}}}default:return {exit:2,out:{ok:false,usage:p}}}}export{p as a,et as b,St as c};//# sourceMappingURL=chunk-MQWMQ4PD.mjs.map
2
+ //# sourceMappingURL=chunk-MQWMQ4PD.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","waterfall","USAGE","BOOLEAN_FLAGS","parseArgs","argv","positional","flags","i","a","key","val","fail","readJson","file","readFile","e","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","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","line","s2","correctAccounting","ev","lastEvent","idx","m","c","input","changeConfig","open","blockers","note","clearBlocker","entry","p","decide","counts","openIteration","openQuestions","st","action","validateAction","manifest","registerRole"],"mappings":"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","file":"chunk-KF5VQH3M.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, openQuestions } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { correctAccounting, type AccountingPatch } from \"../accounting.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, clearBlocker, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { applyAction, changeConfig, init, validateAction } from \"../methodology.ts\";\nimport { openIteration, type PlanOptions } 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] [--fallback-tokens-per-weight n]\",\n \"exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--estimate] [--role r]\",\n \"exwf account <item> [--line n] [--tokens-in n] [--tokens-out n] [--duration-ms n] [--model m] [--by who]\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf config set <patch.json> [--by who] exwf unblock <item> [--blocker id] [--note text] [--by who]\",\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}\n/** Flags that take no value; every other flag needs one. */\nconst BOOLEAN_FLAGS = new Set([\"estimate\"]);\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 if (BOOLEAN_FLAGS.has(key)) {\n flags[key] = \"true\";\n continue;\n }\n const val = argv[i + 1];\n if (val === undefined || val.startsWith(\"--\"))\n fail(\"invalid-input\", `--${key} needs a value`, `pass --${key} <text>`);\n flags[key] = val;\n i++;\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([\n \"init\",\n \"add\",\n \"edit\",\n \"next\",\n \"complete\",\n \"account\",\n \"ceremony\",\n \"decide\",\n \"unblock\",\n]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n try {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes =\n cmd !== undefined &&\n (WRITERS.has(cmd) ||\n (cmd === \"role\" && sub === \"add\") ||\n (cmd === \"config\" && sub === \"set\"));\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: {\n ok: true,\n warnings: res.warnings,\n item: getItem(res.state, item.id),\n },\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 {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, id) },\n };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts: PlanOptions = { now };\n if (flags[\"max\"]) opts.max = num(flags, \"max\");\n if (flags[\"fallback-tokens-per-weight\"])\n opts.fallbackTokensPerWeight = num(flags, \"fallback-tokens-per-weight\");\n const res = planNext(state, methodologyOf(state), opts);\n // briefs first: a crash then leaves an orphan brief (overwritten next dispatch), never a dispatched item without one\n for (const b of res.briefs) await saveBrief(cwd, b);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n reason: res.reason ?? null,\n skipped: res.skipped,\n briefs: res.briefs,\n },\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 if (flags[\"estimate\"] === \"true\") acc.estimate = true;\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n // handoff first: a retry of the same command reproduces the same seq and overwrites an orphan\n await saveHandoff(cwd, handoff, res.state.events.length);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n item: getItem(res.state, rest[0]),\n },\n };\n }\n case \"account\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const patch: AccountingPatch = {};\n if (flags[\"tokens-in\"] !== undefined) patch.tokensIn = num(flags, \"tokens-in\");\n if (flags[\"tokens-out\"] !== undefined) patch.tokensOut = num(flags, \"tokens-out\");\n if (flags[\"duration-ms\"] !== undefined) patch.durationMs = num(flags, \"duration-ms\");\n if (flags[\"model\"] !== undefined) patch.model = flags[\"model\"];\n const line = flags[\"line\"] !== undefined ? num(flags, \"line\") : undefined;\n const s2 = correctAccounting(state, rest[0], patch, flags[\"by\"] ?? \"human\", now, line);\n await saveState(cwd, s2);\n const ev = lastEvent(s2)!;\n const idx = (ev.payload as { line: number }).line;\n const mine = s2.accounting.filter((a) => a.item === rest[0]);\n return { exit: 0, out: { ok: true, line: mine[idx - 1], event: ev } };\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: {\n ok: true,\n warnings: res.warnings,\n lastEvent: lastEvent(res.state),\n },\n };\n }\n case \"config\": {\n if (rest[0] !== \"set\" || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const patch = await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]));\n const res = changeConfig(state, methodologyOf(state), patch, by, now);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n changed: (lastEvent(res.state)!.payload as { changed: string[] }).changed,\n config: res.state.config,\n },\n };\n }\n case \"unblock\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const id = rest[0];\n const state = await loadState(cwd);\n const open = getItem(state, id)\n .blockers.filter((b) => !b.clearedAt)\n .map((b) => b.id);\n if (open.length === 0)\n fail(\n \"invalid-input\",\n `item ${id} has no open blocker`,\n \"nothing to clear; check exwf board\",\n );\n const blockers = flags[\"blocker\"] !== undefined ? [flags[\"blocker\"]] : open;\n const note = flags[\"note\"];\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"blocker.clear\", by, payload: { id, blockers, note: note ?? null } },\n (s) => blockers.reduce((acc, b) => clearBlocker(acc, id, b, by, now, note), s),\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 \"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 {\n exit: 0,\n out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null },\n };\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 openQuestions: openQuestions(state),\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 {\n exit: 0,\n out: { ok: true, metrics: methodologyOf(state).metrics(state) },\n };\n }\n case \"pending\":\n return {\n exit: 0,\n out: { ok: true, pending: (await loadState(cwd)).pending },\n };\n case \"lessons\":\n return {\n exit: 0,\n out: { ok: true, lessons: (await loadState(cwd)).lessons },\n };\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: {\n ok: true,\n violations: validateAction(state, methodologyOf(state), action),\n },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: {\n ok: true,\n roles: Object.keys(state.roles),\n detail: state.roles,\n },\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"]}
1
+ {"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","waterfall","USAGE","BOOLEAN_FLAGS","parseArgs","argv","positional","flags","i","a","key","val","fail","readJson","file","readFile","e","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","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","line","s2","correctAccounting","ev","lastEvent","idx","m","c","input","changeConfig","open","blockers","note","clearBlocker","entry","p","decide","counts","openIteration","openQuestions","st","action","validateAction","manifest","registerRole"],"mappings":"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","file":"chunk-MQWMQ4PD.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, openQuestions } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { correctAccounting, type AccountingPatch } from \"../accounting.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, clearBlocker, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { applyAction, changeConfig, init, validateAction } from \"../methodology.ts\";\nimport { openIteration, type PlanOptions } 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] [--fallback-tokens-per-weight n]\",\n \"exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--estimate] [--role r]\",\n \"exwf account <item> [--line n] [--tokens-in n] [--tokens-out n] [--duration-ms n] [--model m] [--by who]\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf config set <patch.json> [--by who] exwf unblock <item> [--blocker id] [--note text] [--by who]\",\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}\n/** Flags that take no value; every other flag needs one. */\nconst BOOLEAN_FLAGS = new Set([\"estimate\"]);\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 if (BOOLEAN_FLAGS.has(key)) {\n flags[key] = \"true\";\n continue;\n }\n const val = argv[i + 1];\n if (val === undefined || val.startsWith(\"--\"))\n fail(\"invalid-input\", `--${key} needs a value`, `pass --${key} <text>`);\n flags[key] = val;\n i++;\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([\n \"init\",\n \"add\",\n \"edit\",\n \"next\",\n \"complete\",\n \"account\",\n \"ceremony\",\n \"decide\",\n \"unblock\",\n]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n try {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes =\n cmd !== undefined &&\n (WRITERS.has(cmd) ||\n (cmd === \"role\" && sub === \"add\") ||\n (cmd === \"config\" && sub === \"set\"));\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: {\n ok: true,\n warnings: res.warnings,\n item: getItem(res.state, item.id),\n },\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 {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, id) },\n };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts: PlanOptions = { now };\n if (flags[\"max\"]) opts.max = num(flags, \"max\");\n if (flags[\"fallback-tokens-per-weight\"])\n opts.fallbackTokensPerWeight = num(flags, \"fallback-tokens-per-weight\");\n const res = planNext(state, methodologyOf(state), opts);\n // briefs first: a crash then leaves an orphan brief (overwritten next dispatch), never a dispatched item without one\n for (const b of res.briefs) await saveBrief(cwd, b);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n reason: res.reason ?? null,\n skipped: res.skipped,\n briefs: res.briefs,\n },\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 if (flags[\"estimate\"] === \"true\") acc.estimate = true;\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n // handoff first: a retry of the same command reproduces the same seq and overwrites an orphan\n await saveHandoff(cwd, handoff, res.state.events.length);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n item: getItem(res.state, rest[0]),\n },\n };\n }\n case \"account\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const patch: AccountingPatch = {};\n if (flags[\"tokens-in\"] !== undefined) patch.tokensIn = num(flags, \"tokens-in\");\n if (flags[\"tokens-out\"] !== undefined) patch.tokensOut = num(flags, \"tokens-out\");\n if (flags[\"duration-ms\"] !== undefined) patch.durationMs = num(flags, \"duration-ms\");\n if (flags[\"model\"] !== undefined) patch.model = flags[\"model\"];\n const line = flags[\"line\"] !== undefined ? num(flags, \"line\") : undefined;\n const s2 = correctAccounting(state, rest[0], patch, flags[\"by\"] ?? \"human\", now, line);\n await saveState(cwd, s2);\n const ev = lastEvent(s2)!;\n const idx = (ev.payload as { line: number }).line;\n const mine = s2.accounting.filter((a) => a.item === rest[0]);\n return { exit: 0, out: { ok: true, line: mine[idx - 1], event: ev } };\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: {\n ok: true,\n warnings: res.warnings,\n lastEvent: lastEvent(res.state),\n },\n };\n }\n case \"config\": {\n if (rest[0] !== \"set\" || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const patch = await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]));\n const res = changeConfig(state, methodologyOf(state), patch, by, now);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n changed: (lastEvent(res.state)!.payload as { changed: string[] }).changed,\n config: res.state.config,\n },\n };\n }\n case \"unblock\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const id = rest[0];\n const state = await loadState(cwd);\n const open = getItem(state, id)\n .blockers.filter((b) => !b.clearedAt)\n .map((b) => b.id);\n if (open.length === 0)\n fail(\n \"invalid-input\",\n `item ${id} has no open blocker`,\n \"nothing to clear; check exwf board\",\n );\n const blockers = flags[\"blocker\"] !== undefined ? [flags[\"blocker\"]] : open;\n const note = flags[\"note\"];\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"blocker.clear\", by, payload: { id, blockers, note: note ?? null } },\n (s) => blockers.reduce((acc, b) => clearBlocker(acc, id, b, by, now, note), s),\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 \"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 {\n exit: 0,\n out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null },\n };\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 openQuestions: openQuestions(state),\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 {\n exit: 0,\n out: { ok: true, metrics: methodologyOf(state).metrics(state) },\n };\n }\n case \"pending\":\n return {\n exit: 0,\n out: { ok: true, pending: (await loadState(cwd)).pending },\n };\n case \"lessons\":\n return {\n exit: 0,\n out: { ok: true, lessons: (await loadState(cwd)).lessons },\n };\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: {\n ok: true,\n violations: validateAction(state, methodologyOf(state), action),\n },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: {\n ok: true,\n roles: Object.keys(state.roles),\n detail: state.roles,\n },\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"]}
@@ -0,0 +1,2 @@
1
+ import {a,b as b$1}from'./chunk-U3OXAO67.mjs';import {R,O,o,j as j$1,u,n,c,P,Y,a as a$1,v,x,t,s,w,G,p,F as F$1,Q}from'./chunk-YBHHICTZ.mjs';import {b}from'./chunk-2FRRD6A3.mjs';import {timSort}from'exsorted';var ye=["todo","in_progress","blocked","review","awaiting_human","done","dropped"];function be(i){let n=i.events.filter(o=>o.type==="sprint.closed"&&o.payload.reason!=="cancel");return n.length===0?null:n.reduce((o,r)=>o+r.payload.doneWeight,0)/n.length}function ae(i){let n=R(i),o=Object.fromEntries(ye.map(t=>[t,0])),r=[],g=0;for(let t of n?.committed??[]){let e=i.items[t];if(e){o[e.status]+=1,e.status!=="done"&&(g+=e.weight??0);for(let s of e.blockers)s.clearedAt||r.push({item:t,blocker:s.id,owner:s.owner,reason:s.reason});}}let p=n?.spent??{tokens:0,turns:0,wallclockMs:0},f=n?O(n.budget,n.spent):{},y=be(i),k="unknown";if(n&&y!==null&&n.budget.tokens){let t=(f.tokens??0)/n.budget.tokens;k=g<=y*t?"on-track":"at-risk";}let d=i.lessons.filter(t=>t.status==="raised").length;return {sprint:n?.id??null,goal:n?.goal??null,byStatus:o,blockers:r,spent:p,remaining:f,remainingWeight:g,raisedLessons:d,velocity:y,forecast:k}}function U(i){for(let n=i.iterations.length-1;n>=0;n--){let o=i.iterations[n];if(o.endedAt!==void 0)return o}}function F(i,n){return i.events.find(o=>o.type==="sprint.closed"&&o.payload.id===n)?.seq??Number.POSITIVE_INFINITY}function he(i){let n=new Set(U(i)?.carryover??[]),o=Object.values(i.items).filter(r=>r.stage==="backlog"&&r.status==="todo"&&r.type!=="question");return timSort([...o],(r,g)=>{let p=n.has(r.id)?1:0,f=n.has(g.id)?1:0;return p!==f?f-p:(g.priority??0)-(r.priority??0)})}function re(i,n){let o=u(i,n);(o.stage!=="backlog"||o.status!=="todo")&&b("invalid-input",`item "${n}" is not in the Product Backlog (${o.stage}/${o.status})`,"only backlog items can be committed",{items:[n]}),G(i,o,p(i,"backlog").exitPolicy,"enter the Sprint Backlog");}function se(i,n,o,r,g){let p=i;for(let f of Object.values(i.items))f.type!=="question"||f.parent===void 0||!n.includes(f.parent)||f.status==="done"||f.status==="dropped"||((f.stage!=="sprint"||f.status!=="todo")&&(p=x(p,f.id,{stage:"sprint",status:"todo"},r,g)),p=s(p,f.id,y=>({...y,iteration:o})));return p}function N(i,n){return {...i,config:{...W(i),definitionOfDone:n},stages:i.stages.map(o=>o.id==="review"?{...o,exitPolicy:n}:o)}}function ke(i,n){let o=W(i),r=[],g=[],p$1=p(i,"backlog").exitPolicy,f=0;for(let y of he(i)){let k=F$1(i,y,p$1);if(k.length>0){g.push({id:y.id,reason:"policy",detail:k.map(d=>d.message).join("; ")});continue}if(n.turns!==void 0&&r.length>=n.turns){g.push({id:y.id,reason:"budget",detail:"turns budget full"});continue}if(n.tokens!==void 0){let d=Q(i,y.weight,o.fallbackTokensPerWeight,o.estimateMode);if(f+d>n.tokens){g.push({id:y.id,reason:"budget",detail:`needs about ${d} tokens, ${n.tokens-f} left`});continue}f+=d;}r.push(y.id);}return {ids:r,skipped:g}}function K(i){let n=(t,e,s,m)=>Y(t,i(),{type:e,by:s.by,payload:s},c=>m(c,a$1(s.now)));return {refine:(t,e)=>{o(t,e.by,"define-acceptance","deliver");let s=e.items??[],m=e.split??[],c$1=e.reestimate??[];(!Array.isArray(c$1)||!c$1.every(u=>typeof u=="string"))&&b("invalid-input","refine.reestimate must be a list of item ids",'pass reestimate: ["A"]');let l=c$1;s.length===0&&m.length===0&&l.length===0&&b("invalid-input","refine needs items[], split[] or reestimate[]","pass at least one patch, split or reestimate");for(let u$1 of l){let h=u(t,u$1);(h.stage!=="backlog"||h.status!=="todo"||h.weight===void 0)&&b("invalid-input",`item "${u$1}" has no weight to confirm in the Product Backlog`,"refine it with a patch { weight } instead",{items:[u$1]});}return n(t,"ceremony.refine",e,(u$1,h)=>{for(let{id:a,patch:w$1}of s)u$1=w(u$1,a,w$1,e.by,h);for(let a of l)u$1=c(u$1,"item.reestimated",e.by,{id:a,weight:u(u$1,a).weight},h);for(let a of m){u(u$1,a.from);for(let w of a.into)u$1=v(u$1,{...w,parent:a.from},e.by,h);u$1=x(u$1,a.from,{status:"dropped"},e.by,h);}return c(u$1,"ceremony.refine",e.by,{edited:s.map(a=>a.id),split:m.map(a=>({from:a.from,into:a.into.map(w=>w.id)})),reestimated:l},h)})},plan:(t,e)=>{o(t,e.by,"facilitate");let s$1=e.goal;(typeof s$1!="string"||s$1.trim()==="")&&b("invalid-input","sprint planning needs a non-empty goal","state the Sprint Goal in one sentence");let m=W(t),c$1=e.budget??m.sprintBudget,l=e.items==="auto"?ke(t,c$1):void 0,u$1=l?.skipped??[],h=l?l.ids:e.items;Array.isArray(h)||b("invalid-input",'sprint planning needs items: string[] or "auto"','pass ["A","B"] or "auto"'),h.length===0&&b("invalid-input",`no backlog items fit the sprint${u$1.length?`; skipped: ${u$1.map(a=>`${a.id} (${a.reason}: ${a.detail})`).join(", ")}`:""}`,"refine the backlog (acceptance + estimates) or raise the budget with exwf config set");for(let a of h)re(t,a);return n(t,"ceremony.plan",e,(a,w)=>{let C=`S${a.iterations.length+1}`,M=U(a),A=h.filter(O=>M?.carryover.includes(O)),B=[];for(let O of h){let T=j(u(a,O),a);T&&B.push(O),a=x(a,O,T?{stage:T,status:"review"}:{stage:"sprint",status:"todo"},e.by,w),a=s(a,O,fe=>({...fe,iteration:C}));}a=se(a,h,C,e.by,w);let J=h.reduce((O,T)=>O+(a.items[T]?.weight??0),0);return a={...a,iterations:[...a.iterations,{id:C,goal:s$1,budget:c$1,spent:{tokens:0,turns:0,wallclockMs:0},startedAt:w,committed:[...h],carryover:A}]},c(a,"sprint.opened",e.by,{id:C,goal:s$1,committed:h,committedWeight:J,budget:c$1,skipped:u$1,resumed:B},w)})},commit:(t,e)=>{let s$1=R(t);s$1||b("invalid-input","no open sprint to commit into","run the plan ceremony first");let m=e.items;(!Array.isArray(m)||m.length===0)&&b("invalid-input","commit needs items[]",'pass ["A"]');let c$1=new Set;for(let l of m)c$1.has(l)&&b("invalid-input",`item "${l}" appears twice in items[]`,"list each item once",{items:[l]}),c$1.add(l),u(t,l),s$1.committed.includes(l)&&b("invalid-input",`item "${l}" is already committed to ${s$1.id}`,"nothing to do",{items:[l]}),re(t,l);return n(t,"ceremony.commit",e,(l,u$1)=>{let h=[];for(let a of m){let w=j(u(l,a),l);w&&h.push(a),l=x(l,a,w?{stage:w,status:"review"}:{stage:"sprint",status:"todo"},e.by,u$1),l=s(l,a,C=>({...C,iteration:s$1.id}));}return l=se(l,m,s$1.id,e.by,u$1),l={...l,iterations:l.iterations.map(a=>a.id===s$1.id?{...a,committed:[...a.committed,...m]}:a)},c(l,"sprint.committed",e.by,{id:s$1.id,items:m,goalImpact:e.goalImpact??null,resumed:h},u$1)})},uncommit:(t$1,e)=>{o(t$1,e.by,"order-backlog");let s=R(t$1);s||b("invalid-input","no open sprint","nothing to uncommit from");let m=e.items;(!Array.isArray(m)||m.length===0)&&b("invalid-input","uncommit needs items[]",'pass ["A"]');for(let c of m)u(t$1,c).status==="done"&&b("invalid-input",`item "${c}" is done`,"finished work cannot be uncommitted",{items:[c]});for(let c of m)s.committed.includes(c)||b("invalid-input",`item "${c}" is not committed to ${s.id}`,`committed: ${s.committed.join(", ")}`,{items:[c]});return n(t$1,"ceremony.uncommit",e,(c$1,l)=>{for(let u of m)c$1=x(c$1,u,{stage:"backlog",status:"todo"},e.by,l),c$1=t(c$1,u,["iteration","role"]);return c$1={...c$1,iterations:c$1.iterations.map(u=>u.id===s.id?{...u,committed:u.committed.filter(h=>!m.includes(h))}:u)},c(c$1,"sprint.uncommitted",e.by,{id:s.id,items:m,reason:e.reason??""},l)})},daily:(t,e)=>n(t,"ceremony.daily",e,(s,m)=>c(s,"daily",e.by,ae(s),m)),review:(t,e)=>{let s=R(t);s||b("invalid-input","no open sprint to review","run the plan ceremony first");let m=j$1(t,"sprint-review");e.by!=="human"&&!m.includes(e.by)&&b("gate-unmet",`"${e.by}" may not accept the Sprint Review`,`run review as "human" or as ${m.join(", ")||"a role with canApprove sprint-review"}`,{rule:"sprint-review"});let c$1=e.feedback??[];return n(t,"ceremony.review",e,(l,u)=>{for(let a of c$1)l=v(l,{...a,stage:"backlog"},e.by,u);let h=s.committed.filter(a=>l.items[a]?.status==="done");return l=c(l,"increment",e.by,{sprint:s.id,done:h,goalMet:e.goalMet===true,accepted:e.accepted===true,feedback:c$1.map(a=>a.id)},u),E(l,"review",u)})},retro:(t,e)=>{o(t,e.by,"facilitate");let s=U(t);s||b("invalid-input","no closed sprint to retrospect","close the sprint (review or cancel) first"),R(t)&&b("invalid-input","a sprint is still open","retro runs between sprints; review or cancel the open one");let m=F(t,s.id);t.events.some(u=>u.type==="retro"&&u.seq>m)&&b("invalid-input",`sprint ${s.id} already has a retrospective`,"plan the next sprint");let c$1=a(t,e,"retro"),l=e.dodChanges;return n(t,"ceremony.retro",e,(u,h)=>{let a=[],w=false,C=b$1(u,c$1,e.by,h,(M,A)=>{if(A.kind==="dod"){let B=W(M).definitionOfDone;return B.some(J=>JSON.stringify(J)===JSON.stringify(A.policy))?M:(w=true,N(M,[...B,A.policy]))}return A.kind==="backlog"?(a.push(A.item.id),v(M,{...A.item,stage:"backlog",tags:[...A.item.tags??[],"retro"]},e.by,h)):M});return u=C.state,l&&(w=true,u=N(u,l)),c(u,"retro",e.by,{sprint:s.id,adopted:C.adopted,dismissed:C.dismissed,agreements:C.agreements,retired:C.retired,dodChanged:w,backlogAdded:a},h)})},cancel:(t,e)=>{o(t,e.by,"order-backlog");let s=R(t);return s||b("invalid-input","no open sprint to cancel","nothing to do"),n(t,"ceremony.cancel",e,(m,c$1)=>(m=c(m,"sprint.cancelled",e.by,{id:s.id,reason:e.reason??""},c$1),E(m,"cancel",c$1)))}}}var ve=new Set(["never","po-only","any"]);function ce(i){let n=i??{},o=n.sprintBudget;(!o||typeof o!="object"||o.tokens===void 0&&o.turns===void 0&&o.wallclockMs===void 0)&&b("config-invalid","scrum config.sprintBudget must define tokens, turns or wallclockMs",'e.g. { "sprintBudget": { "tokens": 400000, "turns": 60 } }'),(typeof n.productGoal!="string"||n.productGoal.trim()==="")&&b("config-invalid","scrum config.productGoal must be a non-empty string","state the Product Goal in one sentence"),Array.isArray(n.definitionOfDone)||b("config-invalid","scrum config.definitionOfDone must be a Policy[]",'e.g. [{ "kind": "evidence", "evidenceKind": "test-output" }]');let r=n.refinementSharePct??10;(typeof r!="number"||r<0||r>100)&&b("config-invalid","scrum config.refinementSharePct must be 0..100","omit it for the default 10");let g=n.allowMidSprintAdd??"po-only";(typeof g!="string"||!ve.has(g))&&b("config-invalid",`scrum config.allowMidSprintAdd must be never | po-only | any (got ${JSON.stringify(g)})`,'use "po-only" unless you have a reason');let p=n.inProgressWipLimit;p!==void 0&&(typeof p!="number"||p<1)&&b("config-invalid","scrum config.inProgressWipLimit must be a positive number","omit it for no limit");let f=n.autoClose;f!==void 0&&typeof f!="boolean"&&b("config-invalid","scrum config.autoClose must be true or false","omit it for the default true");let y=n.estimateMode;y!==void 0&&y!=="per-weight"&&y!=="per-call"&&b("config-invalid",`scrum config.estimateMode must be per-weight | per-call (got ${JSON.stringify(y)})`,'use "per-weight" (the default) or "per-call"');let k=n.fallbackTokensPerWeight;k!==void 0&&(typeof k!="number"||!Number.isFinite(k)||k<=0)&&b("config-invalid","scrum config.fallbackTokensPerWeight must be a positive finite number","omit it for the default 20000");let d={sprintBudget:o,productGoal:n.productGoal,definitionOfDone:n.definitionOfDone,refinementSharePct:r,allowMidSprintAdd:g};return p!==void 0&&(d.inProgressWipLimit=p),f!==void 0&&(d.autoClose=f),y!==void 0&&(d.estimateMode=y),k!==void 0&&(d.fallbackTokensPerWeight=k),d}var $=(i,n)=>n===0?0:i/n;function de(i){let n=i.events.filter(t=>t.type==="accounting.corrected"),o=i.events.filter(t=>t.type==="sprint.closed").map(t=>{let e=t.payload,s=n.filter(m=>m.seq>t.seq&&e.id!==void 0&&m.payload.iteration===e.id).reduce((m,c)=>m+c.payload.delta.tokens,0);return s===0?e:{...e,spent:{...e.spent,tokens:e.spent.tokens+s}}}),r=o.filter(t=>t.reason!=="cancel"),g=r.map(t=>t.doneWeight),p=r.reduce((t,e)=>t+e.doneWeight,0),f=r.reduce((t,e)=>t+e.committedWeight,0),y=i.events.filter(t=>t.type==="increment").map(t=>t.payload),k=o.filter(t=>t.budget.tokens!==void 0),d=r.reduce((t,e)=>t+e.spent.tokens,0);return {velocity:g,meanVelocity:$(g.reduce((t,e)=>t+e,0),g.length),burndown:i.events.filter(t=>t.type==="daily").map(t=>t.payload.remainingWeight),commitmentReliability:$(p,f),sprintGoalHitRate:$(y.filter(t=>t.goalMet).length,y.length),carryoverRatio:$(o.reduce((t,e)=>t+e.carryover.length,0),o.reduce((t,e)=>t+e.done.length+e.carryover.length,0)),budgetUtilisation:$(k.reduce((t,e)=>t+e.spent.tokens,0),k.reduce((t,e)=>t+(e.budget.tokens??0),0)),costPerPoint:$(d,p),current:we(i)}}function we(i){let n=R(i),o=(n?.committed??[]).map(k=>i.items[k]).filter(k=>k!==void 0),r=k=>k.reduce((d,t)=>d+(t.weight??0),0),g=r(o),p=r(o.filter(k=>k.status==="done")),f=n?.spent.tokens??0,y=n?.budget.tokens??0;return {spentTokens:f,spentTurns:n?.spent.turns??0,budgetTokens:y,committedWeight:g,doneWeight:p,remainingWeight:g-p,costPerPoint:$(f,p),budgetUtilisation:$(f,y)}}function le(){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 I=(i,n,o,r,g)=>g?{rule:i,severity:n,item:g,message:o,fix:r}:{rule:i,severity:n,message:o,fix:r};function me(i){for(let n=i.iterations.length-1;n>=0;n--){let o=i.iterations[n];if(o.endedAt!==void 0)return o}}var H=i=>i.kind==="evidence"?`evidence:${i.evidenceKind}`:i.kind==="custom"?`custom:${i.id}`:i.kind;function ue(){return [{id:"one-open-sprint",severity:"error",check:(d,t)=>t.type==="ceremony.plan"&&R(d)?[I("one-open-sprint","error",`sprint ${R(d).id} is still open`,"review or cancel it before planning the next sprint")]:[]},{id:"retro-before-plan",severity:"error",check:(d,t)=>{if(t.type!=="ceremony.plan")return [];let e=me(d);if(!e)return [];let s=F(d,e.id);if(d.events.some(c=>c.type==="retro"&&c.seq>s))return [];let m=e.outcome==="cancelled"?"warning":"error";return [I("retro-before-plan",m,`sprint ${e.id} has no retrospective yet`,"run the retro ceremony first (lessons may be empty)")]}},{id:"sprint-budget-fixed",severity:"error",check:(d,t)=>{if(t.type!=="ceremony.plan")return [];let e=t.payload?.budget;return e===void 0||JSON.stringify(e)===JSON.stringify(W(d).sprintBudget)?[]:[I("sprint-budget-fixed","error","sprint length is fixed by config.sprintBudget","change sprintBudget between sprints with changeConfig / exwf config set, not per plan")]}},{id:"sprint-closing",severity:"error",check:(d,t)=>{let e=R(d);return t.type==="ceremony.commit"&&e?.closing?[I("sprint-closing","error",`sprint ${e.id} is closing: its budget is spent and no new work can start`,"run ceremony review or cancel first, then plan the next sprint")]:[]}},{id:"scrum-stage-ids",severity:"error",check:(d,t)=>{if(t.type!=="init")return [];let e=["backlog","sprint","review"].filter(s=>!d.stages.some(m=>m.id===s));return e.length&&b("config-invalid",`scrum stages lack the required id(s): ${e.join(", ")}`,"keep the stages backlog, sprint and review (omit stages to use the defaults), then run exwf init scrum again"),[]}},{id:"scope-protects-goal",severity:"error",check:(d,t)=>{if(t.type!=="ceremony.commit")return [];let e=W(d),s=t.payload??{};return e.allowMidSprintAdd==="never"?[I("scope-protects-goal","error","mid-sprint additions are disabled",'set allowMidSprintAdd to "po-only" or wait for the next sprint')]:e.allowMidSprintAdd==="po-only"&&!n(d,t.by,"order-backlog")?[I("scope-protects-goal","error",`"${t.by}" may not add work mid-sprint`,"ask the Product Owner (order-backlog) to commit it")]:s.goalImpact!=="none"?[I("scope-protects-goal","error",`adding work with goalImpact "${s.goalImpact??"unset"}" endangers the Sprint Goal`,'only commit items with goalImpact: "none"; otherwise cancel and re-plan')]:[]}},{id:"po-orders-backlog",severity:"error",check:(d,t)=>t.type!=="ceremony.refine"||n(d,t.by,"order-backlog")?[]:((t.payload??{}).items??[]).filter(s=>s.patch.priority!==void 0).map(s=>I("po-orders-backlog","error",`"${t.by}" may not change the priority of "${s.id}"`,"only the Product Owner orders the backlog; drop priority from the patch",s.id))},{id:"dod-not-weakened",severity:"error",check:(d,t)=>{if(t.type!=="ceremony.retro")return [];let e=t.payload??{};if(e.dodChanges===void 0)return [];if(R(d))return [I("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")];if(!Array.isArray(e.dodChanges)||e.allowWeaken===true)return [];let s=e.dodChanges,m=new Set(s.map(H)),c=W(d).definitionOfDone.filter(u=>!m.has(H(u)));if(c.length===0)return [];let l=c.map(u=>H(u).replace(":"," "));return [I("dod-not-weakened","error",`retro dodChanges drops ${c.length} Definition of Done policy(ies): ${l.join(", ")}`,'keep them in dodChanges (it replaces the whole list; suggestedChange { kind: "dod" } appends one), or pass allowWeaken: true to weaken the Definition of Done knowingly')]}},{id:"carryover-reestimated",severity:"error",check:(d,t)=>{if(t.type!=="ceremony.plan")return [];let e=t.payload?.items;if(!Array.isArray(e))return [];let s=me(d);if(!s)return [];let m=F(d,s.id);return e.filter(c=>s.carryover.includes(c)&&!(d.items[c]&&j(d.items[c],d)!==void 0)&&!d.events.some(l=>l.seq>m&&l.payload.id===c&&(l.type==="item.edited"&&l.payload.changed.includes("weight")||l.type==="item.reestimated"))).map(c=>I("carryover-reestimated","error",`carried-over item "${c}" was not re-estimated after ${s.id}`,"refine it with a new weight before committing",c))}}]}function pe(i){let n={id:"in_progress",name:"In progress",entryPolicy:[{kind:"dependencies-done"}],exitPolicy:[]};return i.inProgressWipLimit!==void 0&&(n.wipLimit=i.inProgressWipLimit),[{id:"backlog",name:"Product Backlog",entryPolicy:[],exitPolicy:[{kind:"acceptance-written"},{kind:"estimate-present"}]},{id:"sprint",name:"Sprint Backlog",entryPolicy:[],exitPolicy:[]},n,{id:"review",name:"Review",entryPolicy:[],exitPolicy:i.definitionOfDone,review:true},{id:"done",name:"Increment",entryPolicy:[],exitPolicy:[]}]}var Se={backlog:"Product Backlog",item:"Product Backlog Item",stage:"Column",iteration:"Sprint",increment:"Increment",ceremony:"Scrum Event",gate:"Sprint Review"};function W(i){return i.config}function j(i,n){let o=i.transitions.at(-1);return !o||o.by!=="system"||o.to.stage!=="backlog"||o.to.status!=="todo"?void 0:n?n.stages.find(g=>g.id===o.from.stage)?.review||o.from.status==="review"?o.from.stage:void 0:o.from.status==="review"?o.from.stage:void 0}function Pe(i,n,o){let r=i,g=u(r,n).blockers.filter(f=>!f.clearedAt);if(g.length){r=s(r,n,f=>({...f,blockers:f.blockers.map(y=>y.clearedAt?y:{...y,clearedAt:o})}));for(let f of g)r=c(r,"blocker.cleared","system",{id:n,blocker:f.id,reason:"sprint closed"},o);}for(let f of r.pending.filter(y=>y.item===n))r={...r,pending:r.pending.filter(y=>y.id!==f.id)},r=c(r,"pending.dropped","system",{id:f.id,item:n,reason:"sprint closed"},o);let p=u(r,n);return (p.stage!=="backlog"||p.status!=="todo")&&(r=x(r,n,{stage:"backlog",status:"todo"},"system",o)),t(r,n,p.type==="question"?["iteration"]:["iteration","role"])}function E(i,n,o){let r=R(i);if(!r)return i;let g=r.committed.map(e=>u(i,e)),p=g.filter(e=>e.status==="done").map(e=>e.id),f=g.filter(e=>e.status==="dropped").map(e=>e.id),y=g.filter(e=>e.status!=="done"&&e.status!=="dropped").map(e=>e.id),k=Object.values(i.items).filter(e=>e.type==="question"&&e.parent!==void 0&&y.includes(e.parent)&&e.status!=="done"&&e.status!=="dropped").map(e=>e.id),d=i;for(let e of [...y,...k])d=Pe(d,e,o);let t=e=>e.reduce((s,m)=>s+(i.items[m]?.weight??0),0);return d={...d,iterations:d.iterations.map(e=>{if(e.id!==r.id)return e;let{closing:s,...m}=e;return {...m,endedAt:o,outcome:n==="cancel"?"cancelled":"completed",carryover:y}})},c(d,"sprint.closed","system",{id:r.id,reason:n,done:p,carryover:y,carriedQuestions:k,dropped:f,doneWeight:t(p),committedWeight:t(r.committed),spent:r.spent,budget:r.budget},o)}function We(){return {name:"scrum",vocabulary:Se,validateConfig:ce,defaultStages:pe,defaultRoles:le,requiredCapabilities:["order-backlog","facilitate","deliver"],exclusiveCapabilities:["order-backlog"],plannerOptions(i){let n=W(i),o={schedulerMode:"level",dispatchStage:"in_progress"};return n.inProgressWipLimit!==void 0&&(o.concurrencyCap=n.inProgressWipLimit),n.estimateMode!==void 0&&(o.estimateMode=n.estimateMode),n.fallbackTokensPerWeight!==void 0&&(o.fallbackTokensPerWeight=n.fallbackTokensPerWeight),o},candidates(i){let n=R(i);return !n||n.closing?[]:Object.values(i.items).filter(o=>o.iteration===n.id&&(o.status==="todo"||o.status==="review")&&(o.stage==="sprint"||o.stage==="review"))},invariants(i,n){let o=R(i),r=W(i),g=o?O(o.budget,o.spent):{};return [`Sprint Goal: ${o?.goal??"(no open sprint)"}; Product Goal: ${r.productGoal}`,`Budget remaining: ${JSON.stringify(g)}; stop and hand off when it is gone`,`Definition of Done: ${r.definitionOfDone.map(p=>p.kind==="evidence"?`evidence ${p.evidenceKind}`:p.kind).join(", ")||"(none)"}`,`Do not change the scope of "${n.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:K(We),rules:ue(),metrics:i=>({...de(i)}),report(i){let n=R(i);return {closing:n?.closing===true,sprint:n?.id??null,reason:n?.closing?"budget":null,inFlight:n?Object.values(i.items).filter(o=>(o.iteration===n.id||n.committed.includes(o.id))&&o.status==="in_progress").map(o=>o.id):[]}},humanDefaults:{gates:["sprint-review"]},afterConfigChange(i){return N(i,W(i).definitionOfDone)},afterComplete(i,n,o){let r=R(i);return !r||!r.closing&&!P(r.budget,r.spent)?i:!Object.values(i.items).some(p=>(p.iteration===r.id||r.committed.includes(p.id))&&p.status==="in_progress")&&W(i).autoClose!==false?E(i,"budget",o):r.closing?i:c({...i,iterations:i.iterations.map(p=>p.id===r.id?{...p,closing:true}:p)},"sprint.closing","system",{id:r.id},o)}}}export{ae as a,K as b,ce as c,de as d,le as e,ue as f,pe as g,Se as h,W as i,j,E as k,We as l};//# sourceMappingURL=chunk-QDMEM62U.mjs.map
2
+ //# sourceMappingURL=chunk-QDMEM62U.mjs.map