@cnbcool/cnb-cli 1.0.2 → 1.0.3
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 +6 -18
- package/package.json +2 -2
- package/skills/cnb-api/scripts/core/core.js +32 -5
- package/skills/cnb-api/scripts/core/help.json +488 -263
- package/skills/cnb-api/scripts/core/index.js +229 -103
- package/skills/cnb-api/scripts/core/modules.help.js +25 -19
- package/skills/cnb-api/scripts/core/shortcuts.js +70 -0
- package/skills/cnb-api/scripts/core/tools.help.js +76 -65
- package/skills/cnb-api/scripts/modules/activities/get-user-activities-by-date.js +2 -2
- package/skills/cnb-api/scripts/modules/activities/get-user-repo-activity-details.js +2 -2
- package/skills/cnb-api/scripts/modules/activities/top-contributors.js +2 -2
- package/skills/cnb-api/scripts/modules/ai/ai-auto-pr.js +2 -2
- package/skills/cnb-api/scripts/modules/ai/ai-chat-completions.js +2 -2
- package/skills/cnb-api/scripts/modules/assets/delete-asset.js +2 -2
- package/skills/cnb-api/scripts/modules/assets/get-files.js +2 -2
- package/skills/cnb-api/scripts/modules/assets/get-imgs.js +2 -2
- package/skills/cnb-api/scripts/modules/assets/list-assets.js +2 -2
- package/skills/cnb-api/scripts/modules/badge/get-badge.js +2 -2
- package/skills/cnb-api/scripts/modules/badge/list-badge.js +2 -2
- package/skills/cnb-api/scripts/modules/badge/upload-badge.js +2 -2
- package/skills/cnb-api/scripts/modules/build/build-crontab-sync.js +2 -2
- package/skills/cnb-api/scripts/modules/build/build-logs-delete.js +2 -2
- package/skills/cnb-api/scripts/modules/build/build-runner-download-log.js +2 -2
- package/skills/cnb-api/scripts/modules/build/get-build-logs.js +2 -2
- package/skills/cnb-api/scripts/modules/build/get-build-stage.js +2 -2
- package/skills/cnb-api/scripts/modules/build/get-build-status.js +2 -2
- package/skills/cnb-api/scripts/modules/build/start-build.js +2 -2
- package/skills/cnb-api/scripts/modules/build/stop-build.js +2 -2
- package/skills/cnb-api/scripts/modules/charge/get-special-amount.js +2 -2
- package/skills/cnb-api/scripts/modules/event/get-events.js +2 -2
- package/skills/cnb-api/scripts/modules/followers/get-followers-by-user-id.js +2 -2
- package/skills/cnb-api/scripts/modules/followers/get-following-by-user-id.js +2 -2
- package/skills/cnb-api/scripts/modules/git/create-blob.js +2 -2
- package/skills/cnb-api/scripts/modules/git/create-branch-lock.js +2 -2
- package/skills/cnb-api/scripts/modules/git/create-branch.js +2 -2
- package/skills/cnb-api/scripts/modules/git/create-tag.js +2 -2
- package/skills/cnb-api/scripts/modules/git/delete-branch-lock.js +2 -2
- package/skills/cnb-api/scripts/modules/git/delete-branch.js +2 -2
- package/skills/cnb-api/scripts/modules/git/delete-commit-annotation.js +2 -2
- package/skills/cnb-api/scripts/modules/git/delete-commit-asset.js +2 -2
- package/skills/cnb-api/scripts/modules/git/delete-tag-annotation.js +2 -2
- package/skills/cnb-api/scripts/modules/git/delete-tag.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-archive-commit-changed-files.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-archive-compare-changed-files.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-archive.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-branch.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-commit-annotations-in-batch.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-commit-annotations.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-commit-assets-by-sha.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-commit-assets.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-commit-statuses.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-commit.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-compare-commits.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-content-without-path.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-content.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-head.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-presigned-lfs-download-link.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-raw.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-tag-annotations.js +2 -2
- package/skills/cnb-api/scripts/modules/git/get-tag.js +2 -2
- package/skills/cnb-api/scripts/modules/git/list-branches.js +2 -2
- package/skills/cnb-api/scripts/modules/git/list-commits.js +2 -2
- package/skills/cnb-api/scripts/modules/git/list-tags.js +2 -2
- package/skills/cnb-api/scripts/modules/git/post-commit-asset-upload-confirmation.js +2 -2
- package/skills/cnb-api/scripts/modules/git/post-commit-asset-upload-url.js +2 -2
- package/skills/cnb-api/scripts/modules/git/put-commit-annotations.js +2 -2
- package/skills/cnb-api/scripts/modules/git/put-tag-annotations.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/delete-branch-protection.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/get-branch-protection.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/get-pipeline-settings.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/get-pull-request-settings.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/get-push-limit-settings.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/list-branch-protections.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/patch-branch-protection.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/post-branch-protection.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/put-pipeline-settings.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/put-pull-request-settings.js +2 -2
- package/skills/cnb-api/scripts/modules/git-settings/put-push-limit-settings.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/can-user-be-assigned-to-issue.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/create-issue.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/delete-issue-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/delete-issue-label.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/delete-issue-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/get-issue-comment.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/get-issue.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/list-issue-activities-latest.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/list-issue-activities.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/list-issue-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/list-issue-comments.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/list-issue-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/list-issues.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/patch-issue-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/patch-issue-comment.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/post-issue-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/post-issue-comment.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/post-issue-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/put-issue-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/update-issue-properties.js +2 -2
- package/skills/cnb-api/scripts/modules/issues/update-issue.js +2 -2
- package/skills/cnb-api/scripts/modules/knowledge-base/delete-knowledge-base.js +2 -2
- package/skills/cnb-api/scripts/modules/knowledge-base/get-knowledge-base-info.js +2 -2
- package/skills/cnb-api/scripts/modules/knowledge-base/get-models.js +2 -2
- package/skills/cnb-api/scripts/modules/knowledge-base/query-knowledge-base.js +2 -2
- package/skills/cnb-api/scripts/modules/members/add-members-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/add-members-of-mission.js +2 -2
- package/skills/cnb-api/scripts/modules/members/add-members-of-registry.js +2 -2
- package/skills/cnb-api/scripts/modules/members/add-members-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/delete-members-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/delete-members-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/delete-outside-collaborators.js +2 -2
- package/skills/cnb-api/scripts/modules/members/get-member-access-level-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/get-member-access-level-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-all-members.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-inherit-members-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-inherit-members-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-member-access-level-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-member-access-level-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-members-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-members-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/list-outside-collaborators.js +2 -2
- package/skills/cnb-api/scripts/modules/members/update-members-of-group.js +2 -2
- package/skills/cnb-api/scripts/modules/members/update-members-of-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/members/update-outside-collaborators.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/create-mission.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/delete-mission.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/get-group-sub-missions.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/get-mission-view-config.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/get-mission-view-list.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/post-mission-view-config.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/post-mission-view-list.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/put-mission-view-list.js +2 -2
- package/skills/cnb-api/scripts/modules/missions/set-mission-visibility.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/create-organization.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/delete-organization.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/get-group-setting.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/get-group.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/get-groups-by-user-id.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/list-groups.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/list-subgroups.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/list-top-groups.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/transfer-group.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/update-group-setting.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/update-organization.js +2 -2
- package/skills/cnb-api/scripts/modules/organizations/upload-logos.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/can-user-be-assigned-to-pull.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/delete-pull-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/delete-pull-label.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/delete-pull-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/delete-repo-files.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/delete-repo-imgs.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/get-pull-comment.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/get-pull.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-comments.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-commit-statuses.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-commits.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-files.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-review-comments.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pull-reviews.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pulls-by-numbers.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/list-pulls.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/merge-pull.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/patch-pull-comment.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/patch-pull.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/post-pull-assignees.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/post-pull-comment.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/post-pull-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/post-pull-request-review-reply.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/post-pull-review.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/post-pull.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/put-pull-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/upload-files.js +2 -2
- package/skills/cnb-api/scripts/modules/pulls/upload-imgs.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/delete-package-tag.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/delete-package.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/delete-registry.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/get-group-sub-registries.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/get-package-tag-detail.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/get-package.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/list-package-tags.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/list-packages.js +2 -2
- package/skills/cnb-api/scripts/modules/registries/set-registry-visibility.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/delete-release-asset.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/delete-release.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/get-latest-release.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/get-release-asset.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/get-release-by-id.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/get-release-by-tag.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/get-releases-asset.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/list-releases.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/patch-release.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/post-release-asset-upload-confirmation.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/post-release-asset-upload-url.js +2 -2
- package/skills/cnb-api/scripts/modules/releases/post-release.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-code-issue/get-code-issue-detail-open-api.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-code-issue/list-code-issue-open-api.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-contributor/get-repo-contributor-trend.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-labels/delete-label.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-labels/list-labels.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-labels/patch-label.js +2 -2
- package/skills/cnb-api/scripts/modules/repo-labels/post-label.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/archive-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/create-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/delete-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/get-by-id.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/get-group-sub-repos.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/get-pinned-repo-by-group.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/get-pinned-repo-by-id.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/get-repos-by-user-name.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/get-repos.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/list-forks-repos.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/set-pinned-repo-by-group.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/set-repo-visibility.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/transfer-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/un-archive-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/repositories/update-repo.js +2 -2
- package/skills/cnb-api/scripts/modules/search/list-public-repos.js +2 -2
- package/skills/cnb-api/scripts/modules/security/get-repo-security-overview.js +2 -2
- package/skills/cnb-api/scripts/modules/starring/get-user-all-stared-repos.js +2 -2
- package/skills/cnb-api/scripts/modules/starring/get-user-stared-repos.js +2 -2
- package/skills/cnb-api/scripts/modules/starring/list-star-users.js +2 -2
- package/skills/cnb-api/scripts/modules/users/auto-complete-source.js +2 -2
- package/skills/cnb-api/scripts/modules/users/get-user-info-by-name.js +2 -2
- package/skills/cnb-api/scripts/modules/users/get-user-info.js +2 -2
- package/skills/cnb-api/scripts/modules/users/list-email.js +2 -2
- package/skills/cnb-api/scripts/modules/users/list-gpg-keys.js +2 -2
- package/skills/cnb-api/scripts/modules/users/update-user-info.js +2 -2
- package/skills/cnb-api/scripts/modules/workspace/delete-workspace.js +2 -2
- package/skills/cnb-api/scripts/modules/workspace/get-workspace-detail.js +2 -2
- package/skills/cnb-api/scripts/modules/workspace/list-workspaces.js +2 -2
- package/skills/cnb-api/scripts/modules/workspace/start-workspace.js +2 -2
- package/skills/cnb-api/scripts/modules/workspace/workspace-stop.js +2 -2
|
@@ -10,7 +10,6 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
10
10
|
var _modules = require("./modules.help");
|
|
11
11
|
var _tools = require("./tools.help");
|
|
12
12
|
var _shortcuts = require("./shortcuts");
|
|
13
|
-
var _util = _interopRequireDefault(require("util"));
|
|
14
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
14
|
const helpFileContent = _fs.default.readFileSync(_path.default.join(__dirname, 'help.json'), 'utf8');
|
|
16
15
|
if (!helpFileContent) {
|
|
@@ -18,33 +17,12 @@ if (!helpFileContent) {
|
|
|
18
17
|
process.exit(1);
|
|
19
18
|
}
|
|
20
19
|
const helpData = JSON.parse(helpFileContent);
|
|
20
|
+
|
|
21
21
|
/**
|
|
22
22
|
* 解析命令行参数
|
|
23
|
+
* 支持:--key value, --key=value, -k value (短参数), 位置参数 (module, tool)
|
|
23
24
|
* @returns 解析后的参数对象
|
|
24
25
|
*/
|
|
25
|
-
// function parseArguments(): Record<string, string | boolean | undefined> {
|
|
26
|
-
// const args = process.argv.slice(2);
|
|
27
|
-
// const result: Record<string, string | boolean | undefined> = {};
|
|
28
|
-
|
|
29
|
-
// for (let i = 0; i < args.length; i++) {
|
|
30
|
-
// const arg = args[i];
|
|
31
|
-
|
|
32
|
-
// // 检查是否是参数名(以--开头)
|
|
33
|
-
// if (arg.startsWith('--')) {
|
|
34
|
-
// const paramName = arg.slice(2);
|
|
35
|
-
|
|
36
|
-
// // 检查下一个参数是否是值(不是以--开头)
|
|
37
|
-
// if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
|
|
38
|
-
// result[paramName] = args[i + 1];
|
|
39
|
-
// i++; // 跳过下一个参数(值)
|
|
40
|
-
// } else {
|
|
41
|
-
// result[paramName] = paramName === 'help' ? true : undefined;
|
|
42
|
-
// }
|
|
43
|
-
// }
|
|
44
|
-
// }
|
|
45
|
-
// return result;
|
|
46
|
-
// }
|
|
47
|
-
|
|
48
26
|
function parseArguments() {
|
|
49
27
|
const args = process.argv.slice(2);
|
|
50
28
|
const result = {};
|
|
@@ -65,29 +43,25 @@ function parseArguments() {
|
|
|
65
43
|
}
|
|
66
44
|
const key = fullKey;
|
|
67
45
|
|
|
68
|
-
//
|
|
46
|
+
// 检查下一个参数是否是值(不以 - 开头)
|
|
69
47
|
const nextArg = args[i + 1];
|
|
70
|
-
const isNextArgValue = i + 1 < args.length && !nextArg.startsWith('--') && !nextArg.startsWith('-');
|
|
71
|
-
|
|
48
|
+
const isNextArgValue = i + 1 < args.length && !nextArg.startsWith('--') && !nextArg.startsWith('-');
|
|
72
49
|
if (isNextArgValue) {
|
|
73
50
|
result[key] = nextArg;
|
|
74
|
-
i += 2;
|
|
51
|
+
i += 2;
|
|
75
52
|
} else {
|
|
76
|
-
// 没有值,视为布尔标志
|
|
77
|
-
// 特殊处理:如果用户显式想要 undefined 行为,可以在这里调整,但通常 CLI 中 flag 存在即为 true
|
|
53
|
+
// 没有值,视为布尔标志
|
|
78
54
|
result[key] = true;
|
|
79
55
|
i++;
|
|
80
56
|
}
|
|
81
57
|
} else if (arg.startsWith('-') && arg.length > 1 && !/^-?\d+$/.test(arg)) {
|
|
82
|
-
// --- 处理短参数 (
|
|
83
|
-
// 注意:排除负数数字的情况
|
|
58
|
+
// --- 处理短参数 (e.g., -h, -v),排除负数 ---
|
|
84
59
|
const key = arg.slice(1);
|
|
85
|
-
|
|
86
|
-
// 简单处理:短参数通常不带长值,或者支持 -f value
|
|
87
60
|
const nextArg = args[i + 1];
|
|
88
61
|
const isNextArgValue = i + 1 < args.length && !nextArg.startsWith('--') && !nextArg.startsWith('-');
|
|
62
|
+
|
|
63
|
+
// 只有单字符短参才吞并下一个值 (如 -o output.txt)
|
|
89
64
|
if (isNextArgValue && key.length === 1) {
|
|
90
|
-
// 只有单字符短参才自动吞并下一个值 (如 -o output.txt),多字符连写 (如 -abc) 通常视为多个布尔旗标
|
|
91
65
|
result[key] = nextArg;
|
|
92
66
|
i += 2;
|
|
93
67
|
} else {
|
|
@@ -122,13 +96,12 @@ function validateRequiredParams(params) {
|
|
|
122
96
|
|
|
123
97
|
/**
|
|
124
98
|
* 尝试解析JSON字符串
|
|
99
|
+
* 先将真实控制字符转义为 JSON 合法形式,处理 shell/AI 传入的原始换行等情况
|
|
125
100
|
* @param str 要解析的字符串
|
|
126
101
|
* @returns 解析后的对象或原始字符串
|
|
127
102
|
*/
|
|
128
103
|
function tryParseJSON(str) {
|
|
129
104
|
if (typeof str !== 'string') return str;
|
|
130
|
-
|
|
131
|
-
// 先将真实控制字符转义为 JSON 合法形式,处理 shell/AI 传入的原始换行等情况
|
|
132
105
|
const escaped = str.replace(/[\x00-\x1F\x7F]/g, ch => {
|
|
133
106
|
const map = {
|
|
134
107
|
'\n': '\\n',
|
|
@@ -147,14 +120,7 @@ function tryParseJSON(str) {
|
|
|
147
120
|
}
|
|
148
121
|
|
|
149
122
|
/**
|
|
150
|
-
*
|
|
151
|
-
* @param str 要检查的字符串
|
|
152
|
-
* @returns 文件内容或原始字符串
|
|
153
|
-
*/
|
|
154
|
-
/**
|
|
155
|
-
* 从文件引用或 stdin 读取内容(类似 curl 的 @file / @- 语法)
|
|
156
|
-
* @param str 要检查的字符串
|
|
157
|
-
* @returns 文件/stdin 内容或原始字符串
|
|
123
|
+
* 尝试从文件引用或 stdin 读取内容(类似 curl 的 @file / @- 语法)
|
|
158
124
|
*/
|
|
159
125
|
function tryReadFileRef(str) {
|
|
160
126
|
if (typeof str !== 'string' || !str.startsWith('@')) return str;
|
|
@@ -178,40 +144,166 @@ function tryReadFileRef(str) {
|
|
|
178
144
|
}
|
|
179
145
|
|
|
180
146
|
/**
|
|
181
|
-
*
|
|
147
|
+
* 获取 tool 的参数定义(用于自动分发 --key value 到 path/query)
|
|
148
|
+
*/
|
|
149
|
+
function getToolParamDefs(moduleName, toolName) {
|
|
150
|
+
const toolHelp = helpData.modulesHelp?.[moduleName]?.[toolName];
|
|
151
|
+
if (!toolHelp) return null;
|
|
152
|
+
return toolHelp.help?.parameter || {};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 格式化参数
|
|
157
|
+
* 支持新的 --key value 扁平格式,同时向后兼容旧的 --path/--query JSON 格式。
|
|
158
|
+
* 根据 help.json 中的参数定义,自动将扁平参数分发到 path 或 query。
|
|
182
159
|
* @param params 原始参数对象
|
|
183
|
-
* @returns
|
|
160
|
+
* @returns 格式化后的参数对象,包含 module, tool, path, query, data 等
|
|
184
161
|
*/
|
|
185
162
|
function formatParams(params) {
|
|
186
|
-
const formatted = {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
163
|
+
const formatted = {
|
|
164
|
+
module: params.module,
|
|
165
|
+
tool: params.tool
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// 保留控制标志
|
|
169
|
+
if (params.help) formatted.help = true;
|
|
170
|
+
if (params.short) formatted.short = true;
|
|
171
|
+
if (params.verbose) formatted.verbose = true;
|
|
172
|
+
if (params.summary) formatted.summary = true;
|
|
173
|
+
|
|
174
|
+
// 旧格式兼容:--path / --query / --data 是 JSON 字符串
|
|
175
|
+
if (typeof params.path === 'string') {
|
|
176
|
+
formatted.path = tryParseJSON(tryReadFileRef(params.path));
|
|
177
|
+
}
|
|
178
|
+
if (typeof params.query === 'string') {
|
|
179
|
+
formatted.query = tryParseJSON(tryReadFileRef(params.query));
|
|
180
|
+
}
|
|
181
|
+
if (typeof params.data === 'string') {
|
|
182
|
+
formatted.data = tryParseJSON(tryReadFileRef(params.data));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 新格式:将其他 --key value 根据 help.json 自动分发到 path/query
|
|
186
|
+
const paramDefs = getToolParamDefs(params.module, params.tool);
|
|
187
|
+
if (paramDefs) {
|
|
188
|
+
const pathDef = paramDefs.path || {};
|
|
189
|
+
const queryDef = paramDefs.query || {};
|
|
190
|
+
const reservedKeys = new Set(['module', 'tool', 'help', 'short', 'verbose', 'summary', 'path', 'query', 'data', 'h', 'v']);
|
|
191
|
+
for (const [key, value] of Object.entries(params)) {
|
|
192
|
+
if (reservedKeys.has(key)) continue;
|
|
193
|
+
if (typeof value === 'boolean') continue;
|
|
194
|
+
if (pathDef[key]) {
|
|
195
|
+
// 归入 path
|
|
196
|
+
if (!formatted.path) formatted.path = {};
|
|
197
|
+
formatted.path[key] = value;
|
|
198
|
+
} else if (queryDef[key]) {
|
|
199
|
+
// 归入 query
|
|
200
|
+
if (!formatted.query) formatted.query = {};
|
|
201
|
+
// 自动转数字
|
|
202
|
+
const paramType = queryDef[key].type;
|
|
203
|
+
if (paramType === 'number' && typeof value === 'string' && !isNaN(Number(value))) {
|
|
204
|
+
formatted.query[key] = Number(value);
|
|
205
|
+
} else {
|
|
206
|
+
formatted.query[key] = value;
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
// 未知参数,尝试放入 query(兼容)
|
|
210
|
+
if (!formatted.query) formatted.query = {};
|
|
211
|
+
formatted.query[key] = typeof value === 'string' && !isNaN(Number(value)) ? Number(value) : value;
|
|
212
|
+
}
|
|
194
213
|
}
|
|
195
214
|
}
|
|
196
215
|
|
|
197
|
-
// 当没有传递query时,要判断当前tool是否支持query
|
|
216
|
+
// 当没有传递 query 时,要判断当前 tool 是否支持 query
|
|
198
217
|
if (formatted.query === undefined) {
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
tool
|
|
202
|
-
} = formatted;
|
|
203
|
-
const toolsHelp = helpData.modulesHelp?.[module]?.[tool];
|
|
204
|
-
const toolsParam = toolsHelp?.help?.parameter || {};
|
|
205
|
-
if (toolsParam.query) {
|
|
218
|
+
const paramDefs2 = getToolParamDefs(formatted.module, formatted.tool);
|
|
219
|
+
if (paramDefs2?.query) {
|
|
206
220
|
formatted.query = {};
|
|
207
221
|
}
|
|
208
222
|
}
|
|
209
223
|
return formatted;
|
|
210
224
|
}
|
|
211
225
|
|
|
226
|
+
/**
|
|
227
|
+
* 精简响应对象(非 verbose 模式使用)
|
|
228
|
+
* - 去掉 trace(仅错误时保留)
|
|
229
|
+
* - 去掉 header(原始 x-cnb-* 头)
|
|
230
|
+
* - 仅列表 API 时保留分页信息
|
|
231
|
+
*/
|
|
232
|
+
function compactResponse(response) {
|
|
233
|
+
if (!response || typeof response !== 'object') return response;
|
|
234
|
+
const compact = {
|
|
235
|
+
status: response.status
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// 仅错误时保留 trace
|
|
239
|
+
if (response.status >= 300 && response.trace) {
|
|
240
|
+
compact.trace = response.trace;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 仅列表 API 时保留分页信息
|
|
244
|
+
if (response.total != null) {
|
|
245
|
+
compact.page = response.page;
|
|
246
|
+
compact.pageSize = response.pageSize;
|
|
247
|
+
compact.total = response.total;
|
|
248
|
+
compact.totalPages = response.totalPages;
|
|
249
|
+
}
|
|
250
|
+
compact.data = response.data;
|
|
251
|
+
return compact;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* 判断是否是标准响应结构(有 status + data 字段)
|
|
256
|
+
* cag.config.js 中的 responseConverter 可能返回裸 data(不含 status),需要区分处理
|
|
257
|
+
*/
|
|
258
|
+
function isStandardResponse(response) {
|
|
259
|
+
return response && typeof response === 'object' && typeof response.status === 'number' && 'data' in response;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 格式化 CLI 输出
|
|
264
|
+
* - verbose 模式:完整 JSON(含 trace、header 等全部字段)
|
|
265
|
+
* - summary 模式:只输出核心摘要字段(需要 --summary 显式指定)
|
|
266
|
+
* - 默认:精简 JSON(去掉 trace、header,保留完整 data)
|
|
267
|
+
* @param response 原始响应
|
|
268
|
+
* @param verbose 是否 verbose 模式
|
|
269
|
+
* @param summary 是否 summary 模式
|
|
270
|
+
* @param toolKey 当前 tool 标识,格式为 "module/tool",用于匹配摘要配置
|
|
271
|
+
*/
|
|
272
|
+
function formatOutput(response, verbose, summary, toolKey) {
|
|
273
|
+
// --verbose 模式:输出完整原始信息
|
|
274
|
+
if (verbose) {
|
|
275
|
+
return JSON.stringify(response, null, 2);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// converter 可能返回裸 data(没有标准 {status, data} 结构),直接输出
|
|
279
|
+
if (!isStandardResponse(response)) {
|
|
280
|
+
if (summary) {
|
|
281
|
+
const summarized = (0, _shortcuts.summarizeResponse)(response, toolKey);
|
|
282
|
+
if (summarized !== null) {
|
|
283
|
+
return JSON.stringify(summarized, null, 2);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return JSON.stringify(response, null, 2);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// 精简响应
|
|
290
|
+
const compact = compactResponse(response);
|
|
291
|
+
|
|
292
|
+
// --summary 模式:对特定 tool 应用摘要提取(仅成功响应)
|
|
293
|
+
if (summary && compact.status >= 200 && compact.status < 300) {
|
|
294
|
+
const summarized = (0, _shortcuts.summarizeResponse)(compact.data, toolKey);
|
|
295
|
+
if (summarized !== null) {
|
|
296
|
+
compact.data = summarized;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return JSON.stringify(compact, null, 2);
|
|
300
|
+
}
|
|
301
|
+
|
|
212
302
|
/**
|
|
213
303
|
* 显示帮助文档
|
|
214
|
-
*
|
|
304
|
+
* - 无参数:显示顶层帮助(模块列表 + 参数说明 + 用法示例)
|
|
305
|
+
* - 指定 module:显示模块帮助(工具列表)
|
|
306
|
+
* - 指定 module + tool:显示工具帮助(参数详情 + 示例)
|
|
215
307
|
*/
|
|
216
308
|
function showHelp(moduleName, tool) {
|
|
217
309
|
if (moduleName && tool) {
|
|
@@ -219,31 +311,48 @@ function showHelp(moduleName, tool) {
|
|
|
219
311
|
} else if (moduleName) {
|
|
220
312
|
(0, _modules.showModuleHelp)(helpData, moduleName);
|
|
221
313
|
} else {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
314
|
+
const cliCmd = "cnb" || 'cnb';
|
|
315
|
+
|
|
316
|
+
// 紧凑的模块列表
|
|
317
|
+
const moduleParts = [];
|
|
318
|
+
for (const [mod, count] of Object.entries(helpData.mainHelp)) {
|
|
319
|
+
moduleParts.push(`${mod}(${count})`);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// 每行放几个模块
|
|
323
|
+
const lines = [];
|
|
324
|
+
let currentLine = ' ';
|
|
325
|
+
for (const part of moduleParts) {
|
|
326
|
+
if (currentLine.length + part.length > 78) {
|
|
327
|
+
lines.push(currentLine);
|
|
328
|
+
currentLine = ' ' + part + ' ';
|
|
329
|
+
} else {
|
|
330
|
+
currentLine += part + ' ';
|
|
331
|
+
}
|
|
225
332
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
--
|
|
237
|
-
--
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
333
|
+
if (currentLine.trim()) lines.push(currentLine);
|
|
334
|
+
const helpMsg = `
|
|
335
|
+
CNB OpenAPI CLI
|
|
336
|
+
|
|
337
|
+
模块(tool数量):
|
|
338
|
+
${lines.join('\n')}
|
|
339
|
+
|
|
340
|
+
参数:
|
|
341
|
+
<module> 模块名称 (如: issues, pulls, git)
|
|
342
|
+
<tool> 工具名称 (如: list-issues, get-issue)
|
|
343
|
+
--key value 路径或查询参数,CLI 自动识别归类
|
|
344
|
+
--data 'JSON' 请求体参数,JSON 字符串
|
|
345
|
+
--verbose 输出完整响应(含 trace、header)
|
|
346
|
+
--help 显示帮助文档
|
|
347
|
+
--short 显示当前仓库的快捷命令
|
|
348
|
+
|
|
349
|
+
用法: ${cliCmd} issues list-issues --repo my-org/my-repo --page 1 --pageSize 10
|
|
350
|
+
${cliCmd} issues create-issue --repo my-org/my-repo --data '{"title":"Bug"}'
|
|
351
|
+
帮助: ${cliCmd} <module> --help
|
|
352
|
+
${cliCmd} <module> <tool> --help
|
|
353
|
+
快捷: ${cliCmd} --short
|
|
245
354
|
`;
|
|
246
|
-
console.log(
|
|
355
|
+
console.log(helpMsg);
|
|
247
356
|
}
|
|
248
357
|
}
|
|
249
358
|
|
|
@@ -251,40 +360,45 @@ CNB OpenAPI CLI 工具\n
|
|
|
251
360
|
* 主函数
|
|
252
361
|
*/
|
|
253
362
|
async function main() {
|
|
254
|
-
// 解析命令行参数
|
|
255
363
|
const params = parseArguments();
|
|
256
364
|
|
|
257
|
-
// 处理 --short
|
|
365
|
+
// 处理 --short
|
|
258
366
|
if (params.short) {
|
|
259
367
|
(0, _shortcuts.showShort)();
|
|
260
368
|
process.exit(0);
|
|
261
369
|
}
|
|
262
370
|
|
|
263
|
-
//
|
|
371
|
+
// 尝试解析快捷命令
|
|
264
372
|
const shortcut = (0, _shortcuts.resolveShortcut)(params.module, params.tool);
|
|
265
373
|
if (shortcut) {
|
|
266
|
-
// 快捷命令:替换为实际 tool 名
|
|
267
374
|
params.tool = shortcut.tool;
|
|
268
375
|
|
|
269
|
-
// 自动注入 path
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
376
|
+
// 自动注入 path 参数(兼容新旧格式)
|
|
377
|
+
// 新格式:用户可能直接传了 --repo xxx,检查扁平参数是否已存在
|
|
378
|
+
const autoPathKeys = Object.keys(shortcut.autoPath);
|
|
379
|
+
const hasPathAlready = params.path || autoPathKeys.some(k => params[k]);
|
|
380
|
+
if (!hasPathAlready) {
|
|
381
|
+
if (autoPathKeys.length > 0) {
|
|
382
|
+
// 新格式:直接注入为扁平参数
|
|
383
|
+
for (const [key, value] of Object.entries(shortcut.autoPath)) {
|
|
384
|
+
if (!params[key]) {
|
|
385
|
+
params[key] = value;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
273
388
|
} else {
|
|
274
|
-
// 环境变量未设置,提示用户
|
|
275
389
|
const envHint = params.module === 'issues' ? 'CNB_REPO_SLUG 和 CNB_ISSUE_IID' : 'CNB_REPO_SLUG 和 CNB_PULL_REQUEST_IID';
|
|
276
|
-
console.error(`快捷命令需要环境变量 ${envHint}
|
|
390
|
+
console.error(`快捷命令需要环境变量 ${envHint},或手动传参数。\n` + `提示:运行 ${"cnb" || 'cnb'} --short 查看快捷命令详情。`);
|
|
277
391
|
process.exit(1);
|
|
278
392
|
}
|
|
279
393
|
}
|
|
280
394
|
|
|
281
|
-
// 自动注入 data
|
|
395
|
+
// 自动注入 data 参数
|
|
282
396
|
if (shortcut.autoData && !params.data) {
|
|
283
397
|
params.data = JSON.stringify(shortcut.autoData);
|
|
284
398
|
}
|
|
285
399
|
}
|
|
286
400
|
|
|
287
|
-
//
|
|
401
|
+
// 验证必须参数
|
|
288
402
|
if (!validateRequiredParams(params)) {
|
|
289
403
|
showHelp(params.module, params.tool);
|
|
290
404
|
process.exit(0);
|
|
@@ -293,6 +407,20 @@ async function main() {
|
|
|
293
407
|
// 格式化参数
|
|
294
408
|
const formattedParams = formatParams(params);
|
|
295
409
|
|
|
410
|
+
// 参数预检:缺少必填 path 参数时自动输出 tool help
|
|
411
|
+
const toolHelpData = helpData.modulesHelp?.[formattedParams.module]?.[formattedParams.tool];
|
|
412
|
+
if (toolHelpData) {
|
|
413
|
+
const pathDef = toolHelpData.help?.parameter?.path;
|
|
414
|
+
if (pathDef) {
|
|
415
|
+
const missingRequired = Object.entries(pathDef).filter(([, p]) => p.required && !formattedParams.path?.[p.name]).map(([k]) => `--${k}`);
|
|
416
|
+
if (missingRequired.length > 0) {
|
|
417
|
+
console.error(`缺少必填参数: ${missingRequired.join(', ')}\n`);
|
|
418
|
+
(0, _tools.showToolHelp)(helpData, formattedParams.module, formattedParams.tool);
|
|
419
|
+
process.exit(1);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
296
424
|
// 动态引入模块
|
|
297
425
|
const toolPath = _path.default.join(__dirname, '../modules', `${formattedParams.module}/${formattedParams.tool}.js`);
|
|
298
426
|
if (!_fs.default.existsSync(toolPath)) {
|
|
@@ -329,9 +457,7 @@ async function main() {
|
|
|
329
457
|
toolsParam.push(formattedParams.data);
|
|
330
458
|
}
|
|
331
459
|
const data = await toolFunction(...toolsParam);
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
depth: null
|
|
335
|
-
}));
|
|
460
|
+
const toolKey = `${formattedParams.module}/${formattedParams.tool}`;
|
|
461
|
+
console.log(formatOutput(data, !!formattedParams.verbose, !!formattedParams.summary, toolKey));
|
|
336
462
|
}
|
|
337
463
|
main();
|
|
@@ -4,6 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.showModuleHelp = showModuleHelp;
|
|
7
|
+
exports.trimSummary = trimSummary;
|
|
8
|
+
/**
|
|
9
|
+
* 去除 summary 中的英文部分(保留中文句号前的内容)
|
|
10
|
+
*/
|
|
11
|
+
function trimSummary(summary) {
|
|
12
|
+
if (!summary) return '';
|
|
13
|
+
// 匹配中文句号"。"后面跟英文的模式,只保留中文部分
|
|
14
|
+
const match = summary.match(/^(.*?[\u4e00-\u9fff].*?)[。.]\s*[A-Z]/);
|
|
15
|
+
if (match) return match[1];
|
|
16
|
+
// 没有匹配到则返回原文
|
|
17
|
+
return summary;
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
/**
|
|
8
21
|
* 显示模块帮助文档
|
|
9
22
|
* @param helpData 帮助数据
|
|
@@ -15,26 +28,19 @@ function showModuleHelp(helpData, moduleName) {
|
|
|
15
28
|
console.error(`模块 ${moduleName} 不存在`);
|
|
16
29
|
process.exit(1);
|
|
17
30
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
31
|
+
const cliCmd = "cnb" || 'cnb';
|
|
32
|
+
let toolListMsg = '';
|
|
33
|
+
for (const [, info] of Object.entries(moduleHelpData)) {
|
|
34
|
+
const name = info.filename;
|
|
35
|
+
const summary = info.summary;
|
|
36
|
+
toolListMsg += ` ${name.padEnd(30)} ${summary}\n`;
|
|
21
37
|
}
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
可用工具:
|
|
25
|
-
${toolListMsg}
|
|
26
|
-
参数说明:
|
|
27
|
-
<module> (必须) 模块名称 (例如: issues),可直接配合 --help 查看该模块帮助
|
|
28
|
-
<tool> (必须) 工具/动作名称 (例如: list-issues)
|
|
29
|
-
--path (可选) 路径参数,JSON字符串
|
|
30
|
-
--query (可选) 查询参数,JSON字符串
|
|
31
|
-
--data (可选) 数据参数,JSON字符串
|
|
32
|
-
--help (可选) 显示此帮助文档
|
|
38
|
+
const helpMsg = `
|
|
39
|
+
${moduleName} 模块
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
${"cnb"} issues list-issues --path '{"repo": "my-project"}' --query '{"page": 1, "pageSize": 10}'
|
|
41
|
+
工具:
|
|
42
|
+
${toolListMsg}
|
|
43
|
+
用法: ${cliCmd} ${moduleName} <tool> --help
|
|
38
44
|
`;
|
|
39
|
-
console.log(
|
|
45
|
+
console.log(helpMsg);
|
|
40
46
|
}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.detectEventContext = detectEventContext;
|
|
7
7
|
exports.resolveShortcut = resolveShortcut;
|
|
8
8
|
exports.showShort = showShort;
|
|
9
|
+
exports.summarizeResponse = summarizeResponse;
|
|
9
10
|
/**
|
|
10
11
|
* 快捷命令模块
|
|
11
12
|
*
|
|
@@ -160,6 +161,7 @@ function showShort() {
|
|
|
160
161
|
${list}
|
|
161
162
|
|
|
162
163
|
提示: 以上命令自动使用环境变量 CNB_REPO_SLUG 和 CNB_ISSUE_IID,无需手动传 --path
|
|
164
|
+
添加 --summary 可只输出核心摘要字段
|
|
163
165
|
`);
|
|
164
166
|
} else if (ctx === 'pull_request') {
|
|
165
167
|
const number = getPRNumber();
|
|
@@ -172,6 +174,7 @@ ${list}
|
|
|
172
174
|
${list}
|
|
173
175
|
|
|
174
176
|
提示: 以上命令自动使用环境变量 CNB_REPO_SLUG 和 CNB_PULL_REQUEST_IID,无需手动传 --path
|
|
177
|
+
添加 --summary 可只输出核心摘要字段
|
|
175
178
|
`);
|
|
176
179
|
} else {
|
|
177
180
|
// 未知上下文,两组都显示
|
|
@@ -191,6 +194,8 @@ ${prList}
|
|
|
191
194
|
CNB_REPO_SLUG - 仓库路径
|
|
192
195
|
CNB_ISSUE_IID - Issue 编号 (Issue 事件)
|
|
193
196
|
CNB_PULL_REQUEST_IID - PR 编号 (PR 事件)
|
|
197
|
+
|
|
198
|
+
添加 --summary 可只输出核心摘要字段
|
|
194
199
|
`);
|
|
195
200
|
}
|
|
196
201
|
}
|
|
@@ -244,4 +249,69 @@ function resolveShortcut(moduleName, toolName) {
|
|
|
244
249
|
autoPath: autoPath || {},
|
|
245
250
|
autoData: matched.autoData || null
|
|
246
251
|
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ============================================================
|
|
255
|
+
// 摘要输出
|
|
256
|
+
// 对返回数据量大的快捷命令,默认只输出核心字段,减少 token 消耗
|
|
257
|
+
// ============================================================
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* 摘要提取器配置
|
|
261
|
+
* key: "module/tool",value: 摘要提取函数
|
|
262
|
+
* - 对象响应:直接对 data 应用提取函数
|
|
263
|
+
* - 数组响应:对 data 中每个元素应用提取函数
|
|
264
|
+
*/
|
|
265
|
+
const SUMMARY_EXTRACTORS = {
|
|
266
|
+
// Issue 详情摘要:只保留标题和正文
|
|
267
|
+
'issues/get-issue': item => ({
|
|
268
|
+
title: item.title,
|
|
269
|
+
body: item.body
|
|
270
|
+
}),
|
|
271
|
+
// Issue 更新摘要:只保留状态变更结果
|
|
272
|
+
'issues/update-issue': item => ({
|
|
273
|
+
number: item.number,
|
|
274
|
+
state: item.state,
|
|
275
|
+
state_reason: item.state_reason
|
|
276
|
+
}),
|
|
277
|
+
// Issue 添加处理人摘要:只保留处理人列表
|
|
278
|
+
'issues/post-issue-assignees': item => ({
|
|
279
|
+
number: item.number,
|
|
280
|
+
assignees: item.assignees?.map?.(a => a.username).filter(Boolean) || []
|
|
281
|
+
}),
|
|
282
|
+
// PR 详情摘要:只保留标题、状态、正文和分支信息
|
|
283
|
+
'pulls/get-pull': item => ({
|
|
284
|
+
title: item.title,
|
|
285
|
+
state: item.state,
|
|
286
|
+
base: item.base?.ref,
|
|
287
|
+
head: item.head?.ref,
|
|
288
|
+
body: item.body
|
|
289
|
+
}),
|
|
290
|
+
// PR 文件列表摘要:只保留文件名、变更状态和增删行数
|
|
291
|
+
'pulls/list-pull-files': item => ({
|
|
292
|
+
filename: item.filename,
|
|
293
|
+
status: item.status,
|
|
294
|
+
additions: item.additions,
|
|
295
|
+
deletions: item.deletions
|
|
296
|
+
}),
|
|
297
|
+
// PR 提交列表摘要:只保留 sha 前 8 位和 commit message
|
|
298
|
+
'pulls/list-pull-commits': item => ({
|
|
299
|
+
sha: typeof item.sha === 'string' ? item.sha.substring(0, 8) : item.sha,
|
|
300
|
+
message: item.commit?.message
|
|
301
|
+
})
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* 对响应数据应用摘要提取(如果当前 tool 配置了摘要提取器)
|
|
306
|
+
* @param data 原始 data(对象或数组)
|
|
307
|
+
* @param toolKey 当前 tool 标识,格式为 "module/tool"
|
|
308
|
+
* @returns 摘要后的 data,如果无匹配提取器则返回 null
|
|
309
|
+
*/
|
|
310
|
+
function summarizeResponse(data, toolKey) {
|
|
311
|
+
const extractor = SUMMARY_EXTRACTORS[toolKey];
|
|
312
|
+
if (!extractor) return null;
|
|
313
|
+
if (Array.isArray(data)) {
|
|
314
|
+
return data.map(extractor);
|
|
315
|
+
}
|
|
316
|
+
return extractor(data);
|
|
247
317
|
}
|