@somewhere-cloud/cli 0.38.15 → 0.38.16

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.
@@ -0,0 +1,164 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import semver from 'semver';
5
+ /**
6
+ * A project records the CLI version it was built with, the way an npm project
7
+ * records any dependency (tsk_a4641877). Getting a newer CLI is then a
8
+ * deliberate `somewhere upgrade`, not whatever `npx …@latest` fetched today.
9
+ *
10
+ * Where the pin lives, read in this order (the first one found is the pin):
11
+ * package.json devDependencies (or dependencies) "@somewhere-cloud/cli"
12
+ * — what `somewhere init` writes into a new starter
13
+ * .somewhere.json "cli_version" — for a linked folder whose package.json
14
+ * does not declare the CLI (or that has none): written by
15
+ * init --bare/link and by the first deploy, never into a
16
+ * package.json the CLI did not write (a devDependency added
17
+ * behind a lockfile would break the owner's `npm ci`).
18
+ */
19
+ export const CLI_PACKAGE_NAME = '@somewhere-cloud/cli';
20
+ export const PIN_FILE_KEY = 'cli_version';
21
+ function readJson(path) {
22
+ if (!existsSync(path))
23
+ return null;
24
+ try {
25
+ const value = JSON.parse(readFileSync(path, 'utf8'));
26
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : null;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function packageJsonSpec(pkg) {
33
+ for (const section of ['devDependencies', 'dependencies']) {
34
+ const deps = pkg?.[section];
35
+ if (deps && typeof deps === 'object' && !Array.isArray(deps)) {
36
+ const spec = deps[CLI_PACKAGE_NAME];
37
+ if (typeof spec === 'string' && spec.trim())
38
+ return spec.trim();
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ /** Every place this folder records a CLI version, in precedence order. */
44
+ export function readProjectPins(dir) {
45
+ const pins = [];
46
+ const fromPackage = packageJsonSpec(readJson(join(dir, 'package.json')));
47
+ if (fromPackage)
48
+ pins.push({ spec: fromPackage, source: 'package.json' });
49
+ const recorded = readJson(join(dir, '.somewhere.json'))?.[PIN_FILE_KEY];
50
+ if (typeof recorded === 'string' && recorded.trim())
51
+ pins.push({ spec: recorded.trim(), source: '.somewhere.json' });
52
+ return pins;
53
+ }
54
+ /** The pin that governs this folder, or null when it records none (or one that
55
+ * is not a version or range, such as a tag or a file: path). */
56
+ export function readProjectPin(dir) {
57
+ const pin = readProjectPins(dir)[0];
58
+ return pin && semver.validRange(pin.spec) ? pin : null;
59
+ }
60
+ export function pinSatisfied(pin, version) {
61
+ return semver.valid(version) !== null && semver.satisfies(version, pin.spec, { includePrerelease: true });
62
+ }
63
+ /** The CLI installed in this folder's node_modules, when it satisfies the pin
64
+ * and is not the one already running: the command is handed to it. */
65
+ export function installedPinnedCli(dir, pin, running) {
66
+ const root = join(dir, 'node_modules', ...CLI_PACKAGE_NAME.split('/'));
67
+ const pkg = readJson(join(root, 'package.json'));
68
+ const version = typeof pkg?.version === 'string' ? pkg.version : null;
69
+ if (!version || version === running || !pinSatisfied(pin, version))
70
+ return null;
71
+ const binField = pkg?.bin;
72
+ const rel = typeof binField === 'string'
73
+ ? binField
74
+ : binField && typeof binField === 'object' ? binField.somewhere : null;
75
+ if (typeof rel !== 'string')
76
+ return null;
77
+ const bin = join(root, rel);
78
+ return existsSync(bin) ? { version, bin } : null;
79
+ }
80
+ /** The one line a folder pinned to another CLI version prints, on stderr. */
81
+ export function pinNotice(pin, running, delegatedTo) {
82
+ const head = `This project is pinned to somewhere CLI ${pin.spec} (${pin.source})`;
83
+ const newer = semver.valid(running) !== null && semver.gtr(running, pin.spec, { includePrerelease: true });
84
+ const move = `Run \`somewhere upgrade\` to move the project to ${running}.`;
85
+ if (delegatedTo) {
86
+ return `${head}; running its installed ${delegatedTo} instead of ${running}.${newer ? ` ${move}` : ''}`;
87
+ }
88
+ if (newer)
89
+ return `${head}; you are running ${running}. ${move}`;
90
+ const exact = semver.valid(pin.spec) ? pin.spec : semver.minVersion(pin.spec)?.version ?? pin.spec;
91
+ return `${head}; you are running ${running}, which is older. `
92
+ + (pin.source === 'package.json' ? 'Run `npm install` here, or use ' : 'Use ')
93
+ + `\`npx -y ${CLI_PACKAGE_NAME}@${exact} <command>\`.`;
94
+ }
95
+ /** Commands that never follow a pin: they create, inspect or move it. */
96
+ const PIN_EXEMPT = new Set(['upgrade', 'update', 'init', '--version', '-V']);
97
+ /** Set on a command handed to the project's installed CLI, so it runs as is. */
98
+ export const PINNED_CHILD_ENV = 'SOMEWHERE_PINNED_CLI';
99
+ export function decidePin(dir, running, argv, env) {
100
+ const none = { notice: null, delegate: null };
101
+ if (env[PINNED_CHILD_ENV] === '1' || PIN_EXEMPT.has(argv[2] ?? ''))
102
+ return none;
103
+ const pin = readProjectPin(dir);
104
+ if (!pin || pinSatisfied(pin, running))
105
+ return none;
106
+ const installed = installedPinnedCli(dir, pin, running);
107
+ return { notice: pinNotice(pin, running, installed?.version ?? null), delegate: installed?.bin ?? null };
108
+ }
109
+ /** Write `version` into every place this folder records a pin. */
110
+ export function writeProjectPins(dir, pins, version) {
111
+ const written = [];
112
+ for (const pin of pins) {
113
+ const path = join(dir, pin.source);
114
+ const raw = readFileSync(path, 'utf8');
115
+ const json = JSON.parse(raw);
116
+ if (pin.source === 'package.json') {
117
+ for (const section of ['devDependencies', 'dependencies']) {
118
+ const deps = json[section];
119
+ if (deps && typeof deps === 'object' && typeof deps[CLI_PACKAGE_NAME] === 'string')
120
+ deps[CLI_PACKAGE_NAME] = version;
121
+ }
122
+ }
123
+ else {
124
+ json[PIN_FILE_KEY] = version;
125
+ }
126
+ const indent = /^\{\s*\n(\s+)/.exec(raw)?.[1] ?? ' ';
127
+ writeFileSync(path, JSON.stringify(json, null, indent) + '\n');
128
+ written.push(pin.source);
129
+ }
130
+ return written;
131
+ }
132
+ /** Record this CLI in a linked folder that records no version yet: the first
133
+ * deploy pins the project. Only .somewhere.json is written. */
134
+ export function recordPinIfMissing(dir, version) {
135
+ if (!semver.valid(version) || readProjectPins(dir).length)
136
+ return false;
137
+ const path = join(dir, '.somewhere.json');
138
+ const config = readJson(path);
139
+ if (!config)
140
+ return false;
141
+ config[PIN_FILE_KEY] = version;
142
+ writeFileSync(path, JSON.stringify(config, null, 2) + '\n');
143
+ return true;
144
+ }
145
+ /** This CLI's own CHANGELOG.md, shipped in the package. */
146
+ export function readBundledChangelog() {
147
+ return readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'CHANGELOG.md'), 'utf8');
148
+ }
149
+ /** The `## x.y.z` sections above `from` up to and including `to`, newest first. */
150
+ export function changelogBetween(markdown, from, to) {
151
+ const entries = [];
152
+ const parts = markdown.split(/^## /m).slice(1);
153
+ for (const part of parts) {
154
+ const newline = part.indexOf('\n');
155
+ const version = (newline === -1 ? part : part.slice(0, newline)).trim();
156
+ if (!semver.valid(version))
157
+ continue;
158
+ if (semver.gt(version, from) && semver.lte(version, to)) {
159
+ entries.push({ version, body: (newline === -1 ? '' : part.slice(newline + 1)).trim() });
160
+ }
161
+ }
162
+ return entries;
163
+ }
164
+ //# sourceMappingURL=project-pin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-pin.js","sourceRoot":"","sources":["../../src/lib/project-pin.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@somewhere-cloud/cli",
3
- "version": "0.38.15",
3
+ "version": "0.38.16",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@somewhere-cloud/cli",
9
- "version": "0.38.15",
9
+ "version": "0.38.16",
10
10
  "bundleDependencies": [
11
11
  "@modelcontextprotocol/sdk",
12
12
  "chokidar",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@somewhere-cloud/cli",
3
- "version": "0.38.15",
3
+ "version": "0.38.16",
4
4
  "description": "CLI for somewhere.cloud — auth, projects, deploy, pull, promote, db, logs, env, MCP bridge.",
5
5
  "keywords": [
6
6
  "somewhere",
@@ -26,6 +26,7 @@
26
26
  "sw": "bin/somewhere.js"
27
27
  },
28
28
  "files": [
29
+ "CHANGELOG.md",
29
30
  "LICENSE",
30
31
  "README.md",
31
32
  "bin",