Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"plugins": [
{
"name": "ditto",
"description": "Connect Claude to Ditto memory through hosted MCP. Recall context, save authorized notes, curate music and hand off chats with verified continuation notes. Sign in through Claude.",
"description": "Connect Claude to Ditto memory through hosted MCP, with 20 skills for life, business and engineering: recall and save context, keep decisions and meetings, review weeks and code, plan trips and meals, and hand off chats. Sign in through Claude.",
"author": {
"name": "Omni Aura LLC"
},
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
{
"name": "ditto",
"source": "./plugins/ditto",
"description": "Ditto memory in Cursor: recall and save authorized context through hosted MCP, curate music, and hand off chats."
"description": "Ditto memory in Cursor through hosted MCP, with 20 skills for engineering, business and life: grill plans, diagnose bugs, write tests, review code, keep decisions, and hand off chats."
}
]
}
42 changes: 0 additions & 42 deletions .github/workflows/gemini-extension.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .grok-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
{
"name": "ditto",
"source": "./plugins/ditto",
"description": "Recall and save Ditto memories through hosted MCP, curate music, and hand off chats with verified continuation notes.",
"description": "Ditto memory through hosted MCP, with 20 skills for life, business and engineering, from decision logs and weekly reviews to code review and trip planning.",
"category": "productivity",
"homepage": "https://heyditto.ai",
"keywords": [
Expand Down
6 changes: 3 additions & 3 deletions .kimi-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ditto",
"version": "0.3.8",
"version": "0.4.0",
"author": {
"name": "Omni Aura LLC",
"email": "support@heyditto.ai",
Expand All @@ -17,7 +17,7 @@
"knowledge-graph",
"mcp"
],
"description": "Search and save Ditto memories through hosted MCP, curate music, and hand off chats with verified continuation notes. Archival and owned workspace cleanup depend on host capabilities and authorization. Sign in through Kimi Code.",
"description": "Ditto memory through hosted MCP, with 20 skills for life, business and engineering: recall and save context, keep decisions, meetings and weekly reviews, debug, test and review code, plan days, trips and meals, curate music, and hand off chats. Archival and owned workspace cleanup depend on host capabilities and authorization. Sign in through Kimi Code.",
"skills": [
"./plugins/ditto/skills"
],
Expand All @@ -29,7 +29,7 @@
},
"interface": {
"displayName": "Ditto",
"shortDescription": "Recall and save your Ditto memories, curate music, and hand off chats.",
"shortDescription": "Ditto memory, with skills for life, business and engineering.",
"developerName": "Omni Aura LLC",
"websiteURL": "https://heyditto.ai"
}
Expand Down
10 changes: 4 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ host. Every root marketplace lists the same plugins, and
`skills/` and `shared-skills.lock.json`. Then:
- set `name` to `<name>` in all eight host manifests (`.claude-plugin`,
`.cursor-plugin`, `.grok-plugin`, `.codex-plugin`, `.github/plugin`,
`.antigravity-plugin`, `.kimi-plugin`, `gemini-extension.json`), and give them
`.antigravity-plugin`, `.kimi-plugin`, `.openai-plugin`), and give them
one shared `version`.
- write host-tailored descriptions, keywords and display names. For example,
"Sign in through Cursor" goes in the Cursor manifest, and Grok keywords must be
Expand All @@ -24,14 +24,12 @@ host. Every root marketplace lists the same plugins, and
- keep the Agent Plugins `$schema` in `.antigravity-plugin/plugin.json` and leave
out its `skills` field; `agy plugin validate --strict` needs both.
- rename the MCP server key to `<name>` in `.mcp.json`, `mcp.json`,
`mcp_config.json` and the inline Copilot, Kimi and Gemini entries.
`mcp_config.json` and the inline Copilot and Kimi entries.
- Kimi Code installs a GitHub URL only from the repository root, and the root
`.kimi-plugin/plugin.json` serves the `ditto` plugin. Other plugins install in
Kimi from a clone of `plugins/<name>`.
- Gemini CLI installs from GitHub only through the `gemini-extension` branch, which
`.github/workflows/gemini-extension.yml` publishes from `plugins/ditto`. Another
plugin needs its own branch (`scripts/publish_extension_ref.py --plugin <name>
--branch <branch>`) or installs from a clone.
- point `repository` in `.openai-plugin/plugin.json` at this repository and give it its own
`extensions["com.openai"]` listing and review cases.
3. **Allow its endpoint.** Add `<name>: <https MCP URL>` to `HOSTED_MCP` in
`scripts/validate_package.py`. Only hosted HTTP servers are allowed: no
commands, headers, env or credentials.
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026 Ditto AI
Copyright (c) 2026 Omni Aura LLC

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
93 changes: 54 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ own OAuth flow: no API keys, npm helpers, CLI bootstrap or lifecycle hooks.

| Plugin | What it does | Skills |
| --- | --- | --- |
| [`ditto`](plugins/ditto/) | Ditto memory over hosted MCP | `ditto-memory`, `handoff`, `curate-music` |
| [`ditto`](plugins/ditto/) | Ditto memory over hosted MCP, with 20 skills for life, business and engineering | see [Shared skills](#shared-skills) |

## Install

Expand All @@ -25,19 +25,19 @@ own OAuth flow: no API keys, npm helpers, CLI bootstrap or lifecycle hooks.
| Cursor | `.cursor-plugin/marketplace.json` | Cursor Marketplace once listed; CLI: `agent plugin marketplace add https://github.com/ditto-assistant/ditto-plugins` (signed in); teams: Dashboard → Plugins & MCPs → Import from Repo |
| Grok Build | `.grok-plugin/marketplace.json` | `grok plugin marketplace add ditto-assistant/ditto-plugins` then `grok plugin install ditto --trust` |
| Codex | `.agents/plugins/marketplace.json` | `codex plugin marketplace add ditto-assistant/ditto-plugins` then `codex plugin add ditto@ditto-plugins` (or install from `/plugins`) |
| ChatGPT | `plugins/ditto/.openai-plugin/plugin.json` (portable manifest with the OpenAI listing) | ChatGPT directory once listed; maintainers build the upload with `python3 scripts/validate_package.py --archive <zip>` |
| GitHub Copilot CLI / VS Code | `.github/plugin/marketplace.json` | `copilot plugin marketplace add ditto-assistant/ditto-plugins` then `copilot plugin install ditto@ditto-plugins` |
| Antigravity | `plugins/ditto/.antigravity-plugin/` | `agy plugin install https://github.com/ditto-assistant/ditto-plugins`, or `/plugin install ./plugins/ditto` from a clone |
| Gemini CLI | `plugins/ditto/gemini-extension.json` (published to the `gemini-extension` branch) | `gemini extensions install https://github.com/ditto-assistant/ditto-plugins --ref gemini-extension`, or `gemini extensions install ./plugins/ditto` from a clone |
| Kimi Code | `.kimi-plugin/plugin.json` (root, points into `plugins/ditto`) | `/plugins install https://github.com/ditto-assistant/ditto-plugins` in Kimi Code, or install `plugins/ditto` from a clone |

### Claude

For **Claude Chat or Cowork**, select **Chat and Cowork** in Claude desktop first.
Open Customize → Plugins → Add → Add marketplace → Add from a repository, select
`ditto-assistant/ditto-plugins`, and Sync. Add Ditto from that marketplace.
Under Yours, verify Ditto is enabled, Skills lists `curate-music`, `ditto-memory`
and `handoff`, and Connectors shows Ditto Connected. In a new Chat, type `/` and
verify all three skills appear under Ditto before sending your request.
Under Yours, verify Ditto is enabled, Skills lists the Ditto skills (`ditto-memory`,
`handoff`, `weekly-review` and the rest), and Connectors shows Ditto Connected. In a
new Chat, type `/` and verify they appear under Ditto before sending your request.

Claude Code has a separate plugin installation. A plugin visible in Code does not
by itself mean it is installed in Chat. For **Claude Code**:
Expand Down Expand Up @@ -65,7 +65,7 @@ Auto Refresh. From the Cursor CLI, sign in to Cursor first and pass the full URL
the `owner/repo` shorthand is rejected. To test locally, copy `plugins/ditto` to
`~/.cursor/plugins/local/ditto` and run **Developer: Reload Window**. Sign in to
Ditto under Customize → MCP servers. Skills load under Agent Decides and can be
invoked with `/ditto-memory`, `/handoff` or `/curate-music`.
invoked by name, for example `/ditto-memory`, `/grill-me` or `/code-review`.

### Grok

Expand All @@ -76,7 +76,7 @@ grok plugin install ditto --trust

Or open `/marketplace` in the Grok TUI. Plugins need trust to attach their MCP
server; check Ditto in `/mcps` and sign in when prompted. Skills appear as
`/ditto:ditto-memory`, `/ditto:handoff` and `/ditto:curate-music`.
`/ditto:<skill>`, for example `/ditto:ditto-memory` or `/ditto:weekly-review`.

### Codex

Expand All @@ -86,7 +86,20 @@ codex plugin add ditto@ditto-plugins
```

Or install Ditto from `/plugins`. Then complete the sign-in prompt. `/mcp` shows the
connection. The ChatGPT directory listing is published separately.
connection.

### ChatGPT

ChatGPT reads a portable [Agent Plugins](https://agent-plugins.org) manifest; ours
is `plugins/ditto/.openai-plugin/plugin.json`, whose `extensions["com.openai"]`
block carries the directory listing and review cases, and `mcp.json` names the
server. It stays out of the plugin root because Grok prefers a root `plugin.json`
over its own manifest; the upload writes it as `ditto/plugin.json`. Build and
byte-verify the directory upload with
`python3 scripts/validate_package.py --archive /path/outside/repo/ditto.zip`; it
holds only the files ChatGPT reads. Submission is a separate, authorized step. See
[docs/openai](docs/openai/) for the listing fields, sidebar contract and local
ChatGPT/Codex testing. (This replaces the retired `ditto-openai-plugins` repository.)

### GitHub Copilot and VS Code

Expand Down Expand Up @@ -119,7 +132,7 @@ Kimi Code installs straight from GitHub. In a Kimi Code session:
/plugins install https://github.com/ditto-assistant/ditto-plugins
```

Choose **Trust and install**, then `/reload`. `/plugins list` shows Ditto with three
Choose **Trust and install**, then `/reload`. `/plugins list` shows Ditto with its
skills and one MCP server, and `/mcp` lists `plugin-ditto:ditto` as needing auth; sign
in with `/mcp-config login plugin-ditto:ditto`. Kimi reads a GitHub URL only from the
repository root, so the root `.kimi-plugin/plugin.json` points its `skills` at
Expand All @@ -128,23 +141,8 @@ rebased, and the validator keeps the two identical. To pin a branch or tag, use
`https://github.com/ditto-assistant/ditto-plugins/tree/<ref>`. From a clone, install
`./plugins/ditto` instead.

### Gemini CLI

```sh
gemini extensions install https://github.com/ditto-assistant/ditto-plugins --ref gemini-extension
```

Gemini CLI installs a GitHub repository only from its root (`gemini-extension.json`
at the top, skills in `skills/`) and has no subdirectory option. A root manifest here
would also make Antigravity install the whole repository as a Gemini extension, so
`.github/workflows/gemini-extension.yml` publishes `plugins/ditto` unchanged as the root
of the `gemini-extension` branch after each change on `main`. Gemini first looks for a
GitHub release with that tag, finds none, and asks whether to "attempt to install via
git clone instead": answer yes. `gemini extensions list` then shows the three skills
and the `ditto` MCP server. Sign in with `/mcp auth ditto` in a Gemini CLI session; `gemini mcp
list` reports the server as Disconnected until then. From a clone, run
`gemini extensions install ./plugins/ditto` or `gemini extensions link ./plugins/ditto`.
`gemini extensions update ditto` follows the branch.
Gemini CLI is not supported: Google retired it for consumers in June 2026 in favor
of Antigravity, which installs this plugin as shown above.

The bundled skills are the verified loading path. The hosted MCP server also
offers the canonical skill files through `skills/list`, `skills/get` and
Expand All @@ -153,15 +151,34 @@ offers the canonical skill files through `skills/list`, `skills/get` and

## Shared skills

- `/handoff`: save continuation context to private Ditto memory and compare full
readback before archiving the current chat or an explicitly selected bulk set.
Assess disk pressure and recoverability of owned workspaces/build artifacts;
cleanup requires exact authorization. See [host limits](docs/handoff.md).
- `/ditto-memory`: recall evidence from saved memories and save or update useful
information within the user's authorized private memory workflow.
- `/curate-music`: curate an ordered selection for the user's chosen music service
using verified Ditto context and an accessible saved library. Creation and
playback require separate music capabilities; Ditto MCP does not provide music APIs.
Every skill uses Ditto memory, and offers Ditto workflows, agents or shared spaces
only with your agreement.

| Area | Skill | What it does |
| --- | --- | --- |
| Memory | `ditto-memory` | Recall evidence from saved memories; save or update within your authorized workflow |
| Memory | `handoff` | Save verified continuation context before archiving a chat ([host limits](docs/handoff.md)) |
| Memory | `tidy-memory` | Find duplicate, stale and contradictory memories on a topic and fix them with approval |
| Memory | `decision-log` | Record decisions with rationale, share them with the team, answer "why did we?" |
| Business | `prep-meeting` | Brief before a meeting from memory; save decisions and action items after |
| Business | `weekly-review` | Wins, misses and next priorities from the week, optionally scheduled |
| Business | `research-brief` | A cited research brief compared with what Ditto already knows |
| Business | `write-spec` | Turn a conversation into a one-page spec and shippable tickets |
| Business | `launch-post` | An accurate launch post or changelog entry from shipped work |
| Engineering | `grill-me` | Interview you about a plan until every open decision is resolved |
| Engineering | `diagnose-bug` | Root-cause a bug with a reproduce-and-test loop and past incidents |
| Engineering | `tdd` | Red-green-refactor, proving every new test can fail |
| Engineering | `code-review` | Correctness-first review using the team's remembered conventions |
| Engineering | `verify-done` | Keep built, merged, deployed and working separate before saying done |
| Life | `daily-brief` | Priorities, commitments and open loops for today |
| Life | `learn-anything` | A tutor that remembers your goal, progress and weak spots |
| Life | `plan-trip` | An itinerary built on your remembered travel preferences |
| Life | `plan-meals` | A week of meals for your household, with a grocery list |
| Life | `gift-ideas` | Thoughtful gifts from what you remember about someone |
| Life | `curate-music` | Playlists for your chosen service from your memory and library |

The hosted MCP server serves the five memory-lifecycle skills (`ditto-memory`,
`handoff`, `tidy-memory`, `decision-log`, `prep-meeting`) to MCP skill importers.

Skills are generated from the private `ditto-assistant/ditto-skills` source. Each
host reads the same `skills/` folder; host-specific connection guidance lives in
Expand All @@ -176,14 +193,13 @@ the host-labelled sections of [`adapters/ditto-memory.md`](adapters/ditto-memory
.agents/plugins/marketplace.json # Codex
.github/plugin/marketplace.json # GitHub Copilot / VS Code
.kimi-plugin/plugin.json # Kimi Code GitHub installs (ditto, skills rebased into plugins/ditto)
.github/workflows/gemini-extension.yml # publishes plugins/ditto as the root of the gemini-extension branch
adapters/ditto-memory.md # per-host connection guidance (source for the generated skill)
plugins/<name>/
.claude-plugin/plugin.json .cursor-plugin/plugin.json .grok-plugin/plugin.json
.codex-plugin/plugin.json .github/plugin/plugin.json .antigravity-plugin/plugin.json
.kimi-plugin/plugin.json gemini-extension.json # Gemini CLI (httpUrl, streamable HTTP)
.kimi-plugin/plugin.json .openai-plugin/plugin.json # ChatGPT (portable manifest + listing)
.mcp.json # Claude, Cursor, Grok (type http)
mcp.json # Codex; Antigravity in Agent Plugins mode (portable, streamable-http)
mcp.json # Codex, ChatGPT; Antigravity in Agent Plugins mode (portable, streamable-http)
mcp_config.json # Antigravity native mode (serverUrl)
assets/ # icon.png, logo.svg
skills/ # generated shared skills
Expand All @@ -201,7 +217,6 @@ python3 scripts/validate_package.py
claude plugin validate ./plugins/ditto
grok plugin validate ./plugins/ditto
agy plugin validate --strict ./plugins/ditto
gemini extensions validate ./plugins/ditto
```

Source, package validation, installed plugin, authenticated MCP and actual tool
Expand Down
8 changes: 4 additions & 4 deletions RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ not distribute or refresh a CLI, run hooks or provision agent accounts.
generator automatically patch-bumps changed skill content; avoid a second bump.
3. Run the offline verifier, `python3 -m unittest discover -s tests -v`,
`python3 scripts/validate_package.py`, `claude plugin validate ./plugins/ditto`, and
`grok plugin validate ./plugins/ditto`, `agy plugin validate --strict ./plugins/ditto` and
`gemini extensions validate ./plugins/ditto` where those CLIs are available. Merging a
change under `plugins/ditto` also republishes the `gemini-extension` branch.
`grok plugin validate ./plugins/ditto` and `agy plugin validate --strict ./plugins/ditto`
where those CLIs are available. For a ChatGPT directory submission, build the upload
with `python3 scripts/validate_package.py --archive /path/outside/repo/ditto.zip`.
4. Open a PR and inspect current-head CI and Ditto Review. Merge only when authorized.
Every host marketplace tracks main, so merging updates the plugin on all hosts.
5. Refresh the marketplace and update Ditto in the actual host. Verify the installed
version, two skills and Ditto MCP connector. Authenticate through the host flow
version, the bundled skills and Ditto MCP connector. Authenticate through the host flow
and verify tools separately before claiming live memory behavior.

Claude Code users can run `/plugin marketplace update ditto-claude-plugins` then
Expand Down
Loading
Loading