@mediamonks/canopy-cli 0.7.17 → 0.7.18
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/dist/{db-DUVadyyv.mjs → db-BAaqh_2O.mjs} +3 -3
- package/dist/{deploy-DLehZzUr.mjs → deploy-DID3xhMJ.mjs} +3 -3
- package/dist/dev-A2doKMCS.mjs +2 -0
- package/dist/{dev-Bvqpc0zN.mjs → dev-CjaomJ2D.mjs} +5 -5
- package/dist/docs/cli-feedback.md +6 -4
- package/dist/docs/index.json +5 -0
- package/dist/docs/notifications.md +44 -0
- package/dist/docs/platform-ai-usage.md +11 -0
- package/dist/docs/sdk-ai.md +2 -2
- package/dist/{docs-DOopUT5k.mjs → docs-DP_p_mmy.mjs} +3 -3
- package/dist/{egress-D-Y0vANf.mjs → egress-DDM-_7Yo.mjs} +2 -2
- package/dist/{feedback-Dmrn3SW3.mjs → feedback-DX99gDFp.mjs} +22 -11
- package/dist/index.mjs +26 -26
- package/dist/{local-zKGeU9o5.mjs → local-dAQdVFEK.mjs} +2 -2
- package/dist/{login-CqM5bZNZ.mjs → login-CU0pev0k.mjs} +2 -2
- package/dist/{logs-DuQmfRoW.mjs → logs-D60VRbHZ.mjs} +2 -2
- package/dist/{migrations-CuLRUDsH.mjs → migrations-kKKDlR_H.mjs} +2 -2
- package/dist/{open-BXP6rJ7R.mjs → open-B5XHmEmv.mjs} +2 -2
- package/dist/{package-X1HbEiNB.mjs → package-x-_qF58q.mjs} +1 -1
- package/dist/{projects-C6tqDIV_.mjs → projects-TE1PVwMy.mjs} +2 -2
- package/dist/{schedule-lZA3TPTm.mjs → schedule-Blldchmj.mjs} +2 -2
- package/dist/{site-BUlQR117.mjs → site-BFaWfSVu.mjs} +14 -1
- package/dist/skill/canopy/SKILL.md +3 -1
- package/dist/{skill-Beg6Wyik.mjs → skill-CSFhZmBk.mjs} +2 -2
- package/dist/{staging-CL0Q2v6t.mjs → staging-Cw-Rzbsj.mjs} +2 -2
- package/dist/{token-HAniLS_l.mjs → token-BqxRIRkT.mjs} +2 -2
- package/dist/{ui-BUBYpqoC.mjs → ui-DLZNEen6.mjs} +1 -1
- package/dist/{upgrade-D297Aze4.mjs → upgrade-DcU4YMr_.mjs} +2 -2
- package/dist/{usage-XCARqs3z.mjs → usage-2cGnpSVc.mjs} +2 -2
- package/package.json +3 -3
- package/dist/dev-DAyB0TRG.mjs +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { c as resolveProject, o as projectFlagArgs } from "./site-
|
|
2
|
-
import { a as unwrap, d as withContext, i as requireTty, r as reportErrors, s as apiDataRequest } from "./ui-
|
|
3
|
-
import { n as migrateProject, r as readMigrationFiles, t as describeMigrateResult } from "./migrations-
|
|
1
|
+
import { c as resolveProject, o as projectFlagArgs } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { a as unwrap, d as withContext, i as requireTty, r as reportErrors, s as apiDataRequest } from "./ui-DLZNEen6.mjs";
|
|
3
|
+
import { n as migrateProject, r as readMigrationFiles, t as describeMigrateResult } from "./migrations-kKKDlR_H.mjs";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
6
6
|
import * as p from "@clack/prompts";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as projectDirArgs, c as resolveProject, l as stagingUrl, n as siteConfig, o as projectFlagArgs, s as projectUrl, u as tryReadCanopyJson } from "./site-
|
|
2
|
-
import { a as unwrap, c as apiDownload, d as withContext, l as apiRequest, r as reportErrors, s as apiDataRequest, t as formatDateTime } from "./ui-
|
|
3
|
-
import { n as migrateProject, r as readMigrationFiles, t as describeMigrateResult } from "./migrations-
|
|
1
|
+
import { a as projectDirArgs, c as resolveProject, l as stagingUrl, n as siteConfig, o as projectFlagArgs, s as projectUrl, u as tryReadCanopyJson } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { a as unwrap, c as apiDownload, d as withContext, l as apiRequest, r as reportErrors, s as apiDataRequest, t as formatDateTime } from "./ui-DLZNEen6.mjs";
|
|
3
|
+
import { n as migrateProject, r as readMigrationFiles, t as describeMigrateResult } from "./migrations-kKKDlR_H.mjs";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
6
6
|
import { tmpdir } from "node:os";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as projectDirArgs, c as resolveProject, i as projectDialect, n as siteConfig, u as tryReadCanopyJson } from "./site-
|
|
2
|
-
import { d as withContext, l as apiRequest, o as ApiError, r as reportErrors, t as formatDateTime } from "./ui-
|
|
3
|
-
import { r as readMigrationFiles } from "./migrations-
|
|
1
|
+
import { a as projectDirArgs, c as resolveProject, i as projectDialect, n as siteConfig, u as tryReadCanopyJson } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { d as withContext, l as apiRequest, o as ApiError, r as reportErrors, t as formatDateTime } from "./ui-DLZNEen6.mjs";
|
|
3
|
+
import { r as readMigrationFiles } from "./migrations-kKKDlR_H.mjs";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
@@ -165,7 +165,7 @@ async function devRemote(flags, slug) {
|
|
|
165
165
|
async function devLocal(flags, slug) {
|
|
166
166
|
let dump;
|
|
167
167
|
if (flags.pull) {
|
|
168
|
-
const { fetchProjectDump } = await import("./local-
|
|
168
|
+
const { fetchProjectDump } = await import("./local-dAQdVFEK.mjs");
|
|
169
169
|
console.log(`Pulling a fresh export of ${slug}${flags.staging ? " [staging]" : ""}…`);
|
|
170
170
|
dump = await fetchProjectDump(slug, flags.staging ? "staging" : "live");
|
|
171
171
|
}
|
|
@@ -180,7 +180,7 @@ async function devLocal(flags, slug) {
|
|
|
180
180
|
const reason = err instanceof ApiError ? err.explain().why : String(err);
|
|
181
181
|
console.log(`Note: ai/services will be unavailable — could not reach the platform (${reason}).`);
|
|
182
182
|
}
|
|
183
|
-
const { createSandbox } = await import("./local-
|
|
183
|
+
const { createSandbox } = await import("./local-dAQdVFEK.mjs");
|
|
184
184
|
const sandbox = await createSandbox({
|
|
185
185
|
slug,
|
|
186
186
|
persistDir: join(flags.dir, ".canopy", "local"),
|
|
@@ -24,10 +24,12 @@ canopy feedback attach <id> ./after-fix.png --comment "fixed — see the shot"
|
|
|
24
24
|
|
|
25
25
|
## Subcommands
|
|
26
26
|
|
|
27
|
-
Inbox commands
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
Inbox commands resolve the project the usual way — `canopy.json` in the target
|
|
28
|
+
directory, or `--project <slug>` — and require project membership. The
|
|
29
|
+
item-scoped ones (`show`, `comment`, `status`, `attach`) also work with just
|
|
30
|
+
the id from anywhere: report ids are unique across projects, so with no
|
|
31
|
+
project context the item is looked up by id alone. `list` and `show` take
|
|
32
|
+
`--json` for machine-readable output.
|
|
31
33
|
|
|
32
34
|
- `list [--status <s>] [--kind <k>]` — the project's inbox. Statuses:
|
|
33
35
|
`investigate`, `investigated`, `accepted`, `in_progress`, `resolved`,
|
package/dist/docs/index.json
CHANGED
|
@@ -77,6 +77,11 @@
|
|
|
77
77
|
"title": "CLI command reference",
|
|
78
78
|
"summary": "Every canopy command, its flags, and what it does."
|
|
79
79
|
},
|
|
80
|
+
{
|
|
81
|
+
"slug": "notifications",
|
|
82
|
+
"title": "Slack notifications",
|
|
83
|
+
"summary": "Canopy DMs you about your reports and projects — replies, new reports, blocked fetches, budget hits, failing schedules."
|
|
84
|
+
},
|
|
80
85
|
{
|
|
81
86
|
"slug": "static-serving",
|
|
82
87
|
"title": "How static files are served",
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Slack notifications
|
|
3
|
+
description: Canopy DMs you about your reports and projects — replies, new reports, blocked fetches, budget hits, failing schedules.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Canopy sends you Slack DMs when something on the platform needs your
|
|
7
|
+
attention, so nothing waits in a dashboard tab you don't have open. There is
|
|
8
|
+
nothing to install or link — if you're signed in to Canopy, the platform's
|
|
9
|
+
Slack bot can already reach you.
|
|
10
|
+
|
|
11
|
+
## What you get told about
|
|
12
|
+
|
|
13
|
+
**Your reports.** File a bug or feedback report anywhere (the in-app widget
|
|
14
|
+
or `canopy feedback report`) and you'll hear back: a DM when someone replies,
|
|
15
|
+
and when the report's status changes. Everything about one report lands in a
|
|
16
|
+
single Slack thread, so its history reads top to bottom.
|
|
17
|
+
|
|
18
|
+
**Your projects' reports.** If you own or collaborate on a project, new
|
|
19
|
+
reports and report activity on it DM you too — the triage side of the same
|
|
20
|
+
loop.
|
|
21
|
+
|
|
22
|
+
**Project events.** Things your project can't tell you itself:
|
|
23
|
+
|
|
24
|
+
- A fetch to a **new host was blocked** by the egress policy — the usual
|
|
25
|
+
reason a feature "silently fails" after adding an external API. The DM
|
|
26
|
+
names the host; allow it on the Backend tab if it's legitimate.
|
|
27
|
+
- The **daily AI budget ran out** — AI calls answer 429 until midnight UTC.
|
|
28
|
+
- A **schedule started failing** (and a follow-up when it recovers).
|
|
29
|
+
|
|
30
|
+
You're never notified about your own actions: your own deploys, comments,
|
|
31
|
+
and status changes don't DM you. (There's an off-by-default "my own actions"
|
|
32
|
+
toggle if you want them anyway.)
|
|
33
|
+
|
|
34
|
+
## Tuning it
|
|
35
|
+
|
|
36
|
+
Open **Notifications** under your avatar in the dashboard to switch any of
|
|
37
|
+
the categories on or off. To silence one noisy project entirely, use **Mute
|
|
38
|
+
project** on its Settings tab — personal to you, and your own reports
|
|
39
|
+
elsewhere keep notifying.
|
|
40
|
+
|
|
41
|
+
## If DMs don't arrive
|
|
42
|
+
|
|
43
|
+
The bot finds you by your work email. If your Slack account uses a different
|
|
44
|
+
address, the DMs can't reach you — ask the platform team.
|
|
@@ -30,6 +30,17 @@ const reply = await canopy.ai.chat({
|
|
|
30
30
|
URL and model list you can plug into ecosystem tools (like the Vercel AI
|
|
31
31
|
SDK) — same key handling, same budget, same tracking.
|
|
32
32
|
|
|
33
|
+
## Your data and the model providers
|
|
34
|
+
|
|
35
|
+
> **Note:** The gateway only talks to trusted AI sources: our own Anthropic and OpenAI accounts, and Google
|
|
36
|
+
> models through Vertex AI inside our own Google Cloud. Under those agreements, nothing you send is
|
|
37
|
+
> shared with anyone else or used to train models. That makes AI usage through Canopy fine for
|
|
38
|
+
> internal and client work alike — including confidential material.
|
|
39
|
+
|
|
40
|
+
This applies to every way your project reaches AI — `canopy.ai.chat()`,
|
|
41
|
+
streaming, and the OpenAI-compatible endpoint all go through the same gateway
|
|
42
|
+
to the same accounts.
|
|
43
|
+
|
|
33
44
|
## The daily budget
|
|
34
45
|
|
|
35
46
|
Every project has a daily AI budget in USD. When a project's spend for the
|
package/dist/docs/sdk-ai.md
CHANGED
|
@@ -5,8 +5,8 @@ description: Metered LLM access through the project's budget-capped gateway key
|
|
|
5
5
|
|
|
6
6
|
`canopy.ai` gives your project LLM access without any API keys in your code.
|
|
7
7
|
Every request authenticates as the project and is metered against a hard
|
|
8
|
-
per-project daily budget — spend and
|
|
9
|
-
[AI access & usage](https://docs.canopy.website/platform/ai-usage).
|
|
8
|
+
per-project daily budget — spend, limits, and how prompts are handled by the
|
|
9
|
+
model providers are covered in [AI access & usage](https://docs.canopy.website/platform/ai-usage).
|
|
10
10
|
|
|
11
11
|
## ai.chat(options)
|
|
12
12
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as version } from "./package-
|
|
2
|
-
import { n as siteConfig } from "./site-
|
|
1
|
+
import { t as version } from "./package-x-_qF58q.mjs";
|
|
2
|
+
import { n as siteConfig } from "./site-BFaWfSVu.mjs";
|
|
3
3
|
import { i as latestKnownVersion, r as compareSemver } from "./version-check-CcsA1QjI.mjs";
|
|
4
|
-
import { r as reportErrors } from "./ui-
|
|
4
|
+
import { r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { homedir } from "node:os";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as projectDirArgs, c as resolveProject } from "./site-
|
|
2
|
-
import { a as unwrap, i as requireTty, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-
|
|
1
|
+
import { a as projectDirArgs, c as resolveProject } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { a as unwrap, i as requireTty, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import * as p from "@clack/prompts";
|
|
5
5
|
//#region src/egress.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as version } from "./package-
|
|
2
|
-
import { a as projectDirArgs, c as resolveProject, n as siteConfig, u as tryReadCanopyJson } from "./site-
|
|
3
|
-
import { c as apiDownload, l as apiRequest, r as reportErrors, t as formatDateTime, u as apiUpload } from "./ui-
|
|
1
|
+
import { t as version } from "./package-x-_qF58q.mjs";
|
|
2
|
+
import { a as projectDirArgs, c as resolveProject, d as tryResolveProject, n as siteConfig, u as tryReadCanopyJson } from "./site-BFaWfSVu.mjs";
|
|
3
|
+
import { c as apiDownload, l as apiRequest, r as reportErrors, t as formatDateTime, u as apiUpload } from "./ui-DLZNEen6.mjs";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { basename, extname, join } from "node:path";
|
|
6
6
|
import { readFile, writeFile } from "node:fs/promises";
|
|
@@ -72,6 +72,19 @@ const jsonArg = { json: {
|
|
|
72
72
|
type: "boolean",
|
|
73
73
|
description: "Machine-readable JSON output"
|
|
74
74
|
} };
|
|
75
|
+
/**
|
|
76
|
+
* The project an item-scoped command targets: `--project` or canopy.json when
|
|
77
|
+
* present, otherwise the API's ID-only lookup — item ids are globally unique,
|
|
78
|
+
* so the item names its own project. That's the usual agent situation: holding
|
|
79
|
+
* an id from a notification or a Slack thread, in a directory that isn't the
|
|
80
|
+
* project.
|
|
81
|
+
*/
|
|
82
|
+
async function resolveItemSlug(args, itemId) {
|
|
83
|
+
const { slug } = tryResolveProject(args);
|
|
84
|
+
if (slug) return slug;
|
|
85
|
+
const { project } = await apiRequest("GET", `/feedback/${encodeURIComponent(itemId)}`);
|
|
86
|
+
return project.slug;
|
|
87
|
+
}
|
|
75
88
|
function firstLine(body) {
|
|
76
89
|
const line = body.split("\n")[0] ?? "";
|
|
77
90
|
return line.length > 72 ? `${line.slice(0, 71)}…` : line;
|
|
@@ -133,8 +146,8 @@ const showCommand = defineCommand({
|
|
|
133
146
|
}
|
|
134
147
|
},
|
|
135
148
|
run: reportErrors("feedback show", async ({ args }) => {
|
|
136
|
-
const { slug } =
|
|
137
|
-
const detail = await apiRequest("GET", `/projects/${slug}/feedback/${encodeURIComponent(args.id)}`);
|
|
149
|
+
const { slug } = tryResolveProject(args);
|
|
150
|
+
const detail = await apiRequest("GET", slug ? `/projects/${slug}/feedback/${encodeURIComponent(args.id)}` : `/feedback/${encodeURIComponent(args.id)}`);
|
|
138
151
|
if (args.json) {
|
|
139
152
|
console.log(JSON.stringify(detail, null, 2));
|
|
140
153
|
return;
|
|
@@ -172,7 +185,7 @@ const showCommand = defineCommand({
|
|
|
172
185
|
if (args.download && shots.length > 0) {
|
|
173
186
|
console.log("");
|
|
174
187
|
for (const shot of shots) {
|
|
175
|
-
const bytes = await apiDownload(`/projects/${slug}/feedback/${encodeURIComponent(item.id)}/attachments/${shot.id}`);
|
|
188
|
+
const bytes = await apiDownload(`/projects/${detail.project.slug}/feedback/${encodeURIComponent(item.id)}/attachments/${shot.id}`);
|
|
176
189
|
const name = shot.filename ? `${shot.id}-${basename(shot.filename)}` : `${shot.id}.png`;
|
|
177
190
|
const target = join(args.download, name);
|
|
178
191
|
await writeFile(target, bytes);
|
|
@@ -204,8 +217,7 @@ const commentCommand = defineCommand({
|
|
|
204
217
|
...projectDirArgs
|
|
205
218
|
},
|
|
206
219
|
run: reportErrors("feedback comment", async ({ args }) => {
|
|
207
|
-
|
|
208
|
-
await apiRequest("POST", `/projects/${slug}/feedback/${encodeURIComponent(args.id)}/comments`, {
|
|
220
|
+
await apiRequest("POST", `/projects/${await resolveItemSlug(args, args.id)}/feedback/${encodeURIComponent(args.id)}/comments`, {
|
|
209
221
|
body: args.text,
|
|
210
222
|
...args.internal ? { internal: true } : {}
|
|
211
223
|
});
|
|
@@ -235,8 +247,7 @@ const statusCommand = defineCommand({
|
|
|
235
247
|
...projectDirArgs
|
|
236
248
|
},
|
|
237
249
|
run: reportErrors("feedback status", async ({ args }) => {
|
|
238
|
-
|
|
239
|
-
await apiRequest("POST", `/projects/${slug}/feedback/${encodeURIComponent(args.id)}/status`, {
|
|
250
|
+
await apiRequest("POST", `/projects/${await resolveItemSlug(args, args.id)}/feedback/${encodeURIComponent(args.id)}/status`, {
|
|
240
251
|
status: args.to,
|
|
241
252
|
...args.comment ? { comment: args.comment } : {}
|
|
242
253
|
});
|
|
@@ -381,7 +392,7 @@ const feedbackCommand = defineCommand({
|
|
|
381
392
|
...projectDirArgs
|
|
382
393
|
},
|
|
383
394
|
run: reportErrors("feedback attach", async ({ args }) => {
|
|
384
|
-
const
|
|
395
|
+
const slug = await resolveItemSlug(args, args.id);
|
|
385
396
|
const paths = [args.file, ...attachedPaths(args.attach)];
|
|
386
397
|
for (const path of paths) await readFile(path);
|
|
387
398
|
if (args.internal && !args.comment) {
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { t as version } from "./package-
|
|
3
|
-
import { r as siteHeaderLine, t as setInvocationProfile } from "./site-
|
|
2
|
+
import { t as version } from "./package-x-_qF58q.mjs";
|
|
3
|
+
import { r as siteHeaderLine, t as setInvocationProfile } from "./site-BFaWfSVu.mjs";
|
|
4
4
|
import { a as notifyOfUpdate, o as runRefresh } from "./version-check-CcsA1QjI.mjs";
|
|
5
5
|
import { defineCommand, runMain } from "citty";
|
|
6
6
|
//#region src/index.ts
|
|
@@ -60,30 +60,30 @@ const main = defineCommand({
|
|
|
60
60
|
description: "canopy — create and deploy vibecoded projects"
|
|
61
61
|
},
|
|
62
62
|
subCommands: {
|
|
63
|
-
login: () => import("./login-
|
|
64
|
-
whoami: () => import("./login-
|
|
65
|
-
logout: () => import("./login-
|
|
66
|
-
create: () => import("./projects-
|
|
67
|
-
init: () => import("./projects-
|
|
68
|
-
projects: () => import("./projects-
|
|
69
|
-
delete: () => import("./projects-
|
|
70
|
-
dev: () => import("./dev-
|
|
71
|
-
deploy: () => import("./deploy-
|
|
72
|
-
promote: () => import("./deploy-
|
|
73
|
-
staging: () => import("./staging-
|
|
74
|
-
rollback: () => import("./deploy-
|
|
75
|
-
download: () => import("./deploy-
|
|
76
|
-
token: () => import("./token-
|
|
77
|
-
egress: () => import("./egress-
|
|
78
|
-
schedule: () => import("./schedule-
|
|
79
|
-
feedback: () => import("./feedback-
|
|
80
|
-
db: () => import("./db-
|
|
81
|
-
usage: () => import("./usage-
|
|
82
|
-
open: () => import("./open-
|
|
83
|
-
docs: () => import("./docs-
|
|
84
|
-
skill: () => import("./skill-
|
|
85
|
-
upgrade: () => import("./upgrade-
|
|
86
|
-
logs: () => import("./logs-
|
|
63
|
+
login: () => import("./login-CU0pev0k.mjs").then((m) => m.loginCommand),
|
|
64
|
+
whoami: () => import("./login-CU0pev0k.mjs").then((m) => m.whoamiCommand),
|
|
65
|
+
logout: () => import("./login-CU0pev0k.mjs").then((m) => m.logoutCommand),
|
|
66
|
+
create: () => import("./projects-TE1PVwMy.mjs").then((m) => m.createCommand),
|
|
67
|
+
init: () => import("./projects-TE1PVwMy.mjs").then((m) => m.initCommand),
|
|
68
|
+
projects: () => import("./projects-TE1PVwMy.mjs").then((m) => m.projectsCommand),
|
|
69
|
+
delete: () => import("./projects-TE1PVwMy.mjs").then((m) => m.deleteCommand),
|
|
70
|
+
dev: () => import("./dev-A2doKMCS.mjs").then((m) => m.devCommand),
|
|
71
|
+
deploy: () => import("./deploy-DID3xhMJ.mjs").then((m) => m.deployCommand),
|
|
72
|
+
promote: () => import("./deploy-DID3xhMJ.mjs").then((m) => m.promoteCommand),
|
|
73
|
+
staging: () => import("./staging-Cw-Rzbsj.mjs").then((m) => m.stagingCommand),
|
|
74
|
+
rollback: () => import("./deploy-DID3xhMJ.mjs").then((m) => m.rollbackCommand),
|
|
75
|
+
download: () => import("./deploy-DID3xhMJ.mjs").then((m) => m.downloadCommand),
|
|
76
|
+
token: () => import("./token-BqxRIRkT.mjs").then((m) => m.tokenCommand),
|
|
77
|
+
egress: () => import("./egress-DDM-_7Yo.mjs").then((m) => m.egressCommand),
|
|
78
|
+
schedule: () => import("./schedule-Blldchmj.mjs").then((m) => m.scheduleCommand),
|
|
79
|
+
feedback: () => import("./feedback-DX99gDFp.mjs").then((m) => m.feedbackCommand),
|
|
80
|
+
db: () => import("./db-BAaqh_2O.mjs").then((m) => m.dbCommand),
|
|
81
|
+
usage: () => import("./usage-2cGnpSVc.mjs").then((m) => m.usageCommand),
|
|
82
|
+
open: () => import("./open-B5XHmEmv.mjs").then((m) => m.openCommand),
|
|
83
|
+
docs: () => import("./docs-DP_p_mmy.mjs").then((m) => m.docsCommand),
|
|
84
|
+
skill: () => import("./skill-CSFhZmBk.mjs").then((m) => m.skillCommand),
|
|
85
|
+
upgrade: () => import("./upgrade-DcU4YMr_.mjs").then((m) => m.upgradeCommand),
|
|
86
|
+
logs: () => import("./logs-D60VRbHZ.mjs").then((m) => m.logsCommand)
|
|
87
87
|
}
|
|
88
88
|
});
|
|
89
89
|
if (process.argv[2] !== "upgrade") notifyOfUpdate(version);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { s as apiDataRequest } from "./ui-
|
|
1
|
+
import { s as apiDataRequest } from "./ui-DLZNEen6.mjs";
|
|
2
2
|
import { n as META_COLUMNS, r as blobRouter, t as dbRouter } from "./src-Bu4Ze32I.mjs";
|
|
3
|
-
import { n as rewriteApiPath } from "./dev-
|
|
3
|
+
import { n as rewriteApiPath } from "./dev-CjaomJ2D.mjs";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
6
6
|
import { dirname, join, relative, sep } from "node:path";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { _ as
|
|
2
|
-
import { n as openBrowser, r as reportErrors } from "./ui-
|
|
1
|
+
import { _ as writeConfigFile, f as clearAllProfileTokens, g as upsertProfileAuth, h as setActiveProfile, m as readConfigFile, n as siteConfig, p as listBakedProfiles, v as getBakedProfile, y as isProfileId } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { n as openBrowser, r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import * as p from "@clack/prompts";
|
|
5
5
|
import { createHash, randomBytes } from "node:crypto";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as resolveProject, o as projectFlagArgs } from "./site-
|
|
2
|
-
import { d as withContext, l as apiRequest, r as reportErrors } from "./ui-
|
|
1
|
+
import { c as resolveProject, o as projectFlagArgs } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { d as withContext, l as apiRequest, r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/logs.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { u as tryReadCanopyJson } from "./site-
|
|
2
|
-
import { s as apiDataRequest } from "./ui-
|
|
1
|
+
import { u as tryReadCanopyJson } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { s as apiDataRequest } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { readFileSync, readdirSync } from "node:fs";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
5
|
//#region src/migrations.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as projectDirArgs, c as resolveProject, l as stagingUrl, s as projectUrl } from "./site-
|
|
2
|
-
import { n as openBrowser, r as reportErrors } from "./ui-
|
|
1
|
+
import { a as projectDirArgs, c as resolveProject, l as stagingUrl, s as projectUrl } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { n as openBrowser, r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/open.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as siteConfig, s as projectUrl, u as tryReadCanopyJson } from "./site-
|
|
2
|
-
import { a as unwrap, i as requireTty, l as apiRequest, r as reportErrors } from "./ui-
|
|
1
|
+
import { n as siteConfig, s as projectUrl, u as tryReadCanopyJson } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { a as unwrap, i as requireTty, l as apiRequest, r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { join, relative, resolve, sep } from "node:path";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as resolveProject, o as projectFlagArgs } from "./site-
|
|
2
|
-
import { d as withContext, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-
|
|
1
|
+
import { c as resolveProject, o as projectFlagArgs } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { d as withContext, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/schedule.ts
|
|
5
5
|
/**
|
|
@@ -227,6 +227,19 @@ function resolveProject(args) {
|
|
|
227
227
|
slug: args.project ?? readCanopyJson(dir).slug
|
|
228
228
|
};
|
|
229
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Like resolveProject, but undefined instead of an error when nothing names a
|
|
232
|
+
* project — for commands that have another way to find it (e.g. the feedback
|
|
233
|
+
* item id names its own project).
|
|
234
|
+
*/
|
|
235
|
+
function tryResolveProject(args) {
|
|
236
|
+
const dir = resolve(args.dir ?? ".");
|
|
237
|
+
setProjectDirForPin(dir);
|
|
238
|
+
return {
|
|
239
|
+
dir,
|
|
240
|
+
slug: args.project ?? tryReadCanopyJson(dir)?.slug
|
|
241
|
+
};
|
|
242
|
+
}
|
|
230
243
|
//#endregion
|
|
231
244
|
//#region src/site.ts
|
|
232
245
|
/**
|
|
@@ -264,4 +277,4 @@ function siteHeaderLine(cliVersion) {
|
|
|
264
277
|
return `canopy ${cliVersion} · ${c.envOverride || !c.profileId ? c.apiUrl : `${c.profileId} (${c.projectDomain ?? new URL(c.apiUrl).hostname})`}`;
|
|
265
278
|
}
|
|
266
279
|
//#endregion
|
|
267
|
-
export {
|
|
280
|
+
export { writeConfigFile as _, projectDirArgs as a, resolveProject as c, tryResolveProject as d, clearAllProfileTokens as f, upsertProfileAuth as g, setActiveProfile as h, projectDialect as i, stagingUrl as l, readConfigFile as m, siteConfig as n, projectFlagArgs as o, listBakedProfiles as p, siteHeaderLine as r, projectUrl as s, setInvocationProfile as t, tryReadCanopyJson as u, getBakedProfile as v, isProfileId as y };
|
|
@@ -112,7 +112,9 @@ short version:
|
|
|
112
112
|
- `canopy feedback list --status investigate` shows what nobody has looked at;
|
|
113
113
|
`canopy feedback show <id>` has the body, captured context, and comment
|
|
114
114
|
trail. The context includes the deploy version that served the bug —
|
|
115
|
-
reproduce against that, not whatever is live now.
|
|
115
|
+
reproduce against that, not whatever is live now. The id is enough on its
|
|
116
|
+
own — `show`, `comment`, `status`, and `attach` work from any directory,
|
|
117
|
+
no `--project` needed.
|
|
116
118
|
- Investigated ≠ fixed: write findings with
|
|
117
119
|
`canopy feedback status <id> investigated --comment "<root cause>"`.
|
|
118
120
|
- **`accepted` means a person said "build this."** Never set it on your own —
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as version } from "./package-
|
|
2
|
-
import { r as reportErrors } from "./ui-
|
|
1
|
+
import { t as version } from "./package-x-_qF58q.mjs";
|
|
2
|
+
import { r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import { cpSync, existsSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { homedir } from "node:os";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as resolveProject, l as stagingUrl, o as projectFlagArgs, s as projectUrl } from "./site-
|
|
2
|
-
import { a as unwrap, d as withContext, i as requireTty, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-
|
|
1
|
+
import { c as resolveProject, l as stagingUrl, o as projectFlagArgs, s as projectUrl } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { a as unwrap, d as withContext, i as requireTty, l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import * as p from "@clack/prompts";
|
|
5
5
|
//#region src/staging.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as projectDirArgs, c as resolveProject, o as projectFlagArgs } from "./site-
|
|
2
|
-
import { l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-
|
|
1
|
+
import { a as projectDirArgs, c as resolveProject, o as projectFlagArgs } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { l as apiRequest, r as reportErrors, t as formatDateTime } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
const tokenCommand = defineCommand({
|
|
5
5
|
meta: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as PACKAGE_NAME } from "./version-check-CcsA1QjI.mjs";
|
|
2
|
-
import { r as reportErrors } from "./ui-
|
|
2
|
+
import { r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
@@ -112,7 +112,7 @@ const upgradeCommand = defineCommand({
|
|
|
112
112
|
const spec = `${PACKAGE_NAME}@${args.version ?? "latest"}`;
|
|
113
113
|
const command = pmCommand(pm);
|
|
114
114
|
const cmd = installArgs(pm, spec);
|
|
115
|
-
const { skillInstalled } = await import("./skill-
|
|
115
|
+
const { skillInstalled } = await import("./skill-CSFhZmBk.mjs");
|
|
116
116
|
const { homedir } = await import("node:os");
|
|
117
117
|
const refreshGlobal = skillInstalled(homedir());
|
|
118
118
|
const refreshRepo = process.cwd() !== homedir() && skillInstalled(process.cwd());
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as resolveProject, o as projectFlagArgs } from "./site-
|
|
2
|
-
import { d as withContext, l as apiRequest, r as reportErrors } from "./ui-
|
|
1
|
+
import { c as resolveProject, o as projectFlagArgs } from "./site-BFaWfSVu.mjs";
|
|
2
|
+
import { d as withContext, l as apiRequest, r as reportErrors } from "./ui-DLZNEen6.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/usage.ts
|
|
5
5
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mediamonks/canopy-cli",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.18",
|
|
4
4
|
"description": "Canopy CLI — create, develop and deploy Canopy projects.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"canopy": "./dist/index.mjs"
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"esbuild": "^0.28.1",
|
|
21
21
|
"hono": "^4.8.0",
|
|
22
22
|
"vite-server": "npm:vite@^7",
|
|
23
|
-
"@mediamonks/canopy": "0.0.
|
|
24
|
-
"@mediamonks/canopy
|
|
23
|
+
"@mediamonks/canopy-data-plane": "0.0.4",
|
|
24
|
+
"@mediamonks/canopy": "0.0.5"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^26.1.1",
|
package/dist/dev-DAyB0TRG.mjs
DELETED