ex-workflow 0.2.0-stage → 0.3.0-stage

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +39 -10
  3. package/dist/chunk-23P7C25E.cjs +2 -0
  4. package/dist/chunk-23P7C25E.cjs.map +1 -0
  5. package/dist/chunk-2IKIBB73.cjs +2 -0
  6. package/dist/chunk-2IKIBB73.cjs.map +1 -0
  7. package/dist/{chunk-472WEDPJ.cjs → chunk-4A4TD4MH.cjs} +2 -2
  8. package/dist/{chunk-472WEDPJ.cjs.map → chunk-4A4TD4MH.cjs.map} +1 -1
  9. package/dist/{chunk-D4HNETUL.cjs → chunk-7HZXZF3L.cjs} +2 -2
  10. package/dist/{chunk-D4HNETUL.cjs.map → chunk-7HZXZF3L.cjs.map} +1 -1
  11. package/dist/chunk-AUZIQPFT.cjs +2 -0
  12. package/dist/chunk-AUZIQPFT.cjs.map +1 -0
  13. package/dist/chunk-BJEOTG6P.mjs +2 -0
  14. package/dist/chunk-BJEOTG6P.mjs.map +1 -0
  15. package/dist/chunk-FLCYD2QF.mjs +2 -0
  16. package/dist/chunk-FLCYD2QF.mjs.map +1 -0
  17. package/dist/{chunk-DBR24RTX.cjs → chunk-NN3XJUHP.cjs} +2 -2
  18. package/dist/{chunk-DBR24RTX.cjs.map → chunk-NN3XJUHP.cjs.map} +1 -1
  19. package/dist/chunk-P4P4JTE5.mjs +2 -0
  20. package/dist/chunk-P4P4JTE5.mjs.map +1 -0
  21. package/dist/{chunk-IBRC36PE.mjs → chunk-R27STIER.mjs} +2 -2
  22. package/dist/{chunk-IBRC36PE.mjs.map → chunk-R27STIER.mjs.map} +1 -1
  23. package/dist/chunk-TMKCALFT.cjs +2 -0
  24. package/dist/chunk-TMKCALFT.cjs.map +1 -0
  25. package/dist/{chunk-XSXHEEJX.mjs → chunk-UOGNVWVO.mjs} +2 -2
  26. package/dist/{chunk-XSXHEEJX.mjs.map → chunk-UOGNVWVO.mjs.map} +1 -1
  27. package/dist/{chunk-VN2UYV2O.mjs → chunk-WOKNWJKU.mjs} +2 -2
  28. package/dist/{chunk-VN2UYV2O.mjs.map → chunk-WOKNWJKU.mjs.map} +1 -1
  29. package/dist/chunk-ZX4DAMTG.mjs +2 -0
  30. package/dist/chunk-ZX4DAMTG.mjs.map +1 -0
  31. package/dist/cli/bin.cjs +1 -1
  32. package/dist/cli/bin.cjs.map +1 -1
  33. package/dist/cli/bin.mjs +1 -1
  34. package/dist/cli/bin.mjs.map +1 -1
  35. package/dist/cli/index.cjs +1 -1
  36. package/dist/cli/index.mjs +1 -1
  37. package/dist/index.cjs +1 -1
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +6 -6
  40. package/dist/index.d.ts +6 -6
  41. package/dist/index.mjs +1 -1
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/kanban/index.cjs +1 -1
  44. package/dist/kanban/index.mjs +1 -1
  45. package/dist/scrum/index.cjs +1 -1
  46. package/dist/scrum/index.mjs +1 -1
  47. package/dist/types.d.cts +30 -1
  48. package/dist/types.d.ts +30 -1
  49. package/dist/waterfall/index.cjs +2 -0
  50. package/dist/waterfall/index.cjs.map +1 -0
  51. package/dist/waterfall/index.d.cts +148 -0
  52. package/dist/waterfall/index.d.ts +148 -0
  53. package/dist/waterfall/index.mjs +2 -0
  54. package/dist/waterfall/index.mjs.map +1 -0
  55. package/package.json +14 -1
  56. package/dist/chunk-JDVE7DQR.cjs +0 -2
  57. package/dist/chunk-JDVE7DQR.cjs.map +0 -1
  58. package/dist/chunk-NQU5TH3A.mjs +0 -2
  59. package/dist/chunk-NQU5TH3A.mjs.map +0 -1
  60. package/dist/chunk-NRAPI3GV.cjs +0 -2
  61. package/dist/chunk-NRAPI3GV.cjs.map +0 -1
  62. package/dist/chunk-PD5FBDN7.mjs +0 -2
  63. package/dist/chunk-PD5FBDN7.mjs.map +0 -1
  64. package/dist/chunk-QDT35LXB.cjs +0 -2
  65. package/dist/chunk-QDT35LXB.cjs.map +0 -1
  66. package/dist/chunk-YJNDBKIG.mjs +0 -2
  67. package/dist/chunk-YJNDBKIG.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/budget.ts","../src/planner.ts"],"names":["ZERO_SPENT","addSpent","spent","acc","remaining","budget","out","isExhausted","estimateTokens","state","weight","fallbackPerWeight","w","samples","a","iw","x","y","mid","median","openIteration","it","assignRole","item","r","roleOf","fail","author","authorOf","reviewers","rolesWith","resourceCapsFor","caps","toExNodes","items","priorityOf","present","i","role","node","pr","plan","methodology","opts","at","nowOf","all","candidates","d","c","readyAll","po","options","tb","b","firstBatch","metrics","flow","ExFlow","n","details","e","ExFlowRuntimeError","ready","id","inProgress","wipCounts","occupying","perClass","cls","iteration","tokensLeft","limit","dispatched","skipped","reason","next","pulledTo","target","stage","stageOf","violations","evaluatePolicies","v","limitHere","est","moveItem","appendEvent"],"mappings":"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","file":"chunk-QDT35LXB.cjs","sourcesContent":["import type { Accounting, Budget, WorkflowState } from \"./types.ts\";\n\nexport const ZERO_SPENT: Required<Budget> = { tokens: 0, turns: 0, wallclockMs: 0 };\n\nexport function addSpent(spent: Required<Budget>, acc: Accounting): Required<Budget> {\n return {\n tokens: spent.tokens + acc.tokensIn + acc.tokensOut,\n turns: spent.turns + 1,\n wallclockMs: spent.wallclockMs + acc.durationMs,\n };\n}\n\nexport function remaining(budget: Budget, spent: Required<Budget>): Budget {\n const out: Budget = {};\n if (budget.tokens !== undefined) out.tokens = Math.max(0, budget.tokens - spent.tokens);\n if (budget.turns !== undefined) out.turns = Math.max(0, budget.turns - spent.turns);\n if (budget.wallclockMs !== undefined)\n out.wallclockMs = Math.max(0, budget.wallclockMs - spent.wallclockMs);\n return out;\n}\n\nexport function isExhausted(budget: Budget, spent: Required<Budget>): boolean {\n return (\n (budget.tokens !== undefined && spent.tokens >= budget.tokens) ||\n (budget.turns !== undefined && spent.turns >= budget.turns) ||\n (budget.wallclockMs !== undefined && spent.wallclockMs >= budget.wallclockMs)\n );\n}\n\nexport function estimateTokens(\n state: WorkflowState,\n weight: number | undefined,\n fallbackPerWeight = 20000,\n): number {\n const w = weight ?? 1;\n const samples: number[] = [];\n for (const a of state.accounting) {\n const iw = state.items[a.item]?.weight;\n if (iw === undefined || iw <= 0) continue;\n samples.push((a.tokensIn + a.tokensOut) / iw);\n }\n if (samples.length === 0) return fallbackPerWeight * w;\n samples.sort((x, y) => x - y);\n const mid = Math.floor(samples.length / 2);\n const median = samples.length % 2 ? samples[mid]! : (samples[mid - 1]! + samples[mid]!) / 2;\n return Math.round(median * w);\n}\n","import { ExFlow, ExFlowRuntimeError, type ExFlowOptions, type ExNode } from \"ex-flow\";\nimport { estimateTokens, remaining } from \"./budget.ts\";\nimport { fail } from \"./errors.ts\";\nimport { authorOf } from \"./gates.ts\";\nimport { moveItem, stageOf } from \"./items.ts\";\nimport { evaluatePolicies } from \"./policies.ts\";\nimport { roleOf, rolesWith } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type { ItemStatus, Iteration, Methodology, Role, WorkItem, WorkflowState } from \"./types.ts\";\n\ntype NodeData = { id: string };\n\nexport function openIteration(state: WorkflowState): Iteration | undefined {\n return state.iterations.find((it) => it.endedAt === undefined);\n}\n\nexport function assignRole(state: WorkflowState, item: WorkItem): Role {\n if (item.role) {\n const r = roleOf(state, item.role);\n if (!r)\n fail(\n \"unknown-role\",\n `item \"${item.id}\" is assigned to unknown role \"${item.role}\"`,\n \"editItem with an existing role id\",\n );\n return r;\n }\n if (item.status === \"review\") {\n const author = authorOf(state, item);\n const reviewers = rolesWith(state, \"review\");\n const other = reviewers.find((r) => r.id !== author);\n const r = other ?? (reviewers.length === 1 ? reviewers[0] : undefined);\n if (!r)\n fail(\n \"missing-capability\",\n `no role has capability \"review\" for item \"${item.id}\"`,\n \"register a role with capability review\",\n { items: [item.id] },\n );\n return r;\n }\n const r = rolesWith(state, \"deliver\")[0];\n if (!r)\n fail(\n \"missing-capability\",\n `no role has capability \"deliver\" for item \"${item.id}\"`,\n \"register a role with capability deliver\",\n { items: [item.id] },\n );\n return r;\n}\n\nexport function resourceCapsFor(state: WorkflowState): Record<string, number> {\n const caps: Record<string, number> = {};\n for (const r of Object.values(state.roles)) {\n if (r.maxConcurrent !== undefined) caps[r.resourceClass ?? r.id] = r.maxConcurrent;\n }\n return caps;\n}\n\nexport function toExNodes(\n items: WorkItem[],\n state: WorkflowState,\n priorityOf?: (item: WorkItem) => number | undefined,\n): ExNode<NodeData>[] {\n const present = new Set(items.map((i) => i.id));\n return items.map((i) => {\n const role = assignRole(state, i);\n const node: ExNode<NodeData> = {\n id: i.id,\n data: { id: i.id },\n dependsOn: i.dependsOn.filter((d) => present.has(d)),\n resourceClass: role.resourceClass ?? role.id,\n };\n const pr = priorityOf ? priorityOf(i) : i.priority;\n if (pr !== undefined) node.priority = pr;\n if (i.weight !== undefined) node.weight = i.weight;\n if (i.deadline !== undefined) node.deadline = Date.parse(i.deadline);\n return node;\n });\n}\n\nexport interface PlanOptions {\n max?: number;\n now?: string;\n fallbackTokensPerWeight?: number;\n}\nexport type PlanReason = \"no-candidates\" | \"budget-exhausted\" | \"wip-full\" | \"policy-blocked\";\n/** A ready item the planner did not pull, and why. */\nexport interface Skipped {\n id: string;\n reason: \"entry-policy\" | \"wip\" | \"resource-cap\" | \"budget\";\n detail: string;\n}\nexport interface PlanResult {\n state: WorkflowState;\n dispatched: WorkItem[];\n skipped: Skipped[];\n reason?: PlanReason;\n}\n\nexport function plan(\n state: WorkflowState,\n methodology: Methodology,\n opts: PlanOptions = {},\n): PlanResult {\n const at = nowOf(opts.now);\n // an item may enter the graph only if every dependency is done or is itself a candidate (so ex-flow orders it)\n const all = methodology.candidates(state);\n const candidates = all.filter((i) =>\n i.dependsOn.every((d) => state.items[d]?.status === \"done\" || all.some((c) => c.id === d)),\n );\n const readyAll = all.filter((i) => i.dependsOn.every((d) => state.items[d]?.status === \"done\"));\n if (candidates.length === 0)\n return { state, dispatched: [], skipped: [], reason: \"no-candidates\" };\n\n const po = methodology.plannerOptions(state);\n const options: ExFlowOptions<NodeData> = {\n schedulerMode: po.schedulerMode,\n resourceCaps: resourceCapsFor(state),\n };\n if (po.concurrencyCap !== undefined) options.concurrencyCap = po.concurrencyCap;\n if (po.fairnessPolicy !== undefined) options.fairnessPolicy = po.fairnessPolicy;\n if (po.maxDeferralRounds !== undefined) options.maxDeferralRounds = po.maxDeferralRounds;\n if (po.deadlineStrategy !== undefined) options.deadlineStrategy = po.deadlineStrategy;\n if (po.weightStrategy !== undefined) options.weightStrategy = po.weightStrategy;\n if (po.tieBreaker !== undefined) {\n const tb = po.tieBreaker;\n options.tieBreaker = (a, b) => tb(state.items[a.data.id]!, state.items[b.data.id]!);\n }\n\n let firstBatch: string[];\n let metrics: unknown;\n try {\n const flow = new ExFlow<NodeData>(options);\n for (const n of toExNodes(candidates, state, po.priorityOf)) flow.addEntity(n);\n const details = flow.resolveExecutionDetails();\n firstBatch = (details.plan.batches[0] ?? []).map((r) => r.id);\n metrics = details.metrics;\n } catch (e) {\n if (e instanceof ExFlowRuntimeError) {\n fail(\n \"planner-error\",\n `ex-flow refused the graph: [${e.code}] ${e.message}`,\n \"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message\",\n { items: candidates.map((c) => c.id) },\n );\n }\n throw e;\n }\n\n // ready = first batch, but only items whose deps are really done (deps inside the batch are impossible by construction)\n const ready = firstBatch\n .map((id) => state.items[id]!)\n .filter((i) => i.dependsOn.every((d) => state.items[d]?.status === \"done\"));\n const inProgress = Object.values(state.items).filter((i) => i.status === \"in_progress\");\n const wipCounts = new Set<ItemStatus>(po.wipCounts ?? [\"in_progress\"]);\n const occupying = Object.values(state.items).filter((i) => wipCounts.has(i.status));\n const perClass: Record<string, number> = {};\n for (const i of inProgress) {\n const r = i.role ? roleOf(state, i.role) : undefined;\n const cls = r ? (r.resourceClass ?? r.id) : \"?\";\n perClass[cls] = (perClass[cls] ?? 0) + 1;\n }\n const caps = resourceCapsFor(state);\n const iteration = openIteration(state);\n let tokensLeft = iteration ? remaining(iteration.budget, iteration.spent).tokens : undefined;\n const limit = Math.min(opts.max ?? Infinity, po.concurrencyCap ?? Infinity);\n\n const dispatched: WorkItem[] = [];\n const skipped: Skipped[] = [];\n let reason: PlanReason | undefined;\n let next = state;\n for (const item of ready) {\n if (dispatched.length >= limit) {\n reason = \"wip-full\";\n break;\n }\n const pulledTo =\n typeof po.dispatchStage === \"function\" ? po.dispatchStage(item) : po.dispatchStage;\n const target = item.status === \"todo\" && pulledTo !== undefined ? pulledTo : item.stage;\n const stage = stageOf(state, target);\n // questions are answered, not delivered: like exit policies and gates, entry policies do not apply\n const violations =\n item.type === \"question\" ? [] : evaluatePolicies(state, item, stage.entryPolicy);\n if (violations.length > 0) {\n skipped.push({\n id: item.id,\n reason: \"entry-policy\",\n detail: violations.map((v) => v.message).join(\"; \"),\n });\n continue;\n }\n const limitHere = po.wipLimitOf ? po.wipLimitOf(stage, item) : stage.wipLimit;\n if (\n limitHere !== undefined &&\n occupying.filter((i) => i.stage === stage.id && i.id !== item.id).length +\n dispatched.filter((d) => d.stage === stage.id).length >=\n limitHere\n ) {\n reason = \"wip-full\";\n skipped.push({\n id: item.id,\n reason: \"wip\",\n detail: `stage \"${stage.id}\" is at its WIP limit of ${limitHere}`,\n });\n continue;\n }\n const role = assignRole(state, item);\n const cls = role.resourceClass ?? role.id;\n if (caps[cls] !== undefined && (perClass[cls] ?? 0) >= caps[cls]!) {\n reason = \"wip-full\";\n skipped.push({\n id: item.id,\n reason: \"resource-cap\",\n detail: `resource class \"${cls}\" is at its cap of ${caps[cls]}`,\n });\n continue;\n }\n if (tokensLeft !== undefined) {\n const est = estimateTokens(state, item.weight, opts.fallbackTokensPerWeight);\n if (est > tokensLeft) {\n reason = \"budget-exhausted\";\n skipped.push({\n id: item.id,\n reason: \"budget\",\n detail: `needs about ${est} tokens, ${tokensLeft} left in the iteration`,\n });\n continue;\n }\n tokensLeft -= est;\n }\n perClass[cls] = (perClass[cls] ?? 0) + 1;\n next = moveItem(next, item.id, { stage: target, status: \"in_progress\" }, role.id, at);\n next = {\n ...next,\n items: { ...next.items, [item.id]: { ...next.items[item.id]!, role: role.id } },\n };\n dispatched.push(next.items[item.id]!);\n }\n if (reason === undefined && skipped.some((x) => x.reason === \"entry-policy\"))\n reason = \"policy-blocked\";\n if (reason === undefined && dispatched.length < readyAll.length) reason = \"wip-full\";\n if (dispatched.length === 0 && reason === undefined) reason = \"no-candidates\";\n next = appendEvent(\n next,\n \"planner.resolved\",\n \"planner\",\n { dispatched: dispatched.map((d) => d.id), reason: reason ?? null, skipped, metrics },\n at,\n );\n return reason\n ? { state: next, dispatched, skipped, reason }\n : { state: next, dispatched, skipped };\n}\n"]}
@@ -1,2 +0,0 @@
1
- import {c as c$1,b as b$1}from'./chunk-VN2UYV2O.mjs';import {k}from'./chunk-IBRC36PE.mjs';import {f as f$1}from'./chunk-PD5FBDN7.mjs';import {I}from'./chunk-XSXHEEJX.mjs';import {f,L,d as d$1,J,u,w,v as v$1,N}from'./chunk-NQU5TH3A.mjs';import {c,e,d,g,f as f$2,b as b$2}from'./chunk-VGD4V5BA.mjs';import {a,b}from'./chunk-2FRRD6A3.mjs';import {stat,readFile}from'fs/promises';import h from'path';var v={scrum:k,kanban:I},p=["exwf init <scrum|kanban> --config <file> [--roles <file>]","exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]","exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"];function G(r){let t=[],m={};for(let i=0;i<r.length;i++){let k=r[i];if(k.startsWith("--")){let e=k.slice(2),c=r[i+1];c!==void 0&&!c.startsWith("--")?(m[e]=c,i++):m[e]="true";}else t.push(k);}return {positional:t,flags:m}}async function x(r){try{return JSON.parse(await readFile(r,"utf8"))}catch(t){return b("invalid-input",`cannot read JSON from ${r}: ${t.message}`,"check the path and that the file is valid JSON")}}function y(r){let t=Object.hasOwn(v,r.methodology)?v[r.methodology]:void 0;return t||b("config-invalid",`methodology "${r.methodology}" is not available in this build`,`available: ${Object.keys(v).join(", ")}`),t()}function O(r,t){let m=Number(r[t]);return Number.isFinite(m)||b("invalid-input",`--${t} must be a number (got ${JSON.stringify(r[t])})`,`pass --${t} <n>`),m}var U=new Set(["init","add","edit","next","complete","ceremony","decide"]);async function it(r,t){let[m,i]=G(r).positional,k=m!==void 0&&(U.has(m)||m==="role"&&i==="add");try{return k?await c(t,()=>F(r,t)):await F(r,t)}catch(e){if(e instanceof a)return {exit:1,out:{ok:false,error:e.toJSON()}};throw e}}async function F(r,t){let{positional:m,flags:i}=G(r),[k,...e$1]=m,c=i.by??"human",l=new Date().toISOString();switch(k){case "init":{let[o]=e$1,n=o&&Object.hasOwn(v,o)?v[o]:void 0;if(!n||!i.config)return {exit:2,out:{ok:false,usage:p}};try{await stat(b$2(t)),b("invalid-input",`${b$2(t)} already exists`,"delete .workflow/state.json to start over");}catch(d){if(d instanceof a||d.code!=="ENOENT")throw d}let s=await x(h.resolve(t,i.config)),a$1=i.roles?await x(h.resolve(t,i.roles)):void 0,f=N(a$1?{methodology:n(),config:s,roles:a$1,by:c,now:l}:{methodology:n(),config:s,by:c,now:l});return await d(t,f.state),{exit:0,out:{ok:true,warnings:f.warnings,state:{methodology:f.state.methodology,stages:f.state.stages.map(d=>d.id),roles:Object.keys(f.state.roles)}}}}case "add":{if(!e$1[0])return {exit:2,out:{ok:false,usage:p}};let o=await e(t),n=await x(h.resolve(t,e$1[0])),s=v$1(o,n,c,l);return await d(t,s),{exit:0,out:{ok:true,item:u(s,n.id)}}}case "edit":{if(!e$1[0]||!e$1[1])return {exit:2,out:{ok:false,usage:p}};let o=await e(t),n=w(o,e$1[0],await x(h.resolve(t,e$1[1])),c,l);return await d(t,n),{exit:0,out:{ok:true,item:u(n,e$1[0])}}}case "next":{let o=await e(t),n=i.max?{max:O(i,"max"),now:l}:{now:l},s=b$1(o,y(o),n);await d(t,s.state);for(let a of s.briefs)await f$2(t,a);return {exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!e$1[0]||!e$1[1])return {exit:2,out:{ok:false,usage:p}};let o=await e(t),n=await x(h.resolve(t,e$1[1]));n.item!==e$1[0]&&b("handoff-invalid",`handoff.item "${n.item}" differs from the command's item "${e$1[0]}"`,"make them match");let s=i.role??n.role,a=O(i,"duration-ms"),f={item:e$1[0],role:s,model:i.model??"",tokensIn:O(i,"tokens-in"),tokensOut:O(i,"tokens-out"),durationMs:a,startedAt:new Date(Date.parse(l)-a).toISOString(),endedAt:l},d$1=c$1(o,y(o),{...n,role:s},f,l);return await d(t,d$1.state),await g(t,n,d$1.state.events.length),{exit:0,out:{ok:true,warnings:d$1.warnings,item:u(d$1.state,e$1[0])}}}case "ceremony":{if(!e$1[0])return {exit:2,out:{ok:false,usage:p}};let o=await e(t),n=y(o),s=Object.hasOwn(n.ceremonies,e$1[0])?n.ceremonies[e$1[0]]:void 0;s||b("unknown-ceremony",`"${e$1[0]}" is not a ${n.name} ceremony`,`available: ${Object.keys(n.ceremonies).join(", ")}`);let a=e$1[1]?await x(h.resolve(t,e$1[1])):{},f=s(o,{...a,by:c,now:l});return await d(t,f.state),{exit:0,out:{ok:true,warnings:f.warnings,lastEvent:d$1(f.state)}}}case "decide":{if(!e$1[0]||e$1[1]!=="approve"&&e$1[1]!=="reject")return {exit:2,out:{ok:false,usage:p}};let o=await e(t),n=o.pending.find(a=>a.id===e$1[0]),s=J(o,e$1[0],e$1[1],c,i.note??"",l);return await d(t,s),{exit:0,out:{ok:true,item:n?.item?u(s,n.item):null}}}case "status":{let o=await e(t),n=y(o),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let a of Object.values(o.items))s[a.status]+=1;return {exit:0,out:{ok:true,methodology:o.methodology,openIteration:f$1(o)??null,counts:s,pending:o.pending,lastEvent:d$1(o),report:n.report?n.report(o):null}}}case "board":{let o=await e(t);return {exit:0,out:{ok:true,columns:o.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(o.items).filter(a=>a.stage===s.id&&a.status!=="dropped").map(a=>({id:a.id,title:a.title,status:a.status,role:a.role??null,age:a.transitions.length?Date.parse(l)-Date.parse(a.transitions[a.transitions.length-1].at):null}))}))}}}case "metrics":{let o=await e(t);return {exit:0,out:{ok:true,metrics:y(o).metrics(o)}}}case "pending":return {exit:0,out:{ok:true,pending:(await e(t)).pending}};case "lessons":return {exit:0,out:{ok:true,lessons:(await e(t)).lessons}};case "validate":{if(!e$1[0])return {exit:2,out:{ok:false,usage:p}};let o=await e(t),n=await x(h.resolve(t,e$1[0]));return {exit:0,out:{ok:true,violations:L(o,y(o),n)}}}case "role":{let o=await e(t);if(e$1[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(o.roles),detail:o.roles}};if(e$1[0]==="add"&&e$1[1]){let n=f(o,await x(h.resolve(t,e$1[1])),c,l);return await d(t,n),{exit:0,out:{ok:true,roles:Object.keys(n.roles)}}}return {exit:2,out:{ok:false,usage:p}}}default:return {exit:2,out:{ok:false,usage:p}}}}export{p as a,G as b,it as c};//# sourceMappingURL=chunk-YJNDBKIG.mjs.map
2
- //# sourceMappingURL=chunk-YJNDBKIG.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","USAGE","parseArgs","argv","positional","flags","a","key","val","readJson","file","readFile","e","fail","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","writes","withStateLock","execute","WorkflowError","rest","by","now","name","stat","statePath","config","path","roles","res","init","saveState","s","loadState","item","s2","addItem","getItem","editItem","opts","next","b","saveBrief","handoff","role","durationMs","acc","complete","saveHandoff","m","c","input","lastEvent","entry","p","decide","counts","i","openIteration","st","action","validateAction","registerRole"],"mappings":"4YAgCA,IAAMA,CAAAA,CAAmD,CACvD,MAAOC,CAAAA,CACP,MAAA,CAAQC,CACV,CAAA,CAEaC,CAAAA,CAAQ,CACnB,2DAAA,CACA,6EAAA,CACA,+HAAA,CACA,8CAAA,CACA,kEACA,mDAAA,CACA,gFACF,EAMO,SAASC,CAAAA,CAAUC,EAAwB,CAChD,IAAMC,EAAuB,EAAC,CACxBC,EAAgC,EAAC,CACvC,QAAS,CAAA,CAAI,CAAA,CAAG,EAAIF,CAAAA,CAAK,MAAA,CAAQ,CAAA,EAAA,CAAK,CACpC,IAAMG,CAAAA,CAAIH,CAAAA,CAAK,CAAC,CAAA,CAChB,GAAIG,EAAE,UAAA,CAAW,IAAI,CAAA,CAAG,CACtB,IAAMC,CAAAA,CAAMD,CAAAA,CAAE,MAAM,CAAC,CAAA,CACfE,EAAML,CAAAA,CAAK,CAAA,CAAI,CAAC,CAAA,CAClBK,IAAQ,MAAA,EAAa,CAACA,EAAI,UAAA,CAAW,IAAI,GAC3CH,CAAAA,CAAME,CAAG,EAAIC,CAAAA,CACb,CAAA,EAAA,EACKH,EAAME,CAAG,CAAA,CAAI,OACtB,CAAA,KAAOH,CAAAA,CAAW,KAAKE,CAAC,EAC1B,CACA,OAAO,CAAE,UAAA,CAAAF,CAAAA,CAAY,MAAAC,CAAM,CAC7B,CAEA,eAAeI,CAAAA,CAAYC,CAAAA,CAA0B,CACnD,GAAI,CACF,OAAO,KAAK,KAAA,CAAM,MAAMC,SAASD,CAAAA,CAAM,MAAM,CAAC,CAChD,OAASE,CAAAA,CAAG,CACV,OAAOC,CAAAA,CACL,eAAA,CACA,yBAAyBH,CAAI,CAAA,EAAA,EAAME,EAAY,OAAO,CAAA,CAAA,CACtD,gDACF,CACF,CACF,CAEA,SAASE,CAAAA,CAAcC,EAAmC,CACxD,IAAMC,CAAAA,CAAI,MAAA,CAAO,OAAOlB,CAAAA,CAAeiB,CAAAA,CAAM,WAAW,CAAA,CACpDjB,CAAAA,CAAciB,EAAM,WAAW,CAAA,CAC/B,MAAA,CACJ,OAAKC,GACHH,CAAAA,CACE,gBAAA,CACA,gBAAgBE,CAAAA,CAAM,WAAW,mCACjC,CAAA,WAAA,EAAc,MAAA,CAAO,IAAA,CAAKjB,CAAa,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CACrD,CAAA,CACKkB,GACT,CAEA,SAASC,CAAAA,CAAIZ,CAAAA,CAA+BE,EAAqB,CAC/D,IAAMW,EAAI,MAAA,CAAOb,CAAAA,CAAME,CAAG,CAAC,CAAA,CAC3B,OAAK,MAAA,CAAO,SAASW,CAAC,CAAA,EACpBL,EACE,eAAA,CACA,CAAA,EAAA,EAAKN,CAAG,CAAA,uBAAA,EAA0B,IAAA,CAAK,SAAA,CAAUF,CAAAA,CAAME,CAAG,CAAC,CAAC,IAC5D,CAAA,OAAA,EAAUA,CAAG,MACf,CAAA,CACKW,CACT,CAQA,IAAMC,EAAU,IAAI,GAAA,CAAI,CAAC,MAAA,CAAQ,KAAA,CAAO,OAAQ,MAAA,CAAQ,UAAA,CAAY,WAAY,QAAQ,CAAC,EAEzF,eAAsBC,EAAAA,CAAWjB,EAAgBkB,CAAAA,CAAqC,CACpF,GAAM,CAACC,CAAAA,CAAKC,CAAG,CAAA,CAAIrB,EAAUC,CAAI,CAAA,CAAE,WAC7BqB,CAAAA,CAASF,CAAAA,GAAQ,SAAcH,CAAAA,CAAQ,GAAA,CAAIG,CAAG,CAAA,EAAMA,IAAQ,MAAA,EAAUC,CAAAA,GAAQ,OACpF,GAAI,CACF,OAAOC,CAAAA,CAAS,MAAMC,CAAAA,CAAcJ,CAAAA,CAAK,IAAMK,CAAAA,CAAQvB,CAAAA,CAAMkB,CAAG,CAAC,CAAA,CAAI,MAAMK,CAAAA,CAAQvB,CAAAA,CAAMkB,CAAG,CAC9F,CAAA,MAAS,EAAG,CACV,GAAI,aAAaM,CAAAA,CAAe,OAAO,CAAE,IAAA,CAAM,CAAA,CAAG,GAAA,CAAK,CAAE,GAAI,KAAA,CAAO,KAAA,CAAO,EAAE,MAAA,EAAS,CAAE,CAAA,CACxF,MAAM,CACR,CACF,CAEA,eAAeD,CAAAA,CAAQvB,EAAgBkB,CAAAA,CAAqC,CAC1E,GAAM,CAAE,UAAA,CAAAjB,CAAAA,CAAY,KAAA,CAAAC,CAAM,CAAA,CAAIH,CAAAA,CAAUC,CAAI,CAAA,CACtC,CAACmB,EAAK,GAAGM,GAAI,EAAIxB,CAAAA,CACjByB,CAAAA,CAAKxB,EAAM,EAAA,EAAS,OAAA,CACpByB,EAAM,IAAI,IAAA,GAAO,WAAA,EAAY,CACnC,OAAQR,CAAAA,EACN,KAAK,MAAA,CAAQ,CACX,GAAM,CAACS,CAAI,CAAA,CAAIH,GAAAA,CACTZ,CAAAA,CAAIe,CAAAA,EAAQ,OAAO,MAAA,CAAOjC,CAAAA,CAAeiC,CAAI,CAAA,CAAIjC,CAAAA,CAAciC,CAAI,CAAA,CAAI,MAAA,CAC7E,GAAI,CAACf,GAAK,CAACX,CAAAA,CAAM,OAAW,OAAO,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,KAAA,CAAO,MAAOJ,CAAM,CAAE,EAC/E,GAAI,CACF,MAAM+B,IAAAA,CAAKC,GAAAA,CAAUZ,CAAG,CAAC,EACzBR,CAAAA,CACE,eAAA,CACA,GAAGoB,GAAAA,CAAUZ,CAAG,CAAC,CAAA,eAAA,CAAA,CACjB,2CACF,EACF,CAAA,MAAST,EAAG,CAEV,GADIA,aAAae,CAAAA,EACZf,CAAAA,CAA4B,OAAS,QAAA,CAAU,MAAMA,CAC5D,CACA,IAAMsB,CAAAA,CAAS,MAAMzB,EAAkB0B,CAAAA,CAAK,OAAA,CAAQd,EAAKhB,CAAAA,CAAM,MAAS,CAAC,CAAA,CACnE+B,GAAAA,CAAQ/B,EAAM,KAAA,CAChB,MAAMI,EAAiB0B,CAAAA,CAAK,OAAA,CAAQd,EAAKhB,CAAAA,CAAM,KAAQ,CAAC,CAAA,CACxD,OACEgC,CAAAA,CAAMC,CAAAA,CACVF,IACI,CAAE,WAAA,CAAapB,GAAE,CAAG,MAAA,CAAAkB,CAAAA,CAAQ,KAAA,CAAAE,IAAO,EAAA,CAAAP,CAAAA,CAAI,IAAAC,CAAI,CAAA,CAC3C,CAAE,WAAA,CAAad,CAAAA,EAAE,CAAG,MAAA,CAAAkB,EAAQ,EAAA,CAAAL,CAAAA,CAAI,IAAAC,CAAI,CAC1C,EACA,OAAA,MAAMS,CAAAA,CAAUlB,EAAKgB,CAAAA,CAAI,KAAK,EACvB,CACL,IAAA,CAAM,EACN,GAAA,CAAK,CACH,GAAI,IAAA,CACJ,QAAA,CAAUA,CAAAA,CAAI,QAAA,CACd,MAAO,CACL,WAAA,CAAaA,EAAI,KAAA,CAAM,WAAA,CACvB,OAAQA,CAAAA,CAAI,KAAA,CAAM,MAAA,CAAO,GAAA,CAAKG,GAAMA,CAAAA,CAAE,EAAE,EACxC,KAAA,CAAO,MAAA,CAAO,KAAKH,CAAAA,CAAI,KAAA,CAAM,KAAK,CACpC,CACF,CACF,CACF,CACA,KAAK,KAAA,CAAO,CACV,GAAI,CAACT,IAAK,CAAC,CAAA,CAAG,OAAO,CAAE,IAAA,CAAM,EAAG,GAAA,CAAK,CAAE,GAAI,KAAA,CAAO,KAAA,CAAO3B,CAAM,CAAE,EACjE,IAAMc,CAAAA,CAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,EAC3BqB,CAAAA,CAAO,MAAMjC,CAAAA,CAAkB0B,CAAAA,CAAK,QAAQd,CAAAA,CAAKO,GAAAA,CAAK,CAAC,CAAC,CAAC,EACzDe,CAAAA,CAAKC,GAAAA,CAAQ7B,CAAAA,CAAO2B,CAAAA,CAAMb,EAAIC,CAAG,CAAA,CACvC,aAAMS,CAAAA,CAAUlB,CAAAA,CAAKsB,CAAE,CAAA,CAChB,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,IAAA,CAAM,KAAME,CAAAA,CAAQF,CAAAA,CAAID,EAAK,EAAE,CAAE,CAAE,CAClE,CACA,KAAK,MAAA,CAAQ,CACX,GAAI,CAACd,IAAK,CAAC,CAAA,EAAK,CAACA,GAAAA,CAAK,CAAC,CAAA,CAAG,OAAO,CAAE,IAAA,CAAM,CAAA,CAAG,IAAK,CAAE,EAAA,CAAI,KAAA,CAAO,KAAA,CAAO3B,CAAM,CAAE,CAAA,CAC7E,IAAMc,CAAAA,CAAQ,MAAM0B,EAAUpB,CAAG,CAAA,CAC3BsB,EAAKG,CAAAA,CACT/B,CAAAA,CACAa,IAAK,CAAC,CAAA,CACN,MAAMnB,CAAAA,CAAoB0B,CAAAA,CAAK,QAAQd,CAAAA,CAAKO,GAAAA,CAAK,CAAC,CAAC,CAAC,CAAA,CACpDC,CAAAA,CACAC,CACF,CAAA,CACA,OAAA,MAAMS,EAAUlB,CAAAA,CAAKsB,CAAE,CAAA,CAChB,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,IAAA,CAAM,KAAME,CAAAA,CAAQF,CAAAA,CAAIf,GAAAA,CAAK,CAAC,CAAC,CAAE,CAAE,CAClE,CACA,KAAK,OAAQ,CACX,IAAMb,EAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,CAAA,CAC3B0B,CAAAA,CAAO1C,EAAM,GAAA,CAAS,CAAE,IAAKY,CAAAA,CAAIZ,CAAAA,CAAO,KAAK,CAAA,CAAG,IAAAyB,CAAI,CAAA,CAAI,CAAE,GAAA,CAAAA,CAAI,EAC9DO,CAAAA,CAAMW,GAAAA,CAASjC,CAAAA,CAAOD,CAAAA,CAAcC,CAAK,CAAA,CAAGgC,CAAI,EACtD,MAAMR,CAAAA,CAAUlB,EAAKgB,CAAAA,CAAI,KAAK,CAAA,CAC9B,IAAA,IAAWY,KAAKZ,CAAAA,CAAI,MAAA,CAAQ,MAAMa,GAAAA,CAAU7B,CAAAA,CAAK4B,CAAC,CAAA,CAClD,OAAO,CACL,IAAA,CAAM,CAAA,CACN,IAAK,CAAE,EAAA,CAAI,KAAM,MAAA,CAAQZ,CAAAA,CAAI,QAAU,IAAA,CAAM,OAAA,CAASA,CAAAA,CAAI,OAAA,CAAS,OAAQA,CAAAA,CAAI,MAAO,CACxF,CACF,CACA,KAAK,UAAA,CAAY,CACf,GAAI,CAACT,IAAK,CAAC,CAAA,EAAK,CAACA,GAAAA,CAAK,CAAC,EAAG,OAAO,CAAE,IAAA,CAAM,CAAA,CAAG,IAAK,CAAE,EAAA,CAAI,MAAO,KAAA,CAAO3B,CAAM,CAAE,CAAA,CAC7E,IAAMc,EAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,CAAA,CAC3B8B,CAAAA,CAAU,MAAM1C,CAAAA,CAAkB0B,CAAAA,CAAK,QAAQd,CAAAA,CAAKO,GAAAA,CAAK,CAAC,CAAC,CAAC,CAAA,CAC9DuB,CAAAA,CAAQ,OAASvB,GAAAA,CAAK,CAAC,GACzBf,CAAAA,CACE,iBAAA,CACA,CAAA,cAAA,EAAiBsC,CAAAA,CAAQ,IAAI,CAAA,mCAAA,EAAsCvB,GAAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA,CAC1E,iBACF,CAAA,CACF,IAAMwB,CAAAA,CAAO/C,CAAAA,CAAM,MAAW8C,CAAAA,CAAQ,IAAA,CAChCE,EAAapC,CAAAA,CAAIZ,CAAAA,CAAO,aAAa,CAAA,CACrCiD,CAAAA,CAAkB,CACtB,IAAA,CAAM1B,GAAAA,CAAK,CAAC,CAAA,CACZ,IAAA,CAAAwB,EACA,KAAA,CAAO/C,CAAAA,CAAM,OAAY,EAAA,CACzB,QAAA,CAAUY,CAAAA,CAAIZ,CAAAA,CAAO,WAAW,CAAA,CAChC,SAAA,CAAWY,EAAIZ,CAAAA,CAAO,YAAY,EAClC,UAAA,CAAAgD,CAAAA,CACA,SAAA,CAAW,IAAI,KAAK,IAAA,CAAK,KAAA,CAAMvB,CAAG,CAAA,CAAIuB,CAAU,EAAE,WAAA,EAAY,CAC9D,OAAA,CAASvB,CACX,EACMO,GAAAA,CAAMkB,GAAAA,CAASxC,EAAOD,CAAAA,CAAcC,CAAK,EAAG,CAAE,GAAGoC,EAAS,IAAA,CAAAC,CAAK,EAAGE,CAAAA,CAAKxB,CAAG,EAChF,OAAA,MAAMS,CAAAA,CAAUlB,EAAKgB,GAAAA,CAAI,KAAK,CAAA,CAC9B,MAAMmB,EAAYnC,CAAAA,CAAK8B,CAAAA,CAASd,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAChD,CACL,IAAA,CAAM,CAAA,CACN,IAAK,CAAE,EAAA,CAAI,KAAM,QAAA,CAAUA,GAAAA,CAAI,SAAU,IAAA,CAAMQ,CAAAA,CAAQR,GAAAA,CAAI,KAAA,CAAOT,IAAK,CAAC,CAAC,CAAE,CAC7E,CACF,CACA,KAAK,UAAA,CAAY,CACf,GAAI,CAACA,IAAK,CAAC,CAAA,CAAG,OAAO,CAAE,IAAA,CAAM,EAAG,GAAA,CAAK,CAAE,EAAA,CAAI,KAAA,CAAO,MAAO3B,CAAM,CAAE,EACjE,IAAMc,CAAAA,CAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,CAAA,CAC3BoC,CAAAA,CAAI3C,EAAcC,CAAK,CAAA,CACvB2C,EAAI,MAAA,CAAO,MAAA,CAAOD,EAAE,UAAA,CAAY7B,GAAAA,CAAK,CAAC,CAAC,EAAI6B,CAAAA,CAAE,UAAA,CAAW7B,IAAK,CAAC,CAAC,EAAI,MAAA,CACpE8B,CAAAA,EACH7C,EACE,kBAAA,CACA,CAAA,CAAA,EAAIe,IAAK,CAAC,CAAC,cAAc6B,CAAAA,CAAE,IAAI,YAC/B,CAAA,WAAA,EAAc,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAE,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CACpD,EACF,IAAME,CAAAA,CAAQ/B,GAAAA,CAAK,CAAC,EAChB,MAAMnB,CAAAA,CAAkC0B,EAAK,OAAA,CAAQd,CAAAA,CAAKO,IAAK,CAAC,CAAC,CAAC,CAAA,CAClE,EAAC,CACCS,CAAAA,CAAMqB,EAAE3C,CAAAA,CAAO,CAAE,GAAG4C,CAAAA,CAAO,EAAA,CAAA9B,EAAI,GAAA,CAAAC,CAAI,CAAC,CAAA,CAC1C,OAAA,MAAMS,EAAUlB,CAAAA,CAAKgB,CAAAA,CAAI,KAAK,CAAA,CACvB,CACL,IAAA,CAAM,CAAA,CACN,IAAK,CAAE,EAAA,CAAI,KAAM,QAAA,CAAUA,CAAAA,CAAI,SAAU,SAAA,CAAWuB,GAAAA,CAAUvB,CAAAA,CAAI,KAAK,CAAE,CAC3E,CACF,CACA,KAAK,QAAA,CAAU,CACb,GAAI,CAACT,GAAAA,CAAK,CAAC,GAAMA,GAAAA,CAAK,CAAC,IAAM,SAAA,EAAaA,GAAAA,CAAK,CAAC,CAAA,GAAM,QAAA,CACpD,OAAO,CAAE,IAAA,CAAM,EAAG,GAAA,CAAK,CAAE,GAAI,KAAA,CAAO,KAAA,CAAO3B,CAAM,CAAE,CAAA,CACrD,IAAMc,CAAAA,CAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,EAC3BwC,CAAAA,CAAQ9C,CAAAA,CAAM,QAAQ,IAAA,CAAM+C,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAOlC,IAAK,CAAC,CAAC,EAClDe,CAAAA,CAAKoB,CAAAA,CAAOhD,EAAOa,GAAAA,CAAK,CAAC,CAAA,CAAGA,GAAAA,CAAK,CAAC,CAAA,CAAGC,CAAAA,CAAIxB,EAAM,IAAA,EAAW,EAAA,CAAIyB,CAAG,CAAA,CACvE,OAAA,MAAMS,EAAUlB,CAAAA,CAAKsB,CAAE,EAChB,CAAE,IAAA,CAAM,EAAG,GAAA,CAAK,CAAE,GAAI,IAAA,CAAM,IAAA,CAAMkB,CAAAA,EAAO,IAAA,CAAOhB,EAAQF,CAAAA,CAAIkB,CAAAA,CAAM,IAAI,CAAA,CAAI,IAAK,CAAE,CAC1F,CACA,KAAK,QAAA,CAAU,CACb,IAAM9C,CAAAA,CAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,EAC3BoC,CAAAA,CAAI3C,CAAAA,CAAcC,CAAK,CAAA,CACvBiD,EAAqC,CACzC,IAAA,CAAM,EACN,WAAA,CAAa,CAAA,CACb,QAAS,CAAA,CACT,MAAA,CAAQ,EACR,cAAA,CAAgB,CAAA,CAChB,KAAM,CAAA,CACN,OAAA,CAAS,CACX,CAAA,CACA,IAAA,IAAWC,KAAK,MAAA,CAAO,MAAA,CAAOlD,CAAAA,CAAM,KAAK,EAAGiD,CAAAA,CAAOC,CAAAA,CAAE,MAAM,CAAA,EAAK,CAAA,CAChE,OAAO,CACL,IAAA,CAAM,CAAA,CACN,GAAA,CAAK,CACH,EAAA,CAAI,IAAA,CACJ,YAAalD,CAAAA,CAAM,WAAA,CACnB,cAAemD,GAAAA,CAAcnD,CAAK,CAAA,EAAK,IAAA,CACvC,OAAAiD,CAAAA,CACA,OAAA,CAASjD,EAAM,OAAA,CACf,SAAA,CAAW6C,IAAU7C,CAAK,CAAA,CAC1B,OAAQ0C,CAAAA,CAAE,MAAA,CAASA,EAAE,MAAA,CAAO1C,CAAK,EAAI,IACvC,CACF,CACF,CACA,KAAK,OAAA,CAAS,CACZ,IAAMA,CAAAA,CAAQ,MAAM0B,EAAUpB,CAAG,CAAA,CAgBjC,OAAO,CAAE,IAAA,CAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,IAAA,CAAM,QAfnBN,CAAAA,CAAM,MAAA,CAAO,IAAKoD,CAAAA,GAAQ,CACxC,KAAA,CAAOA,CAAAA,CAAG,GACV,QAAA,CAAUA,CAAAA,CAAG,UAAY,IAAA,CACzB,KAAA,CAAO,OAAO,MAAA,CAAOpD,CAAAA,CAAM,KAAK,CAAA,CAC7B,MAAA,CAAQkD,GAAMA,CAAAA,CAAE,KAAA,GAAUE,EAAG,EAAA,EAAMF,CAAAA,CAAE,SAAW,SAAS,CAAA,CACzD,GAAA,CAAKA,CAAAA,GAAO,CACX,EAAA,CAAIA,CAAAA,CAAE,GACN,KAAA,CAAOA,CAAAA,CAAE,MACT,MAAA,CAAQA,CAAAA,CAAE,MAAA,CACV,IAAA,CAAMA,EAAE,IAAA,EAAQ,IAAA,CAChB,IAAKA,CAAAA,CAAE,WAAA,CAAY,OACf,IAAA,CAAK,KAAA,CAAMnC,CAAG,CAAA,CAAI,KAAK,KAAA,CAAMmC,CAAAA,CAAE,YAAYA,CAAAA,CAAE,WAAA,CAAY,OAAS,CAAC,CAAA,CAAG,EAAE,CAAA,CACxE,IACN,EAAE,CACN,CAAA,CAAE,CACyC,CAAE,CAC/C,CACA,KAAK,SAAA,CAAW,CACd,IAAMlD,EAAQ,MAAM0B,CAAAA,CAAUpB,CAAG,CAAA,CACjC,OAAO,CAAE,IAAA,CAAM,CAAA,CAAG,GAAA,CAAK,CAAE,GAAI,IAAA,CAAM,OAAA,CAASP,EAAcC,CAAK,CAAA,CAAE,QAAQA,CAAK,CAAE,CAAE,CACpF,CACA,KAAK,SAAA,CACH,OAAO,CAAE,IAAA,CAAM,EAAG,GAAA,CAAK,CAAE,GAAI,IAAA,CAAM,OAAA,CAAA,CAAU,MAAM0B,CAAAA,CAAUpB,CAAG,GAAG,OAAQ,CAAE,EAC/E,KAAK,SAAA,CACH,OAAO,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,IAAA,CAAM,SAAU,MAAMoB,CAAAA,CAAUpB,CAAG,CAAA,EAAG,OAAQ,CAAE,CAAA,CAC/E,KAAK,UAAA,CAAY,CACf,GAAI,CAACO,GAAAA,CAAK,CAAC,CAAA,CAAG,OAAO,CAAE,IAAA,CAAM,EAAG,GAAA,CAAK,CAAE,GAAI,KAAA,CAAO,KAAA,CAAO3B,CAAM,CAAE,CAAA,CACjE,IAAMc,CAAAA,CAAQ,MAAM0B,EAAUpB,CAAG,CAAA,CAC3B+C,EAAS,MAAM3D,CAAAA,CAAiB0B,CAAAA,CAAK,OAAA,CAAQd,EAAKO,GAAAA,CAAK,CAAC,CAAC,CAAC,CAAA,CAChE,OAAO,CACL,IAAA,CAAM,CAAA,CACN,GAAA,CAAK,CAAE,EAAA,CAAI,IAAA,CAAM,WAAYyC,CAAAA,CAAetD,CAAAA,CAAOD,EAAcC,CAAK,CAAA,CAAGqD,CAAM,CAAE,CACnF,CACF,CACA,KAAK,MAAA,CAAQ,CACX,IAAMrD,CAAAA,CAAQ,MAAM0B,EAAUpB,CAAG,CAAA,CACjC,GAAIO,GAAAA,CAAK,CAAC,IAAM,MAAA,CACd,OAAO,CACL,IAAA,CAAM,CAAA,CACN,GAAA,CAAK,CAAE,GAAI,IAAA,CAAM,KAAA,CAAO,OAAO,IAAA,CAAKb,CAAAA,CAAM,KAAK,CAAA,CAAG,MAAA,CAAQA,CAAAA,CAAM,KAAM,CACxE,CAAA,CACF,GAAIa,IAAK,CAAC,CAAA,GAAM,OAASA,GAAAA,CAAK,CAAC,CAAA,CAAG,CAChC,IAAMe,CAAAA,CAAK2B,CAAAA,CAAavD,EAAO,MAAMN,CAAAA,CAAe0B,EAAK,OAAA,CAAQd,CAAAA,CAAKO,IAAK,CAAC,CAAC,CAAC,CAAA,CAAGC,CAAAA,CAAIC,CAAG,CAAA,CACxF,OAAA,MAAMS,EAAUlB,CAAAA,CAAKsB,CAAE,CAAA,CAChB,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,IAAA,CAAM,MAAO,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAG,KAAK,CAAE,CAAE,CACpE,CACA,OAAO,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,MAAO,KAAA,CAAO1C,CAAM,CAAE,CACrD,CACA,QACE,OAAO,CAAE,KAAM,CAAA,CAAG,GAAA,CAAK,CAAE,EAAA,CAAI,KAAA,CAAO,MAAOA,CAAM,CAAE,CACvD,CACF","file":"chunk-YJNDBKIG.mjs","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n loadState,\n saveBrief,\n saveHandoff,\n saveState,\n statePath,\n withStateLock,\n} from \"../adapters/file.ts\";\nimport { next as planNext } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { init, validateAction } from \"../methodology.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { registerRole } from \"../roles.ts\";\nimport { lastEvent } from \"../state.ts\";\nimport { scrum } from \"../scrum/index.ts\";\nimport { kanban } from \"../kanban/index.ts\";\nimport type {\n Accounting,\n Action,\n Handoff,\n ItemStatus,\n Methodology,\n NewItem,\n Role,\n WorkflowState,\n} from \"../types.ts\";\n\nconst METHODOLOGIES: Record<string, () => Methodology> = {\n scrum: scrum as () => Methodology,\n kanban: kanban as () => Methodology,\n};\n\nexport const USAGE = [\n \"exwf init <scrum|kanban> --config <file> [--roles <file>]\",\n \"exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]\",\n \"exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf status | board | metrics | pending | lessons\",\n \"exwf validate <action.json> exwf role add <manifest.json> | role list\",\n];\n\nexport interface Parsed {\n positional: string[];\n flags: Record<string, string>;\n}\nexport function parseArgs(argv: string[]): Parsed {\n const positional: string[] = [];\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n const val = argv[i + 1];\n if (val !== undefined && !val.startsWith(\"--\")) {\n flags[key] = val;\n i++;\n } else flags[key] = \"true\";\n } else positional.push(a);\n }\n return { positional, flags };\n}\n\nasync function readJson<T>(file: string): Promise<T> {\n try {\n return JSON.parse(await readFile(file, \"utf8\")) as T;\n } catch (e) {\n return fail(\n \"invalid-input\",\n `cannot read JSON from ${file}: ${(e as Error).message}`,\n \"check the path and that the file is valid JSON\",\n );\n }\n}\n\nfunction methodologyOf(state: WorkflowState): Methodology {\n const f = Object.hasOwn(METHODOLOGIES, state.methodology)\n ? METHODOLOGIES[state.methodology]\n : undefined;\n if (!f)\n fail(\n \"config-invalid\",\n `methodology \"${state.methodology}\" is not available in this build`,\n `available: ${Object.keys(METHODOLOGIES).join(\", \")}`,\n );\n return f();\n}\n\nfunction num(flags: Record<string, string>, key: string): number {\n const v = Number(flags[key]);\n if (!Number.isFinite(v))\n fail(\n \"invalid-input\",\n `--${key} must be a number (got ${JSON.stringify(flags[key])})`,\n `pass --${key} <n>`,\n );\n return v;\n}\n\nexport interface CommandResult {\n exit: 0 | 1 | 2;\n out: unknown;\n}\n\n/** Commands that load, change and save the state: they run under .workflow/state.lock. */\nconst WRITERS = new Set([\"init\", \"add\", \"edit\", \"next\", \"complete\", \"ceremony\", \"decide\"]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes = cmd !== undefined && (WRITERS.has(cmd) || (cmd === \"role\" && sub === \"add\"));\n try {\n return writes ? await withStateLock(cwd, () => execute(argv, cwd)) : await execute(argv, cwd);\n } catch (e) {\n if (e instanceof WorkflowError) return { exit: 1, out: { ok: false, error: e.toJSON() } };\n throw e;\n }\n}\n\nasync function execute(argv: string[], cwd: string): Promise<CommandResult> {\n const { positional, flags } = parseArgs(argv);\n const [cmd, ...rest] = positional;\n const by = flags[\"by\"] ?? \"human\";\n const now = new Date().toISOString();\n switch (cmd) {\n case \"init\": {\n const [name] = rest;\n const f = name && Object.hasOwn(METHODOLOGIES, name) ? METHODOLOGIES[name] : undefined;\n if (!f || !flags[\"config\"]) return { exit: 2, out: { ok: false, usage: USAGE } };\n try {\n await stat(statePath(cwd));\n fail(\n \"invalid-input\",\n `${statePath(cwd)} already exists`,\n \"delete .workflow/state.json to start over\",\n );\n } catch (e) {\n if (e instanceof WorkflowError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n }\n const config = await readJson<unknown>(path.resolve(cwd, flags[\"config\"]));\n const roles = flags[\"roles\"]\n ? await readJson<Role[]>(path.resolve(cwd, flags[\"roles\"]))\n : undefined;\n const res = init(\n roles\n ? { methodology: f(), config, roles, by, now }\n : { methodology: f(), config, by, now },\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n state: {\n methodology: res.state.methodology,\n stages: res.state.stages.map((s) => s.id),\n roles: Object.keys(res.state.roles),\n },\n },\n };\n }\n case \"add\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const item = await readJson<NewItem>(path.resolve(cwd, rest[0]));\n const s2 = addItem(state, item, by, now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: getItem(s2, item.id) } };\n }\n case \"edit\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const s2 = editItem(\n state,\n rest[0],\n await readJson<ItemPatch>(path.resolve(cwd, rest[1])),\n by,\n now,\n );\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: getItem(s2, rest[0]) } };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts = flags[\"max\"] ? { max: num(flags, \"max\"), now } : { now };\n const res = planNext(state, methodologyOf(state), opts);\n await saveState(cwd, res.state);\n for (const b of res.briefs) await saveBrief(cwd, b);\n return {\n exit: 0,\n out: { ok: true, reason: res.reason ?? null, skipped: res.skipped, briefs: res.briefs },\n };\n }\n case \"complete\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const handoff = await readJson<Handoff>(path.resolve(cwd, rest[1]));\n if (handoff.item !== rest[0])\n fail(\n \"handoff-invalid\",\n `handoff.item \"${handoff.item}\" differs from the command's item \"${rest[0]}\"`,\n \"make them match\",\n );\n const role = flags[\"role\"] ?? handoff.role;\n const durationMs = num(flags, \"duration-ms\");\n const acc: Accounting = {\n item: rest[0],\n role,\n model: flags[\"model\"] ?? \"\",\n tokensIn: num(flags, \"tokens-in\"),\n tokensOut: num(flags, \"tokens-out\"),\n durationMs,\n startedAt: new Date(Date.parse(now) - durationMs).toISOString(),\n endedAt: now,\n };\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n await saveState(cwd, res.state);\n await saveHandoff(cwd, handoff, res.state.events.length);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, rest[0]) },\n };\n }\n case \"ceremony\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const c = Object.hasOwn(m.ceremonies, rest[0]) ? m.ceremonies[rest[0]] : undefined;\n if (!c)\n fail(\n \"unknown-ceremony\",\n `\"${rest[0]}\" is not a ${m.name} ceremony`,\n `available: ${Object.keys(m.ceremonies).join(\", \")}`,\n );\n const input = rest[1]\n ? await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]))\n : {};\n const res = c(state, { ...input, by, now });\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, lastEvent: lastEvent(res.state) },\n };\n }\n case \"decide\": {\n if (!rest[0] || (rest[1] !== \"approve\" && rest[1] !== \"reject\"))\n return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const entry = state.pending.find((p) => p.id === rest[0]);\n const s2 = decide(state, rest[0], rest[1], by, flags[\"note\"] ?? \"\", now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null } };\n }\n case \"status\": {\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const counts: Record<ItemStatus, number> = {\n todo: 0,\n in_progress: 0,\n blocked: 0,\n review: 0,\n awaiting_human: 0,\n done: 0,\n dropped: 0,\n };\n for (const i of Object.values(state.items)) counts[i.status] += 1;\n return {\n exit: 0,\n out: {\n ok: true,\n methodology: state.methodology,\n openIteration: openIteration(state) ?? null,\n counts,\n pending: state.pending,\n lastEvent: lastEvent(state),\n report: m.report ? m.report(state) : null,\n },\n };\n }\n case \"board\": {\n const state = await loadState(cwd);\n const columns = state.stages.map((st) => ({\n stage: st.id,\n wipLimit: st.wipLimit ?? null,\n items: Object.values(state.items)\n .filter((i) => i.stage === st.id && i.status !== \"dropped\")\n .map((i) => ({\n id: i.id,\n title: i.title,\n status: i.status,\n role: i.role ?? null,\n age: i.transitions.length\n ? Date.parse(now) - Date.parse(i.transitions[i.transitions.length - 1]!.at)\n : null,\n })),\n }));\n return { exit: 0, out: { ok: true, columns } };\n }\n case \"metrics\": {\n const state = await loadState(cwd);\n return { exit: 0, out: { ok: true, metrics: methodologyOf(state).metrics(state) } };\n }\n case \"pending\":\n return { exit: 0, out: { ok: true, pending: (await loadState(cwd)).pending } };\n case \"lessons\":\n return { exit: 0, out: { ok: true, lessons: (await loadState(cwd)).lessons } };\n case \"validate\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const action = await readJson<Action>(path.resolve(cwd, rest[0]));\n return {\n exit: 0,\n out: { ok: true, violations: validateAction(state, methodologyOf(state), action) },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: { ok: true, roles: Object.keys(state.roles), detail: state.roles },\n };\n if (rest[0] === \"add\" && rest[1]) {\n const s2 = registerRole(state, await readJson<Role>(path.resolve(cwd, rest[1])), by, now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, roles: Object.keys(s2.roles) } };\n }\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n default:\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n}\n"]}