koppler 0.1.0 → 0.2.1
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 +17 -17
- package/dist/.built +1 -1
- package/dist/core/databases.js +70 -0
- package/dist/core/databases.js.map +1 -0
- package/dist/core/migrations/board/0.1.0.js +14 -0
- package/dist/core/migrations/board/0.1.0.js.map +1 -0
- package/dist/core/migrations/board/index.js +12 -0
- package/dist/core/migrations/board/index.js.map +1 -0
- package/dist/core/migrations/board-file/index.js +13 -0
- package/dist/core/migrations/board-file/index.js.map +1 -0
- package/dist/core/migrations/files.js +24 -0
- package/dist/core/migrations/files.js.map +1 -0
- package/dist/core/migrations/run.js +47 -0
- package/dist/core/migrations/run.js.map +1 -0
- package/dist/core/migrations/stack/0.2.0.js +152 -0
- package/dist/core/migrations/stack/0.2.0.js.map +1 -0
- package/dist/core/migrations/stack/0.2.1.js +7 -0
- package/dist/core/migrations/stack/0.2.1.js.map +1 -0
- package/dist/core/migrations/stack/index.js +14 -0
- package/dist/core/migrations/stack/index.js.map +1 -0
- package/dist/core/plan.js +6 -2
- package/dist/core/plan.js.map +1 -1
- package/dist/core/presets.js +26 -22
- package/dist/core/presets.js.map +1 -1
- package/dist/core/stack.js +63 -0
- package/dist/core/stack.js.map +1 -1
- package/dist/data.js +23 -3
- package/dist/data.js.map +1 -1
- package/dist/engine/checks.js +4 -1
- package/dist/engine/checks.js.map +1 -1
- package/dist/engine/early-log.js +39 -0
- package/dist/engine/early-log.js.map +1 -0
- package/dist/engine/history.js +5 -0
- package/dist/engine/history.js.map +1 -1
- package/dist/engine/listen.js +23 -0
- package/dist/engine/listen.js.map +1 -1
- package/dist/engine/local-databases.js +69 -0
- package/dist/engine/local-databases.js.map +1 -0
- package/dist/engine/processes.js +19 -2
- package/dist/engine/processes.js.map +1 -1
- package/dist/engine/runs.js +3 -0
- package/dist/engine/runs.js.map +1 -1
- package/dist/engine/share.js +5 -3
- package/dist/engine/share.js.map +1 -1
- package/dist/engine/stack-file.js +17 -2
- package/dist/engine/stack-file.js.map +1 -1
- package/dist/engine/stacks.js +1 -0
- package/dist/engine/stacks.js.map +1 -1
- package/dist/engine/sync.js +6 -2
- package/dist/engine/sync.js.map +1 -1
- package/dist/engine/up.js +89 -5
- package/dist/engine/up.js.map +1 -1
- package/dist/koppler.mjs +24 -2
- package/dist/koppler.mjs.map +1 -1
- package/dist/page/assets/index-CD2dld8S.css +1 -0
- package/dist/page/assets/index-CcNVMT0j.js +44 -0
- package/dist/page/index.html +2 -2
- package/dist/server/cable-test.js +1 -1
- package/dist/server/cable-test.js.map +1 -1
- package/dist/server/files.js +1 -1
- package/dist/server/files.js.map +1 -1
- package/dist/server/routes.js +33 -1
- package/dist/server/routes.js.map +1 -1
- package/dist/server/sanitize.js +9 -0
- package/dist/server/sanitize.js.map +1 -1
- package/dist/upgraded.js +18 -0
- package/dist/upgraded.js.map +1 -0
- package/package.json +2 -2
- package/skills/koppler-run/SKILL.md +2 -2
- package/skills/koppler-run/VERSION +1 -1
- package/skills/koppler-run/references/stack.md +3 -0
- package/dist/page/assets/index-BlCQOHKq.js +0 -43
- package/dist/page/assets/index-DUWc3lut.css +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Koppler
|
|
2
2
|
|
|
3
|
-
<img alt="koppler: plug your local code into the real stack. npm install -g koppler, on macOS and Linux" src="https://raw.githubusercontent.com/evan-mcgeek/koppler/
|
|
3
|
+
<img alt="koppler: plug your local code into the real stack. npm install -g koppler, on macOS and Linux" src="https://raw.githubusercontent.com/evan-mcgeek/koppler/v0.2.1/docs/images/banner.png">
|
|
4
4
|
|
|
5
5
|
Plug your local code into the real stack.
|
|
6
6
|
The apps you change run on your own machine, the rest keeps calling the deployed environment, and you never learn how each backend is run.
|
|
@@ -12,7 +12,7 @@ Everything you leave unplugged keeps calling the deployed environment you chose.
|
|
|
12
12
|
Koppler is for local development.
|
|
13
13
|
It helps most when you work on one app (a mobile app, a front end, one API) and need a few of its neighbours running next to it.
|
|
14
14
|
|
|
15
|
-
<img alt="One feature, Checkout, worked on across four apps: the mobile app and web shop cabled to a local Orders API, which calls a local Payments API; each runs its feature/checkout branch, Orders API has
|
|
15
|
+
<img alt="One feature, Checkout, worked on across four apps: the mobile app and web shop cabled to a local Orders API, which calls a local Payments API; each runs its feature/checkout branch, Orders API has its deployed QA database and a local SQS queue, two apps carry a note for the agent, and everything runs" src="https://raw.githubusercontent.com/evan-mcgeek/koppler/v0.2.1/docs/images/board.png">
|
|
16
16
|
|
|
17
17
|
## How it works
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ It helps most when you work on one app (a mobile app, a front end, one API) and
|
|
|
24
24
|
- **Stop and revert.** One click stops what Koppler started and undoes every temporary change. Apps you started yourself are left alone.
|
|
25
25
|
- **Secrets stay yours.** You store them in the macOS Keychain (on Linux, in files only you can read); Koppler starts an app with them and never shows them.
|
|
26
26
|
|
|
27
|
-
<img alt="The review before a Run on QA: the four apps that start on feature/checkout with their notes for the agent, what keeps calling deployed QA, and the tunnel that opens" src="https://raw.githubusercontent.com/evan-mcgeek/koppler/
|
|
27
|
+
<img alt="The review before a Run on QA: the four apps that start on feature/checkout with their notes for the agent, what keeps calling deployed QA, and the tunnel that opens" src="https://raw.githubusercontent.com/evan-mcgeek/koppler/v0.2.1/docs/images/review.png" width="520">
|
|
28
28
|
|
|
29
29
|
## Install
|
|
30
30
|
|
|
@@ -35,7 +35,7 @@ koppler canvas
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
`koppler init` finds your repos and your team's stack (or starts a new one), and `koppler canvas` opens the canvas in your browser.
|
|
38
|
-
[Getting started](https://github.com/evan-mcgeek/koppler/blob/
|
|
38
|
+
[Getting started](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/getting-started.md) walks through the first run.
|
|
39
39
|
|
|
40
40
|
## The agent add-on
|
|
41
41
|
|
|
@@ -50,12 +50,12 @@ In Claude Code, add the plugin:
|
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
For any other agent (GitHub Copilot CLI, VS Code, OpenCode), or Claude Code without the plugin, run `koppler agent init`.
|
|
53
|
-
It links the [skill](https://github.com/evan-mcgeek/koppler/blob/
|
|
53
|
+
It links the [skill](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/plugin/skills/koppler-run) into each agent it finds and registers `koppler mcp`, its MCP server.
|
|
54
54
|
Either way, the agent drives the `koppler` command, so install the app first.
|
|
55
55
|
|
|
56
56
|
## Requirements
|
|
57
57
|
|
|
58
|
-
- macOS (secrets live in the Keychain) or Linux (secrets live in private files, without the per-read prompt; see [security](https://github.com/evan-mcgeek/koppler/blob/
|
|
58
|
+
- macOS (secrets live in the Keychain) or Linux (secrets live in private files, without the per-read prompt; see [security](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/security.md)).
|
|
59
59
|
- git and Node 22 or newer.
|
|
60
60
|
|
|
61
61
|
Everything else depends on your stack (the .NET SDK, Flutter, Docker, the AWS CLI, ...).
|
|
@@ -63,21 +63,21 @@ Everything else depends on your stack (the .NET SDK, Flutter, Docker, the AWS CL
|
|
|
63
63
|
|
|
64
64
|
## Documentation
|
|
65
65
|
|
|
66
|
-
- [Getting started](https://github.com/evan-mcgeek/koppler/blob/
|
|
67
|
-
- [The canvas](https://github.com/evan-mcgeek/koppler/blob/
|
|
68
|
-
- [App kinds](https://github.com/evan-mcgeek/koppler/blob/
|
|
69
|
-
- [Secrets and safety](https://github.com/evan-mcgeek/koppler/blob/
|
|
70
|
-
- [Commands](https://github.com/evan-mcgeek/koppler/blob/
|
|
71
|
-
- [Stack format](https://github.com/evan-mcgeek/koppler/blob/
|
|
72
|
-
- [Releasing](https://github.com/evan-mcgeek/koppler/blob/
|
|
66
|
+
- [Getting started](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/getting-started.md): install, the first stack, the first run.
|
|
67
|
+
- [The canvas](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/canvas.md): boards, cables, queues, environments, Run and Stop.
|
|
68
|
+
- [App kinds](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/app-kinds.md): what Koppler can run and how.
|
|
69
|
+
- [Secrets and safety](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/security.md): how secrets are kept, and what an agent may and may not do.
|
|
70
|
+
- [Commands](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/commands.md): every `koppler` command.
|
|
71
|
+
- [Stack format](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/plugin/skills/koppler-run/references/stack.md): the `stack.json` reference.
|
|
72
|
+
- [Releasing](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs/releasing.md): how a version tag publishes Koppler to npm.
|
|
73
73
|
|
|
74
74
|
## Repository
|
|
75
75
|
|
|
76
76
|
| Folder | What |
|
|
77
77
|
|---|---|
|
|
78
|
-
| [`app/`](https://github.com/evan-mcgeek/koppler/blob/
|
|
79
|
-
| [`plugin/`](https://github.com/evan-mcgeek/koppler/blob/
|
|
80
|
-
| [`docs/`](https://github.com/evan-mcgeek/koppler/blob/
|
|
78
|
+
| [`app/`](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/app) | The `koppler` package: the command, the engine, the canvas and its local server |
|
|
79
|
+
| [`plugin/`](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/plugin) | The agent add-on: a Claude Code plugin with the `koppler-run` skill |
|
|
80
|
+
| [`docs/`](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/docs) | User documentation |
|
|
81
81
|
|
|
82
82
|
Koppler runs from `app/dist/`, which `npm run build` makes from `app/src/` (`npm install` first).
|
|
83
83
|
While working on Koppler itself, link `app/scripts/koppler-dev.mjs` as `koppler`: it rebuilds when the source is newer, then runs the build.
|
|
@@ -100,4 +100,4 @@ See the [project board](https://github.com/users/evan-mcgeek/projects/2) for wha
|
|
|
100
100
|
|
|
101
101
|
## License
|
|
102
102
|
|
|
103
|
-
[MIT](https://github.com/evan-mcgeek/koppler/blob/
|
|
103
|
+
[MIT](https://github.com/evan-mcgeek/koppler/blob/v0.2.1/LICENSE)
|
package/dist/.built
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-10-
|
|
1
|
+
2026-10-19T23:11:13.547Z
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** The kinds of database Koppler knows, by their words. */
|
|
2
|
+
export const DATABASE_KINDS = {
|
|
3
|
+
postgres: 'Postgres',
|
|
4
|
+
mysql: 'MySQL',
|
|
5
|
+
valkey: 'Valkey',
|
|
6
|
+
redis: 'Redis',
|
|
7
|
+
};
|
|
8
|
+
/** The needs a database brings on one environment, or none when it is not reached there. */
|
|
9
|
+
export function databaseNeeds(database, env, first) {
|
|
10
|
+
// Another environment's tunnel or name is never borrowed: each environment states its own.
|
|
11
|
+
const reach = env === first ? database : database.envs?.[env];
|
|
12
|
+
if (!reach)
|
|
13
|
+
return [];
|
|
14
|
+
const kind = database.kind ? (DATABASE_KINDS[database.kind] ?? database.kind) : '';
|
|
15
|
+
const what = `${database.name ?? 'Database'}${kind ? ` (${kind})` : ''}`;
|
|
16
|
+
return [
|
|
17
|
+
...(reach.tunnel && reach.port
|
|
18
|
+
? [{ tunnel: reach.tunnel, port: reach.port, what, ...(reach.cmd && { cmd: reach.cmd }) }]
|
|
19
|
+
: []),
|
|
20
|
+
...(reach.hosts ? [{ hosts: reach.hosts, note: `${what}: the name its connection settings dial.` }] : []),
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
/** Adds a list's needs that it does not have yet, by tunnel host or hosts name. */
|
|
24
|
+
const add = (own, more) => [
|
|
25
|
+
...own,
|
|
26
|
+
...more.filter(need => !own.some(have => (need.tunnel && have.tunnel === need.tunnel) || (need.hosts && have.hosts === need.hosts))),
|
|
27
|
+
];
|
|
28
|
+
/** The databases an app uses, by id, that the stack names. */
|
|
29
|
+
export const databasesOf = (stack, id) => Object.keys(stack.apps[id]?.uses ?? {}).filter(key => !!stack.databases?.[key]);
|
|
30
|
+
/**
|
|
31
|
+
* The stack with each app's databases folded into its needs, on every environment. One switched to this Mac (`local`)
|
|
32
|
+
* brings none: it has no tunnel. Never written back.
|
|
33
|
+
*/
|
|
34
|
+
export function withDatabases(stack, local = new Set()) {
|
|
35
|
+
const databases = Object.fromEntries(Object.entries(stack.databases ?? {}).filter(([id]) => !local.has(id)));
|
|
36
|
+
const first = stack.envs[0] ?? '';
|
|
37
|
+
const apps = Object.fromEntries(Object.entries(stack.apps).map(([id, app]) => {
|
|
38
|
+
const used = Object.keys(app?.uses ?? {}).flatMap(key => (databases[key] ? [databases[key]] : []));
|
|
39
|
+
if (!app || !used.length)
|
|
40
|
+
return [id, app];
|
|
41
|
+
const needs = (env) => used.flatMap(database => databaseNeeds(database, env, first));
|
|
42
|
+
const envs = Object.fromEntries(stack.envs.slice(1).flatMap(env => {
|
|
43
|
+
const own = app.envs?.[env];
|
|
44
|
+
const more = needs(env);
|
|
45
|
+
if (!own?.prereqs && !more.length)
|
|
46
|
+
return own ? [[env, own]] : [];
|
|
47
|
+
return [[env, { ...own, prereqs: add(own?.prereqs ?? [], more) }]];
|
|
48
|
+
}));
|
|
49
|
+
return [id, { ...app, prereqs: add(app.prereqs ?? [], needs(first)), envs: { ...app.envs, ...envs } }];
|
|
50
|
+
}));
|
|
51
|
+
return { ...stack, apps };
|
|
52
|
+
}
|
|
53
|
+
const CACHES = ['valkey', 'redis'];
|
|
54
|
+
/**
|
|
55
|
+
* The value an app's connection setting takes for a database on this Mac, in the form its kind expects: a .NET app's
|
|
56
|
+
* key=value connection string, else a URL; a cache is its host and port. The local server's user is the Mac's own,
|
|
57
|
+
* as Homebrew and Postgres.app set them up, with no password.
|
|
58
|
+
*/
|
|
59
|
+
export function localValue(kind, appKind, at, user) {
|
|
60
|
+
const where = `${at.host}:${String(at.port)}`;
|
|
61
|
+
if (CACHES.includes(kind ?? ''))
|
|
62
|
+
return where;
|
|
63
|
+
const name = at.database ?? '';
|
|
64
|
+
if (appKind === 'dotnet')
|
|
65
|
+
return kind === 'mysql'
|
|
66
|
+
? `Server=${at.host};Port=${String(at.port)};Database=${name};User=${user}`
|
|
67
|
+
: `Host=${at.host};Port=${String(at.port)};Database=${name};Username=${user}`;
|
|
68
|
+
return `${kind === 'mysql' ? 'mysql' : 'postgres'}://${encodeURIComponent(user)}@${where}/${encodeURIComponent(name)}`;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=databases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databases.js","sourceRoot":"","sources":["../../src/core/databases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const everyAppSaysHowItRuns = {
|
|
2
|
+
version: '0.1.0',
|
|
3
|
+
about: 'Every app on a board says how it runs',
|
|
4
|
+
up: (raw, say) => {
|
|
5
|
+
const nodes = (raw['nodes'] ?? {});
|
|
6
|
+
for (const [id, node] of Object.entries(nodes))
|
|
7
|
+
if (node['run'] === undefined) {
|
|
8
|
+
node['run'] = 'cli';
|
|
9
|
+
say(`${id} runs by Koppler, as it did`);
|
|
10
|
+
}
|
|
11
|
+
return { ...raw, nodes };
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=0.1.0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0.1.0.js","sourceRoot":"","sources":["../../../../src/core/migrations/board/0.1.0.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAc;IAC9C,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,uCAAuC;IAC9C,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC1D,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;gBACpB,GAAG,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;YAC1C,CAAC;QACH,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// A board's format, wherever the board is kept: the stack's team boards, the user's own, a shared board file. One
|
|
2
|
+
// migration for each Koppler version that changed it, oldest first.
|
|
3
|
+
import { migrate } from "../run.js";
|
|
4
|
+
import { everyAppSaysHowItRuns } from "./0.1.0.js";
|
|
5
|
+
export const BOARD_FORMAT = {
|
|
6
|
+
name: 'The board',
|
|
7
|
+
key: 'koppler',
|
|
8
|
+
version: '0.1.0',
|
|
9
|
+
migrations: [everyAppSaysHowItRuns],
|
|
10
|
+
};
|
|
11
|
+
export const migrateBoard = (raw) => migrate(raw, BOARD_FORMAT);
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/migrations/board/index.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,oEAAoE;AACpE,OAAO,EAAE,OAAO,EAAyB,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,qBAAqB,CAAC;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// The board file: what the canvas keeps per stack on this Mac (the board on screen, the user's own boards, the view).
|
|
2
|
+
// One migration for each Koppler version that changed it, oldest first; the boards inside it are boards
|
|
3
|
+
// (migrations/board).
|
|
4
|
+
import { migrate } from "../run.js";
|
|
5
|
+
export const BOARD_FILE_FORMAT = {
|
|
6
|
+
name: 'The board file',
|
|
7
|
+
key: 'koppler',
|
|
8
|
+
// 0.2.0 added which databases run locally and, per app, whether its database lines go through the tunnel card.
|
|
9
|
+
version: '0.2.0',
|
|
10
|
+
migrations: [],
|
|
11
|
+
};
|
|
12
|
+
export const migrateBoardFile = (raw) => migrate(raw, BOARD_FILE_FORMAT);
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/migrations/board-file/index.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,wGAAwG;AACxG,sBAAsB;AACtB,OAAO,EAAE,OAAO,EAAyB,MAAM,WAAW,CAAC;AAE3D,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,IAAI,EAAE,gBAAgB;IACtB,GAAG,EAAE,SAAS;IACd,+GAA+G;IAC/G,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Each of Koppler's files as this Koppler reads it: brought up to its format, with the boards it holds in the board
|
|
2
|
+
// format. Pure; reading from disk and writing back is the caller's.
|
|
3
|
+
import { migrate as migrateBoard } from "../presets.js";
|
|
4
|
+
import { migrateBoardFile } from "./board-file/index.js";
|
|
5
|
+
import { migrateStack } from "./stack/index.js";
|
|
6
|
+
/** The boards under these keys, each in the board format; one that is not a board is kept as it is. */
|
|
7
|
+
const withBoards = (raw, keys) => ({
|
|
8
|
+
...raw,
|
|
9
|
+
...Object.fromEntries(keys.flatMap(key => {
|
|
10
|
+
const list = raw[key];
|
|
11
|
+
return Array.isArray(list) ? [[key, list.map((one) => migrateBoard(one).preset ?? one)]] : [];
|
|
12
|
+
})),
|
|
13
|
+
});
|
|
14
|
+
/** The stack, and its team boards. */
|
|
15
|
+
export const upgradeStack = raw => {
|
|
16
|
+
const done = migrateStack(raw);
|
|
17
|
+
return done.error === undefined ? { value: withBoards(done.value, ['presets']) } : done;
|
|
18
|
+
};
|
|
19
|
+
/** The board file, and the user's own boards in it, kept and deleted. */
|
|
20
|
+
export const upgradeBoardFile = raw => {
|
|
21
|
+
const done = migrateBoardFile(raw);
|
|
22
|
+
return done.error === undefined ? { value: withBoards(done.value, ['presets', 'trash']) } : done;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/core/migrations/files.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,oEAAoE;AACpE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,uGAAuG;AACvG,MAAM,UAAU,GAAG,CAAC,GAAQ,EAAE,IAAc,EAAO,EAAE,CAAC,CAAC;IACrD,GAAG,GAAG;IACN,GAAG,MAAM,CAAC,WAAW,CACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,CAAC,CAAC,CACH;CACF,CAAC,CAAC;AAEH,sCAAsC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAY,GAAG,CAAC,EAAE;IACzC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1F,CAAC,CAAC;AACF,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAY,GAAG,CAAC,EAAE;IAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnG,CAAC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Migrations: every JSON file Koppler keeps records the Koppler version whose format it is written in. Each Koppler
|
|
2
|
+
// version that changes a file's format adds one migration for it, and reading an older file runs every migration after
|
|
3
|
+
// its version, in order, on the raw JSON. An older file keeps working without being rewritten; writing the result back
|
|
4
|
+
// is a step of its own.
|
|
5
|
+
const VERSION = /^(\d+)\.(\d+)\.(\d+)$/;
|
|
6
|
+
export const isVersion = (text) => typeof text === 'string' && VERSION.test(text);
|
|
7
|
+
/** Orders two versions: below zero when `a` is older. */
|
|
8
|
+
export function compareVersions(a, b) {
|
|
9
|
+
const [x, y] = [a, b].map(one => (VERSION.exec(one) ?? []).slice(1).map(Number));
|
|
10
|
+
for (let at = 0; at < 3; at++) {
|
|
11
|
+
const diff = (x?.[at] ?? 0) - (y?.[at] ?? 0);
|
|
12
|
+
if (diff)
|
|
13
|
+
return diff;
|
|
14
|
+
}
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
/** The version a file says it is written in; one with none is older than any. */
|
|
18
|
+
export const versionOf = (raw, format) => {
|
|
19
|
+
const own = raw[format.key];
|
|
20
|
+
return isVersion(own) ? own : '0.0.0';
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The one way a file is read: brought up to this Koppler's format by every migration newer than the version it
|
|
24
|
+
* records, oldest first, each on a copy, and stamped with the format. A file from a newer Koppler is refused.
|
|
25
|
+
*/
|
|
26
|
+
export function migrate(raw, format) {
|
|
27
|
+
const from = versionOf(raw, format);
|
|
28
|
+
if (compareVersions(from, format.version) > 0)
|
|
29
|
+
return {
|
|
30
|
+
error: `${format.name} is written for Koppler ${from}, newer than this one reads (${format.version}); update Koppler`,
|
|
31
|
+
};
|
|
32
|
+
let value = raw;
|
|
33
|
+
const applied = [];
|
|
34
|
+
for (const migration of format.migrations) {
|
|
35
|
+
if (compareVersions(migration.version, from) <= 0)
|
|
36
|
+
continue;
|
|
37
|
+
const changes = [];
|
|
38
|
+
value = migration.up(structuredClone(value), change => changes.push(change));
|
|
39
|
+
applied.push({ migration, changes });
|
|
40
|
+
}
|
|
41
|
+
return { value: { ...value, [format.key]: format.version }, from, applied };
|
|
42
|
+
}
|
|
43
|
+
/** Whether a format's migrations are in order and none is newer than the format itself. */
|
|
44
|
+
export const inOrder = (format) => format.migrations.every((one, at) => isVersion(one.version) &&
|
|
45
|
+
compareVersions(one.version, format.version) <= 0 &&
|
|
46
|
+
(at === 0 || compareVersions(format.migrations[at - 1]?.version ?? '0.0.0', one.version) < 0));
|
|
47
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/core/migrations/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// 0.2.0: databases are named once under `databases` and apps `uses` them, where before each app stated a tunnel to
|
|
2
|
+
// each database (and the hosts entry its settings dial) among its own needs.
|
|
3
|
+
import { withDatabases } from "../../databases.js";
|
|
4
|
+
const PORTS = { 5432: 'postgres', 3306: 'mysql', 6379: 'valkey', 6380: 'valkey' };
|
|
5
|
+
const ENGINE = /postgres|mysql|aurora|rds|cluster|valkey|redis|elasticache|database|\bdb\b|cache/i;
|
|
6
|
+
/** The fields of a tunnel to a database that each have a place once it is a database; one with any other stays. */
|
|
7
|
+
const MOVED = new Set(['tunnel', 'port', 'what', 'cmd', 'note']);
|
|
8
|
+
/** A tunnel to a database or cache: by its port, or by what it says it reaches. One a setting points at stays. */
|
|
9
|
+
const isDatabase = (need) => Object.keys(need).every(field => MOVED.has(field)) &&
|
|
10
|
+
!!need.tunnel &&
|
|
11
|
+
!!need.port &&
|
|
12
|
+
(!!PORTS[need.port] || ENGINE.test(`${need.tunnel} ${need.what ?? ''}`));
|
|
13
|
+
const kindOf = (need) => /redis/i.test(need.tunnel ?? '')
|
|
14
|
+
? 'redis'
|
|
15
|
+
: (PORTS[need.port ?? 0] ?? (/mysql/i.test(need.what ?? '') ? 'mysql' : 'postgres'));
|
|
16
|
+
/** A hosts entry for a database endpoint, not for an app. */
|
|
17
|
+
const isEndpoint = (need) => !!need.hosts && !need.tunnel && ENGINE.test(need.hosts);
|
|
18
|
+
const ENVIRONMENTS = new Set(['dev', 'qa', 'test', 'uat', 'stg', 'staging', 'prod', 'production', 'internal']);
|
|
19
|
+
/**
|
|
20
|
+
* A database's name: what its tunnel said it reaches ("Orders (Postgres)" is Orders), or, when that says only "Database"
|
|
21
|
+
* or "Cache", its host's first label without the environment's words.
|
|
22
|
+
*/
|
|
23
|
+
const nameOf = (need) => {
|
|
24
|
+
const said = (need.what ?? '').replace(/\s*\([^)]*\)$/, '');
|
|
25
|
+
if (said && !/^(database|cache|tunnel)$/i.test(said))
|
|
26
|
+
return said;
|
|
27
|
+
const words = (need.tunnel ?? '')
|
|
28
|
+
.split('.')[0]
|
|
29
|
+
?.split('-')
|
|
30
|
+
.filter(word => word && !ENVIRONMENTS.has(word)) ?? [];
|
|
31
|
+
const text = words.join(' ');
|
|
32
|
+
return text ? text.charAt(0).toUpperCase() + text.slice(1) : 'Database';
|
|
33
|
+
};
|
|
34
|
+
const slug = (text) => text
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
37
|
+
.replace(/^-|-$/g, '') || 'database';
|
|
38
|
+
/** What each app needs on each environment, to compare before and after. */
|
|
39
|
+
function needsOf(stack) {
|
|
40
|
+
const folded = withDatabases(stack);
|
|
41
|
+
const key = (need) => JSON.stringify([need.tunnel, need.port, need.hosts, need.sso, need.signIn, need.cmd]);
|
|
42
|
+
return Object.fromEntries(Object.entries(folded.apps).flatMap(([id, app]) => folded.envs.map(env => [
|
|
43
|
+
`${id}@${env}`,
|
|
44
|
+
((env === folded.envs[0] ? undefined : app.envs?.[env]?.prereqs) ?? app.prereqs ?? []).map(key).sort(),
|
|
45
|
+
])));
|
|
46
|
+
}
|
|
47
|
+
function up(raw, say) {
|
|
48
|
+
const before = raw;
|
|
49
|
+
if (!Array.isArray(before.envs) || typeof before.apps !== 'object')
|
|
50
|
+
return raw;
|
|
51
|
+
const stack = structuredClone(before);
|
|
52
|
+
const [first = ''] = stack.envs;
|
|
53
|
+
const databases = (stack.databases ??= {});
|
|
54
|
+
const byHost = new Map();
|
|
55
|
+
const changes = [];
|
|
56
|
+
/** Per database and environment, the hosts entry each app using it dials, if it has exactly one. */
|
|
57
|
+
const dials = new Map();
|
|
58
|
+
for (const [id, app] of Object.entries(stack.apps)) {
|
|
59
|
+
const own = (app.prereqs ?? []).filter(isDatabase);
|
|
60
|
+
for (const need of own) {
|
|
61
|
+
const host = need.tunnel ?? '';
|
|
62
|
+
let key = byHost.get(host);
|
|
63
|
+
if (!key) {
|
|
64
|
+
// "Orders (Postgres)" is the database Orders; its kind is said apart.
|
|
65
|
+
const name = nameOf(need);
|
|
66
|
+
key = slug(name);
|
|
67
|
+
while (databases[key])
|
|
68
|
+
key = `${key}-2`;
|
|
69
|
+
byHost.set(host, key);
|
|
70
|
+
databases[key] = {
|
|
71
|
+
name,
|
|
72
|
+
kind: kindOf(need),
|
|
73
|
+
tunnel: host,
|
|
74
|
+
port: need.port,
|
|
75
|
+
...(need.cmd && { cmd: need.cmd }),
|
|
76
|
+
};
|
|
77
|
+
changes.push(`New database ${key}: ${name}, through the tunnel to ${host}`);
|
|
78
|
+
}
|
|
79
|
+
(app.uses ??= {})[key] ??= {};
|
|
80
|
+
changes.push(`${app.name ?? id} uses ${key} instead of its own tunnel to ${host}`);
|
|
81
|
+
}
|
|
82
|
+
const notes = {};
|
|
83
|
+
// On each environment, the tunnel of the same port, in the same order, reaches the same database there.
|
|
84
|
+
for (const env of own.length ? stack.envs : []) {
|
|
85
|
+
const list = env === first ? app.prereqs : app.envs?.[env]?.prereqs;
|
|
86
|
+
if (!list)
|
|
87
|
+
continue;
|
|
88
|
+
const tunnels = list.filter(isDatabase);
|
|
89
|
+
const endpoints = list.filter(isEndpoint);
|
|
90
|
+
for (const need of own) {
|
|
91
|
+
const same = own.filter(one => one.port === need.port);
|
|
92
|
+
const there = env === first ? need : tunnels.filter(one => one.port === need.port)[same.indexOf(need)];
|
|
93
|
+
const key = byHost.get(need.tunnel ?? '') ?? '';
|
|
94
|
+
const database = databases[key];
|
|
95
|
+
if (!there || !database)
|
|
96
|
+
continue;
|
|
97
|
+
const reach = env === first
|
|
98
|
+
? database
|
|
99
|
+
: ((database.envs ??= {})[env] ??= {
|
|
100
|
+
tunnel: there.tunnel,
|
|
101
|
+
port: there.port,
|
|
102
|
+
...(there.cmd && { cmd: there.cmd }),
|
|
103
|
+
});
|
|
104
|
+
if (reach['tunnel'] !== there.tunnel || reach['port'] !== there.port)
|
|
105
|
+
continue;
|
|
106
|
+
list.splice(list.indexOf(there), 1);
|
|
107
|
+
// What an app said about its tunnel is about how it uses the database: it goes with its use.
|
|
108
|
+
if (there.note)
|
|
109
|
+
(notes[key] ??= []).push([env, there.note]);
|
|
110
|
+
const users = dials.get(`${key}@${env}`) ?? [];
|
|
111
|
+
users.push({ list, endpoint: own.length === 1 && endpoints.length === 1 ? endpoints[0] : undefined });
|
|
112
|
+
dials.set(`${key}@${env}`, users);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// One note for every environment, or each said with its environment.
|
|
116
|
+
for (const [key, said] of Object.entries(notes)) {
|
|
117
|
+
const kept = [...new Set(said.map(([, note]) => note))];
|
|
118
|
+
const note = kept.length === 1 ? kept[0] : said.map(([env, one]) => `${env.toUpperCase()}: ${one}`).join('\n');
|
|
119
|
+
const use = app.uses?.[key];
|
|
120
|
+
if (use && note)
|
|
121
|
+
use['note'] = note;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// The name a database's apps dial goes with it when every one of them dials it.
|
|
125
|
+
for (const [at, users] of dials) {
|
|
126
|
+
const [key = '', env = ''] = at.split('@');
|
|
127
|
+
const name = users[0]?.endpoint?.hosts;
|
|
128
|
+
if (!name || users.some(one => one.endpoint?.hosts !== name))
|
|
129
|
+
continue;
|
|
130
|
+
const database = databases[key];
|
|
131
|
+
const reach = env === first ? database : database?.envs?.[env];
|
|
132
|
+
if (!reach)
|
|
133
|
+
continue;
|
|
134
|
+
reach['hosts'] = name;
|
|
135
|
+
for (const { list, endpoint } of users)
|
|
136
|
+
if (endpoint)
|
|
137
|
+
list.splice(list.indexOf(endpoint), 1);
|
|
138
|
+
}
|
|
139
|
+
// Only when every app still needs exactly what it did, on every environment.
|
|
140
|
+
const [was, now] = [needsOf(before), needsOf(stack)];
|
|
141
|
+
if (!changes.length || Object.keys(was).some(key => JSON.stringify(was[key]) !== JSON.stringify(now[key])))
|
|
142
|
+
return raw;
|
|
143
|
+
for (const change of new Set(changes))
|
|
144
|
+
say(change);
|
|
145
|
+
return stack;
|
|
146
|
+
}
|
|
147
|
+
export const databasesNamedOnce = {
|
|
148
|
+
version: '0.2.0',
|
|
149
|
+
about: 'Names each database once under databases, used by its apps, instead of a tunnel on each app',
|
|
150
|
+
up,
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=0.2.0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0.2.0.js","sourceRoot":"","sources":["../../../../src/core/migrations/stack/0.2.0.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { databasesNamedOnce } from "./0.2.0.js";
|
|
2
|
+
export const databasesNamedOnceAgain = {
|
|
3
|
+
version: '0.2.1',
|
|
4
|
+
about: 'Names each database once where 0.2.0 left the stack alone, keeping each tunnel command and note',
|
|
5
|
+
up: databasesNamedOnce.up,
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=0.2.1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0.2.1.js","sourceRoot":"","sources":["../../../../src/core/migrations/stack/0.2.1.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,MAAM,uBAAuB,GAAc;IAChD,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,iGAAiG;IACxG,EAAE,EAAE,kBAAkB,CAAC,EAAE;CAC1B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// The stack's format: one migration for each Koppler version that changed it, oldest first. A new one goes last, in a
|
|
2
|
+
// file named for the version that introduces it, and the format's version moves to it.
|
|
3
|
+
import { migrate } from "../run.js";
|
|
4
|
+
import { databasesNamedOnce } from "./0.2.0.js";
|
|
5
|
+
import { databasesNamedOnceAgain } from "./0.2.1.js";
|
|
6
|
+
export const STACK_FORMAT = {
|
|
7
|
+
name: 'The stack',
|
|
8
|
+
key: 'koppler',
|
|
9
|
+
version: '0.2.1',
|
|
10
|
+
migrations: [databasesNamedOnce, databasesNamedOnceAgain],
|
|
11
|
+
};
|
|
12
|
+
/** A stack as written, in this Koppler's format: what every reader of the stack works with. */
|
|
13
|
+
export const migrateStack = (raw) => migrate(raw, STACK_FORMAT);
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/migrations/stack/index.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,uFAAuF;AACvF,OAAO,EAAE,OAAO,EAAyB,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;CAC1D,CAAC;AAEF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC"}
|
package/dist/core/plan.js
CHANGED
|
@@ -23,8 +23,8 @@ export function board(input) {
|
|
|
23
23
|
const edges = (Array.isArray(input?.edges) ? input.edges : [])
|
|
24
24
|
.filter((e) => !!e && Object.hasOwn(nodes, e.from) && Object.hasOwn(nodes, e.to))
|
|
25
25
|
.map(e => ({ from: e.from, to: e.to }));
|
|
26
|
-
const
|
|
27
|
-
return { env: input?.env ?? null, nodes, edges, queues };
|
|
26
|
+
const local = (choices) => Object.fromEntries(Object.entries(choices ?? {}).flatMap(([id, where]) => (where === 'local' ? [[id, 'local']] : [])));
|
|
27
|
+
return { env: input?.env ?? null, nodes, edges, queues: local(input?.queues), databases: local(input?.databases) };
|
|
28
28
|
}
|
|
29
29
|
const callees = (b, id) => b.edges
|
|
30
30
|
.filter(e => e.from === id)
|
|
@@ -71,6 +71,10 @@ function reasonsToRestart(id, live, want, envChange, o) {
|
|
|
71
71
|
for (const q of o.queuesOf?.(id) ?? [])
|
|
72
72
|
if (onLocal(live, now, q) !== onLocal(want, next, q))
|
|
73
73
|
why.push(`it moves to the ${onLocal(want, next, q) ? 'local' : 'deployed'} ${q} queue`);
|
|
74
|
+
// An app whose database moves between this Mac and the deployed one starts again with the other's address.
|
|
75
|
+
for (const d of o.databasesOf?.(id) ?? [])
|
|
76
|
+
if (Object.hasOwn(live.databases, d) !== Object.hasOwn(want.databases, d))
|
|
77
|
+
why.push(`it moves to the ${Object.hasOwn(want.databases, d) ? 'local' : 'deployed'} ${d} database`);
|
|
74
78
|
return why;
|
|
75
79
|
}
|
|
76
80
|
export function plan(liveInput, desiredInput, options = {}) {
|
package/dist/core/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/core/plan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/core/plan.ts"],"names":[],"mappings":"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"}
|