@taptap/instant-games-open-mcp 1.23.3 → 1.23.5
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/README.md +16 -3
- package/dist/maker.js +396 -41
- package/dist/proxy.js +1 -1
- package/dist/server.js +97 -85
- package/package.json +1 -1
- package/skills/taptap-maker-dev-kit-guide/SKILL.md +4 -1
- package/skills/taptap-maker-local/SKILL.md +39 -6
package/dist/maker.js
CHANGED
|
@@ -29334,9 +29334,132 @@ async function readMakerProjectLocalChanges(cwd) {
|
|
|
29334
29334
|
ahead: unpushed.ahead
|
|
29335
29335
|
};
|
|
29336
29336
|
}
|
|
29337
|
+
async function inspectMakerRemoteSyncStatus(cwd) {
|
|
29338
|
+
ensureGitAvailable();
|
|
29339
|
+
const { projectRoot } = resolveUsableMakerGitWorkspace(cwd);
|
|
29340
|
+
const branch = await currentBranch(projectRoot);
|
|
29341
|
+
const remoteRef = `origin/${branch}`;
|
|
29342
|
+
const rawStatus = await readGit(["status", "--porcelain", "-z"], projectRoot);
|
|
29343
|
+
const localChanges = parseGitStatusFiles(rawStatus).filter(
|
|
29344
|
+
(file2) => !isIgnoredBuildGuardChange(file2)
|
|
29345
|
+
);
|
|
29346
|
+
const hasLocalChanges = localChanges.length > 0;
|
|
29347
|
+
if (branch !== "main") {
|
|
29348
|
+
return {
|
|
29349
|
+
projectRoot,
|
|
29350
|
+
branch,
|
|
29351
|
+
remoteRef,
|
|
29352
|
+
status: "branch_not_allowed",
|
|
29353
|
+
hasLocalChanges,
|
|
29354
|
+
localChangeCount: localChanges.length,
|
|
29355
|
+
localChanges,
|
|
29356
|
+
aheadCount: 0,
|
|
29357
|
+
behindCount: 0,
|
|
29358
|
+
nextAction: "Maker 远端只接受 main 分支。开发或提交前请切回 main;如果当前分支已有本地提交,先让本地 AI 确认工作区状态,再把提交迁移到 main 后继续。"
|
|
29359
|
+
};
|
|
29360
|
+
}
|
|
29361
|
+
try {
|
|
29362
|
+
await runGitWithTransientRetry(["fetch", "origin"], {
|
|
29363
|
+
cwd: projectRoot
|
|
29364
|
+
});
|
|
29365
|
+
} catch (error2) {
|
|
29366
|
+
const failure = toMakerGitFailure(error2, "fetch");
|
|
29367
|
+
return {
|
|
29368
|
+
projectRoot,
|
|
29369
|
+
branch,
|
|
29370
|
+
remoteRef,
|
|
29371
|
+
status: "remote_unavailable",
|
|
29372
|
+
hasLocalChanges,
|
|
29373
|
+
localChangeCount: localChanges.length,
|
|
29374
|
+
localChanges,
|
|
29375
|
+
aheadCount: 0,
|
|
29376
|
+
behindCount: 0,
|
|
29377
|
+
failure,
|
|
29378
|
+
nextAction: getMakerRemoteSyncFailureNextAction(failure)
|
|
29379
|
+
};
|
|
29380
|
+
}
|
|
29381
|
+
const counts = await readRemoteAheadBehindCounts(projectRoot, remoteRef);
|
|
29382
|
+
if (!counts) {
|
|
29383
|
+
return {
|
|
29384
|
+
projectRoot,
|
|
29385
|
+
branch,
|
|
29386
|
+
remoteRef,
|
|
29387
|
+
status: "remote_missing",
|
|
29388
|
+
hasLocalChanges,
|
|
29389
|
+
localChangeCount: localChanges.length,
|
|
29390
|
+
localChanges,
|
|
29391
|
+
aheadCount: 0,
|
|
29392
|
+
behindCount: 0,
|
|
29393
|
+
nextAction: "未找到 origin/main。请先确认当前目录是否是完整 Maker clone;不要新建分支或手动 git push,必要时重新执行 taptap-maker init。"
|
|
29394
|
+
};
|
|
29395
|
+
}
|
|
29396
|
+
return {
|
|
29397
|
+
projectRoot,
|
|
29398
|
+
branch,
|
|
29399
|
+
remoteRef,
|
|
29400
|
+
status: classifyRemoteSyncStatus(counts.aheadCount, counts.behindCount),
|
|
29401
|
+
hasLocalChanges,
|
|
29402
|
+
localChangeCount: localChanges.length,
|
|
29403
|
+
localChanges,
|
|
29404
|
+
aheadCount: counts.aheadCount,
|
|
29405
|
+
behindCount: counts.behindCount,
|
|
29406
|
+
nextAction: nextActionForRemoteSync({
|
|
29407
|
+
aheadCount: counts.aheadCount,
|
|
29408
|
+
behindCount: counts.behindCount,
|
|
29409
|
+
hasLocalChanges,
|
|
29410
|
+
branch
|
|
29411
|
+
})
|
|
29412
|
+
};
|
|
29413
|
+
}
|
|
29414
|
+
function getMakerRemoteSyncFailureNextAction(failure) {
|
|
29415
|
+
if (failure.classification === "auth") {
|
|
29416
|
+
return "暂时无法检查 Maker 远端是否有新提交:Git 鉴权失败。请先运行 `taptap-maker pat set` 并粘贴新的 Maker PAT 后,再重新读取 maker://status。";
|
|
29417
|
+
}
|
|
29418
|
+
return "暂时无法检查 Maker 远端是否有新提交。请把 failure 信息反馈给用户;如果只是 503、5xx、超时或网络中断,可稍后重新读取 maker://status。";
|
|
29419
|
+
}
|
|
29337
29420
|
function isIgnoredBuildGuardChange(file2) {
|
|
29338
29421
|
return file2 === ".gitignore" || file2 === ".maker-mcp" || file2.startsWith(".maker-mcp/");
|
|
29339
29422
|
}
|
|
29423
|
+
async function readRemoteAheadBehindCounts(cwd, remoteRef) {
|
|
29424
|
+
try {
|
|
29425
|
+
await readGit(["rev-parse", "--verify", remoteRef], cwd);
|
|
29426
|
+
const text = await readGit(["rev-list", "--left-right", "--count", `HEAD...${remoteRef}`], cwd);
|
|
29427
|
+
const [aheadText, behindText] = text.trim().split(/\s+/);
|
|
29428
|
+
return {
|
|
29429
|
+
aheadCount: Number.parseInt(aheadText || "0", 10) || 0,
|
|
29430
|
+
behindCount: Number.parseInt(behindText || "0", 10) || 0
|
|
29431
|
+
};
|
|
29432
|
+
} catch {
|
|
29433
|
+
return void 0;
|
|
29434
|
+
}
|
|
29435
|
+
}
|
|
29436
|
+
function classifyRemoteSyncStatus(aheadCount, behindCount) {
|
|
29437
|
+
if (aheadCount > 0 && behindCount > 0) {
|
|
29438
|
+
return "diverged";
|
|
29439
|
+
}
|
|
29440
|
+
if (behindCount > 0) {
|
|
29441
|
+
return "needs_pull";
|
|
29442
|
+
}
|
|
29443
|
+
if (aheadCount > 0) {
|
|
29444
|
+
return "ahead";
|
|
29445
|
+
}
|
|
29446
|
+
return "up_to_date";
|
|
29447
|
+
}
|
|
29448
|
+
function nextActionForRemoteSync(input2) {
|
|
29449
|
+
if (input2.aheadCount > 0 && input2.behindCount > 0) {
|
|
29450
|
+
return `本地和远端都已有新提交(本地 ahead ${input2.aheadCount},远端 behind ${input2.behindCount})。不要直接 push 或无脑 pull;请让本地 AI 先检查 git status,再选择 rebase 或 merge 当前 Maker 远端变更。`;
|
|
29451
|
+
}
|
|
29452
|
+
if (input2.behindCount > 0) {
|
|
29453
|
+
if (input2.hasLocalChanges) {
|
|
29454
|
+
return `Maker 远端有 ${input2.behindCount} 个新提交,但本地有未提交改动。不要直接 pull;请让本地 AI 先查看 git status,然后由用户选择:先提交当前改动、stash 后 pull 再恢复,或暂时取消同步。`;
|
|
29455
|
+
}
|
|
29456
|
+
return `Maker 远端有 ${input2.behindCount} 个新提交,且本地工作区干净。可以让本地 AI 执行 git pull --ff-only origin ${input2.branch} 后再开始修改。`;
|
|
29457
|
+
}
|
|
29458
|
+
if (input2.aheadCount > 0) {
|
|
29459
|
+
return `本地已有 ${input2.aheadCount} 个未推送提交。构建或提交时请继续使用 maker_build_current_directory,不要手动执行通用 git push。`;
|
|
29460
|
+
}
|
|
29461
|
+
return "本地 main 与 Maker 远端 main 已同步,可以继续开发。";
|
|
29462
|
+
}
|
|
29340
29463
|
function ensureTargetCanBindApp(target, appId) {
|
|
29341
29464
|
const existingConfig = loadProjectConfig(target);
|
|
29342
29465
|
if (!(existingConfig == null ? void 0 : existingConfig.project_id) || existingConfig.project_id === appId) {
|
|
@@ -29454,6 +29577,12 @@ function classifyGitFailure(message) {
|
|
|
29454
29577
|
)) {
|
|
29455
29578
|
return "git_missing";
|
|
29456
29579
|
}
|
|
29580
|
+
if (/only refs\/heads\/main is accepted/i.test(message)) {
|
|
29581
|
+
return "branch_not_allowed";
|
|
29582
|
+
}
|
|
29583
|
+
if (/matches forbidden pattern|forbidden pattern/i.test(message)) {
|
|
29584
|
+
return "forbidden_path";
|
|
29585
|
+
}
|
|
29457
29586
|
if (/authentication|authorization|401|403|forbidden|unauthorized|could not read username|repository not found/i.test(
|
|
29458
29587
|
message
|
|
29459
29588
|
)) {
|
|
@@ -29496,7 +29625,7 @@ function getMakerGitRetryDecision(message) {
|
|
|
29496
29625
|
return { retry: false };
|
|
29497
29626
|
}
|
|
29498
29627
|
function isNonRetryableGitFailure(message) {
|
|
29499
|
-
return /authentication|authorization|401|403|forbidden|unauthorized|could not read username|repository not found|not a git repository|not empty|already exists and is not an empty directory|permission denied|Operation not permitted|non-fast-forward|fetch first|rejected|failed to push some refs|would be overwritten|conflicting local files/i.test(
|
|
29628
|
+
return /authentication|authorization|401|403|forbidden|unauthorized|could not read username|repository not found|only refs\/heads\/main is accepted|matches forbidden pattern|forbidden pattern|not a git repository|not empty|already exists and is not an empty directory|permission denied|Operation not permitted|non-fast-forward|fetch first|rejected|failed to push some refs|would be overwritten|conflicting local files/i.test(
|
|
29500
29629
|
message
|
|
29501
29630
|
);
|
|
29502
29631
|
}
|
|
@@ -29508,6 +29637,10 @@ function nextActionForFailure(classification) {
|
|
|
29508
29637
|
return "运行 `taptap-maker pat set` 并粘贴新的 Maker PAT 后,再重试 maker_build_current_directory;如果仍失败,请确认 PAT 是否过期或缺少 Maker git 权限。";
|
|
29509
29638
|
case "remote_transient":
|
|
29510
29639
|
return "远端 Maker git 服务临时不可用。本地 commit 会保留;不要手动执行通用 git push,稍后直接重试 maker_build_current_directory。";
|
|
29640
|
+
case "branch_not_allowed":
|
|
29641
|
+
return "Maker 远端只接受 main 分支提交。当前本地 commit 已保留但未推送;不要 pull/rebase、不要新建分支、不要手动执行通用 git push。请先确认工作区无未提交改动,切回 main 分支(必要时从 origin/main 创建 main),把这次本地 commit cherry-pick 到 main 后,再重试 maker_build_current_directory。";
|
|
29642
|
+
case "forbidden_path":
|
|
29643
|
+
return "本地 commit 包含 Maker 远端禁止提交的路径或目录。远端 pre-receive hook 已返回具体 forbidden pattern;这不是鉴权问题,不要刷新 Maker PAT。请按 stderr 中的 pattern 找到对应文件,把这些路径从本地 commit 移除(例如保留工作区文件但取消跟踪后修正当前未推送 commit),确认 git status 不再包含这些路径后,再重试 maker_build_current_directory。";
|
|
29511
29644
|
case "remote_rejected":
|
|
29512
29645
|
return "远端已有新提交。不要新建分支、不要要任务号、不要手动执行通用 git push;先询问用户是否 pull/rebase 当前 Maker 远端变更,再重试 maker_build_current_directory。";
|
|
29513
29646
|
case "local":
|
|
@@ -30334,7 +30467,7 @@ function getBundledSkillSourceDir(skillName) {
|
|
|
30334
30467
|
}
|
|
30335
30468
|
|
|
30336
30469
|
// src/maker/server/mcp.ts
|
|
30337
|
-
var VERSION = true ? "1.23.
|
|
30470
|
+
var VERSION = true ? "1.23.5" : "dev";
|
|
30338
30471
|
var DEFAULT_PROXY_PACKAGE = "@taptap/instant-games-open-mcp@1.22.0";
|
|
30339
30472
|
var DEFAULT_BUILD_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
30340
30473
|
var LONG_OPERATION_HEARTBEAT_MS = 3 * 60 * 1e3;
|
|
@@ -30357,6 +30490,10 @@ var tools = [
|
|
|
30357
30490
|
target_dir: {
|
|
30358
30491
|
type: "string",
|
|
30359
30492
|
description: "Optional user current working directory to inspect. Use when the MCP process cwd differs from the user project CWD."
|
|
30493
|
+
},
|
|
30494
|
+
skip_remote_sync: {
|
|
30495
|
+
type: "boolean",
|
|
30496
|
+
description: "If true, skip git fetch/ahead-behind remote sync checks. Use this for frequent polling or quick local status checks."
|
|
30360
30497
|
}
|
|
30361
30498
|
}
|
|
30362
30499
|
}
|
|
@@ -30470,7 +30607,8 @@ async function startMakerMcpServer() {
|
|
|
30470
30607
|
{
|
|
30471
30608
|
type: "text",
|
|
30472
30609
|
text: await formatStatus({
|
|
30473
|
-
targetDir: args.target_dir
|
|
30610
|
+
targetDir: args.target_dir,
|
|
30611
|
+
skipRemoteSync: args.skip_remote_sync
|
|
30474
30612
|
})
|
|
30475
30613
|
}
|
|
30476
30614
|
]
|
|
@@ -30536,6 +30674,7 @@ async function formatStatus(options = {}) {
|
|
|
30536
30674
|
const targetDir = resolveMakerToolTargetDir(options.targetDir);
|
|
30537
30675
|
const identify = identifyMakerProject({ cwd: targetDir });
|
|
30538
30676
|
const gitDirectoryStatus = inspectMakerDirectoryGitStatus(targetDir);
|
|
30677
|
+
const remoteSyncText = identify.projectRoot && gitDirectoryStatus.isUsableMakerGitRepo && !options.skipRemoteSync ? await formatMakerRemoteSyncStatusSafely(identify.projectRoot) : identify.projectRoot && gitDirectoryStatus.isUsableMakerGitRepo ? formatMakerRemoteSyncSkipped() : "";
|
|
30539
30678
|
const pat = loadPat();
|
|
30540
30679
|
let tapAuth = loadTapAuth();
|
|
30541
30680
|
const makerPatTokensUrl = getMakerPatTokensUrl();
|
|
@@ -30581,6 +30720,8 @@ async function formatStatus(options = {}) {
|
|
|
30581
30720
|
"",
|
|
30582
30721
|
formatMakerGitDirectoryStatus(gitDirectoryStatus),
|
|
30583
30722
|
"",
|
|
30723
|
+
remoteSyncText,
|
|
30724
|
+
"",
|
|
30584
30725
|
pat ? "" : ["Auth next step", "", `Maker PAT 缺失。PAT 页面:${makerPatTokensUrl}`].join("\n"),
|
|
30585
30726
|
"",
|
|
30586
30727
|
tapAuthRefreshText,
|
|
@@ -30592,6 +30733,59 @@ async function formatStatus(options = {}) {
|
|
|
30592
30733
|
projectSection
|
|
30593
30734
|
].filter(Boolean).join("\n");
|
|
30594
30735
|
}
|
|
30736
|
+
function formatMakerRemoteSyncSkipped() {
|
|
30737
|
+
return [
|
|
30738
|
+
"Maker remote sync",
|
|
30739
|
+
"",
|
|
30740
|
+
"- status: skipped",
|
|
30741
|
+
"- next_action: 已跳过远端同步检查;如需确认是否需要 pull,请重新读取 maker_status_lite 且不要设置 skip_remote_sync。"
|
|
30742
|
+
].join("\n");
|
|
30743
|
+
}
|
|
30744
|
+
async function formatMakerRemoteSyncStatus(projectRoot) {
|
|
30745
|
+
const status = await inspectMakerRemoteSyncStatus(projectRoot);
|
|
30746
|
+
return formatMakerRemoteSyncStatusLines(status).join("\n");
|
|
30747
|
+
}
|
|
30748
|
+
async function formatMakerRemoteSyncStatusSafely(projectRoot) {
|
|
30749
|
+
try {
|
|
30750
|
+
return await formatMakerRemoteSyncStatus(projectRoot);
|
|
30751
|
+
} catch (error2) {
|
|
30752
|
+
return formatMakerRemoteSyncUnavailable(error2);
|
|
30753
|
+
}
|
|
30754
|
+
}
|
|
30755
|
+
function formatMakerRemoteSyncUnavailable(error2) {
|
|
30756
|
+
const message = error2 instanceof Error ? error2.message : String(error2);
|
|
30757
|
+
return [
|
|
30758
|
+
"Maker remote sync",
|
|
30759
|
+
"",
|
|
30760
|
+
"- status: unavailable",
|
|
30761
|
+
`- failure_name: ${error2 instanceof Error ? error2.name : typeof error2}`,
|
|
30762
|
+
`- failure_message: ${message}`,
|
|
30763
|
+
"- next_action: 远端同步检查失败;本地状态仍可继续查看。请稍后重试 maker_status_lite,频繁轮询时可设置 skip_remote_sync=true。"
|
|
30764
|
+
].join("\n");
|
|
30765
|
+
}
|
|
30766
|
+
function formatMakerRemoteSyncStatusLines(status) {
|
|
30767
|
+
var _a2, _b, _c;
|
|
30768
|
+
const localPreview = status.localChanges.slice(0, 10);
|
|
30769
|
+
return [
|
|
30770
|
+
"Maker remote sync",
|
|
30771
|
+
"",
|
|
30772
|
+
`- status: ${status.status}`,
|
|
30773
|
+
`- branch: ${status.branch}`,
|
|
30774
|
+
`- remote_ref: ${status.remoteRef}`,
|
|
30775
|
+
`- ahead: ${status.aheadCount}`,
|
|
30776
|
+
`- behind: ${status.behindCount}`,
|
|
30777
|
+
`- local_changes: ${status.hasLocalChanges ? "yes" : "no"}`,
|
|
30778
|
+
status.hasLocalChanges ? `- local_change_count: ${status.localChangeCount}` : "",
|
|
30779
|
+
...localPreview.map((file2) => ` - ${file2}`),
|
|
30780
|
+
status.localChanges.length > localPreview.length ? ` - ... ${status.localChanges.length - localPreview.length} more` : "",
|
|
30781
|
+
status.failure ? `- failure_classification: ${status.failure.classification}` : "",
|
|
30782
|
+
((_a2 = status.failure) == null ? void 0 : _a2.retryable) !== void 0 ? `- failure_retryable: ${status.failure.retryable ? "yes" : "no"}` : "",
|
|
30783
|
+
((_b = status.failure) == null ? void 0 : _b.retryReason) ? `- failure_retry_reason: ${status.failure.retryReason}` : "",
|
|
30784
|
+
((_c = status.failure) == null ? void 0 : _c.stderr) ? `- failure_stderr:
|
|
30785
|
+
${indent(status.failure.stderr)}` : "",
|
|
30786
|
+
`- next_action: ${status.nextAction}`
|
|
30787
|
+
].filter(Boolean);
|
|
30788
|
+
}
|
|
30595
30789
|
function formatMakerGitDirectoryStatus(status) {
|
|
30596
30790
|
return [
|
|
30597
30791
|
"Maker Git directory",
|
|
@@ -30658,9 +30852,9 @@ async function formatAutoProjectListFromPat() {
|
|
|
30658
30852
|
const projects = await listMakerProjects();
|
|
30659
30853
|
return [
|
|
30660
30854
|
"本地已有 Maker PAT,当前目录尚未绑定 Maker 项目。",
|
|
30661
|
-
"
|
|
30855
|
+
"当前目录未绑定时,先展示下面的 Maker Apps 预览和总数,避免长列表刷屏;选择、解释和 clone 顺序请参考 taptap-maker-local skill。",
|
|
30662
30856
|
"",
|
|
30663
|
-
|
|
30857
|
+
formatStatusProjectList(projects)
|
|
30664
30858
|
].join("\n");
|
|
30665
30859
|
} catch (error2) {
|
|
30666
30860
|
return [
|
|
@@ -30670,7 +30864,22 @@ async function formatAutoProjectListFromPat() {
|
|
|
30670
30864
|
].join("\n");
|
|
30671
30865
|
}
|
|
30672
30866
|
}
|
|
30673
|
-
|
|
30867
|
+
var MAKER_STATUS_PROJECT_TEXT_LIMIT = 40;
|
|
30868
|
+
function getStatusProjectActivityTime(project) {
|
|
30869
|
+
const value = project.lastConversationAt || project.lastAccessedAt || project.createdAt;
|
|
30870
|
+
if (!value) {
|
|
30871
|
+
return 0;
|
|
30872
|
+
}
|
|
30873
|
+
const time3 = Date.parse(value);
|
|
30874
|
+
return Number.isNaN(time3) ? 0 : time3;
|
|
30875
|
+
}
|
|
30876
|
+
function sortStatusProjectsByRecentActivity(projects) {
|
|
30877
|
+
return projects.map((project, index) => ({ project, index })).sort((left, right) => {
|
|
30878
|
+
const timeDiff = getStatusProjectActivityTime(right.project) - getStatusProjectActivityTime(left.project);
|
|
30879
|
+
return timeDiff || left.index - right.index;
|
|
30880
|
+
}).map(({ project }) => project);
|
|
30881
|
+
}
|
|
30882
|
+
function formatStatusProjectList(projects) {
|
|
30674
30883
|
if (projects.length === 0) {
|
|
30675
30884
|
return [
|
|
30676
30885
|
"No Maker apps found.",
|
|
@@ -30678,18 +30887,25 @@ function formatProjectList(projects) {
|
|
|
30678
30887
|
"请确认 Maker PAT 是否有效,或等待 Maker app list 接口对齐。"
|
|
30679
30888
|
].join("\n");
|
|
30680
30889
|
}
|
|
30890
|
+
const visibleProjects = sortStatusProjectsByRecentActivity(projects).slice(
|
|
30891
|
+
0,
|
|
30892
|
+
MAKER_STATUS_PROJECT_TEXT_LIMIT
|
|
30893
|
+
);
|
|
30894
|
+
const hiddenCount = projects.length - visibleProjects.length;
|
|
30681
30895
|
return [
|
|
30682
|
-
|
|
30896
|
+
`Maker apps (${projects.length})`,
|
|
30683
30897
|
"",
|
|
30684
|
-
|
|
30898
|
+
hiddenCount > 0 ? `为了保持友好的可读性,默认最多展示 ${visibleProjects.length} 个 app;如需完整列表,可以选择显示全部。` : "已显示全部 app;请询问用户选择。",
|
|
30899
|
+
hiddenCount > 0 ? "如需完整列表,请运行 taptap-maker apps --json 查看全部 app。" : void 0,
|
|
30900
|
+
"AI 展示建议:如果聊天或客户端宽度足够,可把 app 预览整理成两列紧凑布局;每个 app 保留序号、app_id、名称,以及可用的最近活跃时间或 user_id。窄屏保持单列。不要省略 app_id,也不要在用户确认前自动选择 app。",
|
|
30685
30901
|
"",
|
|
30686
|
-
...
|
|
30902
|
+
...visibleProjects.map(
|
|
30687
30903
|
(project, index) => `${index + 1}. ${project.id}${project.name ? ` ${project.name}` : ""}${project.user_id ? ` user_id=${project.user_id}` : ""}${project.gameType ? ` gameType=${project.gameType}` : ""}${project.stage ? ` stage=${project.stage}` : ""}${project.createdAt ? ` createdAt=${project.createdAt}` : ""}${project.lastConversationAt ? ` lastConversationAt=${project.lastConversationAt}` : ""}`
|
|
30688
30904
|
),
|
|
30689
30905
|
"",
|
|
30690
30906
|
"仅当当前目录未绑定且用户要初始化或 clone 时,才让用户选择 app 并继续 taptap-maker init。",
|
|
30691
30907
|
"如果当前目录已绑定 Maker 项目,这个列表仅作账号项目参考;请继续当前项目,除非用户明确要求切换或重新 clone。"
|
|
30692
|
-
].join("\n");
|
|
30908
|
+
].filter((line) => line !== void 0).join("\n");
|
|
30693
30909
|
}
|
|
30694
30910
|
function formatClonePartialStateLines(targetDir) {
|
|
30695
30911
|
const resolvedTargetDir = path7.resolve(targetDir);
|
|
@@ -30878,6 +31094,10 @@ function formatDuration(ms) {
|
|
|
30878
31094
|
}
|
|
30879
31095
|
return `${minutes}m ${seconds}s`;
|
|
30880
31096
|
}
|
|
31097
|
+
function formatMakerAppWebUrl(projectId, env) {
|
|
31098
|
+
const makerEnv = env === "rnd" || env === "production" ? env : void 0;
|
|
31099
|
+
return `${getMakerWebUrl(makerEnv)}/app/${encodeURIComponent(projectId)}`;
|
|
31100
|
+
}
|
|
30881
31101
|
async function buildCurrentDirectory(options) {
|
|
30882
31102
|
var _a2;
|
|
30883
31103
|
const localChanges = await readMakerProjectLocalChanges(options.targetDir);
|
|
@@ -30977,6 +31197,7 @@ async function runRemoteBuildCurrentDirectory(options, targetDir) {
|
|
|
30977
31197
|
projectPath: proxy.projectPath,
|
|
30978
31198
|
serverUrl: proxy.serverUrl,
|
|
30979
31199
|
env: proxy.env,
|
|
31200
|
+
makerUrl: formatMakerAppWebUrl(proxy.projectId, proxy.env),
|
|
30980
31201
|
timeoutMs,
|
|
30981
31202
|
buildArgs,
|
|
30982
31203
|
resultText: formatRemoteToolResult(result)
|
|
@@ -31105,6 +31326,7 @@ function formatBuildResult(result, progressSummary) {
|
|
|
31105
31326
|
"",
|
|
31106
31327
|
`- project_root: ${result.projectRoot}`,
|
|
31107
31328
|
`- project_id: ${result.projectId}`,
|
|
31329
|
+
`- maker_url: ${result.makerUrl || formatMakerAppWebUrl(result.projectId, result.env)}`,
|
|
31108
31330
|
`- project_path: ${result.projectPath}`,
|
|
31109
31331
|
`- server_url: ${result.serverUrl}`,
|
|
31110
31332
|
`- env: ${result.env}`
|
|
@@ -31132,9 +31354,21 @@ function formatPushRecoveryLines(submitResult) {
|
|
|
31132
31354
|
submitResult.ahead ? `- git_state: ${submitResult.ahead}` : "",
|
|
31133
31355
|
"- retry_tool: maker_build_current_directory",
|
|
31134
31356
|
"- do_not_use_generic_git_push: yes",
|
|
31135
|
-
|
|
31357
|
+
`- user_message: ${pushRecoveryUserMessage(submitResult.failure)}`
|
|
31136
31358
|
].filter(Boolean);
|
|
31137
31359
|
}
|
|
31360
|
+
function pushRecoveryUserMessage(failure) {
|
|
31361
|
+
switch (failure == null ? void 0 : failure.classification) {
|
|
31362
|
+
case "branch_not_allowed":
|
|
31363
|
+
return "本地提交已经保留,但 Maker 远端只接受 main 分支;请切回 main 并把本地提交迁移到 main 后,再重试 Maker 提交/构建工具。";
|
|
31364
|
+
case "forbidden_path":
|
|
31365
|
+
return "本地提交已经保留,但包含 Maker 远端禁止提交的路径或目录;请按 failure.stderr 中的 forbidden pattern 从未推送 commit 中移除这些路径,再重试 Maker 提交/构建工具。";
|
|
31366
|
+
case "remote_transient":
|
|
31367
|
+
return "本地提交已经保留,但还没推送到 Maker 远端;远端临时异常恢复后,直接重试 Maker 提交/构建工具即可。";
|
|
31368
|
+
default:
|
|
31369
|
+
return "本地提交已经保留,但还没推送到 Maker 远端;请先按 failure.next_action 修复原因,再重试 Maker 提交/构建工具。";
|
|
31370
|
+
}
|
|
31371
|
+
}
|
|
31138
31372
|
function formatMakerBuildFailureLines(failure) {
|
|
31139
31373
|
return [
|
|
31140
31374
|
"build_failure:",
|
|
@@ -31228,6 +31462,7 @@ var BOOLEAN_OPTIONS = /* @__PURE__ */ new Set([
|
|
|
31228
31462
|
"skip_mcp_install",
|
|
31229
31463
|
"pat_stdin",
|
|
31230
31464
|
"pat_from_stdin",
|
|
31465
|
+
"all",
|
|
31231
31466
|
"h",
|
|
31232
31467
|
"help"
|
|
31233
31468
|
]);
|
|
@@ -31434,20 +31669,22 @@ async function runDoctor(parsed, ctx) {
|
|
|
31434
31669
|
);
|
|
31435
31670
|
}
|
|
31436
31671
|
async function runApps(parsed, ctx) {
|
|
31672
|
+
rejectRemovedAppsPaginationOptions(parsed);
|
|
31437
31673
|
const pat = stringOption(parsed, "pat");
|
|
31438
31674
|
if (pat) {
|
|
31439
31675
|
warnPatArgExposure();
|
|
31440
31676
|
}
|
|
31677
|
+
const showAll = booleanOption(parsed, "all");
|
|
31441
31678
|
const projects = await listMakerProjects({ pat });
|
|
31442
31679
|
if (ctx.json) {
|
|
31443
31680
|
writeJson(projects);
|
|
31444
31681
|
return;
|
|
31445
31682
|
}
|
|
31446
|
-
process.stdout.write(`${
|
|
31683
|
+
process.stdout.write(`${formatMakerProjectList(projects, { showAll })}
|
|
31447
31684
|
`);
|
|
31448
31685
|
}
|
|
31449
31686
|
async function runPatSet(parsed, ctx) {
|
|
31450
|
-
const pat = await resolvePatSet(parsed);
|
|
31687
|
+
const pat = await resolvePatSet(parsed, ctx);
|
|
31451
31688
|
saveManualMakerPat(pat);
|
|
31452
31689
|
const tapAuth = await requestTapAuthWithPat(pat);
|
|
31453
31690
|
emit(ctx, "pat", "Maker PAT and TapTap token saved", {
|
|
@@ -31456,7 +31693,7 @@ async function runPatSet(parsed, ctx) {
|
|
|
31456
31693
|
kid: mask(tapAuth.kid)
|
|
31457
31694
|
});
|
|
31458
31695
|
}
|
|
31459
|
-
async function resolvePatSet(parsed) {
|
|
31696
|
+
async function resolvePatSet(parsed, ctx) {
|
|
31460
31697
|
if (booleanOption(parsed, "pat_stdin") || booleanOption(parsed, "pat_from_stdin")) {
|
|
31461
31698
|
const pat = fs7.readFileSync(0, "utf8").trim();
|
|
31462
31699
|
if (!pat) {
|
|
@@ -31470,6 +31707,10 @@ async function resolvePatSet(parsed) {
|
|
|
31470
31707
|
warnPatArgExposure();
|
|
31471
31708
|
return fromPositional || fromOption;
|
|
31472
31709
|
}
|
|
31710
|
+
if (!ctx.json) {
|
|
31711
|
+
process.stdout.write(`Create one at: ${getMakerPatTokensUrl(makerEnvOption(parsed))}
|
|
31712
|
+
`);
|
|
31713
|
+
}
|
|
31473
31714
|
return promptRequired("PAT");
|
|
31474
31715
|
}
|
|
31475
31716
|
async function runMcpInstall(parsed, ctx) {
|
|
@@ -31495,15 +31736,22 @@ async function runMcpVerify(parsed, ctx) {
|
|
|
31495
31736
|
const result = spawnSync4(command.command, [...command.args, "help"], {
|
|
31496
31737
|
encoding: "utf8"
|
|
31497
31738
|
});
|
|
31739
|
+
const failureType = classifyMcpVerifyFailure(result);
|
|
31740
|
+
const commandText = formatShellCommand([command.command, ...command.args, "help"]);
|
|
31498
31741
|
const payload = {
|
|
31499
31742
|
mode,
|
|
31500
31743
|
package: mode === "npx" ? pkg : void 0,
|
|
31501
|
-
command:
|
|
31744
|
+
command: commandText,
|
|
31502
31745
|
status: result.status,
|
|
31746
|
+
signal: result.signal,
|
|
31503
31747
|
ok: result.status === 0,
|
|
31504
31748
|
stdout: result.stdout,
|
|
31505
31749
|
stderr: result.stderr,
|
|
31506
|
-
error: (_a2 = result.error) == null ? void 0 : _a2.message
|
|
31750
|
+
error: (_a2 = result.error) == null ? void 0 : _a2.message,
|
|
31751
|
+
failure_type: failureType,
|
|
31752
|
+
explanation: failureType ? getMcpVerifyFailureExplanation(mode, failureType) : void 0,
|
|
31753
|
+
next_steps: failureType ? getMcpVerifyNextSteps(mode, commandText) : void 0,
|
|
31754
|
+
is_maker_mcp_started: false
|
|
31507
31755
|
};
|
|
31508
31756
|
if (ctx.json) {
|
|
31509
31757
|
writeJson(payload);
|
|
@@ -31511,18 +31759,68 @@ async function runMcpVerify(parsed, ctx) {
|
|
|
31511
31759
|
}
|
|
31512
31760
|
process.stdout.write(
|
|
31513
31761
|
[
|
|
31514
|
-
payload.ok ? "✓ MCP config command can spawn taptap-maker" : "✗ MCP config command
|
|
31762
|
+
payload.ok ? "✓ MCP config command can spawn taptap-maker" : "✗ MCP config command check failed before Maker MCP started",
|
|
31515
31763
|
`- mode: ${payload.mode}`,
|
|
31516
31764
|
`- command: ${payload.command}`,
|
|
31517
31765
|
mode === "npx" ? "- scope: verifies the npx command written by taptap-maker mcp install" : "- scope: verifies only the currently running CLI binary",
|
|
31518
31766
|
`- status: ${payload.status}`,
|
|
31767
|
+
payload.signal ? `- signal: ${payload.signal}` : "",
|
|
31768
|
+
payload.failure_type ? `- failure_type: ${payload.failure_type}` : "",
|
|
31769
|
+
payload.explanation ? `- explanation: ${payload.explanation}` : "",
|
|
31519
31770
|
payload.error ? `- error: ${payload.error}` : "",
|
|
31520
31771
|
payload.stderr ? `- stderr:
|
|
31521
31772
|
${indent2(payload.stderr)}` : "",
|
|
31773
|
+
payload.next_steps ? ["Next steps:", ...payload.next_steps.map((step, index) => `${index + 1}. ${step}`)].join(
|
|
31774
|
+
"\n"
|
|
31775
|
+
) : "",
|
|
31522
31776
|
""
|
|
31523
31777
|
].filter(Boolean).join("\n")
|
|
31524
31778
|
);
|
|
31525
31779
|
}
|
|
31780
|
+
function classifyMcpVerifyFailure(result) {
|
|
31781
|
+
if (result.status === 0) {
|
|
31782
|
+
return void 0;
|
|
31783
|
+
}
|
|
31784
|
+
if (result.error) {
|
|
31785
|
+
return "spawn_error";
|
|
31786
|
+
}
|
|
31787
|
+
if (result.signal) {
|
|
31788
|
+
return "signal";
|
|
31789
|
+
}
|
|
31790
|
+
if (typeof result.status === "number") {
|
|
31791
|
+
return "non_zero_exit";
|
|
31792
|
+
}
|
|
31793
|
+
return "unknown_no_status";
|
|
31794
|
+
}
|
|
31795
|
+
function getMcpVerifyFailureExplanation(mode, failureType) {
|
|
31796
|
+
if (mode === "self") {
|
|
31797
|
+
return [
|
|
31798
|
+
"The current taptap-maker CLI help command did not exit cleanly.",
|
|
31799
|
+
"This is a local CLI startup check, not a Maker MCP business error."
|
|
31800
|
+
].join(" ");
|
|
31801
|
+
}
|
|
31802
|
+
const base = "This is a local Node/npm/npx startup check, not a Maker MCP business error.";
|
|
31803
|
+
if (failureType === "non_zero_exit") {
|
|
31804
|
+
return `The configured npx command exited with a non-zero status. ${base}`;
|
|
31805
|
+
}
|
|
31806
|
+
if (failureType === "spawn_error") {
|
|
31807
|
+
return `The configured npx command could not be spawned. ${base}`;
|
|
31808
|
+
}
|
|
31809
|
+
if (failureType === "signal") {
|
|
31810
|
+
return `The configured npx command was terminated by a signal. ${base}`;
|
|
31811
|
+
}
|
|
31812
|
+
return `The configured npx command did not exit normally. ${base}`;
|
|
31813
|
+
}
|
|
31814
|
+
function getMcpVerifyNextSteps(mode, commandText) {
|
|
31815
|
+
if (mode === "self") {
|
|
31816
|
+
return ["Run `taptap-maker help` directly and inspect the printed error."];
|
|
31817
|
+
}
|
|
31818
|
+
return [
|
|
31819
|
+
`Run the command above directly: ${commandText}`,
|
|
31820
|
+
"Run `taptap-maker mcp verify --mode self` to verify the current CLI binary.",
|
|
31821
|
+
"If direct npx also fails, check `where.exe npx`, `where.exe node`, `where.exe npm`, `node -v`, and `npm -v`."
|
|
31822
|
+
];
|
|
31823
|
+
}
|
|
31526
31824
|
async function runDevKitUpdate(parsed, ctx) {
|
|
31527
31825
|
const targetDir = path8.resolve(stringOption(parsed, "target_dir") || process.cwd());
|
|
31528
31826
|
const result = await installAiDevKit({
|
|
@@ -31548,9 +31846,14 @@ async function resolvePat(parsed, ctx) {
|
|
|
31548
31846
|
`Maker PAT missing. Create one at ${getMakerPatTokensUrl(makerEnvOption(parsed))}`
|
|
31549
31847
|
);
|
|
31550
31848
|
}
|
|
31849
|
+
const patPage = getMakerPatTokensUrl(makerEnvOption(parsed));
|
|
31551
31850
|
emit(ctx, "pat_required", "Maker PAT is required", {
|
|
31552
|
-
pat_page:
|
|
31851
|
+
pat_page: patPage
|
|
31553
31852
|
});
|
|
31853
|
+
if (!ctx.json) {
|
|
31854
|
+
process.stdout.write(`Create one at: ${patPage}
|
|
31855
|
+
`);
|
|
31856
|
+
}
|
|
31554
31857
|
const pat = await promptRequired("Paste Maker PAT");
|
|
31555
31858
|
saveManualMakerPat(pat);
|
|
31556
31859
|
return pat;
|
|
@@ -31566,18 +31869,32 @@ async function resolveProjectSelection(parsed, projects, options) {
|
|
|
31566
31869
|
if (options.skipConfirm) {
|
|
31567
31870
|
throw new Error("Missing --app-id in non-interactive init mode.");
|
|
31568
31871
|
}
|
|
31569
|
-
|
|
31872
|
+
const orderedProjects = sortProjectsByRecentActivity(projects);
|
|
31873
|
+
let showAll = orderedProjects.length <= MAKER_PROJECT_DEFAULT_TEXT_LIMIT;
|
|
31874
|
+
for (; ; ) {
|
|
31875
|
+
process.stdout.write(`${formatMakerProjectList(orderedProjects, { showAll })}
|
|
31570
31876
|
`);
|
|
31571
|
-
|
|
31572
|
-
|
|
31573
|
-
|
|
31574
|
-
|
|
31575
|
-
|
|
31576
|
-
|
|
31577
|
-
|
|
31578
|
-
|
|
31877
|
+
const answer = await promptRequired("Choose app by index, app_id, or 'all' to show all");
|
|
31878
|
+
const normalized = answer.trim().toLowerCase();
|
|
31879
|
+
if (["a", "all"].includes(normalized)) {
|
|
31880
|
+
if (showAll) {
|
|
31881
|
+
process.stdout.write("Already showing all Maker apps.\n");
|
|
31882
|
+
} else {
|
|
31883
|
+
showAll = true;
|
|
31884
|
+
}
|
|
31885
|
+
continue;
|
|
31886
|
+
}
|
|
31887
|
+
const visibleCount = showAll ? orderedProjects.length : Math.min(MAKER_PROJECT_DEFAULT_TEXT_LIMIT, orderedProjects.length);
|
|
31888
|
+
const byIndex = Number(answer);
|
|
31889
|
+
if (Number.isInteger(byIndex) && byIndex >= 1 && byIndex <= visibleCount) {
|
|
31890
|
+
return orderedProjects[byIndex - 1];
|
|
31891
|
+
}
|
|
31892
|
+
const selected = projects.find((project) => project.id === answer.trim());
|
|
31893
|
+
if (!selected) {
|
|
31894
|
+
throw new Error(`Unknown Maker app selection: ${answer}`);
|
|
31895
|
+
}
|
|
31896
|
+
return selected;
|
|
31579
31897
|
}
|
|
31580
|
-
return selected;
|
|
31581
31898
|
}
|
|
31582
31899
|
async function prepareDevKit(targetDir, ctx) {
|
|
31583
31900
|
const before = inspectAiDevKit(targetDir);
|
|
@@ -31755,17 +32072,51 @@ function saveInitState(targetDir, state) {
|
|
|
31755
32072
|
"utf8"
|
|
31756
32073
|
);
|
|
31757
32074
|
}
|
|
31758
|
-
|
|
32075
|
+
var MAKER_PROJECT_DEFAULT_TEXT_LIMIT = 40;
|
|
32076
|
+
function getProjectActivityTime(project) {
|
|
32077
|
+
const value = project.lastConversationAt || project.lastAccessedAt || project.createdAt;
|
|
32078
|
+
if (!value) {
|
|
32079
|
+
return 0;
|
|
32080
|
+
}
|
|
32081
|
+
const time3 = Date.parse(value);
|
|
32082
|
+
return Number.isNaN(time3) ? 0 : time3;
|
|
32083
|
+
}
|
|
32084
|
+
function sortProjectsByRecentActivity(projects) {
|
|
32085
|
+
return projects.map((project, index) => ({ project, index })).sort((left, right) => {
|
|
32086
|
+
const timeDiff = getProjectActivityTime(right.project) - getProjectActivityTime(left.project);
|
|
32087
|
+
return timeDiff || left.index - right.index;
|
|
32088
|
+
}).map(({ project }) => project);
|
|
32089
|
+
}
|
|
32090
|
+
function formatProjectListItem(project, index) {
|
|
32091
|
+
const name = project.name || "(unnamed)";
|
|
32092
|
+
const lastActive = project.lastConversationAt || project.lastAccessedAt || project.createdAt;
|
|
32093
|
+
return `${index + 1}. ${name} id=${project.id}${lastActive ? ` last_active=${lastActive}` : ""}`;
|
|
32094
|
+
}
|
|
32095
|
+
function rejectRemovedAppsPaginationOptions(parsed) {
|
|
32096
|
+
const removed = ["limit", "offset"].filter((key) => parsed.options[key] !== void 0);
|
|
32097
|
+
if (removed.length === 0) {
|
|
32098
|
+
return;
|
|
32099
|
+
}
|
|
32100
|
+
throw new Error(
|
|
32101
|
+
`taptap-maker apps no longer supports ${removed.map((key) => `--${key}`).join(
|
|
32102
|
+
" / "
|
|
32103
|
+
)}. Use --all for the full human-readable list, or --json for the machine-readable output.`
|
|
32104
|
+
);
|
|
32105
|
+
}
|
|
32106
|
+
function formatMakerProjectList(projects, options = {}) {
|
|
31759
32107
|
if (projects.length === 0) {
|
|
31760
32108
|
return "No Maker apps found.";
|
|
31761
32109
|
}
|
|
32110
|
+
const sortedProjects = sortProjectsByRecentActivity(projects);
|
|
32111
|
+
const showAll = options.showAll === true;
|
|
32112
|
+
const visibleProjects = showAll ? sortedProjects : sortedProjects.slice(0, MAKER_PROJECT_DEFAULT_TEXT_LIMIT);
|
|
32113
|
+
const hiddenCount = sortedProjects.length - visibleProjects.length;
|
|
31762
32114
|
return [
|
|
31763
32115
|
`Maker apps (${projects.length})`,
|
|
32116
|
+
hiddenCount > 0 ? `Showing ${visibleProjects.length} most recently active apps, sorted by last activity. ${hiddenCount} more hidden. Run \`taptap-maker apps --all\` to show all, or use \`--json\` for the complete machine-readable list.` : `Showing all ${visibleProjects.length} Maker apps, sorted by last activity.`,
|
|
31764
32117
|
"",
|
|
31765
|
-
...
|
|
31766
|
-
|
|
31767
|
-
)
|
|
31768
|
-
].join("\n");
|
|
32118
|
+
...visibleProjects.map((project, index) => formatProjectListItem(project, index))
|
|
32119
|
+
].filter((line) => line !== "").join("\n");
|
|
31769
32120
|
}
|
|
31770
32121
|
function emit(ctx, step, message, data) {
|
|
31771
32122
|
if (ctx.json) {
|
|
@@ -31867,9 +32218,10 @@ function printHelp() {
|
|
|
31867
32218
|
" taptap-maker Start MCP server mode",
|
|
31868
32219
|
" taptap-maker init [--env rnd|production] [--app-id ID] [--target-dir DIR] [--pat PAT]",
|
|
31869
32220
|
" [--skip-confirm] [--skip-mcp-install] [--register-mcp codex,cursor,claude]",
|
|
31870
|
-
" [--
|
|
32221
|
+
" [--json]",
|
|
31871
32222
|
" taptap-maker doctor [--target-dir DIR] [--env rnd|production] [--json]",
|
|
31872
|
-
" taptap-maker apps [--pat PAT] [--json]
|
|
32223
|
+
" taptap-maker apps [--pat PAT] [--all] [--json]",
|
|
32224
|
+
" # --pat warns: PAT appears in ps/history",
|
|
31873
32225
|
" taptap-maker pat set [--pat-stdin] [--json]",
|
|
31874
32226
|
" taptap-maker pat set [PAT|--pat PAT] [--json] # warns: PAT appears in ps/history",
|
|
31875
32227
|
" taptap-maker mcp install [--ide codex,cursor,claude] [--env rnd|production]",
|
|
@@ -31879,6 +32231,7 @@ function printHelp() {
|
|
|
31879
32231
|
" taptap-maker dev-kit update [--target-dir DIR] [--json]",
|
|
31880
32232
|
"",
|
|
31881
32233
|
"MCP verify defaults to the npx command written into AI client config.",
|
|
32234
|
+
"Advanced: init and mcp install accept --package only when testing a different npm package.",
|
|
31882
32235
|
"",
|
|
31883
32236
|
"Windows note:",
|
|
31884
32237
|
" Generated MCP configs use npx.cmd automatically on Windows.",
|
|
@@ -31977,21 +32330,23 @@ function printHelp2() {
|
|
|
31977
32330
|
" taptap-maker Start MCP server mode",
|
|
31978
32331
|
" taptap-maker init [--env rnd|production] [--app-id ID] [--target-dir DIR] [--pat PAT]",
|
|
31979
32332
|
" [--skip-confirm] [--skip-mcp-install] [--register-mcp codex,cursor,claude]",
|
|
31980
|
-
" [--
|
|
32333
|
+
" [--json]",
|
|
31981
32334
|
" taptap-maker doctor [--target-dir DIR] [--env rnd|production] [--json]",
|
|
31982
|
-
" taptap-maker apps [--pat PAT] [--json]",
|
|
32335
|
+
" taptap-maker apps [--pat PAT] [--all] [--json]",
|
|
32336
|
+
" # --pat warns: PAT appears in ps/history",
|
|
31983
32337
|
" taptap-maker pat set [--pat-stdin] [--json]",
|
|
31984
32338
|
" taptap-maker pat set [PAT|--pat PAT] [--json] # warns: PAT appears in ps/history",
|
|
31985
32339
|
" taptap-maker mcp install [--ide codex,cursor,claude] [--env rnd|production]",
|
|
31986
32340
|
" [--package @taptap/instant-games-open-mcp] [--json]",
|
|
31987
|
-
" taptap-maker mcp verify
|
|
32341
|
+
" taptap-maker mcp verify [--package @taptap/instant-games-open-mcp]",
|
|
32342
|
+
" [--mode npx|self] [--json]",
|
|
31988
32343
|
" taptap-maker dev-kit update [--target-dir DIR] [--json]",
|
|
31989
|
-
"
|
|
32344
|
+
"",
|
|
32345
|
+
"MCP verify defaults to the npx command written into AI client config.",
|
|
32346
|
+
"Advanced: init and mcp install accept --package only when testing a different npm package.",
|
|
31990
32347
|
"",
|
|
31991
32348
|
"Windows note:",
|
|
31992
32349
|
" Generated MCP configs use npx.cmd automatically on Windows.",
|
|
31993
|
-
"",
|
|
31994
|
-
"MCP server mode is still used by AI clients after configuration reload.",
|
|
31995
32350
|
""
|
|
31996
32351
|
].join("\n")
|
|
31997
32352
|
);
|