@bluewombat/work-ledger 0.8.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.
@@ -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, FeatureAggregate, FeatureIntention, FeatureSummary, RefusalCode, TraceRecord } from "../records.js";
3
- import { type PlanDraft } from "./check-plan.js";
4
- export type FeatureAdmission = FeatureIntention;
5
- export type CommandOk = {
6
- ok: true;
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: FeatureAggregate;
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
- feature?: string;
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
- feature?: string;
58
- subtask?: string;
43
+ path: string;
59
44
  };
60
- export type WorkLedger = {
61
- admit(feature: FeatureAdmission): Promise<CommandResult>;
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
- markSubtaskIntegrated(input: {
88
- key: string;
89
- subtaskId: string;
90
- }): Promise<CommandResult>;
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
- resumeReady(key: string): Promise<CommandResult>;
82
+ resumeTicket(key: string): Promise<CommandResult>;
112
83
  cancel(key: string): Promise<CommandResult>;
113
84
  declareWorkspace(input: DeclareWorkspaceInput): Promise<CommandResult>;
114
- clearWorkspace(input: ClearWorkspaceInput): Promise<CommandResult>;
85
+ clearWorkspace(key: string): Promise<CommandResult>;
115
86
  expireBail(key: string): Promise<CommandResult>;
116
87
  /**
117
- * Drop a held Subtask (or planning) without waiting for the bail clock.
118
- * Same ledger outcome as an expired bail in those states.
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 Feature, whatever its state. */
124
- list(): Promise<FeatureSummary[]>;
125
- /** Every Feature mid-flight, whatever its Project. */
126
- listInFlight(): Promise<FeatureSummary[]>;
127
- activeOn(project: string): Promise<FeatureSummary | undefined>;
128
- nextReceived(project: string): Promise<FeatureSummary | undefined>;
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":"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"}
1
+ {"version":3,"file":"open-work-ledger.d.ts","sourceRoot":"","sources":["../../src/ledger/open-work-ledger.ts"],"names":[],"mappings":"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"}