ex-workflow 0.2.0-stage → 0.4.0-stage
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -1
- package/README.md +54 -12
- package/dist/adapters/index.cjs +1 -1
- package/dist/adapters/index.mjs +1 -1
- package/dist/chunk-36M6OVUJ.mjs +2 -0
- package/dist/chunk-36M6OVUJ.mjs.map +1 -0
- package/dist/{chunk-472WEDPJ.cjs → chunk-7KF5K3L7.cjs} +2 -2
- package/dist/{chunk-472WEDPJ.cjs.map → chunk-7KF5K3L7.cjs.map} +1 -1
- package/dist/chunk-CWBH7H52.cjs +2 -0
- package/dist/chunk-CWBH7H52.cjs.map +1 -0
- package/dist/chunk-DXC2RSN5.cjs +3 -0
- package/dist/chunk-DXC2RSN5.cjs.map +1 -0
- package/dist/{chunk-XSXHEEJX.mjs → chunk-GATJZYTB.mjs} +2 -2
- package/dist/{chunk-XSXHEEJX.mjs.map → chunk-GATJZYTB.mjs.map} +1 -1
- package/dist/chunk-GFH2FEZH.mjs +2 -0
- package/dist/chunk-GFH2FEZH.mjs.map +1 -0
- package/dist/{chunk-DBR24RTX.cjs → chunk-HHC5EZ54.cjs} +2 -2
- package/dist/{chunk-DBR24RTX.cjs.map → chunk-HHC5EZ54.cjs.map} +1 -1
- package/dist/chunk-KSKEFYY7.cjs +2 -0
- package/dist/chunk-KSKEFYY7.cjs.map +1 -0
- package/dist/chunk-KUUIAKEJ.cjs +2 -0
- package/dist/chunk-KUUIAKEJ.cjs.map +1 -0
- package/dist/{chunk-IBRC36PE.mjs → chunk-L2ZN6HEL.mjs} +2 -2
- package/dist/{chunk-IBRC36PE.mjs.map → chunk-L2ZN6HEL.mjs.map} +1 -1
- package/dist/chunk-NDORREWR.mjs +2 -0
- package/dist/chunk-NDORREWR.mjs.map +1 -0
- package/dist/{chunk-VN2UYV2O.mjs → chunk-NZ2DIDOD.mjs} +2 -2
- package/dist/{chunk-VN2UYV2O.mjs.map → chunk-NZ2DIDOD.mjs.map} +1 -1
- package/dist/chunk-OHSQ52DW.mjs +6 -0
- package/dist/chunk-OHSQ52DW.mjs.map +1 -0
- package/dist/chunk-RSKZVOYC.cjs +6 -0
- package/dist/chunk-RSKZVOYC.cjs.map +1 -0
- package/dist/chunk-S22CPYXJ.mjs +3 -0
- package/dist/chunk-S22CPYXJ.mjs.map +1 -0
- package/dist/chunk-SHAPFMVP.mjs +2 -0
- package/dist/chunk-SHAPFMVP.mjs.map +1 -0
- package/dist/chunk-SJRRQZ3R.cjs +2 -0
- package/dist/chunk-SJRRQZ3R.cjs.map +1 -0
- package/dist/{chunk-D4HNETUL.cjs → chunk-UM5X2JHB.cjs} +2 -2
- package/dist/{chunk-D4HNETUL.cjs.map → chunk-UM5X2JHB.cjs.map} +1 -1
- package/dist/cli/bin.cjs +1 -1
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.mjs +1 -1
- package/dist/cli/bin.mjs.map +1 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/kanban/index.cjs +1 -1
- package/dist/kanban/index.mjs +1 -1
- package/dist/schema/index.cjs +2 -0
- package/dist/schema/index.cjs.map +1 -0
- package/dist/schema/index.d.cts +57 -0
- package/dist/schema/index.d.ts +57 -0
- package/dist/schema/index.mjs +2 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/scrum/index.cjs +1 -1
- package/dist/scrum/index.mjs +1 -1
- package/dist/types.d.cts +38 -2
- package/dist/types.d.ts +38 -2
- package/dist/waterfall/index.cjs +2 -0
- package/dist/waterfall/index.cjs.map +1 -0
- package/dist/waterfall/index.d.cts +148 -0
- package/dist/waterfall/index.d.ts +148 -0
- package/dist/waterfall/index.mjs +2 -0
- package/dist/waterfall/index.mjs.map +1 -0
- package/package.json +31 -2
- package/dist/chunk-6R3YFUUV.cjs +0 -6
- package/dist/chunk-6R3YFUUV.cjs.map +0 -1
- package/dist/chunk-JDVE7DQR.cjs +0 -2
- package/dist/chunk-JDVE7DQR.cjs.map +0 -1
- package/dist/chunk-NQU5TH3A.mjs +0 -2
- package/dist/chunk-NQU5TH3A.mjs.map +0 -1
- package/dist/chunk-NRAPI3GV.cjs +0 -2
- package/dist/chunk-NRAPI3GV.cjs.map +0 -1
- package/dist/chunk-PD5FBDN7.mjs +0 -2
- package/dist/chunk-PD5FBDN7.mjs.map +0 -1
- package/dist/chunk-QDT35LXB.cjs +0 -2
- package/dist/chunk-QDT35LXB.cjs.map +0 -1
- package/dist/chunk-VGD4V5BA.mjs +0 -6
- package/dist/chunk-VGD4V5BA.mjs.map +0 -1
- package/dist/chunk-YJNDBKIG.mjs +0 -2
- 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"]}
|
package/dist/chunk-VGD4V5BA.mjs
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import {b}from'./chunk-2FRRD6A3.mjs';import {mkdir,open,stat,unlink,readFile,readdir,writeFile,rename}from'fs/promises';import {randomBytes}from'crypto';import n from'path';var c=".workflow";function y(t){return n.join(t,c,"state.json")}async function g(t,e){let i=`${t}.tmp-${process.pid}-${randomBytes(4).toString("hex")}`;try{await mkdir(n.dirname(t),{recursive:!0}),await writeFile(i,e,"utf8"),await rename(i,t);}catch(r){await unlink(i).catch(()=>{}),b("invalid-input",`cannot write ${t}: ${r.message}`,"check the directory exists and is writable");}}async function E(t,e,i={}){let{retries:r=40,intervalMs:d=50,staleMs:m=6e4}=i,a=n.join(t,c,"state.lock");await mkdir(n.dirname(a),{recursive:true});let u=false;for(let f=0;!u;f++)try{let s=await open(a,"wx");await s.writeFile(`${process.pid} ${new Date().toISOString()}
|
|
2
|
-
`),await s.close(),u=!0;}catch(s){if(s.code!=="EEXIST")throw s;if(await stat(a).then(w=>Date.now()-w.mtimeMs,()=>0)>m){await unlink(a).catch(()=>{});continue}f>=r&&b("invalid-input","another exwf command holds .workflow/state.lock","retry, or delete the file if no exwf process is running"),await new Promise(w=>setTimeout(w,d));}try{return await e()}finally{await unlink(a).catch(()=>{});}}async function D(t,e){await g(y(t),JSON.stringify(e,null,2)+`
|
|
3
|
-
`);}async function M(t){let e=y(t),i;try{i=await readFile(e,"utf8");}catch{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){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))&&b("invalid-input",`${e} does not contain a workflow state object`,"restore it from git or re-run exwf init");let d=r;d.version!==1&&b("state-version",`${e} has schema version ${String(d.version)}; this ex-workflow reads version 1`,"upgrade ex-workflow, or run the migration this version documents in its changelog");let m=n.join(t,c,"roles"),a=[];try{a=(await readdir(m)).filter(f=>f.endsWith(".json"));}catch{}let u={...d.roles};for(let f of a){let s=n.join(m,f),l;try{l=JSON.parse(await readFile(s,"utf8"));}catch(w){b("invalid-input",`role manifest ${s} is not valid JSON: ${w.message}`,"fix or delete that manifest");}(typeof l!="object"||l===null||typeof l.id!="string")&&b("invalid-input",`role manifest ${s} is not an object with a string id`,"a role manifest needs at least an id"),u[l.id]||(u[l.id]=l);}return {...d,roles:u}}function k(t,e){return n.resolve(e).startsWith(n.resolve(t,c)+n.sep)||b("invalid-input",`${e} resolves outside ${c}/`,"use a plain item id (letters, digits, - _ .)"),e}async function R(t,e){let i=k(t,n.join(t,c,"briefs",`${e.item.id}.json`));return await g(i,JSON.stringify(e,null,2)+`
|
|
4
|
-
`),i}async function T(t,e,i){let r=k(t,n.join(t,c,"handoffs",`${e.item}-${i}.json`));return await g(r,JSON.stringify(e,null,2)+`
|
|
5
|
-
`),r}export{c as a,y as b,E as c,D as d,M as e,R as f,T as g};//# sourceMappingURL=chunk-VGD4V5BA.mjs.map
|
|
6
|
-
//# sourceMappingURL=chunk-VGD4V5BA.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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","stat","st","resolve","saveState","state","loadState","raw","readFile","parsed","rolesDir","manifests","readdir","roles","manifestPath","role","inWorkflowDir","saveBrief","brief","saveHandoff","handoff","seq"],"mappings":"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","file":"chunk-VGD4V5BA.mjs","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 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 age = await stat(lock).then(\n (st) => Date.now() - st.mtimeMs,\n () => 0,\n );\n if (age > staleMs) {\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 await writeAtomic(statePath(root), JSON.stringify(state, null, 2) + \"\\n\");\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 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 if (typeof role !== \"object\" || role === null || typeof role.id !== \"string\") {\n fail(\n \"invalid-input\",\n `role manifest ${manifestPath} is not an object with a string id`,\n \"a role manifest needs at least an id\",\n );\n }\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"]}
|
package/dist/chunk-YJNDBKIG.mjs
DELETED
|
@@ -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":"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","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"]}
|