framework tools/git: issue-create R1/R4 conversion + template bug fix (P1)

- issue-create: usage() default exit is now 2 (usage-error contract);
  unknown option, missing title, and value-less -t/-b/-l/-m land there
  with stderr messages; exit-code line added to help. Interactive
  -i/--interactive unchanged (boolean, no value arm). Existing
  body-safety and interactive-auth suites still green.
- Template bug fixed across ALL seven usage-contract suites:
  expect_stderr referenced an unbound $desc (should be $2); latent
  until issue-create's capitalized 'Unknown option' missed the
  case-sensitive grep and fired it. All seven re-verified green.
- Suite enrolled (population 79); mirrored to the brain tree.
This commit is contained in:
2026-08-28 18:01:12 -05:00
parent dff486b43a
commit c43b1a1293
10 changed files with 146 additions and 8 deletions
@@ -74,26 +74,39 @@ Examples:
$(basename "$0") -t "Fix login bug" -l "bug,priority-high"
$(basename "$0") -t "Add dark mode" -b "Implement theme switching" -m "0.2.0"
$(basename "$0") -i
Exit codes: 0 success; 2 usage error (stderr); 1 provider/credential failure.
EOF
exit "${1:-1}"
exit "${1:-2}"
}
# Parse arguments
# Usage-error contract (R4, 2026-08-28): usage errors print to STDERR and exit 2,
# distinct from provider, credential, and verification failures (exit 1).
usage_error() {
echo "Error: $*" >&2
usage
}
while [[ $# -gt 0 ]]; do
case $1 in
-t|--title)
[[ $# -ge 2 ]] || usage_error "option $1 requires a value"
TITLE="$2"
shift 2
;;
-b|--body)
[[ $# -ge 2 ]] || usage_error "option $1 requires a value"
BODY="$2"
shift 2
;;
-l|--labels)
[[ $# -ge 2 ]] || usage_error "option $1 requires a value"
LABELS="$2"
shift 2
;;
-m|--milestone)
[[ $# -ge 2 ]] || usage_error "option $1 requires a value"
MILESTONE="$2"
shift 2
;;