@bluewombat/manager-kit 0.8.0 → 0.10.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 +11 -8
- package/SPECS.md +55 -30
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/module.d.ts +20 -2
- package/dist/module.d.ts.map +1 -1
- package/dist/port.d.ts +154 -31
- package/dist/port.d.ts.map +1 -1
- package/dist/port.js +5 -4
- package/dist/port.js.map +1 -1
- package/dist/product.d.ts +12 -5
- package/dist/product.d.ts.map +1 -1
- package/dist/product.js +12 -5
- package/dist/product.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Manager kit
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The FeatureTracker and TicketTracker plugin contract. Types only — no runtime, no dependency, no
|
|
4
4
|
Transformer. A package that wants mason to drive its tracker imports this and
|
|
5
5
|
nothing else. Contract: [SPECS.md](./SPECS.md).
|
|
6
6
|
|
|
@@ -29,8 +29,8 @@ npm install
|
|
|
29
29
|
|
|
30
30
|
## Write a manager
|
|
31
31
|
|
|
32
|
-
One export is required: `createManager`. Host calls it once at boot and drives
|
|
33
|
-
the `
|
|
32
|
+
One export is required: `createManager`. Host calls it once at boot per distinct side (a package named with the same options on both sides is built once) and drives
|
|
33
|
+
the `Manager` it returns: `features` (a `FeatureTrackerPort`) and `tickets` (a `TicketTrackerPort`).
|
|
34
34
|
|
|
35
35
|
```ts
|
|
36
36
|
import {
|
|
@@ -61,7 +61,10 @@ export function createManager(context: ManagerContext): CreateManagerResult {
|
|
|
61
61
|
Then point a config at it:
|
|
62
62
|
|
|
63
63
|
```json
|
|
64
|
-
{
|
|
64
|
+
{
|
|
65
|
+
"featureTracker": { "package": "@acme/manager-jira", "options": { "board": "APP" } },
|
|
66
|
+
"ticketTracker": { "package": "@acme/manager-jira", "options": { "board": "APP" } }
|
|
67
|
+
}
|
|
65
68
|
```
|
|
66
69
|
|
|
67
70
|
`checkManager` is optional. Export it and `mason doctor` prints your findings
|
|
@@ -72,7 +75,7 @@ and write to it — `mason setup` plans, `mason setup --apply` performs. Keep it
|
|
|
72
75
|
idempotent.
|
|
73
76
|
|
|
74
77
|
`questionsManager` is optional as well. Return the questions `mason init`
|
|
75
|
-
should ask, and Host fills `
|
|
78
|
+
should ask, and Host fills `options` from the answers:
|
|
76
79
|
|
|
77
80
|
```ts
|
|
78
81
|
export function questionsManager(): ManagerQuestion[] {
|
|
@@ -98,7 +101,7 @@ Host already holds is still there — a poll cannot see a deletion. `gone` is
|
|
|
98
101
|
abandon; `unavailable` is not.
|
|
99
102
|
|
|
100
103
|
`scaffoldManager` is optional. Export it and `mason init --manager this-package`
|
|
101
|
-
fills `
|
|
104
|
+
fills `options` from it (for both sides). A tracker field (`repo`, a board id) belongs
|
|
102
105
|
there, not as a Host flag.
|
|
103
106
|
|
|
104
107
|
`referenceManager` is optional, and only for a manager whose Authority holds
|
|
@@ -114,7 +117,7 @@ work line and Host keeps its own copy at `<home>/work-line` (`.mason` by default
|
|
|
114
117
|
SPECS.md the contract a manager package implements
|
|
115
118
|
README.md how to build it, and how to write a manager
|
|
116
119
|
src/
|
|
117
|
-
port.ts
|
|
120
|
+
port.ts FeatureTrackerPort, TicketTrackerPort, Manager and the values they exchange
|
|
118
121
|
module.ts ManagerContext, ManagerModule, Finding
|
|
119
|
-
options.ts readers for one
|
|
122
|
+
options.ts readers for one `options` object
|
|
120
123
|
```
|
package/SPECS.md
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
# Manager kit
|
|
2
2
|
|
|
3
3
|
A contract, not a Transformer. It holds no behaviour: it is the type boundary
|
|
4
|
-
between Host and
|
|
5
|
-
integration without depending on Host and without Host
|
|
4
|
+
between Host and a FeatureTracker and a TicketTracker, so a third party can
|
|
5
|
+
write a tracker integration without depending on Host and without Host
|
|
6
|
+
depending on them.
|
|
6
7
|
|
|
7
8
|
## 1. Job
|
|
8
9
|
|
|
9
10
|
```
|
|
10
11
|
Host manager-kit a manager package
|
|
11
12
|
---- -------- -----------------
|
|
12
|
-
reads a specifier
|
|
13
|
-
hands over
|
|
13
|
+
reads a specifier Manager implements createManager
|
|
14
|
+
hands over a side's options ManagerContext reads its own options
|
|
14
15
|
asks doctor for findings Finding may implement checkManager
|
|
15
16
|
asks init for a scaffold ManagerScaffold may implement scaffoldManager
|
|
16
17
|
asks init its questions ManagerQuestion may implement questionsManager
|
|
@@ -21,36 +22,59 @@ integration without depending on Host and without Host depending on them.
|
|
|
21
22
|
|
|
22
23
|
**In:** nothing. **Out:** types, and five pure option readers.
|
|
23
24
|
|
|
24
|
-
## 2. The
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
that
|
|
41
|
-
|
|
25
|
+
## 2. The Ports
|
|
26
|
+
|
|
27
|
+
A `Manager` is `{ features?, tickets? }`. The config names a package for each
|
|
28
|
+
side: `featureTracker` takes `features` from its package, `ticketTracker` takes
|
|
29
|
+
`tickets` from its own. One package may be both (the same tracker holds
|
|
30
|
+
Features and their Tickets), or each side may come from a different one; a
|
|
31
|
+
package asked for a side it does not answer is refused by name.
|
|
32
|
+
|
|
33
|
+
### FeatureTrackerPort: where a need is written
|
|
34
|
+
|
|
35
|
+
| Member | Required | Job |
|
|
36
|
+
| -------------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
37
|
+
| `listen` | yes | Drain the tracker since a Cursor, for Features whose specification is final. Returns an outcome and ordered Deliveries |
|
|
38
|
+
| `adapt` | yes | One raw payload → a FeatureStandard, or `invalid` / `unavailable` / `interrupted` |
|
|
39
|
+
| `report` | yes | One semantic Event onto the Feature. `false` when it could not be written |
|
|
40
|
+
| `signalsResume` | no | Whether this payload says a human unblocked an escalated Feature |
|
|
41
|
+
| `clearResume` | no | Take that signal back once it has been acted on. Left in place it resumes the Feature again on every pass |
|
|
42
|
+
| `probe` | no | Whether the Feature this key named is still on the tracker (`present` / `gone` / `unavailable` / `interrupted`) |
|
|
43
|
+
|
|
44
|
+
A FeatureStandard carries `blocked_by` (keys of Features that must be `done`
|
|
45
|
+
first) `merge_when_ready` (its line may be folded without a human) and `skip_e2e` (it is not put through the e2e acceptance check).
|
|
46
|
+
|
|
47
|
+
### TicketTrackerPort: the work that builds a Feature
|
|
48
|
+
|
|
49
|
+
| Member | Required | Job |
|
|
50
|
+
| ----------- | -------- | ------------------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| `tickets` | yes | Every Ticket of a Feature, each a `TicketEntry`: the TicketStandard (`intention`, `blocked_by`, `priority`) and `task_ready`, `resume`, `no_tests`, `e2e` (it holds the Feature's e2e acceptance suite), `open` |
|
|
52
|
+
| `report` | yes | One semantic Event onto a Ticket |
|
|
53
|
+
| `clearResume`| no | Take a Ticket's resume signal back once acted on |
|
|
54
|
+
| `probe` | no | Whether the Ticket this key named is still on the tracker |
|
|
55
|
+
| `openLine` | no | Cut a line from another: the branch a Feature's Tickets land on. Asking again for a line that exists succeeds |
|
|
56
|
+
| `dropLine` | no | Drop a line nobody will fold |
|
|
57
|
+
| `submit` | no | Offer an assembled Ticket, or a Feature's line, to the Authority. Returns an opaque reference |
|
|
58
|
+
| `fold` | no | Have the Authority take an accepted Submission into the line it was offered to |
|
|
59
|
+
| `settled` | no | Where a Submission stands (`open` / `folded` / `closed` / `unavailable`), for the ones a human folds |
|
|
60
|
+
|
|
61
|
+
`openLine`, `dropLine`, `submit`, `fold` and `settled` come as a set. A manager
|
|
62
|
+
that declares none has no Authority: no line exists, a Ticket is folded into
|
|
63
|
+
WorkLineStable directly, and a Feature is done when its Tickets are.
|
|
64
|
+
`report` may carry an `eventId`: an Event that states a fact rather than a
|
|
65
|
+
change is written once, however many passes see it.
|
|
42
66
|
|
|
43
67
|
`probe` exists because a poll cannot see an absence: a deleted item is missing
|
|
44
68
|
from every later page and never becomes a Delivery. Host already holds the keys.
|
|
45
69
|
`gone` is abandon, the same intent as a `cancel` delivery. `unavailable` is not
|
|
46
70
|
abandon — a missed read must not cancel work. Host only calls `probe` after a
|
|
47
71
|
listen that reached the source, so a token that can no longer list the tracker
|
|
48
|
-
is not read as every
|
|
49
|
-
|
|
72
|
+
is not read as every item disappearing. A manager that cannot answer omits the
|
|
73
|
+
method; Host does not invent an absence.
|
|
50
74
|
|
|
51
75
|
Host never reads a payload itself. A tracker's issue number, label, or status
|
|
52
76
|
is recoverable from the `key` the manager minted, so nothing tracker-shaped
|
|
53
|
-
crosses
|
|
77
|
+
crosses a Port.
|
|
54
78
|
|
|
55
79
|
## 3. The module
|
|
56
80
|
|
|
@@ -59,11 +83,12 @@ It must not throw for a bad option: the reason is what the user reads.
|
|
|
59
83
|
|
|
60
84
|
| Context field | Content |
|
|
61
85
|
| --------------- | ------------------------------------------------------ |
|
|
62
|
-
| `options` | The
|
|
86
|
+
| `options` | The `options` of the side that named this package, unread by Host |
|
|
63
87
|
| `durationMs` | Wall clock every call of this manager must stay inside |
|
|
64
88
|
| `interruptFlag` | Flips on SIGINT / SIGTERM; long calls must stop |
|
|
65
89
|
| `configDir` | Directory a relative option path resolves against |
|
|
66
90
|
| `env` | Where a secret named by an option is read from |
|
|
91
|
+
| `sides` | Optional. The sides (`featureTracker`, `ticketTracker`) this manager is built for; absent means both. A package serving both roles reads, checks and sets up only what those sides need |
|
|
67
92
|
|
|
68
93
|
A secret is read by the manager, from `context.env`, never by Host and never
|
|
69
94
|
from the config file.
|
|
@@ -73,7 +98,7 @@ from the config file.
|
|
|
73
98
|
same offline as online.
|
|
74
99
|
|
|
75
100
|
`questionsManager(context)` is optional and returns `ManagerQuestion[]`: the
|
|
76
|
-
wording, the fallback, and the validation of each `
|
|
101
|
+
wording, the fallback, and the validation of each `options` key a human
|
|
77
102
|
should be asked for. It declares them — Host reads the terminal, so no manager
|
|
78
103
|
ever touches stdin. A question whose key already has a value is skipped.
|
|
79
104
|
|
|
@@ -81,7 +106,7 @@ ever touches stdin. A question whose key already has a value is skipped.
|
|
|
81
106
|
the reference work line, or `undefined`. Host does not read it: the Isolation
|
|
82
107
|
strategy named by `workLine.isolation` does, strictly, and refuses a key it does
|
|
83
108
|
not know before a run writes anything. Only a manager that also declares
|
|
84
|
-
|
|
109
|
+
the Authority methods has a reference to name — with no Authority the work line is
|
|
85
110
|
the operator's directory, whatever this returns. Offline.
|
|
86
111
|
|
|
87
112
|
`setupManager(context, { apply })` is optional and is the **only hook allowed
|
|
@@ -103,7 +128,7 @@ here can fix is `blocked`, and `ok` is false. It must be idempotent — a second
|
|
|
103
128
|
call with `apply` true reports everything `satisfied` and writes nothing.
|
|
104
129
|
|
|
105
130
|
`scaffoldManager(context)` is optional and returns `{ options, nextSteps, prepare? }`.
|
|
106
|
-
`mason init` copies `options` into `
|
|
131
|
+
`mason init` copies `options` into `options` (flag `--manager-option`
|
|
107
132
|
wins per key), prints `nextSteps`, and calls `prepare(cwd)` so a directory
|
|
108
133
|
Source can exist before the first run. Host does not grow a flag for a
|
|
109
134
|
tracker's fields.
|
|
@@ -112,7 +137,7 @@ tracker's fields.
|
|
|
112
137
|
|
|
113
138
|
`stringOption`, `stringArrayOption`, `intOption`, `booleanOption`,
|
|
114
139
|
`rejectUnknownOptions`. Values arrive either from JSON (already typed) or from
|
|
115
|
-
repeated `--manager-option key=value` flags (always strings), so every reader
|
|
140
|
+
repeated `--manager-option key=value` flags (`--feature-tracker-option` and `--ticket-tracker-option` at run time) (always strings), so every reader
|
|
116
141
|
accepts the string spelling of its type, and a repeated flag key arrives as an
|
|
117
142
|
array.
|
|
118
143
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export type { CreateManagerResult, Finding, FindingLevel, ManagerContext, ManagerModule, ManagerQuestion, ManagerScaffold, SetupResult, SetupStep, } from "./module.js";
|
|
1
|
+
export type { CreateManagerResult, Finding, FindingLevel, Manager, ManagerContext, ManagerModule, ManagerQuestion, ManagerScaffold, ManagerSide, SetupResult, SetupStep, } from "./module.js";
|
|
2
2
|
export type { OptionResult, Options, } from "./options.js";
|
|
3
3
|
export { booleanOption, intOption, rejectUnknownOptions, stringArrayOption, stringOption, } from "./options.js";
|
|
4
|
-
export type { AdaptResult, Delivery, EventFields, EventName, FeatureStandard, FoldResult,
|
|
4
|
+
export type { AdaptResult, BehindResult, Delivery, EventFields, EventName, FeatureRef, FeatureStandard, FeatureTrackerPort, FoldResult, LineResult, ListenResult, ProbeResult, ReportInput, SettledResult, SubmissionRequest, SubmissionResult, TicketEntry, TicketStandard, TicketsResult, TicketTrackerPort, } from "./port.js";
|
|
5
5
|
export { EVENT_NAMES } from "./port.js";
|
|
6
|
-
export { PRODUCT } from "./product.js";
|
|
6
|
+
export { CLI_NAME, DEFAULT_CONFIG_FILENAME, HOME_DIR, PRODUCT } from "./product.js";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,SAAS,EACT,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { booleanOption, intOption, rejectUnknownOptions, stringArrayOption, stringOption, } from "./options.js";
|
|
2
2
|
export { EVENT_NAMES } from "./port.js";
|
|
3
|
-
export { PRODUCT } from "./product.js";
|
|
3
|
+
export { CLI_NAME, DEFAULT_CONFIG_FILENAME, HOME_DIR, PRODUCT } from "./product.js";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AAuBtB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/module.d.ts
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FeatureTrackerPort, TicketTrackerPort } from "./port.js";
|
|
2
2
|
/**
|
|
3
3
|
* What Host hands a manager package at boot. `options` is the config file's
|
|
4
4
|
* `managerOptions` object, unread: Host never validates a tracker's fields.
|
|
5
5
|
*/
|
|
6
|
+
/** The two places the config names a manager: the Features, and the Tickets. */
|
|
7
|
+
export type ManagerSide = "featureTracker" | "ticketTracker";
|
|
6
8
|
export type ManagerContext = {
|
|
7
9
|
options: Record<string, unknown>;
|
|
10
|
+
/**
|
|
11
|
+
* The sides of the config this manager is built for. Absent means both: a
|
|
12
|
+
* package that serves both roles reads, checks and sets up only what the
|
|
13
|
+
* listed sides need, so an option that belongs to the other side can live
|
|
14
|
+
* in that side's own options.
|
|
15
|
+
*/
|
|
16
|
+
sides?: readonly ManagerSide[];
|
|
8
17
|
/** Wall clock every call of this manager must stay inside. */
|
|
9
18
|
durationMs: number;
|
|
10
19
|
/** Flips on SIGINT / SIGTERM. Long calls must stop when it is true. */
|
|
@@ -16,9 +25,18 @@ export type ManagerContext = {
|
|
|
16
25
|
/** Where a secret named by an option is read from. Never logged by Host. */
|
|
17
26
|
env: Record<string, string | undefined>;
|
|
18
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* What a manager package answers. One package may be both sides (GitHub holds
|
|
30
|
+
* the Features and the Tickets), or only one (a product tool holds Features
|
|
31
|
+
* and no code).
|
|
32
|
+
*/
|
|
33
|
+
export type Manager = {
|
|
34
|
+
features?: FeatureTrackerPort;
|
|
35
|
+
tickets?: TicketTrackerPort;
|
|
36
|
+
};
|
|
19
37
|
export type CreateManagerResult = {
|
|
20
38
|
ok: true;
|
|
21
|
-
manager:
|
|
39
|
+
manager: Manager;
|
|
22
40
|
} | {
|
|
23
41
|
ok: false;
|
|
24
42
|
reason: string;
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
|
package/dist/port.d.ts
CHANGED
|
@@ -1,42 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* What Host asks of
|
|
2
|
+
* What Host asks of the two trackers, whatever the tools behind them.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* A FeatureTracker holds Features, the needs; a TicketTracker holds the Tickets
|
|
5
|
+
* that build them, and the lines they land on. Nothing here names GitHub, an
|
|
6
|
+
* issue, or a label: a manager package owns its tracker's vocabulary and hands
|
|
7
|
+
* Host these shapes only.
|
|
6
8
|
*/
|
|
7
9
|
/**
|
|
8
10
|
* Every semantic Event, as values. A manager that mirrors states onto the
|
|
9
11
|
* tracker needs the list at runtime, not only as a type.
|
|
10
12
|
*/
|
|
11
|
-
export declare const EVENT_NAMES: readonly ["invalid", "accepted", "
|
|
13
|
+
export declare const EVENT_NAMES: readonly ["invalid", "accepted", "progress", "escalated", "escalation_reminder", "resumed", "submitted", "done", "cancelled", "reject_late"];
|
|
12
14
|
export type EventName = (typeof EVENT_NAMES)[number];
|
|
13
15
|
export type EventFields = {
|
|
14
16
|
/** One sentence a reader gets first, under the heading and before any field. */
|
|
15
17
|
summary?: string;
|
|
16
18
|
reason?: string;
|
|
17
|
-
stage?: "
|
|
19
|
+
stage?: "unit" | "integrating" | "submitting" | "merging";
|
|
18
20
|
trace?: string;
|
|
19
21
|
counters?: Record<string, string>;
|
|
20
|
-
plan?: string;
|
|
21
22
|
priority?: number;
|
|
22
|
-
unit?: string;
|
|
23
23
|
remaining?: number;
|
|
24
24
|
state?: string;
|
|
25
|
-
resume_point?: "
|
|
25
|
+
resume_point?: "running" | "integrating";
|
|
26
26
|
reference?: string;
|
|
27
27
|
/** On `done`: the work line's own name for the fold, when the Authority gave one. Opaque. */
|
|
28
28
|
integration_reference?: string;
|
|
29
29
|
workspace_ref?: string;
|
|
30
30
|
};
|
|
31
|
+
/** A Feature, normalized: what the FeatureTracker's Adapter hands Host. */
|
|
31
32
|
export type FeatureStandard = {
|
|
32
33
|
key: string;
|
|
33
34
|
manager: string;
|
|
34
35
|
external_id: string;
|
|
35
|
-
intent: "upsert" | "
|
|
36
|
+
intent: "upsert" | "resume" | "cancel";
|
|
36
37
|
project: string;
|
|
37
38
|
title?: string;
|
|
38
39
|
intention?: string;
|
|
39
40
|
priority: number;
|
|
41
|
+
/** Keys of the Features that must be `done` before this one may open. */
|
|
42
|
+
blocked_by: string[];
|
|
43
|
+
/** Its line may be folded without a human. */
|
|
44
|
+
merge_when_ready: boolean;
|
|
45
|
+
/** It is not put through the e2e acceptance check, and its e2e Ticket is not worked. */
|
|
46
|
+
skip_e2e: boolean;
|
|
40
47
|
source?: {
|
|
41
48
|
ref?: string;
|
|
42
49
|
revision?: string;
|
|
@@ -44,6 +51,56 @@ export type FeatureStandard = {
|
|
|
44
51
|
fingerprint: string;
|
|
45
52
|
normalized_at: string;
|
|
46
53
|
};
|
|
54
|
+
/** A Ticket, normalized: what the TicketTracker hands Host for a Feature. */
|
|
55
|
+
export type TicketStandard = {
|
|
56
|
+
key: string;
|
|
57
|
+
manager: string;
|
|
58
|
+
external_id: string;
|
|
59
|
+
project: string;
|
|
60
|
+
title?: string;
|
|
61
|
+
intention: string;
|
|
62
|
+
priority: number;
|
|
63
|
+
/** Keys of the Tickets that must be `done` before this one may start. */
|
|
64
|
+
blocked_by: string[];
|
|
65
|
+
source?: {
|
|
66
|
+
ref?: string;
|
|
67
|
+
revision?: string;
|
|
68
|
+
};
|
|
69
|
+
fingerprint: string;
|
|
70
|
+
normalized_at: string;
|
|
71
|
+
};
|
|
72
|
+
/** A Ticket and what its tracker says of it beside the words. */
|
|
73
|
+
export type TicketEntry = {
|
|
74
|
+
ticket: TicketStandard;
|
|
75
|
+
/** Its specification is final. */
|
|
76
|
+
task_ready: boolean;
|
|
77
|
+
/** A human unblocked it after an escalation. */
|
|
78
|
+
resume: boolean;
|
|
79
|
+
/** No tests are written before its code: the tracker says so, in the words of nobody. */
|
|
80
|
+
no_tests: boolean;
|
|
81
|
+
/** It holds the e2e acceptance suite of its Feature: the tracker says so, in the words of nobody. */
|
|
82
|
+
e2e: boolean;
|
|
83
|
+
/** False once it is closed on the tracker. */
|
|
84
|
+
open: boolean;
|
|
85
|
+
};
|
|
86
|
+
/** A Feature as the TicketTracker is asked about it. */
|
|
87
|
+
export type FeatureRef = {
|
|
88
|
+
key: string;
|
|
89
|
+
external_id: string;
|
|
90
|
+
project: string;
|
|
91
|
+
source?: {
|
|
92
|
+
ref?: string;
|
|
93
|
+
revision?: string;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
export type TicketsResult = {
|
|
97
|
+
outcome: "listed";
|
|
98
|
+
tickets: TicketEntry[];
|
|
99
|
+
} | {
|
|
100
|
+
outcome: "unavailable";
|
|
101
|
+
} | {
|
|
102
|
+
outcome: "interrupted";
|
|
103
|
+
};
|
|
47
104
|
/** One raw intention, plus the Cursor Host saves once it is handled. */
|
|
48
105
|
export type Delivery = {
|
|
49
106
|
cursor: string;
|
|
@@ -80,7 +137,7 @@ export type ReportInput = {
|
|
|
80
137
|
/**
|
|
81
138
|
* Names this Event so it is reported once.
|
|
82
139
|
*
|
|
83
|
-
* A
|
|
140
|
+
* A Ticket is driven again on every pass while it waits, and an Event that
|
|
84
141
|
* only says what already happened must not be said twice. A manager that
|
|
85
142
|
* keeps a thread skips an id it has already written.
|
|
86
143
|
*/
|
|
@@ -91,7 +148,8 @@ export type ListenResult = {
|
|
|
91
148
|
deliveries: Delivery[];
|
|
92
149
|
};
|
|
93
150
|
/**
|
|
94
|
-
* A Submission: an assembled
|
|
151
|
+
* A Submission: an assembled Ticket, or a Feature's line, placed where an
|
|
152
|
+
* Authority can judge it.
|
|
95
153
|
*
|
|
96
154
|
* `ref` is what the system published and `target` the work line it is offered
|
|
97
155
|
* to — both opaque here. The Authority reads them; this contract does not.
|
|
@@ -103,8 +161,6 @@ export type SubmissionRequest = {
|
|
|
103
161
|
target: string;
|
|
104
162
|
title?: string;
|
|
105
163
|
intention?: string;
|
|
106
|
-
/** The Plan's Subtasks, in order — what the Submission is made of. */
|
|
107
|
-
steps?: string[];
|
|
108
164
|
/**
|
|
109
165
|
* How the delivered work describes itself, when the Project has a say — a
|
|
110
166
|
* subject line and a body. What the Authority makes of them is its own: a
|
|
@@ -125,6 +181,35 @@ export type SubmissionResult = {
|
|
|
125
181
|
} | {
|
|
126
182
|
outcome: "unavailable";
|
|
127
183
|
};
|
|
184
|
+
export type LineResult = {
|
|
185
|
+
outcome: "opened";
|
|
186
|
+
} | {
|
|
187
|
+
outcome: "refused";
|
|
188
|
+
reason: string;
|
|
189
|
+
} | {
|
|
190
|
+
outcome: "unavailable";
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Where a Submission stands with the Authority. `folded` is a human's merge as
|
|
194
|
+
* much as the system's; `closed` is the Authority turning it down for good.
|
|
195
|
+
*/
|
|
196
|
+
export type SettledResult = "open" | "folded" | "closed" | "unavailable";
|
|
197
|
+
/**
|
|
198
|
+
* Whether the line a Submission is offered to has moved on since the work was
|
|
199
|
+
* last brought up to date with it.
|
|
200
|
+
*
|
|
201
|
+
* `current`: the work holds everything the line holds. `behind`: the line has
|
|
202
|
+
* `commits` the work does not, so what the Gates judged is not what a fold would
|
|
203
|
+
* produce. An Authority that cannot tell answers `unavailable`, never `current`.
|
|
204
|
+
*/
|
|
205
|
+
export type BehindResult = {
|
|
206
|
+
outcome: "current";
|
|
207
|
+
} | {
|
|
208
|
+
outcome: "behind";
|
|
209
|
+
commits: number;
|
|
210
|
+
} | {
|
|
211
|
+
outcome: "unavailable";
|
|
212
|
+
};
|
|
128
213
|
export type FoldResult =
|
|
129
214
|
/** `reference`: the work line's own name for the fold, when the Authority can give one. Opaque. */
|
|
130
215
|
{
|
|
@@ -145,7 +230,13 @@ export type FoldResult =
|
|
|
145
230
|
* not abandon work.
|
|
146
231
|
*/
|
|
147
232
|
export type ProbeResult = "present" | "gone" | "unavailable" | "interrupted";
|
|
148
|
-
|
|
233
|
+
/**
|
|
234
|
+
* The FeatureTracker: where Features are written, ordered and signalled.
|
|
235
|
+
*
|
|
236
|
+
* It is the human surface for a need. It does not list Tickets and it does not
|
|
237
|
+
* hold a line.
|
|
238
|
+
*/
|
|
239
|
+
export type FeatureTrackerPort = {
|
|
149
240
|
listen(input: {
|
|
150
241
|
since?: string;
|
|
151
242
|
}): Promise<ListenResult>;
|
|
@@ -153,10 +244,10 @@ export type ManagerPort = {
|
|
|
153
244
|
report(input: ReportInput): Promise<boolean>;
|
|
154
245
|
/**
|
|
155
246
|
* Whether this raw payload says a human unblocked an escalated Feature.
|
|
156
|
-
* A poll snapshot carries no `
|
|
247
|
+
* A poll snapshot carries no `resume` edge, so the manager reads its own
|
|
157
248
|
* signal (a label, a status, a field) and Host stays tracker-agnostic.
|
|
158
249
|
*/
|
|
159
|
-
|
|
250
|
+
signalsResume?(payload: Record<string, unknown>): boolean;
|
|
160
251
|
/**
|
|
161
252
|
* Take the resume signal back once it has been acted on.
|
|
162
253
|
*
|
|
@@ -164,22 +255,9 @@ export type ManagerPort = {
|
|
|
164
255
|
* resumes the Feature again on every pass, and an escalation that is supposed
|
|
165
256
|
* to freeze the work freezes nothing.
|
|
166
257
|
*/
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Offer an assembled feature to the Authority.
|
|
170
|
-
*
|
|
171
|
-
* Both Submission methods come as a pair: a manager that declares neither has
|
|
172
|
-
* no Authority, and the work is folded into WorkLineStable directly, as it was
|
|
173
|
-
* before any of this existed. Whether the Submission is good is not asked
|
|
174
|
-
* here — that is a Gate's answer.
|
|
175
|
-
*/
|
|
176
|
-
submit?(input: SubmissionRequest): Promise<SubmissionResult>;
|
|
177
|
-
/** Have the Authority fold a Submission the Gates accepted into the work line. */
|
|
178
|
-
fold?(input: {
|
|
179
|
-
reference: string;
|
|
180
|
-
}): Promise<FoldResult>;
|
|
258
|
+
clearResume?(key: string): Promise<void>;
|
|
181
259
|
/**
|
|
182
|
-
* Whether the
|
|
260
|
+
* Whether the Feature this key named is still on the tracker.
|
|
183
261
|
*
|
|
184
262
|
* Optional: a manager that cannot answer (a directory of files, a tracker
|
|
185
263
|
* without a fetch-by-id) omits it, and Host does not invent an absence.
|
|
@@ -188,4 +266,49 @@ export type ManagerPort = {
|
|
|
188
266
|
*/
|
|
189
267
|
probe?(key: string): Promise<ProbeResult>;
|
|
190
268
|
};
|
|
269
|
+
/**
|
|
270
|
+
* The TicketTracker: where the work that builds a Feature is written, ordered
|
|
271
|
+
* and signalled — and, when it declares them, the Authority that holds the
|
|
272
|
+
* lines.
|
|
273
|
+
*/
|
|
274
|
+
export type TicketTrackerPort = {
|
|
275
|
+
/** Every Ticket of a Feature, with the signals the tracker carries. */
|
|
276
|
+
tickets(feature: FeatureRef): Promise<TicketsResult>;
|
|
277
|
+
report(input: ReportInput): Promise<boolean>;
|
|
278
|
+
/** Take a Ticket's resume signal back once it has been acted on. */
|
|
279
|
+
clearResume?(key: string): Promise<void>;
|
|
280
|
+
/** Whether the Ticket this key named is still on the tracker. */
|
|
281
|
+
probe?(key: string): Promise<ProbeResult>;
|
|
282
|
+
/**
|
|
283
|
+
* Cut a line from another one: the branch a Feature's Tickets land on.
|
|
284
|
+
* Asking again for a line that exists is a success.
|
|
285
|
+
*
|
|
286
|
+
* The Authority methods come together: a manager that declares none has no
|
|
287
|
+
* Authority, and the work is folded into WorkLineStable directly. Whether a
|
|
288
|
+
* Submission is good is not asked here — that is a Gate's answer.
|
|
289
|
+
*/
|
|
290
|
+
openLine?(input: {
|
|
291
|
+
line: string;
|
|
292
|
+
from: string;
|
|
293
|
+
}): Promise<LineResult>;
|
|
294
|
+
/** Drop a line nobody will fold. */
|
|
295
|
+
dropLine?(line: string): Promise<void>;
|
|
296
|
+
/** Offer an assembled Ticket, or a Feature's line, to the Authority. */
|
|
297
|
+
submit?(input: SubmissionRequest): Promise<SubmissionResult>;
|
|
298
|
+
/**
|
|
299
|
+
* Whether the line has moved on since the Submission was aligned with it.
|
|
300
|
+
* Asked just before a fold: absent, nothing is checked and the fold goes ahead.
|
|
301
|
+
*/
|
|
302
|
+
behind?(input: {
|
|
303
|
+
reference: string;
|
|
304
|
+
}): Promise<BehindResult>;
|
|
305
|
+
/** Have the Authority fold a Submission the Gates accepted into the line it was offered to. */
|
|
306
|
+
fold?(input: {
|
|
307
|
+
reference: string;
|
|
308
|
+
}): Promise<FoldResult>;
|
|
309
|
+
/** Where a Submission stands, for the ones a human folds. */
|
|
310
|
+
settled?(input: {
|
|
311
|
+
reference: string;
|
|
312
|
+
}): Promise<SettledResult>;
|
|
313
|
+
};
|
|
191
314
|
//# sourceMappingURL=port.d.ts.map
|
package/dist/port.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"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"}
|
package/dist/port.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* What Host asks of
|
|
2
|
+
* What Host asks of the two trackers, whatever the tools behind them.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* A FeatureTracker holds Features, the needs; a TicketTracker holds the Tickets
|
|
5
|
+
* that build them, and the lines they land on. Nothing here names GitHub, an
|
|
6
|
+
* issue, or a label: a manager package owns its tracker's vocabulary and hands
|
|
7
|
+
* Host these shapes only.
|
|
6
8
|
*/
|
|
7
9
|
/**
|
|
8
10
|
* Every semantic Event, as values. A manager that mirrors states onto the
|
|
@@ -11,7 +13,6 @@
|
|
|
11
13
|
export const EVENT_NAMES = [
|
|
12
14
|
"invalid",
|
|
13
15
|
"accepted",
|
|
14
|
-
"planned",
|
|
15
16
|
"progress",
|
|
16
17
|
"escalated",
|
|
17
18
|
"escalation_reminder",
|
package/dist/port.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.js","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS;IACT,UAAU;IACV,UAAU;IACV,WAAW;IACX,qBAAqB;IACrB,SAAS;IACT,WAAW;IACX,MAAM;IACN,WAAW;IACX,aAAa;CACL,CAAC"}
|
package/dist/product.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Names the operator sees. Host and every manager read them from the kit;
|
|
3
|
+
* `scripts/check-name.mjs` refuses the product word in any other source file.
|
|
4
|
+
*
|
|
5
|
+
* PRODUCT is still the name in messages, labels, and the manager keyword.
|
|
6
|
+
* The binary, the config file, and the home directory each have their own
|
|
7
|
+
* constant, so one can change without the others.
|
|
7
8
|
*/
|
|
8
9
|
export declare const PRODUCT = "mason";
|
|
10
|
+
/** The binary. The runtime package's `bin` must match. */
|
|
11
|
+
export declare const CLI_NAME = "mason";
|
|
12
|
+
/** The config file init writes, and the one looked up, when --config is absent. */
|
|
13
|
+
export declare const DEFAULT_CONFIG_FILENAME = "mason.config.yaml";
|
|
14
|
+
/** The directory Host owns when the config names none. */
|
|
15
|
+
export declare const HOME_DIR = ".mason";
|
|
9
16
|
//# sourceMappingURL=product.d.ts.map
|
package/dist/product.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,UAAU,CAAC;AAEhC,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAE3D,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,WAAW,CAAC"}
|
package/dist/product.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Names the operator sees. Host and every manager read them from the kit;
|
|
3
|
+
* `scripts/check-name.mjs` refuses the product word in any other source file.
|
|
4
|
+
*
|
|
5
|
+
* PRODUCT is still the name in messages, labels, and the manager keyword.
|
|
6
|
+
* The binary, the config file, and the home directory each have their own
|
|
7
|
+
* constant, so one can change without the others.
|
|
7
8
|
*/
|
|
8
9
|
export const PRODUCT = "mason";
|
|
10
|
+
/** The binary. The runtime package's `bin` must match. */
|
|
11
|
+
export const CLI_NAME = "mason";
|
|
12
|
+
/** The config file init writes, and the one looked up, when --config is absent. */
|
|
13
|
+
export const DEFAULT_CONFIG_FILENAME = "mason.config.yaml";
|
|
14
|
+
/** The directory Host owns when the config names none. */
|
|
15
|
+
export const HOME_DIR = ".mason";
|
|
9
16
|
//# sourceMappingURL=product.js.map
|
package/dist/product.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,0DAA0D;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEhC,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE3D,0DAA0D;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bluewombat/manager-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "Contract a
|
|
5
|
+
"description": "Contract a TicketTracker package implements for Host.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mason",
|
|
8
8
|
"bluewombat",
|