airgate 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -1
- package/dist/airgate.mjs +13 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,7 +60,7 @@ airgate share web # teammates open, watch and fork
|
|
|
60
60
|
airgate recall "rate limiting" # what a teammate already did
|
|
61
61
|
airgate recall --patch <id> --apply # reuse it here instead of paying again
|
|
62
62
|
airgate note "tests need DATABASE_URL=sqlite::memory:"
|
|
63
|
-
airgate team trigger add acme/web pr --
|
|
63
|
+
airgate team trigger add acme/web pr --mission squad # a crew on every pull request
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
Guide: https://airgate.sh/docs/teams
|
|
@@ -90,3 +90,12 @@ Guide: https://airgate.sh/docs/local-agents
|
|
|
90
90
|
- Terms: https://airgate.sh/legal/terms · Privacy: https://airgate.sh/legal/privacy
|
|
91
91
|
|
|
92
92
|
© Valenor Core Design FZCO. All rights reserved.
|
|
93
|
+
|
|
94
|
+
## Always on
|
|
95
|
+
|
|
96
|
+
Keep something running 24/7 (a bot, a webhook, a small api) on a small server of its own with an https address, from $6 a month on any plan:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
airgate always-on <pod> --cmd "node bot.js"
|
|
100
|
+
airgate server deploy <name> --cmd "node bot.js" # from the current folder
|
|
101
|
+
```
|
package/dist/airgate.mjs
CHANGED
|
@@ -7559,7 +7559,7 @@ import { rmSync as rmSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
|
7559
7559
|
import { resolve as resolve4 } from "node:path";
|
|
7560
7560
|
|
|
7561
7561
|
// src/version.ts
|
|
7562
|
-
var VERSION = "0.2.
|
|
7562
|
+
var VERSION = "0.2.2";
|
|
7563
7563
|
|
|
7564
7564
|
// src/commands/team.ts
|
|
7565
7565
|
async function checkSimilar(ctx, task2) {
|
|
@@ -7634,7 +7634,7 @@ var team = {
|
|
|
7634
7634
|
"airgate team audit [--csv] who did what (admins)",
|
|
7635
7635
|
"airgate team billing \xB7 upgrade [--seats n] \xB7 seats <n> the team plan: seats and its pooled hours",
|
|
7636
7636
|
"airgate team secrets \xB7 secret set NAME (value from a hidden prompt or stdin) \xB7 secret rm NAME reach every member's pods",
|
|
7637
|
-
"airgate team triggers \xB7 trigger add <owner/repo> pr|issue [--label l] [--
|
|
7637
|
+
"airgate team triggers \xB7 trigger add <owner/repo> pr|issue [--label l] [--mission m] \xB7 trigger rm <id> crews started by GitHub"
|
|
7638
7638
|
],
|
|
7639
7639
|
flags: {
|
|
7640
7640
|
admin: { type: "boolean", help: "invite: as an admin" },
|
|
@@ -7651,7 +7651,8 @@ var team = {
|
|
|
7651
7651
|
csv: { type: "boolean", help: "audit: as CSV" },
|
|
7652
7652
|
seats: { type: "string", value: "n", help: "upgrade: how many seats (at least everyone in it)" },
|
|
7653
7653
|
label: { type: "string", value: "label", help: "trigger: the issue label that starts a crew (default airgate)" },
|
|
7654
|
-
|
|
7654
|
+
mission: { type: "string", value: "mission", help: "trigger: the crew's mission: race, contest, council, squad or split" },
|
|
7655
|
+
recipe: { type: "string", value: "mission", help: "trigger: the old name for --mission" },
|
|
7655
7656
|
yes: { type: "boolean", short: "y", help: "don't ask" },
|
|
7656
7657
|
"no-open": { type: "boolean", help: "print the link instead of opening the browser" }
|
|
7657
7658
|
},
|
|
@@ -7851,14 +7852,15 @@ var team = {
|
|
|
7851
7852
|
case "triggers": {
|
|
7852
7853
|
const list2 = await ctx.api.triggers();
|
|
7853
7854
|
if (ctx.json) return ui2.json(list2);
|
|
7854
|
-
if (!list2.length) return void ui2.out(ui2.c("dim", "no triggers. add one: airgate team trigger add <owner/repo> pr|issue [--
|
|
7855
|
+
if (!list2.length) return void ui2.out(ui2.c("dim", "no triggers. add one: airgate team trigger add <owner/repo> pr|issue [--mission squad]"));
|
|
7855
7856
|
return void ui2.table(list2.map((t) => [t.repo, t.event === "pr_opened" ? "a pull request opens" : `an issue gets "${t.label}"`, `${t.recipe} crew`, ui2.c("dim", t.id)]), { head: ["repo", "when", "starts", "id"] });
|
|
7856
7857
|
}
|
|
7857
7858
|
case "trigger": {
|
|
7858
7859
|
if (a1 === "add") {
|
|
7859
7860
|
const [, , repo, when] = ctx.args.positionals;
|
|
7860
|
-
if (!repo || when !== "pr" && when !== "issue") throw new UsageError("airgate team trigger add <owner/repo> pr|issue [--label l] [--
|
|
7861
|
-
const
|
|
7861
|
+
if (!repo || when !== "pr" && when !== "issue") throw new UsageError("airgate team trigger add <owner/repo> pr|issue [--label l] [--mission m]");
|
|
7862
|
+
const mission = str(ctx.args, "mission") ?? str(ctx.args, "recipe");
|
|
7863
|
+
const t = await ctx.api.addTrigger({ repo, event: when === "pr" ? "pr_opened" : "issue_labeled", ...str(ctx.args, "label") ? { label: str(ctx.args, "label") } : {}, ...mission ? { recipe: mission } : {} });
|
|
7862
7864
|
if (ctx.json) return ui2.json(t);
|
|
7863
7865
|
ui2.out(`${ui2.c("ok", "added")}: ${t.event === "pr_opened" ? "each pull request opened on" : `each issue labelled "${t.label}" on`} ${t.repo} starts a ${t.recipe} crew.`);
|
|
7864
7866
|
return void ui2.out(ui2.c("dim", "it runs as you; what it pushes or opens waits in the airlock. the GitHub App must be on the repo: airgate github"));
|
|
@@ -10062,10 +10064,10 @@ var crew = {
|
|
|
10062
10064
|
aliases: ["crews"],
|
|
10063
10065
|
group: "pods",
|
|
10064
10066
|
usage: '<race|contest|council|squad|split> "<task>" [dir] [--pod p | --from snapshot | --repo owner/name] [--as role=agent] \u2026 | show|say|stop|down|rm <id>',
|
|
10065
|
-
summary: "several agents, each in its own pod, on one task: race, contest, council, squad, split",
|
|
10067
|
+
summary: "several agents, each in its own pod, on one task. missions: race, contest, council, squad, split",
|
|
10066
10068
|
example: 'airgate crew contest "add OAuth with GitHub"',
|
|
10067
10069
|
notes: [
|
|
10068
|
-
"race: builders try the same task, a judge tests each and picks one. contest: a builder builds, a reviewer reviews and tries to break it, until it holds. council: members propose plans and critique each other, a chair decides (--build to build it). squad: a builder builds, testers write tests and hunt bugs, the builder fixes. split: a planner splits the work, workers build the parts, an integrator merges.",
|
|
10070
|
+
"the mission says how the crew works. race: builders try the same task, a judge tests each and picks one. contest: a builder builds, a reviewer reviews and tries to break it, until it holds. council: members propose plans and critique each other, a chair decides (--build to build it). squad: a builder builds, testers write tests and hunt bugs, the builder fixes. split: a planner splits the work, workers build the parts, an integrator merges.",
|
|
10069
10071
|
"starting point: this folder (sent up to a pod made for the crew, deleted after), --pod (an existing pod), --from (a snapshot) or --repo. members fork from it; each has its own pod.",
|
|
10070
10072
|
"--as role=agent[:model] picks a member's agent: --as reviewer=codex --as builder-3=opencode:qwen/qwen3-coder (opencode with a model id uses airgate's built-in models).",
|
|
10071
10073
|
"airgate runs the crew, so it keeps going with this laptop closed. this command follows the room until it ends (--detach to return at once). while it follows, this laptop signs the members' model calls if it has a sign-in (airgate models).",
|
|
@@ -10095,7 +10097,7 @@ var crew = {
|
|
|
10095
10097
|
if (!list2.length) return void ui2.out(ui2.c("dim", 'no crews yet. start one: airgate crew contest "<task>" (in a project folder)'));
|
|
10096
10098
|
ui2.table(
|
|
10097
10099
|
list2.map((c2) => [c2.id, c2.recipe, tone(ctx, c2.state), c2.task.length > 48 ? `${c2.task.slice(0, 47)}\u2026` : c2.task]),
|
|
10098
|
-
{ head: ["crew", "
|
|
10100
|
+
{ head: ["crew", "mission", "", "task"] }
|
|
10099
10101
|
);
|
|
10100
10102
|
return;
|
|
10101
10103
|
}
|
|
@@ -10130,7 +10132,7 @@ var crew = {
|
|
|
10130
10132
|
return ctx.json ? ui2.json({ ok: true }) : void ui2.out(`deleted ${id}.`);
|
|
10131
10133
|
}
|
|
10132
10134
|
}
|
|
10133
|
-
if (!KINDS.includes(first)) throw new UsageError(`"${first}" isn't a
|
|
10135
|
+
if (!KINDS.includes(first)) throw new UsageError(`"${first}" isn't a mission or an action`, `missions: ${KINDS.join(", ")} \xB7 actions: ${ACTIONS.join(", ")}`);
|
|
10134
10136
|
const kind = first;
|
|
10135
10137
|
const task2 = (second ?? "").trim();
|
|
10136
10138
|
if (!task2) throw new UsageError(`what should the crew do? airgate crew ${kind} "<task>"`);
|
|
@@ -10561,7 +10563,7 @@ var TOOLS = [
|
|
|
10561
10563
|
},
|
|
10562
10564
|
{
|
|
10563
10565
|
name: "crew_start",
|
|
10564
|
-
description: "Start a crew: several agents, each in its own pod, on one task, run by airgate (it keeps going without you). kind: race (builders try the same task, a judge tests each and picks one), contest (a builder builds, a reviewer reviews and tries to break it, until it holds), council (members propose plans and critique each other, a chair decides; build: true also builds it), squad (a builder builds, testers write tests and hunt bugs, the builder fixes), split (a planner splits the work, workers build parts, an integrator merges). Starting point: the local project in dir (default), or pod, snapshot or repo. Returns at once with the crew id: follow with crew_status, bring the result back with crew_down. Tell the user it started and roughly what it costs (one pod per member while they work).",
|
|
10566
|
+
description: "Start a crew: several agents, each in its own pod, on one task, run by airgate (it keeps going without you). kind is the mission: race (builders try the same task, a judge tests each and picks one), contest (a builder builds, a reviewer reviews and tries to break it, until it holds), council (members propose plans and critique each other, a chair decides; build: true also builds it), squad (a builder builds, testers write tests and hunt bugs, the builder fixes), split (a planner splits the work, workers build parts, an integrator merges). Starting point: the local project in dir (default), or pod, snapshot or repo. Returns at once with the crew id: follow with crew_status, bring the result back with crew_down. Tell the user it started and roughly what it costs (one pod per member while they work).",
|
|
10565
10567
|
inputSchema: obj(
|
|
10566
10568
|
{
|
|
10567
10569
|
kind: s("race | contest | council | squad | split", { enum: ["race", "contest", "council", "squad", "split"] }),
|