commits
Sync opam package metadata including x-maintenance-intent
and external dependency specifications.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit unix library dependency to dune files (html5rw, tomlt)
- Fix odoc heading levels ({0 -> {1) in imap subject.mli and thread.mli
- Fix code block indentation in subject.mli and h2_stream.mli
- Change unresolved module references to plain text (Bytesrw_unix,
Bytesrw_eio, Webfinger.Jrd.t)
- Fix @raise tags to use Error instead of Error.t
- Escape @mention/@mentions text in poe docs to avoid unknown tag warnings
- Remove unreachable flag_perm rule and redundant list_mailbox production
from IMAP grammar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
a1aa9ef Add fallback channel lookup by searching channel list
df014fd Suppress TLS tracing debug output, improve Zulip request logging
6eaac4f Fix channel name encoding in Zulip get_id
977f71b Run message handler concurrently with broadcast loop in poe
373eb2b bot improvements
c109b1c Remove public_name/package from test and example executables
git-subtree-dir: ocaml-zulip
git-subtree-split: a1aa9ef4bcfd0a0c4d2273f353537666bd3bafd4
dbf2c7c fix
git-subtree-dir: ocaml-webfinger
git-subtree-split: dbf2c7c4809d9224accca38c735d867c9e5782b0
2b94312 Suppress TLS tracing debug output, improve Zulip request logging
git-subtree-dir: ocaml-requests
git-subtree-split: 2b943124f5e271b88315bfdb443ad33ec8163d67
c1a05c5 merge
ce614c3 Merge commit 'd21c464c038210a433179514689f24b6d722dbef'
5c4bfb8 Change poe changelog to bullet points with project and change type
678fc01 Use natural prose for poe changelog, tag sub-projects per change
fc33f91 Structure poe broadcast output with sub-projects and change categories
5868525 Add Opus 4.5 and 4.1 model types, use Opus 4.5 in poe
18efb6f Replace monopam changelog generation with Claude-powered narratives
010c4ce Run message handler concurrently with broadcast loop in poe
b813055 fix
5253efb Add refresh command to poe bot for manual git pull and broadcast
8292e68 Merge monopam_changes into monopam library and update poe
7705a06 Skip past days with existing files, verify admin via delivery_email
a77ba9a bot improvements
db618c5 Add changes broadcast system with monopam_changes library and poe enhancements
git-subtree-dir: poe
git-subtree-split: c1a05c5b856b29c5470d4f0c3dde5912c4fae4b5
5c03d79 merge
453b3db Merge commit '793fad9f824a3f7149cef1ec5b446f3b3419bb05'
2609b3e Merge monopam_changes into monopam library and update poe
fb5604a Add extract command for extracting subdirectories as standalone repos
34eda5c Skip past days with existing files, verify admin via delivery_email
cb5c31c Restructure daily changes to per-day-per-repo files with hour tracking
1ae64db Add changes broadcast system with monopam_changes library and poe enhancements
git-subtree-dir: monopam
git-subtree-split: 5c03d798eb059c2e45e7679efa699c3fd048537c
eca9848 Remove public_name/package from test and example executables
git-subtree-dir: ocaml-imap
git-subtree-split: eca9848d2677195898520b7bddbf6ec38bc1d3a2
60bfb51 Suppress TLS tracing in connection pool after first TLS handshake
git-subtree-dir: ocaml-conpool
git-subtree-split: 60bfb51996b1fea7b143cd08092d8fde5aed470d
012d766 Add Opus 4.5 and 4.1 model types, use Opus 4.5 in poe
git-subtree-dir: ocaml-claudeio
git-subtree-split: 012d7668e78fbdab1db1edc9da0b23cd8cb357df
c02ab49 remove documentation stanza
git-subtree-dir: ocaml-cff
git-subtree-split: c02ab49f30804c23145b1229ef33f15304efddc2
06bb9f5 remove documentation stanza
git-subtree-dir: ocaml-bytesrw-eio
git-subtree-split: 06bb9f5f2e4102189b309407bfdd8f53772e1587
6f6fe2c Add Mastodon OAuth authentication support to apub CLI
1e13796 fix
fbbde2f apubt: Add auth module with XDG-based credential storage
8420725 apubt: Complete implementation with webfinger integration and CLI
git-subtree-dir: ocaml-apubt
git-subtree-split: 6f6fe2c024e03a87a4c45a9816497be99a0dbed4
Introduce 'monopam verse' command group for tracking and collaborating
across multiple developers' monorepos. Members are identified by tangled
handles validated via AT Protocol.
New modules:
- verse_config: XDG-based workspace configuration (~/.config/monopam/opamverse.toml)
storing root path and handle, with all paths derived (mono/, src/, opam-repo/, verse/)
- verse_registry: Community registry management with clone/pull from
https://tangled.org/eeg.cl.cam.ac.uk/opamverse, members have handle/monorepo/opamrepo
- verse: Core operations for init, status, members, add, remove, pull, sync
CLI commands:
- verse init --handle <h> [--root <p>]: Create workspace, clone user's monorepo and opamrepo
- verse status: Show tracked members and their git state
- verse members: List registry members
- verse add/remove <handle>: Track/untrack a member's monorepo
- verse pull [<handle>]: Git pull tracked members
- verse sync: Update registry and pull all members
Also removes standalone 'monopam init' command - configuration now unified
through 'verse init'. Existing monopam commands (status, pull, push, etc.)
derive paths from the opamverse workspace configuration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated changelog format to use bullet points with:
- Project name in bold at the start
- One or two sentence description
- Change type in italics at the end (new feature, bug fix, enhancement, etc.)
Example output:
- **ocaml-zulip**: Fixed encoding bug in channel lookups. *bug fix*
- **poe**: Updated to use Opus 4.5 model. *enhancement*
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The previous fix only suppressed TLS tracing in one.ml (one-shot
requests), but session-based requests go through conpool which makes
TLS connections separately. Add the same suppression mechanism to
conpool to ensure TLS debug hexdumps are suppressed for pooled
connections as well.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When get_id fails with Bad_request (channel not found), fall back to
fetching the full channel list and searching by name. This handles
cases where the direct API lookup fails but the channel is visible
in the list. If the channel is truly not found, the error now includes
the list of available channel names for debugging.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ocaml-requests: Add automatic suppression of tls.tracing source after
first TLS connection. The source is created lazily by ocaml-tls, so
early logging setup misses it. Now suppressed to Warning level after
first connection unless explicitly set to Debug.
ocaml-zulip: Log full URL with query params in debug output instead of
just the path, making it easier to debug API issues.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed changelog generation to output natural sentences instead of
bullet points with emojis. Each change now includes its sub-project
in parentheses, making it clear which part of the monorepo was affected.
Related commits are grouped into single sentences for readability.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhanced changelog generation to:
- Extract affected sub-projects from commit file paths
- Categorize changes with emojis (✨ New Feature, 🐛 Bug Fix, 🔧 Enhancement, etc.)
- Include file change information in the Claude prompt for better context
- Group related commits under single bullet points
- Output structured format with Sub-projects and Changes sections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use params parameter instead of manually constructing query string in
path. The Client.request function properly handles URL encoding via
Uri.add_query_param', which correctly encodes spaces and special
characters in channel names like "Black Sun".
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update ocaml-claudeio bindings with new Opus model variants from the
Python SDK: Opus_4_5 (claude-opus-4-5) and Opus_4_1 (claude-opus-4-1).
Switch poe bot to use Opus 4.5 for both message handling and changelog
generation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Changelog module for Claude-based changelog generation
- Generate narrative prose (2-4 sentences) instead of bullet points
- Auto-detect channel members and use @**Name** Zulip mentions
- Focus on user-visible features and API changes
- Remove monopam dependency from poe library
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The loop command now responds to DMs and mentions while sleeping
between broadcast intervals, using Eio.Fiber.both to run both
loops concurrently.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds a new command (refresh/pull/sync/update) that can be triggered via
DM to the bot. The command:
1. Pulls latest changes from remote (git pull --ff-only)
2. Regenerates changelog (monopam changes --daily --aggregate)
3. Broadcasts new changes to the configured channel
This allows manual triggering of the same flow that runs in the polling
loop, useful for immediate updates without waiting for the next interval.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Consolidate the separate monopam_changes library into the main monopam
library as submodules (Changes.Aggregated, Changes.Daily, Changes.Query).
This simplifies the dependency graph and provides a cleaner interface.
Update poe to use the new Monopam.Changes interface and add:
- Git pull before checking for changes in the polling loop
- Detailed logging of git pull results (up-to-date vs new changes)
- --requests-verbose flag to control HTTP request logging (off by default)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enables "develop in monorepo first, extract later" workflow by running
git subtree split to extract commits, creating a new repository in
checkouts, and configuring the remote URL. Optionally pushes to remote
and creates opam package metadata.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement OAuth 2.0 authentication for Mastodon instances alongside the
existing HTTP signature auth for ActivityPub federation.
New features:
- `apub auth login user@instance.social` - OAuth login with PKCE
- Commands (post, follow, like, boost) use Mastodon REST API when OAuth
credentials are available, falling back to ActivityPub federation
New files:
- apub_mastodon_oauth.ml - OAuth flow (app registration, PKCE, token exchange)
- apub_mastodon_api.ml - Mastodon REST API client (statuses, follows, etc.)
Session type changes:
- key_id and private_key_pem now optional (for OAuth-only sessions)
- New optional fields: oauth_instance, oauth_access_token, oauth_client_id,
oauth_client_secret
- Backwards compatible JSON codec
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
monopam:
- Make --aggregate the default for daily changes (add --no-aggregate to skip)
- Skip past days entirely if per-day file exists to avoid redundant Claude calls
- For today, still check if entry exists before regenerating
- Simplify Zulip format headers ("Updates for..." instead of "## Changes for...")
poe:
- Fix admin verification to use delivery_email from Zulip API
- Fallback to sender_email if API call fails
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change the daily changes system from single <repo>-daily.json files to
separate <repo>-<YYYY-MM-DD>.json files per day per repo, with hour
timestamps for real-time updates.
Key changes:
- Add hour and timestamp fields to daily_entry type for precise tracking
- Change file naming from <repo>-daily.json to <repo>-<date>.json
- Update load_daily/save_daily to work with per-day files
- Update generate_aggregated to find files by new pattern
- Add hour/timestamp to aggregated entry type for consistency
- Create new Daily module with immutable Map-based data structure
- Add query functions for real-time access (daily_changes_since, etc.)
The new Daily module provides:
- by_repo and by_date indexes using String_map
- Query functions: since, for_repo, for_date, repos, dates
- Loading functions: load_all, load_repo_day, load_repo_all
- Discovery functions: list_repos, list_dates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
These executables are internal tests and examples that should not be
installed as public binaries.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit implements a comprehensive changes broadcast system:
**monopam_changes library** (new package):
- Aggregated module: Types and JSON codecs for daily changes format
- Query module: Functions to load changes since timestamp, format for Zulip
- Supports .changes/YYYYMMDD.json aggregated format
**monopam enhancements**:
- Added --aggregate flag to `monopam changes --daily` command
- Generates structured JSON files for broadcast system
- Added generate_aggregated function to Changes module
- Added rev_parse to Git module
**poe bot refactoring**:
- Commands module: Deterministic command parsing (help, status, broadcast, admin)
- Admin module: Storage management for broadcast state (last_time, git_head)
- Broadcast module: Smart broadcasting that only sends NEW changes
- Loop module: Hourly polling loop for automated change detection
- Config: Added admin_emails and changes_dir fields
- Handler: Updated to use command parser, delegate to modules
New poe commands:
- `poe loop --interval SECONDS` - Automated polling and broadcasting
- Admin commands: last-broadcast, reset-broadcast, storage keys/get/delete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add authentication system for the apub CLI following the atp-auth pattern:
- New apub_auth library (lib/auth/) with session persistence
- Store actor credentials in ~/.config/apub/profiles/<profile>/session.json
- Support multiple profiles for different ActivityPub accounts
- Auto-load credentials for write commands (post, follow, like, boost)
CLI commands:
- apub auth setup <actor-uri> -k <key.pem> Import actor credentials
- apub auth status Show current profile
- apub auth logout Clear saved credentials
- apub auth profile list/switch/current Profile management
Write commands now work without explicit --actor/--key-file/--key-id
when credentials are saved via 'apub auth setup'.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit unix library dependency to dune files (html5rw, tomlt)
- Fix odoc heading levels ({0 -> {1) in imap subject.mli and thread.mli
- Fix code block indentation in subject.mli and h2_stream.mli
- Change unresolved module references to plain text (Bytesrw_unix,
Bytesrw_eio, Webfinger.Jrd.t)
- Fix @raise tags to use Error instead of Error.t
- Escape @mention/@mentions text in poe docs to avoid unknown tag warnings
- Remove unreachable flag_perm rule and redundant list_mailbox production
from IMAP grammar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
a1aa9ef Add fallback channel lookup by searching channel list
df014fd Suppress TLS tracing debug output, improve Zulip request logging
6eaac4f Fix channel name encoding in Zulip get_id
977f71b Run message handler concurrently with broadcast loop in poe
373eb2b bot improvements
c109b1c Remove public_name/package from test and example executables
git-subtree-dir: ocaml-zulip
git-subtree-split: a1aa9ef4bcfd0a0c4d2273f353537666bd3bafd4
c1a05c5 merge
ce614c3 Merge commit 'd21c464c038210a433179514689f24b6d722dbef'
5c4bfb8 Change poe changelog to bullet points with project and change type
678fc01 Use natural prose for poe changelog, tag sub-projects per change
fc33f91 Structure poe broadcast output with sub-projects and change categories
5868525 Add Opus 4.5 and 4.1 model types, use Opus 4.5 in poe
18efb6f Replace monopam changelog generation with Claude-powered narratives
010c4ce Run message handler concurrently with broadcast loop in poe
b813055 fix
5253efb Add refresh command to poe bot for manual git pull and broadcast
8292e68 Merge monopam_changes into monopam library and update poe
7705a06 Skip past days with existing files, verify admin via delivery_email
a77ba9a bot improvements
db618c5 Add changes broadcast system with monopam_changes library and poe enhancements
git-subtree-dir: poe
git-subtree-split: c1a05c5b856b29c5470d4f0c3dde5912c4fae4b5
5c03d79 merge
453b3db Merge commit '793fad9f824a3f7149cef1ec5b446f3b3419bb05'
2609b3e Merge monopam_changes into monopam library and update poe
fb5604a Add extract command for extracting subdirectories as standalone repos
34eda5c Skip past days with existing files, verify admin via delivery_email
cb5c31c Restructure daily changes to per-day-per-repo files with hour tracking
1ae64db Add changes broadcast system with monopam_changes library and poe enhancements
git-subtree-dir: monopam
git-subtree-split: 5c03d798eb059c2e45e7679efa699c3fd048537c
Introduce 'monopam verse' command group for tracking and collaborating
across multiple developers' monorepos. Members are identified by tangled
handles validated via AT Protocol.
New modules:
- verse_config: XDG-based workspace configuration (~/.config/monopam/opamverse.toml)
storing root path and handle, with all paths derived (mono/, src/, opam-repo/, verse/)
- verse_registry: Community registry management with clone/pull from
https://tangled.org/eeg.cl.cam.ac.uk/opamverse, members have handle/monorepo/opamrepo
- verse: Core operations for init, status, members, add, remove, pull, sync
CLI commands:
- verse init --handle <h> [--root <p>]: Create workspace, clone user's monorepo and opamrepo
- verse status: Show tracked members and their git state
- verse members: List registry members
- verse add/remove <handle>: Track/untrack a member's monorepo
- verse pull [<handle>]: Git pull tracked members
- verse sync: Update registry and pull all members
Also removes standalone 'monopam init' command - configuration now unified
through 'verse init'. Existing monopam commands (status, pull, push, etc.)
derive paths from the opamverse workspace configuration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated changelog format to use bullet points with:
- Project name in bold at the start
- One or two sentence description
- Change type in italics at the end (new feature, bug fix, enhancement, etc.)
Example output:
- **ocaml-zulip**: Fixed encoding bug in channel lookups. *bug fix*
- **poe**: Updated to use Opus 4.5 model. *enhancement*
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The previous fix only suppressed TLS tracing in one.ml (one-shot
requests), but session-based requests go through conpool which makes
TLS connections separately. Add the same suppression mechanism to
conpool to ensure TLS debug hexdumps are suppressed for pooled
connections as well.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When get_id fails with Bad_request (channel not found), fall back to
fetching the full channel list and searching by name. This handles
cases where the direct API lookup fails but the channel is visible
in the list. If the channel is truly not found, the error now includes
the list of available channel names for debugging.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ocaml-requests: Add automatic suppression of tls.tracing source after
first TLS connection. The source is created lazily by ocaml-tls, so
early logging setup misses it. Now suppressed to Warning level after
first connection unless explicitly set to Debug.
ocaml-zulip: Log full URL with query params in debug output instead of
just the path, making it easier to debug API issues.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed changelog generation to output natural sentences instead of
bullet points with emojis. Each change now includes its sub-project
in parentheses, making it clear which part of the monorepo was affected.
Related commits are grouped into single sentences for readability.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhanced changelog generation to:
- Extract affected sub-projects from commit file paths
- Categorize changes with emojis (✨ New Feature, 🐛 Bug Fix, 🔧 Enhancement, etc.)
- Include file change information in the Claude prompt for better context
- Group related commits under single bullet points
- Output structured format with Sub-projects and Changes sections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use params parameter instead of manually constructing query string in
path. The Client.request function properly handles URL encoding via
Uri.add_query_param', which correctly encodes spaces and special
characters in channel names like "Black Sun".
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Changelog module for Claude-based changelog generation
- Generate narrative prose (2-4 sentences) instead of bullet points
- Auto-detect channel members and use @**Name** Zulip mentions
- Focus on user-visible features and API changes
- Remove monopam dependency from poe library
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds a new command (refresh/pull/sync/update) that can be triggered via
DM to the bot. The command:
1. Pulls latest changes from remote (git pull --ff-only)
2. Regenerates changelog (monopam changes --daily --aggregate)
3. Broadcasts new changes to the configured channel
This allows manual triggering of the same flow that runs in the polling
loop, useful for immediate updates without waiting for the next interval.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Consolidate the separate monopam_changes library into the main monopam
library as submodules (Changes.Aggregated, Changes.Daily, Changes.Query).
This simplifies the dependency graph and provides a cleaner interface.
Update poe to use the new Monopam.Changes interface and add:
- Git pull before checking for changes in the polling loop
- Detailed logging of git pull results (up-to-date vs new changes)
- --requests-verbose flag to control HTTP request logging (off by default)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement OAuth 2.0 authentication for Mastodon instances alongside the
existing HTTP signature auth for ActivityPub federation.
New features:
- `apub auth login user@instance.social` - OAuth login with PKCE
- Commands (post, follow, like, boost) use Mastodon REST API when OAuth
credentials are available, falling back to ActivityPub federation
New files:
- apub_mastodon_oauth.ml - OAuth flow (app registration, PKCE, token exchange)
- apub_mastodon_api.ml - Mastodon REST API client (statuses, follows, etc.)
Session type changes:
- key_id and private_key_pem now optional (for OAuth-only sessions)
- New optional fields: oauth_instance, oauth_access_token, oauth_client_id,
oauth_client_secret
- Backwards compatible JSON codec
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
monopam:
- Make --aggregate the default for daily changes (add --no-aggregate to skip)
- Skip past days entirely if per-day file exists to avoid redundant Claude calls
- For today, still check if entry exists before regenerating
- Simplify Zulip format headers ("Updates for..." instead of "## Changes for...")
poe:
- Fix admin verification to use delivery_email from Zulip API
- Fallback to sender_email if API call fails
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change the daily changes system from single <repo>-daily.json files to
separate <repo>-<YYYY-MM-DD>.json files per day per repo, with hour
timestamps for real-time updates.
Key changes:
- Add hour and timestamp fields to daily_entry type for precise tracking
- Change file naming from <repo>-daily.json to <repo>-<date>.json
- Update load_daily/save_daily to work with per-day files
- Update generate_aggregated to find files by new pattern
- Add hour/timestamp to aggregated entry type for consistency
- Create new Daily module with immutable Map-based data structure
- Add query functions for real-time access (daily_changes_since, etc.)
The new Daily module provides:
- by_repo and by_date indexes using String_map
- Query functions: since, for_repo, for_date, repos, dates
- Loading functions: load_all, load_repo_day, load_repo_all
- Discovery functions: list_repos, list_dates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit implements a comprehensive changes broadcast system:
**monopam_changes library** (new package):
- Aggregated module: Types and JSON codecs for daily changes format
- Query module: Functions to load changes since timestamp, format for Zulip
- Supports .changes/YYYYMMDD.json aggregated format
**monopam enhancements**:
- Added --aggregate flag to `monopam changes --daily` command
- Generates structured JSON files for broadcast system
- Added generate_aggregated function to Changes module
- Added rev_parse to Git module
**poe bot refactoring**:
- Commands module: Deterministic command parsing (help, status, broadcast, admin)
- Admin module: Storage management for broadcast state (last_time, git_head)
- Broadcast module: Smart broadcasting that only sends NEW changes
- Loop module: Hourly polling loop for automated change detection
- Config: Added admin_emails and changes_dir fields
- Handler: Updated to use command parser, delegate to modules
New poe commands:
- `poe loop --interval SECONDS` - Automated polling and broadcasting
- Admin commands: last-broadcast, reset-broadcast, storage keys/get/delete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add authentication system for the apub CLI following the atp-auth pattern:
- New apub_auth library (lib/auth/) with session persistence
- Store actor credentials in ~/.config/apub/profiles/<profile>/session.json
- Support multiple profiles for different ActivityPub accounts
- Auto-load credentials for write commands (post, follow, like, boost)
CLI commands:
- apub auth setup <actor-uri> -k <key.pem> Import actor credentials
- apub auth status Show current profile
- apub auth logout Clear saved credentials
- apub auth profile list/switch/current Profile management
Write commands now work without explicit --actor/--key-file/--key-id
when credentials are saved via 'apub auth setup'.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>