Skip to content

1.14.1 — apply the declared identity during bootstrap (#116), surface a shadowed VERSION + list dry-run permissions (#117) - #119

Merged
cportka merged 2 commits into
mainfrom
claude/code-repo-setup-practices-var7xm
Aug 1, 2026
Merged

cportka merged 2 commits into
mainfrom
claude/code-repo-setup-practices-var7xm

Conversation

@cportka

@cportka cportka commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Summary

Field-report round from a full greenfield build (cportka/design-a-home — bootstrapped, tested and shipped in one hosted session). The contract itself held end-to-end (#118); the two friction points it exposed are fixed here. repo-bootstrap → 1.14.1; video-bug-analyzer stays 1.14.0, evaluator/tab-chord stay 1.13.0. Closes #116, closes #117, closes #118.

#116 — --identity now applies to git config in the same run.
The SessionStart hook could only help the next session, but the run that declares the identity is usually the one whose first commits land — so a fresh bootstrap left user.email on the harness default until someone read the CLAUDE.md fine print. Bootstrap now writes user.name/user.email itself (from --identity or an existing .claude/commit-identity) and says so. Same guard as the hook — only when git config is unset or a noreply@ harness default — so a deliberate identity is never clobbered, and --dry-run states it would apply while writing nothing. The hook's rule widened from the literal noreply@anthropic.com to any noreply@ address so the two stay symmetric (a personal user@users.noreply.github.com is unaffected: it doesn't start with noreply@).

#117 — a shadowed VERSION file is no longer silent.
Greenfield runs seed VERSION; once the repo gains a package.json/pyproject.toml/Cargo.toml, that manifest wins detection and the leftover file is ignored — so bumping it kept CI green while shipping the old version everywhere. The scaffolded tests/run-tests.sh now fails when the two disagree and notes the redundancy when they agree; bootstrap flags the file at detection time. This closes the deferred #81 "all-present version sources should agree" item.

#117 — --dry-run lists the permission rules it would add.
It printed the entire settings.json but only a count for permissions — the one part of the preview you couldn't review. Each rule now gets its own [dry-run] + … line.

#118 — no code change needed. Branch-pinned detection, the superset test-runner contract, CI dedupe, the tests/cases/*.sh extension point and the workflow contract all behaved as designed on a real 3.5k-LOC project; acknowledged on the issue.

Versioning note: 1.14.0 is merged to main but not yet tagged. Since the marketplace installs from main (not from Releases), those files are already distributed, so this round correctly bumps to 1.14.1 rather than amending 1.14.0 — cutting v1.14.1 publishes both rounds at once. docs/HANDOFF.md now records that reasoning.

Tests: +3 suite assertions (same-run identity apply incl. deliberate-identity preservation and dry-run parity; shadowed-VERSION note/FAIL/redundancy; dry-run permission listing) — 297 passing, 0 failed.

Release checklist

  • Bumped version in .claude-plugin/plugin.json for each plugin whose files changed
    (CI's version-bump-guard enforces this).
  • Added a ## [x.y.z] entry to CHANGELOG.md for the new version (CI checks every plugin
    version has a matching heading).
  • Updated the README plugin-table row(s) and the header Version: line to match.
  • Ran bash tests/run-tests.sh locally → 0 failures (or relied on CI).
  • Preserved existing script comments; annotated new/changed lines.

🤖 Generated with Claude Code

https://claude.ai/code/session_015M7QWFzt9NnWmSmNQXj1mM


Generated by Claude Code

cportka and others added 2 commits August 1, 2026 22:59
… a shadowed VERSION (#117), list dry-run permission rules (#117)

Field-report round from a full greenfield build (cportka/design-a-home, bootstrapped and
shipped in one hosted session). repo-bootstrap -> 1.14.1; other plugins unchanged.

- #116: the SessionStart hook could only apply .claude/commit-identity at the NEXT session,
  but the run that declares it is usually the one whose first commits land. bootstrap-repo.sh
  now writes user.name/user.email itself (from --identity or an existing declaration) and says
  so, under the same guard as the hook: only when git config is unset or a noreply@ harness
  default, so a deliberate identity is never clobbered. --dry-run states it would apply and
  writes nothing. The hook's rule widened from the literal noreply@anthropic.com to any
  noreply@ address so the two stay symmetric (user@users.noreply.github.com is unaffected).
- #117: a VERSION file shadowed by a later-added manifest was silently ignored, so bumping it
  kept CI green while shipping the old version. The scaffolded tests/run-tests.sh now FAILS on
  a disagreement and notes the redundancy when they agree; bootstrap flags the file at
  detection time. (Closes the deferred #81 "all-present version sources should agree" item.)
- #117: --dry-run now lists each permission rule it would add instead of only counting them —
  it printed the whole settings.json, so permissions were the one unreviewable part.
- #118 needed no code change: branch-pinned detection, the superset test-runner contract, CI
  dedupe, tests/cases/*.sh and the workflow contract all behaved as designed on a real project.

Docs: CHANGELOG [1.14.1] + footer link, README header/row, SKILL.md identity wording, HANDOFF
stamp (notes why the guard requires a bump even when the prior tag was never cut), IMPROVEMENTS
swaps the shipped #81 item for the remaining auto-delete follow-on. Suite: 297 green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M7QWFzt9NnWmSmNQXj1mM
…o the repo root, stamp the block's own version

Fixes from the pre-merge adversarial review of the 1.14.1 diff:

- The new `.claude/commit-identity` read was an unguarded pipeline in a standalone assignment:
  under `set -euo pipefail` a comment-only/empty declaration (grep exits 1) or a SIGPIPE from
  `head` aborted the whole run, leaving the repo with settings.json but no test runner, no CI
  and no explanation. Guarded with `|| true` + a NOTE naming the missing declaration.
- The immediate identity apply required only `--is-inside-work-tree`, which is true for ANY
  subdirectory — so `--dir repo/sub --identity ...` rewrote the ENCLOSING repo's git config.
  It now requires `--show-toplevel` to equal the resolved `--dir`.
- The block's `portka-standard-version` stamp was the PLUGIN version, so this patch release
  alone would have nagged every 1.14.0-bootstrapped repo (including this one) to commit a
  refresh whose only diff is the stamp comment. The stamp now comes from a dedicated
  skills/repo-bootstrap/standard-version.txt = the release in which the BLOCK TEXT last changed
  (1.14.0); the hook compares against the same file, falling back to plugin.json for older
  installs. Bump that file only when editing STD_CLAUDE_BLOCK.
- Docs that still described next-session-only apply: --help for --identity, the plugin.json /
  marketplace.json descriptions (byte-parity kept), the hook header and an internal comment.

Tests: +2 cases (comment-only declaration completes + subdir can't re-identify the parent;
stamp == standard-version.txt and no nag when only the plugin version moved); the 1.14.0 stamp
assertion now reads standard-version.txt. Suite: 299 green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M7QWFzt9NnWmSmNQXj1mM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant