Skills openproject-by-altf1be
OpenProject CRUD skill — manage work packages, projects, groups, news, users, watchers, relations, notifications, time entries, comments, attachments, wiki pages, statuses, and more via OpenProject API v3 with API token auth. Supports cloud and self-hosted instances.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/abdelkrim/openproject-by-altf1be" ~/.claude/skills/openclaw-skills-openproject-by-altf1be && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/abdelkrim/openproject-by-altf1be" ~/.openclaw/skills/openclaw-skills-openproject-by-altf1be && rm -rf "$T"
manifest:
skills/abdelkrim/openproject-by-altf1be/SKILL.mdsource content
OpenProject by @altf1be
Manage OpenProject work packages, projects, groups, news, users, watchers, relations, notifications, time entries, comments, attachments, wiki pages, and workflow transitions via the API v3. Works with both cloud and self-hosted instances.
Setup
- Log in to your OpenProject instance
- Go to My Account → Access Tokens → + Add
- Create an API token and copy it
- Set environment variables (or create
in.env
):{baseDir}
OP_HOST=https://projects.xflowdata.com OP_API_TOKEN=your-api-token OP_DEFAULT_PROJECT=my-project
- Install dependencies:
cd {baseDir} && npm install
Commands
Work Packages
# List work packages (with optional filters) node {baseDir}/scripts/openproject.mjs wp-list --project my-project --status open --assignee me # Create a work package node {baseDir}/scripts/openproject.mjs wp-create --project my-project --type Task --subject "Fix login bug" --description "Users can't log in" # Read work package details node {baseDir}/scripts/openproject.mjs wp-read --id 42 # Update a work package node {baseDir}/scripts/openproject.mjs wp-update --id 42 --subject "New title" --priority High # Delete a work package (requires --confirm) node {baseDir}/scripts/openproject.mjs wp-delete --id 42 --confirm
Projects
# List all projects node {baseDir}/scripts/openproject.mjs project-list # Read project details node {baseDir}/scripts/openproject.mjs project-read --id my-project # Create a project node {baseDir}/scripts/openproject.mjs project-create --name "My Project" --identifier my-project
Comments (Activities)
# List comments on a work package node {baseDir}/scripts/openproject.mjs comment-list --wp-id 42 # Add a comment node {baseDir}/scripts/openproject.mjs comment-add --wp-id 42 --body "Ready for review"
Attachments
# List attachments on a work package node {baseDir}/scripts/openproject.mjs attachment-list --wp-id 42 # Upload an attachment node {baseDir}/scripts/openproject.mjs attachment-add --wp-id 42 --file ./screenshot.png # Delete an attachment (requires --confirm) node {baseDir}/scripts/openproject.mjs attachment-delete --id 10 --confirm
Time Entries
# List time entries node {baseDir}/scripts/openproject.mjs time-list --project my-project # Log time node {baseDir}/scripts/openproject.mjs time-create --wp-id 42 --hours 2.5 --comment "Code review" --activity-id 1 # Update time entry node {baseDir}/scripts/openproject.mjs time-update --id 5 --hours 3 --comment "Updated" # Delete time entry (requires --confirm) node {baseDir}/scripts/openproject.mjs time-delete --id 5 --confirm
Statuses & Transitions
# List all statuses node {baseDir}/scripts/openproject.mjs status-list # Update work package status node {baseDir}/scripts/openproject.mjs wp-update --id 42 --status "In progress"
Users
# List all users (with optional filters) node {baseDir}/scripts/openproject.mjs user-list node {baseDir}/scripts/openproject.mjs user-list --status active --name "John" # Read user details node {baseDir}/scripts/openproject.mjs user-read --id 5 # Show current authenticated user node {baseDir}/scripts/openproject.mjs user-me
Notifications
# List notifications (all or unread only) node {baseDir}/scripts/openproject.mjs notification-list node {baseDir}/scripts/openproject.mjs notification-list --unread node {baseDir}/scripts/openproject.mjs notification-list --reason mentioned --project 5 # Read notification details node {baseDir}/scripts/openproject.mjs notification-read --id 100 # Mark as read (single or all) node {baseDir}/scripts/openproject.mjs notification-mark-read --id 100 node {baseDir}/scripts/openproject.mjs notification-mark-read --all node {baseDir}/scripts/openproject.mjs notification-mark-read --all --project 5 # Mark as unread node {baseDir}/scripts/openproject.mjs notification-mark-unread --id 100 node {baseDir}/scripts/openproject.mjs notification-mark-unread --all
Documents
node {baseDir}/scripts/openproject.mjs document-list node {baseDir}/scripts/openproject.mjs document-read --id 5 node {baseDir}/scripts/openproject.mjs document-update --id 5 --title "Updated title"
Revisions
node {baseDir}/scripts/openproject.mjs revision-read --id 10 node {baseDir}/scripts/openproject.mjs revision-list-by-wp --wp-id 42
Capabilities & Actions
node {baseDir}/scripts/openproject.mjs capability-list --principal me node {baseDir}/scripts/openproject.mjs capability-global node {baseDir}/scripts/openproject.mjs action-list node {baseDir}/scripts/openproject.mjs action-read --id work_packages/create
My Preferences
node {baseDir}/scripts/openproject.mjs my-preferences-read node {baseDir}/scripts/openproject.mjs my-preferences-update --time-zone "Europe/Brussels" --comment-order desc
Render
node {baseDir}/scripts/openproject.mjs render-markdown --text "**bold** and _italic_" node {baseDir}/scripts/openproject.mjs render-plain --text "plain text"
Posts (Forum)
node {baseDir}/scripts/openproject.mjs post-read --id 5 node {baseDir}/scripts/openproject.mjs post-attachment-list --id 5
Reminders
node {baseDir}/scripts/openproject.mjs reminder-list node {baseDir}/scripts/openproject.mjs reminder-create --wp-id 42 --remind-at "2026-03-20T09:00:00Z" --note "Check status" node {baseDir}/scripts/openproject.mjs reminder-update --id 3 --remind-at "2026-03-21T09:00:00Z" node {baseDir}/scripts/openproject.mjs reminder-delete --id 3 --confirm
Project Statuses
node {baseDir}/scripts/openproject.mjs project-status-read --id on_track
Project Phases (Enterprise)
# List project phase definitions node {baseDir}/scripts/openproject.mjs project-phase-definition-list # Read a phase definition node {baseDir}/scripts/openproject.mjs project-phase-definition-read --id 1 # Read a project phase node {baseDir}/scripts/openproject.mjs project-phase-read --id 5
Portfolios (Enterprise)
# List portfolios node {baseDir}/scripts/openproject.mjs portfolio-list # Read a portfolio node {baseDir}/scripts/openproject.mjs portfolio-read --id 1 # Update a portfolio node {baseDir}/scripts/openproject.mjs portfolio-update --id 1 --name "Q1 Portfolio" # Delete a portfolio (requires --confirm) node {baseDir}/scripts/openproject.mjs portfolio-delete --id 1 --confirm
Programs (Enterprise)
# List programs node {baseDir}/scripts/openproject.mjs program-list # Read a program node {baseDir}/scripts/openproject.mjs program-read --id 1 # Update a program node {baseDir}/scripts/openproject.mjs program-update --id 1 --name "Platform Program" # Delete a program (requires --confirm) node {baseDir}/scripts/openproject.mjs program-delete --id 1 --confirm
Placeholder Users (Enterprise)
# List placeholder users node {baseDir}/scripts/openproject.mjs placeholder-user-list # Read a placeholder user node {baseDir}/scripts/openproject.mjs placeholder-user-read --id 10 # Create a placeholder user node {baseDir}/scripts/openproject.mjs placeholder-user-create --name "Future Developer" # Update a placeholder user node {baseDir}/scripts/openproject.mjs placeholder-user-update --id 10 --name "Senior Developer" # Delete a placeholder user (requires --confirm) node {baseDir}/scripts/openproject.mjs placeholder-user-delete --id 10 --confirm
Budgets (Enterprise)
# List project budgets node {baseDir}/scripts/openproject.mjs budget-list --project my-project # Read budget details node {baseDir}/scripts/openproject.mjs budget-read --id 3
Meetings (Enterprise)
# Read a meeting node {baseDir}/scripts/openproject.mjs meeting-read --id 10 # List meeting attachments node {baseDir}/scripts/openproject.mjs meeting-attachment-list --id 10 # Upload attachment to a meeting node {baseDir}/scripts/openproject.mjs meeting-attachment-add --id 10 --file ./agenda.pdf
Days (Working/Non-Working)
# Check if a date is a working day node {baseDir}/scripts/openproject.mjs day-read --date 2026-03-18 # List days in a range node {baseDir}/scripts/openproject.mjs days-list --from 2026-03-01 --to 2026-03-31 # List all non-working days (holidays) node {baseDir}/scripts/openproject.mjs non-working-days-list # View a non-working day node {baseDir}/scripts/openproject.mjs non-working-day-read --date 2026-12-25 # Show week day schedule (which days are working) node {baseDir}/scripts/openproject.mjs week-days-list # View a specific week day node {baseDir}/scripts/openproject.mjs week-day-read --day 6
Configuration
# View instance configuration node {baseDir}/scripts/openproject.mjs config-read # View project-specific configuration node {baseDir}/scripts/openproject.mjs project-config-read --project my-project
OAuth
# Read an OAuth application node {baseDir}/scripts/openproject.mjs oauth-app-read --id 1 # Read OAuth client credentials node {baseDir}/scripts/openproject.mjs oauth-credentials-read --id 1
Help Texts
# List all attribute help texts node {baseDir}/scripts/openproject.mjs help-text-list # Read a help text node {baseDir}/scripts/openproject.mjs help-text-read --id 1
Custom Fields & Options
# List items for a hierarchical custom field node {baseDir}/scripts/openproject.mjs custom-field-items --id 10 # Read a custom field item node {baseDir}/scripts/openproject.mjs custom-field-item-read --id 25 # Get a custom field item's branch (ancestors) node {baseDir}/scripts/openproject.mjs custom-field-item-branch --id 25 # Read a custom option value node {baseDir}/scripts/openproject.mjs custom-option-read --id 3
Custom Actions
# Read a custom action node {baseDir}/scripts/openproject.mjs custom-action-read --id 1 # Execute a custom action on a work package node {baseDir}/scripts/openproject.mjs custom-action-execute --id 1 --wp-id 42
Groups
# List all groups node {baseDir}/scripts/openproject.mjs group-list # Read group details with members node {baseDir}/scripts/openproject.mjs group-read --id 3 # Create a group with members node {baseDir}/scripts/openproject.mjs group-create --name "Dev Team" --members 5,6,7 # Update a group (replaces member list) node {baseDir}/scripts/openproject.mjs group-update --id 3 --name "Engineering" --members 5,6,7,8 # Delete a group (requires --confirm) node {baseDir}/scripts/openproject.mjs group-delete --id 3 --confirm
News
# List all news node {baseDir}/scripts/openproject.mjs news-list # Read news details node {baseDir}/scripts/openproject.mjs news-read --id 5 # Create a news item node {baseDir}/scripts/openproject.mjs news-create --project my-project --title "Sprint 12 Released" --summary "Bug fixes and performance" --description "Full details here..." # Update a news item node {baseDir}/scripts/openproject.mjs news-update --id 5 --title "Updated headline" # Delete a news item (requires --confirm) node {baseDir}/scripts/openproject.mjs news-delete --id 5 --confirm
Watchers
# List watchers on a work package node {baseDir}/scripts/openproject.mjs watcher-list --wp-id 42 # Add a watcher node {baseDir}/scripts/openproject.mjs watcher-add --wp-id 42 --user-id 5 # Remove a watcher node {baseDir}/scripts/openproject.mjs watcher-remove --wp-id 42 --user-id 5 # List users available as watchers node {baseDir}/scripts/openproject.mjs watcher-available --wp-id 42
Relations
# List all relations (optionally filter by work package or type) node {baseDir}/scripts/openproject.mjs relation-list --wp-id 42 node {baseDir}/scripts/openproject.mjs relation-list --type blocks # Read relation details node {baseDir}/scripts/openproject.mjs relation-read --id 5 # Create a relation (types: relates, duplicates, blocks, precedes, follows, includes, partof, requires) node {baseDir}/scripts/openproject.mjs relation-create --wp-id 42 --to-wp-id 43 --type blocks node {baseDir}/scripts/openproject.mjs relation-create --wp-id 42 --to-wp-id 43 --type precedes --lag 2 # Update a relation node {baseDir}/scripts/openproject.mjs relation-update --id 5 --type follows --lag 1 # Delete a relation (requires --confirm) node {baseDir}/scripts/openproject.mjs relation-delete --id 5 --confirm
Wiki Pages
# Read a wiki page node {baseDir}/scripts/openproject.mjs wiki-read --id 72 # List attachments on a wiki page node {baseDir}/scripts/openproject.mjs wiki-attachment-list --id 72 # Upload an attachment to a wiki page node {baseDir}/scripts/openproject.mjs wiki-attachment-add --id 72 --file ./diagram.png
Reference Data
# List work package types node {baseDir}/scripts/openproject.mjs type-list # List priorities node {baseDir}/scripts/openproject.mjs priority-list # List project members node {baseDir}/scripts/openproject.mjs member-list --project my-project # List versions/milestones node {baseDir}/scripts/openproject.mjs version-list --project my-project # List categories node {baseDir}/scripts/openproject.mjs category-list --project my-project
Security
- API token auth (Basic auth with
as username)apikey - No secrets or tokens printed to stdout
- All delete operations require explicit
flag--confirm - Path traversal prevention for file uploads
- Built-in rate limiting with exponential backoff retry
- Lazy config validation (only checked when a command runs)
Dependencies
— CLI frameworkcommander
— environment variable loadingdotenv- Node.js built-in
(requires Node >= 18)fetch
Author
Abdelkrim BOUJRAF — ALT-F1 SRL, Brussels 🇧🇪 🇲🇦 X: @altf1be