ex-workflow 0.2.0-stage → 0.4.0-stage

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/README.md +54 -12
  3. package/dist/adapters/index.cjs +1 -1
  4. package/dist/adapters/index.mjs +1 -1
  5. package/dist/chunk-36M6OVUJ.mjs +2 -0
  6. package/dist/chunk-36M6OVUJ.mjs.map +1 -0
  7. package/dist/{chunk-472WEDPJ.cjs → chunk-7KF5K3L7.cjs} +2 -2
  8. package/dist/{chunk-472WEDPJ.cjs.map → chunk-7KF5K3L7.cjs.map} +1 -1
  9. package/dist/chunk-CWBH7H52.cjs +2 -0
  10. package/dist/chunk-CWBH7H52.cjs.map +1 -0
  11. package/dist/chunk-DXC2RSN5.cjs +3 -0
  12. package/dist/chunk-DXC2RSN5.cjs.map +1 -0
  13. package/dist/{chunk-XSXHEEJX.mjs → chunk-GATJZYTB.mjs} +2 -2
  14. package/dist/{chunk-XSXHEEJX.mjs.map → chunk-GATJZYTB.mjs.map} +1 -1
  15. package/dist/chunk-GFH2FEZH.mjs +2 -0
  16. package/dist/chunk-GFH2FEZH.mjs.map +1 -0
  17. package/dist/{chunk-DBR24RTX.cjs → chunk-HHC5EZ54.cjs} +2 -2
  18. package/dist/{chunk-DBR24RTX.cjs.map → chunk-HHC5EZ54.cjs.map} +1 -1
  19. package/dist/chunk-KSKEFYY7.cjs +2 -0
  20. package/dist/chunk-KSKEFYY7.cjs.map +1 -0
  21. package/dist/chunk-KUUIAKEJ.cjs +2 -0
  22. package/dist/chunk-KUUIAKEJ.cjs.map +1 -0
  23. package/dist/{chunk-IBRC36PE.mjs → chunk-L2ZN6HEL.mjs} +2 -2
  24. package/dist/{chunk-IBRC36PE.mjs.map → chunk-L2ZN6HEL.mjs.map} +1 -1
  25. package/dist/chunk-NDORREWR.mjs +2 -0
  26. package/dist/chunk-NDORREWR.mjs.map +1 -0
  27. package/dist/{chunk-VN2UYV2O.mjs → chunk-NZ2DIDOD.mjs} +2 -2
  28. package/dist/{chunk-VN2UYV2O.mjs.map → chunk-NZ2DIDOD.mjs.map} +1 -1
  29. package/dist/chunk-OHSQ52DW.mjs +6 -0
  30. package/dist/chunk-OHSQ52DW.mjs.map +1 -0
  31. package/dist/chunk-RSKZVOYC.cjs +6 -0
  32. package/dist/chunk-RSKZVOYC.cjs.map +1 -0
  33. package/dist/chunk-S22CPYXJ.mjs +3 -0
  34. package/dist/chunk-S22CPYXJ.mjs.map +1 -0
  35. package/dist/chunk-SHAPFMVP.mjs +2 -0
  36. package/dist/chunk-SHAPFMVP.mjs.map +1 -0
  37. package/dist/chunk-SJRRQZ3R.cjs +2 -0
  38. package/dist/chunk-SJRRQZ3R.cjs.map +1 -0
  39. package/dist/{chunk-D4HNETUL.cjs → chunk-UM5X2JHB.cjs} +2 -2
  40. package/dist/{chunk-D4HNETUL.cjs.map → chunk-UM5X2JHB.cjs.map} +1 -1
  41. package/dist/cli/bin.cjs +1 -1
  42. package/dist/cli/bin.cjs.map +1 -1
  43. package/dist/cli/bin.mjs +1 -1
  44. package/dist/cli/bin.mjs.map +1 -1
  45. package/dist/cli/index.cjs +1 -1
  46. package/dist/cli/index.mjs +1 -1
  47. package/dist/index.cjs +1 -1
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +8 -8
  50. package/dist/index.d.ts +8 -8
  51. package/dist/index.mjs +1 -1
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/kanban/index.cjs +1 -1
  54. package/dist/kanban/index.mjs +1 -1
  55. package/dist/schema/index.cjs +2 -0
  56. package/dist/schema/index.cjs.map +1 -0
  57. package/dist/schema/index.d.cts +57 -0
  58. package/dist/schema/index.d.ts +57 -0
  59. package/dist/schema/index.mjs +2 -0
  60. package/dist/schema/index.mjs.map +1 -0
  61. package/dist/scrum/index.cjs +1 -1
  62. package/dist/scrum/index.mjs +1 -1
  63. package/dist/types.d.cts +38 -2
  64. package/dist/types.d.ts +38 -2
  65. package/dist/waterfall/index.cjs +2 -0
  66. package/dist/waterfall/index.cjs.map +1 -0
  67. package/dist/waterfall/index.d.cts +148 -0
  68. package/dist/waterfall/index.d.ts +148 -0
  69. package/dist/waterfall/index.mjs +2 -0
  70. package/dist/waterfall/index.mjs.map +1 -0
  71. package/package.json +31 -2
  72. package/dist/chunk-6R3YFUUV.cjs +0 -6
  73. package/dist/chunk-6R3YFUUV.cjs.map +0 -1
  74. package/dist/chunk-JDVE7DQR.cjs +0 -2
  75. package/dist/chunk-JDVE7DQR.cjs.map +0 -1
  76. package/dist/chunk-NQU5TH3A.mjs +0 -2
  77. package/dist/chunk-NQU5TH3A.mjs.map +0 -1
  78. package/dist/chunk-NRAPI3GV.cjs +0 -2
  79. package/dist/chunk-NRAPI3GV.cjs.map +0 -1
  80. package/dist/chunk-PD5FBDN7.mjs +0 -2
  81. package/dist/chunk-PD5FBDN7.mjs.map +0 -1
  82. package/dist/chunk-QDT35LXB.cjs +0 -2
  83. package/dist/chunk-QDT35LXB.cjs.map +0 -1
  84. package/dist/chunk-VGD4V5BA.mjs +0 -6
  85. package/dist/chunk-VGD4V5BA.mjs.map +0 -1
  86. package/dist/chunk-YJNDBKIG.mjs +0 -2
  87. package/dist/chunk-YJNDBKIG.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/state.ts","../src/roles.ts","../src/items.ts","../src/policies.ts","../src/gates.ts","../src/rules.ts","../src/methodology.ts"],"names":["nowOf","now","createState","input","seenStages","st","fail","roles","r","assertId","at","appendEvent","state","type","by","payload","ev","lastEvent","i","roleOf","id","OPEN","registerRole","role","next","retireRole","roleId","open","hasCapability","cap","rolesWith","approverIds","gateId","except","approversFor","requireCapabilities","required","exclusive","holders","separationLost","c","canDo","caps","requireCap","h","stageOf","stageId","s","nextStageOf","idx","isTerminalStage","putItem","item","patchItem","fn","getItem","stripItemFields","keys","copy","k","it","assertKnownItems","ids","what","missing","d","addItem","firstStage","_s","rest","editItem","patch","changed","updated","moveItem","to","toStage","addEvidence","evidence","raiseBlocker","reason","owner","blockerId","t","lastTransitionTo","status","clearBlocker","b","blockers","stillBlocked","prev","toStatus","dropRole","_r","noRole","clearRole","itemId","advanceItem","wantsReview","evaluatePolicies","policies","out","v","rule","message","fix","p","e","notDone","assertPolicies","context","unmet","u","lastDispatchBefore","order","here","from","authorOf","before","checkGate","gate","violations","kind","needsHuman","req","author","others","raisePending","pending","entry","decide","pendingId","decision","note","item0","q","onFail","coreRulesFor","methodology","action","handoff","verdict","validateAction","applyAction","reduce","errors","x","init","m","config","stages","stateInput"],"mappings":"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","file":"chunk-JDVE7DQR.cjs","sourcesContent":["import { assertId, fail } from \"./errors.ts\";\nimport type { Event, MethodologyName, Role, Stage, WorkflowState } from \"./types.ts\";\n\nexport function nowOf(now?: string): string {\n return now ?? new Date().toISOString();\n}\n\nexport interface CreateStateInput {\n methodology: MethodologyName;\n config: unknown;\n stages: Stage[];\n roles: Role[];\n now?: string;\n}\n\nexport function createState(input: CreateStateInput): WorkflowState {\n const seenStages = new Set<string>();\n for (const st of input.stages) {\n if (seenStages.has(st.id))\n fail(\"config-invalid\", `duplicate stage id \"${st.id}\"`, \"give every stage a unique id\");\n seenStages.add(st.id);\n }\n const roles: Record<string, Role> = {};\n for (const r of input.roles) {\n assertId(r.id, \"role id\");\n if (Object.hasOwn(roles, r.id))\n fail(\"duplicate-role\", `duplicate role id \"${r.id}\"`, \"give every role a unique id\");\n roles[r.id] = r;\n }\n const at = nowOf(input.now);\n return {\n version: 1,\n methodology: input.methodology,\n config: input.config,\n items: {},\n stages: input.stages,\n roles,\n iterations: [],\n events: [\n {\n seq: 1,\n at,\n type: \"state.created\",\n by: \"system\",\n payload: { methodology: input.methodology },\n },\n ],\n accounting: [],\n pending: [],\n lessons: [],\n agreements: [],\n };\n}\n\nexport function appendEvent(\n state: WorkflowState,\n type: string,\n by: string,\n payload: unknown,\n now?: string,\n): WorkflowState {\n const last = state.events[state.events.length - 1];\n const ev: Event = { seq: (last?.seq ?? 0) + 1, at: nowOf(now), type, by, payload };\n return { ...state, events: [...state.events, ev] };\n}\n\nexport function lastEvent(state: WorkflowState, type?: string): Event | undefined {\n for (let i = state.events.length - 1; i >= 0; i--) {\n const ev = state.events[i]!;\n if (type === undefined || ev.type === type) return ev;\n }\n return undefined;\n}\n","import { assertId, fail } from \"./errors.ts\";\nimport { appendEvent } from \"./state.ts\";\nimport type { Capability, Role, WorkflowState } from \"./types.ts\";\n\n/** Own-property role lookup (ids such as \"constructor\" never hit the prototype). */\nexport function roleOf(state: WorkflowState, id: string): Role | undefined {\n return Object.hasOwn(state.roles, id) ? state.roles[id] : undefined;\n}\n\nconst OPEN: ReadonlySet<string> = new Set([\"in_progress\", \"review\", \"blocked\"]);\n\nexport function registerRole(\n state: WorkflowState,\n role: Role,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(role.id, \"role id\");\n if (roleOf(state, role.id))\n fail(\n \"duplicate-role\",\n `role \"${role.id}\" already exists`,\n `use a different id or retireRole(\"${role.id}\") first`,\n );\n const next = { ...state, roles: { ...state.roles, [role.id]: role } };\n return appendEvent(\n next,\n \"role.registered\",\n by,\n { role: role.id, capabilities: role.capabilities },\n now,\n );\n}\n\nexport function retireRole(\n state: WorkflowState,\n roleId: string,\n by: string,\n now?: string,\n): WorkflowState {\n if (!roleOf(state, roleId))\n fail(\n \"unknown-role\",\n `role \"${roleId}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \") || \"(none)\"}`,\n );\n const open = Object.values(state.items)\n .filter((i) => i.role === roleId && OPEN.has(i.status))\n .map((i) => i.id);\n if (open.length)\n fail(\n \"role-has-open-items\",\n `role \"${roleId}\" still holds ${open.length} open item(s)`,\n `complete or reassign ${open.join(\", \")} before retiring the role`,\n { items: open },\n );\n const roles = { ...state.roles };\n delete roles[roleId];\n return appendEvent({ ...state, roles }, \"role.retired\", by, { role: roleId }, now);\n}\n\nexport function hasCapability(role: Role, cap: Capability): boolean {\n return role.capabilities.includes(cap);\n}\n\nexport function rolesWith(state: WorkflowState, cap: Capability): Role[] {\n return Object.values(state.roles).filter((r) => hasCapability(r, cap));\n}\n\n/** Ids of roles that may approve `gateId`, optionally holding `cap` and excluding one id. */\nexport function approverIds(\n state: WorkflowState,\n gateId: string,\n cap?: string,\n except?: string,\n): string[] {\n return Object.values(state.roles)\n .filter(\n (r) =>\n r.id !== except &&\n r.canApprove.includes(gateId) &&\n (cap === undefined || (r.capabilities as readonly string[]).includes(cap)),\n )\n .map((r) => r.id);\n}\n\nexport function approversFor(state: WorkflowState, gateId: string): Role[] {\n return rolesWith(state, \"approve-gate\").filter((r) => r.canApprove.includes(gateId));\n}\n\nexport function requireCapabilities(\n state: WorkflowState,\n required: Capability[],\n exclusive: Capability[],\n): void {\n for (const cap of required) {\n if (rolesWith(state, cap).length === 0) {\n fail(\n \"missing-capability\",\n `no registered role has capability \"${cap}\"`,\n `register a role whose capabilities include \"${cap}\" (registerRole) before init`,\n );\n }\n }\n for (const cap of exclusive) {\n const holders = rolesWith(state, cap);\n if (holders.length > 1) {\n fail(\n \"exclusive-capability\",\n `capability \"${cap}\" must belong to exactly one role but is held by ${holders.map((r) => r.id).join(\", \")}`,\n `remove \"${cap}\" from all but one role`,\n );\n }\n }\n}\n\nexport function separationLost(state: WorkflowState, required: Capability[]): Role[] {\n if (required.length === 0) return [];\n return Object.values(state.roles).filter((r) => required.every((c) => hasCapability(r, c)));\n}\n\n/** `human` may do anything; a role must hold at least one of `caps`; unknown ids may do nothing. */\nexport function canDo(state: WorkflowState, by: string, ...caps: Capability[]): boolean {\n if (by === \"human\") return true;\n const role = roleOf(state, by);\n return !!role && caps.some((c) => hasCapability(role, c));\n}\n\nexport function requireCap(state: WorkflowState, by: string, ...caps: Capability[]): void {\n if (!canDo(state, by, ...caps)) {\n const holders = Object.values(state.roles)\n .filter((r) => caps.some((c) => hasCapability(r, c)))\n .map((r) => r.id);\n fail(\n \"missing-capability\",\n `\"${by}\" lacks capability ${caps.map((c) => `\"${c}\"`).join(\" or \")}`,\n `run this as one of: human${holders.map((h) => `, ${h}`).join(\"\")}`,\n );\n }\n}\n","import { assertId, fail } from \"./errors.ts\";\n\nexport { assertId };\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Evidence,\n ItemStatus,\n NewItem,\n Stage,\n Transition,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function stageOf(state: WorkflowState, stageId: string): Stage {\n const st = state.stages.find((s) => s.id === stageId);\n if (!st)\n fail(\n \"unknown-stage\",\n `stage \"${stageId}\" does not exist`,\n `stages are: ${state.stages.map((s) => s.id).join(\" → \")}`,\n );\n return st;\n}\n\nexport function nextStageOf(state: WorkflowState, stageId: string): Stage | undefined {\n const idx = state.stages.findIndex((s) => s.id === stageId);\n if (idx < 0) stageOf(state, stageId);\n return state.stages[idx + 1];\n}\n\nexport function isTerminalStage(state: WorkflowState, stageId: string): boolean {\n return state.stages[state.stages.length - 1]?.id === stageId;\n}\n\nfunction putItem(state: WorkflowState, item: WorkItem): WorkflowState {\n return { ...state, items: { ...state.items, [item.id]: item } };\n}\n\n/** Replace one item with `fn(item)`; no event. */\nexport function patchItem(\n state: WorkflowState,\n id: string,\n fn: (item: WorkItem) => WorkItem,\n): WorkflowState {\n return putItem(state, fn(getItem(state, id)));\n}\n\n/** Drop optional fields (iteration, role, ...) from one item; no event. */\nexport function stripItemFields(\n state: WorkflowState,\n id: string,\n keys: Array<\"iteration\" | \"role\">,\n): WorkflowState {\n return patchItem(state, id, (item) => {\n const copy = { ...item };\n for (const k of keys) delete copy[k];\n return copy;\n });\n}\n\nexport function getItem(state: WorkflowState, id: string): WorkItem {\n const it = Object.hasOwn(state.items, id) ? state.items[id] : undefined;\n if (!it)\n fail(\n \"unknown-item\",\n `item \"${id}\" does not exist`,\n `add it with addItem first; known items: ${Object.keys(state.items).join(\", \") || \"(none)\"}`,\n { items: [id] },\n );\n return it;\n}\n\nfunction assertKnownItems(state: WorkflowState, ids: string[], what: string): void {\n const missing = ids.filter((d) => !Object.hasOwn(state.items, d));\n if (missing.length)\n fail(\n \"unknown-item\",\n `${what} refers to unknown item(s) ${missing.join(\", \")}`,\n \"add those items first or remove the reference\",\n { items: missing },\n );\n}\n\nexport function addItem(\n state: WorkflowState,\n input: NewItem,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(input.id, \"item id\");\n if (Object.hasOwn(state.items, input.id))\n fail(\n \"duplicate-item\",\n `item \"${input.id}\" already exists`,\n \"use editItem to change it, or pick a new id\",\n { items: [input.id] },\n );\n const firstStage = state.stages[0];\n if (!firstStage)\n fail(\"config-invalid\", \"state has no stages\", \"create the state with at least one stage\");\n const stageId = input.stage ?? firstStage.id;\n stageOf(state, stageId);\n assertKnownItems(state, input.dependsOn ?? [], `item \"${input.id}\".dependsOn`);\n if (input.affects) assertKnownItems(state, input.affects, `item \"${input.id}\".affects`);\n if (input.parent !== undefined)\n assertKnownItems(state, [input.parent], `item \"${input.id}\".parent`);\n if (input.role !== undefined && !Object.hasOwn(state.roles, input.role))\n fail(\n \"unknown-role\",\n `role \"${input.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n\n const { stage: _s, ...rest } = input;\n const item: WorkItem = {\n type: \"task\",\n acceptance: [],\n dependsOn: [],\n ...rest,\n id: input.id,\n title: input.title,\n stage: stageId,\n status: \"todo\",\n evidence: [],\n blockers: [],\n transitions: [],\n };\n const next = putItem(state, item);\n return appendEvent(\n next,\n \"item.added\",\n by,\n {\n id: item.id,\n type: item.type,\n stage: item.stage,\n weight: item.weight ?? null,\n priority: item.priority ?? null,\n },\n now,\n );\n}\n\nexport type ItemPatch = Partial<\n Omit<WorkItem, \"id\" | \"stage\" | \"status\" | \"transitions\" | \"evidence\" | \"blockers\">\n>;\n\nexport function editItem(\n state: WorkflowState,\n id: string,\n patch: ItemPatch,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n if (patch.dependsOn) assertKnownItems(state, patch.dependsOn, `item \"${id}\".dependsOn`);\n if (patch.affects) assertKnownItems(state, patch.affects, `item \"${id}\".affects`);\n if (patch.parent !== undefined) assertKnownItems(state, [patch.parent], `item \"${id}\".parent`);\n if (patch.role !== undefined && !Object.hasOwn(state.roles, patch.role))\n fail(\n \"unknown-role\",\n `role \"${patch.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n const changed = (Object.keys(patch) as Array<keyof ItemPatch>).filter(\n (k) => JSON.stringify(patch[k]) !== JSON.stringify(item[k]),\n );\n if (changed.length === 0)\n fail(\n \"no-op\",\n `editItem(\"${id}\") changes nothing`,\n \"pass at least one field with a different value\",\n { items: [id] },\n );\n const updated: WorkItem = { ...item };\n for (const k of changed) (updated as unknown as Record<string, unknown>)[k] = patch[k];\n const next = putItem(state, updated);\n return appendEvent(next, \"item.edited\", by, { id, changed }, now);\n}\n\nexport function moveItem(\n state: WorkflowState,\n id: string,\n to: { stage?: string; status: ItemStatus },\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const toStage = to.stage ?? item.stage;\n stageOf(state, toStage);\n if (item.status === \"done\" || item.status === \"dropped\") {\n fail(\n \"invalid-transition\",\n `item \"${id}\" is ${item.status} and cannot move`,\n \"create a new item (or a change-request) instead of reopening a finished one\",\n { items: [id] },\n );\n }\n if (toStage === item.stage && to.status === item.status)\n fail(\n \"no-op\",\n `item \"${id}\" is already ${item.status} in \"${toStage}\"`,\n \"choose a different stage or status\",\n { items: [id] },\n );\n const at = nowOf(now);\n const updated: WorkItem = {\n ...item,\n stage: toStage,\n status: to.status,\n transitions: [\n ...item.transitions,\n {\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.transition\",\n by,\n {\n id,\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n },\n at,\n );\n}\n\nexport function addEvidence(\n state: WorkflowState,\n id: string,\n evidence: Omit<Evidence, \"at\">,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const updated: WorkItem = { ...item, evidence: [...item.evidence, { ...evidence, at }] };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.evidence\",\n evidence.by,\n { id, kind: evidence.kind, ref: evidence.ref },\n at,\n );\n}\n\nexport function raiseBlocker(\n state: WorkflowState,\n id: string,\n reason: string,\n owner: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const blockerId = `${id}-b${item.blockers.length + 1}`;\n const t: Transition | null =\n item.status === \"blocked\"\n ? null\n : {\n from: { stage: item.stage, status: item.status },\n to: { stage: item.stage, status: \"blocked\" },\n at,\n by,\n };\n const updated: WorkItem = {\n ...item,\n status: \"blocked\",\n blockers: [...item.blockers, { id: blockerId, reason, owner, raisedAt: at }],\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.raised\",\n by,\n { id, blocker: blockerId, reason, owner, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\nfunction lastTransitionTo(item: WorkItem, status: ItemStatus): Transition | undefined {\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === status) return t;\n }\n return undefined;\n}\n\nexport function clearBlocker(\n state: WorkflowState,\n id: string,\n blockerId: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const idx = item.blockers.findIndex((b) => b.id === blockerId && !b.clearedAt);\n if (idx < 0)\n fail(\n \"invalid-input\",\n `item \"${id}\" has no open blocker \"${blockerId}\"`,\n `open blockers: ${\n item.blockers\n .filter((b) => !b.clearedAt)\n .map((b) => b.id)\n .join(\", \") || \"(none)\"\n }`,\n { items: [id] },\n );\n const at = nowOf(now);\n const blockers = item.blockers.map((b, i) => (i === idx ? { ...b, clearedAt: at } : b));\n const stillBlocked = blockers.some((b) => !b.clearedAt);\n const prev = lastTransitionTo(item, \"blocked\")?.from.status ?? \"todo\";\n let toStage = item.stage;\n let toStatus: ItemStatus = prev;\n let dropRole = false;\n if (prev === \"in_progress\") {\n toStatus = \"todo\";\n toStage = lastTransitionTo(item, \"in_progress\")?.from.stage ?? item.stage;\n } else if (prev === \"awaiting_human\") {\n // a rejected human gate: the work is re-dispatched in the current stage\n toStatus = stageOf(state, item.stage).review ? \"review\" : \"todo\";\n dropRole = true;\n }\n const { role: _r, ...noRole } = item;\n const t: Transition | null = stillBlocked\n ? null\n : {\n from: { stage: item.stage, status: \"blocked\" },\n to: { stage: toStage, status: toStatus },\n at,\n by,\n };\n const updated: WorkItem = {\n ...(dropRole && !stillBlocked ? (noRole as WorkItem) : item),\n blockers,\n stage: stillBlocked ? item.stage : toStage,\n status: stillBlocked ? \"blocked\" : toStatus,\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.cleared\",\n by,\n { id, blocker: blockerId, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\n/** Entering a new stage is a new assignment: the role that finished the previous stage is cleared so the planner picks the right one (a reviewer, not the author). */\nexport function clearRole(state: WorkflowState, itemId: string): WorkflowState {\n return stripItemFields(state, itemId, [\"role\"]);\n}\n\n/** Move an item to the next stage (done at the end, review/todo otherwise) and clear its role. */\nexport function advanceItem(\n state: WorkflowState,\n itemId: string,\n by: string,\n wantsReview: boolean,\n now: string,\n): WorkflowState {\n const item = getItem(state, itemId);\n const to = nextStageOf(state, item.stage);\n if (!to) return moveItem(state, itemId, { status: \"done\" }, by, now);\n if (isTerminalStage(state, to.id))\n return moveItem(state, itemId, { stage: to.id, status: \"done\" }, by, now);\n const status = wantsReview || to.review === true ? \"review\" : \"todo\";\n return clearRole(moveItem(state, itemId, { stage: to.id, status }, by, now), itemId);\n}\n","import { fail } from \"./errors.ts\";\nimport type { Policy, Violation, WorkItem, WorkflowState } from \"./types.ts\";\n\nexport function evaluatePolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n): Violation[] {\n const out: Violation[] = [];\n const v = (rule: string, message: string, fix: string) =>\n out.push({ rule, severity: \"error\", item: item.id, message, fix });\n for (const p of policies) {\n switch (p.kind) {\n case \"evidence\":\n if (!item.evidence.some((e) => e.kind === p.evidenceKind))\n v(\n \"policy:evidence\",\n `item \"${item.id}\" has no evidence of kind \"${p.evidenceKind}\"`,\n `attach evidence { kind: \"${p.evidenceKind}\" } via addEvidence or in the handoff.produced`,\n );\n break;\n case \"acceptance-written\":\n if (item.acceptance.length === 0)\n v(\n \"policy:acceptance-written\",\n `item \"${item.id}\" has no acceptance criteria`,\n \"editItem with a non-empty acceptance[] (needs define-acceptance)\",\n );\n break;\n case \"estimate-present\":\n if (item.weight === undefined)\n v(\n \"policy:estimate-present\",\n `item \"${item.id}\" has no weight`,\n \"editItem with a weight (story points)\",\n );\n break;\n case \"no-open-blockers\": {\n const open = item.blockers.filter((b) => !b.clearedAt);\n if (open.length)\n v(\n \"policy:no-open-blockers\",\n `item \"${item.id}\" has ${open.length} open blocker(s)`,\n `clearBlocker ${open.map((b) => b.id).join(\", \")}`,\n );\n break;\n }\n case \"dependencies-done\": {\n const notDone = item.dependsOn.filter((d) => state.items[d]?.status !== \"done\");\n if (notDone.length)\n v(\n \"policy:dependencies-done\",\n `item \"${item.id}\" depends on unfinished ${notDone.join(\", \")}`,\n `finish ${notDone.join(\", \")} first`,\n );\n break;\n }\n case \"custom\":\n if (!item.evidence.some((e) => e.kind === `policy:${p.id}`))\n v(\n `policy:custom:${p.id}`,\n `item \"${item.id}\" has not satisfied \"${p.description}\"`,\n `attach evidence { kind: \"policy:${p.id}\" } when it is satisfied`,\n );\n break;\n }\n }\n return out;\n}\n\nexport function assertPolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n context: string,\n): void {\n const unmet = evaluatePolicies(state, item, policies);\n if (unmet.length) {\n fail(\n \"policy-unmet\",\n `item \"${item.id}\" cannot ${context}: ${unmet.length} polic${unmet.length === 1 ? \"y\" : \"ies\"} unmet`,\n unmet.map((u) => u.fix).join(\"; \"),\n { items: [item.id] },\n );\n }\n}\n","import { fail } from \"./errors.ts\";\nimport { advanceItem, clearRole, getItem, moveItem, raiseBlocker } from \"./items.ts\";\nimport { approverIds } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Gate,\n PendingHuman,\n Transition,\n Violation,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport type GateResult =\n | { outcome: \"pass\" }\n | { outcome: \"human\" }\n | { outcome: \"fail\"; violations: Violation[] };\n\n/** Last in_progress dispatch made from a stage that comes STRICTLY BEFORE the item's current stage in `state.stages` order (unknown stage ids count as not-before). */\nexport function lastDispatchBefore(state: WorkflowState, item: WorkItem): Transition | undefined {\n const order = new Map(state.stages.map((s, i) => [s.id, i] as const));\n const here = order.get(item.stage);\n if (here === undefined) return undefined;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n const from = order.get(t.from.stage);\n if (t.to.status === \"in_progress\" && from !== undefined && from < here) return t;\n }\n return undefined;\n}\n\n/** Role that did the work the gate guards: the last dispatch made from a stage strictly before the current one (so a reviewer dispatched into the gated stage is not its author); else the last dispatch of any stage; undefined if never dispatched. */\nexport function authorOf(state: WorkflowState, item: WorkItem): string | undefined {\n const before = lastDispatchBefore(state, item);\n if (before) return before.by;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === \"in_progress\") return t.by;\n }\n return undefined;\n}\n\nexport function checkGate(\n state: WorkflowState,\n item: WorkItem,\n gate: Gate,\n by: string,\n): GateResult {\n const violations: Violation[] = [];\n for (const kind of gate.evidence) {\n if (!item.evidence.some((e) => e.kind === kind)) {\n violations.push({\n rule: \"gate:evidence\",\n severity: \"error\",\n item: item.id,\n message: `gate \"${gate.id}\" needs evidence \"${kind}\" on item \"${item.id}\"`,\n fix: `attach evidence { kind: \"${kind}\" } before approving`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n\n let needsHuman = false;\n for (const req of gate.requires) {\n if (req === \"human\") {\n if (by !== \"human\") needsHuman = true;\n continue;\n }\n const ok = approverIds(state, gate.id, req.capability).includes(by);\n if (!ok) {\n violations.push({\n rule: \"gate:capability\",\n severity: \"error\",\n item: item.id,\n message: `\"${by}\" may not approve gate \"${gate.id}\" (needs capability \"${req.capability}\" and canApprove \"${gate.id}\")`,\n fix: `approve as one of: ${approverIds(state, gate.id, req.capability).join(\", \") || \"(no role qualifies; register one)\"}`,\n });\n continue;\n }\n const author = authorOf(state, item);\n if (author !== undefined && author === by) {\n const others = approverIds(state, gate.id, req.capability, by);\n violations.push({\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${by}\" did the work on \"${item.id}\" and may not approve it`,\n fix: `approve as a different role: ${others.join(\", \") || \"(register another approver)\"}`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n return needsHuman ? { outcome: \"human\" } : { outcome: \"pass\" };\n}\n\nexport function raisePending(\n state: WorkflowState,\n pending: Omit<PendingHuman, \"id\" | \"raisedAt\">,\n now?: string,\n): WorkflowState {\n const at = nowOf(now);\n const id = `p${state.events.filter((e) => e.type === \"pending.raised\").length + 1}`;\n const entry: PendingHuman = { ...pending, id, raisedAt: at };\n let next: WorkflowState = { ...state, pending: [...state.pending, entry] };\n if (pending.item) {\n const item = getItem(next, pending.item);\n if (item.status !== \"awaiting_human\")\n next = moveItem(next, pending.item, { status: \"awaiting_human\" }, \"system\", at);\n }\n return appendEvent(\n next,\n \"pending.raised\",\n \"system\",\n { id, kind: pending.kind, item: pending.item ?? null, gate: pending.gate ?? null },\n at,\n );\n}\n\nexport function decide(\n state: WorkflowState,\n pendingId: string,\n decision: \"approve\" | \"reject\",\n by: string,\n note: string,\n now?: string,\n): WorkflowState {\n if (decision !== \"approve\" && decision !== \"reject\")\n fail(\n \"invalid-input\",\n `decision must be \"approve\" or \"reject\" (got ${JSON.stringify(decision)})`,\n \"pass approve or reject\",\n );\n const entry = state.pending.find((p) => p.id === pendingId);\n if (!entry)\n fail(\n \"unknown-pending\",\n `no pending decision \"${pendingId}\"`,\n `open decisions: ${state.pending.map((p) => p.id).join(\", \") || \"(none)\"}`,\n );\n const item0 = entry.kind === \"gate\" && entry.item ? getItem(state, entry.item) : undefined;\n const gate =\n item0 &&\n (state.stages.find((s) => entry.gate !== undefined && s.gate?.id === entry.gate)?.gate ??\n state.stages.find((s) => s.id === item0.stage)?.gate);\n if (item0 && gate && by !== \"human\") {\n const res = gate.requires.includes(\"human\") ? undefined : checkGate(state, item0, gate, by);\n if (res?.outcome !== \"pass\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide gate \"${gate.id}\" on \"${item0.id}\"`,\n `decide as one of: human${gate.requires\n .flatMap((q) => (q === \"human\" ? [] : approverIds(state, gate.id, q.capability)))\n .map((r) => `, ${r}`)\n .join(\"\")}`,\n { items: [item0.id], rule: \"gate\" },\n );\n }\n const at = nowOf(now);\n let next: WorkflowState = { ...state, pending: state.pending.filter((p) => p.id !== pendingId) };\n next = appendEvent(\n next,\n \"pending.decided\",\n by,\n { id: pendingId, decision, note, item: entry.item ?? null, gate: entry.gate ?? null },\n at,\n );\n if (item0) {\n const id = item0.id;\n const gateId = entry.gate ?? gate?.id ?? null;\n if (decision === \"approve\") {\n next = advanceItem(next, id, by, false, at);\n next = appendEvent(next, \"gate.passed\", by, { item: id, gate: gateId }, at);\n } else {\n const onFail = gate?.onFail ?? { action: \"block\" as const };\n if (onFail.action === \"return-to\")\n next = clearRole(moveItem(next, id, { stage: onFail.stage, status: \"todo\" }, by, at), id);\n else\n next = raiseBlocker(\n next,\n id,\n `gate \"${gateId ?? \"?\"}\" rejected: ${note || \"no reason given\"}`,\n by,\n by,\n at,\n );\n next = appendEvent(next, \"gate.failed\", by, { item: id, gate: gateId, note }, at);\n }\n }\n return next;\n}\n","import { authorOf } from \"./gates.ts\";\nimport { approverIds, separationLost } from \"./roles.ts\";\nimport type { Action, Handoff, Methodology, Rule, Violation } from \"./types.ts\";\n\nexport function coreRulesFor(methodology: Pick<Methodology, \"requiredCapabilities\">): Rule[] {\n const separation: Rule = {\n id: \"separation-lost\",\n severity: \"warning\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"init\" && action.type !== \"role.register\") return [];\n return separationLost(state, methodology.requiredCapabilities).map((r) => ({\n rule: \"separation-lost\",\n severity: \"warning\" as const,\n message: `role \"${r.id}\" holds every required capability (${methodology.requiredCapabilities.join(\", \")}); no separation of duties`,\n fix: \"fine for a solo operator; otherwise split capabilities across roles\",\n }));\n },\n };\n const coi: Rule = {\n id: \"conflict-of-interest\",\n severity: \"error\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"complete\") return [];\n const handoff = (action.payload as { handoff?: Handoff } | undefined)?.handoff;\n if (!handoff) return [];\n const verdict = handoff.verdict ?? \"done\";\n if (verdict !== \"done\" && verdict !== \"needs-review\") return [];\n const item = state.items[handoff.item];\n if (!item) return [];\n const gate = state.stages.find((s) => s.id === item.stage)?.gate;\n if (!gate || !gate.requires.some((q) => q !== \"human\")) return [];\n if (authorOf(state, item) !== handoff.role) return [];\n const others = approverIds(state, gate.id, undefined, handoff.role);\n return [\n {\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${handoff.role}\" authored \"${item.id}\" and may not pass gate \"${gate.id}\" on it`,\n fix: `hand the gate to another approver: ${others.join(\", \") || \"(register one)\"}`,\n },\n ];\n },\n };\n return [separation, coi];\n}\n","import { fail } from \"./errors.ts\";\nimport { requireCapabilities } from \"./roles.ts\";\nimport { coreRulesFor } from \"./rules.ts\";\nimport { createState } from \"./state.ts\";\nimport type {\n Action,\n ApplyResult,\n Methodology,\n Role,\n Stage,\n Violation,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function validateAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n): Violation[] {\n const out: Violation[] = [];\n for (const rule of [...coreRulesFor(methodology), ...methodology.rules])\n out.push(...rule.check(state, action));\n return out;\n}\n\nexport function applyAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n reduce: (s: WorkflowState) => WorkflowState,\n): ApplyResult {\n const violations = validateAction(state, methodology, action);\n const errors = violations.filter((v) => v.severity === \"error\");\n if (errors.length) {\n fail(\n \"rule-violation\",\n `${action.type} violates ${errors.map((e) => e.rule).join(\", \")}: ${errors.map((e) => e.message).join(\"; \")}`,\n errors.map((e) => e.fix).join(\"; \"),\n { rule: errors[0]!.rule, items: errors.map((e) => e.item).filter((x): x is string => !!x) },\n );\n }\n return { state: reduce(state), warnings: violations.filter((v) => v.severity === \"warning\") };\n}\n\nexport interface InitInput<C> {\n methodology: Methodology<C>;\n config: unknown;\n roles?: Role[];\n stages?: Stage[];\n by?: string;\n now?: string;\n}\n\nexport function init<C>(input: InitInput<C>): ApplyResult {\n const m = input.methodology;\n const config = m.validateConfig(input.config);\n const stages = input.stages ?? m.defaultStages(config);\n const roles = input.roles ?? m.defaultRoles(config);\n const stateInput =\n input.now !== undefined\n ? { methodology: m.name, config, stages, roles, now: input.now }\n : { methodology: m.name, config, stages, roles };\n const state = createState(stateInput);\n requireCapabilities(state, m.requiredCapabilities, m.exclusiveCapabilities);\n return applyAction(state, m as Methodology, { type: \"init\", by: input.by ?? \"system\" }, (s) => s);\n}\n"]}
@@ -1,2 +0,0 @@
1
- import {b,c}from'./chunk-2FRRD6A3.mjs';function k(t){return t??new Date().toISOString()}function C(t){let e=new Set;for(let n of t.stages)e.has(n.id)&&b("config-invalid",`duplicate stage id "${n.id}"`,"give every stage a unique id"),e.add(n.id);let o={};for(let n of t.roles)c(n.id,"role id"),Object.hasOwn(o,n.id)&&b("duplicate-role",`duplicate role id "${n.id}"`,"give every role a unique id"),o[n.id]=n;let i=k(t.now);return {version:1,methodology:t.methodology,config:t.config,items:{},stages:t.stages,roles:o,iterations:[],events:[{seq:1,at:i,type:"state.created",by:"system",payload:{methodology:t.methodology}}],accounting:[],pending:[],lessons:[],agreements:[]}}function g(t,e,o,i,n){let r={seq:(t.events[t.events.length-1]?.seq??0)+1,at:k(n),type:e,by:o,payload:i};return {...t,events:[...t.events,r]}}function te(t,e){for(let o=t.events.length-1;o>=0;o--){let i=t.events[o];if(e===void 0||i.type===e)return i}}function j(t,e){return Object.hasOwn(t.roles,e)?t.roles[e]:void 0}var H=new Set(["in_progress","review","blocked"]);function re(t,e,o,i){c(e.id,"role id"),j(t,e.id)&&b("duplicate-role",`role "${e.id}" already exists`,`use a different id or retireRole("${e.id}") first`);let n={...t,roles:{...t.roles,[e.id]:e}};return g(n,"role.registered",o,{role:e.id,capabilities:e.capabilities},i)}function se(t,e,o,i){j(t,e)||b("unknown-role",`role "${e}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")||"(none)"}`);let n=Object.values(t.items).filter(r=>r.role===e&&H.has(r.status)).map(r=>r.id);n.length&&b("role-has-open-items",`role "${e}" still holds ${n.length} open item(s)`,`complete or reassign ${n.join(", ")} before retiring the role`,{items:n});let s={...t.roles};return delete s[e],g({...t,roles:s},"role.retired",o,{role:e},i)}function x(t,e){return t.capabilities.includes(e)}function O(t,e){return Object.values(t.roles).filter(o=>x(o,e))}function w(t,e,o,i){return Object.values(t.roles).filter(n=>n.id!==i&&n.canApprove.includes(e)&&(o===void 0||n.capabilities.includes(o))).map(n=>n.id)}function ae(t,e){return O(t,"approve-gate").filter(o=>o.canApprove.includes(e))}function q(t,e,o){for(let i of e)O(t,i).length===0&&b("missing-capability",`no registered role has capability "${i}"`,`register a role whose capabilities include "${i}" (registerRole) before init`);for(let i of o){let n=O(t,i);n.length>1&&b("exclusive-capability",`capability "${i}" must belong to exactly one role but is held by ${n.map(s=>s.id).join(", ")}`,`remove "${i}" from all but one role`);}}function P(t,e){return e.length===0?[]:Object.values(t.roles).filter(o=>e.every(i=>x(o,i)))}function G(t,e,...o){if(e==="human")return true;let i=j(t,e);return !!i&&o.some(n=>x(i,n))}function le(t,e,...o){if(!G(t,e,...o)){let i=Object.values(t.roles).filter(n=>o.some(s=>x(n,s))).map(n=>n.id);b("missing-capability",`"${e}" lacks capability ${o.map(n=>`"${n}"`).join(" or ")}`,`run this as one of: human${i.map(n=>`, ${n}`).join("")}`);}}function I(t,e){let o=t.stages.find(i=>i.id===e);return o||b("unknown-stage",`stage "${e}" does not exist`,`stages are: ${t.stages.map(i=>i.id).join(" \u2192 ")}`),o}function D(t,e){let o=t.stages.findIndex(i=>i.id===e);return o<0&&I(t,e),t.stages[o+1]}function K(t,e){return t.stages[t.stages.length-1]?.id===e}function v(t,e){return {...t,items:{...t.items,[e.id]:e}}}function J(t,e,o){return v(t,o(h(t,e)))}function L(t,e,o){return J(t,e,i=>{let n={...i};for(let s of o)delete n[s];return n})}function h(t,e){let o=Object.hasOwn(t.items,e)?t.items[e]:void 0;return o||b("unknown-item",`item "${e}" does not exist`,`add it with addItem first; known items: ${Object.keys(t.items).join(", ")||"(none)"}`,{items:[e]}),o}function $(t,e,o){let i=e.filter(n=>!Object.hasOwn(t.items,n));i.length&&b("unknown-item",`${o} refers to unknown item(s) ${i.join(", ")}`,"add those items first or remove the reference",{items:i});}function ue(t,e,o,i){c(e.id,"item id"),Object.hasOwn(t.items,e.id)&&b("duplicate-item",`item "${e.id}" already exists`,"use editItem to change it, or pick a new id",{items:[e.id]});let n=t.stages[0];n||b("config-invalid","state has no stages","create the state with at least one stage");let s=e.stage??n.id;I(t,s),$(t,e.dependsOn??[],`item "${e.id}".dependsOn`),e.affects&&$(t,e.affects,`item "${e.id}".affects`),e.parent!==void 0&&$(t,[e.parent],`item "${e.id}".parent`),e.role!==void 0&&!Object.hasOwn(t.roles,e.role)&&b("unknown-role",`role "${e.role}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")}`);let{stage:r,...a}=e,l={type:"task",acceptance:[],dependsOn:[],...a,id:e.id,title:e.title,stage:s,status:"todo",evidence:[],blockers:[],transitions:[]},c$1=v(t,l);return g(c$1,"item.added",o,{id:l.id,type:l.type,stage:l.stage,weight:l.weight??null,priority:l.priority??null},i)}function ge(t,e,o,i,n){let s=h(t,e);o.dependsOn&&$(t,o.dependsOn,`item "${e}".dependsOn`),o.affects&&$(t,o.affects,`item "${e}".affects`),o.parent!==void 0&&$(t,[o.parent],`item "${e}".parent`),o.role!==void 0&&!Object.hasOwn(t.roles,o.role)&&b("unknown-role",`role "${o.role}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")}`);let r=Object.keys(o).filter(c=>JSON.stringify(o[c])!==JSON.stringify(s[c]));r.length===0&&b("no-op",`editItem("${e}") changes nothing`,"pass at least one field with a different value",{items:[e]});let a={...s};for(let c of r)a[c]=o[c];let l=v(t,a);return g(l,"item.edited",i,{id:e,changed:r},n)}function S(t,e,o,i,n){let s=h(t,e),r=o.stage??s.stage;I(t,r),(s.status==="done"||s.status==="dropped")&&b("invalid-transition",`item "${e}" is ${s.status} and cannot move`,"create a new item (or a change-request) instead of reopening a finished one",{items:[e]}),r===s.stage&&o.status===s.status&&b("no-op",`item "${e}" is already ${s.status} in "${r}"`,"choose a different stage or status",{items:[e]});let a=k(n),l={...s,stage:r,status:o.status,transitions:[...s.transitions,{from:{stage:s.stage,status:s.status},to:{stage:r,status:o.status},at:a,by:i}]},c=v(t,l);return g(c,"item.transition",i,{id:e,from:{stage:s.stage,status:s.status},to:{stage:r,status:o.status}},a)}function pe(t,e,o,i){let n=h(t,e),s=k(i),r={...n,evidence:[...n.evidence,{...o,at:s}]},a=v(t,r);return g(a,"item.evidence",o.by,{id:e,kind:o.kind,ref:o.ref},s)}function V(t,e,o,i,n,s){let r=h(t,e),a=k(s),l=`${e}-b${r.blockers.length+1}`,c=r.status==="blocked"?null:{from:{stage:r.stage,status:r.status},to:{stage:r.stage,status:"blocked"},at:a,by:n},f={...r,status:"blocked",blockers:[...r.blockers,{id:l,reason:o,owner:i,raisedAt:a}],transitions:c?[...r.transitions,c]:r.transitions},u=v(t,f);return g(u,"blocker.raised",n,{id:e,blocker:l,reason:o,owner:i,transition:c&&{from:c.from,to:c.to}},a)}function E(t,e){for(let o=t.transitions.length-1;o>=0;o--){let i=t.transitions[o];if(i.to.status===e)return i}}function me(t,e,o,i,n){let s=h(t,e),r=s.blockers.findIndex(m=>m.id===o&&!m.clearedAt);r<0&&b("invalid-input",`item "${e}" has no open blocker "${o}"`,`open blockers: ${s.blockers.filter(m=>!m.clearedAt).map(m=>m.id).join(", ")||"(none)"}`,{items:[e]});let a=k(n),l=s.blockers.map((m,F)=>F===r?{...m,clearedAt:a}:m),c=l.some(m=>!m.clearedAt),f=E(s,"blocked")?.from.status??"todo",u=s.stage,p=f,W=false;f==="in_progress"?(p="todo",u=E(s,"in_progress")?.from.stage??s.stage):f==="awaiting_human"&&(p=I(t,s.stage).review?"review":"todo",W=true);let{role:Z,...T}=s,b$1=c?null:{from:{stage:s.stage,status:"blocked"},to:{stage:u,status:p},at:a,by:i},N={...W&&!c?T:s,blockers:l,stage:c?s.stage:u,status:c?"blocked":p,transitions:b$1?[...s.transitions,b$1]:s.transitions},B=v(t,N);return g(B,"blocker.cleared",i,{id:e,blocker:o,transition:b$1&&{from:b$1.from,to:b$1.to}},a)}function R(t,e){return L(t,e,["role"])}function M(t,e,o,i,n){let s=h(t,e),r=D(t,s.stage);if(!r)return S(t,e,{status:"done"},o,n);if(K(t,r.id))return S(t,e,{stage:r.id,status:"done"},o,n);let a=i||r.review===true?"review":"todo";return R(S(t,e,{stage:r.id,status:a},o,n),e)}function z(t,e,o){let i=[],n=(s,r,a)=>i.push({rule:s,severity:"error",item:e.id,message:r,fix:a});for(let s of o)switch(s.kind){case "evidence":e.evidence.some(r=>r.kind===s.evidenceKind)||n("policy:evidence",`item "${e.id}" has no evidence of kind "${s.evidenceKind}"`,`attach evidence { kind: "${s.evidenceKind}" } via addEvidence or in the handoff.produced`);break;case "acceptance-written":e.acceptance.length===0&&n("policy:acceptance-written",`item "${e.id}" has no acceptance criteria`,"editItem with a non-empty acceptance[] (needs define-acceptance)");break;case "estimate-present":e.weight===void 0&&n("policy:estimate-present",`item "${e.id}" has no weight`,"editItem with a weight (story points)");break;case "no-open-blockers":{let r=e.blockers.filter(a=>!a.clearedAt);r.length&&n("policy:no-open-blockers",`item "${e.id}" has ${r.length} open blocker(s)`,`clearBlocker ${r.map(a=>a.id).join(", ")}`);break}case "dependencies-done":{let r=e.dependsOn.filter(a=>t.items[a]?.status!=="done");r.length&&n("policy:dependencies-done",`item "${e.id}" depends on unfinished ${r.join(", ")}`,`finish ${r.join(", ")} first`);break}case "custom":e.evidence.some(r=>r.kind===`policy:${s.id}`)||n(`policy:custom:${s.id}`,`item "${e.id}" has not satisfied "${s.description}"`,`attach evidence { kind: "policy:${s.id}" } when it is satisfied`);break}return i}function we(t,e,o,i){let n=z(t,e,o);n.length&&b("policy-unmet",`item "${e.id}" cannot ${i}: ${n.length} polic${n.length===1?"y":"ies"} unmet`,n.map(s=>s.fix).join("; "),{items:[e.id]});}function Q(t,e){let o=new Map(t.stages.map((n,s)=>[n.id,s])),i=o.get(e.stage);if(i!==void 0)for(let n=e.transitions.length-1;n>=0;n--){let s=e.transitions[n],r=o.get(s.from.stage);if(s.to.status==="in_progress"&&r!==void 0&&r<i)return s}}function A(t,e){let o=Q(t,e);if(o)return o.by;for(let i=e.transitions.length-1;i>=0;i--){let n=e.transitions[i];if(n.to.status==="in_progress")return n.by}}function U(t,e,o,i){let n=[];for(let r of o.evidence)e.evidence.some(a=>a.kind===r)||n.push({rule:"gate:evidence",severity:"error",item:e.id,message:`gate "${o.id}" needs evidence "${r}" on item "${e.id}"`,fix:`attach evidence { kind: "${r}" } before approving`});if(n.length)return {outcome:"fail",violations:n};let s=false;for(let r of o.requires){if(r==="human"){i!=="human"&&(s=true);continue}if(!w(t,o.id,r.capability).includes(i)){n.push({rule:"gate:capability",severity:"error",item:e.id,message:`"${i}" may not approve gate "${o.id}" (needs capability "${r.capability}" and canApprove "${o.id}")`,fix:`approve as one of: ${w(t,o.id,r.capability).join(", ")||"(no role qualifies; register one)"}`});continue}let l=A(t,e);if(l!==void 0&&l===i){let c=w(t,o.id,r.capability,i);n.push({rule:"conflict-of-interest",severity:"error",item:e.id,message:`role "${i}" did the work on "${e.id}" and may not approve it`,fix:`approve as a different role: ${c.join(", ")||"(register another approver)"}`});}}return n.length?{outcome:"fail",violations:n}:s?{outcome:"human"}:{outcome:"pass"}}function be(t,e,o){let i=k(o),n=`p${t.events.filter(a=>a.type==="pending.raised").length+1}`,s={...e,id:n,raisedAt:i},r={...t,pending:[...t.pending,s]};return e.item&&h(r,e.item).status!=="awaiting_human"&&(r=S(r,e.item,{status:"awaiting_human"},"system",i)),g(r,"pending.raised","system",{id:n,kind:e.kind,item:e.item??null,gate:e.gate??null},i)}function xe(t,e,o,i,n,s){o!=="approve"&&o!=="reject"&&b("invalid-input",`decision must be "approve" or "reject" (got ${JSON.stringify(o)})`,"pass approve or reject");let r=t.pending.find(u=>u.id===e);r||b("unknown-pending",`no pending decision "${e}"`,`open decisions: ${t.pending.map(u=>u.id).join(", ")||"(none)"}`);let a=r.kind==="gate"&&r.item?h(t,r.item):void 0,l=a&&(t.stages.find(u=>r.gate!==void 0&&u.gate?.id===r.gate)?.gate??t.stages.find(u=>u.id===a.stage)?.gate);a&&l&&i!=="human"&&(l.requires.includes("human")?void 0:U(t,a,l,i))?.outcome!=="pass"&&b("gate-unmet",`"${i}" may not decide gate "${l.id}" on "${a.id}"`,`decide as one of: human${l.requires.flatMap(p=>p==="human"?[]:w(t,l.id,p.capability)).map(p=>`, ${p}`).join("")}`,{items:[a.id],rule:"gate"});let c=k(s),f={...t,pending:t.pending.filter(u=>u.id!==e)};if(f=g(f,"pending.decided",i,{id:e,decision:o,note:n,item:r.item??null,gate:r.gate??null},c),a){let u=a.id,p=r.gate??l?.id??null;if(o==="approve")f=M(f,u,i,false,c),f=g(f,"gate.passed",i,{item:u,gate:p},c);else {let W=l?.onFail??{action:"block"};W.action==="return-to"?f=R(S(f,u,{stage:W.stage,status:"todo"},i,c),u):f=V(f,u,`gate "${p??"?"}" rejected: ${n||"no reason given"}`,i,i,c),f=g(f,"gate.failed",i,{item:u,gate:p,note:n},c);}}return f}function _(t){return [{id:"separation-lost",severity:"warning",check(i,n){return n.type!=="init"&&n.type!=="role.register"?[]:P(i,t.requiredCapabilities).map(s=>({rule:"separation-lost",severity:"warning",message:`role "${s.id}" holds every required capability (${t.requiredCapabilities.join(", ")}); no separation of duties`,fix:"fine for a solo operator; otherwise split capabilities across roles"}))}},{id:"conflict-of-interest",severity:"error",check(i,n){if(n.type!=="complete")return [];let s=n.payload?.handoff;if(!s)return [];let r=s.verdict??"done";if(r!=="done"&&r!=="needs-review")return [];let a=i.items[s.item];if(!a)return [];let l=i.stages.find(f=>f.id===a.stage)?.gate;if(!l||!l.requires.some(f=>f!=="human"))return [];if(A(i,a)!==s.role)return [];let c=w(i,l.id,void 0,s.role);return [{rule:"conflict-of-interest",severity:"error",item:a.id,message:`role "${s.role}" authored "${a.id}" and may not pass gate "${l.id}" on it`,fix:`hand the gate to another approver: ${c.join(", ")||"(register one)"}`}]}}]}function X(t,e,o){let i=[];for(let n of [..._(e),...e.rules])i.push(...n.check(t,o));return i}function Y(t,e,o,i){let n=X(t,e,o),s=n.filter(r=>r.severity==="error");return s.length&&b("rule-violation",`${o.type} violates ${s.map(r=>r.rule).join(", ")}: ${s.map(r=>r.message).join("; ")}`,s.map(r=>r.fix).join("; "),{rule:s[0].rule,items:s.map(r=>r.item).filter(r=>!!r)}),{state:i(t),warnings:n.filter(r=>r.severity==="warning")}}function Ee(t){let e=t.methodology,o=e.validateConfig(t.config),i=t.stages??e.defaultStages(o),n=t.roles??e.defaultRoles(o),s=t.now!==void 0?{methodology:e.name,config:o,stages:i,roles:n,now:t.now}:{methodology:e.name,config:o,stages:i,roles:n},r=C(s);return q(r,e.requiredCapabilities,e.exclusiveCapabilities),Y(r,e,{type:"init",by:t.by??"system"},a=>a)}export{me as A,R as B,M as C,z as D,we as E,Q as F,A as G,U as H,be as I,xe as J,_ as K,X as L,Y as M,Ee as N,k as a,C as b,g as c,te as d,j as e,re as f,se as g,x as h,O as i,w as j,ae as k,q as l,P as m,G as n,le as o,I as p,D as q,K as r,J as s,L as t,h as u,ue as v,ge as w,S as x,pe as y,V as z};//# sourceMappingURL=chunk-NQU5TH3A.mjs.map
2
- //# sourceMappingURL=chunk-NQU5TH3A.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/state.ts","../src/roles.ts","../src/items.ts","../src/policies.ts","../src/gates.ts","../src/rules.ts","../src/methodology.ts"],"names":["nowOf","now","createState","input","seenStages","st","fail","roles","r","assertId","at","appendEvent","state","type","by","payload","ev","lastEvent","i","roleOf","id","OPEN","registerRole","role","next","retireRole","roleId","open","hasCapability","cap","rolesWith","approverIds","gateId","except","approversFor","requireCapabilities","required","exclusive","holders","separationLost","c","canDo","caps","requireCap","h","stageOf","stageId","s","nextStageOf","idx","isTerminalStage","putItem","item","patchItem","fn","getItem","stripItemFields","keys","copy","k","it","assertKnownItems","ids","what","missing","d","addItem","firstStage","_s","rest","editItem","patch","changed","updated","moveItem","to","toStage","addEvidence","evidence","raiseBlocker","reason","owner","blockerId","t","lastTransitionTo","status","clearBlocker","b","blockers","stillBlocked","prev","toStatus","dropRole","_r","noRole","clearRole","itemId","advanceItem","wantsReview","evaluatePolicies","policies","out","v","rule","message","fix","p","e","notDone","assertPolicies","context","unmet","u","lastDispatchBefore","order","here","from","authorOf","before","checkGate","gate","violations","kind","needsHuman","req","author","others","raisePending","pending","entry","decide","pendingId","decision","note","item0","q","onFail","coreRulesFor","methodology","action","handoff","verdict","validateAction","applyAction","reduce","errors","x","init","m","config","stages","stateInput"],"mappings":"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","file":"chunk-NQU5TH3A.mjs","sourcesContent":["import { assertId, fail } from \"./errors.ts\";\nimport type { Event, MethodologyName, Role, Stage, WorkflowState } from \"./types.ts\";\n\nexport function nowOf(now?: string): string {\n return now ?? new Date().toISOString();\n}\n\nexport interface CreateStateInput {\n methodology: MethodologyName;\n config: unknown;\n stages: Stage[];\n roles: Role[];\n now?: string;\n}\n\nexport function createState(input: CreateStateInput): WorkflowState {\n const seenStages = new Set<string>();\n for (const st of input.stages) {\n if (seenStages.has(st.id))\n fail(\"config-invalid\", `duplicate stage id \"${st.id}\"`, \"give every stage a unique id\");\n seenStages.add(st.id);\n }\n const roles: Record<string, Role> = {};\n for (const r of input.roles) {\n assertId(r.id, \"role id\");\n if (Object.hasOwn(roles, r.id))\n fail(\"duplicate-role\", `duplicate role id \"${r.id}\"`, \"give every role a unique id\");\n roles[r.id] = r;\n }\n const at = nowOf(input.now);\n return {\n version: 1,\n methodology: input.methodology,\n config: input.config,\n items: {},\n stages: input.stages,\n roles,\n iterations: [],\n events: [\n {\n seq: 1,\n at,\n type: \"state.created\",\n by: \"system\",\n payload: { methodology: input.methodology },\n },\n ],\n accounting: [],\n pending: [],\n lessons: [],\n agreements: [],\n };\n}\n\nexport function appendEvent(\n state: WorkflowState,\n type: string,\n by: string,\n payload: unknown,\n now?: string,\n): WorkflowState {\n const last = state.events[state.events.length - 1];\n const ev: Event = { seq: (last?.seq ?? 0) + 1, at: nowOf(now), type, by, payload };\n return { ...state, events: [...state.events, ev] };\n}\n\nexport function lastEvent(state: WorkflowState, type?: string): Event | undefined {\n for (let i = state.events.length - 1; i >= 0; i--) {\n const ev = state.events[i]!;\n if (type === undefined || ev.type === type) return ev;\n }\n return undefined;\n}\n","import { assertId, fail } from \"./errors.ts\";\nimport { appendEvent } from \"./state.ts\";\nimport type { Capability, Role, WorkflowState } from \"./types.ts\";\n\n/** Own-property role lookup (ids such as \"constructor\" never hit the prototype). */\nexport function roleOf(state: WorkflowState, id: string): Role | undefined {\n return Object.hasOwn(state.roles, id) ? state.roles[id] : undefined;\n}\n\nconst OPEN: ReadonlySet<string> = new Set([\"in_progress\", \"review\", \"blocked\"]);\n\nexport function registerRole(\n state: WorkflowState,\n role: Role,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(role.id, \"role id\");\n if (roleOf(state, role.id))\n fail(\n \"duplicate-role\",\n `role \"${role.id}\" already exists`,\n `use a different id or retireRole(\"${role.id}\") first`,\n );\n const next = { ...state, roles: { ...state.roles, [role.id]: role } };\n return appendEvent(\n next,\n \"role.registered\",\n by,\n { role: role.id, capabilities: role.capabilities },\n now,\n );\n}\n\nexport function retireRole(\n state: WorkflowState,\n roleId: string,\n by: string,\n now?: string,\n): WorkflowState {\n if (!roleOf(state, roleId))\n fail(\n \"unknown-role\",\n `role \"${roleId}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \") || \"(none)\"}`,\n );\n const open = Object.values(state.items)\n .filter((i) => i.role === roleId && OPEN.has(i.status))\n .map((i) => i.id);\n if (open.length)\n fail(\n \"role-has-open-items\",\n `role \"${roleId}\" still holds ${open.length} open item(s)`,\n `complete or reassign ${open.join(\", \")} before retiring the role`,\n { items: open },\n );\n const roles = { ...state.roles };\n delete roles[roleId];\n return appendEvent({ ...state, roles }, \"role.retired\", by, { role: roleId }, now);\n}\n\nexport function hasCapability(role: Role, cap: Capability): boolean {\n return role.capabilities.includes(cap);\n}\n\nexport function rolesWith(state: WorkflowState, cap: Capability): Role[] {\n return Object.values(state.roles).filter((r) => hasCapability(r, cap));\n}\n\n/** Ids of roles that may approve `gateId`, optionally holding `cap` and excluding one id. */\nexport function approverIds(\n state: WorkflowState,\n gateId: string,\n cap?: string,\n except?: string,\n): string[] {\n return Object.values(state.roles)\n .filter(\n (r) =>\n r.id !== except &&\n r.canApprove.includes(gateId) &&\n (cap === undefined || (r.capabilities as readonly string[]).includes(cap)),\n )\n .map((r) => r.id);\n}\n\nexport function approversFor(state: WorkflowState, gateId: string): Role[] {\n return rolesWith(state, \"approve-gate\").filter((r) => r.canApprove.includes(gateId));\n}\n\nexport function requireCapabilities(\n state: WorkflowState,\n required: Capability[],\n exclusive: Capability[],\n): void {\n for (const cap of required) {\n if (rolesWith(state, cap).length === 0) {\n fail(\n \"missing-capability\",\n `no registered role has capability \"${cap}\"`,\n `register a role whose capabilities include \"${cap}\" (registerRole) before init`,\n );\n }\n }\n for (const cap of exclusive) {\n const holders = rolesWith(state, cap);\n if (holders.length > 1) {\n fail(\n \"exclusive-capability\",\n `capability \"${cap}\" must belong to exactly one role but is held by ${holders.map((r) => r.id).join(\", \")}`,\n `remove \"${cap}\" from all but one role`,\n );\n }\n }\n}\n\nexport function separationLost(state: WorkflowState, required: Capability[]): Role[] {\n if (required.length === 0) return [];\n return Object.values(state.roles).filter((r) => required.every((c) => hasCapability(r, c)));\n}\n\n/** `human` may do anything; a role must hold at least one of `caps`; unknown ids may do nothing. */\nexport function canDo(state: WorkflowState, by: string, ...caps: Capability[]): boolean {\n if (by === \"human\") return true;\n const role = roleOf(state, by);\n return !!role && caps.some((c) => hasCapability(role, c));\n}\n\nexport function requireCap(state: WorkflowState, by: string, ...caps: Capability[]): void {\n if (!canDo(state, by, ...caps)) {\n const holders = Object.values(state.roles)\n .filter((r) => caps.some((c) => hasCapability(r, c)))\n .map((r) => r.id);\n fail(\n \"missing-capability\",\n `\"${by}\" lacks capability ${caps.map((c) => `\"${c}\"`).join(\" or \")}`,\n `run this as one of: human${holders.map((h) => `, ${h}`).join(\"\")}`,\n );\n }\n}\n","import { assertId, fail } from \"./errors.ts\";\n\nexport { assertId };\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Evidence,\n ItemStatus,\n NewItem,\n Stage,\n Transition,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function stageOf(state: WorkflowState, stageId: string): Stage {\n const st = state.stages.find((s) => s.id === stageId);\n if (!st)\n fail(\n \"unknown-stage\",\n `stage \"${stageId}\" does not exist`,\n `stages are: ${state.stages.map((s) => s.id).join(\" → \")}`,\n );\n return st;\n}\n\nexport function nextStageOf(state: WorkflowState, stageId: string): Stage | undefined {\n const idx = state.stages.findIndex((s) => s.id === stageId);\n if (idx < 0) stageOf(state, stageId);\n return state.stages[idx + 1];\n}\n\nexport function isTerminalStage(state: WorkflowState, stageId: string): boolean {\n return state.stages[state.stages.length - 1]?.id === stageId;\n}\n\nfunction putItem(state: WorkflowState, item: WorkItem): WorkflowState {\n return { ...state, items: { ...state.items, [item.id]: item } };\n}\n\n/** Replace one item with `fn(item)`; no event. */\nexport function patchItem(\n state: WorkflowState,\n id: string,\n fn: (item: WorkItem) => WorkItem,\n): WorkflowState {\n return putItem(state, fn(getItem(state, id)));\n}\n\n/** Drop optional fields (iteration, role, ...) from one item; no event. */\nexport function stripItemFields(\n state: WorkflowState,\n id: string,\n keys: Array<\"iteration\" | \"role\">,\n): WorkflowState {\n return patchItem(state, id, (item) => {\n const copy = { ...item };\n for (const k of keys) delete copy[k];\n return copy;\n });\n}\n\nexport function getItem(state: WorkflowState, id: string): WorkItem {\n const it = Object.hasOwn(state.items, id) ? state.items[id] : undefined;\n if (!it)\n fail(\n \"unknown-item\",\n `item \"${id}\" does not exist`,\n `add it with addItem first; known items: ${Object.keys(state.items).join(\", \") || \"(none)\"}`,\n { items: [id] },\n );\n return it;\n}\n\nfunction assertKnownItems(state: WorkflowState, ids: string[], what: string): void {\n const missing = ids.filter((d) => !Object.hasOwn(state.items, d));\n if (missing.length)\n fail(\n \"unknown-item\",\n `${what} refers to unknown item(s) ${missing.join(\", \")}`,\n \"add those items first or remove the reference\",\n { items: missing },\n );\n}\n\nexport function addItem(\n state: WorkflowState,\n input: NewItem,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(input.id, \"item id\");\n if (Object.hasOwn(state.items, input.id))\n fail(\n \"duplicate-item\",\n `item \"${input.id}\" already exists`,\n \"use editItem to change it, or pick a new id\",\n { items: [input.id] },\n );\n const firstStage = state.stages[0];\n if (!firstStage)\n fail(\"config-invalid\", \"state has no stages\", \"create the state with at least one stage\");\n const stageId = input.stage ?? firstStage.id;\n stageOf(state, stageId);\n assertKnownItems(state, input.dependsOn ?? [], `item \"${input.id}\".dependsOn`);\n if (input.affects) assertKnownItems(state, input.affects, `item \"${input.id}\".affects`);\n if (input.parent !== undefined)\n assertKnownItems(state, [input.parent], `item \"${input.id}\".parent`);\n if (input.role !== undefined && !Object.hasOwn(state.roles, input.role))\n fail(\n \"unknown-role\",\n `role \"${input.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n\n const { stage: _s, ...rest } = input;\n const item: WorkItem = {\n type: \"task\",\n acceptance: [],\n dependsOn: [],\n ...rest,\n id: input.id,\n title: input.title,\n stage: stageId,\n status: \"todo\",\n evidence: [],\n blockers: [],\n transitions: [],\n };\n const next = putItem(state, item);\n return appendEvent(\n next,\n \"item.added\",\n by,\n {\n id: item.id,\n type: item.type,\n stage: item.stage,\n weight: item.weight ?? null,\n priority: item.priority ?? null,\n },\n now,\n );\n}\n\nexport type ItemPatch = Partial<\n Omit<WorkItem, \"id\" | \"stage\" | \"status\" | \"transitions\" | \"evidence\" | \"blockers\">\n>;\n\nexport function editItem(\n state: WorkflowState,\n id: string,\n patch: ItemPatch,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n if (patch.dependsOn) assertKnownItems(state, patch.dependsOn, `item \"${id}\".dependsOn`);\n if (patch.affects) assertKnownItems(state, patch.affects, `item \"${id}\".affects`);\n if (patch.parent !== undefined) assertKnownItems(state, [patch.parent], `item \"${id}\".parent`);\n if (patch.role !== undefined && !Object.hasOwn(state.roles, patch.role))\n fail(\n \"unknown-role\",\n `role \"${patch.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n const changed = (Object.keys(patch) as Array<keyof ItemPatch>).filter(\n (k) => JSON.stringify(patch[k]) !== JSON.stringify(item[k]),\n );\n if (changed.length === 0)\n fail(\n \"no-op\",\n `editItem(\"${id}\") changes nothing`,\n \"pass at least one field with a different value\",\n { items: [id] },\n );\n const updated: WorkItem = { ...item };\n for (const k of changed) (updated as unknown as Record<string, unknown>)[k] = patch[k];\n const next = putItem(state, updated);\n return appendEvent(next, \"item.edited\", by, { id, changed }, now);\n}\n\nexport function moveItem(\n state: WorkflowState,\n id: string,\n to: { stage?: string; status: ItemStatus },\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const toStage = to.stage ?? item.stage;\n stageOf(state, toStage);\n if (item.status === \"done\" || item.status === \"dropped\") {\n fail(\n \"invalid-transition\",\n `item \"${id}\" is ${item.status} and cannot move`,\n \"create a new item (or a change-request) instead of reopening a finished one\",\n { items: [id] },\n );\n }\n if (toStage === item.stage && to.status === item.status)\n fail(\n \"no-op\",\n `item \"${id}\" is already ${item.status} in \"${toStage}\"`,\n \"choose a different stage or status\",\n { items: [id] },\n );\n const at = nowOf(now);\n const updated: WorkItem = {\n ...item,\n stage: toStage,\n status: to.status,\n transitions: [\n ...item.transitions,\n {\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.transition\",\n by,\n {\n id,\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n },\n at,\n );\n}\n\nexport function addEvidence(\n state: WorkflowState,\n id: string,\n evidence: Omit<Evidence, \"at\">,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const updated: WorkItem = { ...item, evidence: [...item.evidence, { ...evidence, at }] };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.evidence\",\n evidence.by,\n { id, kind: evidence.kind, ref: evidence.ref },\n at,\n );\n}\n\nexport function raiseBlocker(\n state: WorkflowState,\n id: string,\n reason: string,\n owner: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const blockerId = `${id}-b${item.blockers.length + 1}`;\n const t: Transition | null =\n item.status === \"blocked\"\n ? null\n : {\n from: { stage: item.stage, status: item.status },\n to: { stage: item.stage, status: \"blocked\" },\n at,\n by,\n };\n const updated: WorkItem = {\n ...item,\n status: \"blocked\",\n blockers: [...item.blockers, { id: blockerId, reason, owner, raisedAt: at }],\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.raised\",\n by,\n { id, blocker: blockerId, reason, owner, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\nfunction lastTransitionTo(item: WorkItem, status: ItemStatus): Transition | undefined {\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === status) return t;\n }\n return undefined;\n}\n\nexport function clearBlocker(\n state: WorkflowState,\n id: string,\n blockerId: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const idx = item.blockers.findIndex((b) => b.id === blockerId && !b.clearedAt);\n if (idx < 0)\n fail(\n \"invalid-input\",\n `item \"${id}\" has no open blocker \"${blockerId}\"`,\n `open blockers: ${\n item.blockers\n .filter((b) => !b.clearedAt)\n .map((b) => b.id)\n .join(\", \") || \"(none)\"\n }`,\n { items: [id] },\n );\n const at = nowOf(now);\n const blockers = item.blockers.map((b, i) => (i === idx ? { ...b, clearedAt: at } : b));\n const stillBlocked = blockers.some((b) => !b.clearedAt);\n const prev = lastTransitionTo(item, \"blocked\")?.from.status ?? \"todo\";\n let toStage = item.stage;\n let toStatus: ItemStatus = prev;\n let dropRole = false;\n if (prev === \"in_progress\") {\n toStatus = \"todo\";\n toStage = lastTransitionTo(item, \"in_progress\")?.from.stage ?? item.stage;\n } else if (prev === \"awaiting_human\") {\n // a rejected human gate: the work is re-dispatched in the current stage\n toStatus = stageOf(state, item.stage).review ? \"review\" : \"todo\";\n dropRole = true;\n }\n const { role: _r, ...noRole } = item;\n const t: Transition | null = stillBlocked\n ? null\n : {\n from: { stage: item.stage, status: \"blocked\" },\n to: { stage: toStage, status: toStatus },\n at,\n by,\n };\n const updated: WorkItem = {\n ...(dropRole && !stillBlocked ? (noRole as WorkItem) : item),\n blockers,\n stage: stillBlocked ? item.stage : toStage,\n status: stillBlocked ? \"blocked\" : toStatus,\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.cleared\",\n by,\n { id, blocker: blockerId, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\n/** Entering a new stage is a new assignment: the role that finished the previous stage is cleared so the planner picks the right one (a reviewer, not the author). */\nexport function clearRole(state: WorkflowState, itemId: string): WorkflowState {\n return stripItemFields(state, itemId, [\"role\"]);\n}\n\n/** Move an item to the next stage (done at the end, review/todo otherwise) and clear its role. */\nexport function advanceItem(\n state: WorkflowState,\n itemId: string,\n by: string,\n wantsReview: boolean,\n now: string,\n): WorkflowState {\n const item = getItem(state, itemId);\n const to = nextStageOf(state, item.stage);\n if (!to) return moveItem(state, itemId, { status: \"done\" }, by, now);\n if (isTerminalStage(state, to.id))\n return moveItem(state, itemId, { stage: to.id, status: \"done\" }, by, now);\n const status = wantsReview || to.review === true ? \"review\" : \"todo\";\n return clearRole(moveItem(state, itemId, { stage: to.id, status }, by, now), itemId);\n}\n","import { fail } from \"./errors.ts\";\nimport type { Policy, Violation, WorkItem, WorkflowState } from \"./types.ts\";\n\nexport function evaluatePolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n): Violation[] {\n const out: Violation[] = [];\n const v = (rule: string, message: string, fix: string) =>\n out.push({ rule, severity: \"error\", item: item.id, message, fix });\n for (const p of policies) {\n switch (p.kind) {\n case \"evidence\":\n if (!item.evidence.some((e) => e.kind === p.evidenceKind))\n v(\n \"policy:evidence\",\n `item \"${item.id}\" has no evidence of kind \"${p.evidenceKind}\"`,\n `attach evidence { kind: \"${p.evidenceKind}\" } via addEvidence or in the handoff.produced`,\n );\n break;\n case \"acceptance-written\":\n if (item.acceptance.length === 0)\n v(\n \"policy:acceptance-written\",\n `item \"${item.id}\" has no acceptance criteria`,\n \"editItem with a non-empty acceptance[] (needs define-acceptance)\",\n );\n break;\n case \"estimate-present\":\n if (item.weight === undefined)\n v(\n \"policy:estimate-present\",\n `item \"${item.id}\" has no weight`,\n \"editItem with a weight (story points)\",\n );\n break;\n case \"no-open-blockers\": {\n const open = item.blockers.filter((b) => !b.clearedAt);\n if (open.length)\n v(\n \"policy:no-open-blockers\",\n `item \"${item.id}\" has ${open.length} open blocker(s)`,\n `clearBlocker ${open.map((b) => b.id).join(\", \")}`,\n );\n break;\n }\n case \"dependencies-done\": {\n const notDone = item.dependsOn.filter((d) => state.items[d]?.status !== \"done\");\n if (notDone.length)\n v(\n \"policy:dependencies-done\",\n `item \"${item.id}\" depends on unfinished ${notDone.join(\", \")}`,\n `finish ${notDone.join(\", \")} first`,\n );\n break;\n }\n case \"custom\":\n if (!item.evidence.some((e) => e.kind === `policy:${p.id}`))\n v(\n `policy:custom:${p.id}`,\n `item \"${item.id}\" has not satisfied \"${p.description}\"`,\n `attach evidence { kind: \"policy:${p.id}\" } when it is satisfied`,\n );\n break;\n }\n }\n return out;\n}\n\nexport function assertPolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n context: string,\n): void {\n const unmet = evaluatePolicies(state, item, policies);\n if (unmet.length) {\n fail(\n \"policy-unmet\",\n `item \"${item.id}\" cannot ${context}: ${unmet.length} polic${unmet.length === 1 ? \"y\" : \"ies\"} unmet`,\n unmet.map((u) => u.fix).join(\"; \"),\n { items: [item.id] },\n );\n }\n}\n","import { fail } from \"./errors.ts\";\nimport { advanceItem, clearRole, getItem, moveItem, raiseBlocker } from \"./items.ts\";\nimport { approverIds } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Gate,\n PendingHuman,\n Transition,\n Violation,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport type GateResult =\n | { outcome: \"pass\" }\n | { outcome: \"human\" }\n | { outcome: \"fail\"; violations: Violation[] };\n\n/** Last in_progress dispatch made from a stage that comes STRICTLY BEFORE the item's current stage in `state.stages` order (unknown stage ids count as not-before). */\nexport function lastDispatchBefore(state: WorkflowState, item: WorkItem): Transition | undefined {\n const order = new Map(state.stages.map((s, i) => [s.id, i] as const));\n const here = order.get(item.stage);\n if (here === undefined) return undefined;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n const from = order.get(t.from.stage);\n if (t.to.status === \"in_progress\" && from !== undefined && from < here) return t;\n }\n return undefined;\n}\n\n/** Role that did the work the gate guards: the last dispatch made from a stage strictly before the current one (so a reviewer dispatched into the gated stage is not its author); else the last dispatch of any stage; undefined if never dispatched. */\nexport function authorOf(state: WorkflowState, item: WorkItem): string | undefined {\n const before = lastDispatchBefore(state, item);\n if (before) return before.by;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === \"in_progress\") return t.by;\n }\n return undefined;\n}\n\nexport function checkGate(\n state: WorkflowState,\n item: WorkItem,\n gate: Gate,\n by: string,\n): GateResult {\n const violations: Violation[] = [];\n for (const kind of gate.evidence) {\n if (!item.evidence.some((e) => e.kind === kind)) {\n violations.push({\n rule: \"gate:evidence\",\n severity: \"error\",\n item: item.id,\n message: `gate \"${gate.id}\" needs evidence \"${kind}\" on item \"${item.id}\"`,\n fix: `attach evidence { kind: \"${kind}\" } before approving`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n\n let needsHuman = false;\n for (const req of gate.requires) {\n if (req === \"human\") {\n if (by !== \"human\") needsHuman = true;\n continue;\n }\n const ok = approverIds(state, gate.id, req.capability).includes(by);\n if (!ok) {\n violations.push({\n rule: \"gate:capability\",\n severity: \"error\",\n item: item.id,\n message: `\"${by}\" may not approve gate \"${gate.id}\" (needs capability \"${req.capability}\" and canApprove \"${gate.id}\")`,\n fix: `approve as one of: ${approverIds(state, gate.id, req.capability).join(\", \") || \"(no role qualifies; register one)\"}`,\n });\n continue;\n }\n const author = authorOf(state, item);\n if (author !== undefined && author === by) {\n const others = approverIds(state, gate.id, req.capability, by);\n violations.push({\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${by}\" did the work on \"${item.id}\" and may not approve it`,\n fix: `approve as a different role: ${others.join(\", \") || \"(register another approver)\"}`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n return needsHuman ? { outcome: \"human\" } : { outcome: \"pass\" };\n}\n\nexport function raisePending(\n state: WorkflowState,\n pending: Omit<PendingHuman, \"id\" | \"raisedAt\">,\n now?: string,\n): WorkflowState {\n const at = nowOf(now);\n const id = `p${state.events.filter((e) => e.type === \"pending.raised\").length + 1}`;\n const entry: PendingHuman = { ...pending, id, raisedAt: at };\n let next: WorkflowState = { ...state, pending: [...state.pending, entry] };\n if (pending.item) {\n const item = getItem(next, pending.item);\n if (item.status !== \"awaiting_human\")\n next = moveItem(next, pending.item, { status: \"awaiting_human\" }, \"system\", at);\n }\n return appendEvent(\n next,\n \"pending.raised\",\n \"system\",\n { id, kind: pending.kind, item: pending.item ?? null, gate: pending.gate ?? null },\n at,\n );\n}\n\nexport function decide(\n state: WorkflowState,\n pendingId: string,\n decision: \"approve\" | \"reject\",\n by: string,\n note: string,\n now?: string,\n): WorkflowState {\n if (decision !== \"approve\" && decision !== \"reject\")\n fail(\n \"invalid-input\",\n `decision must be \"approve\" or \"reject\" (got ${JSON.stringify(decision)})`,\n \"pass approve or reject\",\n );\n const entry = state.pending.find((p) => p.id === pendingId);\n if (!entry)\n fail(\n \"unknown-pending\",\n `no pending decision \"${pendingId}\"`,\n `open decisions: ${state.pending.map((p) => p.id).join(\", \") || \"(none)\"}`,\n );\n const item0 = entry.kind === \"gate\" && entry.item ? getItem(state, entry.item) : undefined;\n const gate =\n item0 &&\n (state.stages.find((s) => entry.gate !== undefined && s.gate?.id === entry.gate)?.gate ??\n state.stages.find((s) => s.id === item0.stage)?.gate);\n if (item0 && gate && by !== \"human\") {\n const res = gate.requires.includes(\"human\") ? undefined : checkGate(state, item0, gate, by);\n if (res?.outcome !== \"pass\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide gate \"${gate.id}\" on \"${item0.id}\"`,\n `decide as one of: human${gate.requires\n .flatMap((q) => (q === \"human\" ? [] : approverIds(state, gate.id, q.capability)))\n .map((r) => `, ${r}`)\n .join(\"\")}`,\n { items: [item0.id], rule: \"gate\" },\n );\n }\n const at = nowOf(now);\n let next: WorkflowState = { ...state, pending: state.pending.filter((p) => p.id !== pendingId) };\n next = appendEvent(\n next,\n \"pending.decided\",\n by,\n { id: pendingId, decision, note, item: entry.item ?? null, gate: entry.gate ?? null },\n at,\n );\n if (item0) {\n const id = item0.id;\n const gateId = entry.gate ?? gate?.id ?? null;\n if (decision === \"approve\") {\n next = advanceItem(next, id, by, false, at);\n next = appendEvent(next, \"gate.passed\", by, { item: id, gate: gateId }, at);\n } else {\n const onFail = gate?.onFail ?? { action: \"block\" as const };\n if (onFail.action === \"return-to\")\n next = clearRole(moveItem(next, id, { stage: onFail.stage, status: \"todo\" }, by, at), id);\n else\n next = raiseBlocker(\n next,\n id,\n `gate \"${gateId ?? \"?\"}\" rejected: ${note || \"no reason given\"}`,\n by,\n by,\n at,\n );\n next = appendEvent(next, \"gate.failed\", by, { item: id, gate: gateId, note }, at);\n }\n }\n return next;\n}\n","import { authorOf } from \"./gates.ts\";\nimport { approverIds, separationLost } from \"./roles.ts\";\nimport type { Action, Handoff, Methodology, Rule, Violation } from \"./types.ts\";\n\nexport function coreRulesFor(methodology: Pick<Methodology, \"requiredCapabilities\">): Rule[] {\n const separation: Rule = {\n id: \"separation-lost\",\n severity: \"warning\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"init\" && action.type !== \"role.register\") return [];\n return separationLost(state, methodology.requiredCapabilities).map((r) => ({\n rule: \"separation-lost\",\n severity: \"warning\" as const,\n message: `role \"${r.id}\" holds every required capability (${methodology.requiredCapabilities.join(\", \")}); no separation of duties`,\n fix: \"fine for a solo operator; otherwise split capabilities across roles\",\n }));\n },\n };\n const coi: Rule = {\n id: \"conflict-of-interest\",\n severity: \"error\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"complete\") return [];\n const handoff = (action.payload as { handoff?: Handoff } | undefined)?.handoff;\n if (!handoff) return [];\n const verdict = handoff.verdict ?? \"done\";\n if (verdict !== \"done\" && verdict !== \"needs-review\") return [];\n const item = state.items[handoff.item];\n if (!item) return [];\n const gate = state.stages.find((s) => s.id === item.stage)?.gate;\n if (!gate || !gate.requires.some((q) => q !== \"human\")) return [];\n if (authorOf(state, item) !== handoff.role) return [];\n const others = approverIds(state, gate.id, undefined, handoff.role);\n return [\n {\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${handoff.role}\" authored \"${item.id}\" and may not pass gate \"${gate.id}\" on it`,\n fix: `hand the gate to another approver: ${others.join(\", \") || \"(register one)\"}`,\n },\n ];\n },\n };\n return [separation, coi];\n}\n","import { fail } from \"./errors.ts\";\nimport { requireCapabilities } from \"./roles.ts\";\nimport { coreRulesFor } from \"./rules.ts\";\nimport { createState } from \"./state.ts\";\nimport type {\n Action,\n ApplyResult,\n Methodology,\n Role,\n Stage,\n Violation,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function validateAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n): Violation[] {\n const out: Violation[] = [];\n for (const rule of [...coreRulesFor(methodology), ...methodology.rules])\n out.push(...rule.check(state, action));\n return out;\n}\n\nexport function applyAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n reduce: (s: WorkflowState) => WorkflowState,\n): ApplyResult {\n const violations = validateAction(state, methodology, action);\n const errors = violations.filter((v) => v.severity === \"error\");\n if (errors.length) {\n fail(\n \"rule-violation\",\n `${action.type} violates ${errors.map((e) => e.rule).join(\", \")}: ${errors.map((e) => e.message).join(\"; \")}`,\n errors.map((e) => e.fix).join(\"; \"),\n { rule: errors[0]!.rule, items: errors.map((e) => e.item).filter((x): x is string => !!x) },\n );\n }\n return { state: reduce(state), warnings: violations.filter((v) => v.severity === \"warning\") };\n}\n\nexport interface InitInput<C> {\n methodology: Methodology<C>;\n config: unknown;\n roles?: Role[];\n stages?: Stage[];\n by?: string;\n now?: string;\n}\n\nexport function init<C>(input: InitInput<C>): ApplyResult {\n const m = input.methodology;\n const config = m.validateConfig(input.config);\n const stages = input.stages ?? m.defaultStages(config);\n const roles = input.roles ?? m.defaultRoles(config);\n const stateInput =\n input.now !== undefined\n ? { methodology: m.name, config, stages, roles, now: input.now }\n : { methodology: m.name, config, stages, roles };\n const state = createState(stateInput);\n requireCapabilities(state, m.requiredCapabilities, m.exclusiveCapabilities);\n return applyAction(state, m as Methodology, { type: \"init\", by: input.by ?? \"system\" }, (s) => s);\n}\n"]}
@@ -1,2 +0,0 @@
1
- 'use strict';var chunkDBR24RTX_cjs=require('./chunk-DBR24RTX.cjs'),chunk472WEDPJ_cjs=require('./chunk-472WEDPJ.cjs'),chunkQDT35LXB_cjs=require('./chunk-QDT35LXB.cjs'),chunkD4HNETUL_cjs=require('./chunk-D4HNETUL.cjs'),chunkJDVE7DQR_cjs=require('./chunk-JDVE7DQR.cjs'),chunk6R3YFUUV_cjs=require('./chunk-6R3YFUUV.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),promises=require('fs/promises'),h=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var h__default=/*#__PURE__*/_interopDefault(h);var v={scrum:chunk472WEDPJ_cjs.k,kanban:chunkD4HNETUL_cjs.I},p=["exwf init <scrum|kanban> --config <file> [--roles <file>]","exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]","exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"];function G(r){let t=[],m={};for(let i=0;i<r.length;i++){let k=r[i];if(k.startsWith("--")){let e=k.slice(2),c=r[i+1];c!==void 0&&!c.startsWith("--")?(m[e]=c,i++):m[e]="true";}else t.push(k);}return {positional:t,flags:m}}async function x(r){try{return JSON.parse(await promises.readFile(r,"utf8"))}catch(t){return chunkS3BXVHO7_cjs.b("invalid-input",`cannot read JSON from ${r}: ${t.message}`,"check the path and that the file is valid JSON")}}function y(r){let t=Object.hasOwn(v,r.methodology)?v[r.methodology]:void 0;return t||chunkS3BXVHO7_cjs.b("config-invalid",`methodology "${r.methodology}" is not available in this build`,`available: ${Object.keys(v).join(", ")}`),t()}function O(r,t){let m=Number(r[t]);return Number.isFinite(m)||chunkS3BXVHO7_cjs.b("invalid-input",`--${t} must be a number (got ${JSON.stringify(r[t])})`,`pass --${t} <n>`),m}var U=new Set(["init","add","edit","next","complete","ceremony","decide"]);async function it(r,t){let[m,i]=G(r).positional,k=m!==void 0&&(U.has(m)||m==="role"&&i==="add");try{return k?await chunk6R3YFUUV_cjs.c(t,()=>F(r,t)):await F(r,t)}catch(e){if(e instanceof chunkS3BXVHO7_cjs.a)return {exit:1,out:{ok:false,error:e.toJSON()}};throw e}}async function F(r,t){let{positional:m,flags:i}=G(r),[k,...e]=m,c=i.by??"human",l=new Date().toISOString();switch(k){case "init":{let[o]=e,n=o&&Object.hasOwn(v,o)?v[o]:void 0;if(!n||!i.config)return {exit:2,out:{ok:false,usage:p}};try{await promises.stat(chunk6R3YFUUV_cjs.b(t)),chunkS3BXVHO7_cjs.b("invalid-input",`${chunk6R3YFUUV_cjs.b(t)} already exists`,"delete .workflow/state.json to start over");}catch(d){if(d instanceof chunkS3BXVHO7_cjs.a||d.code!=="ENOENT")throw d}let s=await x(h__default.default.resolve(t,i.config)),a=i.roles?await x(h__default.default.resolve(t,i.roles)):void 0,f=chunkJDVE7DQR_cjs.N(a?{methodology:n(),config:s,roles:a,by:c,now:l}:{methodology:n(),config:s,by:c,now:l});return await chunk6R3YFUUV_cjs.d(t,f.state),{exit:0,out:{ok:true,warnings:f.warnings,state:{methodology:f.state.methodology,stages:f.state.stages.map(d=>d.id),roles:Object.keys(f.state.roles)}}}}case "add":{if(!e[0])return {exit:2,out:{ok:false,usage:p}};let o=await chunk6R3YFUUV_cjs.e(t),n=await x(h__default.default.resolve(t,e[0])),s=chunkJDVE7DQR_cjs.v(o,n,c,l);return await chunk6R3YFUUV_cjs.d(t,s),{exit:0,out:{ok:true,item:chunkJDVE7DQR_cjs.u(s,n.id)}}}case "edit":{if(!e[0]||!e[1])return {exit:2,out:{ok:false,usage:p}};let o=await chunk6R3YFUUV_cjs.e(t),n=chunkJDVE7DQR_cjs.w(o,e[0],await x(h__default.default.resolve(t,e[1])),c,l);return await chunk6R3YFUUV_cjs.d(t,n),{exit:0,out:{ok:true,item:chunkJDVE7DQR_cjs.u(n,e[0])}}}case "next":{let o=await chunk6R3YFUUV_cjs.e(t),n=i.max?{max:O(i,"max"),now:l}:{now:l},s=chunkDBR24RTX_cjs.b(o,y(o),n);await chunk6R3YFUUV_cjs.d(t,s.state);for(let a of s.briefs)await chunk6R3YFUUV_cjs.f(t,a);return {exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!e[0]||!e[1])return {exit:2,out:{ok:false,usage:p}};let o=await chunk6R3YFUUV_cjs.e(t),n=await x(h__default.default.resolve(t,e[1]));n.item!==e[0]&&chunkS3BXVHO7_cjs.b("handoff-invalid",`handoff.item "${n.item}" differs from the command's item "${e[0]}"`,"make them match");let s=i.role??n.role,a=O(i,"duration-ms"),f={item:e[0],role:s,model:i.model??"",tokensIn:O(i,"tokens-in"),tokensOut:O(i,"tokens-out"),durationMs:a,startedAt:new Date(Date.parse(l)-a).toISOString(),endedAt:l},d=chunkDBR24RTX_cjs.c(o,y(o),{...n,role:s},f,l);return await chunk6R3YFUUV_cjs.d(t,d.state),await chunk6R3YFUUV_cjs.g(t,n,d.state.events.length),{exit:0,out:{ok:true,warnings:d.warnings,item:chunkJDVE7DQR_cjs.u(d.state,e[0])}}}case "ceremony":{if(!e[0])return {exit:2,out:{ok:false,usage:p}};let o=await chunk6R3YFUUV_cjs.e(t),n=y(o),s=Object.hasOwn(n.ceremonies,e[0])?n.ceremonies[e[0]]:void 0;s||chunkS3BXVHO7_cjs.b("unknown-ceremony",`"${e[0]}" is not a ${n.name} ceremony`,`available: ${Object.keys(n.ceremonies).join(", ")}`);let a=e[1]?await x(h__default.default.resolve(t,e[1])):{},f=s(o,{...a,by:c,now:l});return await chunk6R3YFUUV_cjs.d(t,f.state),{exit:0,out:{ok:true,warnings:f.warnings,lastEvent:chunkJDVE7DQR_cjs.d(f.state)}}}case "decide":{if(!e[0]||e[1]!=="approve"&&e[1]!=="reject")return {exit:2,out:{ok:false,usage:p}};let o=await chunk6R3YFUUV_cjs.e(t),n=o.pending.find(a=>a.id===e[0]),s=chunkJDVE7DQR_cjs.J(o,e[0],e[1],c,i.note??"",l);return await chunk6R3YFUUV_cjs.d(t,s),{exit:0,out:{ok:true,item:n?.item?chunkJDVE7DQR_cjs.u(s,n.item):null}}}case "status":{let o=await chunk6R3YFUUV_cjs.e(t),n=y(o),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let a of Object.values(o.items))s[a.status]+=1;return {exit:0,out:{ok:true,methodology:o.methodology,openIteration:chunkQDT35LXB_cjs.f(o)??null,counts:s,pending:o.pending,lastEvent:chunkJDVE7DQR_cjs.d(o),report:n.report?n.report(o):null}}}case "board":{let o=await chunk6R3YFUUV_cjs.e(t);return {exit:0,out:{ok:true,columns:o.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(o.items).filter(a=>a.stage===s.id&&a.status!=="dropped").map(a=>({id:a.id,title:a.title,status:a.status,role:a.role??null,age:a.transitions.length?Date.parse(l)-Date.parse(a.transitions[a.transitions.length-1].at):null}))}))}}}case "metrics":{let o=await chunk6R3YFUUV_cjs.e(t);return {exit:0,out:{ok:true,metrics:y(o).metrics(o)}}}case "pending":return {exit:0,out:{ok:true,pending:(await chunk6R3YFUUV_cjs.e(t)).pending}};case "lessons":return {exit:0,out:{ok:true,lessons:(await chunk6R3YFUUV_cjs.e(t)).lessons}};case "validate":{if(!e[0])return {exit:2,out:{ok:false,usage:p}};let o=await chunk6R3YFUUV_cjs.e(t),n=await x(h__default.default.resolve(t,e[0]));return {exit:0,out:{ok:true,violations:chunkJDVE7DQR_cjs.L(o,y(o),n)}}}case "role":{let o=await chunk6R3YFUUV_cjs.e(t);if(e[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(o.roles),detail:o.roles}};if(e[0]==="add"&&e[1]){let n=chunkJDVE7DQR_cjs.f(o,await x(h__default.default.resolve(t,e[1])),c,l);return await chunk6R3YFUUV_cjs.d(t,n),{exit:0,out:{ok:true,roles:Object.keys(n.roles)}}}return {exit:2,out:{ok:false,usage:p}}}default:return {exit:2,out:{ok:false,usage:p}}}}exports.a=p;exports.b=G;exports.c=it;//# sourceMappingURL=chunk-NRAPI3GV.cjs.map
2
- //# sourceMappingURL=chunk-NRAPI3GV.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","USAGE","parseArgs","argv","positional","flags","a","key","val","readJson","file","readFile","e","fail","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","writes","withStateLock","execute","WorkflowError","rest","by","now","name","stat","statePath","config","path","roles","res","init","saveState","s","loadState","item","s2","addItem","getItem","editItem","opts","next","b","saveBrief","handoff","role","durationMs","acc","complete","saveHandoff","m","c","input","lastEvent","entry","p","decide","counts","i","openIteration","st","action","validateAction","registerRole"],"mappings":"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","file":"chunk-NRAPI3GV.cjs","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n loadState,\n saveBrief,\n saveHandoff,\n saveState,\n statePath,\n withStateLock,\n} from \"../adapters/file.ts\";\nimport { next as planNext } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { init, validateAction } from \"../methodology.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { registerRole } from \"../roles.ts\";\nimport { lastEvent } from \"../state.ts\";\nimport { scrum } from \"../scrum/index.ts\";\nimport { kanban } from \"../kanban/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};\n\nexport const USAGE = [\n \"exwf init <scrum|kanban> --config <file> [--roles <file>]\",\n \"exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]\",\n \"exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf status | board | metrics | pending | lessons\",\n \"exwf validate <action.json> exwf role add <manifest.json> | role list\",\n];\n\nexport interface Parsed {\n positional: string[];\n flags: Record<string, string>;\n}\nexport function parseArgs(argv: string[]): Parsed {\n const positional: string[] = [];\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n const val = argv[i + 1];\n if (val !== undefined && !val.startsWith(\"--\")) {\n flags[key] = val;\n i++;\n } else flags[key] = \"true\";\n } else positional.push(a);\n }\n return { positional, flags };\n}\n\nasync function readJson<T>(file: string): Promise<T> {\n try {\n return JSON.parse(await readFile(file, \"utf8\")) as T;\n } catch (e) {\n return fail(\n \"invalid-input\",\n `cannot read JSON from ${file}: ${(e as Error).message}`,\n \"check the path and that the file is valid JSON\",\n );\n }\n}\n\nfunction methodologyOf(state: WorkflowState): Methodology {\n const f = Object.hasOwn(METHODOLOGIES, state.methodology)\n ? METHODOLOGIES[state.methodology]\n : undefined;\n if (!f)\n fail(\n \"config-invalid\",\n `methodology \"${state.methodology}\" is not available in this build`,\n `available: ${Object.keys(METHODOLOGIES).join(\", \")}`,\n );\n return f();\n}\n\nfunction num(flags: Record<string, string>, key: string): number {\n const v = Number(flags[key]);\n if (!Number.isFinite(v))\n fail(\n \"invalid-input\",\n `--${key} must be a number (got ${JSON.stringify(flags[key])})`,\n `pass --${key} <n>`,\n );\n return v;\n}\n\nexport interface CommandResult {\n exit: 0 | 1 | 2;\n out: unknown;\n}\n\n/** Commands that load, change and save the state: they run under .workflow/state.lock. */\nconst WRITERS = new Set([\"init\", \"add\", \"edit\", \"next\", \"complete\", \"ceremony\", \"decide\"]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes = cmd !== undefined && (WRITERS.has(cmd) || (cmd === \"role\" && sub === \"add\"));\n try {\n return writes ? await withStateLock(cwd, () => execute(argv, cwd)) : await execute(argv, cwd);\n } catch (e) {\n if (e instanceof WorkflowError) return { exit: 1, out: { ok: false, error: e.toJSON() } };\n throw e;\n }\n}\n\nasync function execute(argv: string[], cwd: string): Promise<CommandResult> {\n const { positional, flags } = parseArgs(argv);\n const [cmd, ...rest] = positional;\n const by = flags[\"by\"] ?? \"human\";\n const now = new Date().toISOString();\n switch (cmd) {\n case \"init\": {\n const [name] = rest;\n const f = name && Object.hasOwn(METHODOLOGIES, name) ? METHODOLOGIES[name] : undefined;\n if (!f || !flags[\"config\"]) return { exit: 2, out: { ok: false, usage: USAGE } };\n try {\n await stat(statePath(cwd));\n fail(\n \"invalid-input\",\n `${statePath(cwd)} already exists`,\n \"delete .workflow/state.json to start over\",\n );\n } catch (e) {\n if (e instanceof WorkflowError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n }\n const config = await readJson<unknown>(path.resolve(cwd, flags[\"config\"]));\n const roles = flags[\"roles\"]\n ? await readJson<Role[]>(path.resolve(cwd, flags[\"roles\"]))\n : undefined;\n 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 const s2 = addItem(state, item, by, now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: getItem(s2, item.id) } };\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 s2 = editItem(\n state,\n rest[0],\n await readJson<ItemPatch>(path.resolve(cwd, rest[1])),\n by,\n now,\n );\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: getItem(s2, rest[0]) } };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts = flags[\"max\"] ? { max: num(flags, \"max\"), now } : { now };\n const res = planNext(state, methodologyOf(state), opts);\n await saveState(cwd, res.state);\n for (const b of res.briefs) await saveBrief(cwd, b);\n return {\n exit: 0,\n out: { ok: true, reason: res.reason ?? null, skipped: res.skipped, briefs: res.briefs },\n };\n }\n case \"complete\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const handoff = await readJson<Handoff>(path.resolve(cwd, rest[1]));\n if (handoff.item !== rest[0])\n fail(\n \"handoff-invalid\",\n `handoff.item \"${handoff.item}\" differs from the command's item \"${rest[0]}\"`,\n \"make them match\",\n );\n const role = flags[\"role\"] ?? handoff.role;\n const durationMs = num(flags, \"duration-ms\");\n const acc: Accounting = {\n item: rest[0],\n role,\n model: flags[\"model\"] ?? \"\",\n tokensIn: num(flags, \"tokens-in\"),\n tokensOut: num(flags, \"tokens-out\"),\n durationMs,\n startedAt: new Date(Date.parse(now) - durationMs).toISOString(),\n endedAt: now,\n };\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n await saveState(cwd, res.state);\n await saveHandoff(cwd, handoff, res.state.events.length);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, rest[0]) },\n };\n }\n case \"ceremony\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const c = Object.hasOwn(m.ceremonies, rest[0]) ? m.ceremonies[rest[0]] : undefined;\n if (!c)\n fail(\n \"unknown-ceremony\",\n `\"${rest[0]}\" is not a ${m.name} ceremony`,\n `available: ${Object.keys(m.ceremonies).join(\", \")}`,\n );\n const input = rest[1]\n ? await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]))\n : {};\n const res = c(state, { ...input, by, now });\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, lastEvent: lastEvent(res.state) },\n };\n }\n case \"decide\": {\n if (!rest[0] || (rest[1] !== \"approve\" && rest[1] !== \"reject\"))\n return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const entry = state.pending.find((p) => p.id === rest[0]);\n const s2 = decide(state, rest[0], rest[1], by, flags[\"note\"] ?? \"\", now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null } };\n }\n case \"status\": {\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const counts: Record<ItemStatus, number> = {\n todo: 0,\n in_progress: 0,\n blocked: 0,\n review: 0,\n awaiting_human: 0,\n done: 0,\n dropped: 0,\n };\n for (const i of Object.values(state.items)) counts[i.status] += 1;\n return {\n exit: 0,\n out: {\n ok: true,\n methodology: state.methodology,\n openIteration: openIteration(state) ?? null,\n counts,\n pending: state.pending,\n lastEvent: lastEvent(state),\n report: m.report ? m.report(state) : null,\n },\n };\n }\n case \"board\": {\n const state = await loadState(cwd);\n const columns = state.stages.map((st) => ({\n stage: st.id,\n wipLimit: st.wipLimit ?? null,\n items: Object.values(state.items)\n .filter((i) => i.stage === st.id && i.status !== \"dropped\")\n .map((i) => ({\n id: i.id,\n title: i.title,\n status: i.status,\n role: i.role ?? null,\n age: i.transitions.length\n ? Date.parse(now) - Date.parse(i.transitions[i.transitions.length - 1]!.at)\n : null,\n })),\n }));\n return { exit: 0, out: { ok: true, columns } };\n }\n case \"metrics\": {\n const state = await loadState(cwd);\n return { exit: 0, out: { ok: true, metrics: methodologyOf(state).metrics(state) } };\n }\n case \"pending\":\n return { exit: 0, out: { ok: true, pending: (await loadState(cwd)).pending } };\n case \"lessons\":\n return { exit: 0, out: { ok: true, lessons: (await loadState(cwd)).lessons } };\n case \"validate\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const action = await readJson<Action>(path.resolve(cwd, rest[0]));\n return {\n exit: 0,\n out: { ok: true, violations: validateAction(state, methodologyOf(state), action) },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: { ok: true, roles: Object.keys(state.roles), detail: state.roles },\n };\n if (rest[0] === \"add\" && rest[1]) {\n const s2 = registerRole(state, await readJson<Role>(path.resolve(cwd, rest[1])), 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,2 +0,0 @@
1
- import {e,G,i,a,p,D,x,c}from'./chunk-NQU5TH3A.mjs';import {b}from'./chunk-2FRRD6A3.mjs';import {ExFlow,ExFlowRuntimeError}from'ex-flow';var U={tokens:0,turns:0,wallclockMs:0};function V(e,n){return {tokens:e.tokens+n.tokensIn+n.tokensOut,turns:e.turns+1,wallclockMs:e.wallclockMs+n.durationMs}}function T(e,n){let r={};return e.tokens!==void 0&&(r.tokens=Math.max(0,e.tokens-n.tokens)),e.turns!==void 0&&(r.turns=Math.max(0,e.turns-n.turns)),e.wallclockMs!==void 0&&(r.wallclockMs=Math.max(0,e.wallclockMs-n.wallclockMs)),r}function X(e,n){return e.tokens!==void 0&&n.tokens>=e.tokens||e.turns!==void 0&&n.turns>=e.turns||e.wallclockMs!==void 0&&n.wallclockMs>=e.wallclockMs}function F(e,n,r=2e4){let c=n??1,o=[];for(let i of e.accounting){let d=e.items[i.item]?.weight;d===void 0||d<=0||o.push((i.tokensIn+i.tokensOut)/d);}if(o.length===0)return r*c;o.sort((i,d)=>i-d);let u=Math.floor(o.length/2),f=o.length%2?o[u]:(o[u-1]+o[u])/2;return Math.round(f*c)}function K(e){return e.iterations.find(n=>n.endedAt===void 0)}function A(e$1,n){if(n.role){let c=e(e$1,n.role);return c||b("unknown-role",`item "${n.id}" is assigned to unknown role "${n.role}"`,"editItem with an existing role id"),c}if(n.status==="review"){let c=G(e$1,n),o=i(e$1,"review"),f=o.find(i=>i.id!==c)??(o.length===1?o[0]:void 0);return f||b("missing-capability",`no role has capability "review" for item "${n.id}"`,"register a role with capability review",{items:[n.id]}),f}let r=i(e$1,"deliver")[0];return r||b("missing-capability",`no role has capability "deliver" for item "${n.id}"`,"register a role with capability deliver",{items:[n.id]}),r}function j(e){let n={};for(let r of Object.values(e.roles))r.maxConcurrent!==void 0&&(n[r.resourceClass??r.id]=r.maxConcurrent);return n}function Q(e,n,r){let c=new Set(e.map(o=>o.id));return e.map(o=>{let u=A(n,o),f={id:o.id,data:{id:o.id},dependsOn:o.dependsOn.filter(d=>c.has(d)),resourceClass:u.resourceClass??u.id},i=r?r(o):o.priority;return i!==void 0&&(f.priority=i),o.weight!==void 0&&(f.weight=o.weight),o.deadline!==void 0&&(f.deadline=Date.parse(o.deadline)),f})}function ae(e$1,n,r={}){let c$1=a(r.now),o=n.candidates(e$1),u=o.filter(t=>t.dependsOn.every(s=>e$1.items[s]?.status==="done"||o.some(l=>l.id===s))),f=o.filter(t=>t.dependsOn.every(s=>e$1.items[s]?.status==="done"));if(u.length===0)return {state:e$1,dispatched:[],skipped:[],reason:"no-candidates"};let i=n.plannerOptions(e$1),d={schedulerMode:i.schedulerMode,resourceCaps:j(e$1)};if(i.concurrencyCap!==void 0&&(d.concurrencyCap=i.concurrencyCap),i.fairnessPolicy!==void 0&&(d.fairnessPolicy=i.fairnessPolicy),i.maxDeferralRounds!==void 0&&(d.maxDeferralRounds=i.maxDeferralRounds),i.deadlineStrategy!==void 0&&(d.deadlineStrategy=i.deadlineStrategy),i.weightStrategy!==void 0&&(d.weightStrategy=i.weightStrategy),i.tieBreaker!==void 0){let t=i.tieBreaker;d.tieBreaker=(s,l)=>t(e$1.items[s.data.id],e$1.items[l.data.id]);}let W,P;try{let t=new ExFlow(d);for(let l of Q(u,e$1,i.priorityOf))t.addEntity(l);let s=t.resolveExecutionDetails();W=(s.plan.batches[0]??[]).map(l=>l.id),P=s.metrics;}catch(t){throw t instanceof ExFlowRuntimeError&&b("planner-error",`ex-flow refused the graph: [${t.code}] ${t.message}`,"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message",{items:u.map(s=>s.id)}),t}let L=W.map(t=>e$1.items[t]).filter(t=>t.dependsOn.every(s=>e$1.items[s]?.status==="done")),_=Object.values(e$1.items).filter(t=>t.status==="in_progress"),H=new Set(i.wipCounts??["in_progress"]),Z=Object.values(e$1.items).filter(t=>H.has(t.status)),y={};for(let t of _){let s=t.role?e(e$1,t.role):void 0,l=s?s.resourceClass??s.id:"?";y[l]=(y[l]??0)+1;}let O=j(e$1),M=K(e$1),S=M?T(M.budget,M.spent).tokens:void 0,z=Math.min(r.max??1/0,i.concurrencyCap??1/0),g=[],h=[],a$1,p$1=e$1;for(let t of L){if(g.length>=z){a$1="wip-full";break}let s=typeof i.dispatchStage=="function"?i.dispatchStage(t):i.dispatchStage,l=t.status==="todo"&&s!==void 0?s:t.stage,k=p(e$1,l),C=t.type==="question"?[]:D(e$1,t,k.entryPolicy);if(C.length>0){h.push({id:t.id,reason:"entry-policy",detail:C.map(m=>m.message).join("; ")});continue}let R=i.wipLimitOf?i.wipLimitOf(k,t):k.wipLimit;if(R!==void 0&&Z.filter(m=>m.stage===k.id&&m.id!==t.id).length+g.filter(m=>m.stage===k.id).length>=R){a$1="wip-full",h.push({id:t.id,reason:"wip",detail:`stage "${k.id}" is at its WIP limit of ${R}`});continue}let b=A(e$1,t),w=b.resourceClass??b.id;if(O[w]!==void 0&&(y[w]??0)>=O[w]){a$1="wip-full",h.push({id:t.id,reason:"resource-cap",detail:`resource class "${w}" is at its cap of ${O[w]}`});continue}if(S!==void 0){let m=F(e$1,t.weight,r.fallbackTokensPerWeight);if(m>S){a$1="budget-exhausted",h.push({id:t.id,reason:"budget",detail:`needs about ${m} tokens, ${S} left in the iteration`});continue}S-=m;}y[w]=(y[w]??0)+1,p$1=x(p$1,t.id,{stage:l,status:"in_progress"},b.id,c$1),p$1={...p$1,items:{...p$1.items,[t.id]:{...p$1.items[t.id],role:b.id}}},g.push(p$1.items[t.id]);}return a$1===void 0&&h.some(t=>t.reason==="entry-policy")&&(a$1="policy-blocked"),a$1===void 0&&g.length<f.length&&(a$1="wip-full"),g.length===0&&a$1===void 0&&(a$1="no-candidates"),p$1=c(p$1,"planner.resolved","planner",{dispatched:g.map(t=>t.id),reason:a$1??null,skipped:h,metrics:P},c$1),a$1?{state:p$1,dispatched:g,skipped:h,reason:a$1}:{state:p$1,dispatched:g,skipped:h}}export{U as a,V as b,T as c,X as d,F as e,K as f,A as g,j as h,Q as i,ae as j};//# sourceMappingURL=chunk-PD5FBDN7.mjs.map
2
- //# sourceMappingURL=chunk-PD5FBDN7.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/budget.ts","../src/planner.ts"],"names":["ZERO_SPENT","addSpent","spent","acc","remaining","budget","out","isExhausted","estimateTokens","state","weight","fallbackPerWeight","w","samples","a","iw","x","y","mid","median","openIteration","it","assignRole","item","r","roleOf","fail","author","authorOf","reviewers","rolesWith","resourceCapsFor","caps","toExNodes","items","priorityOf","present","i","role","node","pr","plan","methodology","opts","at","nowOf","all","candidates","d","c","readyAll","po","options","tb","b","firstBatch","metrics","flow","ExFlow","n","details","e","ExFlowRuntimeError","ready","id","inProgress","wipCounts","occupying","perClass","cls","iteration","tokensLeft","limit","dispatched","skipped","reason","next","pulledTo","target","stage","stageOf","violations","evaluatePolicies","v","limitHere","est","moveItem","appendEvent"],"mappings":"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","file":"chunk-PD5FBDN7.mjs","sourcesContent":["import type { Accounting, Budget, WorkflowState } from \"./types.ts\";\n\nexport const ZERO_SPENT: Required<Budget> = { tokens: 0, turns: 0, wallclockMs: 0 };\n\nexport function addSpent(spent: Required<Budget>, acc: Accounting): Required<Budget> {\n return {\n tokens: spent.tokens + acc.tokensIn + acc.tokensOut,\n turns: spent.turns + 1,\n wallclockMs: spent.wallclockMs + acc.durationMs,\n };\n}\n\nexport function remaining(budget: Budget, spent: Required<Budget>): Budget {\n const out: Budget = {};\n if (budget.tokens !== undefined) out.tokens = Math.max(0, budget.tokens - spent.tokens);\n if (budget.turns !== undefined) out.turns = Math.max(0, budget.turns - spent.turns);\n if (budget.wallclockMs !== undefined)\n out.wallclockMs = Math.max(0, budget.wallclockMs - spent.wallclockMs);\n return out;\n}\n\nexport function isExhausted(budget: Budget, spent: Required<Budget>): boolean {\n return (\n (budget.tokens !== undefined && spent.tokens >= budget.tokens) ||\n (budget.turns !== undefined && spent.turns >= budget.turns) ||\n (budget.wallclockMs !== undefined && spent.wallclockMs >= budget.wallclockMs)\n );\n}\n\nexport function estimateTokens(\n state: WorkflowState,\n weight: number | undefined,\n fallbackPerWeight = 20000,\n): number {\n const w = weight ?? 1;\n const samples: number[] = [];\n for (const a of state.accounting) {\n const iw = state.items[a.item]?.weight;\n if (iw === undefined || iw <= 0) continue;\n samples.push((a.tokensIn + a.tokensOut) / iw);\n }\n if (samples.length === 0) return fallbackPerWeight * w;\n samples.sort((x, y) => x - y);\n const mid = Math.floor(samples.length / 2);\n const median = samples.length % 2 ? samples[mid]! : (samples[mid - 1]! + samples[mid]!) / 2;\n return Math.round(median * w);\n}\n","import { ExFlow, ExFlowRuntimeError, type ExFlowOptions, type ExNode } from \"ex-flow\";\nimport { estimateTokens, remaining } from \"./budget.ts\";\nimport { fail } from \"./errors.ts\";\nimport { authorOf } from \"./gates.ts\";\nimport { moveItem, stageOf } from \"./items.ts\";\nimport { evaluatePolicies } from \"./policies.ts\";\nimport { roleOf, rolesWith } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type { ItemStatus, Iteration, Methodology, Role, WorkItem, WorkflowState } from \"./types.ts\";\n\ntype NodeData = { id: string };\n\nexport function openIteration(state: WorkflowState): Iteration | undefined {\n return state.iterations.find((it) => it.endedAt === undefined);\n}\n\nexport function assignRole(state: WorkflowState, item: WorkItem): Role {\n if (item.role) {\n const r = roleOf(state, item.role);\n if (!r)\n fail(\n \"unknown-role\",\n `item \"${item.id}\" is assigned to unknown role \"${item.role}\"`,\n \"editItem with an existing role id\",\n );\n return r;\n }\n if (item.status === \"review\") {\n const author = authorOf(state, item);\n const reviewers = rolesWith(state, \"review\");\n const other = reviewers.find((r) => r.id !== author);\n const r = other ?? (reviewers.length === 1 ? reviewers[0] : undefined);\n if (!r)\n fail(\n \"missing-capability\",\n `no role has capability \"review\" for item \"${item.id}\"`,\n \"register a role with capability review\",\n { items: [item.id] },\n );\n return r;\n }\n const r = rolesWith(state, \"deliver\")[0];\n if (!r)\n fail(\n \"missing-capability\",\n `no role has capability \"deliver\" for item \"${item.id}\"`,\n \"register a role with capability deliver\",\n { items: [item.id] },\n );\n return r;\n}\n\nexport function resourceCapsFor(state: WorkflowState): Record<string, number> {\n const caps: Record<string, number> = {};\n for (const r of Object.values(state.roles)) {\n if (r.maxConcurrent !== undefined) caps[r.resourceClass ?? r.id] = r.maxConcurrent;\n }\n return caps;\n}\n\nexport function toExNodes(\n items: WorkItem[],\n state: WorkflowState,\n priorityOf?: (item: WorkItem) => number | undefined,\n): ExNode<NodeData>[] {\n const present = new Set(items.map((i) => i.id));\n return items.map((i) => {\n const role = assignRole(state, i);\n const node: ExNode<NodeData> = {\n id: i.id,\n data: { id: i.id },\n dependsOn: i.dependsOn.filter((d) => present.has(d)),\n resourceClass: role.resourceClass ?? role.id,\n };\n const pr = priorityOf ? priorityOf(i) : i.priority;\n if (pr !== undefined) node.priority = pr;\n if (i.weight !== undefined) node.weight = i.weight;\n if (i.deadline !== undefined) node.deadline = Date.parse(i.deadline);\n return node;\n });\n}\n\nexport interface PlanOptions {\n max?: number;\n now?: string;\n fallbackTokensPerWeight?: number;\n}\nexport type PlanReason = \"no-candidates\" | \"budget-exhausted\" | \"wip-full\" | \"policy-blocked\";\n/** A ready item the planner did not pull, and why. */\nexport interface Skipped {\n id: string;\n reason: \"entry-policy\" | \"wip\" | \"resource-cap\" | \"budget\";\n detail: string;\n}\nexport interface PlanResult {\n state: WorkflowState;\n dispatched: WorkItem[];\n skipped: Skipped[];\n reason?: PlanReason;\n}\n\nexport function plan(\n state: WorkflowState,\n methodology: Methodology,\n opts: PlanOptions = {},\n): PlanResult {\n const at = nowOf(opts.now);\n // an item may enter the graph only if every dependency is done or is itself a candidate (so ex-flow orders it)\n const all = methodology.candidates(state);\n const candidates = all.filter((i) =>\n i.dependsOn.every((d) => state.items[d]?.status === \"done\" || all.some((c) => c.id === d)),\n );\n const readyAll = all.filter((i) => i.dependsOn.every((d) => state.items[d]?.status === \"done\"));\n if (candidates.length === 0)\n return { state, dispatched: [], skipped: [], reason: \"no-candidates\" };\n\n const po = methodology.plannerOptions(state);\n const options: ExFlowOptions<NodeData> = {\n schedulerMode: po.schedulerMode,\n resourceCaps: resourceCapsFor(state),\n };\n if (po.concurrencyCap !== undefined) options.concurrencyCap = po.concurrencyCap;\n if (po.fairnessPolicy !== undefined) options.fairnessPolicy = po.fairnessPolicy;\n if (po.maxDeferralRounds !== undefined) options.maxDeferralRounds = po.maxDeferralRounds;\n if (po.deadlineStrategy !== undefined) options.deadlineStrategy = po.deadlineStrategy;\n if (po.weightStrategy !== undefined) options.weightStrategy = po.weightStrategy;\n if (po.tieBreaker !== undefined) {\n const tb = po.tieBreaker;\n options.tieBreaker = (a, b) => tb(state.items[a.data.id]!, state.items[b.data.id]!);\n }\n\n let firstBatch: string[];\n let metrics: unknown;\n try {\n const flow = new ExFlow<NodeData>(options);\n for (const n of toExNodes(candidates, state, po.priorityOf)) flow.addEntity(n);\n const details = flow.resolveExecutionDetails();\n firstBatch = (details.plan.batches[0] ?? []).map((r) => r.id);\n metrics = details.metrics;\n } catch (e) {\n if (e instanceof ExFlowRuntimeError) {\n fail(\n \"planner-error\",\n `ex-flow refused the graph: [${e.code}] ${e.message}`,\n \"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message\",\n { items: candidates.map((c) => c.id) },\n );\n }\n throw e;\n }\n\n // ready = first batch, but only items whose deps are really done (deps inside the batch are impossible by construction)\n const ready = firstBatch\n .map((id) => state.items[id]!)\n .filter((i) => i.dependsOn.every((d) => state.items[d]?.status === \"done\"));\n const inProgress = Object.values(state.items).filter((i) => i.status === \"in_progress\");\n const wipCounts = new Set<ItemStatus>(po.wipCounts ?? [\"in_progress\"]);\n const occupying = Object.values(state.items).filter((i) => wipCounts.has(i.status));\n const perClass: Record<string, number> = {};\n for (const i of inProgress) {\n const r = i.role ? roleOf(state, i.role) : undefined;\n const cls = r ? (r.resourceClass ?? r.id) : \"?\";\n perClass[cls] = (perClass[cls] ?? 0) + 1;\n }\n const caps = resourceCapsFor(state);\n const iteration = openIteration(state);\n let tokensLeft = iteration ? remaining(iteration.budget, iteration.spent).tokens : undefined;\n const limit = Math.min(opts.max ?? Infinity, po.concurrencyCap ?? Infinity);\n\n const dispatched: WorkItem[] = [];\n const skipped: Skipped[] = [];\n let reason: PlanReason | undefined;\n let next = state;\n for (const item of ready) {\n if (dispatched.length >= limit) {\n reason = \"wip-full\";\n break;\n }\n const pulledTo =\n typeof po.dispatchStage === \"function\" ? po.dispatchStage(item) : po.dispatchStage;\n const target = item.status === \"todo\" && pulledTo !== undefined ? pulledTo : item.stage;\n const stage = stageOf(state, target);\n // questions are answered, not delivered: like exit policies and gates, entry policies do not apply\n const violations =\n item.type === \"question\" ? [] : evaluatePolicies(state, item, stage.entryPolicy);\n if (violations.length > 0) {\n skipped.push({\n id: item.id,\n reason: \"entry-policy\",\n detail: violations.map((v) => v.message).join(\"; \"),\n });\n continue;\n }\n const limitHere = po.wipLimitOf ? po.wipLimitOf(stage, item) : stage.wipLimit;\n if (\n limitHere !== undefined &&\n occupying.filter((i) => i.stage === stage.id && i.id !== item.id).length +\n dispatched.filter((d) => d.stage === stage.id).length >=\n limitHere\n ) {\n reason = \"wip-full\";\n skipped.push({\n id: item.id,\n reason: \"wip\",\n detail: `stage \"${stage.id}\" is at its WIP limit of ${limitHere}`,\n });\n continue;\n }\n const role = assignRole(state, item);\n const cls = role.resourceClass ?? role.id;\n if (caps[cls] !== undefined && (perClass[cls] ?? 0) >= caps[cls]!) {\n reason = \"wip-full\";\n skipped.push({\n id: item.id,\n reason: \"resource-cap\",\n detail: `resource class \"${cls}\" is at its cap of ${caps[cls]}`,\n });\n continue;\n }\n if (tokensLeft !== undefined) {\n const est = estimateTokens(state, item.weight, opts.fallbackTokensPerWeight);\n if (est > tokensLeft) {\n reason = \"budget-exhausted\";\n skipped.push({\n id: item.id,\n reason: \"budget\",\n detail: `needs about ${est} tokens, ${tokensLeft} left in the iteration`,\n });\n continue;\n }\n tokensLeft -= est;\n }\n perClass[cls] = (perClass[cls] ?? 0) + 1;\n next = moveItem(next, item.id, { stage: target, status: \"in_progress\" }, role.id, at);\n next = {\n ...next,\n items: { ...next.items, [item.id]: { ...next.items[item.id]!, role: role.id } },\n };\n dispatched.push(next.items[item.id]!);\n }\n if (reason === undefined && skipped.some((x) => x.reason === \"entry-policy\"))\n reason = \"policy-blocked\";\n if (reason === undefined && dispatched.length < readyAll.length) reason = \"wip-full\";\n if (dispatched.length === 0 && reason === undefined) reason = \"no-candidates\";\n next = appendEvent(\n next,\n \"planner.resolved\",\n \"planner\",\n { dispatched: dispatched.map((d) => d.id), reason: reason ?? null, skipped, metrics },\n at,\n );\n return reason\n ? { state: next, dispatched, skipped, reason }\n : { state: next, dispatched, skipped };\n}\n"]}
@@ -1,2 +0,0 @@
1
- 'use strict';var chunkJDVE7DQR_cjs=require('./chunk-JDVE7DQR.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exFlow=require('ex-flow');var U={tokens:0,turns:0,wallclockMs:0};function V(e,n){return {tokens:e.tokens+n.tokensIn+n.tokensOut,turns:e.turns+1,wallclockMs:e.wallclockMs+n.durationMs}}function T(e,n){let r={};return e.tokens!==void 0&&(r.tokens=Math.max(0,e.tokens-n.tokens)),e.turns!==void 0&&(r.turns=Math.max(0,e.turns-n.turns)),e.wallclockMs!==void 0&&(r.wallclockMs=Math.max(0,e.wallclockMs-n.wallclockMs)),r}function X(e,n){return e.tokens!==void 0&&n.tokens>=e.tokens||e.turns!==void 0&&n.turns>=e.turns||e.wallclockMs!==void 0&&n.wallclockMs>=e.wallclockMs}function F(e,n,r=2e4){let c=n??1,o=[];for(let i of e.accounting){let d=e.items[i.item]?.weight;d===void 0||d<=0||o.push((i.tokensIn+i.tokensOut)/d);}if(o.length===0)return r*c;o.sort((i,d)=>i-d);let u=Math.floor(o.length/2),f=o.length%2?o[u]:(o[u-1]+o[u])/2;return Math.round(f*c)}function K(e){return e.iterations.find(n=>n.endedAt===void 0)}function A(e,n){if(n.role){let c=chunkJDVE7DQR_cjs.e(e,n.role);return c||chunkS3BXVHO7_cjs.b("unknown-role",`item "${n.id}" is assigned to unknown role "${n.role}"`,"editItem with an existing role id"),c}if(n.status==="review"){let c=chunkJDVE7DQR_cjs.G(e,n),o=chunkJDVE7DQR_cjs.i(e,"review"),f=o.find(i=>i.id!==c)??(o.length===1?o[0]:void 0);return f||chunkS3BXVHO7_cjs.b("missing-capability",`no role has capability "review" for item "${n.id}"`,"register a role with capability review",{items:[n.id]}),f}let r=chunkJDVE7DQR_cjs.i(e,"deliver")[0];return r||chunkS3BXVHO7_cjs.b("missing-capability",`no role has capability "deliver" for item "${n.id}"`,"register a role with capability deliver",{items:[n.id]}),r}function j(e){let n={};for(let r of Object.values(e.roles))r.maxConcurrent!==void 0&&(n[r.resourceClass??r.id]=r.maxConcurrent);return n}function Q(e,n,r){let c=new Set(e.map(o=>o.id));return e.map(o=>{let u=A(n,o),f={id:o.id,data:{id:o.id},dependsOn:o.dependsOn.filter(d=>c.has(d)),resourceClass:u.resourceClass??u.id},i=r?r(o):o.priority;return i!==void 0&&(f.priority=i),o.weight!==void 0&&(f.weight=o.weight),o.deadline!==void 0&&(f.deadline=Date.parse(o.deadline)),f})}function ae(e,n,r={}){let c=chunkJDVE7DQR_cjs.a(r.now),o=n.candidates(e),u=o.filter(t=>t.dependsOn.every(s=>e.items[s]?.status==="done"||o.some(l=>l.id===s))),f=o.filter(t=>t.dependsOn.every(s=>e.items[s]?.status==="done"));if(u.length===0)return {state:e,dispatched:[],skipped:[],reason:"no-candidates"};let i=n.plannerOptions(e),d={schedulerMode:i.schedulerMode,resourceCaps:j(e)};if(i.concurrencyCap!==void 0&&(d.concurrencyCap=i.concurrencyCap),i.fairnessPolicy!==void 0&&(d.fairnessPolicy=i.fairnessPolicy),i.maxDeferralRounds!==void 0&&(d.maxDeferralRounds=i.maxDeferralRounds),i.deadlineStrategy!==void 0&&(d.deadlineStrategy=i.deadlineStrategy),i.weightStrategy!==void 0&&(d.weightStrategy=i.weightStrategy),i.tieBreaker!==void 0){let t=i.tieBreaker;d.tieBreaker=(s,l)=>t(e.items[s.data.id],e.items[l.data.id]);}let W,P;try{let t=new exFlow.ExFlow(d);for(let l of Q(u,e,i.priorityOf))t.addEntity(l);let s=t.resolveExecutionDetails();W=(s.plan.batches[0]??[]).map(l=>l.id),P=s.metrics;}catch(t){throw t instanceof exFlow.ExFlowRuntimeError&&chunkS3BXVHO7_cjs.b("planner-error",`ex-flow refused the graph: [${t.code}] ${t.message}`,"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message",{items:u.map(s=>s.id)}),t}let L=W.map(t=>e.items[t]).filter(t=>t.dependsOn.every(s=>e.items[s]?.status==="done")),_=Object.values(e.items).filter(t=>t.status==="in_progress"),H=new Set(i.wipCounts??["in_progress"]),Z=Object.values(e.items).filter(t=>H.has(t.status)),y={};for(let t of _){let s=t.role?chunkJDVE7DQR_cjs.e(e,t.role):void 0,l=s?s.resourceClass??s.id:"?";y[l]=(y[l]??0)+1;}let O=j(e),M=K(e),S=M?T(M.budget,M.spent).tokens:void 0,z=Math.min(r.max??1/0,i.concurrencyCap??1/0),g=[],h=[],a,p=e;for(let t of L){if(g.length>=z){a="wip-full";break}let s=typeof i.dispatchStage=="function"?i.dispatchStage(t):i.dispatchStage,l=t.status==="todo"&&s!==void 0?s:t.stage,k=chunkJDVE7DQR_cjs.p(e,l),C=t.type==="question"?[]:chunkJDVE7DQR_cjs.D(e,t,k.entryPolicy);if(C.length>0){h.push({id:t.id,reason:"entry-policy",detail:C.map(m=>m.message).join("; ")});continue}let R=i.wipLimitOf?i.wipLimitOf(k,t):k.wipLimit;if(R!==void 0&&Z.filter(m=>m.stage===k.id&&m.id!==t.id).length+g.filter(m=>m.stage===k.id).length>=R){a="wip-full",h.push({id:t.id,reason:"wip",detail:`stage "${k.id}" is at its WIP limit of ${R}`});continue}let b=A(e,t),w=b.resourceClass??b.id;if(O[w]!==void 0&&(y[w]??0)>=O[w]){a="wip-full",h.push({id:t.id,reason:"resource-cap",detail:`resource class "${w}" is at its cap of ${O[w]}`});continue}if(S!==void 0){let m=F(e,t.weight,r.fallbackTokensPerWeight);if(m>S){a="budget-exhausted",h.push({id:t.id,reason:"budget",detail:`needs about ${m} tokens, ${S} left in the iteration`});continue}S-=m;}y[w]=(y[w]??0)+1,p=chunkJDVE7DQR_cjs.x(p,t.id,{stage:l,status:"in_progress"},b.id,c),p={...p,items:{...p.items,[t.id]:{...p.items[t.id],role:b.id}}},g.push(p.items[t.id]);}return a===void 0&&h.some(t=>t.reason==="entry-policy")&&(a="policy-blocked"),a===void 0&&g.length<f.length&&(a="wip-full"),g.length===0&&a===void 0&&(a="no-candidates"),p=chunkJDVE7DQR_cjs.c(p,"planner.resolved","planner",{dispatched:g.map(t=>t.id),reason:a??null,skipped:h,metrics:P},c),a?{state:p,dispatched:g,skipped:h,reason:a}:{state:p,dispatched:g,skipped:h}}exports.a=U;exports.b=V;exports.c=T;exports.d=X;exports.e=F;exports.f=K;exports.g=A;exports.h=j;exports.i=Q;exports.j=ae;//# sourceMappingURL=chunk-QDT35LXB.cjs.map
2
- //# sourceMappingURL=chunk-QDT35LXB.cjs.map