fix(source-control): externalize hardcoded bot logins + branch-to-issue grammar - #950
Conversation
|
Claude finished @kyle-sexton's task in 4m 37s —— View job PR Review
|
|
Claude finished @kyle-sexton's task in 3m 21s —— View job Security Review — PR #950
No critical or important security vulnerabilities found. One suggestion below. W2 —
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4b474ceec9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
4b474ce to
aee2ed9
Compare
|
Claude finished @kyle-sexton's task in 3m 41s —— View job PR Review — #950
|
|
Claude finished @kyle-sexton's task in 3m 31s —— View job Security Review — PR #950
No critical or important security vulnerabilities found. One suggestion carries over from the prior automated review; I independently verified it and the remaining security surface. Detailed findings below. W2 —
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: aee2ed9796
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
aee2ed9 to
2802447
Compare
|
Claude finished @kyle-sexton's task in 3m 10s —— View job PR Review — #950
|
|
Claude finished @kyle-sexton's task in 3m 5s —— View job Security Review — PR #950
No critical or important security vulnerabilities found. One suggestion carries over from prior reviews; independently re-verified below against the current HEAD ( W2 —
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2802447944
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ue grammar Two independent posture fixes from #912, batched under one source-control bump (0.16.2 -> 0.16.3). W1 -- dependency-manager hold-merge login set is configurable. The babysit merge gate held only the built-in dependabot/renovate product bots (DEPENDENCY_MANAGER_LOGINS), so a non-dependabot/renovate dependency bot an operator runs slipped the cross-tier hold. is_dependency_author now also matches any login in the new babysit_extra_dependency_manager_logins userConfig, threaded as the --extra-dependency-manager-logins merge-wrapper flag (mirroring the existing --approver-bot-logins arg-threading through evaluate()). Logins normalize identically on both sides (casefold, strip app/ and [bot]). Ships empty -> unconfigured installs match the built-in set alone. Wired only to the merge gate (the one is_dependency_author call site), not the snapshot. W2 -- branch-to-issue grammar is configurable. parse-branch-issue.sh hardcoded the <type>/<N>-<slug> (and routine-issue-<N>) convention, so a repo on a different scheme (e.g. Jira keys feature/PROJ-123-slug) silently failed to derive a Closes #N line. The script now accepts an ERE pattern positional (last capture group = issue id), passed from the new branch_issue_pattern userConfig at the /pull-request create call site; the built-in convention stays the default when unset (an unsubstituted ${user_config...} placeholder is treated as absent). CLAUDE_PLUGIN_OPTION_* reaches hook processes only, not skill-invoked scripts, so the value is passed as an arg rather than read from the environment. Docs synced: plugin.json userConfig (both keys), babysit SKILL.md config table, reference/feedback.md, source-control README config table, and create.md call site. Tests: is_dependency_author extra-login normalization cases + an evaluate()-level integration test that flips the dependency hold via the config (a pure-function test would pass even with broken wiring). Closes #917 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2802447 to
1b283ed
Compare
|
Claude finished @kyle-sexton's task in 2m 44s —— View job PR Review — #950
|
|
Claude finished @kyle-sexton's task in 2m 38s —— View job Security Review — PR #950
|
Double-quoting the dotted `${user_config.worktree_root}` token made
Bash fail with `bad substitution` when the key is unset, so the
first-run/unconfigured user hit a shell error instead of the helper's
documented exit-3 refusal + guidance. Single-quote it so an unset value
reaches the helper as an inert literal — mirrors the #950 fix at the
parse-branch-issue call site. Addresses the create.md:70 review finding.

Summary
Two independent posture fixes from umbrella #912, batched under one
source-control bump (
0.16.2 → 0.16.3).W1 — dependency-manager hold-merge login set is configurable. The babysit
merge gate held only the built-in
dependabot/renovateproduct bots(
DEPENDENCY_MANAGER_LOGINS), so a non-dependabot/renovate dependency bot anoperator runs slipped the cross-tier hold.
is_dependency_authornow alsomatches any login in the new
babysit_extra_dependency_manager_loginsuserConfig, threaded as the
--extra-dependency-manager-loginsmerge-wrapperflag (mirroring the existing
--approver-bot-loginsarg-threading throughevaluate()). Logins normalize identically on both sides (casefold, stripapp/and[bot]). Ships empty → unconfigured installs match the built-inset alone. Wired only to the merge gate (the single
is_dependency_authorcall site), not the snapshot.
W2 — branch-to-issue grammar is configurable.
parse-branch-issue.shhardcoded the
<type>/<N>-<slug>(androutine-issue-<N>) convention, so arepo on a different scheme (e.g. Jira keys
feature/PROJ-123-slug) silentlyfailed to derive a
Closes #Nline. The script now accepts an EREpatternpositional (last capture group = issue id), passed from the new
branch_issue_patternuserConfig at the/pull-request createcall site; thebuilt-in convention stays the default when unset (an unsubstituted
${user_config…}placeholder is treated as absent). Per the plugins-reference,CLAUDE_PLUGIN_OPTION_*reaches hook processes only — not skill-invokedscripts — so the value is passed as an arg rather than read from the
environment.
Testing
is_dependency_authorextra-login normalization cases (casefold,app/,[bot]; empty extra never widens the built-in set).evaluate()-level integration test that flips the dependency hold via theconfig on the same PR — a pure-function test would pass even with broken
wiring, so this exercises the CLI-arg-shaped frozenset →
evaluate()param →line-715 hold path.
parse-branch-issue.test.sh: 10 passed (incl. Jira-key custom pattern andthe unsubstituted-placeholder fallback).
shellcheckclean.Docs
plugin.jsonuserConfig (both keys), babysitSKILL.mdconfig table,reference/feedback.md, source-control README config table, and thecreate.mdcall site.Related
Closes #917