@plexus-ms/lib 0.3.1 → 0.5.0

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,21 @@
1
+ import type { Context } from './context.ts';
2
+ export type Reason = 'no base ref: every app counts as changed' | 'nothing but bookkeeping changed' | 'a workspace-global input changed: every app counts as changed' | 'files under the apps changed' | 'sources or their dependencies changed';
3
+ export interface ChangedApps {
4
+ apps: string[];
5
+ reason: Reason;
6
+ }
7
+ export interface ChangedAppsInput {
8
+ /** Whether the repo is a pnpm workspace (an app repo) or a bare platform repo. */
9
+ workspace: boolean;
10
+ /** Every deployable app, by dir name under apps/. */
11
+ all: string[];
12
+ /** The files the diff names, or undefined when the base ref is unusable. */
13
+ changed?: string[];
14
+ /** The apps pnpm's range filter lists as changed or depending on a change; asked only when needed. */
15
+ dependents?: () => Promise<string[]>;
16
+ }
17
+ /** The changed set from what was read: the rules above, in order. */
18
+ export declare function selectChangedApps(input: ChangedAppsInput): Promise<ChangedApps>;
19
+ /** The apps whose sources changed between `from` and `to` in the checkout at `dir`. */
20
+ export declare function readChangedApps(ctx: Context, dir: string, from: string, to?: string): Promise<ChangedApps>;
21
+ //# sourceMappingURL=changedApps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changedApps.d.ts","sourceRoot":"","sources":["../src/changedApps.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,MAAM,MAAM,MAAM,GACd,0CAA0C,GAC1C,iCAAiC,GACjC,+DAA+D,GAC/D,8BAA8B,GAC9B,uCAAuC,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,SAAS,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtC;AAED,qEAAqE;AACrE,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBrF;AAED,uFAAuF;AACvF,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBhH"}
@@ -0,0 +1,112 @@
1
+ // changed-apps: the deployable apps whose sources changed between two git
2
+ // refs (§ 3 PLX-Delivery), dependents of a changed workspace package included,
3
+ // as a verb that reads git and the workspace manifests and nothing else.
4
+ //
5
+ // The dependents walk is pnpm's (`--filter "...[from...to]"`): the tool that
6
+ // owns the workspace graph answers for it. What pnpm cannot know is held here:
7
+ //
8
+ // - bookkeeping is not source: the declaration marker and copier's answers
9
+ // file change on every train, and a change to them alone deploys nothing;
10
+ // - workspace-global inputs feed every app's build (the lockfile pins each
11
+ // app's dependency tree, the root manifests shape every install), so a
12
+ // change to one of them deploys every app, where pnpm's filter, which sees
13
+ // only files inside project dirs, would deploy none;
14
+ // - a platform repo hosts third-party apps as bare apps/<name>/ compose dirs
15
+ // with no workspace at all; there an app changed exactly when a file under
16
+ // its own dir did;
17
+ // - no usable base ref (first push, force-push, new branch) means "cannot
18
+ // diff", which degrades to "every app changed", the never-skip-a-deploy
19
+ // default.
20
+ //
21
+ // plx changed-apps <from> [to] # one app per line; --json for the array
22
+ import { join } from 'node:path';
23
+ /** Files whose change alone deploys nothing. */
24
+ const BOOKKEEPING = /(^|\/)(PLEXUS\.md|\.copier-answers\.yml)$/;
25
+ /** Workspace-global inputs: a change to one of them deploys every app. */
26
+ const GLOBALS = /^(pnpm-lock\.yaml|pnpm-workspace\.yaml|package\.json|turbo\.json|mise\.toml|\.npmrc|\.node-version)$/;
27
+ const NO_REF = /^0*$/;
28
+ /** The changed set from what was read: the rules above, in order. */
29
+ export async function selectChangedApps(input) {
30
+ const all = [...input.all].sort();
31
+ if (input.changed === undefined)
32
+ return { apps: all, reason: 'no base ref: every app counts as changed' };
33
+ const changed = input.changed.filter((f) => !BOOKKEEPING.test(f));
34
+ const under = (app) => changed.some((f) => f.startsWith(`apps/${app}/`));
35
+ if (!input.workspace)
36
+ return { apps: all.filter(under), reason: 'files under the apps changed' };
37
+ if (changed.length === 0)
38
+ return { apps: [], reason: 'nothing but bookkeeping changed' };
39
+ if (changed.some((f) => GLOBALS.test(f)))
40
+ return { apps: all, reason: 'a workspace-global input changed: every app counts as changed' };
41
+ // pnpm sees every file in a project dir, bookkeeping included, so an app it
42
+ // lists is kept only when a counted file changed under its own dir, or when
43
+ // something outside apps/ changed (a package it may depend on; pnpm's graph
44
+ // walk is the authority there).
45
+ const outside = changed.some((f) => !f.startsWith('apps/'));
46
+ const listed = new Set((await input.dependents?.()) ?? []);
47
+ return {
48
+ apps: all.filter((app) => listed.has(app) && (outside || under(app))),
49
+ reason: 'sources or their dependencies changed',
50
+ };
51
+ }
52
+ /** The apps whose sources changed between `from` and `to` in the checkout at `dir`. */
53
+ export async function readChangedApps(ctx, dir, from, to = 'HEAD') {
54
+ const git = (args) => ctx.read('git', args, { cwd: dir });
55
+ const workspace = await exists(ctx, join(dir, 'pnpm-workspace.yaml'));
56
+ const all = await deployableApps(ctx, dir, workspace);
57
+ let changed;
58
+ if (from !== '' && !NO_REF.test(from) && (await isCommit(git, from)))
59
+ changed = (await git(['diff', '--name-only', from, to])).split('\n').filter(Boolean);
60
+ const dependents = async () => {
61
+ const out = await ctx.read('pnpm', ['--filter', `...[${from}...${to}]`, 'ls', '--depth', '-1', '--parseable'], {
62
+ cwd: dir,
63
+ });
64
+ return out
65
+ .split('\n')
66
+ .map((line) => /(?:^|\/)apps\/([^/]+)$/.exec(line.trim())?.[1])
67
+ .filter((app) => app !== undefined);
68
+ };
69
+ const result = await selectChangedApps({ workspace, all, changed, dependents });
70
+ ctx.say(`→ ${result.reason}`, 1);
71
+ return result;
72
+ }
73
+ async function isCommit(git, ref) {
74
+ try {
75
+ await git(['rev-parse', '--verify', '--quiet', `${ref}^{commit}`]);
76
+ return true;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ /**
83
+ * Every apps/<name>/ that is deployable: in a workspace, a member (a
84
+ * package.json marks one; the same set pnpm can ever list, and a bare dir is
85
+ * not buildable); without one, a dir carrying a compose file.
86
+ */
87
+ async function deployableApps(ctx, dir, workspace) {
88
+ const entries = await ctx.readDir(join(dir, 'apps')).catch(() => []);
89
+ const apps = [];
90
+ for (const e of entries) {
91
+ if (!e.directory)
92
+ continue;
93
+ const marks = workspace ? ['package.json'] : ['docker/compose.yaml', 'compose.yaml'];
94
+ for (const mark of marks) {
95
+ if (await exists(ctx, join(dir, 'apps', e.name, mark))) {
96
+ apps.push(e.name);
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ return apps.sort();
102
+ }
103
+ async function exists(ctx, path) {
104
+ try {
105
+ await ctx.readFile(path);
106
+ return true;
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ //# sourceMappingURL=changedApps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changedApps.js","sourceRoot":"","sources":["../src/changedApps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { Context } from './context.ts';
2
+ import { type Plan } from './plan.ts';
3
+ export declare const CHANGESET_DIR = ".changeset";
4
+ declare const FIELDS: readonly ["dependencies", "optionalDependencies", "peerDependencies"];
5
+ type Field = (typeof FIELDS)[number];
6
+ /** The part of a package.json the verb reads. */
7
+ export interface Manifest {
8
+ name?: string;
9
+ private?: boolean;
10
+ dependencies?: Record<string, string>;
11
+ optionalDependencies?: Record<string, string>;
12
+ peerDependencies?: Record<string, string>;
13
+ }
14
+ /** pnpm's catalogs: the default one and the named ones, each name → range. */
15
+ export interface Catalogs {
16
+ default: Record<string, string>;
17
+ named: Record<string, Record<string, string>>;
18
+ }
19
+ export interface PackageDiff {
20
+ /** The manifest's path, relative to the repo's root. */
21
+ path: string;
22
+ before?: Manifest;
23
+ after?: Manifest;
24
+ }
25
+ export interface DependencyChange {
26
+ package: string;
27
+ dependency: string;
28
+ field: Field;
29
+ from?: string;
30
+ to?: string;
31
+ }
32
+ export interface ChangesetInput {
33
+ /** The branch the bump rides, naming the file. */
34
+ branch: string;
35
+ packages: PackageDiff[];
36
+ catalogsBefore: Catalogs;
37
+ catalogsAfter: Catalogs;
38
+ /** Package names changesets is told to ignore. */
39
+ ignore: string[];
40
+ /** Whether the file this branch names exists already. */
41
+ exists: boolean;
42
+ /** The repo's root, which the plan's steps are addressed to; the cwd when absent. */
43
+ root?: string;
44
+ }
45
+ export interface Changeset {
46
+ /** The changeset file, relative to the repo's root. */
47
+ path: string;
48
+ /** Package name → bump; empty when nothing is owed. */
49
+ releases: Record<string, 'patch' | 'major'>;
50
+ changes: DependencyChange[];
51
+ /** The file's text, or undefined when nothing is owed. */
52
+ content?: string;
53
+ plan: Plan;
54
+ }
55
+ /** The name of the changeset file a branch owns: one per branch, so reruns overwrite. */
56
+ export declare function changesetPath(branch: string): string;
57
+ /** The changeset a set of manifest diffs owes: pure, so a test compares outputs. */
58
+ export declare function planChangeset(input: ChangesetInput): Changeset;
59
+ /** The catalogs of a pnpm-workspace.yaml; empty when the file or the keys are absent. */
60
+ export declare function parseCatalogs(text: string | undefined): Catalogs;
61
+ /** The workspace's package directories from the `packages` globs; one level of `*` is understood. */
62
+ export declare function workspaceGlobs(text: string | undefined): string[];
63
+ /**
64
+ * Read the branch's diff since its merge base with `base` and plan the
65
+ * changeset. Reads only; the plan is applied by the caller.
66
+ */
67
+ export declare function readChangeset(ctx: Context, dir: string, base: string, branch?: string): Promise<Changeset>;
68
+ export {};
69
+ //# sourceMappingURL=changeset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeset.d.ts","sourceRoot":"","sources":["../src/changeset.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,WAAW,CAAC;AAElD,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,QAAA,MAAM,MAAM,uEAAwE,CAAC;AACrF,KAAK,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAErC,iDAAiD;AACjD,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,cAAc,EAAE,QAAQ,CAAC;IACzB,aAAa,EAAE,QAAQ,CAAC;IACxB,kDAAkD;IAClD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;IAChB,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC5C,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CA+B9D;AAiBD,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAYhE;AAED,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAIjE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA2ChH"}
@@ -0,0 +1,174 @@
1
+ // changeset: the changeset a dependency bump owes (§ 5 PLX-Delivery), a verb,
2
+ // not a system.
3
+ //
4
+ // The update bot writes no changesets, so a bump that changes what a
5
+ // published package ships would never reach a release. This verb reads what
6
+ // the branch changed since its merge base and writes the one changeset the
7
+ // bump owes, deterministically: the same diff always yields the same file,
8
+ // so a rerun after the bot's rebase changes nothing, and a diff that owes
9
+ // nothing removes the file an earlier run left.
10
+ //
11
+ // The rule is the ecosystem's (pnpm's `update --changeset`, Renovate's
12
+ // proposed `changesets` option): every workspace package whose
13
+ // `dependencies`, `optionalDependencies` or `peerDependencies` changed,
14
+ // directly or through a catalog entry it consumes, gets a bump: patch, or
15
+ // major when a peer range moved. `devDependencies` and the lockfile never
16
+ // reach a consumer and owe nothing; private packages, nameless packages and
17
+ // the `ignore` list of `.changeset/config.json` are skipped. A package that
18
+ // inlines a devDependency into its artifact is outside the rule and says so
19
+ // where it is published.
20
+ //
21
+ // plx changeset # on a bot branch, in the repo's root
22
+ // plx changeset --base origin/main -n . # what it would write
23
+ import { join } from 'node:path';
24
+ import { parse } from 'yaml';
25
+ import { ExecError } from "./io.js";
26
+ import { run, write } from "./plan.js";
27
+ export const CHANGESET_DIR = '.changeset';
28
+ const FIELDS = ['dependencies', 'optionalDependencies', 'peerDependencies'];
29
+ /** The name of the changeset file a branch owns: one per branch, so reruns overwrite. */
30
+ export function changesetPath(branch) {
31
+ const slug = branch
32
+ .replace(/^(renovate|dependabot)\//, '')
33
+ .replace(/[^a-z0-9]+/gi, '-')
34
+ .replace(/^-|-$/g, '')
35
+ .toLowerCase();
36
+ return `${CHANGESET_DIR}/bot-${slug || 'branch'}.md`;
37
+ }
38
+ /** The changeset a set of manifest diffs owes: pure, so a test compares outputs. */
39
+ export function planChangeset(input) {
40
+ const path = changesetPath(input.branch);
41
+ const changes = [];
42
+ const releases = {};
43
+ for (const diff of input.packages) {
44
+ const { before, after } = diff;
45
+ if (!before || !after?.name || after.private || input.ignore.includes(after.name))
46
+ continue;
47
+ for (const field of FIELDS) {
48
+ const names = new Set([...Object.keys(before[field] ?? {}), ...Object.keys(after[field] ?? {})]);
49
+ for (const dependency of [...names].sort()) {
50
+ const from = resolveRange(before[field]?.[dependency], dependency, input.catalogsBefore);
51
+ const to = resolveRange(after[field]?.[dependency], dependency, input.catalogsAfter);
52
+ if (from === to)
53
+ continue;
54
+ changes.push({ package: after.name, dependency, field, from, to });
55
+ const bump = field === 'peerDependencies' ? 'major' : 'patch';
56
+ if (releases[after.name] !== 'major')
57
+ releases[after.name] = bump;
58
+ }
59
+ }
60
+ }
61
+ const root = input.root;
62
+ if (changes.length === 0) {
63
+ const remove = run('rm', ['-f', path], root ? { cwd: root } : {});
64
+ return { path, releases, changes, plan: input.exists ? [remove] : [] };
65
+ }
66
+ const header = Object.entries(releases)
67
+ .sort(([a], [b]) => a.localeCompare(b))
68
+ .map(([name, bump]) => `'${name}': ${bump}`);
69
+ const lines = [...new Set(changes.map(describeChange))].sort((a, b) => a.localeCompare(b));
70
+ const content = `---\n${header.join('\n')}\n---\n\n${lines.join('\n')}\n`;
71
+ return { path, releases, changes, content, plan: [write(root ? join(root, path) : path, content)] };
72
+ }
73
+ function describeChange(c) {
74
+ const peer = c.field === 'peerDependencies' ? ' (peer)' : '';
75
+ if (c.from === undefined)
76
+ return `Add \`${c.dependency}\`${peer} at ${c.to}`;
77
+ if (c.to === undefined)
78
+ return `Remove \`${c.dependency}\`${peer}`;
79
+ return `Update \`${c.dependency}\`${peer} from ${c.from} to ${c.to}`;
80
+ }
81
+ /** A `catalog:` or `catalog:<name>` value resolved through the catalogs; anything else as written. */
82
+ function resolveRange(value, dependency, catalogs) {
83
+ if (value === undefined)
84
+ return undefined;
85
+ if (value === 'catalog:' || value === 'catalog:default')
86
+ return catalogs.default[dependency] ?? value;
87
+ if (value.startsWith('catalog:'))
88
+ return catalogs.named[value.slice('catalog:'.length)]?.[dependency] ?? value;
89
+ return value;
90
+ }
91
+ /** The catalogs of a pnpm-workspace.yaml; empty when the file or the keys are absent. */
92
+ export function parseCatalogs(text) {
93
+ const data = text === undefined ? undefined : parse(text);
94
+ const ws = data !== null && typeof data === 'object' ? data : {};
95
+ const map = (v) => v !== null && typeof v === 'object'
96
+ ? Object.fromEntries(Object.entries(v).map(([k, r]) => [k, String(r)]))
97
+ : {};
98
+ const named = ws.catalogs !== null && typeof ws.catalogs === 'object' ? ws.catalogs : {};
99
+ return {
100
+ default: map(ws.catalog),
101
+ named: Object.fromEntries(Object.entries(named).map(([name, entries]) => [name, map(entries)])),
102
+ };
103
+ }
104
+ /** The workspace's package directories from the `packages` globs; one level of `*` is understood. */
105
+ export function workspaceGlobs(text) {
106
+ const data = text === undefined ? undefined : parse(text);
107
+ const globs = data !== null && typeof data === 'object' ? data.packages : undefined;
108
+ return Array.isArray(globs) ? globs.map(String).filter((g) => !g.startsWith('!')) : [];
109
+ }
110
+ /**
111
+ * Read the branch's diff since its merge base with `base` and plan the
112
+ * changeset. Reads only; the plan is applied by the caller.
113
+ */
114
+ export async function readChangeset(ctx, dir, base, branch) {
115
+ const git = (args) => ctx.read('git', args, { cwd: dir });
116
+ const head = branch ?? (await git(['rev-parse', '--abbrev-ref', 'HEAD'])).trim();
117
+ const mergeBase = (await git(['merge-base', base, 'HEAD'])).trim();
118
+ const show = async (path) => {
119
+ try {
120
+ return await git(['show', `${mergeBase}:${path}`]);
121
+ }
122
+ catch (error) {
123
+ if (error instanceof ExecError)
124
+ return undefined;
125
+ throw error;
126
+ }
127
+ };
128
+ const current = async (path) => {
129
+ try {
130
+ return await ctx.readFile(join(dir, path));
131
+ }
132
+ catch {
133
+ return undefined;
134
+ }
135
+ };
136
+ const workspaceAfter = await current('pnpm-workspace.yaml');
137
+ const packages = [];
138
+ for (const glob of workspaceGlobs(workspaceAfter)) {
139
+ for (const pkgDir of await expand(ctx, dir, glob)) {
140
+ const path = `${pkgDir}/package.json`;
141
+ const [before, after] = await Promise.all([show(path), current(path)]);
142
+ packages.push({ path, before: manifest(before), after: manifest(after) });
143
+ }
144
+ }
145
+ const config = await current(`${CHANGESET_DIR}/config.json`);
146
+ const ignore = config ? (JSON.parse(config).ignore ?? []) : [];
147
+ const entries = await ctx.readDir(join(dir, CHANGESET_DIR)).catch(() => []);
148
+ const path = changesetPath(head);
149
+ return planChangeset({
150
+ branch: head,
151
+ packages,
152
+ catalogsBefore: parseCatalogs(await show('pnpm-workspace.yaml')),
153
+ catalogsAfter: parseCatalogs(workspaceAfter),
154
+ ignore,
155
+ exists: entries.some((e) => !e.directory && `${CHANGESET_DIR}/${e.name}` === path),
156
+ root: dir,
157
+ });
158
+ }
159
+ function manifest(text) {
160
+ return text === undefined ? undefined : JSON.parse(text);
161
+ }
162
+ /** `dir/*` lists the directories under dir; a glob without `*` is the path itself. */
163
+ async function expand(ctx, root, glob) {
164
+ const star = glob.indexOf('*');
165
+ if (star < 0)
166
+ return [glob.replace(/\/$/, '')];
167
+ const parent = glob.slice(0, star).replace(/\/$/, '');
168
+ const entries = await ctx.readDir(join(root, parent)).catch(() => []);
169
+ return entries
170
+ .filter((e) => e.directory && !e.name.startsWith('.'))
171
+ .map((e) => (parent ? `${parent}/${e.name}` : e.name))
172
+ .sort();
173
+ }
174
+ //# sourceMappingURL=changeset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeset.js","sourceRoot":"","sources":["../src/changeset.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAU,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAkB,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,OAAO;IAClB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;gBAEJ,OAAO,EAAE,OAAO,EAAE,EAAE,GAAE,EAAa;IAW/C,kFAAkF;IAClF,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAIlC,0EAA0E;IAC1E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAO,GAAG,IAAI;IAMnC;;;OAGG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,GAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAoB,GAAG,IAAI;IAOlE,iFAAiF;IACjF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAO1C;;;OAGG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjD,+EAA+E;IACzE,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAStC;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAOhC,OAAO;CAYtB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAU,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAkB,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,OAAO;IAClB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;gBAEJ,OAAO,EAAE,OAAO,EAAE,EAAE,GAAE,EAAa;IAW/C,kFAAkF;IAClF,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAIlC,0EAA0E;IAC1E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAO,GAAG,IAAI;IAMnC;;;OAGG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,GAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAoB,GAAG,IAAI;IAQlE,iFAAiF;IACjF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAO1C;;;OAGG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjD,+EAA+E;IACzE,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAStC;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAOhC,OAAO;CAYtB"}
package/dist/context.js CHANGED
@@ -48,6 +48,8 @@ export class Context {
48
48
  */
49
49
  result(data, human = renderHuman) {
50
50
  const text = this.json ? JSON.stringify(data, null, 2) : human(data);
51
+ if (text === '')
52
+ return; // an empty set prints nothing, not a blank line
51
53
  this.io.stdout.write(text.endsWith('\n') ? text : `${text}\n`);
52
54
  }
53
55
  // --- reads: always performed ---------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Context } from './context.ts';
2
+ /** App name → deploy target. */
3
+ export type DeployTargets = Record<string, string>;
4
+ export interface InventoryFile {
5
+ /** The file's path, for the error that names it. */
6
+ path: string;
7
+ target?: string;
8
+ apps: string[];
9
+ }
10
+ /** The two keys the verb reads from an inventory file's text; anything else is ignored. */
11
+ export declare function parseInventoryFile(path: string, text: string): InventoryFile;
12
+ /** The map from the files read: deterministic, and loud about an app with two targets. */
13
+ export declare function selectDeployTargets(files: InventoryFile[]): DeployTargets;
14
+ /** Read every group_vars and host_vars file under the inventory directory and map the apps. */
15
+ export declare function readDeployTargets(ctx: Context, inventory: string): Promise<DeployTargets>;
16
+ //# sourceMappingURL=deployTargets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployTargets.d.ts","sourceRoot":"","sources":["../src/deployTargets.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAS5E;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,CAazE;AAED,+FAA+F;AAC/F,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiB/F"}
@@ -0,0 +1,65 @@
1
+ // deploy-targets: where the deploy verb reaches each app a platform repo
2
+ // operates (§ 3 PLX-Platform), read from the repo's inventory.
3
+ //
4
+ // An inventory file, host_vars for a VM or group_vars for a group, carries
5
+ // `plexus_deploy_target` (ssh://<deploy user>@<address>[:<port>]) and the
6
+ // `plexus_apps` records it hosts, each with a `name`. The verb maps every app
7
+ // of a file that names a target to that target; an app whose file carries no
8
+ // target is left out, so the mount falls back to its one DEPLOY_HOST for it.
9
+ // An app declared in two files that both name a target has no one place to
10
+ // deploy to, and that is an error, never a pick.
11
+ //
12
+ // plx deploy-targets [inventory] # {"app": "ssh://...", ...}
13
+ import { join } from 'node:path';
14
+ import { parse } from 'yaml';
15
+ import { UsageError } from "./train.js";
16
+ const VARS_DIRS = ['group_vars', 'host_vars'];
17
+ /** The two keys the verb reads from an inventory file's text; anything else is ignored. */
18
+ export function parseInventoryFile(path, text) {
19
+ const data = parse(text);
20
+ const vars = data !== null && typeof data === 'object' ? data : {};
21
+ const target = typeof vars.plexus_deploy_target === 'string' ? vars.plexus_deploy_target : undefined;
22
+ const records = Array.isArray(vars.plexus_apps) ? vars.plexus_apps : [];
23
+ const apps = records
24
+ .map((r) => (r !== null && typeof r === 'object' ? r.name : undefined))
25
+ .filter((n) => typeof n === 'string');
26
+ return { path, target, apps };
27
+ }
28
+ /** The map from the files read: deterministic, and loud about an app with two targets. */
29
+ export function selectDeployTargets(files) {
30
+ const targets = {};
31
+ const declaredIn = {};
32
+ for (const file of [...files].sort((a, b) => a.path.localeCompare(b.path))) {
33
+ if (file.target === undefined)
34
+ continue;
35
+ for (const app of file.apps) {
36
+ if (app in targets)
37
+ throw new Error(`app "${app}" is declared with a deploy target in both ${declaredIn[app]} and ${file.path}`);
38
+ targets[app] = file.target;
39
+ declaredIn[app] = file.path;
40
+ }
41
+ }
42
+ return Object.fromEntries(Object.entries(targets).sort(([a], [b]) => a.localeCompare(b)));
43
+ }
44
+ /** Read every group_vars and host_vars file under the inventory directory and map the apps. */
45
+ export async function readDeployTargets(ctx, inventory) {
46
+ const files = [];
47
+ let found = false;
48
+ for (const sub of VARS_DIRS) {
49
+ const dir = join(inventory, sub);
50
+ const entries = await ctx.readDir(dir).catch(() => undefined);
51
+ if (entries === undefined)
52
+ continue;
53
+ found = true;
54
+ for (const e of entries) {
55
+ if (e.directory || !/\.ya?ml$/.test(e.name))
56
+ continue;
57
+ const path = join(dir, e.name);
58
+ files.push(parseInventoryFile(path, await ctx.readFile(path)));
59
+ }
60
+ }
61
+ if (!found && (await ctx.readDir(inventory).catch(() => undefined)) === undefined)
62
+ throw new UsageError(`no inventory directory at ${inventory}`);
63
+ return selectDeployTargets(files);
64
+ }
65
+ //# sourceMappingURL=deployTargets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployTargets.js","sourceRoot":"","sources":["../src/deployTargets.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export { bumpCollectionPin, bumpGalaxyVersion, bumpWorkflowRefs, hasConflictMarkers, hasUnmergedEntries, stampChanged, stampStandard, syncMarker, today, } from './bookkeeping.ts';
2
2
  export { CATALOG_DIRS, type Catalog, type Module, parseModule, readCatalog } from './catalog.ts';
3
+ export { type ChangedApps, type ChangedAppsInput, type Reason, readChangedApps, selectChangedApps, } from './changedApps.ts';
4
+ export { CHANGESET_DIR, type Changeset, type ChangesetInput, changesetPath, type DependencyChange, type Manifest, parseCatalogs, planChangeset, readChangeset, workspaceGlobs, } from './changeset.ts';
3
5
  export { type Consumer, expectedBranch, findConsumers, presetSource, type Site } from './consumers.ts';
4
6
  export { Context, type Options } from './context.ts';
5
7
  export { ANSWERS_FILE, type Answers, parseAnswers, TEMPLATE_FILES } from './copier.ts';
8
+ export { type DeployTargets, type InventoryFile, parseInventoryFile, readDeployTargets, selectDeployTargets, } from './deployTargets.ts';
6
9
  export { compareTrains, type Diagnosis, diagnose, type Report } from './doctor.ts';
7
10
  export { frontmatterField, setFrontmatterField } from './frontmatter.ts';
8
11
  export { type DirEntry, ExecError, type ExecOptions, type Io, realIo, render } from './io.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAAE,KAAK,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,KAAK,QAAQ,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EACL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,IAAI,EACT,MAAM,EACN,WAAW,EACX,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,KAAK,eAAe,EACpB,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EACX,KAAK,KAAK,EACV,KAAK,SAAS,EACd,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,KAAK,QAAQ,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EACL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,IAAI,EACT,MAAM,EACN,WAAW,EACX,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,KAAK,eAAe,EACpB,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EACX,KAAK,KAAK,EACV,KAAK,SAAS,EACd,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -8,9 +8,12 @@
8
8
  // Conventions: compendium/miscellaneous/cli-design.md.
9
9
  export { bumpCollectionPin, bumpGalaxyVersion, bumpWorkflowRefs, hasConflictMarkers, hasUnmergedEntries, stampChanged, stampStandard, syncMarker, today, } from "./bookkeeping.js";
10
10
  export { CATALOG_DIRS, parseModule, readCatalog } from "./catalog.js";
11
+ export { readChangedApps, selectChangedApps, } from "./changedApps.js";
12
+ export { CHANGESET_DIR, changesetPath, parseCatalogs, planChangeset, readChangeset, workspaceGlobs, } from "./changeset.js";
11
13
  export { expectedBranch, findConsumers, presetSource } from "./consumers.js";
12
14
  export { Context } from "./context.js";
13
15
  export { ANSWERS_FILE, parseAnswers, TEMPLATE_FILES } from "./copier.js";
16
+ export { parseInventoryFile, readDeployTargets, selectDeployTargets, } from "./deployTargets.js";
14
17
  export { compareTrains, diagnose } from "./doctor.js";
15
18
  export { frontmatterField, setFrontmatterField } from "./frontmatter.js";
16
19
  export { ExecError, realIo, render } from "./io.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAC9E,sEAAsE;AACtE,uDAAuD;AACvD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAA6B,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAAiB,cAAc,EAAE,aAAa,EAAE,YAAY,EAAa,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAgB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAkB,QAAQ,EAAe,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAiB,SAAS,EAA6B,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAoB,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAGL,SAAS,EAET,MAAM,EACN,WAAW,GAEZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAoB,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAa,GAAG,EAAa,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAEL,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,WAAW,EAGX,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqC,IAAI,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EAGX,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAC9E,sEAAsE;AACtE,uDAAuD;AACvD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAA6B,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAIL,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EAGb,aAAa,EAGb,aAAa,EACb,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAiB,cAAc,EAAE,aAAa,EAAE,YAAY,EAAa,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAgB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAGL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAkB,QAAQ,EAAe,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAiB,SAAS,EAA6B,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAoB,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAGL,SAAS,EAET,MAAM,EACN,WAAW,GAEZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAoB,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAa,GAAG,EAAa,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAEL,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,WAAW,EAGX,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqC,IAAI,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EAGX,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plexus-ms/lib",
3
- "version": "0.3.1",
3
+ "version": "0.5.0",
4
4
  "description": "The Plexus verbs as a library: the plan-then-apply core behind plx, and the one parser of Plexus's own file shapes",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "type": "module",
@@ -24,7 +24,7 @@
24
24
  "access": "public"
25
25
  },
26
26
  "engines": {
27
- "node": ">=24"
27
+ "node": ">=24.22.1"
28
28
  },
29
29
  "dependencies": {
30
30
  "yaml": "^2.9.1"