@elvis1513/auto-coding-skill 1.0.1 → 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 CHANGED
@@ -35,7 +35,7 @@ npm install -g git+https://github.com/elvis1513/auto-coding-skill.git
35
35
  - Synced reusable workflow improvements from a production project back into this skill.
36
36
  - Moved repo-side helper entrypoint to `docs/tools/autopipeline`.
37
37
  - Tightened regression matrix rules: rows start as `TODO`, and `PASS` requires real execution evidence.
38
- - Added Jenkins API verification flow with credentials sourced from `docs/ENGINEERING.md` or environment variables.
38
+ - Added Jenkins API verification flow with credentials sourced from `docs/ENGINEERING.md`.
39
39
 
40
40
  ## Optimized Standard Flow
41
41
 
@@ -53,12 +53,11 @@ npm install -g git+https://github.com/elvis1513/auto-coding-skill.git
53
53
  3. 开发实现
54
54
  - 只修改本次任务必要文件,不做无关重构。
55
55
  4. 本地轻量校验
56
- - build
57
- - 单元测试或关键快速测试
58
- - lint / typecheck
59
- - API 文档检查
60
- - Jenkinsfile / 脚本语法检查
56
+ - 优先执行一个项目自定义快速门禁命令
57
+ - 若未配置,再执行 quick test / test / build 中最先配置的一项
61
58
  - `git diff --check`
59
+ - API 文档检查
60
+ - Jenkins 配置检查
62
61
  5. 立即提交推送
63
62
  - 本地轻量校验通过后,commit + push,触发 Jenkins。
64
63
  6. Jenkins 验证
@@ -75,7 +74,7 @@ npm install -g git+https://github.com/elvis1513/auto-coding-skill.git
75
74
  默认不做:
76
75
  - 本地 Docker Compose 启动
77
76
  - 本地 Docker build
78
- - 本地完整 smoke / regression
77
+ - 本地完整 regression
79
78
  - 每个小改动强制 `check-matrix`
80
79
  - 每个小改动强制生成 summary
81
80
  - 未真实执行就要求 regression matrix 全 `PASS`
@@ -83,7 +82,7 @@ npm install -g git+https://github.com/elvis1513/auto-coding-skill.git
83
82
 
84
83
  按需保留:
85
84
  - `runtime-up` / `runtime-down`
86
- - 本地 health / smoke / regression
85
+ - 本地 health
87
86
  - `check-matrix`
88
87
  - `gen-summary`
89
88
  - deployment runbook / deployment record
@@ -120,9 +119,7 @@ It must be committed to Git. Do not add it to `.gitignore`.
120
119
 
121
120
  默认必填:
122
121
  - `project.name`
123
- - `commands.build`
124
- - `commands.quick_test` 或 `commands.test`
125
- - `commands.lint` 或 `commands.typecheck`
122
+ - `commands.light_gate` 或 `commands.quick_test` 或 `commands.test` 或 `commands.build`
126
123
  - `target_env.name`
127
124
  - `target_env.frontend_base_url`
128
125
  - `target_env.frontend_username`
@@ -130,6 +127,8 @@ It must be committed to Git. Do not add it to `.gitignore`.
130
127
  - `target_env.backend_base_url`
131
128
  - `target_env.backend_username`
132
129
  - `target_env.backend_password`
130
+ - `target_env.backend_root_username`
131
+ - `target_env.backend_root_password`
133
132
  - `target_env.health_base_url`
134
133
  - `target_env.health_path`
135
134
  - `jenkins.base_url`
@@ -200,6 +199,7 @@ It must be committed to Git. Do not add it to `.gitignore`.
200
199
  - How to record:
201
200
  - Fill YAML frontmatter once.
202
201
  - Keep target env front/backend usernames and passwords, Jenkins UI/API usernames and passwords, commands, docs paths here only.
202
+ - Target environment also includes backend server root username/password.
203
203
  - This file is expected to be committed to Git and maintained in plaintext for this workflow.
204
204
  - Remaining environment keys are all mandatory; blank values, TODO-like placeholders, and incorrect URL/path formats are treated as blocking errors by `doctor`.
205
205
  - Do not duplicate config elsewhere.
@@ -291,12 +291,6 @@ python3 docs/tools/autopipeline/ap.py commit-push <TASK_ID> \
291
291
  Available on-demand commands:
292
292
 
293
293
  ```bash
294
- python3 docs/tools/autopipeline/ap.py run build
295
- python3 docs/tools/autopipeline/ap.py run test
296
- python3 docs/tools/autopipeline/ap.py run quick_test
297
- python3 docs/tools/autopipeline/ap.py run lint
298
- python3 docs/tools/autopipeline/ap.py run typecheck
299
- python3 docs/tools/autopipeline/ap.py run script_syntax
300
294
  python3 docs/tools/autopipeline/ap.py doctor
301
295
  python3 docs/tools/autopipeline/ap.py verify-api-docs
302
296
  python3 docs/tools/autopipeline/ap.py verify-jenkins
@@ -306,8 +300,6 @@ python3 docs/tools/autopipeline/ap.py verify-jenkins-build --job-url <job-url> -
306
300
  python3 docs/tools/autopipeline/ap.py verify-jenkins-build --multibranch-root-job <root-job> --branch-name <branch> --build-number <number>
307
301
  python3 docs/tools/autopipeline/ap.py runtime-up
308
302
  python3 docs/tools/autopipeline/ap.py wait-health --scope runtime
309
- python3 docs/tools/autopipeline/ap.py run smoke
310
- python3 docs/tools/autopipeline/ap.py run regression
311
303
  python3 docs/tools/autopipeline/ap.py runtime-down
312
304
  python3 docs/tools/autopipeline/ap.py check-matrix
313
305
  python3 docs/tools/autopipeline/ap.py gen-summary <TASK_ID>
@@ -332,7 +324,7 @@ python3 docs/tools/autopipeline/ap.py gen-summary <TASK_ID>
332
324
  - `doctor`
333
325
  - Checks whether the default lightweight workflow is actually configured instead of silently skipping gates.
334
326
  - `light-gate`
335
- - Now fails if required commands are missing instead of returning `OK` after skipping everything.
327
+ - Now prefers one curated fast gate command instead of serially running every expensive check.
336
328
  - `verify-target`
337
329
  - Performs real target-environment verification beyond health checks when you provide key backend/frontend paths.
338
330
  - `commit-push --record-closure`
@@ -77,9 +77,7 @@ Do not hide `docs/ENGINEERING.md` in `.gitignore`.
77
77
 
78
78
  Minimum required config for the default flow:
79
79
  - `project.name`
80
- - `commands.build`
81
- - `commands.quick_test` or `commands.test`
82
- - `commands.lint` or `commands.typecheck`
80
+ - `commands.light_gate` or `commands.quick_test` or `commands.test` or `commands.build`
83
81
  - `target_env.name`
84
82
  - `target_env.frontend_base_url`
85
83
  - `target_env.frontend_username`
@@ -87,6 +85,8 @@ Minimum required config for the default flow:
87
85
  - `target_env.backend_base_url`
88
86
  - `target_env.backend_username`
89
87
  - `target_env.backend_password`
88
+ - `target_env.backend_root_username`
89
+ - `target_env.backend_root_password`
90
90
  - `target_env.health_base_url`
91
91
  - `target_env.health_path`
92
92
  - `jenkins.base_url`
@@ -138,8 +138,6 @@ On-demand commands:
138
138
  ```bash
139
139
  python3 docs/tools/autopipeline/ap.py runtime-up
140
140
  python3 docs/tools/autopipeline/ap.py wait-health --scope runtime
141
- python3 docs/tools/autopipeline/ap.py run smoke
142
- python3 docs/tools/autopipeline/ap.py run regression
143
141
  python3 docs/tools/autopipeline/ap.py runtime-down
144
142
  python3 docs/tools/autopipeline/ap.py check-matrix
145
143
  python3 docs/tools/autopipeline/ap.py gen-summary <TASK_ID>
@@ -147,9 +145,9 @@ python3 docs/tools/autopipeline/ap.py gen-summary <TASK_ID>
147
145
 
148
146
  ## Quality policy
149
147
 
150
- - Default local gate is lightweight only: build, unit/quick test, lint, typecheck, API docs, Jenkinsfile / script syntax, `git diff --check`.
148
+ - Default local gate is lightweight and time-bounded: prefer one curated project command via `commands.light_gate`, then run only diff/API/Jenkins checks.
151
149
  - `doctor` should be used early to catch missing or invalid config before the first implementation loop.
152
- - `light-gate` now fails if the required default commands are not configured.
150
+ - `light-gate` now fails if no usable fast gate command is configured.
153
151
  - `doctor`, `light-gate`, and `commit-push` all fail when required environment fields are missing, placeholder-like, or syntactically invalid.
154
152
  - Do not require local Docker Compose or full local regression for every small change.
155
153
  - Jenkins and target environment verification are more valuable than repeated local simulation of deploy-only problems.
@@ -10,26 +10,17 @@ project:
10
10
  jenkinsfile: "Jenkinsfile"
11
11
 
12
12
  commands:
13
+ light_gate: ""
13
14
  build: ""
14
15
  test: ""
15
16
  quick_test: ""
16
17
  lint: ""
17
18
  typecheck: ""
18
19
  format: ""
19
- script_syntax: ""
20
- diff_check: ""
21
- docker_build: ""
22
- compose_up: ""
23
- compose_down: ""
24
- smoke: ""
25
- regression: ""
26
20
 
27
21
  runtime:
28
22
  docker_compose_file: ""
29
23
  docker_service: ""
30
- container_name: ""
31
- image: ""
32
- app_port: ""
33
24
  health_base_url: ""
34
25
  health_path: ""
35
26
  env_file: ""
@@ -43,6 +34,8 @@ target_env:
43
34
  backend_base_url: ""
44
35
  backend_username: ""
45
36
  backend_password: ""
37
+ backend_root_username: ""
38
+ backend_root_password: ""
46
39
  health_base_url: ""
47
40
  health_path: ""
48
41
 
@@ -79,7 +72,7 @@ docs:
79
72
  默认原则:
80
73
  - 默认不要求本地 Docker Compose 启动。
81
74
  - 默认不要求本地 Docker build。
82
- - 默认不要求本地完整 smoke / regression。
75
+ - 默认不要求本地完整 regression。
83
76
  - 默认不要求每个小改动生成长 summary。
84
77
  - 默认不要求 regression matrix 全 PASS。
85
78
  - 默认不要求 deployment record。
@@ -97,21 +90,20 @@ docs:
97
90
  ## 0. 配置填写(必须)
98
91
 
99
92
  先填写 `docs/ENGINEERING.md` frontmatter 中的所有空值。重点包括:
100
- - `commands.*`:本地轻量校验命令
93
+ - `commands.light_gate`:推荐配置一个项目级快速门禁命令,作为默认本地校验入口
101
94
  - `target_env.*`:目标环境前端 / 后端地址、用户名、密码,必须全部填写且真实可用
102
95
  - `jenkins.*`:Jenkins UI/API 用户名、密码、Job、分支、镜像、部署环境,必须全部填写且真实可用
103
96
 
104
97
  字段说明:
105
98
  - `target_env.backend_username` / `target_env.backend_password`:目标环境后台账号
99
+ - `target_env.backend_root_username` / `target_env.backend_root_password`:目标环境后台服务器 root 账号
106
100
  - `target_env.frontend_username` / `target_env.frontend_password`:目标环境前端登录账号
107
101
  - `jenkins.ui_username` / `jenkins.ui_password`:Jenkins 页面登录账号
108
102
  - `jenkins.api_user` / `jenkins.api_password`:Jenkins API 用户名 / 密码
109
103
 
110
104
  默认必填:
111
105
  - `project.name`
112
- - `commands.build`
113
- - `commands.quick_test` 或 `commands.test`
114
- - `commands.lint` 或 `commands.typecheck`
106
+ - `commands.light_gate` 或 `commands.quick_test` 或 `commands.test` 或 `commands.build`
115
107
  - `target_env.name`
116
108
  - `target_env.frontend_base_url`
117
109
  - `target_env.frontend_username`
@@ -119,6 +111,8 @@ docs:
119
111
  - `target_env.backend_base_url`
120
112
  - `target_env.backend_username`
121
113
  - `target_env.backend_password`
114
+ - `target_env.backend_root_username`
115
+ - `target_env.backend_root_password`
122
116
  - `target_env.health_base_url`
123
117
  - `target_env.health_path`
124
118
  - `jenkins.ui_username`
@@ -133,7 +127,7 @@ docs:
133
127
 
134
128
  按需填写:
135
129
  - `runtime.*`:仅在本地运行诊断时使用
136
- - `commands.compose_up` / `commands.compose_down` / `commands.smoke` / `commands.regression`
130
+ - `commands.build` / `commands.test` / `commands.quick_test` / `commands.lint` / `commands.typecheck` / `commands.format`:按项目实际情况保留
137
131
 
138
132
  ---
139
133
 
@@ -197,13 +191,12 @@ docs:
197
191
  只修改本次任务必要文件,不做无关重构。
198
192
 
199
193
  4. 本地轻量校验
200
- 默认只跑:
201
- - 编译 / build
202
- - 单元测试或关键快速测试
203
- - lint / typecheck
204
- - API 文档检查
205
- - Jenkinsfile / 脚本语法检查
194
+ 默认只跑最少必要检查:
195
+ - 优先执行 `commands.light_gate`
196
+ - 若未配置,则执行 `quick_test` / `test` / `build` 中最先配置的一项
206
197
  - `git diff --check`
198
+ - API 文档检查
199
+ - Jenkins 配置检查
207
200
 
208
201
  5. 立即提交推送
209
202
  轻量校验通过后,commit + push,触发 Jenkins。
@@ -250,8 +243,6 @@ docs:
250
243
  - `runtime-up`
251
244
  - `runtime-down`
252
245
  - 本地 health check
253
- - 本地 `smoke`
254
- - 本地 `regression`
255
246
  - `check-matrix`
256
247
  - `gen-summary`
257
248
 
@@ -271,7 +262,7 @@ docs:
271
262
 
272
263
  说明:
273
264
  - `doctor`:检查默认流程必填项和常见配置错误。
274
- - `light-gate`:默认轻量门禁。
265
+ - `light-gate`:默认轻量门禁,优先执行项目自定义快速门禁命令。
275
266
  - `verify-target`:目标环境健康检查 + 按需关键 API / 页面验证。
276
267
  - `record-closure`:默认轻量闭环记录。
277
268
  - `check-matrix`、`gen-summary`、`runtime-up/down`:保留为按需工具。
@@ -3,18 +3,17 @@
3
3
  > 仅在任务需要独立 review 记录时使用;不是每个小改动的默认强制文档。
4
4
 
5
5
  ## 1. 静态分析结果
6
- - Command:lint / typecheck / script_syntax / diff_check
6
+ - Command:light_gate / diff_check / verify_api_docs / verify_jenkins
7
7
  - Summary:
8
8
  - Issues:
9
9
 
10
10
  ## 2. 本地轻量校验
11
- - build:
12
- - test or quick_test:
11
+ - light_gate or quick_test/test/build:
13
12
  - api docs:
14
- - jenkinsfile / scripts
13
+ - jenkins
15
14
 
16
15
  ## 3. 按需本地运行验证(如果有)
17
- - runtime-up / health / smoke / regression
16
+ - runtime-up / health:
18
17
 
19
18
  ## 4. Jenkins 与目标环境
20
19
  - Jenkins readiness:
@@ -19,7 +19,7 @@
19
19
  - 兼容性影响:
20
20
 
21
21
  ## 3. 质量证据
22
- - 本地轻量校验:build / test or quick_test / lint / typecheck / api docs / jenkinsfile / diff-check
22
+ - 本地轻量校验:light_gate or quick_test/test/build / api docs / jenkins / diff-check
23
23
  - Jenkins Build:
24
24
  - 目标环境验证:
25
25
  - 闭环记录:`docs/tasks/closure-log.md`
@@ -317,12 +317,12 @@ def _resolve_jenkins_job_candidates(
317
317
  ) -> List[str]:
318
318
  jenkins_cfg = (cfg.get("jenkins") or {})
319
319
  effective_branch = str(branch_name or "").strip()
320
- if not effective_branch:
320
+ effective_root = str(multibranch_root_job or "").strip()
321
+ if not effective_branch and effective_root:
321
322
  inferred_branch = _resolve_git_branch_name(repo, git_ref or "HEAD")
322
323
  if inferred_branch:
323
324
  effective_branch = inferred_branch
324
325
 
325
- effective_root = str(multibranch_root_job or "").strip()
326
326
  explicit_url = str(job_url or "").strip()
327
327
  explicit_name = str(job_name or "").strip()
328
328
  configured_url = str(jenkins_cfg.get("job_url") or "").strip()
@@ -423,6 +423,8 @@ def cmd_gen_summary(args: argparse.Namespace) -> None:
423
423
  staged = run(["git", "diff", "--cached", "--name-only"], cwd=repo, check=False).stdout.strip()
424
424
  unstaged = run(["git", "diff", "--name-only"], cwd=repo, check=False).stdout.strip()
425
425
  status = run(["git", "status", "--porcelain=v1"], cwd=repo, check=False).stdout.strip()
426
+ staged_block = "- " + staged.replace("\n", "\n- ") if staged else "- (none)"
427
+ unstaged_block = "- " + unstaged.replace("\n", "\n- ") if unstaged else "- (none)"
426
428
 
427
429
  content = f"""# Task Summary — {task_id} — {title}
428
430
 
@@ -442,9 +444,9 @@ def cmd_gen_summary(args: argparse.Namespace) -> None:
442
444
  ## 2. 变更概览
443
445
  ### Git change snapshot
444
446
  - Staged files:
445
- {('- ' + staged.replace('\n','\n- ')) if staged else '- (none)'}
447
+ {staged_block}
446
448
  - Unstaged files:
447
- {('- ' + unstaged.replace('\n','\n- ')) if unstaged else '- (none)'}
449
+ {unstaged_block}
448
450
  - Status:
449
451
  ```text
450
452
  {status}
@@ -454,7 +456,7 @@ def cmd_gen_summary(args: argparse.Namespace) -> None:
454
456
  - 变更记录位置:`{api_change_log}`
455
457
 
456
458
  ## 4. 质量证据
457
- - 本地轻量校验:build / test or quick_test / lint / typecheck / api docs / jenkinsfile / diff-check — TODO
459
+ - 本地轻量校验:light_gate or quick_test/test/build / api docs / jenkins / diff-check — TODO
458
460
  - Jenkins Build:TODO
459
461
  - 目标环境验证:TODO
460
462
  - 闭环记录:TODO
@@ -572,14 +574,8 @@ def _require_explicit_field(missing: List[str], field: str, value: object) -> No
572
574
 
573
575
 
574
576
  def _run_git_diff_check(repo: Path, cfg: dict) -> None:
575
- commands = (cfg.get("commands") or {})
576
- configured = str(commands.get("diff_check") or "").strip()
577
- if configured:
578
- print(f"[diff-check] {configured}")
579
- run_shell(configured, cwd=repo)
580
- else:
581
- print("[diff-check] git diff --check")
582
- run(["git", "diff", "--check"], cwd=repo)
577
+ print("[diff-check] git diff --check")
578
+ run(["git", "diff", "--check"], cwd=repo)
583
579
  print("[diff-check] OK")
584
580
 
585
581
 
@@ -613,38 +609,20 @@ def cmd_light_gate(args: argparse.Namespace) -> None:
613
609
  executed: List[str] = []
614
610
  missing: List[str] = []
615
611
 
616
- if not str(commands.get("build") or "").strip():
617
- missing.append("commands.build")
618
- else:
619
- _run_configured_command(repo, cfg, "build")
620
- executed.append("build")
621
-
622
- if str(commands.get("quick_test") or "").strip():
612
+ if str(commands.get("light_gate") or "").strip():
613
+ _run_configured_command(repo, cfg, "light_gate")
614
+ executed.append("light_gate")
615
+ elif str(commands.get("quick_test") or "").strip():
623
616
  _run_configured_command(repo, cfg, "quick_test")
624
617
  executed.append("quick_test")
625
618
  elif str(commands.get("test") or "").strip():
626
619
  _run_configured_command(repo, cfg, "test")
627
620
  executed.append("test")
621
+ elif str(commands.get("build") or "").strip():
622
+ _run_configured_command(repo, cfg, "build")
623
+ executed.append("build")
628
624
  else:
629
- missing.append("commands.quick_test or commands.test")
630
-
631
- static_executed = False
632
- if str(commands.get("lint") or "").strip():
633
- _run_configured_command(repo, cfg, "lint")
634
- executed.append("lint")
635
- static_executed = True
636
-
637
- if str(commands.get("typecheck") or "").strip():
638
- _run_configured_command(repo, cfg, "typecheck")
639
- executed.append("typecheck")
640
- static_executed = True
641
-
642
- if not static_executed:
643
- missing.append("commands.lint or commands.typecheck")
644
-
645
- if str(commands.get("script_syntax") or "").strip():
646
- _run_configured_command(repo, cfg, "script_syntax")
647
- executed.append("script_syntax")
625
+ missing.append("commands.light_gate or commands.quick_test or commands.test or commands.build")
648
626
 
649
627
  if missing:
650
628
  raise APError(
@@ -664,8 +642,6 @@ def cmd_runtime_up(args: argparse.Namespace) -> None:
664
642
  repo = Path(args.repo).resolve()
665
643
  cfg = _load_cfg(repo)
666
644
  runtime_cfg = (cfg.get("runtime") or {})
667
- if _run_configured_command(repo, cfg, "compose_up"):
668
- return
669
645
  compose_args = _compose_base_args(runtime_cfg) + ["up", "-d"]
670
646
  docker_service = str(runtime_cfg.get("docker_service") or "").strip()
671
647
  if docker_service:
@@ -679,8 +655,6 @@ def cmd_runtime_down(args: argparse.Namespace) -> None:
679
655
  repo = Path(args.repo).resolve()
680
656
  cfg = _load_cfg(repo)
681
657
  runtime_cfg = (cfg.get("runtime") or {})
682
- if _run_configured_command(repo, cfg, "compose_down"):
683
- return
684
658
  compose_args = _compose_base_args(runtime_cfg) + ["down", "--remove-orphans"]
685
659
  print(f"[runtime-down] {' '.join(compose_args)}")
686
660
  run(compose_args, cwd=repo)
@@ -811,12 +785,13 @@ def cmd_doctor(args: argparse.Namespace) -> None:
811
785
 
812
786
  if not str(project_cfg.get("name") or "").strip():
813
787
  missing.append("project.name")
814
- if not str(commands.get("build") or "").strip():
815
- missing.append("commands.build")
816
- if not (str(commands.get("quick_test") or "").strip() or str(commands.get("test") or "").strip()):
817
- missing.append("commands.quick_test or commands.test")
818
- if not (str(commands.get("lint") or "").strip() or str(commands.get("typecheck") or "").strip()):
819
- missing.append("commands.lint or commands.typecheck")
788
+ if not (
789
+ str(commands.get("light_gate") or "").strip()
790
+ or str(commands.get("quick_test") or "").strip()
791
+ or str(commands.get("test") or "").strip()
792
+ or str(commands.get("build") or "").strip()
793
+ ):
794
+ missing.append("commands.light_gate or commands.quick_test or commands.test or commands.build")
820
795
  _require_explicit_field(missing, "target_env.name", target_cfg.get("name"))
821
796
  _require_explicit_field(missing, "target_env.frontend_base_url", target_cfg.get("frontend_base_url"))
822
797
  _require_explicit_field(missing, "target_env.frontend_username", target_cfg.get("frontend_username"))
@@ -824,6 +799,8 @@ def cmd_doctor(args: argparse.Namespace) -> None:
824
799
  _require_explicit_field(missing, "target_env.backend_base_url", target_cfg.get("backend_base_url"))
825
800
  _require_explicit_field(missing, "target_env.backend_username", target_cfg.get("backend_username"))
826
801
  _require_explicit_field(missing, "target_env.backend_password", target_cfg.get("backend_password"))
802
+ _require_explicit_field(missing, "target_env.backend_root_username", target_cfg.get("backend_root_username"))
803
+ _require_explicit_field(missing, "target_env.backend_root_password", target_cfg.get("backend_root_password"))
827
804
  _require_explicit_field(missing, "target_env.health_base_url", target_cfg.get("health_base_url"))
828
805
  _require_explicit_field(missing, "target_env.health_path", target_cfg.get("health_path"))
829
806
 
@@ -856,8 +833,8 @@ def cmd_doctor(args: argparse.Namespace) -> None:
856
833
  _validate_url_field(warnings, "jenkins.job_url", jenkins_cfg.get("job_url"))
857
834
 
858
835
  runtime_enabled = any(str(runtime_cfg.get(key) or "").strip() for key in ["docker_compose_file", "docker_service", "health_base_url", "health_path"])
859
- if runtime_enabled and not (str(commands.get("compose_up") or "").strip() or str(runtime_cfg.get("docker_compose_file") or "").strip()):
860
- warnings.append("runtime config is partially enabled but compose_up or docker_compose_file is missing")
836
+ if runtime_enabled and not str(runtime_cfg.get("docker_compose_file") or "").strip():
837
+ warnings.append("runtime config is partially enabled but runtime.docker_compose_file is missing")
861
838
 
862
839
  try:
863
840
  timeout_s = int(jenkins_cfg.get("deploy_timeout_sec") or 0)
@@ -893,7 +870,9 @@ def cmd_verify_jenkins_build(args: argparse.Namespace) -> None:
893
870
  max_builds = int(args.max_builds or 20)
894
871
  timeout_s = int(args.timeout_sec or 300)
895
872
  poll_s = int(args.poll_sec or 5)
896
- inferred_branch = _resolve_git_branch_name(repo, git_ref)
873
+ inferred_branch = ""
874
+ if args.multibranch_root_job and not args.branch_name:
875
+ inferred_branch = _resolve_git_branch_name(repo, git_ref)
897
876
  branch_hint = str(args.branch_name or inferred_branch or "").strip()
898
877
  root_hint = str(
899
878
  args.multibranch_root_job
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elvis1513/auto-coding-skill",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "CLI installer for auto-coding-skill (Claude Code + Codex CLI) with Go fullstack + Jenkins workflow support.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,7 +13,7 @@
13
13
  "LICENSE"
14
14
  ],
15
15
  "scripts": {
16
- "test": "node -c cli/src/index.js",
16
+ "test": "node -c cli/src/index.js && python3 -c \"import ast, pathlib; files = ['src/auto-coding-skill/scripts/ap.py', 'src/auto-coding-skill/scripts/core.py', 'src/auto-coding-skill/scripts/http_checks.py', 'cli/assets/skill/scripts/ap.py', 'cli/assets/skill/scripts/core.py', 'cli/assets/skill/scripts/http_checks.py']; [ast.parse(pathlib.Path(rel).read_text(encoding='utf-8'), filename=rel, feature_version=(3, 11)) for rel in files]; print('python311-grammar-ok')\" && python3 -m py_compile src/auto-coding-skill/scripts/ap.py src/auto-coding-skill/scripts/core.py src/auto-coding-skill/scripts/http_checks.py cli/assets/skill/scripts/ap.py cli/assets/skill/scripts/core.py cli/assets/skill/scripts/http_checks.py && find src cli -type d -name '__pycache__' -prune -exec rm -rf {} +",
17
17
  "sync-assets": "node cli/src/sync-assets.js",
18
18
  "release:check": "npm run sync-assets && npm run test && npm pack --dry-run"
19
19
  },