@withandeo/cli 0.19.8 → 0.19.10
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 +44 -3
- package/dist/api.d.ts +27 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +20 -0
- package/dist/api.js.map +1 -1
- package/dist/artifact.d.ts.map +1 -1
- package/dist/artifact.js +26 -0
- package/dist/artifact.js.map +1 -1
- package/dist/capability-preflight.d.ts.map +1 -1
- package/dist/capability-preflight.js +19 -0
- package/dist/capability-preflight.js.map +1 -1
- package/dist/contracts.d.ts +46 -3
- package/dist/contracts.d.ts.map +1 -1
- package/dist/documentation.d.ts +13 -3
- package/dist/documentation.d.ts.map +1 -1
- package/dist/documentation.js +108 -12
- package/dist/documentation.js.map +1 -1
- package/dist/flagship-contract.d.ts +63 -0
- package/dist/flagship-contract.d.ts.map +1 -0
- package/dist/flagship-contract.js +117 -0
- package/dist/flagship-contract.js.map +1 -0
- package/dist/flagship-package.d.ts +3 -0
- package/dist/flagship-package.d.ts.map +1 -0
- package/dist/flagship-package.js +31 -0
- package/dist/flagship-package.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +177 -17
- package/dist/main.js.map +1 -1
- package/dist/public-skill-contract.d.ts +21 -0
- package/dist/public-skill-contract.d.ts.map +1 -0
- package/dist/public-skill-contract.js +47 -0
- package/dist/public-skill-contract.js.map +1 -0
- package/dist/workflow-dev.d.ts.map +1 -1
- package/dist/workflow-dev.js +2 -0
- package/dist/workflow-dev.js.map +1 -1
- package/dist/workflow-package.d.ts.map +1 -1
- package/dist/workflow-package.js +3 -0
- package/dist/workflow-package.js.map +1 -1
- package/package.json +1 -1
- package/skill/publication.json +3 -0
- package/skill/tender-accounts/SKILL.md +3 -1
- package/skill/tender-accounts/references/feature-flags.md +90 -0
- package/skill/tender-accounts/references/managed-source.md +45 -2
- package/skill/tender-accounts/references/skills.md +7 -0
package/dist/documentation.js
CHANGED
|
@@ -3,7 +3,8 @@ import { lstat, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { CliError } from "./errors.js";
|
|
6
|
-
|
|
6
|
+
import { MAX_PUBLIC_SKILL_BYTES, PUBLIC_SKILL_URL, parsePublicSkillBundle, verifyPublicSkillBundle } from "./public-skill-contract.js";
|
|
7
|
+
export const DOC_TOPICS = ["authentication", "managed-source", "delivery", "email", "workflows", "configuration-secrets", "storage", "services", "domains-auth", "observability", "releases-recovery", "skills", "feature-flags"];
|
|
7
8
|
const root = fileURLToPath(new URL("../skill/tender-accounts/", import.meta.url));
|
|
8
9
|
const files = ["SKILL.md", ...DOC_TOPICS.map(topic => `references/${topic}.md`)];
|
|
9
10
|
export async function readDocumentation(topic) {
|
|
@@ -25,7 +26,7 @@ async function rejectSymlink(path) {
|
|
|
25
26
|
if (info?.isSymbolicLink())
|
|
26
27
|
throw new CliError("skill_target_unsafe", "Skill installation cannot follow symbolic links.");
|
|
27
28
|
}
|
|
28
|
-
export async function installDocumentation(base, force, version) {
|
|
29
|
+
export async function installDocumentation(base, force, version, options = {}) {
|
|
29
30
|
const target = resolve(base, "andeo");
|
|
30
31
|
// The explicitly selected base may use an OS alias such as /var -> /private/var.
|
|
31
32
|
// Never follow links within the skill directory we own.
|
|
@@ -37,34 +38,129 @@ export async function installDocumentation(base, force, version) {
|
|
|
37
38
|
});
|
|
38
39
|
if (exists && !force)
|
|
39
40
|
throw new CliError("skill_exists", `An Andeo skill already exists at ${target}.`, "andeo skill install --force");
|
|
40
|
-
|
|
41
|
+
let remote;
|
|
42
|
+
let warning;
|
|
43
|
+
if (!options.bundled) {
|
|
44
|
+
try {
|
|
45
|
+
remote = await fetchPublicSkill(version, options.fetcher ?? fetch);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// Never downgrade an existing installation after an outage. A fresh install
|
|
49
|
+
// can use the offline bundle, but integrity/compatibility errors fail closed.
|
|
50
|
+
if (!(error instanceof CliError) || error.code !== "public_skill_unavailable" || exists)
|
|
51
|
+
throw error;
|
|
52
|
+
warning = "Public skill unavailable; installed the bundled offline guide. Retry skill install --force to refresh.";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const entries = remote?.files ?? await bundle();
|
|
41
56
|
await rejectSymlink(resolve(target, "references"));
|
|
42
|
-
for (const path of [...
|
|
57
|
+
for (const path of [...entries.map(entry => entry.path), "bundle.json"])
|
|
43
58
|
await rejectSymlink(resolve(target, path));
|
|
44
59
|
await mkdir(resolve(target, "references"), { recursive: true });
|
|
45
60
|
// Preserve unrelated user files; replace only this explicitly owned inventory.
|
|
46
61
|
for (const entry of entries)
|
|
47
62
|
await writeFile(resolve(target, entry.path), entry.content);
|
|
48
|
-
|
|
63
|
+
const source = remote ? "public" : "bundled";
|
|
64
|
+
await writeFile(resolve(target, "bundle.json"), JSON.stringify({ schema: "andeo.skill-bundle/v1", version, source,
|
|
65
|
+
...(remote ? { revision: remote.revision, minimumCliVersion: remote.minimumCliVersion } : {}),
|
|
49
66
|
files: Object.fromEntries(entries.map(entry => [entry.path, digest(entry.content)])) }, null, 2) + "\n");
|
|
50
|
-
return { path: resolve(target, "SKILL.md"), version, files:
|
|
67
|
+
return { path: resolve(target, "SKILL.md"), version, source, files: entries.length,
|
|
68
|
+
...(remote ? { revision: remote.revision, minimumCliVersion: remote.minimumCliVersion } : {}),
|
|
69
|
+
...(warning ? { warning } : {}) };
|
|
51
70
|
}
|
|
52
|
-
export async function installedSkillCheck(home) {
|
|
53
|
-
const entries = await bundle();
|
|
71
|
+
export async function installedSkillCheck(home, options = {}) {
|
|
54
72
|
const found = [];
|
|
55
73
|
for (const parent of [".agents/skills", ".claude/skills"]) {
|
|
56
74
|
const target = resolve(home, parent, "andeo");
|
|
57
75
|
if (!await lstat(target).catch(() => null))
|
|
58
76
|
continue;
|
|
59
|
-
found.push(parent);
|
|
77
|
+
found.push({ parent, target });
|
|
78
|
+
}
|
|
79
|
+
if (!found.length)
|
|
80
|
+
return { name: "skill", status: "warn",
|
|
81
|
+
message: "No global Andeo skill found; run andeo skill install --agent codex (custom installations are not inspected)." };
|
|
82
|
+
let entries;
|
|
83
|
+
if (options.cliVersion) {
|
|
84
|
+
try {
|
|
85
|
+
entries = (await fetchPublicSkill(options.cliVersion, options.fetcher ?? fetch)).files;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return { name: "skill", status: "warn", message: error instanceof CliError
|
|
89
|
+
? `${error.message} ${error.hint ?? ""}`.trim() : "Unable to check the latest public skill; installed files were left unchanged." };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
entries = await bundle();
|
|
94
|
+
for (const { parent, target } of found) {
|
|
60
95
|
for (const entry of entries) {
|
|
61
96
|
const content = await readFile(resolve(target, entry.path), "utf8").catch(() => null);
|
|
62
97
|
if (content === null || digest(content) !== digest(entry.content))
|
|
63
98
|
return { name: "skill", status: "warn",
|
|
64
|
-
message: `Installed skill at ${target} differs from this CLI bundle; review local edits, then run andeo skill install --agent ${parent.startsWith(".agents") ? "codex" : "claude"} --force.` };
|
|
99
|
+
message: `Installed skill at ${target} differs from ${options.cliVersion ? "the latest public skill" : "this CLI bundle"}; review local edits, then run andeo skill install --agent ${parent.startsWith(".agents") ? "codex" : "claude"} --force.` };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { name: "skill", status: "pass", message: options.cliVersion
|
|
103
|
+
? "Installed global skill matches the latest public skill." : "Installed global skill matches this CLI bundle." };
|
|
104
|
+
}
|
|
105
|
+
async function fetchPublicSkill(version, fetcher) {
|
|
106
|
+
let response;
|
|
107
|
+
try {
|
|
108
|
+
response = await fetcher(PUBLIC_SKILL_URL, { redirect: "error", credentials: "omit",
|
|
109
|
+
signal: AbortSignal.timeout(5000), headers: { accept: "application/json" } });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw publicUnavailable();
|
|
113
|
+
}
|
|
114
|
+
if (response.status !== 200) {
|
|
115
|
+
await response.body?.cancel().catch(() => undefined);
|
|
116
|
+
throw publicUnavailable();
|
|
117
|
+
}
|
|
118
|
+
let bytes;
|
|
119
|
+
try {
|
|
120
|
+
if (!response.body)
|
|
121
|
+
throw new Error("Missing body");
|
|
122
|
+
const reader = response.body.getReader(), chunks = [];
|
|
123
|
+
let length = 0;
|
|
124
|
+
while (true) {
|
|
125
|
+
const next = await reader.read();
|
|
126
|
+
if (next.done)
|
|
127
|
+
break;
|
|
128
|
+
length += next.value.byteLength;
|
|
129
|
+
if (length > MAX_PUBLIC_SKILL_BYTES) {
|
|
130
|
+
await reader.cancel().catch(() => undefined);
|
|
131
|
+
throw new CliError("public_skill_invalid", "The public skill exceeds its size limit.");
|
|
132
|
+
}
|
|
133
|
+
chunks.push(next.value);
|
|
134
|
+
}
|
|
135
|
+
bytes = new Uint8Array(length);
|
|
136
|
+
let offset = 0;
|
|
137
|
+
for (const chunk of chunks) {
|
|
138
|
+
bytes.set(chunk, offset);
|
|
139
|
+
offset += chunk.byteLength;
|
|
65
140
|
}
|
|
66
141
|
}
|
|
67
|
-
|
|
68
|
-
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof CliError)
|
|
144
|
+
throw error;
|
|
145
|
+
throw publicUnavailable();
|
|
146
|
+
}
|
|
147
|
+
let result;
|
|
148
|
+
try {
|
|
149
|
+
result = parsePublicSkillBundle(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
|
|
150
|
+
await verifyPublicSkillBundle(result, async (content) => digest(content));
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new CliError("public_skill_invalid", "The public skill failed integrity validation. Installed files were left unchanged.");
|
|
154
|
+
}
|
|
155
|
+
const current = version.split(".").map(Number), minimum = result.minimumCliVersion.split(".").map(Number);
|
|
156
|
+
const older = current.length !== 3 || current.some(value => !Number.isSafeInteger(value))
|
|
157
|
+
|| current[0] < minimum[0] || current[0] === minimum[0] && (current[1] < minimum[1]
|
|
158
|
+
|| current[1] === minimum[1] && current[2] < minimum[2]);
|
|
159
|
+
if (older)
|
|
160
|
+
throw new CliError("skill_cli_upgrade_required", `This skill requires CLI ${result.minimumCliVersion} or newer.`, "Update @withandeo/cli, then run andeo skill install --force.");
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
function publicUnavailable() {
|
|
164
|
+
return new CliError("public_skill_unavailable", "The public Andeo skill is unavailable; existing installations were left unchanged.", "Retry andeo skill install --force, or use --bundled to explicitly install this CLI's offline guide.");
|
|
69
165
|
}
|
|
70
166
|
//# sourceMappingURL=documentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Shared admission contract. No runtime rules engine: Cloudflare owns evaluation. */
|
|
2
|
+
export type FlagEnvironment = "development" | "preview" | "production";
|
|
3
|
+
export interface FlagBinding {
|
|
4
|
+
binding: string;
|
|
5
|
+
app_id: string;
|
|
6
|
+
}
|
|
7
|
+
export interface FlagBindings {
|
|
8
|
+
flagship: FlagBinding[];
|
|
9
|
+
env: {
|
|
10
|
+
preview: {
|
|
11
|
+
flagship: FlagBinding[];
|
|
12
|
+
};
|
|
13
|
+
production: {
|
|
14
|
+
flagship: FlagBinding[];
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function flagEnvironment(value: unknown): FlagEnvironment;
|
|
19
|
+
export declare function flagBindings(value: unknown): FlagBinding[];
|
|
20
|
+
export declare function parseFlagBindings(value: unknown): FlagBindings | undefined;
|
|
21
|
+
export declare function selectedFlagBindings(value: FlagBindings | undefined, environment: FlagEnvironment): FlagBinding[];
|
|
22
|
+
export declare function flagKey(value: unknown): string;
|
|
23
|
+
export declare function customerIds(value: unknown): string[];
|
|
24
|
+
export declare function rolloutPercentage(value: unknown): number;
|
|
25
|
+
export interface BooleanFlag {
|
|
26
|
+
key: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
default_variation: "off";
|
|
30
|
+
variations: {
|
|
31
|
+
off: false;
|
|
32
|
+
on: true;
|
|
33
|
+
};
|
|
34
|
+
rules: Array<{
|
|
35
|
+
priority: number;
|
|
36
|
+
conditions: Array<{
|
|
37
|
+
attribute: "customerId";
|
|
38
|
+
operator: "in";
|
|
39
|
+
value: string[];
|
|
40
|
+
}>;
|
|
41
|
+
serve_variation: "on";
|
|
42
|
+
rollout?: {
|
|
43
|
+
percentage: number;
|
|
44
|
+
attribute: "customerId";
|
|
45
|
+
};
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
export declare function booleanFlag(key: string, enabled?: boolean, ids?: string[], percentage?: number, description?: string): BooleanFlag;
|
|
49
|
+
/** Reject unsupported dashboard edits instead of erasing them. Provider metadata is excluded. */
|
|
50
|
+
export declare function supportedFlag(value: unknown): {
|
|
51
|
+
definition: BooleanFlag;
|
|
52
|
+
ids: string[];
|
|
53
|
+
percentage: number;
|
|
54
|
+
};
|
|
55
|
+
export type FlagAction = "create" | "enable" | "disable" | "audience" | "rollout";
|
|
56
|
+
export declare function changeFlag(current: unknown, action: FlagAction, input: {
|
|
57
|
+
key: string;
|
|
58
|
+
customerIds?: unknown;
|
|
59
|
+
percentage?: unknown;
|
|
60
|
+
all?: boolean;
|
|
61
|
+
}): Record<string, unknown>;
|
|
62
|
+
export declare function record(value: unknown): value is Record<string, unknown>;
|
|
63
|
+
//# sourceMappingURL=flagship-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flagship-contract.d.ts","sourceRoot":"","sources":["../src/flagship-contract.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;AACvE,MAAM,WAAW,WAAW;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAChE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,GAAG,EAAE;QAAE,OAAO,EAAE;YAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;SAAE,CAAC;QAAC,UAAU,EAAE;YAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CACxF;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAG/D;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAW1D;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAe1E;AACD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,WAAW,EAAE,eAAe,GAAG,WAAW,EAAE,CAEjH;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9C;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAGpD;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGxD;AACD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,KAAK,CAAC;IAC9E,UAAU,EAAE;QAAE,GAAG,EAAE,KAAK,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;IACrC,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,KAAK,CAAC;YAAC,SAAS,EAAE,YAAY,CAAC;YAAC,QAAQ,EAAE,IAAI,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAC,CAAC,CAAC;QAC7G,eAAe,EAAE,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,YAAY,CAAA;SAAC,CAAA;KAAE,CAAC,CAAC;CACrF;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,GAAG,GAAE,MAAM,EAAO,EAAE,UAAU,SAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAM/H;AACD,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,UAAU,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiB5G;AACD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAClF,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAe1K;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAA0E"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export function flagEnvironment(value) {
|
|
2
|
+
if (value !== "development" && value !== "preview" && value !== "production")
|
|
3
|
+
throw new Error("flagship_environment_invalid");
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
export function flagBindings(value) {
|
|
7
|
+
if (!Array.isArray(value) || value.length > 8)
|
|
8
|
+
throw new Error("flagship_bindings_invalid");
|
|
9
|
+
const names = new Set();
|
|
10
|
+
return value.map(item => {
|
|
11
|
+
if (!record(item) || Object.keys(item).some(k => k !== "binding" && k !== "app_id")
|
|
12
|
+
|| typeof item.binding !== "string" || !/^[A-Z][A-Z0-9_]{2,63}$/.test(item.binding)
|
|
13
|
+
|| /^(TENDER_|ANDEO_)/.test(item.binding) || item.binding === "ASSETS" || names.has(item.binding)
|
|
14
|
+
|| typeof item.app_id !== "string" || !/^[A-Za-z0-9_-]{1,128}$/.test(item.app_id))
|
|
15
|
+
throw new Error("flagship_bindings_invalid");
|
|
16
|
+
names.add(item.binding);
|
|
17
|
+
return { binding: item.binding, app_id: item.app_id };
|
|
18
|
+
}).sort((a, b) => a.binding.localeCompare(b.binding));
|
|
19
|
+
}
|
|
20
|
+
export function parseFlagBindings(value) {
|
|
21
|
+
if (value === undefined)
|
|
22
|
+
return undefined;
|
|
23
|
+
if (!record(value) || Object.keys(value).some(k => !["flagship", "env"].includes(k))
|
|
24
|
+
|| !record(value.env) || Object.keys(value.env).some(k => !["preview", "production"].includes(k)))
|
|
25
|
+
throw new Error("flagship_config_invalid");
|
|
26
|
+
const environments = value.env;
|
|
27
|
+
const environment = (name) => {
|
|
28
|
+
const entry = environments[name];
|
|
29
|
+
if (!record(entry) || Object.keys(entry).some(k => k !== "flagship"))
|
|
30
|
+
throw new Error("flagship_environment_missing");
|
|
31
|
+
return { flagship: flagBindings(entry.flagship) };
|
|
32
|
+
};
|
|
33
|
+
const result = { flagship: flagBindings(value.flagship), env: { preview: environment("preview"), production: environment("production") } };
|
|
34
|
+
// Same names in every environment; explicit empty lists are supported only together.
|
|
35
|
+
const names = result.flagship.map(b => b.binding).join(",");
|
|
36
|
+
for (const entry of Object.values(result.env))
|
|
37
|
+
if (entry.flagship.map(b => b.binding).join(",") !== names)
|
|
38
|
+
throw new Error("flagship_environment_binding_mismatch");
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
export function selectedFlagBindings(value, environment) {
|
|
42
|
+
return value === undefined ? [] : environment === "development" ? value.flagship : value.env[environment].flagship;
|
|
43
|
+
}
|
|
44
|
+
export function flagKey(value) {
|
|
45
|
+
if (typeof value !== "string" || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/.test(value))
|
|
46
|
+
throw new Error("flagship_key_invalid");
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
export function customerIds(value) {
|
|
50
|
+
if (!Array.isArray(value) || value.length > 1000 || value.some(id => typeof id !== "string" || !id.trim() || id !== id.trim() || id.length > 128 || /[\x00-\x1f\x7f]/.test(id)))
|
|
51
|
+
throw new Error("flagship_audience_invalid");
|
|
52
|
+
return [...new Set(value)].sort();
|
|
53
|
+
}
|
|
54
|
+
export function rolloutPercentage(value) {
|
|
55
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 100 || Number(value.toFixed(2)) !== value)
|
|
56
|
+
throw new Error("flagship_percentage_invalid");
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
export function booleanFlag(key, enabled = false, ids = [], percentage = 0, description) {
|
|
60
|
+
ids = customerIds(ids);
|
|
61
|
+
percentage = rolloutPercentage(percentage);
|
|
62
|
+
return { key: flagKey(key), ...(description === undefined ? {} : { description }), enabled, default_variation: "off", variations: { off: false, on: true }, rules: [
|
|
63
|
+
...(ids.length ? [{ priority: 1, conditions: [{ attribute: "customerId", operator: "in", value: ids }], serve_variation: "on" }] : []),
|
|
64
|
+
...(percentage > 0 ? [{ priority: 2, conditions: [], serve_variation: "on", rollout: { percentage, attribute: "customerId" } }] : []),
|
|
65
|
+
] };
|
|
66
|
+
}
|
|
67
|
+
/** Reject unsupported dashboard edits instead of erasing them. Provider metadata is excluded. */
|
|
68
|
+
export function supportedFlag(value) {
|
|
69
|
+
if (!record(value) || typeof value.enabled !== "boolean" || value.default_variation !== "off" || !record(value.variations)
|
|
70
|
+
|| value.variations.off !== false || value.variations.on !== true || Object.keys(value.variations).length !== 2
|
|
71
|
+
|| !Array.isArray(value.rules) || value.rules.length > 2 || (value.description != null && typeof value.description !== "string"))
|
|
72
|
+
throw new Error("flagship_reconciliation_required");
|
|
73
|
+
let ids = [], percentage = 0;
|
|
74
|
+
for (const rule of value.rules) {
|
|
75
|
+
if (!record(rule) || Object.keys(rule).some(k => !["priority", "conditions", "serve_variation", "rollout"].includes(k)) || rule.serve_variation !== "on" || !Array.isArray(rule.conditions))
|
|
76
|
+
throw new Error("flagship_reconciliation_required");
|
|
77
|
+
if (rule.priority === 1 && rule.conditions.length === 1 && rule.rollout === undefined && !ids.length) {
|
|
78
|
+
const condition = rule.conditions[0];
|
|
79
|
+
if (!record(condition) || Object.keys(condition).some(k => !["attribute", "operator", "value"].includes(k)) || condition.attribute !== "customerId" || condition.operator !== "in")
|
|
80
|
+
throw new Error("flagship_reconciliation_required");
|
|
81
|
+
ids = customerIds(condition.value);
|
|
82
|
+
if (!ids.length)
|
|
83
|
+
throw new Error("flagship_reconciliation_required");
|
|
84
|
+
}
|
|
85
|
+
else if (rule.priority === 2 && rule.conditions.length === 0 && record(rule.rollout) && percentage === 0
|
|
86
|
+
&& Object.keys(rule.rollout).every(k => ["percentage", "attribute"].includes(k)) && rule.rollout.attribute === "customerId") {
|
|
87
|
+
percentage = rolloutPercentage(rule.rollout.percentage);
|
|
88
|
+
if (percentage === 0)
|
|
89
|
+
throw new Error("flagship_reconciliation_required");
|
|
90
|
+
}
|
|
91
|
+
else
|
|
92
|
+
throw new Error("flagship_reconciliation_required");
|
|
93
|
+
}
|
|
94
|
+
return { definition: booleanFlag(flagKey(value.key), value.enabled, ids, percentage, typeof value.description === "string" ? value.description : undefined), ids, percentage };
|
|
95
|
+
}
|
|
96
|
+
export function changeFlag(current, action, input) {
|
|
97
|
+
if (action === "create")
|
|
98
|
+
return booleanFlag(input.key);
|
|
99
|
+
// Emergency disable preserves the complete observed writable definition, including unsupported rules.
|
|
100
|
+
if (action === "disable") {
|
|
101
|
+
if (!record(current) || !record(current.variations) || current.default_variation !== "off" || current.variations.off !== false
|
|
102
|
+
|| !Array.isArray(current.rules) || typeof current.enabled !== "boolean" || flagKey(current.key) !== input.key)
|
|
103
|
+
throw new Error("flagship_reconciliation_required");
|
|
104
|
+
return { key: input.key, ...(current.description == null ? {} : { description: current.description }), variations: current.variations,
|
|
105
|
+
default_variation: "off", rules: current.rules, enabled: false };
|
|
106
|
+
}
|
|
107
|
+
const { definition, ids, percentage } = supportedFlag(current);
|
|
108
|
+
if (definition.key !== input.key)
|
|
109
|
+
throw new Error("flagship_key_mismatch");
|
|
110
|
+
const nextIds = action === "audience" && !input.all ? customerIds(input.customerIds) : ids;
|
|
111
|
+
const nextPercentage = action === "rollout" ? rolloutPercentage(input.percentage) : action === "audience" && input.all ? 100 : percentage;
|
|
112
|
+
if (action === "enable" && !nextIds.length && nextPercentage === 0)
|
|
113
|
+
throw new Error("flagship_empty_audience");
|
|
114
|
+
return booleanFlag(input.key, action === "enable" ? true : definition.enabled, nextIds, nextPercentage, definition.description);
|
|
115
|
+
}
|
|
116
|
+
export function record(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
|
|
117
|
+
//# sourceMappingURL=flagship-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flagship-contract.js","sourceRoot":"","sources":["../src/flagship-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flagship-package.d.ts","sourceRoot":"","sources":["../src/flagship-package.ts"],"names":[],"mappings":"AAOA,uFAAuF;AACvF,wBAAsB,mBAAmB,CAAC,IAAI,EAAC,MAAM,EAAC,iBAAiB,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,CAiB5F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { parseFlagBindings, record } from "./flagship-contract.js";
|
|
4
|
+
import { verifyArtifact } from "./artifact.js";
|
|
5
|
+
import { pathExists, readBoundedFile } from "./files.js";
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
/** Retain every environment in the artifact; only the trusted deployer selects one. */
|
|
8
|
+
export async function packageFlagBindings(root, artifactDirectory) {
|
|
9
|
+
const path = resolve(root, "tender-app.config.json");
|
|
10
|
+
if (!await pathExists(path))
|
|
11
|
+
return;
|
|
12
|
+
const source = JSON.parse(new TextDecoder().decode(await readBoundedFile(path, 1024 * 1024)));
|
|
13
|
+
if (!record(source))
|
|
14
|
+
throw new Error("flagship_source_invalid");
|
|
15
|
+
if (source.flagship === undefined && (!record(source.env) || !Object.values(source.env).some(e => record(e) && e.flagship !== undefined)))
|
|
16
|
+
return;
|
|
17
|
+
const flags = parseFlagBindings({ flagship: source.flagship, env: source.env });
|
|
18
|
+
const verified = await verifyArtifact(artifactDirectory);
|
|
19
|
+
if (verified.envelope.manifest.flags && JSON.stringify(verified.envelope.manifest.flags) !== JSON.stringify(flags))
|
|
20
|
+
throw new Error("flagship_declaration_mismatch");
|
|
21
|
+
const { envelope } = verified;
|
|
22
|
+
envelope.manifest.flags = flags;
|
|
23
|
+
const manifest = envelope.manifest;
|
|
24
|
+
envelope.bundleDigest = createHash("sha256").update(JSON.stringify({ module: manifest.module, files: manifest.files,
|
|
25
|
+
...(manifest.databaseSchema === undefined ? {} : { databaseSchema: manifest.databaseSchema }),
|
|
26
|
+
...(manifest.workflows === undefined ? {} : { workflows: manifest.workflows }), flags })).digest("hex");
|
|
27
|
+
manifest.runtime.assetPrefix = `/_tenant-artifacts/${envelope.bundleDigest}`;
|
|
28
|
+
await writeFile(verified.envelopePath, JSON.stringify(envelope, null, 2) + "\n");
|
|
29
|
+
await verifyArtifact(artifactDirectory);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=flagship-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flagship-package.js","sourceRoot":"","sources":["../src/flagship-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAW,EAAC,iBAAwB;IAC5E,MAAM,IAAI,GAAC,OAAO,CAAC,IAAI,EAAC,wBAAwB,CAAC,CAAC;IAAA,IAAG,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC;QAAC,OAAO;IACpF,MAAM,MAAM,GAAS,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,eAAe,CAAC,IAAI,EAAC,IAAI,GAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjG,IAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC9D,IAAG,MAAM,CAAC,QAAQ,KAAG,SAAS,IAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,MAAM,CAAC,CAAC,CAAC,IAAE,CAAC,CAAC,QAAQ,KAAG,SAAS,CAAC,CAAC;QAAC,OAAO;IACpI,MAAM,KAAK,GAAC,iBAAiB,CAAC,EAAC,QAAQ,EAAC,MAAM,CAAC,QAAQ,EAAC,GAAG,EAAC,MAAM,CAAC,GAAG,EAAC,CAAE,CAAC;IAC1E,MAAM,QAAQ,GAAC,MAAM,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACvD,IAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/J,MAAM,EAAC,QAAQ,EAAC,GAAC,QAAQ,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAC,KAAK,CAAC;IAC9B,MAAM,QAAQ,GAAC,QAAQ,CAAC,QAAQ,CAAC;IACjC,QAAQ,CAAC,YAAY,GAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAC,QAAQ,CAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,CAAC,KAAK;QAC3G,GAAG,CAAC,QAAQ,CAAC,cAAc,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,cAAc,EAAC,QAAQ,CAAC,cAAc,EAAC,CAAC;QACpF,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,SAAS,EAAC,QAAQ,CAAC,SAAS,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/F,QAAQ,CAAC,OAAO,CAAC,WAAW,GAAC,sBAAsB,QAAQ,CAAC,YAAY,EAAE,CAAC;IAC3E,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAC,IAAI,EAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,YAAY,EAIlB,MAAM,iBAAiB,CAAC;AA2BzB,OAAO,EAIL,4BAA4B,EAE7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,YAAY,EAIlB,MAAM,iBAAiB,CAAC;AA2BzB,OAAO,EAIL,4BAA4B,EAE7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAW/B,eAAO,MAAM,WAAW,QAA0B,CAAC;AAenD,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,SAAS,EAAE,YAAY,CAAC;IACxB,eAAe,EAAE,kBAAkB,CAAC;IACpC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,4BAA4B,EAAE,OAAO,4BAA4B,CAAC;IAClE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;IAClE,WAAW,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC3D,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACtF,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AA6BD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCjG"}
|