@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
|
@@ -82,7 +82,7 @@ export function resolveDeployAuth(options) {
|
|
|
82
82
|
}
|
|
83
83
|
teamId = identity.teamId;
|
|
84
84
|
const dim = stderrPalette().dim;
|
|
85
|
-
err(`${dim(`Using team ${teamId}${identity.teamName === undefined ? "" : ` (${identity.teamName})`}
|
|
85
|
+
err(`${dim(`Using team ${teamId}${identity.teamName === undefined ? "" : ` (${identity.teamName})`}`)}\n${dim(" the account's team — pass --team to override.")}\n`);
|
|
86
86
|
}
|
|
87
87
|
return {
|
|
88
88
|
client,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* `init --manual` for hand-imported manifests.
|
|
5
5
|
*/
|
|
6
6
|
import { runSlackDoctor } from "../channels/slack/index.js";
|
|
7
|
+
import { type TerminalPalette } from "./terminal-style.js";
|
|
7
8
|
export interface SlackCliOptions {
|
|
8
9
|
dir: string;
|
|
9
10
|
name?: string;
|
|
@@ -40,6 +41,7 @@ export interface SlackCliOptions {
|
|
|
40
41
|
doctorImpl?: typeof runSlackDoctor;
|
|
41
42
|
out?: (text: string) => void;
|
|
42
43
|
err?: (text: string) => void;
|
|
44
|
+
palette?: TerminalPalette;
|
|
43
45
|
}
|
|
44
46
|
export declare function cmdSlack(subcommand: string | undefined, options: SlackCliOptions): Promise<number>;
|
|
45
47
|
export declare function cmdSlackCreate(options: SlackCliOptions): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-slack.d.ts","sourceRoot":"","sources":["../../src/internal/cli-slack.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAIL,cAAc,EAGf,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-slack.d.ts","sourceRoot":"","sources":["../../src/internal/cli-slack.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAIL,cAAc,EAGf,MAAM,4BAA4B,CAAC;AAqBpC,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,cAAc,CAAC;IACnC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AA2CD,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAgRD,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAoLjB;AAiDD,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD5E"}
|
|
@@ -25,6 +25,7 @@ import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
|
25
25
|
import { loadAgentLocalEnv } from "./local-env.js";
|
|
26
26
|
import { openBrowser } from "./open-browser.js";
|
|
27
27
|
import { AgentServeSlackClient, SlackProvisionApiError, } from "./slack-provision-client.js";
|
|
28
|
+
import { stderrPalette } from "./terminal-style.js";
|
|
28
29
|
const SLACK_HELP = `${CLI} slack — Slack channel pack helpers (Socket Mode)
|
|
29
30
|
|
|
30
31
|
Usage:
|
|
@@ -241,7 +242,7 @@ function applySlackCreateFileIcon(ctx, source, appId) {
|
|
|
241
242
|
*/
|
|
242
243
|
function prepareProvision(options) {
|
|
243
244
|
return __awaiter(this, void 0, void 0, function* () {
|
|
244
|
-
var _a, _b, _c, _d;
|
|
245
|
+
var _a, _b, _c, _d, _e;
|
|
245
246
|
const out = (_a = options.out) !== null && _a !== void 0 ? _a : ((text) => void process.stdout.write(text));
|
|
246
247
|
const err = errStream(options);
|
|
247
248
|
const auth = yield resolveDeployAuth({
|
|
@@ -264,12 +265,31 @@ function prepareProvision(options) {
|
|
|
264
265
|
json: options.json === true,
|
|
265
266
|
out,
|
|
266
267
|
err,
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
268
|
+
dim: ((_b = options.palette) !== null && _b !== void 0 ? _b : stderrPalette()).dim,
|
|
269
|
+
openBrowserImpl: (_c = options.openBrowserImpl) !== null && _c !== void 0 ? _c : openBrowser,
|
|
270
|
+
pollIntervalMs: (_d = options.connectPollIntervalMs) !== null && _d !== void 0 ? _d : DEFAULT_WIZARD_POLL_INTERVAL_MS,
|
|
271
|
+
pollTimeoutMs: (_e = options.connectPollTimeoutMs) !== null && _e !== void 0 ? _e : DEFAULT_WIZARD_POLL_TIMEOUT_MS,
|
|
270
272
|
};
|
|
271
273
|
});
|
|
272
274
|
}
|
|
275
|
+
function writePendingAdminWait(ctx, poll) {
|
|
276
|
+
const appSuffix = poll.appId === undefined ? "" : ` (${poll.appId})`;
|
|
277
|
+
const requestUrl = poll.oauthAuthorizeUrl !== undefined && poll.oauthAuthorizeUrl.length > 0
|
|
278
|
+
? poll.oauthAuthorizeUrl
|
|
279
|
+
: undefined;
|
|
280
|
+
ctx.err(`Waiting for a Slack admin to approve the app${appSuffix}.\n\n`);
|
|
281
|
+
if (requestUrl !== undefined) {
|
|
282
|
+
ctx.err(ctx.dim(` Slack will notify workspace owners once the request is in their queue.\n` +
|
|
283
|
+
` Open this page to file it or send a reminder:\n\n`));
|
|
284
|
+
ctx.err(` ${requestUrl}\n\n`);
|
|
285
|
+
ctx.openBrowserImpl(requestUrl);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
ctx.err(ctx.dim(` Slack will notify workspace owners once the request is in their queue.\n\n`));
|
|
289
|
+
}
|
|
290
|
+
ctx.err(ctx.dim(` Keep this command running.\n` +
|
|
291
|
+
` After an admin approves, click Retry in the dashboard.\n`));
|
|
292
|
+
}
|
|
273
293
|
export function cmdSlackCreate(options) {
|
|
274
294
|
return __awaiter(this, void 0, void 0, function* () {
|
|
275
295
|
var _a, _b, _c;
|
|
@@ -298,7 +318,7 @@ export function cmdSlackCreate(options) {
|
|
|
298
318
|
return 1;
|
|
299
319
|
}
|
|
300
320
|
if (wrote.length > 0 && !ctx.json) {
|
|
301
|
-
ctx.err(`Scaffolded the Slack channel: ${wrote.join(", ")}\n`);
|
|
321
|
+
ctx.err(`${ctx.dim(`Scaffolded the Slack channel: ${wrote.join(", ")}`)}\n`);
|
|
302
322
|
}
|
|
303
323
|
const source = yield inferDeployGitSource(target.dir);
|
|
304
324
|
let minted;
|
|
@@ -321,9 +341,10 @@ export function cmdSlackCreate(options) {
|
|
|
321
341
|
catch (error) {
|
|
322
342
|
return renderSlackApiError(error, ctx.err);
|
|
323
343
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
344
|
+
const waitMinutes = Math.round(ctx.pollTimeoutMs / 60000);
|
|
345
|
+
ctx.err(`Finish Slack setup in the browser:\n\n ${minted.url}\n\n`);
|
|
346
|
+
ctx.err(ctx.dim(` Sign in as the same Cursor account that ran this command.\n` +
|
|
347
|
+
` The CLI waits here (up to ${waitMinutes} minutes).\n`));
|
|
327
348
|
ctx.openBrowserImpl(minted.url);
|
|
328
349
|
const deadline = Date.now() + ctx.pollTimeoutMs;
|
|
329
350
|
let sawPendingAdmin = false;
|
|
@@ -348,17 +369,12 @@ export function cmdSlackCreate(options) {
|
|
|
348
369
|
}
|
|
349
370
|
if (poll.status === "pending_admin_approval" && !sawPendingAdmin) {
|
|
350
371
|
sawPendingAdmin = true;
|
|
351
|
-
|
|
352
|
-
ctx.err(`Waiting for a Slack admin to approve the app${appSuffix}. Keep this command running.\n` +
|
|
353
|
-
`Managed install does not file the request. Open Slack to submit it; that same page lets you send a reminder to workspace owners.\n`);
|
|
354
|
-
if (poll.oauthAuthorizeUrl !== undefined &&
|
|
355
|
-
poll.oauthAuthorizeUrl.length > 0) {
|
|
356
|
-
ctx.err(` ${poll.oauthAuthorizeUrl}\n`);
|
|
357
|
-
}
|
|
358
|
-
ctx.err("After an admin approves, click Retry in the dashboard.\n");
|
|
372
|
+
writePendingAdminWait(ctx, poll);
|
|
359
373
|
}
|
|
360
374
|
if (Date.now() >= deadline) {
|
|
361
|
-
ctx.err(`Timed out waiting for Slack setup
|
|
375
|
+
ctx.err(`Timed out waiting for Slack setup.\n\n`);
|
|
376
|
+
ctx.err(ctx.dim(` Finish it in the browser, then re-run \`${CLI} slack create\`.\n\n`));
|
|
377
|
+
ctx.err(` ${minted.url}\n`);
|
|
362
378
|
return 1;
|
|
363
379
|
}
|
|
364
380
|
yield sleep(ctx.pollIntervalMs);
|
|
@@ -391,7 +407,8 @@ export function cmdSlackCreate(options) {
|
|
|
391
407
|
process.env[key] = value;
|
|
392
408
|
}
|
|
393
409
|
if (poll.localEnv.appToken === undefined) {
|
|
394
|
-
ctx.err(`warning: Slack did not return an app-level token, so ${target.envKeys.app} was not written
|
|
410
|
+
ctx.err(ctx.dim(`warning: Slack did not return an app-level token, so ${target.envKeys.app} was not written.\n` +
|
|
411
|
+
` Re-run \`${CLI} slack create\` to recover it.\n`));
|
|
395
412
|
}
|
|
396
413
|
let iconStatus;
|
|
397
414
|
if (poll.appId !== undefined) {
|
|
@@ -9,6 +9,8 @@ export interface InitProjectOptions {
|
|
|
9
9
|
/** Model id override written into agent.ts. */
|
|
10
10
|
model?: string;
|
|
11
11
|
templateDir?: string;
|
|
12
|
+
overlayDir?: string;
|
|
13
|
+
templateName?: string;
|
|
12
14
|
}
|
|
13
15
|
export type InitFileAction = "create" | "exist";
|
|
14
16
|
export interface InitFileEntry {
|
|
@@ -29,6 +31,7 @@ export type TemplateResolution = {
|
|
|
29
31
|
ok: true;
|
|
30
32
|
name: string;
|
|
31
33
|
dir: string;
|
|
34
|
+
overlayDir?: string;
|
|
32
35
|
} | {
|
|
33
36
|
ok: false;
|
|
34
37
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,25 +11,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
});
|
|
12
12
|
};
|
|
13
13
|
import { spawn } from "node:child_process";
|
|
14
|
-
import { existsSync,
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
15
|
import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
16
16
|
import { basename, dirname, join, relative, resolve } from "node:path";
|
|
17
17
|
import { CLI_COMMAND_NAME, PACKAGE_NAME, packageRootDir, packageVersion, } from "./distribution.js";
|
|
18
18
|
import { makePalette, stdoutPalette, } from "./terminal-style.js";
|
|
19
|
+
const TRIAGE_OVERLAYS = {
|
|
20
|
+
"triage-linear": "linear",
|
|
21
|
+
"triage-jira": "jira",
|
|
22
|
+
};
|
|
23
|
+
function canonicalTemplateName(name) {
|
|
24
|
+
return name === "triage" ? "triage-linear" : name;
|
|
25
|
+
}
|
|
19
26
|
export function availableTemplates() {
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
return readdirSync(templatesDir, { withFileTypes: true })
|
|
23
|
-
.filter((entry) => entry.isDirectory())
|
|
24
|
-
.map((entry) => entry.name)
|
|
25
|
-
.sort();
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
if (hasErrorCode(error, "ENOENT")) {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
throw error;
|
|
32
|
-
}
|
|
27
|
+
return Object.keys(TRIAGE_OVERLAYS).sort();
|
|
33
28
|
}
|
|
34
29
|
export function resolveTemplate(name) {
|
|
35
30
|
if (!/^[a-z][a-z0-9-]*$/.test(name)) {
|
|
@@ -38,20 +33,20 @@ export function resolveTemplate(name) {
|
|
|
38
33
|
message: "template name must match /^[a-z][a-z0-9-]*$/",
|
|
39
34
|
};
|
|
40
35
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
: `available: ${available.join(", ")}`;
|
|
36
|
+
const resolved = canonicalTemplateName(name);
|
|
37
|
+
const overlay = TRIAGE_OVERLAYS[resolved];
|
|
38
|
+
if (overlay !== undefined) {
|
|
39
|
+
const dir = join(packageRootDir(), "templates", "triage");
|
|
46
40
|
return {
|
|
47
|
-
ok:
|
|
48
|
-
|
|
41
|
+
ok: true,
|
|
42
|
+
name: resolved,
|
|
43
|
+
dir,
|
|
44
|
+
overlayDir: join(dir, "overlays", overlay),
|
|
49
45
|
};
|
|
50
46
|
}
|
|
51
47
|
return {
|
|
52
|
-
ok:
|
|
53
|
-
name,
|
|
54
|
-
dir: join(packageRootDir(), "templates", name),
|
|
48
|
+
ok: false,
|
|
49
|
+
message: `unknown template "${name}" (available: ${availableTemplates().join(", ")})`,
|
|
55
50
|
};
|
|
56
51
|
}
|
|
57
52
|
/**
|
|
@@ -79,6 +74,11 @@ export function checkInitTarget(rootDir, template) {
|
|
|
79
74
|
if (marker === template) {
|
|
80
75
|
return { ok: true };
|
|
81
76
|
}
|
|
77
|
+
if (marker !== undefined &&
|
|
78
|
+
template !== undefined &&
|
|
79
|
+
canonicalTemplateName(marker) === canonicalTemplateName(template)) {
|
|
80
|
+
return { ok: true };
|
|
81
|
+
}
|
|
82
82
|
if (template === undefined) {
|
|
83
83
|
return {
|
|
84
84
|
ok: false,
|
|
@@ -121,7 +121,7 @@ const SCAFFOLD_EMPTY_DIRS = [
|
|
|
121
121
|
];
|
|
122
122
|
export function initProject(options) {
|
|
123
123
|
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
-
var _a, _b;
|
|
124
|
+
var _a, _b, _c;
|
|
125
125
|
const rootDir = resolve(options.dir);
|
|
126
126
|
const projectName = basename(rootDir);
|
|
127
127
|
const name = (_a = options.name) !== null && _a !== void 0 ? _a : projectName;
|
|
@@ -145,25 +145,29 @@ export function initProject(options) {
|
|
|
145
145
|
});
|
|
146
146
|
if (options.templateDir !== undefined) {
|
|
147
147
|
const templateDir = options.templateDir;
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
148
|
+
const overlayDir = options.overlayDir;
|
|
149
|
+
const overlayPaths = overlayDir ? yield listTemplateFiles(overlayDir) : [];
|
|
150
|
+
const overlaySet = new Set(overlayPaths);
|
|
151
|
+
const corePaths = (yield listTemplateFiles(templateDir)).filter((rel) => !overlaySet.has(rel));
|
|
152
|
+
const templateName = (_c = options.templateName) !== null && _c !== void 0 ? _c : basename(templateDir);
|
|
153
|
+
for (const rel of corePaths) {
|
|
154
|
+
yield writeTemplateFile({
|
|
155
|
+
write,
|
|
156
|
+
sourceDir: templateDir,
|
|
157
|
+
rel,
|
|
158
|
+
projectName,
|
|
159
|
+
templateName,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (overlayDir !== undefined) {
|
|
163
|
+
for (const rel of overlayPaths) {
|
|
164
|
+
yield writeTemplateFile({
|
|
165
|
+
write,
|
|
166
|
+
sourceDir: overlayDir,
|
|
167
|
+
rel,
|
|
168
|
+
projectName,
|
|
169
|
+
templateName,
|
|
170
|
+
});
|
|
167
171
|
}
|
|
168
172
|
}
|
|
169
173
|
return {
|
|
@@ -268,6 +272,33 @@ export default memoryHook();
|
|
|
268
272
|
};
|
|
269
273
|
});
|
|
270
274
|
}
|
|
275
|
+
function listTemplateFiles(root) {
|
|
276
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
277
|
+
const entries = yield readdir(root, {
|
|
278
|
+
recursive: true,
|
|
279
|
+
withFileTypes: true,
|
|
280
|
+
});
|
|
281
|
+
return entries
|
|
282
|
+
.filter((entry) => entry.isFile())
|
|
283
|
+
.map((entry) => relative(root, join(entry.parentPath, entry.name)))
|
|
284
|
+
.filter((rel) => rel.split(/[\\/]/)[0] !== "overlays")
|
|
285
|
+
.sort();
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
function writeTemplateFile(input) {
|
|
289
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
290
|
+
const source = join(input.sourceDir, input.rel);
|
|
291
|
+
if (input.rel === "package.json") {
|
|
292
|
+
const packageJson = JSON.parse(yield readFile(source, "utf8"));
|
|
293
|
+
packageJson.name = input.projectName;
|
|
294
|
+
packageJson.dependencies[PACKAGE_NAME] = `^${packageVersion()}`;
|
|
295
|
+
packageJson.cursorAgentTemplate = input.templateName;
|
|
296
|
+
yield input.write(input.rel, `${JSON.stringify(packageJson, null, 2)}\n`);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
yield input.write(input.rel, yield readFile(source));
|
|
300
|
+
});
|
|
301
|
+
}
|
|
271
302
|
export function isEexist(error) {
|
|
272
303
|
return hasErrorCode(error, "EEXIST");
|
|
273
304
|
}
|
|
@@ -551,7 +582,8 @@ export function printInitGuide() {
|
|
|
551
582
|
|
|
552
583
|
Scaffold a project, then open the playground:
|
|
553
584
|
npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
|
|
554
|
-
npx ${PACKAGE_NAME} init ./my-triage --template triage #
|
|
585
|
+
npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
|
|
586
|
+
npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
|
|
555
587
|
cd ./my-agent && agent-sdk dev # or: npx ${PACKAGE_NAME} dev
|
|
556
588
|
|
|
557
589
|
Recommended loop once the project exists (from the project directory):
|
|
@@ -296,7 +296,7 @@ function mapErrorResponse(response, bodyText, context) {
|
|
|
296
296
|
case 401:
|
|
297
297
|
return new SlackProvisionApiError("The Cursor API key was rejected. Run `agent-sdk login` again or update CURSOR_API_KEY.", { status: 401 });
|
|
298
298
|
case 403:
|
|
299
|
-
return new SlackProvisionApiError(
|
|
299
|
+
return new SlackProvisionApiError(serverError !== null && serverError !== void 0 ? serverError : "Not authorized for this team", { status: 403 });
|
|
300
300
|
case 404: {
|
|
301
301
|
// Fastify's route-not-found envelope means we hit the wrong host
|
|
302
302
|
// (api2 vs api.cursor.com), not a closed gate.
|