@tomflow/proflow-platform-cli 0.1.5 → 0.1.7
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/CHANGELOG.md +12 -0
- package/dist/deployment/adapter.d.ts +5 -5
- package/dist/deployment/descriptor.d.ts +1 -1
- package/dist/deployment/descriptor.js +1 -1
- package/dist/src/apply/current.d.ts +2 -1
- package/dist/src/apply/current.js +10 -2
- package/dist/src/cli.js +10 -24
- package/dist/src/persistence/effective-config.d.ts +3 -0
- package/dist/src/persistence/effective-config.js +20 -0
- package/package.json +3 -3
- package/proflow.module.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @tomflow/proflow-platform-cli
|
|
2
2
|
|
|
3
|
+
## 0.1.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Rebuild upgrade apply staleness from the current persisted Workspace configuration so unchanged config remains fresh while configuration drift becomes PLAN_STALE instead of being misreported as missing required config.
|
|
8
|
+
|
|
9
|
+
## 0.1.6
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Carry persisted workspace configuration into Registry-backed upgrade planning, with explicit --config values overlaying stored values, so newly published descriptors cannot falsely report existing required configuration as missing before package mutation.
|
|
14
|
+
|
|
3
15
|
## 0.1.5
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -5,7 +5,7 @@ export declare const behaviorAdapter: {
|
|
|
5
5
|
ok: boolean;
|
|
6
6
|
status: "SUCCEEDED";
|
|
7
7
|
moduleRef: "platform-cli";
|
|
8
|
-
moduleVersion: "0.1.
|
|
8
|
+
moduleVersion: "0.1.7";
|
|
9
9
|
data?: {} | null;
|
|
10
10
|
};
|
|
11
11
|
observedEffects: never[];
|
|
@@ -16,7 +16,7 @@ export declare const behaviorAdapter: {
|
|
|
16
16
|
ok: boolean;
|
|
17
17
|
status: "SUCCEEDED";
|
|
18
18
|
moduleRef: "platform-cli";
|
|
19
|
-
moduleVersion: "0.1.
|
|
19
|
+
moduleVersion: "0.1.7";
|
|
20
20
|
data?: {} | null;
|
|
21
21
|
};
|
|
22
22
|
observedEffects: never[];
|
|
@@ -27,7 +27,7 @@ export declare const behaviorAdapter: {
|
|
|
27
27
|
ok: boolean;
|
|
28
28
|
status: "SUCCEEDED";
|
|
29
29
|
moduleRef: "platform-cli";
|
|
30
|
-
moduleVersion: "0.1.
|
|
30
|
+
moduleVersion: "0.1.7";
|
|
31
31
|
data?: {} | null;
|
|
32
32
|
};
|
|
33
33
|
observedEffects: never[];
|
|
@@ -38,7 +38,7 @@ export declare const behaviorAdapter: {
|
|
|
38
38
|
ok: boolean;
|
|
39
39
|
status: "SUCCEEDED";
|
|
40
40
|
moduleRef: "platform-cli";
|
|
41
|
-
moduleVersion: "0.1.
|
|
41
|
+
moduleVersion: "0.1.7";
|
|
42
42
|
data?: {} | null;
|
|
43
43
|
};
|
|
44
44
|
observedEffects: never[];
|
|
@@ -49,7 +49,7 @@ export declare const behaviorAdapter: {
|
|
|
49
49
|
ok: boolean;
|
|
50
50
|
status: "SUCCEEDED";
|
|
51
51
|
moduleRef: "platform-cli";
|
|
52
|
-
moduleVersion: "0.1.
|
|
52
|
+
moduleVersion: "0.1.7";
|
|
53
53
|
data?: {} | null;
|
|
54
54
|
};
|
|
55
55
|
observedEffects: never[];
|
|
@@ -3,7 +3,7 @@ export declare const descriptor: {
|
|
|
3
3
|
readonly contractVersion: "1.0.0";
|
|
4
4
|
readonly moduleRef: "platform-cli";
|
|
5
5
|
readonly packageName: "@tomflow/proflow-platform-cli";
|
|
6
|
-
readonly moduleVersion: "0.1.
|
|
6
|
+
readonly moduleVersion: "0.1.7";
|
|
7
7
|
readonly kind: "cli";
|
|
8
8
|
readonly templateVersion: "1.0.0";
|
|
9
9
|
readonly platformCompatibility: ">=1.0.0 <2.0.0";
|
|
@@ -3,7 +3,7 @@ export const descriptor = {
|
|
|
3
3
|
contractVersion: "1.0.0",
|
|
4
4
|
moduleRef: "platform-cli",
|
|
5
5
|
packageName: "@tomflow/proflow-platform-cli",
|
|
6
|
-
moduleVersion: "0.1.
|
|
6
|
+
moduleVersion: "0.1.7",
|
|
7
7
|
kind: "cli",
|
|
8
8
|
templateVersion: "1.0.0",
|
|
9
9
|
platformCompatibility: ">=1.0.0 <2.0.0",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DeploymentPlan } from "../contracts.ts";
|
|
2
2
|
import type { ModuleCatalog } from "../modules.ts";
|
|
3
|
+
import type { WorkspacePaths } from "../paths.ts";
|
|
3
4
|
import type { PlanInput } from "../planner/plan.ts";
|
|
4
|
-
export declare function rebuildCurrentAssumptions(catalog: ModuleCatalog, plan: DeploymentPlan): Promise<PlanInput>;
|
|
5
|
+
export declare function rebuildCurrentAssumptions(catalog: ModuleCatalog, plan: DeploymentPlan, paths: WorkspacePaths): Promise<PlanInput>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parseModuleDescriptor, } from "@tomflow/proflow-module-contract";
|
|
2
2
|
import { discoverModules } from "../discovery/index.js";
|
|
3
3
|
import { doctorModules } from "../doctor/index.js";
|
|
4
|
+
import { mergeEffectiveConfig } from "../persistence/effective-config.js";
|
|
4
5
|
import { diagnoseRepair } from "../planner/repair.js";
|
|
5
6
|
function moduleSourceOf(module) {
|
|
6
7
|
if (module.source.type === "registry") {
|
|
@@ -27,7 +28,7 @@ async function loadDescriptors(catalog, modules) {
|
|
|
27
28
|
// are re-discovered and re-parsed so descriptor drift reaches the staleness
|
|
28
29
|
// gate. Upgrade additionally re-discovers current descriptors and reuses the
|
|
29
30
|
// plan's frozen target descriptors; repair re-runs doctor for fresh facts.
|
|
30
|
-
export async function rebuildCurrentAssumptions(catalog, plan) {
|
|
31
|
+
export async function rebuildCurrentAssumptions(catalog, plan, paths) {
|
|
31
32
|
if ((plan.intent === "install" || plan.intent === "upgrade") &&
|
|
32
33
|
plan.resolvedModules.every((module) => module.source.type === "registry")) {
|
|
33
34
|
return {
|
|
@@ -46,12 +47,19 @@ export async function rebuildCurrentAssumptions(catalog, plan) {
|
|
|
46
47
|
}
|
|
47
48
|
if (plan.intent === "upgrade") {
|
|
48
49
|
const currentDescriptors = await loadDescriptors(catalog, modules);
|
|
50
|
+
const config = await mergeEffectiveConfig(paths, modules, {});
|
|
49
51
|
if (plan.targetDescriptors === undefined)
|
|
50
|
-
return {
|
|
52
|
+
return {
|
|
53
|
+
intent: plan.intent,
|
|
54
|
+
modules,
|
|
55
|
+
targets: plan.moduleTargets,
|
|
56
|
+
config,
|
|
57
|
+
};
|
|
51
58
|
return {
|
|
52
59
|
intent: plan.intent,
|
|
53
60
|
modules,
|
|
54
61
|
targets: plan.moduleTargets,
|
|
62
|
+
config,
|
|
55
63
|
currentDescriptors,
|
|
56
64
|
targetDescriptors: plan.targetDescriptors,
|
|
57
65
|
};
|
package/dist/src/cli.js
CHANGED
|
@@ -20,6 +20,7 @@ import { buildManifest } from "./manifest/manifest.js";
|
|
|
20
20
|
import { writeDeploymentObserverSummary } from "./observer/deployment-summary.js";
|
|
21
21
|
import { workspacePaths } from "./paths.js";
|
|
22
22
|
import { loadConfig } from "./persistence/config.js";
|
|
23
|
+
import { mergeEffectiveConfig } from "./persistence/effective-config.js";
|
|
23
24
|
import { loadPlan, savePlan } from "./persistence/plans.js";
|
|
24
25
|
import { planDeployment } from "./planner/plan.js";
|
|
25
26
|
import { diagnoseRepair } from "./planner/repair.js";
|
|
@@ -309,30 +310,13 @@ async function handleInstallerPreflight(root) {
|
|
|
309
310
|
: "BLOCKED";
|
|
310
311
|
return outcome("preflight", status, result);
|
|
311
312
|
}
|
|
312
|
-
async function loadEffectiveConfig(
|
|
313
|
-
|
|
314
|
-
for (const module of modules) {
|
|
315
|
-
const stored = await loadConfig(ctx.paths, module.moduleRef);
|
|
316
|
-
if (stored === undefined)
|
|
317
|
-
continue;
|
|
318
|
-
effective[module.moduleRef] = {
|
|
319
|
-
...stored.publicValues,
|
|
320
|
-
...stored.secretValues,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
const provided = await loadConfigFile(configFile);
|
|
324
|
-
for (const [moduleRef, values] of Object.entries(provided)) {
|
|
325
|
-
effective[moduleRef] = {
|
|
326
|
-
...(effective[moduleRef] ?? {}),
|
|
327
|
-
...values,
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
return effective;
|
|
313
|
+
async function loadEffectiveConfig(paths, modules, configFile) {
|
|
314
|
+
return mergeEffectiveConfig(paths, modules, await loadConfigFile(configFile));
|
|
331
315
|
}
|
|
332
316
|
async function handlePreflight(ctx, args) {
|
|
333
317
|
const modules = await discoverModules({ catalog: ctx.catalog });
|
|
334
318
|
const selected = selectModules(modules, args.positional[0]);
|
|
335
|
-
const config = await loadEffectiveConfig(ctx, selected, args.configFile);
|
|
319
|
+
const config = await loadEffectiveConfig(ctx.paths, selected, args.configFile);
|
|
336
320
|
const result = await runPreflight(selected, {
|
|
337
321
|
config,
|
|
338
322
|
catalog: ctx.catalog,
|
|
@@ -381,7 +365,9 @@ async function handlePlan(ctx, args) {
|
|
|
381
365
|
}
|
|
382
366
|
const modules = await discoverModules({ catalog: ctx.catalog });
|
|
383
367
|
const selected = selectModules(modules, args.positional[0]);
|
|
384
|
-
const config =
|
|
368
|
+
const config = args.intent === "upgrade"
|
|
369
|
+
? await loadEffectiveConfig(ctx.paths, selected, args.configFile)
|
|
370
|
+
: await loadConfigFile(args.configFile);
|
|
385
371
|
if (intent === "uninstall") {
|
|
386
372
|
if (args.positional[0] === undefined) {
|
|
387
373
|
throw new PlatformError("INVALID_REQUEST", "uninstall plan requires <moduleRef|packageName>");
|
|
@@ -497,7 +483,7 @@ async function handleApply(ctx, args) {
|
|
|
497
483
|
if (plan === undefined) {
|
|
498
484
|
throw new PlatformError("PLAN_NOT_FOUND", `plan ${planRef} not found`);
|
|
499
485
|
}
|
|
500
|
-
const current = await rebuildCurrentAssumptions(ctx.catalog, plan);
|
|
486
|
+
const current = await rebuildCurrentAssumptions(ctx.catalog, plan, ctx.paths);
|
|
501
487
|
const result = await applyPlan({
|
|
502
488
|
paths: ctx.paths,
|
|
503
489
|
planRef,
|
|
@@ -839,7 +825,7 @@ async function handlePlatformInstanceUninstall(args, runtime) {
|
|
|
839
825
|
uninstallScope: "platform-instance",
|
|
840
826
|
});
|
|
841
827
|
await savePlan(ctx.paths, plan);
|
|
842
|
-
const current = await rebuildCurrentAssumptions(ctx.catalog, plan);
|
|
828
|
+
const current = await rebuildCurrentAssumptions(ctx.catalog, plan, ctx.paths);
|
|
843
829
|
const applied = await applyPlan({
|
|
844
830
|
paths: ctx.paths,
|
|
845
831
|
planRef: plan.planRef,
|
|
@@ -959,7 +945,7 @@ async function handleDoctor(ctx, args) {
|
|
|
959
945
|
async function handleManifest(ctx, args) {
|
|
960
946
|
const modules = await discoverModules({ catalog: ctx.catalog });
|
|
961
947
|
const selected = selectModules(modules, args.positional[0]);
|
|
962
|
-
const config = await loadEffectiveConfig(ctx, selected, args.configFile);
|
|
948
|
+
const config = await loadEffectiveConfig(ctx.paths, selected, args.configFile);
|
|
963
949
|
const manifest = await buildManifest({
|
|
964
950
|
catalog: ctx.catalog,
|
|
965
951
|
modules: selected,
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ResolvedModule } from "../contracts.ts";
|
|
2
|
+
import type { WorkspacePaths } from "../paths.ts";
|
|
3
|
+
export declare function mergeEffectiveConfig(paths: WorkspacePaths, modules: readonly ResolvedModule[], provided: Record<string, Record<string, string>>): Promise<Record<string, Record<string, string>>>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { loadConfig } from "./config.js";
|
|
2
|
+
export async function mergeEffectiveConfig(paths, modules, provided) {
|
|
3
|
+
const effective = {};
|
|
4
|
+
for (const module of modules) {
|
|
5
|
+
const stored = await loadConfig(paths, module.moduleRef);
|
|
6
|
+
if (stored === undefined)
|
|
7
|
+
continue;
|
|
8
|
+
effective[module.moduleRef] = {
|
|
9
|
+
...stored.publicValues,
|
|
10
|
+
...stored.secretValues,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
for (const [moduleRef, values] of Object.entries(provided)) {
|
|
14
|
+
effective[moduleRef] = {
|
|
15
|
+
...(effective[moduleRef] ?? {}),
|
|
16
|
+
...values,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return effective;
|
|
20
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomflow/proflow-platform-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"@tomflow/proflow-module-contract": "^0.1.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@tomflow/proflow-
|
|
28
|
-
"@tomflow/proflow-
|
|
27
|
+
"@tomflow/proflow-deployment-conformance": "^0.1.2",
|
|
28
|
+
"@tomflow/proflow-module-template": "^0.1.2"
|
|
29
29
|
},
|
|
30
30
|
"description": "Deterministic platform-level deployment discovery, planning, lifecycle and verification CLI.",
|
|
31
31
|
"keywords": [
|
package/proflow.module.json
CHANGED