Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ jobs:
- name: Publish Python Package to PyPI
if: ${{ !github.event.repository.private }}
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
continue-on-error: true
with:
skip-existing: true

1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Lightweight human-readable summary of meaningful repository changes.

## Unreleased

- Switched PyPI publishing in `.github/workflows/release.yml` to fail-closed by removing `continue-on-error: true` (#22).
- Added scalable GitHub governance: structured Issue Forms, source-controlled
label taxonomy, path-based PR labels, new-issue triage, weekly grouped
Dependabot updates targeting `develop`, and a dormant CODEOWNERS draft.
Expand Down
56 changes: 13 additions & 43 deletions handoff.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,31 @@

## Current task

Hotfix v1.1.1: closed two gaps discovered while deploying v1.1.0 —
`.claude-plugin/marketplace.json` missing the `owner` field (blocked
`claude plugin marketplace add` on Claude Code v2.1.263) and `pyproject.toml`
not in `scripts/sync_version.py`'s sync surface (v1.1.0 GitHub Release shipped a
1.0.1 wheel/sdist). Both fixes are landed on `fix/v1.1.1-hotfix`; ready to cut a
release.
Resolving GitHub Issue #22 (`Release: PyPI publish를 fail-closed로 전환`). Removed `continue-on-error: true` from `.github/workflows/release.yml` to make PyPI publish failures fail-closed.

## Touched files

- `.claude-plugin/marketplace.json` — added `$schema`, top-level `description`,
`owner.name` (mirrors the working `Agent-toolkit/.claude-plugin/marketplace.json`).
- `scripts/sync_version.py` — added `TOML_VERSION_SPECS` (`pyproject.toml`
`[project]` table), `TOML_VERSION_LINE_RE`, `_section_header_re()`,
`sync_toml_version()`. `require_known_paths()` now asserts the `[project]`
table is present. `main()` calls `sync_toml_version()`.
- `tests/unit/test_sync_version.py` — added 6 regression tests for TOML sync
(writes, idempotent, check-only, missing-section, other-table-untouched,
real-pyproject-drift guard).
- `skills/adr-toolkit/VERSION`, `SKILL.md` frontmatter, `.claude-plugin/plugin.json`,
`adapters/gemini-cli/gemini-extension.json`, `adapters/antigravity/plugin.json`,
`pyproject.toml` — all synced to 1.1.1 via `scripts/sync_version.py`.
- `changelog.md` — new `## v1.1.1 (2026-09-06)` section.
- `.github/workflows/release.yml` — removed `continue-on-error: true` from `Publish Python Package to PyPI` step.
- `improvements.md` — moved `PyPI publish fail-closed 재검토` from Open to Done.
- `changelog.md` — added note under `## Unreleased`.
- `handoff.md` — this file.

## Verification (local, Python 3.13 standalone — pytest not installed user-scope)
## Verification

- `scripts/sync_version.py --check`: **exit 0** (no drift, including pyproject.toml).
- 6 new TOML sync tests re-run as standalone assertions: **all pass**.
- `script/sync_version.py` and `tests/unit/test_sync_version.py` parse with
`ast.parse`: OK.
- Real-repo guard: `pyproject.toml` `[project] version` reports `1.1.1`, matches
`skills/adr-toolkit/VERSION`.
- `scripts/sync_version.py --check`: **exit 0**
- `.github/workflows/release.yml` YAML syntax validated via `yaml.safe_load`: **exit 0**
- `git status` / `git diff` clean and verified.

## Next step

1. Merge `fix/v1.1.1-hotfix` → `develop` (PR, CI must pass — including the
version-drift job, which now also checks pyproject.toml).
2. Open `release/v1.1.1` → `master` PR; after CI passes (release.yml runs the
full suite + tag == VERSION check), merge.
3. Back-merge `master` → `develop`.
4. Tag `v1.1.1` from `master` and push — `release.yml` runs pytest +
sync_version --check + tag == VERSION, then publishes a GitHub Release with
the skill tarball + sha256 + Python wheel/sdist, and publishes to PyPI via
Trusted Publisher (`continue-on-error: true`, tracked in improvements.md).
5. After release, refresh the local installs on the four harnesses
(Claude Code `~/.claude/skills/` symlink, Codex `~/.codex/skills/`,
Antigravity `~/.gemini/config/plugins/adr-toolkit/skills/adr-toolkit/`,
Cline `~/.agents/skills/`) to v1.1.1 — the same flow used to bring them to
v1.1.0 in the previous session.
1. Commit changes to `fix/issue-22-pypi-fail-closed` branch and push to origin (or PR into `develop`).
2. Close Issue #22 on GitHub (`gh issue close 22 --comment "Fixed via fail-closed release workflow update"`).
3. Proceed to next issue (e.g. Issue #30 PyPA license metadata modernization).

## Open risks

- PyPI Trusted Publisher still `continue-on-error: true` — known, tracked.
- Cline adapter still manually verified; `harness-parity` not covering Cline yet
(Medium backlog item from PR #36).
- PyPI publishing failure will now block release workflow completely (intended fail-closed behavior; requires PyPI Trusted Publisher credentials to be fully valid).
- Cline adapter still manually verified; `harness-parity` not covering Cline yet.
- Inherits prior Open risks (ruleset context sync, deferred automation).

## PR #43 pr-title-check stale re-trigger
Expand Down
5 changes: 1 addition & 4 deletions improvements.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,8 @@ Backlog derived from `docs/adr-toolkit-audit-report.md`, operational experiences
- [ ] *(전제조건: 저장소 2개 이상)* **조직 단위 ruleset/reusable workflow/audit export/taxonomy** — 여러 저장소가 같은 운영 문제를 반복할 때 설계 시작. 지금은 저장소가 1개뿐이라 시작 조건 미충족. (enterprise-adoption.md §6, §8 항목 5)
- [ ] *(다음 governance PR merge 직후)* **required-check context 동기화** — ruleset `22101891`에서 Python 3.9 context를 제거하고 Python 3.10 matrix, `lint`, `dependency-audit`를 required로 추가한 뒤 effective-rules API로 재검증한다.
- [ ] *(동일 drift 재발 시)* **ruleset 설정 검증 자동화** — classic branch-protection API와 repository ruleset API를 혼동한 감사 오류 및 CI check-name drift가 다시 발생하면 ruleset-as-code 또는 read-only verification script를 도입한다.
- [ ] **PyPI publish fail-closed 재검토** — Trusted Publisher가 안정화되면 release workflow의 `continue-on-error: true`를 제거해 GitHub Release와 PyPI가 부분 성공으로 갈라지지 않게 한다.
- [ ] **PyPA license metadata 현대화** — 2027-02-18 이전에 deprecated `project.license` table과 license classifier를 SPDX expression / `license-files`로 전환하고 최소 setuptools 버전을 맞춘다.

## Done

Normally this section stays empty between sessions (resolved items live in
`changelog.md` + git history instead, and this session's own architectural
decisions in `docs/decisions/ADR-0012..0016`).
- [x] **PyPI publish fail-closed 재검토** — Trusted Publisher가 안정화되어 release workflow의 `continue-on-error: true`를 제거하고 fail-closed로 전환 완료 (#22).