@bluewombat/manager-kit 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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Manager kit
2
2
 
3
- The FeatureManager plugin contract. Types only — no runtime, no dependency, no
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 `ManagerPort` it returns.
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
- { "manager": "@acme/manager-jira", "managerOptions": { "board": "APP" } }
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 `managerOptions` from the answers:
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 `managerOptions` from it. A tracker field (`repo`, a board id) belongs
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 ManagerPort and the values it exchanges
120
+ port.ts FeatureTrackerPort, TicketTrackerPort, Manager and the values they exchange
118
121
  module.ts ManagerContext, ManagerModule, Finding
119
- options.ts readers for one managerOptions object
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 one FeatureManager, so a third party can write a tracker
5
- integration without depending on Host and without Host depending on them.
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 ManagerPort implements createManager
13
- hands over managerOptions ManagerContext reads its own options
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 Port
25
-
26
- | Member | Required | Job |
27
- | -------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
28
- | `listen` | yes | Drain the tracker since a Cursor. Returns an outcome and ordered Deliveries |
29
- | `adapt` | yes | One raw payload → a FeatureStandard, or `invalid` / `unavailable` / `interrupted` |
30
- | `report` | yes | One semantic Event onto the tracker. `false` when it could not be written |
31
- | `signalsReady` | no | Whether this payload says a human unblocked an escalated Feature (a label, a status) |
32
- | `clearReady` | no | Take that signal back once it has been acted on. Left in place it resumes the Feature again on every pass, and an escalation freezes nothing |
33
- | `submit` | no | Offer an assembled feature to the Authority. Returns an opaque reference |
34
- | `fold` | no | Have the Authority take an accepted Submission into the work line |
35
- | `probe` | no | Whether the intention this key named is still on the tracker (`present` / `gone` / `unavailable` / `interrupted`) |
36
-
37
- The two Authority methods, `submit` and `fold`, come as a set. A manager that declares none has no
38
- Authority, and an assembled feature is folded into WorkLineStable directly — the
39
- way it was before any of this existed. `report` may carry an `eventId`: an Event
40
- that states a fact rather than a change is written once, however many passes see
41
- it.
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) and `merge_when_ready` (its line may be folded without a human).
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`, `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 Feature disappearing. A manager that cannot answer omits
49
- the method; Host does not invent an absence.
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 the Port.
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 config's `managerOptions`, unread by Host |
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 `managerOptions` key a human
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
- `submit` and `fold` has a reference to name — with no Authority the work line is
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 `managerOptions` (flag `--manager-option`
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, ListenResult, ManagerPort, ProbeResult, ReportInput, SubmissionRequest, SubmissionResult, } from "./port.js";
4
+ export type { AdaptResult, 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
@@ -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,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
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,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":"AAeA,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AAetB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
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;AAsBtB,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 { ManagerPort } from "./port.js";
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: ManagerPort;
39
+ manager: Manager;
22
40
  } | {
23
41
  ok: false;
24
42
  reason: string;
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
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,47 @@
1
1
  /**
2
- * What Host asks of one FeatureManager, whatever the tracker behind it.
2
+ * What Host asks of the two trackers, whatever the tools behind them.
3
3
  *
4
- * Nothing here names GitHub, an issue, or a label: a manager package owns its
5
- * tracker's vocabulary and hands Host these shapes only.
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", "planned", "progress", "escalated", "escalation_reminder", "resumed", "submitted", "done", "cancelled", "reject_late"];
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?: "plan" | "unit" | "integrating" | "submitting" | "merging";
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?: "planning" | "running" | "integrating";
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" | "ready" | "cancel";
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;
40
45
  source?: {
41
46
  ref?: string;
42
47
  revision?: string;
@@ -44,6 +49,52 @@ export type FeatureStandard = {
44
49
  fingerprint: string;
45
50
  normalized_at: string;
46
51
  };
52
+ /** A Ticket, normalized: what the TicketTracker hands Host for a Feature. */
53
+ export type TicketStandard = {
54
+ key: string;
55
+ manager: string;
56
+ external_id: string;
57
+ project: string;
58
+ title?: string;
59
+ intention: string;
60
+ priority: number;
61
+ /** Keys of the Tickets that must be `done` before this one may start. */
62
+ blocked_by: string[];
63
+ source?: {
64
+ ref?: string;
65
+ revision?: string;
66
+ };
67
+ fingerprint: string;
68
+ normalized_at: string;
69
+ };
70
+ /** A Ticket and what its tracker says of it beside the words. */
71
+ export type TicketEntry = {
72
+ ticket: TicketStandard;
73
+ /** Its specification is final. */
74
+ task_ready: boolean;
75
+ /** A human unblocked it after an escalation. */
76
+ resume: boolean;
77
+ /** False once it is closed on the tracker. */
78
+ open: boolean;
79
+ };
80
+ /** A Feature as the TicketTracker is asked about it. */
81
+ export type FeatureRef = {
82
+ key: string;
83
+ external_id: string;
84
+ project: string;
85
+ source?: {
86
+ ref?: string;
87
+ revision?: string;
88
+ };
89
+ };
90
+ export type TicketsResult = {
91
+ outcome: "listed";
92
+ tickets: TicketEntry[];
93
+ } | {
94
+ outcome: "unavailable";
95
+ } | {
96
+ outcome: "interrupted";
97
+ };
47
98
  /** One raw intention, plus the Cursor Host saves once it is handled. */
48
99
  export type Delivery = {
49
100
  cursor: string;
@@ -80,7 +131,7 @@ export type ReportInput = {
80
131
  /**
81
132
  * Names this Event so it is reported once.
82
133
  *
83
- * A feature is driven again on every pass while it waits, and an Event that
134
+ * A Ticket is driven again on every pass while it waits, and an Event that
84
135
  * only says what already happened must not be said twice. A manager that
85
136
  * keeps a thread skips an id it has already written.
86
137
  */
@@ -91,7 +142,8 @@ export type ListenResult = {
91
142
  deliveries: Delivery[];
92
143
  };
93
144
  /**
94
- * A Submission: an assembled feature placed where an Authority can judge it.
145
+ * A Submission: an assembled Ticket, or a Feature's line, placed where an
146
+ * Authority can judge it.
95
147
  *
96
148
  * `ref` is what the system published and `target` the work line it is offered
97
149
  * to — both opaque here. The Authority reads them; this contract does not.
@@ -103,8 +155,6 @@ export type SubmissionRequest = {
103
155
  target: string;
104
156
  title?: string;
105
157
  intention?: string;
106
- /** The Plan's Subtasks, in order — what the Submission is made of. */
107
- steps?: string[];
108
158
  /**
109
159
  * How the delivered work describes itself, when the Project has a say — a
110
160
  * subject line and a body. What the Authority makes of them is its own: a
@@ -125,6 +175,19 @@ export type SubmissionResult = {
125
175
  } | {
126
176
  outcome: "unavailable";
127
177
  };
178
+ export type LineResult = {
179
+ outcome: "opened";
180
+ } | {
181
+ outcome: "refused";
182
+ reason: string;
183
+ } | {
184
+ outcome: "unavailable";
185
+ };
186
+ /**
187
+ * Where a Submission stands with the Authority. `folded` is a human's merge as
188
+ * much as the system's; `closed` is the Authority turning it down for good.
189
+ */
190
+ export type SettledResult = "open" | "folded" | "closed" | "unavailable";
128
191
  export type FoldResult =
129
192
  /** `reference`: the work line's own name for the fold, when the Authority can give one. Opaque. */
130
193
  {
@@ -145,7 +208,13 @@ export type FoldResult =
145
208
  * not abandon work.
146
209
  */
147
210
  export type ProbeResult = "present" | "gone" | "unavailable" | "interrupted";
148
- export type ManagerPort = {
211
+ /**
212
+ * The FeatureTracker: where Features are written, ordered and signalled.
213
+ *
214
+ * It is the human surface for a need. It does not list Tickets and it does not
215
+ * hold a line.
216
+ */
217
+ export type FeatureTrackerPort = {
149
218
  listen(input: {
150
219
  since?: string;
151
220
  }): Promise<ListenResult>;
@@ -153,10 +222,10 @@ export type ManagerPort = {
153
222
  report(input: ReportInput): Promise<boolean>;
154
223
  /**
155
224
  * Whether this raw payload says a human unblocked an escalated Feature.
156
- * A poll snapshot carries no `ready` edge, so the manager reads its own
225
+ * A poll snapshot carries no `resume` edge, so the manager reads its own
157
226
  * signal (a label, a status, a field) and Host stays tracker-agnostic.
158
227
  */
159
- signalsReady?(payload: Record<string, unknown>): boolean;
228
+ signalsResume?(payload: Record<string, unknown>): boolean;
160
229
  /**
161
230
  * Take the resume signal back once it has been acted on.
162
231
  *
@@ -164,22 +233,9 @@ export type ManagerPort = {
164
233
  * resumes the Feature again on every pass, and an escalation that is supposed
165
234
  * to freeze the work freezes nothing.
166
235
  */
167
- clearReady?(key: string): Promise<void>;
236
+ clearResume?(key: string): Promise<void>;
168
237
  /**
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>;
181
- /**
182
- * Whether the intention this key named is still on the tracker.
238
+ * Whether the Feature this key named is still on the tracker.
183
239
  *
184
240
  * Optional: a manager that cannot answer (a directory of files, a tracker
185
241
  * without a fetch-by-id) omits it, and Host does not invent an absence.
@@ -188,4 +244,42 @@ export type ManagerPort = {
188
244
  */
189
245
  probe?(key: string): Promise<ProbeResult>;
190
246
  };
247
+ /**
248
+ * The TicketTracker: where the work that builds a Feature is written, ordered
249
+ * and signalled — and, when it declares them, the Authority that holds the
250
+ * lines.
251
+ */
252
+ export type TicketTrackerPort = {
253
+ /** Every Ticket of a Feature, with the signals the tracker carries. */
254
+ tickets(feature: FeatureRef): Promise<TicketsResult>;
255
+ report(input: ReportInput): Promise<boolean>;
256
+ /** Take a Ticket's resume signal back once it has been acted on. */
257
+ clearResume?(key: string): Promise<void>;
258
+ /** Whether the Ticket this key named is still on the tracker. */
259
+ probe?(key: string): Promise<ProbeResult>;
260
+ /**
261
+ * Cut a line from another one: the branch a Feature's Tickets land on.
262
+ * Asking again for a line that exists is a success.
263
+ *
264
+ * The Authority methods come together: a manager that declares none has no
265
+ * Authority, and the work is folded into WorkLineStable directly. Whether a
266
+ * Submission is good is not asked here — that is a Gate's answer.
267
+ */
268
+ openLine?(input: {
269
+ line: string;
270
+ from: string;
271
+ }): Promise<LineResult>;
272
+ /** Drop a line nobody will fold. */
273
+ dropLine?(line: string): Promise<void>;
274
+ /** Offer an assembled Ticket, or a Feature's line, to the Authority. */
275
+ submit?(input: SubmissionRequest): Promise<SubmissionResult>;
276
+ /** Have the Authority fold a Submission the Gates accepted into the line it was offered to. */
277
+ fold?(input: {
278
+ reference: string;
279
+ }): Promise<FoldResult>;
280
+ /** Where a Submission stands, for the ones a human folds. */
281
+ settled?(input: {
282
+ reference: string;
283
+ }): Promise<SettledResult>;
284
+ };
191
285
  //# sourceMappingURL=port.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"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"}
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 one FeatureManager, whatever the tracker behind it.
2
+ * What Host asks of the two trackers, whatever the tools behind them.
3
3
  *
4
- * Nothing here names GitHub, an issue, or a label: a manager package owns its
5
- * tracker's vocabulary and hands Host these shapes only.
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;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;IACV,WAAW;IACX,qBAAqB;IACrB,SAAS;IACT,WAAW;IACX,MAAM;IACN,WAAW;IACX,aAAa;CACL,CAAC"}
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
- * The name the product goes by — the binary, the config file, the home
3
- * directory, the labels a manager writes, the words in a message. It is
4
- * written here once. Host and every manager read it from the kit; the only
5
- * other file that spells it is `isolation-git`'s branch prefix, which has no
6
- * kit to import. `scripts/check-name.mjs` refuses it anywhere else in source.
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
@@ -1 +1 @@
1
- {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,UAAU,CAAC"}
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
- * The name the product goes by — the binary, the config file, the home
3
- * directory, the labels a manager writes, the words in a message. It is
4
- * written here once. Host and every manager read it from the kit; the only
5
- * other file that spells it is `isolation-git`'s branch prefix, which has no
6
- * kit to import. `scripts/check-name.mjs` refuses it anywhere else in source.
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
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
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.8.0",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
- "description": "Contract a FeatureManager package implements for Host.",
5
+ "description": "Contract a TicketTracker package implements for Host.",
6
6
  "keywords": [
7
7
  "mason",
8
8
  "bluewombat",