@cursor/july 0.1.96 → 0.1.97
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 +3 -2
- package/dist/bin/agent-serve.js +14 -3
- package/dist/channels/origin/api.d.ts +15 -4
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +19 -3
- package/dist/channels/origin/binding.d.ts +11 -0
- package/dist/channels/origin/binding.d.ts.map +1 -1
- package/dist/channels/origin/binding.js +41 -25
- package/dist/channels/origin/index.d.ts +1 -0
- package/dist/channels/origin/index.d.ts.map +1 -1
- package/dist/channels/origin/index.js +1 -0
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +3 -0
- package/dist/channels/origin/reactions.d.ts +56 -0
- package/dist/channels/origin/reactions.d.ts.map +1 -0
- package/dist/channels/origin/reactions.js +67 -0
- package/dist/channels/origin/types.d.ts +11 -0
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/approvals.d.ts +16 -0
- package/dist/channels/slack/approvals.d.ts.map +1 -1
- package/dist/channels/slack/approvals.js +86 -0
- package/dist/channels/slack/cli-project.d.ts +19 -0
- package/dist/channels/slack/cli-project.d.ts.map +1 -0
- package/dist/channels/slack/cli-project.js +234 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +97 -39
- package/dist/channels/slack/init.d.ts +3 -2
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +5 -5
- package/dist/channels/slack/interactive.d.ts +2 -1
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +15 -4
- package/dist/channels/slack/manifest.d.ts +1 -1
- package/dist/channels/slack/manifest.js +1 -1
- package/dist/channels/slack/setup.d.ts +1 -1
- package/dist/channels/slack/setup.d.ts.map +1 -1
- package/dist/channels/slack/setup.js +10 -6
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +1 -0
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
- package/dist/channels/slack/tool-approval-events.js +91 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.jXleCmOc.js → app.B3rWNYE1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BU9nHdnQ.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.8LhyglIT.js → VPLocalSearchBox.C1lhqJJR.js} +1 -1
- package/dist/docs/assets/chunks/{theme.9ged-pr2.js → theme.B40_SXuv.js} +2 -2
- package/dist/docs/assets/{deployment.md.D9msOFOW.js → deployment.md.MFPKqsqI.js} +2 -2
- package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.js → guides_mcp-oauth.md.CN-6YmTJ.js} +4 -4
- package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.lean.js → guides_mcp-oauth.md.CN-6YmTJ.lean.js} +1 -1
- package/dist/docs/assets/guides_slack.md.VDXQV3ja.js +22 -0
- package/dist/docs/assets/guides_slack.md.VDXQV3ja.lean.js +1 -0
- package/dist/docs/assets/index.md.CVeRUOeZ.js +5 -0
- package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.js → reference_agent-config.md.BHeYMgme.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.CCnG-nJx.js → reference_cli.md.RyZf5OTE.js} +9 -6
- package/dist/docs/assets/{reference_cli.md.CCnG-nJx.lean.js → reference_cli.md.RyZf5OTE.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.js → reference_connections.md.DxldvyIB.js} +4 -3
- package/dist/docs/assets/{reference_http-api.md.D89k1mdm.js → reference_http-api.md.5zOAbV86.js} +1 -1
- package/dist/docs/assets/reference_sessions.md.NxFP_CAC.js +1 -0
- package/dist/docs/assets/{reference_tools.md.BHeXn2id.js → reference_tools.md.B84gw9Ii.js} +1 -1
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +2 -0
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +1 -0
- package/dist/docs/assets/troubleshooting.md.DCiPBhYs.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +7 -7
- package/dist/docs/deployment.md +5 -4
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +8 -8
- package/dist/docs/guides/mcp-oauth.md +26 -8
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +17 -33
- package/dist/docs/guides/slack.md +92 -201
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +5 -3
- package/dist/docs/llms-full.txt +299 -653
- package/dist/docs/llms.txt +2 -2
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +6 -6
- package/dist/docs/reference/agent-config.md +2 -2
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +13 -10
- package/dist/docs/reference/cli.md +38 -16
- package/dist/docs/reference/connections.html +9 -8
- package/dist/docs/reference/connections.md +6 -3
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/http-api.md +2 -1
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/sessions.md +4 -2
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +6 -6
- package/dist/docs/reference/tools.md +9 -2
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +28 -0
- package/dist/docs/templates/agents-md.md +105 -0
- package/dist/docs/templates/code-wiki.html +5 -5
- package/dist/docs/templates/demo.html +4 -4
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +5 -5
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/docs/troubleshooting.md +2 -2
- package/dist/evals/run-facts.d.ts.map +1 -1
- package/dist/evals/run-facts.js +27 -0
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +15 -9
- package/dist/internal/approval-gate.d.ts +12 -13
- package/dist/internal/approval-gate.d.ts.map +1 -1
- package/dist/internal/approval-gate.js +16 -21
- package/dist/internal/chat-client.js +10 -0
- package/dist/internal/cli-deploy.d.ts +5 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +50 -17
- package/dist/internal/cli-mcp-oauth.js +8 -18
- package/dist/internal/cli-slack-manual.d.ts +24 -2
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +251 -20
- package/dist/internal/cli-slack.d.ts +9 -2
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +29 -82
- package/dist/internal/cursor/account-mcp.d.ts +1 -0
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +17 -0
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/deploy-client.d.ts +17 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +31 -10
- package/dist/internal/env-file.d.ts +19 -0
- package/dist/internal/env-file.d.ts.map +1 -0
- package/dist/internal/env-file.js +90 -0
- package/dist/internal/framework-file-storage.d.ts +1 -1
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +6 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +7 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +7 -0
- package/dist/internal/hosted-delivery.d.ts +6 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +63 -22
- package/dist/internal/hosted-execution-diag.d.ts +48 -0
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -0
- package/dist/internal/hosted-execution-diag.js +150 -0
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +81 -1
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +2 -0
- package/dist/internal/logs-client.d.ts +5 -0
- package/dist/internal/logs-client.d.ts.map +1 -1
- package/dist/internal/logs-client.js +5 -0
- package/dist/internal/mcp-endpoint.js +2 -3
- package/dist/internal/mcp-host.d.ts +10 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +57 -8
- package/dist/internal/mcp-oauth-on-demand.d.ts +68 -0
- package/dist/internal/mcp-oauth-on-demand.d.ts.map +1 -0
- package/dist/internal/mcp-oauth-on-demand.js +287 -0
- package/dist/internal/mcp-oauth-persist.d.ts +42 -0
- package/dist/internal/mcp-oauth-persist.d.ts.map +1 -0
- package/dist/internal/mcp-oauth-persist.js +92 -0
- package/dist/internal/mcp-oauth.d.ts +1 -0
- package/dist/internal/mcp-oauth.d.ts.map +1 -1
- package/dist/internal/mcp-oauth.js +10 -2
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +22 -9
- package/dist/internal/server.d.ts +3 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +49 -22
- package/dist/internal/session-engine.d.ts +88 -3
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +515 -43
- package/dist/internal/sessions-client.d.ts +9 -7
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +3 -1
- package/dist/internal/storage-coordinator.d.ts +7 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +28 -5
- package/dist/internal/storage-roles.d.ts +5 -0
- package/dist/internal/storage-roles.d.ts.map +1 -1
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +10 -0
- package/dist/internal/tool-policy.d.ts +9 -1
- package/dist/internal/tool-policy.d.ts.map +1 -1
- package/dist/internal/tool-policy.js +13 -0
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +10 -0
- package/dist/internal/turn-outbox.d.ts +24 -0
- package/dist/internal/turn-outbox.d.ts.map +1 -0
- package/dist/internal/turn-outbox.js +80 -0
- package/dist/playground/assets/{index-Cx9CclK_.js → index-DrkI6y5O.js} +45 -45
- package/dist/playground/assets/index-DzNGwm7q.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +1 -1
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +12 -0
- package/dist/storage.d.ts +8 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/types.d.ts +63 -7
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +5 -3
- package/docs/deployment.md +5 -4
- package/docs/guides/mcp-oauth.md +26 -8
- package/docs/guides/slack.md +93 -202
- package/docs/reference/agent-config.md +2 -2
- package/docs/reference/cli.md +38 -16
- package/docs/reference/connections.md +6 -3
- package/docs/reference/http-api.md +2 -1
- package/docs/reference/sessions.md +4 -2
- package/docs/reference/tools.md +9 -2
- package/docs/templates/agents-md.md +110 -0
- package/docs/troubleshooting.md +2 -2
- package/package.json +1 -1
- package/skills/create-agent/SKILL.md +2 -1
- package/skills/mcp-auth/SKILL.md +6 -3
- package/skills/setup-slack/SKILL.md +23 -13
- package/src/bin/agent-serve.ts +13 -1
- package/src/channels/origin/api.ts +24 -5
- package/src/channels/origin/binding.ts +55 -26
- package/src/channels/origin/index.ts +1 -0
- package/src/channels/origin/origin-channel.ts +4 -0
- package/src/channels/origin/reactions.ts +82 -0
- package/src/channels/origin/types.ts +11 -0
- package/src/channels/slack/approvals.ts +105 -0
- package/src/channels/slack/cli-project.ts +267 -0
- package/src/channels/slack/defaults.ts +109 -46
- package/src/channels/slack/init.ts +10 -5
- package/src/channels/slack/interactive.ts +35 -9
- package/src/channels/slack/manifest.ts +1 -1
- package/src/channels/slack/setup.ts +10 -6
- package/src/channels/slack/slack-channel.ts +1 -0
- package/src/channels/slack/tool-approval-events.ts +93 -0
- package/src/evals/run-facts.ts +32 -0
- package/src/internal/advertise-tools.ts +31 -10
- package/src/internal/approval-gate.ts +20 -29
- package/src/internal/chat-client.ts +19 -0
- package/src/internal/cli-deploy.ts +79 -9
- package/src/internal/cli-mcp-oauth.ts +7 -21
- package/src/internal/cli-slack-manual.ts +350 -18
- package/src/internal/cli-slack.ts +40 -84
- package/src/internal/cursor/account-mcp.ts +21 -0
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/deploy-client.ts +43 -0
- package/src/internal/env-file.ts +84 -0
- package/src/internal/framework-file-storage.ts +7 -1
- package/src/internal/hosted-delivery-protocol.ts +7 -0
- package/src/internal/hosted-delivery.ts +100 -27
- package/src/internal/hosted-execution-diag.ts +207 -0
- package/src/internal/http-channel.ts +99 -0
- package/src/internal/init-project.ts +2 -0
- package/src/internal/logs-client.ts +5 -0
- package/src/internal/mcp-endpoint.ts +13 -4
- package/src/internal/mcp-host.ts +77 -11
- package/src/internal/mcp-oauth-on-demand.ts +352 -0
- package/src/internal/mcp-oauth-persist.ts +127 -0
- package/src/internal/mcp-oauth.ts +17 -1
- package/src/internal/otel/collector.ts +30 -0
- package/src/internal/server.ts +59 -9
- package/src/internal/session-engine.ts +659 -56
- package/src/internal/sessions-client.ts +17 -8
- package/src/internal/storage-coordinator.ts +38 -8
- package/src/internal/storage-roles.ts +7 -0
- package/src/internal/stream-progress.ts +19 -0
- package/src/internal/tool-policy.ts +18 -0
- package/src/internal/trajectory.ts +10 -0
- package/src/internal/turn-outbox.ts +85 -0
- package/src/storage-backends/cursor-hosted.ts +13 -1
- package/src/storage.ts +12 -0
- package/src/types.ts +68 -8
- package/templates/agents-md/README.md +39 -0
- package/templates/agents-md/agent/agent.ts +8 -0
- package/templates/agents-md/agent/channels/github.ts +10 -0
- package/templates/agents-md/agent/channels/queue.ts +28 -0
- package/templates/agents-md/agent/channels/slack.ts +9 -0
- package/templates/agents-md/agent/instructions.md +39 -0
- package/templates/agents-md/agent/lib/collect.ts +439 -0
- package/templates/agents-md/agent/lib/config.ts +8 -0
- package/templates/agents-md/agent/lib/paths.ts +51 -0
- package/templates/agents-md/agent/schedules/weekly.ts +17 -0
- package/templates/agents-md/agent/tools/apply_agents.ts +226 -0
- package/templates/agents-md/evals/agents.eval.ts +135 -0
- package/templates/agents-md/evals/evals.config.ts +5 -0
- package/templates/agents-md/init.json +38 -0
- package/templates/agents-md/package.json +18 -0
- package/templates/agents-md/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +0 -1
- package/dist/docs/assets/guides_slack.md.C32HsdKk.js +0 -38
- package/dist/docs/assets/guides_slack.md.C32HsdKk.lean.js +0 -1
- package/dist/docs/assets/index.md.CI93Ltlb.js +0 -5
- package/dist/docs/assets/reference_sessions.md.D0mIh4KK.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Ctv3T8C2.js +0 -1
- package/dist/docs/design/agsh.md +0 -406
- package/dist/playground/assets/index-B1DDvBeC.css +0 -1
- package/docs/design/agsh.md +0 -406
- /package/dist/docs/assets/{deployment.md.D9msOFOW.lean.js → deployment.md.MFPKqsqI.lean.js} +0 -0
- /package/dist/docs/assets/{index.md.CI93Ltlb.lean.js → index.md.CVeRUOeZ.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.lean.js → reference_agent-config.md.BHeYMgme.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.lean.js → reference_connections.md.DxldvyIB.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.D89k1mdm.lean.js → reference_http-api.md.5zOAbV86.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.D0mIh4KK.lean.js → reference_sessions.md.NxFP_CAC.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.BHeXn2id.lean.js → reference_tools.md.B84gw9Ii.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.Ctv3T8C2.lean.js → troubleshooting.md.DCiPBhYs.lean.js} +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `slack init --manual` and `slack manifest` —
|
|
3
|
-
*
|
|
2
|
+
* `slack init --manual` and `slack manifest` — unmanaged Slack app.
|
|
3
|
+
* Slack CLI create+install when `~/.slack/bin/slack` is present;
|
|
4
|
+
* paste-at-api.slack.com is the fallback. Create/destroy/icon stay
|
|
5
|
+
* in `cli-slack.ts`.
|
|
4
6
|
*/
|
|
5
7
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
6
8
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -11,18 +13,75 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
13
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
12
14
|
});
|
|
13
15
|
};
|
|
14
|
-
import {
|
|
16
|
+
import { execFile } from "node:child_process";
|
|
17
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
15
18
|
import { basename, join, resolve as resolvePath } from "node:path";
|
|
19
|
+
import { promisify } from "node:util";
|
|
20
|
+
import { detectSlackCli, parseSlackAuthTeams, readSlackCliAppId, SLACK_CLI_HOME_BIN, } from "../channels/slack/cli-project.js";
|
|
16
21
|
import { buildSlackManifestPair, initSlackManual, slackManifestFileEntries, } from "../channels/slack/index.js";
|
|
17
22
|
import { describeError } from "./describe-error.js";
|
|
18
23
|
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
24
|
+
import { ensureEnvLocalGitignored, upsertEnvFile } from "./env-file.js";
|
|
25
|
+
const execFileAsync = promisify(execFile);
|
|
19
26
|
function errStream(options) {
|
|
20
27
|
var _a;
|
|
21
28
|
return (_a = options.err) !== null && _a !== void 0 ? _a : ((text) => void process.stderr.write(text));
|
|
22
29
|
}
|
|
30
|
+
function afterDoctor(prefix) {
|
|
31
|
+
return [
|
|
32
|
+
prefix === undefined
|
|
33
|
+
? `${CLI} slack doctor`
|
|
34
|
+
: `${CLI} slack doctor --prefix ${prefix}`,
|
|
35
|
+
`${CLI} serve --dir . --dev`,
|
|
36
|
+
`${CLI} slack setup`,
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
function slackCliEnvironment(prod) {
|
|
40
|
+
return prod === true ? "deployed" : "local";
|
|
41
|
+
}
|
|
42
|
+
function slackAppSettingsUrl(appId) {
|
|
43
|
+
return appId === undefined
|
|
44
|
+
? "https://api.slack.com/apps"
|
|
45
|
+
: `https://api.slack.com/apps/${appId}`;
|
|
46
|
+
}
|
|
47
|
+
function pasteNext(envKeys, options) {
|
|
48
|
+
return [
|
|
49
|
+
"Ask the user to install this Slack app on their workspace",
|
|
50
|
+
`Open ${slackAppSettingsUrl()} → Create from manifest`,
|
|
51
|
+
"Import .slack/manifest.dev.json (then prod)",
|
|
52
|
+
`Install apps; set ${envKeys.bot} + ${envKeys.app}`,
|
|
53
|
+
`Or install Slack CLI to ~/${SLACK_CLI_HOME_BIN}, then slack app install --environment ${options.environment} --team <T> --force`,
|
|
54
|
+
...afterDoctor(options.prefix),
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
function cliNext(cli, envKeys, options) {
|
|
58
|
+
var _a;
|
|
59
|
+
const workspace = (_a = options.team) !== null && _a !== void 0 ? _a : "<T>";
|
|
60
|
+
return [
|
|
61
|
+
"Ask the user to install this Slack app on their workspace",
|
|
62
|
+
`${cli} login --no-prompt`,
|
|
63
|
+
`In Slack send /slackauthticket <ticket>; then ${cli} login --ticket <ticket> --challenge <code>`,
|
|
64
|
+
`${cli} app install --environment ${options.environment} --team ${workspace} --force`,
|
|
65
|
+
`Copy xoxb + xapp (connections:write) from ${slackAppSettingsUrl()} into .env.local as ${envKeys.bot} + ${envKeys.app}`,
|
|
66
|
+
`Fallback: paste .slack/manifest.dev.json at ${slackAppSettingsUrl()}`,
|
|
67
|
+
...afterDoctor(options.prefix),
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
function installedNext(install, envKeys, prefix) {
|
|
71
|
+
const settings = slackAppSettingsUrl(install.appId);
|
|
72
|
+
const next = [];
|
|
73
|
+
if (!install.tokens.bot) {
|
|
74
|
+
next.push(`Copy the bot token (xoxb-...) from ${settings} into ${envKeys.bot}`);
|
|
75
|
+
}
|
|
76
|
+
if (!install.tokens.app) {
|
|
77
|
+
next.push(`Mint an app-level token with connections:write at ${settings}; set ${envKeys.app}`);
|
|
78
|
+
}
|
|
79
|
+
next.push(...afterDoctor(prefix));
|
|
80
|
+
return next;
|
|
81
|
+
}
|
|
23
82
|
export function cmdSlackInit(options) {
|
|
24
83
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
var _a, _b;
|
|
84
|
+
var _a, _b, _c, _d, _e;
|
|
26
85
|
if (options.manual !== true) {
|
|
27
86
|
errStream(options)(`\`slack init\` without --manual is not the first-run path. Socket Mode apps are created with:
|
|
28
87
|
|
|
@@ -30,7 +89,7 @@ export function cmdSlackInit(options) {
|
|
|
30
89
|
|
|
31
90
|
That opens the Cursor dashboard wizard.
|
|
32
91
|
|
|
33
|
-
To install a custom Slack app from a manifest (api.slack.com):
|
|
92
|
+
To install a custom Slack app from a manifest (Slack CLI or api.slack.com):
|
|
34
93
|
|
|
35
94
|
${CLI} slack init --manual --dir .
|
|
36
95
|
`);
|
|
@@ -38,6 +97,7 @@ To install a custom Slack app from a manifest (api.slack.com):
|
|
|
38
97
|
}
|
|
39
98
|
const dir = resolvePath(options.dir);
|
|
40
99
|
const out = (_a = options.out) !== null && _a !== void 0 ? _a : ((text) => void process.stdout.write(text));
|
|
100
|
+
const err = errStream(options);
|
|
41
101
|
try {
|
|
42
102
|
const result = yield initSlackManual({
|
|
43
103
|
dir,
|
|
@@ -45,27 +105,53 @@ To install a custom Slack app from a manifest (api.slack.com):
|
|
|
45
105
|
envPrefix: options.noPrefix === true ? "" : options.prefix,
|
|
46
106
|
channelPosts: options.channelPosts,
|
|
47
107
|
});
|
|
108
|
+
const cli = ((_b = options.detectSlackCli) !== null && _b !== void 0 ? _b : detectSlackCli)();
|
|
109
|
+
const skipInstall = options.noInstall === true;
|
|
110
|
+
const requireInstall = options.install === true && !skipInstall;
|
|
111
|
+
let install;
|
|
112
|
+
if (!skipInstall && cli !== undefined) {
|
|
113
|
+
install = yield installSlackApp({
|
|
114
|
+
dir: result.rootDir,
|
|
115
|
+
bin: cli,
|
|
116
|
+
envKeys: result.envKeys,
|
|
117
|
+
environment: slackCliEnvironment(options.prod),
|
|
118
|
+
team: options.slackTeam,
|
|
119
|
+
exec: options.runSlackCli,
|
|
120
|
+
});
|
|
121
|
+
if (!install.ok && requireInstall) {
|
|
122
|
+
err(`${(_c = install.error) !== null && _c !== void 0 ? _c : "slack app install failed"}\n`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (requireInstall) {
|
|
126
|
+
err(`Slack CLI not found (~/${SLACK_CLI_HOME_BIN}). Install it or omit --install and paste at api.slack.com.\n`);
|
|
127
|
+
}
|
|
128
|
+
const ok = !requireInstall || (install === null || install === void 0 ? void 0 : install.ok) === true;
|
|
129
|
+
const next = (install === null || install === void 0 ? void 0 : install.ok) === true
|
|
130
|
+
? installedNext(install, result.envKeys, result.envPrefix)
|
|
131
|
+
: cli !== undefined
|
|
132
|
+
? cliNext(cli, result.envKeys, {
|
|
133
|
+
team: (_d = install === null || install === void 0 ? void 0 : install.team) !== null && _d !== void 0 ? _d : options.slackTeam,
|
|
134
|
+
environment: slackCliEnvironment(options.prod),
|
|
135
|
+
prefix: result.envPrefix,
|
|
136
|
+
})
|
|
137
|
+
: pasteNext(result.envKeys, {
|
|
138
|
+
environment: slackCliEnvironment(options.prod),
|
|
139
|
+
prefix: result.envPrefix,
|
|
140
|
+
});
|
|
48
141
|
out(`${JSON.stringify({
|
|
49
|
-
ok
|
|
142
|
+
ok,
|
|
50
143
|
directory: result.rootDir,
|
|
51
144
|
created: result.files,
|
|
52
|
-
envPrefix: (
|
|
145
|
+
envPrefix: (_e = result.envPrefix) !== null && _e !== void 0 ? _e : null,
|
|
53
146
|
envKeys: result.envKeys,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
`Install apps; set ${result.envKeys.bot} + ${result.envKeys.app}`,
|
|
58
|
-
result.envPrefix === undefined
|
|
59
|
-
? `${CLI} slack doctor`
|
|
60
|
-
: `${CLI} slack doctor --prefix ${result.envPrefix}`,
|
|
61
|
-
`${CLI} serve --dir . --dev`,
|
|
62
|
-
`${CLI} slack setup`,
|
|
63
|
-
],
|
|
147
|
+
cli: cli !== null && cli !== void 0 ? cli : null,
|
|
148
|
+
install: install !== null && install !== void 0 ? install : null,
|
|
149
|
+
next,
|
|
64
150
|
}, null, 2)}\n`);
|
|
65
|
-
return 0;
|
|
151
|
+
return ok ? 0 : 1;
|
|
66
152
|
}
|
|
67
153
|
catch (error) {
|
|
68
|
-
|
|
154
|
+
err(`${describeError(error)}\n`);
|
|
69
155
|
return 1;
|
|
70
156
|
}
|
|
71
157
|
});
|
|
@@ -92,7 +178,7 @@ export function runSlackManifest(options) {
|
|
|
92
178
|
}
|
|
93
179
|
return 0;
|
|
94
180
|
}
|
|
95
|
-
const outDir = join(dir, ".
|
|
181
|
+
const outDir = join(dir, ".slack");
|
|
96
182
|
yield mkdir(outDir, { recursive: true });
|
|
97
183
|
const written = [];
|
|
98
184
|
for (const file of slackManifestFileEntries(pair, env)) {
|
|
@@ -104,3 +190,148 @@ export function runSlackManifest(options) {
|
|
|
104
190
|
return 0;
|
|
105
191
|
});
|
|
106
192
|
}
|
|
193
|
+
function parseEnvAssignments(text) {
|
|
194
|
+
const out = {};
|
|
195
|
+
for (const line of text.split(/\r?\n/)) {
|
|
196
|
+
const trimmed = line.trim();
|
|
197
|
+
if (trimmed === "" || trimmed.startsWith("#")) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const raw = trimmed.startsWith("export ") ? trimmed.slice(7) : trimmed;
|
|
201
|
+
const eq = raw.indexOf("=");
|
|
202
|
+
if (eq <= 0) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
out[raw.slice(0, eq)] = raw.slice(eq + 1);
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
function readDotenv(dir) {
|
|
210
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
211
|
+
return parseEnvAssignments(yield readFile(join(dir, ".env"), "utf8").catch(() => ""));
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function newToken(before, after, prefix) {
|
|
215
|
+
if (after === undefined || !after.startsWith(prefix) || after === before) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
return after;
|
|
219
|
+
}
|
|
220
|
+
function copySlackCliTokensToLocalEnv(options) {
|
|
221
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
222
|
+
const after = yield readDotenv(options.dir);
|
|
223
|
+
const bot = newToken(options.before.SLACK_BOT_TOKEN, after.SLACK_BOT_TOKEN, "xoxb-");
|
|
224
|
+
const app = newToken(options.before.SLACK_APP_TOKEN, after.SLACK_APP_TOKEN, "xapp-");
|
|
225
|
+
const entries = [];
|
|
226
|
+
const wrote = { bot: false, app: false };
|
|
227
|
+
if (bot !== undefined) {
|
|
228
|
+
entries.push({ key: options.envKeys.bot, value: bot });
|
|
229
|
+
wrote.bot = true;
|
|
230
|
+
}
|
|
231
|
+
if (app !== undefined) {
|
|
232
|
+
entries.push({ key: options.envKeys.app, value: app });
|
|
233
|
+
wrote.app = true;
|
|
234
|
+
}
|
|
235
|
+
if (entries.length === 0) {
|
|
236
|
+
return wrote;
|
|
237
|
+
}
|
|
238
|
+
yield upsertEnvFile(join(options.dir, ".env.local"), entries);
|
|
239
|
+
yield ensureEnvLocalGitignored(options.dir);
|
|
240
|
+
return wrote;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
function installSlackApp(options) {
|
|
244
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
245
|
+
var _a;
|
|
246
|
+
const exec = (_a = options.exec) !== null && _a !== void 0 ? _a : defaultSlackCliExec;
|
|
247
|
+
const auth = yield exec({
|
|
248
|
+
bin: options.bin,
|
|
249
|
+
argv: ["auth", "list"],
|
|
250
|
+
cwd: options.dir,
|
|
251
|
+
});
|
|
252
|
+
const teams = parseSlackAuthTeams(`${auth.stdout}\n${auth.stderr}`);
|
|
253
|
+
if (teams.length === 0) {
|
|
254
|
+
return {
|
|
255
|
+
ok: false,
|
|
256
|
+
environment: options.environment,
|
|
257
|
+
error: "Slack CLI is not logged in. Run slack login --no-prompt.",
|
|
258
|
+
tokens: { bot: false, app: false },
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
let team = options.team;
|
|
262
|
+
if (team === undefined) {
|
|
263
|
+
if (teams.length > 1) {
|
|
264
|
+
return {
|
|
265
|
+
ok: false,
|
|
266
|
+
environment: options.environment,
|
|
267
|
+
error: `Multiple Slack CLI teams (${teams.join(", ")}). Pass --slack-team.`,
|
|
268
|
+
tokens: { bot: false, app: false },
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
team = teams[0];
|
|
272
|
+
}
|
|
273
|
+
const before = yield readDotenv(options.dir);
|
|
274
|
+
const installed = yield exec({
|
|
275
|
+
bin: options.bin,
|
|
276
|
+
argv: [
|
|
277
|
+
"app",
|
|
278
|
+
"install",
|
|
279
|
+
"--environment",
|
|
280
|
+
options.environment,
|
|
281
|
+
"--force",
|
|
282
|
+
"--team",
|
|
283
|
+
team,
|
|
284
|
+
],
|
|
285
|
+
cwd: options.dir,
|
|
286
|
+
env: Object.assign(Object.assign({}, process.env), { SLACK_ENV: options.environment }),
|
|
287
|
+
});
|
|
288
|
+
if (installed.code !== 0) {
|
|
289
|
+
const detail = installed.stderr.trim() || installed.stdout.trim();
|
|
290
|
+
return {
|
|
291
|
+
ok: false,
|
|
292
|
+
environment: options.environment,
|
|
293
|
+
team,
|
|
294
|
+
error: detail === "" ? `slack app install exited ${installed.code}` : detail,
|
|
295
|
+
tokens: { bot: false, app: false },
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
yield writeFile(join(options.dir, ".slack/cli-environment"), `${options.environment}\n`);
|
|
299
|
+
const appId = yield readSlackCliAppId(options.dir, options.environment, team);
|
|
300
|
+
const tokens = yield copySlackCliTokensToLocalEnv({
|
|
301
|
+
dir: options.dir,
|
|
302
|
+
envKeys: options.envKeys,
|
|
303
|
+
before,
|
|
304
|
+
});
|
|
305
|
+
return {
|
|
306
|
+
ok: true,
|
|
307
|
+
environment: options.environment,
|
|
308
|
+
team,
|
|
309
|
+
appId,
|
|
310
|
+
tokens,
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
function defaultSlackCliExec(request) {
|
|
315
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
316
|
+
var _a, _b;
|
|
317
|
+
try {
|
|
318
|
+
const { stdout, stderr } = yield execFileAsync(request.bin, request.argv, {
|
|
319
|
+
cwd: request.cwd,
|
|
320
|
+
env: request.env,
|
|
321
|
+
timeout: 120000,
|
|
322
|
+
});
|
|
323
|
+
return { code: 0, stdout, stderr };
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
if (!(error instanceof Error)) {
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
329
|
+
const execError = error;
|
|
330
|
+
return {
|
|
331
|
+
code: typeof execError.code === "number" ? execError.code : 1,
|
|
332
|
+
stdout: (_a = execError.stdout) !== null && _a !== void 0 ? _a : "",
|
|
333
|
+
stderr: (_b = execError.stderr) !== null && _b !== void 0 ? _b : execError.message,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `agent-serve slack …` CLI — doctor, destroy/icon, `create` as a
|
|
3
3
|
* dashboard-wizard launcher (`slack-provision-client.ts`), and
|
|
4
|
-
* `init --manual` for
|
|
4
|
+
* `init --manual` for Slack CLI / paste-at-api.slack.com manifests.
|
|
5
5
|
*/
|
|
6
6
|
import { runSlackDoctor } from "../channels/slack/index.js";
|
|
7
|
+
import { type SlackCliExec } from "./cli-slack-manual.js";
|
|
7
8
|
import { type TerminalPalette } from "./terminal-style.js";
|
|
8
9
|
export interface SlackCliOptions {
|
|
9
10
|
dir: string;
|
|
@@ -29,8 +30,14 @@ export interface SlackCliOptions {
|
|
|
29
30
|
icon?: string;
|
|
30
31
|
/** create: accepted for compatibility; live-app updates always overwrite. */
|
|
31
32
|
force?: boolean;
|
|
32
|
-
/** `slack init --manual`:
|
|
33
|
+
/** `slack init --manual`: Slack CLI project + paste fallback. */
|
|
33
34
|
manual?: boolean;
|
|
35
|
+
/** `slack init --manual`: require Slack CLI install. */
|
|
36
|
+
install?: boolean;
|
|
37
|
+
/** `slack init --manual`: skip Slack CLI install. */
|
|
38
|
+
noInstall?: boolean;
|
|
39
|
+
detectSlackCli?: () => string | undefined;
|
|
40
|
+
runSlackCli?: SlackCliExec;
|
|
34
41
|
/** `slack icon <source>` positional (same URL-or-file forms as --icon). */
|
|
35
42
|
iconSource?: string;
|
|
36
43
|
/** doctor: watched channel ids (`C…`) to verify visibility/membership. */
|
|
@@ -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;AAEpC,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAoB/B,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,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,EAAE,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;AAmDD,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AA6RD,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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `agent-serve slack …` CLI — doctor, destroy/icon, `create` as a
|
|
3
3
|
* dashboard-wizard launcher (`slack-provision-client.ts`), and
|
|
4
|
-
* `init --manual` for
|
|
4
|
+
* `init --manual` for Slack CLI / paste-at-api.slack.com manifests.
|
|
5
5
|
*/
|
|
6
6
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
7
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -12,16 +12,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
12
12
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
13
|
});
|
|
14
14
|
};
|
|
15
|
-
import { access,
|
|
15
|
+
import { access, readFile } from "node:fs/promises";
|
|
16
16
|
import { basename, extname, join, resolve as resolvePath } from "node:path";
|
|
17
17
|
import { envPrefixFromName, formatSlackSetupGuide, initSlackChannel, runSlackDoctor, slackEnvKeys, } from "../channels/slack/index.js";
|
|
18
18
|
import { resolveDeployAuth } from "./cli-deploy.js";
|
|
19
|
-
import { cmdSlackInit, runSlackManifest } from "./cli-slack-manual.js";
|
|
19
|
+
import { cmdSlackInit, runSlackManifest, } from "./cli-slack-manual.js";
|
|
20
20
|
import { cursorExternalApiUrl } from "./cursor/credentials.js";
|
|
21
21
|
import { slugFromDirectoryName } from "./deploy-client.js";
|
|
22
22
|
import { inferDeployGitSource } from "./deploy-source.js";
|
|
23
23
|
import { describeError } from "./describe-error.js";
|
|
24
24
|
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
25
|
+
import { ensureEnvLocalGitignored, upsertEnvFile } from "./env-file.js";
|
|
25
26
|
import { loadAgentLocalEnv } from "./local-env.js";
|
|
26
27
|
import { openBrowser } from "./open-browser.js";
|
|
27
28
|
import { AgentServeSlackClient, SlackProvisionApiError, } from "./slack-provision-client.js";
|
|
@@ -39,6 +40,8 @@ Usage:
|
|
|
39
40
|
[--prod] [--team <id>] [--json]
|
|
40
41
|
${CLI} slack init --manual [--dir .] [--name NAME]
|
|
41
42
|
[--prefix PREFIX | --no-prefix] [--channel-posts]
|
|
43
|
+
[--install | --no-install]
|
|
44
|
+
[--slack-team T0123ABCD] [--prod]
|
|
42
45
|
${CLI} slack manifest --env dev|prod|both [--dir .] [--name NAME]
|
|
43
46
|
[--print]
|
|
44
47
|
${CLI} slack doctor [--dir .] [--prefix PREFIX | --no-prefix] [--json]
|
|
@@ -56,8 +59,13 @@ create/destroy/icon — dedicated Socket Mode app via the Cursor dashboard:
|
|
|
56
59
|
png/jpg/gif file (at most 512KB).
|
|
57
60
|
|
|
58
61
|
\`slack init\` without --manual is not the first-run path. Use \`slack create\`.
|
|
59
|
-
\`slack init --manual\` writes the channel file, manifests
|
|
60
|
-
|
|
62
|
+
\`slack init --manual\` writes the channel file, manifests, a Slack CLI
|
|
63
|
+
\`.slack/\` project (get-manifest → those JSON files), env.example, and
|
|
64
|
+
setup-status.json. When \`~/.slack/bin/slack\` is logged in, it installs
|
|
65
|
+
the app. Otherwise \`next\` asks the user to install it. \`--install\`
|
|
66
|
+
requires that install. \`--no-install\` skips it. \`--prod\` selects the
|
|
67
|
+
deployed app. Paste at api.slack.com is the fallback. Do not
|
|
68
|
+
\`slack deploy\`.
|
|
61
69
|
|
|
62
70
|
Env tokens:
|
|
63
71
|
single agent: SLACK_BOT_TOKEN + SLACK_APP_TOKEN
|
|
@@ -86,7 +94,22 @@ export function cmdSlack(subcommand, options) {
|
|
|
86
94
|
case "icon":
|
|
87
95
|
return cmdSlackIcon(options);
|
|
88
96
|
case "init":
|
|
89
|
-
return cmdSlackInit(
|
|
97
|
+
return cmdSlackInit({
|
|
98
|
+
dir: options.dir,
|
|
99
|
+
name: options.name,
|
|
100
|
+
prefix: options.prefix,
|
|
101
|
+
noPrefix: options.noPrefix,
|
|
102
|
+
channelPosts: options.channelPosts,
|
|
103
|
+
manual: options.manual,
|
|
104
|
+
install: options.install,
|
|
105
|
+
noInstall: options.noInstall,
|
|
106
|
+
slackTeam: options.slackTeam,
|
|
107
|
+
detectSlackCli: options.detectSlackCli,
|
|
108
|
+
runSlackCli: options.runSlackCli,
|
|
109
|
+
prod: options.prod,
|
|
110
|
+
out: options.out,
|
|
111
|
+
err: options.err,
|
|
112
|
+
});
|
|
90
113
|
case "manifest":
|
|
91
114
|
return runSlackManifest(options);
|
|
92
115
|
case "doctor":
|
|
@@ -606,82 +629,6 @@ function scaffoldSlackChannelFiles(target) {
|
|
|
606
629
|
}
|
|
607
630
|
});
|
|
608
631
|
}
|
|
609
|
-
/**
|
|
610
|
-
* Append `KEY=value` lines to an env file, replacing every existing line
|
|
611
|
-
* for the same key instead of appending duplicates. Creates the file when
|
|
612
|
-
* missing.
|
|
613
|
-
*/
|
|
614
|
-
function upsertEnvFile(path, entries) {
|
|
615
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
616
|
-
var _a;
|
|
617
|
-
let existing = "";
|
|
618
|
-
try {
|
|
619
|
-
existing = yield readFile(path, "utf8");
|
|
620
|
-
}
|
|
621
|
-
catch (error) {
|
|
622
|
-
if (!isErrnoException(error) || error.code !== "ENOENT") {
|
|
623
|
-
throw error;
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
const lines = existing === "" ? [] : existing.replace(/\r?\n$/, "").split(/\r?\n/);
|
|
627
|
-
// A stale `export KEY=…` line would shadow or duplicate the bare line
|
|
628
|
-
// under some loaders; treat both spellings as the same entry.
|
|
629
|
-
const matchesKey = (line, key) => line.startsWith(`${key}=`) || line.startsWith(`export ${key}=`);
|
|
630
|
-
for (const { key, value } of entries) {
|
|
631
|
-
const next = `${key}=${value}`;
|
|
632
|
-
let replaced = false;
|
|
633
|
-
for (let i = 0; i < lines.length;) {
|
|
634
|
-
if (!matchesKey((_a = lines[i]) !== null && _a !== void 0 ? _a : "", key)) {
|
|
635
|
-
i += 1;
|
|
636
|
-
continue;
|
|
637
|
-
}
|
|
638
|
-
if (replaced) {
|
|
639
|
-
lines.splice(i, 1);
|
|
640
|
-
continue;
|
|
641
|
-
}
|
|
642
|
-
lines[i] = next;
|
|
643
|
-
replaced = true;
|
|
644
|
-
i += 1;
|
|
645
|
-
}
|
|
646
|
-
if (!replaced) {
|
|
647
|
-
lines.push(next);
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
// writeFile's mode only applies on create; clamp pre-existing files too.
|
|
651
|
-
yield writeFile(path, `${lines.join("\n")}\n`, { mode: 0o600 });
|
|
652
|
-
yield chmod(path, 0o600);
|
|
653
|
-
});
|
|
654
|
-
}
|
|
655
|
-
/**
|
|
656
|
-
* Ensure the agent directory's .gitignore covers .env.local (create or
|
|
657
|
-
* append). A bare `.env` line does not count — that pattern matches only
|
|
658
|
-
* the file literally named .env.
|
|
659
|
-
*/
|
|
660
|
-
function ensureEnvLocalGitignored(dir) {
|
|
661
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
662
|
-
const path = join(dir, ".gitignore");
|
|
663
|
-
let existing = "";
|
|
664
|
-
try {
|
|
665
|
-
existing = yield readFile(path, "utf8");
|
|
666
|
-
}
|
|
667
|
-
catch (error) {
|
|
668
|
-
if (!isErrnoException(error) || error.code !== "ENOENT") {
|
|
669
|
-
throw error;
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
const covered = existing
|
|
673
|
-
.split(/\r?\n/)
|
|
674
|
-
.some((line) => /^\.env(\.local\*?|\.\*|\*)$/.test(line.trim()));
|
|
675
|
-
if (covered) {
|
|
676
|
-
return false;
|
|
677
|
-
}
|
|
678
|
-
const next = existing === "" || existing.endsWith("\n")
|
|
679
|
-
? `${existing}.env.local\n`
|
|
680
|
-
: `${existing}\n.env.local\n`;
|
|
681
|
-
yield writeFile(path, next);
|
|
682
|
-
return true;
|
|
683
|
-
});
|
|
684
|
-
}
|
|
685
632
|
function renderDoctorReport(result) {
|
|
686
633
|
var _a;
|
|
687
634
|
let text = `env: ${result.envKeys.bot} / ${result.envKeys.app}\n`;
|
|
@@ -93,6 +93,7 @@ export declare class CursorAccountMcpBridge {
|
|
|
93
93
|
* Returns a promise that settles when every ref's log lines are written —
|
|
94
94
|
* callers may ignore it; tests can await it.
|
|
95
95
|
*/
|
|
96
|
+
probeAuthUrl(ref: CursorAccountConnectionRef): Promise<string | undefined>;
|
|
96
97
|
logPreflight(refs: CursorAccountConnectionRef[]): Promise<void>;
|
|
97
98
|
private runPreflight;
|
|
98
99
|
private buildServer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-mcp.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/account-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAUxB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAU7B,0EAA0E;AAC1E,eAAO,MAAM,gCAAgC,8CACA,CAAC;AAC9C,2EAA2E;AAC3E,eAAO,MAAM,oCAAoC,yDACO,CAAC;AAMzD,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,GACrD,GAAG,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAuB3C;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACnC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,wBAAwB,EAAE,CAkB7B;AAqCD,qBAAa,sBAAsB;IACjC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,YAAY,IAAI,EAAE;QAChB,MAAM,EAAE,mBAAmB,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,2EAA2E;QAC3E,OAAO,CAAC,EAAE,eAAe,CAAC;QAC1B;;;;WAIG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,EAMA;IAED;;;;OAIG;IACH,UAAU,IAAI,UAAU,CAgBvB;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,0BAA0B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAO3E;IAED;;;;;;;;OAQG;
|
|
1
|
+
{"version":3,"file":"account-mcp.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/account-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -147,6 +147,23 @@ export class CursorAccountMcpBridge {
|
|
|
147
147
|
* Returns a promise that settles when every ref's log lines are written —
|
|
148
148
|
* callers may ignore it; tests can await it.
|
|
149
149
|
*/
|
|
150
|
+
probeAuthUrl(ref) {
|
|
151
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
+
const identifiers = ref.servers !== undefined && ref.servers.length > 0
|
|
153
|
+
? [...ref.servers]
|
|
154
|
+
: (yield this.client.getAvailableMcpServers()).map((server) => { var _a; return (_a = server.serverIdentifier) !== null && _a !== void 0 ? _a : server.name; });
|
|
155
|
+
const urls = yield probeConnectorAuthUrls({
|
|
156
|
+
client: this.client,
|
|
157
|
+
identifiers,
|
|
158
|
+
});
|
|
159
|
+
for (const url of urls.values()) {
|
|
160
|
+
if (url !== "") {
|
|
161
|
+
return url;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
150
167
|
logPreflight(refs) {
|
|
151
168
|
return Promise.all(refs.map((ref) => this.runPreflight(ref))).then(() => undefined);
|
|
152
169
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const TEMPLATE_NAMES: readonly ["agentic-owners", "code-wiki", "demo", "pr-autofixer", "security-help", "security-reviewer", "triage-linear", "triage-jira"];
|
|
1
|
+
declare const TEMPLATE_NAMES: readonly ["agentic-owners", "agents-md", "code-wiki", "demo", "pr-autofixer", "security-help", "security-reviewer", "triage-linear", "triage-jira"];
|
|
2
2
|
export type TemplateName = (typeof TEMPLATE_NAMES)[number];
|
|
3
3
|
export declare function canonicalTemplateName(name: string): string;
|
|
4
4
|
export declare function isTemplateName(name: string): name is TemplateName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-agent-template.d.ts","sourceRoot":"","sources":["../../src/internal/cursor-agent-template.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,cAAc,YAClB,gBAAgB,EAChB,WAAW,EACX,MAAM,EACN,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,aAAa,CACL,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAG3D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,YAAY,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY3E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE"}
|
|
1
|
+
{"version":3,"file":"cursor-agent-template.d.ts","sourceRoot":"","sources":["../../src/internal/cursor-agent-template.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,cAAc,YAClB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,MAAM,EACN,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,aAAa,CACL,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAG3D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,YAAY,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY3E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE"}
|
|
@@ -162,6 +162,13 @@ export interface AgentkitDeployStatus {
|
|
|
162
162
|
status: AgentkitCustomerStatus;
|
|
163
163
|
progress: AgentkitDeployProgress;
|
|
164
164
|
statusMessage: string | null;
|
|
165
|
+
/** Why the bake failed. Null/absent unless `status` is `failed`. */
|
|
166
|
+
lastError?: string | null;
|
|
167
|
+
/**
|
|
168
|
+
* `owner/name` scopes the deployment's GitHub/Origin channels watch.
|
|
169
|
+
* Absent on control planes that predate the field.
|
|
170
|
+
*/
|
|
171
|
+
repositories?: string[];
|
|
165
172
|
}
|
|
166
173
|
export declare const TERMINAL_AGENTKIT_DEPLOY_STATUSES: ReadonlySet<AgentkitCustomerStatus>;
|
|
167
174
|
/**
|
|
@@ -234,6 +241,8 @@ export declare class AgentServeDeployClient {
|
|
|
234
241
|
agentPath?: string;
|
|
235
242
|
components?: AgentkitDeployComponent[];
|
|
236
243
|
repositories?: string[];
|
|
244
|
+
/** Redeploy an existing Cursor-managed (multi-tenant) product. */
|
|
245
|
+
multiTenant?: boolean;
|
|
237
246
|
}): Promise<AgentkitDeployAccepted>;
|
|
238
247
|
getAgentkitDeploy(args: {
|
|
239
248
|
teamId: number;
|
|
@@ -320,4 +329,12 @@ export declare class AgentServeDeployClient {
|
|
|
320
329
|
mcpGatewayUrl(teamId: number, slug: string): string;
|
|
321
330
|
private request;
|
|
322
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* Inverse of {@link AgentServeDeployClient.mcpGatewayUrl}. Also accepts
|
|
334
|
+
* the hosted `--cloud-tools-url` form (`…/tools`).
|
|
335
|
+
*/
|
|
336
|
+
export declare function parseAgentServeMcpGatewayUrl(url: string): {
|
|
337
|
+
teamId: number;
|
|
338
|
+
slug: string;
|
|
339
|
+
} | undefined;
|
|
323
340
|
//# sourceMappingURL=deploy-client.d.ts.map
|