ex-workflow 0.4.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/README.md +68 -32
  3. package/dist/adapters/index.cjs +1 -1
  4. package/dist/adapters/index.mjs +1 -1
  5. package/dist/{roles-BLBRKhUZ.d.ts → budget-Cx63FX2K.d.ts} +9 -2
  6. package/dist/{roles-aneKYJ3Z.d.cts → budget-JyNKxP5N.d.cts} +9 -2
  7. package/dist/chunk-3KFQPSRX.mjs +2 -0
  8. package/dist/chunk-3KFQPSRX.mjs.map +1 -0
  9. package/dist/chunk-5PHK72VM.cjs +2 -0
  10. package/dist/chunk-5PHK72VM.cjs.map +1 -0
  11. package/dist/chunk-5TXYMLBF.mjs +3 -0
  12. package/dist/chunk-5TXYMLBF.mjs.map +1 -0
  13. package/dist/chunk-7IG6EQI4.mjs +6 -0
  14. package/dist/chunk-7IG6EQI4.mjs.map +1 -0
  15. package/dist/chunk-CYXVGHQM.cjs +2 -0
  16. package/dist/chunk-CYXVGHQM.cjs.map +1 -0
  17. package/dist/chunk-FKTCGQYB.cjs +2 -0
  18. package/dist/chunk-FKTCGQYB.cjs.map +1 -0
  19. package/dist/chunk-HIHMBMB5.cjs +2 -0
  20. package/dist/chunk-HIHMBMB5.cjs.map +1 -0
  21. package/dist/chunk-MQWMQ4PD.mjs +2 -0
  22. package/dist/chunk-MQWMQ4PD.mjs.map +1 -0
  23. package/dist/chunk-QDMEM62U.mjs +2 -0
  24. package/dist/chunk-QDMEM62U.mjs.map +1 -0
  25. package/dist/chunk-U3OXAO67.mjs +2 -0
  26. package/dist/chunk-U3OXAO67.mjs.map +1 -0
  27. package/dist/chunk-UZQV73X7.mjs +2 -0
  28. package/dist/chunk-UZQV73X7.mjs.map +1 -0
  29. package/dist/chunk-VXH2FAKV.cjs +2 -0
  30. package/dist/chunk-VXH2FAKV.cjs.map +1 -0
  31. package/dist/chunk-WOGK54HB.cjs +3 -0
  32. package/dist/chunk-WOGK54HB.cjs.map +1 -0
  33. package/dist/chunk-XMO2RCXB.cjs +2 -0
  34. package/dist/chunk-XMO2RCXB.cjs.map +1 -0
  35. package/dist/chunk-YBHHICTZ.mjs +2 -0
  36. package/dist/chunk-YBHHICTZ.mjs.map +1 -0
  37. package/dist/chunk-YJN4JEJU.cjs +2 -0
  38. package/dist/chunk-YJN4JEJU.cjs.map +1 -0
  39. package/dist/chunk-YRATJT7P.cjs +6 -0
  40. package/dist/chunk-YRATJT7P.cjs.map +1 -0
  41. package/dist/chunk-Z2G7DGDF.mjs +2 -0
  42. package/dist/chunk-Z2G7DGDF.mjs.map +1 -0
  43. package/dist/cli/bin.cjs +1 -1
  44. package/dist/cli/bin.mjs +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 +35 -12
  50. package/dist/index.d.ts +35 -12
  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 +1 -1
  56. package/dist/schema/index.mjs +1 -1
  57. package/dist/scrum/index.cjs +1 -1
  58. package/dist/scrum/index.d.cts +18 -3
  59. package/dist/scrum/index.d.ts +18 -3
  60. package/dist/scrum/index.mjs +1 -1
  61. package/dist/types.d.cts +23 -1
  62. package/dist/types.d.ts +23 -1
  63. package/dist/waterfall/index.cjs +1 -1
  64. package/dist/waterfall/index.d.cts +4 -1
  65. package/dist/waterfall/index.d.ts +4 -1
  66. package/dist/waterfall/index.mjs +1 -1
  67. package/package.json +1 -1
  68. package/dist/chunk-36M6OVUJ.mjs +0 -2
  69. package/dist/chunk-36M6OVUJ.mjs.map +0 -1
  70. package/dist/chunk-7KF5K3L7.cjs +0 -2
  71. package/dist/chunk-7KF5K3L7.cjs.map +0 -1
  72. package/dist/chunk-CWBH7H52.cjs +0 -2
  73. package/dist/chunk-CWBH7H52.cjs.map +0 -1
  74. package/dist/chunk-DXC2RSN5.cjs +0 -3
  75. package/dist/chunk-DXC2RSN5.cjs.map +0 -1
  76. package/dist/chunk-GATJZYTB.mjs +0 -2
  77. package/dist/chunk-GATJZYTB.mjs.map +0 -1
  78. package/dist/chunk-GFH2FEZH.mjs +0 -2
  79. package/dist/chunk-GFH2FEZH.mjs.map +0 -1
  80. package/dist/chunk-HHC5EZ54.cjs +0 -2
  81. package/dist/chunk-HHC5EZ54.cjs.map +0 -1
  82. package/dist/chunk-KSKEFYY7.cjs +0 -2
  83. package/dist/chunk-KSKEFYY7.cjs.map +0 -1
  84. package/dist/chunk-KUUIAKEJ.cjs +0 -2
  85. package/dist/chunk-KUUIAKEJ.cjs.map +0 -1
  86. package/dist/chunk-L2ZN6HEL.mjs +0 -2
  87. package/dist/chunk-L2ZN6HEL.mjs.map +0 -1
  88. package/dist/chunk-NDORREWR.mjs +0 -2
  89. package/dist/chunk-NDORREWR.mjs.map +0 -1
  90. package/dist/chunk-NZ2DIDOD.mjs +0 -2
  91. package/dist/chunk-NZ2DIDOD.mjs.map +0 -1
  92. package/dist/chunk-OHSQ52DW.mjs +0 -6
  93. package/dist/chunk-OHSQ52DW.mjs.map +0 -1
  94. package/dist/chunk-RSKZVOYC.cjs +0 -6
  95. package/dist/chunk-RSKZVOYC.cjs.map +0 -1
  96. package/dist/chunk-S22CPYXJ.mjs +0 -3
  97. package/dist/chunk-S22CPYXJ.mjs.map +0 -1
  98. package/dist/chunk-SHAPFMVP.mjs +0 -2
  99. package/dist/chunk-SHAPFMVP.mjs.map +0 -1
  100. package/dist/chunk-SJRRQZ3R.cjs +0 -2
  101. package/dist/chunk-SJRRQZ3R.cjs.map +0 -1
  102. package/dist/chunk-UM5X2JHB.cjs +0 -2
  103. package/dist/chunk-UM5X2JHB.cjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ import {b,c}from'./chunk-2FRRD6A3.mjs';import {ExFlow,ExFlowRuntimeError}from'ex-flow';function S(t){return t??new Date().toISOString()}function Y(t){let e=new Set;for(let o of t.stages)e.has(o.id)&&b("config-invalid",`duplicate stage id "${o.id}"`,"give every stage a unique id"),e.add(o.id);let n={};for(let o of t.roles)c(o.id,"role id"),Object.hasOwn(n,o.id)&&b("duplicate-role",`duplicate role id "${o.id}"`,"give every role a unique id"),n[o.id]=o;let i=S(t.now);return {version:1,methodology:t.methodology,config:t.config,items:{},stages:t.stages,roles:n,iterations:[],events:[{seq:1,at:i,type:"state.created",by:"system",payload:{methodology:t.methodology}}],accounting:[],pending:[],lessons:[],agreements:[]}}function m(t,e,n,i,o){let s={seq:(t.events[t.events.length-1]?.seq??0)+1,at:S(o),type:e,by:n,payload:i};return {...t,events:[...t.events,s]}}function Ce(t,e){for(let n=t.events.length-1;n>=0;n--){let i=t.events[n];if(e===void 0||i.type===e)return i}}function P(t,e){return Object.hasOwn(t.roles,e)?t.roles[e]:void 0}var ke=new Set(["in_progress","review","blocked"]);function Pe(t,e,n,i){c(e.id,"role id"),P(t,e.id)&&b("duplicate-role",`role "${e.id}" already exists`,`use a different id or retireRole("${e.id}") first`);let o={...t,roles:{...t.roles,[e.id]:e}};return m(o,"role.registered",n,{role:e.id,capabilities:e.capabilities},i)}function qe(t,e,n,i){P(t,e)||b("unknown-role",`role "${e}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")||"(none)"}`);let o=Object.values(t.items).filter(s=>s.role===e&&ke.has(s.status)).map(s=>s.id);o.length&&b("role-has-open-items",`role "${e}" still holds ${o.length} open item(s)`,`complete or reassign ${o.join(", ")} before retiring the role`,{items:o});let r={...t.roles};return delete r[e],m({...t,roles:r},"role.retired",n,{role:e},i)}function G(t,e){return t.capabilities.includes(e)}function F(t,e){return Object.values(t.roles).filter(n=>G(n,e))}function q(t,e,n,i){return Object.values(t.roles).filter(o=>o.id!==i&&o.canApprove.includes(e)&&(n===void 0||o.capabilities.includes(n))).map(o=>o.id)}function Be(t,e){return F(t,"approve-gate").filter(n=>n.canApprove.includes(e))}function ee(t,e,n){for(let i of e)F(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 n){let o=F(t,i);o.length>1&&b("exclusive-capability",`capability "${i}" must belong to exactly one role but is held by ${o.map(r=>r.id).join(", ")}`,`remove "${i}" from all but one role`);}}function te(t,e){return e.length===0?[]:Object.values(t.roles).filter(n=>e.every(i=>G(n,i)))}function we(t,e,...n){if(e==="human")return true;let i=P(t,e);return !!i&&n.some(o=>G(i,o))}function Ne(t,e,...n){if(!we(t,e,...n)){let i=Object.values(t.roles).filter(o=>n.some(r=>G(o,r))).map(o=>o.id);b("missing-capability",`"${e}" lacks capability ${n.map(o=>`"${o}"`).join(" or ")}`,`run this as one of: human${i.map(o=>`, ${o}`).join("")}`);}}function H(t,e){let n=t.stages.find(i=>i.id===e);return n||b("unknown-stage",`stage "${e}" does not exist`,`stages are: ${t.stages.map(i=>i.id).join(" \u2192 ")}`),n}function he(t,e){let n=t.stages.findIndex(i=>i.id===e);return n<0&&H(t,e),t.stages[n+1]}function ye(t,e){return t.stages[t.stages.length-1]?.id===e}function B(t,e){return {...t,items:{...t.items,[e.id]:e}}}function ve(t,e,n){return B(t,n(j(t,e)))}function xe(t,e,n){return ve(t,e,i=>{let o={...i};for(let r of n)delete o[r];return o})}function j(t,e){let n=Object.hasOwn(t.items,e)?t.items[e]:void 0;return n||b("unknown-item",`item "${e}" does not exist`,`add it with addItem first; known items: ${Object.keys(t.items).join(", ")||"(none)"}`,{items:[e]}),n}function V(t,e,n){let i=e.filter(o=>!Object.hasOwn(t.items,o));i.length&&b("unknown-item",`${n} refers to unknown item(s) ${i.join(", ")}`,"add those items first or remove the reference",{items:i});}function Fe(t,e,n,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 o=t.stages[0];o||b("config-invalid","state has no stages","create the state with at least one stage");let r=e.stage??o.id;H(t,r),V(t,e.dependsOn??[],`item "${e.id}".dependsOn`),e.affects&&V(t,e.affects,`item "${e.id}".affects`),e.parent!==void 0&&V(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:s,...a}=e,l={type:"task",acceptance:[],dependsOn:[],...a,id:e.id,title:e.title,stage:r,status:"todo",evidence:[],blockers:[],transitions:[]},c$1=B(t,l);return m(c$1,"item.added",n,{id:l.id,type:l.type,stage:l.stage,weight:l.weight??null,priority:l.priority??null,phase:l.phase??null,parent:l.parent??null},i)}function Ve(t,e,n,i,o){let r=j(t,e);n.dependsOn&&V(t,n.dependsOn,`item "${e}".dependsOn`),n.affects&&V(t,n.affects,`item "${e}".affects`),n.parent!==void 0&&V(t,[n.parent],`item "${e}".parent`),n.role!==void 0&&!Object.hasOwn(t.roles,n.role)&&b("unknown-role",`role "${n.role}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")}`);let s=Object.keys(n).filter(c=>JSON.stringify(n[c])!==JSON.stringify(r[c]));s.length===0&&b("no-op",`editItem("${e}") changes nothing`,"pass at least one field with a different value",{items:[e]});let a={...r};for(let c of s)a[c]=n[c];let l=B(t,a);return m(l,"item.edited",i,{id:e,changed:s},o)}function M(t,e,n,i,o){let r=j(t,e),s=n.stage??r.stage;H(t,s),(r.status==="done"||r.status==="dropped")&&b("invalid-transition",`item "${e}" is ${r.status} and cannot move`,"create a new item (or a change-request) instead of reopening a finished one",{items:[e]}),s===r.stage&&n.status===r.status&&b("no-op",`item "${e}" is already ${r.status} in "${s}"`,"choose a different stage or status",{items:[e]});let a=S(o),l={...r,stage:s,status:n.status,transitions:[...r.transitions,{from:{stage:r.stage,status:r.status},to:{stage:s,status:n.status},at:a,by:i}]},c=B(t,l);return m(c,"item.transition",i,{id:e,from:{stage:r.stage,status:r.status},to:{stage:s,status:n.status}},a)}function K(t,e){let n=0,i=false;for(let o=t.events.length-1;o>=0;o--){let r=t.events[o];if(r.payload?.id===e.id){if(r.type==="item.rework"){i=true;break}r.type==="item.evidence"&&n++;}}return i?e.evidence.slice(Math.max(0,e.evidence.length-n)):e.evidence}function He(t,e,n,i){let o=j(t,e),r=S(i),s={...o,evidence:[...o.evidence,{...n,at:r}]},a=B(t,s);return m(a,"item.evidence",n.by,{id:e,kind:n.kind,ref:n.ref},r)}function oe(t,e,n,i,o,r){let s=j(t,e),a=S(r),l=`${e}-b${s.blockers.length+1}`,c=s.status==="blocked"?null:{from:{stage:s.stage,status:s.status},to:{stage:s.stage,status:"blocked"},at:a,by:o},p={...s,status:"blocked",blockers:[...s.blockers,{id:l,reason:n,owner:i,raisedAt:a}],transitions:c?[...s.transitions,c]:s.transitions},g=B(t,p);return m(g,"blocker.raised",o,{id:e,blocker:l,reason:n,owner:i,transition:c&&{from:c.from,to:c.to}},a)}function ne(t,e){for(let n=t.transitions.length-1;n>=0;n--){let i=t.transitions[n];if(i.to.status===e)return i}}function Le(t,e,n,i,o,r){let s=j(t,e),a=s.blockers.findIndex(x=>x.id===n&&!x.clearedAt);a<0&&b("invalid-input",`item "${e}" has no open blocker "${n}"`,`open blockers: ${s.blockers.filter(x=>!x.clearedAt).map(x=>x.id).join(", ")||"(none)"}`,{items:[e]});let l=S(o),c=s.blockers.map((x,D)=>D===a?{...x,clearedAt:l}:x),p=c.some(x=>!x.clearedAt),g=ne(s,"blocked")?.from.status??"todo",u=s.stage,k=g,y=false;g==="in_progress"?(k="todo",u=ne(s,"in_progress")?.from.stage??s.stage):g==="awaiting_human"&&(k=H(t,s.stage).review?"review":"todo",y=true);let{role:W,...R}=s,v=p?null:{from:{stage:s.stage,status:"blocked"},to:{stage:u,status:k},at:l,by:i},E={...y&&!p?R:s,blockers:c,stage:p?s.stage:u,status:p?"blocked":k,transitions:v?[...s.transitions,v]:s.transitions},N=B(t,E);return m(N,"blocker.cleared",i,{id:e,blocker:n,transition:v&&{from:v.from,to:v.to},note:r??null},l)}function Q(t,e){return xe(t,e,["role"])}function ie(t,e,n,i,o){let r=j(t,e),s=he(t,r.stage);if(!s)return M(t,e,{status:"done"},n,o);if(ye(t,s.id))return M(t,e,{stage:s.id,status:"done"},n,o);let a=i||s.review===true?"review":"todo";return Q(M(t,e,{stage:s.id,status:a},n,o),e)}var Se=t=>t.agreements.length===0?"(none)":t.agreements.map(e=>`"${e}"`).join(", ");function re(t,e,n){return b("invalid-input",`no working agreement ${JSON.stringify(e)} to ${n}`,`current agreements: ${Se(t)}; name one of them exactly`)}function Ze(t,e,n,i){if(e.replaces===e.text)return t;let o=t;return e.replaces!==void 0&&((typeof e.replaces!="string"||!o.agreements.includes(e.replaces))&&re(o,e.replaces,"replace"),o={...o,agreements:o.agreements.filter(r=>r!==e.replaces)},o=m(o,"agreement.retired",n,{text:e.replaces,replacedBy:e.text},i)),o.agreements.includes(e.text)||(o={...o,agreements:[...o.agreements,e.text]}),o}function ze(t,e,n,i){(typeof e!="string"||!t.agreements.includes(e))&&re(t,e,"retire");let o={...t,agreements:t.agreements.filter(r=>r!==e)};return m(o,"agreement.retired",n,{text:e,replacedBy:null},i)}function U(t,e,n){let i=[],o=K(t,e),r=(s,a,l)=>i.push({rule:s,severity:"error",item:e.id,message:a,fix:l});for(let s of n)switch(s.kind){case "evidence":o.some(a=>a.kind===s.evidenceKind)||r("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&&r("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&&r("policy:estimate-present",`item "${e.id}" has no weight`,"editItem with a weight (story points)");break;case "no-open-blockers":{let a=e.blockers.filter(l=>!l.clearedAt);a.length&&r("policy:no-open-blockers",`item "${e.id}" has ${a.length} open blocker(s)`,`clearBlocker ${a.map(l=>l.id).join(", ")}`);break}case "dependencies-done":{let a=e.dependsOn.filter(l=>t.items[l]?.status!=="done");a.length&&r("policy:dependencies-done",`item "${e.id}" depends on unfinished ${a.join(", ")}`,`finish ${a.join(", ")} first`);break}case "custom":o.some(a=>a.kind===`policy:${s.id}`)||r(`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 Ye(t,e,n,i){let o=U(t,e,n);o.length&&b("policy-unmet",`item "${e.id}" cannot ${i}: ${o.length} polic${o.length===1?"y":"ies"} unmet`,o.map(r=>r.fix).join("; "),{items:[e.id]});}function be(t,e){let n=new Map(t.stages.map((o,r)=>[o.id,r])),i=n.get(e.stage);if(i!==void 0)for(let o=e.transitions.length-1;o>=0;o--){let r=e.transitions[o],s=n.get(r.from.stage);if(r.to.status==="in_progress"&&s!==void 0&&s<i)return r}}function L(t,e){let n=be(t,e);if(n)return n.by;for(let i=e.transitions.length-1;i>=0;i--){let o=e.transitions[i];if(o.to.status==="in_progress")return o.by}}function $e(t,e,n,i){let o=[],r=K(t,e);for(let a of n.evidence)r.some(l=>l.kind===a)||o.push({rule:"gate:evidence",severity:"error",item:e.id,message:`gate "${n.id}" needs evidence "${a}" on item "${e.id}"`,fix:`attach evidence { kind: "${a}" } before approving`});if(o.length)return {outcome:"fail",violations:o};let s=false;for(let a of n.requires){if(a==="human"){i!=="human"&&(s=true);continue}if(!q(t,n.id,a.capability).includes(i)){o.push({rule:"gate:capability",severity:"error",item:e.id,message:`"${i}" may not approve gate "${n.id}" (needs capability "${a.capability}" and canApprove "${n.id}")`,fix:`approve as one of: ${q(t,n.id,a.capability).join(", ")||"(no role qualifies; register one)"}`});continue}let c=L(t,e);if(c!==void 0&&c===i){let p=q(t,n.id,a.capability,i);o.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: ${p.join(", ")||"(register another approver)"}`});}}return o.length?{outcome:"fail",violations:o}:s?{outcome:"human"}:{outcome:"pass"}}function rt(t,e,n){let i=S(n),o=`p${t.events.filter(a=>a.type==="pending.raised").length+1}`,r={...e,id:o,raisedAt:i},s={...t,pending:[...t.pending,r]};return e.item&&j(s,e.item).status!=="awaiting_human"&&(s=M(s,e.item,{status:"awaiting_human"},"system",i)),m(s,"pending.raised","system",{id:o,kind:e.kind,item:e.item??null,gate:e.gate??null},i)}function st(t,e,n,i,o,r,s){n!=="approve"&&n!=="reject"&&b("invalid-input",`decision must be "approve" or "reject" (got ${JSON.stringify(n)})`,"pass approve or reject");let a=t.pending.find(u=>u.id===e);a||b("unknown-pending",`no pending decision "${e}"`,`open decisions: ${t.pending.map(u=>u.id).join(", ")||"(none)"}`);let l=a.kind==="gate"&&a.item?j(t,a.item):void 0,c=l&&(t.stages.find(u=>a.gate!==void 0&&u.gate?.id===a.gate)?.gate??t.stages.find(u=>u.id===l.stage)?.gate);l&&c&&i!=="human"&&(c.requires.includes("human")?void 0:$e(t,l,c,i))?.outcome!=="pass"&&b("gate-unmet",`"${i}" may not decide gate "${c.id}" on "${l.id}"`,`decide as one of: human${c.requires.flatMap(k=>k==="human"?[]:q(t,c.id,k.capability)).map(k=>`, ${k}`).join("")}`,{items:[l.id],rule:"gate"});let p=S(r),g={...t,pending:t.pending.filter(u=>u.id!==e)};if(g=m(g,"pending.decided",i,{id:e,decision:n,note:o,item:a.item??null,gate:a.gate??null},p),l){let u=l.id,k=a.gate??c?.id??null;if(n==="approve"){let y=false;for(let W=t.events.length-1;W>=0;W--){let R=t.events[W];if(!(R.type!=="item.completed"||R.payload.id!==u)){y=R.payload.verdict==="needs-review";break}}g=ie(g,u,i,y,p),g=m(g,"gate.passed",i,{item:u,gate:k},p);}else {let y=c?.onFail??{action:"block"};y.action==="return-to"?g=Q(M(g,u,{stage:y.stage,status:"todo"},i,p),u):g=oe(g,u,`gate "${k??"?"}" rejected: ${o||"no reason given"}`,i,i,p),g=m(g,"gate.failed",i,{item:u,gate:k,note:o},p);}}return s?.afterDecide&&(g=s.afterDecide(g,a,n,i,o,p)),g}var lt={tokens:0,turns:0,wallclockMs:0};function dt(t,e){return {tokens:t.tokens+e.tokensIn+e.tokensOut,turns:t.turns+1,wallclockMs:t.wallclockMs+e.durationMs}}function se(t,e){let n={};return t.tokens!==void 0&&(n.tokens=Math.max(0,t.tokens-e.tokens)),t.turns!==void 0&&(n.turns=Math.max(0,t.turns-e.turns)),t.wallclockMs!==void 0&&(n.wallclockMs=Math.max(0,t.wallclockMs-e.wallclockMs)),n}function ct(t,e){return t.tokens!==void 0&&e.tokens>=t.tokens||t.turns!==void 0&&e.turns>=t.turns||t.wallclockMs!==void 0&&e.wallclockMs>=t.wallclockMs}function ae(t,e,n=2e4,i="per-weight"){let o=e??1,r=[];for(let l of t.accounting){if(l.estimate===true)continue;let c=l.tokensIn+l.tokensOut;if(i==="per-call"){r.push(c);continue}let p=t.items[l.item]?.weight;p===void 0||p<=0||r.push(c/p);}if(r.length===0)return i==="per-call"?n:n*o;r.sort((l,c)=>l-c);let s=Math.floor(r.length/2),a=r.length%2?r[s]:(r[s-1]+r[s])/2;return Math.round(i==="per-call"?a:a*o)}function Z(t){return t.iterations.find(e=>e.endedAt===void 0)}function de(t,e,n){if(e.role){let r=P(t,e.role);return r||b("unknown-role",`item "${e.id}" is assigned to unknown role "${e.role}"`,"editItem with an existing role id"),r}let i=n?n(e):void 0;if(i!==void 0){let r=P(t,i);return r||b("unknown-role",`the methodology picked unknown role "${i}" for item "${e.id}"`,`registered roles: ${Object.keys(t.roles).join(", ")||"(none)"}`,{items:[e.id]}),r}if(e.status==="review"){let r=L(t,e),s=F(t,"review"),l=s.find(c=>c.id!==r)??(s.length===1?s[0]:void 0);return l||b("missing-capability",`no role has capability "review" for item "${e.id}"`,"register a role with capability review",{items:[e.id]}),l}let o=F(t,"deliver")[0];return o||b("missing-capability",`no role has capability "deliver" for item "${e.id}"`,"register a role with capability deliver",{items:[e.id]}),o}function le(t){let e={};for(let n of Object.values(t.roles))n.maxConcurrent!==void 0&&(e[n.resourceClass??n.id]=n.maxConcurrent);return e}function Ie(t,e,n,i){let o=new Set(t.map(r=>r.id));return t.map(r=>{let s=de(e,r,i),a={id:r.id,data:{id:r.id},dependsOn:r.dependsOn.filter(c=>o.has(c)),resourceClass:s.resourceClass??s.id},l=n?n(r):r.priority;return l!==void 0&&(a.priority=l),r.weight!==void 0&&(a.weight=r.weight),r.deadline!==void 0&&(a.deadline=Date.parse(r.deadline)),a})}function vt(t,e,n={}){let i=S(n.now),o=e.candidates(t),r=o.filter(d=>d.dependsOn.every(w=>t.items[w]?.status==="done"||o.some(b=>b.id===w))),s=o.filter(d=>d.dependsOn.every(w=>t.items[w]?.status==="done"));if(r.length===0)return {state:t,dispatched:[],skipped:[],reason:Z(t)?.closing?"budget-exhausted":"no-candidates"};let a=e.plannerOptions(t),l={schedulerMode:a.schedulerMode,resourceCaps:le(t)};if(a.concurrencyCap!==void 0&&(l.concurrencyCap=a.concurrencyCap),a.fairnessPolicy!==void 0&&(l.fairnessPolicy=a.fairnessPolicy),a.maxDeferralRounds!==void 0&&(l.maxDeferralRounds=a.maxDeferralRounds),a.deadlineStrategy!==void 0&&(l.deadlineStrategy=a.deadlineStrategy),a.weightStrategy!==void 0&&(l.weightStrategy=a.weightStrategy),a.tieBreaker!==void 0){let d=a.tieBreaker;l.tieBreaker=(w,b)=>d(t.items[w.data.id],t.items[b.data.id]);}let c,p;try{let d=new ExFlow(l);for(let b of Ie(r,t,a.priorityOf,a.roleFor))d.addEntity(b);let w=d.resolveExecutionDetails();c=(w.plan.batches[0]??[]).map(b=>b.id),p=w.metrics;}catch(d){throw d instanceof ExFlowRuntimeError&&b("planner-error",`ex-flow refused the graph: [${d.code}] ${d.message}`,"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message",{items:r.map(w=>w.id)}),d}let g=c.map(d=>t.items[d]).filter(d=>d.dependsOn.every(w=>t.items[w]?.status==="done")),u=Object.values(t.items).filter(d=>d.status==="in_progress"),k=new Set(a.wipCounts??["in_progress"]),y=Object.values(t.items).filter(d=>k.has(d.status)),W={};for(let d of u){let w=d.role?P(t,d.role):void 0,b=w?w.resourceClass??w.id:"?";W[b]=(W[b]??0)+1;}let R=le(t),v=Z(t),E=v?se(v.budget,v.spent):{},N=E.tokens,x=v?Object.values(t.items).filter(d=>(d.iteration===v.id||v.committed.includes(d.id))&&d.status==="in_progress").length:0,D=E.turns===void 0?void 0:E.turns-x,ue=E.wallclockMs!==void 0&&E.wallclockMs<=0,pe=a.estimateMode??"per-weight",ge=n.fallbackTokensPerWeight??a.fallbackTokensPerWeight,me=Math.min(n.max??1/0,a.concurrencyCap??1/0),C=[],O=[],h,$=t;for(let d of g){if(C.length>=me){h="wip-full";break}let w=typeof a.dispatchStage=="function"?a.dispatchStage(d):a.dispatchStage,b=d.status==="todo"&&w!==void 0?w:d.stage,T=H(t,b),X=d.type==="question"?[]:U(t,d,T.entryPolicy);if(X.length>0){O.push({id:d.id,reason:"entry-policy",detail:X.map(I=>I.message).join("; ")});continue}let z=a.wipLimitOf?a.wipLimitOf(T,d):T.wipLimit;if(z!==void 0&&y.filter(I=>I.stage===T.id&&I.id!==d.id).length+C.filter(I=>I.stage===T.id).length>=z){h="wip-full",O.push({id:d.id,reason:"wip",detail:`stage "${T.id}" is at its WIP limit of ${z}`});continue}let J=de(t,d,a.roleFor),A=J.resourceClass??J.id;if(R[A]!==void 0&&(W[A]??0)>=R[A]){h="wip-full",O.push({id:d.id,reason:"resource-cap",detail:`resource class "${A}" is at its cap of ${R[A]}`});continue}if(D!==void 0&&D<=0){h="budget-exhausted",O.push({id:d.id,reason:"budget",detail:`turns budget spent: ${v.spent.turns} used + ${x+C.length} in flight of ${v.budget.turns}`});continue}if(ue){h="budget-exhausted",O.push({id:d.id,reason:"budget",detail:"wall-clock budget spent"});continue}if(N!==void 0){let I=ae(t,d.weight,ge,pe);if(I>N){h="budget-exhausted",O.push({id:d.id,reason:"budget",detail:`needs about ${I} tokens, ${N} left in the iteration`});continue}N-=I;}W[A]=(W[A]??0)+1,D!==void 0&&(D-=1),$=M($,d.id,{stage:b,status:"in_progress"},J.id,i),$={...$,items:{...$.items,[d.id]:{...$.items[d.id],role:J.id}}},C.push($.items[d.id]);}return h===void 0&&O.some(d=>d.reason==="entry-policy")&&(h="policy-blocked"),h===void 0&&C.length<s.length&&(h="wip-full"),C.length===0&&h===void 0&&(h="no-candidates"),$=m($,"planner.resolved","planner",{dispatched:C.map(d=>d.id),reason:h??null,skipped:O,metrics:p},i),h?{state:$,dispatched:C,skipped:O,reason:h}:{state:$,dispatched:C,skipped:O}}function ce(t){return [{id:"separation-lost",severity:"warning",check(i,o){return o.type!=="init"&&o.type!=="role.register"?[]:te(i,t.requiredCapabilities).map(r=>({rule:"separation-lost",severity:"warning",message:`role "${r.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,o){if(o.type!=="complete")return [];let r=o.payload?.handoff;if(!r)return [];let s=r.verdict??"done";if(s!=="done"&&s!=="needs-review")return [];let a=i.items[r.item];if(!a)return [];let l=i.stages.find(p=>p.id===a.stage)?.gate;if(!l||!l.requires.some(p=>p!=="human"))return [];if(L(i,a)!==r.role)return [];let c=q(i,l.id,void 0,r.role);return [{rule:"conflict-of-interest",severity:"error",item:a.id,message:`role "${r.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 je(t,e,n){let i=[];for(let o of [...ce(e),...e.rules])i.push(...o.check(t,n));return i}function fe(t,e,n,i){let o=je(t,e,n),r=o.filter(s=>s.severity==="error");return r.length&&b("rule-violation",`${n.type} violates ${r.map(s=>s.rule).join(", ")}: ${r.map(s=>s.message).join("; ")}`,r.map(s=>s.fix).join("; "),{rule:r[0].rule,items:r.map(s=>s.item).filter(s=>!!s)}),{state:i(t),warnings:o.filter(s=>s.severity==="warning")}}function Ct(t){let e=t.methodology,n=e.validateConfig(t.config),i=t.stages??e.defaultStages(n),o=t.roles??e.defaultRoles(n),r=t.now!==void 0?{methodology:e.name,config:n,stages:i,roles:o,now:t.now}:{methodology:e.name,config:n,stages:i,roles:o},s=Y(r);return ee(s,e.requiredCapabilities,e.exclusiveCapabilities),fe(s,e,{type:"init",by:t.by??"system"},a=>a)}function Mt(t,e,n,i,o){(typeof n!="object"||n===null||Array.isArray(n)||Object.keys(n).length===0)&&b("invalid-input","config patch must be a non-empty object",'pass e.g. { "sprintBudget": { "tokens": 1500000 } } to exwf config set');let r=Z(t);r&&b("invalid-input",`config cannot change while ${r.id} is open`,"close it first (exwf ceremony review or cancel; a waterfall phase closes at its gate), then run exwf config set");let s=(e.lockedConfigKeys??[]).filter(u=>Object.hasOwn(n,u));s.length&&b("invalid-input",`config key(s) ${s.join(", ")} cannot change after init`,e.name==="kanban"?"use the service-delivery-review cadence for columns and classes of service":"start a new workflow with exwf init to change them");let a=t.config??{},l=e.validateConfig({...a,...n}),c=Object.keys(n).filter(u=>!Object.hasOwn(l,u));c.length&&b("invalid-input",`unknown config key(s) ${c.join(", ")}`,`known keys: ${Object.keys(l).join(", ")}`);let p=Object.keys(n).filter(u=>JSON.stringify(a[u])!==JSON.stringify(l[u]));p.length===0&&b("no-op","config patch changes nothing","pass at least one key with a different value to exwf config set");let g=u=>Object.fromEntries(p.map(k=>[k,u[k]]));return fe(t,e,{type:"config.change",by:i,payload:{patch:n}},u=>{let k=S(o),y=m({...u,config:l},"config.changed",i,{changed:p,before:g(a),after:g(l)},k);return e.afterConfigChange&&(y=e.afterConfigChange(y,k)),y})}export{Le as A,Q as B,ie as C,Ze as D,ze as E,U as F,Ye as G,be as H,L as I,$e as J,rt as K,st as L,lt as M,dt as N,se as O,ct as P,ae as Q,Z as R,de as S,le as T,Ie as U,vt as V,ce as W,je as X,fe as Y,Ct as Z,Mt as _,S as a,Y as b,m as c,Ce as d,P as e,Pe as f,qe as g,G as h,F as i,q as j,Be as k,ee as l,te as m,we as n,Ne as o,H as p,he as q,ye as r,ve as s,xe as t,j as u,Fe as v,Ve as w,M as x,He as y,oe as z};//# sourceMappingURL=chunk-YBHHICTZ.mjs.map
2
+ //# sourceMappingURL=chunk-YBHHICTZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state.ts","../src/roles.ts","../src/items.ts","../src/agreements.ts","../src/policies.ts","../src/gates.ts","../src/budget.ts","../src/planner.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","freshEvidence","after","found","addEvidence","evidence","raiseBlocker","reason","owner","blockerId","t","lastTransitionTo","status","clearBlocker","note","b","blockers","stillBlocked","prev","toStatus","dropRole","_r","noRole","clearRole","itemId","advanceItem","wantsReview","listed","a","absent","text","applyAgreement","change","retireAgreement","evaluatePolicies","policies","out","fresh","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","methodology","item0","q","onFail","ZERO_SPENT","addSpent","spent","acc","remaining","budget","isExhausted","estimateTokens","weight","fallbackPerWeight","mode","w","samples","total","iw","x","y","mid","median","openIteration","assignRole","roleFor","picked","reviewers","resourceCapsFor","toExNodes","items","priorityOf","present","node","pr","plan","opts","all","candidates","readyAll","po","options","tb","firstBatch","metrics","flow","ExFlow","n","details","ExFlowRuntimeError","ready","inProgress","wipCounts","occupying","perClass","cls","iteration","left","tokensLeft","inFlight","turnsLeft","clockOut","estimateMode","fallback","limit","dispatched","skipped","pulledTo","target","stage","limitHere","est","coreRulesFor","action","handoff","verdict","validateAction","applyAction","reduce","errors","init","m","config","stages","stateInput","changeConfig","locked","unknown","pick","o","s2"],"mappings":"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","file":"chunk-YBHHICTZ.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\";\nimport type { ItemPatch } from \"./types.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 phase: item.phase ?? null,\n parent: item.parent ?? null,\n },\n now,\n );\n}\n\nexport type { ItemPatch } from \"./types.ts\";\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\n/** Evidence recorded at or after the item's last `item.rework` event; evidence stays stored, but earlier entries no longer count toward policies or gates. Never-reworked items keep all evidence. */\nexport function freshEvidence(state: WorkflowState, item: WorkItem): Evidence[] {\n // Event order, not timestamps: evidence recorded by an item.evidence event AFTER the item's last\n // item.rework event is fresh. Evidence entries are appended in the same order as those events, so\n // the fresh entries are the last `after` ones. Evidence attached by the rework completion itself\n // precedes its item.rework event and therefore does not count.\n let after = 0;\n let found = false;\n for (let i = state.events.length - 1; i >= 0; i--) {\n const ev = state.events[i]!;\n if ((ev.payload as { id?: string } | null)?.id !== item.id) continue;\n if (ev.type === \"item.rework\") {\n found = true;\n break;\n }\n if (ev.type === \"item.evidence\") after++;\n }\n return found ? item.evidence.slice(Math.max(0, item.evidence.length - after)) : item.evidence;\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 note?: 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 }, note: note ?? null },\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 { appendEvent } from \"./state.ts\";\nimport type { WorkflowState } from \"./types.ts\";\n\nconst listed = (s: WorkflowState) =>\n s.agreements.length === 0 ? \"(none)\" : s.agreements.map((a) => `\"${a}\"`).join(\", \");\n\nfunction absent(s: WorkflowState, text: unknown, what: string): never {\n return fail(\n \"invalid-input\",\n `no working agreement ${JSON.stringify(text)} to ${what}`,\n `current agreements: ${listed(s)}; name one of them exactly`,\n );\n}\n\n/** Adds an agreement (idempotent); with `replaces`, retires that one in the same step. */\nexport function applyAgreement(\n state: WorkflowState,\n change: { text: string; replaces?: string },\n by: string,\n now: string,\n): WorkflowState {\n if (change.replaces === change.text) return state;\n let s = state;\n if (change.replaces !== undefined) {\n if (typeof change.replaces !== \"string\" || !s.agreements.includes(change.replaces))\n absent(s, change.replaces, \"replace\");\n s = { ...s, agreements: s.agreements.filter((a) => a !== change.replaces) };\n s = appendEvent(\n s,\n \"agreement.retired\",\n by,\n { text: change.replaces, replacedBy: change.text },\n now,\n );\n }\n if (!s.agreements.includes(change.text)) s = { ...s, agreements: [...s.agreements, change.text] };\n return s;\n}\n\n/** Removes an agreement and records why it left (replacedBy null). */\nexport function retireAgreement(\n state: WorkflowState,\n text: string,\n by: string,\n now: string,\n): WorkflowState {\n if (typeof text !== \"string\" || !state.agreements.includes(text)) absent(state, text, \"retire\");\n const s = { ...state, agreements: state.agreements.filter((a) => a !== text) };\n return appendEvent(s, \"agreement.retired\", by, { text, replacedBy: null }, now);\n}\n","import { fail } from \"./errors.ts\";\nimport { freshEvidence } from \"./items.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 fresh = freshEvidence(state, item);\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 (!fresh.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 (!fresh.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, freshEvidence, clearRole, getItem, moveItem, raiseBlocker } from \"./items.ts\";\nimport { approverIds } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Gate,\n Methodology,\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 const fresh = freshEvidence(state, item);\n for (const kind of gate.evidence) {\n if (!fresh.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 methodology?: Methodology,\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 let wantsReview = false;\n for (let i = state.events.length - 1; i >= 0; i--) {\n const e = state.events[i]!;\n if (e.type !== \"item.completed\" || (e.payload as { id?: string }).id !== id) continue;\n wantsReview = (e.payload as { verdict?: string }).verdict === \"needs-review\";\n break;\n }\n next = advanceItem(next, id, by, wantsReview, 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 if (methodology?.afterDecide) next = methodology.afterDecide(next, entry, decision, by, note, at);\n return next;\n}\n","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 type EstimateMode = \"per-weight\" | \"per-call\";\n\nexport function estimateTokens(\n state: WorkflowState,\n weight: number | undefined,\n fallbackPerWeight = 20000,\n mode: EstimateMode = \"per-weight\",\n): number {\n const w = weight ?? 1;\n const samples: number[] = [];\n for (const a of state.accounting) {\n if (a.estimate === true) continue;\n const total = a.tokensIn + a.tokensOut;\n if (mode === \"per-call\") {\n samples.push(total);\n continue;\n }\n const iw = state.items[a.item]?.weight;\n if (iw === undefined || iw <= 0) continue;\n samples.push(total / iw);\n }\n if (samples.length === 0) return mode === \"per-call\" ? fallbackPerWeight : 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(mode === \"per-call\" ? median : 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(\n state: WorkflowState,\n item: WorkItem,\n roleFor?: (item: WorkItem) => string | undefined,\n): 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 const picked = roleFor ? roleFor(item) : undefined;\n if (picked !== undefined) {\n const r = roleOf(state, picked);\n if (!r)\n fail(\n \"unknown-role\",\n `the methodology picked unknown role \"${picked}\" for item \"${item.id}\"`,\n `registered roles: ${Object.keys(state.roles).join(\", \") || \"(none)\"}`,\n { items: [item.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 roleFor?: (item: WorkItem) => string | 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, roleFor);\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 {\n state,\n dispatched: [],\n skipped: [],\n reason: openIteration(state)?.closing ? \"budget-exhausted\" : \"no-candidates\",\n };\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, po.roleFor)) 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 const left = iteration ? remaining(iteration.budget, iteration.spent) : {};\n let tokensLeft = left.tokens;\n const inFlight = iteration\n ? Object.values(state.items).filter(\n (i) =>\n (i.iteration === iteration.id || iteration.committed.includes(i.id)) &&\n i.status === \"in_progress\",\n ).length\n : 0;\n let turnsLeft = left.turns === undefined ? undefined : left.turns - inFlight;\n const clockOut = left.wallclockMs !== undefined && left.wallclockMs <= 0;\n const estimateMode = po.estimateMode ?? \"per-weight\";\n const fallback = opts.fallbackTokensPerWeight ?? po.fallbackTokensPerWeight;\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, po.roleFor);\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 (turnsLeft !== undefined && turnsLeft <= 0) {\n reason = \"budget-exhausted\";\n skipped.push({\n id: item.id,\n reason: \"budget\",\n detail: `turns budget spent: ${iteration!.spent.turns} used + ${inFlight + dispatched.length} in flight of ${iteration!.budget.turns}`,\n });\n continue;\n }\n if (clockOut) {\n reason = \"budget-exhausted\";\n skipped.push({ id: item.id, reason: \"budget\", detail: \"wall-clock budget spent\" });\n continue;\n }\n if (tokensLeft !== undefined) {\n const est = estimateTokens(state, item.weight, fallback, estimateMode);\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 if (turnsLeft !== undefined) turnsLeft -= 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","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 // dormant by design: completions reach rules as \"item.complete\" (spec §22 B02), so this match never fires\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 { openIteration } from \"./planner.ts\";\nimport { appendEvent, createState, nowOf } 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\n/** Change the config between iterations: re-validated, recorded as config.changed, derived state kept in step by the methodology hook. */\nexport function changeConfig(\n state: WorkflowState,\n methodology: Methodology,\n patch: Record<string, unknown>,\n by: string,\n now?: string,\n): ApplyResult {\n if (\n typeof patch !== \"object\" ||\n patch === null ||\n Array.isArray(patch) ||\n Object.keys(patch).length === 0\n )\n fail(\n \"invalid-input\",\n \"config patch must be a non-empty object\",\n 'pass e.g. { \"sprintBudget\": { \"tokens\": 1500000 } } to exwf config set',\n );\n const open = openIteration(state);\n if (open)\n fail(\n \"invalid-input\",\n `config cannot change while ${open.id} is open`,\n \"close it first (exwf ceremony review or cancel; a waterfall phase closes at its gate), then run exwf config set\",\n );\n const locked = (methodology.lockedConfigKeys ?? []).filter((k) => Object.hasOwn(patch, k));\n if (locked.length)\n fail(\n \"invalid-input\",\n `config key(s) ${locked.join(\", \")} cannot change after init`,\n methodology.name === \"kanban\"\n ? \"use the service-delivery-review cadence for columns and classes of service\"\n : \"start a new workflow with exwf init to change them\",\n );\n const before = (state.config ?? {}) as Record<string, unknown>;\n const after = methodology.validateConfig({ ...before, ...patch }) as Record<string, unknown>;\n const unknown = Object.keys(patch).filter((k) => !Object.hasOwn(after, k));\n if (unknown.length)\n fail(\n \"invalid-input\",\n `unknown config key(s) ${unknown.join(\", \")}`,\n `known keys: ${Object.keys(after).join(\", \")}`,\n );\n const changed = Object.keys(patch).filter(\n (k) => JSON.stringify(before[k]) !== JSON.stringify(after[k]),\n );\n if (changed.length === 0)\n fail(\n \"no-op\",\n \"config patch changes nothing\",\n \"pass at least one key with a different value to exwf config set\",\n );\n const pick = (o: Record<string, unknown>) => Object.fromEntries(changed.map((k) => [k, o[k]]));\n return applyAction(state, methodology, { type: \"config.change\", by, payload: { patch } }, (s) => {\n const at = nowOf(now);\n let s2 = appendEvent(\n { ...s, config: after },\n \"config.changed\",\n by,\n { changed, before: pick(before), after: pick(after) },\n at,\n );\n if (methodology.afterConfigChange) s2 = methodology.afterConfigChange(s2, at);\n return s2;\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunk5PHK72VM_cjs=require('./chunk-5PHK72VM.cjs'),chunkHIHMBMB5_cjs=require('./chunk-HIHMBMB5.cjs'),chunkCYXVGHQM_cjs=require('./chunk-CYXVGHQM.cjs'),chunkFKTCGQYB_cjs=require('./chunk-FKTCGQYB.cjs'),chunkXMO2RCXB_cjs=require('./chunk-XMO2RCXB.cjs'),chunkYRATJT7P_cjs=require('./chunk-YRATJT7P.cjs'),chunkWOGK54HB_cjs=require('./chunk-WOGK54HB.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),promises=require('fs/promises'),w=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var w__default=/*#__PURE__*/_interopDefault(w);var $={scrum:chunkHIHMBMB5_cjs.l,kanban:chunkCYXVGHQM_cjs.I,waterfall:chunkFKTCGQYB_cjs.N},p=["exwf init <scrum|kanban|waterfall> --config <file> [--roles <file>]","exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]","exwf next [--max n] [--fallback-tokens-per-weight n]","exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--estimate] [--role r]","exwf account <item> [--line n] [--tokens-in n] [--tokens-out n] [--duration-ms n] [--model m] [--by who]","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf config set <patch.json> [--by who] exwf unblock <item> [--blocker id] [--note text] [--by who]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"],at=new Set(["estimate"]);function et(l){let t=[],u={};for(let a=0;a<l.length;a++){let v=l[a];if(v.startsWith("--")){let n=v.slice(2);if(at.has(n)){u[n]="true";continue}let m=l[a+1];(m===void 0||m.startsWith("--"))&&chunkS3BXVHO7_cjs.b("invalid-input",`--${n} needs a value`,`pass --${n} <text>`),u[n]=m,a++;}else t.push(v);}return {positional:t,flags:u}}async function x(l){try{return JSON.parse(await promises.readFile(l,"utf8"))}catch(t){return chunkS3BXVHO7_cjs.b("invalid-input",`cannot read JSON from ${l}: ${t.message}`,"check the path and that the file is valid JSON")}}function h(l){let t=Object.hasOwn($,l.methodology)?$[l.methodology]:void 0;return t||chunkS3BXVHO7_cjs.b("config-invalid",`methodology "${l.methodology}" is not available in this build`,`available: ${Object.keys($).join(", ")}`),t()}function y(l,t){let u=Number(l[t]);return Number.isFinite(u)||chunkS3BXVHO7_cjs.b("invalid-input",`--${t} must be a number (got ${JSON.stringify(l[t])})`,`pass --${t} <n>`),u}var it=new Set(["init","add","edit","next","complete","account","ceremony","decide","unblock"]);async function St(l,t){try{let[u,a]=et(l).positional;return u!==void 0&&(it.has(u)||u==="role"&&a==="add"||u==="config"&&a==="set")?await chunkYRATJT7P_cjs.c(t,()=>tt(l,t)):await tt(l,t)}catch(u){if(u instanceof chunkS3BXVHO7_cjs.a)return {exit:1,out:{ok:false,error:u.toJSON()}};throw u}}async function tt(l,t){let{positional:u,flags:a}=et(l),[v,...n]=u,m=a.by??"human",d=new Date().toISOString();switch(v){case "init":{let[e]=n,o=e&&Object.hasOwn($,e)?$[e]:void 0;if(!o||!a.config)return {exit:2,out:{ok:false,usage:p}};try{await promises.stat(chunkYRATJT7P_cjs.b(t)),chunkS3BXVHO7_cjs.b("invalid-input",`${chunkYRATJT7P_cjs.b(t)} already exists`,"delete .workflow/state.json to start over");}catch(c){if(c instanceof chunkS3BXVHO7_cjs.a||c.code!=="ENOENT")throw c}let s=await x(w__default.default.resolve(t,a.config)),i=a.roles?await x(w__default.default.resolve(t,a.roles)):void 0;if(i!==void 0){Array.isArray(i)||chunkS3BXVHO7_cjs.b("invalid-input",`roles file ${a.roles} must contain an array of role manifests`,"wrap the manifests in [ ... ]");for(let c of i)chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.e,c,`roles file ${a.roles}`);}let r=chunkXMO2RCXB_cjs.Z(i?{methodology:o(),config:s,roles:i,by:m,now:d}:{methodology:o(),config:s,by:m,now:d});return await chunkYRATJT7P_cjs.d(t,r.state),{exit:0,out:{ok:true,warnings:r.warnings,state:{methodology:r.state.methodology,stages:r.state.stages.map(c=>c.id),roles:Object.keys(r.state.roles)}}}}case "add":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=await x(w__default.default.resolve(t,n[0]));chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.f,o,`item file ${n[0]}`);let s=chunkXMO2RCXB_cjs.Y(e,h(e),{type:"item.add",by:m,payload:{item:o}},i=>chunkXMO2RCXB_cjs.v(i,o,m,d));return await chunkYRATJT7P_cjs.d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,item:chunkXMO2RCXB_cjs.u(s.state,o.id)}}}case "edit":{if(!n[0]||!n[1])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=n[0],s=await x(w__default.default.resolve(t,n[1]));chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.g,s,`patch file ${n[1]}`);let i=chunkXMO2RCXB_cjs.Y(e,h(e),{type:"item.edit",by:m,payload:{id:o,patch:s}},r=>chunkXMO2RCXB_cjs.w(r,o,s,m,d));return await chunkYRATJT7P_cjs.d(t,i.state),{exit:0,out:{ok:true,warnings:i.warnings,item:chunkXMO2RCXB_cjs.u(i.state,o)}}}case "next":{let e=await chunkYRATJT7P_cjs.e(t),o={now:d};a.max&&(o.max=y(a,"max")),a["fallback-tokens-per-weight"]&&(o.fallbackTokensPerWeight=y(a,"fallback-tokens-per-weight"));let s=chunk5PHK72VM_cjs.c(e,h(e),o);for(let i of s.briefs)await chunkYRATJT7P_cjs.f(t,i);return await chunkYRATJT7P_cjs.d(t,s.state),{exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!n[0]||!n[1])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=await x(w__default.default.resolve(t,n[1]));chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.h,o,`handoff file ${n[1]}`),o.item!==n[0]&&chunkS3BXVHO7_cjs.b("handoff-invalid",`handoff.item "${o.item}" differs from the command's item "${n[0]}"`,"make them match");let s=a.role??o.role,i=y(a,"duration-ms"),r={item:n[0],role:s,model:a.model??"",tokensIn:y(a,"tokens-in"),tokensOut:y(a,"tokens-out"),durationMs:i,startedAt:new Date(Date.parse(d)-i).toISOString(),endedAt:d};a.estimate==="true"&&(r.estimate=true);let c=chunk5PHK72VM_cjs.d(e,h(e),{...o,role:s},r,d);return await chunkYRATJT7P_cjs.g(t,o,c.state.events.length),await chunkYRATJT7P_cjs.d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,item:chunkXMO2RCXB_cjs.u(c.state,n[0])}}}case "account":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o={};a["tokens-in"]!==void 0&&(o.tokensIn=y(a,"tokens-in")),a["tokens-out"]!==void 0&&(o.tokensOut=y(a,"tokens-out")),a["duration-ms"]!==void 0&&(o.durationMs=y(a,"duration-ms")),a.model!==void 0&&(o.model=a.model);let s=a.line!==void 0?y(a,"line"):void 0,i=chunk5PHK72VM_cjs.e(e,n[0],o,a.by??"human",d,s);await chunkYRATJT7P_cjs.d(t,i);let r=chunkXMO2RCXB_cjs.d(i),c=r.payload.line;return {exit:0,out:{ok:true,line:i.accounting.filter(A=>A.item===n[0])[c-1],event:r}}}case "ceremony":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=h(e),s=Object.hasOwn(o.ceremonies,n[0])?o.ceremonies[n[0]]:void 0;s||chunkS3BXVHO7_cjs.b("unknown-ceremony",`"${n[0]}" is not a ${o.name} ceremony`,`available: ${Object.keys(o.ceremonies).join(", ")}`);let i=n[1]?await x(w__default.default.resolve(t,n[1])):{},r=s(e,{...i,by:m,now:d});return await chunkYRATJT7P_cjs.d(t,r.state),{exit:0,out:{ok:true,warnings:r.warnings,lastEvent:chunkXMO2RCXB_cjs.d(r.state)}}}case "config":{if(n[0]!=="set"||!n[1])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=await x(w__default.default.resolve(t,n[1])),s=chunkXMO2RCXB_cjs._(e,h(e),o,m,d);return await chunkYRATJT7P_cjs.d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,changed:chunkXMO2RCXB_cjs.d(s.state).payload.changed,config:s.state.config}}}case "unblock":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e=n[0],o=await chunkYRATJT7P_cjs.e(t),s=chunkXMO2RCXB_cjs.u(o,e).blockers.filter(O=>!O.clearedAt).map(O=>O.id);s.length===0&&chunkS3BXVHO7_cjs.b("invalid-input",`item ${e} has no open blocker`,"nothing to clear; check exwf board");let i=a.blocker!==void 0?[a.blocker]:s,r=a.note,c=chunkXMO2RCXB_cjs.Y(o,h(o),{type:"blocker.clear",by:m,payload:{id:e,blockers:i,note:r??null}},O=>i.reduce((A,ot)=>chunkXMO2RCXB_cjs.A(A,e,ot,m,d,r),O));return await chunkYRATJT7P_cjs.d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,item:chunkXMO2RCXB_cjs.u(c.state,e)}}}case "decide":{if(!n[0]||n[1]!=="approve"&&n[1]!=="reject")return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=e.pending.find(i=>i.id===n[0]),s=chunkXMO2RCXB_cjs.L(e,n[0],n[1],m,a.note??"",d,h(e));return await chunkYRATJT7P_cjs.d(t,s),{exit:0,out:{ok:true,item:o?.item?chunkXMO2RCXB_cjs.u(s,o.item):null}}}case "status":{let e=await chunkYRATJT7P_cjs.e(t),o=h(e),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let i of Object.values(e.items))s[i.status]+=1;return {exit:0,out:{ok:true,methodology:e.methodology,openIteration:chunkXMO2RCXB_cjs.R(e)??null,counts:s,pending:e.pending,openQuestions:chunk5PHK72VM_cjs.b(e),lastEvent:chunkXMO2RCXB_cjs.d(e),report:o.report?o.report(e):null}}}case "board":{let e=await chunkYRATJT7P_cjs.e(t);return {exit:0,out:{ok:true,columns:e.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(e.items).filter(i=>i.stage===s.id&&i.status!=="dropped").map(i=>({id:i.id,title:i.title,status:i.status,role:i.role??null,age:i.transitions.length?Date.parse(d)-Date.parse(i.transitions[i.transitions.length-1].at):null}))}))}}}case "metrics":{let e=await chunkYRATJT7P_cjs.e(t);return {exit:0,out:{ok:true,metrics:h(e).metrics(e)}}}case "pending":return {exit:0,out:{ok:true,pending:(await chunkYRATJT7P_cjs.e(t)).pending}};case "lessons":return {exit:0,out:{ok:true,lessons:(await chunkYRATJT7P_cjs.e(t)).lessons}};case "validate":{if(!n[0])return {exit:2,out:{ok:false,usage:p}};let e=await chunkYRATJT7P_cjs.e(t),o=await x(w__default.default.resolve(t,n[0]));return {exit:0,out:{ok:true,violations:chunkXMO2RCXB_cjs.X(e,h(e),o)}}}case "role":{let e=await chunkYRATJT7P_cjs.e(t);if(n[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(e.roles),detail:e.roles}};if(n[0]==="add"&&n[1]){let o=await x(w__default.default.resolve(t,n[1]));chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.e,o,`role manifest ${n[1]}`);let s=chunkXMO2RCXB_cjs.f(e,o,m,d);return await chunkYRATJT7P_cjs.d(t,s),{exit:0,out:{ok:true,roles:Object.keys(s.roles)}}}return {exit:2,out:{ok:false,usage:p}}}default:return {exit:2,out:{ok:false,usage:p}}}}exports.a=p;exports.b=et;exports.c=St;//# sourceMappingURL=chunk-YJN4JEJU.cjs.map
2
+ //# sourceMappingURL=chunk-YJN4JEJU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","waterfall","USAGE","BOOLEAN_FLAGS","parseArgs","argv","positional","flags","i","a","key","val","fail","readJson","file","readFile","e","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","withStateLock","execute","WorkflowError","rest","by","now","name","stat","statePath","config","path","roles","r","assertValid","roleSchema","res","init","saveState","s","loadState","item","newItemSchema","applyAction","addItem","getItem","id","patch","itemPatchSchema","editItem","opts","next","b","saveBrief","handoff","handoffSchema","role","durationMs","acc","complete","saveHandoff","line","s2","correctAccounting","ev","lastEvent","idx","m","c","input","changeConfig","open","blockers","note","clearBlocker","entry","p","decide","counts","openIteration","openQuestions","st","action","validateAction","manifest","registerRole"],"mappings":"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","file":"chunk-YJN4JEJU.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, openQuestions } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { correctAccounting, type AccountingPatch } from \"../accounting.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, clearBlocker, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { applyAction, changeConfig, init, validateAction } from \"../methodology.ts\";\nimport { openIteration, type PlanOptions } from \"../planner.ts\";\nimport { registerRole } from \"../roles.ts\";\nimport {\n assertValid,\n handoffSchema,\n itemPatchSchema,\n newItemSchema,\n roleSchema,\n} from \"../schema/index.ts\";\nimport { lastEvent } from \"../state.ts\";\nimport { scrum } from \"../scrum/index.ts\";\nimport { kanban } from \"../kanban/index.ts\";\nimport { waterfall } from \"../waterfall/index.ts\";\nimport type {\n Accounting,\n Action,\n Handoff,\n ItemStatus,\n Methodology,\n NewItem,\n Role,\n WorkflowState,\n} from \"../types.ts\";\n\nconst METHODOLOGIES: Record<string, () => Methodology> = {\n scrum: scrum as () => Methodology,\n kanban: kanban as () => Methodology,\n waterfall: waterfall as () => Methodology,\n};\n\nexport const USAGE = [\n \"exwf init <scrum|kanban|waterfall> --config <file> [--roles <file>]\",\n \"exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]\",\n \"exwf next [--max n] [--fallback-tokens-per-weight n]\",\n \"exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--estimate] [--role r]\",\n \"exwf account <item> [--line n] [--tokens-in n] [--tokens-out n] [--duration-ms n] [--model m] [--by who]\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf config set <patch.json> [--by who] exwf unblock <item> [--blocker id] [--note text] [--by who]\",\n \"exwf status | board | metrics | pending | lessons\",\n \"exwf validate <action.json> exwf role add <manifest.json> | role list\",\n];\n\nexport interface Parsed {\n positional: string[];\n flags: Record<string, string>;\n}\n/** Flags that take no value; every other flag needs one. */\nconst BOOLEAN_FLAGS = new Set([\"estimate\"]);\n\nexport function parseArgs(argv: string[]): Parsed {\n const positional: string[] = [];\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n if (BOOLEAN_FLAGS.has(key)) {\n flags[key] = \"true\";\n continue;\n }\n const val = argv[i + 1];\n if (val === undefined || val.startsWith(\"--\"))\n fail(\"invalid-input\", `--${key} needs a value`, `pass --${key} <text>`);\n flags[key] = val;\n i++;\n } else positional.push(a);\n }\n return { positional, flags };\n}\n\nasync function readJson<T>(file: string): Promise<T> {\n try {\n return JSON.parse(await readFile(file, \"utf8\")) as T;\n } catch (e) {\n return fail(\n \"invalid-input\",\n `cannot read JSON from ${file}: ${(e as Error).message}`,\n \"check the path and that the file is valid JSON\",\n );\n }\n}\n\nfunction methodologyOf(state: WorkflowState): Methodology {\n const f = Object.hasOwn(METHODOLOGIES, state.methodology)\n ? METHODOLOGIES[state.methodology]\n : undefined;\n if (!f)\n fail(\n \"config-invalid\",\n `methodology \"${state.methodology}\" is not available in this build`,\n `available: ${Object.keys(METHODOLOGIES).join(\", \")}`,\n );\n return f();\n}\n\nfunction num(flags: Record<string, string>, key: string): number {\n const v = Number(flags[key]);\n if (!Number.isFinite(v))\n fail(\n \"invalid-input\",\n `--${key} must be a number (got ${JSON.stringify(flags[key])})`,\n `pass --${key} <n>`,\n );\n return v;\n}\n\nexport interface CommandResult {\n exit: 0 | 1 | 2;\n out: unknown;\n}\n\n/** Commands that load, change and save the state: they run under .workflow/state.lock. */\nconst WRITERS = new Set([\n \"init\",\n \"add\",\n \"edit\",\n \"next\",\n \"complete\",\n \"account\",\n \"ceremony\",\n \"decide\",\n \"unblock\",\n]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n try {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes =\n cmd !== undefined &&\n (WRITERS.has(cmd) ||\n (cmd === \"role\" && sub === \"add\") ||\n (cmd === \"config\" && sub === \"set\"));\n return writes ? await withStateLock(cwd, () => execute(argv, cwd)) : await execute(argv, cwd);\n } catch (e) {\n if (e instanceof WorkflowError) return { exit: 1, out: { ok: false, error: e.toJSON() } };\n throw e;\n }\n}\n\nasync function execute(argv: string[], cwd: string): Promise<CommandResult> {\n const { positional, flags } = parseArgs(argv);\n const [cmd, ...rest] = positional;\n const by = flags[\"by\"] ?? \"human\";\n const now = new Date().toISOString();\n switch (cmd) {\n case \"init\": {\n const [name] = rest;\n const f = name && Object.hasOwn(METHODOLOGIES, name) ? METHODOLOGIES[name] : undefined;\n if (!f || !flags[\"config\"]) return { exit: 2, out: { ok: false, usage: USAGE } };\n try {\n await stat(statePath(cwd));\n fail(\n \"invalid-input\",\n `${statePath(cwd)} already exists`,\n \"delete .workflow/state.json to start over\",\n );\n } catch (e) {\n if (e instanceof WorkflowError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n }\n const config = await readJson<unknown>(path.resolve(cwd, flags[\"config\"]));\n const roles = flags[\"roles\"]\n ? await readJson<Role[]>(path.resolve(cwd, flags[\"roles\"]))\n : undefined;\n if (roles !== undefined) {\n if (!Array.isArray(roles))\n fail(\n \"invalid-input\",\n `roles file ${flags[\"roles\"]} must contain an array of role manifests`,\n \"wrap the manifests in [ ... ]\",\n );\n for (const r of roles) assertValid(roleSchema, r, `roles file ${flags[\"roles\"]}`);\n }\n const res = init(\n roles\n ? { methodology: f(), config, roles, by, now }\n : { methodology: f(), config, by, now },\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n state: {\n methodology: res.state.methodology,\n stages: res.state.stages.map((s) => s.id),\n roles: Object.keys(res.state.roles),\n },\n },\n };\n }\n case \"add\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const item = await readJson<NewItem>(path.resolve(cwd, rest[0]));\n assertValid(newItemSchema, item, `item file ${rest[0]}`);\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"item.add\", by, payload: { item } },\n (s) => addItem(s, item, by, now),\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n item: getItem(res.state, item.id),\n },\n };\n }\n case \"edit\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const id = rest[0];\n const patch = await readJson<ItemPatch>(path.resolve(cwd, rest[1]));\n assertValid(itemPatchSchema, patch, `patch file ${rest[1]}`);\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"item.edit\", by, payload: { id, patch } },\n (s) => editItem(s, id, patch, by, now),\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, id) },\n };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts: PlanOptions = { now };\n if (flags[\"max\"]) opts.max = num(flags, \"max\");\n if (flags[\"fallback-tokens-per-weight\"])\n opts.fallbackTokensPerWeight = num(flags, \"fallback-tokens-per-weight\");\n const res = planNext(state, methodologyOf(state), opts);\n // briefs first: a crash then leaves an orphan brief (overwritten next dispatch), never a dispatched item without one\n for (const b of res.briefs) await saveBrief(cwd, b);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n reason: res.reason ?? null,\n skipped: res.skipped,\n briefs: res.briefs,\n },\n };\n }\n case \"complete\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const handoff = await readJson<Handoff>(path.resolve(cwd, rest[1]));\n assertValid(handoffSchema, handoff, `handoff file ${rest[1]}`);\n if (handoff.item !== rest[0])\n fail(\n \"handoff-invalid\",\n `handoff.item \"${handoff.item}\" differs from the command's item \"${rest[0]}\"`,\n \"make them match\",\n );\n const role = flags[\"role\"] ?? handoff.role;\n const durationMs = num(flags, \"duration-ms\");\n const acc: Accounting = {\n item: rest[0],\n role,\n model: flags[\"model\"] ?? \"\",\n tokensIn: num(flags, \"tokens-in\"),\n tokensOut: num(flags, \"tokens-out\"),\n durationMs,\n startedAt: new Date(Date.parse(now) - durationMs).toISOString(),\n endedAt: now,\n };\n if (flags[\"estimate\"] === \"true\") acc.estimate = true;\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n // handoff first: a retry of the same command reproduces the same seq and overwrites an orphan\n await saveHandoff(cwd, handoff, res.state.events.length);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n item: getItem(res.state, rest[0]),\n },\n };\n }\n case \"account\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const patch: AccountingPatch = {};\n if (flags[\"tokens-in\"] !== undefined) patch.tokensIn = num(flags, \"tokens-in\");\n if (flags[\"tokens-out\"] !== undefined) patch.tokensOut = num(flags, \"tokens-out\");\n if (flags[\"duration-ms\"] !== undefined) patch.durationMs = num(flags, \"duration-ms\");\n if (flags[\"model\"] !== undefined) patch.model = flags[\"model\"];\n const line = flags[\"line\"] !== undefined ? num(flags, \"line\") : undefined;\n const s2 = correctAccounting(state, rest[0], patch, flags[\"by\"] ?? \"human\", now, line);\n await saveState(cwd, s2);\n const ev = lastEvent(s2)!;\n const idx = (ev.payload as { line: number }).line;\n const mine = s2.accounting.filter((a) => a.item === rest[0]);\n return { exit: 0, out: { ok: true, line: mine[idx - 1], event: ev } };\n }\n case \"ceremony\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const c = Object.hasOwn(m.ceremonies, rest[0]) ? m.ceremonies[rest[0]] : undefined;\n if (!c)\n fail(\n \"unknown-ceremony\",\n `\"${rest[0]}\" is not a ${m.name} ceremony`,\n `available: ${Object.keys(m.ceremonies).join(\", \")}`,\n );\n const input = rest[1]\n ? await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]))\n : {};\n const res = c(state, { ...input, by, now });\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n lastEvent: lastEvent(res.state),\n },\n };\n }\n case \"config\": {\n if (rest[0] !== \"set\" || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const patch = await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]));\n const res = changeConfig(state, methodologyOf(state), patch, by, now);\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n changed: (lastEvent(res.state)!.payload as { changed: string[] }).changed,\n config: res.state.config,\n },\n };\n }\n case \"unblock\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const id = rest[0];\n const state = await loadState(cwd);\n const open = getItem(state, id)\n .blockers.filter((b) => !b.clearedAt)\n .map((b) => b.id);\n if (open.length === 0)\n fail(\n \"invalid-input\",\n `item ${id} has no open blocker`,\n \"nothing to clear; check exwf board\",\n );\n const blockers = flags[\"blocker\"] !== undefined ? [flags[\"blocker\"]] : open;\n const note = flags[\"note\"];\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"blocker.clear\", by, payload: { id, blockers, note: note ?? null } },\n (s) => blockers.reduce((acc, b) => clearBlocker(acc, id, b, by, now, note), s),\n );\n await saveState(cwd, res.state);\n return { exit: 0, out: { ok: true, warnings: res.warnings, item: getItem(res.state, id) } };\n }\n case \"decide\": {\n if (!rest[0] || (rest[1] !== \"approve\" && rest[1] !== \"reject\"))\n return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const entry = state.pending.find((p) => p.id === rest[0]);\n const s2 = decide(\n state,\n rest[0],\n rest[1],\n by,\n flags[\"note\"] ?? \"\",\n now,\n methodologyOf(state),\n );\n await saveState(cwd, s2);\n return {\n exit: 0,\n out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null },\n };\n }\n case \"status\": {\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const counts: Record<ItemStatus, number> = {\n todo: 0,\n in_progress: 0,\n blocked: 0,\n review: 0,\n awaiting_human: 0,\n done: 0,\n dropped: 0,\n };\n for (const i of Object.values(state.items)) counts[i.status] += 1;\n return {\n exit: 0,\n out: {\n ok: true,\n methodology: state.methodology,\n openIteration: openIteration(state) ?? null,\n counts,\n pending: state.pending,\n openQuestions: openQuestions(state),\n lastEvent: lastEvent(state),\n report: m.report ? m.report(state) : null,\n },\n };\n }\n case \"board\": {\n const state = await loadState(cwd);\n const columns = state.stages.map((st) => ({\n stage: st.id,\n wipLimit: st.wipLimit ?? null,\n items: Object.values(state.items)\n .filter((i) => i.stage === st.id && i.status !== \"dropped\")\n .map((i) => ({\n id: i.id,\n title: i.title,\n status: i.status,\n role: i.role ?? null,\n age: i.transitions.length\n ? Date.parse(now) - Date.parse(i.transitions[i.transitions.length - 1]!.at)\n : null,\n })),\n }));\n return { exit: 0, out: { ok: true, columns } };\n }\n case \"metrics\": {\n const state = await loadState(cwd);\n return {\n exit: 0,\n out: { ok: true, metrics: methodologyOf(state).metrics(state) },\n };\n }\n case \"pending\":\n return {\n exit: 0,\n out: { ok: true, pending: (await loadState(cwd)).pending },\n };\n case \"lessons\":\n return {\n exit: 0,\n out: { ok: true, lessons: (await loadState(cwd)).lessons },\n };\n case \"validate\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const action = await readJson<Action>(path.resolve(cwd, rest[0]));\n return {\n exit: 0,\n out: {\n ok: true,\n violations: validateAction(state, methodologyOf(state), action),\n },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: {\n ok: true,\n roles: Object.keys(state.roles),\n detail: state.roles,\n },\n };\n if (rest[0] === \"add\" && rest[1]) {\n const manifest = await readJson<Role>(path.resolve(cwd, rest[1]));\n assertValid(roleSchema, manifest, `role manifest ${rest[1]}`);\n const s2 = registerRole(state, manifest, by, now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, roles: Object.keys(s2.roles) } };\n }\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n default:\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ 'use strict';var chunkWOGK54HB_cjs=require('./chunk-WOGK54HB.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),promises=require('fs/promises'),crypto=require('crypto'),n=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var n__default=/*#__PURE__*/_interopDefault(n);var m=".workflow";function v(t){return n__default.default.join(t,m,"state.json")}async function y(t,e){let i=`${t}.tmp-${process.pid}-${crypto.randomBytes(4).toString("hex")}`;try{await promises.mkdir(n__default.default.dirname(t),{recursive:!0}),await promises.writeFile(i,e,"utf8"),await promises.rename(i,t);}catch(r){await promises.unlink(i).catch(()=>{}),chunkS3BXVHO7_cjs.b("invalid-input",`cannot write ${t}: ${r.message}`,"check the directory exists and is writable");}}async function T(t,e,i={}){let{retries:r=40,intervalMs:w=50,staleMs:u=6e4}=i,s=n__default.default.join(t,m,"state.lock");await promises.mkdir(n__default.default.dirname(s),{recursive:true});let d=false;for(let f=0;!d;f++)try{let a=await promises.open(s,"wx");await a.writeFile(`${process.pid} ${new Date().toISOString()}
2
+ `),await a.close(),d=!0;}catch(a){if(a.code!=="EEXIST")throw a;let o=await promises.stat(s).catch(()=>{});if(o&&Date.now()-o.mtimeMs>u){let l=await promises.stat(s).catch(()=>{});l&&l.ino===o.ino&&l.mtimeMs===o.mtimeMs&&await promises.unlink(s).catch(()=>{});continue}f>=r&&chunkS3BXVHO7_cjs.b("invalid-input","another exwf command holds .workflow/state.lock","retry, or delete the file if no exwf process is running"),await new Promise(l=>setTimeout(l,w));}try{return await e()}finally{await promises.unlink(s).catch(()=>{});}}async function B(t,e){let i=JSON.stringify(e,null,2)+`
3
+ `;chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.d,JSON.parse(i),v(t)),await y(v(t),i);}async function F(t){let e=v(t),i;try{i=await promises.readFile(e,"utf8");}catch{chunkS3BXVHO7_cjs.b("invalid-input",`no workflow state at ${e}`,"run `exwf init <scrum|kanban|waterfall> --config <file>` in this directory first");}let r;try{r=JSON.parse(i);}catch(f){chunkS3BXVHO7_cjs.b("invalid-input",`${e} is not valid JSON: ${f.message}`,"restore it from git or re-run exwf init");}(typeof r!="object"||r===null||Array.isArray(r))&&chunkS3BXVHO7_cjs.b("invalid-input",`${e} does not contain a workflow state object`,"restore it from git or re-run exwf init");let w=r;w.version!==1&&chunkS3BXVHO7_cjs.b("state-version",`${e} has schema version ${String(w.version)}; this ex-workflow reads version 1`,"upgrade ex-workflow, or run the migration this version documents in its changelog"),chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.d,r,e);let u=n__default.default.join(t,m,"roles"),s=[];try{s=(await promises.readdir(u)).filter(f=>f.endsWith(".json"));}catch{}let d={...w.roles};for(let f of s){let a=n__default.default.join(u,f),o;try{o=JSON.parse(await promises.readFile(a,"utf8"));}catch(l){chunkS3BXVHO7_cjs.b("invalid-input",`role manifest ${a} is not valid JSON: ${l.message}`,"fix or delete that manifest");}chunkWOGK54HB_cjs.b(chunkWOGK54HB_cjs.e,o,`role manifest ${a}`),d[o.id]||(d[o.id]=o);}return {...w,roles:d}}function j(t,e){return n__default.default.resolve(e).startsWith(n__default.default.resolve(t,m)+n__default.default.sep)||chunkS3BXVHO7_cjs.b("invalid-input",`${e} resolves outside ${m}/`,"use a plain item id (letters, digits, - _ .)"),e}async function L(t,e){let i=j(t,n__default.default.join(t,m,"briefs",`${e.item.id}.json`));return await y(i,JSON.stringify(e,null,2)+`
4
+ `),i}async function A(t,e,i){let r=j(t,n__default.default.join(t,m,"handoffs",`${e.item}-${i}.json`));return await y(r,JSON.stringify(e,null,2)+`
5
+ `),r}exports.a=m;exports.b=v;exports.c=T;exports.d=B;exports.e=F;exports.f=L;exports.g=A;//# sourceMappingURL=chunk-YRATJT7P.cjs.map
6
+ //# sourceMappingURL=chunk-YRATJT7P.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/file.ts"],"names":["WORKFLOW_DIR","statePath","root","path","writeAtomic","file","content","tmp","randomBytes","mkdir","writeFile","rename","e","unlink","fail","withStateLock","fn","opts","retries","intervalMs","staleMs","lock","held","attempt","fh","open","snap","stat","now","resolve","saveState","state","json","assertValid","workflowStateSchema","loadState","raw","readFile","parsed","rolesDir","manifests","readdir","roles","manifestPath","role","roleSchema","inWorkflowDir","saveBrief","brief","saveHandoff","handoff","seq"],"mappings":"gTAOO,IAAMA,EAAe,YAErB,SAASC,EAAUC,CAAAA,CAAsB,CAC9C,OAAOC,kBAAAA,CAAK,KAAKD,CAAAA,CAAMF,CAAAA,CAAc,YAAY,CACnD,CAEA,eAAeI,CAAAA,CAAYC,CAAAA,CAAcC,CAAAA,CAAgC,CACvE,IAAMC,CAAAA,CAAM,CAAA,EAAGF,CAAI,CAAA,KAAA,EAAQ,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAIG,kBAAAA,CAAY,CAAC,CAAA,CAAE,SAAS,KAAK,CAAC,GACxE,GAAI,CACF,MAAMC,cAAAA,CAAMN,kBAAAA,CAAK,OAAA,CAAQE,CAAI,EAAG,CAAE,SAAA,CAAW,EAAK,CAAC,CAAA,CACnD,MAAMK,kBAAAA,CAAUH,CAAAA,CAAKD,EAAS,MAAM,CAAA,CACpC,MAAMK,eAAAA,CAAOJ,CAAAA,CAAKF,CAAI,EACxB,CAAA,MAASO,EAAG,CAEV,MAAMC,eAAAA,CAAON,CAAG,EAAE,KAAA,CAAM,IAAG,EAAY,CAAA,CACvCO,mBAAAA,CACE,gBACA,CAAA,aAAA,EAAgBT,CAAI,CAAA,EAAA,EAAMO,CAAAA,CAAY,OAAO,CAAA,CAAA,CAC7C,4CACF,EACF,CACF,CASA,eAAsBG,CAAAA,CACpBb,CAAAA,CACAc,CAAAA,CACAC,CAAAA,CAAoB,EAAC,CACT,CACZ,GAAM,CAAE,OAAA,CAAAC,EAAU,EAAA,CAAI,UAAA,CAAAC,CAAAA,CAAa,EAAA,CAAI,QAAAC,CAAAA,CAAU,GAAO,EAAIH,CAAAA,CACtDI,CAAAA,CAAOlB,mBAAK,IAAA,CAAKD,CAAAA,CAAMF,CAAAA,CAAc,YAAY,EACvD,MAAMS,cAAAA,CAAMN,mBAAK,OAAA,CAAQkB,CAAI,EAAG,CAAE,SAAA,CAAW,IAAK,CAAC,EACnD,IAAIC,CAAAA,CAAO,MACX,IAAA,IAASC,CAAAA,CAAU,EAAG,CAACD,CAAAA,CAAMC,CAAAA,EAAAA,CAC3B,GAAI,CACF,IAAMC,CAAAA,CAAK,MAAMC,aAAAA,CAAKJ,CAAAA,CAAM,IAAI,CAAA,CAChC,MAAMG,EAAG,SAAA,CAAU,CAAA,EAAG,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,IAAA,EAAK,CAAE,aAAa;AAAA,CAAI,CAAA,CACjE,MAAMA,CAAAA,CAAG,KAAA,EAAM,CACfF,EAAO,CAAA,EACT,CAAA,MAASV,CAAAA,CAAG,CACV,GAAKA,CAAAA,CAA4B,OAAS,QAAA,CAAU,MAAMA,CAAAA,CAC1D,IAAMc,CAAAA,CAAO,MAAMC,cAAKN,CAAI,CAAA,CAAE,KAAA,CAAM,IAAG,CAAA,CAAY,CAAA,CACnD,GAAIK,CAAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,CAAIA,CAAAA,CAAK,OAAA,CAAUN,EAAS,CAE/C,IAAMQ,CAAAA,CAAM,MAAMD,aAAAA,CAAKN,CAAI,EAAE,KAAA,CAAM,IAAG,CAAA,CAAY,CAAA,CAC9CO,CAAAA,EAAOA,CAAAA,CAAI,GAAA,GAAQF,CAAAA,CAAK,GAAA,EAAOE,CAAAA,CAAI,OAAA,GAAYF,CAAAA,CAAK,OAAA,EACtD,MAAMb,gBAAOQ,CAAI,CAAA,CAAE,KAAA,CAAM,IAAG,CAAA,CAAY,CAAA,CAC1C,QACF,CACIE,CAAAA,EAAWL,CAAAA,EACbJ,mBAAAA,CACE,eAAA,CACA,iDAAA,CACA,yDACF,CAAA,CACF,MAAM,IAAI,OAAA,CAASe,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAASV,CAAU,CAAC,EAChE,CAEF,GAAI,CACF,OAAO,MAAMH,CAAAA,EACf,CAAA,OAAE,CACA,MAAMH,eAAAA,CAAOQ,CAAI,CAAA,CAAE,KAAA,CAAM,IAAG,CAAA,CAAY,EAC1C,CACF,CAEA,eAAsBS,CAAAA,CAAU5B,CAAAA,CAAc6B,CAAAA,CAAqC,CACjF,IAAMC,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAUD,CAAAA,CAAO,IAAA,CAAM,CAAC,CAAA,CAAI;AAAA,CAAA,CAC9CE,mBAAAA,CAAYC,mBAAAA,CAAqB,IAAA,CAAK,KAAA,CAAMF,CAAI,CAAA,CAAG/B,CAAAA,CAAUC,CAAI,CAAC,CAAA,CAClE,MAAME,CAAAA,CAAYH,CAAAA,CAAUC,CAAI,CAAA,CAAG8B,CAAI,EACzC,CAEA,eAAsBG,CAAAA,CAAUjC,CAAAA,CAAsC,CACpE,IAAMG,CAAAA,CAAOJ,CAAAA,CAAUC,CAAI,CAAA,CACvBkC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAM,MAAMC,iBAAAA,CAAShC,CAAAA,CAAM,MAAM,EACnC,CAAA,KAAQ,CACNS,mBAAAA,CACE,eAAA,CACA,CAAA,qBAAA,EAAwBT,CAAI,CAAA,CAAA,CAC5B,kFACF,EACF,CACA,IAAIiC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMF,CAAG,EACzB,CAAA,MAASxB,CAAAA,CAAG,CACVE,mBAAAA,CACE,eAAA,CACA,CAAA,EAAGT,CAAI,uBAAwBO,CAAAA,CAAY,OAAO,CAAA,CAAA,CAClD,yCACF,EACF,CAAA,CACI,OAAO0B,CAAAA,EAAW,QAAA,EAAYA,CAAAA,GAAW,IAAA,EAAQ,KAAA,CAAM,OAAA,CAAQA,CAAM,CAAA,GACvExB,mBAAAA,CACE,eAAA,CACA,CAAA,EAAGT,CAAI,CAAA,yCAAA,CAAA,CACP,yCACF,CAAA,CAEF,IAAM0B,CAAAA,CAAQO,CAAAA,CACVP,CAAAA,CAAM,OAAA,GAAY,CAAA,EACpBjB,mBAAAA,CACE,eAAA,CACA,CAAA,EAAGT,CAAI,uBAAuB,MAAA,CAAO0B,CAAAA,CAAM,OAAO,CAAC,CAAA,kCAAA,CAAA,CACnD,mFACF,CAAA,CACFE,mBAAAA,CAAYC,mBAAAA,CAAqBI,CAAAA,CAAQjC,CAAI,CAAA,CAC7C,IAAMkC,CAAAA,CAAWpC,kBAAAA,CAAK,IAAA,CAAKD,EAAMF,CAAAA,CAAc,OAAO,CAAA,CAClDwC,CAAAA,CAAsB,EAAC,CAC3B,GAAI,CACFA,CAAAA,CAAAA,CAAa,MAAMC,gBAAAA,CAAQF,CAAQ,CAAA,EAAG,MAAA,CAAQ,CAAA,EAAM,CAAA,CAAE,SAAS,OAAO,CAAC,EACzE,CAAA,KAAQ,CAER,CACA,IAAMG,CAAAA,CAAQ,CAAE,GAAGX,CAAAA,CAAM,KAAM,CAAA,CAC/B,IAAA,IAAW,CAAA,IAAKS,CAAAA,CAAW,CACzB,IAAMG,CAAAA,CAAexC,kBAAAA,CAAK,IAAA,CAAKoC,CAAAA,CAAU,CAAC,CAAA,CACtCK,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAMP,iBAAAA,CAASM,EAAc,MAAM,CAAC,EACxD,CAAA,MAAS/B,CAAAA,CAAG,CACVE,mBAAAA,CACE,eAAA,CACA,CAAA,cAAA,EAAiB6B,CAAY,CAAA,oBAAA,EAAwB/B,CAAAA,CAAY,OAAO,CAAA,CAAA,CACxE,6BACF,EACF,CACAqB,mBAAAA,CAAYY,mBAAAA,CAAYD,CAAAA,CAAM,CAAA,cAAA,EAAiBD,CAAY,CAAA,CAAE,CAAA,CACxDD,CAAAA,CAAME,CAAAA,CAAK,EAAE,CAAA,GAAGF,CAAAA,CAAME,CAAAA,CAAK,EAAE,CAAA,CAAIA,CAAAA,EACxC,CACA,OAAO,CAAE,GAAGb,CAAAA,CAAO,KAAA,CAAAW,CAAM,CAC3B,CAEA,SAASI,CAAAA,CAAc5C,CAAAA,CAAcG,CAAAA,CAAsB,CACzD,OAAKF,kBAAAA,CAAK,OAAA,CAAQE,CAAI,CAAA,CAAE,UAAA,CAAWF,kBAAAA,CAAK,OAAA,CAAQD,CAAAA,CAAMF,CAAY,CAAA,CAAIG,kBAAAA,CAAK,GAAG,CAAA,EAC5EW,mBAAAA,CACE,eAAA,CACA,CAAA,EAAGT,CAAI,CAAA,kBAAA,EAAqBL,CAAY,CAAA,CAAA,CAAA,CACxC,8CACF,CAAA,CACKK,CACT,CAEA,eAAsB0C,CAAAA,CAAU7C,CAAAA,CAAc8C,CAAAA,CAA+B,CAC3E,IAAM3C,CAAAA,CAAOyC,CAAAA,CACX5C,CAAAA,CACAC,kBAAAA,CAAK,IAAA,CAAKD,EAAMF,CAAAA,CAAc,QAAA,CAAU,CAAA,EAAGgD,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,KAAA,CAAO,CACjE,CAAA,CACA,OAAA,MAAM5C,CAAAA,CAAYC,CAAAA,CAAM,IAAA,CAAK,SAAA,CAAU2C,CAAAA,CAAO,IAAA,CAAM,CAAC,CAAA,CAAI;AAAA,CAAI,CAAA,CACtD3C,CACT,CAEA,eAAsB4C,EAAY/C,CAAAA,CAAcgD,CAAAA,CAAkBC,CAAAA,CAA8B,CAC9F,IAAM9C,CAAAA,CAAOyC,CAAAA,CACX5C,CAAAA,CACAC,kBAAAA,CAAK,KAAKD,CAAAA,CAAMF,CAAAA,CAAc,UAAA,CAAY,CAAA,EAAGkD,CAAAA,CAAQ,IAAI,CAAA,CAAA,EAAIC,CAAG,OAAO,CACzE,CAAA,CACA,OAAA,MAAM/C,CAAAA,CAAYC,EAAM,IAAA,CAAK,SAAA,CAAU6C,CAAAA,CAAS,IAAA,CAAM,CAAC,CAAA,CAAI;AAAA,CAAI,EACxD7C,CACT","file":"chunk-YRATJT7P.cjs","sourcesContent":["import { mkdir, open, readFile, readdir, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport { fail } from \"../errors.ts\";\nimport { assertValid, roleSchema, workflowStateSchema } from \"../schema/index.ts\";\nimport type { Brief, Handoff, Role, WorkflowState } from \"../types.ts\";\n\nexport const WORKFLOW_DIR = \".workflow\";\n\nexport function statePath(root: string): string {\n return path.join(root, WORKFLOW_DIR, \"state.json\");\n}\n\nasync function writeAtomic(file: string, content: string): Promise<void> {\n const tmp = `${file}.tmp-${process.pid}-${randomBytes(4).toString(\"hex\")}`;\n try {\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(tmp, content, \"utf8\");\n await rename(tmp, file);\n } catch (e) {\n // best effort: remove the temp file if it was created; ignore failure\n await unlink(tmp).catch(() => undefined);\n fail(\n \"invalid-input\",\n `cannot write ${file}: ${(e as Error).message}`,\n \"check the directory exists and is writable\",\n );\n }\n}\n\nexport interface LockOptions {\n retries?: number;\n intervalMs?: number;\n staleMs?: number;\n}\n\n/** Run `fn` while holding `.workflow/state.lock`, so concurrent exwf commands cannot lose each other's updates. */\nexport async function withStateLock<T>(\n root: string,\n fn: () => Promise<T>,\n opts: LockOptions = {},\n): Promise<T> {\n const { retries = 40, intervalMs = 50, staleMs = 60_000 } = opts;\n const lock = path.join(root, WORKFLOW_DIR, \"state.lock\");\n await mkdir(path.dirname(lock), { recursive: true });\n let held = false;\n for (let attempt = 0; !held; attempt++) {\n try {\n const fh = await open(lock, \"wx\");\n await fh.writeFile(`${process.pid} ${new Date().toISOString()}\\n`);\n await fh.close();\n held = true;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"EEXIST\") throw e;\n const snap = await stat(lock).catch(() => undefined);\n if (snap && Date.now() - snap.mtimeMs > staleMs) {\n // re-stat just before unlink: if another recoverer already replaced the lock, leave it alone\n const now = await stat(lock).catch(() => undefined);\n if (now && now.ino === snap.ino && now.mtimeMs === snap.mtimeMs)\n await unlink(lock).catch(() => undefined);\n continue;\n }\n if (attempt >= retries)\n fail(\n \"invalid-input\",\n \"another exwf command holds .workflow/state.lock\",\n \"retry, or delete the file if no exwf process is running\",\n );\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n try {\n return await fn();\n } finally {\n await unlink(lock).catch(() => undefined);\n }\n}\n\nexport async function saveState(root: string, state: WorkflowState): Promise<void> {\n const json = JSON.stringify(state, null, 2) + \"\\n\";\n assertValid(workflowStateSchema, JSON.parse(json), statePath(root));\n await writeAtomic(statePath(root), json);\n}\n\nexport async function loadState(root: string): Promise<WorkflowState> {\n const file = statePath(root);\n let raw: string;\n try {\n raw = await readFile(file, \"utf8\");\n } catch {\n fail(\n \"invalid-input\",\n `no workflow state at ${file}`,\n \"run `exwf init <scrum|kanban|waterfall> --config <file>` in this directory first\",\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n fail(\n \"invalid-input\",\n `${file} is not valid JSON: ${(e as Error).message}`,\n \"restore it from git or re-run exwf init\",\n );\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n fail(\n \"invalid-input\",\n `${file} does not contain a workflow state object`,\n \"restore it from git or re-run exwf init\",\n );\n }\n const state = parsed as WorkflowState;\n if (state.version !== 1)\n fail(\n \"state-version\",\n `${file} has schema version ${String(state.version)}; this ex-workflow reads version 1`,\n \"upgrade ex-workflow, or run the migration this version documents in its changelog\",\n );\n assertValid(workflowStateSchema, parsed, file);\n const rolesDir = path.join(root, WORKFLOW_DIR, \"roles\");\n let manifests: string[] = [];\n try {\n manifests = (await readdir(rolesDir)).filter((f) => f.endsWith(\".json\"));\n } catch {\n /* no extra roles */\n }\n const roles = { ...state.roles };\n for (const f of manifests) {\n const manifestPath = path.join(rolesDir, f);\n let role: Role;\n try {\n role = JSON.parse(await readFile(manifestPath, \"utf8\")) as Role;\n } catch (e) {\n fail(\n \"invalid-input\",\n `role manifest ${manifestPath} is not valid JSON: ${(e as Error).message}`,\n \"fix or delete that manifest\",\n );\n }\n assertValid(roleSchema, role, `role manifest ${manifestPath}`);\n if (!roles[role.id]) roles[role.id] = role;\n }\n return { ...state, roles };\n}\n\nfunction inWorkflowDir(root: string, file: string): string {\n if (!path.resolve(file).startsWith(path.resolve(root, WORKFLOW_DIR) + path.sep))\n fail(\n \"invalid-input\",\n `${file} resolves outside ${WORKFLOW_DIR}/`,\n \"use a plain item id (letters, digits, - _ .)\",\n );\n return file;\n}\n\nexport async function saveBrief(root: string, brief: Brief): Promise<string> {\n const file = inWorkflowDir(\n root,\n path.join(root, WORKFLOW_DIR, \"briefs\", `${brief.item.id}.json`),\n );\n await writeAtomic(file, JSON.stringify(brief, null, 2) + \"\\n\");\n return file;\n}\n\nexport async function saveHandoff(root: string, handoff: Handoff, seq: number): Promise<string> {\n const file = inWorkflowDir(\n root,\n path.join(root, WORKFLOW_DIR, \"handoffs\", `${handoff.item}-${seq}.json`),\n );\n await writeAtomic(file, JSON.stringify(handoff, null, 2) + \"\\n\");\n return file;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {e,R,p,O,V,Y as Y$1,a,y,u,N,c,v,B,x,G,J as J$1,K as K$1,C as C$1,z,i,s,H}from'./chunk-YBHHICTZ.mjs';import {b}from'./chunk-2FRRD6A3.mjs';function Q(r,s){let e=[];for(let n of r.events)n.type==="item.completed"&&n.payload.id===s&&e.push({...n.payload,at:n.at});return e}function J(r,s){let e=Q(r,s);return e[e.length-1]}function ee(r,s,e$1){e$1.role||b("unknown-role",`item "${e$1.id}" has no role assigned`,"dispatch it with next() or set item.role",{items:[e$1.id]});let n=e(r,e$1.role);n||b("unknown-role",`role "${e$1.role}" does not exist`,`registered roles: ${Object.keys(r.roles).join(", ")}`);let m=[],a=[...n.do_not],i=[...e$1.dependsOn,...e$1.type==="bug"||e$1.type==="change-request"?e$1.affects??[]:[]];for(let o of i){let d=J(r,o);if(d){m.push({item:o,produced:d.produced,notes:d.notes});for(let g of d.do_not)a.includes(g)||a.push(g);}}let l=Q(r,e$1.id).map(o=>({role:o.role,verdict:o.verdict,notes:o.notes,produced:o.produced,at:o.at})),t=new Set([e$1.id,...e$1.dependsOn]),p$1=Object.values(r.items).filter(o=>(o.type==="bug"||o.type==="change-request")&&o.id!==e$1.id&&o.status!=="done"&&o.status!=="dropped"&&(o.affects??[]).some(d=>t.has(d))).map(o=>({id:o.id,title:o.title,affects:o.affects??[]})),$=R(r),f=p(r,e$1.stage).gate,y={item:e$1,role:n,modelTier:n.modelTier,invariants:[...s.invariants(r,e$1),...r.agreements],do_not:a,acceptance:e$1.acceptance,upstream:m,priorHandoffs:l,relatedBugs:p$1,budgetRemaining:$?O($.budget,$.spent):{}};if(f&&(y.gateAhead=f),e$1.type==="question"&&e$1.parent){let o=J(r,e$1.parent);if(o){y.parent={item:e$1.parent,role:o.role,notes:o.notes,produced:o.produced,open_questions:o.open_questions??[],do_not:o.do_not};for(let d of o.do_not)a.includes(d)||a.push(d);}}return y}function ce(r){let s=new Map;for(let e of r.events){if(e.type!=="item.completed")continue;let n=e.payload;s.delete(n.id),s.set(n.id,{...n,at:e.at});}return [...s.values()].filter(e=>(e.verdict==="done"||e.verdict==="needs-review")&&(e.open_questions??[]).length>0).map(e=>({item:e.id,role:e.role,questions:e.open_questions??[],at:e.at}))}function ue(r,s,e={}){let n=V(r,s,e),m=n.dispatched.map(a=>ee(n.state,s,n.state.items[a.id]));return n.reason?{state:n.state,briefs:m,skipped:n.skipped,reason:n.reason}:{state:n.state,briefs:m,skipped:n.skipped}}var X=["done","needs-review","rework","blocked","escalate"],K=["policy","skill","memory","spec","review"],C=r=>typeof r=="object"&&r!==null&&!Array.isArray(r),_=r=>typeof r=="string";function te(r,s,e){let n=u(r,s.item);n.status!=="in_progress"&&b("invalid-transition",`item "${n.id}" is ${n.status}, not in_progress`,"only dispatched items can be completed; call next() first",{items:[n.id]}),Array.isArray(s.do_not)||b("handoff-invalid",`handoff for "${n.id}" has no do_not array`,"set handoff.do_not to [] when there is nothing to forbid",{items:[n.id]}),(!Array.isArray(s.produced)||!Array.isArray(s.open_questions))&&b("handoff-invalid",`handoff for "${n.id}" needs produced[] and open_questions[]`,"pass empty arrays when there is nothing",{items:[n.id]});let m=(t,p)=>b("handoff-invalid",`handoff for "${n.id}": ${t}`,p,{items:[n.id]}),a=s.verdict??"done";X.includes(a)||m(`unknown verdict ${JSON.stringify(a)}`,`use one of: ${X.join(", ")}`),s.produced.every(t=>C(t)&&_(t.kind)&&_(t.ref))||m("produced[] entries need string kind and ref",'use { "kind": "code", "ref": "src/a.ts" }');let i=s.lessons??[];(!Array.isArray(i)||!i.every(t=>C(t)&&_(t.text)&&K.includes(t.scope)))&&m("lessons[] entries need a text and a scope",`scope is one of: ${K.join(", ")}`);let l=s.follow_ups??[];(!Array.isArray(l)||!l.every(t=>C(t)&&_(t.id)&&_(t.title)))&&m("follow_ups[] entries need a string id and title","describe each follow-up as a new item"),s.role!==n.role&&b("handoff-invalid",`handoff role "${s.role}" differs from the dispatched role "${n.role}"`,`complete as "${n.role}" or re-dispatch`,{items:[n.id]}),(!e.model||e.model.trim()==="")&&b("accounting-invalid",`accounting for "${n.id}" has no model`,"record the model id that actually ran the work",{items:[n.id]});for(let t of ["tokensIn","tokensOut","durationMs"])(!Number.isFinite(e[t])||e[t]<0)&&b("accounting-invalid",`accounting.${t} must be a non-negative number`,`measure ${t} from the host's usage report`,{items:[n.id]});e.tokensIn+e.tokensOut===0&&e.estimate!==true&&b("accounting-invalid",`accounting for "${n.id}" records 0 tokens`,"pass the host's usage figures, or set estimate: true (CLI --estimate) to record a placeholder and correct it later with correctAccounting / exwf account",{items:[n.id]});}function Y(r){for(let s=r.transitions.length-1;s>=0;s--){let e=r.transitions[s];if(e.to.status==="in_progress")return e.from.stage}return r.stage}function oe(r,s){return H(r,s)?.from.stage??Y(s)}function be(r,s,e,n,m){te(r,e,n);let a,i=Y$1(r,s,{type:"item.complete",by:e.role,payload:{item:e.item,handoff:e}},()=>(a=ne(r,s,e,n,m),a.state));return {state:i.state,warnings:[...i.warnings,...a.warnings]}}function ne(r,s$1,e,n,m){let a$1=a(m),i$1=e.item,l=e.role,t={...r,accounting:[...r.accounting,n]};for(let o of e.produced)t=y(t,i$1,{kind:o.kind,ref:o.ref,by:l},a$1);let p$1=R(t);p$1&&(p$1.committed.includes(i$1)||u(t,i$1).iteration===p$1.id)&&(t={...t,iterations:t.iterations.map(o=>o.id===p$1.id?{...o,spent:N(o.spent,n)}:o)});for(let o of e.lessons??[]){let d=`L${t.lessons.length+1}`;t={...t,lessons:[...t.lessons,{id:d,at:a$1,text:o.text,scope:o.scope,status:"raised",from:l,item:i$1}]},t=c(t,"lesson.raised",l,{id:d,from:l,item:i$1,scope:o.scope},a$1);}let $=[];for(let o of e.follow_ups??[]){let d=t.stages[0],{iteration:g,...k}=o;t=v(t,{...k,stage:d.id,parent:i$1,tags:[...o.tags??[],"follow-up"]},l,a$1),$.push(o.id);}let f=e.verdict??"done",y$1=[];if((f==="done"||f==="needs-review")&&e.open_questions.length>0&&y$1.push({rule:"open-questions-ignored",severity:"warning",item:i$1,message:`"${i$1}" finished with ${e.open_questions.length} open question(s) nobody will see: ${e.open_questions.join(" | ")}`,fix:'use verdict "escalate" to route them to a role with capability escalate, or answer them in the next brief'}),f==="rework"){(!e.notes||e.notes.trim()==="")&&b("handoff-invalid",`rework on "${i$1}" needs notes`,"say what must change in handoff.notes",{items:[i$1]});let o=u(t,i$1);t=B(x(t,i$1,{stage:oe(t,o),status:"todo"},l,a$1),i$1),t=c(t,"item.rework",l,{id:i$1,by:l,notes:e.notes},a$1);}else if((f==="done"||f==="needs-review")&&u(t,i$1).type==="question"){let o=t.stages[t.stages.length-1].id;t=x(t,i$1,{stage:o,status:"done"},l,a$1);}else if(f==="done"||f==="needs-review"){let o=u(t,i$1),d=p(t,o.stage);if(G(t,o,d.exitPolicy,`leave "${d.id}"`),d.gate){let g=J$1(t,o,d.gate,l);g.outcome==="fail"&&b("gate-unmet",`gate "${d.gate.id}" blocks "${i$1}": ${g.violations.map(k=>k.message).join("; ")}`,g.violations.map(k=>k.fix).join("; "),{items:[i$1],rule:g.violations[0].rule}),g.outcome==="human"?t=K$1(t,{kind:"gate",item:i$1,gate:d.gate.id,question:`Approve gate "${d.gate.id}" for "${o.title}" (${i$1})?`},a$1):t=c(C$1(t,i$1,l,f==="needs-review",a$1),"gate.passed",l,{item:i$1,gate:d.gate.id},a$1);}else t=C$1(t,i$1,l,f==="needs-review",a$1);}else if(f==="blocked")t=z(t,i$1,e.notes||"blocked by worker",l,l,a$1);else if(f==="escalate"){let o=i(t,"escalate")[0];o||b("missing-capability",`no role has capability "escalate" to receive the question from "${i$1}"`,"register a role with capability escalate",{items:[i$1]});let d=Object.keys(t.items).filter(w=>w.startsWith(`${i$1}-q`)).length+1,g=`${i$1}-q${d}`,k=u(t,i$1),O=Y(k),b$1={id:g,type:"question",title:e.open_questions.join(" | ")||e.notes||`question from ${i$1}`,parent:i$1,role:o.id,priority:Number.MAX_SAFE_INTEGER,stage:O};k.iteration!==void 0&&(b$1.iteration=k.iteration),t=v(t,b$1,l,a$1),t=x(t,i$1,{stage:O,status:"todo"},l,a$1),t=s(t,i$1,w=>({...w,dependsOn:[...w.dependsOn,g]})),t=c(t,"item.escalated",l,{id:i$1,question:g,to:o.id},a$1);}return t=c(t,"item.completed",l,{id:i$1,role:l,verdict:f,produced:e.produced,notes:e.notes,do_not:e.do_not,open_questions:e.open_questions,followUps:$,tokens:n.tokensIn+n.tokensOut,durationMs:n.durationMs,model:n.model},a$1),s$1.afterComplete&&(t=s$1.afterComplete(t,i$1,a$1)),{state:t,warnings:y$1}}var se=[["tokensIn","tokens-in"],["tokensOut","tokens-out"],["durationMs","duration-ms"]],Z=r=>({tokensIn:r.tokensIn,tokensOut:r.tokensOut,durationMs:r.durationMs,model:r.model});function qe(r,s,e,n,m,a$1){u(r,s);let i=[];r.accounting.forEach((u,A)=>{u.item===s&&i.push(A);}),i.length===0&&b("invalid-input",`item "${s}" has no accounting line to correct`,`complete "${s}" first (exwf complete), then exwf account`,{items:[s]});let l=a$1??i.length;(!Number.isInteger(l)||l<1||l>i.length)&&b("invalid-input",`item "${s}" has ${i.length} accounting line(s), not line ${String(a$1)}`,`pass --line 1..${i.length}`,{items:[s]});let t=i[l-1],p=r.accounting[t];for(let[u,A]of se){let W=e[u];W!==void 0&&(!Number.isFinite(W)||W<0)&&b("accounting-invalid",`${u} must be a non-negative number`,`pass --${A} <n> with a measured figure`,{items:[s]});}e.model!==void 0&&e.model.trim()===""&&b("accounting-invalid","model must not be empty","pass --model with the model id that ran the work",{items:[s]});let{estimate:$,...f}=p,y={...f,tokensIn:e.tokensIn??p.tokensIn,tokensOut:e.tokensOut??p.tokensOut,durationMs:e.durationMs??p.durationMs,model:e.model??p.model};y.tokensIn+y.tokensOut===0&&b("accounting-invalid",`the correction leaves "${s}" at 0 tokens`,"pass the host's usage figures with --tokens-in / --tokens-out",{items:[s]});let o=Z(p),d=Z(y);o.tokensIn===d.tokensIn&&o.tokensOut===d.tokensOut&&o.durationMs===d.durationMs&&o.model===d.model&&p.estimate!==true&&b("no-op",`accounting for "${s}" line ${l} already has these figures`,"pass at least one different value to exwf account",{items:[s]});let k={tokens:d.tokensIn+d.tokensOut-(o.tokensIn+o.tokensOut),durationMs:d.durationMs-o.durationMs},O=r.items[s],b$1;for(let u of r.iterations)(u.committed.includes(s)||O.iteration===u.id)&&u.startedAt<=p.endedAt&&(u.endedAt===void 0||p.endedAt<=u.endedAt)&&(b$1=u);let w={...r,accounting:r.accounting.map((u,A)=>A===t?y:u)};return b$1&&(w={...w,iterations:w.iterations.map(u=>u.id===b$1.id?{...u,spent:{...u.spent,tokens:Math.max(0,u.spent.tokens+k.tokens),wallclockMs:Math.max(0,u.spent.wallclockMs+k.durationMs)}}:u)}),c(w,"accounting.corrected",n,{item:s,line:l,iteration:b$1?.id??null,before:o,after:d,delta:k},a(m))}export{ee as a,ce as b,ue as c,be as d,qe as e};//# sourceMappingURL=chunk-Z2G7DGDF.mjs.map
2
+ //# sourceMappingURL=chunk-Z2G7DGDF.mjs.map