@mediamonks/canopy-cli 0.7.27 → 0.7.28

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.
@@ -7,7 +7,7 @@ Everything on Canopy is driven by one command-line tool: `canopy`. It scaffolds
7
7
 
8
8
  ## Install
9
9
 
10
- The CLI is published on npm as `@mediamonks/canopy-cli`. You need Node.js 20 or newer; then install it globally:
10
+ The CLI is published on npm as `@mediamonks/canopy-cli`. You need Node.js 24 or newer; then install it globally:
11
11
 
12
12
  ```bash
13
13
  npm install -g @mediamonks/canopy-cli
@@ -24,7 +24,7 @@ Confirm it's on your PATH:
24
24
  canopy --version
25
25
  ```
26
26
 
27
- If `npm` isn't available, install Node.js 20+ first (https://nodejs.org), then
27
+ If `npm` isn't available, install Node.js 24+ first (https://nodejs.org), then
28
28
  re-run the install.
29
29
 
30
30
  ## 2. Sign in
@@ -112,6 +112,31 @@ Switching back is one command (`canopy egress mode allowlist`), and the
112
112
  dashboard offers to **seed the allowlist from the observed hosts** so
113
113
  tightening up later doesn't break the app.
114
114
 
115
+ ## Allowlisting Canopy on the other side
116
+
117
+ Some external services only accept calls from IP addresses you register with
118
+ them first — a partner API, a corporate database, a payment provider's
119
+ allowlist. Projects hosted on **Google Cloud** (the `gcp-pilot` site,
120
+ `canopy.monks.zone`) make every outbound request from a fixed pair of
121
+ addresses, so you can hand them over:
122
+
123
+ | Address |
124
+ | ---------------- |
125
+ | `34.187.107.103` |
126
+ | `34.158.168.43` |
127
+
128
+ Register **both**. Traffic may leave from either one, and the second gives the
129
+ platform room to grow without asking you to update your allowlist. These
130
+ addresses are shared by every project on that site, so registering them lets
131
+ any Canopy project on Google Cloud reach the service — the other service's own
132
+ authentication (API keys, tokens) still decides who gets in.
133
+
134
+ The addresses are a platform commitment: they will not change without notice
135
+ and a migration period. Projects hosted on Cloudflare have **no** fixed
136
+ outbound address (requests leave from Cloudflare's shared edge), so if a
137
+ service you depend on insists on IP allowlisting, run that project on the
138
+ Google Cloud site.
139
+
115
140
  ## The outbound traffic log
116
141
 
117
142
  In both modes, the platform keeps a per-project log of the hosts the worker
@@ -1,4 +1,4 @@
1
- import { t as version } from "./package-CsmBH_fN.mjs";
1
+ import { t as version } from "./package-BL6hRqtr.mjs";
2
2
  import { n as siteConfig } from "./site-DM2J10CB.mjs";
3
3
  import { i as latestKnownVersion, r as compareSemver } from "./version-check-CcsA1QjI.mjs";
4
4
  import { r as reportErrors } from "./ui-DR-siu2S.mjs";
@@ -1,4 +1,4 @@
1
- import { t as version } from "./package-CsmBH_fN.mjs";
1
+ import { t as version } from "./package-BL6hRqtr.mjs";
2
2
  import { a as projectDirArgs, c as resolveProject, d as tryResolveProject, n as siteConfig, u as tryReadCanopyJson } from "./site-DM2J10CB.mjs";
3
3
  import { c as apiDownload, l as apiRequest, r as reportErrors, t as formatDateTime, u as apiUpload } from "./ui-DR-siu2S.mjs";
4
4
  import { defineCommand } from "citty";
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as version } from "./package-CsmBH_fN.mjs";
2
+ import { t as version } from "./package-BL6hRqtr.mjs";
3
3
  import { r as siteHeaderLine, t as setInvocationProfile } from "./site-DM2J10CB.mjs";
4
4
  import { a as notifyOfUpdate, o as runRefresh } from "./version-check-CcsA1QjI.mjs";
5
5
  import { defineCommand, runMain } from "citty";
@@ -77,13 +77,13 @@ const main = defineCommand({
77
77
  egress: () => import("./egress-Cn-P46O3.mjs").then((m) => m.egressCommand),
78
78
  secrets: () => import("./secrets-BD3DaTih.mjs").then((m) => m.secretsCommand),
79
79
  schedule: () => import("./schedule-Buu71RWQ.mjs").then((m) => m.scheduleCommand),
80
- feedback: () => import("./feedback-DormOsQa.mjs").then((m) => m.feedbackCommand),
80
+ feedback: () => import("./feedback-OMAkwHpR.mjs").then((m) => m.feedbackCommand),
81
81
  db: () => import("./db-DVMwCLlU.mjs").then((m) => m.dbCommand),
82
82
  usage: () => import("./usage-81JSiWIx.mjs").then((m) => m.usageCommand),
83
83
  open: () => import("./open-rS1ARzOy.mjs").then((m) => m.openCommand),
84
- docs: () => import("./docs-CuS9nIXm.mjs").then((m) => m.docsCommand),
85
- skill: () => import("./skill-DX18WOap.mjs").then((m) => m.skillCommand),
86
- upgrade: () => import("./upgrade-PfdH0NPe.mjs").then((m) => m.upgradeCommand),
84
+ docs: () => import("./docs-DMFMPnxG.mjs").then((m) => m.docsCommand),
85
+ skill: () => import("./skill-C83Za5BU.mjs").then((m) => m.skillCommand),
86
+ upgrade: () => import("./upgrade-BjQguwG6.mjs").then((m) => m.upgradeCommand),
87
87
  logs: () => import("./logs-CfDINw7U.mjs").then((m) => m.logsCommand)
88
88
  }
89
89
  });
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.7.27";
2
+ var version = "0.7.28";
3
3
  //#endregion
4
4
  export { version as t };
@@ -30,7 +30,7 @@ canopy whoami # is there a valid login?
30
30
  npm install -g @mediamonks/canopy-cli
31
31
  ```
32
32
 
33
- (Needs Node.js 20+. If `npm` is missing, tell the user to install Node first.)
33
+ (Needs Node.js 24+. If `npm` is missing, tell the user to install Node first.)
34
34
 
35
35
  - **`canopy whoami` says not logged in / expired** → run:
36
36
  ```bash
@@ -1,4 +1,4 @@
1
- import { t as version } from "./package-CsmBH_fN.mjs";
1
+ import { t as version } from "./package-BL6hRqtr.mjs";
2
2
  import { r as reportErrors } from "./ui-DR-siu2S.mjs";
3
3
  import { defineCommand } from "citty";
4
4
  import { cpSync, existsSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
@@ -18,10 +18,10 @@ jobs:
18
18
  env:
19
19
  CANOPY_DEPLOY_TOKEN: ${{ secrets.CANOPY_DEPLOY_TOKEN }}
20
20
  steps:
21
- - uses: actions/checkout@v4
22
- - uses: actions/setup-node@v4
21
+ - uses: actions/checkout@v7
22
+ - uses: actions/setup-node@v7
23
23
  with:
24
- node-version: 22
24
+ node-version: 24
25
25
  - name: Install dependencies
26
26
  if: env.CANOPY_DEPLOY_TOKEN != ''
27
27
  run: |
@@ -18,10 +18,10 @@ jobs:
18
18
  env:
19
19
  CANOPY_DEPLOY_TOKEN: ${{ secrets.CANOPY_DEPLOY_TOKEN }}
20
20
  steps:
21
- - uses: actions/checkout@v4
22
- - uses: actions/setup-node@v4
21
+ - uses: actions/checkout@v7
22
+ - uses: actions/setup-node@v7
23
23
  with:
24
- node-version: 22
24
+ node-version: 24
25
25
  - name: Install dependencies
26
26
  if: env.CANOPY_DEPLOY_TOKEN != ''
27
27
  run: |
@@ -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-DX18WOap.mjs");
115
+ const { skillInstalled } = await import("./skill-C83Za5BU.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());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mediamonks/canopy-cli",
3
- "version": "0.7.27",
3
+ "version": "0.7.28",
4
4
  "description": "Canopy CLI — create, develop and deploy Canopy projects.",
5
5
  "bin": {
6
6
  "canopy": "./dist/index.mjs"