@contentful/experience-design-system-cli 2.37.1-dev-build-444a2d6a.0 → 2.37.1-dev-build-04545499.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.
- package/dist/app.js +973 -290
- package/dist/index.js +1014 -306
- package/dist/package.json +1 -1
- package/dist/src/tui/import/steps/07-scope-gate/sidebar/components/GroupedSidebar.d.ts +0 -5
- package/dist/src/tui/import/steps/07-scope-gate/state.d.ts +2 -3
- package/dist/src/tui/import/steps/07-scope-gate/types.d.ts +0 -7
- package/dist/src/tui/import/steps/07-scope-gate/use-scope-gate-flow.d.ts +2 -6
- package/dist/src/tui/import/steps/07-scope-gate/use-scope-gate.d.ts +1 -2
- package/dist/src/tui/import/steps/08-generation/logic.d.ts +44 -0
- package/dist/src/tui/import/steps/08-generation/map-tokens.d.ts +14 -0
- package/dist/src/tui/import/steps/08-generation/processes.d.ts +42 -0
- package/dist/src/tui/import/steps/08-generation/run.d.ts +26 -0
- package/dist/src/tui/import/steps/08-generation/save-decisions.d.ts +8 -0
- package/dist/src/tui/import/steps/08-generation/screen.d.ts +12 -0
- package/dist/src/tui/import/steps/08-generation/types.d.ts +47 -0
- package/dist/src/tui/import/steps/08-generation/use-generation.d.ts +14 -0
- package/legacy/dist/src/analyze/select/tui/components/GroupedSidebar.d.ts +0 -2
- package/legacy/dist/src/import/tui/WizardApp.d.ts +1 -36
- package/legacy/dist/src/import/tui/handoff.d.ts +10 -13
- package/legacy/dist/src/import/tui/runLivePreview.d.ts +2 -3
- package/legacy/dist/src/index.js +55 -908
- package/legacy/dist/src/session/db.d.ts +0 -11
- package/legacy/package.json +1 -1
- package/package.json +4 -4
- package/legacy/dist/src/import/tui/runScopeGate.d.ts +0 -14
- package/legacy/dist/src/import/tui/spawn-generate.d.ts +0 -33
- package/legacy/dist/src/import/tui/wizard-generate-progress.d.ts +0 -21
package/dist/app.js
CHANGED
|
@@ -772,7 +772,7 @@ async function runAgent(options) {
|
|
|
772
772
|
promptLen: prompt.length,
|
|
773
773
|
promptHead: prompt.slice(0, 500)
|
|
774
774
|
});
|
|
775
|
-
return new Promise((
|
|
775
|
+
return new Promise((resolve12) => {
|
|
776
776
|
const bedrockEnv = bedrock ? BEDROCK_ENV_BY_AGENT[agent] : void 0;
|
|
777
777
|
const child = spawn(binary, args, {
|
|
778
778
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -821,7 +821,7 @@ async function runAgent(options) {
|
|
|
821
821
|
stderrLen: stderr.length,
|
|
822
822
|
stderrTail: stderr.slice(-1e3)
|
|
823
823
|
});
|
|
824
|
-
|
|
824
|
+
resolve12(result);
|
|
825
825
|
});
|
|
826
826
|
});
|
|
827
827
|
}
|
|
@@ -843,7 +843,7 @@ async function checkAgentAuth(agent) {
|
|
|
843
843
|
return "not-found";
|
|
844
844
|
if (agent !== "claude")
|
|
845
845
|
return "ok";
|
|
846
|
-
return new Promise((
|
|
846
|
+
return new Promise((resolve12) => {
|
|
847
847
|
const child = spawn2(binary, ["auth", "status", "--json"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
848
848
|
let stdout = "";
|
|
849
849
|
let done = false;
|
|
@@ -852,7 +852,7 @@ async function checkAgentAuth(agent) {
|
|
|
852
852
|
return;
|
|
853
853
|
done = true;
|
|
854
854
|
child.kill("SIGTERM");
|
|
855
|
-
|
|
855
|
+
resolve12("unauthenticated");
|
|
856
856
|
}, 5e3);
|
|
857
857
|
child.stdout?.on("data", (chunk) => {
|
|
858
858
|
stdout += chunk.toString();
|
|
@@ -863,14 +863,14 @@ async function checkAgentAuth(agent) {
|
|
|
863
863
|
done = true;
|
|
864
864
|
clearTimeout(timer);
|
|
865
865
|
if (code !== 0) {
|
|
866
|
-
|
|
866
|
+
resolve12("unauthenticated");
|
|
867
867
|
return;
|
|
868
868
|
}
|
|
869
869
|
try {
|
|
870
870
|
const status = JSON.parse(stdout);
|
|
871
|
-
|
|
871
|
+
resolve12(status.loggedIn ? "ok" : "unauthenticated");
|
|
872
872
|
} catch {
|
|
873
|
-
|
|
873
|
+
resolve12("unauthenticated");
|
|
874
874
|
}
|
|
875
875
|
});
|
|
876
876
|
});
|
|
@@ -880,9 +880,9 @@ async function binaryIsOnPath(binary) {
|
|
|
880
880
|
const fs = await import("node:fs/promises");
|
|
881
881
|
return fs.access(binary).then(() => true, () => false);
|
|
882
882
|
}
|
|
883
|
-
return new Promise((
|
|
883
|
+
return new Promise((resolve12) => {
|
|
884
884
|
const child = spawn2(process.platform === "win32" ? "where" : "which", [binary], { stdio: "ignore" });
|
|
885
|
-
child.on("close", (code) =>
|
|
885
|
+
child.on("close", (code) => resolve12(code === 0));
|
|
886
886
|
});
|
|
887
887
|
}
|
|
888
888
|
var init_check_agent_auth = __esm({
|
|
@@ -1356,6 +1356,23 @@ var init_flatten = __esm({
|
|
|
1356
1356
|
});
|
|
1357
1357
|
|
|
1358
1358
|
// packages/experience-design-system-backend-pipeline/dist/src/steps/shared/dtcg/helpers/validate.js
|
|
1359
|
+
function isDesignTokenType(value) {
|
|
1360
|
+
return typeof value === "string" && TOKEN_TYPE_SET2.has(value);
|
|
1361
|
+
}
|
|
1362
|
+
function validateDTCG(obj) {
|
|
1363
|
+
const errors = [];
|
|
1364
|
+
const tokens = flattenDTCG(obj, "");
|
|
1365
|
+
for (const token of tokens) {
|
|
1366
|
+
if (!isDesignTokenType(token.$type)) {
|
|
1367
|
+
errors.push({
|
|
1368
|
+
path: token.path,
|
|
1369
|
+
message: `Unknown $type "${token.$type}". Must be one of: ${DESIGN_TOKEN_TYPES.join(", ")}.`,
|
|
1370
|
+
actual: token.$type
|
|
1371
|
+
});
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
return { valid: errors.length === 0, errors };
|
|
1375
|
+
}
|
|
1359
1376
|
var TOKEN_TYPE_SET2;
|
|
1360
1377
|
var init_validate2 = __esm({
|
|
1361
1378
|
"packages/experience-design-system-backend-pipeline/dist/src/steps/shared/dtcg/helpers/validate.js"() {
|
|
@@ -2000,8 +2017,8 @@ var init_cache_keys = __esm({
|
|
|
2000
2017
|
});
|
|
2001
2018
|
|
|
2002
2019
|
// packages/experience-design-system-cli/app.tsx
|
|
2003
|
-
import { join as
|
|
2004
|
-
import { useEffect as
|
|
2020
|
+
import { join as join14 } from "node:path";
|
|
2021
|
+
import { useEffect as useEffect15, useState as useState21 } from "react";
|
|
2005
2022
|
|
|
2006
2023
|
// packages/experience-design-system-cli/src/tui/home/home.tsx
|
|
2007
2024
|
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
@@ -2562,6 +2579,59 @@ function indexRowsByKey(items, key) {
|
|
|
2562
2579
|
return map;
|
|
2563
2580
|
}
|
|
2564
2581
|
|
|
2582
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/repositories/sessions/write.js
|
|
2583
|
+
function updateSessionTimestamp(db, sessionId, timestamp) {
|
|
2584
|
+
db.prepare("UPDATE sessions SET updated_at = ? WHERE id = ?").run(timestamp, sessionId);
|
|
2585
|
+
}
|
|
2586
|
+
|
|
2587
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/helpers/tokens/build-dtcg-groups.js
|
|
2588
|
+
function buildDtcgGroups(groupRows, tokenRows) {
|
|
2589
|
+
return groupRows.map((r) => {
|
|
2590
|
+
const prefix = `${r.path}.`;
|
|
2591
|
+
const tokenIds = tokenRows.filter((t) => t.path.startsWith(prefix) && !t.path.slice(prefix.length).includes(".")).map((t) => t.path);
|
|
2592
|
+
const g = { path: r.path, tokenIds };
|
|
2593
|
+
if (r.description !== null)
|
|
2594
|
+
g.$description = r.description;
|
|
2595
|
+
return g;
|
|
2596
|
+
});
|
|
2597
|
+
}
|
|
2598
|
+
|
|
2599
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/helpers/tokens/build-dtcg-tokens.js
|
|
2600
|
+
function buildDtcgTokens(tokenRows) {
|
|
2601
|
+
return tokenRows.map((r) => {
|
|
2602
|
+
const t = {
|
|
2603
|
+
path: r.path,
|
|
2604
|
+
$type: r.type,
|
|
2605
|
+
$value: JSON.parse(r.value)
|
|
2606
|
+
};
|
|
2607
|
+
if (r.description !== null)
|
|
2608
|
+
t.$description = r.description;
|
|
2609
|
+
return t;
|
|
2610
|
+
});
|
|
2611
|
+
}
|
|
2612
|
+
|
|
2613
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/repositories/tokens/read.js
|
|
2614
|
+
function getDtcgTokensForSession(db, sessionId) {
|
|
2615
|
+
const groupRows = db.prepare("SELECT path, description FROM raw_token_groups WHERE session_id = ? ORDER BY path").all(sessionId).map((row) => ({
|
|
2616
|
+
path: String(row.path),
|
|
2617
|
+
description: row.description === null ? null : String(row.description)
|
|
2618
|
+
}));
|
|
2619
|
+
const tokenRows = db.prepare("SELECT path, type, value, description FROM raw_tokens WHERE session_id = ? ORDER BY path").all(sessionId).map((row) => ({
|
|
2620
|
+
path: String(row.path),
|
|
2621
|
+
type: String(row.type),
|
|
2622
|
+
value: String(row.value),
|
|
2623
|
+
description: row.description === null ? null : String(row.description)
|
|
2624
|
+
}));
|
|
2625
|
+
return {
|
|
2626
|
+
groups: buildDtcgGroups(groupRows, tokenRows),
|
|
2627
|
+
tokens: buildDtcgTokens(tokenRows)
|
|
2628
|
+
};
|
|
2629
|
+
}
|
|
2630
|
+
function getRawTokenNamePaths(db, sessionId) {
|
|
2631
|
+
const rows = db.prepare("SELECT raw_name, path FROM raw_token_name_paths WHERE session_id = ? ORDER BY raw_name").all(sessionId);
|
|
2632
|
+
return Object.fromEntries(rows.map((row) => [String(row.raw_name), String(row.path)]));
|
|
2633
|
+
}
|
|
2634
|
+
|
|
2565
2635
|
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/helpers/components/hash-component-shape.js
|
|
2566
2636
|
import { createHash } from "node:crypto";
|
|
2567
2637
|
function hashComponentShape(component) {
|
|
@@ -2581,6 +2651,48 @@ function hashComponentShape(component) {
|
|
|
2581
2651
|
return createHash("sha256").update(JSON.stringify(payload)).digest("hex");
|
|
2582
2652
|
}
|
|
2583
2653
|
|
|
2654
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/repositories/tokens/write.js
|
|
2655
|
+
function deleteRawTokensForSession(db, sessionId) {
|
|
2656
|
+
db.prepare("DELETE FROM raw_token_groups WHERE session_id = ?").run(sessionId);
|
|
2657
|
+
db.prepare("DELETE FROM raw_tokens WHERE session_id = ?").run(sessionId);
|
|
2658
|
+
}
|
|
2659
|
+
function createRawTokenGroups(db, sessionId, groups) {
|
|
2660
|
+
const insertGroup = db.prepare(`INSERT INTO raw_token_groups (session_id, path, description) VALUES (?, ?, ?)`);
|
|
2661
|
+
for (const group of groups) {
|
|
2662
|
+
insertGroup.run(sessionId, group.path, group.$description ?? null);
|
|
2663
|
+
}
|
|
2664
|
+
}
|
|
2665
|
+
function createRawTokens(db, sessionId, tokens) {
|
|
2666
|
+
const insertToken = db.prepare(`INSERT INTO raw_tokens (session_id, path, type, value, description) VALUES (?, ?, ?, ?, ?)`);
|
|
2667
|
+
for (const token of tokens) {
|
|
2668
|
+
insertToken.run(sessionId, token.path, token.$type, JSON.stringify(token.$value), token.$description ?? null);
|
|
2669
|
+
}
|
|
2670
|
+
}
|
|
2671
|
+
|
|
2672
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/repositories/shared/with-transaction.js
|
|
2673
|
+
function withTransaction(db, fn) {
|
|
2674
|
+
db.exec("BEGIN");
|
|
2675
|
+
try {
|
|
2676
|
+
const result = fn();
|
|
2677
|
+
db.exec("COMMIT");
|
|
2678
|
+
return result;
|
|
2679
|
+
} catch (e) {
|
|
2680
|
+
db.exec("ROLLBACK");
|
|
2681
|
+
throw e;
|
|
2682
|
+
}
|
|
2683
|
+
}
|
|
2684
|
+
|
|
2685
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/services/tokens/store-dtcg-tokens.js
|
|
2686
|
+
function storeDtcgTokens(db, sessionId, groups, tokens) {
|
|
2687
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2688
|
+
withTransaction(db, () => {
|
|
2689
|
+
deleteRawTokensForSession(db, sessionId);
|
|
2690
|
+
createRawTokenGroups(db, sessionId, groups);
|
|
2691
|
+
createRawTokens(db, sessionId, tokens);
|
|
2692
|
+
updateSessionTimestamp(db, sessionId, now);
|
|
2693
|
+
});
|
|
2694
|
+
}
|
|
2695
|
+
|
|
2584
2696
|
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/repositories/db.js
|
|
2585
2697
|
var SCHEMA = `
|
|
2586
2698
|
PRAGMA journal_mode = WAL;
|
|
@@ -3093,6 +3205,91 @@ function parseReviewReasons(raw) {
|
|
|
3093
3205
|
return [];
|
|
3094
3206
|
}
|
|
3095
3207
|
}
|
|
3208
|
+
function loadCDFComponents(db, sessionId) {
|
|
3209
|
+
const components = db.prepare(`SELECT component_id, name, description FROM raw_components
|
|
3210
|
+
WHERE session_id = ? AND status = 'generated' ORDER BY rowid`).all(sessionId);
|
|
3211
|
+
if (components.length === 0)
|
|
3212
|
+
return [];
|
|
3213
|
+
const props = db.prepare(`SELECT component_id, name, required, default_value, description,
|
|
3214
|
+
cdf_type, cdf_category, cdf_token_kind, position
|
|
3215
|
+
FROM raw_props
|
|
3216
|
+
WHERE session_id = ? AND cdf_type IS NOT NULL
|
|
3217
|
+
ORDER BY component_id, position`).all(sessionId);
|
|
3218
|
+
const allowedValues = db.prepare(`SELECT component_id, prop_name, value, position
|
|
3219
|
+
FROM raw_prop_allowed_values WHERE session_id = ? ORDER BY component_id, prop_name, position`).all(sessionId);
|
|
3220
|
+
const slots = db.prepare(`SELECT component_id, name, description, required FROM raw_slots WHERE session_id = ? ORDER BY component_id, position`).all(sessionId);
|
|
3221
|
+
const allowedComponents = db.prepare(`SELECT component_id, slot_name, allowed_component
|
|
3222
|
+
FROM raw_slot_allowed_components WHERE session_id = ? ORDER BY component_id, slot_name, position`).all(sessionId);
|
|
3223
|
+
const tokenPaths = db.prepare(`SELECT component_id, prop_name, position, path
|
|
3224
|
+
FROM raw_prop_token_paths WHERE session_id = ? ORDER BY component_id, prop_name, position`).all(sessionId);
|
|
3225
|
+
const resolvedDefaultPaths = getRawTokenNamePaths(db, sessionId);
|
|
3226
|
+
const tokenTypeByPath = new Map(db.prepare("SELECT path, type FROM raw_tokens WHERE session_id = ?").all(sessionId).map((token) => [token.path, token.type]));
|
|
3227
|
+
const propsByComponent = indexRowsByKey(props, (p) => p.component_id);
|
|
3228
|
+
const allowedValuesByProp = indexRowsByKey(allowedValues, (av) => `${av.component_id}::${av.prop_name}`);
|
|
3229
|
+
const slotsByComponent = indexRowsByKey(slots, (s) => s.component_id);
|
|
3230
|
+
const allowedComponentsBySlot = indexRowsByKey(allowedComponents, (ac) => `${ac.component_id}::${ac.slot_name}`);
|
|
3231
|
+
const tokenPathsByProp = indexRowsByKey(tokenPaths, (t) => `${t.component_id}::${t.prop_name}`);
|
|
3232
|
+
const toTokenPaths = (rows) => rows === void 0 ? void 0 : rows.map((r) => r.path);
|
|
3233
|
+
return components.map(({ component_id, name, description }) => {
|
|
3234
|
+
const compProps = propsByComponent.get(component_id) ?? [];
|
|
3235
|
+
const $properties = {};
|
|
3236
|
+
for (const p of compProps) {
|
|
3237
|
+
if (!p.name.trim())
|
|
3238
|
+
continue;
|
|
3239
|
+
const av = allowedValuesByProp.get(`${component_id}::${p.name}`);
|
|
3240
|
+
const propDef = {
|
|
3241
|
+
$type: p.cdf_type,
|
|
3242
|
+
$category: p.cdf_category
|
|
3243
|
+
};
|
|
3244
|
+
if (p.required)
|
|
3245
|
+
propDef.$required = true;
|
|
3246
|
+
const isTokenProp = p.cdf_type === "token" && p.cdf_category === "design";
|
|
3247
|
+
const defaultReference = p.default_value;
|
|
3248
|
+
const resolvedDefault = isTokenProp && p.cdf_token_kind !== null && defaultReference !== null ? resolvedDefaultPaths[defaultReference] : void 0;
|
|
3249
|
+
const compatibleResolvedDefault = resolvedDefault !== void 0 && tokenTypeByPath.get(resolvedDefault) === p.cdf_token_kind ? resolvedDefault : void 0;
|
|
3250
|
+
if (p.default_value !== null) {
|
|
3251
|
+
if (p.cdf_type === "boolean") {
|
|
3252
|
+
propDef.$default = p.default_value === "true";
|
|
3253
|
+
} else {
|
|
3254
|
+
propDef.$default = compatibleResolvedDefault ?? p.default_value;
|
|
3255
|
+
}
|
|
3256
|
+
}
|
|
3257
|
+
if (p.description !== null)
|
|
3258
|
+
propDef.$description = p.description;
|
|
3259
|
+
if (!isTokenProp && av && av.length > 0)
|
|
3260
|
+
propDef.$values = av.map((v) => v.value);
|
|
3261
|
+
if (p.cdf_token_kind !== null)
|
|
3262
|
+
propDef["$token.kind"] = p.cdf_token_kind;
|
|
3263
|
+
if (isTokenProp) {
|
|
3264
|
+
const allowed = toTokenPaths(tokenPathsByProp.get(`${component_id}::${p.name}`));
|
|
3265
|
+
if (allowed !== void 0 && allowed.length > 0)
|
|
3266
|
+
propDef["$token.allowed"] = allowed;
|
|
3267
|
+
}
|
|
3268
|
+
$properties[p.name] = propDef;
|
|
3269
|
+
}
|
|
3270
|
+
const compSlots = slotsByComponent.get(component_id) ?? [];
|
|
3271
|
+
const $slots = {};
|
|
3272
|
+
for (const s of compSlots) {
|
|
3273
|
+
if (!s.name.trim())
|
|
3274
|
+
continue;
|
|
3275
|
+
const ac = allowedComponentsBySlot.get(`${component_id}::${s.name}`);
|
|
3276
|
+
const slotDef = {};
|
|
3277
|
+
if (s.description !== null)
|
|
3278
|
+
slotDef.$description = s.description;
|
|
3279
|
+
if (s.required)
|
|
3280
|
+
slotDef.$required = true;
|
|
3281
|
+
if (ac && ac.length > 0)
|
|
3282
|
+
slotDef.$allowedComponents = ac.map((v) => v.allowed_component);
|
|
3283
|
+
$slots[s.name] = slotDef;
|
|
3284
|
+
}
|
|
3285
|
+
const entry = { $type: "component", $properties };
|
|
3286
|
+
if (description !== null)
|
|
3287
|
+
entry.$description = description;
|
|
3288
|
+
if (Object.keys($slots).length > 0)
|
|
3289
|
+
entry.$slots = $slots;
|
|
3290
|
+
return { key: name, entry };
|
|
3291
|
+
});
|
|
3292
|
+
}
|
|
3096
3293
|
function loadScopeComponents(db, sessionId) {
|
|
3097
3294
|
const rows = db.prepare(`SELECT name, component_id, status, reject_reason, review_reasons, needs_review FROM raw_components
|
|
3098
3295
|
WHERE session_id = ? AND status IN ('extracted', 'accepted', 'rejected')
|
|
@@ -3121,6 +3318,38 @@ function loadScopeComponents(db, sessionId) {
|
|
|
3121
3318
|
};
|
|
3122
3319
|
});
|
|
3123
3320
|
}
|
|
3321
|
+
function applyScopeDecisions(db, sessionId, decisions) {
|
|
3322
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3323
|
+
const acceptedSet = new Set(decisions.accepted);
|
|
3324
|
+
const accepted = [...acceptedSet];
|
|
3325
|
+
const rejected = [...new Set(decisions.rejected)].filter((n) => !acceptedSet.has(n));
|
|
3326
|
+
if (rejected.length > 0) {
|
|
3327
|
+
const placeholders = rejected.map(() => "?").join(",");
|
|
3328
|
+
db.prepare(`UPDATE raw_components SET status = 'rejected' WHERE session_id = ? AND name IN (${placeholders})`).run(sessionId, ...rejected);
|
|
3329
|
+
}
|
|
3330
|
+
if (accepted.length > 0) {
|
|
3331
|
+
const placeholders = accepted.map(() => "?").join(",");
|
|
3332
|
+
db.prepare(`UPDATE raw_components SET status = 'generated' WHERE session_id = ? AND name IN (${placeholders})`).run(sessionId, ...accepted);
|
|
3333
|
+
}
|
|
3334
|
+
db.prepare("UPDATE sessions SET updated_at = ? WHERE id = ?").run(now, sessionId);
|
|
3335
|
+
}
|
|
3336
|
+
function copyTokensFromCache(db, sourceSessionId, targetSessionId) {
|
|
3337
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3338
|
+
db.exec("BEGIN");
|
|
3339
|
+
try {
|
|
3340
|
+
db.prepare("DELETE FROM raw_tokens WHERE session_id = ?").run(targetSessionId);
|
|
3341
|
+
db.prepare("DELETE FROM raw_token_groups WHERE session_id = ?").run(targetSessionId);
|
|
3342
|
+
db.prepare(`INSERT INTO raw_token_groups (session_id, path, description)
|
|
3343
|
+
SELECT ?, path, description FROM raw_token_groups WHERE session_id = ?`).run(targetSessionId, sourceSessionId);
|
|
3344
|
+
db.prepare(`INSERT INTO raw_tokens (session_id, path, type, value, description)
|
|
3345
|
+
SELECT ?, path, type, value, description FROM raw_tokens WHERE session_id = ?`).run(targetSessionId, sourceSessionId);
|
|
3346
|
+
db.prepare("UPDATE sessions SET updated_at = ? WHERE id = ?").run(now, targetSessionId);
|
|
3347
|
+
db.exec("COMMIT");
|
|
3348
|
+
} catch (e) {
|
|
3349
|
+
db.exec("ROLLBACK");
|
|
3350
|
+
throw e;
|
|
3351
|
+
}
|
|
3352
|
+
}
|
|
3124
3353
|
var _cliCacheVersionCache = null;
|
|
3125
3354
|
async function getCliCacheVersion() {
|
|
3126
3355
|
if (_cliCacheVersionCache)
|
|
@@ -3373,6 +3602,32 @@ init_agents();
|
|
|
3373
3602
|
init_agents();
|
|
3374
3603
|
var DEFAULT_TIMEOUT_MS = Number(process.env.EDS_AGENT_TIMEOUT_MS ?? 5 * 60 * 1e3);
|
|
3375
3604
|
|
|
3605
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/review-session/repositories/review-session-paths.js
|
|
3606
|
+
import { resolve as resolve7 } from "node:path";
|
|
3607
|
+
async function getRefineSessionPaths(sessionId, artifactsRoot) {
|
|
3608
|
+
const sessionDir = resolve7(artifactsRoot, sessionId);
|
|
3609
|
+
return {
|
|
3610
|
+
sessionDir,
|
|
3611
|
+
eventsPath: resolve7(sessionDir, "events.jsonl"),
|
|
3612
|
+
statePath: resolve7(sessionDir, "current-review-state.json")
|
|
3613
|
+
};
|
|
3614
|
+
}
|
|
3615
|
+
|
|
3616
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/review-session/repositories/review-artifacts-root.js
|
|
3617
|
+
import { resolve as resolve8 } from "node:path";
|
|
3618
|
+
function getRefineArtifactsRoot() {
|
|
3619
|
+
if (process.env["EDS_REVIEW_ARTIFACTS_DIR"]) {
|
|
3620
|
+
return resolve8(process.env["EDS_REVIEW_ARTIFACTS_DIR"]);
|
|
3621
|
+
}
|
|
3622
|
+
return resolve8(configRoot(), "reviews");
|
|
3623
|
+
}
|
|
3624
|
+
|
|
3625
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/review-session/repositories/save-review-state.js
|
|
3626
|
+
import { writeFile } from "node:fs/promises";
|
|
3627
|
+
async function saveReviewState(statePath, session) {
|
|
3628
|
+
await writeFile(statePath, JSON.stringify(session, null, 2), "utf8");
|
|
3629
|
+
}
|
|
3630
|
+
|
|
3376
3631
|
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/helpers/collect-files/collect-files.js
|
|
3377
3632
|
import { statSync as statSync2 } from "node:fs";
|
|
3378
3633
|
import path4 from "node:path";
|
|
@@ -3559,15 +3814,15 @@ function walkProjectTree(dir, result, includeContent) {
|
|
|
3559
3814
|
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/helpers/collect-files/collect-files.js
|
|
3560
3815
|
function collectFiles(root, options = {}) {
|
|
3561
3816
|
const resolved = path4.resolve(root);
|
|
3562
|
-
let
|
|
3817
|
+
let stat4;
|
|
3563
3818
|
try {
|
|
3564
|
-
|
|
3819
|
+
stat4 = statSync2(resolved);
|
|
3565
3820
|
} catch (err) {
|
|
3566
3821
|
return { ok: false, failure: classifyStatError(err.code), rootPath: resolved };
|
|
3567
3822
|
}
|
|
3568
|
-
if (
|
|
3823
|
+
if (stat4.isFile())
|
|
3569
3824
|
return { ok: false, failure: "is-file", rootPath: resolved };
|
|
3570
|
-
if (!
|
|
3825
|
+
if (!stat4.isDirectory())
|
|
3571
3826
|
return { ok: false, failure: "not-directory", rootPath: resolved };
|
|
3572
3827
|
const result = {
|
|
3573
3828
|
filePaths: [],
|
|
@@ -3585,6 +3840,38 @@ function collectFiles(root, options = {}) {
|
|
|
3585
3840
|
return { ok: true, result };
|
|
3586
3841
|
}
|
|
3587
3842
|
|
|
3843
|
+
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/review-session/services/write-scope-decisions-snapshot.js
|
|
3844
|
+
import { mkdir } from "node:fs/promises";
|
|
3845
|
+
async function writeScopeDecisionsSnapshot(db, sessionId, decisions) {
|
|
3846
|
+
const acceptedSet = new Set(decisions.accepted);
|
|
3847
|
+
const rawComponents = loadRawComponents(db, sessionId);
|
|
3848
|
+
const records = rawComponents.map((c2) => {
|
|
3849
|
+
const status = acceptedSet.has(c2.name) ? "accepted" : "rejected";
|
|
3850
|
+
const proposal = {
|
|
3851
|
+
name: c2.name,
|
|
3852
|
+
source: c2.source,
|
|
3853
|
+
framework: c2.framework,
|
|
3854
|
+
props: c2.props,
|
|
3855
|
+
slots: c2.slots,
|
|
3856
|
+
...c2.extractionConfidence !== void 0 ? { extractionConfidence: c2.extractionConfidence } : {},
|
|
3857
|
+
...c2.reviewReasons !== void 0 ? { reviewReasons: c2.reviewReasons } : {},
|
|
3858
|
+
...c2.needsReview !== void 0 ? { needsReview: c2.needsReview } : {}
|
|
3859
|
+
};
|
|
3860
|
+
return {
|
|
3861
|
+
id: c2.component_id,
|
|
3862
|
+
name: c2.name,
|
|
3863
|
+
resolvedSourcePath: "",
|
|
3864
|
+
sourceCode: null,
|
|
3865
|
+
originalProposal: proposal,
|
|
3866
|
+
editedProposal: proposal,
|
|
3867
|
+
status
|
|
3868
|
+
};
|
|
3869
|
+
});
|
|
3870
|
+
const paths = await getRefineSessionPaths(sessionId, getRefineArtifactsRoot());
|
|
3871
|
+
await mkdir(paths.sessionDir, { recursive: true });
|
|
3872
|
+
await saveReviewState(paths.statePath, { components: records });
|
|
3873
|
+
}
|
|
3874
|
+
|
|
3588
3875
|
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/session/index.js
|
|
3589
3876
|
import { DatabaseSync as DatabaseSync2 } from "node:sqlite";
|
|
3590
3877
|
|
|
@@ -3794,7 +4081,7 @@ var defaultPathSerializer = ({ path: path5, url: _url }) => {
|
|
|
3794
4081
|
}
|
|
3795
4082
|
return url;
|
|
3796
4083
|
};
|
|
3797
|
-
var createQuerySerializer = ({ allowReserved, array:
|
|
4084
|
+
var createQuerySerializer = ({ allowReserved, array: array3, object: object2 } = {}) => {
|
|
3798
4085
|
const querySerializer = (queryParams) => {
|
|
3799
4086
|
const search = [];
|
|
3800
4087
|
if (queryParams && typeof queryParams === "object") {
|
|
@@ -3810,7 +4097,7 @@ var createQuerySerializer = ({ allowReserved, array: array4, object: object2 } =
|
|
|
3810
4097
|
name,
|
|
3811
4098
|
style: "form",
|
|
3812
4099
|
value,
|
|
3813
|
-
...
|
|
4100
|
+
...array3
|
|
3814
4101
|
});
|
|
3815
4102
|
if (serializedArray)
|
|
3816
4103
|
search.push(serializedArray);
|
|
@@ -4218,7 +4505,7 @@ function errorMessage(error) {
|
|
|
4218
4505
|
return error instanceof Error && error.message ? error.message : String(error);
|
|
4219
4506
|
}
|
|
4220
4507
|
function defaultSleep(delayMs) {
|
|
4221
|
-
return new Promise((
|
|
4508
|
+
return new Promise((resolve12) => setTimeout(resolve12, delayMs));
|
|
4222
4509
|
}
|
|
4223
4510
|
|
|
4224
4511
|
// packages/experience-design-system-backend-pipeline/dist/src/steps/apply/src/helpers/sanitize-preview.js
|
|
@@ -4457,7 +4744,7 @@ var ApiClient = class {
|
|
|
4457
4744
|
const progress = maxAttempts > 1 ? attempt / (maxAttempts - 1) : 0;
|
|
4458
4745
|
const baseDelay = intervalMs + (maxIntervalMs - intervalMs) * progress;
|
|
4459
4746
|
const jitter = Math.random() * baseDelay * 0.15;
|
|
4460
|
-
await new Promise((
|
|
4747
|
+
await new Promise((resolve12) => setTimeout(resolve12, baseDelay + jitter));
|
|
4461
4748
|
}
|
|
4462
4749
|
}
|
|
4463
4750
|
throw new Error(`Operation ${operationId} timed out after ${maxAttempts} attempts`);
|
|
@@ -4650,11 +4937,11 @@ function parseEdsiError(rawInput) {
|
|
|
4650
4937
|
...binding.diagnostics ? { diagnostics: binding.diagnostics } : {}
|
|
4651
4938
|
};
|
|
4652
4939
|
}
|
|
4653
|
-
const
|
|
4654
|
-
if (
|
|
4940
|
+
const literal4 = parseObjectLiteralTail(cleaned);
|
|
4941
|
+
if (literal4 && (literal4.code || literal4.cycle)) {
|
|
4655
4942
|
const braceStart = cleaned.lastIndexOf("{");
|
|
4656
4943
|
const head = braceStart === -1 ? cleaned : cleaned.slice(0, braceStart).trim();
|
|
4657
|
-
return { code:
|
|
4944
|
+
return { code: literal4.code ?? null, message: head || cleaned, cycle: literal4.cycle ?? null, raw: false };
|
|
4658
4945
|
}
|
|
4659
4946
|
return { code: null, message: cleaned || prefix || rawInput, cycle: null, raw: true };
|
|
4660
4947
|
}
|
|
@@ -4735,6 +5022,99 @@ function formatApiError2(request) {
|
|
|
4735
5022
|
|
|
4736
5023
|
// packages/experience-design-system-backend-pipeline/dist/src/steps/apply/src/helpers/tokens/read-tokens-from-path.js
|
|
4737
5024
|
init_shared();
|
|
5025
|
+
import { readFile as readFile4, stat as stat2 } from "node:fs/promises";
|
|
5026
|
+
|
|
5027
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/apply/src/helpers/tokens/collect-json-files.js
|
|
5028
|
+
import { readdir, stat } from "node:fs/promises";
|
|
5029
|
+
import { join as join5 } from "node:path";
|
|
5030
|
+
var IGNORE_TOKEN_DIRS = /* @__PURE__ */ new Set(["node_modules", "dist", "build", ".next", ".nuxt", ".git"]);
|
|
5031
|
+
async function collectJsonFiles(dir) {
|
|
5032
|
+
const results = [];
|
|
5033
|
+
await walk(dir, results);
|
|
5034
|
+
return results;
|
|
5035
|
+
}
|
|
5036
|
+
async function walk(current, results) {
|
|
5037
|
+
let entries;
|
|
5038
|
+
try {
|
|
5039
|
+
entries = await readdir(current);
|
|
5040
|
+
} catch {
|
|
5041
|
+
return;
|
|
5042
|
+
}
|
|
5043
|
+
await Promise.all(entries.map(async (entry) => {
|
|
5044
|
+
if (IGNORE_TOKEN_DIRS.has(entry))
|
|
5045
|
+
return;
|
|
5046
|
+
const full = join5(current, entry);
|
|
5047
|
+
let s;
|
|
5048
|
+
try {
|
|
5049
|
+
s = await stat(full);
|
|
5050
|
+
} catch {
|
|
5051
|
+
return;
|
|
5052
|
+
}
|
|
5053
|
+
if (s.isDirectory()) {
|
|
5054
|
+
await walk(full, results);
|
|
5055
|
+
} else if (entry.endsWith(".json")) {
|
|
5056
|
+
results.push(full);
|
|
5057
|
+
}
|
|
5058
|
+
}));
|
|
5059
|
+
}
|
|
5060
|
+
|
|
5061
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/apply/src/helpers/tokens/read-tokens-from-path.js
|
|
5062
|
+
async function readTokensFromPath(flag, p) {
|
|
5063
|
+
let s;
|
|
5064
|
+
try {
|
|
5065
|
+
s = await stat2(p);
|
|
5066
|
+
} catch {
|
|
5067
|
+
throw new Error(`file not found: ${p} (from ${flag})`);
|
|
5068
|
+
}
|
|
5069
|
+
const merged = s.isDirectory() ? await readMergedFromDir(flag, p) : await readSingleFile(flag, p);
|
|
5070
|
+
const { valid, errors } = validateDTCG(merged);
|
|
5071
|
+
if (!valid) {
|
|
5072
|
+
throw new Error(`${flag} contains invalid token types:
|
|
5073
|
+
${errors.map((e) => ` ${e.path}: ${e.message}`).join("\n")}`);
|
|
5074
|
+
}
|
|
5075
|
+
return flattenDTCG(merged, "");
|
|
5076
|
+
}
|
|
5077
|
+
async function readMergedFromDir(flag, dir) {
|
|
5078
|
+
const files = await collectJsonFiles(dir);
|
|
5079
|
+
if (files.length === 0)
|
|
5080
|
+
throw new Error(`no .json files found in directory: ${dir} (from ${flag})`);
|
|
5081
|
+
const merged = {};
|
|
5082
|
+
for (const file of files.sort()) {
|
|
5083
|
+
try {
|
|
5084
|
+
const text = await readFile4(file, "utf8");
|
|
5085
|
+
const parsed = JSON.parse(text);
|
|
5086
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
|
|
5087
|
+
Object.assign(merged, parsed);
|
|
5088
|
+
}
|
|
5089
|
+
} catch {
|
|
5090
|
+
continue;
|
|
5091
|
+
}
|
|
5092
|
+
}
|
|
5093
|
+
return merged;
|
|
5094
|
+
}
|
|
5095
|
+
async function readSingleFile(flag, p) {
|
|
5096
|
+
let text;
|
|
5097
|
+
try {
|
|
5098
|
+
text = await readFile4(p, "utf8");
|
|
5099
|
+
} catch {
|
|
5100
|
+
throw new Error(`file not found: ${p} (from ${flag})`);
|
|
5101
|
+
}
|
|
5102
|
+
let raw;
|
|
5103
|
+
try {
|
|
5104
|
+
raw = JSON.parse(text);
|
|
5105
|
+
} catch {
|
|
5106
|
+
throw new Error(`${flag} is not valid JSON: ${p}`);
|
|
5107
|
+
}
|
|
5108
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
5109
|
+
throw new Error(`${flag} is not valid JSON: expected an object`);
|
|
5110
|
+
}
|
|
5111
|
+
return raw;
|
|
5112
|
+
}
|
|
5113
|
+
|
|
5114
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/apply/src/controller/tokens/read-tokens-from-path.js
|
|
5115
|
+
function readTokensFromPath2(request) {
|
|
5116
|
+
return readTokensFromPath(request.flag, request.path);
|
|
5117
|
+
}
|
|
4738
5118
|
|
|
4739
5119
|
// packages/experience-design-system-backend-pipeline/dist/src/index.js
|
|
4740
5120
|
init_agents();
|
|
@@ -4749,8 +5129,8 @@ function buildContentfulManagementClient(request) {
|
|
|
4749
5129
|
}
|
|
4750
5130
|
|
|
4751
5131
|
// packages/experience-design-system-backend-pipeline/dist/src/steps/generation/src/controller/existing-entities/fetch-and-persist.js
|
|
4752
|
-
import { writeFile } from "node:fs/promises";
|
|
4753
|
-
import { join as
|
|
5132
|
+
import { writeFile as writeFile2 } from "node:fs/promises";
|
|
5133
|
+
import { join as join6 } from "node:path";
|
|
4754
5134
|
|
|
4755
5135
|
// packages/experience-design-system-backend-pipeline/dist/src/steps/generation/src/helpers/existing-entities/fetch-from-contentful.js
|
|
4756
5136
|
import { fetchAll } from "contentful-management";
|
|
@@ -4782,8 +5162,8 @@ async function fetchAndPersistExistingContentfulEntities(request) {
|
|
|
4782
5162
|
spaceId: request.spaceId,
|
|
4783
5163
|
environmentId: request.environmentId
|
|
4784
5164
|
});
|
|
4785
|
-
const path5 =
|
|
4786
|
-
await
|
|
5165
|
+
const path5 = join6(request.outDir, ".existing-entities.json");
|
|
5166
|
+
await writeFile2(path5, JSON.stringify(entities, null, 2), "utf8");
|
|
4787
5167
|
return { ok: true, path: path5, durationMs: Date.now() - t0, entities };
|
|
4788
5168
|
} catch (error) {
|
|
4789
5169
|
return {
|
|
@@ -5300,17 +5680,17 @@ function RunningStep({
|
|
|
5300
5680
|
}
|
|
5301
5681
|
|
|
5302
5682
|
// packages/experience-design-system-cli/src/tui/import/steps/05-token-reuse/logic.ts
|
|
5303
|
-
import { access, stat } from "node:fs/promises";
|
|
5304
|
-
import { join as
|
|
5683
|
+
import { access, stat as stat3 } from "node:fs/promises";
|
|
5684
|
+
import { join as join7 } from "node:path";
|
|
5305
5685
|
async function inspectTokens({ rawTokensPath, outDir, cache }) {
|
|
5306
5686
|
if (!cache) return { kind: "none" };
|
|
5307
|
-
const tokensPath =
|
|
5687
|
+
const tokensPath = join7(outDir, "tokens.json");
|
|
5308
5688
|
try {
|
|
5309
5689
|
await access(tokensPath);
|
|
5310
5690
|
} catch {
|
|
5311
5691
|
return { kind: "none" };
|
|
5312
5692
|
}
|
|
5313
|
-
const [generated, source] = await Promise.all([
|
|
5693
|
+
const [generated, source] = await Promise.all([stat3(tokensPath), stat3(rawTokensPath).catch(() => null)]);
|
|
5314
5694
|
return { kind: "cached", tokensPath, sourceChanged: source ? source.mtimeMs > generated.mtimeMs : false };
|
|
5315
5695
|
}
|
|
5316
5696
|
function gateText({ tokensPath, sourceChanged }) {
|
|
@@ -5502,26 +5882,26 @@ function ExtractionScreen({
|
|
|
5502
5882
|
|
|
5503
5883
|
// packages/experience-design-system-types/dist/src/config/index.js
|
|
5504
5884
|
import { randomBytes } from "node:crypto";
|
|
5505
|
-
import { mkdir, readFile as
|
|
5885
|
+
import { mkdir as mkdir2, readFile as readFile5, rename, writeFile as writeFile3 } from "node:fs/promises";
|
|
5506
5886
|
import { homedir as homedir3 } from "node:os";
|
|
5507
|
-
import { dirname as dirname5, join as
|
|
5887
|
+
import { dirname as dirname5, join as join8 } from "node:path";
|
|
5508
5888
|
function configRoot2() {
|
|
5509
|
-
return process.env["EDS_HOME"] ||
|
|
5889
|
+
return process.env["EDS_HOME"] || join8(homedir3(), ".contentful", "experience-design-system-cli");
|
|
5510
5890
|
}
|
|
5511
|
-
var configFilePath2 = () =>
|
|
5512
|
-
var debugSessionsDir2 = () =>
|
|
5891
|
+
var configFilePath2 = () => join8(configRoot2(), "config.json");
|
|
5892
|
+
var debugSessionsDir2 = () => join8(configRoot2(), "debug", "sessions");
|
|
5513
5893
|
async function readSettings2() {
|
|
5514
5894
|
try {
|
|
5515
|
-
return JSON.parse(await
|
|
5895
|
+
return JSON.parse(await readFile5(configFilePath2(), "utf8"));
|
|
5516
5896
|
} catch {
|
|
5517
5897
|
return {};
|
|
5518
5898
|
}
|
|
5519
5899
|
}
|
|
5520
5900
|
async function writeSettings2(settings) {
|
|
5521
5901
|
const path5 = configFilePath2();
|
|
5522
|
-
await
|
|
5902
|
+
await mkdir2(dirname5(path5), { recursive: true });
|
|
5523
5903
|
const tmp = `${path5}.${process.pid}.${randomBytes(4).toString("hex")}.tmp`;
|
|
5524
|
-
await
|
|
5904
|
+
await writeFile3(tmp, `${JSON.stringify(settings, null, 2)}
|
|
5525
5905
|
`, { mode: 384 });
|
|
5526
5906
|
await rename(tmp, path5);
|
|
5527
5907
|
}
|
|
@@ -5533,8 +5913,8 @@ async function updateSettings2(patch) {
|
|
|
5533
5913
|
import { useEffect as useEffect5, useRef as useRef2, useState as useState8 } from "react";
|
|
5534
5914
|
|
|
5535
5915
|
// packages/experience-design-system-cli/src/tui/import/steps/06-extraction/run.ts
|
|
5536
|
-
import { mkdir as
|
|
5537
|
-
import { join as
|
|
5916
|
+
import { mkdir as mkdir3 } from "node:fs/promises";
|
|
5917
|
+
import { join as join12, resolve as resolve11 } from "node:path";
|
|
5538
5918
|
|
|
5539
5919
|
// packages/experience-design-system-generation/dist/src/agent-names.js
|
|
5540
5920
|
var AGENT_BINARIES2 = {
|
|
@@ -5547,8 +5927,8 @@ var AGENT_BINARIES2 = {
|
|
|
5547
5927
|
|
|
5548
5928
|
// packages/experience-design-system-generation/dist/src/services/prompts/helpers/resolve-skill-file.js
|
|
5549
5929
|
import { existsSync as existsSync3 } from "node:fs";
|
|
5550
|
-
import { readFile as
|
|
5551
|
-
import { dirname as dirname6, join as
|
|
5930
|
+
import { readFile as readFile6 } from "node:fs/promises";
|
|
5931
|
+
import { dirname as dirname6, join as join9, resolve as resolve9 } from "node:path";
|
|
5552
5932
|
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
5553
5933
|
var SKILL_FILES2 = {
|
|
5554
5934
|
components: "generate-components.md",
|
|
@@ -5562,10 +5942,10 @@ function resolveSkillPath2(skill) {
|
|
|
5562
5942
|
const thisDir = dirname6(fileURLToPath3(import.meta.url));
|
|
5563
5943
|
let dir = thisDir;
|
|
5564
5944
|
for (; ; ) {
|
|
5565
|
-
const candidate =
|
|
5945
|
+
const candidate = join9(dir, "skills");
|
|
5566
5946
|
if (existsSync3(candidate))
|
|
5567
|
-
return
|
|
5568
|
-
const parent =
|
|
5947
|
+
return join9(candidate, SKILL_FILES2[skill]);
|
|
5948
|
+
const parent = resolve9(dir, "..");
|
|
5569
5949
|
if (parent === dir) {
|
|
5570
5950
|
throw new Error(`skill file missing from CLI installation (could not locate skills/ directory from: ${thisDir})`);
|
|
5571
5951
|
}
|
|
@@ -5574,16 +5954,16 @@ function resolveSkillPath2(skill) {
|
|
|
5574
5954
|
}
|
|
5575
5955
|
async function readSkillFile2(skill, override) {
|
|
5576
5956
|
if (override) {
|
|
5577
|
-
const skillPath2 =
|
|
5957
|
+
const skillPath2 = resolve9(override);
|
|
5578
5958
|
try {
|
|
5579
|
-
return await
|
|
5959
|
+
return await readFile6(skillPath2, "utf8");
|
|
5580
5960
|
} catch {
|
|
5581
5961
|
throw new Error(`custom prompt file not found (skill: ${skill}, path: ${skillPath2})`);
|
|
5582
5962
|
}
|
|
5583
5963
|
}
|
|
5584
5964
|
const skillPath = resolveSkillPath2(skill);
|
|
5585
5965
|
try {
|
|
5586
|
-
return await
|
|
5966
|
+
return await readFile6(skillPath, "utf8");
|
|
5587
5967
|
} catch {
|
|
5588
5968
|
throw new Error(`skill file missing from CLI installation \u2014 try reinstalling the CLI (looked for: ${skillPath})`);
|
|
5589
5969
|
}
|
|
@@ -6180,7 +6560,7 @@ async function runAgent2(options) {
|
|
|
6180
6560
|
promptLen: prompt.length,
|
|
6181
6561
|
promptHead: prompt.slice(0, 500)
|
|
6182
6562
|
});
|
|
6183
|
-
return new Promise((
|
|
6563
|
+
return new Promise((resolve12) => {
|
|
6184
6564
|
const bedrockEnv = bedrock ? BEDROCK_ENV_BY_AGENT2[agent] : void 0;
|
|
6185
6565
|
const child = spawn3(binary, args, {
|
|
6186
6566
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -6224,7 +6604,7 @@ async function runAgent2(options) {
|
|
|
6224
6604
|
stderrLen: stderr.length,
|
|
6225
6605
|
stderrTail: stderr.slice(-1e3)
|
|
6226
6606
|
});
|
|
6227
|
-
|
|
6607
|
+
resolve12(result);
|
|
6228
6608
|
});
|
|
6229
6609
|
});
|
|
6230
6610
|
}
|
|
@@ -6235,7 +6615,7 @@ import { spawn as spawn5 } from "node:child_process";
|
|
|
6235
6615
|
// packages/experience-design-system-generation/dist/src/services/agent/helpers/check-claude-auth.js
|
|
6236
6616
|
import { spawn as spawn4 } from "node:child_process";
|
|
6237
6617
|
function checkClaudeAuth(binary) {
|
|
6238
|
-
return new Promise((
|
|
6618
|
+
return new Promise((resolve12) => {
|
|
6239
6619
|
const child = spawn4(binary, ["auth", "status", "--json"], {
|
|
6240
6620
|
stdio: ["ignore", "pipe", "pipe"]
|
|
6241
6621
|
});
|
|
@@ -6245,7 +6625,7 @@ function checkClaudeAuth(binary) {
|
|
|
6245
6625
|
if (!done) {
|
|
6246
6626
|
done = true;
|
|
6247
6627
|
child.kill("SIGTERM");
|
|
6248
|
-
|
|
6628
|
+
resolve12("unauthenticated");
|
|
6249
6629
|
}
|
|
6250
6630
|
}, 5e3);
|
|
6251
6631
|
child.stdout?.on("data", (chunk) => {
|
|
@@ -6257,14 +6637,14 @@ function checkClaudeAuth(binary) {
|
|
|
6257
6637
|
done = true;
|
|
6258
6638
|
clearTimeout(timer);
|
|
6259
6639
|
if (code !== 0) {
|
|
6260
|
-
|
|
6640
|
+
resolve12("unauthenticated");
|
|
6261
6641
|
return;
|
|
6262
6642
|
}
|
|
6263
6643
|
try {
|
|
6264
6644
|
const status = JSON.parse(stdout);
|
|
6265
|
-
|
|
6645
|
+
resolve12(status.loggedIn ? "ok" : "unauthenticated");
|
|
6266
6646
|
} catch {
|
|
6267
|
-
|
|
6647
|
+
resolve12("unauthenticated");
|
|
6268
6648
|
}
|
|
6269
6649
|
});
|
|
6270
6650
|
});
|
|
@@ -6273,13 +6653,13 @@ function checkClaudeAuth(binary) {
|
|
|
6273
6653
|
// packages/experience-design-system-generation/dist/src/services/agent/helpers/check-agent-auth.js
|
|
6274
6654
|
async function checkAgentAuth2(agent) {
|
|
6275
6655
|
const binary = resolveAgentBinary(agent);
|
|
6276
|
-
const binaryExists2 = await new Promise((
|
|
6656
|
+
const binaryExists2 = await new Promise((resolve12) => {
|
|
6277
6657
|
if (binary.startsWith("/")) {
|
|
6278
|
-
import("node:fs/promises").then((fs) => fs.access(binary).then(() =>
|
|
6658
|
+
import("node:fs/promises").then((fs) => fs.access(binary).then(() => resolve12(true), () => resolve12(false)));
|
|
6279
6659
|
return;
|
|
6280
6660
|
}
|
|
6281
6661
|
const child = spawn5(process.platform === "win32" ? "where" : "which", [binary], { stdio: "ignore" });
|
|
6282
|
-
child.on("close", (code) =>
|
|
6662
|
+
child.on("close", (code) => resolve12(code === 0));
|
|
6283
6663
|
});
|
|
6284
6664
|
if (!binaryExists2)
|
|
6285
6665
|
return "not-found";
|
|
@@ -6381,17 +6761,17 @@ function parseSelectToolCallLines(stdout) {
|
|
|
6381
6761
|
|
|
6382
6762
|
// packages/experience-design-system-cli/src/tui/import/steps/06-extraction/processes.ts
|
|
6383
6763
|
import { execFile as execFile2, spawn as spawn6 } from "node:child_process";
|
|
6384
|
-
import { join as
|
|
6764
|
+
import { join as join11 } from "node:path";
|
|
6385
6765
|
|
|
6386
6766
|
// packages/experience-design-system-cli/src/legacy/legacy-cli-path.ts
|
|
6387
6767
|
import { existsSync as existsSync4 } from "node:fs";
|
|
6388
|
-
import { join as
|
|
6768
|
+
import { join as join10 } from "node:path";
|
|
6389
6769
|
var PACKAGE_NAME2 = "@contentful/experience-design-system-cli";
|
|
6390
6770
|
function findLegacyCliPath() {
|
|
6391
6771
|
const root = findPackageRoot(import.meta.url, PACKAGE_NAME2);
|
|
6392
6772
|
const candidates = [
|
|
6393
|
-
|
|
6394
|
-
|
|
6773
|
+
join10(root, "legacy", "bin", "cli.js"),
|
|
6774
|
+
join10(root, "..", "experience-design-system-cli-legacy", "bin", "cli.js")
|
|
6395
6775
|
];
|
|
6396
6776
|
const found = candidates.find((candidate) => existsSync4(candidate));
|
|
6397
6777
|
if (!found) {
|
|
@@ -6429,7 +6809,7 @@ function buildPrintTokensArgs(tokensPath, tokenSessionId) {
|
|
|
6429
6809
|
return ["print", "tokens", "--out", tokensPath, ...tokenSessionId ? ["--session", tokenSessionId] : []];
|
|
6430
6810
|
}
|
|
6431
6811
|
function run(args, handlers = {}) {
|
|
6432
|
-
return new Promise((
|
|
6812
|
+
return new Promise((resolve12) => {
|
|
6433
6813
|
const child = spawn6("node", args);
|
|
6434
6814
|
let stdout = "";
|
|
6435
6815
|
let stderr = "";
|
|
@@ -6445,17 +6825,17 @@ function run(args, handlers = {}) {
|
|
|
6445
6825
|
stderr += chunk;
|
|
6446
6826
|
stderrLines(chunk);
|
|
6447
6827
|
});
|
|
6448
|
-
child.on("error", (error) =>
|
|
6449
|
-
child.on("exit", (code) =>
|
|
6828
|
+
child.on("error", (error) => resolve12({ exitCode: 1, stdout, stderr: stderr || error.message }));
|
|
6829
|
+
child.on("exit", (code) => resolve12({ exitCode: code ?? 0, stdout, stderr }));
|
|
6450
6830
|
});
|
|
6451
6831
|
}
|
|
6452
6832
|
function spawnExtract(command, handlers) {
|
|
6453
6833
|
return run(buildExtractArgs(findLegacyCliPath(), command), handlers);
|
|
6454
6834
|
}
|
|
6455
6835
|
function runBuffered(args) {
|
|
6456
|
-
return new Promise((
|
|
6836
|
+
return new Promise((resolve12) => {
|
|
6457
6837
|
execFile2("node", [findLegacyCliPath(), ...args], (error, stdout, stderr) => {
|
|
6458
|
-
|
|
6838
|
+
resolve12({ exitCode: error?.code ? Number(error.code) : 0, stdout, stderr });
|
|
6459
6839
|
});
|
|
6460
6840
|
});
|
|
6461
6841
|
}
|
|
@@ -6465,7 +6845,7 @@ async function runTokenGeneration(input) {
|
|
|
6465
6845
|
return { ok: false, step: "generate tokens", message: generated.stderr.trim() || "Unknown error" };
|
|
6466
6846
|
}
|
|
6467
6847
|
const tokenSessionId = findSession(generated.stdout);
|
|
6468
|
-
const tokensPath =
|
|
6848
|
+
const tokensPath = join11(input.outDir, "tokens.json");
|
|
6469
6849
|
const printed = await runBuffered(buildPrintTokensArgs(tokensPath, tokenSessionId));
|
|
6470
6850
|
if (printed.exitCode !== 0) {
|
|
6471
6851
|
return { ok: false, step: "print tokens", message: printed.stderr.trim() || "Unknown error" };
|
|
@@ -6474,10 +6854,10 @@ async function runTokenGeneration(input) {
|
|
|
6474
6854
|
}
|
|
6475
6855
|
|
|
6476
6856
|
// packages/experience-design-system-cli/src/tui/import/steps/06-extraction/selection.ts
|
|
6477
|
-
import { resolve as
|
|
6857
|
+
import { resolve as resolve10 } from "node:path";
|
|
6478
6858
|
var DEFAULT_TIMEOUT_MS3 = Number(process.env.EDS_AGENT_TIMEOUT_MS ?? 5 * 60 * 1e3);
|
|
6479
6859
|
async function hashSelectPrompt(options) {
|
|
6480
|
-
const promptHash = options.promptText ? hashContent(options.promptText) : options.promptPath ? await hashFile(
|
|
6860
|
+
const promptHash = options.promptText ? hashContent(options.promptText) : options.promptPath ? await hashFile(resolve10(options.promptPath)) : await hashFile(resolveSkillPath2("select"));
|
|
6481
6861
|
return hashContent(`${promptHash}|${options.agent}|${options.model ?? ""}`);
|
|
6482
6862
|
}
|
|
6483
6863
|
async function runSelection(options) {
|
|
@@ -6566,7 +6946,7 @@ var realDeps = { checkAgentAuth: checkAgentAuth2, fetchEntities, spawnExtract, r
|
|
|
6566
6946
|
var fail = (step, message) => ({ ok: false, step, message });
|
|
6567
6947
|
var errorMessage2 = (error) => error instanceof Error ? error.message : String(error);
|
|
6568
6948
|
async function runExtraction(input, onProgress, deps = realDeps) {
|
|
6569
|
-
const outDir =
|
|
6949
|
+
const outDir = join12(resolve11(input.projectPath), ".contentful");
|
|
6570
6950
|
let progress = initialProgress({
|
|
6571
6951
|
hasCredentials: input.credentials !== null,
|
|
6572
6952
|
hasRawTokens: input.rawTokensPath !== "",
|
|
@@ -6651,10 +7031,11 @@ async function runExtraction(input, onProgress, deps = realDeps) {
|
|
|
6651
7031
|
const tokens = await tokenGeneration;
|
|
6652
7032
|
if (tokens && !tokens.ok) return fail(tokens.step, tokens.message);
|
|
6653
7033
|
if (!sessionId) return fail("analyze extract", "The extract command did not report a session.");
|
|
7034
|
+
const hasTokenSource = input.rawTokensPath !== "" || input.tokenStrategy === "reuse";
|
|
6654
7035
|
const extraction = {
|
|
6655
7036
|
sessionId,
|
|
6656
7037
|
outDir,
|
|
6657
|
-
tokensPath: tokens?.ok ? tokens.tokensPath :
|
|
7038
|
+
tokensPath: tokens?.ok ? tokens.tokensPath : hasTokenSource ? join12(outDir, "tokens.json") : "",
|
|
6658
7039
|
tokenSessionId: tokens?.ok ? tokens.tokenSessionId : null,
|
|
6659
7040
|
tokenCount: tokens?.ok ? tokens.tokenCount : 0,
|
|
6660
7041
|
existingEntitiesPath,
|
|
@@ -6665,7 +7046,7 @@ async function runExtraction(input, onProgress, deps = realDeps) {
|
|
|
6665
7046
|
}
|
|
6666
7047
|
async function fetchEntities(credentials, outDir) {
|
|
6667
7048
|
try {
|
|
6668
|
-
await
|
|
7049
|
+
await mkdir3(outDir, { recursive: true });
|
|
6669
7050
|
const result = await fetchAndPersistExistingContentfulEntities({
|
|
6670
7051
|
spaceId: credentials.spaceId,
|
|
6671
7052
|
environmentId: credentials.environmentId,
|
|
@@ -6685,7 +7066,7 @@ async function resolveSelectionPrompt(overrides) {
|
|
|
6685
7066
|
if (select?.kind === "text") return { promptText: select.value };
|
|
6686
7067
|
if (select?.kind === "path") {
|
|
6687
7068
|
await resolvePromptOverride(select);
|
|
6688
|
-
return { promptPath:
|
|
7069
|
+
return { promptPath: resolve11(select.value) };
|
|
6689
7070
|
}
|
|
6690
7071
|
return {};
|
|
6691
7072
|
}
|
|
@@ -7544,7 +7925,7 @@ function buildVisibleRows(props) {
|
|
|
7544
7925
|
if (visited.has(target)) continue;
|
|
7545
7926
|
visited.add(target);
|
|
7546
7927
|
const isCycleMember = cycleParticipants.has(target);
|
|
7547
|
-
out.push({ name: target, depth: cur.depth + 1, isCycleMember
|
|
7928
|
+
out.push({ name: target, depth: cur.depth + 1, isCycleMember });
|
|
7548
7929
|
queue.push({ name: target, depth: cur.depth + 1 });
|
|
7549
7930
|
}
|
|
7550
7931
|
}
|
|
@@ -7591,8 +7972,7 @@ function buildVisibleRows(props) {
|
|
|
7591
7972
|
sharedSuffix,
|
|
7592
7973
|
cycleChild: child.isCycleMember || void 0,
|
|
7593
7974
|
itemIdx: childRec?.idx ?? -1,
|
|
7594
|
-
rootName: key
|
|
7595
|
-
parentName: child.parent
|
|
7975
|
+
rootName: key
|
|
7596
7976
|
});
|
|
7597
7977
|
});
|
|
7598
7978
|
}
|
|
@@ -7675,19 +8055,13 @@ function buildVisibleRows(props) {
|
|
|
7675
8055
|
injectedChildren.push({
|
|
7676
8056
|
name: target,
|
|
7677
8057
|
depth: parentDepth + 1,
|
|
7678
|
-
isCycleChild: true
|
|
7679
|
-
parent: parentName
|
|
8058
|
+
isCycleChild: true
|
|
7680
8059
|
});
|
|
7681
8060
|
}
|
|
7682
8061
|
};
|
|
7683
8062
|
emitCycleChildrenOf(root, 0);
|
|
7684
8063
|
for (const c2 of closureChildren) {
|
|
7685
|
-
injectedChildren.push({
|
|
7686
|
-
name: c2.name,
|
|
7687
|
-
depth: c2.depth,
|
|
7688
|
-
isCycleChild: false,
|
|
7689
|
-
parent: c2.path[c2.path.length - 2] ?? root
|
|
7690
|
-
});
|
|
8064
|
+
injectedChildren.push({ name: c2.name, depth: c2.depth, isCycleChild: false });
|
|
7691
8065
|
emitCycleChildrenOf(c2.name, c2.depth);
|
|
7692
8066
|
}
|
|
7693
8067
|
const isLastAtDepth = (idx) => {
|
|
@@ -7721,8 +8095,7 @@ function buildVisibleRows(props) {
|
|
|
7721
8095
|
sharedSuffix,
|
|
7722
8096
|
cycleChild: child.isCycleChild || void 0,
|
|
7723
8097
|
itemIdx: childRec?.idx ?? -1,
|
|
7724
|
-
rootName: root
|
|
7725
|
-
parentName: child.parent
|
|
8098
|
+
rootName: root
|
|
7726
8099
|
});
|
|
7727
8100
|
});
|
|
7728
8101
|
}
|
|
@@ -7846,7 +8219,6 @@ function GroupedSidebar(props) {
|
|
|
7846
8219
|
showFlatTier,
|
|
7847
8220
|
viewMode,
|
|
7848
8221
|
selectionStateByKey,
|
|
7849
|
-
excludedSlotEdges,
|
|
7850
8222
|
aiFlaggedByKey,
|
|
7851
8223
|
dimPredicate,
|
|
7852
8224
|
visibleRows: providedRows,
|
|
@@ -7876,9 +8248,8 @@ function GroupedSidebar(props) {
|
|
|
7876
8248
|
const rs = itemName ? renderStatusByKey?.get(itemName) : void 0;
|
|
7877
8249
|
const badge = itemName ? previewBadge(previewAnnotationByKey?.get(itemName)) : null;
|
|
7878
8250
|
const showInheritance = rs !== void 0 && row.kind !== "cycle" && row.kind !== "empty" && row.kind !== "group-root";
|
|
7879
|
-
const supportsSelectionGlyph = selectionStateByKey !== void 0 && itemName !== void 0 && (row.kind === "standalone" || row.kind === "group-root" || row.kind === "group-child" || row.kind === "flat" || row.kind === "
|
|
7880
|
-
const
|
|
7881
|
-
const selState = supportsSelectionGlyph ? edgeExcluded ? "undecided" : selectionStateByKey.get(itemName) ?? "undecided" : void 0;
|
|
8251
|
+
const supportsSelectionGlyph = selectionStateByKey !== void 0 && itemName !== void 0 && (row.kind === "standalone" || row.kind === "group-root" || row.kind === "group-child" || row.kind === "flat" || row.kind === "cycle");
|
|
8252
|
+
const selState = supportsSelectionGlyph ? selectionStateByKey.get(itemName) ?? "undecided" : void 0;
|
|
7882
8253
|
const isCycleRow = row.kind === "cycle";
|
|
7883
8254
|
const selStyle = selectionGlyphStyleFor(selState, isCycleRow);
|
|
7884
8255
|
const selGlyph = selStyle.glyph;
|
|
@@ -7907,7 +8278,7 @@ function GroupedSidebar(props) {
|
|
|
7907
8278
|
color: isSelected ? PALETTE2.info : labelStyle.dim ? PALETTE2.muted : labelStyle.color,
|
|
7908
8279
|
bold: isSelected || labelStyle.bold,
|
|
7909
8280
|
inverse: false,
|
|
7910
|
-
underline: isSelected && focused,
|
|
8281
|
+
underline: isSelected && !focused,
|
|
7911
8282
|
wrap: wrapLabels ? "wrap" : "truncate",
|
|
7912
8283
|
children: [
|
|
7913
8284
|
" ",
|
|
@@ -8312,11 +8683,11 @@ function buildCycleUnits(slotCycles) {
|
|
|
8312
8683
|
while (parent.get(cur) !== cur) {
|
|
8313
8684
|
cur = parent.get(cur);
|
|
8314
8685
|
}
|
|
8315
|
-
let
|
|
8316
|
-
while (parent.get(
|
|
8317
|
-
const next = parent.get(
|
|
8318
|
-
parent.set(
|
|
8319
|
-
|
|
8686
|
+
let walk2 = x;
|
|
8687
|
+
while (parent.get(walk2) !== cur) {
|
|
8688
|
+
const next = parent.get(walk2);
|
|
8689
|
+
parent.set(walk2, cur);
|
|
8690
|
+
walk2 = next;
|
|
8320
8691
|
}
|
|
8321
8692
|
return cur;
|
|
8322
8693
|
};
|
|
@@ -8809,20 +9180,14 @@ function rejectNeedsConfirmation(graph, name, state) {
|
|
|
8809
9180
|
const ancestors = toReject.filter((n) => n !== name);
|
|
8810
9181
|
return ancestors.length + toDeselect.length >= 2;
|
|
8811
9182
|
}
|
|
8812
|
-
function
|
|
8813
|
-
const others = edges.filter((e) => e.parent !== edge.parent || e.child !== edge.child);
|
|
8814
|
-
return excluded ? [...others, edge] : others;
|
|
8815
|
-
}
|
|
8816
|
-
function partitionDecisions(components, state, excludedEdges) {
|
|
9183
|
+
function partitionDecisions(components, state) {
|
|
8817
9184
|
const accepted = [];
|
|
8818
9185
|
const rejected = [];
|
|
8819
9186
|
for (const c2 of components) {
|
|
8820
9187
|
if (state.get(c2.name) === "accepted") accepted.push(c2.name);
|
|
8821
9188
|
else rejected.push(c2.name);
|
|
8822
9189
|
}
|
|
8823
|
-
|
|
8824
|
-
const excludedSlotEdges = excludedEdges.filter((e) => !rejectedNames.has(e.parent) && !rejectedNames.has(e.child));
|
|
8825
|
-
return { accepted, rejected, excludedSlotEdges };
|
|
9190
|
+
return { accepted, rejected };
|
|
8826
9191
|
}
|
|
8827
9192
|
|
|
8828
9193
|
// packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/use-scope-gate.ts
|
|
@@ -8830,7 +9195,6 @@ function useScopeGate({ components, onConfirm, onQuit }) {
|
|
|
8830
9195
|
const { columns: totalWidth, rows: terminalRows } = useTerminalSize();
|
|
8831
9196
|
const columnPlan = useMemo2(() => computeColumnWidths(totalWidth), [totalWidth]);
|
|
8832
9197
|
const [decisions, setDecisions] = useState12(/* @__PURE__ */ new Map());
|
|
8833
|
-
const [excludedEdges, setExcludedEdges] = useState12([]);
|
|
8834
9198
|
const [nav, setNav] = useState12({ cursor: 0, scrollOffset: 0 });
|
|
8835
9199
|
const [focusedColumn, setFocusedColumn] = useState12("main");
|
|
8836
9200
|
const [addedComponentsCursor, setAddedComponentsCursor] = useState12(0);
|
|
@@ -9002,13 +9366,6 @@ function useScopeGate({ components, onConfirm, onQuit }) {
|
|
|
9002
9366
|
return void 0;
|
|
9003
9367
|
}
|
|
9004
9368
|
};
|
|
9005
|
-
const focusedNestedEdge = () => {
|
|
9006
|
-
const row = visibleRows[safeCursor];
|
|
9007
|
-
if (row?.kind !== "group-child" || !row.parentName || row.itemIdx < 0) return void 0;
|
|
9008
|
-
const child = groupedItems[row.itemIdx]?.key;
|
|
9009
|
-
return child ? { parent: row.parentName, child } : void 0;
|
|
9010
|
-
};
|
|
9011
|
-
const setEdgeExcluded = (edge, excluded) => setExcludedEdges((prev) => withEdgeExcluded(prev, edge, excluded));
|
|
9012
9369
|
const jumpCursorTo = (name) => {
|
|
9013
9370
|
let idx = -1;
|
|
9014
9371
|
for (let i = 0; i < visibleRows.length; i++) {
|
|
@@ -9108,7 +9465,7 @@ function useScopeGate({ components, onConfirm, onQuit }) {
|
|
|
9108
9465
|
onQuit();
|
|
9109
9466
|
return;
|
|
9110
9467
|
case "confirm":
|
|
9111
|
-
onConfirm(partitionDecisions(components, decisions
|
|
9468
|
+
onConfirm(partitionDecisions(components, decisions));
|
|
9112
9469
|
return;
|
|
9113
9470
|
case "close-help":
|
|
9114
9471
|
setShowHelp(false);
|
|
@@ -9156,18 +9513,11 @@ function useScopeGate({ components, onConfirm, onQuit }) {
|
|
|
9156
9513
|
}
|
|
9157
9514
|
return;
|
|
9158
9515
|
case "accept": {
|
|
9159
|
-
const edge = focusedNestedEdge();
|
|
9160
|
-
if (edge) setEdgeExcluded(edge, false);
|
|
9161
9516
|
const key = focusedRowKey();
|
|
9162
9517
|
if (key) decide({ type: "accept", name: key });
|
|
9163
9518
|
return;
|
|
9164
9519
|
}
|
|
9165
9520
|
case "reject": {
|
|
9166
|
-
const edge = focusedColumn === "main" ? focusedNestedEdge() : void 0;
|
|
9167
|
-
if (edge) {
|
|
9168
|
-
setEdgeExcluded(edge, true);
|
|
9169
|
-
return;
|
|
9170
|
-
}
|
|
9171
9521
|
const key = focusedColumn === "added-components" ? addedComponents[safeAddedComponentsCursor]?.name : focusedRowKey();
|
|
9172
9522
|
if (key) requestReject(key);
|
|
9173
9523
|
return;
|
|
@@ -9269,7 +9619,6 @@ function useScopeGate({ components, onConfirm, onQuit }) {
|
|
|
9269
9619
|
visibleCount,
|
|
9270
9620
|
panelMaxRows,
|
|
9271
9621
|
// sidebar
|
|
9272
|
-
excludedEdges,
|
|
9273
9622
|
groupedItems,
|
|
9274
9623
|
graph,
|
|
9275
9624
|
hasGroupRoots,
|
|
@@ -9395,7 +9744,6 @@ function ScopeGateView({ components, onConfirm, onQuit }) {
|
|
|
9395
9744
|
visibleCount: gate.visibleCount,
|
|
9396
9745
|
showFlatTier: false,
|
|
9397
9746
|
selectionStateByKey: gate.selectionStateByKey,
|
|
9398
|
-
excludedSlotEdges: gate.excludedEdges,
|
|
9399
9747
|
aiFlaggedByKey: gate.aiFlaggedByKey,
|
|
9400
9748
|
dimPredicate: gate.dimPredicate,
|
|
9401
9749
|
visibleRows: gate.visibleRows,
|
|
@@ -9468,9 +9816,9 @@ function parseCacheComponents(stdout) {
|
|
|
9468
9816
|
return [];
|
|
9469
9817
|
}
|
|
9470
9818
|
}
|
|
9471
|
-
var runLegacyCli = (args) => new Promise((
|
|
9819
|
+
var runLegacyCli = (args) => new Promise((resolve12) => {
|
|
9472
9820
|
execFile3("node", [findLegacyCliPath(), ...args], (error, stdout, stderr) => {
|
|
9473
|
-
|
|
9821
|
+
resolve12({ exitCode: error?.code ? Number(error.code) : 0, stdout, stderr });
|
|
9474
9822
|
});
|
|
9475
9823
|
});
|
|
9476
9824
|
async function checkGenerationCache(input, run2 = runLegacyCli) {
|
|
@@ -9512,31 +9860,320 @@ function useScopeGateFlow(input, deps = realDeps2) {
|
|
|
9512
9860
|
const loaded = useMemo3(() => sessionId ? deps.load(sessionId) : void 0, [sessionId]);
|
|
9513
9861
|
const cacheCheck = useRef5(void 0);
|
|
9514
9862
|
const [confirmed, setConfirmed] = useState13();
|
|
9515
|
-
const [scope, setScope] = useState13();
|
|
9516
9863
|
useEffect8(() => {
|
|
9517
9864
|
if (!input || !loaded?.ok || cacheCheck.current) return;
|
|
9518
9865
|
cacheCheck.current = deps.checkCache(input.cache);
|
|
9519
9866
|
}, [input, loaded]);
|
|
9520
|
-
useEffect8(() => {
|
|
9521
|
-
if (!confirmed || !cacheCheck.current) return;
|
|
9522
|
-
let current = true;
|
|
9523
|
-
void cacheCheck.current.then((cachedNames) => {
|
|
9524
|
-
const accepted = new Set(confirmed.accepted);
|
|
9525
|
-
if (current) setScope({ ...confirmed, cachedNames: cachedNames.filter((name) => accepted.has(name)) });
|
|
9526
|
-
});
|
|
9527
|
-
return () => {
|
|
9528
|
-
current = false;
|
|
9529
|
-
};
|
|
9530
|
-
}, [confirmed]);
|
|
9531
9867
|
if (!input || !loaded) return void 0;
|
|
9532
9868
|
if (!loaded.ok) return { status: "failed", message: loaded.message };
|
|
9533
|
-
if (
|
|
9534
|
-
|
|
9869
|
+
if (confirmed && cacheCheck.current)
|
|
9870
|
+
return { status: "confirmed", decisions: confirmed, cachedNames: cacheCheck.current };
|
|
9535
9871
|
return { status: "deciding", load: loaded, confirm: setConfirmed };
|
|
9536
9872
|
}
|
|
9537
9873
|
|
|
9874
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/logic.ts
|
|
9875
|
+
function initialProgress2() {
|
|
9876
|
+
return { components: null, mapTokens: "idle", mapTokensEligible: null };
|
|
9877
|
+
}
|
|
9878
|
+
var PROGRESS_LINE = /^progress=generate:(\d+)\/(\d+):(.+)$/;
|
|
9879
|
+
var STARTED_LINE = /\[(\d+)\/(\d+)\]\s+(.+)/;
|
|
9880
|
+
function applyGenerateStderr(chunk, previous) {
|
|
9881
|
+
let state = previous;
|
|
9882
|
+
for (const line of chunk.split("\n")) {
|
|
9883
|
+
const finished = PROGRESS_LINE.exec(line);
|
|
9884
|
+
if (finished) {
|
|
9885
|
+
state = { done: Number(finished[1]), total: Number(finished[2]), current: finished[3].trim() };
|
|
9886
|
+
continue;
|
|
9887
|
+
}
|
|
9888
|
+
const started = STARTED_LINE.exec(line);
|
|
9889
|
+
if (started) {
|
|
9890
|
+
state = { done: state?.done ?? 0, total: Number(started[2]), current: started[3].trim() };
|
|
9891
|
+
}
|
|
9892
|
+
}
|
|
9893
|
+
return state;
|
|
9894
|
+
}
|
|
9895
|
+
function parseGenerateResult(output, fallbackCount) {
|
|
9896
|
+
const session = /^session=(.+)$/m.exec(output.stdout);
|
|
9897
|
+
const count = /(\d+) components?/.exec(output.stderr);
|
|
9898
|
+
const renamed = /^renamed-slots:\s*(\d+)$/m.exec(output.stdout);
|
|
9899
|
+
return {
|
|
9900
|
+
generateSessionId: session ? session[1].trim() : null,
|
|
9901
|
+
generatedCount: count ? Number(count[1]) : fallbackCount,
|
|
9902
|
+
renamedSlotsCount: renamed ? Number(renamed[1]) : 0
|
|
9903
|
+
};
|
|
9904
|
+
}
|
|
9905
|
+
function shouldRunMapTokens(counts) {
|
|
9906
|
+
return counts.mappablePropCount > 0 && counts.rawTokenCount > 0;
|
|
9907
|
+
}
|
|
9908
|
+
function formatAcceptanceSummary(counts) {
|
|
9909
|
+
const accepted = `${counts.accepted} component${counts.accepted === 1 ? "" : "s"} accepted`;
|
|
9910
|
+
if (counts.autoRejected === 0) return `${accepted}.`;
|
|
9911
|
+
return `${accepted}, ${counts.autoRejected} excluded due to validation errors.`;
|
|
9912
|
+
}
|
|
9913
|
+
var capitalize = (name) => name.charAt(0).toUpperCase() + name.slice(1);
|
|
9914
|
+
function describeGeneration(input) {
|
|
9915
|
+
const agent = capitalize(input.agent);
|
|
9916
|
+
return `${formatAcceptanceSummary({ accepted: input.acceptedCount, autoRejected: 0 })}
|
|
9917
|
+
${agent} is mapping your selected components to Contentful's Component Definition Format (CDF).${input.hasTokens ? " Using your design tokens for prop resolution." : ""}`;
|
|
9918
|
+
}
|
|
9919
|
+
function progressRows2(progress, agent) {
|
|
9920
|
+
const name = capitalize(agent);
|
|
9921
|
+
const { components, mapTokens } = progress;
|
|
9922
|
+
const rows = [
|
|
9923
|
+
{
|
|
9924
|
+
text: components ? components.current : `Starting up ${name}...`,
|
|
9925
|
+
complete: false,
|
|
9926
|
+
...components ? { progress: { done: components.done, total: components.total } } : {}
|
|
9927
|
+
}
|
|
9928
|
+
];
|
|
9929
|
+
if (mapTokens !== "idle") {
|
|
9930
|
+
rows.push({
|
|
9931
|
+
text: mapTokens === "running" ? `Mapping token restrictions via ${name}...` : "Token restrictions ready",
|
|
9932
|
+
complete: mapTokens === "complete"
|
|
9933
|
+
});
|
|
9934
|
+
}
|
|
9935
|
+
return rows;
|
|
9936
|
+
}
|
|
9937
|
+
|
|
9938
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/screen.tsx
|
|
9939
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
9940
|
+
function GenerationScreen({
|
|
9941
|
+
progress,
|
|
9942
|
+
agent,
|
|
9943
|
+
acceptedCount,
|
|
9944
|
+
hasTokens,
|
|
9945
|
+
stepNumber,
|
|
9946
|
+
totalSteps
|
|
9947
|
+
}) {
|
|
9948
|
+
return /* @__PURE__ */ jsx25(
|
|
9949
|
+
RunningStep,
|
|
9950
|
+
{
|
|
9951
|
+
stepNumber,
|
|
9952
|
+
totalSteps,
|
|
9953
|
+
title: "Generating definitions",
|
|
9954
|
+
description: describeGeneration({ acceptedCount, agent, hasTokens }),
|
|
9955
|
+
lines: progressRows2(progress, agent)
|
|
9956
|
+
}
|
|
9957
|
+
);
|
|
9958
|
+
}
|
|
9959
|
+
|
|
9960
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/use-generation.ts
|
|
9961
|
+
import { useEffect as useEffect9, useRef as useRef6, useState as useState14 } from "react";
|
|
9962
|
+
|
|
9963
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/map-tokens.ts
|
|
9964
|
+
async function prepareMapTokens(input, generatedSessionId) {
|
|
9965
|
+
const db = openPipelineDb();
|
|
9966
|
+
try {
|
|
9967
|
+
if (input.tokenSessionId && input.tokenSessionId !== generatedSessionId) {
|
|
9968
|
+
copyTokensFromCache(db, input.tokenSessionId, generatedSessionId);
|
|
9969
|
+
} else if (!input.tokenSessionId && input.tokensPath) {
|
|
9970
|
+
const tokens = await readTokensFromPath2({ flag: "tokens", path: input.tokensPath });
|
|
9971
|
+
storeDtcgTokens(db, generatedSessionId, [], tokens);
|
|
9972
|
+
}
|
|
9973
|
+
const mappablePropCount = loadCDFComponents(db, generatedSessionId).reduce(
|
|
9974
|
+
(count, { entry }) => count + Object.values(entry.$properties).filter((prop) => prop.$type === "token" && prop.$category === "design").length,
|
|
9975
|
+
0
|
|
9976
|
+
);
|
|
9977
|
+
const rawTokenCount = getDtcgTokensForSession(db, generatedSessionId).tokens.length;
|
|
9978
|
+
return {
|
|
9979
|
+
eligible: shouldRunMapTokens({ mappablePropCount, rawTokenCount }),
|
|
9980
|
+
mappablePropCount,
|
|
9981
|
+
rawTokenCount
|
|
9982
|
+
};
|
|
9983
|
+
} finally {
|
|
9984
|
+
db.close();
|
|
9985
|
+
}
|
|
9986
|
+
}
|
|
9987
|
+
|
|
9988
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/processes.ts
|
|
9989
|
+
import { execFile as execFile4, spawn as spawn7 } from "node:child_process";
|
|
9990
|
+
function buildGenerateArgs(cliPath, command) {
|
|
9991
|
+
const args = [cliPath, "__generate", "components", "--agent", command.agent, "--session", command.sessionId];
|
|
9992
|
+
if (command.tokensPath) args.push("--tokens", command.tokensPath);
|
|
9993
|
+
if (command.agentModel) args.push("--model", command.agentModel);
|
|
9994
|
+
if (command.noCache) args.push("--no-cache");
|
|
9995
|
+
if (command.generatePromptPath) args.push("--generate-prompt-path", command.generatePromptPath);
|
|
9996
|
+
for (const prompt of command.promptOverrides) args.push("--prompt", prompt);
|
|
9997
|
+
if (command.existingEntitiesPath) args.push("--existing-entities-path", command.existingEntitiesPath);
|
|
9998
|
+
if (command.cachedComponents.length > 0) args.push("--cached-components", JSON.stringify(command.cachedComponents));
|
|
9999
|
+
return args;
|
|
10000
|
+
}
|
|
10001
|
+
function buildMapTokensArgs(command) {
|
|
10002
|
+
const args = ["map", "tokens", "--session", command.sessionId, "--agent", command.agent];
|
|
10003
|
+
if (command.agentModel) args.push("--model", command.agentModel);
|
|
10004
|
+
if (command.noCache) args.push("--no-cache");
|
|
10005
|
+
for (const prompt of command.promptOverrides) args.push("--prompt", prompt);
|
|
10006
|
+
if (command.existingEntitiesPath) args.push("--existing-entities-path", command.existingEntitiesPath);
|
|
10007
|
+
return args;
|
|
10008
|
+
}
|
|
10009
|
+
function spawnGenerate(command, handlers) {
|
|
10010
|
+
return new Promise((resolve12) => {
|
|
10011
|
+
const child = spawn7("node", buildGenerateArgs(findLegacyCliPath(), command));
|
|
10012
|
+
let stdout = "";
|
|
10013
|
+
let stderr = "";
|
|
10014
|
+
child.stdout.on("data", (data) => {
|
|
10015
|
+
stdout += String(data);
|
|
10016
|
+
});
|
|
10017
|
+
child.stderr.on("data", (data) => {
|
|
10018
|
+
const chunk = String(data);
|
|
10019
|
+
stderr += chunk;
|
|
10020
|
+
handlers.onStderr(chunk);
|
|
10021
|
+
});
|
|
10022
|
+
child.on("error", (error) => resolve12({ exitCode: 1, stdout, stderr: stderr + error.message }));
|
|
10023
|
+
child.on("close", (code) => resolve12({ exitCode: code ?? 0, stdout, stderr }));
|
|
10024
|
+
});
|
|
10025
|
+
}
|
|
10026
|
+
function runMapTokens2(command) {
|
|
10027
|
+
return new Promise((resolve12) => {
|
|
10028
|
+
execFile4("node", [findLegacyCliPath(), ...buildMapTokensArgs(command)], (error, stdout, stderr) => {
|
|
10029
|
+
resolve12({ exitCode: error?.code ? Number(error.code) : 0, stdout, stderr });
|
|
10030
|
+
});
|
|
10031
|
+
});
|
|
10032
|
+
}
|
|
10033
|
+
|
|
10034
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/save-decisions.ts
|
|
10035
|
+
async function saveDecisions(input) {
|
|
10036
|
+
const db = openPipelineDb();
|
|
10037
|
+
try {
|
|
10038
|
+
applyScopeDecisions(db, input.sessionId, input.decisions);
|
|
10039
|
+
await writeScopeDecisionsSnapshot(db, input.sessionId, input.decisions);
|
|
10040
|
+
} finally {
|
|
10041
|
+
db.close();
|
|
10042
|
+
}
|
|
10043
|
+
}
|
|
10044
|
+
|
|
10045
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/run.ts
|
|
10046
|
+
var realDeps3 = {
|
|
10047
|
+
checkAgentAuth: checkAgentAuth2,
|
|
10048
|
+
saveDecisions,
|
|
10049
|
+
checkCache: checkGenerationCache,
|
|
10050
|
+
spawnGenerate,
|
|
10051
|
+
prepareMapTokens,
|
|
10052
|
+
runMapTokens: runMapTokens2
|
|
10053
|
+
};
|
|
10054
|
+
var fail2 = (step, message) => ({ ok: false, step, message });
|
|
10055
|
+
var errorMessage3 = (error) => error instanceof Error ? error.message : String(error);
|
|
10056
|
+
async function runGeneration(input, onProgress, deps = realDeps3) {
|
|
10057
|
+
let progress = initialProgress2();
|
|
10058
|
+
const update = (change) => {
|
|
10059
|
+
progress = { ...progress, ...change };
|
|
10060
|
+
onProgress(progress);
|
|
10061
|
+
};
|
|
10062
|
+
const accepted = input.decisions.accepted;
|
|
10063
|
+
const handedOverNames = await input.cachedNames.catch(() => []);
|
|
10064
|
+
try {
|
|
10065
|
+
await deps.saveDecisions({ sessionId: input.sessionId, decisions: input.decisions });
|
|
10066
|
+
} catch (error) {
|
|
10067
|
+
return fail2("save decisions", errorMessage3(error));
|
|
10068
|
+
}
|
|
10069
|
+
if (accepted.length === 0) return { ok: true, generation: { route: "push", acceptedCount: 0 } };
|
|
10070
|
+
const auth = await deps.checkAgentAuth(input.agent);
|
|
10071
|
+
if (auth === "not-found" || auth === "unauthenticated") {
|
|
10072
|
+
return fail2(`${input.agent} auth check`, agentAuthMessage(input.agent, auth));
|
|
10073
|
+
}
|
|
10074
|
+
const acceptedSet = new Set(accepted);
|
|
10075
|
+
let cachedNames = handedOverNames;
|
|
10076
|
+
let cacheHit = !input.noCache && accepted.length > 0 && accepted.every((name) => cachedNames.includes(name));
|
|
10077
|
+
if (!cacheHit && !input.noCache && accepted.length > 0) {
|
|
10078
|
+
const fresh = await deps.checkCache(cacheCheckFor(input));
|
|
10079
|
+
cachedNames = fresh.filter((name) => acceptedSet.has(name));
|
|
10080
|
+
cacheHit = accepted.every((name) => cachedNames.includes(name));
|
|
10081
|
+
}
|
|
10082
|
+
let generatedSessionId = input.sessionId;
|
|
10083
|
+
let generatedCount = accepted.length;
|
|
10084
|
+
if (!cacheHit) {
|
|
10085
|
+
const result = await deps.spawnGenerate(
|
|
10086
|
+
{
|
|
10087
|
+
sessionId: input.sessionId,
|
|
10088
|
+
tokensPath: input.tokensPath,
|
|
10089
|
+
agent: input.agent,
|
|
10090
|
+
...input.agentModel ? { agentModel: input.agentModel } : {},
|
|
10091
|
+
promptOverrides: input.promptOverrides,
|
|
10092
|
+
...input.generatePromptPath ? { generatePromptPath: input.generatePromptPath } : {},
|
|
10093
|
+
noCache: input.noCache,
|
|
10094
|
+
existingEntitiesPath: input.existingEntitiesPath,
|
|
10095
|
+
cachedComponents: cachedNames
|
|
10096
|
+
},
|
|
10097
|
+
{
|
|
10098
|
+
onStderr: (chunk) => {
|
|
10099
|
+
const components = applyGenerateStderr(chunk, progress.components);
|
|
10100
|
+
if (components !== progress.components) update({ components });
|
|
10101
|
+
}
|
|
10102
|
+
}
|
|
10103
|
+
);
|
|
10104
|
+
if (result.exitCode !== 0) return fail2("generate components", result.stderr.trim() || "Unknown error");
|
|
10105
|
+
const parsed = parseGenerateResult(result, accepted.length);
|
|
10106
|
+
generatedSessionId = parsed.generateSessionId ?? input.sessionId;
|
|
10107
|
+
generatedCount = parsed.generatedCount;
|
|
10108
|
+
}
|
|
10109
|
+
let plan;
|
|
10110
|
+
try {
|
|
10111
|
+
plan = await deps.prepareMapTokens(input, generatedSessionId);
|
|
10112
|
+
} catch (error) {
|
|
10113
|
+
return fail2("map tokens", errorMessage3(error));
|
|
10114
|
+
}
|
|
10115
|
+
update({ mapTokensEligible: plan.eligible });
|
|
10116
|
+
if (plan.eligible) {
|
|
10117
|
+
update({ mapTokens: "running" });
|
|
10118
|
+
const mapped = await deps.runMapTokens({
|
|
10119
|
+
sessionId: generatedSessionId,
|
|
10120
|
+
agent: input.agent,
|
|
10121
|
+
...input.agentModel ? { agentModel: input.agentModel } : {},
|
|
10122
|
+
promptOverrides: input.promptOverrides,
|
|
10123
|
+
noCache: input.noCache,
|
|
10124
|
+
existingEntitiesPath: input.existingEntitiesPath
|
|
10125
|
+
});
|
|
10126
|
+
if (mapped.exitCode !== 0) return fail2("map tokens", mapped.stderr.trim() || "Unknown error");
|
|
10127
|
+
}
|
|
10128
|
+
update({ mapTokens: "complete" });
|
|
10129
|
+
return {
|
|
10130
|
+
ok: true,
|
|
10131
|
+
generation: {
|
|
10132
|
+
route: "review",
|
|
10133
|
+
sessionId: generatedSessionId,
|
|
10134
|
+
acceptedCount: accepted.length,
|
|
10135
|
+
generatedCount,
|
|
10136
|
+
mapTokensEligible: plan.eligible
|
|
10137
|
+
}
|
|
10138
|
+
};
|
|
10139
|
+
}
|
|
10140
|
+
function cacheCheckFor(input) {
|
|
10141
|
+
return {
|
|
10142
|
+
sessionId: input.sessionId,
|
|
10143
|
+
tokensPath: input.tokensPath,
|
|
10144
|
+
agent: input.agent,
|
|
10145
|
+
...input.agentModel ? { agentModel: input.agentModel } : {},
|
|
10146
|
+
promptOverrides: input.promptOverrides,
|
|
10147
|
+
existingEntitiesPath: input.existingEntitiesPath,
|
|
10148
|
+
noCache: input.noCache
|
|
10149
|
+
};
|
|
10150
|
+
}
|
|
10151
|
+
|
|
10152
|
+
// packages/experience-design-system-cli/src/tui/import/steps/08-generation/use-generation.ts
|
|
10153
|
+
function useGeneration(input) {
|
|
10154
|
+
const [state, setState] = useState14();
|
|
10155
|
+
const current = useRef6();
|
|
10156
|
+
useEffect9(() => {
|
|
10157
|
+
current.current = input;
|
|
10158
|
+
if (!input) {
|
|
10159
|
+
setState(void 0);
|
|
10160
|
+
return;
|
|
10161
|
+
}
|
|
10162
|
+
setState({ status: "running", progress: initialProgress2() });
|
|
10163
|
+
void runGeneration(input, (progress) => {
|
|
10164
|
+
if (current.current === input) setState({ status: "running", progress });
|
|
10165
|
+
}).then((result) => {
|
|
10166
|
+
if (current.current === input) setState({ status: "done", result });
|
|
10167
|
+
});
|
|
10168
|
+
return () => {
|
|
10169
|
+
if (current.current === input) current.current = void 0;
|
|
10170
|
+
};
|
|
10171
|
+
}, [input]);
|
|
10172
|
+
return state;
|
|
10173
|
+
}
|
|
10174
|
+
|
|
9538
10175
|
// packages/experience-design-system-cli/src/tui/import/spawn-v1-import.ts
|
|
9539
|
-
import { spawn as
|
|
10176
|
+
import { spawn as spawn8 } from "node:child_process";
|
|
9540
10177
|
|
|
9541
10178
|
// packages/experience-design-system-cli/src/commands/import-options.ts
|
|
9542
10179
|
function importOptionArgs(options) {
|
|
@@ -9570,27 +10207,36 @@ var ExtractionSchema = z5.object({
|
|
|
9570
10207
|
/** The only phases the scope gate can start from. */
|
|
9571
10208
|
compositionPhase: z5.enum(["done", "cache-hit"])
|
|
9572
10209
|
});
|
|
9573
|
-
var
|
|
9574
|
-
/**
|
|
9575
|
-
|
|
9576
|
-
|
|
9577
|
-
|
|
9578
|
-
|
|
9579
|
-
|
|
9580
|
-
|
|
9581
|
-
|
|
9582
|
-
|
|
9583
|
-
|
|
9584
|
-
|
|
9585
|
-
|
|
10210
|
+
var GenerationSchema = z5.discriminatedUnion("route", [
|
|
10211
|
+
/** At least one component was accepted: the definitions were generated and the wizard opens the review screen. */
|
|
10212
|
+
z5.object({
|
|
10213
|
+
route: z5.literal("review"),
|
|
10214
|
+
/** The session the generated definitions are in. The review screen opens it, and saving and pushing read it. */
|
|
10215
|
+
sessionId: NonEmpty,
|
|
10216
|
+
/** How many components the user accepted at the scope gate. */
|
|
10217
|
+
acceptedCount: z5.number(),
|
|
10218
|
+
/** How many definitions were generated, which can differ from the accepted count. */
|
|
10219
|
+
generatedCount: z5.number(),
|
|
10220
|
+
/**
|
|
10221
|
+
* Whether token mapping was worth running (there were design props that are tokens, and tokens to map them from).
|
|
10222
|
+
* The step count the wizard shows depends on it.
|
|
10223
|
+
*/
|
|
10224
|
+
mapTokensEligible: z5.boolean()
|
|
10225
|
+
}),
|
|
10226
|
+
/** Nothing was accepted: nothing is generated and the wizard goes straight to the push flow, as it always did. */
|
|
10227
|
+
z5.object({ route: z5.literal("push"), acceptedCount: z5.literal(0) })
|
|
10228
|
+
]);
|
|
9586
10229
|
var ImportHandoffSchema = z5.object({
|
|
9587
10230
|
/** The user skipped the credentials screen, so nothing is fetched from or pushed to Contentful. */
|
|
9588
10231
|
credentialsSkipped: z5.boolean(),
|
|
9589
10232
|
tokens: TokensSchema,
|
|
9590
10233
|
/** Present once the CLI has run the extraction stage; the wizard then starts at the scope gate. */
|
|
9591
10234
|
extraction: z5.optional(ExtractionSchema),
|
|
9592
|
-
/**
|
|
9593
|
-
|
|
10235
|
+
/**
|
|
10236
|
+
* Present once the CLI has shown the scope gate, saved the decisions and generated the definitions; the wizard then
|
|
10237
|
+
* starts at the review screen (or goes straight to pushing when nothing was accepted).
|
|
10238
|
+
*/
|
|
10239
|
+
generation: z5.optional(GenerationSchema)
|
|
9594
10240
|
});
|
|
9595
10241
|
function serializeHandoff(handoff) {
|
|
9596
10242
|
return JSON.stringify(handoff);
|
|
@@ -9615,7 +10261,7 @@ async function spawnV1Import(options = {}) {
|
|
|
9615
10261
|
const cliPath = findLegacyCliPath();
|
|
9616
10262
|
const args = buildArgs2(options);
|
|
9617
10263
|
return new Promise((resolvePromise) => {
|
|
9618
|
-
const child =
|
|
10264
|
+
const child = spawn8("node", [cliPath, ...args], {
|
|
9619
10265
|
stdio: "inherit",
|
|
9620
10266
|
env: buildEnv(options)
|
|
9621
10267
|
});
|
|
@@ -9633,7 +10279,7 @@ function getTerminalHandle() {
|
|
|
9633
10279
|
return process.stdin._handle;
|
|
9634
10280
|
}
|
|
9635
10281
|
async function stopReadingTerminal() {
|
|
9636
|
-
await new Promise((
|
|
10282
|
+
await new Promise((resolve12) => setImmediate(resolve12));
|
|
9637
10283
|
const handle = getTerminalHandle();
|
|
9638
10284
|
if (!handle?.readStop) return;
|
|
9639
10285
|
handle.reading = false;
|
|
@@ -9647,13 +10293,13 @@ function startReadingTerminal() {
|
|
|
9647
10293
|
}
|
|
9648
10294
|
|
|
9649
10295
|
// packages/experience-design-system-cli/src/tui/help/PageContainer.tsx
|
|
9650
|
-
import { useEffect as
|
|
10296
|
+
import { useEffect as useEffect10, useState as useState15 } from "react";
|
|
9651
10297
|
import { Box as Box21, Text as Text23, useInput as useInput9 } from "ink";
|
|
9652
10298
|
|
|
9653
10299
|
// packages/experience-design-system-cli/src/tui/debug-store.ts
|
|
9654
|
-
import { mkdir as
|
|
10300
|
+
import { mkdir as mkdir4, writeFile as writeFile4 } from "node:fs/promises";
|
|
9655
10301
|
import { existsSync as existsSync5, readdirSync as readdirSync2 } from "node:fs";
|
|
9656
|
-
import { join as
|
|
10302
|
+
import { join as join13 } from "node:path";
|
|
9657
10303
|
|
|
9658
10304
|
// packages/experience-design-system-cli/src/tui/settings/debug-mode/debug-mode-store.ts
|
|
9659
10305
|
var DEFAULT_DEBUG_MODE_SETTING = {
|
|
@@ -9694,14 +10340,14 @@ function generateSessionId3() {
|
|
|
9694
10340
|
}
|
|
9695
10341
|
var SESSION_ID = generateSessionId3();
|
|
9696
10342
|
function sessionDebugDir() {
|
|
9697
|
-
return
|
|
10343
|
+
return join13(debugSessionsDir2(), SESSION_ID);
|
|
9698
10344
|
}
|
|
9699
10345
|
function currentDebugSessionDir() {
|
|
9700
10346
|
return sessionDebugDir();
|
|
9701
10347
|
}
|
|
9702
10348
|
void isDebugModeEnabled().then((enabled) => {
|
|
9703
10349
|
if (!enabled) return void 0;
|
|
9704
|
-
return
|
|
10350
|
+
return mkdir4(sessionDebugDir(), { recursive: true });
|
|
9705
10351
|
});
|
|
9706
10352
|
async function isDebugModeEnabled() {
|
|
9707
10353
|
try {
|
|
@@ -9743,10 +10389,10 @@ async function finishDebugRun({
|
|
|
9743
10389
|
const durationMs = Date.now() - run2.startedAt;
|
|
9744
10390
|
const content = renderMarkdown(run2, { outputs: redact(outputs), status, exitMethod, durationMs });
|
|
9745
10391
|
const flowSegments = run2.flow.split("/");
|
|
9746
|
-
const dir =
|
|
9747
|
-
await
|
|
10392
|
+
const dir = join13(sessionDebugDir(), ...flowSegments);
|
|
10393
|
+
await mkdir4(dir, { recursive: true });
|
|
9748
10394
|
const filename = nextAttemptFilename(dir, run2.menuOption);
|
|
9749
|
-
await
|
|
10395
|
+
await writeFile4(join13(dir, filename), content, { mode: 384 });
|
|
9750
10396
|
}
|
|
9751
10397
|
function nextAttemptFilename(dir, menuOption) {
|
|
9752
10398
|
const today = datePrefix();
|
|
@@ -9829,19 +10475,19 @@ async function readHelpInfo() {
|
|
|
9829
10475
|
}
|
|
9830
10476
|
|
|
9831
10477
|
// packages/experience-design-system-cli/src/tui/help/PageContainer.tsx
|
|
9832
|
-
import { Fragment as Fragment5, jsx as
|
|
10478
|
+
import { Fragment as Fragment5, jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
9833
10479
|
function Section({ title, rows }) {
|
|
9834
10480
|
return /* @__PURE__ */ jsxs22(Box21, { flexDirection: "column", children: [
|
|
9835
|
-
/* @__PURE__ */
|
|
10481
|
+
/* @__PURE__ */ jsx26(Text23, { bold: true, color: PALETTE.accent, children: title }),
|
|
9836
10482
|
rows.map((row) => /* @__PURE__ */ jsxs22(Box21, { gap: 1, children: [
|
|
9837
|
-
/* @__PURE__ */
|
|
9838
|
-
/* @__PURE__ */
|
|
10483
|
+
/* @__PURE__ */ jsx26(Box21, { width: 14, flexShrink: 0, children: /* @__PURE__ */ jsx26(Text23, { color: PALETTE.muted, children: row.label }) }),
|
|
10484
|
+
/* @__PURE__ */ jsx26(Text23, { children: row.value })
|
|
9839
10485
|
] }, row.label))
|
|
9840
10486
|
] });
|
|
9841
10487
|
}
|
|
9842
10488
|
function HelpScreen({ onDone }) {
|
|
9843
|
-
const [info, setInfo] =
|
|
9844
|
-
|
|
10489
|
+
const [info, setInfo] = useState15();
|
|
10490
|
+
useEffect10(() => {
|
|
9845
10491
|
startDebugRun({ flow: "help", step: "01-help", menuOption: "Help", inputs: {} });
|
|
9846
10492
|
void readHelpInfo().then(setInfo);
|
|
9847
10493
|
}, []);
|
|
@@ -9860,13 +10506,13 @@ function HelpScreen({ onDone }) {
|
|
|
9860
10506
|
}
|
|
9861
10507
|
});
|
|
9862
10508
|
return /* @__PURE__ */ jsxs22(Box21, { flexDirection: "column", paddingX: 2, paddingY: 1, gap: 1, children: [
|
|
9863
|
-
/* @__PURE__ */
|
|
10509
|
+
/* @__PURE__ */ jsx26(Text23, { bold: true, children: "Help" }),
|
|
9864
10510
|
info ? /* @__PURE__ */ jsxs22(Fragment5, { children: [
|
|
9865
|
-
/* @__PURE__ */
|
|
9866
|
-
/* @__PURE__ */
|
|
9867
|
-
/* @__PURE__ */
|
|
9868
|
-
] }) : /* @__PURE__ */
|
|
9869
|
-
/* @__PURE__ */
|
|
10511
|
+
/* @__PURE__ */ jsx26(Section, { title: "Where things are stored", rows: info.storage }),
|
|
10512
|
+
/* @__PURE__ */ jsx26(Section, { title: "Troubleshooting", rows: info.troubleshooting }),
|
|
10513
|
+
/* @__PURE__ */ jsx26(Text23, { color: PALETTE.muted, children: "Hit a problem? Turn on Debug Mode in Settings, reproduce it, then share the session folder above. The CMA token is redacted from those logs." })
|
|
10514
|
+
] }) : /* @__PURE__ */ jsx26(Text23, { color: PALETTE.accent, children: "Loading..." }),
|
|
10515
|
+
/* @__PURE__ */ jsx26(
|
|
9870
10516
|
ControlHints,
|
|
9871
10517
|
{
|
|
9872
10518
|
hints: [
|
|
@@ -9879,14 +10525,14 @@ function HelpScreen({ onDone }) {
|
|
|
9879
10525
|
}
|
|
9880
10526
|
|
|
9881
10527
|
// packages/experience-design-system-cli/src/tui/settings/PageContainer.tsx
|
|
9882
|
-
import { useState as
|
|
10528
|
+
import { useState as useState16 } from "react";
|
|
9883
10529
|
import { Box as Box22, Text as Text24, useInput as useInput10 } from "ink";
|
|
9884
|
-
import { jsx as
|
|
10530
|
+
import { jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
9885
10531
|
function SettingsScreen({
|
|
9886
10532
|
onNavigate,
|
|
9887
10533
|
onBack
|
|
9888
10534
|
}) {
|
|
9889
|
-
const [focusIdx, setFocusIdx] =
|
|
10535
|
+
const [focusIdx, setFocusIdx] = useState16(0);
|
|
9890
10536
|
const items = [
|
|
9891
10537
|
{ label: "Configuration", screen: "settings-configuration" },
|
|
9892
10538
|
{ label: "Opt-in Analytics", screen: "settings-opt-in-analytics" },
|
|
@@ -9913,14 +10559,14 @@ function SettingsScreen({
|
|
|
9913
10559
|
}
|
|
9914
10560
|
});
|
|
9915
10561
|
return /* @__PURE__ */ jsxs23(Box22, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
9916
|
-
/* @__PURE__ */
|
|
9917
|
-
/* @__PURE__ */
|
|
10562
|
+
/* @__PURE__ */ jsx27(Text24, { bold: true, children: "Settings" }),
|
|
10563
|
+
/* @__PURE__ */ jsx27(Text24, { children: " " }),
|
|
9918
10564
|
items.map((item, i) => /* @__PURE__ */ jsxs23(Text24, { color: i === focusIdx ? "cyan" : void 0, children: [
|
|
9919
10565
|
i === focusIdx ? "> " : " ",
|
|
9920
10566
|
item.label
|
|
9921
10567
|
] }, item.label)),
|
|
9922
|
-
/* @__PURE__ */
|
|
9923
|
-
/* @__PURE__ */
|
|
10568
|
+
/* @__PURE__ */ jsx27(Text24, { children: " " }),
|
|
10569
|
+
/* @__PURE__ */ jsx27(
|
|
9924
10570
|
ControlHints,
|
|
9925
10571
|
{
|
|
9926
10572
|
hints: [
|
|
@@ -9934,7 +10580,7 @@ function SettingsScreen({
|
|
|
9934
10580
|
}
|
|
9935
10581
|
|
|
9936
10582
|
// packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
|
|
9937
|
-
import { useEffect as
|
|
10583
|
+
import { useEffect as useEffect11, useState as useState17 } from "react";
|
|
9938
10584
|
import { Box as Box23, Text as Text25, useInput as useInput11 } from "ink";
|
|
9939
10585
|
import TextInput4 from "ink-text-input";
|
|
9940
10586
|
|
|
@@ -9967,7 +10613,7 @@ async function writeCredentials(config) {
|
|
|
9967
10613
|
}
|
|
9968
10614
|
|
|
9969
10615
|
// packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
|
|
9970
|
-
import { Fragment as Fragment6, jsx as
|
|
10616
|
+
import { Fragment as Fragment6, jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
9971
10617
|
var FIELD_ORDER = [
|
|
9972
10618
|
"spaceId",
|
|
9973
10619
|
"environmentId",
|
|
@@ -9995,14 +10641,14 @@ var FIELD_LABELS = {
|
|
|
9995
10641
|
defaultTokenFile: "Default token file (optional)"
|
|
9996
10642
|
};
|
|
9997
10643
|
function ConfigurationScreen({ onDone }) {
|
|
9998
|
-
const [stage, setStage] =
|
|
9999
|
-
const [config, setConfig] =
|
|
10000
|
-
const [activeField, setActiveField] =
|
|
10001
|
-
const [notice, setNotice] =
|
|
10002
|
-
const [lastSaved, setLastSaved] =
|
|
10003
|
-
const [editing, setEditing] =
|
|
10004
|
-
const [valueBeforeEdit, setValueBeforeEdit] =
|
|
10005
|
-
|
|
10644
|
+
const [stage, setStage] = useState17("loading");
|
|
10645
|
+
const [config, setConfig] = useState17(null);
|
|
10646
|
+
const [activeField, setActiveField] = useState17("spaceId");
|
|
10647
|
+
const [notice, setNotice] = useState17(null);
|
|
10648
|
+
const [lastSaved, setLastSaved] = useState17(null);
|
|
10649
|
+
const [editing, setEditing] = useState17(false);
|
|
10650
|
+
const [valueBeforeEdit, setValueBeforeEdit] = useState17("");
|
|
10651
|
+
useEffect11(() => {
|
|
10006
10652
|
readCredentials().then((cfg) => {
|
|
10007
10653
|
setConfig(cfg);
|
|
10008
10654
|
setStage("form");
|
|
@@ -10080,25 +10726,25 @@ function ConfigurationScreen({ onDone }) {
|
|
|
10080
10726
|
});
|
|
10081
10727
|
if (stage === "loading") {
|
|
10082
10728
|
return /* @__PURE__ */ jsxs24(Box23, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
10083
|
-
/* @__PURE__ */
|
|
10084
|
-
/* @__PURE__ */
|
|
10085
|
-
/* @__PURE__ */
|
|
10729
|
+
/* @__PURE__ */ jsx28(Text25, { bold: true, children: "Configuration" }),
|
|
10730
|
+
/* @__PURE__ */ jsx28(Text25, { children: " " }),
|
|
10731
|
+
/* @__PURE__ */ jsx28(Text25, { color: PALETTE.accent, children: "Loading..." })
|
|
10086
10732
|
] });
|
|
10087
10733
|
}
|
|
10088
10734
|
return /* @__PURE__ */ jsxs24(Box23, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
10089
|
-
/* @__PURE__ */
|
|
10090
|
-
/* @__PURE__ */
|
|
10091
|
-
/* @__PURE__ */
|
|
10735
|
+
/* @__PURE__ */ jsx28(Text25, { bold: true, children: "Configuration" }),
|
|
10736
|
+
/* @__PURE__ */ jsx28(Text25, { children: " " }),
|
|
10737
|
+
/* @__PURE__ */ jsx28(Box23, { flexDirection: "column", children: FIELD_ORDER.map((field) => {
|
|
10092
10738
|
const isActive = activeField === field;
|
|
10093
10739
|
const value = fieldValue(field);
|
|
10094
10740
|
const display = field === "cmaToken" ? "\u2022".repeat(value.length) : value;
|
|
10095
10741
|
return /* @__PURE__ */ jsxs24(Box23, { gap: 1, children: [
|
|
10096
|
-
/* @__PURE__ */
|
|
10742
|
+
/* @__PURE__ */ jsx28(Text25, { color: isActive ? PALETTE.accent : void 0, children: isActive ? "\u276F" : " " }),
|
|
10097
10743
|
/* @__PURE__ */ jsxs24(Text25, { bold: isActive, children: [
|
|
10098
10744
|
FIELD_LABELS[field],
|
|
10099
10745
|
":"
|
|
10100
10746
|
] }),
|
|
10101
|
-
isActive && editing ? /* @__PURE__ */
|
|
10747
|
+
isActive && editing ? /* @__PURE__ */ jsx28(
|
|
10102
10748
|
TextInput4,
|
|
10103
10749
|
{
|
|
10104
10750
|
value,
|
|
@@ -10106,19 +10752,19 @@ function ConfigurationScreen({ onDone }) {
|
|
|
10106
10752
|
onSubmit: () => setEditing(false),
|
|
10107
10753
|
mask: field === "cmaToken" ? "\u2022" : void 0
|
|
10108
10754
|
}
|
|
10109
|
-
) : /* @__PURE__ */
|
|
10755
|
+
) : /* @__PURE__ */ jsx28(Text25, { children: display || /* @__PURE__ */ jsx28(Text25, { color: PALETTE.muted, children: "(empty)" }) })
|
|
10110
10756
|
] }, field);
|
|
10111
10757
|
}) }),
|
|
10112
10758
|
notice && /* @__PURE__ */ jsxs24(Fragment6, { children: [
|
|
10113
|
-
/* @__PURE__ */
|
|
10759
|
+
/* @__PURE__ */ jsx28(Text25, { children: " " }),
|
|
10114
10760
|
/* @__PURE__ */ jsxs24(Text25, { color: notice.kind === "success" ? PALETTE.success : PALETTE.error, children: [
|
|
10115
10761
|
notice.kind === "success" ? "\u2713" : "\u2717",
|
|
10116
10762
|
" ",
|
|
10117
10763
|
notice.text
|
|
10118
10764
|
] })
|
|
10119
10765
|
] }),
|
|
10120
|
-
/* @__PURE__ */
|
|
10121
|
-
/* @__PURE__ */
|
|
10766
|
+
/* @__PURE__ */ jsx28(Text25, { children: " " }),
|
|
10767
|
+
/* @__PURE__ */ jsx28(
|
|
10122
10768
|
ControlHints,
|
|
10123
10769
|
{
|
|
10124
10770
|
hints: editing ? [
|
|
@@ -10139,7 +10785,7 @@ function ConfigurationScreen({ onDone }) {
|
|
|
10139
10785
|
}
|
|
10140
10786
|
|
|
10141
10787
|
// packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/screen.tsx
|
|
10142
|
-
import { useEffect as
|
|
10788
|
+
import { useEffect as useEffect12, useState as useState18 } from "react";
|
|
10143
10789
|
import { Box as Box24, Text as Text26, useInput as useInput12 } from "ink";
|
|
10144
10790
|
|
|
10145
10791
|
// packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/analytics-store.ts
|
|
@@ -10158,11 +10804,11 @@ async function writeAnalyticsSetting(setting) {
|
|
|
10158
10804
|
}
|
|
10159
10805
|
|
|
10160
10806
|
// packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/screen.tsx
|
|
10161
|
-
import { Fragment as Fragment7, jsx as
|
|
10807
|
+
import { Fragment as Fragment7, jsx as jsx29, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
10162
10808
|
function OptInAnalyticsScreen({ onDone }) {
|
|
10163
|
-
const [loading, setLoading] =
|
|
10164
|
-
const [enabled, setEnabled] =
|
|
10165
|
-
|
|
10809
|
+
const [loading, setLoading] = useState18(true);
|
|
10810
|
+
const [enabled, setEnabled] = useState18(true);
|
|
10811
|
+
useEffect12(() => {
|
|
10166
10812
|
readAnalyticsSetting().then((setting) => {
|
|
10167
10813
|
setEnabled(setting.enabled);
|
|
10168
10814
|
setLoading(false);
|
|
@@ -10190,20 +10836,20 @@ function OptInAnalyticsScreen({ onDone }) {
|
|
|
10190
10836
|
}
|
|
10191
10837
|
});
|
|
10192
10838
|
return /* @__PURE__ */ jsxs25(Box24, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
10193
|
-
/* @__PURE__ */
|
|
10194
|
-
/* @__PURE__ */
|
|
10195
|
-
loading ? /* @__PURE__ */
|
|
10839
|
+
/* @__PURE__ */ jsx29(Text26, { bold: true, children: "Settings \u203A Opt-in Analytics" }),
|
|
10840
|
+
/* @__PURE__ */ jsx29(Text26, { children: " " }),
|
|
10841
|
+
loading ? /* @__PURE__ */ jsx29(Text26, { color: PALETTE.muted, children: "Loading\u2026" }) : /* @__PURE__ */ jsxs25(Fragment7, { children: [
|
|
10196
10842
|
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
10197
10843
|
"Share anonymous usage data:",
|
|
10198
10844
|
" ",
|
|
10199
|
-
/* @__PURE__ */
|
|
10845
|
+
/* @__PURE__ */ jsx29(Text26, { bold: true, color: enabled ? PALETTE.success : PALETTE.muted, children: enabled ? "On" : "Off" })
|
|
10200
10846
|
] }),
|
|
10201
|
-
/* @__PURE__ */
|
|
10202
|
-
/* @__PURE__ */
|
|
10203
|
-
/* @__PURE__ */
|
|
10847
|
+
/* @__PURE__ */ jsx29(Text26, { children: " " }),
|
|
10848
|
+
/* @__PURE__ */ jsx29(Text26, { color: PALETTE.muted, children: "Shares which CLI commands are used and where imports succeed or fail." }),
|
|
10849
|
+
/* @__PURE__ */ jsx29(Text26, { color: PALETTE.muted, children: "Never includes source code, file paths, credentials, or authored content." })
|
|
10204
10850
|
] }),
|
|
10205
|
-
/* @__PURE__ */
|
|
10206
|
-
/* @__PURE__ */
|
|
10851
|
+
/* @__PURE__ */ jsx29(Text26, { children: " " }),
|
|
10852
|
+
/* @__PURE__ */ jsx29(
|
|
10207
10853
|
ControlHints,
|
|
10208
10854
|
{
|
|
10209
10855
|
hints: [
|
|
@@ -10216,13 +10862,13 @@ function OptInAnalyticsScreen({ onDone }) {
|
|
|
10216
10862
|
}
|
|
10217
10863
|
|
|
10218
10864
|
// packages/experience-design-system-cli/src/tui/upgrade/PageContainer.tsx
|
|
10219
|
-
import { useEffect as
|
|
10865
|
+
import { useEffect as useEffect13, useState as useState19 } from "react";
|
|
10220
10866
|
import { Box as Box25, Text as Text27, useInput as useInput13 } from "ink";
|
|
10221
|
-
import { jsx as
|
|
10867
|
+
import { jsx as jsx30, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
10222
10868
|
var UPGRADE_COMMANDS = ["git pull", "pnpm install", "pnpm build"];
|
|
10223
10869
|
function UpgradeScreen({ onDone }) {
|
|
10224
|
-
const [upgradeCheck, setUpgradeCheck] =
|
|
10225
|
-
|
|
10870
|
+
const [upgradeCheck, setUpgradeCheck] = useState19();
|
|
10871
|
+
useEffect13(() => {
|
|
10226
10872
|
startDebugRun({
|
|
10227
10873
|
flow: "upgrade",
|
|
10228
10874
|
step: "01-upgrade",
|
|
@@ -10243,10 +10889,10 @@ function UpgradeScreen({ onDone }) {
|
|
|
10243
10889
|
}
|
|
10244
10890
|
});
|
|
10245
10891
|
return /* @__PURE__ */ jsxs26(Box25, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
10246
|
-
/* @__PURE__ */
|
|
10247
|
-
/* @__PURE__ */
|
|
10892
|
+
/* @__PURE__ */ jsx30(Text27, { bold: true, children: "Upgrade" }),
|
|
10893
|
+
/* @__PURE__ */ jsx30(Text27, { children: " " }),
|
|
10248
10894
|
renderBody(upgradeCheck),
|
|
10249
|
-
/* @__PURE__ */
|
|
10895
|
+
/* @__PURE__ */ jsx30(Text27, { children: " " }),
|
|
10250
10896
|
/* @__PURE__ */ jsxs26(Text27, { bold: true, color: PALETTE.accent, children: [
|
|
10251
10897
|
FOCUS_MARKER,
|
|
10252
10898
|
" Go Back"
|
|
@@ -10255,10 +10901,10 @@ function UpgradeScreen({ onDone }) {
|
|
|
10255
10901
|
}
|
|
10256
10902
|
function renderBody(upgradeCheck) {
|
|
10257
10903
|
if (!upgradeCheck) {
|
|
10258
|
-
return /* @__PURE__ */
|
|
10904
|
+
return /* @__PURE__ */ jsx30(Text27, { color: PALETTE.muted, children: "Checking for updates\u2026" });
|
|
10259
10905
|
}
|
|
10260
10906
|
if (upgradeCheck.status === "error") {
|
|
10261
|
-
return /* @__PURE__ */
|
|
10907
|
+
return /* @__PURE__ */ jsx30(Text27, { color: PALETTE.warning, children: "Couldn't check for updates \u2014 check your network connection and try again." });
|
|
10262
10908
|
}
|
|
10263
10909
|
if (upgradeCheck.status === "up-to-date") {
|
|
10264
10910
|
return /* @__PURE__ */ jsxs26(Text27, { color: PALETTE.success, children: [
|
|
@@ -10281,19 +10927,19 @@ function renderBody(upgradeCheck) {
|
|
|
10281
10927
|
] }),
|
|
10282
10928
|
"). Exit this program, cd into the root of your local clone of contentful/experience-design-system-sdk-public, then run:"
|
|
10283
10929
|
] }),
|
|
10284
|
-
/* @__PURE__ */
|
|
10285
|
-
/* @__PURE__ */
|
|
10930
|
+
/* @__PURE__ */ jsx30(Text27, { children: " " }),
|
|
10931
|
+
/* @__PURE__ */ jsx30(Box25, { flexDirection: "column", borderStyle: "round", borderColor: PALETTE.border, paddingX: 1, children: UPGRADE_COMMANDS.map((cmd) => /* @__PURE__ */ jsx30(Text27, { bold: true, children: cmd }, cmd)) })
|
|
10286
10932
|
] });
|
|
10287
10933
|
}
|
|
10288
10934
|
|
|
10289
10935
|
// packages/experience-design-system-cli/src/tui/settings/debug-mode/screen.tsx
|
|
10290
|
-
import { useEffect as
|
|
10936
|
+
import { useEffect as useEffect14, useState as useState20 } from "react";
|
|
10291
10937
|
import { Box as Box26, Text as Text28, useInput as useInput14 } from "ink";
|
|
10292
|
-
import { jsx as
|
|
10938
|
+
import { jsx as jsx31, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
10293
10939
|
function DebugModeScreen({ onDone }) {
|
|
10294
|
-
const [loading, setLoading] =
|
|
10295
|
-
const [enabled, setEnabled] =
|
|
10296
|
-
|
|
10940
|
+
const [loading, setLoading] = useState20(true);
|
|
10941
|
+
const [enabled, setEnabled] = useState20(true);
|
|
10942
|
+
useEffect14(() => {
|
|
10297
10943
|
readDebugModeSetting().then((setting) => {
|
|
10298
10944
|
setEnabled(setting.enabled);
|
|
10299
10945
|
setLoading(false);
|
|
@@ -10321,15 +10967,15 @@ function DebugModeScreen({ onDone }) {
|
|
|
10321
10967
|
}
|
|
10322
10968
|
});
|
|
10323
10969
|
return /* @__PURE__ */ jsxs27(Box26, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
|
|
10324
|
-
/* @__PURE__ */
|
|
10325
|
-
/* @__PURE__ */
|
|
10326
|
-
loading ? /* @__PURE__ */
|
|
10970
|
+
/* @__PURE__ */ jsx31(Text28, { bold: true, children: "Settings \u203A Debug Mode" }),
|
|
10971
|
+
/* @__PURE__ */ jsx31(Text28, { children: " " }),
|
|
10972
|
+
loading ? /* @__PURE__ */ jsx31(Text28, { color: PALETTE.muted, children: "Loading\u2026" }) : /* @__PURE__ */ jsxs27(Text28, { children: [
|
|
10327
10973
|
"Debug logging:",
|
|
10328
10974
|
" ",
|
|
10329
|
-
/* @__PURE__ */
|
|
10975
|
+
/* @__PURE__ */ jsx31(Text28, { bold: true, color: enabled ? PALETTE.success : PALETTE.muted, children: enabled ? "On" : "Off" })
|
|
10330
10976
|
] }),
|
|
10331
|
-
/* @__PURE__ */
|
|
10332
|
-
/* @__PURE__ */
|
|
10977
|
+
/* @__PURE__ */ jsx31(Text28, { children: " " }),
|
|
10978
|
+
/* @__PURE__ */ jsx31(
|
|
10333
10979
|
ControlHints,
|
|
10334
10980
|
{
|
|
10335
10981
|
hints: [
|
|
@@ -10342,18 +10988,18 @@ function DebugModeScreen({ onDone }) {
|
|
|
10342
10988
|
}
|
|
10343
10989
|
|
|
10344
10990
|
// packages/experience-design-system-cli/app.tsx
|
|
10345
|
-
import { Fragment as Fragment8, jsx as
|
|
10991
|
+
import { Fragment as Fragment8, jsx as jsx32 } from "react/jsx-runtime";
|
|
10346
10992
|
function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
10347
10993
|
const returnedFromImport = importExitCode !== void 0;
|
|
10348
|
-
const [screen, setScreen] =
|
|
10349
|
-
const [showImportResult, setShowImportResult] =
|
|
10350
|
-
const [projectPath, setProjectPath] =
|
|
10351
|
-
const [tokensPath, setTokensPath] =
|
|
10352
|
-
const [scannedFiles, setScannedFiles] =
|
|
10353
|
-
const [pendingLaunch, setPendingLaunch] =
|
|
10354
|
-
const [extractionRun, setExtractionRun] =
|
|
10994
|
+
const [screen, setScreen] = useState21(returnedFromImport ? "import" : "start");
|
|
10995
|
+
const [showImportResult, setShowImportResult] = useState21(returnedFromImport);
|
|
10996
|
+
const [projectPath, setProjectPath] = useState21();
|
|
10997
|
+
const [tokensPath, setTokensPath] = useState21();
|
|
10998
|
+
const [scannedFiles, setScannedFiles] = useState21();
|
|
10999
|
+
const [pendingLaunch, setPendingLaunch] = useState21();
|
|
11000
|
+
const [extractionRun, setExtractionRun] = useState21();
|
|
10355
11001
|
const extraction = useExtraction(extractionRun?.input);
|
|
10356
|
-
const [scopeRun, setScopeRun] =
|
|
11002
|
+
const [scopeRun, setScopeRun] = useState21();
|
|
10357
11003
|
const scopeFlow = useScopeGateFlow(
|
|
10358
11004
|
scopeRun && {
|
|
10359
11005
|
sessionId: scopeRun.extraction.sessionId,
|
|
@@ -10368,8 +11014,10 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10368
11014
|
}
|
|
10369
11015
|
}
|
|
10370
11016
|
);
|
|
10371
|
-
const [
|
|
10372
|
-
|
|
11017
|
+
const [generationInput, setGenerationInput] = useState21();
|
|
11018
|
+
const generation = useGeneration(generationInput);
|
|
11019
|
+
const [importDefaults, setImportDefaults] = useState21();
|
|
11020
|
+
useEffect15(() => {
|
|
10373
11021
|
if (screen !== "import") {
|
|
10374
11022
|
setImportDefaults(void 0);
|
|
10375
11023
|
return;
|
|
@@ -10387,7 +11035,7 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10387
11035
|
const launch = { projectPath: projectPath2, tokens, filePaths, ...importOptions };
|
|
10388
11036
|
const state = await inspectTokens({
|
|
10389
11037
|
rawTokensPath: tokens,
|
|
10390
|
-
outDir:
|
|
11038
|
+
outDir: join14(resolveUserPath(projectPath2), ".contentful"),
|
|
10391
11039
|
cache: importOptions.cache
|
|
10392
11040
|
});
|
|
10393
11041
|
if (state.kind === "cached") {
|
|
@@ -10405,8 +11053,11 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10405
11053
|
void startExtraction(pending.launch, tokenStrategy, pending.credentials);
|
|
10406
11054
|
};
|
|
10407
11055
|
const startExtraction = async (launch, tokenStrategy, credentials) => {
|
|
10408
|
-
const
|
|
11056
|
+
const settings = await readSettings2();
|
|
11057
|
+
const { agent, agentModel } = resolveAgentChoice(launch.agent, settings);
|
|
11058
|
+
const generatePromptPath = typeof settings.generatePromptPath === "string" ? settings.generatePromptPath : void 0;
|
|
10409
11059
|
setExtractionRun({
|
|
11060
|
+
...generatePromptPath ? { generatePromptPath } : {},
|
|
10410
11061
|
// the wizard gets the same agent, so its later steps use what the stage used
|
|
10411
11062
|
launch: { ...launch, agent: agentModel ? `${agent}:${agentModel}` : agent },
|
|
10412
11063
|
credentialsSkipped: credentials.skipped,
|
|
@@ -10423,25 +11074,44 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10423
11074
|
}
|
|
10424
11075
|
});
|
|
10425
11076
|
};
|
|
10426
|
-
|
|
11077
|
+
useEffect15(() => {
|
|
10427
11078
|
if (!extractionRun || extraction?.status !== "done" || !extraction.result.ok) return;
|
|
10428
11079
|
setExtractionRun(void 0);
|
|
10429
11080
|
setScopeRun({ ...extractionRun, extraction: extraction.result.extraction });
|
|
10430
11081
|
}, [extraction, extractionRun]);
|
|
10431
|
-
|
|
10432
|
-
if (!scopeRun || scopeFlow?.status !== "confirmed") return;
|
|
11082
|
+
useEffect15(() => {
|
|
11083
|
+
if (!scopeRun || scopeFlow?.status !== "confirmed" || generationInput) return;
|
|
11084
|
+
const { extraction: produced, input, generatePromptPath } = scopeRun;
|
|
11085
|
+
setGenerationInput({
|
|
11086
|
+
sessionId: produced.sessionId,
|
|
11087
|
+
decisions: scopeFlow.decisions,
|
|
11088
|
+
cachedNames: scopeFlow.cachedNames,
|
|
11089
|
+
tokensPath: produced.tokensPath,
|
|
11090
|
+
tokenSessionId: produced.tokenSessionId,
|
|
11091
|
+
existingEntitiesPath: produced.existingEntitiesPath,
|
|
11092
|
+
agent: input.agent,
|
|
11093
|
+
...input.agentModel ? { agentModel: input.agentModel } : {},
|
|
11094
|
+
promptOverrides: input.promptOverrides,
|
|
11095
|
+
noCache: input.noCache,
|
|
11096
|
+
hasTokens: produced.tokensPath !== "",
|
|
11097
|
+
...generatePromptPath ? { generatePromptPath } : {}
|
|
11098
|
+
});
|
|
11099
|
+
}, [scopeFlow, scopeRun, generationInput]);
|
|
11100
|
+
useEffect15(() => {
|
|
11101
|
+
if (!scopeRun || generation?.status !== "done" || !generation.result.ok) return;
|
|
10433
11102
|
const { launch, credentialsSkipped, tokenStrategy, extraction: produced } = scopeRun;
|
|
10434
11103
|
setScopeRun(void 0);
|
|
11104
|
+
setGenerationInput(void 0);
|
|
10435
11105
|
onLaunchImport?.({
|
|
10436
11106
|
...launch,
|
|
10437
11107
|
handoff: {
|
|
10438
11108
|
credentialsSkipped,
|
|
10439
11109
|
tokens: { strategy: tokenStrategy },
|
|
10440
11110
|
extraction: produced,
|
|
10441
|
-
|
|
11111
|
+
generation: generation.result.generation
|
|
10442
11112
|
}
|
|
10443
11113
|
});
|
|
10444
|
-
}, [
|
|
11114
|
+
}, [generation, scopeRun]);
|
|
10445
11115
|
const goToStart = () => setScreen("start");
|
|
10446
11116
|
const goToSettings = () => setScreen("settings");
|
|
10447
11117
|
const resetImport = () => {
|
|
@@ -10451,6 +11121,7 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10451
11121
|
setPendingLaunch(void 0);
|
|
10452
11122
|
setExtractionRun(void 0);
|
|
10453
11123
|
setScopeRun(void 0);
|
|
11124
|
+
setGenerationInput(void 0);
|
|
10454
11125
|
};
|
|
10455
11126
|
const finishImportResult = () => {
|
|
10456
11127
|
setShowImportResult(false);
|
|
@@ -10463,13 +11134,13 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10463
11134
|
};
|
|
10464
11135
|
switch (screen) {
|
|
10465
11136
|
case "import":
|
|
10466
|
-
if (showImportResult) return /* @__PURE__ */
|
|
10467
|
-
if (importDefaults === void 0) return /* @__PURE__ */
|
|
11137
|
+
if (showImportResult) return /* @__PURE__ */ jsx32(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
|
|
11138
|
+
if (importDefaults === void 0) return /* @__PURE__ */ jsx32(Fragment8, {});
|
|
10468
11139
|
if (projectPath === void 0) {
|
|
10469
|
-
return /* @__PURE__ */
|
|
11140
|
+
return /* @__PURE__ */ jsx32(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
|
|
10470
11141
|
}
|
|
10471
11142
|
if (tokensPath === void 0) {
|
|
10472
|
-
return /* @__PURE__ */
|
|
11143
|
+
return /* @__PURE__ */ jsx32(
|
|
10473
11144
|
TokenInputScreen,
|
|
10474
11145
|
{
|
|
10475
11146
|
initialPath: importDefaults.tokenFile,
|
|
@@ -10479,7 +11150,7 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10479
11150
|
);
|
|
10480
11151
|
}
|
|
10481
11152
|
if (scannedFiles === void 0) {
|
|
10482
|
-
return /* @__PURE__ */
|
|
11153
|
+
return /* @__PURE__ */ jsx32(
|
|
10483
11154
|
PathValidationScreen,
|
|
10484
11155
|
{
|
|
10485
11156
|
projectPath,
|
|
@@ -10491,10 +11162,10 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10491
11162
|
}
|
|
10492
11163
|
if (extractionRun) {
|
|
10493
11164
|
if (extraction?.status === "done" && !extraction.result.ok) {
|
|
10494
|
-
return /* @__PURE__ */
|
|
11165
|
+
return /* @__PURE__ */ jsx32(ErrorStep, { stepName: extraction.result.step, message: extraction.result.message, onExit: leaveImport });
|
|
10495
11166
|
}
|
|
10496
11167
|
if (extraction?.status === "running") {
|
|
10497
|
-
return /* @__PURE__ */
|
|
11168
|
+
return /* @__PURE__ */ jsx32(
|
|
10498
11169
|
ExtractionScreen,
|
|
10499
11170
|
{
|
|
10500
11171
|
progress: extraction.progress,
|
|
@@ -10503,14 +11174,14 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10503
11174
|
}
|
|
10504
11175
|
);
|
|
10505
11176
|
}
|
|
10506
|
-
return /* @__PURE__ */
|
|
11177
|
+
return /* @__PURE__ */ jsx32(Fragment8, {});
|
|
10507
11178
|
}
|
|
10508
11179
|
if (scopeRun && scopeFlow) {
|
|
10509
11180
|
if (scopeFlow.status === "failed") {
|
|
10510
|
-
return /* @__PURE__ */
|
|
11181
|
+
return /* @__PURE__ */ jsx32(ErrorStep, { stepName: "scope gate", message: scopeFlow.message, onExit: leaveImport });
|
|
10511
11182
|
}
|
|
10512
11183
|
if (scopeFlow.status === "deciding") {
|
|
10513
|
-
return /* @__PURE__ */
|
|
11184
|
+
return /* @__PURE__ */ jsx32(
|
|
10514
11185
|
ScopeGateScreen,
|
|
10515
11186
|
{
|
|
10516
11187
|
components: scopeFlow.load.components,
|
|
@@ -10519,19 +11190,31 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10519
11190
|
}
|
|
10520
11191
|
);
|
|
10521
11192
|
}
|
|
10522
|
-
|
|
10523
|
-
|
|
10524
|
-
|
|
10525
|
-
|
|
10526
|
-
|
|
10527
|
-
|
|
10528
|
-
|
|
10529
|
-
|
|
10530
|
-
}
|
|
10531
|
-
|
|
11193
|
+
if (generation?.status === "done" && !generation.result.ok) {
|
|
11194
|
+
return /* @__PURE__ */ jsx32(ErrorStep, { stepName: generation.result.step, message: generation.result.message, onExit: leaveImport });
|
|
11195
|
+
}
|
|
11196
|
+
if (generation?.status === "running") {
|
|
11197
|
+
const hasRawTokens = scopeRun.input.rawTokensPath !== "";
|
|
11198
|
+
const counted = stepNumbers({
|
|
11199
|
+
hasRawTokens,
|
|
11200
|
+
mapTokensEligible: generation.progress.mapTokensEligible
|
|
11201
|
+
});
|
|
11202
|
+
return /* @__PURE__ */ jsx32(
|
|
11203
|
+
GenerationScreen,
|
|
11204
|
+
{
|
|
11205
|
+
progress: generation.progress,
|
|
11206
|
+
agent: scopeRun.input.agent,
|
|
11207
|
+
acceptedCount: scopeFlow.decisions.accepted.length,
|
|
11208
|
+
hasTokens: scopeRun.extraction.tokensPath !== "",
|
|
11209
|
+
stepNumber: hasRawTokens ? 4 : 3,
|
|
11210
|
+
totalSteps: counted.totalSteps
|
|
11211
|
+
}
|
|
11212
|
+
);
|
|
11213
|
+
}
|
|
11214
|
+
return /* @__PURE__ */ jsx32(Fragment8, {});
|
|
10532
11215
|
}
|
|
10533
11216
|
if (pendingLaunch?.cached) {
|
|
10534
|
-
return /* @__PURE__ */
|
|
11217
|
+
return /* @__PURE__ */ jsx32(
|
|
10535
11218
|
TokenReuseScreen,
|
|
10536
11219
|
{
|
|
10537
11220
|
tokensPath: pendingLaunch.cached.tokensPath,
|
|
@@ -10542,7 +11225,7 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10542
11225
|
}
|
|
10543
11226
|
);
|
|
10544
11227
|
}
|
|
10545
|
-
return /* @__PURE__ */
|
|
11228
|
+
return /* @__PURE__ */ jsx32(
|
|
10546
11229
|
CredentialsScreen,
|
|
10547
11230
|
{
|
|
10548
11231
|
initial: importDefaults.credentials,
|
|
@@ -10551,26 +11234,26 @@ function App({ importOptions, onLaunchImport, importExitCode }) {
|
|
|
10551
11234
|
}
|
|
10552
11235
|
);
|
|
10553
11236
|
case "help":
|
|
10554
|
-
return /* @__PURE__ */
|
|
11237
|
+
return /* @__PURE__ */ jsx32(HelpScreen, { onDone: goToStart });
|
|
10555
11238
|
case "upgrade":
|
|
10556
|
-
return /* @__PURE__ */
|
|
11239
|
+
return /* @__PURE__ */ jsx32(UpgradeScreen, { onDone: goToStart });
|
|
10557
11240
|
case "settings":
|
|
10558
|
-
return /* @__PURE__ */
|
|
11241
|
+
return /* @__PURE__ */ jsx32(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
|
|
10559
11242
|
case "settings-configuration":
|
|
10560
|
-
return /* @__PURE__ */
|
|
11243
|
+
return /* @__PURE__ */ jsx32(ConfigurationScreen, { onDone: goToSettings });
|
|
10561
11244
|
case "settings-opt-in-analytics":
|
|
10562
|
-
return /* @__PURE__ */
|
|
11245
|
+
return /* @__PURE__ */ jsx32(OptInAnalyticsScreen, { onDone: goToSettings });
|
|
10563
11246
|
case "settings-debug-mode":
|
|
10564
|
-
return /* @__PURE__ */
|
|
11247
|
+
return /* @__PURE__ */ jsx32(DebugModeScreen, { onDone: goToSettings });
|
|
10565
11248
|
case "start":
|
|
10566
|
-
return /* @__PURE__ */
|
|
11249
|
+
return /* @__PURE__ */ jsx32(HomeScreen, { onNavigate: setScreen });
|
|
10567
11250
|
}
|
|
10568
11251
|
}
|
|
10569
11252
|
var CLEAR_SCREEN = "\x1B[2J\x1B[H";
|
|
10570
11253
|
async function renderUntilImportRequestedOrExit(renderApp, importOptions, importExitCode) {
|
|
10571
11254
|
let requestedImport;
|
|
10572
11255
|
const instance = renderApp(
|
|
10573
|
-
/* @__PURE__ */
|
|
11256
|
+
/* @__PURE__ */ jsx32(
|
|
10574
11257
|
App,
|
|
10575
11258
|
{
|
|
10576
11259
|
importOptions,
|