@detergent-software/conductor 3.0.0-dev.9 → 3.1.0-dev.1
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/CHANGELOG.md +486 -0
- package/README.md +272 -126
- package/build/brief-cli.js +5 -12
- package/build/brief-cli.js.map +1 -1
- package/build/brief.js +4 -3
- package/build/brief.js.map +1 -1
- package/build/broker-cli.js +41 -14
- package/build/broker-cli.js.map +1 -1
- package/build/broker.js +1 -1
- package/build/broker.js.map +1 -1
- package/build/cli.js +226 -64
- package/build/cli.js.map +1 -1
- package/build/clones.js +92 -0
- package/build/clones.js.map +1 -0
- package/build/code-host-cli.js +172 -40
- package/build/code-host-cli.js.map +1 -1
- package/build/code-host-service.js +35 -2
- package/build/code-host-service.js.map +1 -1
- package/build/code-host.js +138 -16
- package/build/code-host.js.map +1 -1
- package/build/conditions.js +33 -16
- package/build/conditions.js.map +1 -1
- package/build/config.js +58 -28
- package/build/config.js.map +1 -1
- package/build/console.js +17 -27
- package/build/console.js.map +1 -1
- package/build/credentials.js +86 -54
- package/build/credentials.js.map +1 -1
- package/build/daemon.js +54 -65
- package/build/daemon.js.map +1 -1
- package/build/file-lock.js +155 -40
- package/build/file-lock.js.map +1 -1
- package/build/follow-ups.js +2 -2
- package/build/follow-ups.js.map +1 -1
- package/build/help.js +242 -83
- package/build/help.js.map +1 -1
- package/build/history.js +10 -4
- package/build/history.js.map +1 -1
- package/build/host/attach-clients.js +56 -0
- package/build/host/attach-clients.js.map +1 -0
- package/build/host/credential-manager.js +109 -0
- package/build/host/credential-manager.js.map +1 -0
- package/build/host/keychain.js +44 -0
- package/build/host/keychain.js.map +1 -0
- package/build/host/launchd.js +118 -0
- package/build/host/launchd.js.map +1 -0
- package/build/host/libsecret.js +40 -0
- package/build/host/libsecret.js.map +1 -0
- package/build/host/macos-terminal.js +63 -0
- package/build/host/macos-terminal.js.map +1 -0
- package/build/host/platform.js +4 -0
- package/build/host/platform.js.map +1 -0
- package/build/host/secrets.js +46 -0
- package/build/host/secrets.js.map +1 -0
- package/build/host/shell.js +26 -0
- package/build/host/shell.js.map +1 -0
- package/build/host/startup.js +26 -0
- package/build/host/startup.js.map +1 -0
- package/build/host/systemd.js +91 -0
- package/build/host/systemd.js.map +1 -0
- package/build/host/task-scheduler.js +78 -0
- package/build/host/task-scheduler.js.map +1 -0
- package/build/host/terminal.js +47 -0
- package/build/host/terminal.js.map +1 -0
- package/build/host/tmux.js +39 -0
- package/build/host/tmux.js.map +1 -0
- package/build/host/windows-terminal.js +46 -0
- package/build/host/windows-terminal.js.map +1 -0
- package/build/in-process.js +5 -4
- package/build/in-process.js.map +1 -1
- package/build/inbox.js +47 -35
- package/build/inbox.js.map +1 -1
- package/build/init.js +509 -0
- package/build/init.js.map +1 -0
- package/build/landing.js +107 -10
- package/build/landing.js.map +1 -1
- package/build/lib/providers/ado/code-host.js +5 -1
- package/build/lib/providers/ado/code-host.js.map +1 -1
- package/build/lib/providers/ado/pipelines.js +138 -26
- package/build/lib/providers/ado/pipelines.js.map +1 -1
- package/build/lib/providers/ado/trigger.js +5 -0
- package/build/lib/providers/ado/trigger.js.map +1 -1
- package/build/lib/providers/ado/writes.js +17 -2
- package/build/lib/providers/ado/writes.js.map +1 -1
- package/build/lib/providers/github/actions.js +90 -3
- package/build/lib/providers/github/actions.js.map +1 -1
- package/build/lib/providers/github/code-host.js +2 -0
- package/build/lib/providers/github/code-host.js.map +1 -1
- package/build/lib/providers/github/writes.js +25 -2
- package/build/lib/providers/github/writes.js.map +1 -1
- package/build/lib/providers/index.js +3 -2
- package/build/lib/providers/index.js.map +1 -1
- package/build/lib/providers/npm/stage.js +14 -1
- package/build/lib/providers/npm/stage.js.map +1 -1
- package/build/lib/providers/timing.js +10 -0
- package/build/lib/providers/timing.js.map +1 -0
- package/build/lib/providers/verdicts/pr.js +47 -6
- package/build/lib/providers/verdicts/pr.js.map +1 -1
- package/build/lib/providers/verdicts/runs.js +12 -2
- package/build/lib/providers/verdicts/runs.js.map +1 -1
- package/build/logins.js +13 -6
- package/build/logins.js.map +1 -1
- package/build/manager.js +200 -55
- package/build/manager.js.map +1 -1
- package/build/note.js +5 -15
- package/build/note.js.map +1 -1
- package/build/notes.js +130 -23
- package/build/notes.js.map +1 -1
- package/build/notify.js +104 -42
- package/build/notify.js.map +1 -1
- package/build/npm-reads.js +151 -22
- package/build/npm-reads.js.map +1 -1
- package/build/ownership.js +2 -2
- package/build/paths.js +44 -1
- package/build/paths.js.map +1 -1
- package/build/plugin.js +4 -2
- package/build/plugin.js.map +1 -1
- package/build/profile-fields.js +153 -0
- package/build/profile-fields.js.map +1 -0
- package/build/profile-layers.js +264 -0
- package/build/profile-layers.js.map +1 -0
- package/build/profile.js +69 -49
- package/build/profile.js.map +1 -1
- package/build/project-check-cli.js +17 -19
- package/build/project-check-cli.js.map +1 -1
- package/build/project-check.js +166 -104
- package/build/project-check.js.map +1 -1
- package/build/protocol.js +5 -21
- package/build/protocol.js.map +1 -1
- package/build/pushover.js +5 -5
- package/build/pushover.js.map +1 -1
- package/build/queue.js +4 -4
- package/build/queue.js.map +1 -1
- package/build/registry.js +195 -36
- package/build/registry.js.map +1 -1
- package/build/release-kinds.js +34 -0
- package/build/release-kinds.js.map +1 -0
- package/build/rule-actions.js +8 -6
- package/build/rule-actions.js.map +1 -1
- package/build/rules-service.js +83 -44
- package/build/rules-service.js.map +1 -1
- package/build/rules.js +23 -23
- package/build/rules.js.map +1 -1
- package/build/run.js +20 -7
- package/build/run.js.map +1 -1
- package/build/runs.js +218 -68
- package/build/runs.js.map +1 -1
- package/build/scheduler.js +78 -12
- package/build/scheduler.js.map +1 -1
- package/build/search.js +2 -1
- package/build/search.js.map +1 -1
- package/build/server.js +51 -14
- package/build/server.js.map +1 -1
- package/build/spend.js +1 -1
- package/build/spend.js.map +1 -1
- package/build/store.js +79 -20
- package/build/store.js.map +1 -1
- package/build/supervise.js +1 -1
- package/build/supervise.js.map +1 -1
- package/build/timeline.js +104 -0
- package/build/timeline.js.map +1 -0
- package/build/tracker-reads-cli.js +4 -3
- package/build/tracker-reads-cli.js.map +1 -1
- package/build/trackers.js +56 -10
- package/build/trackers.js.map +1 -1
- package/build/train-cli.js +6 -5
- package/build/train-cli.js.map +1 -1
- package/build/train.js +2 -2
- package/build/train.js.map +1 -1
- package/build/upgrade.js +8 -9
- package/build/upgrade.js.map +1 -1
- package/build/wait.js +10 -10
- package/build/wait.js.map +1 -1
- package/build/watchers/ado.js +42 -19
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/github.js +18 -4
- package/build/watchers/github.js.map +1 -1
- package/build/watchers/index.js +2 -2
- package/build/watchers/index.js.map +1 -1
- package/build/watchers/linear-queue.js +47 -14
- package/build/watchers/linear-queue.js.map +1 -1
- package/build/watchers/linear-writes.js +26 -12
- package/build/watchers/linear-writes.js.map +1 -1
- package/build/watchers/linear.js +2 -2
- package/build/watchers/linear.js.map +1 -1
- package/build/watchers/source.js +5 -1
- package/build/watchers/source.js.map +1 -1
- package/build/webhook.js +80 -0
- package/build/webhook.js.map +1 -0
- package/build/why.js +1 -1
- package/build/why.js.map +1 -1
- package/build/worktrees.js +56 -93
- package/build/worktrees.js.map +1 -1
- package/package.json +61 -61
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/model.ts +55 -6
- package/plugin/hooks/register.tsx +43 -4
- package/plugin/skills/conductor-console/SKILL.md +26 -27
- package/plugin/skills/work-item/SKILL.md +58 -54
- package/plugin/skills/work-item/trackers/ado-boards.md +2 -2
- package/plugin/skills/work-item/trackers/github-issues.md +1 -1
- package/plugin/skills/work-item/trackers/linear.md +2 -2
- package/plugin/types/index.d.ts +1 -1
- package/protocol/PROTOCOL.md +3 -9
- package/build/checkout-sync.js +0 -249
- package/build/checkout-sync.js.map +0 -1
- package/build/credential.js +0 -66
- package/build/credential.js.map +0 -1
- package/build/startup.js +0 -92
- package/build/startup.js.map +0 -1
- package/build/tab.js +0 -32
- package/build/tab.js.map +0 -1
package/build/file-lock.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import * as nodeFs from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
4
5
|
import { lockVerdict } from "./broker.js";
|
|
5
|
-
|
|
6
|
+
import { hasCode, isMissing } from "./errors.js";
|
|
7
|
+
export async function fileLock(request, { fs = nodeFs, now = Date.now, pollMs, refreshPatienceMs = REFRESH_PATIENCE_MS, sleep = (ms) => new Promise((done) => setTimeout(done, ms)), }) {
|
|
8
|
+
const { linkSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } = fs;
|
|
6
9
|
const { name, owner } = request;
|
|
7
10
|
const file = join(request.commonDir, `${request.project}-lock-${name}.json`);
|
|
8
|
-
const read = (
|
|
11
|
+
const read = () => {
|
|
9
12
|
try {
|
|
10
|
-
return JSON.parse(readFileSync(
|
|
13
|
+
return JSON.parse(readFileSync(file, 'utf8'));
|
|
11
14
|
}
|
|
12
15
|
catch (error) {
|
|
13
|
-
if (error
|
|
16
|
+
if (isMissing(error))
|
|
14
17
|
return null;
|
|
15
18
|
try {
|
|
16
|
-
return { at: statSync(
|
|
19
|
+
return { at: statSync(file).mtime.toISOString(), owner: null };
|
|
17
20
|
}
|
|
18
21
|
catch {
|
|
19
22
|
return null;
|
|
@@ -22,9 +25,29 @@ export async function fileLock(request, { now = Date.now, pollMs, sleep = (ms) =
|
|
|
22
25
|
};
|
|
23
26
|
// The broker's rule, on the file's { owner, at }: an unreadable owner is nobody's.
|
|
24
27
|
const verdict = (held) => lockVerdict(held && { holder: held.owner ?? '', name, since: held.at }, owner, new Date(now()));
|
|
28
|
+
// A lock's id, or for one with none (unreadable, or written before ids) its owner and time.
|
|
29
|
+
const identity = (held) => typeof held.id === 'string' && /^[\w-]+$/.test(held.id)
|
|
30
|
+
? held.id
|
|
31
|
+
: createHash('sha256')
|
|
32
|
+
.update(JSON.stringify([held.owner, held.at]))
|
|
33
|
+
.digest('hex')
|
|
34
|
+
.slice(0, 16);
|
|
35
|
+
const same = (found, judged) => found !== null && identity(found) === identity(judged);
|
|
36
|
+
// Deletes a file of this session's (a claim, a temp, a moved-aside lock). One a scanner holds open
|
|
37
|
+
// on Windows stays, rather than failing a change that is done: a claim left so is abandoned after
|
|
38
|
+
// CLAIM_ABANDONED_MS.
|
|
39
|
+
const discard = (path) => {
|
|
40
|
+
try {
|
|
41
|
+
unlinkSync(path);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (!isMissing(error) && !heldOpen(error))
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
25
48
|
const temp = () => {
|
|
26
49
|
const path = `${file}.${process.pid}.${randomUUID()}`;
|
|
27
|
-
writeFileSync(path, JSON.stringify({ at: new Date(now()).toISOString(), owner }));
|
|
50
|
+
writeFileSync(path, JSON.stringify({ at: new Date(now()).toISOString(), id: randomUUID(), owner }));
|
|
28
51
|
return path;
|
|
29
52
|
};
|
|
30
53
|
const create = () => {
|
|
@@ -36,56 +59,137 @@ export async function fileLock(request, { now = Date.now, pollMs, sleep = (ms) =
|
|
|
36
59
|
unlinkSync(path);
|
|
37
60
|
}
|
|
38
61
|
};
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
catch (error) {
|
|
47
|
-
if (error.code === 'ENOENT')
|
|
48
|
-
return;
|
|
49
|
-
throw error;
|
|
50
|
-
}
|
|
51
|
-
const moved = read(tomb);
|
|
52
|
-
if (moved?.owner !== judged.owner || moved?.at !== judged.at) {
|
|
62
|
+
// Claims the lock as read, so nobody else removes or replaces it until the returned function
|
|
63
|
+
// deletes the claim. Null while someone else holds the claim.
|
|
64
|
+
const claim = (held) => {
|
|
65
|
+
const path = `${file}.claim.${identity(held)}`;
|
|
66
|
+
for (let tries = 0; tries < 2; tries++) {
|
|
67
|
+
const made = `${path}.${process.pid}.${randomUUID()}`;
|
|
68
|
+
writeFileSync(made, '');
|
|
53
69
|
try {
|
|
54
|
-
linkSync(
|
|
70
|
+
linkSync(made, path);
|
|
71
|
+
return () => discard(path);
|
|
55
72
|
}
|
|
56
73
|
catch (error) {
|
|
57
|
-
if (error
|
|
74
|
+
if (!hasCode(error, 'EEXIST'))
|
|
58
75
|
throw error;
|
|
59
76
|
}
|
|
77
|
+
finally {
|
|
78
|
+
discard(made);
|
|
79
|
+
}
|
|
80
|
+
if (!abandoned(path))
|
|
81
|
+
return null;
|
|
82
|
+
discard(path);
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
};
|
|
86
|
+
// A claim lasts milliseconds, on the real clock (the caller's now is the lock's); one gone already
|
|
87
|
+
// is free to take.
|
|
88
|
+
const abandoned = (path) => {
|
|
89
|
+
try {
|
|
90
|
+
return Date.now() - statSync(path).mtimeMs > CLAIM_ABANDONED_MS;
|
|
60
91
|
}
|
|
61
|
-
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (isMissing(error))
|
|
94
|
+
return true;
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// Under the lock's claim: moved aside before it is deleted, as Windows keeps an open file's name
|
|
99
|
+
// until its last handle closes, and a reader may have it open.
|
|
100
|
+
const remove = () => {
|
|
101
|
+
const tomb = `${file}.gone.${randomUUID()}`;
|
|
102
|
+
renameSync(file, tomb);
|
|
103
|
+
discard(tomb);
|
|
62
104
|
};
|
|
63
105
|
if (request.action === 'status') {
|
|
64
106
|
const held = read();
|
|
65
107
|
return { file, lock: name, verdict: verdict(held), ...(held ? { heldBy: held.owner, since: held.at } : {}) };
|
|
66
108
|
}
|
|
67
109
|
if (request.action === 'release') {
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
110
|
+
// Someone else's claim lasts milliseconds, or until it is abandoned.
|
|
111
|
+
const releaseUntil = Date.now() + CLAIM_ABANDONED_MS + refreshPatienceMs;
|
|
112
|
+
for (;;) {
|
|
113
|
+
const held = read();
|
|
114
|
+
const judged = verdict(held);
|
|
115
|
+
if (judged !== 'mine' || held === null) {
|
|
116
|
+
return {
|
|
117
|
+
lock: name,
|
|
118
|
+
released: false,
|
|
119
|
+
...((judged === 'held' || judged === 'stale') && held ? { heldBy: held.owner } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const unclaim = claim(held);
|
|
123
|
+
if (unclaim) {
|
|
124
|
+
try {
|
|
125
|
+
if (same(read(), held)) {
|
|
126
|
+
remove();
|
|
127
|
+
return { lock: name, released: true };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
unclaim();
|
|
132
|
+
}
|
|
133
|
+
continue; // it changed (taken over, or refreshed by its owner elsewhere): judge again
|
|
134
|
+
}
|
|
135
|
+
// A takeover of the stale lock, or its owner's refresh elsewhere, holds the claim.
|
|
136
|
+
if (Date.now() >= releaseUntil)
|
|
137
|
+
return { heldBy: held.owner, lock: name, released: false };
|
|
138
|
+
await delay(REFRESH_WAIT_MS);
|
|
139
|
+
}
|
|
77
140
|
}
|
|
78
141
|
const until = now() + request.waitMinutes * 60_000;
|
|
142
|
+
let refreshUntil = null;
|
|
79
143
|
for (;;) {
|
|
80
144
|
const held = read();
|
|
81
145
|
const judged = verdict(held);
|
|
82
|
-
if (judged === 'mine') {
|
|
83
|
-
|
|
84
|
-
|
|
146
|
+
if (judged === 'mine' && held) {
|
|
147
|
+
const unclaim = claim(held);
|
|
148
|
+
if (unclaim) {
|
|
149
|
+
try {
|
|
150
|
+
if (!same(read(), held))
|
|
151
|
+
continue; // judge again: it was taken over meanwhile
|
|
152
|
+
const path = temp();
|
|
153
|
+
try {
|
|
154
|
+
renameSync(path, file);
|
|
155
|
+
return { acquired: true, lock: name, owner, refreshed: true };
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
try {
|
|
159
|
+
unlinkSync(path);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// the rename's error is the one to report
|
|
163
|
+
}
|
|
164
|
+
if (!heldOpen(error))
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
unclaim();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// A rename Windows refused, or a claim someone else holds: tried again for a while.
|
|
173
|
+
refreshUntil ??= Date.now() + refreshPatienceMs;
|
|
174
|
+
// Still ours, only not refreshed: it goes stale from its last acquire, `since`.
|
|
175
|
+
if (Date.now() >= refreshUntil)
|
|
176
|
+
return { acquired: true, lock: name, owner, refreshed: false, since: held.at };
|
|
177
|
+
await delay(REFRESH_WAIT_MS);
|
|
178
|
+
continue; // judge again: it may have gone stale and been taken over meanwhile
|
|
85
179
|
}
|
|
86
180
|
if (judged === 'stale' && held) {
|
|
87
|
-
|
|
88
|
-
|
|
181
|
+
const unclaim = claim(held);
|
|
182
|
+
if (unclaim) {
|
|
183
|
+
try {
|
|
184
|
+
if (same(read(), held))
|
|
185
|
+
remove();
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
unclaim();
|
|
189
|
+
}
|
|
190
|
+
continue; // free now, or someone else won it: judge again
|
|
191
|
+
}
|
|
192
|
+
// Someone else is taking it over: wait as for a held lock.
|
|
89
193
|
}
|
|
90
194
|
if (judged === 'free') {
|
|
91
195
|
try {
|
|
@@ -93,7 +197,7 @@ export async function fileLock(request, { now = Date.now, pollMs, sleep = (ms) =
|
|
|
93
197
|
return { acquired: true, lock: name, owner };
|
|
94
198
|
}
|
|
95
199
|
catch (error) {
|
|
96
|
-
if (error
|
|
200
|
+
if (!hasCode(error, 'EEXIST'))
|
|
97
201
|
throw error;
|
|
98
202
|
continue; // someone created it between the read and the create
|
|
99
203
|
}
|
|
@@ -103,4 +207,15 @@ export async function fileLock(request, { now = Date.now, pollMs, sleep = (ms) =
|
|
|
103
207
|
await sleep(pollMs);
|
|
104
208
|
}
|
|
105
209
|
}
|
|
210
|
+
// A refresh renames over the lock file, which Windows refuses (EPERM) while any other handle has it
|
|
211
|
+
// open, as a scanner of the lock just written or another worktree's read does (ATK-652). Most
|
|
212
|
+
// holds end within a second, but under load one outlasted 10 s, so it tries again for a second,
|
|
213
|
+
// on the real clock and timer (the caller's now and sleep are the lock's), then answers that the
|
|
214
|
+
// lock is still the caller's but wasn't refreshed. The claim is let go between tries.
|
|
215
|
+
const REFRESH_PATIENCE_MS = 1000;
|
|
216
|
+
const REFRESH_WAIT_MS = 50;
|
|
217
|
+
const CLAIM_ABANDONED_MS = 10_000;
|
|
218
|
+
function heldOpen(error) {
|
|
219
|
+
return hasCode(error, 'EPERM') || hasCode(error, 'EBUSY');
|
|
220
|
+
}
|
|
106
221
|
//# sourceMappingURL=file-lock.js.map
|
package/build/file-lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../src/file-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../src/file-lock.ts"],"names":[],"mappings":"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"}
|
package/build/follow-ups.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ConductorError } from "./errors.js";
|
|
2
2
|
import { itemKey } from "./ownership.js";
|
|
3
|
-
import { trackerKey } from "./profile.js";
|
|
3
|
+
import { hasAreas, trackerKey } from "./profile.js";
|
|
4
4
|
import { ACTIVE_STATUSES } from "./store.js";
|
|
5
5
|
import { uniqueKeys } from "./tracker-writes.js";
|
|
6
6
|
// The follow-up of `item` that the request asks for, refused when a key isn't one of the project's
|
|
@@ -17,7 +17,7 @@ export function followUpOf(request, item, profile) {
|
|
|
17
17
|
const area = request.area.trim();
|
|
18
18
|
if (title === '')
|
|
19
19
|
throw new ConductorError('a follow-up needs a --title');
|
|
20
|
-
if (area === '')
|
|
20
|
+
if (area === '' && hasAreas(profile))
|
|
21
21
|
throw new ConductorError("a follow-up needs an --area, one of the tracker's Areas");
|
|
22
22
|
if (request.body.trim() === '')
|
|
23
23
|
throw new ConductorError("a follow-up's --body-file is empty");
|
package/build/follow-ups.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow-ups.js","sourceRoot":"","sources":["../src/follow-ups.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"follow-ups.js","sourceRoot":"","sources":["../src/follow-ups.ts"],"names":[],"mappings":"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"}
|