oh-my-customcode 0.163.0 → 0.164.0
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/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -112,46 +112,73 @@ steps:
|
|
|
112
112
|
|
|
113
113
|
- name: compression-mode-eval
|
|
114
114
|
prompt: |
|
|
115
|
-
Evaluate
|
|
115
|
+
Evaluate the pipeline compression mode (G6). Three tiers exist:
|
|
116
|
+
docs-only (heaviest compression) → lite (intermediate) → standard (no compression).
|
|
116
117
|
|
|
117
|
-
##
|
|
118
|
+
## Reference
|
|
118
119
|
|
|
119
|
-
|
|
120
|
+
.claude/skills/pipeline/labels.md — "Compression Eligibility" section
|
|
120
121
|
|
|
121
|
-
|
|
122
|
+
## Tier 1 — docs-only
|
|
123
|
+
|
|
124
|
+
Conditions (BOTH must hold):
|
|
122
125
|
1. scope size ≤ 3 (number of issues in release manifest)
|
|
123
126
|
2. ALL scoped issues have labels ∩ {documentation, automated, claude-code-release, enhancement-yaml-only} ≠ ∅
|
|
124
127
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
If BOTH conditions met → set compression_mode=docs-only
|
|
128
|
+
If met → set compression_mode=docs-only
|
|
128
129
|
- triage step: skip professor-triage skill; perform direct manifest summary instead
|
|
129
130
|
- plan step: skip release-plan skill; single-response plan instead
|
|
130
131
|
- deep-plan step: skip deep-plan skill; single-response implementation notes instead
|
|
131
132
|
- deep-verify step: skip deep-verify skill; perform self-review checklist instead
|
|
132
133
|
- Log: "[compression-mode] docs-only compression activated (scope={n}, all docs/yaml labels)"
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
## Tier 2 — lite (intermediate)
|
|
136
|
+
|
|
137
|
+
Evaluate ONLY if docs-only NOT met. Conditions (ALL must hold):
|
|
138
|
+
1. scope size ≤ 7
|
|
139
|
+
2. ALL scoped issues are low-risk: for EVERY issue,
|
|
140
|
+
labels ∩ {documentation, automated, claude-code-release, feedback, professor, enhancement} ≠ ∅
|
|
141
|
+
3. NO scoped issue carries a breaking-change or decision-needed label
|
|
142
|
+
4. No code logic change is expected — work is docs/rule/skill/config/script-centric
|
|
143
|
+
(verify against each issue body; if any issue implies application code logic change, FAIL the lite check)
|
|
144
|
+
|
|
145
|
+
If met → set compression_mode=lite
|
|
146
|
+
- triage step: MAY replace professor-triage skill spawn with orchestrator integrated analysis
|
|
147
|
+
- plan step: MAY replace release-plan skill spawn with orchestrator integrated analysis
|
|
148
|
+
- deep-plan step: MAY replace deep-plan skill spawn with orchestrator integrated analysis
|
|
149
|
+
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check
|
|
150
|
+
(instead of full deep-verify skill spawn)
|
|
151
|
+
- implement / verify-build / release / ci-check / post-release-followup: execute normally (no compression)
|
|
152
|
+
- MANDATORY justification log (REQUIRED whenever a skill stage is replaced by integrated analysis):
|
|
153
|
+
"[compression-mode] lite — skill 단계 통합 분석 대체. 정당화: scope={n}, 모든 이슈 저위험(라벨 {labels}), 구현 대상 이슈 본문 명시 {issue_refs}"
|
|
154
|
+
- If the justification cannot be stated concretely (e.g., a stage cannot be safely integrated),
|
|
155
|
+
do NOT compress that stage — fall back to full skill spawn for it.
|
|
156
|
+
|
|
157
|
+
## Tier 3 — standard (fallback)
|
|
158
|
+
|
|
159
|
+
If neither docs-only nor lite met → set compression_mode=standard
|
|
135
160
|
- All pipeline steps execute normally with full skill spawns
|
|
136
|
-
- Log: "[compression-mode] standard mode (scope={n}, mixed labels or
|
|
161
|
+
- Log: "[compression-mode] standard mode (scope={n}, mixed/high-risk labels, large scope, or code logic change)"
|
|
162
|
+
|
|
163
|
+
## Output
|
|
137
164
|
|
|
138
|
-
|
|
139
|
-
description: "Evaluate docs-only
|
|
165
|
+
compression_mode ∈ {docs-only, lite, standard} as pipeline state for downstream steps.
|
|
166
|
+
description: "Evaluate compression tier (docs-only/lite/standard); set compression_mode state"
|
|
140
167
|
depends_on: scope-selection
|
|
141
168
|
|
|
142
169
|
- name: triage
|
|
143
170
|
skill: professor-triage
|
|
144
|
-
description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if
|
|
171
|
+
description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite"
|
|
145
172
|
depends_on: compression-mode-eval
|
|
146
173
|
|
|
147
174
|
- name: plan
|
|
148
175
|
skill: release-plan
|
|
149
|
-
description: "Release unit plan from triaged issues — skipped if
|
|
176
|
+
description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite"
|
|
150
177
|
depends_on: triage
|
|
151
178
|
|
|
152
179
|
- name: deep-plan
|
|
153
180
|
skill: deep-plan
|
|
154
|
-
description: "Research-validated implementation plan (research → plan → verify) — skipped if
|
|
181
|
+
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite"
|
|
155
182
|
depends_on: plan
|
|
156
183
|
|
|
157
184
|
- name: implement
|
|
@@ -229,7 +256,7 @@ steps:
|
|
|
229
256
|
|
|
230
257
|
- name: deep-verify
|
|
231
258
|
skill: deep-verify
|
|
232
|
-
description: "Multi-angle release quality verification — self-review checklist
|
|
259
|
+
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite"
|
|
233
260
|
depends_on: verify-build
|
|
234
261
|
|
|
235
262
|
- name: release
|
|
@@ -15,7 +15,17 @@
|
|
|
15
15
|
# "rate_limits": { (v2.1.80+, optional)
|
|
16
16
|
# "five_hour": { "used_percentage": 10, "resets_at": 1773979200 },
|
|
17
17
|
# "seven_day": { "used_percentage": 90, "resets_at": 1773979200 }
|
|
18
|
-
# }
|
|
18
|
+
# },
|
|
19
|
+
# "output_style": "korean-engineer", (v2.1.145+, optional)
|
|
20
|
+
# "gh": { (v2.1.145+, optional, #1197)
|
|
21
|
+
# "repo": "owner/repo",
|
|
22
|
+
# "pr_number": 1234,
|
|
23
|
+
# "pr_state": "OPEN"
|
|
24
|
+
# },
|
|
25
|
+
# "agents": [ (v2.1.145+, optional, #1195)
|
|
26
|
+
# { "name": "researcher-1", "status": "running" },
|
|
27
|
+
# { "name": "researcher-2", "status": "running" }
|
|
28
|
+
# ]
|
|
19
29
|
# }
|
|
20
30
|
#
|
|
21
31
|
# External status line providers (#1275):
|
|
@@ -77,22 +87,35 @@ fi
|
|
|
77
87
|
|
|
78
88
|
# ---------------------------------------------------------------------------
|
|
79
89
|
# 4. Single jq call — extract all fields as TSV
|
|
80
|
-
# Fields: model_name, project_dir, ctx_pct, ctx_size, cost_usd,
|
|
90
|
+
# Fields: model_name, project_dir, ctx_pct, ctx_size, cost_usd,
|
|
91
|
+
# rl_5h_pct, rl_7d_pct, rl_5h_resets, rl_7d_resets,
|
|
92
|
+
# gh_repo, gh_pr_number, gh_pr_state, agent_count (v2.1.145+)
|
|
81
93
|
# ---------------------------------------------------------------------------
|
|
82
|
-
|
|
94
|
+
# Note: empty string fields are emitted as sentinel "_" to prevent
|
|
95
|
+
# bash `read` from collapsing leading empty TSV fields (bash 3.2 IFS quirk).
|
|
96
|
+
IFS=$'\t' read -r model_name project_dir ctx_pct ctx_size cost_usd rl_5h_pct rl_7d_pct rl_5h_resets rl_7d_resets gh_repo gh_pr_number gh_pr_state agent_count <<< "$(
|
|
83
97
|
printf '%s' "$json" | jq -r '[
|
|
84
98
|
(.model.display_name // "unknown"),
|
|
85
|
-
(.workspace.current_dir // ""),
|
|
99
|
+
((.workspace.current_dir // "") | if . == "" then "_" else . end),
|
|
86
100
|
(if .context_window.used != null and .context_window.total != null and .context_window.total > 0 then (.context_window.used / .context_window.total * 100) elif .context_window.used_percentage != null then .context_window.used_percentage else 0 end),
|
|
87
101
|
(.context_window.context_window_size // 0),
|
|
88
102
|
(.cost.total_cost_usd // 0),
|
|
89
103
|
(.rate_limits.five_hour.used_percentage // -1),
|
|
90
104
|
(.rate_limits.seven_day.used_percentage // -1),
|
|
91
105
|
(.rate_limits.five_hour.resets_at // -1),
|
|
92
|
-
(.rate_limits.seven_day.resets_at // -1)
|
|
106
|
+
(.rate_limits.seven_day.resets_at // -1),
|
|
107
|
+
((.gh.repo // "") | if . == "" then "_" else . end),
|
|
108
|
+
(.gh.pr_number // -1),
|
|
109
|
+
((.gh.pr_state // "") | if . == "" then "_" else . end),
|
|
110
|
+
(if (.agents | type) == "array" then (.agents | length) else -1 end)
|
|
93
111
|
] | @tsv'
|
|
94
112
|
)"
|
|
95
113
|
|
|
114
|
+
# Convert sentinel "_" back to empty string for downstream code
|
|
115
|
+
[[ "$project_dir" == "_" ]] && project_dir=""
|
|
116
|
+
[[ "$gh_repo" == "_" ]] && gh_repo=""
|
|
117
|
+
[[ "$gh_pr_state" == "_" ]] && gh_pr_state=""
|
|
118
|
+
|
|
96
119
|
# ---------------------------------------------------------------------------
|
|
97
120
|
# 4b. Cost & context data bridge — write to temp file for hooks
|
|
98
121
|
# ---------------------------------------------------------------------------
|
|
@@ -240,10 +263,30 @@ if [[ -n "$git_branch" && -n "$project_dir" ]]; then
|
|
|
240
263
|
fi
|
|
241
264
|
|
|
242
265
|
# ---------------------------------------------------------------------------
|
|
243
|
-
# 8. PR number —
|
|
266
|
+
# 8. PR number — prefer v2.1.145 native gh.* JSON fields; fall back to gh CLI cache
|
|
244
267
|
# ---------------------------------------------------------------------------
|
|
245
268
|
pr_display=""
|
|
246
|
-
|
|
269
|
+
|
|
270
|
+
# 8a. Native gh.* fields (CC v2.1.145+, #1197) — zero-cost, no subprocess
|
|
271
|
+
if [[ "$gh_pr_number" =~ ^[0-9]+$ ]] && [[ "$gh_pr_number" -gt 0 ]]; then
|
|
272
|
+
case "$gh_pr_state" in
|
|
273
|
+
OPEN) pr_state_label="open" ;;
|
|
274
|
+
CLOSED) pr_state_label="closed" ;;
|
|
275
|
+
MERGED) pr_state_label="merged" ;;
|
|
276
|
+
DRAFT) pr_state_label="draft" ;;
|
|
277
|
+
"") pr_state_label="" ;;
|
|
278
|
+
*) # bash 3.2 compatible lowercase via tr
|
|
279
|
+
pr_state_label="$(printf '%s' "$gh_pr_state" | tr '[:upper:]' '[:lower:]')" ;;
|
|
280
|
+
esac
|
|
281
|
+
if [[ -n "$pr_state_label" ]]; then
|
|
282
|
+
pr_display="PR #${gh_pr_number} (${pr_state_label})"
|
|
283
|
+
else
|
|
284
|
+
pr_display="PR #${gh_pr_number}"
|
|
285
|
+
fi
|
|
286
|
+
fi
|
|
287
|
+
|
|
288
|
+
# 8b. Fallback — gh CLI with per-branch cache (pre-v2.1.145 or repos without native gh.*)
|
|
289
|
+
if [[ -z "$pr_display" ]] && [[ -n "$git_branch" ]] && command -v gh >/dev/null 2>&1; then
|
|
247
290
|
cache_file="/tmp/statusline-pr-${project_name}"
|
|
248
291
|
cached_branch=""
|
|
249
292
|
cached_pr=""
|
|
@@ -348,6 +391,15 @@ if [[ -n "$wl_countdown" && -n "$wl_display" ]]; then
|
|
|
348
391
|
wl_display="${wl_display} ${wl_countdown}"
|
|
349
392
|
fi
|
|
350
393
|
|
|
394
|
+
# ---------------------------------------------------------------------------
|
|
395
|
+
# 9d. Active agents count (CC v2.1.145+, #1195)
|
|
396
|
+
# Only displayed when 1+ agents are active. agent_count=-1 means field absent.
|
|
397
|
+
# ---------------------------------------------------------------------------
|
|
398
|
+
agent_display=""
|
|
399
|
+
if [[ "$agent_count" =~ ^[0-9]+$ ]] && [[ "$agent_count" -ge 1 ]]; then
|
|
400
|
+
agent_display="A:${agent_count}"
|
|
401
|
+
fi
|
|
402
|
+
|
|
351
403
|
# ---------------------------------------------------------------------------
|
|
352
404
|
# 10. Assemble and output the status line
|
|
353
405
|
# ---------------------------------------------------------------------------
|
|
@@ -377,22 +429,30 @@ if [[ -n "$wl_display" ]]; then
|
|
|
377
429
|
wl_segment=" | ${wl_color}${wl_display}${COLOR_RESET}"
|
|
378
430
|
fi
|
|
379
431
|
|
|
432
|
+
# Build the agents segment (with separator) if present
|
|
433
|
+
agent_segment=""
|
|
434
|
+
if [[ -n "$agent_display" ]]; then
|
|
435
|
+
agent_segment=" | ${agent_display}"
|
|
436
|
+
fi
|
|
437
|
+
|
|
380
438
|
if [[ -n "$git_branch" ]]; then
|
|
381
|
-
printf "${cost_color}%s${COLOR_RESET} | %s | %s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
439
|
+
printf "${cost_color}%s${COLOR_RESET} | %s | %s%s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
382
440
|
"$cost_display" \
|
|
383
441
|
"$project_name" \
|
|
384
442
|
"$branch_display" \
|
|
385
443
|
"$pr_segment" \
|
|
386
444
|
"$rl_segment" \
|
|
387
445
|
"$wl_segment" \
|
|
446
|
+
"$agent_segment" \
|
|
388
447
|
"$ctx_display"
|
|
389
448
|
else
|
|
390
|
-
printf "${cost_color}%s${COLOR_RESET} | %s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
449
|
+
printf "${cost_color}%s${COLOR_RESET} | %s%s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
391
450
|
"$cost_display" \
|
|
392
451
|
"$project_name" \
|
|
393
452
|
"$pr_segment" \
|
|
394
453
|
"$rl_segment" \
|
|
395
454
|
"$wl_segment" \
|
|
455
|
+
"$agent_segment" \
|
|
396
456
|
"$ctx_display"
|
|
397
457
|
fi
|
|
398
458
|
|
package/templates/manifest.json
CHANGED
|
@@ -1,46 +1,326 @@
|
|
|
1
|
-
# /omcustom:workflow auto-dev — Full-auto release pipeline
|
|
2
|
-
# Pre-triages open issues → triage verify-done → plan → implement → verify → PR → followup
|
|
3
|
-
|
|
4
1
|
name: auto-dev
|
|
5
|
-
description: "
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
description: "Automated development pipeline — from issue triage to release"
|
|
3
|
+
version: "2.1.0"
|
|
4
|
+
|
|
5
|
+
# Design rule: each pipeline run produces ONE bounded release unit (3-7 issues), not all open issues.
|
|
6
|
+
# This pipeline is a project-agnostic template. Project-specific overrides belong in
|
|
7
|
+
# the project's own workflows/auto-dev.yaml (e.g., AgentNav, second-brain).
|
|
8
8
|
|
|
9
9
|
steps:
|
|
10
|
-
- name:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
- name: pre-triage
|
|
11
|
+
prompt: |
|
|
12
|
+
Phase 0 — Sync local with remote.
|
|
13
|
+
|
|
14
|
+
1. Fetch all remote state:
|
|
15
|
+
git fetch --all --tags --prune
|
|
16
|
+
|
|
17
|
+
2. Detect behind count vs origin/HEAD branch:
|
|
18
|
+
current_branch=$(git rev-parse --abbrev-ref HEAD)
|
|
19
|
+
behind=$(git rev-list --count HEAD..origin/$current_branch)
|
|
20
|
+
|
|
21
|
+
3. If behind > 0:
|
|
22
|
+
- Working tree clean (git status --short empty):
|
|
23
|
+
git pull --ff-only
|
|
24
|
+
report: "[pre-triage] synced $behind commits"
|
|
25
|
+
- Working tree dirty:
|
|
26
|
+
HALT with "[pre-triage] $behind commits behind, working tree dirty — manual reconcile required"
|
|
27
|
+
exit 1
|
|
28
|
+
|
|
29
|
+
4. Report current state:
|
|
30
|
+
- Latest tag: git tag --sort=-v:refname | head -1
|
|
31
|
+
- Local HEAD: git rev-parse --short HEAD
|
|
32
|
+
- Behind state: synced or 0
|
|
33
|
+
|
|
34
|
+
5. Cross-reference checks (advisory, do NOT halt):
|
|
35
|
+
a. Memory vs git consistency (G7):
|
|
36
|
+
- latest_tag=$(git tag --sort=-v:refname | head -1)
|
|
37
|
+
- Compare with "Last release" or equivalent line in pipeline memory/context
|
|
38
|
+
- If mismatch: stderr warning "[pre-triage] WARNING: memory says vX.Y.Z but git latest tag is vA.B.C — update memory after pipeline completion"
|
|
39
|
+
- Do NOT halt (advisory only — memory updates are session-end responsibility)
|
|
40
|
+
|
|
41
|
+
b. Issue body stale version references (G5):
|
|
42
|
+
- Retrieve open issues: gh issue list --state open --limit 100 --json number,body
|
|
43
|
+
- For each issue body, extract all vX.Y.Z patterns (regex: v\d+\.\d+\.\d+)
|
|
44
|
+
- Retrieve git tag list: git tag --list
|
|
45
|
+
- Flag any issue referencing a version not present in git tags:
|
|
46
|
+
"[pre-triage] WARNING: Issue #N references vX.Y.Z (not in git tags) — body may be stale"
|
|
47
|
+
- Output all warnings as advisory log; do NOT halt
|
|
48
|
+
|
|
49
|
+
Phase 1 — Ensure required labels exist, then scan issues.
|
|
50
|
+
|
|
51
|
+
1. Create labels if missing (idempotent):
|
|
52
|
+
gh label create in-progress --color "FBCA04" --description "Work in progress" --force 2>/dev/null
|
|
53
|
+
gh label create verify-ready --color "0E8A16" --description "Ready for verification" --force 2>/dev/null
|
|
54
|
+
gh label create needs-review --color "D93F0B" --description "Needs manual review" --force 2>/dev/null
|
|
55
|
+
|
|
56
|
+
2. Scan open GitHub issues:
|
|
57
|
+
gh issue list --state open --limit 100 --json number,title,labels,body,milestone
|
|
58
|
+
|
|
59
|
+
3. Group by label and compute for each issue:
|
|
60
|
+
- dependencies: parse "see #N", "depends on #N", "#N 참조" from body
|
|
61
|
+
- blocked_by_decision: true if body references any decision-needed issue
|
|
62
|
+
- effort: XS/S/M/L from scope
|
|
63
|
+
- order: topological sort over dependencies
|
|
64
|
+
|
|
65
|
+
4. Output: dependency-sorted issue table with blocked_by_decision flag.
|
|
66
|
+
description: "Sync remote, stale-version check, memory consistency check, scan issues"
|
|
67
|
+
|
|
68
|
+
- name: scope-selection
|
|
69
|
+
prompt: |
|
|
70
|
+
Select a single bounded release scope (3-7 issues) for THIS pipeline run.
|
|
71
|
+
|
|
72
|
+
## Step 0 — Milestone state pre-check (G3)
|
|
73
|
+
|
|
74
|
+
Before creating a milestone for version vX.Y.Z:
|
|
75
|
+
1. Query all milestones (open and closed):
|
|
76
|
+
existing=$(gh api 'repos/{owner}/{repo}/milestones?state=all&per_page=100' --jq '.[] | select(.title == "vX.Y.Z") | "\(.number)|\(.state)"')
|
|
77
|
+
2. Evaluate:
|
|
78
|
+
- If existing && state=closed:
|
|
79
|
+
HALT with "[scope-selection] BLOCKED: milestone vX.Y.Z already exists and is closed. Bump version or reopen milestone manually."
|
|
80
|
+
- If existing && state=open:
|
|
81
|
+
Use existing milestone as-is (do not create new)
|
|
82
|
+
- If not existing:
|
|
83
|
+
Create new milestone: gh api repos/{owner}/{repo}/milestones --method POST --field title="vX.Y.Z"
|
|
84
|
+
|
|
85
|
+
## Step 1 — Label-based filtering (G4)
|
|
86
|
+
|
|
87
|
+
Reference label semantics: .claude/skills/pipeline/labels.md
|
|
88
|
+
|
|
89
|
+
Apply filter rules:
|
|
90
|
+
- EXCLUDE: blocked_by_decision == true OR labels ∩ {decision-needed, needs-review, verify-done, manual-action, in-progress} ≠ ∅
|
|
91
|
+
- INCLUDE (preferred): labels ∩ {verify-ready, claude-code-release, documentation} ≠ ∅
|
|
92
|
+
- INCLUDE (standard): P1/P2/P3 issues not in excluded set
|
|
93
|
+
- Tie-break: P1 > P2 > P3 > unclassified
|
|
94
|
+
|
|
95
|
+
## Step 2 — Selection rules
|
|
96
|
+
|
|
97
|
+
1. Determine release tier:
|
|
98
|
+
- No tags yet → v0.1.0
|
|
99
|
+
- Otherwise: highest-priority open tier (bug → chore → feature)
|
|
100
|
+
2. Apply Step 1 filter (label-based exclusion and preference)
|
|
101
|
+
3. Sort by dependency: prerequisites before dependents
|
|
102
|
+
4. Cap at 7 issues; if priority issues < 7, stop at that priority (don't mix tiers)
|
|
103
|
+
5. Minimum 1 issue; if 0 eligible, halt with "no eligible issues for auto-dev run"
|
|
104
|
+
|
|
105
|
+
Assign scoped issues to milestone.
|
|
106
|
+
Output markdown release manifest:
|
|
107
|
+
| order | # | title | prerequisite | effort | labels |
|
|
108
|
+
|
|
109
|
+
Persist manifest as pipeline state for subsequent steps.
|
|
110
|
+
description: "Milestone state pre-check, label filter, pick 3-7 issues as v{X.Y.Z} scope"
|
|
111
|
+
depends_on: pre-triage
|
|
112
|
+
|
|
113
|
+
- name: compression-mode-eval
|
|
114
|
+
prompt: |
|
|
115
|
+
Evaluate the pipeline compression mode (G6). Three tiers exist:
|
|
116
|
+
docs-only (heaviest compression) → lite (intermediate) → standard (no compression).
|
|
117
|
+
|
|
118
|
+
## Reference
|
|
119
|
+
|
|
120
|
+
.claude/skills/pipeline/labels.md — "Compression Eligibility" section
|
|
121
|
+
|
|
122
|
+
## Tier 1 — docs-only
|
|
123
|
+
|
|
124
|
+
Conditions (BOTH must hold):
|
|
125
|
+
1. scope size ≤ 3 (number of issues in release manifest)
|
|
126
|
+
2. ALL scoped issues have labels ∩ {documentation, automated, claude-code-release, enhancement-yaml-only} ≠ ∅
|
|
127
|
+
|
|
128
|
+
If met → set compression_mode=docs-only
|
|
129
|
+
- triage step: skip professor-triage skill; perform direct manifest summary instead
|
|
130
|
+
- plan step: skip release-plan skill; single-response plan instead
|
|
131
|
+
- deep-plan step: skip deep-plan skill; single-response implementation notes instead
|
|
132
|
+
- deep-verify step: skip deep-verify skill; perform self-review checklist instead
|
|
133
|
+
- Log: "[compression-mode] docs-only compression activated (scope={n}, all docs/yaml labels)"
|
|
134
|
+
|
|
135
|
+
## Tier 2 — lite (intermediate)
|
|
136
|
+
|
|
137
|
+
Evaluate ONLY if docs-only NOT met. Conditions (ALL must hold):
|
|
138
|
+
1. scope size ≤ 7
|
|
139
|
+
2. ALL scoped issues are low-risk: for EVERY issue,
|
|
140
|
+
labels ∩ {documentation, automated, claude-code-release, feedback, professor, enhancement} ≠ ∅
|
|
141
|
+
3. NO scoped issue carries a breaking-change or decision-needed label
|
|
142
|
+
4. No code logic change is expected — work is docs/rule/skill/config/script-centric
|
|
143
|
+
(verify against each issue body; if any issue implies application code logic change, FAIL the lite check)
|
|
144
|
+
|
|
145
|
+
If met → set compression_mode=lite
|
|
146
|
+
- triage step: MAY replace professor-triage skill spawn with orchestrator integrated analysis
|
|
147
|
+
- plan step: MAY replace release-plan skill spawn with orchestrator integrated analysis
|
|
148
|
+
- deep-plan step: MAY replace deep-plan skill spawn with orchestrator integrated analysis
|
|
149
|
+
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check
|
|
150
|
+
(instead of full deep-verify skill spawn)
|
|
151
|
+
- implement / verify-build / release / ci-check / post-release-followup: execute normally (no compression)
|
|
152
|
+
- MANDATORY justification log (REQUIRED whenever a skill stage is replaced by integrated analysis):
|
|
153
|
+
"[compression-mode] lite — skill 단계 통합 분석 대체. 정당화: scope={n}, 모든 이슈 저위험(라벨 {labels}), 구현 대상 이슈 본문 명시 {issue_refs}"
|
|
154
|
+
- If the justification cannot be stated concretely (e.g., a stage cannot be safely integrated),
|
|
155
|
+
do NOT compress that stage — fall back to full skill spawn for it.
|
|
156
|
+
|
|
157
|
+
## Tier 3 — standard (fallback)
|
|
158
|
+
|
|
159
|
+
If neither docs-only nor lite met → set compression_mode=standard
|
|
160
|
+
- All pipeline steps execute normally with full skill spawns
|
|
161
|
+
- Log: "[compression-mode] standard mode (scope={n}, mixed/high-risk labels, large scope, or code logic change)"
|
|
162
|
+
|
|
163
|
+
## Output
|
|
164
|
+
|
|
165
|
+
compression_mode ∈ {docs-only, lite, standard} as pipeline state for downstream steps.
|
|
166
|
+
description: "Evaluate compression tier (docs-only/lite/standard); set compression_mode state"
|
|
167
|
+
depends_on: scope-selection
|
|
168
|
+
|
|
169
|
+
- name: triage
|
|
170
|
+
skill: professor-triage
|
|
171
|
+
description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite"
|
|
172
|
+
depends_on: compression-mode-eval
|
|
19
173
|
|
|
20
174
|
- name: plan
|
|
21
|
-
depends_on: issue-analysis
|
|
22
175
|
skill: release-plan
|
|
23
|
-
description:
|
|
24
|
-
|
|
176
|
+
description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite"
|
|
177
|
+
depends_on: triage
|
|
25
178
|
|
|
26
179
|
- name: deep-plan
|
|
27
180
|
skill: deep-plan
|
|
28
|
-
description:
|
|
29
|
-
|
|
181
|
+
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite"
|
|
182
|
+
depends_on: plan
|
|
30
183
|
|
|
31
184
|
- name: implement
|
|
32
|
-
prompt:
|
|
33
|
-
|
|
34
|
-
|
|
185
|
+
prompt: |
|
|
186
|
+
Execute the deep-plan output for the scoped release manifest.
|
|
187
|
+
|
|
188
|
+
Per-issue lifecycle:
|
|
189
|
+
1. Start: gh issue edit <N> --add-label in-progress --assignee @me
|
|
190
|
+
2. Comment: gh issue comment <N> --body "Implementation started via auto-dev pipeline"
|
|
191
|
+
3. Dispatch specialist agents per file domain:
|
|
192
|
+
- Detect file types in scope and route to matching agent
|
|
193
|
+
- Use specialized agents (lang-*, be-*, fe-*, infra-*) over general-purpose
|
|
194
|
+
4. TDD via superpowers:test-driven-development when tests apply
|
|
195
|
+
5. Commit via mgr-gitnerd with `Fixes #<N>` trailer in body
|
|
196
|
+
6. On success: remove in-progress, add verify-ready
|
|
197
|
+
7. On failure: remove in-progress, add needs-review, comment error summary
|
|
198
|
+
|
|
199
|
+
Rules:
|
|
200
|
+
- Parallel execution per R009 (max 4 concurrent, respect dependencies)
|
|
201
|
+
- Issues whose prerequisites failed in-run MUST be skipped (log reason)
|
|
202
|
+
- No direct orchestrator writes (R010)
|
|
203
|
+
- All Agent tool calls MUST pass mode: "bypassPermissions" to prevent permission prompts during unattended execution
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
## Sensitive Path Handling (CC v2.1.121+)
|
|
207
|
+
|
|
208
|
+
Direct Write/Edit/Bash on `.claude/**` is permitted under `mode: "bypassPermissions"` as of CC v2.1.121 (#1101). The legacy `/tmp/*.sh` bypass is no longer required. Structural changes (new agents/skills) still go through mgr-creator with R017 verification.
|
|
209
|
+
|
|
210
|
+
For CC < v2.1.121 see git history for the legacy bypass pattern.
|
|
211
|
+
|
|
212
|
+
## Local CI-mimic verification (MUST run before marking implement done)
|
|
213
|
+
|
|
214
|
+
After all implementation tasks complete, run these scripts in sequence and halt on failure:
|
|
35
215
|
|
|
36
|
-
|
|
216
|
+
1. bash .github/scripts/verify-template-sync.sh
|
|
217
|
+
2. bash .github/scripts/verify-wiki-sync.sh
|
|
218
|
+
|
|
219
|
+
If either fails:
|
|
220
|
+
- For wiki-sync failures: delegate to wiki-curator to generate missing pages (`/omcustom:wiki ingest <path>`)
|
|
221
|
+
- For template-sync failures: delegate to mgr-updater to sync `.claude/` -> `templates/.claude/`
|
|
222
|
+
- After fixes, re-run the scripts until both pass
|
|
223
|
+
|
|
224
|
+
This mirrors CI and prevents the known 1-2 wasted push cycles per release (ref: issue #927, v0.98.0 PR #925).
|
|
225
|
+
description: "Per-issue implementation with lifecycle, specialist routing, and CI-mimic verification"
|
|
226
|
+
depends_on: deep-plan
|
|
227
|
+
|
|
228
|
+
- name: verify-build
|
|
229
|
+
prompt: |
|
|
230
|
+
Project-specific build + test verification.
|
|
231
|
+
|
|
232
|
+
For Node/Bun projects (this repo):
|
|
233
|
+
1. bun install — verify lockfile sync (halt on lockfile drift)
|
|
234
|
+
2. bun run lint (if package.json has lint script)
|
|
235
|
+
3. bun run typecheck (if available)
|
|
236
|
+
4. bun test — MANDATORY, no silent skip
|
|
237
|
+
- Baseline reference: #1156 historically documented 86 failures; v0.136.2 fixes resolved them → current baseline = 0
|
|
238
|
+
- Each release: adopt prior version's test result as baseline (dynamic, not hardcoded)
|
|
239
|
+
- Compute current pass/fail counts
|
|
240
|
+
- If current FAIL count > baseline → NEW regression detected → halt + report failure list
|
|
241
|
+
- If current FAIL count <= baseline → continue with advisory log "X failures (baseline {n}, delta {d})"
|
|
242
|
+
5. Build verification (if package has build script)
|
|
243
|
+
|
|
244
|
+
For Python/Go/Docker/static-site projects: auto-detect and run equivalent (py_compile + pytest / go build + go vet + go test / docker build / file validation).
|
|
245
|
+
|
|
246
|
+
Halt conditions:
|
|
247
|
+
- Lint errors (exit != 0)
|
|
248
|
+
- Typecheck errors
|
|
249
|
+
- NEW test failures (regression from baseline)
|
|
250
|
+
- Build failure
|
|
251
|
+
- Lockfile drift
|
|
252
|
+
|
|
253
|
+
Halt → report exact command + stderr + delta details. Do NOT proceed to release on any halt.
|
|
254
|
+
description: "Auto-detected build + test verification (bun test with baseline delta guard)"
|
|
255
|
+
depends_on: implement
|
|
256
|
+
|
|
257
|
+
- name: deep-verify
|
|
37
258
|
skill: deep-verify
|
|
38
|
-
description: Multi-angle release quality verification
|
|
259
|
+
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite"
|
|
260
|
+
depends_on: verify-build
|
|
39
261
|
|
|
40
262
|
- name: release
|
|
41
|
-
prompt:
|
|
42
|
-
|
|
263
|
+
prompt: |
|
|
264
|
+
Create a GitHub Release.
|
|
265
|
+
|
|
266
|
+
0. Pre-check (mandatory, delegate to mgr-gitnerd per R010): Detect and remove stale local `release` branch if present.
|
|
267
|
+
The local `release` branch (file ref) conflicts with `release/v*` directory ref namespace.
|
|
268
|
+
mgr-gitnerd executes (force-delete acceptable in automation context; warns if branch has unpushed commits):
|
|
269
|
+
if git show-ref --verify --quiet refs/heads/release; then
|
|
270
|
+
# Check for unpushed commits before force-delete
|
|
271
|
+
if [ -n "$(git log refs/heads/release ^origin/develop --oneline 2>/dev/null)" ]; then
|
|
272
|
+
echo "::warning::Local 'release' branch has unpushed commits — force-deleting anyway"
|
|
273
|
+
fi
|
|
274
|
+
git branch -D release
|
|
275
|
+
fi
|
|
276
|
+
Reference: issue #1141 (v0.135.0 follow-up), mgr-gitnerd MEMORY.md.
|
|
277
|
+
|
|
278
|
+
1. Version bump (mandatory):
|
|
279
|
+
Orchestrator delegates to mgr-updater (R010). mgr-updater executes the following atomic edits:
|
|
280
|
+
Determine NEW version per semver rules below.
|
|
281
|
+
npm project (package.json exists):
|
|
282
|
+
a. package.json: jq '.version = "<NEW>"' package.json > package.json.tmp && mv package.json.tmp package.json
|
|
283
|
+
b. templates/manifest.json: jq '.version = "<NEW>"' templates/manifest.json > templates/manifest.json.tmp && mv templates/manifest.json.tmp templates/manifest.json
|
|
284
|
+
c. mgr-gitnerd commit: "chore(release): bump to v<NEW>"
|
|
285
|
+
d. mgr-gitnerd push develop
|
|
286
|
+
e. mandatory verification (with existence guard for partial-update safety):
|
|
287
|
+
[ -f scripts/verify-version-sync.sh ] && bash scripts/verify-version-sync.sh || echo "::warning::verify-version-sync.sh not found, version sync verification skipped"
|
|
288
|
+
(verify-version-sync.sh 가 exit 1 시 release 단계 halt)
|
|
289
|
+
|
|
290
|
+
Version decision (semver):
|
|
291
|
+
- No existing tags → v0.1.0
|
|
292
|
+
- Previous tag exists → patch (bugfix) / minor (features) / major (breaking)
|
|
293
|
+
- Previous tag is ahead of source version (e.g., tag v0.136.1, package.json 0.136.0): use next available skip-version (0.136.2)
|
|
294
|
+
|
|
295
|
+
2. Release notes via omcustom-release-notes skill
|
|
296
|
+
3. Delegate to mgr-gitnerd:
|
|
297
|
+
- git tag + push
|
|
298
|
+
- gh release create
|
|
299
|
+
4. Close milestone
|
|
300
|
+
5. Close verify-ready issues with "Fixed in v{version}"
|
|
301
|
+
Label needs-review issues as "Deferred from v{version}"
|
|
302
|
+
6. Adapt release mechanism to project:
|
|
303
|
+
- npm project: PR + merge + npm publish verification
|
|
304
|
+
- Non-npm: direct tag on main (trunk-based)
|
|
305
|
+
description: "Git tag + GitHub Release + close milestone/issues (with mandatory version sync verification)"
|
|
306
|
+
depends_on: deep-verify
|
|
307
|
+
|
|
308
|
+
- name: ci-check
|
|
309
|
+
prompt: |
|
|
310
|
+
Post-release CI verification.
|
|
311
|
+
|
|
312
|
+
1. Check if .github/workflows/ has CI workflows
|
|
313
|
+
If NOT: skip with "No CI configured. Skipping." and continue.
|
|
314
|
+
2. If CI exists:
|
|
315
|
+
- gh run list --limit 5
|
|
316
|
+
- Wait for runs triggered by the new tag/push
|
|
317
|
+
- If failures: diagnose, fix, re-verify
|
|
318
|
+
3. For npm projects: verify npm publish succeeded (npm view <pkg> version)
|
|
319
|
+
4. Report final CI status.
|
|
320
|
+
description: "Post-release CI verification and fix loop"
|
|
321
|
+
depends_on: release
|
|
43
322
|
|
|
44
|
-
- name: followup
|
|
323
|
+
- name: post-release-followup
|
|
45
324
|
skill: post-release-followup
|
|
46
|
-
description:
|
|
325
|
+
description: "Register follow-ups from this release as new issues"
|
|
326
|
+
depends_on: ci-check
|