musubix2 0.5.9 → 0.5.11

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.9","timestamp":"2026-07-09T10:34:18.313Z"}
1
+ {"generator":"musubix2","version":"0.5.11","timestamp":"2026-07-09T10:51:51.652Z"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "1.0",
3
- "generatedAt": "2026-07-09T10:34:18.341Z",
3
+ "generatedAt": "2026-07-09T10:51:51.684Z",
4
4
  "entries": [
5
5
  {
6
6
  "platform": "copilot",
package/dist/cli.js CHANGED
@@ -14431,93 +14431,129 @@ function researchTools() {
14431
14431
  param("depth", "string", "Research depth: shallow | medium | deep", false, "medium")
14432
14432
  ], async (params) => {
14433
14433
  try {
14434
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14435
- const result = research.query?.(params["topic"], params["depth"] ?? "medium");
14436
- return ok(result ?? { findings: [], topic: params["topic"] });
14434
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14435
+ const sources = normalizeSources(params["sources"]);
14436
+ const result = createResearchEngine2().research({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, sources);
14437
+ return ok(result);
14437
14438
  } catch {
14438
- return ok({ findings: [], topic: params["topic"] });
14439
+ return fail("Deep-research package not available");
14439
14440
  }
14440
14441
  }),
14441
- tool("research.iterative", "Perform iterative deep research with progressive refinement", "research", [
14442
+ tool("research.iterative", "Perform iterative research with progressive refinement over provided sources", "research", [
14442
14443
  param("topic", "string", "Research topic"),
14443
- param("iterations", "number", "Number of refinement iterations", false, 3)
14444
+ param("depth", "string", "Depth: shallow | medium | deep", false, "medium"),
14445
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14444
14446
  ], async (params) => {
14445
14447
  try {
14446
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14447
- const result = research.iterativeResearch?.(params["topic"], params["iterations"] ?? 3);
14448
- return ok(result ?? { findings: [], iterations: 0, topic: params["topic"] });
14448
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14449
+ const sources = normalizeSources(params["sources"]);
14450
+ const result = createResearchEngine2().researchIterative({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, () => sources);
14451
+ return ok(result);
14449
14452
  } catch {
14450
- return ok({ findings: [], iterations: 0, topic: params["topic"] });
14453
+ return fail("Deep-research package not available");
14451
14454
  }
14452
14455
  }),
14453
- tool("research.evidence", "Generate evidence chain for a claim or hypothesis", "research", [
14454
- param("claim", "string", "Claim or hypothesis to evaluate"),
14455
- param("sources", "array", "Evidence sources to consider", false)
14456
+ tool("research.evidence", "Accumulate research results and retrieve evidence for a topic", "research", [
14457
+ param("topic", "string", "Topic to gather evidence for"),
14458
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14456
14459
  ], async (params) => {
14457
14460
  try {
14458
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14459
- const result = research.generateEvidence?.(params["claim"], params["sources"]);
14460
- return ok(result ?? { evidence: [], confidence: 0 });
14461
+ const { createResearchEngine: createResearchEngine2, createKnowledgeAccumulator: createKnowledgeAccumulator2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14462
+ const sources = normalizeSources(params["sources"]);
14463
+ const topic = params["topic"] ?? "";
14464
+ const result = createResearchEngine2().research({ topic, depth: "medium" }, sources);
14465
+ const acc = createKnowledgeAccumulator2();
14466
+ acc.accumulate(result);
14467
+ return ok({ evidence: acc.query(topic), summary: result.summary, confidence: result.confidence });
14461
14468
  } catch {
14462
- return ok({ evidence: [], confidence: 0 });
14469
+ return fail("Deep-research package not available");
14463
14470
  }
14464
14471
  })
14465
14472
  ];
14466
14473
  }
14474
+ function normalizeSources(raw) {
14475
+ const valid = /* @__PURE__ */ new Set(["code", "documentation", "article", "api-reference"]);
14476
+ const arr = Array.isArray(raw) ? raw : [];
14477
+ return arr.map((s, i) => {
14478
+ const o = s ?? {};
14479
+ const t = String(o["type"] ?? "documentation");
14480
+ return {
14481
+ title: String(o["title"] ?? `source-${i + 1}`),
14482
+ type: valid.has(t) ? t : "documentation",
14483
+ relevance: typeof o["relevance"] === "number" ? o["relevance"] : 0.5,
14484
+ content: String(o["content"] ?? (typeof s === "string" ? s : ""))
14485
+ };
14486
+ });
14487
+ }
14467
14488
  function neuralTools() {
14468
14489
  return [
14469
- tool("neural.search", "Neural similarity search across embeddings", "neural", [
14490
+ tool("neural.search", "Neural (TF-IDF) similarity search over provided documents", "neural", [
14470
14491
  param("query", "string", "Search query"),
14492
+ param("documents", "array", "Documents to index: strings or {id,text} objects"),
14471
14493
  param("topK", "number", "Number of results", false, 10)
14472
14494
  ], async (params) => {
14473
14495
  try {
14474
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14475
- const results = ns.search?.(params["query"], params["topK"] ?? 10);
14476
- return ok(results ?? []);
14496
+ const { createNeuralSearchEngine: createNeuralSearchEngine2, createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14497
+ const model = createTfIdfEmbeddingModel2();
14498
+ const engine = createNeuralSearchEngine2();
14499
+ const docs = params["documents"] ?? [];
14500
+ const texts = docs.map((d) => typeof d === "string" ? d : d.text ?? "");
14501
+ const model2 = createTfIdfEmbeddingModel2();
14502
+ if (typeof model2.fit === "function") {
14503
+ model2.fit(texts);
14504
+ }
14505
+ const embedder = typeof model2.fit === "function" ? model2 : model;
14506
+ for (let i = 0; i < docs.length; i++) {
14507
+ const d = docs[i];
14508
+ const id = typeof d === "string" ? `doc-${i}` : d.id ?? `doc-${i}`;
14509
+ engine.addDocument(id, await embedder.embed(texts[i]), { text: texts[i] });
14510
+ }
14511
+ const hits = engine.search(await embedder.embed(params["query"] ?? ""), params["topK"] ?? 10);
14512
+ return ok({ query: params["query"], hits });
14477
14513
  } catch {
14478
- return ok([]);
14514
+ return fail("Neural-search package not available");
14479
14515
  }
14480
14516
  }),
14481
- tool("neural.embed", "Generate embeddings for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14517
+ tool("neural.embed", "Generate a TF-IDF embedding vector for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14482
14518
  try {
14483
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14484
- const embedding = ns.embed?.(params["text"]);
14485
- return ok(embedding ?? { vector: [], dimensions: 0 });
14519
+ const { createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14520
+ const model = createTfIdfEmbeddingModel2();
14521
+ const text = params["text"] ?? "";
14522
+ if (typeof model.fit === "function") {
14523
+ model.fit([text]);
14524
+ }
14525
+ const vector = await model.embed(text);
14526
+ return ok({ vector, dimensions: Array.isArray(vector) ? vector.length : vector.values?.length ?? 0 });
14486
14527
  } catch {
14487
- return ok({ vector: [], dimensions: 0 });
14528
+ return fail("Neural-search package not available");
14488
14529
  }
14489
14530
  }),
14490
- tool("neural.patterns.extract", "Wake phase: extract patterns from code or data", "neural", [
14491
- param("source", "string", "Source code or data to extract patterns from"),
14492
- param("type", "string", "Pattern type: structural | behavioral | api", false, "structural")
14493
- ], async (params) => {
14531
+ tool("neural.patterns.extract", "Wake phase: extract patterns from a list of items", "neural", [param("items", "array", "Items (strings) to process for pattern extraction")], async (params) => {
14494
14532
  try {
14495
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14496
- const patterns = ws.extractPatterns?.(params["source"], params["type"] ?? "structural");
14497
- return ok(patterns ?? { patterns: [], type: params["type"] ?? "structural" });
14533
+ const { createWakePhase: createWakePhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14534
+ const items = (params["items"] ?? []).map(String);
14535
+ return ok(createWakePhase2().process(items));
14498
14536
  } catch {
14499
- return ok({ patterns: [], type: params["type"] ?? "structural" });
14537
+ return fail("Wake-sleep package not available");
14500
14538
  }
14501
14539
  }),
14502
- tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Patterns to consolidate", false)], async (params) => {
14540
+ tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Pattern strings to consolidate")], async (params) => {
14503
14541
  try {
14504
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14505
- const result = ws.consolidatePatterns?.(params["patterns"]);
14506
- return ok(result ?? { consolidated: [], count: 0 });
14542
+ const { createSleepPhase: createSleepPhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14543
+ const patterns = (params["patterns"] ?? []).map(String);
14544
+ return ok(createSleepPhase2().consolidate(patterns));
14507
14545
  } catch {
14508
- return ok({ consolidated: [], count: 0 });
14546
+ return fail("Wake-sleep package not available");
14509
14547
  }
14510
14548
  }),
14511
- tool("neural.library.learn", "Learn patterns from a library or framework", "neural", [
14512
- param("library", "string", "Library name or path"),
14513
- param("depth", "string", "Analysis depth: api | usage | deep", false, "api")
14514
- ], async (params) => {
14549
+ tool("neural.library.learn", "Learn reusable patterns from code snippets (E-graph library learning)", "neural", [param("snippets", "array", "Array of code snippet strings to learn from")], async (params) => {
14515
14550
  try {
14516
- const ll = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14517
- const result = ll.learnLibrary?.(params["library"], params["depth"] ?? "api");
14518
- return ok(result ?? { patterns: [], library: params["library"] });
14551
+ const { createLibraryLearner: createLibraryLearner2 } = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14552
+ const snippets = (params["snippets"] ?? []).map(String);
14553
+ const patterns = createLibraryLearner2().learn(snippets);
14554
+ return ok({ patterns, count: patterns.length });
14519
14555
  } catch {
14520
- return ok({ patterns: [], library: params["library"] });
14556
+ return fail("Library-learner package not available");
14521
14557
  }
14522
14558
  })
14523
14559
  ];
@@ -14613,110 +14649,156 @@ function synthesisTools() {
14613
14649
  })
14614
14650
  ];
14615
14651
  }
14652
+ async function buildSpecFromParams(params) {
14653
+ const text = params["text"] ?? params["requirement"] ?? params["spec"] ?? "";
14654
+ let pattern = params["pattern"];
14655
+ if (!pattern) {
14656
+ try {
14657
+ const { createEARSValidator: createEARSValidator2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
14658
+ pattern = createEARSValidator2().analyze(text).pattern;
14659
+ } catch {
14660
+ pattern = "ubiquitous";
14661
+ }
14662
+ }
14663
+ return {
14664
+ id: params["id"] ?? "REQ-XXX-001",
14665
+ title: params["name"] ?? params["title"] ?? "requirement",
14666
+ text,
14667
+ pattern,
14668
+ trigger: params["trigger"],
14669
+ condition: params["condition"],
14670
+ action: params["action"] ?? text
14671
+ };
14672
+ }
14616
14673
  function formalVerifyTools() {
14617
14674
  return [
14618
- tool("verify.ears-to-smt", "Convert EARS requirements to SMT-LIB2 format", "formal-verify", [param("requirement", "string", "EARS requirement text")], async (params) => {
14675
+ tool("verify.ears-to-smt", "Convert an EARS requirement to SMT-LIB2", "formal-verify", [
14676
+ param("text", "string", "EARS requirement text"),
14677
+ param("action", "string", "Requirement action clause", false)
14678
+ ], async (params) => {
14619
14679
  try {
14620
- const fv = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14621
- const smt = fv.earsToSmt?.(params["requirement"]);
14622
- return ok(smt ?? { smtlib2: "", requirement: params["requirement"] });
14680
+ const { createEarsToSmtConverter: createEarsToSmtConverter2 } = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14681
+ return ok(createEarsToSmtConverter2().convert(await buildSpecFromParams(params)));
14623
14682
  } catch {
14624
- return ok({ smtlib2: "", requirement: params["requirement"] });
14683
+ return fail("Formal-verify package not available");
14625
14684
  }
14626
14685
  }),
14627
- tool("verify.z3.solve", "Solve an SMT formula using Z3", "formal-verify", [
14628
- param("formula", "string", "SMT-LIB2 formula"),
14629
- param("timeout", "number", "Timeout in milliseconds", false, 5e3)
14630
- ], async (params) => {
14686
+ tool("verify.z3.solve", "Solve an SMT-LIB2 script with the Z3 adapter", "formal-verify", [param("formula", "string", "SMT-LIB2 script")], async (params) => {
14631
14687
  try {
14632
- const fv = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14633
- const result = fv.z3Solve?.(params["formula"], params["timeout"] ?? 5e3);
14634
- return ok(result ?? { satisfiable: false, model: null });
14635
- } catch {
14636
- return ok({ satisfiable: false, model: null });
14688
+ const { createZ3Adapter: createZ3Adapter2 } = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14689
+ return ok(await createZ3Adapter2().solve(params["formula"] ?? ""));
14690
+ } catch (err) {
14691
+ return fail(`Z3 solve failed: ${err instanceof Error ? err.message : String(err)}`);
14637
14692
  }
14638
14693
  }),
14639
- tool("verify.lean.convert", "Convert a specification to a Lean 4 theorem", "formal-verify", [
14640
- param("spec", "string", "Specification to convert"),
14694
+ tool("verify.lean.convert", "Convert a requirement specification to a Lean 4 theorem", "formal-verify", [
14695
+ param("text", "string", "Requirement text"),
14696
+ param("action", "string", "Requirement action clause", false),
14641
14697
  param("name", "string", "Theorem name", false, "spec_theorem")
14642
14698
  ], async (params) => {
14643
14699
  try {
14644
- const lean = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14645
- const result = lean.convertToLean?.(params["spec"], params["name"] ?? "spec_theorem");
14646
- return ok(result ?? { lean4: "", name: params["name"] ?? "spec_theorem" });
14700
+ const { createEarsToLeanConverter: createEarsToLeanConverter2 } = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14701
+ return ok(createEarsToLeanConverter2().convert(await buildSpecFromParams(params)));
14647
14702
  } catch {
14648
- return ok({ lean4: "", name: params["name"] ?? "spec_theorem" });
14703
+ return fail("Lean package not available");
14649
14704
  }
14650
14705
  }),
14651
- tool("verify.lean.run", "Run a Lean 4 proof", "formal-verify", [param("proof", "string", "Lean 4 proof code")], async (params) => {
14706
+ tool("verify.lean.run", "Run a Lean 4 proof (requires a Lean toolchain; reports availability otherwise)", "formal-verify", [param("proof", "string", "Lean 4 proof code")], async (params) => {
14652
14707
  try {
14653
- const lean = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14654
- const result = lean.runProof?.(params["proof"]);
14655
- return ok(result ?? { verified: false, output: "" });
14656
- } catch {
14657
- return ok({ verified: false, output: "" });
14708
+ const { createLeanProofRunner: createLeanProofRunner2 } = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14709
+ return ok(await createLeanProofRunner2().runProof(params["proof"] ?? ""));
14710
+ } catch (err) {
14711
+ return fail(`Lean proof run failed: ${err instanceof Error ? err.message : String(err)}`);
14658
14712
  }
14659
14713
  }),
14660
- tool("verify.hybrid", "Run hybrid verification combining Z3 and Lean", "formal-verify", [
14661
- param("spec", "string", "Specification to verify"),
14662
- param("strategy", "string", "Verification strategy: z3-first | lean-first | parallel", false, "z3-first")
14714
+ tool("verify.hybrid", "Run hybrid (Z3 + Lean) verification on a requirement specification", "formal-verify", [
14715
+ param("text", "string", "Requirement text"),
14716
+ param("action", "string", "Requirement action clause", false)
14663
14717
  ], async (params) => {
14664
14718
  try {
14665
- const fv = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14666
- const result = fv.hybridVerify?.(params["spec"], params["strategy"] ?? "z3-first");
14667
- return ok(result ?? { verified: false, strategy: params["strategy"] ?? "z3-first" });
14668
- } catch {
14669
- return ok({ verified: false, strategy: params["strategy"] ?? "z3-first" });
14719
+ const { createHybridVerifier: createHybridVerifier2 } = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14720
+ return ok(await createHybridVerifier2().verify(await buildSpecFromParams(params)));
14721
+ } catch (err) {
14722
+ return fail(`Hybrid verification failed: ${err instanceof Error ? err.message : String(err)}`);
14670
14723
  }
14671
14724
  })
14672
14725
  ];
14673
14726
  }
14727
+ async function loadTracker(basePath) {
14728
+ const { createStateTracker: createStateTracker2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14729
+ const { existsSync: existsSync12, readFileSync: readFileSync7 } = await import("node:fs");
14730
+ const { join: join8 } = await import("node:path");
14731
+ const tracker = createStateTracker2();
14732
+ const file = join8(basePath, ".musubix", "workflow-state.json");
14733
+ try {
14734
+ if (existsSync12(file))
14735
+ tracker.restore(JSON.parse(readFileSync7(file, "utf-8")));
14736
+ } catch {
14737
+ }
14738
+ return { tracker, file };
14739
+ }
14740
+ async function saveTracker(tracker, file) {
14741
+ const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
14742
+ const { dirname: dirname4 } = await import("node:path");
14743
+ mkdirSync4(dirname4(file), { recursive: true });
14744
+ writeFileSync4(file, JSON.stringify(tracker.toJSON(), null, 2), "utf-8");
14745
+ }
14674
14746
  function workflowTools() {
14675
14747
  return [
14676
- tool("workflow.phase.current", "Get the current SDD workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14748
+ tool("workflow.phase.current", "Get the current SDD workflow phase and approvals", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14677
14749
  try {
14678
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14679
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14680
- const phase = engine?.getCurrentPhase();
14681
- return ok(phase ?? { phase: "requirements", index: 0 });
14750
+ const { PHASE_ORDER: PHASE_ORDER2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14751
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14752
+ const state = tracker.getState();
14753
+ return ok({
14754
+ currentPhase: state.currentPhase,
14755
+ approvals: PHASE_ORDER2.map((p) => ({ phase: p, approved: tracker.isApproved(p) }))
14756
+ });
14682
14757
  } catch {
14683
- return ok({ phase: "requirements", index: 0 });
14758
+ return fail("Workflow-engine package not available");
14684
14759
  }
14685
14760
  }),
14686
- tool("workflow.phase.transition", "Transition to the next SDD workflow phase", "workflow", [
14761
+ tool("workflow.phase.transition", "Transition to a target SDD workflow phase (persisted)", "workflow", [
14687
14762
  param("targetPhase", "string", "Target phase to transition to"),
14688
14763
  param("basePath", "string", "Project base path", false, ".")
14689
14764
  ], async (params) => {
14690
14765
  try {
14691
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14692
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14693
- const result = engine?.transition(params["targetPhase"]);
14694
- return ok(result ?? { success: false, phase: params["targetPhase"] });
14766
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14767
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14768
+ const result = await createPhaseController2(tracker).transitionTo(params["targetPhase"]);
14769
+ if (result.success)
14770
+ await saveTracker(tracker, file);
14771
+ return ok(result);
14695
14772
  } catch {
14696
- return ok({ success: false, phase: params["targetPhase"] });
14773
+ return fail("Workflow-engine package not available");
14697
14774
  }
14698
14775
  }),
14699
- tool("workflow.gate.check", "Check if a quality gate can be passed", "workflow", [
14700
- param("gate", "string", "Gate name"),
14776
+ tool("workflow.gate.check", "Check whether the workflow can transition to a target phase (quality gates)", "workflow", [
14777
+ param("targetPhase", "string", "Target phase to check"),
14701
14778
  param("basePath", "string", "Project base path", false, ".")
14702
14779
  ], async (params) => {
14703
14780
  try {
14704
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14705
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14706
- const result = engine?.checkGate(params["gate"]);
14707
- return ok(result ?? { passed: false, gate: params["gate"] });
14781
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14782
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14783
+ const target = params["targetPhase"] ?? params["gate"];
14784
+ const canTransition = await createPhaseController2(tracker).canTransition(target);
14785
+ return ok({ targetPhase: target, canTransition });
14708
14786
  } catch {
14709
- return ok({ passed: false, gate: params["gate"] });
14787
+ return fail("Workflow-engine package not available");
14710
14788
  }
14711
14789
  }),
14712
- tool("workflow.tasks.list", "List tasks for the current workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14790
+ tool("workflow.approve", "Approve the current (or a named) SDD phase (persisted)", "workflow", [
14791
+ param("phase", "string", "Phase to approve"),
14792
+ param("basePath", "string", "Project base path", false, ".")
14793
+ ], async (params) => {
14713
14794
  try {
14714
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14715
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14716
- const tasks = engine?.listTasks();
14717
- return ok(tasks ?? []);
14795
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14796
+ const phase = params["phase"] ?? tracker.getState().currentPhase;
14797
+ tracker.approve(phase);
14798
+ await saveTracker(tracker, file);
14799
+ return ok({ phase, approved: true });
14718
14800
  } catch {
14719
- return ok([]);
14801
+ return fail("Workflow-engine package not available");
14720
14802
  }
14721
14803
  })
14722
14804
  ];
@@ -14769,44 +14851,56 @@ function decisionsTools() {
14769
14851
  })
14770
14852
  ];
14771
14853
  }
14854
+ async function getSkillManager() {
14855
+ if (!_skillManager) {
14856
+ const { createSkillManager: createSkillManager2 } = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14857
+ _skillManager = createSkillManager2();
14858
+ }
14859
+ return _skillManager;
14860
+ }
14772
14861
  function skillsTools() {
14773
14862
  return [
14774
- tool("skills.list", "List all registered skills", "skills", [], async () => {
14863
+ tool("skills.list", "List skills registered in the current server session", "skills", [], async () => {
14775
14864
  try {
14776
- const sm = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14777
- const skills = sm.listSkills?.();
14778
- return ok(skills ?? []);
14865
+ const mgr = await getSkillManager();
14866
+ return ok(mgr.getAvailableSkills().map((s) => ({ id: s.id, name: s.metadata.name, status: s.status })));
14779
14867
  } catch {
14780
- return ok([]);
14868
+ return fail("Skill-manager package not available");
14781
14869
  }
14782
14870
  }),
14783
- tool("skills.register", "Register a new skill", "skills", [
14871
+ tool("skills.register", "Register a skill (echo-executor) for this server session", "skills", [
14784
14872
  param("name", "string", "Skill name"),
14785
- param("description", "string", "Skill description"),
14786
- param("handler", "string", "Handler module path")
14873
+ param("description", "string", "Skill description", false, ""),
14874
+ param("triggers", "array", "Trigger keywords", false)
14787
14875
  ], async (params) => {
14788
14876
  try {
14789
- const sm = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14790
- const result = sm.registerSkill?.({
14791
- name: params["name"],
14792
- description: params["description"],
14793
- handler: params["handler"]
14794
- });
14795
- return ok(result ?? { name: params["name"], registered: true });
14877
+ const mgr = await getSkillManager();
14878
+ const name = params["name"] ?? "skill";
14879
+ const skill = mgr.loadFromMetadata({
14880
+ name,
14881
+ version: "1.0.0",
14882
+ description: params["description"] ?? "",
14883
+ triggers: params["triggers"] ?? []
14884
+ }, async (input) => ({ skill: name, output: input }));
14885
+ return ok({ id: skill.id, name, registered: true });
14796
14886
  } catch {
14797
- return ok({ name: params["name"], registered: true });
14887
+ return fail("Skill-manager package not available");
14798
14888
  }
14799
14889
  }),
14800
- tool("skills.execute", "Execute a registered skill by name", "skills", [
14890
+ tool("skills.execute", "Execute a session skill by name (must be registered in this session first)", "skills", [
14801
14891
  param("name", "string", "Skill name to execute"),
14802
14892
  param("input", "object", "Skill input parameters", false, {})
14803
14893
  ], async (params) => {
14804
14894
  try {
14805
- const sm = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14806
- const result = sm.executeSkill?.(params["name"], params["input"]);
14807
- return ok(result ?? { executed: false, name: params["name"] });
14895
+ const mgr = await getSkillManager();
14896
+ const name = params["name"] ?? "";
14897
+ const match = mgr.getAvailableSkills().find((s) => s.metadata.name === name);
14898
+ if (!match)
14899
+ return fail(`Skill not registered in this session: ${name}`);
14900
+ const output = await match.execute(params["input"] ?? {});
14901
+ return ok({ executed: true, name, output });
14808
14902
  } catch {
14809
- return ok({ executed: false, name: params["name"] });
14903
+ return fail("Skill-manager package not available");
14810
14904
  }
14811
14905
  })
14812
14906
  ];
@@ -14834,9 +14928,11 @@ function registerDefaultTools(server) {
14834
14928
  server.registerBatch(category.tools);
14835
14929
  }
14836
14930
  }
14931
+ var _skillManager;
14837
14932
  var init_catalog = __esm({
14838
14933
  "../mcp-server/dist/catalog.js"() {
14839
14934
  "use strict";
14935
+ _skillManager = null;
14840
14936
  }
14841
14937
  });
14842
14938
 
package/dist/index.js CHANGED
@@ -14431,93 +14431,129 @@ function researchTools() {
14431
14431
  param("depth", "string", "Research depth: shallow | medium | deep", false, "medium")
14432
14432
  ], async (params) => {
14433
14433
  try {
14434
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14435
- const result = research.query?.(params["topic"], params["depth"] ?? "medium");
14436
- return ok(result ?? { findings: [], topic: params["topic"] });
14434
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14435
+ const sources = normalizeSources(params["sources"]);
14436
+ const result = createResearchEngine2().research({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, sources);
14437
+ return ok(result);
14437
14438
  } catch {
14438
- return ok({ findings: [], topic: params["topic"] });
14439
+ return fail("Deep-research package not available");
14439
14440
  }
14440
14441
  }),
14441
- tool("research.iterative", "Perform iterative deep research with progressive refinement", "research", [
14442
+ tool("research.iterative", "Perform iterative research with progressive refinement over provided sources", "research", [
14442
14443
  param("topic", "string", "Research topic"),
14443
- param("iterations", "number", "Number of refinement iterations", false, 3)
14444
+ param("depth", "string", "Depth: shallow | medium | deep", false, "medium"),
14445
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14444
14446
  ], async (params) => {
14445
14447
  try {
14446
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14447
- const result = research.iterativeResearch?.(params["topic"], params["iterations"] ?? 3);
14448
- return ok(result ?? { findings: [], iterations: 0, topic: params["topic"] });
14448
+ const { createResearchEngine: createResearchEngine2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14449
+ const sources = normalizeSources(params["sources"]);
14450
+ const result = createResearchEngine2().researchIterative({ topic: params["topic"] ?? "", depth: params["depth"] ?? "medium" }, () => sources);
14451
+ return ok(result);
14449
14452
  } catch {
14450
- return ok({ findings: [], iterations: 0, topic: params["topic"] });
14453
+ return fail("Deep-research package not available");
14451
14454
  }
14452
14455
  }),
14453
- tool("research.evidence", "Generate evidence chain for a claim or hypothesis", "research", [
14454
- param("claim", "string", "Claim or hypothesis to evaluate"),
14455
- param("sources", "array", "Evidence sources to consider", false)
14456
+ tool("research.evidence", "Accumulate research results and retrieve evidence for a topic", "research", [
14457
+ param("topic", "string", "Topic to gather evidence for"),
14458
+ param("sources", "array", "Sources as {title,type,relevance,content} objects")
14456
14459
  ], async (params) => {
14457
14460
  try {
14458
- const research = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14459
- const result = research.generateEvidence?.(params["claim"], params["sources"]);
14460
- return ok(result ?? { evidence: [], confidence: 0 });
14461
+ const { createResearchEngine: createResearchEngine2, createKnowledgeAccumulator: createKnowledgeAccumulator2 } = await Promise.resolve().then(() => (init_dist10(), dist_exports10));
14462
+ const sources = normalizeSources(params["sources"]);
14463
+ const topic = params["topic"] ?? "";
14464
+ const result = createResearchEngine2().research({ topic, depth: "medium" }, sources);
14465
+ const acc = createKnowledgeAccumulator2();
14466
+ acc.accumulate(result);
14467
+ return ok({ evidence: acc.query(topic), summary: result.summary, confidence: result.confidence });
14461
14468
  } catch {
14462
- return ok({ evidence: [], confidence: 0 });
14469
+ return fail("Deep-research package not available");
14463
14470
  }
14464
14471
  })
14465
14472
  ];
14466
14473
  }
14474
+ function normalizeSources(raw) {
14475
+ const valid = /* @__PURE__ */ new Set(["code", "documentation", "article", "api-reference"]);
14476
+ const arr = Array.isArray(raw) ? raw : [];
14477
+ return arr.map((s, i) => {
14478
+ const o = s ?? {};
14479
+ const t = String(o["type"] ?? "documentation");
14480
+ return {
14481
+ title: String(o["title"] ?? `source-${i + 1}`),
14482
+ type: valid.has(t) ? t : "documentation",
14483
+ relevance: typeof o["relevance"] === "number" ? o["relevance"] : 0.5,
14484
+ content: String(o["content"] ?? (typeof s === "string" ? s : ""))
14485
+ };
14486
+ });
14487
+ }
14467
14488
  function neuralTools() {
14468
14489
  return [
14469
- tool("neural.search", "Neural similarity search across embeddings", "neural", [
14490
+ tool("neural.search", "Neural (TF-IDF) similarity search over provided documents", "neural", [
14470
14491
  param("query", "string", "Search query"),
14492
+ param("documents", "array", "Documents to index: strings or {id,text} objects"),
14471
14493
  param("topK", "number", "Number of results", false, 10)
14472
14494
  ], async (params) => {
14473
14495
  try {
14474
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14475
- const results = ns.search?.(params["query"], params["topK"] ?? 10);
14476
- return ok(results ?? []);
14496
+ const { createNeuralSearchEngine: createNeuralSearchEngine2, createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14497
+ const model = createTfIdfEmbeddingModel2();
14498
+ const engine = createNeuralSearchEngine2();
14499
+ const docs = params["documents"] ?? [];
14500
+ const texts = docs.map((d) => typeof d === "string" ? d : d.text ?? "");
14501
+ const model2 = createTfIdfEmbeddingModel2();
14502
+ if (typeof model2.fit === "function") {
14503
+ model2.fit(texts);
14504
+ }
14505
+ const embedder = typeof model2.fit === "function" ? model2 : model;
14506
+ for (let i = 0; i < docs.length; i++) {
14507
+ const d = docs[i];
14508
+ const id = typeof d === "string" ? `doc-${i}` : d.id ?? `doc-${i}`;
14509
+ engine.addDocument(id, await embedder.embed(texts[i]), { text: texts[i] });
14510
+ }
14511
+ const hits = engine.search(await embedder.embed(params["query"] ?? ""), params["topK"] ?? 10);
14512
+ return ok({ query: params["query"], hits });
14477
14513
  } catch {
14478
- return ok([]);
14514
+ return fail("Neural-search package not available");
14479
14515
  }
14480
14516
  }),
14481
- tool("neural.embed", "Generate embeddings for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14517
+ tool("neural.embed", "Generate a TF-IDF embedding vector for text", "neural", [param("text", "string", "Text to embed")], async (params) => {
14482
14518
  try {
14483
- const ns = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14484
- const embedding = ns.embed?.(params["text"]);
14485
- return ok(embedding ?? { vector: [], dimensions: 0 });
14519
+ const { createTfIdfEmbeddingModel: createTfIdfEmbeddingModel2 } = await Promise.resolve().then(() => (init_dist14(), dist_exports14));
14520
+ const model = createTfIdfEmbeddingModel2();
14521
+ const text = params["text"] ?? "";
14522
+ if (typeof model.fit === "function") {
14523
+ model.fit([text]);
14524
+ }
14525
+ const vector = await model.embed(text);
14526
+ return ok({ vector, dimensions: Array.isArray(vector) ? vector.length : vector.values?.length ?? 0 });
14486
14527
  } catch {
14487
- return ok({ vector: [], dimensions: 0 });
14528
+ return fail("Neural-search package not available");
14488
14529
  }
14489
14530
  }),
14490
- tool("neural.patterns.extract", "Wake phase: extract patterns from code or data", "neural", [
14491
- param("source", "string", "Source code or data to extract patterns from"),
14492
- param("type", "string", "Pattern type: structural | behavioral | api", false, "structural")
14493
- ], async (params) => {
14531
+ tool("neural.patterns.extract", "Wake phase: extract patterns from a list of items", "neural", [param("items", "array", "Items (strings) to process for pattern extraction")], async (params) => {
14494
14532
  try {
14495
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14496
- const patterns = ws.extractPatterns?.(params["source"], params["type"] ?? "structural");
14497
- return ok(patterns ?? { patterns: [], type: params["type"] ?? "structural" });
14533
+ const { createWakePhase: createWakePhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14534
+ const items = (params["items"] ?? []).map(String);
14535
+ return ok(createWakePhase2().process(items));
14498
14536
  } catch {
14499
- return ok({ patterns: [], type: params["type"] ?? "structural" });
14537
+ return fail("Wake-sleep package not available");
14500
14538
  }
14501
14539
  }),
14502
- tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Patterns to consolidate", false)], async (params) => {
14540
+ tool("neural.patterns.consolidate", "Sleep phase: consolidate and compress learned patterns", "neural", [param("patterns", "array", "Pattern strings to consolidate")], async (params) => {
14503
14541
  try {
14504
- const ws = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14505
- const result = ws.consolidatePatterns?.(params["patterns"]);
14506
- return ok(result ?? { consolidated: [], count: 0 });
14542
+ const { createSleepPhase: createSleepPhase2 } = await Promise.resolve().then(() => (init_dist15(), dist_exports15));
14543
+ const patterns = (params["patterns"] ?? []).map(String);
14544
+ return ok(createSleepPhase2().consolidate(patterns));
14507
14545
  } catch {
14508
- return ok({ consolidated: [], count: 0 });
14546
+ return fail("Wake-sleep package not available");
14509
14547
  }
14510
14548
  }),
14511
- tool("neural.library.learn", "Learn patterns from a library or framework", "neural", [
14512
- param("library", "string", "Library name or path"),
14513
- param("depth", "string", "Analysis depth: api | usage | deep", false, "api")
14514
- ], async (params) => {
14549
+ tool("neural.library.learn", "Learn reusable patterns from code snippets (E-graph library learning)", "neural", [param("snippets", "array", "Array of code snippet strings to learn from")], async (params) => {
14515
14550
  try {
14516
- const ll = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14517
- const result = ll.learnLibrary?.(params["library"], params["depth"] ?? "api");
14518
- return ok(result ?? { patterns: [], library: params["library"] });
14551
+ const { createLibraryLearner: createLibraryLearner2 } = await Promise.resolve().then(() => (init_dist11(), dist_exports11));
14552
+ const snippets = (params["snippets"] ?? []).map(String);
14553
+ const patterns = createLibraryLearner2().learn(snippets);
14554
+ return ok({ patterns, count: patterns.length });
14519
14555
  } catch {
14520
- return ok({ patterns: [], library: params["library"] });
14556
+ return fail("Library-learner package not available");
14521
14557
  }
14522
14558
  })
14523
14559
  ];
@@ -14613,110 +14649,156 @@ function synthesisTools() {
14613
14649
  })
14614
14650
  ];
14615
14651
  }
14652
+ async function buildSpecFromParams(params) {
14653
+ const text = params["text"] ?? params["requirement"] ?? params["spec"] ?? "";
14654
+ let pattern = params["pattern"];
14655
+ if (!pattern) {
14656
+ try {
14657
+ const { createEARSValidator: createEARSValidator2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
14658
+ pattern = createEARSValidator2().analyze(text).pattern;
14659
+ } catch {
14660
+ pattern = "ubiquitous";
14661
+ }
14662
+ }
14663
+ return {
14664
+ id: params["id"] ?? "REQ-XXX-001",
14665
+ title: params["name"] ?? params["title"] ?? "requirement",
14666
+ text,
14667
+ pattern,
14668
+ trigger: params["trigger"],
14669
+ condition: params["condition"],
14670
+ action: params["action"] ?? text
14671
+ };
14672
+ }
14616
14673
  function formalVerifyTools() {
14617
14674
  return [
14618
- tool("verify.ears-to-smt", "Convert EARS requirements to SMT-LIB2 format", "formal-verify", [param("requirement", "string", "EARS requirement text")], async (params) => {
14675
+ tool("verify.ears-to-smt", "Convert an EARS requirement to SMT-LIB2", "formal-verify", [
14676
+ param("text", "string", "EARS requirement text"),
14677
+ param("action", "string", "Requirement action clause", false)
14678
+ ], async (params) => {
14619
14679
  try {
14620
- const fv = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14621
- const smt = fv.earsToSmt?.(params["requirement"]);
14622
- return ok(smt ?? { smtlib2: "", requirement: params["requirement"] });
14680
+ const { createEarsToSmtConverter: createEarsToSmtConverter2 } = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14681
+ return ok(createEarsToSmtConverter2().convert(await buildSpecFromParams(params)));
14623
14682
  } catch {
14624
- return ok({ smtlib2: "", requirement: params["requirement"] });
14683
+ return fail("Formal-verify package not available");
14625
14684
  }
14626
14685
  }),
14627
- tool("verify.z3.solve", "Solve an SMT formula using Z3", "formal-verify", [
14628
- param("formula", "string", "SMT-LIB2 formula"),
14629
- param("timeout", "number", "Timeout in milliseconds", false, 5e3)
14630
- ], async (params) => {
14686
+ tool("verify.z3.solve", "Solve an SMT-LIB2 script with the Z3 adapter", "formal-verify", [param("formula", "string", "SMT-LIB2 script")], async (params) => {
14631
14687
  try {
14632
- const fv = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14633
- const result = fv.z3Solve?.(params["formula"], params["timeout"] ?? 5e3);
14634
- return ok(result ?? { satisfiable: false, model: null });
14635
- } catch {
14636
- return ok({ satisfiable: false, model: null });
14688
+ const { createZ3Adapter: createZ3Adapter2 } = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14689
+ return ok(await createZ3Adapter2().solve(params["formula"] ?? ""));
14690
+ } catch (err) {
14691
+ return fail(`Z3 solve failed: ${err instanceof Error ? err.message : String(err)}`);
14637
14692
  }
14638
14693
  }),
14639
- tool("verify.lean.convert", "Convert a specification to a Lean 4 theorem", "formal-verify", [
14640
- param("spec", "string", "Specification to convert"),
14694
+ tool("verify.lean.convert", "Convert a requirement specification to a Lean 4 theorem", "formal-verify", [
14695
+ param("text", "string", "Requirement text"),
14696
+ param("action", "string", "Requirement action clause", false),
14641
14697
  param("name", "string", "Theorem name", false, "spec_theorem")
14642
14698
  ], async (params) => {
14643
14699
  try {
14644
- const lean = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14645
- const result = lean.convertToLean?.(params["spec"], params["name"] ?? "spec_theorem");
14646
- return ok(result ?? { lean4: "", name: params["name"] ?? "spec_theorem" });
14700
+ const { createEarsToLeanConverter: createEarsToLeanConverter2 } = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14701
+ return ok(createEarsToLeanConverter2().convert(await buildSpecFromParams(params)));
14647
14702
  } catch {
14648
- return ok({ lean4: "", name: params["name"] ?? "spec_theorem" });
14703
+ return fail("Lean package not available");
14649
14704
  }
14650
14705
  }),
14651
- tool("verify.lean.run", "Run a Lean 4 proof", "formal-verify", [param("proof", "string", "Lean 4 proof code")], async (params) => {
14706
+ tool("verify.lean.run", "Run a Lean 4 proof (requires a Lean toolchain; reports availability otherwise)", "formal-verify", [param("proof", "string", "Lean 4 proof code")], async (params) => {
14652
14707
  try {
14653
- const lean = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14654
- const result = lean.runProof?.(params["proof"]);
14655
- return ok(result ?? { verified: false, output: "" });
14656
- } catch {
14657
- return ok({ verified: false, output: "" });
14708
+ const { createLeanProofRunner: createLeanProofRunner2 } = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14709
+ return ok(await createLeanProofRunner2().runProof(params["proof"] ?? ""));
14710
+ } catch (err) {
14711
+ return fail(`Lean proof run failed: ${err instanceof Error ? err.message : String(err)}`);
14658
14712
  }
14659
14713
  }),
14660
- tool("verify.hybrid", "Run hybrid verification combining Z3 and Lean", "formal-verify", [
14661
- param("spec", "string", "Specification to verify"),
14662
- param("strategy", "string", "Verification strategy: z3-first | lean-first | parallel", false, "z3-first")
14714
+ tool("verify.hybrid", "Run hybrid (Z3 + Lean) verification on a requirement specification", "formal-verify", [
14715
+ param("text", "string", "Requirement text"),
14716
+ param("action", "string", "Requirement action clause", false)
14663
14717
  ], async (params) => {
14664
14718
  try {
14665
- const fv = await Promise.resolve().then(() => (init_dist16(), dist_exports16));
14666
- const result = fv.hybridVerify?.(params["spec"], params["strategy"] ?? "z3-first");
14667
- return ok(result ?? { verified: false, strategy: params["strategy"] ?? "z3-first" });
14668
- } catch {
14669
- return ok({ verified: false, strategy: params["strategy"] ?? "z3-first" });
14719
+ const { createHybridVerifier: createHybridVerifier2 } = await Promise.resolve().then(() => (init_dist17(), dist_exports17));
14720
+ return ok(await createHybridVerifier2().verify(await buildSpecFromParams(params)));
14721
+ } catch (err) {
14722
+ return fail(`Hybrid verification failed: ${err instanceof Error ? err.message : String(err)}`);
14670
14723
  }
14671
14724
  })
14672
14725
  ];
14673
14726
  }
14727
+ async function loadTracker(basePath) {
14728
+ const { createStateTracker: createStateTracker2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14729
+ const { existsSync: existsSync12, readFileSync: readFileSync7 } = await import("node:fs");
14730
+ const { join: join8 } = await import("node:path");
14731
+ const tracker = createStateTracker2();
14732
+ const file = join8(basePath, ".musubix", "workflow-state.json");
14733
+ try {
14734
+ if (existsSync12(file))
14735
+ tracker.restore(JSON.parse(readFileSync7(file, "utf-8")));
14736
+ } catch {
14737
+ }
14738
+ return { tracker, file };
14739
+ }
14740
+ async function saveTracker(tracker, file) {
14741
+ const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
14742
+ const { dirname: dirname4 } = await import("node:path");
14743
+ mkdirSync4(dirname4(file), { recursive: true });
14744
+ writeFileSync4(file, JSON.stringify(tracker.toJSON(), null, 2), "utf-8");
14745
+ }
14674
14746
  function workflowTools() {
14675
14747
  return [
14676
- tool("workflow.phase.current", "Get the current SDD workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14748
+ tool("workflow.phase.current", "Get the current SDD workflow phase and approvals", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14677
14749
  try {
14678
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14679
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14680
- const phase = engine?.getCurrentPhase();
14681
- return ok(phase ?? { phase: "requirements", index: 0 });
14750
+ const { PHASE_ORDER: PHASE_ORDER2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14751
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14752
+ const state = tracker.getState();
14753
+ return ok({
14754
+ currentPhase: state.currentPhase,
14755
+ approvals: PHASE_ORDER2.map((p) => ({ phase: p, approved: tracker.isApproved(p) }))
14756
+ });
14682
14757
  } catch {
14683
- return ok({ phase: "requirements", index: 0 });
14758
+ return fail("Workflow-engine package not available");
14684
14759
  }
14685
14760
  }),
14686
- tool("workflow.phase.transition", "Transition to the next SDD workflow phase", "workflow", [
14761
+ tool("workflow.phase.transition", "Transition to a target SDD workflow phase (persisted)", "workflow", [
14687
14762
  param("targetPhase", "string", "Target phase to transition to"),
14688
14763
  param("basePath", "string", "Project base path", false, ".")
14689
14764
  ], async (params) => {
14690
14765
  try {
14691
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14692
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14693
- const result = engine?.transition(params["targetPhase"]);
14694
- return ok(result ?? { success: false, phase: params["targetPhase"] });
14766
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14767
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14768
+ const result = await createPhaseController2(tracker).transitionTo(params["targetPhase"]);
14769
+ if (result.success)
14770
+ await saveTracker(tracker, file);
14771
+ return ok(result);
14695
14772
  } catch {
14696
- return ok({ success: false, phase: params["targetPhase"] });
14773
+ return fail("Workflow-engine package not available");
14697
14774
  }
14698
14775
  }),
14699
- tool("workflow.gate.check", "Check if a quality gate can be passed", "workflow", [
14700
- param("gate", "string", "Gate name"),
14776
+ tool("workflow.gate.check", "Check whether the workflow can transition to a target phase (quality gates)", "workflow", [
14777
+ param("targetPhase", "string", "Target phase to check"),
14701
14778
  param("basePath", "string", "Project base path", false, ".")
14702
14779
  ], async (params) => {
14703
14780
  try {
14704
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14705
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14706
- const result = engine?.checkGate(params["gate"]);
14707
- return ok(result ?? { passed: false, gate: params["gate"] });
14781
+ const { createPhaseController: createPhaseController2 } = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14782
+ const { tracker } = await loadTracker(params["basePath"] ?? ".");
14783
+ const target = params["targetPhase"] ?? params["gate"];
14784
+ const canTransition = await createPhaseController2(tracker).canTransition(target);
14785
+ return ok({ targetPhase: target, canTransition });
14708
14786
  } catch {
14709
- return ok({ passed: false, gate: params["gate"] });
14787
+ return fail("Workflow-engine package not available");
14710
14788
  }
14711
14789
  }),
14712
- tool("workflow.tasks.list", "List tasks for the current workflow phase", "workflow", [param("basePath", "string", "Project base path", false, ".")], async (params) => {
14790
+ tool("workflow.approve", "Approve the current (or a named) SDD phase (persisted)", "workflow", [
14791
+ param("phase", "string", "Phase to approve"),
14792
+ param("basePath", "string", "Project base path", false, ".")
14793
+ ], async (params) => {
14713
14794
  try {
14714
- const wf = await Promise.resolve().then(() => (init_dist6(), dist_exports6));
14715
- const engine = wf.createWorkflowEngine?.(params["basePath"] ?? ".");
14716
- const tasks = engine?.listTasks();
14717
- return ok(tasks ?? []);
14795
+ const { tracker, file } = await loadTracker(params["basePath"] ?? ".");
14796
+ const phase = params["phase"] ?? tracker.getState().currentPhase;
14797
+ tracker.approve(phase);
14798
+ await saveTracker(tracker, file);
14799
+ return ok({ phase, approved: true });
14718
14800
  } catch {
14719
- return ok([]);
14801
+ return fail("Workflow-engine package not available");
14720
14802
  }
14721
14803
  })
14722
14804
  ];
@@ -14769,44 +14851,56 @@ function decisionsTools() {
14769
14851
  })
14770
14852
  ];
14771
14853
  }
14854
+ async function getSkillManager() {
14855
+ if (!_skillManager) {
14856
+ const { createSkillManager: createSkillManager2 } = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14857
+ _skillManager = createSkillManager2();
14858
+ }
14859
+ return _skillManager;
14860
+ }
14772
14861
  function skillsTools() {
14773
14862
  return [
14774
- tool("skills.list", "List all registered skills", "skills", [], async () => {
14863
+ tool("skills.list", "List skills registered in the current server session", "skills", [], async () => {
14775
14864
  try {
14776
- const sm = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14777
- const skills = sm.listSkills?.();
14778
- return ok(skills ?? []);
14865
+ const mgr = await getSkillManager();
14866
+ return ok(mgr.getAvailableSkills().map((s) => ({ id: s.id, name: s.metadata.name, status: s.status })));
14779
14867
  } catch {
14780
- return ok([]);
14868
+ return fail("Skill-manager package not available");
14781
14869
  }
14782
14870
  }),
14783
- tool("skills.register", "Register a new skill", "skills", [
14871
+ tool("skills.register", "Register a skill (echo-executor) for this server session", "skills", [
14784
14872
  param("name", "string", "Skill name"),
14785
- param("description", "string", "Skill description"),
14786
- param("handler", "string", "Handler module path")
14873
+ param("description", "string", "Skill description", false, ""),
14874
+ param("triggers", "array", "Trigger keywords", false)
14787
14875
  ], async (params) => {
14788
14876
  try {
14789
- const sm = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14790
- const result = sm.registerSkill?.({
14791
- name: params["name"],
14792
- description: params["description"],
14793
- handler: params["handler"]
14794
- });
14795
- return ok(result ?? { name: params["name"], registered: true });
14877
+ const mgr = await getSkillManager();
14878
+ const name = params["name"] ?? "skill";
14879
+ const skill = mgr.loadFromMetadata({
14880
+ name,
14881
+ version: "1.0.0",
14882
+ description: params["description"] ?? "",
14883
+ triggers: params["triggers"] ?? []
14884
+ }, async (input) => ({ skill: name, output: input }));
14885
+ return ok({ id: skill.id, name, registered: true });
14796
14886
  } catch {
14797
- return ok({ name: params["name"], registered: true });
14887
+ return fail("Skill-manager package not available");
14798
14888
  }
14799
14889
  }),
14800
- tool("skills.execute", "Execute a registered skill by name", "skills", [
14890
+ tool("skills.execute", "Execute a session skill by name (must be registered in this session first)", "skills", [
14801
14891
  param("name", "string", "Skill name to execute"),
14802
14892
  param("input", "object", "Skill input parameters", false, {})
14803
14893
  ], async (params) => {
14804
14894
  try {
14805
- const sm = await Promise.resolve().then(() => (init_dist7(), dist_exports7));
14806
- const result = sm.executeSkill?.(params["name"], params["input"]);
14807
- return ok(result ?? { executed: false, name: params["name"] });
14895
+ const mgr = await getSkillManager();
14896
+ const name = params["name"] ?? "";
14897
+ const match = mgr.getAvailableSkills().find((s) => s.metadata.name === name);
14898
+ if (!match)
14899
+ return fail(`Skill not registered in this session: ${name}`);
14900
+ const output = await match.execute(params["input"] ?? {});
14901
+ return ok({ executed: true, name, output });
14808
14902
  } catch {
14809
- return ok({ executed: false, name: params["name"] });
14903
+ return fail("Skill-manager package not available");
14810
14904
  }
14811
14905
  })
14812
14906
  ];
@@ -14834,9 +14928,11 @@ function registerDefaultTools(server) {
14834
14928
  server.registerBatch(category.tools);
14835
14929
  }
14836
14930
  }
14931
+ var _skillManager;
14837
14932
  var init_catalog = __esm({
14838
14933
  "../mcp-server/dist/catalog.js"() {
14839
14934
  "use strict";
14935
+ _skillManager = null;
14840
14936
  }
14841
14937
  });
14842
14938
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musubix2",
3
- "version": "0.5.9",
3
+ "version": "0.5.11",
4
4
  "description": "MUSUBIX2 — Specification Driven Development System",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",