@lahat-group/cli 1.1.1 → 1.1.3
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/index.js +166 -7
- package/package.json +14 -5
package/dist/index.js
CHANGED
|
@@ -7488,6 +7488,35 @@ function getColumnDepthCm(config, column) {
|
|
|
7488
7488
|
init_esm_shims();
|
|
7489
7489
|
var COMMISSION_STATES = ["potential", "pending_payment", "paid", "cancelled"];
|
|
7490
7490
|
|
|
7491
|
+
// ../../packages/shared/src/phone.ts
|
|
7492
|
+
init_esm_shims();
|
|
7493
|
+
var SEPARATORS = /[\s\-().]/g;
|
|
7494
|
+
var IL_PHONE = /^(?:(?:\+?972)0?|0)(?:[23489]\d{7}|[57]\d{8})$/;
|
|
7495
|
+
function normalizePhoneInput(value) {
|
|
7496
|
+
return value.replace(SEPARATORS, "");
|
|
7497
|
+
}
|
|
7498
|
+
function isValidIsraeliPhone(value) {
|
|
7499
|
+
return IL_PHONE.test(normalizePhoneInput(value));
|
|
7500
|
+
}
|
|
7501
|
+
|
|
7502
|
+
// ../../packages/shared/src/nationalId.ts
|
|
7503
|
+
init_esm_shims();
|
|
7504
|
+
var SEPARATORS2 = /[\s\-.]/g;
|
|
7505
|
+
function normalizeNationalIdInput(value) {
|
|
7506
|
+
return value.replace(SEPARATORS2, "");
|
|
7507
|
+
}
|
|
7508
|
+
function isValidIsraeliNationalId(value) {
|
|
7509
|
+
const digits = normalizeNationalIdInput(value);
|
|
7510
|
+
if (!/^\d{1,9}$/.test(digits)) return false;
|
|
7511
|
+
const padded = digits.padStart(9, "0");
|
|
7512
|
+
let sum = 0;
|
|
7513
|
+
for (let i = 0; i < 9; i++) {
|
|
7514
|
+
const product = Number(padded[i]) * (i % 2 === 0 ? 1 : 2);
|
|
7515
|
+
sum += product > 9 ? product - 9 : product;
|
|
7516
|
+
}
|
|
7517
|
+
return sum % 10 === 0;
|
|
7518
|
+
}
|
|
7519
|
+
|
|
7491
7520
|
// ../../packages/shared/src/schemas.ts
|
|
7492
7521
|
var MaterialIdSchema = external_exports.enum(MATERIAL_IDS);
|
|
7493
7522
|
var ModuleTypeSchema = external_exports.enum([
|
|
@@ -7655,6 +7684,17 @@ var MeasurementPriceBreakdownSchema = external_exports.object({
|
|
|
7655
7684
|
total: external_exports.number(),
|
|
7656
7685
|
currency: external_exports.string()
|
|
7657
7686
|
});
|
|
7687
|
+
var DiscountSettingsSchema = external_exports.object({
|
|
7688
|
+
enabled: external_exports.boolean(),
|
|
7689
|
+
percent: external_exports.number().min(0).max(100),
|
|
7690
|
+
description: external_exports.string().max(500)
|
|
7691
|
+
});
|
|
7692
|
+
var DiscountBreakdownSchema = DiscountSettingsSchema.extend({
|
|
7693
|
+
subtotal: external_exports.number(),
|
|
7694
|
+
amount: external_exports.number(),
|
|
7695
|
+
total: external_exports.number(),
|
|
7696
|
+
currency: external_exports.literal("NIS")
|
|
7697
|
+
});
|
|
7658
7698
|
var PriceResultSchema = external_exports.object({
|
|
7659
7699
|
total: external_exports.number(),
|
|
7660
7700
|
currency: external_exports.string(),
|
|
@@ -7668,7 +7708,8 @@ var PriceResultSchema = external_exports.object({
|
|
|
7668
7708
|
})).optional(),
|
|
7669
7709
|
assemblyPrice: AssemblyPriceBreakdownSchema.optional(),
|
|
7670
7710
|
transportPrice: TransportPriceBreakdownSchema.optional(),
|
|
7671
|
-
measurementPrice: MeasurementPriceBreakdownSchema.optional()
|
|
7711
|
+
measurementPrice: MeasurementPriceBreakdownSchema.optional(),
|
|
7712
|
+
discount: DiscountBreakdownSchema.optional()
|
|
7672
7713
|
});
|
|
7673
7714
|
var ServicePricingConfigSchema = external_exports.object({
|
|
7674
7715
|
id: external_exports.string().nullable(),
|
|
@@ -7709,11 +7750,43 @@ var CommissionConfigPatchBodySchema = external_exports.object({
|
|
|
7709
7750
|
defaultRatePercent: external_exports.number().min(0).max(100)
|
|
7710
7751
|
}).strict()
|
|
7711
7752
|
});
|
|
7753
|
+
var ManufacturerConfigSchema = external_exports.object({
|
|
7754
|
+
email: external_exports.string().email().max(254).nullable(),
|
|
7755
|
+
version: external_exports.number().int().nonnegative()
|
|
7756
|
+
});
|
|
7757
|
+
var ManufacturerConfigPatchBodySchema = external_exports.object({
|
|
7758
|
+
version: external_exports.number().int().nonnegative(),
|
|
7759
|
+
patch: external_exports.object({
|
|
7760
|
+
email: external_exports.string().email().max(254)
|
|
7761
|
+
}).strict()
|
|
7762
|
+
});
|
|
7763
|
+
var DiscountConfigSchema = external_exports.object({
|
|
7764
|
+
id: external_exports.string().nullable(),
|
|
7765
|
+
enabled: external_exports.boolean(),
|
|
7766
|
+
percent: external_exports.number().min(0).max(100),
|
|
7767
|
+
description: external_exports.string().max(500),
|
|
7768
|
+
version: external_exports.number().int().nonnegative(),
|
|
7769
|
+
updatedAt: external_exports.string().nullable()
|
|
7770
|
+
});
|
|
7771
|
+
var DiscountConfigPatchBodySchema = external_exports.object({
|
|
7772
|
+
version: external_exports.number().int().nonnegative(),
|
|
7773
|
+
patch: external_exports.object({
|
|
7774
|
+
enabled: external_exports.boolean().optional(),
|
|
7775
|
+
percent: external_exports.number().min(0).max(100).optional(),
|
|
7776
|
+
description: external_exports.string().max(500).optional()
|
|
7777
|
+
}).strict().refine(
|
|
7778
|
+
(p) => Object.keys(p).length > 0,
|
|
7779
|
+
{ message: "patch must contain at least one field" }
|
|
7780
|
+
)
|
|
7781
|
+
});
|
|
7712
7782
|
var MBomLineItemSchema = external_exports.object({
|
|
7713
7783
|
sku: external_exports.string(),
|
|
7714
7784
|
qty: external_exports.number(),
|
|
7715
7785
|
sellPrice: external_exports.number(),
|
|
7716
|
-
|
|
7786
|
+
// Optional: `/api/mbom-debug` — the only producer this schema validates —
|
|
7787
|
+
// strips supplier cost before responding, since its consumer is the
|
|
7788
|
+
// customer-facing breakdown modal.
|
|
7789
|
+
costPrice: external_exports.number().optional(),
|
|
7717
7790
|
comment: external_exports.string(),
|
|
7718
7791
|
part: external_exports.string(),
|
|
7719
7792
|
heightMm: external_exports.number(),
|
|
@@ -7756,7 +7829,7 @@ var MBomDebugResponseSchema = external_exports.object({
|
|
|
7756
7829
|
});
|
|
7757
7830
|
var CreateCustomerSchema = external_exports.object({
|
|
7758
7831
|
customerName: external_exports.string().min(1).max(120),
|
|
7759
|
-
phoneNumber: external_exports.string().min(1).max(30),
|
|
7832
|
+
phoneNumber: external_exports.string().min(1).max(30).refine(isValidIsraeliPhone, "invalidPhone"),
|
|
7760
7833
|
email: external_exports.string().email().max(254),
|
|
7761
7834
|
address: external_exports.string().max(200).optional(),
|
|
7762
7835
|
apartment: external_exports.string().max(50).optional(),
|
|
@@ -7767,7 +7840,7 @@ var CreateCustomerSchema = external_exports.object({
|
|
|
7767
7840
|
});
|
|
7768
7841
|
var UpdateCustomerSchema = external_exports.object({
|
|
7769
7842
|
customerName: external_exports.string().min(1).max(120).optional(),
|
|
7770
|
-
phoneNumber: external_exports.string().min(1).max(30).optional(),
|
|
7843
|
+
phoneNumber: external_exports.string().min(1).max(30).refine(isValidIsraeliPhone, "invalidPhone").optional(),
|
|
7771
7844
|
email: external_exports.string().email().max(254).optional(),
|
|
7772
7845
|
// Optional fields accept `null` to explicitly CLEAR (unset) a previously-set
|
|
7773
7846
|
// value; omitting the key leaves it unchanged. Required for inline edit.
|
|
@@ -7819,7 +7892,13 @@ var ReviseOrderSchema = external_exports.object({
|
|
|
7819
7892
|
var RegisterSchema = external_exports.object({
|
|
7820
7893
|
email: external_exports.string().email().max(254),
|
|
7821
7894
|
password: external_exports.string().min(8).max(128),
|
|
7822
|
-
displayName: external_exports.string().min(1).max(50)
|
|
7895
|
+
displayName: external_exports.string().min(1).max(50),
|
|
7896
|
+
/**
|
|
7897
|
+
* Consent to the published legal documents, given on the signup form.
|
|
7898
|
+
* Required — a signup without it is rejected rather than silently recorded as
|
|
7899
|
+
* unconsented, which would leave the account stuck behind the consent gate.
|
|
7900
|
+
*/
|
|
7901
|
+
acceptedLegal: external_exports.literal(true)
|
|
7823
7902
|
});
|
|
7824
7903
|
var LoginSchema = external_exports.object({
|
|
7825
7904
|
email: external_exports.string().email().max(254),
|
|
@@ -7885,10 +7964,63 @@ var EmailTemplatePatchBodySchema = external_exports.object({
|
|
|
7885
7964
|
{ message: "patch must contain at least one field" }
|
|
7886
7965
|
)
|
|
7887
7966
|
});
|
|
7967
|
+
var CustomerEmailConfigSchema = external_exports.object({
|
|
7968
|
+
key: external_exports.string(),
|
|
7969
|
+
label: external_exports.string(),
|
|
7970
|
+
step: external_exports.number().int().nullable(),
|
|
7971
|
+
enabled: external_exports.boolean(),
|
|
7972
|
+
subject: external_exports.string(),
|
|
7973
|
+
preheader: external_exports.string(),
|
|
7974
|
+
badge: external_exports.string(),
|
|
7975
|
+
heading: external_exports.string(),
|
|
7976
|
+
paragraphs: external_exports.array(external_exports.string()),
|
|
7977
|
+
note: external_exports.string(),
|
|
7978
|
+
disclosure: external_exports.array(external_exports.string()),
|
|
7979
|
+
ctaLabel: external_exports.string(),
|
|
7980
|
+
ctaUrl: external_exports.string(),
|
|
7981
|
+
secondaryCtaLabel: external_exports.string(),
|
|
7982
|
+
secondaryCtaUrl: external_exports.string(),
|
|
7983
|
+
version: external_exports.number().int().nonnegative(),
|
|
7984
|
+
updatedAt: external_exports.string().nullable()
|
|
7985
|
+
});
|
|
7986
|
+
var EmailOutboxRowSchema = external_exports.object({
|
|
7987
|
+
_id: external_exports.string(),
|
|
7988
|
+
orderId: external_exports.string(),
|
|
7989
|
+
key: external_exports.string(),
|
|
7990
|
+
to: external_exports.string(),
|
|
7991
|
+
cc: external_exports.string(),
|
|
7992
|
+
subject: external_exports.string(),
|
|
7993
|
+
status: external_exports.enum(["sent", "failed", "skipped"]),
|
|
7994
|
+
attempts: external_exports.number().int().nonnegative(),
|
|
7995
|
+
lastError: external_exports.string().optional(),
|
|
7996
|
+
skippedReason: external_exports.string().optional(),
|
|
7997
|
+
sentAt: external_exports.string().nullable().optional(),
|
|
7998
|
+
createdAt: external_exports.string()
|
|
7999
|
+
});
|
|
8000
|
+
var CustomerEmailPatchBodySchema = external_exports.object({
|
|
8001
|
+
version: external_exports.number().int().nonnegative(),
|
|
8002
|
+
patch: external_exports.object({
|
|
8003
|
+
enabled: external_exports.boolean().optional(),
|
|
8004
|
+
subject: external_exports.string().max(300).optional(),
|
|
8005
|
+
preheader: external_exports.string().max(300).optional(),
|
|
8006
|
+
badge: external_exports.string().max(120).optional(),
|
|
8007
|
+
heading: external_exports.string().max(200).optional(),
|
|
8008
|
+
paragraphs: external_exports.array(external_exports.string().max(2e3)).max(12).optional(),
|
|
8009
|
+
note: external_exports.string().max(2e3).optional(),
|
|
8010
|
+
disclosure: external_exports.array(external_exports.string().max(2e3)).max(12).optional(),
|
|
8011
|
+
ctaLabel: external_exports.string().max(120).optional(),
|
|
8012
|
+
ctaUrl: external_exports.string().max(500).optional(),
|
|
8013
|
+
secondaryCtaLabel: external_exports.string().max(120).optional(),
|
|
8014
|
+
secondaryCtaUrl: external_exports.string().max(500).optional()
|
|
8015
|
+
}).strict().refine(
|
|
8016
|
+
(p) => Object.keys(p).length > 0,
|
|
8017
|
+
{ message: "patch must contain at least one field" }
|
|
8018
|
+
)
|
|
8019
|
+
});
|
|
7888
8020
|
var CustomerDetailsSchema = external_exports.object({
|
|
7889
8021
|
email: external_exports.string().email().max(254),
|
|
7890
8022
|
phone: external_exports.string().min(3).max(30),
|
|
7891
|
-
nationalId: external_exports.string().min(5).max(20),
|
|
8023
|
+
nationalId: external_exports.string().min(5).max(20).refine(isValidIsraeliNationalId, "invalidNationalId"),
|
|
7892
8024
|
installationAddress: external_exports.string().min(3).max(300),
|
|
7893
8025
|
businessName: external_exports.string().max(120).optional(),
|
|
7894
8026
|
contactPerson: external_exports.string().max(120).optional()
|
|
@@ -7902,6 +8034,11 @@ var OrderTransitionSchema = external_exports.object({
|
|
|
7902
8034
|
/** Admin/support override: force-set the main status to `to`, bypassing the legal transition map. */
|
|
7903
8035
|
override: external_exports.boolean().optional()
|
|
7904
8036
|
});
|
|
8037
|
+
var UpdateOrderDateSchema = external_exports.object({
|
|
8038
|
+
field: external_exports.enum(["appointmentDate", "scheduledDate"]),
|
|
8039
|
+
value: external_exports.coerce.date(),
|
|
8040
|
+
reason: external_exports.string().max(500).optional()
|
|
8041
|
+
});
|
|
7905
8042
|
|
|
7906
8043
|
// ../../packages/shared/src/pricing.ts
|
|
7907
8044
|
init_esm_shims();
|
|
@@ -7909,6 +8046,9 @@ init_esm_shims();
|
|
|
7909
8046
|
// ../../packages/shared/src/manufacturingBom/price.ts
|
|
7910
8047
|
init_esm_shims();
|
|
7911
8048
|
|
|
8049
|
+
// ../../packages/shared/src/discount.ts
|
|
8050
|
+
init_esm_shims();
|
|
8051
|
+
|
|
7912
8052
|
// ../../packages/shared/src/materials.ts
|
|
7913
8053
|
init_esm_shims();
|
|
7914
8054
|
var MATERIALS = {
|
|
@@ -9266,6 +9406,9 @@ init_esm_shims();
|
|
|
9266
9406
|
// ../../packages/shared/src/permissions.ts
|
|
9267
9407
|
init_esm_shims();
|
|
9268
9408
|
|
|
9409
|
+
// ../../packages/shared/src/legal.ts
|
|
9410
|
+
init_esm_shims();
|
|
9411
|
+
|
|
9269
9412
|
// ../../packages/shared/src/orderWorkflow.ts
|
|
9270
9413
|
init_esm_shims();
|
|
9271
9414
|
var ORDER_STATUSES = [
|
|
@@ -9339,6 +9482,22 @@ var ORDER_EMAIL_EVENTS = [
|
|
|
9339
9482
|
];
|
|
9340
9483
|
var ALL_ORDER_EMAIL_EVENTS = ORDER_EMAIL_EVENTS.map((e) => e.event);
|
|
9341
9484
|
|
|
9485
|
+
// ../../packages/shared/src/customerEmails.ts
|
|
9486
|
+
init_esm_shims();
|
|
9487
|
+
var CUSTOMER_EMAILS = [
|
|
9488
|
+
{ key: "order_confirmed", label: "\u05D0\u05D9\u05E9\u05D5\u05E8 \u05D4\u05D6\u05DE\u05E0\u05D4 \u2014 \u05DE\u05E1\u05DE\u05DA \u05D2\u05D9\u05DC\u05D5\u05D9 \u05E0\u05D0\u05D5\u05EA", step: 1, hasHero: true, hasLineItems: true },
|
|
9489
|
+
{ key: "measurement_coordination", label: "\u05EA\u05D9\u05D0\u05D5\u05DD \u05DE\u05D3\u05D9\u05D3\u05D4", step: 2, hasHero: false, hasLineItems: false },
|
|
9490
|
+
{ key: "entering_production", label: "\u05D4\u05D0\u05E8\u05D5\u05DF \u05E0\u05DB\u05E0\u05E1 \u05DC\u05D9\u05D9\u05E6\u05D5\u05E8", step: 3, hasHero: false, hasLineItems: false },
|
|
9491
|
+
{ key: "production_complete", label: "\u05E1\u05D9\u05D5\u05DD \u05D9\u05D9\u05E6\u05D5\u05E8", step: 4, hasHero: false, hasLineItems: false },
|
|
9492
|
+
{ key: "installation_scheduled", label: "\u05EA\u05D9\u05D0\u05D5\u05DD \u05D5\u05D4\u05EA\u05E7\u05E0\u05D4", step: 5, hasHero: false, hasLineItems: false },
|
|
9493
|
+
{ key: "installation_complete", label: "\u05DC\u05D0\u05D7\u05E8 \u05D4\u05EA\u05E7\u05E0\u05D4", step: 5, hasHero: true, hasLineItems: false },
|
|
9494
|
+
{ key: "appointment_changed", label: "\u05E9\u05D9\u05E0\u05D5\u05D9 \u05DE\u05D5\u05E2\u05D3", step: null, hasHero: false, hasLineItems: false },
|
|
9495
|
+
{ key: "order_revised", label: "\u05E2\u05D3\u05DB\u05D5\u05DF \u05D4\u05D6\u05DE\u05E0\u05D4", step: null, hasHero: false, hasLineItems: true }
|
|
9496
|
+
];
|
|
9497
|
+
var CUSTOMER_EMAIL_BY_KEY = Object.fromEntries(
|
|
9498
|
+
CUSTOMER_EMAILS.map((d) => [d.key, d])
|
|
9499
|
+
);
|
|
9500
|
+
|
|
9342
9501
|
// ../../packages/shared/src/manufacturingBom/index.ts
|
|
9343
9502
|
init_esm_shims();
|
|
9344
9503
|
|
|
@@ -11707,7 +11866,7 @@ async function formatCliError(err, json) {
|
|
|
11707
11866
|
|
|
11708
11867
|
// src/version.ts
|
|
11709
11868
|
init_esm_shims();
|
|
11710
|
-
var CLI_VERSION = "1.1.
|
|
11869
|
+
var CLI_VERSION = "1.1.3";
|
|
11711
11870
|
|
|
11712
11871
|
// src/index.ts
|
|
11713
11872
|
program.name("wardrobe").description("Wardrobe configurator CLI").version(CLI_VERSION);
|
package/package.json
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lahat-group/cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "CLI + Claude Skill to build, validate, price, and save wardrobe designs.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
"bin": {
|
|
8
|
+
"wardrobe": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"skill"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18"
|
|
16
|
+
},
|
|
10
17
|
"repository": {
|
|
11
18
|
"type": "git",
|
|
12
19
|
"url": "git+https://github.com/shahar-abra/wardrobe-configurator.git",
|
|
13
20
|
"directory": "tools/cli"
|
|
14
21
|
},
|
|
15
|
-
"publishConfig": {
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
16
25
|
"scripts": {
|
|
17
26
|
"build": "tsup",
|
|
18
27
|
"prepublishOnly": "npm run build",
|