@onexapis/cli 1.1.45 → 1.1.47
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/cli.js +232 -12
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +232 -12
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/templates/default/.cursorrules +126 -0
- package/templates/default/AGENTS.md +126 -0
- package/templates/default/CLAUDE.md +88 -1726
- package/templates/default/THEME_REFERENCE.md +1764 -0
package/dist/cli.js
CHANGED
|
@@ -2716,12 +2716,12 @@ async function validateCommand(options) {
|
|
|
2716
2716
|
}
|
|
2717
2717
|
themeToValidate = options.theme;
|
|
2718
2718
|
} else {
|
|
2719
|
-
const
|
|
2719
|
+
const isThemeDir2 = [
|
|
2720
2720
|
"theme.config.ts",
|
|
2721
2721
|
"bundle-entry.ts",
|
|
2722
2722
|
"manifest.ts"
|
|
2723
2723
|
].some((f) => fs__default.default.existsSync(path9__default.default.join(process.cwd(), f)));
|
|
2724
|
-
if (
|
|
2724
|
+
if (isThemeDir2) {
|
|
2725
2725
|
themeToValidate = path9__default.default.basename(process.cwd());
|
|
2726
2726
|
logger.info(`Validating current theme: ${themeToValidate}`);
|
|
2727
2727
|
} else {
|
|
@@ -3113,12 +3113,12 @@ async function buildCommand(options) {
|
|
|
3113
3113
|
process.exit(1);
|
|
3114
3114
|
}
|
|
3115
3115
|
} else {
|
|
3116
|
-
const
|
|
3116
|
+
const isThemeDir2 = [
|
|
3117
3117
|
"theme.config.ts",
|
|
3118
3118
|
"bundle-entry.ts",
|
|
3119
3119
|
"manifest.ts"
|
|
3120
3120
|
].some((f) => fs__default.default.existsSync(path9__default.default.join(process.cwd(), f)));
|
|
3121
|
-
if (
|
|
3121
|
+
if (isThemeDir2) {
|
|
3122
3122
|
themePath = process.cwd();
|
|
3123
3123
|
themeName = path9__default.default.basename(themePath);
|
|
3124
3124
|
logger.info(`Building current theme: ${themeName}`);
|
|
@@ -3249,12 +3249,12 @@ async function packageCommand(options) {
|
|
|
3249
3249
|
process.exit(1);
|
|
3250
3250
|
}
|
|
3251
3251
|
} else {
|
|
3252
|
-
const
|
|
3252
|
+
const isThemeDir2 = [
|
|
3253
3253
|
"theme.config.ts",
|
|
3254
3254
|
"bundle-entry.ts",
|
|
3255
3255
|
"manifest.ts"
|
|
3256
3256
|
].some((f) => fs__default.default.existsSync(path9__default.default.join(process.cwd(), f)));
|
|
3257
|
-
if (
|
|
3257
|
+
if (isThemeDir2) {
|
|
3258
3258
|
themePath = process.cwd();
|
|
3259
3259
|
themeName = path9__default.default.basename(themePath);
|
|
3260
3260
|
logger.info(`Packaging current theme: ${themeName}`);
|
|
@@ -3790,8 +3790,8 @@ function runInstall(cwd) {
|
|
|
3790
3790
|
});
|
|
3791
3791
|
}
|
|
3792
3792
|
async function promptThemeName(originalName) {
|
|
3793
|
-
const { default:
|
|
3794
|
-
const { themeName } = await
|
|
3793
|
+
const { default: inquirer8 } = await import('inquirer');
|
|
3794
|
+
const { themeName } = await inquirer8.prompt([
|
|
3795
3795
|
{
|
|
3796
3796
|
type: "input",
|
|
3797
3797
|
name: "themeName",
|
|
@@ -4268,12 +4268,12 @@ async function devCommand(options) {
|
|
|
4268
4268
|
process.exit(1);
|
|
4269
4269
|
}
|
|
4270
4270
|
} else {
|
|
4271
|
-
const
|
|
4271
|
+
const isThemeDir2 = [
|
|
4272
4272
|
"theme.config.ts",
|
|
4273
4273
|
"bundle-entry.ts",
|
|
4274
4274
|
"manifest.ts"
|
|
4275
4275
|
].some((f) => fs__default.default.existsSync(path9__default.default.join(process.cwd(), f)));
|
|
4276
|
-
if (
|
|
4276
|
+
if (isThemeDir2) {
|
|
4277
4277
|
themePath = process.cwd();
|
|
4278
4278
|
themeName = path9__default.default.basename(themePath);
|
|
4279
4279
|
} else {
|
|
@@ -4701,12 +4701,12 @@ async function publishCommand(options) {
|
|
|
4701
4701
|
if (options.theme) {
|
|
4702
4702
|
themePath = path9__default.default.resolve(options.theme);
|
|
4703
4703
|
} else {
|
|
4704
|
-
const
|
|
4704
|
+
const isThemeDir2 = [
|
|
4705
4705
|
"theme.config.ts",
|
|
4706
4706
|
"bundle-entry.ts",
|
|
4707
4707
|
"manifest.ts"
|
|
4708
4708
|
].some((f) => fs__default.default.existsSync(path9__default.default.join(process.cwd(), f)));
|
|
4709
|
-
if (
|
|
4709
|
+
if (isThemeDir2) {
|
|
4710
4710
|
themePath = process.cwd();
|
|
4711
4711
|
} else {
|
|
4712
4712
|
logger.error(
|
|
@@ -5056,6 +5056,218 @@ async function createZip(sourceDir, outputPath, exclude) {
|
|
|
5056
5056
|
});
|
|
5057
5057
|
}
|
|
5058
5058
|
|
|
5059
|
+
// src/commands/mcp.ts
|
|
5060
|
+
init_logger();
|
|
5061
|
+
var AI_CONTEXT_FILES = [
|
|
5062
|
+
"CLAUDE.md",
|
|
5063
|
+
"AGENTS.md",
|
|
5064
|
+
".cursorrules",
|
|
5065
|
+
"THEME_REFERENCE.md",
|
|
5066
|
+
".mcp.json"
|
|
5067
|
+
];
|
|
5068
|
+
function resolveTargetDir(opts) {
|
|
5069
|
+
return path9__default.default.resolve(opts.cwd ?? process.cwd());
|
|
5070
|
+
}
|
|
5071
|
+
function resolveDefaultTemplateDir() {
|
|
5072
|
+
return path9__default.default.join(getTemplatesDir(), "default");
|
|
5073
|
+
}
|
|
5074
|
+
function isThemeDir(dir) {
|
|
5075
|
+
return fs__default.default.existsSync(path9__default.default.join(dir, "theme.config.ts")) || fs__default.default.existsSync(path9__default.default.join(dir, "theme.config.js"));
|
|
5076
|
+
}
|
|
5077
|
+
function inspectFiles(templateDir, targetDir) {
|
|
5078
|
+
return AI_CONTEXT_FILES.map((name) => {
|
|
5079
|
+
const templatePath = path9__default.default.join(templateDir, name);
|
|
5080
|
+
const targetPath = path9__default.default.join(targetDir, name);
|
|
5081
|
+
const exists = fs__default.default.existsSync(targetPath);
|
|
5082
|
+
let identical = false;
|
|
5083
|
+
if (exists && fs__default.default.existsSync(templatePath)) {
|
|
5084
|
+
try {
|
|
5085
|
+
const a = fs__default.default.readFileSync(templatePath, "utf-8");
|
|
5086
|
+
const b = fs__default.default.readFileSync(targetPath, "utf-8");
|
|
5087
|
+
identical = a.replace(/\r\n/g, "\n") === b.replace(/\r\n/g, "\n");
|
|
5088
|
+
} catch {
|
|
5089
|
+
identical = false;
|
|
5090
|
+
}
|
|
5091
|
+
}
|
|
5092
|
+
return { name, templatePath, targetPath, exists, identical };
|
|
5093
|
+
});
|
|
5094
|
+
}
|
|
5095
|
+
async function mcpSetupCommand(options = {}) {
|
|
5096
|
+
const targetDir = resolveTargetDir(options);
|
|
5097
|
+
const templateDir = resolveDefaultTemplateDir();
|
|
5098
|
+
logger.header("Install OneX MCP context files");
|
|
5099
|
+
logger.log(`Target: ${targetDir}`);
|
|
5100
|
+
logger.log("");
|
|
5101
|
+
if (!isThemeDir(targetDir)) {
|
|
5102
|
+
logger.error(
|
|
5103
|
+
`${targetDir} does not look like an OneX theme (no theme.config.ts found).`
|
|
5104
|
+
);
|
|
5105
|
+
logger.log("Run this command from the root of your theme project.");
|
|
5106
|
+
process.exitCode = 1;
|
|
5107
|
+
return;
|
|
5108
|
+
}
|
|
5109
|
+
const statuses = inspectFiles(templateDir, targetDir);
|
|
5110
|
+
const missing = statuses.filter((s) => !s.exists);
|
|
5111
|
+
if (missing.length === 0) {
|
|
5112
|
+
logger.success("All AI context files are already present.");
|
|
5113
|
+
logger.log(
|
|
5114
|
+
"Run `onexthm mcp upgrade` to refresh them to the latest version."
|
|
5115
|
+
);
|
|
5116
|
+
return;
|
|
5117
|
+
}
|
|
5118
|
+
logger.log(`Will install ${missing.length} file(s):`);
|
|
5119
|
+
for (const s of missing) logger.log(` + ${s.name}`);
|
|
5120
|
+
logger.log("");
|
|
5121
|
+
if (!options.yes) {
|
|
5122
|
+
const { confirm } = await inquirer__default.default.prompt([
|
|
5123
|
+
{
|
|
5124
|
+
type: "confirm",
|
|
5125
|
+
name: "confirm",
|
|
5126
|
+
message: "Proceed?",
|
|
5127
|
+
default: true
|
|
5128
|
+
}
|
|
5129
|
+
]);
|
|
5130
|
+
if (!confirm) {
|
|
5131
|
+
logger.log("Cancelled.");
|
|
5132
|
+
return;
|
|
5133
|
+
}
|
|
5134
|
+
}
|
|
5135
|
+
for (const s of missing) {
|
|
5136
|
+
if (!fs__default.default.existsSync(s.templatePath)) {
|
|
5137
|
+
logger.warning(` ! ${s.name} not in template \u2014 skipped`);
|
|
5138
|
+
continue;
|
|
5139
|
+
}
|
|
5140
|
+
await fs__default.default.copy(s.templatePath, s.targetPath);
|
|
5141
|
+
logger.success(` \u2713 ${s.name}`);
|
|
5142
|
+
}
|
|
5143
|
+
logger.log("");
|
|
5144
|
+
logger.success("Done. Restart your AI client to pick up the new MCP server.");
|
|
5145
|
+
logger.log("");
|
|
5146
|
+
logger.log("Tip: if your theme uses the Figma MCP, edit .mcp.json and");
|
|
5147
|
+
logger.log(
|
|
5148
|
+
"replace __FIGMA_API_KEY__ with your Figma personal access token."
|
|
5149
|
+
);
|
|
5150
|
+
}
|
|
5151
|
+
async function mcpUpgradeCommand(options = {}) {
|
|
5152
|
+
const targetDir = resolveTargetDir(options);
|
|
5153
|
+
const templateDir = resolveDefaultTemplateDir();
|
|
5154
|
+
logger.header("Upgrade OneX MCP context files");
|
|
5155
|
+
logger.log(`Target: ${targetDir}`);
|
|
5156
|
+
logger.log("");
|
|
5157
|
+
if (!isThemeDir(targetDir)) {
|
|
5158
|
+
logger.error(
|
|
5159
|
+
`${targetDir} does not look like an OneX theme (no theme.config.ts found).`
|
|
5160
|
+
);
|
|
5161
|
+
process.exitCode = 1;
|
|
5162
|
+
return;
|
|
5163
|
+
}
|
|
5164
|
+
const statuses = inspectFiles(templateDir, targetDir);
|
|
5165
|
+
const toUpgrade = statuses.filter(
|
|
5166
|
+
(s) => !s.identical && s.name !== ".mcp.json"
|
|
5167
|
+
);
|
|
5168
|
+
const mcpJsonStatus = statuses.find((s) => s.name === ".mcp.json");
|
|
5169
|
+
if (mcpJsonStatus && !mcpJsonStatus.exists) {
|
|
5170
|
+
logger.warning(
|
|
5171
|
+
".mcp.json is missing. Run `onexthm mcp setup` to install it."
|
|
5172
|
+
);
|
|
5173
|
+
}
|
|
5174
|
+
if (toUpgrade.length === 0) {
|
|
5175
|
+
logger.success("All AI context files are already up to date.");
|
|
5176
|
+
return;
|
|
5177
|
+
}
|
|
5178
|
+
logger.log("Files to update:");
|
|
5179
|
+
for (const s of toUpgrade) {
|
|
5180
|
+
const tag = !s.exists ? "+ new" : "~ changed";
|
|
5181
|
+
logger.log(` ${tag} ${s.name}`);
|
|
5182
|
+
}
|
|
5183
|
+
logger.log("");
|
|
5184
|
+
logger.log("(.mcp.json is never auto-upgraded \u2014 edit by hand if needed.)");
|
|
5185
|
+
logger.log("");
|
|
5186
|
+
if (!options.yes) {
|
|
5187
|
+
const { confirm } = await inquirer__default.default.prompt([
|
|
5188
|
+
{
|
|
5189
|
+
type: "confirm",
|
|
5190
|
+
name: "confirm",
|
|
5191
|
+
message: "Overwrite the file(s) above?",
|
|
5192
|
+
default: true
|
|
5193
|
+
}
|
|
5194
|
+
]);
|
|
5195
|
+
if (!confirm) {
|
|
5196
|
+
logger.log("Cancelled.");
|
|
5197
|
+
return;
|
|
5198
|
+
}
|
|
5199
|
+
}
|
|
5200
|
+
for (const s of toUpgrade) {
|
|
5201
|
+
if (!fs__default.default.existsSync(s.templatePath)) {
|
|
5202
|
+
logger.warning(` ! ${s.name} not in template \u2014 skipped`);
|
|
5203
|
+
continue;
|
|
5204
|
+
}
|
|
5205
|
+
await fs__default.default.copy(s.templatePath, s.targetPath, { overwrite: true });
|
|
5206
|
+
logger.success(` \u2713 ${s.name}`);
|
|
5207
|
+
}
|
|
5208
|
+
logger.log("");
|
|
5209
|
+
logger.success("Done. Restart your AI client to pick up the new context.");
|
|
5210
|
+
}
|
|
5211
|
+
async function mcpDoctorCommand(options = {}) {
|
|
5212
|
+
const targetDir = resolveTargetDir(options);
|
|
5213
|
+
const templateDir = resolveDefaultTemplateDir();
|
|
5214
|
+
logger.header("OneX MCP doctor");
|
|
5215
|
+
logger.log(`Target: ${targetDir}`);
|
|
5216
|
+
logger.log("");
|
|
5217
|
+
if (!isThemeDir(targetDir)) {
|
|
5218
|
+
logger.error("Not an OneX theme directory (no theme.config.ts).");
|
|
5219
|
+
process.exitCode = 1;
|
|
5220
|
+
return;
|
|
5221
|
+
}
|
|
5222
|
+
logger.success("theme.config.ts present");
|
|
5223
|
+
const mcpJsonPath = path9__default.default.join(targetDir, ".mcp.json");
|
|
5224
|
+
if (!fs__default.default.existsSync(mcpJsonPath)) {
|
|
5225
|
+
logger.error(".mcp.json missing \u2014 run `onexthm mcp setup`");
|
|
5226
|
+
} else {
|
|
5227
|
+
try {
|
|
5228
|
+
const mcpJson = JSON.parse(fs__default.default.readFileSync(mcpJsonPath, "utf-8"));
|
|
5229
|
+
const servers = mcpJson?.mcpServers ?? {};
|
|
5230
|
+
if (servers.onexthm) {
|
|
5231
|
+
logger.success(".mcp.json registers `onexthm`");
|
|
5232
|
+
} else {
|
|
5233
|
+
logger.error(".mcp.json does not register `onexthm`");
|
|
5234
|
+
}
|
|
5235
|
+
if (servers.figma) {
|
|
5236
|
+
const arg = (servers.figma.args ?? []).join(" ");
|
|
5237
|
+
if (arg.includes("__FIGMA_API_KEY__")) {
|
|
5238
|
+
logger.warning(
|
|
5239
|
+
"figma server uses placeholder API key \u2014 replace __FIGMA_API_KEY__"
|
|
5240
|
+
);
|
|
5241
|
+
} else {
|
|
5242
|
+
logger.success(".mcp.json registers `figma`");
|
|
5243
|
+
}
|
|
5244
|
+
}
|
|
5245
|
+
} catch (err) {
|
|
5246
|
+
logger.error(`.mcp.json could not be parsed: ${err.message}`);
|
|
5247
|
+
}
|
|
5248
|
+
}
|
|
5249
|
+
const statuses = inspectFiles(templateDir, targetDir).filter(
|
|
5250
|
+
(s) => s.name !== ".mcp.json"
|
|
5251
|
+
);
|
|
5252
|
+
for (const s of statuses) {
|
|
5253
|
+
if (!s.exists) {
|
|
5254
|
+
logger.warning(`${s.name} missing`);
|
|
5255
|
+
} else if (!s.identical) {
|
|
5256
|
+
logger.warning(`${s.name} is out of date \u2014 run \`onexthm mcp upgrade\``);
|
|
5257
|
+
} else {
|
|
5258
|
+
logger.success(`${s.name} up to date`);
|
|
5259
|
+
}
|
|
5260
|
+
}
|
|
5261
|
+
const registryPath = path9__default.default.join(targetDir, "sections-registry.ts");
|
|
5262
|
+
if (fs__default.default.existsSync(registryPath)) {
|
|
5263
|
+
logger.success("sections-registry.ts present");
|
|
5264
|
+
} else {
|
|
5265
|
+
logger.warning(
|
|
5266
|
+
"sections-registry.ts missing \u2014 section tools won't auto-register"
|
|
5267
|
+
);
|
|
5268
|
+
}
|
|
5269
|
+
}
|
|
5270
|
+
|
|
5059
5271
|
// src/cli.ts
|
|
5060
5272
|
dotenv__default.default.config({
|
|
5061
5273
|
path: path9__default.default.join(process.cwd(), ".env.local"),
|
|
@@ -5121,6 +5333,14 @@ program.command("config").description("Configure OneX CLI credentials (AWS, API
|
|
|
5121
5333
|
program.command("login").description("Login to OneX platform").action(loginCommand);
|
|
5122
5334
|
program.command("logout").description("Logout from OneX platform").action(logoutCommand);
|
|
5123
5335
|
program.command("whoami").description("Show current logged-in developer").action(whoamiCommand);
|
|
5336
|
+
var mcpCmd = program.command("mcp").description("Manage MCP server registration and AI-context files");
|
|
5337
|
+
mcpCmd.command("setup").description(
|
|
5338
|
+
"Install .mcp.json + CLAUDE.md + AGENTS.md + .cursorrules into the current theme"
|
|
5339
|
+
).option("-y, --yes", "Skip confirmation prompts").action(mcpSetupCommand);
|
|
5340
|
+
mcpCmd.command("upgrade").description(
|
|
5341
|
+
"Refresh AI-context files to the latest version from the bundled template"
|
|
5342
|
+
).option("-y, --yes", "Skip confirmation prompts").action(mcpUpgradeCommand);
|
|
5343
|
+
mcpCmd.command("doctor").description("Diagnose MCP setup in the current theme directory").action(mcpDoctorCommand);
|
|
5124
5344
|
program.command("publish").description("Build, scan, and publish theme to marketplace (requires login)").option("-t, --theme <path>", "Theme directory path").option(
|
|
5125
5345
|
"--bump <type>",
|
|
5126
5346
|
"Auto-bump version before publish (patch|minor|major)"
|