From renoworks-pm-toolkit
Fill in sections of a Confluence implementation/project page by reading a source discovery or requirements page. Use this skill when the user wants to populate sections like "Project Objective", "Business Objectives", "Success Criteria", "Risk Assessment", or similar structured sections on a Confluence page using content from another Confluence page.
How this skill is triggered — by the user, by Claude, or both
Slash command
/renoworks-pm-toolkit:project-charterThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Reads a source Confluence page (e.g. a discovery or requirements doc) and uses the content to fill in structured sections on a target Confluence page (e.g. an implementation or project brief).
Reads a source Confluence page (e.g. a discovery or requirements doc) and uses the content to fill in structured sections on a target Confluence page (e.g. an implementation or project brief).
CloudId: renoworks.atlassian.net
When this skill loads, greet the user with one randomly selected line from the pool below, then immediately follow it with the fixed copy and questions. Do not add anything between the random line and the fixed copy.
Random greeting pool — pick one at random each time:
Lord of the Rings:
The Big Lebowski: 6. "The charter abides. Let's fill it in. 🎳" 7. "This aggression against undocumented projects will not stand, man. Let's get this charter sorted. 🥃" 8. "Obviously you're not a golfer. But you are a PM, and your charter needs filling in. Let's go. 🎳" 9. "Yeah, well, that's just like... your undocumented project, man. Let's fix it. 😎" 10. "New charter? Far out. Let's see what's in that discovery doc. 🛋️"
Seinfeld: 11. "What's the deal with empty Project Charters? Let's fill this one in. 🧾" 12. "No charter, no project. Pretty, pretty, pretty important. Let's go! 🎤" 13. "Not that there's anything wrong with an empty charter... actually, there is. Let's fix it. ☕" 14. "These pretzels are making me thirsty, and that empty charter is making me anxious. Let's fill it in. 🥨" 15. "It's not a lie if the charter gets filled in. Let's make that happen. 📋"
Star Wars: 16. "Help me fill in this charter — you're my only hope. 🌟" 17. "I find your lack of documented objectives disturbing. Let's sort that out. 🌑" 18. "Do or do not fill in this charter — there is no try. Let's do. ⚡" 19. "These aren't the success criteria you're looking for... actually, they are. Let's write them. 🤖" 20. "The Force is strong with this discovery doc. Let's put it to work. 🚀"
Fixed copy (always follows the greeting):
"{Random greeting} I'll need two things to get started:
If the user has not already provided both URLs, ask:
Extract the numeric page ID from the URL path (e.g. .../pages/3670278205/... → 3670278205).
Fetch both pages simultaneously using mcp__claude_ai_Atlassian__getConfluencePage:
contentFormat: "markdown" for easy readingcontentFormat: "adf" to get the full ADF structure needed for the updateInspect the target page ADF for empty or placeholder sections. Common sections include:
If the user specified particular sections, focus on those. Otherwise fill all empty sections you find.
Using the source page content, synthesise appropriate content for each section:
Project Objective A concise 2–4 sentence paragraph describing:
Business Objectives 3–5 bullet points covering:
Success Criteria 5–8 bullet points that are specific and testable, covering:
Risk Assessment 4–6 bullet points, each formatted as: [Risk name]: description of the risk and why it matters. Mitigation: specific action to reduce the risk.
Common risk categories to consider: cost implications, technical complexity/new patterns, UX edge cases, auth/session state, unintended side effects of the change.
Show the drafted content for each section clearly, grouped by section name.
Ask: "Does this look right? Any changes before I update the page?"
Wait for explicit confirmation before proceeding.
Do not manually construct ADF JSON. Use the file-based Python workflow instead:
Before modifying the ADF, inspect the fetched body for any paragraph node that appears directly inside a tableBody or table content array (alongside tableRow nodes). Confluence accepts this on read but rejects it on write (400 error). Fix: move such nodes into the nearest layoutColumn's content array instead.
/tmp/target_adf.json via json.dumptype or attrs.localId, replace their content arrays in place[{"text": "...", "type": "text"}]listItem with populated listItem nodes, each with a fresh unique localId (e.g. "sc-02", "risk-03")/tmp/adf_body_fixed.json using separators=(',', ':')node -e "JSON.parse(require('fs').readFileSync('/tmp/adf_body_fixed.json','utf8')); console.log('VALID')"Preserve all existing localId values for unchanged nodes. Never truncate or omit existing sections (tables, RACI, deliverables, layout).
Call mcp__claude_ai_Atlassian__updateConfluencePage with:
contentFormat: "adf"body: contents of /tmp/adf_body_fixed.json (read via Bash)versionMessage: a short description of what was filled in (e.g. "Filled in Project Objective, Business Objectives, Success Criteria, and Risk Assessment")After a successful update, confirm to the user:
https://renoworks.atlassian.net/wiki/spaces/.../pages/{pageId}/...npx claudepluginhub vonlex77/renoworks-pm-toolkit --plugin renoworks-pm-toolkitCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.