musubix2 0.5.50 → 0.5.52
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/.claude/.musubix-managed +1 -1
- package/dist/assets/skills-manifest.json +1 -1
- package/dist/cli.js +66 -7
- package/dist/index.js +66 -7
- package/package.json +1 -1
package/.claude/.musubix-managed
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"generator":"musubix2","version":"0.5.
|
|
1
|
+
{"generator":"musubix2","version":"0.5.52","timestamp":"2026-07-10T07:20:28.524Z"}
|
package/dist/cli.js
CHANGED
|
@@ -2559,6 +2559,9 @@ function operationParts(text, fallbackTitle) {
|
|
|
2559
2559
|
const negated = Boolean(shall?.[1]);
|
|
2560
2560
|
const phrase = (shall?.[2] ?? fallbackTitle ?? "").trim();
|
|
2561
2561
|
const words = phrase.split(/[\s,、]+/).map((w) => w.replace(/[^A-Za-z0-9]/g, "")).filter((w) => w.length > 0 && !OPERATION_STOPWORDS.has(w.toLowerCase())).slice(0, 4);
|
|
2562
|
+
while (words.length > 1 && (TRAILING_FILLER.has(words[words.length - 1].toLowerCase()) || /^\d+$/.test(words[words.length - 1]))) {
|
|
2563
|
+
words.pop();
|
|
2564
|
+
}
|
|
2562
2565
|
return { negated, words };
|
|
2563
2566
|
}
|
|
2564
2567
|
function camelJoin(parts) {
|
|
@@ -2599,7 +2602,7 @@ function createDesignGenerator() {
|
|
|
2599
2602
|
function createSOLIDValidator() {
|
|
2600
2603
|
return new SOLIDValidator();
|
|
2601
2604
|
}
|
|
2602
|
-
var OPERATION_STOPWORDS, BOOLEAN_VERBS, VALUE_VERBS, LIST_VERBS, DesignGenerator, SOLIDValidator;
|
|
2605
|
+
var OPERATION_STOPWORDS, BOOLEAN_VERBS, VALUE_VERBS, LIST_VERBS, TRAILING_FILLER, DesignGenerator, SOLIDValidator;
|
|
2603
2606
|
var init_design = __esm({
|
|
2604
2607
|
"../core/dist/design/index.js"() {
|
|
2605
2608
|
"use strict";
|
|
@@ -2669,6 +2672,42 @@ var init_design = __esm({
|
|
|
2669
2672
|
"render"
|
|
2670
2673
|
]);
|
|
2671
2674
|
LIST_VERBS = /* @__PURE__ */ new Set(["list", "query", "search", "collect", "enumerate"]);
|
|
2675
|
+
TRAILING_FILLER = /* @__PURE__ */ new Set([
|
|
2676
|
+
"every",
|
|
2677
|
+
"by",
|
|
2678
|
+
"before",
|
|
2679
|
+
"after",
|
|
2680
|
+
"with",
|
|
2681
|
+
"within",
|
|
2682
|
+
"of",
|
|
2683
|
+
"to",
|
|
2684
|
+
"in",
|
|
2685
|
+
"on",
|
|
2686
|
+
"for",
|
|
2687
|
+
"from",
|
|
2688
|
+
"into",
|
|
2689
|
+
"than",
|
|
2690
|
+
"as",
|
|
2691
|
+
"at",
|
|
2692
|
+
"per",
|
|
2693
|
+
"via",
|
|
2694
|
+
"using",
|
|
2695
|
+
"about",
|
|
2696
|
+
"over",
|
|
2697
|
+
"under",
|
|
2698
|
+
"during",
|
|
2699
|
+
"upon",
|
|
2700
|
+
"one",
|
|
2701
|
+
"two",
|
|
2702
|
+
"three",
|
|
2703
|
+
"four",
|
|
2704
|
+
"five",
|
|
2705
|
+
"six",
|
|
2706
|
+
"seven",
|
|
2707
|
+
"eight",
|
|
2708
|
+
"nine",
|
|
2709
|
+
"ten"
|
|
2710
|
+
]);
|
|
2672
2711
|
DesignGenerator = class {
|
|
2673
2712
|
counter = 0;
|
|
2674
2713
|
generate(requirements) {
|
|
@@ -2676,7 +2715,7 @@ var init_design = __esm({
|
|
|
2676
2715
|
const docId = `DES-DOC-${String(this.counter).padStart(3, "0")}`;
|
|
2677
2716
|
const groups = this.groupRequirements(requirements);
|
|
2678
2717
|
const sections = groups.map((group, idx) => {
|
|
2679
|
-
const components = this.deriveComponents(group.requirements);
|
|
2718
|
+
const components = this.deriveComponents(group.requirements, group.domain);
|
|
2680
2719
|
return {
|
|
2681
2720
|
id: `${docId}-SEC-${String(idx + 1).padStart(3, "0")}`,
|
|
2682
2721
|
title: group.title,
|
|
@@ -2739,6 +2778,7 @@ var init_design = __esm({
|
|
|
2739
2778
|
}
|
|
2740
2779
|
return Array.from(groups.entries()).map(([prefix, requirements]) => ({
|
|
2741
2780
|
title: `${prefix} Design Section`,
|
|
2781
|
+
domain: prefix.replace(/^REQ-/, ""),
|
|
2742
2782
|
requirements
|
|
2743
2783
|
}));
|
|
2744
2784
|
}
|
|
@@ -2764,17 +2804,32 @@ var init_design = __esm({
|
|
|
2764
2804
|
return `${r.id}: ${op}${r.title ? ` \u2014 ${r.title}` : ""}`;
|
|
2765
2805
|
});
|
|
2766
2806
|
}
|
|
2767
|
-
deriveComponents(reqs) {
|
|
2768
|
-
|
|
2807
|
+
deriveComponents(reqs, domain) {
|
|
2808
|
+
if (reqs.length === 1) {
|
|
2809
|
+
const r = reqs[0];
|
|
2769
2810
|
const sig = deriveMethodSignature(r.text, r.title);
|
|
2770
2811
|
const compName = this.pascal(r.title || sig.name) + (/(service|manager|controller|repository)$/i.test(r.title) ? "" : "Service");
|
|
2771
|
-
return {
|
|
2812
|
+
return [{
|
|
2772
2813
|
name: compName,
|
|
2773
2814
|
responsibility: r.title || `Handle ${r.id}`,
|
|
2774
2815
|
methods: [sig],
|
|
2775
2816
|
requirementIds: [r.id]
|
|
2776
|
-
};
|
|
2817
|
+
}];
|
|
2818
|
+
}
|
|
2819
|
+
const seen = /* @__PURE__ */ new Map();
|
|
2820
|
+
const methods = reqs.map((r) => {
|
|
2821
|
+
const sig = deriveMethodSignature(r.text, r.title);
|
|
2822
|
+
const count = seen.get(sig.name) ?? 0;
|
|
2823
|
+
seen.set(sig.name, count + 1);
|
|
2824
|
+
return count === 0 ? sig : { ...sig, name: `${sig.name}${count + 1}` };
|
|
2777
2825
|
});
|
|
2826
|
+
return [{
|
|
2827
|
+
// Normalise an all-caps domain code (PAY, LEDGER) to Title case.
|
|
2828
|
+
name: `${this.pascal(domain.toLowerCase())}Service`,
|
|
2829
|
+
responsibility: `${domain} domain \u2014 ${reqs.length} operations`,
|
|
2830
|
+
methods,
|
|
2831
|
+
requirementIds: reqs.map((r) => r.id)
|
|
2832
|
+
}];
|
|
2778
2833
|
}
|
|
2779
2834
|
deriveDataEntities(reqs) {
|
|
2780
2835
|
const entities = /* @__PURE__ */ new Set();
|
|
@@ -12423,7 +12478,11 @@ var init_dist14 = __esm({
|
|
|
12423
12478
|
break;
|
|
12424
12479
|
}
|
|
12425
12480
|
case "unwanted":
|
|
12426
|
-
|
|
12481
|
+
if (requirement.condition) {
|
|
12482
|
+
assertions = [`(assert (=> ${sanitizeName(requirement.condition)} ${actionVar}))`];
|
|
12483
|
+
} else {
|
|
12484
|
+
assertions = [`(assert (not ${actionVar}))`];
|
|
12485
|
+
}
|
|
12427
12486
|
break;
|
|
12428
12487
|
case "optional": {
|
|
12429
12488
|
const featureVar = requirement.trigger ? sanitizeName(requirement.trigger) : "feature_enabled";
|
package/dist/index.js
CHANGED
|
@@ -2559,6 +2559,9 @@ function operationParts(text, fallbackTitle) {
|
|
|
2559
2559
|
const negated = Boolean(shall?.[1]);
|
|
2560
2560
|
const phrase = (shall?.[2] ?? fallbackTitle ?? "").trim();
|
|
2561
2561
|
const words = phrase.split(/[\s,、]+/).map((w) => w.replace(/[^A-Za-z0-9]/g, "")).filter((w) => w.length > 0 && !OPERATION_STOPWORDS.has(w.toLowerCase())).slice(0, 4);
|
|
2562
|
+
while (words.length > 1 && (TRAILING_FILLER.has(words[words.length - 1].toLowerCase()) || /^\d+$/.test(words[words.length - 1]))) {
|
|
2563
|
+
words.pop();
|
|
2564
|
+
}
|
|
2562
2565
|
return { negated, words };
|
|
2563
2566
|
}
|
|
2564
2567
|
function camelJoin(parts) {
|
|
@@ -2599,7 +2602,7 @@ function createDesignGenerator() {
|
|
|
2599
2602
|
function createSOLIDValidator() {
|
|
2600
2603
|
return new SOLIDValidator();
|
|
2601
2604
|
}
|
|
2602
|
-
var OPERATION_STOPWORDS, BOOLEAN_VERBS, VALUE_VERBS, LIST_VERBS, DesignGenerator, SOLIDValidator;
|
|
2605
|
+
var OPERATION_STOPWORDS, BOOLEAN_VERBS, VALUE_VERBS, LIST_VERBS, TRAILING_FILLER, DesignGenerator, SOLIDValidator;
|
|
2603
2606
|
var init_design = __esm({
|
|
2604
2607
|
"../core/dist/design/index.js"() {
|
|
2605
2608
|
"use strict";
|
|
@@ -2669,6 +2672,42 @@ var init_design = __esm({
|
|
|
2669
2672
|
"render"
|
|
2670
2673
|
]);
|
|
2671
2674
|
LIST_VERBS = /* @__PURE__ */ new Set(["list", "query", "search", "collect", "enumerate"]);
|
|
2675
|
+
TRAILING_FILLER = /* @__PURE__ */ new Set([
|
|
2676
|
+
"every",
|
|
2677
|
+
"by",
|
|
2678
|
+
"before",
|
|
2679
|
+
"after",
|
|
2680
|
+
"with",
|
|
2681
|
+
"within",
|
|
2682
|
+
"of",
|
|
2683
|
+
"to",
|
|
2684
|
+
"in",
|
|
2685
|
+
"on",
|
|
2686
|
+
"for",
|
|
2687
|
+
"from",
|
|
2688
|
+
"into",
|
|
2689
|
+
"than",
|
|
2690
|
+
"as",
|
|
2691
|
+
"at",
|
|
2692
|
+
"per",
|
|
2693
|
+
"via",
|
|
2694
|
+
"using",
|
|
2695
|
+
"about",
|
|
2696
|
+
"over",
|
|
2697
|
+
"under",
|
|
2698
|
+
"during",
|
|
2699
|
+
"upon",
|
|
2700
|
+
"one",
|
|
2701
|
+
"two",
|
|
2702
|
+
"three",
|
|
2703
|
+
"four",
|
|
2704
|
+
"five",
|
|
2705
|
+
"six",
|
|
2706
|
+
"seven",
|
|
2707
|
+
"eight",
|
|
2708
|
+
"nine",
|
|
2709
|
+
"ten"
|
|
2710
|
+
]);
|
|
2672
2711
|
DesignGenerator = class {
|
|
2673
2712
|
counter = 0;
|
|
2674
2713
|
generate(requirements) {
|
|
@@ -2676,7 +2715,7 @@ var init_design = __esm({
|
|
|
2676
2715
|
const docId = `DES-DOC-${String(this.counter).padStart(3, "0")}`;
|
|
2677
2716
|
const groups = this.groupRequirements(requirements);
|
|
2678
2717
|
const sections = groups.map((group, idx) => {
|
|
2679
|
-
const components = this.deriveComponents(group.requirements);
|
|
2718
|
+
const components = this.deriveComponents(group.requirements, group.domain);
|
|
2680
2719
|
return {
|
|
2681
2720
|
id: `${docId}-SEC-${String(idx + 1).padStart(3, "0")}`,
|
|
2682
2721
|
title: group.title,
|
|
@@ -2739,6 +2778,7 @@ var init_design = __esm({
|
|
|
2739
2778
|
}
|
|
2740
2779
|
return Array.from(groups.entries()).map(([prefix, requirements]) => ({
|
|
2741
2780
|
title: `${prefix} Design Section`,
|
|
2781
|
+
domain: prefix.replace(/^REQ-/, ""),
|
|
2742
2782
|
requirements
|
|
2743
2783
|
}));
|
|
2744
2784
|
}
|
|
@@ -2764,17 +2804,32 @@ var init_design = __esm({
|
|
|
2764
2804
|
return `${r.id}: ${op}${r.title ? ` \u2014 ${r.title}` : ""}`;
|
|
2765
2805
|
});
|
|
2766
2806
|
}
|
|
2767
|
-
deriveComponents(reqs) {
|
|
2768
|
-
|
|
2807
|
+
deriveComponents(reqs, domain) {
|
|
2808
|
+
if (reqs.length === 1) {
|
|
2809
|
+
const r = reqs[0];
|
|
2769
2810
|
const sig = deriveMethodSignature(r.text, r.title);
|
|
2770
2811
|
const compName = this.pascal(r.title || sig.name) + (/(service|manager|controller|repository)$/i.test(r.title) ? "" : "Service");
|
|
2771
|
-
return {
|
|
2812
|
+
return [{
|
|
2772
2813
|
name: compName,
|
|
2773
2814
|
responsibility: r.title || `Handle ${r.id}`,
|
|
2774
2815
|
methods: [sig],
|
|
2775
2816
|
requirementIds: [r.id]
|
|
2776
|
-
};
|
|
2817
|
+
}];
|
|
2818
|
+
}
|
|
2819
|
+
const seen = /* @__PURE__ */ new Map();
|
|
2820
|
+
const methods = reqs.map((r) => {
|
|
2821
|
+
const sig = deriveMethodSignature(r.text, r.title);
|
|
2822
|
+
const count = seen.get(sig.name) ?? 0;
|
|
2823
|
+
seen.set(sig.name, count + 1);
|
|
2824
|
+
return count === 0 ? sig : { ...sig, name: `${sig.name}${count + 1}` };
|
|
2777
2825
|
});
|
|
2826
|
+
return [{
|
|
2827
|
+
// Normalise an all-caps domain code (PAY, LEDGER) to Title case.
|
|
2828
|
+
name: `${this.pascal(domain.toLowerCase())}Service`,
|
|
2829
|
+
responsibility: `${domain} domain \u2014 ${reqs.length} operations`,
|
|
2830
|
+
methods,
|
|
2831
|
+
requirementIds: reqs.map((r) => r.id)
|
|
2832
|
+
}];
|
|
2778
2833
|
}
|
|
2779
2834
|
deriveDataEntities(reqs) {
|
|
2780
2835
|
const entities = /* @__PURE__ */ new Set();
|
|
@@ -12423,7 +12478,11 @@ var init_dist14 = __esm({
|
|
|
12423
12478
|
break;
|
|
12424
12479
|
}
|
|
12425
12480
|
case "unwanted":
|
|
12426
|
-
|
|
12481
|
+
if (requirement.condition) {
|
|
12482
|
+
assertions = [`(assert (=> ${sanitizeName(requirement.condition)} ${actionVar}))`];
|
|
12483
|
+
} else {
|
|
12484
|
+
assertions = [`(assert (not ${actionVar}))`];
|
|
12485
|
+
}
|
|
12427
12486
|
break;
|
|
12428
12487
|
case "optional": {
|
|
12429
12488
|
const featureVar = requirement.trigger ? sanitizeName(requirement.trigger) : "feature_enabled";
|