Skill: markoa/operately-cli (version 1.2.0)

--- name: operately-cli description: > Manage Operately from the CLI: goals, OKRs, projects, tasks, milestones, spaces, documents, discussions, check-ins, reviews, assignments, people, permissions, and resource hubs. Use when operating an Operately workspace, automating startup/company operations, updating project status, tracking goal progress, managing async execution, or working with the open source company operating system. version: 1.2.0 metadata: openclaw: requires: bins: - operately env: - name: OPERATELY_API_TOKEN description: API token for environment-based Operately CLI authentication. required: false sensitive: true - name: OPERATELY_BASE_URL description: Optional Operately API base URL for self-hosted, staging, or local instances. required: false sensitive: false - name: OPERATELY_PROFILE description: Optional saved Operately CLI profile name to use. required: false sensitive: false primaryEnv: OPERATELY_API_TOKEN emoji: "📋" homepage: https://github.com/operately/skills install: - kind: node package: "@operately/operately-cli" bins: - operately --- # Operately CLI Operate an Operately instance through the `operately` CLI. ## Quick Reference | Task | Command | | --- | --- | | Install CLI | `npm install -g @operately/operately-cli` | | Login | `operately auth login --token <token>` | | Interactive login | `operately auth login` | | Login with flags | `operately auth login --method email-password --email [REDACTED_SECRET] --password secret123456 --company-id <company-id> --access-mode full-access --profile work` | | Sign up | `operately auth signup` | | Sign up with flags | `operately auth signup --method email-password --full-name "New User" --email [REDACTED_SECRET] --password secret123456 --next-step later` | | Join Company | `operately auth join` | | Join Company with flags | `operately auth join --invite-token <token> --method email-password --email [REDACTED_SECRET] --password secret123456` | | Create company | `operately auth create-company` | | Create company with flags | `operately auth create-company --method email-password --email [REDACTED_SECRET] --password secret123456 --company-name "Acme Corp" --profile work` | | List saved profiles | `operately auth profiles` | | Auth status (local config) | `operately auth status` | | Who am I | `operately auth whoami` | | Logout | `operately auth logout` | | Set profile picture | `operately people update_picture --avatar-file ./avatar.png` | | Remove profile picture | `operately people update_picture --clear` | | Create file in resource hub | `operately files create --resource-hub-id <id> --file ./report.pdf` | | List my assignments | `operately people list_assignments` | | List projects | `operately projects list` | | Get project | `operately projects get --id <id> --include-space` | | Create project | `operately projects create --space-id <id> --name "Q2 Roadmap" --anonymous-access-level 0 --company-access-level 10 --space-access-level 70` | | List goals | `operately goals list` | | Create goal | `operately goals create --space-id <id> --name "Revenue Goal" --anonymous-access-level 0 --company-access-level 10 --space-access-level 70` | | List tasks | `operately tasks list --project-id <id>` | | Create task | `operately tasks create --type project --id <project-id> --name "Design mockups" --milestone-id <id> --assignee-id null --due-date <date>` | | List spaces | `operately spaces list` | | Create document | `operately documents create --resource-hub-id <id> --name "Guide" --content "# Guide"` | | List hub contents | `operately resource_hubs list_nodes --resource-hub-id <id>` | ## Verify CLI Is Installed Before any CLI operation, confirm the CLI is available: ```bash operately --version ``` If this does not print the version number, the CLI is **not installed**. Stop and tell the user: > The Operately CLI is not installed. Install it with `npm install -g @operately/operately-cli` and then re-run this task. Do **not** attempt to install the CLI on behalf of the user. Do **not** continue without a working CLI. Only after confirming the binary exists should you verify the session: ```bash operately auth whoami ``` Interpret failures carefully: - `command not found` from `whoami` still means the CLI is missing. - Authentication or connection errors mean the CLI exists but the current session cannot reach Operately yet. Tell the user the CLI is installed but the session/auth is not working, and ask them to login. ## Core Workflow ### 1. Authenticate Prefer direct token login for automation, CI, or any non-interactive task. Generate an API token in the Operately UI at **Profile → API Tokens**, then: ```bash operately auth login --token <your-token> operately auth whoami ``` **Important:** If you don't specify `--base-url` when logging in, the CLI defaults to `https://app.operately.com`. For self-hosted or staging environments, always provide the `--base-url` flag: ```bash # Self-hosted instance operately auth login --token <token> --base-url https://operately.yourcompany.com # Check current base URL operately auth whoami ``` ### Auth Flow Rules For Agents - `operately auth login --token <token>` is the safest path for automation and headless work. It validates the token and saves a profile without using the interactive bootstrap flow. - If an agent must use `operately auth login` without an existing token, prefer passing all known login data as flags so the CLI only asks for the unavoidable manual steps. - The two unavoidable manual login steps are: Google login browser confirmation, and email-code login verification-code entry from the user's email. - If an agent must use `operately auth signup`, prefer passing all known signup data as flags so the CLI only asks for the unavoidable manual steps. - The two unavoidable manual signup steps are: Google signup browser confirmation, and email/password signup verification-code entry from the user's email. - All `operately auth ...` commands are handcrafted in `cli/src/auth/`, with the per-flow modules under `cli/src/auth/flows/`. They are not generated from backend `external_endpoints`, even though the rest of the CLI command surface is generated. - Use interactive auth commands only when a human can answer prompts. For Google flows, also assume a browser is required. - `operately auth profiles` and `operately auth status` only report local CLI config state. They do not prove the saved token is valid. Use `operately auth whoami` when you need remote verification. - If the task involves choosing between login, signup, join, invite handling, or understanding which backend/internal endpoints the CLI will hit, read `references/auth-flows.md` before acting. ### Agent-Friendly Login Examples Prefer these over the fully interactive bootstrap flow when the necessary details are already known: ```bash # Password login: fully flag-driven when company and access mode are known operately auth login \ --method email-password \ --email [REDACTED_SECRET] \ --password secret123456 \ --company-id <company-id> \ --access-mode full-access \ --profile work # Email-code login: only the emailed verification code remains manual operately auth login \ --method email-code \ --email [REDACTED_SECRET] \ --company-name "Acme Corp" \ --access-mode read-only # Google login: browser confirmation remains manual operately auth login \ --method google \ --company-name "Acme Corp" \ --access-mode full-access ``` ### Agent-Friendly Signup Examples Prefer these over the fully interactive signup flow when the necessary details are already known: ```bash # Email/password signup: only the emailed verification code remains manual operately auth signup \ --method email-password \ --full-name "New User" \ --email [REDACTED_SECRET] \ --password secret123456 \ --next-step later # Google signup: browser confirmation remains manual operately auth signup \ --method google \ --next-step later ``` ### Authentication Options Three ways to provide authentication: 1. **Saved profile** (recommended for local use): ```bash operately auth login --token <token> ``` 2. **Environment variables** (best for CI/scripts): ```bash export OPERATELY_API_TOKEN=op_live_xxx export OPERATELY_BASE_URL=https://app.operately.com export OPERATELY_PROFILE=default ``` 3. **Per-command flags** (temporary overrides): ```bash operately people get_me --token <token> --base-url <url> ``` Priority: command flags > environment variables > saved profile. ### Multiple Environments Use profiles for different environments: ```bash # Production (default) operately auth login --token op_live_xxx # Staging operately auth login --token op_staging_xxx --profile staging --base-url https://staging.operately.com # Local development operately auth login --token op_local_xxx --profile local --base-url http://localhost:4000 ``` Switch profiles: ```bash operately people get_me --profile staging operately auth profiles ``` ### Interactive Auth Flow Summary - `operately auth login` is hybrid for password, email-code, and Google login: with no flags it is fully interactive, but any provided login flags suppress the matching prompts. Google login still requires browser confirmation, and email-code login still requires the emailed verification code. If no `--method` flag is provided, the interactive menu still includes prompted token entry as an option. - `operately auth signup` is hybrid: with no flags it is fully interactive, but any provided signup flags suppress the matching prompts. Google signup still requires browser confirmation, and email/password signup still requires the emailed verification code. - `operately auth create-company` is hybrid: with no flags it is fully interactive, but any provided flags suppress the matching prompts. It authenticates with email/password, email code, or Google OAuth, then creates a company and saves a full-access profile. - `operately auth join` is hybrid: with no flags it is fully interactive, but any provided flags suppress the matching prompts. It starts from an invite token and routes differently for personal invites vs company-wide invites. - When an interactive flow needs a profile name and `--profile` is not provided, the CLI prompts with the current active profile as the default; blank input accepts that default. - In bootstrap login flows, the CLI usually exchanges a short-lived bootstrap token for a company-scoped API token and then saves the resulting profile. - The detailed decision tree, prompt behavior, and endpoint mapping live in `references/auth-flows.md`. **Method prerequisites — confirm access BEFORE choosing a method:** | Method | Required access | |---|---| | `--token` | The API token itself | | `email-password` (login) | Email address AND password | | `email-password` (signup) | Email address AND inbox access (a code is sent during signup) | | `email-code` | Email address AND inbox access (a code is sent and must be read) | | `google` | Browser access for the OAuth confirmation step | - **Never choose Google OAuth** in headless, CI, or automated contexts — it always requires a human to confirm in the browser. - **Never choose email-code** without confirmed inbox access — a code is always sent and must be entered. - **Always pass known values as flags** (`--method`, `--email`, `--password`, `--company-name`, etc.) to suppress every prompt that can be suppressed. Only leave a step interactive when it is truly unavoidable (browser confirmation or entering an emailed code). ### 2. Command Structure Commands follow the API endpoint naming: ```bash operately <namespace> <endpoint_name> [flags] ``` Examples: ```bash operately people get_me operately people update_picture --avatar-file path-to-avatar-file operately projects list operately goals create --name "Q2 Revenue Goal" --space-id s1 operately tasks update_status --task-id t1 --type project --status.id done --status.label "Done" --status.color green --status.index 2 --status.value done --status.closed true operately files create --resource-hub-id r1 --file path-to-file ``` ### 3. Input Flags Flags map to API fields using kebab-case: **Simple values:** ```bash operately projects update_name --project-id p1 --name "New Name" ``` **Booleans:** ```bash operately projects get --id p1 --include-space operately projects get --id p1 --include-space=true ``` **Include flags (`--include-*`)** Include flags request extra related data or expanded result sets in the response. If an include flag is omitted, that data is **not returned**, but that does **not** mean the underlying resource does not have it. It means the CLI/API did not preload it. If the matching include flag was requested and the field is still missing, then treat that as the resource/data not existing for that object. Examples: - `operately projects get --id p1` will return the base project without `space`, `milestones`, or `contributors`. - `operately projects get --id p1 --include-space --include-milestones` requests those fields explicitly. - `operately projects get --id p1 --include-subscription-list` is required before using notification subscription commands that need the `subscription_list`. When reading CLI help: - Keep the flat `Input flags:` list in mind. - If help ends with `Include flag behavior:`, treat the listed resources as opt-in fields. - Do not infer “no milestones”, “no contributors”, or similar conclusions just because the field is missing from a response unless the matching include flag was requested. **Nulls:** ```bash operately goals update_due_date --goal-id g1 --due-date null ``` **Arrays** (repeat the flag): ```bash operately notifications mark_many_as_read --ids n1 --ids n2 ``` **Nested objects** (dot-index notation): ```bash operately projects update_task_statuses \ --task-statuses.0.id ts1 \ --task-statuses.0.label "To Do" \ --task-statuses.1.id ts2 \ --task-statuses.1.label "Done" ``` **Markdown content:** Many commands accept markdown content (documents, descriptions, check-ins, discussions). For anything beyond a single short sentence, **use file input** (`--<field>-file <path>`) instead of inline strings. File input preserves formatting perfectly without shell escaping issues. **Recommended: file input for multiline content** ```bash # Write content to a temp file, then pass the path cat > /tmp/description.md << 'EOF' # Q2 Roadmap ## Goals 1. Launch new feature 2. Improve performance ## Timeline - **May:** Design phase - **June:** Development - **July:** Launch EOF operately projects update_description \ --project-id p1 \ --description-file /tmp/description.md # Discussion with rich formatting cat > /tmp/post.md << 'EOF' Hey team. Here's the weekly update: - Shipped the new landing page - Fixed 3 bugs in check-in flow - Started work on notifications Next week we focus on **goal reviews**. EOF operately spaces create_discussion \ --space-id s1 \ --title "Weekly Update" \ --body-file /tmp/post.md # Document creation operately documents create \ --resource-hub-id rh1 \ --name "API Documentation" \ --content-file ./api-docs.md ``` **File input flag pattern:** For any flag that accepts markdown, append `-file` to use a file path instead: - `--body` → `--body-file <path>` - `--description` → `--description-file <path>` - `--content` → `--content-file <path>` **Inline strings (for short, single-line content only):** ```bash # Only use inline --body/--content/--description for simple one-liners operately documents create \ --resource-hub-id rh1 \ --name "Quick Note" \ --content "A short note with **bold** text." # Use \n for line breaks in inline strings (fragile, not recommended for complex content) operately projects update_description \ --project-id p1 \ --description "# Title\n\nOne paragraph." ``` **Binary file uploads:** Some commands accept a real local file path and upload the bytes, not just markdown content: ```bash # Update your profile picture from a local image operately people update_picture --avatar-file ./avatar.png # Remove your profile picture operately people update_picture --clear # Upload one file into a resource hub operately files create \ --resource-hub-id rh1 \ --file ./quarterly-report.pdf # Upload one file into a folder operately files create \ --resource-hub-id rh1 \ --folder-id f1 \ --file ./quarterly-report.pdf \ --name "Quarterly Report" \ --description-file ./quarterly-report.md ``` Rules for file inputs: - `people update_picture` accepts `--avatar-file <path>` to upload or `--clear` to remove the current picture. - `files create` accepts exactly one `--file <path>` per command. - `files create --name` overrides the base filename while preserving the source extension. - `--description-file <path>` still means "load markdown from disk"; the uploaded binary stays on `--file <path>`. - Do not try to create blobs manually first. These commands already handle blob creation, upload, preview generation, and finalization. Supported markdown: - Headings: `# H1`, `## H2`, `### H3` - Bold: `**text**`, Italic: `*text*` - Lists: `- item` or `1. item` - Links: `[text](url)` - Code: `` `inline` `` or `` ```block``` `` - Line breaks: `\n` (inline only; files handle this naturally) **Access Levels:** Many create commands require access level parameters to control who can view and interact with resources: - `--anonymous-access-level` - Access for non-authenticated users (not supported yet, always use `0`) - `--company-access-level` - Access for company members - `--space-access-level` - Access for space members **Access level values:** - `0` - No access - `10` - View only - `40` - Comment - `70` - Edit - `100` - Full access **Common pattern for team resources:** ```bash --anonymous-access-level 0 \ --company-access-level 10 \ --space-access-level 70 ``` **Note:** Get commands use generic `--id` parameter, while create/update commands use entity-specific IDs like `--project-id`, `--goal-id`, etc. ### 4. Output Options ```bash # Pretty JSON (default) operately people get_me # Compact JSON operately people get_me --compact # Save to file operately projects get --id p1 --output ./project.json # Verbose mode (shows request details) operately people get_me --verbose ``` ## Available Namespaces The CLI provides access to the external API across these namespaces: - **comments** - Comment management on resources - **companies** - Company settings, members, permissions - **documents** - Document creation and management in resource hubs - **files** - File upload, retrieval, renaming, and deletion in resource hubs - **goals** - Goal management, check-ins, targets - **links** - Link management in resource hubs - **notifications** - Notification preferences and subscriptions - **people** - User and team member management, including profile picture updates - **projects** - Project management, milestones, check-ins - **reactions** - Emoji reactions to content - **resource_hubs** - Resource hub and folder operations - **spaces** - Space (team/department) management - **tasks** - Task management across projects ## Assignments and Reviews Get all items requiring your attention or review with a single command: ```bash operately people list_assignments ``` This returns assignments categorized into three groups: - **`due_soon`** - Items you own that are overdue, due today, or due soon - **`needs_review`** - Items where you are the reviewer (check-ins, goal updates) awaiting acknowledgment - **`upcoming`** - Items you own with future due dates Each category contains groups of assignments organized by their origin (project, goal, or space). Assignments include: - **Milestones** - Project milestones you own - **Tasks** - Project and space tasks assigned to you - **Projects** - Projects you own or are reviewing - **Goals** - Goals you own or are reviewing - **Check-ins** - Project and goal check-ins requiring your review The response structure groups related items together and sorts by urgency, making it easy to prioritize your work. Items needing review show the author's name and what action is required. **See:** `references/assignments-and-reviews.md` for detailed examples, filtering techniques, and integration workflows. ## Projects ### Create Project ```bash operately projects create \ --space-id s1 \ --name "Q2 Product Roadmap" \ --anonymous-access-level 0 \ --company-access-level 10 \ --space-access-level 70 ``` ### Get Project ```bash operately projects get \ --id p1 \ --include-space \ --include-milestones ``` If you omit `--include-space` or `--include-milestones`, those fields will be absent from the response even when the project has a space or milestones. Missing included data usually means “not preloaded,” not “does not exist.” ### Update Project ```bash operately projects update_name --project-id p1 --name "Q2 Roadmap" operately projects update_description --project-id p1 --description "# Overview\n\nQ2 goals..." operately projects update_due_date --project-id p1 --due-date 2024-06-30 ``` ### Milestones ```bash # Create milestone operately projects create_milestone \ --project-id p1 \ --name "Launch" \ --due-date 2024-06-30 # List milestones operately projects list_milestones --project-id p1 # Update milestone operately projects update_milestone_title \ --milestone-id m1 \ --title "Public Launch" operately projects update_milestone_due_date \ --milestone-id m1 \ --due-date 2024-07-15 ``` ### Project Check-ins ```bash # Create check-in operately projects create_check_in \ --project-id p1 \ --status on_track \ --description "# Progress\n\nCompleted design phase." # List check-ins operately projects list_check_ins --project-id p1 # Acknowledge check-in operately projects acknowledge_check_in --id ci1 ``` ### Contributors ```bash # Add contributor operately projects create_contributor \ --project-id p1 \ --person-id u1 \ --responsibility "Design lead" \ --permissions edit_access \ --role reviewer # List contributors operately projects list_contributors --project-id p1 # Update contributor operately projects update_contributor \ --contrib-id c1 \ --responsibility "Lead designer and UX researcher" ``` ## Goals ### Create Goal ```bash operately goals create \ --space-id s1 \ --name "Q2 Revenue Goal" \ --champion-id u1 \ --reviewer-id u2 \ --anonymous-access-level 0 \ --company-access-level 10 \ --space-access-level 70 ``` ### Goal Hierarchy ```bash # Create child goal operately goals create \ --space-id s1 \ --name "Increase MRR" \ --parent-goal-id g1 \ --anonymous-access-level 0 \ --company-access-level 10 \ --space-access-level 70 # Update parent operately goals update_parent_goal \ --goal-id g2 \ --parent-goal-id g1 # Search for parent goals operately goals search_parent_goal --query "Revenue" --goal-id g1 ``` ### Targets ```bash # Create target operately goals create_target \ --goal-id g1 \ --name "Monthly Revenue" \ --start-value 50000 \ --target-value 100000 \ --unit "USD" # Update target value operately goals update_target_value \ --goal-id g1 \ --target-id t1 \ --value 75000 ``` ### Goal Check-ins ```bash # Create check-in operately goals create_check_in \ --goal-id g1 \ --status on_track \ --due-date 2026-04-01 \ --content "Making good progress on Q2 targets" # List check-ins operately goals list_check_ins --goal-id g1 # Acknowledge check-in operately goals acknowledge_check_in --id ci1 ``` ### Goal Lifecycle ```bash # Close goal operately goals close \ --goal-id g1 \ --success achieved \ --success-status achieved \ --retrospective "# Retrospective\n\nWe exceeded our target." # Reopen goal operately goals reopen --id g1 --message "Reopening after new planning input." ``` ## Tasks ### Create Task ```bash operately tasks create \ --type project \ --id p1 \ --milestone-id m1 \ --name "Design mockups" \ --assignee-id u1 \ --due-date 2024-06-15 ``` **Note:** Tasks require `--type` ("project" or "space") and `--id` (project or space ID) parameters. ### List Tasks ```bash operately tasks list --project-id p1 ``` ### Update Task ```bash # Update status operately tasks update_status --task-id t1 --type project --status.id done --status.label "Done" --status.color green --status.index 2 --status.value done --status.closed true # Update assignee operately tasks update_assignee --task-id t1 --type project --assignee-id u2 # Update due date operately tasks update_due_date --task-id t1 --type project --due-date 2024-06-20 # Update description operately tasks update_description \ --task-id t1 \ --type project \ --description "# Task Details\n\nCreate high-fidelity mockups." ``` ### Move Task ```bash # Move to different milestone operately tasks update_milestone --task-id t1 --milestone-id m2 # Move with ordering operately tasks update_milestone_and_ordering \ --task-id t1 \ --milestone-id m2 \ --milestones-ordering-state.0.milestone-id m2 \ --milestones-ordering-state.0.ordering-state.0 t1 ``` ## Spaces ### Create Space ```bash operately spaces create \ --name "Engineering" \ --mission "Build great products" \ --company-permissions 10 \ --public-permissions 0 ``` ### Manage Members ```bash # Add members operately spaces add_members \ --space-id s1 \ --members.0.id u1 \ --members.0.access-level 70 \ --members.1.id u2 \ --members.1.access-level 40 # List members operately spaces list_members --space-id s1 # Remove member operately spaces delete_member --space-id s1 --member-id u1 # Update permissions operately spaces update_members_permissions \ --space-id s1 \ --members.0.id u1 \ --members.0.access-level 70 ``` ### Space Tools ```bash # List available tools operately spaces list_tools --space-id s1 # Update enabled tools operately spaces update_tools \ --space-id s1 \ --tools.tasks-enabled true \ --tools.discussions-enabled true \ --tools.resource-hub-enabled true ``` ## Resource Hubs See [Resource Hubs Reference](references/resource-hubs.md) for detailed workflows. ### Find Resource Hub ID Every space already has a resource hub. To find the resource hub ID for a space: ```bash operately spaces list_tools --space-id s1 ``` Use the returned resource hub ID with `documents`, `files`, `links`, and `resource_hubs`. ### Folder Management ```bash # Create folder at root operately resource_hubs create_folder \ --resource-hub-id rh1 \ --name "Guides" # Create nested folder operately resource_hubs create_folder \ --resource-hub-id rh1 \ --folder-id f1 \ --name "Onboarding" # Rename folder operately resource_hubs rename_folder \ --folder-id f1 \ --new-name "Team Guides" # Move folder operately resource_hubs update_parent_folder \ --resource-id f2 \ --resource-type "folder" \ --new-folder-id f1 ``` ### Documents ```bash # Create document at root operately documents create \ --resource-hub-id rh1 \ --name "Getting Started" \ --content "# Getting Started\n\nWelcome to the team." # Create document in folder operately documents create \ --resource-hub-id rh1 \ --folder-id f1 \ --name "Onboarding Guide" \ --content "# Onboarding\n\nFirst steps..." # Update document operately documents update \ --document-id d1 \ --name "Updated Guide" \ --content "# Updated Content" # Publish draft operately documents publish --document-id d1 ``` ### Links ```bash # Create link at root operately links create \ --resource-hub-id rh1 \ --name "Company Handbook" \ --url "https://handbook.example.com" \ --type "other" # Create link in folder operately links create \ --resource-hub-id rh1 \ --folder-id f1 \ --name "Design System" \ --url "https://design.example.com" \ --type "other" \ --description "Our design system documentation" ``` ### List Contents ```bash # List root contents operately resource_hubs list_nodes --resource-hub-id rh1 # List folder contents operately resource_hubs list_nodes --folder-id f1 # Include metadata operately resource_hubs list_nodes \ --resource-hub-id rh1 \ --include-comments-count \ --include-children-count ``` ## Discussions ### Create Discussion ```bash # Space discussion operately spaces create_discussion \ --space-id s1 \ --title "Q2 Planning" \ --body "# Q2 Planning\n\nLet's discuss priorities." # Space discussion from a markdown file operately spaces create_discussion \ --space-id s1 \ --title "Q2 Planning" \ --body-file ./q2-planning.md # Project discussion operately projects create_discussion \ --project-id p1 \ --title "Architecture Review" \ --message "# Architecture\n\nProposed changes..." # Goal discussion operately goals create_discussion \ --goal-id g1 \ --title "Target Adjustment" \ --message "Should we revise our targets?" ``` ### List Discussions ```bash operately spaces list_discussions --space-id s1 operately projects list_discussions --project-id p1 operately goals list_discussions --goal-id g1 ``` ## Comments ```bash # Create comment operately comments create \ --entity-id e1 \ --entity-type "project_check_in" \ --content "Great progress!" # List comments operately comments list --entity-id e1 --entity-type "project_check_in" # Update comment operately comments update --comment-id c1 --parent-type project_check_in --content "Updated comment" # Delete comment operately comments delete --comment-id c1 --parent-type project_check_in ``` ## Notifications ```bash # List notifications operately notifications list # Get unread count operately notifications get_unread_count # Mark as read operately notifications mark_as_read --id n1 # Mark many as read operately notifications mark_many_as_read \ --ids n1 \ --ids n2 # Mark all as read operately notifications mark_all_as_read # Check subscription status (uses resource-id) operately notifications is_subscribed \ --resource-id r1 \ --resource-type project # Get subscription-list-id from the resource first operately projects get \ --id r1 \ --include-subscription-list # Subscribe to resource (uses subscription-list-id from above) operately notifications subscribe \ --subscription-list-id <subscription-list-id> \ --type project # Unsubscribe from subscription list (uses subscription-list-id) operately notifications unsubscribe \ --subscription-list-id <subscription-list-id> ``` If `subscription_list` is missing from the `projects get` response, do not assume the project lacks one. It means `--include-subscription-list` was omitted and the field was not preloaded. ## People ```bash # Get current user operately people get_me # Get user by ID operately people get --id u1 # List people operately people list # Search people operately people search --query "john" # Update profile operately people update \ --id u1 \ --title "Senior Engineer" \ --manager-id u2 # Set profile picture from a local image operately people update_picture --avatar-file ./avatar.png # Remove profile picture operately people update_picture --clear ``` ## Company ```bash # Get company operately companies get # List companies operately companies list # Get work map operately companies get_work_map # Global search operately companies global_search --query "roadmap" # Create member operately companies create_member \ --full-name "John Doe" \ --email "[REDACTED_SECRET]" \ --title "Engineer" ``` ## Help System The CLI provides built-in help at three levels: **Namespace-level help** - List all commands in a namespace: ```bash operately <namespace> operately <namespace> --help ``` Examples: ```bash operately projects operately goals --help ``` Both forms display all available commands within that namespace. **Command-level help** - Show command description and parameters: ```bash operately <namespace> <command> --help ``` Examples: ```bash operately projects create --help operately goals update_target_value --help ``` This displays: - Command description - All required parameters (marked with `(required)`) - All optional parameters - Parameter types and formats **Auth command help** - Show all flags, validation rules, and examples for any `auth` subcommand: ```bash operately auth <command> --help operately help auth <command> ``` Examples: ```bash operately auth login --help operately auth join --help operately auth create-company --help operately auth signup --help ``` This displays the full flag list, accepted method aliases, validation rules, and copy-paste examples for that specific auth command. **Always run this before executing an auth command when uncertain about available flags or their constraints.** **Auth overview help** - List all auth subcommands: ```bash operately auth operately help auth ``` **General help:** ```bash operately help ``` ## Exit Codes - `0` - Success - `1` - Auth precondition not met (e.g., logout attempted when not logged in) - `2` - CLI usage/validation error - `3` - Missing authentication token/config - `4` - API 4xx error (client error) - `5` - API 5xx/network/fatal error (server error) ## Troubleshooting ### Authentication Failures Check authentication setup: ```bash operately auth profiles operately auth status operately auth whoami ``` Interpret them differently: - `operately auth profiles` lists saved local profiles, marks the active one, and shows saved metadata/base URLs. - `operately auth status` checks whether the CLI has local profile/token config. - `operately auth whoami` checks whether the current token actually works against the target Operately instance. If token is invalid or expired, login again: ```bash operately auth login --token <new-token> ``` ### Command Not Found Verify CLI is installed: ```bash command -v operately npm list -g @operately/operately-cli ``` Update to latest version: ```bash npm update -g @operately/operately-cli operately --version ``` ### API Errors Use verbose mode to see request details: ```bash operately projects get --id p1 --verbose ``` Check the API response for specific error messages. ### Missing Required Fields Use help to see required flags: ```bash operately help projects create ``` Required fields are marked with `(required)` in the help output. ## When to Use Other Skills This is the primary skill for Operately CLI operations. Future skills may include: - **operately-automation** - CI/CD integration patterns - **operately-reporting** - Analytics and reporting workflows ## References - [Project Workflows](references/project-workflows.md) - Project lifecycle and milestone management - [Goal Workflows](references/goal-workflows.md) - OKR patterns and goal tracking - [Task Workflows](references/task-workflows.md) - Task management best practices for projects and spaces - [Space Workflows](references/space-workflows.md) - Space management, members, tools, and access control - [Resource Hubs](references/resource-hubs.md) - Knowledge base organization - [Collaboration Patterns](references/collaboration-patterns.md) - Team collaboration workflows


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)