-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
feat: add writing-plans skill and execution workflow improvements #171
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- Tested with RED-GREEN-REFACTOR using 4 pressure scenarios - Scenarios validate mechanical vs judgment decision-making - All tests pass: agents correctly identify automation opportunities - Word count optimized to 424 words (target: ≤500) - Integration points added to SKILL.md line 500 Test results: 4/4 scenarios pass (GREEN phase: first try) Test methodology: Baseline without doc showed documentation failures, tested version correctly guided agents to mechanical enforcement
- Use emoji library for production-ready approach - Include commented regex alternative for zero dependencies - Addresses CodeRabbit feedback: code examples must be runnable - Word count: 442 words (still under 500 target)
Add brief example showing automation-over-documentation applies to silent dependency failures, not just rationalization. Based on production incident where file-track registration was gated by Python module import, causing silent failures in subagent environments. Pattern: Remove dependency gates that hide failures - CLI registration should be independent of Python module availability.
Updates all skill and documentation references from the deprecated writing-plans to the new record-plans skill name following the rename in commit 8853d53. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Following TDD methodology for skills: - RED: Baseline tests showed agents skip ws consultation when modifying skills - GREEN: Enhanced triggers and added explicit enforcement blocks - REFACTOR: Extended rationalization tables with skill-modification scenarios Changes: - writing-skills: Enhanced description with explicit triggers (modifying, debugging, adding sections) - writing-skills: Added EXTREMELY-IMPORTANT block requiring consultation before any skill file edits - writing-skills: Extended rationalization table with 3 new skill-modification entries - using-superpowers: Added specific rationalization "Just editing a skill file" - CLAUDE.md: Added local plugin development workflow Testing revealed systemic limitation: subagents don't auto-invoke MANDATORY FIRST RESPONSE PROTOCOL. Content improvements help when agents do consult the skill. Co-Authored-By: Claude <noreply@anthropic.com>
…ecution Changes: - Execute all tasks continuously instead of stopping every 3 tasks - Only stop for actual blockers or ambiguous instructions - Add "Common Rationalizations" section to prevent early stopping - Update description, overview, and all process steps for consistency - Remove "batch" terminology throughout Testing: - Baseline: confirmed agent stopped after 3/6 tasks - Green: verified agent executes all 6/6 tasks continuously - Pressure: verified agent executes 10/10 tasks through milestone Addresses user feedback that checkpoint pausing interrupts flow when there are no blockers requiring input.
Wrapper script lives in user's .claude/scripts directory, not in skill directory. Changes: - write_plan.py path: ~/.claude/scripts/record-plan/ - check_lock.py path: ~/.claude/scripts/record-plan/ This separates skill documentation (in plugin) from user scripts (in ~/.claude).
CLAUDE.md changes: - Add blank lines for better markdown list formatting - Simplify plugin reload instructions Scripts added: - scripts/reload-plugin.sh: Helper to display plugin reload commands
- Add 4-step process: push → generate → preview → confirm - Match Option 4's typed confirmation pattern - Update Common Mistakes and Red Flags sections - Closes safety gap identified in conversation c989437e
- Add Rationalization Table with 5 common excuses - Enhance Red Flags with specific thought patterns - Explicitly counter permission system reliance
- Add PR Creation Safety section - Document 3-layer defense-in-depth approach - Cross-reference jira-publisher and Option 4 patterns
Change plugin name to superpowers-fork and update metadata to reflect this is a fork with record-plan and automation-over-documentation additions. Update homepage/repository URLs to point to fork. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
…ded values Address 2 valid issues from CodeRabbit review: 1. Module system inconsistency: - Convert .codex/superpowers-codex from CommonJS to ES imports - Aligns with lib/skills-core.js and .opencode/plugin/superpowers.js 2. Hardcoded marketplace name: - Extract marketplace name from .claude-plugin/marketplace.json - Fall back to "superpowers-dev" if jq unavailable or file missing - Eliminates maintenance burden in scripts/reload-plugin.sh Both fixes improve mechanical enforcement (ws skill principle).
Regression fixes: - Bundle rename_jot.py with .writing-plans-active lock file support - Bundle validate-frontmatter.py for self-contained operation - Update all script paths to use $CLAUDE_PLUGIN_ROOT for portability - Fix marketplace.json to use superpowers-fork name (not superpowers) - Default output: llm/implementation-plans/ (not docs/plans/) - Graceful file-track fallback for non-installed users Root cause: Plugin name mismatch caused upstream to load instead of fork
- Replace hardcoded $CLAUDE_PLUGIN_ROOT variable (not set by Claude Code) - Use find command to auto-locate scripts in plugin cache - Fixes 'can't open file' error when invoking write_plan.py - Works with both marketplace and local-dev installations
- Command substitution $(find...) doesn't work in Bash tool environment
- Split into two steps: find path, then use literal path
- Fixes parse error: (eval):1: parse error near `('
- Applies to all script invocations: write_plan, validate, rename, check_lock
- Based on user-confirmed workaround from production testing
- Document command substitution parse error as Common Mistake obra#5 - Add Troubleshooting section with script path and lock file issues - Explain root cause: Bash tool shell evaluation limitation - Based on production testing showing zsh parse error - Per ws skill: close loopholes explicitly with user-confirmed symptoms
This file contains company marketplace configuration and should not be submitted upstream. Our fork's main branch retains it for internal use.
Reset plugin metadata to upstream values for PR submission. Fork maintains separate identity in main branch.
WalkthroughAdds a wrapper-driven writing-plans workflow (lock file, validators, renamer, acceptance generator, hook installer), shifts executing-plans to continuous execution, enforces PR preview/confirmation, migrates one module to ESM, updates plugin manifest and reload helper, and adds documentation and governance guidance. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Agent
participant Wrapper as write_plan.py
participant Lock as .writing-plans-active
participant Editor as Editor/AgentDraft
participant Post as PostWritePipeline
User->>Agent: Request plan (--plan-name, --in-plan-mode?)
Agent->>Wrapper: invoke with working-dir and plan-name
Wrapper->>Lock: create lock file (target path + timestamp)
Wrapper->>Agent: emit guidance + frontmatter template
Agent->>Editor: Draft plan at locked path
Editor->>Lock: ensure lock exists (check_lock.py)
Agent->>Post: run post-write steps
Post->>Post: copy staging→final (if needed)
Post->>Post: validate frontmatter (validate-frontmatter.py)
Post->>Post: rename to YYMMDDXX-slug (rename_jot.py)
Post->>Post: generate acceptance.json (generate_acceptance.py)
Post->>Lock: remove lock on success
Post->>Agent: report completion
sequenceDiagram
participant User
participant Agent
participant Skill as finishing-a-development-branch
participant Preview as PR Preview
participant Git as Git/GitHub
User->>Agent: Request to finish branch
Agent->>Skill: prepare push and PR metadata
Skill->>Git: git push origin branch
Skill->>Preview: render exact PR preview
Preview->>User: display preview content
User-->>Skill: explicit confirmation ("yes")
Skill->>Git: create PR (POST /pulls) — only after confirmation
Git->>Agent: PR created
Estimated code review effort🎯 4 (Complex) | ⏱️ ~65 minutes
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Replace user-specific paths with generic placeholders for upstream submission.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 12
🧹 Nitpick comments (4)
skills/writing-plans/scripts/validate-frontmatter.py (1)
20-43: Simple YAML parsing may not handle all valid frontmatter.The regex-based parser handles basic
key: valuepairs but won't correctly parse:
- Quoted values containing colons (e.g.,
title: "My: Title")- Multiline values or YAML block scalars
- Lists or nested structures
If this is acceptable for the writing-plans use case (strict simple frontmatter only), consider adding a comment documenting this limitation. Otherwise, consider using
PyYAMLfor robust parsing.skills/writing-plans/scripts/install-hook.sh (1)
11-13: Consider using environment variable for plugin root path.The error message references
~/.claude/skills/writing-plans/scripts/write_plan.py, which assumes the standard installation location. While this is likely correct for most users, using$CLAUDE_PLUGIN_ROOT(if available) would be more flexible.Consider this adjustment if
CLAUDE_PLUGIN_ROOTis commonly available:echo "Files must be created via wrapper script:" - echo " python3 ~/.claude/skills/writing-plans/scripts/write_plan.py \\" + echo " python3 \${CLAUDE_PLUGIN_ROOT:-~/.claude}/skills/writing-plans/scripts/write_plan.py \\"skills/writing-plans/scripts/write_plan.py (1)
45-45: Remove unnecessary f-string prefixes.Multiple print statements use f-strings without any placeholders. While this doesn't affect functionality, removing the
fprefix improves code clarity.Apply this diff:
- print(f"📝 PLAN MODE DETECTED") + print("📝 PLAN MODE DETECTED") print(f"✓ Write plan to: {target_file}") print(f"✓ Then copy to: {final_dir}/{args.plan_name}.md") else: - print(f"📝 REGULAR MODE") + print("📝 REGULAR MODE") print(f"✓ Write plan to: {target_file}") # ... rest of the file ... - print(f"\n🔧 REQUIRED ACTIONS:") - print(f"1. Use Write tool to create file with:") - print(f" - First line: <!-- jot:md-rename -->") - print(f" - YAML frontmatter (title, date, type, status)") - print(f" - H1 heading with feature name") - print(f" - Implementation tasks following writing-plans format") - print(f"\n2. After writing, run post-write workflow:") + print("\n🔧 REQUIRED ACTIONS:") + print("1. Use Write tool to create file with:") + print(" - First line: <!-- jot:md-rename -->") + print(" - YAML frontmatter (title, date, type, status)") + print(" - H1 heading with feature name") + print(" - Implementation tasks following writing-plans format") + print("\n2. After writing, run post-write workflow:") print(f" - Validate: python3 $CLAUDE_PLUGIN_ROOT/skills/writing-plans/scripts/validate-frontmatter.py {target_file}") print(f" - Rename: python3 $CLAUDE_PLUGIN_ROOT/skills/writing-plans/scripts/rename_jot.py {target_file} (auto-tracks with file-track)") - print(f" ⚠️ IMPORTANT: Rename script will remove lock file") + print(" ⚠️ IMPORTANT: Rename script will remove lock file") - print(f"\n⚠️ CRITICAL: DO NOT just describe the plan!") - print(f"⚠️ You MUST use Write tool to create the actual file!") - print(f"⚠️ Describing = BUG. Writing = CORRECT.") + print("\n⚠️ CRITICAL: DO NOT just describe the plan!") + print("⚠️ You MUST use Write tool to create the actual file!") + print("⚠️ Describing = BUG. Writing = CORRECT.")Also applies to: 51-51, 62-68, 71-75
skills/writing-plans/SKILL.md (1)
268-334: Consider simplifying the conditional workflow logic.The post-write workflow has multiple conditional branches (plan mode vs regular mode, progress.md exists vs missing, acceptance optional vs required). This complexity increases the chance of errors.
Consider:
- Extracting common validation/checks into a single script that handles all post-write steps
- Using a state machine or checklist approach in the wrapper script itself
- Adding a
--dry-runflag to preview all steps before executionThis would reduce the cognitive load on users (and AI agents) following the workflow.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (19)
.claude-plugin/marketplace.json(0 hunks).claude-plugin/plugin.json(2 hunks).codex/superpowers-codex(1 hunks)CLAUDE.md(1 hunks)README.md(1 hunks)scripts/reload-plugin.sh(1 hunks)skills/executing-plans/SKILL.md(3 hunks)skills/finishing-a-development-branch/SKILL.md(3 hunks)skills/using-superpowers/SKILL.md(1 hunks)skills/writing-plans/CHANGELOG.md(1 hunks)skills/writing-plans/SKILL.md(4 hunks)skills/writing-plans/scripts/check_lock.py(1 hunks)skills/writing-plans/scripts/generate_acceptance.py(1 hunks)skills/writing-plans/scripts/install-hook.sh(1 hunks)skills/writing-plans/scripts/rename_jot.py(1 hunks)skills/writing-plans/scripts/validate-frontmatter.py(1 hunks)skills/writing-plans/scripts/write_plan.py(1 hunks)skills/writing-skills/SKILL.md(4 hunks)skills/writing-skills/automation-over-documentation.md(1 hunks)
💤 Files with no reviewable changes (1)
- .claude-plugin/marketplace.json
🧰 Additional context used
🧬 Code graph analysis (2)
skills/writing-plans/scripts/validate-frontmatter.py (2)
lib/skills-core.js (3)
content(18-18)match(33-33)key(35-35)skills/writing-plans/scripts/rename_jot.py (1)
main(196-254)
skills/writing-plans/scripts/rename_jot.py (2)
skills/writing-plans/scripts/validate-frontmatter.py (1)
main(86-113)skills/writing-plans/scripts/write_plan.py (1)
main(13-77)
🪛 LanguageTool
CLAUDE.md
[grammar] ~243-~243: Use a hyphen to join words.
Context: ...- graphviz-conventions.dot - Flowchart style rules - persuasion-principles.md...
(QB_NEW_EN_HYPHEN)
🪛 markdownlint-cli2 (0.18.1)
CLAUDE.md
41-41: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
116-116: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
skills/finishing-a-development-branch/SKILL.md
91-91: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
97-97: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
101-101: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
104-104: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
119-119: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
201-201: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
skills/writing-plans/SKILL.md
308-308: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
332-332: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
339-339: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
347-347: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
358-358: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
469-469: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🪛 Ruff (0.14.8)
skills/writing-plans/scripts/validate-frontmatter.py
79-79: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
99-99: Do not catch blind exception: Exception
(BLE001)
skills/writing-plans/scripts/generate_acceptance.py
19-19: Loop control variable idx not used within loop body
Rename unused idx to _idx
(B007)
skills/writing-plans/scripts/check_lock.py
14-14: f-string without any placeholders
Remove extraneous f prefix
(F541)
16-16: f-string without any placeholders
Remove extraneous f prefix
(F541)
skills/writing-plans/scripts/write_plan.py
45-45: f-string without any placeholders
Remove extraneous f prefix
(F541)
51-51: f-string without any placeholders
Remove extraneous f prefix
(F541)
62-62: f-string without any placeholders
Remove extraneous f prefix
(F541)
63-63: f-string without any placeholders
Remove extraneous f prefix
(F541)
64-64: f-string without any placeholders
Remove extraneous f prefix
(F541)
65-65: f-string without any placeholders
Remove extraneous f prefix
(F541)
66-66: f-string without any placeholders
Remove extraneous f prefix
(F541)
67-67: f-string without any placeholders
Remove extraneous f prefix
(F541)
68-68: f-string without any placeholders
Remove extraneous f prefix
(F541)
71-71: f-string without any placeholders
Remove extraneous f prefix
(F541)
73-73: f-string without any placeholders
Remove extraneous f prefix
(F541)
74-74: f-string without any placeholders
Remove extraneous f prefix
(F541)
75-75: f-string without any placeholders
Remove extraneous f prefix
(F541)
skills/writing-plans/scripts/rename_jot.py
107-107: Consider moving this statement to an else block
(TRY300)
108-108: Do not catch blind exception: Exception
(BLE001)
173-173: Consider moving this statement to an else block
(TRY300)
224-224: Do not catch blind exception: Exception
(BLE001)
232-232: subprocess call: check for execution of untrusted input
(S603)
🔇 Additional comments (27)
skills/using-superpowers/SKILL.md (1)
46-46: Well-aligned addition to rationalizations list.The new rationalization appropriately closes a gap in the common mistakes section by explicitly calling out skill file edits as code-worthy tasks requiring TDD discipline. This directly reinforces the PR's emphasis on mechanical enforcement of workflow discipline and aligns with the objective to strengthen writing-skills governance by improving discoverability and clarifying TDD requirements for skill development.
Pattern, tone, and guidance are consistent with the existing rationalizations.
skills/finishing-a-development-branch/SKILL.md (2)
89-127: Excellent safety gate implementation for PR creation.The revised Option 2 workflow now enforces a multi-step approval pattern: push → generate → preview → confirm → create. This directly addresses the PR objective for "mandatory user preview and approval before PR creation with multilayered defenses."
The supporting governance layers (Rationalization Table at lines 205–215 and Red Flags at lines 217–225) provide multiple enforcement mechanisms against skipping the approval step, which strengthens the skill's operational rigor.
205-225: Rationalization Table and Red Flags effectively reinforce approval discipline.The new Rationalization Table (lines 207–215) directly addresses common shortcuts operators might rationalize ("permission system will catch it," "preview adds friction"), and the Red Flags section (lines 219–225) teaches recognition of anti-patterns. This pedagogical approach—beyond just rules—helps sustain the approval gate long-term.
.claude-plugin/plugin.json (1)
3-3: LGTM!The description and keywords accurately reflect the new writing-plans skill and automation-over-documentation guidance being added in this PR.
Also applies to: 12-12
README.md (1)
113-122: LGTM!The expanded Collaboration section accurately documents the new and existing collaboration-focused skills introduced by this PR.
skills/writing-plans/scripts/validate-frontmatter.py (2)
46-83: Validation logic is sound.The required field validation and value constraints are well-structured. The date format regex correctly validates YYYY-MM-DD format.
86-117: LGTM!The CLI entry point handles errors gracefully with appropriate exit codes and stderr messaging. The broad
Exceptioncatch on line 99 serves as a reasonable fallback for unexpected IO errors after the specificFileNotFoundErrorcase..codex/superpowers-codex (1)
3-6: ESModule migration syntax is correct.The migration from CommonJS to ESModule is properly implemented with explicit
.jsextensions for local imports. However, verify thatpackage.jsonincludes"type": "module"in the project root; without it, Node.js will treat these files as CommonJS and fail to parse the import syntax.skills/writing-skills/automation-over-documentation.md (1)
1-89: Excellent framework for automation vs. documentation decisions.This document provides clear, evidence-based guidance on when to enforce constraints mechanically vs. through documentation. The Python example, ROI comparison table, and TDD signal criteria offer practical decision-making tools. The content aligns well with the PR's objectives around mechanical enforcement and supports the broader writing-plans infrastructure.
CLAUDE.md (1)
1-248: Comprehensive plugin development guide.This documentation provides clear, actionable guidance for Claude Code plugin development. The sections on TDD-for-documentation, local development workflow, PR safety gates, and skill structure requirements are particularly valuable. The organization and examples make it easy to find and apply the information.
skills/writing-skills/SKILL.md (3)
22-35: Strong enforcement of testing discipline.The EXTREMELY-IMPORTANT admonition effectively reinforces the requirement to follow TDD when modifying skills. The specific scenarios listed (editing, adding sections, debugging, quick fixes) address common rationalization patterns. This aligns well with the PR's emphasis on mechanical enforcement and defense-in-depth.
438-440: Valuable additions to rationalization table.The new entries directly address common excuses for skipping testing on "documentation" changes. The explicit treatment of documentation edits as code changes reinforces the TDD-for-documentation approach.
518-518: Effective cross-reference to supporting material.The reference to
automation-over-documentation.mdprovides concrete evidence and decision frameworks that reinforce the principles in this skill. The placement after the CSO section is appropriate context.skills/writing-plans/scripts/generate_acceptance.py (1)
13-82: Clean implementation of acceptance criteria generation.The script correctly extracts tasks from markdown headers, generates structured acceptance criteria, and includes helpful warnings when no tasks are found. The
_rulesblock documenting immutable/mutable fields is a nice touch for preventing accidental modifications.skills/writing-plans/scripts/write_plan.py (1)
13-77: Clear workflow guidance with effective lock file mechanism.The script provides excellent user guidance through both PLAN MODE and REGULAR MODE paths. The lock file creation enables the Write tool appropriately, and the warning messages effectively communicate critical requirements. The two-mode distinction aligns well with the broader writing-plans workflow.
skills/writing-plans/scripts/rename_jot.py (4)
82-109: Broad exception handling is appropriate for fallback implementation.The
except Exceptionblocks in the fallback H1 extraction are acceptable because:
- This is fallback code for when file-track is unavailable
- The function returns
Noneon any error, which is handled by the caller- Silent failure here doesn't compromise the rename operation (it falls back to filename-based slugs)
28-189: Well-designed fallback implementation with file-track delegation.The script correctly delegates to file-track when available and provides a comprehensive fallback implementation. The fallback logic handles slugification, H1 extraction, sequence numbering, and edge cases appropriately. The dual-mode design ensures the tool works whether or not file-track is installed.
241-253: Smart lock file cleanup with git root detection.The lock file cleanup logic correctly walks up the directory tree to find the git root, then removes the
.writing-plans-activelock file. This completes the wrapper-driven workflow initiated bywrite_plan.py.
229-239: Subprocess call to user-controlled script is acceptable in this context.The script calls
~/.claude/scripts/track_with_filetrack.sh, which resides in the user's home directory and is part of their optional tooling ecosystem. The code gracefully handles all failure modes: it only attempts the call if the script exists, catches any subprocess errors, and continues the rename operation without failure.skills/executing-plans/SKILL.md (1)
3-3: Effective emphasis on continuous execution pattern.The changes clearly establish continuous execution as the default behavior, with stops only for genuine blockers. The updated rationalization table explicitly counters common excuses for premature stopping ("completed several tasks", "next tasks look complex", etc.). This aligns well with the PR objective of removing artificial batching checkpoints and supports uninterrupted workflows.
Also applies to: 10-10, 24-48
skills/writing-plans/scripts/check_lock.py (2)
1-6: LGTM!The shebang, docstring, and imports are appropriate for the script's purpose.
30-38: LGTM!The CLI interface properly validates arguments and uses appropriate exit codes.
skills/writing-plans/CHANGELOG.md (3)
3-19: LGTM - Clear documentation of naming change.The rationale for reverting to
writing-plansis well-documented, and the impact assessment correctly notes that the slash command remains unchanged.
21-35: LGTM - Clear integration documentation.The file-track integration changes are well-documented, including the date format change and automatic tracking behavior.
37-60: LGTM - Comprehensive wrapper documentation.The changelog clearly documents the transition from documentation-only to enforced workflow, including the bug fix and removal of duplicate code.
skills/writing-plans/SKILL.md (2)
1-15: LGTM - Clear scope definition.The skill description explicitly defines boundaries (writes plans, never executes) and mentions mechanical enforcement, which aligns with the automation-over-documentation approach mentioned in PR objectives.
229-266: LGTM - Strong violation prevention.The Red Flags section directly addresses the production incidents mentioned in the changelog. The explicit corrective messages and incident documentation provide clear guidance on common failure modes.
| # Extract marketplace name from marketplace.json | ||
| MARKETPLACE=$(jq -r '.name' "$(dirname "$0")/../.claude-plugin/marketplace.json" 2>/dev/null || echo "superpowers-dev") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Marketplace.json was removed in this PR; fallback will always trigger.
The AI summary indicates .claude-plugin/marketplace.json was deleted. The jq command will consistently fail, causing the fallback to "superpowers-dev". If this is intentional for upstream/fork separation, consider updating the comment on line 13 to reflect this behavior, or simplify by removing the dead code path.
-# Extract marketplace name from marketplace.json
-MARKETPLACE=$(jq -r '.name' "$(dirname "$0")/../.claude-plugin/marketplace.json" 2>/dev/null || echo "superpowers-dev")
+# Default to superpowers-dev marketplace (marketplace.json removed for upstream)
+MARKETPLACE="superpowers-dev"🤖 Prompt for AI Agents
In scripts/reload-plugin.sh around lines 13 to 14, the jq call reading
.claude-plugin/marketplace.json will always fail because that file was removed
in this PR, so the fallback "superpowers-dev" is always used; either update the
comment on line 13 to state the marketplace.json was intentionally removed and
the fallback is expected, or simplify the script by removing the jq invocation
and hardcoding/using a single source for MARKETPLACE ("superpowers-dev" or
another desired value), making sure any ancillary comment reflects the new
behavior.
| **Step 1: Push branch** | ||
|
|
||
| ```bash | ||
| # Push branch | ||
| git push -u origin <feature-branch> | ||
| ``` | ||
|
|
||
| # Create PR | ||
| gh pr create --title "<title>" --body "$(cat <<'EOF' | ||
| ## Summary | ||
| <2-3 bullets of what changed> | ||
| **Step 2: Generate PR description** | ||
|
|
||
| Draft PR title and body based on commit history. | ||
|
|
||
| **Step 3: Show preview and request confirmation** | ||
|
|
||
| Present: | ||
| ``` | ||
| Ready to create PR with: | ||
| Title: <title> | ||
| Body: | ||
| <body-preview> | ||
| Create this PR? (yes/no) | ||
| ``` | ||
|
|
||
| **Wait for explicit "yes" confirmation.** | ||
|
|
||
| ## Test Plan | ||
| - [ ] <verification steps> | ||
| - If user confirms "yes": Proceed to Step 4 | ||
| - If user says "no": Report "PR creation cancelled. Branch pushed to remote." | ||
|
|
||
| **Step 4: Create PR only if confirmed** | ||
|
|
||
| ```bash | ||
| gh pr create --title "<title>" --body "$(cat <<'EOF' | ||
| <body> | ||
| EOF | ||
| )" | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion | 🟠 Major
Fix markdown heading and code block language issues.
The step headers within Option 2 use emphasis (Step N:) instead of proper markdown headings, and the code block at line 104 is missing a language specifier. These are markdown linting violations (MD036, MD040) that impact semantic structure and readability.
Apply this diff to use proper heading hierarchy and specify code block language:
-**Step 1: Push branch**
+### Step 1: Push branch
```bash
git push -u origin <feature-branch>
-```
+```
-**Step 2: Generate PR description**
+### Step 2: Generate PR description
Draft PR title and body based on commit history.
-**Step 3: Show preview and request confirmation**
+### Step 3: Show preview and request confirmation
Present:
-```
+```text
Ready to create PR with:
Title: <title>
Body:
<body-preview>
Create this PR? (yes/no)
-```
+```
-**Step 4: Create PR only if confirmed**
+### Step 4: Create PR only if confirmed🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
91-91: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
97-97: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
101-101: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
104-104: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
119-119: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
🤖 Prompt for AI Agents
In skills/finishing-a-development-branch/SKILL.md around lines 91 to 126,
replace the emphasized step labels (**Step N:**) with proper markdown headings
(e.g., "### Step 2: ...", "### Step 3: ...", "### Step 4: ...") to fix
MD036/MD040, and add language specifiers to the code fences: mark the initial
git push and the gh pr create blocks as bash (```bash) and the preview block as
text (```text) so linting and semantic structure are correct.
| **FIRST ACTION (mandatory):** Invoke wrapper script - DO NOT describe plan in chat first: | ||
|
|
||
| **Step 1: Locate the script** | ||
| ```bash | ||
| find ~/.claude/plugins/cache -path "*/skills/writing-plans/scripts/write_plan.py" 2>/dev/null | head -1 | ||
| ``` | ||
|
|
||
| **Step 2: Invoke with the path from Step 1** | ||
| ```bash | ||
| python3 <path-from-step-1> \ | ||
| --working-dir <working-directory> \ | ||
| --plan-name <descriptive-name> | ||
| ``` | ||
|
|
||
| **Note:** Command substitution `$(...)` doesn't work in Bash tool execution environment, so use two-step approach. | ||
|
|
||
| **Mechanical enforcement:** Wrapper creates lock file enabling Write tool for implementation plans. Attempting to write without invoking wrapper will fail. | ||
|
|
||
| **Production incident:** 2025-12-13 - Agent skipped wrapper despite warnings. File never registered with file-track. Now mechanically enforced via lock file pattern. | ||
|
|
||
| **DO NOT before invoking wrapper:** | ||
| - Describe plan content in chat | ||
| - "Show" the plan structure | ||
| - Output plan deliverables/tasks | ||
| - List what the plan will contain | ||
|
|
||
| **"Create a plan" = invoke wrapper script immediately. Nothing else.** | ||
|
|
||
| **Execution Mode:** This skill has an executable wrapper that FORCES file writing. | ||
|
|
||
| **How it works:** | ||
| 1. You invoke the wrapper script: `write_plan.py` (auto-located in plugin cache) | ||
| 2. The wrapper prints directives: "USE WRITE TOOL to create file at X" | ||
| 3. You MUST follow the directives - no describing, only executing | ||
| 4. The wrapper guides you through post-write workflow | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Test if command substitution works in the execution environment
# Test basic command substitution
echo "Testing command substitution..."
TEST_VAR=$(echo "hello")
echo "Result: $TEST_VAR"
# Test in python invocation context
echo "Testing in python context..."
python3 -c "print('python works')"
# Test piped find into xargs
echo "Testing find with xargs..."
find ~/.claude/plugins/cache -path "*/skills/writing-plans/scripts/write_plan.py" 2>/dev/null | head -1 | xargs -I {} echo "Found: {}"
# Additional test: nested command substitution
echo "Testing nested substitution..."
NESTED=$(find . -name "*.md" 2>/dev/null | head -1)
echo "Found file: $NESTED"Repository: obra/superpowers
Length of output: 146
🏁 Script executed:
#!/bin/bash
# Minimal test for command substitution support
echo "Test 1: Basic command substitution"
TEST_VAR=$(echo "hello")
echo "Result: $TEST_VAR"
echo "Test 2: Arithmetic substitution"
RESULT=$((5 + 3))
echo "Arithmetic result: $RESULT"
echo "Test 3: Command chaining"
DATE_OUTPUT=$(date +%Y)
echo "Year: $DATE_OUTPUT"
echo "All tests completed successfully"Repository: obra/superpowers
Length of output: 230
Update documentation: command substitution IS supported in Bash tool environment.
Testing confirms that command substitution $(...) works fully in the Bash tool execution environment (basic substitution, arithmetic, and nested commands all execute successfully). The claim at line 30 is incorrect.
Lines 18-28 can be simplified from a two-step manual process to a single command:
python3 $(find ~/.claude/plugins/cache -path "*/skills/writing-plans/scripts/write_plan.py" 2>/dev/null | head -1) \
--working-dir <working-directory> \
--plan-name <descriptive-name>Remove the note at line 30 about command substitution not working, and update the "Step 1" and "Step 2" sections to reflect the single-command approach. This reduces friction and eliminates the misleading technical constraint.
🤖 Prompt for AI Agents
In skills/writing-plans/SKILL.md around lines 16 to 51, the doc incorrectly
states that Bash command substitution does not work and forces a two-step
invocation; update the instructions to use a single-command invocation that
embeds the find command via command substitution, remove the “Note” about
substitution not working, and simplify Step 1/Step 2 into a one-step example
that runs the wrapper via command substitution while keeping the rest of the
mechanical enforcement and wrapper behavior text unchanged.
| echo "Contact your human partner - Task 1 must be completed first" | ||
| exit 1 | ||
| fi | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix markdown linting issue.
Line 308 uses bold text for "IMPORTANT:" which markdownlint flags as emphasis-as-heading. Consider using a proper heading or removing the emphasis.
Apply this diff:
-**IMPORTANT:** You must use `cp` command to copy the template. Do NOT:
+> **IMPORTANT:** You must use `cp` command to copy the template. Do NOT:This converts it to a blockquote with emphasis, which is semantically clearer.
Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
308-308: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
🤖 Prompt for AI Agents
In skills/writing-plans/SKILL.md around line 308, markdownlint flags the bold
"IMPORTANT:" as emphasis-as-heading; replace the bolded text with a semantically
appropriate element—either convert it to a proper heading (e.g., "###
IMPORTANT") or change it to a blockquote with emphasis as suggested (e.g., start
the line with "> *IMPORTANT:* ...") so the emphasis is not used as a heading and
the linter warning is resolved.
| 5. Add initial session goal and task | ||
|
|
||
| **If output is "EXISTS"**, skip this step entirely - progress.md already initialized. | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add language specifiers to fenced code blocks.
Lines 332, 339, 347, and 358 have fenced code blocks without language specifiers, which markdownlint flags (MD040). Adding language identifiers improves rendering and syntax highlighting.
Apply this diff:
Expected output:
-```
+```text
✓ Frontmatter validation passedExpected output:
- +text
✓ Renamed plan-name.md → 251213-01-plan-name.md
Expected output: `✓ Validation passed`
Repeat for lines 332, 347, and 469 (the blockquote example output).
Also applies to: 339-339, 347-347, 358-358
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
332-332: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
In skills/writing-plans/SKILL.md around lines 332, 339, 347, 358 and 469, add
language specifiers to the fenced code blocks flagged by markdownlint MD040:
replace the three backtick-only fences with triple backticks followed by "text"
and update the inner content per the provided diffs (line 332: wrap "✓
Frontmatter validation passed" with ```text ... ```, line 339: wrap the renamed
filename line with ```text ... ```, line 347: wrap "✓ Validation passed" with
```text ... ```, line 358: apply the same pattern for that block, and line 469:
update the blockquote example output to use ```text ... ```). Ensure each
modified fenced block uses ```text as the opening fence and the original content
unchanged inside.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (4)
CLAUDE.md (2)
41-44: Addbashlanguage identifier to fenced code block.This code block was flagged in previous reviews and remains unresolved. The language identifier is required for proper syntax highlighting and linting compliance.
Apply this diff:
3. **Reload plugin** to reflect changes in Claude Code (paste both lines): - ``` + ```bash /plugin uninstall superpowers /plugin install superpowers ```
116-123: Add language identifier to fenced code block showing directory structure.This code block was flagged in previous reviews and remains unresolved. The language identifier is required for proper syntax highlighting and linting compliance.
Apply this diff:
**Directory and Naming:** -``` +```plaintext skills/ skill-name/ # lowercase-with-hyphens only (no special chars) SKILL.md # Required: main skill contentskills/writing-plans/scripts/install-hook.sh (2)
7-7: Regex pattern is insufficient for YYMMDD-XX format validation.The current regex
[^0-9][^/]*\.md$only rejects files where the first character after the directory is not a digit. It fails to validate the complete YYMMDD-XX format and allows invalid patterns such as2024-plan.md,250101_01.md,250101-1.md, or250101.md.Apply this diff to enforce the proper format:
-if git diff --cached --name-only | grep -qE "llm/implementation-plans/[^0-9][^/]*\.md$"; then +if git diff --cached --name-only | grep -E "llm/implementation-plans/.*\.md$" | grep -vqE "llm/implementation-plans/[0-9]{6}-[0-9]{2}-[^/]+\.md$"; thenThis pattern validates that filenames match
YYMMDD-XX-description.mdformat (e.g.,250101-01-my-plan.md).
29-31: Hook installation overwrites existing pre-commit hooks without backup.If repositories already have pre-commit hooks configured, they will be silently replaced, potentially breaking existing workflows or losing important validation logic.
Apply this diff to preserve existing hooks:
hook_path="$repo/.git/hooks/pre-commit" + + # Backup existing hook if present + if [ -f "$hook_path" ]; then + backup_path="${hook_path}.backup-$(date +%Y%m%d-%H%M%S)" + cp "$hook_path" "$backup_path" + echo " ⚠️ Backed up existing hook to: $(basename "$backup_path")" + fi + echo "$HOOK_CONTENT" > "$hook_path"
🧹 Nitpick comments (2)
skills/writing-plans/scripts/install-hook.sh (2)
23-24: Add validation for the search path directory.While the environment variable override is good for portability, the script doesn't validate that
SEARCH_PATHexists before iterating. If the directory doesn't exist, the loop silently produces no output, which could confuse users.Apply this diff to add validation:
# Default search path (override with REPOS_DIR environment variable) SEARCH_PATH="${REPOS_DIR:-$HOME/dev}" +# Validate search path exists +if [ ! -d "$SEARCH_PATH" ]; then + echo "❌ ERROR: Directory not found: $SEARCH_PATH" + echo "Set REPOS_DIR environment variable to override default location" + exit 1 +fi + # Find all repos with llm/implementation-plans/ directory
26-34: Consider adding installation summary feedback.The script provides per-repository feedback but no final summary. Adding a count of successful installations would improve the user experience, especially when processing many repositories.
Example implementation:
installed_count=0 for repo in "$SEARCH_PATH"/*/; do if [ -d "$repo/llm/implementation-plans" ] && [ -d "$repo/.git" ]; then hook_path="$repo/.git/hooks/pre-commit" if echo "$HOOK_CONTENT" > "$hook_path" && chmod +x "$hook_path"; then echo "✓ Installed hook: $hook_path" ((installed_count++)) fi fi done echo "" echo "✓ Installed pre-commit hooks in $installed_count repositories"
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
CLAUDE.md(1 hunks)skills/writing-plans/scripts/install-hook.sh(1 hunks)
🧰 Additional context used
🪛 LanguageTool
CLAUDE.md
[grammar] ~243-~243: Use a hyphen to join words.
Context: ...- graphviz-conventions.dot - Flowchart style rules - persuasion-principles.md...
(QB_NEW_EN_HYPHEN)
🪛 markdownlint-cli2 (0.18.1)
CLAUDE.md
41-41: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
116-116: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (1)
CLAUDE.md (1)
1-248: Comprehensive documentation of Claude Code plugin workflow and architecture.The file provides clear, well-structured guidance on plugin development, skill creation, testing, and contribution workflows. The TDD-for-documentation philosophy is well articulated and consistent with the PR objectives around automation and enforcement. Supporting sections on local development with worktrees, PR safety gates, and skill structure requirements are thorough.
The content aligns well with the broader PR changes (writing-plans skill tooling, automation-over-documentation guidance, and workflow improvements).
| for repo in "$SEARCH_PATH"/*/; do | ||
| if [ -d "$repo/llm/implementation-plans" ] && [ -d "$repo/.git" ]; then | ||
| hook_path="$repo/.git/hooks/pre-commit" | ||
| echo "$HOOK_CONTENT" > "$hook_path" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling for hook installation.
The file write operation has no error handling. If the write fails (e.g., due to permissions or disk space), the script continues silently without making the hook executable or notifying the user.
Apply this diff to add error handling:
- echo "$HOOK_CONTENT" > "$hook_path"
- chmod +x "$hook_path"
- echo "✓ Installed hook: $hook_path"
+ if echo "$HOOK_CONTENT" > "$hook_path" && chmod +x "$hook_path"; then
+ echo "✓ Installed hook: $hook_path"
+ else
+ echo "❌ Failed to install hook: $hook_path"
+ fiCommittable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In skills/writing-plans/scripts/install-hook.sh around line 30, the echo
redirect that writes "$HOOK_CONTENT" to "$hook_path" has no error handling;
update the script to check the exit status of the write (or perform the write
with a conditional), and if it fails print a clear error to stderr (including
the path and reason if available), remove any partially created file, and exit
with a non-zero status; on success continue to make the hook executable and
print a success/confirmation message to the user.
Add compatibility-focused fork note to README with link to detailed improvements document. Follows Neovim/Valkey pattern: leads with compatibility, emphasizes existing workflows unchanged. New docs/IMPROVEMENTS.md documents 5 key enhancements: - Writing-Plans Automation Framework (lock files, pre-commit hooks) - Automation Over Documentation Framework (decision criteria) - PR Creation Safety Gate (preview-then-confirm pattern) - Continuous Execution Pattern (removes artificial batching) - Writing-Skills Governance (enhanced discoverability) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
README.md (1)
115-124: Fix markdown lint violation and ensure heading consistency.Line 115 uses bold emphasis (
**Collaboration**) where heading syntax should be used. This violates the MD036 markdown linting rule. Additionally, lines 104, 109, and 126 (Testing, Debugging, Meta) use the same bold pattern, creating structural inconsistency.Apply this diff to use proper heading syntax for section titles:
-**Collaboration** +### CollaborationOptional: For consistency and best practices, consider applying the same fix to lines 104, 109, and 126 in a follow-up commit, as they exhibit the same pattern.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
README.md(2 hunks)docs/IMPROVEMENTS.md(1 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
README.md
115-115: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
🔇 Additional comments (2)
docs/IMPROVEMENTS.md (1)
1-57: Clear and well-structured documentation of improvements.This new file effectively communicates the fork's production-tested enhancements, providing both rationale and benefit for each improvement. The philosophy statement (line 53) succinctly captures the automation-first approach and reinforces the project's governance model. Good alignment with the PR objectives and helpful for future contributors.
README.md (1)
17-17: Fork Note provides helpful context.The Fork Note clearly communicates backward compatibility and directs users to detailed improvements. Good addition to set expectations upfront.
CRITICAL fixes: - check_lock.py: Fix security hole allowing path bypass via basename comparison. Now uses normalized absolute path comparison. HIGH priority fixes: - install-hook.sh: Backup existing pre-commit hooks before overwriting - install-hook.sh: Strengthen regex to enforce full YYMMDD-XX format - install-hook.sh: Add CLAUDE_SKILLS_DIR env var for portable paths - install-hook.sh: Add error handling for file operations - generate_acceptance.py: Remove unused idx variable MINOR fixes: - CLAUDE.md: Add language identifiers to code blocks (bash, plaintext) Testing confirmed security fix blocks bypass attempts.
CodeRabbit Review ResponseThanks for the detailed review! Here's what I've addressed in commit f79982c: ✅ Fixed🔴 CRITICAL - Security Hole (check_lock.py:23)
🟡 HIGH Priority
🟢 Style Improvements
❌ Pushing BackDocstring coverage warning (78.57% < 80%)
Command substitution claim (SKILL.md:51)
reload-plugin.sh marketplace.json fallback
📊 Summary
All critical and high-priority fixes have been tested and verified working correctly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
CLAUDE.md(1 hunks)README.md(2 hunks)docs/IMPROVEMENTS.md(1 hunks)skills/writing-plans/scripts/check_lock.py(1 hunks)skills/writing-plans/scripts/generate_acceptance.py(1 hunks)skills/writing-plans/scripts/install-hook.sh(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- skills/writing-plans/scripts/check_lock.py
🧰 Additional context used
🪛 LanguageTool
CLAUDE.md
[grammar] ~243-~243: Use a hyphen to join words.
Context: ...- graphviz-conventions.dot - Flowchart style rules - persuasion-principles.md...
(QB_NEW_EN_HYPHEN)
🪛 markdownlint-cli2 (0.18.1)
README.md
115-115: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
🔇 Additional comments (7)
README.md (2)
17-18: LGTM!The fork note is well-positioned and clearly communicates compatibility while directing users to detailed improvement documentation.
115-125: LGTM!The expanded Collaboration section accurately reflects the new skills and workflows introduced in this PR. The formatting is consistent with other sections.
skills/writing-plans/scripts/generate_acceptance.py (2)
13-37: LGTM!The task extraction logic is clear and correct. The regex pattern properly matches task headers, and the ID generation (
len(features)+1:03d) correctly produces sequential IDs starting fromtask-001.
71-85: LGTM!The CLI interface is well-structured with proper argument validation and clear error messages. Exit codes follow standard conventions.
CLAUDE.md (1)
1-248: LGTM!This developer guide is comprehensive and well-structured. It provides clear guidance on project architecture, development workflow, skill creation, testing methodology, and contribution process. The code blocks are properly formatted with language identifiers, and the examples are practical and helpful.
skills/writing-plans/scripts/install-hook.sh (1)
24-50: LGTM!The installer properly handles multiple repositories, backs up existing hooks, and includes error handling for both backup and installation operations. The environment variable overrides (
REPOS_DIR,CLAUDE_SKILLS_DIR) make the script portable across different development environments.docs/IMPROVEMENTS.md (1)
1-57: LGTM!This documentation clearly articulates the fork's improvements while emphasizing backward compatibility. The five key improvements are well-explained and directly align with the PR objectives. The philosophy statement effectively summarizes the "automation over documentation" approach that underlies these changes.
| print(" Generating empty acceptance.json") | ||
|
|
||
| acceptance = { | ||
| "plan": str(plan_file.relative_to(Path.cwd())), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add exception handling for path resolution.
relative_to() raises ValueError if plan_file is not under Path.cwd(). This could occur if the plan file is located outside the current working directory.
Apply this diff to handle the edge case:
- "plan": str(plan_file.relative_to(Path.cwd())),
+ try:
+ plan_path = str(plan_file.relative_to(Path.cwd()))
+ except ValueError:
+ plan_path = str(plan_file)
+
+ acceptance = {
+ "plan": plan_path,Alternatively, if the plan should always be relative to cwd, validate this in main() before calling generate_acceptance().
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In skills/writing-plans/scripts/generate_acceptance.py around line 51, the code
uses plan_file.relative_to(Path.cwd()) which raises ValueError if plan_file is
outside the current working directory; modify generate_acceptance to handle that
by either wrapping the relative_to call in a try/except ValueError and falling
back to str(plan_file.resolve()) or str(os.path.relpath(plan_file, Path.cwd()))
so a usable path is returned, or alternatively validate in main() that plan_file
is under Path.cwd() before calling generate_acceptance and raise a clear error
if not.
| # Pre-commit hook: Validate implementation plan format | ||
| # Validate YYMMDD-XX format (6 digits, dash, 2 digits) | ||
| if git diff --cached --name-only | grep -qE "llm/implementation-plans/[^/]*\.md$" | grep -qvE "(^|/)[0-9]{6}-[0-9]{2}[^/]*\.md$"; then |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix broken pipe logic in pre-commit hook.
The command pipes grep -q into another grep, which won't work. The -q flag suppresses output (only returns exit code), so the second grep receives no input and will always fail to match anything.
The intent is to find .md files in llm/implementation-plans/ that don't match the YYMMDD-XX format. Apply this diff to fix:
-if git diff --cached --name-only | grep -qE "llm/implementation-plans/[^/]*\.md$" | grep -qvE "(^|/)[0-9]{6}-[0-9]{2}[^/]*\.md$"; then
+if git diff --cached --name-only | grep -E "llm/implementation-plans/[^/]*\.md$" | grep -vE "(^|/)[0-9]{6}-[0-9]{2}[^/]*\.md$" | grep -q .; thenThis:
- Removes
-qfrom the firstgrepso it outputs matching filenames - Pipes those to
grep -vEto filter OUT properly formatted names - Pipes the result to
grep -q .to check if any invalid files remain
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if git diff --cached --name-only | grep -qE "llm/implementation-plans/[^/]*\.md$" | grep -qvE "(^|/)[0-9]{6}-[0-9]{2}[^/]*\.md$"; then | |
| if git diff --cached --name-only | grep -E "llm/implementation-plans/[^/]*\.md$" | grep -vE "(^|/)[0-9]{6}-[0-9]{2}[^/]*\.md$" | grep -q .; then |
🤖 Prompt for AI Agents
In skills/writing-plans/scripts/install-hook.sh around line 8, the existing
pipeline uses grep -q (which suppresses output) then pipes to another grep,
causing the second grep to always fail; update the pipeline so the first grep
does not use -q (emit matching filenames), pipe that output into grep -vE
"(^|/)[0-9]{6}-[0-9]{2}[^/]*\.md$" to filter out properly formatted names, and
finally pipe to grep -q . to test if any invalid filenames remain (so the
overall conditional succeeds when there are non-conforming .md files).
|
Thanks for the extensive work here! However, this PR has grown into something that's hard to review - 1642 additions across 21 files covering many different concerns:
A few specific concerns:
We already incorporated your core insight about automation vs documentation as a one-liner in the writing-skills skill. If you'd like to contribute, it would help to break this into smaller, focused PRs - one concern per PR. That makes review much more tractable. — Claude (in consultation with Jesse) |
Production-Tested Improvements: Mechanical Enforcement & Safety Gates
This PR introduces several production-hardened improvements to the superpowers plugin, grounded in real incidents and test-driven documentation methodology.
Key Changes
1. Writing-Plans Automation Framework
Enhances the existing
writing-plansskill with executable wrapper scripts that enforce plan creation through lock files and git pre-commit hooks. This shifts from documentation-only guidance to mechanical constraints, addressing a December 13 incident where an agent rationalized away the plan-writing requirement despite explicit warnings.Technical implementation:
skills/writing-plans/scripts/- Python/shell automation for lock file management and plan validationKey insight: When requirements are 100% objective and violations are programmatically detectable, use automation over documentation.
2. Automation Over Documentation Framework
A new guidance document (
skills/writing-skills/automation-over-documentation.md) establishing when to use code vs. documentation for skill requirements. The framework provides clear decision criteria: objective, programmatically detectable requirements should trigger automation rather than endless documentation iterations.3. PR Creation Safety Gate
Adds mandatory user preview and approval before pull request creation in the
finishing-a-development-branchskill. This defense-in-depth approach prevents agents from bypassing approval workflows through rationalization.Implementation:
jira-publisherskill4. Continuous Execution Pattern
Removes artificial 3-task batching checkpoints from
executing-plans, allowing uninterrupted workflow through multiple tasks with only genuine blockers causing pauses. This improves development velocity while maintaining quality gates.5. Writing-Skills Improvements
Strengthens skill modification governance with:
Supporting Infrastructure
Statistics
Philosophy
This PR embodies the principle: automation over documentation for objective constraints, while preserving judgment-based guidance for subjective decisions. Skills are TDD for documentation—we test first, then write documentation that makes tests pass, iterating to close loopholes where agents rationalize around requirements.
Summary by CodeRabbit
New Features
Documentation
Chores
✏️ Tip: You can customize this high-level summary in your review settings.