@detergent-software/conductor 1.0.0-dev.1 → 1.0.0-dev.11

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 (80) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +210 -9
  3. package/build/cli.js +456 -21
  4. package/build/cli.js.map +1 -1
  5. package/build/clock.js +17 -0
  6. package/build/clock.js.map +1 -0
  7. package/build/conditions.js +5 -6
  8. package/build/conditions.js.map +1 -1
  9. package/build/config.js +92 -1
  10. package/build/config.js.map +1 -1
  11. package/build/credential.js +52 -0
  12. package/build/credential.js.map +1 -0
  13. package/build/daemon.js +96 -2
  14. package/build/daemon.js.map +1 -1
  15. package/build/events.js +106 -0
  16. package/build/events.js.map +1 -0
  17. package/build/inbox.js +385 -0
  18. package/build/inbox.js.map +1 -0
  19. package/build/manager.js +56 -12
  20. package/build/manager.js.map +1 -1
  21. package/build/mod.js +51 -0
  22. package/build/mod.js.map +1 -0
  23. package/build/note.js +71 -0
  24. package/build/note.js.map +1 -0
  25. package/build/notes.js +188 -0
  26. package/build/notes.js.map +1 -0
  27. package/build/notify.js +393 -0
  28. package/build/notify.js.map +1 -0
  29. package/build/overrides.js +82 -0
  30. package/build/overrides.js.map +1 -0
  31. package/build/paths.js +1 -0
  32. package/build/paths.js.map +1 -1
  33. package/build/profile.js +7 -0
  34. package/build/profile.js.map +1 -1
  35. package/build/pushover.js +67 -0
  36. package/build/pushover.js.map +1 -0
  37. package/build/queue.js +178 -0
  38. package/build/queue.js.map +1 -0
  39. package/build/registry.js +3 -1
  40. package/build/registry.js.map +1 -1
  41. package/build/rule-input.js +17 -0
  42. package/build/rule-input.js.map +1 -0
  43. package/build/rules-service.js +402 -0
  44. package/build/rules-service.js.map +1 -0
  45. package/build/rules.js +842 -0
  46. package/build/rules.js.map +1 -0
  47. package/build/scheduler.js +274 -0
  48. package/build/scheduler.js.map +1 -0
  49. package/build/server.js +204 -0
  50. package/build/server.js.map +1 -1
  51. package/build/spend.js +8 -0
  52. package/build/spend.js.map +1 -1
  53. package/build/startup.js +30 -0
  54. package/build/startup.js.map +1 -1
  55. package/build/store.js +271 -0
  56. package/build/store.js.map +1 -1
  57. package/build/token.js +3 -3
  58. package/build/token.js.map +1 -1
  59. package/build/upgrade.js +105 -0
  60. package/build/upgrade.js.map +1 -0
  61. package/build/wait.js +32 -32
  62. package/build/wait.js.map +1 -1
  63. package/build/watchers/index.js +1 -0
  64. package/build/watchers/index.js.map +1 -1
  65. package/build/watchers/linear-key.js +6 -45
  66. package/build/watchers/linear-key.js.map +1 -1
  67. package/build/watchers/linear-queue.js +124 -0
  68. package/build/watchers/linear-queue.js.map +1 -0
  69. package/build/watchers/linear.js +16 -7
  70. package/build/watchers/linear.js.map +1 -1
  71. package/build/why.js +78 -0
  72. package/build/why.js.map +1 -0
  73. package/mod/.claude-plugin/marketplace.json +6 -0
  74. package/mod/.claude-plugin/plugin.json +7 -0
  75. package/mod/README.md +17 -0
  76. package/mod/hooks/hooks.json +1 -0
  77. package/mod/hooks/model.ts +395 -0
  78. package/mod/hooks/register.tsx +505 -0
  79. package/mod/types/index.d.ts +57 -0
  80. package/package.json +6 -1
@@ -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,178 @@
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: its label in the Area group.
35
+ export function areaOf(item, areaLabels) {
36
+ const areas = new Set(areaLabels);
37
+ return item?.labels.find((l) => areas.has(l)) ?? null;
38
+ }
39
+ // The Area group is single-select, so an item that spans sub-Areas carries their parent: `skills`
40
+ // covers `skills/conduct-atk` and `skills/work-issue`, which don't cover each other.
41
+ export function areasOverlap(a, b) {
42
+ if (!a || !b)
43
+ return false;
44
+ return a === b || a.startsWith(`${b}/`) || b.startsWith(`${a}/`);
45
+ }
46
+ // The tracker projects whose items are queued, in order.
47
+ export function conductedProjects(projects) {
48
+ return projects
49
+ .filter((p) => p.priority !== null && p.priority >= 1 && p.priority <= 4)
50
+ .sort((a, b) => (a.priority ?? 5) - (b.priority ?? 5) || (a.sortOrder ?? 0) - (b.sortOrder ?? 0));
51
+ }
52
+ // The items to start now, in order, and why the others wait. An Area is held, per project, by
53
+ // every item in flight and every item the tracker says is started, and by the Areas it covers or
54
+ // is covered by. Slots count running workers: a parked worker keeps its Area but not its slot.
55
+ export function planQueue({ held, inFlight, projects, slots }) {
56
+ const states = new Map();
57
+ const candidates = [];
58
+ for (const queue of projects) {
59
+ const { snapshot } = queue;
60
+ const tracked = conductedProjects(snapshot.projects);
61
+ const rank = new Map(tracked.map((p, i) => [p.name, i]));
62
+ const open = new Map(snapshot.issues.map((i) => [i.id, i]));
63
+ const closed = new Set(snapshot.closed);
64
+ const own = inFlight.filter((w) => w.project === queue.name);
65
+ // A worker whose item closed holds no Area, but keeps its slot until it has retired: a retire
66
+ // can be refused (unfinished work) while its session still runs.
67
+ const mine = new Map(own.filter((w) => !closed.has(w.item)).map((w) => [w.item, w]));
68
+ const parked = own.filter((w) => w.status === 'parked').length;
69
+ const running = own.length - parked;
70
+ const holders = new Map();
71
+ const state = {
72
+ free: Math.max(0, queue.slots - running),
73
+ holders,
74
+ inFlight: mine,
75
+ open,
76
+ parked,
77
+ picked: 0,
78
+ queue,
79
+ queued: new Set(),
80
+ rank,
81
+ running,
82
+ };
83
+ const hold = (area, id) => {
84
+ if (area && !holders.has(area))
85
+ holders.set(area, id);
86
+ };
87
+ for (const w of mine.values())
88
+ hold(areaOf(open.get(w.item), snapshot.areaLabels), w.item);
89
+ for (const i of open.values())
90
+ if (i.stateType === 'started')
91
+ hold(areaOf(i, snapshot.areaLabels), i.id);
92
+ for (const i of open.values()) {
93
+ if (i.trackerProject !== null && rank.has(i.trackerProject) && READY.has(i.stateType ?? '')) {
94
+ candidates.push({ issue: i, state });
95
+ if (!i.labels.includes(queue.humanLabel))
96
+ state.queued.add(i.id);
97
+ }
98
+ }
99
+ states.set(queue.name, state);
100
+ }
101
+ const trackerPriority = (c) => c.state.queue.snapshot.projects.find((p) => p.name === c.issue.trackerProject)?.priority ?? 5;
102
+ candidates.sort((a, b) => trackerPriority(a) - trackerPriority(b) ||
103
+ b.state.queue.weight - a.state.queue.weight ||
104
+ (a.state.rank.get(a.issue.trackerProject ?? '') ?? 0) - (b.state.rank.get(b.issue.trackerProject ?? '') ?? 0) ||
105
+ issuePriority(a.issue) - issuePriority(b.issue) ||
106
+ Date.parse(a.issue.createdAt ?? '0') - Date.parse(b.issue.createdAt ?? '0') ||
107
+ keyNumber(a.issue.id) - keyNumber(b.issue.id));
108
+ // Every worker counts against the global slots, those of a project whose read failed too.
109
+ const totalParked = inFlight.filter((w) => w.status === 'parked').length;
110
+ const totalRunning = inFlight.length - totalParked;
111
+ const globalFree = Math.max(0, slots - totalRunning);
112
+ const picks = [];
113
+ const waiting = [];
114
+ for (const { issue, state } of candidates) {
115
+ const { areaLabels } = state.queue.snapshot;
116
+ const area = areaOf(issue, areaLabels);
117
+ const blockers = issue.blockedBy.filter((b) => state.open.has(b));
118
+ const heldBy = state.holders.has(area ?? '')
119
+ ? [area, state.holders.get(area ?? '')]
120
+ : [...state.holders].find(([h]) => areasOverlap(h, area));
121
+ // A blocker that will clear on its own: in flight, started, or in this queue.
122
+ const active = (b) => state.inFlight.has(b) || state.open.get(b)?.stateType === 'started' || state.queued.has(b);
123
+ let wait = null;
124
+ if (state.inFlight.has(issue.id))
125
+ wait = { pending: false, reason: 'in flight' };
126
+ else if (issue.labels.includes(state.queue.humanLabel))
127
+ wait = { pending: false, reason: `labelled ${state.queue.humanLabel}` };
128
+ else if (blockers.length > 0) {
129
+ const stuck = blockers.filter((b) => !active(b));
130
+ wait =
131
+ stuck.length > 0
132
+ ? { pending: false, reason: `blocked by ${blockers.join(', ')} (${stuck.join(', ')} not being worked)` }
133
+ : { pending: true, reason: `blocked by ${blockers.join(', ')}` };
134
+ }
135
+ else if (heldBy) {
136
+ const [heldArea, holder] = heldBy;
137
+ wait = { pending: true, reason: `Area ${area ?? ''} held by ${holder ?? '?'}${heldArea === area ? '' : ` (${heldArea ?? ''})`}` };
138
+ }
139
+ else if (held !== null)
140
+ wait = { pending: true, reason: held };
141
+ else if (state.queue.paused !== null)
142
+ wait = { pending: true, reason: state.queue.paused };
143
+ else if (state.picked >= state.free)
144
+ wait = { pending: true, reason: 'no free slot' };
145
+ else if (picks.length >= globalFree)
146
+ wait = { pending: true, reason: `no free slot (all ${slots} in use across projects)` };
147
+ if (wait) {
148
+ waiting.push({ id: issue.id, project: state.queue.name, trackerProject: issue.trackerProject, ...wait });
149
+ continue;
150
+ }
151
+ picks.push({ area, id: issue.id, project: state.queue.name, title: issue.title, trackerProject: issue.trackerProject });
152
+ state.picked++;
153
+ if (area && !state.holders.has(area))
154
+ state.holders.set(area, issue.id);
155
+ }
156
+ return {
157
+ drained: picks.length === 0 && !waiting.some((w) => w.pending) && inFlight.length === 0,
158
+ picks,
159
+ readyToRelease: [...states.values()].flatMap((s) => conductedProjects(s.queue.snapshot.projects)
160
+ .filter((p) => !s.queue.snapshot.issues.some((i) => i.trackerProject === p.name))
161
+ .map((p) => ({ project: s.queue.name, trackerProject: p.name }))),
162
+ slots: {
163
+ free: globalFree,
164
+ parked: totalParked,
165
+ projects: [...states.values()].map((s) => ({ free: s.free, name: s.queue.name, parked: s.parked, running: s.running, size: s.queue.slots })),
166
+ running: totalRunning,
167
+ size: slots,
168
+ },
169
+ waiting,
170
+ };
171
+ }
172
+ function issuePriority(issue) {
173
+ return issue.priority !== null && issue.priority >= 1 && issue.priority <= 4 ? issue.priority : 5;
174
+ }
175
+ function keyNumber(key) {
176
+ return Number(key.split('-')[1]);
177
+ }
178
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsDxB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,6FAA6F;IAC7F,8EAA8E;IAC9E,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,oFAAoF;IACpF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IAC1B,uFAAuF;IACvF,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9H,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;CAChC,CAAC,CAAC;AAGH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,mBAAmB;AAEpE,uDAAuD;AACvD,MAAM,UAAU,MAAM,CAAC,IAA2C,EAAE,UAA6B;IAC/F,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,kGAAkG;AAClG,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,CAAgB,EAAE,CAAgB;IAC7D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,QAAmC;IACnE,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;SACxE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,8FAA8F;AAC9F,iGAAiG;AACjG,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAc;IAavE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,MAAM,UAAU,GAAyC,EAAE,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3B,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,8FAA8F;QAC9F,iEAAiE;QACjE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,MAAM,KAAK,GAAU;YACnB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;YACxC,OAAO;YACP,QAAQ,EAAE,IAAI;YACd,IAAI;YACJ,MAAM;YACN,MAAM,EAAE,CAAC;YACT,KAAK;YACL,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,IAAI;YACJ,OAAO;SACR,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,EAAU,EAAQ,EAAE;YACrD,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3F,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACzG,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC5F,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,CAAqC,EAAU,EAAE,CACxE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC;IAChG,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;QAC3C,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7G,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC;QAC3E,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAChD,CAAC;IAEF,0FAA0F;IAC1F,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC;IACrD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;QAC1C,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1C,CAAC,CAAE,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAW;YAClD,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,8EAA8E;QAC9E,MAAM,MAAM,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClI,IAAI,IAAI,GAAgD,IAAI,CAAC;QAC7D,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;aAC5E,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YAAE,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;aAC3H,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI;gBACF,KAAK,CAAC,MAAM,GAAG,CAAC;oBACd,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBACxG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACvE,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;YAClC,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,EAAE,YAAY,MAAM,IAAI,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;QACpI,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI;YAAE,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAC5D,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;YAAE,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aACtF,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI;YAAE,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;aACjF,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU;YAAE,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,KAAK,0BAA0B,EAAE,CAAC;QAC5H,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACzG,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QACxH,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QACvF,KAAK;QACL,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACjD,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;aAChF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CACnE;QACD,KAAK,EAAE;YACL,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5I,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,KAAK;SACZ;QACD,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
package/build/registry.js CHANGED
@@ -25,9 +25,11 @@ export function projectRoot(path) {
25
25
  return start;
26
26
  }
27
27
  }
28
- export function registerProject(store, path) {
28
+ // `check` refuses a profile before it is stored: the daemon checks its rules against config.json.
29
+ export function registerProject(store, path, check = () => { }) {
29
30
  const root = projectRoot(path);
30
31
  const { path: profilePath, profile } = readProfile(root);
32
+ check(profile, profilePath);
31
33
  return store.upsertProject({ profile, profilePath, root });
32
34
  }
33
35
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,+FAA+F;AAC/F,sFAAsF;AACtF,mGAAmG;AACnG,mGAAmG;AACnG,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,IAAI,GAAG,GAAG,KAAK,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjH,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACpD,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,IAAY;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAgB,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvE,+FAA+F;AAC/F,sFAAsF;AACtF,mGAAmG;AACnG,mGAAmG;AACnG,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,IAAI,GAAG,GAAG,KAAK,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjH,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACpD,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;IACnC,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,eAAe,CAC7B,KAAY,EACZ,IAAY,EACZ,QAAkD,GAAG,EAAE,GAAE,CAAC;IAE1D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ // A rule as written in ~/.conductor/rules.json or a profile's `rules` (design note, section 9):
3
+ // `when` and `do` in the fixed vocabulary that rules.ts reads. Its own module, so profile.ts can
4
+ // take rules without importing the engine (which imports the store, which imports profile.ts).
5
+ export const ruleIdSchema = z.string().regex(/^[a-z][a-z0-9-]*$/, 'lowercase letters, digits and dashes, starting with a letter');
6
+ export const ruleInputSchema = z.strictObject({
7
+ // One action, or several that fire together.
8
+ do: z.union([z.string().trim().min(1), z.array(z.string().trim().min(1)).min(1)]),
9
+ // A rule with the id of one further down (a machine rule over a default, a project rule over
10
+ // either) replaces it, so a file holds only the differences. `do: "none"` switches one off.
11
+ id: ruleIdSchema.optional(),
12
+ note: z.string().optional(),
13
+ // Left out only by a `do: "none"` rule, which needs no condition to switch a rule off.
14
+ when: z.string().trim().min(1).optional(),
15
+ });
16
+ export const rulesFileSchema = z.array(ruleInputSchema);
17
+ //# sourceMappingURL=rule-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-input.js","sourceRoot":"","sources":["../src/rule-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gGAAgG;AAChG,iGAAiG;AACjG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,8DAA8D,CAAC,CAAC;AAElI,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IAC5C,6CAA6C;IAC7C,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,6FAA6F;IAC7F,4FAA4F;IAC5F,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,uFAAuF;IACvF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC"}