Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file added .DS_Store
Binary file not shown.
7 changes: 0 additions & 7 deletions .changeset/README.md

This file was deleted.

11 changes: 0 additions & 11 deletions .changeset/config.json

This file was deleted.

36 changes: 1 addition & 35 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,5 @@
name: CI
on:
push:
branches:
- "**"
- "!integrated/**"
- "!stl-preview-head/**"
- "!stl-preview-base/**"
- "!generated"
- "!codegen/**"
- "codegen/stl/**"
pull_request:
branches-ignore:
- "stl-preview-head/**"
- "stl-preview-base/**"
on: [push, pull_request]

jobs:
test:
Expand All @@ -39,24 +26,3 @@ jobs:

- name: Test
run: bun run test

# Binary/Homebrew packaging is intentionally disabled until binary releases
# are ready to ship. Re-enable this job with the package scripts already kept
# in packages/cli/package.json:
#
# package:
# name: package homebrew archive
# runs-on: macos-latest
# needs: test
# steps:
# - uses: actions/checkout@v6
#
# - uses: oven-sh/setup-bun@v2
# with:
# bun-version: 1.3.10
#
# - name: Install dependencies
# run: bun install --frozen-lockfile
#
# - name: Package Homebrew archive
# run: bun run --filter beeper-cli pack:homebrew
17 changes: 15 additions & 2 deletions .github/workflows/publish-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,21 @@ jobs:
bun-version: 1.3.10
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Test
run: bun run test
- name: Check
run: bun run check
- name: Publish npm package
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
set -euo pipefail
version="${GITHUB_REF_NAME#v}"
echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc
if npm view "beeper-cli@${version}" version >/dev/null 2>&1; then
echo "beeper-cli@${version} is already published"
exit 0
fi
npm version "${version}" --workspace beeper-cli --no-git-tag-version --allow-same-version
npm publish --workspace beeper-cli --access public
- name: Publish GitHub release
env:
GH_TOKEN: ${{ github.token }}
Expand Down
19 changes: 0 additions & 19 deletions .github/workflows/release-doctor.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ node_modules/
/beeper-desktop-cli
.upstream/
*.exe

.claude/
179 changes: 179 additions & 0 deletions INTENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# Intent

This CLI should keep its existing feature set while being reorganized and made
consistent with OpenClaw product language and setup expectations.

## Product Direction

- Keep the interactive setup UX: guided steps, prompts, readiness checks, and
clear next actions.
- Align command output, setup/status wording, and user-facing concepts with
OpenClaw where that is the intended product direction.
- For send/message command ergonomics, use `gog` and `wacli` as the closer
references, not OpenClaw's generic `message` command.
- Use real OpenClaw behavior and documented contracts when adding OpenClaw
integration. Do not invent SDK layers or placeholder APIs.

## Engineering Rules

- Reorganize and simplify code without deleting working features unless the
feature is explicitly out of scope.
- Preserve existing command capabilities while changing internal structure or
output shape.
- Prefer direct modules and concrete functions over convenience barrels,
wrapper-only layers, duplicate types, and parallel command paths.
- Fold abstractions when they only rename another abstraction or hide a single
call without adding policy, validation, or ownership.
- Keep one coherent implementation for each concern: parsing, output,
configuration, setup state, auth, and API access.
- Do not keep compatibility-only aliases or contracts once product intent says
the new shape replaces them.

## Guardrails

- Before deleting a command, endpoint, helper, test, schema, or setup path,
confirm it is intentionally removed from the product scope.
- Treat "OpenClaw alignment" as output and architecture alignment first; it is
not permission to replace feature implementations with thin passthroughs.
- If intent is ambiguous, write down the product question before making the
change.

## Not Done Yet

These are known cleanup and alignment tasks that still need product judgment or
implementation. Treat this list as work to finish, not as a decision that every
item must be deleted.

### Package Exports

- Decide whether `packages/cli/package.json` should export anything beyond the
executable and `./package.json`.
- If there is no library API, keep exports minimal and do not add convenience
barrels.
- If a library API is needed, export only stable real source concerns, not
`commands`, generated schema, or internal helper modules by default.
- Remove any export path that exists only for tests, MCP mirroring, or legacy
convenience.

### Command Surface

- Inventory every command in `beeper --help` and mark it as one of:
keep, rename, fold into another command, hide/internalize, or delete.
- Preserve feature capability while doing that inventory. Do not remove working
account, chat, message, send, setup, or status behavior just to simplify the
list.
- Decide whether `api request`, `schema`, `mcp`, `watch`, `export`, and
`media download` are real product commands or unreleased implementation
utilities.
- Decide whether `contacts list` belongs in the main surface or should be
folded into chat/message resolution.
- Decide whether `install desktop`, `install server`, and
`targets runtime *` remain public commands or become setup-owned internals.

### Aliases And Duplicate Entrypoints

- Remove compatibility aliases only after choosing the canonical command.
- Decide whether `use target` and `targets use` should both exist; keep only one
if target selection remains a concept.
- Decide whether `remove target` and `targets remove` should both exist; keep
only one if target removal remains public.
- Decide whether `use account` and `accounts use` should both exist; keep only
one if default-account selection remains public.
- Decide whether `auth email start/response` should remain separate automation
commands or be folded into `setup --email --code`.
- Decide whether `send text/file/voice/sticker/react/presence` should stay as
separate user-facing commands. If changing them, prefer a `gog`/`wacli` style
shape over OpenClaw's generic message surface.

### Send And Message Ergonomics

- Use `wacli` as the closest reference for third-party chat sending:
`send text --to <recipient> --message <text>` and
`send file --to <recipient> --file <path> --caption <text>`.
- Use `gog` as the closest reference for content ergonomics:
`--body`, `--body-file -`, `--body-html`, clear send-vs-draft commands, and
explicit reply flags.
- Prefer explicit recipient and content flags for send commands. Do not rely on
positional magic for destructive or outbound actions.
- Require clear dry-run and confirmation behavior for outbound sends. In
interactive mode, ambiguous recipients or broad sends should ask before
sending.
- Keep search/list commands boring and scriptable: query flag or positional
query, `--limit`/`--max`, account/chat filters, and `--json`.
- Prefer `--json` plus `--no-input` for automation, matching `gog` and `wacli`.
- Decide whether multiline text should use `--message-file -` or a more
`gog`-like `--body-file -`; choose one term and apply it consistently.
- Do not use OpenClaw's generic `message send --channel --target --message`
shape as the primary ergonomic reference for this CLI.

### Global Flags

- Decide canonical behavior for `--json`; keep one structured output path.
- Decide whether `--plain` is useful or just a second output mode to delete.
- Decide whether `--events` is product behavior or debug plumbing.
- Decide whether `--wrap-untrusted` and safety profiles are still part of this
CLI once OpenClaw owns the trust model.
- Decide whether `--target` remains a public global flag or setup/status should
own endpoint selection.
- Ensure `--no-input` consistently means no prompts everywhere, especially
setup and account login.

### Setup And OpenClaw Alignment

- Keep interactive setup as the UX. Reorganize it around clear steps and
readiness states instead of deleting it.
- Rename user-facing setup concepts toward OpenClaw only where the underlying
behavior is real.
- Define how Beeper Desktop/Server setup maps to OpenClaw gateway/channel
setup. This is not done.
- Decide whether OpenClaw onboarding is invoked, embedded through a real SDK,
or used only as a model for output and step structure.
- If invoking OpenClaw, preserve existing Beeper-specific setup capabilities
unless product explicitly says they are replaced.
- Make non-interactive setup output match the same step/readiness model as
interactive setup.

### Output Contracts

- Define one JSON envelope for success, dry-run, readiness, setup actions, and
errors.
- Align names like `target`, `account`, `bridge`, `chat`, and `message` with
the intended OpenClaw vocabulary without breaking the feature semantics.
- Decide whether command output should expose raw Desktop API objects or
normalized CLI objects.
- Remove duplicate output paths such as JSON/plain/events if they represent the
same information.
- Make dry-run output consistent across setup, account add, chat mutation,
message send, export, install, and runtime commands.

### Config And State

- Decide whether the config model is one endpoint, many targets, or OpenClaw
gateway/channel config.
- If many targets remain, make target selection/removal/listing one coherent
system.
- If one endpoint is chosen, fold target registry code and aliases accordingly.
- Decide whether default account belongs in CLI config or should be derived from
OpenClaw/channel state.
- Remove config fields that exist only for unreleased legacy compatibility.

### Internal Modules

- Fold simple wrappers that only rename another module or function.
- Revisit `app-api.ts`, `target-status.ts`, `setup-login.ts`,
`cloudflare-tunnel.ts`, and `export.ts` after command-surface decisions.
- Keep modules split only when they own a real concern: parsing, output, setup,
auth, config/state, API access, install/runtime, or resolution.
- Avoid duplicated types between command handlers and lib modules.
- Import from the real source file; do not create barrels for convenience.

### Tests And Verification

- Update smoke tests after command-surface decisions so they assert the intended
public surface, not old accidental breadth.
- Keep focused tests for setup steps, account login, resolution, output
envelopes, and config migration/reset behavior.
- Remove tests only when the behavior they cover is intentionally removed or
covered better elsewhere.
- Keep `bun run typecheck`, `bun packages/cli/test/cli-smoke.ts`, and
`bun run check` green after each cleanup pass.
Loading