@jspg-ai/coding-bb 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/cbb/dev-standards/rules/cbb-ai-behavior.md +104 -0
- package/cbb/dev-standards/rules/cbb-coding-rule.md +50 -0
- package/cbb/dev-standards/rules/cbb-priority.md +56 -0
- package/cbb/dev-standards/skills/architecture-specs/SKILL.md +129 -0
- package/cbb/dev-standards/skills/coding-specs/SKILL.md +376 -0
- package/cbb/dev-standards/skills/coding-specs/references/concurrency.md +53 -0
- package/cbb/dev-standards/skills/coding-specs/references/config-center.md +16 -0
- package/cbb/dev-standards/skills/coding-specs/references/distributed.md +42 -0
- package/cbb/dev-standards/skills/coding-specs/references/es-coding.md +60 -0
- package/cbb/dev-standards/skills/coding-specs/references/scheduled-task.md +25 -0
- package/cbb/dev-standards/skills/coding-specs/references/security.md +11 -0
- package/cbb/dev-standards/skills/coding-specs/references/unit-testing.md +43 -0
- package/cbb/dev-standards/skills/es-design-specs/SKILL.md +104 -0
- package/cbb/dev-standards/skills/mysql-design-specs/SKILL.md +89 -0
- package/cbb/lib/install/claude-code.js +20 -0
- package/cbb/lib/install/cleanup.js +64 -0
- package/cbb/lib/install/init.js +1875 -0
- package/cbb/lib/install/qoder.js +20 -0
- package/cbb/lib/install/workspaces.js +232 -0
- package/cbb/lib/openspec/index.js +554 -0
- package/cbb/lib/superpowers/index.js +265 -0
- package/cbb/lib/utils/check-update.js +147 -0
- package/cbb/lib/utils/checkbox.js +383 -0
- package/cbb/lib/utils/gitignore.js +69 -0
- package/cbb/lib/utils/output.js +64 -0
- package/cbb/lib/utils/settings.js +119 -0
- package/cbb/lib/utils/version.js +135 -0
- package/cbb/lib/wiki/api-client.js +358 -0
- package/cbb/lib/wiki/cli.js +427 -0
- package/cbb/lib/wiki/convert.js +464 -0
- package/cbb/lib/wiki/index.js +218 -0
- package/cbb/lib/wiki/mermaid-guard.js +103 -0
- package/cbb/lib/wiki/split.js +131 -0
- package/cbb/tools/cbb-decompile-jar/SKILL.md +220 -0
- package/cbb/tools/cbb-decompile-jar/scripts/decompile.py +863 -0
- package/cbb/tools/cbb-design-to-wiki/SKILL.md +180 -0
- package/cbb/tools/cbb-mvn-guide/SKILL.md +281 -0
- package/cbb/tools/cbb-mvn-guide/scripts/mvn_jdk_manager.py +378 -0
- package/cbb/tools/cbb-mvn-guide/scripts/mvn_pom_jdk_reader.py +197 -0
- package/cbb/tools/cbb-plantuml-authoring/SKILL.md +448 -0
- package/cbb/tools/cbb-plantuml-authoring/references/drawing-templates.md +479 -0
- package/cbb/tools/cbb-wiki-ops/SKILL.md +134 -0
- package/cbb/tools/cbb-wiki-ops/scripts/check-auth.js +44 -0
- package/cbb/worktrees/_shared/scripts/find-target-worktree.js +96 -0
- package/cbb/worktrees/_shared/scripts/find-workspace-root.js +67 -0
- package/cbb/worktrees/_shared/scripts/push-core.js +136 -0
- package/cbb/worktrees/_shared/scripts/silence-popup.js +23 -0
- package/cbb/worktrees/commands/close.md +64 -0
- package/cbb/worktrees/commands/extend.md +65 -0
- package/cbb/worktrees/commands/init.md +55 -0
- package/cbb/worktrees/commands/push.md +42 -0
- package/cbb/worktrees/skills/openspec-close-worktree/SKILL.md +449 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/check-env.js +76 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/check-unarchived.js +48 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/delete-branches.js +136 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/discover-apps.js +76 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/find-target-worktree.js +96 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/find-workspace-root.js +67 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/remove-worktrees.js +124 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/safety-check.js +174 -0
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/silence-popup.js +23 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/SKILL.md +390 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/check-env.js +95 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/check-repos.js +98 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/create-branches-and-worktrees.js +135 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/find-target-worktree.js +96 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/find-workspace-root.js +67 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/install-ai.js +150 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/list-available-apps.js +88 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/push-core.js +136 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/silence-popup.js +23 -0
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/sync-repos.js +93 -0
- package/cbb/worktrees/skills/openspec-init-worktree/SKILL.md +539 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/auto-open.js +136 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/check-env-deep.js +87 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/check-env.js +90 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/check-repos.js +171 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/create-branches.js +103 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/create-worktrees.js +154 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/find-workspace-root.js +67 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/generate-app-options.js +93 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/install-ai.js +177 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/parse-config.js +67 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/push-branches.js +101 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/push-core.js +136 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/silence-popup.js +23 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/sync-repos.js +95 -0
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/update-gitignore.js +134 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/SKILL.md +307 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/commit-worktrees.js +269 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/find-target-worktree.js +96 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/find-workspace-root.js +67 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/push-core.js +136 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/push-worktrees.js +159 -0
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/silence-popup.js +23 -0
- package/config/cbb.yaml +6 -0
- package/config/config.sample.json +16 -0
- package/config/openspec/config.yaml +28 -0
- package/config/openspec/schemas/spec-driven/schema.yaml +247 -0
- package/config/openspec/schemas/spec-driven/templates/design.md +475 -0
- package/config/openspec/schemas/spec-driven/templates/proposal.md +58 -0
- package/config/openspec/schemas/spec-driven/templates/spec.md +8 -0
- package/config/openspec/schemas/spec-driven/templates/tasks.md +9 -0
- package/config/workspaces.json +15 -0
- package/openspec/.version +6 -0
- package/openspec/commands/apply.md +182 -0
- package/openspec/commands/archive.md +223 -0
- package/openspec/commands/bulk-archive.md +334 -0
- package/openspec/commands/continue.md +112 -0
- package/openspec/commands/explore.md +206 -0
- package/openspec/commands/ff.md +111 -0
- package/openspec/commands/new.md +70 -0
- package/openspec/commands/onboard.md +555 -0
- package/openspec/commands/propose.md +157 -0
- package/openspec/commands/sync.md +256 -0
- package/openspec/commands/update.md +85 -0
- package/openspec/commands/verify.md +169 -0
- package/openspec/skills/openspec-apply-change/SKILL.md +187 -0
- package/openspec/skills/openspec-archive-change/SKILL.md +181 -0
- package/openspec/skills/openspec-bulk-archive-change/SKILL.md +338 -0
- package/openspec/skills/openspec-continue-change/SKILL.md +117 -0
- package/openspec/skills/openspec-explore/SKILL.md +342 -0
- package/openspec/skills/openspec-ff-change/SKILL.md +116 -0
- package/openspec/skills/openspec-new-change/SKILL.md +76 -0
- package/openspec/skills/openspec-onboard/SKILL.md +560 -0
- package/openspec/skills/openspec-propose/SKILL.md +162 -0
- package/openspec/skills/openspec-sync-specs/SKILL.md +261 -0
- package/openspec/skills/openspec-update-change/SKILL.md +90 -0
- package/openspec/skills/openspec-verify-change/SKILL.md +174 -0
- package/package.json +46 -0
- package/superpowers/.version +6 -0
- package/superpowers/skills/brainstorming/SKILL.md +250 -0
- package/superpowers/skills/brainstorming/scripts/frame-template.html +213 -0
- package/superpowers/skills/brainstorming/scripts/helper.js +167 -0
- package/superpowers/skills/brainstorming/scripts/server.cjs +723 -0
- package/superpowers/skills/brainstorming/scripts/start-server.sh +209 -0
- package/superpowers/skills/brainstorming/scripts/stop-server.sh +120 -0
- package/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/superpowers/skills/brainstorming/visual-companion.md +299 -0
- package/superpowers/skills/dispatching-parallel-agents/SKILL.md +167 -0
- package/superpowers/skills/executing-plans/SKILL.md +64 -0
- package/superpowers/skills/finishing-a-development-branch/SKILL.md +225 -0
- package/superpowers/skills/receiving-code-review/SKILL.md +205 -0
- package/superpowers/skills/requesting-code-review/SKILL.md +95 -0
- package/superpowers/skills/requesting-code-review/code-reviewer.md +181 -0
- package/superpowers/skills/subagent-driven-development/SKILL.md +568 -0
- package/superpowers/skills/subagent-driven-development/implementer-prompt.md +154 -0
- package/superpowers/skills/subagent-driven-development/re-review-prompt.md +115 -0
- package/superpowers/skills/subagent-driven-development/scripts/review-package +46 -0
- package/superpowers/skills/subagent-driven-development/scripts/sdd-workspace +40 -0
- package/superpowers/skills/subagent-driven-development/scripts/task-brief +41 -0
- package/superpowers/skills/subagent-driven-development/task-reviewer-prompt.md +207 -0
- package/superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/superpowers/skills/systematic-debugging/SKILL.md +283 -0
- package/superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/superpowers/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/superpowers/skills/systematic-debugging/find-polluter.sh +72 -0
- package/superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/superpowers/skills/systematic-debugging/test-academic.md +14 -0
- package/superpowers/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/superpowers/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/superpowers/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/superpowers/skills/test-driven-development/SKILL.md +320 -0
- package/superpowers/skills/test-driven-development/writing-good-tests.md +198 -0
- package/superpowers/skills/using-git-worktrees/SKILL.md +167 -0
- package/superpowers/skills/using-superpowers/SKILL.md +63 -0
- package/superpowers/skills/using-superpowers/references/antigravity-tools.md +23 -0
- package/superpowers/skills/using-superpowers/references/codex-tools.md +108 -0
- package/superpowers/skills/using-superpowers/references/gemini-tools.md +63 -0
- package/superpowers/skills/using-superpowers/references/hermes-tools.md +56 -0
- package/superpowers/skills/using-superpowers/references/pi-tools.md +16 -0
- package/superpowers/skills/verification-before-completion/SKILL.md +120 -0
- package/superpowers/skills/writing-plans/SKILL.md +171 -0
- package/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/superpowers/skills/writing-skills/SKILL.md +679 -0
- package/superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/superpowers/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/superpowers/skills/writing-skills/persuasion-principles.md +187 -0
- package/superpowers/skills/writing-skills/render-graphs.js +169 -0
- package/superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cbb-design-to-wiki
|
|
3
|
+
description: 将 OpenSpec design.md(含 mermaid/plantuml 图表)发布到Wiki。触发场景:用户说"发布 design 到 wiki"、"把方案发到 wiki"、"publish to wiki",或 OpenSpec change archive 后需要发布设计文档,或任何需要把 Markdown 写入 wiki.amh-group.com 的场景。统一 Wiki 发布入口,失败时中断并提示原因。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 发布 Design.md 到Wiki
|
|
7
|
+
|
|
8
|
+
## 工作流程
|
|
9
|
+
|
|
10
|
+
> **严格执行规则**:每一步完成后才能进入下一步,禁止合并或跳过步骤。每步结束时向用户报告结果并等待确认(或自动进入下一步)。
|
|
11
|
+
|
|
12
|
+
### 第一步:环境检查
|
|
13
|
+
|
|
14
|
+
**1.1 检查 cbb 安装**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
cbb --help
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
不可用则执行 `npx @jspg-ai/coding-bb init`,版本过旧则 `npm install -g @jspg-ai/coding-bb`。
|
|
21
|
+
|
|
22
|
+
**1.2 检查 Wiki 认证凭据**
|
|
23
|
+
|
|
24
|
+
检查环境变量 `CBB_WIKI_EMAIL` + `CBB_WIKI_TOKEN` 或配置文件 `~/.cbb/wiki-config.json` 是否存在。
|
|
25
|
+
|
|
26
|
+
**凭据未配置时,中断并提示:**
|
|
27
|
+
|
|
28
|
+
> "Wiki 认证凭据未配置,请选择一种方式:
|
|
29
|
+
> 1. 设置环境变量:`$env:CBB_WIKI_EMAIL = '你的邮箱'` 和 `$env:CBB_WIKI_TOKEN = '你的令牌'`
|
|
30
|
+
> 2. 创建 `~/.cbb/wiki-config.json`,写入 `{\"email\":\"你的邮箱\",\"token\":\"令牌\"}`
|
|
31
|
+
>
|
|
32
|
+
> 令牌获取:https://wiki.amh-group.com/plugins/tokens/view.action
|
|
33
|
+
> 配置完成后回复'继续'。"
|
|
34
|
+
|
|
35
|
+
**凭据检查通过后,报告结果并进入第二步。**
|
|
36
|
+
|
|
37
|
+
### 第二步:确定要发布的 design.md
|
|
38
|
+
|
|
39
|
+
**2.1 指令中已传入 change 名**
|
|
40
|
+
|
|
41
|
+
直接定位文件:`openspec/changes/<change-name>/design.md`,验证文件存在且非空后,报告选中的 change 并进入第三步。
|
|
42
|
+
|
|
43
|
+
**2.2 指令中未传入 change 名**
|
|
44
|
+
|
|
45
|
+
仅检测**当前目录**下的 `openspec/changes/` 目录,筛选出包含 `design.md` 且未被归档的 change:
|
|
46
|
+
|
|
47
|
+
- **只有 1 个** → 自动选中,报告结果并进入第三步
|
|
48
|
+
- **有多个** → 列出所有未归档 change 名称,让用户选择(只能选一个),报告选中结果并进入第三步
|
|
49
|
+
- **没有** → 报错提示:"当前目录下未找到任何未归档的 change(含 design.md)",中断流程
|
|
50
|
+
|
|
51
|
+
### 第三步:确认 Wiki 目标
|
|
52
|
+
|
|
53
|
+
根据指令中是否已提供 Wiki 目标信息,按以下优先级处理:
|
|
54
|
+
|
|
55
|
+
1. **已提供 pageId(数字)或 Wiki 页面链接** → 更新该已有页面,进入第四步
|
|
56
|
+
2. **已提供父页面 ID/链接 + 标题** → 创建新页面,进入第四步
|
|
57
|
+
3. **均未提供** → 向用户明确询问:
|
|
58
|
+
|
|
59
|
+
> "请确认 Wiki 发布目标:
|
|
60
|
+
> 1. **更新已有页面** — 请提供 pageId(数字,如 `123456`)或页面链接(如 `https://wiki.amh-group.com/pages/viewpage.action?pageId=123456`)
|
|
61
|
+
> 2. **创建新页面** — 请提供父页面的 pageId/链接,以及新页面标题"
|
|
62
|
+
|
|
63
|
+
等待用户回复后进入第四步。如用户提供的是 Wiki 链接,从中提取 `pageId` 参数后使用。
|
|
64
|
+
|
|
65
|
+
### 第四步:发布
|
|
66
|
+
|
|
67
|
+
**先查 CLI 帮助**(不熟悉时必看,命令清单与最新选项以 help 为准):
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cbb wp --help # 发布命令帮助
|
|
71
|
+
cbb wiki --help # 查询/管理子命令帮助
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**参数格式约定**(两种写法等价,混用不报错):
|
|
75
|
+
|
|
76
|
+
- GNU 风格(推荐):`--flag <value>`,例如 `--page-id 123456`
|
|
77
|
+
- 等号风格:`--flag=<value>`,例如 `--page-id=123456`
|
|
78
|
+
- 布尔开关(如 `--dry-run`、`--full`)**不能带值**,写 `--dry-run` 而不是 `--dry-run=true`
|
|
79
|
+
- 文件路径含空格或中文时**必须用引号包住**:`--file "D:\path with space\design.md"`
|
|
80
|
+
- 参数顺序不限,文件名可写在最前(位置参数)也可写 `--file <path>`
|
|
81
|
+
|
|
82
|
+
**仅使用 `cbb wp` 命令发布,不做自动降级。**
|
|
83
|
+
|
|
84
|
+
**创建新页面:**
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# GNU 风格(推荐)
|
|
88
|
+
cbb wp <file> --parent-id <parentPageId> --title "设计方案:<change-name>"
|
|
89
|
+
# 等价写法(等号风格)
|
|
90
|
+
cbb wp --file <file> --parent-id=<parentPageId> --title="设计方案:<change-name>"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**更新已有页面:**
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
cbb wp <file> --page-id <pageId>
|
|
97
|
+
# 等价:cbb wp <file> --page-id=<pageId>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Dry-run 预览**(不实际发布,仅输出 XHTML):
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
cbb wp <file> --page-id <pageId> --dry-run
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**常见拼错及修正**:
|
|
107
|
+
|
|
108
|
+
| 用户写法 | 报错 | 修正 |
|
|
109
|
+
|---------|------|------|
|
|
110
|
+
| `cbb wp` 不带参数 | `用法: cbb wp <file> ...` | 加 `<file>` 或 `--file <path>` |
|
|
111
|
+
| `--page-id 123456 --dry-run` 拼成 `--page-id=123456 --dry-run-true` | `未知选项: --dry-run-true` | 改为 `--dry-run`(布尔开关不能带值) |
|
|
112
|
+
| 文件路径含空格未引号包住 | 报"文件不存在"或解析错乱 | 用引号包:`--file "C:\My Docs\design.md"` |
|
|
113
|
+
| 把 `--page-id=123456` 中的 `=` 写成了空格 | 不会报错(两种写法都支持) | — |
|
|
114
|
+
|
|
115
|
+
**如果发布失败,立即中断并告知用户具体原因:**
|
|
116
|
+
|
|
117
|
+
| 失败场景 | 提示内容 |
|
|
118
|
+
|----------|---------|
|
|
119
|
+
| 认证失败 (401/403) | "认证失败,请检查邮箱和令牌是否正确。获取令牌:https://wiki.amh-group.com/plugins/tokens/view.action" |
|
|
120
|
+
| 版本冲突 (409) | "页面版本冲突,请重新执行发布命令" |
|
|
121
|
+
| 页面不存在 (404) | "页面不存在,请确认 pageId 是否正确,或使用 --parent-id 创建新页面" |
|
|
122
|
+
| 网络超时 | "网络超时,请检查 VPN/网络连接后重试" |
|
|
123
|
+
| cbb wp 不可用 | "cbb wp 命令不可用,请确认已安装 v1.0.4+ 版本:`cbb --version`" |
|
|
124
|
+
| 参数格式错误 | CLI 已自带提示(含"参数格式为 --flag <value> 或 --flag=<value>") |
|
|
125
|
+
| 其他错误 | 输出完整错误信息,提示用户排查 |
|
|
126
|
+
|
|
127
|
+
**发布成功后,报告页面 URL 并进入第五步。**
|
|
128
|
+
|
|
129
|
+
### 第五步:验证与修复
|
|
130
|
+
|
|
131
|
+
> **禁止调用 mb-wiki-rest 或其他外部 Wiki 技能。** 使用 `cbb wp --dry-run` 和 `cbb wiki get` 完成验证。
|
|
132
|
+
|
|
133
|
+
**5.1 Dry-run 检查 XHTML**
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
cbb wp <file> --page-id <pageId> --dry-run | Select-String "mermaid-macro|plantuml|ac:structured-macro"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
确认输出中包含正确的 Confluence 宏标签(`<ac:structured-macro>`),而非原始 Markdown 代码块。
|
|
140
|
+
|
|
141
|
+
**5.2 页面内容验证**
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
cbb wiki get <pageId> --full
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
确认页面已创建/更新成功,正文内容完整。
|
|
148
|
+
|
|
149
|
+
**5.3 浏览器验证**
|
|
150
|
+
|
|
151
|
+
在浏览器中打开 Wiki 页面(URL 格式:`https://wiki.amh-group.com/pages/viewpage.action?pageId=<pageId>`),逐项检查:
|
|
152
|
+
- Mermaid/PlantUML 图表正确渲染(非纯文本)
|
|
153
|
+
- 表格格式正确
|
|
154
|
+
- 代码块格式正确
|
|
155
|
+
- 中文内容无乱码
|
|
156
|
+
|
|
157
|
+
**5.4 渲染失败修复循环**
|
|
158
|
+
|
|
159
|
+
如果发现任何渲染问题,执行修复循环:
|
|
160
|
+
|
|
161
|
+
1. **定位问题**:根据现象判断原因
|
|
162
|
+
- 图表显示为纯文本 → mermaid/plantuml 宏未正确转换
|
|
163
|
+
- `@Tool`、`@ConfigurationValue` 等被误解析为用户提及 → Confluence `@` 宏冲突
|
|
164
|
+
- 表格/代码块格式异常 → XHTML 结构问题
|
|
165
|
+
2. **修复 design.md 源内容**:针对性修改(如 mermaid 语法调整、`@` 转义等)
|
|
166
|
+
3. **重新发布**:回到第四步重新执行 `cbb wp`
|
|
167
|
+
4. **重新验证**:回到 5.3 再次检查
|
|
168
|
+
|
|
169
|
+
**循环此过程直到所有渲染问题修复、Wiki 页面显示正常为止。**
|
|
170
|
+
|
|
171
|
+
### 第六步:安全收尾检查
|
|
172
|
+
|
|
173
|
+
发布完成后,逐项确认并处理:
|
|
174
|
+
|
|
175
|
+
1. **检查会话中是否产生含凭据的临时文件**
|
|
176
|
+
- 确认执行过程中未将 token/密码意外写入工作区临时文件
|
|
177
|
+
- 如有残留 → 立即删除该临时文件
|
|
178
|
+
- 注意:`~/.cbb/wiki-config.json` 是合法持久化配置,**禁止删除**
|
|
179
|
+
|
|
180
|
+
**全部检查通过后,告知用户发布流程已完成。**
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cbb-mvn-guide
|
|
3
|
+
description: |
|
|
4
|
+
跨平台 Maven 构建助手,按项目 pom.xml 的 <java.version> 自动切到对应 JDK 后执行构建,
|
|
5
|
+
避免 JDK 版本不匹配导致编译失败。零外部依赖:pom 版本读取与 JDK 切换均由 skill 自带
|
|
6
|
+
的 Python 脚本完成(纯标准库),不依赖 jabba / SDKMAN 等外部工具,无需联网下载。
|
|
7
|
+
提速是默认前提不是附加项:所有命令默认带 -T 1C(按核并行)与 -Dmaven.javadoc.skip=true;
|
|
8
|
+
首次使用需在 ~/.m2/settings.xml 配置阿里云镜像(一行写入),二次构建(依赖已就位)可加 -o
|
|
9
|
+
走离线模式进一步省时;若本机装了 mvnd(Maven Daemon,常驻 JVM 省启动开销)则自动用它
|
|
10
|
+
替代 mvn——跑单测高频场景每次省 2-3s。
|
|
11
|
+
自动触发场景:
|
|
12
|
+
- 编译、打包、跑测试(mvn clean compile / package / test)
|
|
13
|
+
- 本地构建 Java/Spring Boot 多模块项目(如 ymm-ka 系列子项目,各子项目 JDK 要求不同)
|
|
14
|
+
- 报"未结束的字符串文字/非法字符"等 JDK 版本不匹配错误时排查
|
|
15
|
+
- 用户要求跑 mvn 但不确定本机该用哪个 JDK
|
|
16
|
+
工作流:步骤 0 镜像配置(首次,一次性)→ 步骤 1 mvn_pom_jdk_reader.py 读 pom 版本 →
|
|
17
|
+
步骤 2 mvn_jdk_manager.py 取/切对应 JDK(doctor 清失效 → scan 扫本机 → scan --adopt 登记 → use)→
|
|
18
|
+
步骤 3 自动检测 mvnd/mvn → 同条命令内 use | $MVN -v 校验 | $MVN -T 1C -Dmaven.javadoc.skip=true -q 执行。
|
|
19
|
+
跨平台:脚本纯标准库 Python3;shell 语法按当前环境适配(Windows 用 PowerShell,mac/linux 用 sh)。
|
|
20
|
+
license: MIT
|
|
21
|
+
metadata:
|
|
22
|
+
version: 3.0.0
|
|
23
|
+
category: development
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# cbb-mvn-guide:自动切 JDK + 加速执行 Maven(跨平台、零外部依赖)
|
|
27
|
+
|
|
28
|
+
## 何时用这个 skill
|
|
29
|
+
|
|
30
|
+
用户要在本机跑 `mvn`(编译/打包/测试)时用。核心价值:
|
|
31
|
+
1. **自动按项目 pom 的 `<java.version>` 切到正确 JDK**,避免 JDK 不匹配编译失败。
|
|
32
|
+
2. **默认开启并行构建 + 阿里云镜像 + 跳过 javadoc**,所有 mvn 命令自带提速策略,无需临时拼参数。
|
|
33
|
+
|
|
34
|
+
典型触发:用户说"编译一下""跑测试""mvn xxx",或遇到文本块报错"未结束的字符串文字/非法字符"(JDK 版本过低)。
|
|
35
|
+
|
|
36
|
+
## 两个固化脚本(都在 scripts/ 下,纯标准库)
|
|
37
|
+
|
|
38
|
+
| 脚本 | 作用 |
|
|
39
|
+
|---|---|
|
|
40
|
+
| `mvn_pom_jdk_reader.py` | 读 pom `<java.version>` 并归一化主版本号(含按 `<parent><relativePath>` 找父 pom、`${}` 属性插值) |
|
|
41
|
+
| `mvn_jdk_manager.py` | 迷你 JDK 管理器:`ls`/`current`/`link`/`unlink`/`use`/`scan`/`doctor`,注册表存 `~/.jdk-registry.json` |
|
|
42
|
+
|
|
43
|
+
**不要临场写正则或 shell 探测**——这两个脚本已把易错逻辑(`1.8` 归一化、向上找父 pom、JDK 路径校验、跨 shell 输出 env 语句)固化,直接调用即可。
|
|
44
|
+
|
|
45
|
+
调用时 python 命令名按平台:Windows 一般 `python`,部分 mac/linux 为 `python3`。下文统一写 `python`,POSIX 环境自行替换。
|
|
46
|
+
|
|
47
|
+
## 关键约束(必读)
|
|
48
|
+
|
|
49
|
+
1. **Shell 状态不持久**:Claude Code 每次执行 shell 调用相互独立,环境变量不跨调用保留。因此"切 JDK"和"跑 mvn"**必须在同一条命令里**串联执行——`mvn_jdk_manager.py use` 输出 env 设置语句,由当前 shell 立即 eval/source,紧接 `mvn -v; mvn ...`。不能分两次调用。
|
|
50
|
+
2. **JDK 版本判断以 `mvn -v` 为准**,不看 `java -version`——`mvn` 用的是 `JAVA_HOME`,不是 PATH 上的 `java`。
|
|
51
|
+
3. **`use` 不直接改环境**:它是子进程,改不了父 shell 的 env。所以 `use` 输出的是**当前 shell 的 set 语句**(PowerShell 输出 `$env:...=`,POSIX 输出 `export ...=`),由调用方 eval/source 生效。
|
|
52
|
+
4. **提速是默认前提,不是可选项**:
|
|
53
|
+
- 所有构建命令默认带 `-T 1C`(每核 1 线程并行构建)、`-Dmaven.javadoc.skip=true`(跳过 javadoc 生成)。
|
|
54
|
+
- 首次使用需在 `~/.m2/settings.xml` 配置阿里云镜像(详见下方"步骤 0")。
|
|
55
|
+
- 二次构建(依赖已就位)可加 `-o`(离线模式),省去远程仓库校验。
|
|
56
|
+
- 若本机装了 `mvnd`(Maven Daemon,常驻 JVM),skill 自动检测并用它替代 `mvn`——命令语法完全一致,无需改参数;高频单测场景每次省 2-3s JVM 启动开销。
|
|
57
|
+
5. **输出纪律:成功安静,失败才说话(重要,关乎专业性)**。符合预期的步骤**不要**搞得像报错——红框、`Error: Exit code`、大段 `[ERROR]`/`[WARNING]` 日志都会让用户以为 skill 出了问题。具体:
|
|
58
|
+
- **mvn 一律加 `--quiet`**(`-q`):成功时 mvn 完全静默(只看退出码),失败时才输出错误。这样编译/测试成功就干干净净,不会有满屏日志。
|
|
59
|
+
- **mvn 命令不要加 `2>&1`**:PowerShell 5.1 会把 mvn 走 stderr 的日志包成 `NativeCommandError` 红框并报假的 `Exit code 255`,即便 mvn 实际成功(exit 0)。让 stderr 由 harness 自行处理即可,别主动重定向。
|
|
60
|
+
- **判成功只看 `$LASTEXITCODE`/`$?`**:mvn 退出码 0 = 成功,非 0 = 失败。不要凭"有没有红字"判断——PS 的红框是 stderr 包装的假象,不代表失败。
|
|
61
|
+
- **成功时用自然语言一句话报告**(如"web 模块编译成功"),不贴 mvn 原始日志。**失败时**才把 mvn 关键错误行(`[ERROR] ... FAILURE`)提炼出来给用户看,并说明原因。
|
|
62
|
+
- **`mvn_jdk_manager.py` 一律加 `-q`**:失败时静默退出(exit 非0、无输出),不展示底层报错。由你按退出码判断后用自然语言提示/询问:
|
|
63
|
+
- `use` 失败(exit 1)→ 名称未登记或路径失效。不展示报错,直接走步骤 2 scan/doctor 流程:先 `doctor --prune` 清失效,`ls`/`scan` 看本机有哪些,没匹配主版本的就 `scan --adopt` 登记或问用户 JDK 装在哪。
|
|
64
|
+
- `link` 失败(exit 1)→ 路径无效。告诉用户"该路径下找不到 JDK(bin/java)",问正确路径,不贴原始报错。
|
|
65
|
+
- `mvn_pom_jdk_reader.py --major` 输出空 → pom 没有 `<java.version>`,问用户该项目用哪个 JDK 版本。
|
|
66
|
+
- **区分"真错误"与"三方依赖噪音"**:Maven 解析三方 jar 的 pom 缺 `<version>` 时会打 `[ERROR]`(如 `crm-weixin-api` 的 commons-api/hibernate-validator),但这是告警性的、不影响编译、不是你的代码问题。别把这种当失败展示给用户。
|
|
67
|
+
|
|
68
|
+
## 执行流程(严格按序)
|
|
69
|
+
|
|
70
|
+
### 步骤 0:首次配置镜像(一次性,仅当用户首次用本 skill 时执行)
|
|
71
|
+
|
|
72
|
+
Maven 默认从中央仓库(国外)拉依赖,慢且易超时。所有 mvn 命令的提速前提是 `~/.m2/settings.xml` 已配阿里云镜像。
|
|
73
|
+
|
|
74
|
+
**检测:**
|
|
75
|
+
```bash
|
|
76
|
+
test -f ~/.m2/settings.xml && grep -q "maven.aliyun.com" ~/.m2/settings.xml && echo "MIRROR_OK" || echo "MIRROR_MISSING"
|
|
77
|
+
```
|
|
78
|
+
- `MIRROR_OK` → 跳过此步
|
|
79
|
+
- `MIRROR_MISSING` → 继续
|
|
80
|
+
|
|
81
|
+
**模板**(已有 settings.xml 时只追加 `<mirrors>` 段,避免覆盖用户其他配置):
|
|
82
|
+
```xml
|
|
83
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
84
|
+
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0">
|
|
85
|
+
<mirrors>
|
|
86
|
+
<mirror>
|
|
87
|
+
<id>aliyunmaven</id>
|
|
88
|
+
<mirrorOf>*</mirrorOf>
|
|
89
|
+
<name>阿里云公共仓库</name>
|
|
90
|
+
<url>https://maven.aliyun.com/repository/public</url>
|
|
91
|
+
</mirror>
|
|
92
|
+
</mirrors>
|
|
93
|
+
</settings>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**PowerShell 一键写入:**
|
|
97
|
+
```powershell
|
|
98
|
+
$dir = "$HOME\.m2"; New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
99
|
+
$path = "$dir\settings.xml"
|
|
100
|
+
$xml = @'
|
|
101
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
102
|
+
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0">
|
|
103
|
+
<mirrors>
|
|
104
|
+
<mirror>
|
|
105
|
+
<id>aliyunmaven</id>
|
|
106
|
+
<mirrorOf>*</mirrorOf>
|
|
107
|
+
<name>阿里云公共仓库</name>
|
|
108
|
+
<url>https://maven.aliyun.com/repository/public</url>
|
|
109
|
+
</mirror>
|
|
110
|
+
</mirrors>
|
|
111
|
+
</settings>
|
|
112
|
+
'@
|
|
113
|
+
Set-Content -Path $path -Value $xml -Encoding UTF8
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**POSIX 一键写入:**
|
|
117
|
+
```sh
|
|
118
|
+
mkdir -p ~/.m2 && cat > ~/.m2/settings.xml <<'EOF'
|
|
119
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
120
|
+
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0">
|
|
121
|
+
<mirrors>
|
|
122
|
+
<mirror>
|
|
123
|
+
<id>aliyunmaven</id>
|
|
124
|
+
<mirrorOf>*</mirrorOf>
|
|
125
|
+
<name>阿里云公共仓库</name>
|
|
126
|
+
<url>https://maven.aliyun.com/repository/public</url>
|
|
127
|
+
</mirror>
|
|
128
|
+
</mirrors>
|
|
129
|
+
</settings>
|
|
130
|
+
EOF
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
写完后用开头的检测命令验证一次即可。**只做一次,后续自动生效**。
|
|
134
|
+
|
|
135
|
+
### 步骤 1:读项目 pom 的 java.version
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
python scripts/mvn_pom_jdk_reader.py <pom路径> --major
|
|
139
|
+
```
|
|
140
|
+
输出主版本号(`8` / `21` / `17`);该 pom 及所有父 pom 都没有 `<java.version>` 则输出空行。
|
|
141
|
+
|
|
142
|
+
完整信息用 JSON 模式:`python scripts/mvn_pom_jdk_reader.py <pom路径>` → `{"raw":"21","major":"21","pom_path":"...","interpolated":true}`。
|
|
143
|
+
|
|
144
|
+
父 pom 定位优先解析 `<parent><relativePath>`(缺省默认 `../pom.xml`),找不到再回退逐级向上找同名 pom.xml;`${maven.compiler.release}` 这类属性引用会从同 pom `<properties>` 插值,解析不到保留原串并标记 `interpolated:false`(此时问用户用哪个版本)。传子模块 pom 路径即可。
|
|
145
|
+
|
|
146
|
+
### 步骤 2:用 mvn_jdk_manager 取对应 JDK
|
|
147
|
+
|
|
148
|
+
先清失效登记,再看已登记的 JDK:
|
|
149
|
+
```
|
|
150
|
+
python scripts/mvn_jdk_manager.py doctor --prune
|
|
151
|
+
python scripts/mvn_jdk_manager.py ls
|
|
152
|
+
```
|
|
153
|
+
`doctor --prune` 清掉路径已失效(JDK 被卸载/迁移)的登记;`ls` 列出 名称 / 主版本 / 路径。判断**主版本匹配**(主版本对即可)。
|
|
154
|
+
|
|
155
|
+
#### 情况 A:已有匹配主版本的 JDK → 直接 use
|
|
156
|
+
```
|
|
157
|
+
python scripts/mvn_jdk_manager.py -q use <名称>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### 情况 B:没有匹配的 → scan 扫描本机已装 JDK,确认后 --adopt 登记
|
|
161
|
+
- 先扫描(扫常见目录:Windows `Program Files\Java`、`Eclipse Adoptium`、`Amazon Corretto`、`D:\env\jdk` 等;POSIX `/Library/Java/...`、`/usr/lib/jvm/*`、`~/.jdks/*` 等):
|
|
162
|
+
```
|
|
163
|
+
python scripts/mvn_jdk_manager.py scan
|
|
164
|
+
```
|
|
165
|
+
输出 序号/主版本/vendor/状态/路径,标记哪些已登记。**扫描结果给用户看**。
|
|
166
|
+
- 确认无误后一键登记未登记的(`--adopt` 是显式触发,命名规则 `jdk<major>` 或 `<vendor><major>`,重名加 `_2`,打印登记明细可追溯):
|
|
167
|
+
```
|
|
168
|
+
python scripts/mvn_jdk_manager.py scan --adopt
|
|
169
|
+
```
|
|
170
|
+
登记完回到情况 A `use`。
|
|
171
|
+
- 若 scan 结果为空(本机没装该版本 JDK):**停下告知用户**本机缺少 JDK<major>,请自行安装后 `scan --adopt` 或 `link` 登记。skill 不自动下载(避免联网)。
|
|
172
|
+
|
|
173
|
+
#### 情况 C:用户已知 JDK 路径,直接 link
|
|
174
|
+
- 用户给路径后登记(脚本校验 `bin/java` 存在,无效路径 `-q` 静默退出 exit 1,你转而提示路径不对):
|
|
175
|
+
```
|
|
176
|
+
python scripts/mvn_jdk_manager.py -q link <名称> <JDK根路径>
|
|
177
|
+
python scripts/mvn_jdk_manager.py -q use <名称>
|
|
178
|
+
```
|
|
179
|
+
名称自取,建议含主版本便于辨识,如 `jdk21` / `corretto8`。
|
|
180
|
+
|
|
181
|
+
### 步骤 3:校验 + 执行 mvn/mvnd(同一条命令,默认带提速参数)
|
|
182
|
+
|
|
183
|
+
切 JDK 与跑构建 **必须在同一条命令**。先检测用 mvnd 还是 mvn,然后用该命令执行;`mvnd` 与 `mvn` 命令语法完全一致,仅替换可执行文件名即可。
|
|
184
|
+
|
|
185
|
+
#### 3.1 检测构建命令(每会话或首次时执行一次)
|
|
186
|
+
|
|
187
|
+
PowerShell:
|
|
188
|
+
```powershell
|
|
189
|
+
$mvndBin = Get-Command mvnd -ErrorAction SilentlyContinue
|
|
190
|
+
if ($mvndBin) { $MVN = $mvndBin.Source }
|
|
191
|
+
else { $mvnBin = Get-Command mvn -ErrorAction SilentlyContinue; if ($mvnBin) { $MVN = $mvnBin.Source } else { "请先安装 Maven 或 mvnd"; exit 1 } }
|
|
192
|
+
"build_cmd=$MVN"
|
|
193
|
+
```
|
|
194
|
+
POSIX:
|
|
195
|
+
```sh
|
|
196
|
+
MVN=$(command -v mvnd 2>/dev/null || command -v mvn 2>/dev/null); if [ -z "$MVN" ]; then echo "请先安装 Maven 或 mvnd"; exit 1; fi; echo "build_cmd=$MVN"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- 输出 `build_cmd=.../mvnd` → 后续用 `mvnd`(daemon 常驻 JVM,高频单测每次省 2-3s 启动)
|
|
200
|
+
- 输出 `build_cmd=.../mvn` → 用 `mvn`
|
|
201
|
+
- 没装任何 → 提示安装(`brew install maven-mvnd` / `sdk install mvnd` / `scoop install mvndaemon` / 或直接下 zip 解压 https://github.com/apache/maven-mvnd/releases)
|
|
202
|
+
|
|
203
|
+
#### 3.2 切 JDK + 跑构建(同一条命令)
|
|
204
|
+
|
|
205
|
+
PowerShell:
|
|
206
|
+
```powershell
|
|
207
|
+
python scripts/mvn_jdk_manager.py -q use <名称> | Invoke-Expression; & $MVN -v | Select-String "Java version"; & $MVN -T 1C -Dmaven.javadoc.skip=true -q <命令> -f <pom路径>; "exit=$LASTEXITCODE"
|
|
208
|
+
```
|
|
209
|
+
POSIX:
|
|
210
|
+
```sh
|
|
211
|
+
eval "$(python3 scripts/mvn_jdk_manager.py -q use <名称>)"; $MVN -v | grep "Java version"; $MVN -T 1C -Dmaven.javadoc.skip=true -q <命令> -f <pom路径>; echo "exit=$?"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- `$MVN -v` 看 `Java version:` 是否为期望主版本——不对就停(`use` 没生效多半是没在同条命令里 eval)。
|
|
215
|
+
- `-T 1C`:每核 1 线程并行构建(按 CPU 核数自动伸缩;不写死数字)。
|
|
216
|
+
- `-Dmaven.javadoc.skip=true`:跳过 javadoc 生成(日常开发不需要,慢得显著)。
|
|
217
|
+
- `-f <pom路径>` 显式指定 pom,别靠 cd。
|
|
218
|
+
- 末尾打印退出码用于判断,**退出码 0 即成功**,别被 PS 可能的 stderr 红框误导。
|
|
219
|
+
- **二次构建(依赖已就位)可加 `-o`**(离线模式),省去远程仓库校验。例如:
|
|
220
|
+
```sh
|
|
221
|
+
$MVN -T 1C -Dmaven.javadoc.skip=true -q -o clean compile -f <pom路径>
|
|
222
|
+
```
|
|
223
|
+
仅当本次构建只动源码、不引入新依赖时用 `-o`;改了 pom 加新依赖反而会报缺失。
|
|
224
|
+
|
|
225
|
+
## Maven 常用命令指南(默认带并行 + 跳过 javadoc + 安静模式)
|
|
226
|
+
|
|
227
|
+
> 下文命令中的 `mvn` 占位符按步骤 3.1 检测结果替换:装了 `mvnd` 则全部换成 `mvnd`,没装就用 `mvn`。两条命令语法完全一致。
|
|
228
|
+
|
|
229
|
+
### 子项目 pom 定位
|
|
230
|
+
多个子项目各自独立 pom,**一律 `-f` 指定**。具体版本以各项目 pom 的 `<java.version>` 为准(动态读取,不写死)。
|
|
231
|
+
|
|
232
|
+
### 常用命令
|
|
233
|
+
```
|
|
234
|
+
# 编译
|
|
235
|
+
mvn -T 1C -Dmaven.javadoc.skip=true -q clean compile -f <子项目>/pom.xml
|
|
236
|
+
# 打包(跳过测试)
|
|
237
|
+
mvn -T 1C -Dmaven.javadoc.skip=true -q clean package -DskipTests -f <子项目>/pom.xml
|
|
238
|
+
# 跑单个测试类(测试命令建议暂不加 -q,便于看测试结果;失败时才把输出给用户)
|
|
239
|
+
mvn -T 1C -Dmaven.javadoc.skip=true test -Dtest=ShippingIntentAgentTest -f <子项目>/pom.xml
|
|
240
|
+
# 跑单个测试方法
|
|
241
|
+
mvn -T 1C -Dmaven.javadoc.skip=true test -Dtest=ShippingIntentAgentTest#testMethodName -f <子项目>/pom.xml
|
|
242
|
+
# 编译安装到本地仓库(跳过测试)
|
|
243
|
+
mvn -T 1C -Dmaven.javadoc.skip=true -q clean install -DskipTests -f <子项目>/pom.xml
|
|
244
|
+
# 二次构建(依赖已就位)—— 加 -o 走离线模式
|
|
245
|
+
mvn -T 1C -Dmaven.javadoc.skip=true -q -o clean compile -f <子项目>/pom.xml
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### 常见参数错误规避
|
|
249
|
+
| 错误写法 | 正确写法 | 原因 |
|
|
250
|
+
|---|---|---|
|
|
251
|
+
| `mvn test -Dtest 类名` | `mvn test -Dtest=类名` | `-D` 参数要 `=`,不能空格 |
|
|
252
|
+
| `mvn test -Dtest=类名 方法` | `mvn test -Dtest=类名#方法` | 方法用 `#` 分隔,不是空格 |
|
|
253
|
+
| `mvn clean install` 不加 `-T` | `mvn -T 1C clean install` | 不并行慢;`1C` 按 CPU 核数自动 |
|
|
254
|
+
| 不写 javadoc 还跑 `mvn install` | `-Dmaven.javadoc.skip=true` | javadoc 生成很慢且本地不需要 |
|
|
255
|
+
| 改了 pom 加新依赖还 `-o` | 去掉 `-o` 或先单独 `-T 1C` 拉一次 | `-o` 离线模式无新依赖,加新依赖反而报缺失 |
|
|
256
|
+
| 装了 mvnd 还直接用 `mvn` | 先按步骤 3.1 检测,按 `build_cmd=...` 选命令 | 高频单测每次白付 2-3s 启动开销 |
|
|
257
|
+
| 切 JDK 与构建分两次 shell 调用 | 同一条命令: `use -q \| Invoke-Expression; & $MVN ...` | shell 状态不持久,分开则 use 不生效 |
|
|
258
|
+
| 跨子项目一条命令连跑 | 分开各自 `use` + 构建 | 跨子项目 JDK 可能不同,分开跑 |
|
|
259
|
+
| 给构建命令加 `2>&1`(PS) | 不加 | PS 5.1 把 stderr 包成 NativeCommandError 红框+假退出码255,即便成功也像报错 |
|
|
260
|
+
| 成功时贴满屏构建日志 | 用 `-q` 静默,只看退出码 | 符合预期的步骤不该像报错 |
|
|
261
|
+
|
|
262
|
+
### 大项目编译卡顿 / OOM
|
|
263
|
+
若按上述跑仍然频繁 GC 或 OOM,给当前 shell 设一下堆内存(不影响其他进程):
|
|
264
|
+
```sh
|
|
265
|
+
# 临时(仅当前 shell 生效)
|
|
266
|
+
export MAVEN_OPTS="-Xmx2g -Xms2g"
|
|
267
|
+
```
|
|
268
|
+
按机器内存调整:8G 内存机可上 `-Xmx3g`,16G+ 可上 `-Xmx4g`。**不是默认**,仅出现上述症状时设。
|
|
269
|
+
|
|
270
|
+
### 本地测试噪音(非失败,别误判,别当报错展示给用户)
|
|
271
|
+
- **三方依赖 pom 缺 version 的 `[ERROR]`**:Maven 解析三方 jar(如 `crm-weixin-api`)的 pom 时,若其 `commons-api`/`hibernate-validator` 缺 `<version>`,会打 `[ERROR] ... is missing`。这是告警性的、不影响编译、不是你的代码问题。用 `-q` 可压制;判成败只看最终 `BUILD SUCCESS/FAILURE` 与退出码。
|
|
272
|
+
- **PowerShell 的 `Error: Exit code 255` 红框**:PS 5.1 把 mvn 走 stderr 的日志包成 `NativeCommandError` 并报假退出码 255,**即便 mvn 实际 exit 0**。这是 PS 包装的假象,不是 mvn 失败。别加 `2>&1`,判成败只看 `$LASTEXITCODE`。
|
|
273
|
+
- log4j2 报 `FileNotFoundException: /data/webapps/appenv`(Linux 路径)→ 本地正常,不影响结果。
|
|
274
|
+
- 文本块在低版本 JDK 下报"未结束的字符串文字/非法字符"→ JDK 不匹配,不是代码 bug,切对 JDK 即可。
|
|
275
|
+
|
|
276
|
+
## 输出要求(专业性)
|
|
277
|
+
|
|
278
|
+
- **成功时安静**:符合预期的步骤用一句话自然语言报告(如"web 模块编译成功,JDK21,并行 1C"),**不贴 mvn 原始日志、不展示 `[ERROR]`/`[WARNING]` 噪音、不展示 PS 红框**。中间步骤的脚本输出(pom 版本、ls 列表)可在执行时短暂出现,但结论用自然语言总结。
|
|
279
|
+
- **失败时才说话**:mvn 退出码非 0 时,把关键错误行(`[ERROR] ... FAILURE` 段)提炼出来,说明原因,不要整屏堆砌。
|
|
280
|
+
- **判成败只看退出码**(`$LASTEXITCODE`/`$?`),不看"有没有红字"——PS 的 stderr 红框是包装假象。
|
|
281
|
+
- `link` 用户给定路径属写本机注册表,登记前让用户确认路径;skill 本身不联网下载 JDK。
|