@taptap/instant-games-open-mcp 1.23.3 → 1.23.4
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 +417 -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 +37 -5
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.4" : "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} 个;其余 ${hiddenCount} 个请不要逐条刷屏。` : "已按最近活跃排序展示全部 app;请询问用户选择。",
|
|
30899
|
+
hiddenCount > 0 ? "如果用户没有看到目标 app,请提示可以继续查看更多:在 taptap-maker init 交互中输入 next,或运行 taptap-maker apps --offset 40 --limit 40;也可以让用户提供 app_id,或运行 taptap-maker apps --json 做机器可读查询。" : 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:",
|
|
@@ -31438,16 +31672,18 @@ async function runApps(parsed, ctx) {
|
|
|
31438
31672
|
if (pat) {
|
|
31439
31673
|
warnPatArgExposure();
|
|
31440
31674
|
}
|
|
31675
|
+
const limit = numberOption(parsed, "limit");
|
|
31676
|
+
const offset = numberOption(parsed, "offset");
|
|
31441
31677
|
const projects = await listMakerProjects({ pat });
|
|
31442
31678
|
if (ctx.json) {
|
|
31443
31679
|
writeJson(projects);
|
|
31444
31680
|
return;
|
|
31445
31681
|
}
|
|
31446
|
-
process.stdout.write(`${
|
|
31682
|
+
process.stdout.write(`${formatMakerProjectList(projects, { limit, offset })}
|
|
31447
31683
|
`);
|
|
31448
31684
|
}
|
|
31449
31685
|
async function runPatSet(parsed, ctx) {
|
|
31450
|
-
const pat = await resolvePatSet(parsed);
|
|
31686
|
+
const pat = await resolvePatSet(parsed, ctx);
|
|
31451
31687
|
saveManualMakerPat(pat);
|
|
31452
31688
|
const tapAuth = await requestTapAuthWithPat(pat);
|
|
31453
31689
|
emit(ctx, "pat", "Maker PAT and TapTap token saved", {
|
|
@@ -31456,7 +31692,7 @@ async function runPatSet(parsed, ctx) {
|
|
|
31456
31692
|
kid: mask(tapAuth.kid)
|
|
31457
31693
|
});
|
|
31458
31694
|
}
|
|
31459
|
-
async function resolvePatSet(parsed) {
|
|
31695
|
+
async function resolvePatSet(parsed, ctx) {
|
|
31460
31696
|
if (booleanOption(parsed, "pat_stdin") || booleanOption(parsed, "pat_from_stdin")) {
|
|
31461
31697
|
const pat = fs7.readFileSync(0, "utf8").trim();
|
|
31462
31698
|
if (!pat) {
|
|
@@ -31470,6 +31706,10 @@ async function resolvePatSet(parsed) {
|
|
|
31470
31706
|
warnPatArgExposure();
|
|
31471
31707
|
return fromPositional || fromOption;
|
|
31472
31708
|
}
|
|
31709
|
+
if (!ctx.json) {
|
|
31710
|
+
process.stdout.write(`Create one at: ${getMakerPatTokensUrl(makerEnvOption(parsed))}
|
|
31711
|
+
`);
|
|
31712
|
+
}
|
|
31473
31713
|
return promptRequired("PAT");
|
|
31474
31714
|
}
|
|
31475
31715
|
async function runMcpInstall(parsed, ctx) {
|
|
@@ -31495,15 +31735,22 @@ async function runMcpVerify(parsed, ctx) {
|
|
|
31495
31735
|
const result = spawnSync4(command.command, [...command.args, "help"], {
|
|
31496
31736
|
encoding: "utf8"
|
|
31497
31737
|
});
|
|
31738
|
+
const failureType = classifyMcpVerifyFailure(result);
|
|
31739
|
+
const commandText = formatShellCommand([command.command, ...command.args, "help"]);
|
|
31498
31740
|
const payload = {
|
|
31499
31741
|
mode,
|
|
31500
31742
|
package: mode === "npx" ? pkg : void 0,
|
|
31501
|
-
command:
|
|
31743
|
+
command: commandText,
|
|
31502
31744
|
status: result.status,
|
|
31745
|
+
signal: result.signal,
|
|
31503
31746
|
ok: result.status === 0,
|
|
31504
31747
|
stdout: result.stdout,
|
|
31505
31748
|
stderr: result.stderr,
|
|
31506
|
-
error: (_a2 = result.error) == null ? void 0 : _a2.message
|
|
31749
|
+
error: (_a2 = result.error) == null ? void 0 : _a2.message,
|
|
31750
|
+
failure_type: failureType,
|
|
31751
|
+
explanation: failureType ? getMcpVerifyFailureExplanation(mode, failureType) : void 0,
|
|
31752
|
+
next_steps: failureType ? getMcpVerifyNextSteps(mode, commandText) : void 0,
|
|
31753
|
+
is_maker_mcp_started: false
|
|
31507
31754
|
};
|
|
31508
31755
|
if (ctx.json) {
|
|
31509
31756
|
writeJson(payload);
|
|
@@ -31511,18 +31758,68 @@ async function runMcpVerify(parsed, ctx) {
|
|
|
31511
31758
|
}
|
|
31512
31759
|
process.stdout.write(
|
|
31513
31760
|
[
|
|
31514
|
-
payload.ok ? "✓ MCP config command can spawn taptap-maker" : "✗ MCP config command
|
|
31761
|
+
payload.ok ? "✓ MCP config command can spawn taptap-maker" : "✗ MCP config command check failed before Maker MCP started",
|
|
31515
31762
|
`- mode: ${payload.mode}`,
|
|
31516
31763
|
`- command: ${payload.command}`,
|
|
31517
31764
|
mode === "npx" ? "- scope: verifies the npx command written by taptap-maker mcp install" : "- scope: verifies only the currently running CLI binary",
|
|
31518
31765
|
`- status: ${payload.status}`,
|
|
31766
|
+
payload.signal ? `- signal: ${payload.signal}` : "",
|
|
31767
|
+
payload.failure_type ? `- failure_type: ${payload.failure_type}` : "",
|
|
31768
|
+
payload.explanation ? `- explanation: ${payload.explanation}` : "",
|
|
31519
31769
|
payload.error ? `- error: ${payload.error}` : "",
|
|
31520
31770
|
payload.stderr ? `- stderr:
|
|
31521
31771
|
${indent2(payload.stderr)}` : "",
|
|
31772
|
+
payload.next_steps ? ["Next steps:", ...payload.next_steps.map((step, index) => `${index + 1}. ${step}`)].join(
|
|
31773
|
+
"\n"
|
|
31774
|
+
) : "",
|
|
31522
31775
|
""
|
|
31523
31776
|
].filter(Boolean).join("\n")
|
|
31524
31777
|
);
|
|
31525
31778
|
}
|
|
31779
|
+
function classifyMcpVerifyFailure(result) {
|
|
31780
|
+
if (result.status === 0) {
|
|
31781
|
+
return void 0;
|
|
31782
|
+
}
|
|
31783
|
+
if (result.error) {
|
|
31784
|
+
return "spawn_error";
|
|
31785
|
+
}
|
|
31786
|
+
if (result.signal) {
|
|
31787
|
+
return "signal";
|
|
31788
|
+
}
|
|
31789
|
+
if (typeof result.status === "number") {
|
|
31790
|
+
return "non_zero_exit";
|
|
31791
|
+
}
|
|
31792
|
+
return "unknown_no_status";
|
|
31793
|
+
}
|
|
31794
|
+
function getMcpVerifyFailureExplanation(mode, failureType) {
|
|
31795
|
+
if (mode === "self") {
|
|
31796
|
+
return [
|
|
31797
|
+
"The current taptap-maker CLI help command did not exit cleanly.",
|
|
31798
|
+
"This is a local CLI startup check, not a Maker MCP business error."
|
|
31799
|
+
].join(" ");
|
|
31800
|
+
}
|
|
31801
|
+
const base = "This is a local Node/npm/npx startup check, not a Maker MCP business error.";
|
|
31802
|
+
if (failureType === "non_zero_exit") {
|
|
31803
|
+
return `The configured npx command exited with a non-zero status. ${base}`;
|
|
31804
|
+
}
|
|
31805
|
+
if (failureType === "spawn_error") {
|
|
31806
|
+
return `The configured npx command could not be spawned. ${base}`;
|
|
31807
|
+
}
|
|
31808
|
+
if (failureType === "signal") {
|
|
31809
|
+
return `The configured npx command was terminated by a signal. ${base}`;
|
|
31810
|
+
}
|
|
31811
|
+
return `The configured npx command did not exit normally. ${base}`;
|
|
31812
|
+
}
|
|
31813
|
+
function getMcpVerifyNextSteps(mode, commandText) {
|
|
31814
|
+
if (mode === "self") {
|
|
31815
|
+
return ["Run `taptap-maker help` directly and inspect the printed error."];
|
|
31816
|
+
}
|
|
31817
|
+
return [
|
|
31818
|
+
`Run the command above directly: ${commandText}`,
|
|
31819
|
+
"Run `taptap-maker mcp verify --mode self` to verify the current CLI binary.",
|
|
31820
|
+
"If direct npx also fails, check `where.exe npx`, `where.exe node`, `where.exe npm`, `node -v`, and `npm -v`."
|
|
31821
|
+
];
|
|
31822
|
+
}
|
|
31526
31823
|
async function runDevKitUpdate(parsed, ctx) {
|
|
31527
31824
|
const targetDir = path8.resolve(stringOption(parsed, "target_dir") || process.cwd());
|
|
31528
31825
|
const result = await installAiDevKit({
|
|
@@ -31548,9 +31845,14 @@ async function resolvePat(parsed, ctx) {
|
|
|
31548
31845
|
`Maker PAT missing. Create one at ${getMakerPatTokensUrl(makerEnvOption(parsed))}`
|
|
31549
31846
|
);
|
|
31550
31847
|
}
|
|
31848
|
+
const patPage = getMakerPatTokensUrl(makerEnvOption(parsed));
|
|
31551
31849
|
emit(ctx, "pat_required", "Maker PAT is required", {
|
|
31552
|
-
pat_page:
|
|
31850
|
+
pat_page: patPage
|
|
31553
31851
|
});
|
|
31852
|
+
if (!ctx.json) {
|
|
31853
|
+
process.stdout.write(`Create one at: ${patPage}
|
|
31854
|
+
`);
|
|
31855
|
+
}
|
|
31554
31856
|
const pat = await promptRequired("Paste Maker PAT");
|
|
31555
31857
|
saveManualMakerPat(pat);
|
|
31556
31858
|
return pat;
|
|
@@ -31566,18 +31868,38 @@ async function resolveProjectSelection(parsed, projects, options) {
|
|
|
31566
31868
|
if (options.skipConfirm) {
|
|
31567
31869
|
throw new Error("Missing --app-id in non-interactive init mode.");
|
|
31568
31870
|
}
|
|
31569
|
-
|
|
31871
|
+
const orderedProjects = sortProjectsByRecentActivity(projects);
|
|
31872
|
+
const limit = MAKER_PROJECT_DEFAULT_TEXT_LIMIT;
|
|
31873
|
+
let offset = 0;
|
|
31874
|
+
for (; ; ) {
|
|
31875
|
+
process.stdout.write(`${formatMakerProjectList(orderedProjects, { limit, offset })}
|
|
31570
31876
|
`);
|
|
31571
|
-
|
|
31572
|
-
|
|
31573
|
-
|
|
31574
|
-
|
|
31575
|
-
|
|
31576
|
-
|
|
31577
|
-
|
|
31578
|
-
|
|
31877
|
+
const answer = await promptRequired("Choose app by index, app_id, or next");
|
|
31878
|
+
const normalized = answer.trim().toLowerCase();
|
|
31879
|
+
if (["n", "next", "more"].includes(normalized)) {
|
|
31880
|
+
const nextOffset = offset + limit;
|
|
31881
|
+
if (nextOffset >= orderedProjects.length) {
|
|
31882
|
+
process.stdout.write("No more Maker apps in this list.\n");
|
|
31883
|
+
} else {
|
|
31884
|
+
offset = nextOffset;
|
|
31885
|
+
}
|
|
31886
|
+
continue;
|
|
31887
|
+
}
|
|
31888
|
+
if (["p", "prev", "previous"].includes(normalized)) {
|
|
31889
|
+
offset = Math.max(offset - limit, 0);
|
|
31890
|
+
continue;
|
|
31891
|
+
}
|
|
31892
|
+
const byIndex = Number(answer);
|
|
31893
|
+
const visibleCount = Math.min(limit, orderedProjects.length - offset);
|
|
31894
|
+
if (Number.isInteger(byIndex) && byIndex >= 1 && byIndex <= visibleCount) {
|
|
31895
|
+
return orderedProjects[offset + byIndex - 1];
|
|
31896
|
+
}
|
|
31897
|
+
const selected = projects.find((project) => project.id === answer.trim());
|
|
31898
|
+
if (!selected) {
|
|
31899
|
+
throw new Error(`Unknown Maker app selection: ${answer}`);
|
|
31900
|
+
}
|
|
31901
|
+
return selected;
|
|
31579
31902
|
}
|
|
31580
|
-
return selected;
|
|
31581
31903
|
}
|
|
31582
31904
|
async function prepareDevKit(targetDir, ctx) {
|
|
31583
31905
|
const before = inspectAiDevKit(targetDir);
|
|
@@ -31755,17 +32077,59 @@ function saveInitState(targetDir, state) {
|
|
|
31755
32077
|
"utf8"
|
|
31756
32078
|
);
|
|
31757
32079
|
}
|
|
31758
|
-
|
|
32080
|
+
var MAKER_PROJECT_DEFAULT_TEXT_LIMIT = 40;
|
|
32081
|
+
var MAKER_PROJECT_MAX_TEXT_LIMIT = 100;
|
|
32082
|
+
function normalizeListLimit(limit) {
|
|
32083
|
+
if (!Number.isFinite(limit) || limit === void 0) {
|
|
32084
|
+
return MAKER_PROJECT_DEFAULT_TEXT_LIMIT;
|
|
32085
|
+
}
|
|
32086
|
+
return Math.min(Math.max(Math.trunc(limit), 1), MAKER_PROJECT_MAX_TEXT_LIMIT);
|
|
32087
|
+
}
|
|
32088
|
+
function normalizeListOffset(offset) {
|
|
32089
|
+
if (!Number.isFinite(offset) || offset === void 0) {
|
|
32090
|
+
return 0;
|
|
32091
|
+
}
|
|
32092
|
+
return Math.max(Math.trunc(offset), 0);
|
|
32093
|
+
}
|
|
32094
|
+
function getProjectActivityTime(project) {
|
|
32095
|
+
const value = project.lastConversationAt || project.lastAccessedAt || project.createdAt;
|
|
32096
|
+
if (!value) {
|
|
32097
|
+
return 0;
|
|
32098
|
+
}
|
|
32099
|
+
const time3 = Date.parse(value);
|
|
32100
|
+
return Number.isNaN(time3) ? 0 : time3;
|
|
32101
|
+
}
|
|
32102
|
+
function sortProjectsByRecentActivity(projects) {
|
|
32103
|
+
return projects.map((project, index) => ({ project, index })).sort((left, right) => {
|
|
32104
|
+
const timeDiff = getProjectActivityTime(right.project) - getProjectActivityTime(left.project);
|
|
32105
|
+
return timeDiff || left.index - right.index;
|
|
32106
|
+
}).map(({ project }) => project);
|
|
32107
|
+
}
|
|
32108
|
+
function formatProjectListItem(project, index) {
|
|
32109
|
+
const name = project.name || "(unnamed)";
|
|
32110
|
+
const lastActive = project.lastConversationAt || project.lastAccessedAt || project.createdAt;
|
|
32111
|
+
return `${index + 1}. ${name} id=${project.id}${lastActive ? ` last_active=${lastActive}` : ""}`;
|
|
32112
|
+
}
|
|
32113
|
+
function formatMakerProjectList(projects, options = {}) {
|
|
31759
32114
|
if (projects.length === 0) {
|
|
31760
32115
|
return "No Maker apps found.";
|
|
31761
32116
|
}
|
|
32117
|
+
const limit = normalizeListLimit(options.limit);
|
|
32118
|
+
const offset = normalizeListOffset(options.offset);
|
|
32119
|
+
const sortedProjects = sortProjectsByRecentActivity(projects);
|
|
32120
|
+
const visibleProjects = sortedProjects.slice(offset, offset + limit);
|
|
32121
|
+
const hiddenCount = projects.length - visibleProjects.length;
|
|
32122
|
+
const nextOffset = offset + visibleProjects.length;
|
|
32123
|
+
const hasNextPage = nextOffset < projects.length;
|
|
32124
|
+
const startIndex = visibleProjects.length > 0 ? offset + 1 : 0;
|
|
32125
|
+
const endIndex = visibleProjects.length > 0 ? Math.min(offset + visibleProjects.length, projects.length) : 0;
|
|
31762
32126
|
return [
|
|
31763
32127
|
`Maker apps (${projects.length})`,
|
|
32128
|
+
visibleProjects.length > 0 && offset === 0 ? `Showing ${visibleProjects.length} most recently active apps, sorted by last activity. ${hiddenCount} more hidden.` : `Showing apps ${startIndex}-${endIndex} of ${projects.length}, sorted by last activity.`,
|
|
32129
|
+
hasNextPage ? `To continue, run: taptap-maker apps --offset ${nextOffset} --limit ${limit}. If the target is hidden, enter its app_id directly or use --json to get the complete app list.` : `No more apps in this view. If needed, use --json to get the complete app list.`,
|
|
31764
32130
|
"",
|
|
31765
|
-
...
|
|
31766
|
-
|
|
31767
|
-
)
|
|
31768
|
-
].join("\n");
|
|
32131
|
+
...visibleProjects.map((project, index) => formatProjectListItem(project, index))
|
|
32132
|
+
].filter((line) => line !== "").join("\n");
|
|
31769
32133
|
}
|
|
31770
32134
|
function emit(ctx, step, message, data) {
|
|
31771
32135
|
if (ctx.json) {
|
|
@@ -31822,6 +32186,14 @@ function stringOption(parsed, key) {
|
|
|
31822
32186
|
const value = parsed.options[key];
|
|
31823
32187
|
return typeof value === "string" ? value : void 0;
|
|
31824
32188
|
}
|
|
32189
|
+
function numberOption(parsed, key) {
|
|
32190
|
+
const value = stringOption(parsed, key);
|
|
32191
|
+
if (value === void 0) {
|
|
32192
|
+
return void 0;
|
|
32193
|
+
}
|
|
32194
|
+
const number3 = Number(value);
|
|
32195
|
+
return Number.isFinite(number3) ? number3 : void 0;
|
|
32196
|
+
}
|
|
31825
32197
|
function booleanOption(parsed, key) {
|
|
31826
32198
|
return parsed.options[key] === true || parsed.options[key] === "true";
|
|
31827
32199
|
}
|
|
@@ -31867,9 +32239,10 @@ function printHelp() {
|
|
|
31867
32239
|
" taptap-maker Start MCP server mode",
|
|
31868
32240
|
" taptap-maker init [--env rnd|production] [--app-id ID] [--target-dir DIR] [--pat PAT]",
|
|
31869
32241
|
" [--skip-confirm] [--skip-mcp-install] [--register-mcp codex,cursor,claude]",
|
|
31870
|
-
" [--
|
|
32242
|
+
" [--json]",
|
|
31871
32243
|
" taptap-maker doctor [--target-dir DIR] [--env rnd|production] [--json]",
|
|
31872
|
-
" taptap-maker apps [--pat PAT] [--
|
|
32244
|
+
" taptap-maker apps [--pat PAT] [--limit N] [--offset N] [--json]",
|
|
32245
|
+
" # --pat warns: PAT appears in ps/history",
|
|
31873
32246
|
" taptap-maker pat set [--pat-stdin] [--json]",
|
|
31874
32247
|
" taptap-maker pat set [PAT|--pat PAT] [--json] # warns: PAT appears in ps/history",
|
|
31875
32248
|
" taptap-maker mcp install [--ide codex,cursor,claude] [--env rnd|production]",
|
|
@@ -31879,6 +32252,7 @@ function printHelp() {
|
|
|
31879
32252
|
" taptap-maker dev-kit update [--target-dir DIR] [--json]",
|
|
31880
32253
|
"",
|
|
31881
32254
|
"MCP verify defaults to the npx command written into AI client config.",
|
|
32255
|
+
"Advanced: init and mcp install accept --package only when testing a different npm package.",
|
|
31882
32256
|
"",
|
|
31883
32257
|
"Windows note:",
|
|
31884
32258
|
" Generated MCP configs use npx.cmd automatically on Windows.",
|
|
@@ -31977,21 +32351,23 @@ function printHelp2() {
|
|
|
31977
32351
|
" taptap-maker Start MCP server mode",
|
|
31978
32352
|
" taptap-maker init [--env rnd|production] [--app-id ID] [--target-dir DIR] [--pat PAT]",
|
|
31979
32353
|
" [--skip-confirm] [--skip-mcp-install] [--register-mcp codex,cursor,claude]",
|
|
31980
|
-
" [--
|
|
32354
|
+
" [--json]",
|
|
31981
32355
|
" taptap-maker doctor [--target-dir DIR] [--env rnd|production] [--json]",
|
|
31982
|
-
" taptap-maker apps [--pat PAT] [--json]",
|
|
32356
|
+
" taptap-maker apps [--pat PAT] [--limit N] [--offset N] [--json]",
|
|
32357
|
+
" # --pat warns: PAT appears in ps/history",
|
|
31983
32358
|
" taptap-maker pat set [--pat-stdin] [--json]",
|
|
31984
32359
|
" taptap-maker pat set [PAT|--pat PAT] [--json] # warns: PAT appears in ps/history",
|
|
31985
32360
|
" taptap-maker mcp install [--ide codex,cursor,claude] [--env rnd|production]",
|
|
31986
32361
|
" [--package @taptap/instant-games-open-mcp] [--json]",
|
|
31987
|
-
" taptap-maker mcp verify
|
|
32362
|
+
" taptap-maker mcp verify [--package @taptap/instant-games-open-mcp]",
|
|
32363
|
+
" [--mode npx|self] [--json]",
|
|
31988
32364
|
" taptap-maker dev-kit update [--target-dir DIR] [--json]",
|
|
31989
|
-
"
|
|
32365
|
+
"",
|
|
32366
|
+
"MCP verify defaults to the npx command written into AI client config.",
|
|
32367
|
+
"Advanced: init and mcp install accept --package only when testing a different npm package.",
|
|
31990
32368
|
"",
|
|
31991
32369
|
"Windows note:",
|
|
31992
32370
|
" Generated MCP configs use npx.cmd automatically on Windows.",
|
|
31993
|
-
"",
|
|
31994
|
-
"MCP server mode is still used by AI clients after configuration reload.",
|
|
31995
32371
|
""
|
|
31996
32372
|
].join("\n")
|
|
31997
32373
|
);
|