ex-workflow 0.0.0-stage → 0.1.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 +12 -0
- package/LICENSE +21 -0
- package/README.md +130 -2
- package/dist/adapters/index.cjs +2 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +17 -0
- package/dist/adapters/index.d.ts +17 -0
- package/dist/adapters/index.mjs +2 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/chunk-2FRRD6A3.mjs +2 -0
- package/dist/chunk-2FRRD6A3.mjs.map +1 -0
- package/dist/chunk-5XAKW64K.cjs +2 -0
- package/dist/chunk-5XAKW64K.cjs.map +1 -0
- package/dist/chunk-6R3YFUUV.cjs +6 -0
- package/dist/chunk-6R3YFUUV.cjs.map +1 -0
- package/dist/chunk-B7MP6Y3W.mjs +2 -0
- package/dist/chunk-B7MP6Y3W.mjs.map +1 -0
- package/dist/chunk-CPGDAHAU.cjs +2 -0
- package/dist/chunk-CPGDAHAU.cjs.map +1 -0
- package/dist/chunk-D7U3ES2L.mjs +2 -0
- package/dist/chunk-D7U3ES2L.mjs.map +1 -0
- package/dist/chunk-DZ7AN6H5.mjs +2 -0
- package/dist/chunk-DZ7AN6H5.mjs.map +1 -0
- package/dist/chunk-KIQOUUEZ.mjs +2 -0
- package/dist/chunk-KIQOUUEZ.mjs.map +1 -0
- package/dist/chunk-LPQSNYYT.cjs +2 -0
- package/dist/chunk-LPQSNYYT.cjs.map +1 -0
- package/dist/chunk-PO2SPQJP.cjs +2 -0
- package/dist/chunk-PO2SPQJP.cjs.map +1 -0
- package/dist/chunk-ROH3RYBI.mjs +2 -0
- package/dist/chunk-ROH3RYBI.mjs.map +1 -0
- package/dist/chunk-S3BXVHO7.cjs +2 -0
- package/dist/chunk-S3BXVHO7.cjs.map +1 -0
- package/dist/chunk-VGD4V5BA.mjs +6 -0
- package/dist/chunk-VGD4V5BA.mjs.map +1 -0
- package/dist/chunk-WAMNJUQ4.cjs +2 -0
- package/dist/chunk-WAMNJUQ4.cjs.map +1 -0
- package/dist/cli/bin.cjs +5 -0
- package/dist/cli/bin.cjs.map +1 -0
- package/dist/cli/bin.d.cts +1 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.mjs +5 -0
- package/dist/cli/bin.mjs.map +1 -0
- package/dist/cli/index.cjs +2 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +13 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.mjs +2 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +133 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/scrum/index.cjs +2 -0
- package/dist/scrum/index.cjs.map +1 -0
- package/dist/scrum/index.d.cts +59 -0
- package/dist/scrum/index.d.ts +59 -0
- package/dist/scrum/index.mjs +2 -0
- package/dist/scrum/index.mjs.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +320 -0
- package/dist/types.d.ts +320 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +133 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0-stage (2026-10-19)
|
|
4
|
+
|
|
5
|
+
Pre-release for integration testing, published under the `stage` dist-tag.
|
|
6
|
+
|
|
7
|
+
- Core: data-driven methodology engine (state, roles, items, gates, budgets, handoffs, escalation) on top of ex-flow.
|
|
8
|
+
- Scrum: sprint planning, daily, review, retro, carryover, DoD and agreements, velocity and cost-per-point metrics.
|
|
9
|
+
- Adapters subpath (`ex-workflow/adapters`): file-based state, briefs and handoffs with atomic writes and locking.
|
|
10
|
+
- `exwf` CLI (`ex-workflow/cli`): drive a workflow from the shell.
|
|
11
|
+
- 112 tests covering core, Scrum, adapters and CLI.
|
|
12
|
+
- Known backlog: see the "Known backlog" section of the README.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Supakit Kitjaroen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,131 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ex-workflow
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Methodology engine for AI teams. Scrum, Kanban and Waterfall (Scrum today; Kanban and Waterfall follow) are modelled as data (stages, roles, policies, gates, ceremonies) and driven by a pure state machine on top of the [`ex-flow`](https://www.npmjs.com/package/ex-flow) DAG planner. The program decides, the LLM executes: which item may move, who may approve, whether a sprint may close is enforced by the engine, not by a prompt.
|
|
4
|
+
|
|
5
|
+
State is plain JSON, every operation is `(state, action) -> state`, and every error names the rule, the item and a concrete fix. Core performs no I/O; a small file adapter and the `exwf` CLI sit on top. Runtime dependencies are exactly `ex-flow` and `exsorted`.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
pnpm add ex-workflow@stage
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The first pre-release is published under the `stage` dist-tag (`0.1.0-stage`); `latest` is reserved for 0.1.0.
|
|
14
|
+
|
|
15
|
+
Node >= 18. Runs on macOS, Linux and Windows.
|
|
16
|
+
|
|
17
|
+
## Quick start
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { init, addItem, next, complete } from "ex-workflow";
|
|
21
|
+
import { scrum } from "ex-workflow/scrum";
|
|
22
|
+
|
|
23
|
+
const m = scrum();
|
|
24
|
+
const config = { sprintBudget: { tokens: 300_000 }, productGoal: "ship the checkout", definitionOfDone: [{ kind: "evidence", evidenceKind: "test-output" }] };
|
|
25
|
+
let state = init({ methodology: m, config }).state;
|
|
26
|
+
state = addItem(state, { id: "CART", title: "cart API", weight: 3, priority: 5, acceptance: ["add/remove items"] }, "product-owner");
|
|
27
|
+
state = m.ceremonies["plan"]!(state, { by: "scrum-master", goal: "customers can pay", items: "auto" }).state;
|
|
28
|
+
|
|
29
|
+
const { state: s2, briefs } = next(state, m); // dispatches work, returns one brief per item
|
|
30
|
+
// ...run each brief with your agent, then record the result:
|
|
31
|
+
// state = complete(s2, m, handoff, accounting).state;
|
|
32
|
+
// state = m.ceremonies["review"]!(state, { by: "human", accepted: true, goalMet: true }).state;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
To persist state, use the file adapter (the only part of the package that touches disk):
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { loadState, saveState, withStateLock } from "ex-workflow/adapters";
|
|
39
|
+
|
|
40
|
+
await withStateLock(process.cwd(), async () => {
|
|
41
|
+
const state = await loadState(process.cwd());
|
|
42
|
+
await saveState(process.cwd(), complete(state, m, handoff, accounting).state);
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`test/sprint.e2e.test.ts` is a complete two-sprint scenario: rework, a blocker, an escalation, a retro that changes the working agreements, and metrics.
|
|
47
|
+
|
|
48
|
+
## CLI
|
|
49
|
+
|
|
50
|
+
State lives in `.workflow/`. Every command prints JSON; errors exit 1, bad usage exits 2.
|
|
51
|
+
|
|
52
|
+
| Command | Returns |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `init <scrum> --config <file> [--roles <file>]` | `{ ok, state: { methodology, stages, roles } }` |
|
|
55
|
+
| `add <item.json>` | `{ ok, item }` |
|
|
56
|
+
| `edit <id> <patch.json>` | `{ ok, item }` |
|
|
57
|
+
| `next [--max n]` | `{ ok, reason, briefs }`; writes `.workflow/briefs/<id>.json` |
|
|
58
|
+
| `complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m [--role r]` | `{ ok, item, warnings }` |
|
|
59
|
+
| `ceremony <name> [input.json] [--by who]` | `{ ok, warnings, lastEvent }` |
|
|
60
|
+
| `decide <pendingId> approve\|reject --by who [--note text]` | `{ ok, item }` |
|
|
61
|
+
| `status` | `{ ok, methodology, openIteration, counts, pending, lastEvent }` |
|
|
62
|
+
| `board` | `{ ok, columns }` |
|
|
63
|
+
| `metrics` | `{ ok, metrics }` |
|
|
64
|
+
| `pending` / `lessons` | the arrays |
|
|
65
|
+
| `validate <action.json>` | `{ ok: true, violations }` |
|
|
66
|
+
| `role add <manifest.json>` / `role list` | `{ ok, roles }` |
|
|
67
|
+
|
|
68
|
+
`--by` defaults to `human`.
|
|
69
|
+
|
|
70
|
+
### Concurrency
|
|
71
|
+
|
|
72
|
+
One writer at a time per `.workflow/`: `exwf` serialises writers with `.workflow/state.lock` (created exclusively, retried for about two seconds, taken over when older than 60 s). If a crashed process left the lock behind and a command reports that another `exwf` holds it, delete the file. Read-only commands do not lock. Use `withStateLock` from `ex-workflow/adapters` when you write state yourself.
|
|
73
|
+
|
|
74
|
+
## Layers
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
L3 MCP server (planned) daemon, hook enforcement, dashboard, team mode
|
|
78
|
+
L2 agent adapters Claude Code agents/*.md, future Cursor/Codex formats (planned)
|
|
79
|
+
L1 skills SKILL.md + scripts/wf.js (bundled L0) (planned)
|
|
80
|
+
L0 ex-workflow this spec: state, policy, planner, accounting (npm, free)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
This package is L0. All layers read and write the same `.workflow/` files.
|
|
84
|
+
|
|
85
|
+
## Status
|
|
86
|
+
|
|
87
|
+
0.1.0-stage is a pre-release for integration testing: core + Scrum, adapters and the `exwf` CLI. Expect changes before 0.1.0. Kanban and Waterfall follow. Design: [docs/superpowers/specs/2026-10-19-ex-workflow-design.md](docs/superpowers/specs/2026-10-19-ex-workflow-design.md).
|
|
88
|
+
|
|
89
|
+
## Known backlog
|
|
90
|
+
|
|
91
|
+
Minor items deferred past 0.1.0-stage:
|
|
92
|
+
|
|
93
|
+
- Stale-lock takeover can race when a lock is older than 60 s.
|
|
94
|
+
- `decide(approve)` ignores a `needs-review` verdict.
|
|
95
|
+
- `setDod` hard-codes the `review` stage id in the Scrum methodology.
|
|
96
|
+
- The `closing` sprint state is not enforced on commit, plan or uncommit.
|
|
97
|
+
- State is written before briefs; a crash between the two leaves them out of step.
|
|
98
|
+
- `roles/*.json` are re-merged on every load.
|
|
99
|
+
- Evidence can go stale across a rework cycle.
|
|
100
|
+
- The scrum stub size row in `size-budget.json` guards little; the `core+scrum` budget ratchets down from 45238 B (spec target 40960 B).
|
|
101
|
+
- Minor test gaps: retro duplicate-ref rejection, `writeAtomic` failure path, thin CLI usage and `decide` tests.
|
|
102
|
+
|
|
103
|
+
## Development gate
|
|
104
|
+
|
|
105
|
+
There is no hosted CI. A husky pre-commit hook runs the local gate on every commit
|
|
106
|
+
(`pnpm format:check && pnpm lint && pnpm typecheck && pnpm test`); `pnpm run ci` adds the
|
|
107
|
+
minified build, the dist identity check and the size ratchet, and `prepublishOnly` runs it
|
|
108
|
+
before any publish. oxfmt and oxlint need Node ^20.19 or >=22.12 on the developer machine; the
|
|
109
|
+
package itself supports Node >=18 (verified on ubuntu, macOS and Windows x Node 18/20/22
|
|
110
|
+
before the hosted workflow was removed).
|
|
111
|
+
|
|
112
|
+
## Publishing
|
|
113
|
+
|
|
114
|
+
For the owner. The `stage` dist-tag keeps `latest` free for 0.1.0:
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
pnpm run ci && npm publish --tag stage
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Design principles
|
|
121
|
+
|
|
122
|
+
1. One engine, three methodologies (Scrum today; Kanban and Waterfall follow), modelled as completely as the canonical texts describe them (Scrum Guide 2020; the Kanban Method's six practices, cadences, classes of service and flow metrics; classic phase-gate Waterfall with change control and traceability).
|
|
123
|
+
2. The program decides, the LLM executes. Which item may move, who may approve, whether a stage may start: engine, not prompt.
|
|
124
|
+
3. Roles are data. Methodologies reference capabilities, never role names.
|
|
125
|
+
4. Pure, serialisable state. Every operation is `(state, action) -> state` or `(state) -> view`. No I/O in core.
|
|
126
|
+
5. Zero runtime dependencies beyond `ex-flow` and `exsorted` (both MIT, both the owner's). Runs on Node on macOS, Linux and Windows.
|
|
127
|
+
6. Errors resolve: every violation names the exact rule, the exact item, and a concrete fix.
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
MIT
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunk6R3YFUUV_cjs=require('../chunk-6R3YFUUV.cjs');require('../chunk-S3BXVHO7.cjs');Object.defineProperty(exports,"WORKFLOW_DIR",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.a}});Object.defineProperty(exports,"loadState",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.e}});Object.defineProperty(exports,"saveBrief",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.f}});Object.defineProperty(exports,"saveHandoff",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.g}});Object.defineProperty(exports,"saveState",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.d}});Object.defineProperty(exports,"statePath",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.b}});Object.defineProperty(exports,"withStateLock",{enumerable:true,get:function(){return chunk6R3YFUUV_cjs.c}});//# sourceMappingURL=index.cjs.map
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WorkflowState, Brief, Handoff } from '../types.cjs';
|
|
2
|
+
|
|
3
|
+
declare const WORKFLOW_DIR = ".workflow";
|
|
4
|
+
declare function statePath(root: string): string;
|
|
5
|
+
interface LockOptions {
|
|
6
|
+
retries?: number;
|
|
7
|
+
intervalMs?: number;
|
|
8
|
+
staleMs?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Run `fn` while holding `.workflow/state.lock`, so concurrent exwf commands cannot lose each other's updates. */
|
|
11
|
+
declare function withStateLock<T>(root: string, fn: () => Promise<T>, opts?: LockOptions): Promise<T>;
|
|
12
|
+
declare function saveState(root: string, state: WorkflowState): Promise<void>;
|
|
13
|
+
declare function loadState(root: string): Promise<WorkflowState>;
|
|
14
|
+
declare function saveBrief(root: string, brief: Brief): Promise<string>;
|
|
15
|
+
declare function saveHandoff(root: string, handoff: Handoff, seq: number): Promise<string>;
|
|
16
|
+
|
|
17
|
+
export { type LockOptions, WORKFLOW_DIR, loadState, saveBrief, saveHandoff, saveState, statePath, withStateLock };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WorkflowState, Brief, Handoff } from '../types.js';
|
|
2
|
+
|
|
3
|
+
declare const WORKFLOW_DIR = ".workflow";
|
|
4
|
+
declare function statePath(root: string): string;
|
|
5
|
+
interface LockOptions {
|
|
6
|
+
retries?: number;
|
|
7
|
+
intervalMs?: number;
|
|
8
|
+
staleMs?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Run `fn` while holding `.workflow/state.lock`, so concurrent exwf commands cannot lose each other's updates. */
|
|
11
|
+
declare function withStateLock<T>(root: string, fn: () => Promise<T>, opts?: LockOptions): Promise<T>;
|
|
12
|
+
declare function saveState(root: string, state: WorkflowState): Promise<void>;
|
|
13
|
+
declare function loadState(root: string): Promise<WorkflowState>;
|
|
14
|
+
declare function saveBrief(root: string, brief: Brief): Promise<string>;
|
|
15
|
+
declare function saveHandoff(root: string, handoff: Handoff, seq: number): Promise<string>;
|
|
16
|
+
|
|
17
|
+
export { type LockOptions, WORKFLOW_DIR, loadState, saveBrief, saveHandoff, saveState, statePath, withStateLock };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var o=class extends Error{code;fix;items;rule;constructor(t,i,e,s={}){if(!e||e.trim()==="")throw new TypeError("WorkflowError: fix must not be empty");super(i),this.name="WorkflowError",this.code=t,this.fix=e,s.items&&(this.items=s.items),s.rule&&(this.rule=s.rule);}toJSON(){return {code:this.code,message:this.message,fix:this.fix,...this.items?{items:this.items}:{},...this.rule?{rule:this.rule}:{}}}};function n(r,t,i,e){throw new o(r,t,i,e)}var l=new Set(["__proto__","constructor","prototype"]);function g(r,t){(typeof r!="string"||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(r)||r.includes("..")||l.has(r))&&n("invalid-input",`${t} ${JSON.stringify(r)} is not a valid id`,"use letters, digits, - _ . (e.g. CART-12)");}export{o as a,n as b,g as c};//# sourceMappingURL=chunk-2FRRD6A3.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-2FRRD6A3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"names":["WorkflowError","code","message","fix","extra","fail","RESERVED_IDS","assertId","id","what"],"mappings":"AAOO,IAAMA,CAAAA,CAAN,cAA4B,KAAM,CAC9B,KACA,GAAA,CACA,KAAA,CACA,IAAA,CAET,WAAA,CAAYC,CAAAA,CAAiBC,CAAAA,CAAiBC,CAAAA,CAAaC,CAAAA,CAA4B,EAAC,CAAG,CACzF,GAAI,CAACD,CAAAA,EAAOA,CAAAA,CAAI,IAAA,EAAK,GAAM,GAAI,MAAM,IAAI,SAAA,CAAU,sCAAsC,EACzF,KAAA,CAAMD,CAAO,CAAA,CACb,IAAA,CAAK,KAAO,eAAA,CACZ,IAAA,CAAK,IAAA,CAAOD,CAAAA,CACZ,IAAA,CAAK,GAAA,CAAME,CAAAA,CACPC,CAAAA,CAAM,QAAO,IAAA,CAAK,KAAA,CAAQA,CAAAA,CAAM,KAAA,CAAA,CAChCA,EAAM,IAAA,GAAM,IAAA,CAAK,IAAA,CAAOA,CAAAA,CAAM,MACpC,CAEA,MAAA,EAA6F,CAC3F,OAAO,CACL,IAAA,CAAM,IAAA,CAAK,IAAA,CACX,QAAS,IAAA,CAAK,OAAA,CACd,GAAA,CAAK,IAAA,CAAK,IACV,GAAI,IAAA,CAAK,KAAA,CAAQ,CAAE,MAAO,IAAA,CAAK,KAAM,CAAA,CAAI,EAAC,CAC1C,GAAI,IAAA,CAAK,IAAA,CAAO,CAAE,IAAA,CAAM,IAAA,CAAK,IAAK,CAAA,CAAI,EACxC,CACF,CACF,EAEO,SAASC,CAAAA,CACdJ,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACO,CACP,MAAM,IAAIJ,EAAcC,CAAAA,CAAMC,CAAAA,CAASC,CAAAA,CAAKC,CAAK,CACnD,CAEA,IAAME,CAAAA,CAAe,IAAI,IAAI,CAAC,WAAA,CAAa,aAAA,CAAe,WAAW,CAAC,CAAA,CAG/D,SAASC,CAAAA,CAASC,EAAaC,CAAAA,CAAoB,CAAA,CAEtD,OAAOD,CAAAA,EAAO,UACd,CAAC,8BAAA,CAA+B,IAAA,CAAKA,CAAE,GACvCA,CAAAA,CAAG,QAAA,CAAS,IAAI,CAAA,EAChBF,CAAAA,CAAa,GAAA,CAAIE,CAAE,CAAA,GAEnBH,EACE,eAAA,CACA,CAAA,EAAGI,CAAI,CAAA,CAAA,EAAI,KAAK,SAAA,CAAUD,CAAE,CAAC,CAAA,kBAAA,CAAA,CAC7B,2CACF,EACJ","file":"chunk-2FRRD6A3.mjs","sourcesContent":["import type { ErrorCode } from \"./types.ts\";\n\nexport interface WorkflowErrorExtra {\n items?: string[];\n rule?: string;\n}\n\nexport class WorkflowError extends Error {\n readonly code: ErrorCode;\n readonly fix: string;\n readonly items?: string[];\n readonly rule?: string;\n\n constructor(code: ErrorCode, message: string, fix: string, extra: WorkflowErrorExtra = {}) {\n if (!fix || fix.trim() === \"\") throw new TypeError(\"WorkflowError: fix must not be empty\");\n super(message);\n this.name = \"WorkflowError\";\n this.code = code;\n this.fix = fix;\n if (extra.items) this.items = extra.items;\n if (extra.rule) this.rule = extra.rule;\n }\n\n toJSON(): { code: ErrorCode; message: string; fix: string; items?: string[]; rule?: string } {\n return {\n code: this.code,\n message: this.message,\n fix: this.fix,\n ...(this.items ? { items: this.items } : {}),\n ...(this.rule ? { rule: this.rule } : {}),\n };\n }\n}\n\nexport function fail(\n code: ErrorCode,\n message: string,\n fix: string,\n extra?: WorkflowErrorExtra,\n): never {\n throw new WorkflowError(code, message, fix, extra);\n}\n\nconst RESERVED_IDS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n/** Ids become object keys and file names: letters, digits, `.`, `_`, `-`; no `..`, no prototype names. */\nexport function assertId(id: unknown, what: string): void {\n if (\n typeof id !== \"string\" ||\n !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id) ||\n id.includes(\"..\") ||\n RESERVED_IDS.has(id)\n )\n fail(\n \"invalid-input\",\n `${what} ${JSON.stringify(id)} is not a valid id`,\n \"use letters, digits, - _ . (e.g. CART-12)\",\n );\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exFlow=require('ex-flow');function v(t){return t??new Date().toISOString()}function F(t){let e=new Set;for(let i of t.stages)e.has(i.id)&&chunkS3BXVHO7_cjs.b("config-invalid",`duplicate stage id "${i.id}"`,"give every stage a unique id"),e.add(i.id);let o={};for(let i of t.roles)chunkS3BXVHO7_cjs.c(i.id,"role id"),Object.hasOwn(o,i.id)&&chunkS3BXVHO7_cjs.b("duplicate-role",`duplicate role id "${i.id}"`,"give every role a unique id"),o[i.id]=i;let n=v(t.now);return {version:1,methodology:t.methodology,config:t.config,items:{},stages:t.stages,roles:o,iterations:[],events:[{seq:1,at:n,type:"state.created",by:"system",payload:{methodology:t.methodology}}],accounting:[],pending:[],lessons:[],agreements:[]}}function k(t,e,o,n,i){let r={seq:(t.events[t.events.length-1]?.seq??0)+1,at:v(i),type:e,by:o,payload:n};return {...t,events:[...t.events,r]}}function ge(t,e){for(let o=t.events.length-1;o>=0;o--){let n=t.events[o];if(e===void 0||n.type===e)return n}}function q(t,e){return Object.hasOwn(t.roles,e)?t.roles[e]:void 0}var ee=new Set(["in_progress","review","blocked"]);function we(t,e,o,n){chunkS3BXVHO7_cjs.c(e.id,"role id"),q(t,e.id)&&chunkS3BXVHO7_cjs.b("duplicate-role",`role "${e.id}" already exists`,`use a different id or retireRole("${e.id}") first`);let i={...t,roles:{...t.roles,[e.id]:e}};return k(i,"role.registered",o,{role:e.id,capabilities:e.capabilities},n)}function ye(t,e,o,n){q(t,e)||chunkS3BXVHO7_cjs.b("unknown-role",`role "${e}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")||"(none)"}`);let i=Object.values(t.items).filter(r=>r.role===e&&ee.has(r.status)).map(r=>r.id);i.length&&chunkS3BXVHO7_cjs.b("role-has-open-items",`role "${e}" still holds ${i.length} open item(s)`,`complete or reassign ${i.join(", ")} before retiring the role`,{items:i});let s={...t.roles};return delete s[e],k({...t,roles:s},"role.retired",o,{role:e},n)}function H(t,e){return t.capabilities.includes(e)}function j(t,e){return Object.values(t.roles).filter(o=>H(o,e))}function b(t,e,o,n){return Object.values(t.roles).filter(i=>i.id!==n&&i.canApprove.includes(e)&&(o===void 0||i.capabilities.includes(o))).map(i=>i.id)}function ve(t,e){return j(t,"approve-gate").filter(o=>o.canApprove.includes(e))}function G(t,e,o){for(let n of e)j(t,n).length===0&&chunkS3BXVHO7_cjs.b("missing-capability",`no registered role has capability "${n}"`,`register a role whose capabilities include "${n}" (registerRole) before init`);for(let n of o){let i=j(t,n);i.length>1&&chunkS3BXVHO7_cjs.b("exclusive-capability",`capability "${n}" must belong to exactly one role but is held by ${i.map(s=>s.id).join(", ")}`,`remove "${n}" from all but one role`);}}function L(t,e){return e.length===0?[]:Object.values(t.roles).filter(o=>e.every(n=>H(o,n)))}function M(t,e){let o=t.stages.find(n=>n.id===e);return o||chunkS3BXVHO7_cjs.b("unknown-stage",`stage "${e}" does not exist`,`stages are: ${t.stages.map(n=>n.id).join(" \u2192 ")}`),o}function te(t,e){let o=t.stages.findIndex(n=>n.id===e);return o<0&&M(t,e),t.stages[o+1]}function oe(t,e){return t.stages[t.stages.length-1]?.id===e}function I(t,e){return {...t,items:{...t.items,[e.id]:e}}}function ne(t,e,o){return I(t,o(W(t,e)))}function ie(t,e,o){return ne(t,e,n=>{let i={...n};for(let s of o)delete i[s];return i})}function W(t,e){let o=Object.hasOwn(t.items,e)?t.items[e]:void 0;return o||chunkS3BXVHO7_cjs.b("unknown-item",`item "${e}" does not exist`,`add it with addItem first; known items: ${Object.keys(t.items).join(", ")||"(none)"}`,{items:[e]}),o}function C(t,e,o){let n=e.filter(i=>!Object.hasOwn(t.items,i));n.length&&chunkS3BXVHO7_cjs.b("unknown-item",`${o} refers to unknown item(s) ${n.join(", ")}`,"add those items first or remove the reference",{items:n});}function $e(t,e,o,n){chunkS3BXVHO7_cjs.c(e.id,"item id"),Object.hasOwn(t.items,e.id)&&chunkS3BXVHO7_cjs.b("duplicate-item",`item "${e.id}" already exists`,"use editItem to change it, or pick a new id",{items:[e.id]});let i=t.stages[0];i||chunkS3BXVHO7_cjs.b("config-invalid","state has no stages","create the state with at least one stage");let s=e.stage??i.id;M(t,s),C(t,e.dependsOn??[],`item "${e.id}".dependsOn`),e.affects&&C(t,e.affects,`item "${e.id}".affects`),e.parent!==void 0&&C(t,[e.parent],`item "${e.id}".parent`),e.role!==void 0&&!Object.hasOwn(t.roles,e.role)&&chunkS3BXVHO7_cjs.b("unknown-role",`role "${e.role}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")}`);let{stage:r,...a}=e,l={type:"task",acceptance:[],dependsOn:[],...a,id:e.id,title:e.title,stage:s,status:"todo",evidence:[],blockers:[],transitions:[]},f=I(t,l);return k(f,"item.added",o,{id:l.id,type:l.type,stage:l.stage,weight:l.weight??null,priority:l.priority??null},n)}function be(t,e,o,n,i){let s=W(t,e);o.dependsOn&&C(t,o.dependsOn,`item "${e}".dependsOn`),o.affects&&C(t,o.affects,`item "${e}".affects`),o.parent!==void 0&&C(t,[o.parent],`item "${e}".parent`),o.role!==void 0&&!Object.hasOwn(t.roles,o.role)&&chunkS3BXVHO7_cjs.b("unknown-role",`role "${o.role}" does not exist`,`registered roles: ${Object.keys(t.roles).join(", ")}`);let r=Object.keys(o).filter(f=>JSON.stringify(o[f])!==JSON.stringify(s[f]));r.length===0&&chunkS3BXVHO7_cjs.b("no-op",`editItem("${e}") changes nothing`,"pass at least one field with a different value",{items:[e]});let a={...s};for(let f of r)a[f]=o[f];let l=I(t,a);return k(l,"item.edited",n,{id:e,changed:r},i)}function $(t,e,o,n,i){let s=W(t,e),r=o.stage??s.stage;M(t,r),(s.status==="done"||s.status==="dropped")&&chunkS3BXVHO7_cjs.b("invalid-transition",`item "${e}" is ${s.status} and cannot move`,"create a new item (or a change-request) instead of reopening a finished one",{items:[e]}),r===s.stage&&o.status===s.status&&chunkS3BXVHO7_cjs.b("no-op",`item "${e}" is already ${s.status} in "${r}"`,"choose a different stage or status",{items:[e]});let a=v(i),l={...s,stage:r,status:o.status,transitions:[...s.transitions,{from:{stage:s.stage,status:s.status},to:{stage:r,status:o.status},at:a,by:n}]},f=I(t,l);return k(f,"item.transition",n,{id:e,from:{stage:s.stage,status:s.status},to:{stage:r,status:o.status}},a)}function Ie(t,e,o,n){let i=W(t,e),s=v(n),r={...i,evidence:[...i.evidence,{...o,at:s}]},a=I(t,r);return k(a,"item.evidence",o.by,{id:e,kind:o.kind,ref:o.ref},s)}function J(t,e,o,n,i,s){let r=W(t,e),a=v(s),l=`${e}-b${r.blockers.length+1}`,f={...r,status:"blocked",blockers:[...r.blockers,{id:l,reason:o,owner:n,raisedAt:a}],transitions:r.status==="blocked"?r.transitions:[...r.transitions,{from:{stage:r.stage,status:r.status},to:{stage:r.stage,status:"blocked"},at:a,by:i}]},u=I(t,f);return k(u,"blocker.raised",i,{id:e,blocker:l,reason:o,owner:n},a)}function K(t,e){for(let o=t.transitions.length-1;o>=0;o--){let n=t.transitions[o];if(n.to.status===e)return n}}function Oe(t,e,o,n,i){let s=W(t,e),r=s.blockers.findIndex(g=>g.id===o&&!g.clearedAt);r<0&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${e}" has no open blocker "${o}"`,`open blockers: ${s.blockers.filter(g=>!g.clearedAt).map(g=>g.id).join(", ")||"(none)"}`,{items:[e]});let a=v(i),l=s.blockers.map((g,y)=>y===r?{...g,clearedAt:a}:g),f=l.some(g=>!g.clearedAt),u=K(s,"blocked")?.from.status??"todo",p=s.stage,h=u,x=false;u==="in_progress"?(h="todo",p=K(s,"in_progress")?.from.stage??s.stage):u==="awaiting_human"&&(h=M(t,s.stage).review?"review":"todo",x=true);let{role:D,...P}=s,A={...x&&!f?P:s,blockers:l,stage:f?s.stage:p,status:f?"blocked":h,transitions:f?s.transitions:[...s.transitions,{from:{stage:s.stage,status:"blocked"},to:{stage:p,status:h},at:a,by:n}]},_=I(t,A);return k(_,"blocker.cleared",n,{id:e,blocker:o},a)}function T(t,e){return ie(t,e,["role"])}function Z(t,e,o,n,i){let s=W(t,e),r=te(t,s.stage);if(!r)return $(t,e,{status:"done"},o,i);if(oe(t,r.id))return $(t,e,{stage:r.id,status:"done"},o,i);let a=n||r.review===true?"review":"todo";return T($(t,e,{stage:r.id,status:a},o,i),e)}function V(t,e,o){let n=[],i=(s,r,a)=>n.push({rule:s,severity:"error",item:e.id,message:r,fix:a});for(let s of o)switch(s.kind){case "evidence":e.evidence.some(r=>r.kind===s.evidenceKind)||i("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&&i("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&&i("policy:estimate-present",`item "${e.id}" has no weight`,"editItem with a weight (story points)");break;case "no-open-blockers":{let r=e.blockers.filter(a=>!a.clearedAt);r.length&&i("policy:no-open-blockers",`item "${e.id}" has ${r.length} open blocker(s)`,`clearBlocker ${r.map(a=>a.id).join(", ")}`);break}case "dependencies-done":{let r=e.dependsOn.filter(a=>t.items[a]?.status!=="done");r.length&&i("policy:dependencies-done",`item "${e.id}" depends on unfinished ${r.join(", ")}`,`finish ${r.join(", ")} first`);break}case "custom":e.evidence.some(r=>r.kind===`policy:${s.id}`)||i(`policy:custom:${s.id}`,`item "${e.id}" has not satisfied "${s.description}"`,`attach evidence { kind: "policy:${s.id}" } when it is satisfied`);break}return n}function Ce(t,e,o,n){let i=V(t,e,o);i.length&&chunkS3BXVHO7_cjs.b("policy-unmet",`item "${e.id}" cannot ${n}: ${i.length} polic${i.length===1?"y":"ies"} unmet`,i.map(s=>s.fix).join("; "),{items:[e.id]});}function re(t,e){let o=new Map(t.stages.map((i,s)=>[i.id,s])),n=o.get(e.stage);if(n!==void 0)for(let i=e.transitions.length-1;i>=0;i--){let s=e.transitions[i],r=o.get(s.from.stage);if(s.to.status==="in_progress"&&r!==void 0&&r<n)return s}}function N(t,e){let o=re(t,e);if(o)return o.by;for(let n=e.transitions.length-1;n>=0;n--){let i=e.transitions[n];if(i.to.status==="in_progress")return i.by}}function se(t,e,o,n){let i=[];for(let r of o.evidence)e.evidence.some(a=>a.kind===r)||i.push({rule:"gate:evidence",severity:"error",item:e.id,message:`gate "${o.id}" needs evidence "${r}" on item "${e.id}"`,fix:`attach evidence { kind: "${r}" } before approving`});if(i.length)return {outcome:"fail",violations:i};let s=false;for(let r of o.requires){if(r==="human"){n!=="human"&&(s=true);continue}if(!b(t,o.id,r.capability).includes(n)){i.push({rule:"gate:capability",severity:"error",item:e.id,message:`"${n}" may not approve gate "${o.id}" (needs capability "${r.capability}" and canApprove "${o.id}")`,fix:`approve as one of: ${b(t,o.id,r.capability).join(", ")||"(no role qualifies; register one)"}`});continue}let l=N(t,e);if(l!==void 0&&l===n){let f=b(t,o.id,r.capability,n);i.push({rule:"conflict-of-interest",severity:"error",item:e.id,message:`role "${n}" did the work on "${e.id}" and may not approve it`,fix:`approve as a different role: ${f.join(", ")||"(register another approver)"}`});}}return i.length?{outcome:"fail",violations:i}:s?{outcome:"human"}:{outcome:"pass"}}function Ne(t,e,o){let n=v(o),i=`p${t.events.filter(a=>a.type==="pending.raised").length+1}`,s={...e,id:i,raisedAt:n},r={...t,pending:[...t.pending,s]};return e.item&&W(r,e.item).status!=="awaiting_human"&&(r=$(r,e.item,{status:"awaiting_human"},"system",n)),k(r,"pending.raised","system",{id:i,kind:e.kind,item:e.item??null,gate:e.gate??null},n)}function Be(t,e,o,n,i,s){o!=="approve"&&o!=="reject"&&chunkS3BXVHO7_cjs.b("invalid-input",`decision must be "approve" or "reject" (got ${JSON.stringify(o)})`,"pass approve or reject");let r=t.pending.find(p=>p.id===e);r||chunkS3BXVHO7_cjs.b("unknown-pending",`no pending decision "${e}"`,`open decisions: ${t.pending.map(p=>p.id).join(", ")||"(none)"}`);let a=r.kind==="gate"&&r.item?W(t,r.item):void 0,l=a&&(t.stages.find(p=>r.gate!==void 0&&p.gate?.id===r.gate)?.gate??t.stages.find(p=>p.id===a.stage)?.gate);a&&l&&n!=="human"&&(l.requires.includes("human")?void 0:se(t,a,l,n))?.outcome!=="pass"&&chunkS3BXVHO7_cjs.b("gate-unmet",`"${n}" may not decide gate "${l.id}" on "${a.id}"`,`decide as one of: human${l.requires.flatMap(h=>h==="human"?[]:b(t,l.id,h.capability)).map(h=>`, ${h}`).join("")}`,{items:[a.id],rule:"gate"});let f=v(s),u={...t,pending:t.pending.filter(p=>p.id!==e)};if(u=k(u,"pending.decided",n,{id:e,decision:o,note:i,item:r.item??null,gate:r.gate??null},f),a){let p=a.id,h=r.gate??l?.id??null;if(o==="approve")u=Z(u,p,n,false,f),u=k(u,"gate.passed",n,{item:p,gate:h},f);else {let x=l?.onFail??{action:"block"};x.action==="return-to"?u=T($(u,p,{stage:x.stage,status:"todo"},n,f),p):u=J(u,p,`gate "${h??"?"}" rejected: ${i||"no reason given"}`,n,n,f),u=k(u,"gate.failed",n,{item:p,gate:h,note:i},f);}}return u}var _e={tokens:0,turns:0,wallclockMs:0};function Te(t,e){return {tokens:t.tokens+e.tokensIn+e.tokensOut,turns:t.turns+1,wallclockMs:t.wallclockMs+e.durationMs}}function z(t,e){let o={};return t.tokens!==void 0&&(o.tokens=Math.max(0,t.tokens-e.tokens)),t.turns!==void 0&&(o.turns=Math.max(0,t.turns-e.turns)),t.wallclockMs!==void 0&&(o.wallclockMs=Math.max(0,t.wallclockMs-e.wallclockMs)),o}function Ve(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 Q(t,e,o=2e4){let n=e??1,i=[];for(let a of t.accounting){let l=t.items[a.item]?.weight;l===void 0||l<=0||i.push((a.tokensIn+a.tokensOut)/l);}if(i.length===0)return o*n;i.sort((a,l)=>a-l);let s=Math.floor(i.length/2),r=i.length%2?i[s]:(i[s-1]+i[s])/2;return Math.round(r*n)}function de(t){return t.iterations.find(e=>e.endedAt===void 0)}function X(t,e){if(e.role){let n=q(t,e.role);return n||chunkS3BXVHO7_cjs.b("unknown-role",`item "${e.id}" is assigned to unknown role "${e.role}"`,"editItem with an existing role id"),n}if(e.status==="review"){let n=N(t,e),i=j(t,"review"),r=i.find(a=>a.id!==n)??(i.length===1?i[0]:void 0);return r||chunkS3BXVHO7_cjs.b("missing-capability",`no role has capability "review" for item "${e.id}"`,"register a role with capability review",{items:[e.id]}),r}let o=j(t,"deliver")[0];return o||chunkS3BXVHO7_cjs.b("missing-capability",`no role has capability "deliver" for item "${e.id}"`,"register a role with capability deliver",{items:[e.id]}),o}function U(t){let e={};for(let o of Object.values(t.roles))o.maxConcurrent!==void 0&&(e[o.resourceClass??o.id]=o.maxConcurrent);return e}function ce(t,e){let o=new Set(t.map(n=>n.id));return t.map(n=>{let i=X(e,n),s={id:n.id,data:{id:n.id},dependsOn:n.dependsOn.filter(r=>o.has(r)),resourceClass:i.resourceClass??i.id};return n.priority!==void 0&&(s.priority=n.priority),n.weight!==void 0&&(s.weight=n.weight),n.deadline!==void 0&&(s.deadline=Date.parse(n.deadline)),s})}function Ue(t,e,o={}){let n=v(o.now),i=e.candidates(t),s=i.filter(c=>c.dependsOn.every(m=>t.items[m]?.status==="done"||i.some(w=>w.id===m))),r=i.filter(c=>c.dependsOn.every(m=>t.items[m]?.status==="done"));if(s.length===0)return {state:t,dispatched:[],reason:"no-candidates"};let a=e.plannerOptions(t),l={schedulerMode:a.schedulerMode,resourceCaps:U(t)};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);let f,u;try{let c=new exFlow.ExFlow(l);for(let w of ce(s,t))c.addEntity(w);let m=c.resolveExecutionDetails();f=(m.plan.batches[0]??[]).map(w=>w.id),u=m.metrics;}catch(c){throw c instanceof exFlow.ExFlowRuntimeError&&chunkS3BXVHO7_cjs.b("planner-error",`ex-flow refused the graph: [${c.code}] ${c.message}`,"fix the item graph (cycles, duplicate ids) with editItem; see diagnostics in the message",{items:s.map(m=>m.id)}),c}let p=f.map(c=>t.items[c]).filter(c=>c.dependsOn.every(m=>t.items[m]?.status==="done")),h=Object.values(t.items).filter(c=>c.status==="in_progress"),x={};for(let c of h){let m=c.role?q(t,c.role):void 0,w=m?m.resourceClass??m.id:"?";x[w]=(x[w]??0)+1;}let D=U(t),P=de(t),A=P?z(P.budget,P.spent).tokens:void 0,_=Math.min(o.max??1/0,a.concurrencyCap??1/0),g=[],y,S=t;for(let c of p){if(g.length>=_){y="wip-full";break}let m=c.status==="todo"&&a.dispatchStage!==void 0?a.dispatchStage:c.stage,w=M(t,m);if(V(t,c,w.entryPolicy).length>0)continue;if(w.wipLimit!==void 0&&h.filter(O=>O.stage===w.id).length+g.filter(O=>O.stage===w.id).length>=w.wipLimit){y="wip-full";continue}let B=X(t,c),E=B.resourceClass??B.id;if(D[E]!==void 0&&(x[E]??0)>=D[E]){y="wip-full";continue}if(A!==void 0){let O=Q(t,c.weight,o.fallbackTokensPerWeight);if(O>A){y="budget-exhausted";continue}A-=O;}x[E]=(x[E]??0)+1,S=$(S,c.id,{stage:m,status:"in_progress"},B.id,n),S={...S,items:{...S.items,[c.id]:{...S.items[c.id],role:B.id}}},g.push(S.items[c.id]);}return y===void 0&&g.length<r.length&&(y="wip-full"),g.length===0&&y===void 0&&(y="no-candidates"),S=k(S,"planner.resolved","planner",{dispatched:g.map(c=>c.id),reason:y??null,metrics:u},n),y?{state:S,dispatched:g,reason:y}:{state:S,dispatched:g}}function Y(t){return [{id:"separation-lost",severity:"warning",check(n,i){return i.type!=="init"&&i.type!=="role.register"?[]:L(n,t.requiredCapabilities).map(s=>({rule:"separation-lost",severity:"warning",message:`role "${s.id}" holds every required capability (${t.requiredCapabilities.join(", ")}); no separation of duties`,fix:"fine for a solo operator; otherwise split capabilities across roles"}))}},{id:"conflict-of-interest",severity:"error",check(n,i){if(i.type!=="complete")return [];let s=i.payload?.handoff;if(!s)return [];let r=s.verdict??"done";if(r!=="done"&&r!=="needs-review")return [];let a=n.items[s.item];if(!a)return [];let l=n.stages.find(u=>u.id===a.stage)?.gate;if(!l||!l.requires.some(u=>u!=="human"))return [];if(N(n,a)!==s.role)return [];let f=b(n,l.id,void 0,s.role);return [{rule:"conflict-of-interest",severity:"error",item:a.id,message:`role "${s.role}" authored "${a.id}" and may not pass gate "${l.id}" on it`,fix:`hand the gate to another approver: ${f.join(", ")||"(register one)"}`}]}}]}function fe(t,e,o){let n=[];for(let i of [...Y(e),...e.rules])n.push(...i.check(t,o));return n}function ue(t,e,o,n){let i=fe(t,e,o),s=i.filter(r=>r.severity==="error");return s.length&&chunkS3BXVHO7_cjs.b("rule-violation",`${o.type} violates ${s.map(r=>r.rule).join(", ")}: ${s.map(r=>r.message).join("; ")}`,s.map(r=>r.fix).join("; "),{rule:s[0].rule,items:s.map(r=>r.item).filter(r=>!!r)}),{state:n(t),warnings:i.filter(r=>r.severity==="warning")}}function st(t){let e=t.methodology,o=e.validateConfig(t.config),n=t.stages??e.defaultStages(o),i=t.roles??e.defaultRoles(o),s=t.now!==void 0?{methodology:e.name,config:o,stages:n,roles:i,now:t.now}:{methodology:e.name,config:o,stages:n,roles:i},r=F(s);return G(r,e.requiredCapabilities,e.exclusiveCapabilities),ue(r,e,{type:"init",by:t.by??"system"},a=>a)}exports.A=Z;exports.B=V;exports.C=Ce;exports.D=re;exports.E=N;exports.F=se;exports.G=Ne;exports.H=Be;exports.I=_e;exports.J=Te;exports.K=z;exports.L=Ve;exports.M=Q;exports.N=de;exports.O=X;exports.P=U;exports.Q=ce;exports.R=Ue;exports.S=Y;exports.T=fe;exports.U=ue;exports.V=st;exports.a=v;exports.b=F;exports.c=k;exports.d=ge;exports.e=q;exports.f=we;exports.g=ye;exports.h=H;exports.i=j;exports.j=b;exports.k=ve;exports.l=G;exports.m=L;exports.n=M;exports.o=te;exports.p=oe;exports.q=ne;exports.r=ie;exports.s=W;exports.t=$e;exports.u=be;exports.v=$;exports.w=Ie;exports.x=J;exports.y=Oe;exports.z=T;//# sourceMappingURL=chunk-5XAKW64K.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-5XAKW64K.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state.ts","../src/roles.ts","../src/items.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","stageOf","stageId","s","nextStageOf","idx","isTerminalStage","putItem","item","patchItem","fn","getItem","stripItemFields","keys","copy","k","it","assertKnownItems","ids","what","missing","d","addItem","firstStage","_s","rest","editItem","patch","changed","updated","moveItem","to","toStage","addEvidence","evidence","raiseBlocker","reason","owner","blockerId","lastTransitionTo","status","t","clearBlocker","b","blockers","stillBlocked","prev","toStatus","dropRole","_r","noRole","clearRole","itemId","advanceItem","wantsReview","evaluatePolicies","policies","out","v","rule","message","fix","p","e","notDone","assertPolicies","context","unmet","u","lastDispatchBefore","order","here","from","authorOf","before","checkGate","gate","violations","kind","needsHuman","req","author","others","raisePending","pending","entry","decide","pendingId","decision","note","item0","q","onFail","ZERO_SPENT","addSpent","spent","acc","remaining","budget","isExhausted","estimateTokens","weight","fallbackPerWeight","w","samples","iw","x","y","mid","median","openIteration","assignRole","reviewers","resourceCapsFor","caps","toExNodes","items","present","node","plan","methodology","opts","all","candidates","readyAll","po","options","firstBatch","metrics","flow","ExFlow","n","details","ExFlowRuntimeError","ready","inProgress","perClass","cls","iteration","tokensLeft","limit","dispatched","target","stage","est","coreRulesFor","action","handoff","verdict","validateAction","applyAction","reduce","errors","init","m","config","stages","stateInput"],"mappings":"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","file":"chunk-5XAKW64K.cjs","sourcesContent":["import { assertId, fail } from \"./errors.ts\";\nimport type { Event, MethodologyName, Role, Stage, WorkflowState } from \"./types.ts\";\n\nexport function nowOf(now?: string): string {\n return now ?? new Date().toISOString();\n}\n\nexport interface CreateStateInput {\n methodology: MethodologyName;\n config: unknown;\n stages: Stage[];\n roles: Role[];\n now?: string;\n}\n\nexport function createState(input: CreateStateInput): WorkflowState {\n const seenStages = new Set<string>();\n for (const st of input.stages) {\n if (seenStages.has(st.id))\n fail(\"config-invalid\", `duplicate stage id \"${st.id}\"`, \"give every stage a unique id\");\n seenStages.add(st.id);\n }\n const roles: Record<string, Role> = {};\n for (const r of input.roles) {\n assertId(r.id, \"role id\");\n if (Object.hasOwn(roles, r.id))\n fail(\"duplicate-role\", `duplicate role id \"${r.id}\"`, \"give every role a unique id\");\n roles[r.id] = r;\n }\n const at = nowOf(input.now);\n return {\n version: 1,\n methodology: input.methodology,\n config: input.config,\n items: {},\n stages: input.stages,\n roles,\n iterations: [],\n events: [\n {\n seq: 1,\n at,\n type: \"state.created\",\n by: \"system\",\n payload: { methodology: input.methodology },\n },\n ],\n accounting: [],\n pending: [],\n lessons: [],\n agreements: [],\n };\n}\n\nexport function appendEvent(\n state: WorkflowState,\n type: string,\n by: string,\n payload: unknown,\n now?: string,\n): WorkflowState {\n const last = state.events[state.events.length - 1];\n const ev: Event = { seq: (last?.seq ?? 0) + 1, at: nowOf(now), type, by, payload };\n return { ...state, events: [...state.events, ev] };\n}\n\nexport function lastEvent(state: WorkflowState, type?: string): Event | undefined {\n for (let i = state.events.length - 1; i >= 0; i--) {\n const ev = state.events[i]!;\n if (type === undefined || ev.type === type) return ev;\n }\n return undefined;\n}\n","import { assertId, fail } from \"./errors.ts\";\nimport { appendEvent } from \"./state.ts\";\nimport type { Capability, Role, WorkflowState } from \"./types.ts\";\n\n/** Own-property role lookup (ids such as \"constructor\" never hit the prototype). */\nexport function roleOf(state: WorkflowState, id: string): Role | undefined {\n return Object.hasOwn(state.roles, id) ? state.roles[id] : undefined;\n}\n\nconst OPEN: ReadonlySet<string> = new Set([\"in_progress\", \"review\", \"blocked\"]);\n\nexport function registerRole(\n state: WorkflowState,\n role: Role,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(role.id, \"role id\");\n if (roleOf(state, role.id))\n fail(\n \"duplicate-role\",\n `role \"${role.id}\" already exists`,\n `use a different id or retireRole(\"${role.id}\") first`,\n );\n const next = { ...state, roles: { ...state.roles, [role.id]: role } };\n return appendEvent(\n next,\n \"role.registered\",\n by,\n { role: role.id, capabilities: role.capabilities },\n now,\n );\n}\n\nexport function retireRole(\n state: WorkflowState,\n roleId: string,\n by: string,\n now?: string,\n): WorkflowState {\n if (!roleOf(state, roleId))\n fail(\n \"unknown-role\",\n `role \"${roleId}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \") || \"(none)\"}`,\n );\n const open = Object.values(state.items)\n .filter((i) => i.role === roleId && OPEN.has(i.status))\n .map((i) => i.id);\n if (open.length)\n fail(\n \"role-has-open-items\",\n `role \"${roleId}\" still holds ${open.length} open item(s)`,\n `complete or reassign ${open.join(\", \")} before retiring the role`,\n { items: open },\n );\n const roles = { ...state.roles };\n delete roles[roleId];\n return appendEvent({ ...state, roles }, \"role.retired\", by, { role: roleId }, now);\n}\n\nexport function hasCapability(role: Role, cap: Capability): boolean {\n return role.capabilities.includes(cap);\n}\n\nexport function rolesWith(state: WorkflowState, cap: Capability): Role[] {\n return Object.values(state.roles).filter((r) => hasCapability(r, cap));\n}\n\n/** Ids of roles that may approve `gateId`, optionally holding `cap` and excluding one id. */\nexport function approverIds(\n state: WorkflowState,\n gateId: string,\n cap?: string,\n except?: string,\n): string[] {\n return Object.values(state.roles)\n .filter(\n (r) =>\n r.id !== except &&\n r.canApprove.includes(gateId) &&\n (cap === undefined || (r.capabilities as readonly string[]).includes(cap)),\n )\n .map((r) => r.id);\n}\n\nexport function approversFor(state: WorkflowState, gateId: string): Role[] {\n return rolesWith(state, \"approve-gate\").filter((r) => r.canApprove.includes(gateId));\n}\n\nexport function requireCapabilities(\n state: WorkflowState,\n required: Capability[],\n exclusive: Capability[],\n): void {\n for (const cap of required) {\n if (rolesWith(state, cap).length === 0) {\n fail(\n \"missing-capability\",\n `no registered role has capability \"${cap}\"`,\n `register a role whose capabilities include \"${cap}\" (registerRole) before init`,\n );\n }\n }\n for (const cap of exclusive) {\n const holders = rolesWith(state, cap);\n if (holders.length > 1) {\n fail(\n \"exclusive-capability\",\n `capability \"${cap}\" must belong to exactly one role but is held by ${holders.map((r) => r.id).join(\", \")}`,\n `remove \"${cap}\" from all but one role`,\n );\n }\n }\n}\n\nexport function separationLost(state: WorkflowState, required: Capability[]): Role[] {\n if (required.length === 0) return [];\n return Object.values(state.roles).filter((r) => required.every((c) => hasCapability(r, c)));\n}\n","import { assertId, fail } from \"./errors.ts\";\n\nexport { assertId };\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Evidence,\n ItemStatus,\n NewItem,\n Stage,\n Transition,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function stageOf(state: WorkflowState, stageId: string): Stage {\n const st = state.stages.find((s) => s.id === stageId);\n if (!st)\n fail(\n \"unknown-stage\",\n `stage \"${stageId}\" does not exist`,\n `stages are: ${state.stages.map((s) => s.id).join(\" → \")}`,\n );\n return st;\n}\n\nexport function nextStageOf(state: WorkflowState, stageId: string): Stage | undefined {\n const idx = state.stages.findIndex((s) => s.id === stageId);\n if (idx < 0) stageOf(state, stageId);\n return state.stages[idx + 1];\n}\n\nexport function isTerminalStage(state: WorkflowState, stageId: string): boolean {\n return state.stages[state.stages.length - 1]?.id === stageId;\n}\n\nfunction putItem(state: WorkflowState, item: WorkItem): WorkflowState {\n return { ...state, items: { ...state.items, [item.id]: item } };\n}\n\n/** Replace one item with `fn(item)`; no event. */\nexport function patchItem(\n state: WorkflowState,\n id: string,\n fn: (item: WorkItem) => WorkItem,\n): WorkflowState {\n return putItem(state, fn(getItem(state, id)));\n}\n\n/** Drop optional fields (iteration, role, ...) from one item; no event. */\nexport function stripItemFields(\n state: WorkflowState,\n id: string,\n keys: Array<\"iteration\" | \"role\">,\n): WorkflowState {\n return patchItem(state, id, (item) => {\n const copy = { ...item };\n for (const k of keys) delete copy[k];\n return copy;\n });\n}\n\nexport function getItem(state: WorkflowState, id: string): WorkItem {\n const it = Object.hasOwn(state.items, id) ? state.items[id] : undefined;\n if (!it)\n fail(\n \"unknown-item\",\n `item \"${id}\" does not exist`,\n `add it with addItem first; known items: ${Object.keys(state.items).join(\", \") || \"(none)\"}`,\n { items: [id] },\n );\n return it;\n}\n\nfunction assertKnownItems(state: WorkflowState, ids: string[], what: string): void {\n const missing = ids.filter((d) => !Object.hasOwn(state.items, d));\n if (missing.length)\n fail(\n \"unknown-item\",\n `${what} refers to unknown item(s) ${missing.join(\", \")}`,\n \"add those items first or remove the reference\",\n { items: missing },\n );\n}\n\nexport function addItem(\n state: WorkflowState,\n input: NewItem,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(input.id, \"item id\");\n if (Object.hasOwn(state.items, input.id))\n fail(\n \"duplicate-item\",\n `item \"${input.id}\" already exists`,\n \"use editItem to change it, or pick a new id\",\n { items: [input.id] },\n );\n const firstStage = state.stages[0];\n if (!firstStage)\n fail(\"config-invalid\", \"state has no stages\", \"create the state with at least one stage\");\n const stageId = input.stage ?? firstStage.id;\n stageOf(state, stageId);\n assertKnownItems(state, input.dependsOn ?? [], `item \"${input.id}\".dependsOn`);\n if (input.affects) assertKnownItems(state, input.affects, `item \"${input.id}\".affects`);\n if (input.parent !== undefined)\n assertKnownItems(state, [input.parent], `item \"${input.id}\".parent`);\n if (input.role !== undefined && !Object.hasOwn(state.roles, input.role))\n fail(\n \"unknown-role\",\n `role \"${input.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n\n const { stage: _s, ...rest } = input;\n const item: WorkItem = {\n type: \"task\",\n acceptance: [],\n dependsOn: [],\n ...rest,\n id: input.id,\n title: input.title,\n stage: stageId,\n status: \"todo\",\n evidence: [],\n blockers: [],\n transitions: [],\n };\n const next = putItem(state, item);\n return appendEvent(\n next,\n \"item.added\",\n by,\n {\n id: item.id,\n type: item.type,\n stage: item.stage,\n weight: item.weight ?? null,\n priority: item.priority ?? null,\n },\n now,\n );\n}\n\nexport type ItemPatch = Partial<\n Omit<WorkItem, \"id\" | \"stage\" | \"status\" | \"transitions\" | \"evidence\" | \"blockers\">\n>;\n\nexport function editItem(\n state: WorkflowState,\n id: string,\n patch: ItemPatch,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n if (patch.dependsOn) assertKnownItems(state, patch.dependsOn, `item \"${id}\".dependsOn`);\n if (patch.affects) assertKnownItems(state, patch.affects, `item \"${id}\".affects`);\n if (patch.parent !== undefined) assertKnownItems(state, [patch.parent], `item \"${id}\".parent`);\n if (patch.role !== undefined && !Object.hasOwn(state.roles, patch.role))\n fail(\n \"unknown-role\",\n `role \"${patch.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n const changed = (Object.keys(patch) as Array<keyof ItemPatch>).filter(\n (k) => JSON.stringify(patch[k]) !== JSON.stringify(item[k]),\n );\n if (changed.length === 0)\n fail(\n \"no-op\",\n `editItem(\"${id}\") changes nothing`,\n \"pass at least one field with a different value\",\n { items: [id] },\n );\n const updated: WorkItem = { ...item };\n for (const k of changed) (updated as unknown as Record<string, unknown>)[k] = patch[k];\n const next = putItem(state, updated);\n return appendEvent(next, \"item.edited\", by, { id, changed }, now);\n}\n\nexport function moveItem(\n state: WorkflowState,\n id: string,\n to: { stage?: string; status: ItemStatus },\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const toStage = to.stage ?? item.stage;\n stageOf(state, toStage);\n if (item.status === \"done\" || item.status === \"dropped\") {\n fail(\n \"invalid-transition\",\n `item \"${id}\" is ${item.status} and cannot move`,\n \"create a new item (or a change-request) instead of reopening a finished one\",\n { items: [id] },\n );\n }\n if (toStage === item.stage && to.status === item.status)\n fail(\n \"no-op\",\n `item \"${id}\" is already ${item.status} in \"${toStage}\"`,\n \"choose a different stage or status\",\n { items: [id] },\n );\n const at = nowOf(now);\n const updated: WorkItem = {\n ...item,\n stage: toStage,\n status: to.status,\n transitions: [\n ...item.transitions,\n {\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.transition\",\n by,\n {\n id,\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n },\n at,\n );\n}\n\nexport function addEvidence(\n state: WorkflowState,\n id: string,\n evidence: Omit<Evidence, \"at\">,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const updated: WorkItem = { ...item, evidence: [...item.evidence, { ...evidence, at }] };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.evidence\",\n evidence.by,\n { id, kind: evidence.kind, ref: evidence.ref },\n at,\n );\n}\n\nexport function raiseBlocker(\n state: WorkflowState,\n id: string,\n reason: string,\n owner: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const blockerId = `${id}-b${item.blockers.length + 1}`;\n const updated: WorkItem = {\n ...item,\n status: \"blocked\",\n blockers: [...item.blockers, { id: blockerId, reason, owner, raisedAt: at }],\n transitions:\n item.status === \"blocked\"\n ? item.transitions\n : [\n ...item.transitions,\n {\n from: { stage: item.stage, status: item.status },\n to: { stage: item.stage, status: \"blocked\" },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(next, \"blocker.raised\", by, { id, blocker: blockerId, reason, owner }, at);\n}\n\nfunction lastTransitionTo(item: WorkItem, status: ItemStatus): Transition | undefined {\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === status) return t;\n }\n return undefined;\n}\n\nexport function clearBlocker(\n state: WorkflowState,\n id: string,\n blockerId: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const idx = item.blockers.findIndex((b) => b.id === blockerId && !b.clearedAt);\n if (idx < 0)\n fail(\n \"invalid-input\",\n `item \"${id}\" has no open blocker \"${blockerId}\"`,\n `open blockers: ${\n item.blockers\n .filter((b) => !b.clearedAt)\n .map((b) => b.id)\n .join(\", \") || \"(none)\"\n }`,\n { items: [id] },\n );\n const at = nowOf(now);\n const blockers = item.blockers.map((b, i) => (i === idx ? { ...b, clearedAt: at } : b));\n const stillBlocked = blockers.some((b) => !b.clearedAt);\n const prev = lastTransitionTo(item, \"blocked\")?.from.status ?? \"todo\";\n let toStage = item.stage;\n let toStatus: ItemStatus = prev;\n let dropRole = false;\n if (prev === \"in_progress\") {\n toStatus = \"todo\";\n toStage = lastTransitionTo(item, \"in_progress\")?.from.stage ?? item.stage;\n } else if (prev === \"awaiting_human\") {\n // a rejected human gate: the work is re-dispatched in the current stage\n toStatus = stageOf(state, item.stage).review ? \"review\" : \"todo\";\n dropRole = true;\n }\n const { role: _r, ...noRole } = item;\n const updated: WorkItem = {\n ...(dropRole && !stillBlocked ? (noRole as WorkItem) : item),\n blockers,\n stage: stillBlocked ? item.stage : toStage,\n status: stillBlocked ? \"blocked\" : toStatus,\n transitions: stillBlocked\n ? item.transitions\n : [\n ...item.transitions,\n {\n from: { stage: item.stage, status: \"blocked\" },\n to: { stage: toStage, status: toStatus },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(next, \"blocker.cleared\", by, { id, blocker: blockerId }, at);\n}\n\n/** Entering a new stage is a new assignment: the role that finished the previous stage is cleared so the planner picks the right one (a reviewer, not the author). */\nexport function clearRole(state: WorkflowState, itemId: string): WorkflowState {\n return stripItemFields(state, itemId, [\"role\"]);\n}\n\n/** Move an item to the next stage (done at the end, review/todo otherwise) and clear its role. */\nexport function advanceItem(\n state: WorkflowState,\n itemId: string,\n by: string,\n wantsReview: boolean,\n now: string,\n): WorkflowState {\n const item = getItem(state, itemId);\n const to = nextStageOf(state, item.stage);\n if (!to) return moveItem(state, itemId, { status: \"done\" }, by, now);\n if (isTerminalStage(state, to.id))\n return moveItem(state, itemId, { stage: to.id, status: \"done\" }, by, now);\n const status = wantsReview || to.review === true ? \"review\" : \"todo\";\n return clearRole(moveItem(state, itemId, { stage: to.id, status }, by, now), itemId);\n}\n","import { fail } from \"./errors.ts\";\nimport type { Policy, Violation, WorkItem, WorkflowState } from \"./types.ts\";\n\nexport function evaluatePolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n): Violation[] {\n const out: Violation[] = [];\n const v = (rule: string, message: string, fix: string) =>\n out.push({ rule, severity: \"error\", item: item.id, message, fix });\n for (const p of policies) {\n switch (p.kind) {\n case \"evidence\":\n if (!item.evidence.some((e) => e.kind === p.evidenceKind))\n v(\n \"policy:evidence\",\n `item \"${item.id}\" has no evidence of kind \"${p.evidenceKind}\"`,\n `attach evidence { kind: \"${p.evidenceKind}\" } via addEvidence or in the handoff.produced`,\n );\n break;\n case \"acceptance-written\":\n if (item.acceptance.length === 0)\n v(\n \"policy:acceptance-written\",\n `item \"${item.id}\" has no acceptance criteria`,\n \"editItem with a non-empty acceptance[] (needs define-acceptance)\",\n );\n break;\n case \"estimate-present\":\n if (item.weight === undefined)\n v(\n \"policy:estimate-present\",\n `item \"${item.id}\" has no weight`,\n \"editItem with a weight (story points)\",\n );\n break;\n case \"no-open-blockers\": {\n const open = item.blockers.filter((b) => !b.clearedAt);\n if (open.length)\n v(\n \"policy:no-open-blockers\",\n `item \"${item.id}\" has ${open.length} open blocker(s)`,\n `clearBlocker ${open.map((b) => b.id).join(\", \")}`,\n );\n break;\n }\n case \"dependencies-done\": {\n const notDone = item.dependsOn.filter((d) => state.items[d]?.status !== \"done\");\n if (notDone.length)\n v(\n \"policy:dependencies-done\",\n `item \"${item.id}\" depends on unfinished ${notDone.join(\", \")}`,\n `finish ${notDone.join(\", \")} first`,\n );\n break;\n }\n case \"custom\":\n if (!item.evidence.some((e) => e.kind === `policy:${p.id}`))\n v(\n `policy:custom:${p.id}`,\n `item \"${item.id}\" has not satisfied \"${p.description}\"`,\n `attach evidence { kind: \"policy:${p.id}\" } when it is satisfied`,\n );\n break;\n }\n }\n return out;\n}\n\nexport function assertPolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n context: string,\n): void {\n const unmet = evaluatePolicies(state, item, policies);\n if (unmet.length) {\n fail(\n \"policy-unmet\",\n `item \"${item.id}\" cannot ${context}: ${unmet.length} polic${unmet.length === 1 ? \"y\" : \"ies\"} unmet`,\n unmet.map((u) => u.fix).join(\"; \"),\n { items: [item.id] },\n );\n }\n}\n","import { fail } from \"./errors.ts\";\nimport { advanceItem, clearRole, getItem, moveItem, raiseBlocker } from \"./items.ts\";\nimport { approverIds } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Gate,\n PendingHuman,\n Transition,\n Violation,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport type GateResult =\n | { outcome: \"pass\" }\n | { outcome: \"human\" }\n | { outcome: \"fail\"; violations: Violation[] };\n\n/** Last in_progress dispatch made from a stage that comes STRICTLY BEFORE the item's current stage in `state.stages` order (unknown stage ids count as not-before). */\nexport function lastDispatchBefore(state: WorkflowState, item: WorkItem): Transition | undefined {\n const order = new Map(state.stages.map((s, i) => [s.id, i] as const));\n const here = order.get(item.stage);\n if (here === undefined) return undefined;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n const from = order.get(t.from.stage);\n if (t.to.status === \"in_progress\" && from !== undefined && from < here) return t;\n }\n return undefined;\n}\n\n/** Role that did the work the gate guards: the last dispatch made from a stage strictly before the current one (so a reviewer dispatched into the gated stage is not its author); else the last dispatch of any stage; undefined if never dispatched. */\nexport function authorOf(state: WorkflowState, item: WorkItem): string | undefined {\n const before = lastDispatchBefore(state, item);\n if (before) return before.by;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === \"in_progress\") return t.by;\n }\n return undefined;\n}\n\nexport function checkGate(\n state: WorkflowState,\n item: WorkItem,\n gate: Gate,\n by: string,\n): GateResult {\n const violations: Violation[] = [];\n for (const kind of gate.evidence) {\n if (!item.evidence.some((e) => e.kind === kind)) {\n violations.push({\n rule: \"gate:evidence\",\n severity: \"error\",\n item: item.id,\n message: `gate \"${gate.id}\" needs evidence \"${kind}\" on item \"${item.id}\"`,\n fix: `attach evidence { kind: \"${kind}\" } before approving`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n\n let needsHuman = false;\n for (const req of gate.requires) {\n if (req === \"human\") {\n if (by !== \"human\") needsHuman = true;\n continue;\n }\n const ok = approverIds(state, gate.id, req.capability).includes(by);\n if (!ok) {\n violations.push({\n rule: \"gate:capability\",\n severity: \"error\",\n item: item.id,\n message: `\"${by}\" may not approve gate \"${gate.id}\" (needs capability \"${req.capability}\" and canApprove \"${gate.id}\")`,\n fix: `approve as one of: ${approverIds(state, gate.id, req.capability).join(\", \") || \"(no role qualifies; register one)\"}`,\n });\n continue;\n }\n const author = authorOf(state, item);\n if (author !== undefined && author === by) {\n const others = approverIds(state, gate.id, req.capability, by);\n violations.push({\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${by}\" did the work on \"${item.id}\" and may not approve it`,\n fix: `approve as a different role: ${others.join(\", \") || \"(register another approver)\"}`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n return needsHuman ? { outcome: \"human\" } : { outcome: \"pass\" };\n}\n\nexport function raisePending(\n state: WorkflowState,\n pending: Omit<PendingHuman, \"id\" | \"raisedAt\">,\n now?: string,\n): WorkflowState {\n const at = nowOf(now);\n const id = `p${state.events.filter((e) => e.type === \"pending.raised\").length + 1}`;\n const entry: PendingHuman = { ...pending, id, raisedAt: at };\n let next: WorkflowState = { ...state, pending: [...state.pending, entry] };\n if (pending.item) {\n const item = getItem(next, pending.item);\n if (item.status !== \"awaiting_human\")\n next = moveItem(next, pending.item, { status: \"awaiting_human\" }, \"system\", at);\n }\n return appendEvent(\n next,\n \"pending.raised\",\n \"system\",\n { id, kind: pending.kind, item: pending.item ?? null, gate: pending.gate ?? null },\n at,\n );\n}\n\nexport function decide(\n state: WorkflowState,\n pendingId: string,\n decision: \"approve\" | \"reject\",\n by: string,\n note: string,\n now?: string,\n): WorkflowState {\n if (decision !== \"approve\" && decision !== \"reject\")\n fail(\n \"invalid-input\",\n `decision must be \"approve\" or \"reject\" (got ${JSON.stringify(decision)})`,\n \"pass approve or reject\",\n );\n const entry = state.pending.find((p) => p.id === pendingId);\n if (!entry)\n fail(\n \"unknown-pending\",\n `no pending decision \"${pendingId}\"`,\n `open decisions: ${state.pending.map((p) => p.id).join(\", \") || \"(none)\"}`,\n );\n const item0 = entry.kind === \"gate\" && entry.item ? getItem(state, entry.item) : undefined;\n const gate =\n item0 &&\n (state.stages.find((s) => entry.gate !== undefined && s.gate?.id === entry.gate)?.gate ??\n state.stages.find((s) => s.id === item0.stage)?.gate);\n if (item0 && gate && by !== \"human\") {\n const res = gate.requires.includes(\"human\") ? undefined : checkGate(state, item0, gate, by);\n if (res?.outcome !== \"pass\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide gate \"${gate.id}\" on \"${item0.id}\"`,\n `decide as one of: human${gate.requires\n .flatMap((q) => (q === \"human\" ? [] : approverIds(state, gate.id, q.capability)))\n .map((r) => `, ${r}`)\n .join(\"\")}`,\n { items: [item0.id], rule: \"gate\" },\n );\n }\n const at = nowOf(now);\n let next: WorkflowState = { ...state, pending: state.pending.filter((p) => p.id !== pendingId) };\n next = appendEvent(\n next,\n \"pending.decided\",\n by,\n { id: pendingId, decision, note, item: entry.item ?? null, gate: entry.gate ?? null },\n at,\n );\n if (item0) {\n const id = item0.id;\n const gateId = entry.gate ?? gate?.id ?? null;\n if (decision === \"approve\") {\n next = advanceItem(next, id, by, false, at);\n next = appendEvent(next, \"gate.passed\", by, { item: id, gate: gateId }, at);\n } else {\n const onFail = gate?.onFail ?? { action: \"block\" as const };\n if (onFail.action === \"return-to\")\n next = clearRole(moveItem(next, id, { stage: onFail.stage, status: \"todo\" }, by, at), id);\n else\n next = raiseBlocker(\n next,\n id,\n `gate \"${gateId ?? \"?\"}\" rejected: ${note || \"no reason given\"}`,\n by,\n by,\n at,\n );\n next = appendEvent(next, \"gate.failed\", by, { item: id, gate: gateId, note }, at);\n }\n }\n return next;\n}\n","import 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 { 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(items: WorkItem[], state: WorkflowState): 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 if (i.priority !== undefined) node.priority = i.priority;\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\";\nexport interface PlanResult {\n state: WorkflowState;\n dispatched: WorkItem[];\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) return { state, dispatched: [], 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\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)) 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 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 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 target =\n item.status === \"todo\" && po.dispatchStage !== undefined ? po.dispatchStage : item.stage;\n const stage = stageOf(state, target);\n if (evaluatePolicies(state, item, stage.entryPolicy).length > 0) continue;\n if (\n stage.wipLimit !== undefined &&\n inProgress.filter((i) => i.stage === stage.id).length +\n dispatched.filter((d) => d.stage === stage.id).length >=\n stage.wipLimit\n ) {\n reason = \"wip-full\";\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 continue;\n }\n if (tokensLeft !== undefined) {\n const est = estimateTokens(state, item.weight, opts.fallbackTokensPerWeight);\n if (est > tokensLeft) {\n reason = \"budget-exhausted\";\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 && 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, metrics },\n at,\n );\n return reason ? { state: next, dispatched, reason } : { state: next, dispatched };\n}\n","import { authorOf } from \"./gates.ts\";\nimport { approverIds, separationLost } from \"./roles.ts\";\nimport type { Action, Handoff, Methodology, Rule, Violation } from \"./types.ts\";\n\nexport function coreRulesFor(methodology: Pick<Methodology, \"requiredCapabilities\">): Rule[] {\n const separation: Rule = {\n id: \"separation-lost\",\n severity: \"warning\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"init\" && action.type !== \"role.register\") return [];\n return separationLost(state, methodology.requiredCapabilities).map((r) => ({\n rule: \"separation-lost\",\n severity: \"warning\" as const,\n message: `role \"${r.id}\" holds every required capability (${methodology.requiredCapabilities.join(\", \")}); no separation of duties`,\n fix: \"fine for a solo operator; otherwise split capabilities across roles\",\n }));\n },\n };\n const coi: Rule = {\n id: \"conflict-of-interest\",\n severity: \"error\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"complete\") return [];\n const handoff = (action.payload as { handoff?: Handoff } | undefined)?.handoff;\n if (!handoff) return [];\n const verdict = handoff.verdict ?? \"done\";\n if (verdict !== \"done\" && verdict !== \"needs-review\") return [];\n const item = state.items[handoff.item];\n if (!item) return [];\n const gate = state.stages.find((s) => s.id === item.stage)?.gate;\n if (!gate || !gate.requires.some((q) => q !== \"human\")) return [];\n if (authorOf(state, item) !== handoff.role) return [];\n const others = approverIds(state, gate.id, undefined, handoff.role);\n return [\n {\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${handoff.role}\" authored \"${item.id}\" and may not pass gate \"${gate.id}\" on it`,\n fix: `hand the gate to another approver: ${others.join(\", \") || \"(register one)\"}`,\n },\n ];\n },\n };\n return [separation, coi];\n}\n","import { fail } from \"./errors.ts\";\nimport { requireCapabilities } from \"./roles.ts\";\nimport { coreRulesFor } from \"./rules.ts\";\nimport { createState } from \"./state.ts\";\nimport type {\n Action,\n ApplyResult,\n Methodology,\n Role,\n Stage,\n Violation,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function validateAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n): Violation[] {\n const out: Violation[] = [];\n for (const rule of [...coreRulesFor(methodology), ...methodology.rules])\n out.push(...rule.check(state, action));\n return out;\n}\n\nexport function applyAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n reduce: (s: WorkflowState) => WorkflowState,\n): ApplyResult {\n const violations = validateAction(state, methodology, action);\n const errors = violations.filter((v) => v.severity === \"error\");\n if (errors.length) {\n fail(\n \"rule-violation\",\n `${action.type} violates ${errors.map((e) => e.rule).join(\", \")}: ${errors.map((e) => e.message).join(\"; \")}`,\n errors.map((e) => e.fix).join(\"; \"),\n { rule: errors[0]!.rule, items: errors.map((e) => e.item).filter((x): x is string => !!x) },\n );\n }\n return { state: reduce(state), warnings: violations.filter((v) => v.severity === \"warning\") };\n}\n\nexport interface InitInput<C> {\n methodology: Methodology<C>;\n config: unknown;\n roles?: Role[];\n stages?: Stage[];\n by?: string;\n now?: string;\n}\n\nexport function init<C>(input: InitInput<C>): ApplyResult {\n const m = input.methodology;\n const config = m.validateConfig(input.config);\n const stages = input.stages ?? m.defaultStages(config);\n const roles = input.roles ?? m.defaultRoles(config);\n const stateInput =\n input.now !== undefined\n ? { methodology: m.name, config, stages, roles, now: input.now }\n : { methodology: m.name, config, stages, roles };\n const state = createState(stateInput);\n requireCapabilities(state, m.requiredCapabilities, m.exclusiveCapabilities);\n return applyAction(state, m as Methodology, { type: \"init\", by: input.by ?? \"system\" }, (s) => s);\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';var 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 c=".workflow";function y(t){return n__default.default.join(t,c,"state.json")}async function g(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 E(t,e,i={}){let{retries:r=40,intervalMs:d=50,staleMs:m=6e4}=i,a=n__default.default.join(t,c,"state.lock");await promises.mkdir(n__default.default.dirname(a),{recursive:true});let u=false;for(let f=0;!u;f++)try{let s=await promises.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 promises.stat(a).then(w=>Date.now()-w.mtimeMs,()=>0)>m){await promises.unlink(a).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(w=>setTimeout(w,d));}try{return await e()}finally{await promises.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 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 d=r;d.version!==1&&chunkS3BXVHO7_cjs.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__default.default.join(t,c,"roles"),a=[];try{a=(await promises.readdir(m)).filter(f=>f.endsWith(".json"));}catch{}let u={...d.roles};for(let f of a){let s=n__default.default.join(m,f),l;try{l=JSON.parse(await promises.readFile(s,"utf8"));}catch(w){chunkS3BXVHO7_cjs.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")&&chunkS3BXVHO7_cjs.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__default.default.resolve(e).startsWith(n__default.default.resolve(t,c)+n__default.default.sep)||chunkS3BXVHO7_cjs.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__default.default.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__default.default.join(t,c,"handoffs",`${e.item}-${i}.json`));return await g(r,JSON.stringify(e,null,2)+`
|
|
5
|
+
`),r}exports.a=c;exports.b=y;exports.c=E;exports.d=D;exports.e=M;exports.f=R;exports.g=T;//# sourceMappingURL=chunk-6R3YFUUV.cjs.map
|
|
6
|
+
//# sourceMappingURL=chunk-6R3YFUUV.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","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-6R3YFUUV.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 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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {e,N,n,K as K$1,R,a,w,s,J as J$1,c,t,z as z$1,v as v$1,C,F,G as G$1,A,x,i,q,D as D$1}from'./chunk-D7U3ES2L.mjs';import {b}from'./chunk-2FRRD6A3.mjs';function D(i,a){let t=[];for(let o of i.events)o.type==="item.completed"&&o.payload.id===a&&t.push({...o.payload,at:o.at});return t}function z(i,a){let t=D(i,a);return t[t.length-1]}function J(i,a,t){t.role||b("unknown-role",`item "${t.id}" has no role assigned`,"dispatch it with next() or set item.role",{items:[t.id]});let o=e(i,t.role);o||b("unknown-role",`role "${t.role}" does not exist`,`registered roles: ${Object.keys(i.roles).join(", ")}`);let u=[],d=[...o.do_not],s=[...t.dependsOn,...t.type==="bug"||t.type==="change-request"?t.affects??[]:[]];for(let n of s){let c=z(i,n);if(c){u.push({item:n,produced:c.produced,notes:c.notes});for(let m of c.do_not)d.includes(m)||d.push(m);}}let l=D(i,t.id).map(n=>({role:n.role,verdict:n.verdict,notes:n.notes,produced:n.produced,at:n.at})),e$1=new Set([t.id,...t.dependsOn]),g=Object.values(i.items).filter(n=>(n.type==="bug"||n.type==="change-request")&&n.id!==t.id&&n.status!=="done"&&n.status!=="dropped"&&(n.affects??[]).some(c=>e$1.has(c))).map(n=>({id:n.id,title:n.title,affects:n.affects??[]})),k=N(i),f=n(i,t.stage).gate,r={item:t,role:o,modelTier:o.modelTier,invariants:[...a.invariants(i,t),...i.agreements],do_not:d,acceptance:t.acceptance,upstream:u,priorHandoffs:l,relatedBugs:g,budgetRemaining:k?K$1(k.budget,k.spent):{}};return f&&(r.gateAhead=f),r}function oe(i,a,t={}){let o=R(i,a,t),u=o.dispatched.map(d=>J(o.state,a,o.state.items[d.id]));return o.reason?{state:o.state,briefs:u,reason:o.reason}:{state:o.state,briefs:u}}var G=["done","needs-review","rework","blocked","escalate"],L=["policy","skill","memory","spec","review"],I=i=>typeof i=="object"&&i!==null&&!Array.isArray(i),v=i=>typeof i=="string";function X(i,a,t){let o=s(i,a.item);o.status!=="in_progress"&&b("invalid-transition",`item "${o.id}" is ${o.status}, not in_progress`,"only dispatched items can be completed; call next() first",{items:[o.id]}),Array.isArray(a.do_not)||b("handoff-invalid",`handoff for "${o.id}" has no do_not array`,"set handoff.do_not to [] when there is nothing to forbid",{items:[o.id]}),(!Array.isArray(a.produced)||!Array.isArray(a.open_questions))&&b("handoff-invalid",`handoff for "${o.id}" needs produced[] and open_questions[]`,"pass empty arrays when there is nothing",{items:[o.id]});let u=(e,g)=>b("handoff-invalid",`handoff for "${o.id}": ${e}`,g,{items:[o.id]}),d=a.verdict??"done";G.includes(d)||u(`unknown verdict ${JSON.stringify(d)}`,`use one of: ${G.join(", ")}`),a.produced.every(e=>I(e)&&v(e.kind)&&v(e.ref))||u("produced[] entries need string kind and ref",'use { "kind": "code", "ref": "src/a.ts" }');let s$1=a.lessons??[];(!Array.isArray(s$1)||!s$1.every(e=>I(e)&&v(e.text)&&L.includes(e.scope)))&&u("lessons[] entries need a text and a scope",`scope is one of: ${L.join(", ")}`);let l=a.follow_ups??[];(!Array.isArray(l)||!l.every(e=>I(e)&&v(e.id)&&v(e.title)))&&u("follow_ups[] entries need a string id and title","describe each follow-up as a new item"),a.role!==o.role&&b("handoff-invalid",`handoff role "${a.role}" differs from the dispatched role "${o.role}"`,`complete as "${o.role}" or re-dispatch`,{items:[o.id]}),(!t.model||t.model.trim()==="")&&b("accounting-invalid",`accounting for "${o.id}" has no model`,"record the model id that actually ran the work",{items:[o.id]});for(let e of ["tokensIn","tokensOut","durationMs"])(!Number.isFinite(t[e])||t[e]<0)&&b("accounting-invalid",`accounting.${e} must be a non-negative number`,`measure ${e} from the host's usage report`,{items:[o.id]});}function U(i){for(let a=i.transitions.length-1;a>=0;a--){let t=i.transitions[a];if(t.to.status==="in_progress")return t.from.stage}return i.stage}function K(i,a){return D$1(i,a)?.from.stage??U(a)}function fe(i$1,a$1,t$1,o,u){X(i$1,t$1,o);let d=a(u),s$1=t$1.item,l=t$1.role,e={...i$1,accounting:[...i$1.accounting,o]};for(let r of t$1.produced)e=w(e,s$1,{kind:r.kind,ref:r.ref,by:l},d);let g=N(e);g&&(g.committed.includes(s$1)||s(e,s$1).iteration===g.id)&&(e={...e,iterations:e.iterations.map(r=>r.id===g.id?{...r,spent:J$1(r.spent,o)}:r)});for(let r of t$1.lessons??[]){let n=`L${e.lessons.length+1}`;e={...e,lessons:[...e.lessons,{id:n,at:d,text:r.text,scope:r.scope,status:"raised",from:l,item:s$1}]},e=c(e,"lesson.raised",l,{id:n,from:l,item:s$1,scope:r.scope},d);}let k=[];for(let r of t$1.follow_ups??[]){let n=e.stages[0],{iteration:c,...m}=r;e=t(e,{...m,stage:n.id,parent:s$1,tags:[...r.tags??[],"follow-up"]},l,d),k.push(r.id);}let f=t$1.verdict??"done";if(f==="rework"){(!t$1.notes||t$1.notes.trim()==="")&&b("handoff-invalid",`rework on "${s$1}" needs notes`,"say what must change in handoff.notes",{items:[s$1]});let r=s(e,s$1);e=z$1(v$1(e,s$1,{stage:K(e,r),status:"todo"},l,d),s$1),e=c(e,"item.rework",l,{id:s$1,by:l,notes:t$1.notes},d);}else if((f==="done"||f==="needs-review")&&s(e,s$1).type==="question"){let r=e.stages[e.stages.length-1].id;e=v$1(e,s$1,{stage:r,status:"done"},l,d);}else if(f==="done"||f==="needs-review"){let r=s(e,s$1),n$1=n(e,r.stage);if(C(e,r,n$1.exitPolicy,`leave "${n$1.id}"`),n$1.gate){let c$1=F(e,r,n$1.gate,l);c$1.outcome==="fail"&&b("gate-unmet",`gate "${n$1.gate.id}" blocks "${s$1}": ${c$1.violations.map(m=>m.message).join("; ")}`,c$1.violations.map(m=>m.fix).join("; "),{items:[s$1],rule:c$1.violations[0].rule}),c$1.outcome==="human"?e=G$1(e,{kind:"gate",item:s$1,gate:n$1.gate.id,question:`Approve gate "${n$1.gate.id}" for "${r.title}" (${s$1})?`},d):e=c(A(e,s$1,l,f==="needs-review",d),"gate.passed",l,{item:s$1,gate:n$1.gate.id},d);}else e=A(e,s$1,l,f==="needs-review",d);}else if(f==="blocked")e=x(e,s$1,t$1.notes||"blocked by worker",l,l,d);else if(f==="escalate"){let r=i(e,"escalate")[0];r||b("missing-capability",`no role has capability "escalate" to receive the question from "${s$1}"`,"register a role with capability escalate",{items:[s$1]});let n=Object.keys(e.items).filter(h=>h.startsWith(`${s$1}-q`)).length+1,c$1=`${s$1}-q${n}`,m=s(e,s$1),O=U(m),W={id:c$1,type:"question",title:t$1.open_questions.join(" | ")||t$1.notes||`question from ${s$1}`,parent:s$1,role:r.id,priority:Number.MAX_SAFE_INTEGER,stage:O};m.iteration!==void 0&&(W.iteration=m.iteration),e=t(e,W,l,d),e=v$1(e,s$1,{stage:O,status:"todo"},l,d),e=q(e,s$1,h=>({...h,dependsOn:[...h.dependsOn,c$1]})),e=c(e,"item.escalated",l,{id:s$1,question:c$1,to:r.id},d);}return e=c(e,"item.completed",l,{id:s$1,role:l,verdict:f,produced:t$1.produced,notes:t$1.notes,do_not:t$1.do_not,open_questions:t$1.open_questions,followUps:k,tokens:o.tokensIn+o.tokensOut,durationMs:o.durationMs,model:o.model},d),a$1.afterComplete&&(e=a$1.afterComplete(e,s$1,d)),{state:e,warnings:[]}}export{J as a,oe as b,fe as c};//# sourceMappingURL=chunk-B7MP6Y3W.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-B7MP6Y3W.mjs.map
|