@stechquick/studio-cli 4.2.0-3 → 4.3.0-0-BETA-release-4.3.0-2026.10.7.8.25
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/common/agentic/compiler/src/definitions/Bar.js +172 -0
- package/dist/common/agentic/compiler/src/definitions/Bar.js.map +1 -0
- package/dist/common/agentic/compiler/src/definitions/Doughnut.js +172 -0
- package/dist/common/agentic/compiler/src/definitions/Doughnut.js.map +1 -0
- package/dist/common/agentic/compiler/src/definitions/Line.js +172 -0
- package/dist/common/agentic/compiler/src/definitions/Line.js.map +1 -0
- package/dist/common/agentic/compiler/src/definitions/VSparkline.js +310 -0
- package/dist/common/agentic/compiler/src/definitions/VSparkline.js.map +1 -0
- package/dist/common/agentic/compiler/src/system/ComponentDefinitionManager.js +8 -0
- package/dist/common/agentic/compiler/src/system/ComponentDefinitionManager.js.map +1 -1
- package/dist/common/clean/domain/useCases/ICloudProviderStorage.js.map +1 -1
- package/dist/common/clean/infrastructure/cloud/s3Low.js +72 -14
- package/dist/common/clean/infrastructure/cloud/s3Low.js.map +1 -1
- package/dist/common/clean/useCases/cloudProviderStorageCephImpl.js +6 -0
- package/dist/common/clean/useCases/cloudProviderStorageCephImpl.js.map +1 -1
- package/dist/common/qCloudTemp/quickCloud.js +1 -1
- package/dist/common/qCloudTemp/quickCloud.js.map +1 -1
- package/dist/common/qCloudTemp/rawExport.js +42 -0
- package/dist/common/qCloudTemp/rawExport.js.map +1 -0
- package/dist/common/qCloudTemp/rawImport.js +49 -0
- package/dist/common/qCloudTemp/rawImport.js.map +1 -0
- package/dist/common/qCloudTemp/studioInfoExport.js +3 -0
- package/dist/common/qCloudTemp/studioInfoExport.js.map +1 -0
- package/dist/common/qCloudTemp/symDtoObjects.js.map +1 -1
- package/dist/quick/common/shrimp/interfaces/quick/IStore.js.map +1 -1
- package/dist/studio-cli/kits/miniapp-app-kit/.ai-kit/cli-kit/knowledge/render-check.md +6 -6
- package/dist/studio-cli/kits/miniapp-app-kit/.ai-kit/ui-kit/reference/component-styles.json +104 -0
- package/dist/studio-cli/kits/mobile-app-kit/.ai-kit/cli-kit/knowledge/render-check.md +6 -6
- package/dist/studio-cli/kits/mobile-app-kit/.ai-kit/ui-kit/reference/component-styles.json +104 -0
- package/dist/studio-cli/kits/ui-app-kit/.ai-kit/cli-kit/knowledge/render-check.md +6 -6
- package/dist/studio-cli/kits/ui-app-kit/.ai-kit/ui-kit/reference/component-styles.json +104 -0
- package/dist/studio-cli/kits/wf-app-kit/.ai-kit/cli-kit/knowledge/render-check.md +6 -6
- package/dist/studio-cli/kits/wf-app-kit/.ai-kit/ui-kit/reference/component-styles.json +104 -0
- package/dist/studio-cli/src/server/bridgeServer.js +15 -62
- package/dist/studio-cli/src/server/bridgeServer.js.map +1 -1
- package/dist/studio-cli/src/version.js +1 -1
- package/dist/studio-cli/src/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quickCloud.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/quickCloud.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"quickCloud.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/quickCloud.ts"],"names":[],"mappings":";;;AAAA,sEAAqH;AAIrH,sEAAwG;AACxG,sEAAkF;AAElF,yEAAmH;AACnH,yEAAwF;AACxF,iEAAwE;AAIxE,qEAAgF;AAChF,oEAAuF;AACvF,sEAAkF;AAClF,8DAAkH;AAClH,uDAAgE;AAChE,+DAAsE;AAEzD,QAAA,mBAAmB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAG,QAAQ,EAAG,4BAAoB,EAAE,MAAM,EAAE,+BAAuB,EAAE,+BAAuB,EAAE,4BAAoB,EAAE,4BAAoB,EAAE,iCAAyB,EAAE,MAAM,EAAE,uBAAe,EAAE,2BAAmB,EAAE,mCAA2B,EAAE,4BAAoB,EAAE,iCAAyB,EAAE,6BAAoB,EAAE,yBAAgB,EAAE,8BAAqB,EAAE,2BAAkB,EAAE,yBAAgB,EAAE,0BAAkB,CAAC,CAAC;AACjf,QAAA,mBAAmB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3D,QAAA,sBAAsB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AA2B/H,QAAA,cAAc,GAAG;IAC1B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,mBAAmB;IAC5B,cAAc,EAAE,sBAAsB;IACtC,GAAG,EAAE,OAAO;IACZ,QAAQ,EAAE,eAAe;IACzB,kBAAkB,EAAE,oBAAoB;IACxC,SAAS,EAAE,YAAY;IACvB,WAAW,EAAE,cAAc;IAC3B,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;CAChB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rawExportSourceHost = exports.RAW_EXPORT_ENVIRONMENT_NOT_SET = exports.RAW_EXPORT_EXCLUDED_HISTORY_TYPES = exports.RawExportPaths = exports.RAW_EXPORT_FORMAT_VERSION = exports.RAW_EXPORT_FORMAT = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Raw export paketi: Studio modelleri id çevirisi yapılmadan, storage'daki halleriyle.
|
|
6
|
+
* Bu dosya paket formatının tek kaynağıdır; ileride yazılacak import işi de buradan okur.
|
|
7
|
+
*/
|
|
8
|
+
exports.RAW_EXPORT_FORMAT = "studio-raw-export";
|
|
9
|
+
exports.RAW_EXPORT_FORMAT_VERSION = 1;
|
|
10
|
+
exports.RawExportPaths = {
|
|
11
|
+
manifest: "manifest.json",
|
|
12
|
+
dbFolder: "db",
|
|
13
|
+
dbFile: (collection) => `db/${collection}.jsonl`,
|
|
14
|
+
modelBody: (modelInfoId, key) => `models/${modelInfoId}/${key}`,
|
|
15
|
+
historyBody: (historyInfoId, key) => `history/${historyInfoId}/${key}`,
|
|
16
|
+
};
|
|
17
|
+
/** Silme kayıtlarının sürümü ve body'si yok; pakete alınmazlar. */
|
|
18
|
+
exports.RAW_EXPORT_EXCLUDED_HISTORY_TYPES = ["delete", "ownerItemDelete"];
|
|
19
|
+
/** jobs'ta `ENVIRONMENT` tanımlı değilse manifest'e yazılan ortam adı; alan boş kalmasın. */
|
|
20
|
+
exports.RAW_EXPORT_ENVIRONMENT_NOT_SET = "NOT SET";
|
|
21
|
+
/**
|
|
22
|
+
* Export isteğinin geldiği Studio adresinin host'u: tarayıcının gönderdiği Origin, yoksa proxy'nin x-forwarded-host'u, o da yoksa host
|
|
23
|
+
* başlığı. Port ve şema atılır; kullanılabilir bir değer yoksa undefined.
|
|
24
|
+
*/
|
|
25
|
+
function rawExportSourceHost(headers) {
|
|
26
|
+
if (headers.origin) {
|
|
27
|
+
try {
|
|
28
|
+
const hostname = new URL(headers.origin).hostname;
|
|
29
|
+
if (hostname) {
|
|
30
|
+
return hostname;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// "null" gibi URL olmayan Origin değerleri: sıradaki başlığa geçilir.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const raw = headers["x-forwarded-host"]?.split(",")[0]?.trim() || headers.host?.trim();
|
|
38
|
+
const hostname = raw?.replace(/:\d+$/, "");
|
|
39
|
+
return hostname || undefined;
|
|
40
|
+
}
|
|
41
|
+
exports.rawExportSourceHost = rawExportSourceHost;
|
|
42
|
+
//# sourceMappingURL=rawExport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawExport.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/rawExport.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,iBAAiB,GAAG,mBAA4B,CAAC;AACjD,QAAA,yBAAyB,GAAG,CAAU,CAAC;AAkBvC,QAAA,cAAc,GAAG;IAC1B,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,CAAC,UAA+B,EAAE,EAAE,CAAC,MAAM,UAAU,QAAQ;IACrE,SAAS,EAAE,CAAC,WAAmB,EAAE,GAAW,EAAE,EAAE,CAAC,UAAU,WAAW,IAAI,GAAG,EAAE;IAC/E,WAAW,EAAE,CAAC,aAAqB,EAAE,GAAW,EAAE,EAAE,CAAC,WAAW,aAAa,IAAI,GAAG,EAAE;CACzF,CAAC;AAEF,mEAAmE;AACtD,QAAA,iCAAiC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAU,CAAC;AAmCxF,6FAA6F;AAChF,QAAA,8BAA8B,GAAG,SAAS,CAAC;AA8CxD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,OAAwE;IACxG,IAAI,OAAO,CAAC,MAAM,EAAE;QAChB,IAAI;YACA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;YAClD,IAAI,QAAQ,EAAE;gBAAE,OAAO,QAAQ,CAAC;aAAE;SACrC;QAAC,MAAM;YACJ,sEAAsE;SACzE;KACJ;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACvF,MAAM,QAAQ,GAAG,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3C,OAAO,QAAQ,IAAI,SAAS,CAAC;AACjC,CAAC;AAZD,kDAYC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RAW_IMPORT_LEGACY_JOB_ERROR = exports.isLegacyRawImportJobData = exports.RAW_IMPORT_ACTIVE_STATES = exports.RAW_IMPORT_INTERRUPTED_ERROR = exports.RAW_IMPORT_STORED_LIST_LIMIT = exports.RAW_IMPORT_LIST_LIMIT = exports.RAW_IMPORT_STALE_RUNNING_MS = exports.RAW_IMPORT_STEPS = exports.RAW_IMPORT_WORK_FOLDER = exports.rawImportZipPath = exports.RAW_IMPORT_CONTAINER = exports.RawImportParts = exports.RAW_IMPORT_UPLOAD_MAX_DURATION_MS = exports.RAW_IMPORT_UPLOAD_IDLE_TIMEOUT_MS = exports.RAW_IMPORT_REQUEST_TIMEOUT_MS = exports.RAW_IMPORT_MAX_UNZIPPED_BYTES = exports.RAW_IMPORT_MAX_ENTRY_BYTES = exports.RAW_IMPORT_MAX_PACKAGE_BYTES = exports.RAW_IMPORT_SUPPORTED_FORMAT_VERSIONS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Raw export paketinin (rawExport.ts) import sözleşmesi. Import jobs'ta çalışır: kullanıcı yüklemeden önce çakışma kararını (reject/skip)
|
|
6
|
+
* verir, UI zip'i rawimport/upload'a yükler, API zip'i org storage'ına (imports/<importId>.zip) yazar ve tek bir rawImport job'u açar.
|
|
7
|
+
* Job paketi kontrol eder, durur ya da devam eder, migrate eder ve yazar. Sonuçlar Jobs kaydının rawImport alanında durur.
|
|
8
|
+
*/
|
|
9
|
+
/** Import'un okuyabildiği paket formatı sürümleri (IRawExportManifest.formatVersion). */
|
|
10
|
+
exports.RAW_IMPORT_SUPPORTED_FORMAT_VERSIONS = [1];
|
|
11
|
+
/** Yüklenen (sıkıştırılmış) paketin üst sınırı. */
|
|
12
|
+
exports.RAW_IMPORT_MAX_PACKAGE_BYTES = 200 * 1024 * 1024;
|
|
13
|
+
/** Zip içindeki tek bir dosyanın açılmış boyutunun üst sınırı (zip bombasına karşı). */
|
|
14
|
+
exports.RAW_IMPORT_MAX_ENTRY_BYTES = 64 * 1024 * 1024;
|
|
15
|
+
/** Zip içindeki tüm dosyaların açılmış boyutları toplamının üst sınırı (zip bombasına karşı). */
|
|
16
|
+
exports.RAW_IMPORT_MAX_UNZIPPED_BYTES = 1024 * 1024 * 1024;
|
|
17
|
+
/** UI'ın yükleme (rawimport/upload) isteğinde beklediği süre; yavaş bağlantıda da 200 MB'lık paketin yüklenmesine yetmeli. */
|
|
18
|
+
exports.RAW_IMPORT_REQUEST_TIMEOUT_MS = 60 * 60 * 1000;
|
|
19
|
+
/** API: bu süre boyunca paketten hiç veri gelmezse yükleme iptal edilir (yavaş ama ilerleyen yükleme kesilmez). */
|
|
20
|
+
exports.RAW_IMPORT_UPLOAD_IDLE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
21
|
+
/** API: yüklemenin toplam süre sınırı; UI'ın beklediği süreden biraz uzun, önce UI kendi mesajını gösterir. */
|
|
22
|
+
exports.RAW_IMPORT_UPLOAD_MAX_DURATION_MS = exports.RAW_IMPORT_REQUEST_TIMEOUT_MS + 5 * 60 * 1000;
|
|
23
|
+
/** Multipart parça adları. Sıra önemlidir: önce organizationId, sonra conflictPolicy, en son package. */
|
|
24
|
+
exports.RawImportParts = { organizationId: "organizationId", conflictPolicy: "conflictPolicy", package: "package" };
|
|
25
|
+
/** Yüklenen zip'in container'ı; zip org storage'ında imports/<importId>.zip olarak durur. */
|
|
26
|
+
exports.RAW_IMPORT_CONTAINER = "imports";
|
|
27
|
+
function rawImportZipPath(importId) { return `${importId}.zip`; }
|
|
28
|
+
exports.rawImportZipPath = rawImportZipPath;
|
|
29
|
+
/** jobs'un work root'u altındaki import klasörü: <workRoot>/raw_imports/<jobID>/. */
|
|
30
|
+
exports.RAW_IMPORT_WORK_FOLDER = "raw_imports";
|
|
31
|
+
/** Job adımları: paket indirilir, kontrol edilir (engel ya da Reject'te çakışma varsa burada durur), gerekiyorsa migrate edilir (yoksa adım atlanır), sonra yazılır. */
|
|
32
|
+
exports.RAW_IMPORT_STEPS = { download: "Download Package", check: "Check Package", migrate: "Migrate Package", apply: "Import Package" };
|
|
33
|
+
/** Bu süreden uzun "waiting" ya da "running" kalan rawImport job'u takılmış sayılır ve süpürücü onu bitirir (createDate'inden). */
|
|
34
|
+
exports.RAW_IMPORT_STALE_RUNNING_MS = 6 * 60 * 60 * 1000;
|
|
35
|
+
/** Import sekmesinde listelenen son import sayısı. */
|
|
36
|
+
exports.RAW_IMPORT_LIST_LIMIT = 10;
|
|
37
|
+
/** Job kaydına yazılan sorun öğeleri listelerinin üst sınırı (kayıt 16 MB'a yaklaşmasın, her yenileme küçük kalsın). */
|
|
38
|
+
exports.RAW_IMPORT_STORED_LIST_LIMIT = 200;
|
|
39
|
+
/** Süpürücünün sonucu kaydedilmeden takılan job'a yazdığı hata (job kendi hatasını yazdıysa o kalır). */
|
|
40
|
+
exports.RAW_IMPORT_INTERRUPTED_ERROR = "interrupted";
|
|
41
|
+
/** Org'da aynı anda bu durumlardan yalnızca birinde tek import olabilir. */
|
|
42
|
+
exports.RAW_IMPORT_ACTIVE_STATES = ["waiting", "running"];
|
|
43
|
+
function isLegacyRawImportJobData(data) {
|
|
44
|
+
return "mode" in data;
|
|
45
|
+
}
|
|
46
|
+
exports.isLegacyRawImportJobData = isLegacyRawImportJobData;
|
|
47
|
+
/** Kuyrukta kalmış eski biçimli job'a yazılan hata. */
|
|
48
|
+
exports.RAW_IMPORT_LEGACY_JOB_ERROR = "This import was created by an earlier version of Studio. Upload the package again.";
|
|
49
|
+
//# sourceMappingURL=rawImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawImport.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/rawImport.ts"],"names":[],"mappings":";;;AAGA;;;;GAIG;AAEH,yFAAyF;AAC5E,QAAA,oCAAoC,GAA0B,CAAC,CAAC,CAAC,CAAC;AAC/E,mDAAmD;AACtC,QAAA,4BAA4B,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9D,wFAAwF;AAC3E,QAAA,0BAA0B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3D,iGAAiG;AACpF,QAAA,6BAA6B,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAChE,8HAA8H;AACjH,QAAA,6BAA6B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5D,mHAAmH;AACtG,QAAA,iCAAiC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/D,+GAA+G;AAClG,QAAA,iCAAiC,GAAG,qCAA6B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAG/F,yGAAyG;AAC5F,QAAA,cAAc,GAAG,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAW,CAAC;AAuFlI,6FAA6F;AAChF,QAAA,oBAAoB,GAAG,SAAS,CAAC;AAC9C,SAAgB,gBAAgB,CAAC,QAAgB,IAAY,OAAO,GAAG,QAAQ,MAAM,CAAC,CAAC,CAAC;AAAxF,4CAAwF;AACxF,qFAAqF;AACxE,QAAA,sBAAsB,GAAG,aAAa,CAAC;AACpD,wKAAwK;AAC3J,QAAA,gBAAgB,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAW,CAAC;AACvJ,mIAAmI;AACtH,QAAA,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9D,sDAAsD;AACzC,QAAA,qBAAqB,GAAG,EAAE,CAAC;AACxC,wHAAwH;AAC3G,QAAA,4BAA4B,GAAG,GAAG,CAAC;AAChD,yGAAyG;AAC5F,QAAA,4BAA4B,GAAG,aAAa,CAAC;AAI1D,4EAA4E;AAC/D,QAAA,wBAAwB,GAAkC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAgC9F,SAAgB,wBAAwB,CAAC,IAAsB;IAC3D,OAAO,MAAM,IAAI,IAAI,CAAC;AAC1B,CAAC;AAFD,4DAEC;AACD,uDAAuD;AAC1C,QAAA,2BAA2B,GAAG,oFAAoF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studioInfoExport.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/studioInfoExport.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symDtoObjects.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/symDtoObjects.ts"],"names":[],"mappings":";;AA0DmE,CAAC;AAInE,CAAC;AAmHD,CAAC;
|
|
1
|
+
{"version":3,"file":"symDtoObjects.js","sourceRoot":"","sources":["../../../../common/qCloudTemp/symDtoObjects.ts"],"names":[],"mappings":";;AA0DmE,CAAC;AAInE,CAAC;AAmHD,CAAC;AAodD,CAAC;AAMD,CAAC;AAuCD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IStore.js","sourceRoot":"","sources":["../../../../../../../quick/common/shrimp/interfaces/quick/IStore.ts"],"names":[],"mappings":";;AAmDC,CAAC;
|
|
1
|
+
{"version":3,"file":"IStore.js","sourceRoot":"","sources":["../../../../../../../quick/common/shrimp/interfaces/quick/IStore.ts"],"names":[],"mappings":";;AAmDC,CAAC;AAMD,CAAC"}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
`studio buildQjson` is **static** — it compiles and structurally validates, but never *runs* the page, so it can't see **runtime / console errors** (a handler that throws on init, a bad binding, a service call that blows up at render). To catch those, render the page in a real Studio editor tab and look at it.
|
|
4
4
|
|
|
5
|
-
You have a browser for this: the **Playwright MCP** server (`playwright`). You do **not** log in and you do **not** deal with any token — the CLI opens an authenticated Studio editor for you, and that tab
|
|
5
|
+
You have a browser for this: the **Playwright MCP** server (`playwright`). You do **not** log in and you do **not** deal with any token — the CLI opens an authenticated Studio editor for you, and that tab shows the same state as the user's own Studio session.
|
|
6
6
|
|
|
7
7
|
## Push first — the editor renders the *cloud* model
|
|
8
8
|
|
|
9
|
-
The test tab shows the real Studio app editor. A page you just authored locally reaches it through `studio push`: push creates brand-new models in the cloud app (writing their id back into the file's frontmatter) and
|
|
9
|
+
The test tab shows the real Studio app editor. A page you just authored locally reaches it through `studio push`: push creates brand-new models in the cloud app (writing their id back into the file's frontmatter) and puts every pushed body into the user's Studio session as unsaved work. The test tab picks up that unsaved work when it opens and after every push. So the order is **build → push → check**:
|
|
10
10
|
|
|
11
11
|
1. `studio buildQjson <file>` is clean.
|
|
12
|
-
2. `studio push` — your model now exists in the app
|
|
12
|
+
2. `studio push` — your model now exists in the app and its body is in the user's session.
|
|
13
13
|
3. Check it.
|
|
14
14
|
|
|
15
15
|
## The loop
|
|
@@ -19,12 +19,12 @@ The test tab shows the real Studio app editor. A page you just authored locally
|
|
|
19
19
|
http://127.0.0.1:<port>/render
|
|
20
20
|
```
|
|
21
21
|
`<port>` is the `port` field of `.studio/server.json` in the workspace (usually `7345`). The CLI redirects the browser into the **authenticated** Studio editor for the right org + app — you never log in and never handle credentials. The tab also connects to the CLI as a **test client** automatically. Wait for the editor to load.
|
|
22
|
-
2. **
|
|
22
|
+
2. **Open your page.** Nothing is opened for you — click the page's name in the file explorer on the left.
|
|
23
23
|
3. **Check for errors** in three places:
|
|
24
24
|
- the **rendered UI** itself — `browser_take_screenshot`; does it draw, or is it blank / broken / misaligned?
|
|
25
25
|
- the **browser console** — `browser_console_messages`; collect every `error` (and relevant `warning`),
|
|
26
26
|
- the **editor's own error panel / markers**, if it surfaces any.
|
|
27
|
-
4. **Fix & re-push:** map each error back to the offending node/handler in your `.qjson`, fix it locally, run `studio buildQjson`, then `studio push`. The test tab
|
|
27
|
+
4. **Fix & re-push:** map each error back to the offending node/handler in your `.qjson`, fix it locally, run `studio buildQjson`, then `studio push`. The test tab picks up the new body after the push; if the page you're checking still looks old, click it again in the file explorer or re-open the render URL.
|
|
28
28
|
5. **Repeat** until the UI renders correctly and the console is clean.
|
|
29
29
|
6. **Close the browser** with `browser_close`. The Playwright MCP keeps a real browser process alive between tool calls — it does not shut down on its own — so this is a required, explicit final action, not something to get to eventually. Close it whether the check passed or you are stopping early; the only time there is nothing to close is when you never opened the browser at all.
|
|
30
30
|
|
|
@@ -42,7 +42,7 @@ Ignore unrelated framework/network noise; focus on errors that name your compone
|
|
|
42
42
|
|
|
43
43
|
- If `http://127.0.0.1:<port>/render` refuses the connection, the bridge isn't running — the user needs `studio connect`. Skip the render check and rely on `buildQjson`; note that runtime wasn't verified.
|
|
44
44
|
- If it returns **503** ("no authenticated Studio session"), the user's Studio tab isn't connected — ask them to open Studio and connect the CLI, then retry.
|
|
45
|
-
- If the test tab starts failing with auth errors mid-session (token expired), `browser_navigate` to the render URL again — it re-enters with a fresh session and
|
|
45
|
+
- If the test tab starts failing with auth errors mid-session (token expired), `browser_navigate` to the render URL again — it re-enters with a fresh session and picks up the user's current state again.
|
|
46
46
|
- If the `playwright` MCP server isn't in your harness at all, skip the render check and rely on `buildQjson` + the [pre-delivery checklist](../../ui-kit/knowledge/validation.md). Nothing was opened, so there is nothing to close.
|
|
47
47
|
|
|
48
48
|
Whenever you *did* open the browser — even if the check couldn't be finished (connection refused after navigating, a 503, an expired session you gave up on) — still call `browser_close` before you finish. A launched browser left open outlives the task.
|
|
@@ -7123,6 +7123,110 @@
|
|
|
7123
7123
|
"borderLeftWidth": {},
|
|
7124
7124
|
"defaultBorderColor": {},
|
|
7125
7125
|
"sides": {}
|
|
7126
|
+
},
|
|
7127
|
+
"Doughnut": {
|
|
7128
|
+
"marginTop": {},
|
|
7129
|
+
"marginRight": {},
|
|
7130
|
+
"marginBottom": {},
|
|
7131
|
+
"marginLeft": {},
|
|
7132
|
+
"paddingTop": {},
|
|
7133
|
+
"paddingRight": {},
|
|
7134
|
+
"paddingBottom": {},
|
|
7135
|
+
"paddingLeft": {},
|
|
7136
|
+
"boxShadow": {},
|
|
7137
|
+
"boxSizing": {},
|
|
7138
|
+
"borderTopStyle": {},
|
|
7139
|
+
"borderRightStyle": {},
|
|
7140
|
+
"borderBottomStyle": {},
|
|
7141
|
+
"borderLeftStyle": {},
|
|
7142
|
+
"borderTopLeftRadius": {},
|
|
7143
|
+
"borderTopRightRadius": {},
|
|
7144
|
+
"borderBottomLeftRadius": {},
|
|
7145
|
+
"borderBottomRightRadius": {},
|
|
7146
|
+
"borderTopWidth": {},
|
|
7147
|
+
"borderRightWidth": {},
|
|
7148
|
+
"borderBottomWidth": {},
|
|
7149
|
+
"borderLeftWidth": {},
|
|
7150
|
+
"defaultBorderColor": {},
|
|
7151
|
+
"sides": {}
|
|
7152
|
+
},
|
|
7153
|
+
"Bar": {
|
|
7154
|
+
"marginTop": {},
|
|
7155
|
+
"marginRight": {},
|
|
7156
|
+
"marginBottom": {},
|
|
7157
|
+
"marginLeft": {},
|
|
7158
|
+
"paddingTop": {},
|
|
7159
|
+
"paddingRight": {},
|
|
7160
|
+
"paddingBottom": {},
|
|
7161
|
+
"paddingLeft": {},
|
|
7162
|
+
"boxShadow": {},
|
|
7163
|
+
"boxSizing": {},
|
|
7164
|
+
"borderTopStyle": {},
|
|
7165
|
+
"borderRightStyle": {},
|
|
7166
|
+
"borderBottomStyle": {},
|
|
7167
|
+
"borderLeftStyle": {},
|
|
7168
|
+
"borderTopLeftRadius": {},
|
|
7169
|
+
"borderTopRightRadius": {},
|
|
7170
|
+
"borderBottomLeftRadius": {},
|
|
7171
|
+
"borderBottomRightRadius": {},
|
|
7172
|
+
"borderTopWidth": {},
|
|
7173
|
+
"borderRightWidth": {},
|
|
7174
|
+
"borderBottomWidth": {},
|
|
7175
|
+
"borderLeftWidth": {},
|
|
7176
|
+
"defaultBorderColor": {},
|
|
7177
|
+
"sides": {}
|
|
7178
|
+
},
|
|
7179
|
+
"Line": {
|
|
7180
|
+
"marginTop": {},
|
|
7181
|
+
"marginRight": {},
|
|
7182
|
+
"marginBottom": {},
|
|
7183
|
+
"marginLeft": {},
|
|
7184
|
+
"paddingTop": {},
|
|
7185
|
+
"paddingRight": {},
|
|
7186
|
+
"paddingBottom": {},
|
|
7187
|
+
"paddingLeft": {},
|
|
7188
|
+
"boxShadow": {},
|
|
7189
|
+
"boxSizing": {},
|
|
7190
|
+
"borderTopStyle": {},
|
|
7191
|
+
"borderRightStyle": {},
|
|
7192
|
+
"borderBottomStyle": {},
|
|
7193
|
+
"borderLeftStyle": {},
|
|
7194
|
+
"borderTopLeftRadius": {},
|
|
7195
|
+
"borderTopRightRadius": {},
|
|
7196
|
+
"borderBottomLeftRadius": {},
|
|
7197
|
+
"borderBottomRightRadius": {},
|
|
7198
|
+
"borderTopWidth": {},
|
|
7199
|
+
"borderRightWidth": {},
|
|
7200
|
+
"borderBottomWidth": {},
|
|
7201
|
+
"borderLeftWidth": {},
|
|
7202
|
+
"defaultBorderColor": {},
|
|
7203
|
+
"sides": {}
|
|
7204
|
+
},
|
|
7205
|
+
"VSparkline": {
|
|
7206
|
+
"marginTop": {},
|
|
7207
|
+
"marginRight": {},
|
|
7208
|
+
"marginBottom": {},
|
|
7209
|
+
"marginLeft": {},
|
|
7210
|
+
"paddingTop": {},
|
|
7211
|
+
"paddingRight": {},
|
|
7212
|
+
"paddingBottom": {},
|
|
7213
|
+
"paddingLeft": {},
|
|
7214
|
+
"boxShadow": {},
|
|
7215
|
+
"boxSizing": {},
|
|
7216
|
+
"borderTopStyle": {},
|
|
7217
|
+
"borderRightStyle": {},
|
|
7218
|
+
"borderBottomStyle": {},
|
|
7219
|
+
"borderLeftStyle": {},
|
|
7220
|
+
"borderTopLeftRadius": {},
|
|
7221
|
+
"borderTopRightRadius": {},
|
|
7222
|
+
"borderBottomLeftRadius": {},
|
|
7223
|
+
"borderBottomRightRadius": {},
|
|
7224
|
+
"borderTopWidth": {},
|
|
7225
|
+
"borderRightWidth": {},
|
|
7226
|
+
"borderBottomWidth": {},
|
|
7227
|
+
"borderLeftWidth": {},
|
|
7228
|
+
"defaultBorderColor": {},
|
|
7229
|
+
"sides": {}
|
|
7126
7230
|
}
|
|
7127
7231
|
}
|
|
7128
7232
|
}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
`studio buildQjson` is **static** — it compiles and structurally validates, but never *runs* the page, so it can't see **runtime / console errors** (a handler that throws on init, a bad binding, a service call that blows up at render). To catch those, render the page in a real Studio editor tab and look at it.
|
|
4
4
|
|
|
5
|
-
You have a browser for this: the **Playwright MCP** server (`playwright`). You do **not** log in and you do **not** deal with any token — the CLI opens an authenticated Studio editor for you, and that tab
|
|
5
|
+
You have a browser for this: the **Playwright MCP** server (`playwright`). You do **not** log in and you do **not** deal with any token — the CLI opens an authenticated Studio editor for you, and that tab shows the same state as the user's own Studio session.
|
|
6
6
|
|
|
7
7
|
## Push first — the editor renders the *cloud* model
|
|
8
8
|
|
|
9
|
-
The test tab shows the real Studio app editor. A page you just authored locally reaches it through `studio push`: push creates brand-new models in the cloud app (writing their id back into the file's frontmatter) and
|
|
9
|
+
The test tab shows the real Studio app editor. A page you just authored locally reaches it through `studio push`: push creates brand-new models in the cloud app (writing their id back into the file's frontmatter) and puts every pushed body into the user's Studio session as unsaved work. The test tab picks up that unsaved work when it opens and after every push. So the order is **build → push → check**:
|
|
10
10
|
|
|
11
11
|
1. `studio buildQjson <file>` is clean.
|
|
12
|
-
2. `studio push` — your model now exists in the app
|
|
12
|
+
2. `studio push` — your model now exists in the app and its body is in the user's session.
|
|
13
13
|
3. Check it.
|
|
14
14
|
|
|
15
15
|
## The loop
|
|
@@ -19,12 +19,12 @@ The test tab shows the real Studio app editor. A page you just authored locally
|
|
|
19
19
|
http://127.0.0.1:<port>/render
|
|
20
20
|
```
|
|
21
21
|
`<port>` is the `port` field of `.studio/server.json` in the workspace (usually `7345`). The CLI redirects the browser into the **authenticated** Studio editor for the right org + app — you never log in and never handle credentials. The tab also connects to the CLI as a **test client** automatically. Wait for the editor to load.
|
|
22
|
-
2. **
|
|
22
|
+
2. **Open your page.** Nothing is opened for you — click the page's name in the file explorer on the left.
|
|
23
23
|
3. **Check for errors** in three places:
|
|
24
24
|
- the **rendered UI** itself — `browser_take_screenshot`; does it draw, or is it blank / broken / misaligned?
|
|
25
25
|
- the **browser console** — `browser_console_messages`; collect every `error` (and relevant `warning`),
|
|
26
26
|
- the **editor's own error panel / markers**, if it surfaces any.
|
|
27
|
-
4. **Fix & re-push:** map each error back to the offending node/handler in your `.qjson`, fix it locally, run `studio buildQjson`, then `studio push`. The test tab
|
|
27
|
+
4. **Fix & re-push:** map each error back to the offending node/handler in your `.qjson`, fix it locally, run `studio buildQjson`, then `studio push`. The test tab picks up the new body after the push; if the page you're checking still looks old, click it again in the file explorer or re-open the render URL.
|
|
28
28
|
5. **Repeat** until the UI renders correctly and the console is clean.
|
|
29
29
|
6. **Close the browser** with `browser_close`. The Playwright MCP keeps a real browser process alive between tool calls — it does not shut down on its own — so this is a required, explicit final action, not something to get to eventually. Close it whether the check passed or you are stopping early; the only time there is nothing to close is when you never opened the browser at all.
|
|
30
30
|
|
|
@@ -42,7 +42,7 @@ Ignore unrelated framework/network noise; focus on errors that name your compone
|
|
|
42
42
|
|
|
43
43
|
- If `http://127.0.0.1:<port>/render` refuses the connection, the bridge isn't running — the user needs `studio connect`. Skip the render check and rely on `buildQjson`; note that runtime wasn't verified.
|
|
44
44
|
- If it returns **503** ("no authenticated Studio session"), the user's Studio tab isn't connected — ask them to open Studio and connect the CLI, then retry.
|
|
45
|
-
- If the test tab starts failing with auth errors mid-session (token expired), `browser_navigate` to the render URL again — it re-enters with a fresh session and
|
|
45
|
+
- If the test tab starts failing with auth errors mid-session (token expired), `browser_navigate` to the render URL again — it re-enters with a fresh session and picks up the user's current state again.
|
|
46
46
|
- If the `playwright` MCP server isn't in your harness at all, skip the render check and rely on `buildQjson` + the [pre-delivery checklist](../../ui-kit/knowledge/validation.md). Nothing was opened, so there is nothing to close.
|
|
47
47
|
|
|
48
48
|
Whenever you *did* open the browser — even if the check couldn't be finished (connection refused after navigating, a 503, an expired session you gave up on) — still call `browser_close` before you finish. A launched browser left open outlives the task.
|
|
@@ -7123,6 +7123,110 @@
|
|
|
7123
7123
|
"borderLeftWidth": {},
|
|
7124
7124
|
"defaultBorderColor": {},
|
|
7125
7125
|
"sides": {}
|
|
7126
|
+
},
|
|
7127
|
+
"Doughnut": {
|
|
7128
|
+
"marginTop": {},
|
|
7129
|
+
"marginRight": {},
|
|
7130
|
+
"marginBottom": {},
|
|
7131
|
+
"marginLeft": {},
|
|
7132
|
+
"paddingTop": {},
|
|
7133
|
+
"paddingRight": {},
|
|
7134
|
+
"paddingBottom": {},
|
|
7135
|
+
"paddingLeft": {},
|
|
7136
|
+
"boxShadow": {},
|
|
7137
|
+
"boxSizing": {},
|
|
7138
|
+
"borderTopStyle": {},
|
|
7139
|
+
"borderRightStyle": {},
|
|
7140
|
+
"borderBottomStyle": {},
|
|
7141
|
+
"borderLeftStyle": {},
|
|
7142
|
+
"borderTopLeftRadius": {},
|
|
7143
|
+
"borderTopRightRadius": {},
|
|
7144
|
+
"borderBottomLeftRadius": {},
|
|
7145
|
+
"borderBottomRightRadius": {},
|
|
7146
|
+
"borderTopWidth": {},
|
|
7147
|
+
"borderRightWidth": {},
|
|
7148
|
+
"borderBottomWidth": {},
|
|
7149
|
+
"borderLeftWidth": {},
|
|
7150
|
+
"defaultBorderColor": {},
|
|
7151
|
+
"sides": {}
|
|
7152
|
+
},
|
|
7153
|
+
"Bar": {
|
|
7154
|
+
"marginTop": {},
|
|
7155
|
+
"marginRight": {},
|
|
7156
|
+
"marginBottom": {},
|
|
7157
|
+
"marginLeft": {},
|
|
7158
|
+
"paddingTop": {},
|
|
7159
|
+
"paddingRight": {},
|
|
7160
|
+
"paddingBottom": {},
|
|
7161
|
+
"paddingLeft": {},
|
|
7162
|
+
"boxShadow": {},
|
|
7163
|
+
"boxSizing": {},
|
|
7164
|
+
"borderTopStyle": {},
|
|
7165
|
+
"borderRightStyle": {},
|
|
7166
|
+
"borderBottomStyle": {},
|
|
7167
|
+
"borderLeftStyle": {},
|
|
7168
|
+
"borderTopLeftRadius": {},
|
|
7169
|
+
"borderTopRightRadius": {},
|
|
7170
|
+
"borderBottomLeftRadius": {},
|
|
7171
|
+
"borderBottomRightRadius": {},
|
|
7172
|
+
"borderTopWidth": {},
|
|
7173
|
+
"borderRightWidth": {},
|
|
7174
|
+
"borderBottomWidth": {},
|
|
7175
|
+
"borderLeftWidth": {},
|
|
7176
|
+
"defaultBorderColor": {},
|
|
7177
|
+
"sides": {}
|
|
7178
|
+
},
|
|
7179
|
+
"Line": {
|
|
7180
|
+
"marginTop": {},
|
|
7181
|
+
"marginRight": {},
|
|
7182
|
+
"marginBottom": {},
|
|
7183
|
+
"marginLeft": {},
|
|
7184
|
+
"paddingTop": {},
|
|
7185
|
+
"paddingRight": {},
|
|
7186
|
+
"paddingBottom": {},
|
|
7187
|
+
"paddingLeft": {},
|
|
7188
|
+
"boxShadow": {},
|
|
7189
|
+
"boxSizing": {},
|
|
7190
|
+
"borderTopStyle": {},
|
|
7191
|
+
"borderRightStyle": {},
|
|
7192
|
+
"borderBottomStyle": {},
|
|
7193
|
+
"borderLeftStyle": {},
|
|
7194
|
+
"borderTopLeftRadius": {},
|
|
7195
|
+
"borderTopRightRadius": {},
|
|
7196
|
+
"borderBottomLeftRadius": {},
|
|
7197
|
+
"borderBottomRightRadius": {},
|
|
7198
|
+
"borderTopWidth": {},
|
|
7199
|
+
"borderRightWidth": {},
|
|
7200
|
+
"borderBottomWidth": {},
|
|
7201
|
+
"borderLeftWidth": {},
|
|
7202
|
+
"defaultBorderColor": {},
|
|
7203
|
+
"sides": {}
|
|
7204
|
+
},
|
|
7205
|
+
"VSparkline": {
|
|
7206
|
+
"marginTop": {},
|
|
7207
|
+
"marginRight": {},
|
|
7208
|
+
"marginBottom": {},
|
|
7209
|
+
"marginLeft": {},
|
|
7210
|
+
"paddingTop": {},
|
|
7211
|
+
"paddingRight": {},
|
|
7212
|
+
"paddingBottom": {},
|
|
7213
|
+
"paddingLeft": {},
|
|
7214
|
+
"boxShadow": {},
|
|
7215
|
+
"boxSizing": {},
|
|
7216
|
+
"borderTopStyle": {},
|
|
7217
|
+
"borderRightStyle": {},
|
|
7218
|
+
"borderBottomStyle": {},
|
|
7219
|
+
"borderLeftStyle": {},
|
|
7220
|
+
"borderTopLeftRadius": {},
|
|
7221
|
+
"borderTopRightRadius": {},
|
|
7222
|
+
"borderBottomLeftRadius": {},
|
|
7223
|
+
"borderBottomRightRadius": {},
|
|
7224
|
+
"borderTopWidth": {},
|
|
7225
|
+
"borderRightWidth": {},
|
|
7226
|
+
"borderBottomWidth": {},
|
|
7227
|
+
"borderLeftWidth": {},
|
|
7228
|
+
"defaultBorderColor": {},
|
|
7229
|
+
"sides": {}
|
|
7126
7230
|
}
|
|
7127
7231
|
}
|
|
7128
7232
|
}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
`studio buildQjson` is **static** — it compiles and structurally validates, but never *runs* the page, so it can't see **runtime / console errors** (a handler that throws on init, a bad binding, a service call that blows up at render). To catch those, render the page in a real Studio editor tab and look at it.
|
|
4
4
|
|
|
5
|
-
You have a browser for this: the **Playwright MCP** server (`playwright`). You do **not** log in and you do **not** deal with any token — the CLI opens an authenticated Studio editor for you, and that tab
|
|
5
|
+
You have a browser for this: the **Playwright MCP** server (`playwright`). You do **not** log in and you do **not** deal with any token — the CLI opens an authenticated Studio editor for you, and that tab shows the same state as the user's own Studio session.
|
|
6
6
|
|
|
7
7
|
## Push first — the editor renders the *cloud* model
|
|
8
8
|
|
|
9
|
-
The test tab shows the real Studio app editor. A page you just authored locally reaches it through `studio push`: push creates brand-new models in the cloud app (writing their id back into the file's frontmatter) and
|
|
9
|
+
The test tab shows the real Studio app editor. A page you just authored locally reaches it through `studio push`: push creates brand-new models in the cloud app (writing their id back into the file's frontmatter) and puts every pushed body into the user's Studio session as unsaved work. The test tab picks up that unsaved work when it opens and after every push. So the order is **build → push → check**:
|
|
10
10
|
|
|
11
11
|
1. `studio buildQjson <file>` is clean.
|
|
12
|
-
2. `studio push` — your model now exists in the app
|
|
12
|
+
2. `studio push` — your model now exists in the app and its body is in the user's session.
|
|
13
13
|
3. Check it.
|
|
14
14
|
|
|
15
15
|
## The loop
|
|
@@ -19,12 +19,12 @@ The test tab shows the real Studio app editor. A page you just authored locally
|
|
|
19
19
|
http://127.0.0.1:<port>/render
|
|
20
20
|
```
|
|
21
21
|
`<port>` is the `port` field of `.studio/server.json` in the workspace (usually `7345`). The CLI redirects the browser into the **authenticated** Studio editor for the right org + app — you never log in and never handle credentials. The tab also connects to the CLI as a **test client** automatically. Wait for the editor to load.
|
|
22
|
-
2. **
|
|
22
|
+
2. **Open your page.** Nothing is opened for you — click the page's name in the file explorer on the left.
|
|
23
23
|
3. **Check for errors** in three places:
|
|
24
24
|
- the **rendered UI** itself — `browser_take_screenshot`; does it draw, or is it blank / broken / misaligned?
|
|
25
25
|
- the **browser console** — `browser_console_messages`; collect every `error` (and relevant `warning`),
|
|
26
26
|
- the **editor's own error panel / markers**, if it surfaces any.
|
|
27
|
-
4. **Fix & re-push:** map each error back to the offending node/handler in your `.qjson`, fix it locally, run `studio buildQjson`, then `studio push`. The test tab
|
|
27
|
+
4. **Fix & re-push:** map each error back to the offending node/handler in your `.qjson`, fix it locally, run `studio buildQjson`, then `studio push`. The test tab picks up the new body after the push; if the page you're checking still looks old, click it again in the file explorer or re-open the render URL.
|
|
28
28
|
5. **Repeat** until the UI renders correctly and the console is clean.
|
|
29
29
|
6. **Close the browser** with `browser_close`. The Playwright MCP keeps a real browser process alive between tool calls — it does not shut down on its own — so this is a required, explicit final action, not something to get to eventually. Close it whether the check passed or you are stopping early; the only time there is nothing to close is when you never opened the browser at all.
|
|
30
30
|
|
|
@@ -42,7 +42,7 @@ Ignore unrelated framework/network noise; focus on errors that name your compone
|
|
|
42
42
|
|
|
43
43
|
- If `http://127.0.0.1:<port>/render` refuses the connection, the bridge isn't running — the user needs `studio connect`. Skip the render check and rely on `buildQjson`; note that runtime wasn't verified.
|
|
44
44
|
- If it returns **503** ("no authenticated Studio session"), the user's Studio tab isn't connected — ask them to open Studio and connect the CLI, then retry.
|
|
45
|
-
- If the test tab starts failing with auth errors mid-session (token expired), `browser_navigate` to the render URL again — it re-enters with a fresh session and
|
|
45
|
+
- If the test tab starts failing with auth errors mid-session (token expired), `browser_navigate` to the render URL again — it re-enters with a fresh session and picks up the user's current state again.
|
|
46
46
|
- If the `playwright` MCP server isn't in your harness at all, skip the render check and rely on `buildQjson` + the [pre-delivery checklist](../../ui-kit/knowledge/validation.md). Nothing was opened, so there is nothing to close.
|
|
47
47
|
|
|
48
48
|
Whenever you *did* open the browser — even if the check couldn't be finished (connection refused after navigating, a 503, an expired session you gave up on) — still call `browser_close` before you finish. A launched browser left open outlives the task.
|
|
@@ -7123,6 +7123,110 @@
|
|
|
7123
7123
|
"borderLeftWidth": {},
|
|
7124
7124
|
"defaultBorderColor": {},
|
|
7125
7125
|
"sides": {}
|
|
7126
|
+
},
|
|
7127
|
+
"Doughnut": {
|
|
7128
|
+
"marginTop": {},
|
|
7129
|
+
"marginRight": {},
|
|
7130
|
+
"marginBottom": {},
|
|
7131
|
+
"marginLeft": {},
|
|
7132
|
+
"paddingTop": {},
|
|
7133
|
+
"paddingRight": {},
|
|
7134
|
+
"paddingBottom": {},
|
|
7135
|
+
"paddingLeft": {},
|
|
7136
|
+
"boxShadow": {},
|
|
7137
|
+
"boxSizing": {},
|
|
7138
|
+
"borderTopStyle": {},
|
|
7139
|
+
"borderRightStyle": {},
|
|
7140
|
+
"borderBottomStyle": {},
|
|
7141
|
+
"borderLeftStyle": {},
|
|
7142
|
+
"borderTopLeftRadius": {},
|
|
7143
|
+
"borderTopRightRadius": {},
|
|
7144
|
+
"borderBottomLeftRadius": {},
|
|
7145
|
+
"borderBottomRightRadius": {},
|
|
7146
|
+
"borderTopWidth": {},
|
|
7147
|
+
"borderRightWidth": {},
|
|
7148
|
+
"borderBottomWidth": {},
|
|
7149
|
+
"borderLeftWidth": {},
|
|
7150
|
+
"defaultBorderColor": {},
|
|
7151
|
+
"sides": {}
|
|
7152
|
+
},
|
|
7153
|
+
"Bar": {
|
|
7154
|
+
"marginTop": {},
|
|
7155
|
+
"marginRight": {},
|
|
7156
|
+
"marginBottom": {},
|
|
7157
|
+
"marginLeft": {},
|
|
7158
|
+
"paddingTop": {},
|
|
7159
|
+
"paddingRight": {},
|
|
7160
|
+
"paddingBottom": {},
|
|
7161
|
+
"paddingLeft": {},
|
|
7162
|
+
"boxShadow": {},
|
|
7163
|
+
"boxSizing": {},
|
|
7164
|
+
"borderTopStyle": {},
|
|
7165
|
+
"borderRightStyle": {},
|
|
7166
|
+
"borderBottomStyle": {},
|
|
7167
|
+
"borderLeftStyle": {},
|
|
7168
|
+
"borderTopLeftRadius": {},
|
|
7169
|
+
"borderTopRightRadius": {},
|
|
7170
|
+
"borderBottomLeftRadius": {},
|
|
7171
|
+
"borderBottomRightRadius": {},
|
|
7172
|
+
"borderTopWidth": {},
|
|
7173
|
+
"borderRightWidth": {},
|
|
7174
|
+
"borderBottomWidth": {},
|
|
7175
|
+
"borderLeftWidth": {},
|
|
7176
|
+
"defaultBorderColor": {},
|
|
7177
|
+
"sides": {}
|
|
7178
|
+
},
|
|
7179
|
+
"Line": {
|
|
7180
|
+
"marginTop": {},
|
|
7181
|
+
"marginRight": {},
|
|
7182
|
+
"marginBottom": {},
|
|
7183
|
+
"marginLeft": {},
|
|
7184
|
+
"paddingTop": {},
|
|
7185
|
+
"paddingRight": {},
|
|
7186
|
+
"paddingBottom": {},
|
|
7187
|
+
"paddingLeft": {},
|
|
7188
|
+
"boxShadow": {},
|
|
7189
|
+
"boxSizing": {},
|
|
7190
|
+
"borderTopStyle": {},
|
|
7191
|
+
"borderRightStyle": {},
|
|
7192
|
+
"borderBottomStyle": {},
|
|
7193
|
+
"borderLeftStyle": {},
|
|
7194
|
+
"borderTopLeftRadius": {},
|
|
7195
|
+
"borderTopRightRadius": {},
|
|
7196
|
+
"borderBottomLeftRadius": {},
|
|
7197
|
+
"borderBottomRightRadius": {},
|
|
7198
|
+
"borderTopWidth": {},
|
|
7199
|
+
"borderRightWidth": {},
|
|
7200
|
+
"borderBottomWidth": {},
|
|
7201
|
+
"borderLeftWidth": {},
|
|
7202
|
+
"defaultBorderColor": {},
|
|
7203
|
+
"sides": {}
|
|
7204
|
+
},
|
|
7205
|
+
"VSparkline": {
|
|
7206
|
+
"marginTop": {},
|
|
7207
|
+
"marginRight": {},
|
|
7208
|
+
"marginBottom": {},
|
|
7209
|
+
"marginLeft": {},
|
|
7210
|
+
"paddingTop": {},
|
|
7211
|
+
"paddingRight": {},
|
|
7212
|
+
"paddingBottom": {},
|
|
7213
|
+
"paddingLeft": {},
|
|
7214
|
+
"boxShadow": {},
|
|
7215
|
+
"boxSizing": {},
|
|
7216
|
+
"borderTopStyle": {},
|
|
7217
|
+
"borderRightStyle": {},
|
|
7218
|
+
"borderBottomStyle": {},
|
|
7219
|
+
"borderLeftStyle": {},
|
|
7220
|
+
"borderTopLeftRadius": {},
|
|
7221
|
+
"borderTopRightRadius": {},
|
|
7222
|
+
"borderBottomLeftRadius": {},
|
|
7223
|
+
"borderBottomRightRadius": {},
|
|
7224
|
+
"borderTopWidth": {},
|
|
7225
|
+
"borderRightWidth": {},
|
|
7226
|
+
"borderBottomWidth": {},
|
|
7227
|
+
"borderLeftWidth": {},
|
|
7228
|
+
"defaultBorderColor": {},
|
|
7229
|
+
"sides": {}
|
|
7126
7230
|
}
|
|
7127
7231
|
}
|
|
7128
7232
|
}
|