@catalyst-cloud/cli 0.16.38 → 0.16.39
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 +6 -0
- package/dist/args.js +7 -2
- package/dist/query.js +104 -9
- package/package.json +1 -1
- package/skills/catalyst-github/SKILL.md +1 -1
- package/skills/catalyst-github/references/reading-from-the-cloud.md +1 -0
- package/skills/catalyst-linear/SKILL.md +2 -1
- package/skills/catalyst-linear/references/ticket-classification.md +11 -0
- package/skills/catalyst-linear/references/writing-to-linear.md +2 -0
- package/skills/catalyst-onboard/SKILL.md +1 -1
- package/skills/run-this-project/SKILL.md +1 -1
- package/skills/unstick/SKILL.md +1 -1
- package/skills/what-needs-me/SKILL.md +1 -1
- package/skills/what-this-repo-needs/SKILL.md +1 -1
- package/skills/whats-happening/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.16.39
|
|
4
|
+
|
|
5
|
+
`catalyst query pulls` now sends `--state`, `--repo` and `--draft` to Catalyst, so `--state open --all` reads only the workspace's open pull requests instead of paging through every pull request it has ever had. `--state` takes `open`, `closed` or `merged`, and `--draft` takes `draft` or `ready`. Any other value is refused before a request is made. `open` and `closed` leave out merged pull requests, and the repository and state match in any letter case. Against an older Catalyst that ignores these filters, the CLI applies them to the rows it gets back, so the result is the same. A filtered read of the local replica now checks every pull request it holds, so an older pull request linked to a ticket is still found.
|
|
6
|
+
|
|
7
|
+
The `catalyst-linear` skill reads the project's label definitions before it chooses a ticket's work type and component.
|
|
8
|
+
|
|
3
9
|
## 0.16.38
|
|
4
10
|
|
|
5
11
|
On a Mac with thoughts custody, a runner update agent that 0.16.35 or 0.16.36 moved kept failing every update with `custody_restore_failed:runtime_custody_mismatch`, even after the CLI updated itself to 0.16.37. The scheduled update installs the new CLI beside the old one, not globally, so the 0.16.37 repair never ran. Now `catalyst runner update` checks which node it runs under. When that differs from the node the custody was set up with, it runs the same command again under the custody's node and exits with that run's result. The agent file is left as it is, and no run in progress is interrupted. `--check` and `--fleet`, a Mac without thoughts custody, and Linux are unchanged.
|
package/dist/args.js
CHANGED
|
@@ -137,7 +137,12 @@ export const FLAG_TABLES = {
|
|
|
137
137
|
query: {
|
|
138
138
|
team: { value: true, help: "team key filter" },
|
|
139
139
|
project: { value: true, help: "project id filter" },
|
|
140
|
-
state: {
|
|
140
|
+
state: {
|
|
141
|
+
value: true,
|
|
142
|
+
help: "issues: state name filter; pulls: open, closed or merged",
|
|
143
|
+
},
|
|
144
|
+
repo: { value: true, help: "pulls: only this repository (owner/name)" },
|
|
145
|
+
draft: { value: true, help: "pulls: draft or ready" },
|
|
141
146
|
limit: {
|
|
142
147
|
value: true,
|
|
143
148
|
help: "max rows (default 50); one page only unless --all",
|
|
@@ -618,7 +623,7 @@ export const VERB_USAGE = {
|
|
|
618
623
|
notice: "notice",
|
|
619
624
|
me: "me [--json]",
|
|
620
625
|
contract: "contract [--refresh] [--path <a.b.c>] [--json]",
|
|
621
|
-
query: "query <issues|issue <id>|pulls|pull <id>|projects|cycles|search <terms>|changes --since <cursor|head>> [--team K] [--project P] [--state S] [--limit N] [--all] [--source replica|api] [--json]",
|
|
626
|
+
query: "query <issues|issue <id>|pulls|pull <id>|projects|cycles|search <terms>|changes --since <cursor|head>> [--team K] [--project P] [--state S] [--repo O/N] [--draft draft|ready] [--ticket T] [--limit N] [--all] [--source replica|api] [--json]",
|
|
622
627
|
replica: 'replica <start [--detach]|stop|status [--probe] [--json]|sql "<select>"|schema [table]> [--db <path>]',
|
|
623
628
|
runtime: "runtime <status [--json]|install|path|uninstall>",
|
|
624
629
|
events: "events <tail|wait-for|query|status [--probe] [--json]> [--type NAME] [--ticket CTC-N] [--repo O/N] [--ref O/N:BRANCH] [--pr O/N#N] [--session T/PHASE#N] [--to me] [--after SEQUENCE] [--limit N] [--timeout SECONDS] [--directory PATH]",
|
package/dist/query.js
CHANGED
|
@@ -68,7 +68,7 @@ export async function cmdQuery(args, ctx, deps = {}) {
|
|
|
68
68
|
status.verdict === "not-configured") {
|
|
69
69
|
throw new UsageError(`--source replica but the replica is ${status?.verdict ?? "unavailable"}`);
|
|
70
70
|
}
|
|
71
|
-
result = await fromReplica(ctx, cfg, sub, rest, filters, deps);
|
|
71
|
+
result = await fromReplica(ctx, cfg, sub, rest, filters, deps, args);
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
74
|
result = await fromApi(ctx, cfg, sub, rest, filters, args);
|
|
@@ -80,7 +80,7 @@ export async function cmdQuery(args, ctx, deps = {}) {
|
|
|
80
80
|
printResult(ctx, args, sub, result);
|
|
81
81
|
return 0;
|
|
82
82
|
}
|
|
83
|
-
async function fromReplica(ctx, cfg, sub, rest, f, deps) {
|
|
83
|
+
async function fromReplica(ctx, cfg, sub, rest, f, deps, args) {
|
|
84
84
|
const sdk = await loadSdk();
|
|
85
85
|
const dbPath = replicaDbPath(cfg, ctx.home, ctx.env);
|
|
86
86
|
const engine = await engineFor(sdk, dbPath, ctx, {
|
|
@@ -100,8 +100,24 @@ async function fromReplica(ctx, cfg, sub, rest, f, deps) {
|
|
|
100
100
|
}
|
|
101
101
|
case "issue":
|
|
102
102
|
return replica.issue(needArg(rest, "issue <identifier>"));
|
|
103
|
-
case "pulls":
|
|
104
|
-
|
|
103
|
+
case "pulls": {
|
|
104
|
+
const scope = pullScope(args);
|
|
105
|
+
if (!(scope.state || scope.repo || scope.draft || scope.ticket))
|
|
106
|
+
return replica.pulls({ limit: f.limit });
|
|
107
|
+
// CTC-7158 — the replica is local, so a narrowed read scans every row rather than only the
|
|
108
|
+
// newest window: an older pull request linked to the ticket is still found.
|
|
109
|
+
const kept = [];
|
|
110
|
+
for (let offset = 0;; offset += REPLICA_PULL_PAGE) {
|
|
111
|
+
const page = replica.pulls({
|
|
112
|
+
limit: REPLICA_PULL_PAGE,
|
|
113
|
+
offset,
|
|
114
|
+
});
|
|
115
|
+
kept.push(...page.filter((row) => pullMatches(row, scope)));
|
|
116
|
+
if (page.length < REPLICA_PULL_PAGE || kept.length >= f.limit)
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
return kept.slice(0, f.limit);
|
|
120
|
+
}
|
|
105
121
|
case "projects":
|
|
106
122
|
return applyFilters(replica.projects({
|
|
107
123
|
limit: Math.max(f.limit, 200),
|
|
@@ -147,16 +163,23 @@ async function fromApi(ctx, cfg, sub, rest, f, args) {
|
|
|
147
163
|
return res.status === 404 ? null : res.body;
|
|
148
164
|
}
|
|
149
165
|
case "pulls": {
|
|
150
|
-
const
|
|
166
|
+
const scope = pullScope(args);
|
|
167
|
+
if (scope.ticket) {
|
|
168
|
+
const rows = await ticketPulls(ctx, api, scope);
|
|
169
|
+
return f.all ? rows : rows.slice(0, f.limit);
|
|
170
|
+
}
|
|
171
|
+
// CTC-7158 — the facets go to the cloud, so `--state open --all` reads the open pull requests
|
|
172
|
+
// instead of paging every one the workspace has ever had.
|
|
173
|
+
const query = { state: scope.state, repo: scope.repo, draft: scope.draft };
|
|
151
174
|
if (f.all) {
|
|
152
|
-
const { rows } = await fetchAllPages(api, "/api/v1/pulls",
|
|
153
|
-
return rows;
|
|
175
|
+
const { rows } = await fetchAllPages(api, "/api/v1/pulls", query);
|
|
176
|
+
return keepPullScope(ctx, rows, scope);
|
|
154
177
|
}
|
|
155
178
|
const page = await fetchPage(api, "/api/v1/pulls", {
|
|
179
|
+
...query,
|
|
156
180
|
limit: f.limit,
|
|
157
|
-
ticket,
|
|
158
181
|
});
|
|
159
|
-
const rows = page.rows.slice(0, f.limit);
|
|
182
|
+
const rows = keepPullScope(ctx, page.rows, scope).slice(0, f.limit);
|
|
160
183
|
const notice = truncationNotice(page);
|
|
161
184
|
if (notice)
|
|
162
185
|
ctx.stderr(notice);
|
|
@@ -264,6 +287,78 @@ function requireIssueScope(scope, f) {
|
|
|
264
287
|
throw new CliError(`the cloud did not apply ${flag} (${scope === null ? "it sent no x-mirror-scope header" : `it applied: ${scope.join(", ") || "nothing"}`}), so the page is not that scope; nothing printed. Read it with --source replica, or drop ${flag}`, "filter-not-applied", 1);
|
|
265
288
|
}
|
|
266
289
|
}
|
|
290
|
+
const REPLICA_PULL_PAGE = 500;
|
|
291
|
+
const PULL_STATES = ["open", "closed", "merged"];
|
|
292
|
+
const PULL_DRAFTS = ["draft", "ready"];
|
|
293
|
+
/** CTC-7158 — the cloud reads an unknown `?state=` or `?draft=` as no narrowing, so a typo would
|
|
294
|
+
* page every pull request. Refuse it here instead. */
|
|
295
|
+
function pullScope(args) {
|
|
296
|
+
const state = trimmedFlag(args, "state")?.toLowerCase();
|
|
297
|
+
if (state !== undefined && !PULL_STATES.includes(state))
|
|
298
|
+
throw new UsageError(`--state for pulls is one of ${PULL_STATES.join(", ")} (got "${state}")`);
|
|
299
|
+
const draft = trimmedFlag(args, "draft")?.toLowerCase();
|
|
300
|
+
if (draft !== undefined && !PULL_DRAFTS.includes(draft))
|
|
301
|
+
throw new UsageError(`--draft is one of ${PULL_DRAFTS.join(", ")} (got "${draft}")`);
|
|
302
|
+
return {
|
|
303
|
+
state: state,
|
|
304
|
+
repo: trimmedFlag(args, "repo"),
|
|
305
|
+
draft: draft,
|
|
306
|
+
ticket: trimmedFlag(args, "ticket"),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
const truthy = (v) => v === true || v === 1 || v === "1" || v === "true";
|
|
310
|
+
/** The cloud's facet rules (the read model's pull scope): `open` and `closed` leave out merged pull
|
|
311
|
+
* requests, `merged` is the merged flag alone, `ready` is not a draft, and state and repo match
|
|
312
|
+
* without case. */
|
|
313
|
+
function pullMatches(row, s) {
|
|
314
|
+
const merged = truthy(row.merged);
|
|
315
|
+
const state = String(row.state ?? "").toLowerCase();
|
|
316
|
+
if (s.state === "open" && (state !== "open" || merged))
|
|
317
|
+
return false;
|
|
318
|
+
if (s.state === "merged" && !merged)
|
|
319
|
+
return false;
|
|
320
|
+
if (s.state === "closed" && (state !== "closed" || merged))
|
|
321
|
+
return false;
|
|
322
|
+
if (s.draft === "draft" && !truthy(row.draft))
|
|
323
|
+
return false;
|
|
324
|
+
if (s.draft === "ready" && truthy(row.draft))
|
|
325
|
+
return false;
|
|
326
|
+
if (s.repo && !sameName(row.repo_id, s.repo))
|
|
327
|
+
return false;
|
|
328
|
+
if (s.ticket && "linear_issue_identifier" in row && !sameName(row.linear_issue_identifier, s.ticket))
|
|
329
|
+
return false;
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
/** A cloud that predates a facet returns rows outside it. Drop them and say so, so the answer is
|
|
333
|
+
* still the asked scope. */
|
|
334
|
+
function keepPullScope(ctx, rows, s) {
|
|
335
|
+
const kept = rows.filter((row) => pullMatches(row, s));
|
|
336
|
+
if (kept.length < rows.length)
|
|
337
|
+
ctx.stderr(`the cloud returned ${rows.length - kept.length} pull requests outside the asked scope; dropped them here`);
|
|
338
|
+
return kept;
|
|
339
|
+
}
|
|
340
|
+
/** CTC-7158 — `/pulls` has no ticket facet, and an unknown param narrows nothing, so `?ticket=`
|
|
341
|
+
* returned the newest page for any ticket. The ticket's own read names its linked pull requests;
|
|
342
|
+
* read each of those instead. */
|
|
343
|
+
async function ticketPulls(ctx, api, s) {
|
|
344
|
+
const ticket = s.ticket;
|
|
345
|
+
const res = await api.getJson(`/api/v1/issues/${encodeURIComponent(ticket)}`, { accept: [404] });
|
|
346
|
+
if (res.status === 404)
|
|
347
|
+
throw new CliError(`--ticket ${ticket}: no such ticket`, "not-found", 1);
|
|
348
|
+
const rows = [];
|
|
349
|
+
for (const link of res.body.linked_pulls ?? []) {
|
|
350
|
+
if (!link.node_id)
|
|
351
|
+
continue;
|
|
352
|
+
const pr = await api.getJson(`/api/v1/pulls/${encodeURIComponent(link.node_id)}`, { accept: [404] });
|
|
353
|
+
if (pr.status === 404) {
|
|
354
|
+
ctx.stderr(`--ticket ${ticket}: linked pull request ${link.node_id} is not in the mirror`);
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
if (pullMatches(pr.body, { ...s, ticket: undefined }))
|
|
358
|
+
rows.push(pr.body);
|
|
359
|
+
}
|
|
360
|
+
return rows;
|
|
361
|
+
}
|
|
267
362
|
function trimmedFlag(args, name) {
|
|
268
363
|
const value = flagString(args, name)?.trim();
|
|
269
364
|
return value === "" ? undefined : value;
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Catalyst's GitHub: show a ticket's pull request with its checks, reviews and review threads, say whether it is mergeable under this repository's policy, and explain what a PR accumulates as the ticket moves (the branch, the draft, the rewrite, the force-pushes, the labels, the queue). Use when someone asks "show me the PR", "what are the checks saying", "why hasn't it merged", "what does the queue need", "what does that label mean", or wants the branch and merge conventions Catalyst follows.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# Catalyst's GitHub
|
|
10
10
|
|
|
@@ -5,6 +5,7 @@ Cloud reads are the default on every machine. They need no local writer and no l
|
|
|
5
5
|
| question | command |
|
|
6
6
|
| -- | -- |
|
|
7
7
|
| Which pull requests name this ticket? | `catalyst query pulls --ticket <KEY-123>` |
|
|
8
|
+
| Which pull requests are open, in one repository or across them all? | `catalyst query pulls --state open --all` (add `--repo <owner/name>` or `--draft ready`). The cloud filters, so this reads only open ones. Never page every pull request with `--all` and filter it yourself. |
|
|
8
9
|
| What state is the PR in: draft, merged, conflict, auto-merge? | `node scripts/read-pr.mjs <KEY-123>` |
|
|
9
10
|
| Which checks are red or still running at the head? | `node scripts/read-pr.mjs <KEY-123>` |
|
|
10
11
|
| Is it mergeable under this repository's policy? | `node scripts/is-it-mergeable.mjs <KEY-123>`, which also reads `catalyst contract --path merge` |
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Catalyst's view of Linear on the customer's own cloud account. Reads a ticket with its comments, relations, labels, linked pull requests and agent sessions inline, from the cloud API by default, with local replica reads available as an explicit opt-in, always naming the source; searches tickets, PRs, projects and initiatives; writes comments, card moves, labels and new tickets through the account's agent proxy as the app actor, with every route, stage id, label id and marker read from the account's contract. Knows what a ticket accumulates as Catalyst works it (phase-outcome comments, the document per phase, the agent session, the labels, the single blocks relation, the bookkeeping marker, the eyes acknowledgement). Use when a person says "show me the ticket", "what did Catalyst write on it", "comment on it", "move it", "label it" or "file a ticket". Not for raising a decision for a human (what-needs-me) and not for pull requests (catalyst-github).
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# Catalyst Linear
|
|
10
10
|
|
|
@@ -30,6 +30,7 @@ Exit codes: 0 done, 1 not found or a usage error, 2 this machine is not connecte
|
|
|
30
30
|
| "what did Catalyst write on this ticket?", a comment shape, a label, the marker, the 👀 | `references/what-a-ticket-accumulates.md` |
|
|
31
31
|
| before any read you will report on; "is this current?"; citing; searching | `references/reading-a-ticket.md` |
|
|
32
32
|
| before any comment, move, label or new ticket; identity, budget, slots, ids | `references/writing-to-linear.md` |
|
|
33
|
+
| proposing work-type or component labels for creation, triage or backfill | `references/ticket-classification.md`; then the project's `.agents/references/ticket-labels.json` if present |
|
|
33
34
|
| which command answers a ticket question from the cloud: stage, last phase, PR, what changed | `references/reading-from-the-cloud.md` |
|
|
34
35
|
| local SQL, only when `catalyst replica status --json` reports `configured: true` | `references/local-replica.md` |
|
|
35
36
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Ticket classification
|
|
2
|
+
|
|
3
|
+
Use this reference when proposing work-type or component labels while creating, triaging, or backfilling tickets. It describes the process; a project's `.agents/references/ticket-labels.json`, when present, owns its vocabulary and boundaries. Read that file from the project checkout before classifying. Do not copy one project's catalog to another team.
|
|
4
|
+
|
|
5
|
+
1. Read the ticket's description, acceptance criteria, and current labels. A title or repository route alone is not enough to settle a component. Treat linked implementation paths as supporting evidence for a retrospective review, not as proof of the original request.
|
|
6
|
+
2. Decide whether the record requests delivery or asks for a decision, approval, information, or action. Choose one type from the project's catalog when the evidence supports it. A project may define `ask` as a type for the latter records. Keep that type separate from the workflow marker that routes asks, and from the implementation ticket an ask may block. A bug requires evidence of an existing promised behavior that fails; a new capability is a feature; a new guard is test work, while a broken existing CI contract is a bug. Documentation explains behavior; maintenance publishes or configures it; refactoring preserves it.
|
|
7
|
+
3. Select zero or more components whose behavior the requested work materially changes. Allow more than one for independent affected areas. Abstain on an unclear boundary; a path, a generic word, or a test mention alone does not establish ownership. Keep project and initiative relationships, ask/control state, and repository routing separate from these labels.
|
|
8
|
+
4. Record the evidence, uncertainty, and any alternative before a backfill. Apply recommendations only within the authorized scope and under a reviewed classification policy. Preserve the ticket's existing work type unless a reviewed correction calls for replacement. Add supported components without removing unrelated labels. Create a label only when that scope and policy authorize it.
|
|
9
|
+
5. Before a write, use `writing-to-linear.md` to resolve the live label name, scope, ID or ambiguity through current account access. The project file is policy, not an ID cache. Read back the ticket after a reviewed write.
|
|
10
|
+
|
|
11
|
+
For cleanup of case-only duplicates, inventory active and archived labels and issues. Check synchronization with linked systems, test a disposable canary, and read back both systems after a delay. A write that appears to remove a duplicate may be reversed by synchronization. Stop broad cleanup until the canary has a stable result.
|
|
@@ -30,6 +30,8 @@ Every write spends one unit of the per-host daily budget (`thresholds.hostDailyW
|
|
|
30
30
|
|
|
31
31
|
`--label`, `--add` and `--remove` take a label's name or its UUID. A UUID is sent as a label id; every other value is sent as a name, and the proxy resolves it in the ticket's team. When the contract lists one of Catalyst's own labels (the ask marker, the hold label, the release label) as absent from the workspace, the CLI refuses rather than inventing it.
|
|
32
32
|
|
|
33
|
+
For work-type and component choices, load [ticket classification](ticket-classification.md) and the project's `.agents/references/ticket-labels.json` when present. Those files define recommendations, not live IDs. Verify the current team's label scope and the ticket's existing memberships before changing any classification label. A case-only duplicate needs a synchronization check, a disposable canary and delayed readback in both systems before wider cleanup. Include archived labels and issues in the inventory.
|
|
34
|
+
|
|
33
35
|
Two labels are a human's, not yours: the release label (which frees a ticket the shape detector held) is applied by a human; the hold labels on a pull request are `catalyst-github`'s subject.
|
|
34
36
|
|
|
35
37
|
## A new ticket takes the team key
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Set up Catalyst Cloud and say whether setup is working. Walks a person from nothing to their first ticket running, one step at a time: the coding account, the project, the integrations and connected accounts, each repository's settings file, then one real ticket moving. Also logs this machine in, reads the readiness verdict with who can fix each failure, and checks the optional local replica. Use when someone says "set me up", "onboard me", "I just signed up", "get me started", "what do I do first", "log me in", "which account is this machine on", "am I set up", "what is missing", "why does nothing happen" or "is the replica running", when a login expired, or when a skill script exits 2 saying this machine is not connected. Does every step a key can do through the catalyst CLI, hands over the exact page for the steps only a browser can do, and never claims a step it did not watch succeed.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# Onboard me
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Own one Catalyst Cloud project end to end until it closes. Use when the person says "run this project for me", "own this until it ships", "keep this moving", or hands you a project id or a set of tickets to drive. Subscribes to the account's event stream for the scope through the catalyst CLI, reacts to each change in the same turn, makes tickets ready and moves them to dispatch, parks what should stop, chases stalls, escalates inward, and keeps one status summary current. Writes to Linear as the app actor; never polls.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# Run this project
|
|
10
10
|
|
package/skills/unstick/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Get a stuck Catalyst Cloud ticket moving again. Use when the person asks "why is this parked and can you release it?", "unpark this", "get things flowing again", "the outage is over, retry what failed", or hands you a ticket that is not moving. Reads why nothing runs and what holds the ticket through the catalyst CLI, decides whether the recorded cause is fixed, previews the release, releases every governor holding the ticket the right way (or one failure class across a team), and raises an ask only for what a person has to do. Never releases a cause it cannot show changed without saying so.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# Unstick
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
The human's decision inbox on Catalyst Cloud, and the one way an agent raises a decision on their behalf. Use when the person asks "what needs me?", "what am I blocking?", or when active work is gated on a choice only they can make. Lists open asks ranked by how much open work each one holds, files an ask through the cloud's ask route with the account's own template, and records the answer so the held work releases. Never answers as the human, never duplicates an open ask.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# What needs me
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
What environment variable names does this repository need, and where does each one come from? Scans the repository offline (no login, no network) and lists the names in three groups (build/test, deploy-only, bindings), each with where it was found, what uses it, and where a local value would come from. Never reads a value or prints one. Also checks the environment variable table in `.catalyst/catalyst.toml` offline. Use when someone asks "what does catalyst.env.json mean", "what env vars does this repo need", "why does the container need this", or before reviewing or writing the declaration.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# What this repository needs
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Use for "what's happening?", "what machines do we have?", "how much capacity do we have?", "where are we?", "why is that stuck?", "what closed?", "what's next?", "how does this work?", "why did it do that?", "how does it prioritise?" and "what does this setting do, where is it set?" in Catalyst Cloud, or asks for something to be done rather than known. Reads the contract via catalyst CLI. Read-only: route work/decisions, never answer as the human.
|
|
5
5
|
allowed-tools: Bash(catalyst:*) Bash(npx -p @catalyst-cloud/cli catalyst:*)
|
|
6
6
|
---
|
|
7
|
-
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.
|
|
7
|
+
<!-- vendored-from: @catalyst-cloud/catalyst-skills@0.16.39 — written in this repository for customer accounts -->
|
|
8
8
|
|
|
9
9
|
# What's happening
|
|
10
10
|
|