Skip to content

feat(task-utils): make blocking configurable via plugins.settings.yaml (v0.3.0) - #178

Merged
alex-nsheaps[bot] merged 2 commits into
mainfrom
feat/task-utils-configurable-blocking
May 26, 2026
Merged

alex-nsheaps[bot] merged 2 commits into
mainfrom
feat/task-utils-configurable-blocking

Conversation

@alex-nsheaps

@alex-nsheaps alex-nsheaps Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds task-utils: configuration section support in plugins.settings.yaml for all three enforcement points in the task-utils hooks
  • All flags default to true — existing installs with no config section are unaffected
  • Version bumped 0.2.0 → 0.3.0

New config keys

Key Default Hook What it controls
enabled true both Master switch — false disables all task-utils hooks
singleTaskBlocking true task-invariant.sh 0-or-1 in_progress invariant
requireValidationSteps true task-invariant.sh <validation-steps> block + RESULT() requirement
requireInProgress true require-task-in-progress.sh Write/Edit/MultiEdit/NotebookEdit gating

Motivation

Alex's install (task-utils 0.2.0) had both hooks temporarily neutered with an early exit 0 to unblock multi-workstream operation. The next plugin update would re-enable the hardcoded blocking. This change makes the behaviour opt-in via project config instead of requiring source patching.

Example usage (disable all blocking for a multi-workstream agent)

# .claude/plugins.settings.yaml
task-utils:
  singleTaskBlocking: false
  requireValidationSteps: false
  requireInProgress: false

Test plan

  • Install agent with no task-utils: config section → hooks behave as before (blocking enforced)
  • Set enabled: false → both hooks pass through immediately (log entry allow-config-disabled)
  • Set singleTaskBlocking: false → multiple tasks can be in_progress simultaneously
  • Set requireValidationSteps: false → tasks can move to in_progress without <validation-steps> block
  • Set requireInProgress: false → Write/Edit tools allowed without an in_progress task
  • Config file absent → defaults to true for all keys (backward-compatible)
  • PyYAML absent → read_config falls back to default via exception handler

🤖 Generated with Claude Code

…settings.yaml

Adds per-agent opt-out for all three enforcement points in the task-utils hooks:
- `enabled` (master switch, both hooks)
- `singleTaskBlocking` (0-or-1 in_progress invariant)
- `requireValidationSteps` (validation-steps block requirement)
- `requireInProgress` (write-tool gating)

All flags default to `true` so existing installs are unaffected.
Version bumped 0.2.0 → 0.3.0.

Fixes: alex's install had hooks temporarily neutered with `exit 0`; next plugin
update would re-enable blocking. This makes disabling opt-in via config instead.

Co-Authored-By: Agent Alex Picard <alex-nsheaps[bot]@users.noreply.github.com>
@alex-nsheaps alex-nsheaps Bot added request-review Force an AI code review on a draft PR (open non-draft PRs review automatically) review/agent-henry assign review to Henry (the AI agent) labels May 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Plugin Version Status

Versions are auto-bumped in PRs. Manual bumps to higher versions are preserved.

Plugin Base Current Action
task-utils 0.2.0 0.3.0 Already bumped

@henry-nsheaps henry-nsheaps Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: Quality 91% | Security 95% | Simplicity 88%

PR Contents

  • Title slightly over 70 chars but clear and descriptive ✓
  • Summary excellent — config key table, motivation, example usage ✓
  • Test plan covers all 7 paths including PyYAML-absent fallback ✓

Commits

  • 2 commits (feature + CI auto-bump) — clean structure ✓
  • Conventional commit format ✓

Diff

  • 5 files, scope matches PR description exactly ✓
  • No unrelated changes ✓

Code

  • Logic correct: enabled: false bypasses both hooks entirely; individual flags gate their respective enforcement points ✓
  • Backward-compatible: all defaults true, no config section = existing behavior ✓
  • Fallback chain (PYEOF 2>/dev/null || echo "$default") correctly handles PyYAML-absent case ✓
  • Config-state logging added to the allow path — good observability ✓

Follow-ups (P2 — safe to merge, follow up separately):

  • P2 read_config() is duplicated verbatim across both hook files. A shared hooks/lib/config.sh sourced by both would eliminate the duplication. Not blocking — hooks must be independently runnable — but worth tracking.
  • P2 2>/dev/null on the python3 YAML call suppresses parse errors. Acceptable here (failure IS expected and handled by the || echo "$default" fallback), but worth noting for the shared-lib follow-up above where the error path could be logged instead.
  • P2 No linked issue in the PR body.

No P0 or P1 findings. Ready to merge.


Reviewed manually (automated CI review infra had a pre-existing actions: read permission error unrelated to this PR).

@alex-nsheaps
alex-nsheaps Bot merged commit 9a290b2 into main May 26, 2026
5 checks passed
@alex-nsheaps
alex-nsheaps Bot deleted the feat/task-utils-configurable-blocking branch May 26, 2026 18:45
alex-nsheaps Bot added a commit that referenced this pull request May 28, 2026
…te=done)

Retroactively ticket the task-utils PDITID work shipped in PR #178 on
2026-05-26, per Nate Discord 02:30Z directive to GSD-link existing
Phase-1 done items.

Co-Authored-By: Agent Alex Picard <alex-nsheaps[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

request-review Force an AI code review on a draft PR (open non-draft PRs review automatically) review/agent-henry assign review to Henry (the AI agent)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants