musubix2 0.5.63 → 0.5.65
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.d.ts.map +1 -1
- package/dist/cli.js +90 -17
- package/dist/cli.js.map +1 -1
- package/dist/index.js +90 -17
- package/package.json +1 -1
package/.claude/.musubix-managed
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"generator":"musubix2","version":"0.5.
|
|
1
|
+
{"generator":"musubix2","version":"0.5.65","timestamp":"2026-07-10T21:25:23.611Z"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1256,7 +1256,7 @@ var init_markdown_ears_parser = __esm({
|
|
|
1256
1256
|
const acMatch = block.match(FIELD_REGEX.acceptanceCriteria);
|
|
1257
1257
|
const traceMatch = block.match(FIELD_REGEX.traceability);
|
|
1258
1258
|
const pkgMatch = block.match(FIELD_REGEX.package);
|
|
1259
|
-
const reqText = reqMatch ? reqMatch[1].trim() :
|
|
1259
|
+
const reqText = reqMatch ? reqMatch[1].trim() : this.fallbackRequirementText(block);
|
|
1260
1260
|
let pattern;
|
|
1261
1261
|
let confidence;
|
|
1262
1262
|
if (reqText) {
|
|
@@ -1281,6 +1281,31 @@ var init_markdown_ears_parser = __esm({
|
|
|
1281
1281
|
line: partial.line
|
|
1282
1282
|
};
|
|
1283
1283
|
}
|
|
1284
|
+
/**
|
|
1285
|
+
* When no `**要件**:` marker is present, treat the block's prose lines as the
|
|
1286
|
+
* requirement statement. Field markers (`**…**:`), headings, and checklist
|
|
1287
|
+
* bullets are excluded so only the EARS sentence(s) survive.
|
|
1288
|
+
*/
|
|
1289
|
+
fallbackRequirementText(block) {
|
|
1290
|
+
const prose = [];
|
|
1291
|
+
for (const raw of block.split("\n")) {
|
|
1292
|
+
const line = raw.trim();
|
|
1293
|
+
if (!line) {
|
|
1294
|
+
continue;
|
|
1295
|
+
}
|
|
1296
|
+
if (line.startsWith("**")) {
|
|
1297
|
+
continue;
|
|
1298
|
+
}
|
|
1299
|
+
if (line.startsWith("#")) {
|
|
1300
|
+
continue;
|
|
1301
|
+
}
|
|
1302
|
+
if (/^[-*]\s/.test(line)) {
|
|
1303
|
+
continue;
|
|
1304
|
+
}
|
|
1305
|
+
prose.push(line);
|
|
1306
|
+
}
|
|
1307
|
+
return prose.join(" ").trim();
|
|
1308
|
+
}
|
|
1284
1309
|
normalizePattern(raw) {
|
|
1285
1310
|
const mapping = {
|
|
1286
1311
|
UBIQUITOUS: "ubiquitous",
|
|
@@ -2578,11 +2603,32 @@ function deriveOperation(text, fallbackTitle = "") {
|
|
|
2578
2603
|
}
|
|
2579
2604
|
return camelJoin(parts);
|
|
2580
2605
|
}
|
|
2606
|
+
function deriveParams(text) {
|
|
2607
|
+
const m = new RegExp(INPUT_VERBS.source + "\\s+([^.\u3002\\n]+?)(?:,|\\bTHE\\b|\\bSHALL\\b|$)", "i").exec(text);
|
|
2608
|
+
if (!m) {
|
|
2609
|
+
return "";
|
|
2610
|
+
}
|
|
2611
|
+
const names = [];
|
|
2612
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2613
|
+
for (const chunk of m[1].split(/\s*(?:,|、|\band\b|\bor\b)\s*/i)) {
|
|
2614
|
+
const words = chunk.split(/\s+/).map((w) => w.replace(/[^A-Za-z0-9]/g, "")).filter((w) => w.length > 0 && !PARAM_STOPWORDS.has(w.toLowerCase()));
|
|
2615
|
+
if (words.length === 0) {
|
|
2616
|
+
continue;
|
|
2617
|
+
}
|
|
2618
|
+
const name = camelJoin(words.slice(-2));
|
|
2619
|
+
if (name && !seen.has(name)) {
|
|
2620
|
+
seen.add(name);
|
|
2621
|
+
names.push(name);
|
|
2622
|
+
}
|
|
2623
|
+
}
|
|
2624
|
+
return names.slice(0, 3).map((n) => `${n}: string`).join(", ");
|
|
2625
|
+
}
|
|
2581
2626
|
function deriveMethodSignature(text, fallbackTitle = "") {
|
|
2582
2627
|
const { negated, words } = operationParts(text, fallbackTitle);
|
|
2583
2628
|
const name = deriveOperation(text, fallbackTitle);
|
|
2629
|
+
const params = deriveParams(text);
|
|
2584
2630
|
if (words.length === 0) {
|
|
2585
|
-
return { name, params
|
|
2631
|
+
return { name, params, returnType: "void" };
|
|
2586
2632
|
}
|
|
2587
2633
|
const verb = words[0].toLowerCase();
|
|
2588
2634
|
const objectWords = words.slice(1);
|
|
@@ -2594,7 +2640,7 @@ function deriveMethodSignature(text, fallbackTitle = "") {
|
|
|
2594
2640
|
} else if (VALUE_VERBS.has(verb) && objectWords.length > 0) {
|
|
2595
2641
|
returnType = pascalJoin(objectWords);
|
|
2596
2642
|
}
|
|
2597
|
-
return { name, params
|
|
2643
|
+
return { name, params, returnType };
|
|
2598
2644
|
}
|
|
2599
2645
|
function createDesignGenerator() {
|
|
2600
2646
|
return new DesignGenerator();
|
|
@@ -2602,7 +2648,7 @@ function createDesignGenerator() {
|
|
|
2602
2648
|
function createSOLIDValidator() {
|
|
2603
2649
|
return new SOLIDValidator();
|
|
2604
2650
|
}
|
|
2605
|
-
var OPERATION_STOPWORDS, BOOLEAN_VERBS, VALUE_VERBS, LIST_VERBS, TRAILING_FILLER, DesignGenerator, SOLIDValidator;
|
|
2651
|
+
var OPERATION_STOPWORDS, BOOLEAN_VERBS, VALUE_VERBS, LIST_VERBS, TRAILING_FILLER, INPUT_VERBS, PARAM_STOPWORDS, DesignGenerator, SOLIDValidator;
|
|
2606
2652
|
var init_design = __esm({
|
|
2607
2653
|
"../core/dist/design/index.js"() {
|
|
2608
2654
|
"use strict";
|
|
@@ -2708,6 +2754,8 @@ var init_design = __esm({
|
|
|
2708
2754
|
"nine",
|
|
2709
2755
|
"ten"
|
|
2710
2756
|
]);
|
|
2757
|
+
INPUT_VERBS = /\b(?:submits?|provides?|sends?|enters?|supplies|accepts?|receives?|uploads?|passes?)\b/i;
|
|
2758
|
+
PARAM_STOPWORDS = /* @__PURE__ */ new Set(["a", "an", "the", "valid", "new", "their", "its", "his", "her", "each", "any"]);
|
|
2711
2759
|
DesignGenerator = class {
|
|
2712
2760
|
counter = 0;
|
|
2713
2761
|
generate(requirements) {
|
|
@@ -3129,32 +3177,36 @@ var init_c4_generator = __esm({
|
|
|
3129
3177
|
}
|
|
3130
3178
|
generateDiagram(level, title) {
|
|
3131
3179
|
const levelFilter = this.getLevelFilter(level);
|
|
3180
|
+
const kept = new Set(this.elements.filter((e) => levelFilter.includes(e.type)).map((e) => e.id));
|
|
3132
3181
|
return {
|
|
3133
3182
|
level,
|
|
3134
3183
|
title,
|
|
3135
3184
|
elements: this.elements.filter((e) => levelFilter.includes(e.type)),
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
return fromEl !== void 0 && levelFilter.includes(fromEl.type) || toEl !== void 0 && levelFilter.includes(toEl.type);
|
|
3140
|
-
})
|
|
3185
|
+
// Keep a relationship only when *both* endpoints are elements shown at this
|
|
3186
|
+
// level; otherwise the diagram would reference an undeclared element.
|
|
3187
|
+
relationships: this.relationships.filter((r) => kept.has(r.from) && kept.has(r.to))
|
|
3141
3188
|
};
|
|
3142
3189
|
}
|
|
3190
|
+
/** Mermaid C4 aliases must be identifiers; ids like `REQ-ORD-001` need escaping. */
|
|
3191
|
+
mermaidAlias(id) {
|
|
3192
|
+
return id.replace(/[^A-Za-z0-9_]/g, "_");
|
|
3193
|
+
}
|
|
3143
3194
|
toMermaid(diagram) {
|
|
3195
|
+
const header = diagram.level === "container" ? "C4Container" : diagram.level === "component" || diagram.level === "code" ? "C4Component" : "C4Context";
|
|
3144
3196
|
const lines = [];
|
|
3145
|
-
lines.push(
|
|
3197
|
+
lines.push(header);
|
|
3146
3198
|
lines.push(` title ${diagram.title}`);
|
|
3147
3199
|
lines.push("");
|
|
3148
3200
|
for (const el of diagram.elements) {
|
|
3149
3201
|
const mermaidType = this.toMermaidType(el.type);
|
|
3150
3202
|
const tech = el.technology ? `, "${el.technology}"` : "";
|
|
3151
|
-
lines.push(` ${mermaidType}(${el.id}, "${el.name}", "${el.description}"${tech})`);
|
|
3203
|
+
lines.push(` ${mermaidType}(${this.mermaidAlias(el.id)}, "${el.name}", "${el.description}"${tech})`);
|
|
3152
3204
|
}
|
|
3153
3205
|
if (diagram.relationships.length > 0) {
|
|
3154
3206
|
lines.push("");
|
|
3155
3207
|
for (const rel of diagram.relationships) {
|
|
3156
3208
|
const tech = rel.technology ? `, "${rel.technology}"` : "";
|
|
3157
|
-
lines.push(` Rel(${rel.from}, ${rel.to}, "${rel.description}"${tech})`);
|
|
3209
|
+
lines.push(` Rel(${this.mermaidAlias(rel.from)}, ${this.mermaidAlias(rel.to)}, "${rel.description}"${tech})`);
|
|
3158
3210
|
}
|
|
3159
3211
|
}
|
|
3160
3212
|
return lines.join("\n");
|
|
@@ -17677,6 +17729,9 @@ var WALK_IGNORE = /* @__PURE__ */ new Set(["node_modules", ".git", "dist", "cove
|
|
|
17677
17729
|
function collectFiles(target, extFilter) {
|
|
17678
17730
|
const stat = statSync(target);
|
|
17679
17731
|
if (stat.isFile()) {
|
|
17732
|
+
if (extFilter && !extFilter(target.split(".").pop() ?? "")) {
|
|
17733
|
+
return [];
|
|
17734
|
+
}
|
|
17680
17735
|
return [target];
|
|
17681
17736
|
}
|
|
17682
17737
|
const out = [];
|
|
@@ -19012,11 +19067,20 @@ async function handleSecurity(filePath, failOn, excludeTests) {
|
|
|
19012
19067
|
const allFiles = collectFiles(filePath, (ext) => ext in EXT_TO_LANG).filter((f) => !isVendorOrMinified(f));
|
|
19013
19068
|
const files = excludeTests ? allFiles.filter((f) => !isTestFile(f)) : allFiles;
|
|
19014
19069
|
const skipped = allFiles.length - files.length;
|
|
19015
|
-
const
|
|
19070
|
+
const rawFindings = [];
|
|
19016
19071
|
for (const file of files) {
|
|
19017
19072
|
const code = readFileSync6(file, "utf-8");
|
|
19018
|
-
|
|
19073
|
+
rawFindings.push(...secrets.scan(code, file), ...taint.analyze(code, file), ...dataflow.analyze(code, file), ...deps.scan(code, file));
|
|
19019
19074
|
}
|
|
19075
|
+
const dedup = /* @__PURE__ */ new Map();
|
|
19076
|
+
for (const f of rawFindings) {
|
|
19077
|
+
const key = `${f.location.file}:${f.location.line ?? 0}:${f.type}`;
|
|
19078
|
+
const prev = dedup.get(key);
|
|
19079
|
+
if (!prev || f.confidence > prev.confidence) {
|
|
19080
|
+
dedup.set(key, f);
|
|
19081
|
+
}
|
|
19082
|
+
}
|
|
19083
|
+
const findings = [...dedup.values()];
|
|
19020
19084
|
const bySeverity = /* @__PURE__ */ new Map();
|
|
19021
19085
|
for (const f of findings) {
|
|
19022
19086
|
const list = bySeverity.get(f.severity) ?? [];
|
|
@@ -19155,11 +19219,11 @@ async function handleReqValidate(filePath) {
|
|
|
19155
19219
|
if (/REQ-/i.test(content)) {
|
|
19156
19220
|
const headingLike = /^#{1,4}\s+REQ-[A-Z]{2,6}-\d{3}:/m.test(content);
|
|
19157
19221
|
console.error('\u26A0 Found "REQ-" text but no parseable requirements. Requirements must be Markdown headings shaped like:');
|
|
19158
|
-
console.error(" ## REQ-XXX-000: <title> (XXX =
|
|
19222
|
+
console.error(" ## REQ-XXX-000: <title> (XXX = 2\u20136 letter domain code)");
|
|
19159
19223
|
console.error(" **\u8981\u4EF6**:");
|
|
19160
19224
|
console.error(" THE \u30B7\u30B9\u30C6\u30E0 SHALL ...");
|
|
19161
19225
|
if (!headingLike) {
|
|
19162
|
-
console.error('\u2139 Hint: list items (e.g. "- REQ-001: ...") and IDs without a
|
|
19226
|
+
console.error('\u2139 Hint: list items (e.g. "- REQ-001: ...") and IDs without a 2\u20136 letter domain code are not recognized.');
|
|
19163
19227
|
}
|
|
19164
19228
|
return ExitCode.VALIDATION_ERROR;
|
|
19165
19229
|
}
|
|
@@ -19402,6 +19466,13 @@ async function handleDesignC4(filePath, level = "context") {
|
|
|
19402
19466
|
async function handleDesignVerify(filePath) {
|
|
19403
19467
|
try {
|
|
19404
19468
|
const content = readFileSync6(filePath, "utf-8");
|
|
19469
|
+
if (!/^\s*[[{]/.test(content)) {
|
|
19470
|
+
console.error(`\u274C ${filePath} is not a design JSON artifact.
|
|
19471
|
+
design:verify reads the JSON produced by:
|
|
19472
|
+
musubix design generate ${filePath} --out design.json
|
|
19473
|
+
then: musubix design:verify design.json`);
|
|
19474
|
+
return ExitCode.VALIDATION_ERROR;
|
|
19475
|
+
}
|
|
19405
19476
|
const design = JSON.parse(content);
|
|
19406
19477
|
const validator = createSOLIDValidator();
|
|
19407
19478
|
const report = validator.validate(design);
|
|
@@ -19582,7 +19653,9 @@ async function handleTestGen(filePath) {
|
|
|
19582
19653
|
const generator = createUnitTestGenerator();
|
|
19583
19654
|
const files = collectFiles(filePath, (ext) => ext in EXT_TO_LANG);
|
|
19584
19655
|
if (files.length === 0) {
|
|
19585
|
-
console.error(`\u274C No source files found under: ${filePath}
|
|
19656
|
+
console.error(`\u274C No source files found under: ${filePath}
|
|
19657
|
+
test:gen reads source code (${Object.keys(EXT_TO_LANG).join(", ")}), not requirements.
|
|
19658
|
+
Generate code first: musubix codegen <reqs.md> --out impl.ts \u2192 musubix test:gen impl.ts`);
|
|
19586
19659
|
return ExitCode.GENERAL_ERROR;
|
|
19587
19660
|
}
|
|
19588
19661
|
const single = files.length === 1;
|