marketplace/bundles/pm-documents/skills/manage-adr/SKILL.md
Manage Architectural Decision Records (ADRs) with CRUD operations, automatic numbering, and AsciiDoc formatting
npx skillsauth add cuioss/plan-marshall manage-adrInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Execution mode: Select workflow and execute immediately using documented script commands.
Prohibited actions:
Constraints:
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr ...doc/adr/ directoryManage Architectural Decision Records (ADRs) stored in doc/adr/ directory.
Provide structured management of architectural decisions:
| Workflow | Purpose | Script Used |
|----------|---------|-------------|
| list-adrs | List all ADRs with optional filtering | manage-adr.py list |
| create-adr | Create new ADR from template | manage-adr.py create |
| read-adr | Read ADR content | manage-adr.py read |
| update-adr | Update ADR status | manage-adr.py update |
| delete-adr | Delete ADR (with confirmation) | manage-adr.py delete |
| validate-adr | Validate ADR format | ref-asciidoc workflows |
List all ADRs with optional status filtering.
status (optional): Filter by status (Proposed, Accepted, Deprecated, Superseded)Step 1: Execute List
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr list [--status {status}]
Step 2: Parse Output
Parse TOON output containing ADR list with metadata.
status: success
operation: list
count: 2
adrs[2]{number,title,status,path}:
1,Use PostgreSQL,Accepted,doc/adr/001-Use_PostgreSQL.adoc
2,Adopt Quarkus,Proposed,doc/adr/002-Adopt_Quarkus.adoc
Create a new ADR with automatic numbering.
title (required): ADR titlestatus (optional, default: "Proposed"): Initial statusStep 1: Create ADR
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr create --title "{title}" [--status "{status}"]
Step 2: Parse Output
Extract created file path from TOON output.
Step 3: Open for Editing
Read the created file and inform user to fill in content sections.
Step 4: Validate Format
Skill: pm-documents:ref-asciidoc
Execute workflow: validate-format
Parameters:
target: {created_path}
ADR Created: doc/adr/004-{title}.adoc
Number: ADR-004
Status: Proposed
Next steps:
1. Edit doc/adr/004-{title}.adoc to fill in:
- Context
- Decision
- Consequences
- Alternatives
2. Update status to "Accepted" when approved
Read ADR content by number.
number (required): ADR number (1, 2, 3, etc.)Step 1: Read ADR
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr read --number {number}
Step 2: Display Content
Show ADR metadata and content to user.
Update ADR status through lifecycle.
number (required): ADR numberstatus (required): New status (Proposed, Accepted, Deprecated, Superseded)Step 1: Update ADR
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr update --number {number} --status {status}
Step 2: Confirm Update
Report updated status to user.
Delete ADR with confirmation.
number (required): ADR numberforce (required): Must be true to confirm deletionStep 1: Delete ADR
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr delete --number {number} --force
Step 2: Confirm Deletion
Report deletion to user.
Validate ADR format using ref-asciidoc skill.
number (required): ADR number to validateStep 1: Find ADR Path
Use list-adrs workflow to get ADR path by number.
Step 2: Validate Format
Skill: pm-documents:ref-asciidoc
Execute workflow: validate-format
Parameters:
target: {adr_path}
Step 3: Report Results
Report validation results to user.
This skill integrates with ref-asciidoc for:
Proposed → Accepted → [Deprecated | Superseded]
| Status | Meaning | |--------|---------| | Proposed | Under discussion, not yet approved | | Accepted | Approved and active | | Deprecated | No longer relevant or applicable | | Superseded | Replaced by another ADR |
Each ADR contains these sections:
ADRs are durable architectural statements, not incident write-ups. An ADR should still read as a standalone decision record years after the PR that introduced it has scrolled out of memory and the lessons file referenced at write-time has been pruned. CLAUDE.md's project-wide rules — "no version history", "no timestamps", "no duplication", "current state only" — apply to ADR content in the section-specific shapes below.
.plan/local/lessons-learned/...) are ephemeral recurrence-detectors and may be pruned, retired, or superseded; an ADR that cross-references a specific lesson ID can develop a dangling reference. When the lesson is the recurrence-detector that ENFORCES the ADR's principle at retrospective time, link the durable artefact (the retrospective rule, the plugin-doctor check) instead.Lessons capture the recurrence pattern the ADR's principle defends against — the diagnostic signature a future maintainer might see that should remind them of the ADR's guidance. Lessons are explicitly ephemeral; ADRs are durable. If a piece of prose is "we hit this bug, watch for the pattern", it belongs in a lesson. If it's "the architecture is X because alternatives Y/Z fail in ways A/B", it belongs in the ADR.
ADRs follow this naming pattern:
doc/adr/{NNN}-{Title_With_Underscores}.adoc
Examples:
doc/adr/001-Use_PostgreSQL_for_Persistence.adocdoc/adr/002-Adopt_Quarkus_Framework.adocdoc/adr/003-Implement_CQRS_Pattern.adocScript: pm-documents:manage-adr → manage-adr.py
| Subcommand | Description |
|------------|-------------|
| list | List all ADRs with optional status filtering |
| create | Create new ADR from template with automatic numbering |
| read | Read ADR content by number |
| update | Update ADR status through lifecycle |
| delete | Delete ADR (requires --force) |
Usage Examples:
# List all ADRs
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr list
# Create new ADR
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr create --title "Use PostgreSQL"
# Update ADR status
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr update --number 1 --status Accepted
The canonical argparse surface for manage-adr.py. The plugin-doctor analyzer (_analyze_manage_invocation.py) reads this section as source-of-truth for the manage-invocation-invalid and missing-canonical-block rules. Consuming docs xref this section by name instead of restating the command inline. See pm-plugin-development:plugin-script-architecture cross-skill-integration.md § "Script invocation in documentation".
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr list \
[--status {Proposed,Accepted,Deprecated,Superseded}]
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr create \
--title TITLE [--status {Proposed,Accepted,Deprecated,Superseded}]
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr read --number NUMBER
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr update \
--number NUMBER [--status {Proposed,Accepted,Deprecated,Superseded}]
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr delete --number NUMBER [--force]
python3 .plan/execute-script.py pm-documents:manage-adr:manage-adr next-number
pm-documents:ref-asciidoc - Format validationtools
Plan-marshall-domain implementor of the ext-self-review-{domain} extension point. Surfaces deterministic candidates (regexes, user-facing strings, markdown sections, symmetric-pair functions, flag-guard pairs, contract sources, schema-bearing files) for pre-submission structural self-review.
development
The single shared contract every untrusted-external-content ingestion surface loads — reader/orchestrator/writer isolation, the deterministic validator script as the containment boundary, and the output-schema discipline for candidate structs parsed from web pages, GitHub issue/PR/comment bodies, and Sonar issue messages
development
Domain-invariant recipe for deliberate wide-scope simplification campaigns across a scope x thoroughness cell, with a T4+ relation-graph pre-deliverable
testing
A test skill for README generation