@cursor/july 0.1.53 → 0.1.55
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/AGENTS.md +12 -0
- package/dist/channels/slack/manifest.d.ts +5 -3
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +7 -3
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.DAKcDclS.js → app.CVQxhV85.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BFpWSo6D.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BNIaCSfG.js → VPLocalSearchBox.QAPzJjql.js} +1 -1
- package/dist/docs/assets/chunks/{theme.B47GzJjc.js → theme.CSxTCOFu.js} +2 -2
- package/dist/docs/assets/{reference_cli.md.-V6J7Cl8.js → reference_cli.md.D_CCfG8R.js} +2 -0
- package/dist/docs/assets/templates_triage.md.DWuQ1bZz.js +9 -0
- package/dist/docs/assets/templates_triage.md.DWuQ1bZz.lean.js +1 -0
- package/dist/docs/building-with-agents.html +3 -3
- package/dist/docs/concepts.html +3 -3
- package/dist/docs/deployment.html +3 -3
- package/dist/docs/evals.html +3 -3
- package/dist/docs/example-agents/approval-buddy.html +3 -3
- package/dist/docs/example-agents/benny.html +3 -3
- package/dist/docs/example-agents/bugbot.html +3 -3
- package/dist/docs/example-agents/codebase-wiki.html +3 -3
- package/dist/docs/example-agents/codeowners-review.html +3 -3
- package/dist/docs/example-agents/concierge.html +3 -3
- package/dist/docs/example-agents/fsd.html +3 -3
- package/dist/docs/example-agents/index.html +3 -3
- package/dist/docs/example-agents/knowledge-base.html +3 -3
- package/dist/docs/example-agents/oncall.html +3 -3
- package/dist/docs/example-agents/security-reviewer.html +3 -3
- package/dist/docs/example-agents/slack-agent.html +3 -3
- package/dist/docs/example-agents/weather-agent.html +3 -3
- package/dist/docs/guides/agent-to-agent.html +3 -3
- package/dist/docs/guides/cloud-runtime.html +3 -3
- package/dist/docs/guides/github.html +3 -3
- package/dist/docs/guides/human-in-the-loop.html +3 -3
- package/dist/docs/guides/mcp-oauth.html +3 -3
- package/dist/docs/guides/opentelemetry.html +3 -3
- package/dist/docs/guides/slack.html +3 -3
- package/dist/docs/guides/webhooks.html +3 -3
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +3 -3
- package/dist/docs/quickstart.html +3 -3
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/artifacts.html +3 -3
- package/dist/docs/reference/channels.html +3 -3
- package/dist/docs/reference/cli.html +6 -4
- package/dist/docs/reference/connections.html +3 -3
- package/dist/docs/reference/hooks.html +3 -3
- package/dist/docs/reference/http-api.html +3 -3
- package/dist/docs/reference/instructions.html +3 -3
- package/dist/docs/reference/playground.html +3 -3
- package/dist/docs/reference/project-layout.html +3 -3
- package/dist/docs/reference/prompt.html +3 -3
- package/dist/docs/reference/schedules.html +3 -3
- package/dist/docs/reference/sessions.html +3 -3
- package/dist/docs/reference/skills.html +3 -3
- package/dist/docs/reference/subagents.html +3 -3
- package/dist/docs/reference/tools.html +3 -3
- package/dist/docs/scaffolding-agents.html +3 -3
- package/dist/docs/storage.html +3 -3
- package/dist/docs/templates/triage.html +14 -16
- package/dist/docs/troubleshooting.html +3 -3
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +10 -1
- package/dist/internal/cli-deploy.js +1 -1
- package/dist/internal/cli-slack.d.ts +2 -0
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +35 -18
- package/dist/internal/init-project.d.ts +3 -0
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +77 -45
- package/dist/internal/slack-provision-client.js +1 -1
- package/dist/playground/assets/{index-BHAPd9KT.js → index-0oqXUkrR.js} +44 -44
- package/dist/playground/assets/index-tHCjJxv4.css +1 -0
- package/dist/playground/index.html +2 -2
- package/docs/reference/cli.md +2 -0
- package/docs/templates/triage.md +59 -101
- package/package.json +1 -1
- package/src/channels/slack/manifest.ts +9 -3
- package/src/internal/cli-ax.ts +10 -1
- package/src/internal/cli-deploy.ts +2 -2
- package/src/internal/cli-slack.ts +57 -18
- package/src/internal/init-project.ts +93 -48
- package/src/internal/slack-provision-client.ts +1 -1
- package/templates/triage/README.md +27 -29
- package/templates/triage/agent/agent.ts +1 -0
- package/templates/triage/agent/channels/queue.ts +47 -0
- package/templates/triage/agent/channels/webhook.ts +50 -0
- package/templates/triage/agent/instructions.md +24 -13
- package/templates/triage/agent/lib/actuate.ts +759 -0
- package/templates/triage/agent/lib/parse-queue-event.ts +168 -0
- package/templates/triage/agent/lib/tracker.ts +5 -0
- package/templates/triage/agent/lib/types.ts +52 -0
- package/templates/triage/agent/lib/verify-webhook.ts +81 -0
- package/templates/triage/agent/skills/triage-rubric.md +6 -5
- package/templates/triage/agent/tools/record_triage.ts +24 -5
- package/templates/triage/evals/triage.eval.ts +25 -3
- package/templates/triage/overlays/jira/README.md +21 -0
- package/templates/triage/overlays/jira/agent/lib/tracker.ts +8 -0
- package/templates/triage/overlays/jira/agent/mcp-connections/tracker.ts +7 -0
- package/templates/triage/overlays/linear/README.md +21 -0
- package/templates/triage/overlays/linear/agent/lib/tracker.ts +8 -0
- package/templates/triage/overlays/linear/agent/mcp-connections/tracker.ts +7 -0
- package/templates/triage/package.json +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.C4uxzYEU.js +0 -1
- package/dist/docs/assets/templates_triage.md.CConZt1z.js +0 -11
- package/dist/docs/assets/templates_triage.md.CConZt1z.lean.js +0 -1
- package/dist/playground/assets/index-DpKH0HcT.css +0 -1
- package/templates/triage/agent/channels/intake.ts +0 -20
- package/templates/triage/agent/channels/slack.ts +0 -3
- /package/dist/docs/assets/{reference_cli.md.-V6J7Cl8.lean.js → reference_cli.md.D_CCfG8R.lean.js} +0 -0
|
@@ -467,7 +467,7 @@ function mapErrorResponse(
|
|
|
467
467
|
);
|
|
468
468
|
case 403:
|
|
469
469
|
return new SlackProvisionApiError(
|
|
470
|
-
|
|
470
|
+
serverError ?? "Not authorized for this team",
|
|
471
471
|
{ status: 403 }
|
|
472
472
|
);
|
|
473
473
|
case 404: {
|
|
@@ -1,48 +1,46 @@
|
|
|
1
1
|
# Triage agent
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Scaffolded with:
|
|
3
|
+
Comments on existing Linear or Jira issues. Classifies the ticket, writes
|
|
4
|
+
the next step, links a duplicate, and sets bug priority when the
|
|
5
|
+
connector can.
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
|
-
npx @cursor/july init ./my-triage-agent --template triage
|
|
8
|
+
npx @cursor/july init ./my-triage-agent --template triage-linear
|
|
9
|
+
npx @cursor/july init ./my-triage-agent --template triage-jira
|
|
11
10
|
```
|
|
12
11
|
|
|
13
|
-
## Run
|
|
12
|
+
## Run
|
|
13
|
+
|
|
14
|
+
Connect the tracker in Cursor.
|
|
14
15
|
|
|
15
16
|
```bash
|
|
16
|
-
agent-sdk login
|
|
17
|
+
agent-sdk login
|
|
17
18
|
agent-sdk dev
|
|
18
19
|
```
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
slash command to submit a report the way an integration would
|
|
22
|
-
(`POST /v1/channels/intake/report`).
|
|
21
|
+
In the playground, paste an issue identifier or run `/queue/issue`.
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
```text
|
|
24
|
+
POST /<slug>/v1/channels/queue/issue
|
|
25
|
+
```
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
Hosted Cursor aliases require `X-Agent-Alias-Token`. Linear and Jira
|
|
28
|
+
cannot send that header, so point create webhooks at a self-hosted
|
|
29
|
+
agent instead:
|
|
28
30
|
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
+
```text
|
|
32
|
+
POST /<slug>/v1/channels/webhook
|
|
31
33
|
```
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
Set `LINEAR_WEBHOOK_SECRET` or `JIRA_WEBHOOK_SECRET` to the signing
|
|
36
|
+
secret from the tracker. The identifier is the continuation key.
|
|
37
|
+
Questions and feedback get comments. A duplicate match gets a comment
|
|
38
|
+
on both issues. `agent-sdk eval` classifies and skips tracker writes.
|
|
35
39
|
|
|
36
|
-
##
|
|
40
|
+
## Files to edit
|
|
37
41
|
|
|
38
|
-
- `agent/
|
|
39
|
-
- `agent/
|
|
40
|
-
|
|
41
|
-
- `agent/tools/record_triage.ts` owns the verdict shape. Point its
|
|
42
|
-
`execute` at your tracker (Linear, GitHub Issues, a webhook) to file
|
|
43
|
-
real tickets.
|
|
44
|
-
- `evals/triage.eval.ts` holds three smoke cases. Run `agent-sdk eval`
|
|
45
|
-
after every rubric change.
|
|
42
|
+
- `agent/skills/triage-rubric.md`: kinds, tie-breakers, severity
|
|
43
|
+
- `agent/instructions.md`: procedure around the rubric
|
|
44
|
+
- `evals/triage.eval.ts`: three smoke cases
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
cookbook: run `agent-sdk docs` and open Templates, then Triage agent.
|
|
46
|
+
`agent/lib/actuate.ts` talks to the tracker. The connection is host-only.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { defineChannel, POST } from "@cursor/july/channels";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
formatQueuePrompt,
|
|
5
|
+
isTrackerWebhook,
|
|
6
|
+
parseQueueEvent,
|
|
7
|
+
} from "../lib/parse-queue-event.js";
|
|
8
|
+
|
|
9
|
+
export default defineChannel({
|
|
10
|
+
routes: [
|
|
11
|
+
POST("/issue", {
|
|
12
|
+
description: "Triage an existing tracker issue",
|
|
13
|
+
bodySchema: z.unknown(),
|
|
14
|
+
handler: async (_req, { send, waitUntil, body }) => {
|
|
15
|
+
const parsed = parseQueueEvent(body);
|
|
16
|
+
if (!parsed.ok) {
|
|
17
|
+
if ("ignored" in parsed) {
|
|
18
|
+
return Response.json({ ok: true, ignored: true });
|
|
19
|
+
}
|
|
20
|
+
return Response.json(
|
|
21
|
+
{ ok: false, error: parsed.error },
|
|
22
|
+
{ status: 400 }
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
const options = {
|
|
26
|
+
continuationToken: parsed.issue.identifier,
|
|
27
|
+
admission: "coalesce" as const,
|
|
28
|
+
...(parsed.issue.title === "" ? {} : { title: parsed.issue.title }),
|
|
29
|
+
};
|
|
30
|
+
const prompt = formatQueuePrompt(parsed.issue);
|
|
31
|
+
if (isTrackerWebhook(body)) {
|
|
32
|
+
waitUntil(send(prompt, options));
|
|
33
|
+
return Response.json({
|
|
34
|
+
ok: true,
|
|
35
|
+
identifier: parsed.issue.identifier,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const session = await send(prompt, options);
|
|
39
|
+
return Response.json({
|
|
40
|
+
ok: true,
|
|
41
|
+
sessionId: session.id,
|
|
42
|
+
identifier: parsed.issue.identifier,
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
],
|
|
47
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { allowAll, defineChannel, POST } from "@cursor/july/channels";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
formatQueuePrompt,
|
|
5
|
+
parseQueueEvent,
|
|
6
|
+
} from "../lib/parse-queue-event.js";
|
|
7
|
+
import { verifyTrackerWebhook } from "../lib/verify-webhook.js";
|
|
8
|
+
|
|
9
|
+
export default defineChannel({
|
|
10
|
+
auth: [allowAll()],
|
|
11
|
+
routes: [
|
|
12
|
+
POST("/", {
|
|
13
|
+
description: "Signed Linear or Jira issue-created webhook",
|
|
14
|
+
bodySchema: z.unknown(),
|
|
15
|
+
handler: async (request, { send, waitUntil, body }) => {
|
|
16
|
+
const rawBody = await request.text();
|
|
17
|
+
const verified = verifyTrackerWebhook({
|
|
18
|
+
rawBody,
|
|
19
|
+
linearSignature: request.headers.get("linear-signature"),
|
|
20
|
+
hubSignature:
|
|
21
|
+
request.headers.get("x-hub-signature-256") ??
|
|
22
|
+
request.headers.get("x-hub-signature"),
|
|
23
|
+
linearSecret: process.env.LINEAR_WEBHOOK_SECRET,
|
|
24
|
+
jiraSecret: process.env.JIRA_WEBHOOK_SECRET,
|
|
25
|
+
nowMs: Date.now(),
|
|
26
|
+
});
|
|
27
|
+
if (!verified.ok) {
|
|
28
|
+
return Response.json({ ok: false }, { status: verified.status });
|
|
29
|
+
}
|
|
30
|
+
const parsed = parseQueueEvent(body);
|
|
31
|
+
if (!parsed.ok) {
|
|
32
|
+
return Response.json({ ok: true, ignored: true });
|
|
33
|
+
}
|
|
34
|
+
waitUntil(
|
|
35
|
+
send(formatQueuePrompt(parsed.issue), {
|
|
36
|
+
continuationToken: parsed.issue.identifier,
|
|
37
|
+
admission: "coalesce",
|
|
38
|
+
...(parsed.issue.title === ""
|
|
39
|
+
? {}
|
|
40
|
+
: { title: parsed.issue.title }),
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
return Response.json({
|
|
44
|
+
ok: true,
|
|
45
|
+
identifier: parsed.issue.identifier,
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
],
|
|
50
|
+
});
|
|
@@ -1,27 +1,38 @@
|
|
|
1
1
|
# Triage agent
|
|
2
2
|
|
|
3
|
-
You
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
You triage an existing Linear or Jira issue. The prompt includes its
|
|
4
|
+
identifier. Classify the issue, judge its severity, and record a verdict
|
|
5
|
+
that helps the team act on it.
|
|
6
6
|
|
|
7
7
|
Read the `triage-rubric` skill before classifying. It defines the three
|
|
8
8
|
kinds and the tie-breakers.
|
|
9
9
|
|
|
10
|
-
## Every
|
|
10
|
+
## Every issue
|
|
11
11
|
|
|
12
|
-
1. Read the
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
3.
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
1. Read the identifier, title, description, URL, and reporter from the
|
|
13
|
+
prompt. Never invent missing fields.
|
|
14
|
+
2. If the issue is too thin to classify, set `needsInfo` to true. Put the
|
|
15
|
+
exact missing detail in `nextStep`, then ask for it once in your reply.
|
|
16
|
+
Otherwise classify with what you have.
|
|
17
|
+
3. If a `memory/` directory exists in your workspace, grep the journal
|
|
18
|
+
for similar issues. Set `duplicateOf` to the matching identifier when
|
|
19
|
+
the evidence is strong.
|
|
20
|
+
4. Call `record_triage` exactly once. Pass the identifier from the
|
|
21
|
+
prompt with your verdict. The tool comments on the existing issue,
|
|
22
|
+
records duplicates, and sets bug priority when supported.
|
|
23
|
+
5. Reply with the identifier, kind, severity, one-line reason, and next
|
|
24
|
+
step. If the tracker is not connected, tell the user to connect
|
|
25
|
+
Linear or Jira in Cursor. Keep the reply under eight lines. No
|
|
26
|
+
preamble.
|
|
20
27
|
|
|
21
28
|
## Boundaries
|
|
22
29
|
|
|
23
30
|
- You classify and route. You do not fix bugs, write code, or promise
|
|
24
31
|
timelines.
|
|
25
|
-
-
|
|
32
|
+
- You never create or file an issue. Native Slack @Cursor handles ticket
|
|
33
|
+
creation. This agent only enriches the issue in the prompt.
|
|
34
|
+
- Questions and feedback still go through `record_triage` so the issue
|
|
35
|
+
receives a comment.
|
|
36
|
+
- When an issue mixes kinds, pick the dominant one and name the split
|
|
26
37
|
in your reason.
|
|
27
38
|
- Never invent reporter details. Missing fields stay empty.
|