{"id":50607659,"url":"https://github.com/ditto-assistant/ditto-clawhub","last_synced_at":"2026-06-06T00:30:49.591Z","repository":{"id":360349901,"uuid":"1232489454","full_name":"ditto-assistant/ditto-clawhub","owner":"ditto-assistant","description":"Ditto skill for ClawHub / OpenClaw","archived":false,"fork":false,"pushed_at":"2026-05-26T02:47:33.000Z","size":59,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T04:28:36.967Z","etag":null,"topics":["agent-memory","ditto","heyditto","memory","openclaw"],"latest_commit_sha":null,"homepage":"https://heyditto.ai/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ditto-assistant.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T01:35:18.000Z","updated_at":"2026-05-26T02:47:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ditto-assistant/ditto-clawhub","commit_stats":null,"previous_names":["ditto-assistant/ditto-clawhub"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ditto-assistant/ditto-clawhub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ditto-assistant%2Fditto-clawhub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ditto-assistant%2Fditto-clawhub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ditto-assistant%2Fditto-clawhub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ditto-assistant%2Fditto-clawhub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ditto-assistant","download_url":"https://codeload.github.com/ditto-assistant/ditto-clawhub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ditto-assistant%2Fditto-clawhub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33965591,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-memory","ditto","heyditto","memory","openclaw"],"created_at":"2026-06-06T00:30:47.384Z","updated_at":"2026-06-06T00:30:49.583Z","avatar_url":"https://github.com/ditto-assistant.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ditto-clawhub\n\nThe Ditto skill for [ClawHub](https://clawhub.ai) / [OpenClaw](https://github.com/openclaw/openclaw) — the text-only bundle that lands in `~/openclaw/skills/ditto/` after `clawhub install ditto`.\n\n\u003e **Sibling repos:** the actual `ditto` CLI binary lives in [**`ditto-cli`**](https://github.com/ditto-assistant/ditto-cli) (published as [**`@heyditto/cli`**](https://www.npmjs.com/package/@heyditto/cli) on npm). This repo is just the skill bundle that teaches the OpenClaw agent how and when to invoke it.\n\n## What gets uploaded to ClawHub\n\nThe `publish/` folder. Three text files, ~250 lines total:\n\n```\npublish/\n├── SKILL.md       # frontmatter (install spec for @heyditto/cli) + agent decision guide\n├── SETUP.md       # human-facing 2-step setup\n└── examples.md    # worked agent patterns (search→fetch, save, traverse, first-run-no-key)\n```\n\nClawHub strips non-text files at publish (50MB cap), so binaries can't ship in the skill folder. The canonical openclaw pattern (matching steipete's first-party `mcporter`, `clawhub`, `peekaboo` skills) is to declare an `install` spec that gives users a one-click install button — for us, that runs `npm install -g @heyditto/cli`.\n\n## Architecture\n\n```\nOpenClaw user                                                    OpenClaw agent\n  │                                                                  │\n  ├─ clawhub install ditto                                           │\n  │     extracts publish/ into ~/openclaw/skills/ditto               │\n  │                                                                  │\n  ├─ Skills UI shows \"Install Ditto CLI (npm)\" button ─┐             │\n  │     one click → npm install -g @heyditto/cli       │             │\n  │                                                    ▼             │\n  │                                    ┌──────────────────┐          │\n  │                                    │  heyditto binary │ ◀────────┤ heyditto save / search /\n  ├─ \"what did I say about X?\"         │   on user's PATH │          │ fetch / subjects /\n  │                                    └────────┬─────────┘          │ memories / network\n  │     agent runs `heyditto status`            │                     │\n  │     sees `source: none`                   │                     │\n  │     self-provisions an agent account      │                     │\n  │                                             │                    │\n  ├─ agent runs `heyditto init --agent --agent-caller openclaw --json` │\n  │     creates a free claimable account and stores the API key      │\n  │                                                                  │\n  ├─ output includes a claimURL for later human ownership             │\n  │                                             │                    │\n  │     optional fallback: `heyditto login \u003ckey\u003e` ─▶│                    │\n  │     key persisted to ~/.config/heyditto/cli/config.json (0600)   │\n  │                                             │                    │\n  └─ retries the original ask                  ▼                     │\n                                       Authorization: Bearer …       │\n                                       https://api.heyditto.ai/mcp ──┘\n```\n\nAuth is API key. Agents can self-provision with `heyditto init --agent --agent-caller openclaw --json`; they share the short `claimURL` with users and keep the `ditto_mcp_...` key local. The claim token lives in the link's `?t=...` query parameter. `DITTO_API_KEY` env wins as override; otherwise the file. No `.zshrc` editing required.\n\nThe browser-OAuth flow lives separately in [`ditto-mcp`](https://github.com/ditto-assistant/ditto-mcp) (`@heyditto/mcp` on npm) for Claude Desktop / Cursor.\n\n## Status\n\n- [x] `@heyditto/cli` published on npm (1.2.x current skill target, [trusted publisher](https://docs.npmjs.com/trusted-publishers) via [`ditto-cli`](https://github.com/ditto-assistant/ditto-cli) GH Actions)\n- [x] `publish/` bundle finalized — install spec points at `@heyditto/cli`, body teaches the `heyditto init --agent --json` flow on first-run-no-key\n- [x] Cross-platform standalone binaries verified (`scripts/build-cli.sh`; forward-looking, not used by the skill)\n- [ ] `ditto` slug claimed on ClawHub by `@ditto` org (drag `publish/` into clawhub.ai/publish)\n- [ ] `https://app.heyditto.ai/connect/openclaw` live\n\n## Layout\n\n| Path | Purpose |\n|---|---|\n| `publish/SKILL.md` | ClawHub entrypoint. Frontmatter declares `install: { kind: node, package: \"@heyditto/cli\", bins: [heyditto] }` for the one-click button; body teaches the agent decision flow. |\n| `publish/SETUP.md` | 2-step setup (`npm i -g @heyditto/cli` + `heyditto init --agent --json`). |\n| `publish/examples.md` | Agent patterns: recall, opinion-search, save, network-traversal, first-run-no-key. |\n| `config/mcporter.json` | Local mcporter config used only by `scripts/build-cli.sh`. Not part of the skill. |\n| `scripts/build-cli.sh` | Optional: cross-compiles a standalone `ditto` binary for 5 platforms into `dist/`. Useful for direct distribution; **not** what users get via ClawHub. |\n| `scripts/publish.sh` | `clawhub skill publish ./publish` wrapper for CLI-driven publishing. |\n| `Justfile` | `just build`, `just dev`, `just publish \u003cver\u003e`. |\n| `dist/` (gitignored) | Output of `just build` — `ditto-{darwin,linux}-{arm64,x64}`, `ditto-windows-x64.exe`. |\n\n## Publish\n\n### Path A — drag into the form (current)\n\nAt https://clawhub.ai/publish, drag `publish/` into the dropzone with:\n\n- **Slug** `ditto`\n- **Display name** `Ditto`\n- **Owner** `@ditto` org\n- **Version** `1.0.0`\n- **Tags** `latest`\n\nThe form preserves folder paths and flattens the outer wrapper automatically.\n\n### Path B — `clawhub` CLI\n\nOnce `clawhub login` works for the `@ditto` org publisher:\n\n```bash\nclawhub login\njust publish 1.0.0 \"Initial release\"\n# wraps:  clawhub skill publish ./publish --slug ditto --name Ditto --owner ditto …\n```\n\nClawHub publishes skill content as **MIT-0**. The source repo here is **MIT** to match other `ditto-assistant/*` repos.\n\n## Build the standalone binary (optional)\n\nMost OpenClaw users won't need this — they get `heyditto` via `npm install -g @heyditto/cli`. The standalone binaries are for users who don't want Node, or for direct GitHub Releases.\n\n```bash\nexport DITTO_API_KEY=ditto_mcp_…   # mcporter connects at build time to embed schemas\njust build                          # → dist/ditto-\u003cplatform\u003e (5 binaries, ~60-110MB each)\n```\n\nFirst build per target downloads ~30MB of platform-specific Bun runtime; cached after.\n\n## Related\n\n- [`ditto-cli`](https://github.com/ditto-assistant/ditto-cli) — the source of `@heyditto/cli`. Where `heyditto login`, `heyditto save`, etc. are implemented.\n- [`ditto-mcp`](https://github.com/ditto-assistant/ditto-mcp) — sibling stdio MCP bridge (`@heyditto/mcp`) with browser-OAuth, for Claude Desktop / Cursor.\n- [openclaw/openclaw](https://github.com/openclaw/openclaw) — the assistant\n- [openclaw/clawhub](https://github.com/openclaw/clawhub) — skill registry CLI + docs\n- [openclaw/openclaw/skills/mcporter/SKILL.md](https://github.com/openclaw/openclaw/blob/main/skills/mcporter/SKILL.md) — canonical skill template we modeled after\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fditto-assistant%2Fditto-clawhub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fditto-assistant%2Fditto-clawhub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fditto-assistant%2Fditto-clawhub/lists"}