@detergent-software/conductor 1.0.0-dev.2 → 1.0.0-dev.20

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.
Files changed (104) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +361 -11
  3. package/build/broker-cli.js +125 -0
  4. package/build/broker-cli.js.map +1 -0
  5. package/build/broker.js +154 -0
  6. package/build/broker.js.map +1 -0
  7. package/build/cli.js +610 -44
  8. package/build/cli.js.map +1 -1
  9. package/build/clock.js +17 -0
  10. package/build/clock.js.map +1 -0
  11. package/build/conditions.js +19 -13
  12. package/build/conditions.js.map +1 -1
  13. package/build/config.js +94 -1
  14. package/build/config.js.map +1 -1
  15. package/build/console.js +99 -0
  16. package/build/console.js.map +1 -0
  17. package/build/credential.js +52 -0
  18. package/build/credential.js.map +1 -0
  19. package/build/daemon.js +153 -2
  20. package/build/daemon.js.map +1 -1
  21. package/build/events.js +106 -0
  22. package/build/events.js.map +1 -0
  23. package/build/history.js +630 -0
  24. package/build/history.js.map +1 -0
  25. package/build/inbox.js +386 -0
  26. package/build/inbox.js.map +1 -0
  27. package/build/manager.js +74 -12
  28. package/build/manager.js.map +1 -1
  29. package/build/mod.js +51 -0
  30. package/build/mod.js.map +1 -0
  31. package/build/note.js +71 -0
  32. package/build/note.js.map +1 -0
  33. package/build/notes.js +172 -0
  34. package/build/notes.js.map +1 -0
  35. package/build/notify.js +422 -0
  36. package/build/notify.js.map +1 -0
  37. package/build/overrides.js +83 -0
  38. package/build/overrides.js.map +1 -0
  39. package/build/paths.js +10 -1
  40. package/build/paths.js.map +1 -1
  41. package/build/profile.js +68 -2
  42. package/build/profile.js.map +1 -1
  43. package/build/pushover.js +67 -0
  44. package/build/pushover.js.map +1 -0
  45. package/build/queue.js +183 -0
  46. package/build/queue.js.map +1 -0
  47. package/build/registry.js +17 -10
  48. package/build/registry.js.map +1 -1
  49. package/build/rule-actions.js +444 -0
  50. package/build/rule-actions.js.map +1 -0
  51. package/build/rule-input.js +17 -0
  52. package/build/rule-input.js.map +1 -0
  53. package/build/rules-service.js +402 -0
  54. package/build/rules-service.js.map +1 -0
  55. package/build/rules.js +850 -0
  56. package/build/rules.js.map +1 -0
  57. package/build/scheduler.js +274 -0
  58. package/build/scheduler.js.map +1 -0
  59. package/build/server.js +294 -0
  60. package/build/server.js.map +1 -1
  61. package/build/spend.js +8 -0
  62. package/build/spend.js.map +1 -1
  63. package/build/store.js +452 -4
  64. package/build/store.js.map +1 -1
  65. package/build/trackers.js +12 -0
  66. package/build/trackers.js.map +1 -0
  67. package/build/upgrade.js +36 -22
  68. package/build/upgrade.js.map +1 -1
  69. package/build/wait.js +35 -41
  70. package/build/wait.js.map +1 -1
  71. package/build/watchers/ado-api.js +55 -0
  72. package/build/watchers/ado-api.js.map +1 -0
  73. package/build/watchers/ado.js +37 -49
  74. package/build/watchers/ado.js.map +1 -1
  75. package/build/watchers/boards-queue.js +120 -0
  76. package/build/watchers/boards-queue.js.map +1 -0
  77. package/build/watchers/boards-writes.js +83 -0
  78. package/build/watchers/boards-writes.js.map +1 -0
  79. package/build/watchers/boards.js +267 -0
  80. package/build/watchers/boards.js.map +1 -0
  81. package/build/watchers/github.js +5 -2
  82. package/build/watchers/github.js.map +1 -1
  83. package/build/watchers/index.js +1 -0
  84. package/build/watchers/index.js.map +1 -1
  85. package/build/watchers/linear-api.js +55 -0
  86. package/build/watchers/linear-api.js.map +1 -0
  87. package/build/watchers/linear-key.js +6 -45
  88. package/build/watchers/linear-key.js.map +1 -1
  89. package/build/watchers/linear-labels.js +43 -0
  90. package/build/watchers/linear-labels.js.map +1 -0
  91. package/build/watchers/linear-queue.js +96 -0
  92. package/build/watchers/linear-queue.js.map +1 -0
  93. package/build/watchers/linear.js +29 -18
  94. package/build/watchers/linear.js.map +1 -1
  95. package/build/why.js +78 -0
  96. package/build/why.js.map +1 -0
  97. package/mod/.claude-plugin/marketplace.json +6 -0
  98. package/mod/.claude-plugin/plugin.json +7 -0
  99. package/mod/README.md +17 -0
  100. package/mod/hooks/hooks.json +1 -0
  101. package/mod/hooks/model.ts +457 -0
  102. package/mod/hooks/register.tsx +543 -0
  103. package/mod/types/index.d.ts +57 -0
  104. package/package.json +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ import { ConductorError } from "./errors.js";
3
+ import { NO_EXPIRY } from "./store.js";
4
+ // Overrides that expire (design note, section 9): pause launches (one project, or all) and focus
5
+ // (a project's weight or slots) until a time. `conduct pause|unpause|focus` set them, and later
6
+ // rules will too; each change is an `override.set` event that names who set it.
7
+ export const PAUSE = 'launch.pause';
8
+ export const FOCUS_SLOTS = 'focus.slots';
9
+ export const FOCUS_WEIGHT = 'focus.weight';
10
+ export const overrideViewSchema = z.object({
11
+ id: z.number(),
12
+ kind: z.string(),
13
+ // null: every project.
14
+ project: z.string().nullable(),
15
+ setAt: z.string(),
16
+ // null: until replaced.
17
+ until: z.string().nullable(),
18
+ value: z.string(),
19
+ });
20
+ export function overridesService({ config, now = () => new Date(), store }) {
21
+ const known = (project) => {
22
+ if (project === null)
23
+ return;
24
+ const names = store.listProjects().map((p) => p.name);
25
+ if (!names.includes(project))
26
+ throw new ConductorError(`no project "${project}"`, [`registered: ${names.join(', ') || 'none'}`]);
27
+ };
28
+ const future = (until) => {
29
+ if (until.getTime() <= now().getTime())
30
+ throw new ConductorError(`until ${until.toISOString()} is in the past`);
31
+ };
32
+ const set = (kind, project, value, until, by) => {
33
+ const override = store.setOverride({ kind, project, setBy: by, until: until?.toISOString() ?? NO_EXPIRY, value });
34
+ store.appendEvent({ data: { by, kind, until: until?.toISOString() ?? null, value }, kind: 'override.set', project, rule: by });
35
+ return viewOf(override);
36
+ };
37
+ const live = (kind, project) => store.liveOverride(kind, project);
38
+ const untilText = (o) => (o.until === NO_EXPIRY ? 'until you unpause' : `until ${new Date(o.until).toLocaleString()}`);
39
+ return {
40
+ focus: (project, change, until, by) => {
41
+ known(project);
42
+ future(until);
43
+ // A focus that names neither puts the project's items first.
44
+ if (change.slots === undefined && change.weight === undefined)
45
+ change = { weight: 100 };
46
+ if (change.slots !== undefined && (!Number.isInteger(change.slots) || change.slots < 0 || change.slots > config.scheduler.slots)) {
47
+ throw new ConductorError(`--slots ${change.slots} is outside 0 to scheduler.slots (${config.scheduler.slots}): no project gets more than the global slots`);
48
+ }
49
+ if (change.weight !== undefined && (!Number.isInteger(change.weight) || change.weight < -100 || change.weight > 100)) {
50
+ throw new ConductorError(`--weight ${change.weight} is outside -100 to 100`);
51
+ }
52
+ return [
53
+ ...(change.slots === undefined ? [] : [set(FOCUS_SLOTS, project, String(change.slots), until, by)]),
54
+ ...(change.weight === undefined ? [] : [set(FOCUS_WEIGHT, project, String(change.weight), until, by)]),
55
+ ];
56
+ },
57
+ list: () => store.liveOverrides().filter((o) => [FOCUS_SLOTS, FOCUS_WEIGHT, PAUSE].includes(o.kind)).filter((o) => o.kind !== PAUSE || o.value === 'on').map(viewOf),
58
+ pause: (project, until, by) => {
59
+ known(project);
60
+ if (until !== null)
61
+ future(until);
62
+ return set(PAUSE, project, 'on', until, by);
63
+ },
64
+ pausedReason: (project) => {
65
+ const own = project === null ? null : live(PAUSE, project);
66
+ const all = live(PAUSE, null);
67
+ const on = [own, all].find((o) => o?.value === 'on');
68
+ if (!on)
69
+ return null;
70
+ return `${on.project === null ? 'all launches' : 'launches'} paused ${untilText(on)}`;
71
+ },
72
+ slots: (project, profileSlots) => Math.min(config.scheduler.slots, Number(live(FOCUS_SLOTS, project)?.value ?? profileSlots)),
73
+ unpause: (project, by) => {
74
+ known(project);
75
+ return set(PAUSE, project, 'off', null, by);
76
+ },
77
+ weight: (project, profileWeight) => Number(live(FOCUS_WEIGHT, project)?.value ?? profileWeight),
78
+ };
79
+ }
80
+ function viewOf(o) {
81
+ return { id: o.id, kind: o.kind, project: o.project, setAt: o.createdAt, until: o.until === NO_EXPIRY ? null : o.until, value: o.value };
82
+ }
83
+ //# sourceMappingURL=overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../src/overrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAC;AAElE,iGAAiG;AACjG,gGAAgG;AAChG,gFAAgF;AAChF,MAAM,CAAC,MAAM,KAAK,GAAG,cAAc,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,uBAAuB;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,wBAAwB;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAqBH,MAAM,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,EAAiB;IACvF,MAAM,KAAK,GAAG,CAAC,OAAsB,EAAQ,EAAE;QAC7C,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,eAAe,OAAO,GAAG,EAAE,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;IACnI,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,KAAW,EAAQ,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE;YAAE,MAAM,IAAI,cAAc,CAAC,SAAS,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAClH,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,OAAsB,EAAE,KAAa,EAAE,KAAkB,EAAE,EAAU,EAAgB,EAAE;QAChH,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAClH,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/H,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAsB,EAAmB,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1G,MAAM,SAAS,GAAG,CAAC,CAAW,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAEzI,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACpC,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,6DAA6D;YAC7D,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACxF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjI,MAAM,IAAI,cAAc,CAAC,WAAW,MAAM,CAAC,KAAK,qCAAqC,MAAM,CAAC,SAAS,CAAC,KAAK,+CAA+C,CAAC,CAAC;YAC9J,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;gBACrH,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,CAAC,MAAM,yBAAyB,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO;gBACL,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;gBACnG,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;aACvG,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACpK,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YAC5B,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,IAAI,KAAK,KAAK,IAAI;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,WAAW,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QACxF,CAAC;QACD,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC;QAC7H,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE;YACvB,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,aAAa,CAAC;KAChG,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,CAAW;IACzB,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAC3I,CAAC"}
package/build/paths.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { homedir } from 'node:os';
2
- import { join } from 'node:path';
2
+ import { join, resolve } from 'node:path';
3
3
  export function conductorPaths(home = process.env.CONDUCTOR_HOME || join(homedir(), '.conductor')) {
4
4
  const logs = join(home, 'logs');
5
5
  return {
@@ -10,7 +10,16 @@ export function conductorPaths(home = process.env.CONDUCTOR_HOME || join(homedir
10
10
  logs,
11
11
  pid: join(home, 'conductor.pid'),
12
12
  port: join(home, 'port'),
13
+ rules: join(home, 'rules.json'),
13
14
  token: join(home, 'token'),
14
15
  };
15
16
  }
17
+ // Whether two paths name the same file, ignoring case on Windows.
18
+ export function samePath(a, b) {
19
+ const norm = (p) => {
20
+ const full = resolve(p);
21
+ return process.platform === 'win32' ? full.toLowerCase() : full;
22
+ };
23
+ return norm(a) === norm(b);
24
+ }
16
25
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAejC,MAAM,UAAU,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACjC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QAC9B,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAChC,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiB1C,MAAM,UAAU,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACjC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QAC9B,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAChC,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QAC/B,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC"}
package/build/profile.js CHANGED
@@ -3,6 +3,7 @@ import { join } from 'node:path';
3
3
  import { z } from 'zod';
4
4
  import { ConductorError, isMissing } from "./errors.js";
5
5
  import { parseJsonc } from "./jsonc.js";
6
+ import { ruleInputSchema } from "./rule-input.js";
6
7
  // The worker protocol this conductor speaks. A profile pins the version its skills use, so repos on
7
8
  // different skill versions can be conducted side by side (design note, section 3).
8
9
  export const PROTOCOL = 1;
@@ -25,10 +26,22 @@ export const profileSchema = z.strictObject({
25
26
  name,
26
27
  // The package `conduct wait npm <version>` means.
27
28
  npm: z.strictObject({ package: text }).optional(),
28
- ports: z.strictObject({ api: port, maxSlot: z.int().min(0).max(1000), web: port }),
29
+ // The dev servers' base ports by name, such as { "web": 3000, "api": 7071 }: the main checkout
30
+ // serves on them, and the worktree the port broker gives offset N on each base + N, up to maxSlot.
31
+ ports: z
32
+ .object({ maxSlot: z.int().min(0).max(1000).default(50) })
33
+ .catchall(port)
34
+ .refine((ports) => Object.keys(ports).some((key) => key !== 'maxSlot'), 'declare at least one base port, such as "web": 3000')
35
+ // A misspelt maxSlot would otherwise read as a port named "maxslot".
36
+ .refine((ports) => Object.keys(ports).every((key) => key === 'maxSlot' || !key.toLowerCase().replace(/[-_]/g, '').startsWith('maxslot')), 'maxSlot is spelt "maxSlot"'),
29
37
  protocol: z.literal(PROTOCOL),
30
38
  release: z.strictObject({ handoff: text }),
31
- skills: z.strictObject({ verify: text, work: text }),
39
+ // Project rules (design note, section 9): checked before the machine's and the defaults, for
40
+ // this project's items only. They change by PR, and the daemon reloads them on save.
41
+ rules: z.array(ruleInputSchema).default([]),
42
+ // `aliases`: older names of the work skill. Notes headed with one still count, so an item in
43
+ // flight when the work skill is renamed keeps its phases, approvals and review threads.
44
+ skills: z.strictObject({ aliases: z.array(text).default([]), verify: text, work: text }),
32
45
  slots: z.int().min(1).max(8),
33
46
  tracker: z.discriminatedUnion('kind', [
34
47
  z.strictObject({
@@ -39,11 +52,64 @@ export const profileSchema = z.strictObject({
39
52
  queue: z.literal('prioritized-projects'),
40
53
  team: text,
41
54
  }),
55
+ // ADO Boards (design note, section 12). Work item ids are numbers alone, so `key` names them:
56
+ // CAD-1234 is work item 1234. `humanLabel` is a tag here.
57
+ z.strictObject({
58
+ // The Area Path the project's Areas sit under: an item's Area is its path below it, and an
59
+ // item at the root holds none. By default the ADO project.
60
+ areaRoot: text.optional(),
61
+ humanLabel: text,
62
+ key: z.string().regex(/^[A-Z]+$/, 'capital letters, such as CAD'),
63
+ kind: z.literal('ado-boards'),
64
+ // Where the work items live; by default the code host's organization and project.
65
+ organization: z.url().optional(),
66
+ // The queue's priority against other projects' (a Linear project's 1, urgent, to 4, low).
67
+ priority: z.int().min(1).max(4).default(3),
68
+ project: text.optional(),
69
+ // The saved WIQL query that is the conducted queue, by path ("Shared Queries/Conduct") or id.
70
+ query: text,
71
+ // State names to types, over the built-in map for the Scrum, Agile, Basic and CMMI processes.
72
+ states: z.record(text, z.enum(['backlog', 'unstarted', 'started', 'completed', 'canceled'])).default({}),
73
+ }),
42
74
  ]),
75
+ // Orders this project's queue against other projects' of the same tracker priority: higher
76
+ // first. `conduct focus --weight` overrides it for a while.
77
+ weight: z.int().min(-100).max(100).default(0),
78
+ // What the work skill reads about the project; the daemon only checks it. `landing.review`: path
79
+ // prefixes whose changes land in review mode, as do plans of a `landing.reviewTiers` tier.
80
+ // `releases`: the pipelines that stage an npm package for a merge. `hooks`: the project's steps
81
+ // the work skill follows at its hook points, a Markdown file relative to the checkout.
82
+ work: z
83
+ .strictObject({
84
+ hooks: text.optional(),
85
+ landing: z
86
+ .strictObject({
87
+ review: z.array(text).default([]),
88
+ reviewTiers: z.array(z.enum(['L', 'M', 'S'])).default(['L']),
89
+ })
90
+ .prefault({}),
91
+ releases: z.array(z.strictObject({ key: name, package: text, pipeline: text })).default([]),
92
+ })
93
+ .prefault({}),
43
94
  // How the daemon starts this project's workers. `tab` opens each in a Windows Terminal tab
44
95
  // attached to its background session.
45
96
  workers: z.strictObject({ tab: z.boolean().default(false) }).prefault({}),
46
97
  });
98
+ // The profile's base ports by name, without maxSlot.
99
+ export function basePorts(profile) {
100
+ const { maxSlot: _maxSlot, ...ports } = profile.ports;
101
+ return ports;
102
+ }
103
+ // The `<skill> · ` headings that mark a project's notes: its work skill's, then each alias's.
104
+ // Without a profile, work-issue's, which every project used before profiles named their own.
105
+ export function notePrefixes(profile) {
106
+ const names = profile ? [profile.skills.work, ...profile.skills.aliases] : ['work-issue'];
107
+ return names.map((skill) => `${skill} · `);
108
+ }
109
+ // The key prefix of the project's items: the Linear team (ATK-311), or the Boards key (CAD-1234).
110
+ export function trackerKey(profile) {
111
+ return profile.tracker.kind === 'linear' ? profile.tracker.team : profile.tracker.key;
112
+ }
47
113
  const protocolOnly = z.looseObject({ protocol: z.unknown().optional() });
48
114
  // The protocol is checked first, so a profile written for another version gets one clear message
49
115
  // instead of a list of schema differences.
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { readCredential as readWindowsCredential } from "./credential.js";
2
+ const ENDPOINT = 'https://api.pushover.net/1/messages.json';
3
+ // Sends from the daemon. The keys come from PUSHOVER_TOKEN and PUSHOVER_USER, else the credential,
4
+ // read when a message first goes out and again after Pushover refuses them, so a credential saved
5
+ // while the daemon runs is picked up. They are never logged, stored or put in an error.
6
+ export function pushoverSender({ credential, env = process.env, fetch: fetchImpl = fetch, readCredential = readWindowsCredential, timeoutMs = 15_000, }) {
7
+ let cached = null;
8
+ // One Credential Manager read at a time: pushes that start together share it.
9
+ let reading = null;
10
+ const read = async () => {
11
+ const found = await readCredential(credential, env);
12
+ if (!found.found)
13
+ return { error: `no PUSHOVER_TOKEN and PUSHOVER_USER, and ${found.reason}` };
14
+ if (!found.credential.user)
15
+ return { error: `the credential ${credential} has no user name: save the Pushover user key as its user name` };
16
+ return { keys: (cached = { token: found.credential.secret, user: found.credential.user }) };
17
+ };
18
+ const keys = async () => {
19
+ if (cached)
20
+ return { keys: cached };
21
+ const token = env.PUSHOVER_TOKEN?.trim();
22
+ const user = env.PUSHOVER_USER?.trim();
23
+ if (token && user)
24
+ return { keys: (cached = { token, user }) };
25
+ reading ??= read().finally(() => (reading = null));
26
+ return reading;
27
+ };
28
+ return async (message) => {
29
+ const found = await keys();
30
+ if ('error' in found)
31
+ return { error: found.error, ok: false };
32
+ const form = new URLSearchParams({
33
+ message: cut(message.message, 1024),
34
+ priority: String(message.priority),
35
+ title: cut(message.title, 250),
36
+ token: found.keys.token,
37
+ user: found.keys.user,
38
+ });
39
+ if (message.url && message.url.length <= 512) {
40
+ form.set('url', message.url);
41
+ if (message.urlTitle)
42
+ form.set('url_title', cut(message.urlTitle, 100));
43
+ }
44
+ let response;
45
+ try {
46
+ response = await fetchImpl(ENDPOINT, { body: form, method: 'POST', signal: AbortSignal.timeout(timeoutMs) });
47
+ }
48
+ catch (error) {
49
+ return { error: `Pushover didn't answer: ${error instanceof Error ? error.message : String(error)}`, ok: false };
50
+ }
51
+ const body = await response.json().catch(() => null);
52
+ if (response.ok && isRecord(body) && body.status === 1)
53
+ return { ok: true };
54
+ // 4xx: Pushover refused the request, often the keys; read them again next time.
55
+ if (response.status >= 400 && response.status < 500)
56
+ cached = null;
57
+ const errors = isRecord(body) && Array.isArray(body.errors) ? body.errors.filter((e) => typeof e === 'string') : [];
58
+ return { error: `Pushover answered ${response.status}${errors.length > 0 ? `: ${errors.join('; ')}` : ''}`, ok: false };
59
+ };
60
+ }
61
+ function cut(text, limit) {
62
+ return text.length <= limit ? text : `${text.slice(0, limit - 1)}…`;
63
+ }
64
+ function isRecord(value) {
65
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
66
+ }
67
+ //# sourceMappingURL=pushover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pushover.js","sourceRoot":"","sources":["../src/pushover.ts"],"names":[],"mappings":"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"}
package/build/queue.js ADDED
@@ -0,0 +1,183 @@
1
+ import { z } from 'zod';
2
+ export const pickSchema = z.object({
3
+ area: z.string().nullable(),
4
+ id: z.string(),
5
+ project: z.string(),
6
+ title: z.string().nullable(),
7
+ trackerProject: z.string().nullable(),
8
+ });
9
+ export const waitingSchema = z.object({
10
+ id: z.string(),
11
+ // It will start once a slot, an Area or a blocker frees up (or the hold ends); false when it
12
+ // never will on its own (labelled human, blocked by an item nobody works on).
13
+ pending: z.boolean(),
14
+ project: z.string(),
15
+ reason: z.string(),
16
+ trackerProject: z.string().nullable(),
17
+ });
18
+ export const queuePlanSchema = z.object({
19
+ // Nothing to start, nothing that will become startable, nothing conducted to watch.
20
+ drained: z.boolean(),
21
+ picks: z.array(pickSchema),
22
+ // Conducted tracker projects with no open item: everything is done on the base branch.
23
+ readyToRelease: z.array(z.object({ project: z.string(), trackerProject: z.string() })),
24
+ slots: z.object({
25
+ free: z.number(),
26
+ parked: z.number(),
27
+ projects: z.array(z.object({ free: z.number(), name: z.string(), parked: z.number(), running: z.number(), size: z.number() })),
28
+ running: z.number(),
29
+ size: z.number(),
30
+ }),
31
+ waiting: z.array(waitingSchema),
32
+ });
33
+ const READY = new Set(['backlog', 'unstarted']); // Backlog and Todo
34
+ // The Area an item holds: the one its tracker read gave it (a Boards Area Path), else its label in
35
+ // the Area group.
36
+ export function areaOf(item, areaLabels) {
37
+ if (item?.area)
38
+ return item.area;
39
+ const areas = new Set(areaLabels);
40
+ return item?.labels.find((l) => areas.has(l)) ?? null;
41
+ }
42
+ // The Area group is single-select, so an item that spans sub-Areas carries their parent: `skills`
43
+ // covers `skills/conduct-atk` and `skills/work-issue`, which don't cover each other.
44
+ export function areasOverlap(a, b) {
45
+ if (!a || !b)
46
+ return false;
47
+ return a === b || a.startsWith(`${b}/`) || b.startsWith(`${a}/`);
48
+ }
49
+ // The tracker projects whose items are queued, in order.
50
+ export function conductedProjects(projects) {
51
+ return projects
52
+ .filter((p) => p.priority !== null && p.priority >= 1 && p.priority <= 4)
53
+ .sort((a, b) => (a.priority ?? 5) - (b.priority ?? 5) || (a.sortOrder ?? 0) - (b.sortOrder ?? 0));
54
+ }
55
+ // The items to start now, in order, and why the others wait. An Area is held, per project, by
56
+ // every item in flight and every item the tracker says is started, and by the Areas it covers or
57
+ // is covered by. Slots count running workers: a parked worker keeps its Area but not its slot.
58
+ export function planQueue({ held, inFlight, projects, slots }) {
59
+ const states = new Map();
60
+ const candidates = [];
61
+ for (const queue of projects) {
62
+ const { snapshot } = queue;
63
+ const tracked = conductedProjects(snapshot.projects);
64
+ const rank = new Map(tracked.map((p, i) => [p.name, i]));
65
+ const open = new Map(snapshot.issues.map((i) => [i.id, i]));
66
+ const closed = new Set(snapshot.closed);
67
+ const own = inFlight.filter((w) => w.project === queue.name);
68
+ // A worker whose item closed holds no Area, but keeps its slot until it has retired: a retire
69
+ // can be refused (unfinished work) while its session still runs.
70
+ const mine = new Map(own.filter((w) => !closed.has(w.item)).map((w) => [w.item, w]));
71
+ const parked = own.filter((w) => w.status === 'parked').length;
72
+ const running = own.length - parked;
73
+ const holders = new Map();
74
+ const state = {
75
+ free: Math.max(0, queue.slots - running),
76
+ holders,
77
+ inFlight: mine,
78
+ open,
79
+ parked,
80
+ picked: 0,
81
+ queue,
82
+ queued: new Set(),
83
+ rank,
84
+ running,
85
+ };
86
+ const hold = (area, id) => {
87
+ if (area && !holders.has(area))
88
+ holders.set(area, id);
89
+ };
90
+ for (const w of mine.values())
91
+ hold(areaOf(open.get(w.item), snapshot.areaLabels), w.item);
92
+ for (const i of open.values())
93
+ if (i.stateType === 'started')
94
+ hold(areaOf(i, snapshot.areaLabels), i.id);
95
+ for (const i of open.values()) {
96
+ if (i.trackerProject !== null && rank.has(i.trackerProject) && READY.has(i.stateType ?? '')) {
97
+ candidates.push({ issue: i, state });
98
+ if (!i.labels.includes(queue.humanLabel))
99
+ state.queued.add(i.id);
100
+ }
101
+ }
102
+ states.set(queue.name, state);
103
+ }
104
+ const trackerPriority = (c) => c.state.queue.snapshot.projects.find((p) => p.name === c.issue.trackerProject)?.priority ?? 5;
105
+ candidates.sort((a, b) => trackerPriority(a) - trackerPriority(b) ||
106
+ b.state.queue.weight - a.state.queue.weight ||
107
+ (a.state.rank.get(a.issue.trackerProject ?? '') ?? 0) - (b.state.rank.get(b.issue.trackerProject ?? '') ?? 0) ||
108
+ issuePriority(a.issue) - issuePriority(b.issue) ||
109
+ // A tracker's own order means something only within its project.
110
+ (a.state === b.state ? (a.issue.rank ?? 0) - (b.issue.rank ?? 0) : 0) ||
111
+ Date.parse(a.issue.createdAt ?? '0') - Date.parse(b.issue.createdAt ?? '0') ||
112
+ keyNumber(a.issue.id) - keyNumber(b.issue.id));
113
+ // Every worker counts against the global slots, those of a project whose read failed too.
114
+ const totalParked = inFlight.filter((w) => w.status === 'parked').length;
115
+ const totalRunning = inFlight.length - totalParked;
116
+ const globalFree = Math.max(0, slots - totalRunning);
117
+ const picks = [];
118
+ const waiting = [];
119
+ for (const { issue, state } of candidates) {
120
+ const { areaLabels } = state.queue.snapshot;
121
+ const area = areaOf(issue, areaLabels);
122
+ const blockers = issue.blockedBy.filter((b) => state.open.has(b));
123
+ const heldBy = state.holders.has(area ?? '')
124
+ ? [area, state.holders.get(area ?? '')]
125
+ : [...state.holders].find(([h]) => areasOverlap(h, area));
126
+ // A blocker that will clear on its own: in flight, started, or in this queue.
127
+ const active = (b) => state.inFlight.has(b) || state.open.get(b)?.stateType === 'started' || state.queued.has(b);
128
+ let wait = null;
129
+ if (state.inFlight.has(issue.id))
130
+ wait = { pending: false, reason: 'in flight' };
131
+ else if (issue.labels.includes(state.queue.humanLabel))
132
+ wait = { pending: false, reason: `labelled ${state.queue.humanLabel}` };
133
+ else if (blockers.length > 0) {
134
+ const stuck = blockers.filter((b) => !active(b));
135
+ wait =
136
+ stuck.length > 0
137
+ ? { pending: false, reason: `blocked by ${blockers.join(', ')} (${stuck.join(', ')} not being worked)` }
138
+ : { pending: true, reason: `blocked by ${blockers.join(', ')}` };
139
+ }
140
+ else if (heldBy) {
141
+ const [heldArea, holder] = heldBy;
142
+ wait = { pending: true, reason: `Area ${area ?? ''} held by ${holder ?? '?'}${heldArea === area ? '' : ` (${heldArea ?? ''})`}` };
143
+ }
144
+ else if (held !== null)
145
+ wait = { pending: true, reason: held };
146
+ else if (state.queue.paused !== null)
147
+ wait = { pending: true, reason: state.queue.paused };
148
+ else if (state.picked >= state.free)
149
+ wait = { pending: true, reason: 'no free slot' };
150
+ else if (picks.length >= globalFree)
151
+ wait = { pending: true, reason: `no free slot (all ${slots} in use across projects)` };
152
+ if (wait) {
153
+ waiting.push({ id: issue.id, project: state.queue.name, trackerProject: issue.trackerProject, ...wait });
154
+ continue;
155
+ }
156
+ picks.push({ area, id: issue.id, project: state.queue.name, title: issue.title, trackerProject: issue.trackerProject });
157
+ state.picked++;
158
+ if (area && !state.holders.has(area))
159
+ state.holders.set(area, issue.id);
160
+ }
161
+ return {
162
+ drained: picks.length === 0 && !waiting.some((w) => w.pending) && inFlight.length === 0,
163
+ picks,
164
+ readyToRelease: [...states.values()].flatMap((s) => conductedProjects(s.queue.snapshot.projects)
165
+ .filter((p) => !s.queue.snapshot.issues.some((i) => i.trackerProject === p.name))
166
+ .map((p) => ({ project: s.queue.name, trackerProject: p.name }))),
167
+ slots: {
168
+ free: globalFree,
169
+ parked: totalParked,
170
+ projects: [...states.values()].map((s) => ({ free: s.free, name: s.queue.name, parked: s.parked, running: s.running, size: s.queue.slots })),
171
+ running: totalRunning,
172
+ size: slots,
173
+ },
174
+ waiting,
175
+ };
176
+ }
177
+ function issuePriority(issue) {
178
+ return issue.priority !== null && issue.priority >= 1 && issue.priority <= 4 ? issue.priority : 5;
179
+ }
180
+ function keyNumber(key) {
181
+ return Number(key.split('-')[1]);
182
+ }
183
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}