@openagt/skill-scheduler 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/SKILL.md +28 -0
- package/bin/scheduler +11 -0
- package/dist/automation-file.d.ts +61 -0
- package/dist/automation-file.d.ts.map +1 -0
- package/dist/automation-file.js +153 -0
- package/dist/automation-file.js.map +1 -0
- package/dist/automation.d.ts +189 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +237 -0
- package/dist/automation.js.map +1 -0
- package/dist/cleanup.d.ts +31 -0
- package/dist/cleanup.d.ts.map +1 -0
- package/dist/cleanup.js +20 -0
- package/dist/cleanup.js.map +1 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +409 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashboard/dashboard.css +3 -0
- package/dist/dashboard/dashboard.js +2324 -0
- package/dist/hook-lines.d.ts +11 -0
- package/dist/hook-lines.d.ts.map +1 -0
- package/dist/hook-lines.js +12 -0
- package/dist/hook-lines.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +40 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +95 -0
- package/dist/init.js.map +1 -0
- package/dist/names.d.ts +85 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +91 -0
- package/dist/names.js.map +1 -0
- package/dist/pace.d.ts +86 -0
- package/dist/pace.d.ts.map +1 -0
- package/dist/pace.js +99 -0
- package/dist/pace.js.map +1 -0
- package/dist/quota-boundary.d.ts +123 -0
- package/dist/quota-boundary.d.ts.map +1 -0
- package/dist/quota-boundary.js +181 -0
- package/dist/quota-boundary.js.map +1 -0
- package/dist/records.d.ts +45 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +85 -0
- package/dist/records.js.map +1 -0
- package/dist/schedule.d.ts +256 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +390 -0
- package/dist/schedule.js.map +1 -0
- package/dist/scheduler.d.ts +75 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +244 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/start-point.d.ts +40 -0
- package/dist/start-point.d.ts.map +1 -0
- package/dist/start-point.js +88 -0
- package/dist/start-point.js.map +1 -0
- package/dist/state.d.ts +194 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +208 -0
- package/dist/state.js.map +1 -0
- package/dist/test-repo.d.ts +20 -0
- package/dist/test-repo.d.ts.map +1 -0
- package/dist/test-repo.js +56 -0
- package/dist/test-repo.js.map +1 -0
- package/dist/tick.d.ts +122 -0
- package/dist/tick.d.ts.map +1 -0
- package/dist/tick.js +334 -0
- package/dist/tick.js.map +1 -0
- package/dist/write-line.d.ts +38 -0
- package/dist/write-line.d.ts.map +1 -0
- package/dist/write-line.js +121 -0
- package/dist/write-line.js.map +1 -0
- package/package.json +65 -3
- package/README.md +0 -3
package/dist/cli.js
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util';
|
|
2
|
+
import { nodeGitRunner } from '@openagt/agent-data';
|
|
3
|
+
import { projectRoot } from '@openagt/skill-branches';
|
|
4
|
+
import { driverFor } from '@openagt/agent-runner';
|
|
5
|
+
import { runNow, schedulerStatus, startScheduler, stopScheduler, tickProject } from './scheduler.js';
|
|
6
|
+
import { initHooks } from './init.js';
|
|
7
|
+
import { cleanup } from './cleanup.js';
|
|
8
|
+
import { PUBLISH_PICKS, agentInForce, isSwitchedOn, readState, updateState, withAgent, withAgents, withModel, withoutCommand, withoutListed, withPace, withPublish, withSwitch } from './state.js';
|
|
9
|
+
import { parseInterval, parseTimeOfDay, sinceNow, takesTimeOfDay } from './pace.js';
|
|
10
|
+
import { AGENTS, AGENT_LABELS, AGENT_SKILLS_DIR, DEFAULT_AGENT, MAX_AGENTS, WRITE_LINE_TIMEOUT_MS, isAgent, isAgents } from './names.js';
|
|
11
|
+
import { ableAgents, homeAgent, readSchedule } from './schedule.js';
|
|
12
|
+
import { addAutomation, editAutomation, removeAutomation, savedAutomation, tryCheck } from './automation.js';
|
|
13
|
+
import { lineContext, writeLine } from './write-line.js';
|
|
14
|
+
/**
|
|
15
|
+
* The command line: JSON on stdout, one line for a person on stderr, and the exit code says how
|
|
16
|
+
* it went — 0 for a result, 1 for a refusal or a failure, 2 for a command that could not be read.
|
|
17
|
+
* The same contract as the skills' commands, so a person and a dashboard read it the same way.
|
|
18
|
+
*/
|
|
19
|
+
export const USAGE = `usage: scheduler <command>
|
|
20
|
+
|
|
21
|
+
tick pull agent-data, sweep, read the commands the project's skills schedule, start what is due, each a run of agent-runner
|
|
22
|
+
init this tool's lines in the dashboard's .openagent/hooks.yml, so it runs while the dashboard is open; a line already there is kept
|
|
23
|
+
start [--keep-alive] the scheduler on, ticking every minute in its own process
|
|
24
|
+
stop [--unless-keep-alive] the scheduler off; runs in flight go to the end; with the flag a keep-alive scheduler is left running
|
|
25
|
+
status the state file, whether the scheduler's process is alive, and the schedule as the project's files say it now
|
|
26
|
+
model <id> the model a scheduled run on Claude Code starts on, where neither its command's skill nor you name another (this user)
|
|
27
|
+
model <command> <id|skill> the model this machine's runs of a scheduled command start on, by the id its coding agent knows it by, the command quoted
|
|
28
|
+
when it has a word after it; kept with the agent the command runs on here, and holding only while it runs on that agent;
|
|
29
|
+
skill for the model its skill names again, else the scheduler's own on Claude Code and the agent's own default on Codex,
|
|
30
|
+
taken for any name
|
|
31
|
+
agent <command> <claude-code|codex|skill>
|
|
32
|
+
the coding agent this machine's runs of a scheduled command are on; refused for an agent whose own skills folder does not
|
|
33
|
+
hold the command's skill (.claude/skills for Claude Code, .agents/skills for Codex); skill for the agent its skill is made
|
|
34
|
+
for again, taken for any name; the command quoted when it has a word after it. The model picked for the command
|
|
35
|
+
goes with either: a model is one agent's.
|
|
36
|
+
Only Claude's quota can be read: a run on Codex starts without that question
|
|
37
|
+
offset <points> how far past the spend boundary a run may still start (this user)
|
|
38
|
+
switch <command> <on|off> whether a scheduled command runs on this machine, the command as status names it (quoted when it has a word after it); every one starts off, and off is taken for any name
|
|
39
|
+
publish <command> <nothing|commit|branch|pr|merge>
|
|
40
|
+
how far this machine's runs of a scheduled command publish; commit until picked.
|
|
41
|
+
Of a row that also resumes runs, as its agent and model, only for the runs it starts: one it resumes goes on with its own
|
|
42
|
+
pace <command> <skill|work|N<m|h|d|w|mo>> [HH:MM]
|
|
43
|
+
how often at most a scheduled command starts on this machine: an interval (15m, 6h, 2d, 2w, 1mo; 1 to 9999), with a time of day
|
|
44
|
+
for days, weeks or months (2d 10:00, this machine's time); work for whenever its check finds work; skill for the skill's own pace again, taken for any name
|
|
45
|
+
agents <command> <skill|N> how many runs of a scheduled command may be in flight at once: this machine starts another only while fewer than N are in flight
|
|
46
|
+
on any machine; a whole number from 1 to ${MAX_AGENTS}; skill for the skill's own number again, taken for any name
|
|
47
|
+
add <name> --prompt <text> [--every <N<m|h|d|w|mo>>] [--when <shell line>] [--waits-for <line>] [--private]
|
|
48
|
+
a person's own automation, saved as a command skill of the project: the prompt is the skill's text, and its schedule a pace (--every),
|
|
49
|
+
a check (--when, a shell line that prints what is new; it may read $LAST_RUN), or both; --waits-for says in one plain line what the check
|
|
50
|
+
waits for. The file is yours to commit: its command starts no run before it is on the commit a run's checkout starts from.
|
|
51
|
+
With --private it is kept on this machine alone, in this tool's own folder: nothing to commit, nobody else gets the row, and it
|
|
52
|
+
can start at once: a run is named by the automation's name and handed the prompt. The prompt is in each run's record, which
|
|
53
|
+
is shared where the project shares its records.
|
|
54
|
+
Refused for a name a skill of the project, or an automation kept on this machine, already has
|
|
55
|
+
show <name> an automation saved with add, as it stands: its prompt, its pace, its check, its file, whether it is kept on this machine alone,
|
|
56
|
+
and its version, a name for what the file says now.
|
|
57
|
+
Refused, like edit and remove, for anything whose file does not read as add writes one: a skill of the project,
|
|
58
|
+
or an automation changed by hand since; those are edited and removed by hand
|
|
59
|
+
edit <name> [--prompt <text>] [--every <N<m|h|d|w|mo>>] [--when <shell line>] [--waits-for <line>] [--was <version>]
|
|
60
|
+
save an automation again under its name: what is given takes the place of what its file said, what is left out stays,
|
|
61
|
+
and --every, --when or --waits-for given empty (--when=) takes that part out; what a check waits for goes out with the check.
|
|
62
|
+
Its past runs, its switch and your picks for it stay. A shared one is a change of yours to commit: a run is told the new
|
|
63
|
+
prompt only once the change is on the commit a run's checkout starts from. With --was, the version show answered, it is
|
|
64
|
+
refused when the file was changed since: a form opened a while ago writes over no change made by hand
|
|
65
|
+
remove <name> delete an automation's file, and what this machine held for it: its switch, its pace, its number of agents, its coding agent, its model, its publish pick.
|
|
66
|
+
Nothing is committed: the deletion of a shared one is yours to commit, and everyone else keeps the command until it reaches them.
|
|
67
|
+
What was never committed cannot be brought back: all of one kept on this machine, and a shared one's file or its last changes.
|
|
68
|
+
The records of its past runs stay
|
|
69
|
+
now <command> start one run of a scheduled command now, whatever its switch, its pace and the quota left: a person asked for it. A command with a check
|
|
70
|
+
starts only when the check finds work (it has 10 seconds); how many at once, where a run's checkout starts and whether the
|
|
71
|
+
coding agent can start hold as on a tick. It needs no scheduler running. Not ready within 20 seconds, it starts nothing
|
|
72
|
+
try --when <shell line> run a check once, as a tick would, asking what is new since a day ago: what it printed and whether an agent would start; nothing is saved or started;
|
|
73
|
+
it has 20 seconds, less than a tick gives a check
|
|
74
|
+
write-line --words <plain words> [--agent <claude-code|codex>]
|
|
75
|
+
a shell line for --when, written from what it waits for said in plain words, by one session of the coding agent (Claude Code
|
|
76
|
+
unless named) with no tools: a fraction of a cent. The line is only printed, as {line}, or {none} with why no line can do it;
|
|
77
|
+
nothing is run or saved. It has ${WRITE_LINE_TIMEOUT_MS / 1000} seconds
|
|
78
|
+
cleanup remove what this tool left in the project: the state file and the scheduler's log, then .scheduler/ and the rule hiding it from git once it is empty
|
|
79
|
+
(the automations kept on this machine are your own writing and stay);
|
|
80
|
+
refused while the state names a scheduler that is alive; the command a dashboard asks for when a project is removed with its files
|
|
81
|
+
|
|
82
|
+
JSON on stdout. Exit code 1 for a refusal or a failure (the reason on stderr), 2 for a usage error.`;
|
|
83
|
+
class Refused extends Error {
|
|
84
|
+
outcome;
|
|
85
|
+
line;
|
|
86
|
+
constructor(outcome, line) {
|
|
87
|
+
super(line);
|
|
88
|
+
this.outcome = outcome;
|
|
89
|
+
this.line = line;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
class Usage extends Error {
|
|
93
|
+
}
|
|
94
|
+
export async function runCli(argv, io, git = nodeGitRunner()) {
|
|
95
|
+
const [command, ...rest] = argv;
|
|
96
|
+
const run = command && Object.hasOwn(COMMANDS, command) ? COMMANDS[command] : undefined;
|
|
97
|
+
if (!run) {
|
|
98
|
+
io.stderr(USAGE);
|
|
99
|
+
return 2;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const result = await run(rest, io, git);
|
|
103
|
+
io.stdout(JSON.stringify(result));
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
if (err instanceof Usage) {
|
|
108
|
+
io.stderr(`${err.message}\n\n${USAGE}`);
|
|
109
|
+
return 2;
|
|
110
|
+
}
|
|
111
|
+
if (err instanceof Refused) {
|
|
112
|
+
io.stdout(JSON.stringify(err.outcome));
|
|
113
|
+
io.stderr(err.line);
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
117
|
+
io.stdout(JSON.stringify({ ok: false, reason: 'failed', detail }));
|
|
118
|
+
io.stderr(detail);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const COMMANDS = {
|
|
123
|
+
async tick(args, io, git) {
|
|
124
|
+
parse(args, {}, 0);
|
|
125
|
+
const repo = await project(io.cwd, git);
|
|
126
|
+
const record = await tickProject(repo, { git, log: io.stderr });
|
|
127
|
+
return { ok: true, ...record };
|
|
128
|
+
},
|
|
129
|
+
async init(args, io, git) {
|
|
130
|
+
parse(args, {}, 0);
|
|
131
|
+
const repo = await project(io.cwd, git);
|
|
132
|
+
const outcome = await initHooks(repo);
|
|
133
|
+
if (outcome.ok)
|
|
134
|
+
return outcome;
|
|
135
|
+
const line = outcome.reason === 'no-dashboard' ? 'no .openagent/ here: add the project in the dashboard first' : `${outcome.file}: ${outcome.detail ?? 'unreadable'}`;
|
|
136
|
+
throw new Refused(outcome, line);
|
|
137
|
+
},
|
|
138
|
+
async start(args, io, git) {
|
|
139
|
+
const { values } = parse(args, { foreground: { type: 'boolean' }, 'keep-alive': { type: 'boolean' } }, 0);
|
|
140
|
+
const repo = await project(io.cwd, git);
|
|
141
|
+
const state = await startScheduler(repo, {
|
|
142
|
+
...(values.foreground ? { foreground: true } : {}),
|
|
143
|
+
...(values['keep-alive'] ? { keepAlive: true } : {}),
|
|
144
|
+
log: io.stderr,
|
|
145
|
+
});
|
|
146
|
+
return { ok: true, ...state };
|
|
147
|
+
},
|
|
148
|
+
async stop(args, io, git) {
|
|
149
|
+
const { values } = parse(args, { 'unless-keep-alive': { type: 'boolean' } }, 0);
|
|
150
|
+
const repo = await project(io.cwd, git);
|
|
151
|
+
const state = await stopScheduler(repo, { ...(values['unless-keep-alive'] ? { unlessKeepAlive: true } : {}) });
|
|
152
|
+
if (state.kept)
|
|
153
|
+
io.stderr('keep-alive is on, the scheduler keeps running');
|
|
154
|
+
return { ok: true, ...state };
|
|
155
|
+
},
|
|
156
|
+
async status(args, io, git) {
|
|
157
|
+
parse(args, {}, 0);
|
|
158
|
+
const repo = await project(io.cwd, git);
|
|
159
|
+
return { ok: true, ...(await schedulerStatus(repo)) };
|
|
160
|
+
},
|
|
161
|
+
async model(args, io, git) {
|
|
162
|
+
const { positionals } = parse(args, {}, 1, 2);
|
|
163
|
+
const repo = await project(io.cwd, git);
|
|
164
|
+
if (positionals.length === 1) {
|
|
165
|
+
// One word is the scheduler's own model. A command's name, or `skill`, is a model's id forgotten: taken as an id it would be every row's model.
|
|
166
|
+
const word = positionals[0];
|
|
167
|
+
if (word === 'skill' || (await readSchedule(repo)).commands.some(c => c.name === word || c.name.split(' ')[0] === word))
|
|
168
|
+
throw new Usage(`${word} is no model: a command's model is set with model <command> <id|skill>`);
|
|
169
|
+
return { ok: true, ...(await updateState(repo, s => ({ ...s, model: word }), git)) };
|
|
170
|
+
}
|
|
171
|
+
const [name, to] = positionals;
|
|
172
|
+
// Taking a model back needs no scheduled command: one left for a skill that is gone can always be taken back.
|
|
173
|
+
if (to === 'skill')
|
|
174
|
+
return { ok: true, ...(await updateState(repo, s => withModel(s, name, undefined), git)) };
|
|
175
|
+
if (!to.trim())
|
|
176
|
+
throw new Usage('a model is the id its coding agent knows it by');
|
|
177
|
+
const command = await scheduled(repo, name);
|
|
178
|
+
// A model is one agent's: the pick is kept with the agent the command runs on here, and holds only while it does.
|
|
179
|
+
return { ok: true, ...(await updateState(repo, s => withModel(s, name, { agent: agentInForce(s, command), model: to }), git)) };
|
|
180
|
+
},
|
|
181
|
+
async agent(args, io, git) {
|
|
182
|
+
const { positionals } = parse(args, {}, 2);
|
|
183
|
+
const [name, to] = positionals;
|
|
184
|
+
if (to !== 'skill' && !isAgent(to))
|
|
185
|
+
throw new Usage(`${to} is none of skill, ${AGENTS.join(', ')}`);
|
|
186
|
+
const repo = await project(io.cwd, git);
|
|
187
|
+
// Taking an agent back needs no scheduled command: one left for a skill that is gone can always be taken back.
|
|
188
|
+
if (to === 'skill')
|
|
189
|
+
return { ok: true, ...(await updateState(repo, s => withAgent(s, name, undefined), git)) };
|
|
190
|
+
const command = await scheduled(repo, name);
|
|
191
|
+
if (!ableAgents(command).includes(to))
|
|
192
|
+
throw new Refused({ ok: false, reason: 'no-skill-there', command: name, agent: to }, `${AGENT_LABELS[to]} reads a project's skills from ${AGENT_SKILLS_DIR[to]}, and the skill of ${name} is only under ${command.dirs.join(' and ')}`);
|
|
193
|
+
// The agent the command is made for is no pick to keep: the command then follows its skill again. The model picked for the command goes either way: a model is one agent's.
|
|
194
|
+
return { ok: true, ...(await updateState(repo, s => withAgent(s, name, to === homeAgent(command) ? undefined : to), git)) };
|
|
195
|
+
},
|
|
196
|
+
async offset(args, io, git) {
|
|
197
|
+
const { positionals } = parse(args, {}, 1);
|
|
198
|
+
const points = Number(positionals[0]);
|
|
199
|
+
if (!Number.isFinite(points))
|
|
200
|
+
throw new Usage(`${positionals[0]} is not a number of percentage points`);
|
|
201
|
+
const repo = await project(io.cwd, git);
|
|
202
|
+
return { ok: true, ...(await updateState(repo, s => ({ ...s, spendOffset: points }), git)) };
|
|
203
|
+
},
|
|
204
|
+
async switch(args, io, git) {
|
|
205
|
+
const { positionals } = parse(args, {}, 2);
|
|
206
|
+
const [name, to] = positionals;
|
|
207
|
+
if (to !== 'on' && to !== 'off')
|
|
208
|
+
throw new Usage(`${to} is neither on nor off`);
|
|
209
|
+
const repo = await project(io.cwd, git);
|
|
210
|
+
// Off needs no scheduled command: a switch left on for a skill that is gone can always be taken back.
|
|
211
|
+
if (to === 'on')
|
|
212
|
+
await scheduled(repo, name);
|
|
213
|
+
// Switched on, a time of day counts from now: a row ticked after its time waits for the next one, as when the time was picked.
|
|
214
|
+
// A command already on is left as it is, so asking twice does not put a missed time off.
|
|
215
|
+
// The switch keeps when it was switched on: a check of a command that never started asks what is new since then.
|
|
216
|
+
const now = new Date();
|
|
217
|
+
return { ok: true, ...(await updateState(repo, s => (to === 'off' ? withSwitch(s, name, undefined) : isSwitchedOn(s, name) ? s : withPace(withSwitch(s, name, now.toISOString()), name, sinceNow(s.paces?.[name], now))), git)) };
|
|
218
|
+
},
|
|
219
|
+
async publish(args, io, git) {
|
|
220
|
+
const { positionals } = parse(args, {}, 2);
|
|
221
|
+
const [name, to] = positionals;
|
|
222
|
+
if (!PUBLISH_PICKS.includes(to))
|
|
223
|
+
throw new Usage(`${to} is none of ${PUBLISH_PICKS.join(', ')}`);
|
|
224
|
+
const repo = await project(io.cwd, git);
|
|
225
|
+
await scheduled(repo, name);
|
|
226
|
+
return { ok: true, ...(await updateState(repo, s => withPublish(s, name, to), git)) };
|
|
227
|
+
},
|
|
228
|
+
async pace(args, io, git) {
|
|
229
|
+
const { positionals } = parse(args, {}, 2, 3);
|
|
230
|
+
const [name, to, at] = positionals;
|
|
231
|
+
const interval = parseInterval(to);
|
|
232
|
+
if (to !== 'skill' && to !== 'work' && !interval)
|
|
233
|
+
throw new Usage(`${to} is none of skill, work, or an interval like 15m, 6h, 2d, 2w, 1mo`);
|
|
234
|
+
const time = at === undefined ? undefined : parseTimeOfDay(at);
|
|
235
|
+
if (at !== undefined && !time)
|
|
236
|
+
throw new Usage(`${at} is no time of day like 10:00`);
|
|
237
|
+
if (time && !(interval && takesTimeOfDay(interval)))
|
|
238
|
+
throw new Usage('a time of day goes with days, weeks or months');
|
|
239
|
+
const repo = await project(io.cwd, git);
|
|
240
|
+
// Taking a pace back needs no scheduled command: one left for a skill that is gone can always be taken back.
|
|
241
|
+
if (to === 'skill')
|
|
242
|
+
return { ok: true, ...(await updateState(repo, s => withPace(s, name, undefined), git)) };
|
|
243
|
+
const command = await scheduled(repo, name);
|
|
244
|
+
if (to === 'work' && command.when === undefined)
|
|
245
|
+
throw new Refused({ ok: false, reason: 'no-check', command: name }, `${name} has no check, so nothing would say when there is work`);
|
|
246
|
+
const every = interval?.text;
|
|
247
|
+
return {
|
|
248
|
+
ok: true,
|
|
249
|
+
...(await updateState(repo, s => {
|
|
250
|
+
if (every === undefined)
|
|
251
|
+
return withPace(s, name, { work: true });
|
|
252
|
+
// The same pace picked again is the same pick: when it was made stays, so a time that was missed is still due.
|
|
253
|
+
const before = s.paces?.[name];
|
|
254
|
+
const same = typeof before === 'object' && before !== null && 'every' in before && before.every === every && before.at === time?.text && typeof before.since === 'string';
|
|
255
|
+
return withPace(s, name, { every, ...(time ? { at: time.text } : {}), since: same ? before.since : new Date().toISOString() });
|
|
256
|
+
}, git)),
|
|
257
|
+
};
|
|
258
|
+
},
|
|
259
|
+
async agents(args, io, git) {
|
|
260
|
+
const { positionals } = parse(args, {}, 2);
|
|
261
|
+
const [name, to] = positionals;
|
|
262
|
+
const count = /^\d+$/.test(to) ? Number(to) : undefined;
|
|
263
|
+
if (to !== 'skill' && !isAgents(count))
|
|
264
|
+
throw new Usage(`${to} is neither skill nor a whole number from 1 to ${MAX_AGENTS}`);
|
|
265
|
+
const repo = await project(io.cwd, git);
|
|
266
|
+
// Taking a number back needs no scheduled command: one left for a skill that is gone can always be taken back.
|
|
267
|
+
if (to !== 'skill')
|
|
268
|
+
await scheduled(repo, name);
|
|
269
|
+
return { ok: true, ...(await updateState(repo, s => withAgents(s, name, count), git)) };
|
|
270
|
+
},
|
|
271
|
+
async add(args, io, git) {
|
|
272
|
+
const { positionals, values } = parse(args, { prompt: { type: 'string' }, every: { type: 'string' }, when: { type: 'string' }, 'waits-for': { type: 'string' }, private: { type: 'boolean' } }, 1);
|
|
273
|
+
if (values.prompt === undefined)
|
|
274
|
+
throw new Usage('add needs --prompt, what the agent is told');
|
|
275
|
+
const repo = await project(io.cwd, git);
|
|
276
|
+
const outcome = await addAutomation(repo, typed(positionals[0], values.prompt, values), git, values.private ? { onThisMachine: true } : {});
|
|
277
|
+
if (outcome.ok) {
|
|
278
|
+
// A new command starts off, at its own pace, on this machine: nothing a command of that name left behind here decides for it.
|
|
279
|
+
await forget(repo, s => withoutCommand(s, outcome.command), git);
|
|
280
|
+
return outcome;
|
|
281
|
+
}
|
|
282
|
+
throw new Refused(outcome, refusal(outcome));
|
|
283
|
+
},
|
|
284
|
+
async show(args, io, git) {
|
|
285
|
+
const { positionals } = parse(args, {}, 1);
|
|
286
|
+
const found = await savedAutomation(await project(io.cwd, git), positionals[0]);
|
|
287
|
+
if ('reason' in found)
|
|
288
|
+
throw new Refused(found, refusal(found));
|
|
289
|
+
return { ok: true, ...found.automation, file: found.file, version: found.version, ...(found.onThisMachine ? { onThisMachine: true } : {}) };
|
|
290
|
+
},
|
|
291
|
+
async edit(args, io, git) {
|
|
292
|
+
const { positionals, values } = parse(args, { prompt: { type: 'string' }, every: { type: 'string' }, when: { type: 'string' }, 'waits-for': { type: 'string' }, was: { type: 'string' } }, 1);
|
|
293
|
+
if (values.prompt === undefined && values.every === undefined && values.when === undefined && values['waits-for'] === undefined)
|
|
294
|
+
throw new Usage('edit needs what to change: --prompt, --every, --when or --waits-for');
|
|
295
|
+
// A flag left out leaves that part as the file says it; a schedule flag given empty takes its part out.
|
|
296
|
+
const part = (typed) => (typed === undefined ? undefined : typed.trim() === '' ? null : typed);
|
|
297
|
+
const outcome = await editAutomation(await project(io.cwd, git), positionals[0], { prompt: values.prompt, every: part(values.every), when: part(values.when), waitsFor: part(values['waits-for']) }, git, values.was !== undefined ? { was: values.was } : {});
|
|
298
|
+
if (outcome.ok)
|
|
299
|
+
return outcome;
|
|
300
|
+
throw new Refused(outcome, refusal(outcome));
|
|
301
|
+
},
|
|
302
|
+
async remove(args, io, git) {
|
|
303
|
+
const { positionals } = parse(args, {}, 1);
|
|
304
|
+
const repo = await project(io.cwd, git);
|
|
305
|
+
const outcome = await removeAutomation(repo, positionals[0], git);
|
|
306
|
+
if (!outcome.ok)
|
|
307
|
+
throw new Refused(outcome, refusal(outcome));
|
|
308
|
+
// What this machine held for the command goes with it, and the last tick's record stops naming it, so a dashboard stops listing it at once.
|
|
309
|
+
await forget(repo, s => withoutListed(withoutCommand(s, outcome.command), outcome.command), git);
|
|
310
|
+
return outcome;
|
|
311
|
+
},
|
|
312
|
+
async now(args, io, git) {
|
|
313
|
+
const { positionals } = parse(args, {}, 1);
|
|
314
|
+
const repo = await project(io.cwd, git);
|
|
315
|
+
const command = await scheduled(repo, positionals[0]);
|
|
316
|
+
const started = await runNow(repo, command, { git, log: io.stderr });
|
|
317
|
+
if (started.ok)
|
|
318
|
+
return { ok: true, command: command.name, run: started.run.id, ...(started.resumed ? { resumed: true } : {}) };
|
|
319
|
+
throw new Refused({ ok: false, reason: 'not-started', command: command.name, outcome: started.outcome }, started.outcome);
|
|
320
|
+
},
|
|
321
|
+
async try(args, io, git) {
|
|
322
|
+
const { values } = parse(args, { when: { type: 'string' } }, 0);
|
|
323
|
+
if (values.when === undefined || !values.when.trim())
|
|
324
|
+
throw new Usage('try needs --when, the shell line to run');
|
|
325
|
+
const repo = await project(io.cwd, git);
|
|
326
|
+
return { ok: true, ...(await tryCheck(repo, values.when.trim(), new Date())) };
|
|
327
|
+
},
|
|
328
|
+
async 'write-line'(args, io, git) {
|
|
329
|
+
const { values } = parse(args, { words: { type: 'string' }, agent: { type: 'string' } }, 0);
|
|
330
|
+
const words = values.words?.trim();
|
|
331
|
+
if (!words)
|
|
332
|
+
throw new Usage('write-line needs --words, what the line waits for in plain words');
|
|
333
|
+
const agent = values.agent ?? DEFAULT_AGENT;
|
|
334
|
+
if (!isAgent(agent))
|
|
335
|
+
throw new Usage(`--agent is one of ${AGENTS.join(', ')}`);
|
|
336
|
+
const repo = await project(io.cwd, git);
|
|
337
|
+
// None of the person's own setup: the session answers in words, and what it would load is only cost.
|
|
338
|
+
const driver = driverFor(agent, 'write-line', { memory: false, connectors: false, skills: false });
|
|
339
|
+
const written = await writeLine(driver, words, await lineContext(repo, git));
|
|
340
|
+
if ('failed' in written)
|
|
341
|
+
throw new Refused({ ok: false, reason: 'not-written', detail: written.failed }, `the line was not written: ${written.failed}`);
|
|
342
|
+
return { ok: true, ...written };
|
|
343
|
+
},
|
|
344
|
+
async cleanup(args, io, git) {
|
|
345
|
+
parse(args, {}, 0);
|
|
346
|
+
const outcome = await cleanup(await project(io.cwd, git), { git });
|
|
347
|
+
if (outcome.ok)
|
|
348
|
+
return outcome;
|
|
349
|
+
throw new Refused(outcome, `the scheduler is running here (pid ${outcome.pid}): stop it first with npx @openagt/skill-scheduler@0.1 stop`);
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
/** Take something out of the state, writing it only when it held that: a save of a dashboard's own may be writing the state at this moment, and a project with no state gets none for nothing. */
|
|
353
|
+
async function forget(repo, without, git) {
|
|
354
|
+
const state = await readState(repo);
|
|
355
|
+
if (without(state) !== state)
|
|
356
|
+
await updateState(repo, without, git);
|
|
357
|
+
}
|
|
358
|
+
/** An automation as the command line was given it: its name, its prompt, and the schedule flags that were typed. */
|
|
359
|
+
function typed(name, prompt, values) {
|
|
360
|
+
return { name, prompt, ...(values.every !== undefined ? { every: values.every } : {}), ...(values.when !== undefined ? { when: values.when } : {}), ...(values['waits-for'] !== undefined ? { waitsFor: values['waits-for'] } : {}) };
|
|
361
|
+
}
|
|
362
|
+
/** Why an automation was not saved, shown or removed, as one line for a person. */
|
|
363
|
+
function refusal(outcome) {
|
|
364
|
+
if (outcome.reason === 'taken')
|
|
365
|
+
return `that name is taken: ${outcome.folder}`;
|
|
366
|
+
if (outcome.reason === 'no-prompt')
|
|
367
|
+
return 'the prompt is empty';
|
|
368
|
+
if (outcome.reason === 'bad-schedule')
|
|
369
|
+
return `it cannot run as written: ${outcome.detail}`;
|
|
370
|
+
return outcome.detail;
|
|
371
|
+
}
|
|
372
|
+
/** The scheduled command of that name; refused where no skill of the project schedules it, with why when its skill's schedule cannot be read. */
|
|
373
|
+
async function scheduled(repo, name) {
|
|
374
|
+
const schedule = await readSchedule(repo);
|
|
375
|
+
const command = schedule.commands.find(c => c.name === name);
|
|
376
|
+
if (command)
|
|
377
|
+
return command;
|
|
378
|
+
const skill = name.split(' ')[0];
|
|
379
|
+
const unreadable = schedule.unreadable.find(u => u.skill === skill);
|
|
380
|
+
if (unreadable?.own)
|
|
381
|
+
throw new Refused({ ok: false, reason: 'unlisted-automation', automation: skill, detail: unreadable.reason }, `the automation ${skill}, kept on this machine, is not listed: ${unreadable.reason}`);
|
|
382
|
+
if (unreadable)
|
|
383
|
+
throw new Refused({ ok: false, reason: 'unreadable-schedule', skill, detail: unreadable.reason }, `the schedule of ${skill} cannot be read: ${unreadable.reason}`);
|
|
384
|
+
throw new Refused({ ok: false, reason: 'not-scheduled', command: name }, `no skill of this project schedules ${name}`);
|
|
385
|
+
}
|
|
386
|
+
/** The project the working directory belongs to, even from inside a checkout under `.branches/`. */
|
|
387
|
+
async function project(cwd, git) {
|
|
388
|
+
try {
|
|
389
|
+
return await projectRoot(cwd, git);
|
|
390
|
+
}
|
|
391
|
+
catch (err) {
|
|
392
|
+
if (!/not a git repository/i.test(err instanceof Error ? err.message : String(err)))
|
|
393
|
+
throw err;
|
|
394
|
+
throw new Refused({ ok: false, reason: 'not-a-repo' }, 'not inside a git repository');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
function parse(args, options, min, max = min) {
|
|
398
|
+
try {
|
|
399
|
+
const parsed = parseArgs({ args, options, allowPositionals: true, strict: true });
|
|
400
|
+
if (parsed.positionals.length < min || parsed.positionals.length > max) {
|
|
401
|
+
throw new Usage(`expected ${max === min ? min : `${min} to ${max}`} argument(s), got ${parsed.positionals.length}`);
|
|
402
|
+
}
|
|
403
|
+
return parsed;
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
throw err instanceof Usage ? err : new Usage(err instanceof Error ? err.message : String(err));
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem}}@layer utilities{.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.flex{display:flex}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-48{max-height:calc(var(--spacing) * 48)}.min-h-0{min-height:0}.min-h-12{min-height:calc(var(--spacing) * 12)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-4{width:calc(var(--spacing) * 4)}.w-14{width:calc(var(--spacing) * 14)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-44{width:calc(var(--spacing) * 44)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.max-w-full{max-width:100%}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--border)}.bg-background{background-color:var(--background)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/50{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/50{background-color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-success{background-color:var(--success)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-1{padding-top:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[13px\]{font-size:13px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-danger{color:var(--danger)}.text-info{color:var(--info)}.text-muted-foreground{color:var(--muted-foreground)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.outline{outline-style:var(--tw-outline-style);outline-width:1px}@media (hover:hover){.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}@media not all and (width>=48rem){.max-md\:flex-col{flex-direction:column}.max-md\:p-4{padding:calc(var(--spacing) * 4)}}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
|
|
3
|
+
/*$vite$:1*/
|