@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.
- package/dist/mstar-harness.js +234 -45
- package/package.json +2 -2
package/dist/mstar-harness.js
CHANGED
|
@@ -2344,8 +2344,8 @@ var require_commander = __commonJS((exports) => {
|
|
|
2344
2344
|
});
|
|
2345
2345
|
|
|
2346
2346
|
// src/index.ts
|
|
2347
|
-
import
|
|
2348
|
-
import
|
|
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 = [
|
|
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
|
|
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
|
|
4792
|
+
return path7.isAbsolute(raw) ? raw : path7.join(resolveProjectRoot(), raw);
|
|
4605
4793
|
}
|
|
4606
4794
|
if (scope === "global")
|
|
4607
|
-
return
|
|
4608
|
-
return
|
|
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
|
|
4889
|
+
import fs6 from "node:fs";
|
|
4702
4890
|
import os5 from "node:os";
|
|
4703
|
-
import
|
|
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 =
|
|
4716
|
-
var KNOWN_MARKETPLACES_PATH =
|
|
4717
|
-
var MARKETPLACE_DIR =
|
|
4718
|
-
var MARKETPLACE_JSON_PATH =
|
|
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 (!
|
|
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 (!
|
|
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 =
|
|
4826
|
-
if (!
|
|
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 =
|
|
4832
|
-
if (!
|
|
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
|
|
5033
|
+
function runInit3(scope, dryRun) {
|
|
4846
5034
|
const notes = ensureLocalHarnessRepo(dryRun);
|
|
4847
5035
|
const projectRoot = resolveProjectRoot();
|
|
4848
5036
|
if (scope === "project") {
|
|
4849
|
-
const checkoutPath =
|
|
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 (!
|
|
4857
|
-
|
|
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
|
|
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 =
|
|
5065
|
+
const checkoutPath = path8.join(projectRoot, ZCODE_PLUGIN_CHECKOUT_PROJECT);
|
|
4878
5066
|
errors2.push(...validateGitCheckout(checkoutPath, ZCODE_PLUGIN_MARKER));
|
|
4879
|
-
const gitignorePath =
|
|
4880
|
-
const gitignore =
|
|
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) =>
|
|
4899
|
-
runInstallDoctor: (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
|
|
4921
|
-
import
|
|
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 (!
|
|
5117
|
+
if (!fs7.existsSync(filePath))
|
|
4929
5118
|
return {};
|
|
4930
|
-
const content =
|
|
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 =
|
|
4941
|
-
if (!
|
|
4942
|
-
|
|
4943
|
-
|
|
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 =
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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",
|