oh-my-customcode 0.127.0 → 0.129.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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: goal
|
|
3
3
|
description: Disciplined goal-to-execution workflow for any user task. Parses objective, asks only for materially missing requirements via ambiguity-gate, inspects repo via idea, plans via sdd-dev or deep-plan, executes safely under project conventions, verifies completion per R020, and reports changed files with evidence. Use when user invokes /goal <task>.
|
|
4
|
+
version: 1.0.0
|
|
4
5
|
scope: core
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -3,7 +3,7 @@ name: omcustom-release-notes
|
|
|
3
3
|
description: Generate structured release notes from git history and closed issues within Claude Code session
|
|
4
4
|
scope: harness
|
|
5
5
|
user-invocable: true
|
|
6
|
-
argument-hint: "<version> [--previous-tag <tag>]"
|
|
6
|
+
argument-hint: "<version> [--previous-tag <tag>] | --backfill <range>"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Release Notes Generator
|
|
@@ -19,6 +19,7 @@ Replaces the CI-based `release-notes.yml` workflow that previously used Claude A
|
|
|
19
19
|
```
|
|
20
20
|
/omcustom-release-notes 0.36.0
|
|
21
21
|
/omcustom-release-notes 0.36.0 --previous-tag v0.35.3
|
|
22
|
+
/omcustom-release-notes --backfill v0.36.0..v0.127.0
|
|
22
23
|
```
|
|
23
24
|
|
|
24
25
|
## Workflow
|
|
@@ -99,13 +100,101 @@ The generated notes can be:
|
|
|
99
100
|
2. **File**: Written to `release_notes.md` for review before use
|
|
100
101
|
3. **Update**: Used with `gh release edit v{VERSION} --notes "{notes}"`
|
|
101
102
|
|
|
103
|
+
### Phase 5: Promote `## [Unreleased]` in CHANGELOG.md (Optional but Recommended)
|
|
104
|
+
|
|
105
|
+
After generating release notes, promote any pending `## [Unreleased]` entries to a versioned section so `release.yml` (awk extract at line ~217) finds the authored notes instead of falling back to GitHub auto-generated content.
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Promote [Unreleased] to [VERSION] with today's date
|
|
109
|
+
DATE=$(date -u +%Y-%m-%d)
|
|
110
|
+
python3 - "$VERSION" "$DATE" <<'PY'
|
|
111
|
+
import sys, re, pathlib
|
|
112
|
+
version, date = sys.argv[1], sys.argv[2]
|
|
113
|
+
path = pathlib.Path("CHANGELOG.md")
|
|
114
|
+
text = path.read_text()
|
|
115
|
+
header = f"## [{version}] - {date}"
|
|
116
|
+
if re.search(rf"^## \[{re.escape(version)}\]", text, flags=re.M):
|
|
117
|
+
print(f"[skip] [{version}] section already exists — manual reconciliation needed")
|
|
118
|
+
sys.exit(0)
|
|
119
|
+
new = re.sub(
|
|
120
|
+
r"^## \[Unreleased\]\s*\n",
|
|
121
|
+
f"## [Unreleased]\n\n{header}\n",
|
|
122
|
+
text,
|
|
123
|
+
count=1,
|
|
124
|
+
flags=re.M,
|
|
125
|
+
)
|
|
126
|
+
if new == text:
|
|
127
|
+
print("[error] [Unreleased] section not found — CHANGELOG.md format unexpected")
|
|
128
|
+
sys.exit(1)
|
|
129
|
+
path.write_text(new)
|
|
130
|
+
print(f"[ok] promoted [Unreleased] -> [{version}]")
|
|
131
|
+
PY
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Behavior:
|
|
135
|
+
- If `## [Unreleased]` content is empty, the promoted `## [VERSION]` will also be empty — `release.yml` falls back to auto-generated notes (existing behavior preserved).
|
|
136
|
+
- If `## [VERSION]` already exists (re-run, manual edit), the script skips with a log message — no overwrite.
|
|
137
|
+
- The skill caller commits the change: `git add CHANGELOG.md && git commit -m "chore(changelog): promote [Unreleased] to [VERSION]"`
|
|
138
|
+
|
|
139
|
+
This is **optional** — the skill's release-notes generation (Phases 1-4) works independently. Phase 5 only ensures CHANGELOG consistency for projects that maintain Keep a Changelog format.
|
|
140
|
+
|
|
141
|
+
## Backfill Mode
|
|
142
|
+
|
|
143
|
+
For projects with historical CHANGELOG.md gaps (releases shipped without `[Unreleased]` promotion), the skill provides a deterministic batch backfill.
|
|
144
|
+
|
|
145
|
+
### Usage
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
python3 scripts/backfill_changelog.py <START_TAG>..<END_TAG> [--output FILE]
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Or invoked via skill: `/omcustom-release-notes --backfill v0.36.0..v0.127.0`
|
|
152
|
+
|
|
153
|
+
### Behavior
|
|
154
|
+
|
|
155
|
+
For each tag in range (in reverse semver order), the script:
|
|
156
|
+
|
|
157
|
+
1. Determines previous tag (semver-immediately-before)
|
|
158
|
+
2. Reads `git log <prev>..<tag> --pretty=%s --no-merges` to extract commit subjects
|
|
159
|
+
3. Maps Conventional Commits prefix to Keep a Changelog category:
|
|
160
|
+
- `feat` → Added
|
|
161
|
+
- `fix` → Fixed
|
|
162
|
+
- `security` → Security
|
|
163
|
+
- `perf`, `refactor`, `chore`, `build`, `deps`, `revert` → Changed
|
|
164
|
+
- `docs`, `test`, `ci`, `style` → SKIPPED (internal-only, unless `!` breaking marker)
|
|
165
|
+
- Non-conventional → Changed (full subject as message)
|
|
166
|
+
4. Special handling for `release:` / `chore(release):` commits — extracts description after version (e.g., `release: v0.127.0 — DESC` → DESC under Changed)
|
|
167
|
+
5. Extracts issue refs (`#NNN`) and appends as `(#1, #2)` suffix
|
|
168
|
+
6. Renders per-version section with categories sorted: Added, Changed, Fixed, Security, Removed, Deprecated
|
|
169
|
+
7. Empty sections (zero qualifying commits) render as `_No user-visible changes (internal only)._`
|
|
170
|
+
|
|
171
|
+
### Output
|
|
172
|
+
|
|
173
|
+
Markdown text suitable for prepending to CHANGELOG.md between `## [Unreleased]` and the first existing version section.
|
|
174
|
+
|
|
175
|
+
### When to Use
|
|
176
|
+
|
|
177
|
+
- Adopting Keep a Changelog format on an existing project with N historical releases
|
|
178
|
+
- Recovering after a CHANGELOG drift period
|
|
179
|
+
- One-time bulk operation — afterward, use Phase 5 promotion (forward-looking) for ongoing maintenance
|
|
180
|
+
|
|
181
|
+
### Limitations
|
|
182
|
+
|
|
183
|
+
- Only as good as commit message quality. Squash-merge release commits typically contain only the PR title — backfill produces 1-2 lines per version, not exhaustive change lists
|
|
184
|
+
- Non-conventional or pre-Conventional Commits adoption commits land in Changed
|
|
185
|
+
- Manual curation may improve specific entries; the script provides the baseline
|
|
186
|
+
|
|
187
|
+
### Tests
|
|
188
|
+
|
|
189
|
+
`tests/scripts/test_backfill_changelog.py` covers parser correctness, semver sorting, category mapping, edge cases (40 tests).
|
|
190
|
+
|
|
102
191
|
## Integration
|
|
103
192
|
|
|
104
193
|
This skill is designed to be used during the release process:
|
|
105
194
|
|
|
106
195
|
```
|
|
107
196
|
/omcustom:npm-version patch|minor|major -> version bump
|
|
108
|
-
/omcustom-release-notes {version} -> generate notes
|
|
197
|
+
/omcustom-release-notes {version} -> generate notes + promote [Unreleased] (Phase 5)
|
|
109
198
|
mgr-gitnerd: gh release create -> create release with notes
|
|
110
199
|
```
|
|
111
200
|
|
|
@@ -115,6 +204,9 @@ mgr-gitnerd: gh release create -> create release with notes
|
|
|
115
204
|
- Uses git history and gh CLI for data gathering
|
|
116
205
|
- Claude Code analyzes and generates notes in-context
|
|
117
206
|
- Resource count changes auto-detected from CLAUDE.md history
|
|
207
|
+
- Phase 5 promotion is idempotent — safe to re-run; skips if `## [VERSION]` exists
|
|
208
|
+
- See `CONTRIBUTING.md` for [Unreleased] entry guidance during PR authoring
|
|
209
|
+
- For one-time historical backfill, see Backfill Mode above (script: `scripts/backfill_changelog.py`)
|
|
118
210
|
|
|
119
211
|
## Permission Mode
|
|
120
212
|
|
package/templates/manifest.json
CHANGED