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.
@@ -1 +1 @@
1
- {"generator":"musubix2","version":"0.5.50","timestamp":"2026-07-10T06:43:13.120Z"}
1
+ {"generator":"musubix2","version":"0.5.52","timestamp":"2026-07-10T07:20:28.524Z"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "1.0",
3
- "generatedAt": "2026-07-10T06:43:13.156Z",
3
+ "generatedAt": "2026-07-10T07:20:28.553Z",
4
4
  "entries": [
5
5
  {
6
6
  "platform": "copilot",
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
- return reqs.map((r) => {
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
- assertions = [`(assert (not ${actionVar}))`];
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
- return reqs.map((r) => {
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
- assertions = [`(assert (not ${actionVar}))`];
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musubix2",
3
- "version": "0.5.50",
3
+ "version": "0.5.52",
4
4
  "description": "MUSUBIX2 — Specification Driven Development System",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",