@bluewombat/work-ledger 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SPECS.md +112 -93
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ledger/feature-commands.d.ts +50 -0
- package/dist/ledger/feature-commands.d.ts.map +1 -0
- package/dist/ledger/feature-commands.js +196 -0
- package/dist/ledger/feature-commands.js.map +1 -0
- package/dist/ledger/open-work-ledger.d.ts +24 -54
- package/dist/ledger/open-work-ledger.d.ts.map +1 -1
- package/dist/ledger/open-work-ledger.js +141 -290
- package/dist/ledger/open-work-ledger.js.map +1 -1
- package/dist/ledger/results.d.ts +11 -0
- package/dist/ledger/results.d.ts.map +1 -0
- package/dist/ledger/results.js +4 -0
- package/dist/ledger/results.js.map +1 -0
- package/dist/persist/port.d.ts +4 -4
- package/dist/persist/port.d.ts.map +1 -1
- package/dist/records.d.ts +90 -41
- package/dist/records.d.ts.map +1 -1
- package/dist/records.js +6 -1
- package/dist/records.js.map +1 -1
- package/package.json +2 -2
- package/dist/ledger/check-plan.d.ts +0 -17
- package/dist/ledger/check-plan.d.ts.map +0 -1
- package/dist/ledger/check-plan.js +0 -73
- package/dist/ledger/check-plan.js.map +0 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { isFeatureAggregate, isFeatureSummary } from "../records.js";
|
|
2
|
+
import { refused } from "./results.js";
|
|
3
|
+
/** States in which a Feature holds its Project: nothing else opens beside it. */
|
|
4
|
+
const HOLDING = new Set(["open", "submitted", "escalated"]);
|
|
5
|
+
function cloneIntention(feature) {
|
|
6
|
+
const intention = {
|
|
7
|
+
key: feature.key,
|
|
8
|
+
project: feature.project,
|
|
9
|
+
fingerprint: feature.fingerprint,
|
|
10
|
+
priority: feature.priority,
|
|
11
|
+
intention: feature.intention,
|
|
12
|
+
blocked_by: [...feature.blocked_by],
|
|
13
|
+
merge_when_ready: feature.merge_when_ready,
|
|
14
|
+
};
|
|
15
|
+
if (feature.title !== undefined) {
|
|
16
|
+
intention.title = feature.title;
|
|
17
|
+
}
|
|
18
|
+
if (feature.manager !== undefined) {
|
|
19
|
+
intention.manager = feature.manager;
|
|
20
|
+
}
|
|
21
|
+
if (feature.external_id !== undefined) {
|
|
22
|
+
intention.external_id = feature.external_id;
|
|
23
|
+
}
|
|
24
|
+
if (feature.source !== undefined) {
|
|
25
|
+
intention.source = { ...feature.source };
|
|
26
|
+
}
|
|
27
|
+
return intention;
|
|
28
|
+
}
|
|
29
|
+
export function openFeatureCommands(options) {
|
|
30
|
+
const { persist, now } = options;
|
|
31
|
+
const loadFeature = async (key) => {
|
|
32
|
+
const found = await persist.load(key);
|
|
33
|
+
return found !== undefined && isFeatureAggregate(found) ? found : undefined;
|
|
34
|
+
};
|
|
35
|
+
const write = async (aggregate) => {
|
|
36
|
+
const saved = await persist.save(aggregate.intention.key, aggregate);
|
|
37
|
+
return saved.ok ? { ok: true } : refused("persist-failed");
|
|
38
|
+
};
|
|
39
|
+
const summaries = async () => (await persist.listSummaries()).filter(isFeatureSummary);
|
|
40
|
+
/** Load, check the state, change, write. */
|
|
41
|
+
const transition = async (key, from, change) => {
|
|
42
|
+
const found = await loadFeature(key);
|
|
43
|
+
if (found === undefined) {
|
|
44
|
+
return refused("not-found");
|
|
45
|
+
}
|
|
46
|
+
if (!from.includes(found.state)) {
|
|
47
|
+
return refused("illegal-transition");
|
|
48
|
+
}
|
|
49
|
+
const next = structuredClone(found);
|
|
50
|
+
change(next);
|
|
51
|
+
return await write(next);
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
async admitFeature(feature) {
|
|
55
|
+
const existing = await loadFeature(feature.key);
|
|
56
|
+
if (existing === undefined) {
|
|
57
|
+
return await write({
|
|
58
|
+
kind: "feature",
|
|
59
|
+
intention: cloneIntention(feature),
|
|
60
|
+
state: "waiting",
|
|
61
|
+
received_at: now(),
|
|
62
|
+
tickets: [],
|
|
63
|
+
resumes: 0,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (existing.state === "done") {
|
|
67
|
+
return refused("too-late");
|
|
68
|
+
}
|
|
69
|
+
if (existing.state === "cancelled") {
|
|
70
|
+
return refused("illegal-transition");
|
|
71
|
+
}
|
|
72
|
+
if (existing.state === "waiting") {
|
|
73
|
+
if (existing.intention.fingerprint === feature.fingerprint) {
|
|
74
|
+
return { ok: true };
|
|
75
|
+
}
|
|
76
|
+
const next = structuredClone(existing);
|
|
77
|
+
next.intention = cloneIntention(feature);
|
|
78
|
+
return await write(next);
|
|
79
|
+
}
|
|
80
|
+
if (feature.fingerprint === existing.intention.fingerprint ||
|
|
81
|
+
feature.fingerprint === existing.pending_fingerprint) {
|
|
82
|
+
return { ok: true };
|
|
83
|
+
}
|
|
84
|
+
const next = structuredClone(existing);
|
|
85
|
+
next.pending_fingerprint = feature.fingerprint;
|
|
86
|
+
return await write(next);
|
|
87
|
+
},
|
|
88
|
+
async nextFeature(project) {
|
|
89
|
+
const all = await summaries();
|
|
90
|
+
if (all.some((s) => s.project === project && HOLDING.has(s.state))) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const waiting = all
|
|
94
|
+
.filter((s) => s.project === project && s.state === "waiting")
|
|
95
|
+
.sort((a, b) => b.priority - a.priority || a.received_at - b.received_at);
|
|
96
|
+
for (const candidate of waiting) {
|
|
97
|
+
const loaded = await loadFeature(candidate.key);
|
|
98
|
+
if (loaded === undefined) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
let unblocked = true;
|
|
102
|
+
for (const blocker of loaded.intention.blocked_by) {
|
|
103
|
+
if ((await loadFeature(blocker))?.state !== "done") {
|
|
104
|
+
unblocked = false;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (unblocked) {
|
|
109
|
+
return candidate;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
},
|
|
114
|
+
async openFeature(input) {
|
|
115
|
+
const found = await loadFeature(input.key);
|
|
116
|
+
if (found === undefined) {
|
|
117
|
+
return refused("not-found");
|
|
118
|
+
}
|
|
119
|
+
if (found.state !== "waiting") {
|
|
120
|
+
return refused("illegal-transition");
|
|
121
|
+
}
|
|
122
|
+
const all = await summaries();
|
|
123
|
+
if (all.some((s) => s.project === found.intention.project && HOLDING.has(s.state))) {
|
|
124
|
+
return refused("project-busy");
|
|
125
|
+
}
|
|
126
|
+
const next = structuredClone(found);
|
|
127
|
+
next.state = "open";
|
|
128
|
+
if (input.line !== undefined) {
|
|
129
|
+
next.line = input.line;
|
|
130
|
+
}
|
|
131
|
+
next.tickets = [...input.tickets];
|
|
132
|
+
return await write(next);
|
|
133
|
+
},
|
|
134
|
+
async markFeatureSubmitted(input) {
|
|
135
|
+
return await transition(input.key, ["open"], (aggregate) => {
|
|
136
|
+
aggregate.state = "submitted";
|
|
137
|
+
aggregate.submission = { reference: input.reference, submitted_at: now() };
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
async markFeatureDone(key, input) {
|
|
141
|
+
return await transition(key, ["submitted"], (aggregate) => {
|
|
142
|
+
aggregate.state = "done";
|
|
143
|
+
if (input?.reference !== undefined) {
|
|
144
|
+
aggregate.integration_reference = input.reference;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
async escalateFeature(input) {
|
|
149
|
+
return await transition(input.key, ["open", "submitted"], (aggregate) => {
|
|
150
|
+
aggregate.state = "escalated";
|
|
151
|
+
if (input.report !== undefined && input.report.trim().length > 0) {
|
|
152
|
+
aggregate.escalation = { report: input.report };
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
aggregate.escalation = {};
|
|
156
|
+
}
|
|
157
|
+
delete aggregate.pending_fingerprint;
|
|
158
|
+
});
|
|
159
|
+
},
|
|
160
|
+
async resumeFeature(key) {
|
|
161
|
+
return await transition(key, ["escalated"], (aggregate) => {
|
|
162
|
+
aggregate.state = "open";
|
|
163
|
+
aggregate.resumes += 1;
|
|
164
|
+
delete aggregate.escalation;
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
async cancelFeature(key) {
|
|
168
|
+
const found = await loadFeature(key);
|
|
169
|
+
if (found === undefined) {
|
|
170
|
+
return refused("not-found");
|
|
171
|
+
}
|
|
172
|
+
if (found.state === "done") {
|
|
173
|
+
return refused("point-of-no-return");
|
|
174
|
+
}
|
|
175
|
+
if (found.state === "cancelled") {
|
|
176
|
+
return { ok: true };
|
|
177
|
+
}
|
|
178
|
+
const next = structuredClone(found);
|
|
179
|
+
next.state = "cancelled";
|
|
180
|
+
return await write(next);
|
|
181
|
+
},
|
|
182
|
+
async getFeature(key) {
|
|
183
|
+
const found = await loadFeature(key);
|
|
184
|
+
return found === undefined
|
|
185
|
+
? { ok: false, code: "not-found" }
|
|
186
|
+
: { ok: true, aggregate: found };
|
|
187
|
+
},
|
|
188
|
+
async listFeatures() {
|
|
189
|
+
return await summaries();
|
|
190
|
+
},
|
|
191
|
+
async activeFeatureOn(project) {
|
|
192
|
+
return (await summaries()).find((s) => s.project === project && HOLDING.has(s.state));
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=feature-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-commands.js","sourceRoot":"","sources":["../../src/ledger/feature-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import type { PersistencePort } from "../persist/port.js";
|
|
2
|
-
import type { EscalationKind,
|
|
3
|
-
import { type
|
|
4
|
-
|
|
5
|
-
export type
|
|
6
|
-
|
|
7
|
-
};
|
|
8
|
-
export type CommandRefused = {
|
|
9
|
-
ok: false;
|
|
10
|
-
code: RefusalCode;
|
|
11
|
-
};
|
|
12
|
-
export type CommandResult = CommandOk | CommandRefused;
|
|
2
|
+
import type { EscalationKind, TicketAggregate, TicketIntention, TicketSummary, TraceRecord } from "../records.js";
|
|
3
|
+
import { type FeatureCommands } from "./feature-commands.js";
|
|
4
|
+
import { type CommandRefused, type CommandResult } from "./results.js";
|
|
5
|
+
export type TicketAdmission = TicketIntention;
|
|
6
|
+
export type { CommandOk, CommandRefused, CommandResult } from "./results.js";
|
|
13
7
|
export type ClaimResult = {
|
|
14
8
|
ok: true;
|
|
15
9
|
key: string;
|
|
@@ -19,7 +13,7 @@ export type ClaimResult = {
|
|
|
19
13
|
} | CommandRefused;
|
|
20
14
|
export type GetResult = {
|
|
21
15
|
ok: true;
|
|
22
|
-
aggregate:
|
|
16
|
+
aggregate: TicketAggregate;
|
|
23
17
|
} | {
|
|
24
18
|
ok: false;
|
|
25
19
|
code: "not-found";
|
|
@@ -32,33 +26,24 @@ export type OpenWorkLedgerOptions = {
|
|
|
32
26
|
export type EscalateInput = {
|
|
33
27
|
key: string;
|
|
34
28
|
kind: EscalationKind;
|
|
35
|
-
subtaskId?: string;
|
|
36
29
|
/** Why it stopped. Kept so the person who reads the escalation is told. */
|
|
37
30
|
report?: string;
|
|
38
31
|
};
|
|
39
32
|
export type RecordAttemptInput = {
|
|
40
33
|
key: string;
|
|
41
|
-
subtaskId: string;
|
|
42
34
|
number: number;
|
|
43
35
|
trace?: TraceRecord;
|
|
44
36
|
};
|
|
45
37
|
export type DeclareWorkspaceInput = {
|
|
46
38
|
key: string;
|
|
47
|
-
|
|
48
|
-
subtask?: string;
|
|
49
|
-
};
|
|
50
|
-
export type ClearWorkspaceInput = {
|
|
51
|
-
key: string;
|
|
52
|
-
feature?: boolean;
|
|
53
|
-
subtask?: boolean;
|
|
39
|
+
path: string;
|
|
54
40
|
};
|
|
55
41
|
export type DeclaredWorkspace = {
|
|
56
42
|
key: string;
|
|
57
|
-
|
|
58
|
-
subtask?: string;
|
|
43
|
+
path: string;
|
|
59
44
|
};
|
|
60
|
-
export type WorkLedger = {
|
|
61
|
-
admit(
|
|
45
|
+
export type WorkLedger = FeatureCommands & {
|
|
46
|
+
admit(ticket: TicketAdmission): Promise<CommandResult>;
|
|
62
47
|
recordInvalid(input: {
|
|
63
48
|
key: string;
|
|
64
49
|
project: string;
|
|
@@ -69,25 +54,11 @@ export type WorkLedger = {
|
|
|
69
54
|
priority?: number;
|
|
70
55
|
}): Promise<CommandResult>;
|
|
71
56
|
claim(project: string): Promise<ClaimResult>;
|
|
72
|
-
recordPlan(input: {
|
|
73
|
-
key: string;
|
|
74
|
-
plannedAt: string;
|
|
75
|
-
subtasks: PlanDraft[];
|
|
76
|
-
}): Promise<CommandResult>;
|
|
77
|
-
refusePlan(input: {
|
|
78
|
-
key: string;
|
|
79
|
-
code: string;
|
|
80
|
-
reason: string;
|
|
81
|
-
}): Promise<CommandResult>;
|
|
82
|
-
startSubtask(input: {
|
|
83
|
-
key: string;
|
|
84
|
-
subtaskId: string;
|
|
85
|
-
}): Promise<CommandResult>;
|
|
86
57
|
recordAttempt(input: RecordAttemptInput): Promise<CommandResult>;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
58
|
+
/** The unit starts: from here the Ticket holds a lease until it ends. */
|
|
59
|
+
startUnit(key: string): Promise<CommandResult>;
|
|
60
|
+
/** The unit passed its Gates: the work is assembled and judged next. */
|
|
61
|
+
markIntegrating(key: string): Promise<CommandResult>;
|
|
91
62
|
markSubmitted(input: {
|
|
92
63
|
key: string;
|
|
93
64
|
reference: string;
|
|
@@ -108,25 +79,24 @@ export type WorkLedger = {
|
|
|
108
79
|
reference?: string | undefined;
|
|
109
80
|
}): Promise<CommandResult>;
|
|
110
81
|
escalate(input: EscalateInput): Promise<CommandResult>;
|
|
111
|
-
|
|
82
|
+
resumeTicket(key: string): Promise<CommandResult>;
|
|
112
83
|
cancel(key: string): Promise<CommandResult>;
|
|
113
84
|
declareWorkspace(input: DeclareWorkspaceInput): Promise<CommandResult>;
|
|
114
|
-
clearWorkspace(
|
|
85
|
+
clearWorkspace(key: string): Promise<CommandResult>;
|
|
115
86
|
expireBail(key: string): Promise<CommandResult>;
|
|
116
87
|
/**
|
|
117
|
-
* Drop a held
|
|
118
|
-
*
|
|
88
|
+
* Drop a held unit without waiting for the bail clock. Same ledger outcome
|
|
89
|
+
* as an expired bail on a running Ticket.
|
|
119
90
|
*/
|
|
120
91
|
releaseBail(key: string): Promise<CommandResult>;
|
|
121
92
|
renewBail(key: string): Promise<CommandResult>;
|
|
122
93
|
get(key: string): Promise<GetResult>;
|
|
123
|
-
/** Every known
|
|
124
|
-
list(): Promise<
|
|
125
|
-
/** Every
|
|
126
|
-
listInFlight(): Promise<
|
|
127
|
-
activeOn(project: string): Promise<
|
|
128
|
-
nextReceived(project: string): Promise<
|
|
129
|
-
nextRunnable(key: string): Promise<string | undefined>;
|
|
94
|
+
/** Every known Ticket, whatever its state. */
|
|
95
|
+
list(): Promise<TicketSummary[]>;
|
|
96
|
+
/** Every Ticket mid-flight, whatever its Project. */
|
|
97
|
+
listInFlight(): Promise<TicketSummary[]>;
|
|
98
|
+
activeOn(project: string): Promise<TicketSummary | undefined>;
|
|
99
|
+
nextReceived(project: string): Promise<TicketSummary | undefined>;
|
|
130
100
|
listDeclaredWorkspaces(): Promise<DeclaredWorkspace[]>;
|
|
131
101
|
};
|
|
132
102
|
export declare function openWorkLedger(options: OpenWorkLedgerOptions): WorkLedger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-work-ledger.d.ts","sourceRoot":"","sources":["../../src/ledger/open-work-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"open-work-ledger.d.ts","sourceRoot":"","sources":["../../src/ledger/open-work-ledger.ts"],"names":[],"mappings":"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"}
|