@mstar-harness/cli 1.6.0 → 1.7.1

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.
Files changed (2) hide show
  1. package/dist/mstar-harness.js +234 -45
  2. package/package.json +2 -2
@@ -2344,8 +2344,8 @@ var require_commander = __commonJS((exports) => {
2344
2344
  });
2345
2345
 
2346
2346
  // src/index.ts
2347
- import fs7 from "fs";
2348
- import path9 from "path";
2347
+ import fs8 from "fs";
2348
+ import path10 from "path";
2349
2349
  import { fileURLToPath } from "url";
2350
2350
 
2351
2351
  // ../../node_modules/@inquirer/core/dist/lib/key.js
@@ -4070,7 +4070,11 @@ import { execFileSync } from "node:child_process";
4070
4070
  var REPO_URL = "https://github.com/btspoony/mstar-harness.git";
4071
4071
  var PLUGIN_NAME = "morning-star-harness";
4072
4072
  var HARNESS_REPO_PATH = path3.join(os.homedir(), ".mstar", "harness");
4073
- var HARNESS_MARKERS = [".codex-plugin/plugin.json", ".zcode-plugin/plugin.json"];
4073
+ var HARNESS_MARKERS = [
4074
+ ".codex-plugin/plugin.json",
4075
+ ".zcode-plugin/plugin.json",
4076
+ ".omp-plugin/plugin.json"
4077
+ ];
4074
4078
  function harnessMarkerPath() {
4075
4079
  for (const marker of HARNESS_MARKERS) {
4076
4080
  const candidate = path3.join(HARNESS_REPO_PATH, marker);
@@ -4578,9 +4582,193 @@ var cursorAdapter = {
4578
4582
  }
4579
4583
  };
4580
4584
 
4585
+ // src/adapters/omp.ts
4586
+ import fs5 from "node:fs";
4587
+ import path6 from "node:path";
4588
+ import { execFileSync as execFileSync2 } from "node:child_process";
4589
+ var OMP_PLUGIN_MARKER = ".omp-plugin/plugin.json";
4590
+ var CLAUDE_PLUGIN_MARKER = ".claude-plugin/plugin.json";
4591
+ var PACKAGE_NAMES = new Set(["morning-star", PLUGIN_NAME, "github:btspoony/mstar-harness"]);
4592
+ var SKILL_SMOKE = ["mstar-host", "mstar-harness-core", "pm"];
4593
+ var COMMAND_SMOKE = ["iteration-start", "iteration-drive", "iteration-loop"];
4594
+ function ompAvailable() {
4595
+ try {
4596
+ execFileSync2("omp", ["--version"], { stdio: "pipe", encoding: "utf8" });
4597
+ return true;
4598
+ } catch {
4599
+ return false;
4600
+ }
4601
+ }
4602
+ function runOmp(args, dryRun) {
4603
+ if (dryRun)
4604
+ return;
4605
+ execFileSync2("omp", args, { stdio: "pipe", encoding: "utf8" });
4606
+ }
4607
+ function listInstalledPlugins() {
4608
+ try {
4609
+ const raw = execFileSync2("omp", ["plugin", "list", "--json"], {
4610
+ stdio: "pipe",
4611
+ encoding: "utf8"
4612
+ });
4613
+ const parsed = JSON.parse(raw);
4614
+ if (Array.isArray(parsed))
4615
+ return parsed;
4616
+ if (parsed && typeof parsed === "object") {
4617
+ const record = parsed;
4618
+ if (Array.isArray(record.plugins)) {
4619
+ return record.plugins;
4620
+ }
4621
+ const entries = [];
4622
+ for (const key of ["npm", "marketplace"]) {
4623
+ const group = record[key];
4624
+ if (Array.isArray(group)) {
4625
+ for (const item of group) {
4626
+ if (item && typeof item === "object")
4627
+ entries.push(item);
4628
+ }
4629
+ }
4630
+ }
4631
+ if (entries.length > 0)
4632
+ return entries;
4633
+ }
4634
+ return [];
4635
+ } catch {
4636
+ return [];
4637
+ }
4638
+ }
4639
+ function findInstalledPlugin(plugins) {
4640
+ return plugins.find((entry) => {
4641
+ const name = typeof entry.name === "string" ? entry.name : "";
4642
+ const pathValue = typeof entry.path === "string" ? entry.path : "";
4643
+ const manifest = entry.manifest && typeof entry.manifest === "object" ? entry.manifest : null;
4644
+ const manifestName = typeof manifest?.name === "string" ? manifest.name : "";
4645
+ if (PACKAGE_NAMES.has(name) || PACKAGE_NAMES.has(manifestName))
4646
+ return true;
4647
+ if (name.includes("morning-star") || manifestName.includes("morning-star"))
4648
+ return true;
4649
+ if (pathValue.includes("mstar-harness") || pathValue.includes(`${path6.sep}morning-star`))
4650
+ return true;
4651
+ return false;
4652
+ });
4653
+ }
4654
+ function validatePluginTree(pluginRoot) {
4655
+ const errors2 = [];
4656
+ for (const marker of [OMP_PLUGIN_MARKER, CLAUDE_PLUGIN_MARKER]) {
4657
+ const markerPath = path6.join(pluginRoot, marker);
4658
+ if (!fs5.existsSync(markerPath)) {
4659
+ errors2.push(`Missing omp plugin marker: ${markerPath}`);
4660
+ }
4661
+ }
4662
+ for (const skill of SKILL_SMOKE) {
4663
+ const skillPath = path6.join(pluginRoot, "skills", skill, "SKILL.md");
4664
+ if (!fs5.existsSync(skillPath))
4665
+ errors2.push(`Missing skill: ${skillPath}`);
4666
+ }
4667
+ for (const command of COMMAND_SMOKE) {
4668
+ const commandPath = path6.join(pluginRoot, "commands", `${command}.md`);
4669
+ if (!fs5.existsSync(commandPath))
4670
+ errors2.push(`Missing command: ${commandPath}`);
4671
+ }
4672
+ const hostRef = path6.join(pluginRoot, "skills", "mstar-host", "references", "omp.md");
4673
+ if (!fs5.existsSync(hostRef))
4674
+ errors2.push(`Missing omp host reference: ${hostRef}`);
4675
+ return errors2;
4676
+ }
4677
+ function runInit2(scope, dryRun) {
4678
+ const notes = ensureLocalHarnessRepo(dryRun);
4679
+ const projectRoot = resolveProjectRoot();
4680
+ if (fs5.existsSync(path6.join(HARNESS_REPO_PATH, ".git"))) {
4681
+ if (dryRun) {
4682
+ notes.push(`Would update local harness repo: git -C ${HARNESS_REPO_PATH} pull --ff-only`);
4683
+ } else {
4684
+ try {
4685
+ execFileSync2("git", ["-C", HARNESS_REPO_PATH, "pull", "--ff-only"], {
4686
+ stdio: "pipe",
4687
+ encoding: "utf8"
4688
+ });
4689
+ notes.push(`Updated local harness repo at ${HARNESS_REPO_PATH}`);
4690
+ } catch (error) {
4691
+ const message = error instanceof Error ? error.message : String(error);
4692
+ notes.push(`Warning: could not ff-only pull ${HARNESS_REPO_PATH} (${message})`);
4693
+ }
4694
+ }
4695
+ }
4696
+ if (!ompAvailable()) {
4697
+ notes.push("omp CLI not found on PATH. Install Oh My Pi (`omp`), then re-run init or manually: omp plugin install github:btspoony/mstar-harness");
4698
+ } else {
4699
+ const linkArgs = ["plugin", "link", HARNESS_REPO_PATH];
4700
+ if (scope === "project")
4701
+ linkArgs.push("--scope", "project");
4702
+ if (dryRun) {
4703
+ notes.push(`Would run: omp ${linkArgs.join(" ")}`);
4704
+ } else {
4705
+ try {
4706
+ runOmp(linkArgs, dryRun);
4707
+ notes.push(`Linked local harness into omp plugins (${scope}): omp plugin link ${HARNESS_REPO_PATH}${scope === "project" ? " --scope project" : ""}`);
4708
+ } catch (error) {
4709
+ const message = error instanceof Error ? error.message : String(error);
4710
+ notes.push(`omp plugin link failed (${message}). Falling back guidance: omp plugin install github:btspoony/mstar-harness`);
4711
+ try {
4712
+ const installArgs = ["plugin", "install", "github:btspoony/mstar-harness"];
4713
+ if (scope === "project")
4714
+ installArgs.push("--scope", "project");
4715
+ runOmp(installArgs, dryRun);
4716
+ notes.push(`Installed github:btspoony/mstar-harness via omp plugin install (${scope}).`);
4717
+ } catch (installError) {
4718
+ const installMessage = installError instanceof Error ? installError.message : String(installError);
4719
+ notes.push(`omp plugin install also failed: ${installMessage}`);
4720
+ }
4721
+ }
4722
+ }
4723
+ }
4724
+ if (scope === "project") {
4725
+ notes.push(...appendHarnessProjectGitignore(projectRoot, dryRun));
4726
+ notes.push(...appendGitignore(projectRoot, [".omp/plugins/", ".omp/plugin-overrides.json", ".omp/plugins/installed_plugins.json"], dryRun));
4727
+ }
4728
+ notes.push("Verify with: omp plugin list");
4729
+ notes.push("Enter PM with /skill:pm ; iteration commands: /iteration-start /iteration-drive /iteration-loop");
4730
+ notes.push(`Host adapter: skills/mstar-host/references/omp.md`);
4731
+ notes.push(`Alternate install without CLI link: omp plugin install ${REPO_URL.replace("https://github.com/", "github:").replace(/\.git$/, "")}`);
4732
+ return {
4733
+ location: HARNESS_REPO_PATH,
4734
+ notes
4735
+ };
4736
+ }
4737
+ function runDoctor2(scope) {
4738
+ const errors2 = [];
4739
+ errors2.push(...validateLocalHarnessRepo());
4740
+ errors2.push(...validatePluginTree(HARNESS_REPO_PATH));
4741
+ if (!ompAvailable()) {
4742
+ errors2.push("omp CLI not found on PATH (required for omp target doctor checks).");
4743
+ } else {
4744
+ const plugins = listInstalledPlugins();
4745
+ const installed = findInstalledPlugin(plugins);
4746
+ if (!installed) {
4747
+ errors2.push(`Morning Star plugin not found in \`omp plugin list\` (expected one of: ${[...PACKAGE_NAMES].join(", ")}). Run: mstar-harness init --target omp --scope ${scope}`);
4748
+ } else if (installed.enabled === false) {
4749
+ errors2.push(`Morning Star omp plugin is installed but disabled (${String(installed.name)}).`);
4750
+ }
4751
+ }
4752
+ if (scope === "project") {
4753
+ const projectRoot = resolveProjectRoot();
4754
+ const gitignorePath = path6.join(projectRoot, ".gitignore");
4755
+ const gitignore = fs5.existsSync(gitignorePath) ? fs5.readFileSync(gitignorePath, "utf8") : "";
4756
+ for (const entry of missingHarnessProcessGitignoreEntries(gitignore)) {
4757
+ errors2.push(`Missing .gitignore entry: ${entry}`);
4758
+ }
4759
+ }
4760
+ return { location: HARNESS_REPO_PATH, errors: errors2 };
4761
+ }
4762
+ var ompAdapter = {
4763
+ target: "omp",
4764
+ mode: "install",
4765
+ runInstallInit: (scope, dryRun) => runInit2(scope, dryRun),
4766
+ runInstallDoctor: (scope) => runDoctor2(scope)
4767
+ };
4768
+
4581
4769
  // src/adapters/opencode.ts
4582
4770
  import os4 from "node:os";
4583
- import path6 from "node:path";
4771
+ import path7 from "node:path";
4584
4772
  var OPENCODE_CONFIG_SCHEMA = "https://opencode.ai/config.json";
4585
4773
  var MSTAR_OPENCODE_PLUGIN = "@mstar-harness/opencode@latest";
4586
4774
  function isLegacyMorningStarGitPlugin(plugin) {
@@ -4601,11 +4789,11 @@ function isAnyMstarHarnessOpencodeSlot(plugin) {
4601
4789
  function resolveOpencodeConfigPath(scope, outputPath) {
4602
4790
  if (outputPath && outputPath.trim()) {
4603
4791
  const raw = outputPath.trim();
4604
- return path6.isAbsolute(raw) ? raw : path6.join(resolveProjectRoot(), raw);
4792
+ return path7.isAbsolute(raw) ? raw : path7.join(resolveProjectRoot(), raw);
4605
4793
  }
4606
4794
  if (scope === "global")
4607
- return path6.join(os4.homedir(), ".config", "opencode", "opencode.json");
4608
- return path6.join(resolveProjectRoot(), "opencode.json");
4795
+ return path7.join(os4.homedir(), ".config", "opencode", "opencode.json");
4796
+ return path7.join(resolveProjectRoot(), "opencode.json");
4609
4797
  }
4610
4798
  function ensureConfigSchema(config) {
4611
4799
  const next = ensureObject(config);
@@ -4698,9 +4886,9 @@ var opencodeAdapter = {
4698
4886
  };
4699
4887
 
4700
4888
  // src/adapters/zcode.ts
4701
- import fs5 from "node:fs";
4889
+ import fs6 from "node:fs";
4702
4890
  import os5 from "node:os";
4703
- import path7 from "node:path";
4891
+ import path8 from "node:path";
4704
4892
  var MARKETPLACE_ID = "mstar-local";
4705
4893
  var MARKETPLACE_NAME2 = "mstar-local";
4706
4894
  var MARKETPLACE_DESCRIPTION = "Morning Star harness marketplace (GitHub source).";
@@ -4712,10 +4900,10 @@ var GITHUB_REF = "main";
4712
4900
  var ZCODE_PLUGIN_MARKER = ".zcode-plugin/plugin.json";
4713
4901
  var ZCODE_PLUGIN_CHECKOUT_PROJECT = ".zcode/plugin-checkout";
4714
4902
  var ZCODE_AGENT_SMOKE_NAMES = ["fullstack-dev", "qc-specialist"];
4715
- var ZCODE_PLUGINS_ROOT = path7.join(os5.homedir(), ".zcode", "cli", "plugins");
4716
- var KNOWN_MARKETPLACES_PATH = path7.join(ZCODE_PLUGINS_ROOT, "known_marketplaces.json");
4717
- var MARKETPLACE_DIR = path7.join(ZCODE_PLUGINS_ROOT, "marketplaces", MARKETPLACE_ID);
4718
- var MARKETPLACE_JSON_PATH = path7.join(MARKETPLACE_DIR, "marketplace.json");
4903
+ var ZCODE_PLUGINS_ROOT = path8.join(os5.homedir(), ".zcode", "cli", "plugins");
4904
+ var KNOWN_MARKETPLACES_PATH = path8.join(ZCODE_PLUGINS_ROOT, "known_marketplaces.json");
4905
+ var MARKETPLACE_DIR = path8.join(ZCODE_PLUGINS_ROOT, "marketplaces", MARKETPLACE_ID);
4906
+ var MARKETPLACE_JSON_PATH = path8.join(MARKETPLACE_DIR, "marketplace.json");
4719
4907
  var GITHUB_SOURCE = { source: "github", repo: GITHUB_REPO, ref: GITHUB_REF };
4720
4908
  function nowIso() {
4721
4909
  return new Date().toISOString();
@@ -4771,7 +4959,7 @@ function findMarketplacePlugin(raw) {
4771
4959
  }
4772
4960
  function validateMarketplaceJson() {
4773
4961
  const errors2 = [];
4774
- if (!fs5.existsSync(MARKETPLACE_JSON_PATH)) {
4962
+ if (!fs6.existsSync(MARKETPLACE_JSON_PATH)) {
4775
4963
  errors2.push(`Missing ZCode marketplace: ${MARKETPLACE_JSON_PATH}`);
4776
4964
  return errors2;
4777
4965
  }
@@ -4799,7 +4987,7 @@ function validateMarketplaceJson() {
4799
4987
  }
4800
4988
  function validateKnownMarketplaces() {
4801
4989
  const errors2 = [];
4802
- if (!fs5.existsSync(KNOWN_MARKETPLACES_PATH)) {
4990
+ if (!fs6.existsSync(KNOWN_MARKETPLACES_PATH)) {
4803
4991
  errors2.push(`Missing ZCode known_marketplaces.json: ${KNOWN_MARKETPLACES_PATH}`);
4804
4992
  return errors2;
4805
4993
  }
@@ -4822,14 +5010,14 @@ function validateKnownMarketplaces() {
4822
5010
  }
4823
5011
  function validatePluginAgents2(pluginRoot) {
4824
5012
  const errors2 = [];
4825
- const agentsDir = path7.join(pluginRoot, "agents");
4826
- if (!fs5.existsSync(agentsDir)) {
5013
+ const agentsDir = path8.join(pluginRoot, "agents");
5014
+ if (!fs6.existsSync(agentsDir)) {
4827
5015
  errors2.push(`Missing plugin agents directory: ${agentsDir}`);
4828
5016
  return errors2;
4829
5017
  }
4830
5018
  for (const agentName of ZCODE_AGENT_SMOKE_NAMES) {
4831
- const agentPath = path7.join(agentsDir, `${agentName}.md`);
4832
- if (!fs5.existsSync(agentPath)) {
5019
+ const agentPath = path8.join(agentsDir, `${agentName}.md`);
5020
+ if (!fs6.existsSync(agentPath)) {
4833
5021
  errors2.push(`Missing plugin agent file: ${agentPath}`);
4834
5022
  }
4835
5023
  }
@@ -4842,19 +5030,19 @@ function buildMarketplaceJson() {
4842
5030
  plugins: [marketplacePluginEntry()]
4843
5031
  };
4844
5032
  }
4845
- function runInit2(scope, dryRun) {
5033
+ function runInit3(scope, dryRun) {
4846
5034
  const notes = ensureLocalHarnessRepo(dryRun);
4847
5035
  const projectRoot = resolveProjectRoot();
4848
5036
  if (scope === "project") {
4849
- const checkoutPath = path7.join(projectRoot, ZCODE_PLUGIN_CHECKOUT_PROJECT);
5037
+ const checkoutPath = path8.join(projectRoot, ZCODE_PLUGIN_CHECKOUT_PROJECT);
4850
5038
  notes.push(...ensureGitCheckout(REPO_URL, checkoutPath, dryRun));
4851
5039
  notes.push(...appendGitignore(projectRoot, [ZCODE_PLUGIN_CHECKOUT_PROJECT], dryRun));
4852
5040
  notes.push(...appendHarnessProjectGitignore(projectRoot, dryRun));
4853
5041
  notes.push(`Materialized local ZCode plugin checkout at ${ZCODE_PLUGIN_CHECKOUT_PROJECT} for smoke checks (the registered marketplace still points at the github repo).`);
4854
5042
  }
4855
5043
  if (!dryRun) {
4856
- if (!fs5.existsSync(MARKETPLACE_DIR))
4857
- fs5.mkdirSync(MARKETPLACE_DIR, { recursive: true });
5044
+ if (!fs6.existsSync(MARKETPLACE_DIR))
5045
+ fs6.mkdirSync(MARKETPLACE_DIR, { recursive: true });
4858
5046
  writeJson(MARKETPLACE_JSON_PATH, buildMarketplaceJson());
4859
5047
  }
4860
5048
  notes.push(`Wrote ZCode marketplace: ${MARKETPLACE_JSON_PATH}`);
@@ -4869,15 +5057,15 @@ function runInit2(scope, dryRun) {
4869
5057
  notes
4870
5058
  };
4871
5059
  }
4872
- function runDoctor2(scope) {
5060
+ function runDoctor3(scope) {
4873
5061
  const errors2 = [];
4874
5062
  errors2.push(...validateLocalHarnessRepo());
4875
5063
  if (scope === "project") {
4876
5064
  const projectRoot = resolveProjectRoot();
4877
- const checkoutPath = path7.join(projectRoot, ZCODE_PLUGIN_CHECKOUT_PROJECT);
5065
+ const checkoutPath = path8.join(projectRoot, ZCODE_PLUGIN_CHECKOUT_PROJECT);
4878
5066
  errors2.push(...validateGitCheckout(checkoutPath, ZCODE_PLUGIN_MARKER));
4879
- const gitignorePath = path7.join(projectRoot, ".gitignore");
4880
- const gitignore = fs5.existsSync(gitignorePath) ? fs5.readFileSync(gitignorePath, "utf8") : "";
5067
+ const gitignorePath = path8.join(projectRoot, ".gitignore");
5068
+ const gitignore = fs6.existsSync(gitignorePath) ? fs6.readFileSync(gitignorePath, "utf8") : "";
4881
5069
  if (!gitignore.split(/\r?\n/).includes(ZCODE_PLUGIN_CHECKOUT_PROJECT)) {
4882
5070
  errors2.push(`Missing .gitignore entry: ${ZCODE_PLUGIN_CHECKOUT_PROJECT}`);
4883
5071
  }
@@ -4895,8 +5083,8 @@ function runDoctor2(scope) {
4895
5083
  var zcodeAdapter = {
4896
5084
  target: "zcode",
4897
5085
  mode: "install",
4898
- runInstallInit: (scope, dryRun) => runInit2(scope, dryRun),
4899
- runInstallDoctor: (scope) => runDoctor2(scope)
5086
+ runInstallInit: (scope, dryRun) => runInit3(scope, dryRun),
5087
+ runInstallDoctor: (scope) => runDoctor3(scope)
4900
5088
  };
4901
5089
 
4902
5090
  // src/adapters/index.ts
@@ -4904,7 +5092,8 @@ var adapters = {
4904
5092
  opencode: opencodeAdapter,
4905
5093
  cursor: cursorAdapter,
4906
5094
  codex: codexAdapter,
4907
- zcode: zcodeAdapter
5095
+ zcode: zcodeAdapter,
5096
+ omp: ompAdapter
4908
5097
  };
4909
5098
  function getAdapter(target) {
4910
5099
  const adapter = adapters[target];
@@ -4914,20 +5103,20 @@ function getAdapter(target) {
4914
5103
  }
4915
5104
 
4916
5105
  // src/types.ts
4917
- var SUPPORTED_TARGETS = ["opencode", "cursor", "codex", "zcode"];
5106
+ var SUPPORTED_TARGETS = ["opencode", "cursor", "codex", "zcode", "omp"];
4918
5107
 
4919
5108
  // src/utils.ts
4920
- import fs6 from "node:fs";
4921
- import path8 from "node:path";
5109
+ import fs7 from "node:fs";
5110
+ import path9 from "node:path";
4922
5111
  function parseCsv(raw) {
4923
5112
  if (!raw)
4924
5113
  return;
4925
5114
  return raw.split(",").map((item) => item.trim()).filter(Boolean);
4926
5115
  }
4927
5116
  function readJson2(filePath) {
4928
- if (!fs6.existsSync(filePath))
5117
+ if (!fs7.existsSync(filePath))
4929
5118
  return {};
4930
- const content = fs6.readFileSync(filePath, "utf8").trim();
5119
+ const content = fs7.readFileSync(filePath, "utf8").trim();
4931
5120
  if (!content)
4932
5121
  return {};
4933
5122
  try {
@@ -4937,18 +5126,18 @@ function readJson2(filePath) {
4937
5126
  }
4938
5127
  }
4939
5128
  function writeJson2(filePath, value) {
4940
- const parent = path8.dirname(filePath);
4941
- if (!fs6.existsSync(parent))
4942
- fs6.mkdirSync(parent, { recursive: true });
4943
- fs6.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}
5129
+ const parent = path9.dirname(filePath);
5130
+ if (!fs7.existsSync(parent))
5131
+ fs7.mkdirSync(parent, { recursive: true });
5132
+ fs7.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}
4944
5133
  `, "utf8");
4945
5134
  }
4946
5135
 
4947
5136
  // src/index.ts
4948
- var packageJsonPath = path9.resolve(path9.dirname(fileURLToPath(import.meta.url)), "../package.json");
5137
+ var packageJsonPath = path10.resolve(path10.dirname(fileURLToPath(import.meta.url)), "../package.json");
4949
5138
  var packageVersion = (() => {
4950
5139
  try {
4951
- const parsed = JSON.parse(fs7.readFileSync(packageJsonPath, "utf8"));
5140
+ const parsed = JSON.parse(fs8.readFileSync(packageJsonPath, "utf8"));
4952
5141
  return parsed.version || "0.0.0";
4953
5142
  } catch {
4954
5143
  return "0.0.0";
@@ -4986,7 +5175,7 @@ function resolveExplicitModelAssignments(options) {
4986
5175
  others: allow("other-models", parseCsv(options.otherModels), 3, true)
4987
5176
  });
4988
5177
  }
4989
- async function runInit3(options) {
5178
+ async function runInit4(options) {
4990
5179
  const target = options.target || (options.yes ? "opencode" : await pickTargetInteractive());
4991
5180
  const scope = options.scope || "project";
4992
5181
  const adapter = getAdapter(target);
@@ -5049,7 +5238,7 @@ async function runInit3(options) {
5049
5238
  }
5050
5239
  }
5051
5240
  }
5052
- function runDoctor3(options) {
5241
+ function runDoctor4(options) {
5053
5242
  const target = options.target || "opencode";
5054
5243
  const adapter = getAdapter(target);
5055
5244
  const scope = options.scope || "project";
@@ -5094,10 +5283,10 @@ function runDoctor3(options) {
5094
5283
  }
5095
5284
  program2.name("mstar-harness").description("Morning Star harness CLI for target-based agent bootstrap").version(packageVersion);
5096
5285
  program2.command("init").description("Interactive/non-interactive setup for target agent bootstrap").option("-y, --yes", "Non-interactive mode").option("--target <target>", "Install target", "opencode").option("--scope <scope>", "Config scope: global|project (default: project)").option("--output <path>", "Config file path override, relative to project root").option("--dry-run", "Preview result without writing config").option("--pm-model <model>", "Optional: model for project-manager (advanced override)").option("--strategic-models <a,b,c>", "Optional: models for architect/product-manager/prompt-engineer").option("--dev-models <a,b,c>", "Optional: models for fullstack-dev/fullstack-dev-2/frontend-dev").option("--qc-models <a,b,c>", "Optional: models for qc trio").option("--other-models <a,b,c>", "Optional: models for remaining roles").action(async (options) => {
5097
- await runInit3(options);
5286
+ await runInit4(options);
5098
5287
  });
5099
5288
  program2.command("doctor").description("Validate Morning Star setup for a target agent config").option("--target <target>", "Target agent for doctor checks", "opencode").option("--scope <scope>", "Config scope: global|project", "project").option("--output <path>", "Config file path override, relative to project root").action((options) => {
5100
- runDoctor3(options);
5289
+ runDoctor4(options);
5101
5290
  });
5102
5291
  program2.parseAsync(process.argv).catch((error) => {
5103
5292
  console.error(import_picocolors.default.red(`Setup failed: ${error.message}`));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mstar-harness/cli",
3
- "version": "1.6.0",
4
- "description": "Morning Star harness installer CLI (OpenCode, Cursor, Codex).",
3
+ "version": "1.7.1",
4
+ "description": "Morning Star harness installer CLI (OpenCode, Cursor, Codex, ZCode, omp).",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",