{"id":51033721,"url":"https://github.com/launchapp-dev/animus-plugin-template","last_synced_at":"2026-06-22T03:01:52.298Z","repository":{"id":358547747,"uuid":"1239114293","full_name":"launchapp-dev/animus-plugin-template","owner":"launchapp-dev","description":"Scaffold template for animus plugin new — coming in v0.4.0","archived":false,"fork":false,"pushed_at":"2026-05-17T23:04:37.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-17T23:41:39.513Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://github.com/launchapp-dev/animus-cli","language":"Go Template","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/launchapp-dev.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-14T19:21:14.000Z","updated_at":"2026-05-17T23:04:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/launchapp-dev/animus-plugin-template","commit_stats":null,"previous_names":["launchapp-dev/animus-plugin-template"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/launchapp-dev/animus-plugin-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchapp-dev%2Fanimus-plugin-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchapp-dev%2Fanimus-plugin-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchapp-dev%2Fanimus-plugin-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchapp-dev%2Fanimus-plugin-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/launchapp-dev","download_url":"https://codeload.github.com/launchapp-dev/animus-plugin-template/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchapp-dev%2Fanimus-plugin-template/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34632723,"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-22T02:00:06.391Z","response_time":106,"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":[],"created_at":"2026-06-22T03:01:51.609Z","updated_at":"2026-06-22T03:01:52.290Z","avatar_url":"https://github.com/launchapp-dev.png","language":"Go Template","funding_links":[],"categories":[],"sub_categories":[],"readme":"# animus-plugin-template\n\nScaffold templates for [Animus](https://github.com/launchapp-dev/animus-cli) plugins.\n\n\u003e **Status:** Templates are usable today via manual scaffold or\n\u003e `cargo generate`. A first-party `animus plugin new` scaffold command\n\u003e is planned but **not yet shipped** — the Animus v0.4.0 CLI today\n\u003e exposes `animus plugin install | uninstall | list | info | call | ping`,\n\u003e with no `new` subcommand.\n\n## What this is\n\nA set of scaffold templates for building Animus plugins. Three plugin\nkinds are supported:\n\n- **`subject`** — a backend for a unit-of-work source (Linear, Jira,\n  GitHub Issues, Notion, Asana, Zendesk, ...)\n- **`provider`** — a backend for an LLM provider (OpenAI, Anthropic,\n  Gemini, on-prem inference, ...)\n- **`trigger`** — a backend for event ingest (Slack, generic webhooks,\n  file watchers, cron, ...). Ships a working `FileWatch` example built\n  on `animus-trigger-protocol` v0.1.8.\n\nUntil `animus plugin new` ships, scaffold a new plugin by cloning this\nrepo, copying the kind subdirectory you want, and substituting the\ntemplate variables (see [Using the scaffold](#using-the-scaffold) below\nfor the exact commands).\n\n## Layout\n\n```\nanimus-plugin-template/\n├── template-manifest.toml   # describes kinds + substitution variables\n├── README.md                # this file\n├── LICENSE                  # MIT\n├── .gitignore\n├── _common/                 # shared snippets\n│   ├── LICENSE.tmpl         # MIT boilerplate (interpolated into each kind)\n│   └── README-header.tmpl   # shared README intro\n├── subject/                 # full scaffold for subject backends\n│   ├── Cargo.toml.tmpl\n│   ├── plugin.toml.tmpl\n│   ├── src/\n│   │   ├── lib.rs.tmpl\n│   │   ├── main.rs.tmpl\n│   │   ├── backend.rs.tmpl\n│   │   └── config.rs.tmpl\n│   ├── tests/contract.rs.tmpl\n│   ├── .github/workflows/\n│   │   ├── ci.yml.tmpl\n│   │   └── release.yml.tmpl\n│   ├── README.md.tmpl\n│   ├── LICENSE.tmpl\n│   └── .gitignore\n├── provider/                # full scaffold for provider backends\n│   └── (same layout as subject/)\n└── trigger/                 # full scaffold for trigger backends\n    └── (same layout as subject/)\n```\n\nFiles with a `.tmpl` suffix are processed by the substitution engine.\nFiles without the suffix are copied verbatim. The `.tmpl` suffix is\nstripped from the destination path.\n\n## Substitution variables\n\n| Variable          | Source       | Example for `--kind subject --name jira`   |\n|-------------------|--------------|--------------------------------------------|\n| `{{name}}`        | required     | `jira`                                     |\n| `{{NAME_UPPER}}`  | derived      | `JIRA`                                     |\n| `{{NAME_PASCAL}}` | derived      | `Jira`                                     |\n| `{{name_snake}}`  | derived      | `jira`                                     |\n| `{{kind}}`        | required     | `subject` (or `provider` / `trigger`)      |\n| `{{full_name}}`   | derived      | `animus-subject-jira`                      |\n| `{{description}}` | prompted     | \"An Animus subject backend for Jira\"       |\n| `{{org}}`         | prompted     | `launchapp-dev`                            |\n| `{{author}}`      | git config   | (from `git config user.name`)              |\n| `{{author_email}}`| git config   | (from `git config user.email`)             |\n| `{{year}}`        | derived      | `2026`                                     |\n\nSee [`template-manifest.toml`](./template-manifest.toml) for the\nauthoritative list, including validation patterns and per-variable\ndefaults.\n\n## Using the scaffold\n\n### Manually (works today)\n\nClone the template, copy the kind subdir you want, substitute variables,\nand strip the `.tmpl` suffix:\n\n```bash\n# Clone the template\ngit clone https://github.com/launchapp-dev/animus-plugin-template\ncp -r animus-plugin-template/subject my-plugin\ncd my-plugin\n\n# Replace template variables in every .tmpl file. Pick your own values\n# for {{name}}, {{org}}, etc. — the full variable list is in\n# template-manifest.toml.\nfind . -name '*.tmpl' -type f -print0 | while IFS= read -r -d '' f; do\n  sed -i.bak \\\n    -e 's/{{name}}/jira/g' \\\n    -e 's/{{NAME_UPPER}}/JIRA/g' \\\n    -e 's/{{NAME_PASCAL}}/Jira/g' \\\n    -e 's/{{name_snake}}/jira/g' \\\n    -e 's/{{kind}}/subject/g' \\\n    -e 's/{{full_name}}/animus-subject-jira/g' \\\n    -e 's/{{description}}/An Animus subject backend for Jira/g' \\\n    -e 's|{{org}}|launchapp-dev|g' \\\n    -e 's/{{year}}/2026/g' \\\n    \"$f\" \u0026\u0026 rm \"${f}.bak\"\ndone\n\n# Strip the .tmpl suffix\nfind . -name '*.tmpl' -print0 | xargs -0 -I {} bash -c 'mv \"$1\" \"${1%.tmpl}\"' _ {}\n\ncargo build\nanimus plugin install .\n```\n\n### Via `cargo generate`\n\nYou can also use this template with\n[`cargo generate`](https://github.com/cargo-generate/cargo-generate):\n\n```bash\ncargo generate \\\n  --git https://github.com/launchapp-dev/animus-plugin-template \\\n  --branch main \\\n  subject\n```\n\n`cargo generate` will prompt for `name`, `description`, etc. interactively.\nPre-supply values with `--define name=jira --define description=\"...\"`.\n\n### Via `animus plugin new` (planned, not yet shipped)\n\nA first-party scaffold command is on the roadmap:\n\n```bash\n# Not implemented yet — the Animus v0.4.0 CLI today exposes only\n# `animus plugin install | uninstall | list | info | call | ping`.\nanimus plugin new --kind subject --name jira \\\n  --org launchapp-dev \\\n  --description \"Animus subject backend for Jira issues\"\n```\n\nOnce shipped, it will clone this repository, resolve substitution\nvariables (CLI flags \u003e prompts \u003e git config \u003e defaults), render every\n`.tmpl` file, and drop the result at `./\u003cfull_name\u003e/` ready to commit.\nUntil then, use the manual or `cargo generate` paths above.\n\n## Generated project anatomy\n\nEach rendered project ships with:\n\n- **`Cargo.toml`** — depends on the matching `animus-*-protocol` crate\n  and on `animus-plugin-runtime`, with `tokio`, `serde`, `reqwest`,\n  `tracing`, `anyhow`, `thiserror`, `async-trait`, `chrono`, `mockito`\n  wired up.\n- **`plugin.toml`** — manifest matching `PluginManifest` (name, version,\n  kind, description, capabilities, declared env vars).\n- **`src/main.rs`** — stdio entrypoint that builds the backend and hands\n  off to the shared runtime.\n- **`src/backend.rs`** — trait impl with `todo!()` bodies that describe\n  exactly what to implement.\n- **`src/config.rs`** — env-var-driven `*Config` struct + `from_env()`.\n- **`src/lib.rs`** — library surface so contract tests can reach the\n  backend without going through the binary.\n- **`tests/contract.rs`** — `#[ignore]`d contract tests scaffolded\n  against mockito; un-ignore as each method comes online.\n- **`.github/workflows/ci.yml`** — fmt + clippy + test on every push\n  and PR.\n- **`.github/workflows/release.yml`** — tag-driven multi-platform binary\n  release (Linux x86_64, macOS aarch64, macOS x86_64) with SHA256\n  sidecars that `animus plugin install` verifies.\n- **`README.md`** — install/configure/run/roadmap with `{{name}}`,\n  `{{NAME_UPPER}}`, and `{{full_name}}` already substituted.\n- **`LICENSE`** — MIT, copyright `{{year}} {{author}}`.\n\n## Per-kind reference\n\n### `subject/`\n\nModels a [`SubjectBackend`](https://github.com/launchapp-dev/animus-protocol/blob/main/animus-subject-protocol/src/lib.rs)\nimplementation. Stubs out `list`, `get`, `update`, `watch`, `schema`,\nand `health`. Defaults `supports_watch=false` (polling-only); flip to\n`true` when you implement live subscriptions.\n\nReference: [`animus-subject-linear`](https://github.com/launchapp-dev/animus-subject-linear).\n\n### `provider/`\n\nModels a [`ProviderBackend`](https://github.com/launchapp-dev/animus-protocol/blob/main/animus-provider-protocol/src/lib.rs)\nimplementation. Stubs out `manifest`, `run_agent`, `resume_agent`,\n`cancel_agent`, and `health`. The shared runtime handles JSON-RPC\nframing, the initialize handshake, and aggregating the final result\nenvelope.\n\nReferences: `animus-provider-claude`, `animus-provider-codex`,\n`animus-provider-gemini`, `animus-provider-oai`, `animus-provider-opencode`.\n\n### `trigger/`\n\nModels a [`TriggerBackend`](https://github.com/launchapp-dev/animus-protocol/blob/main/animus-trigger-protocol/src/lib.rs)\nimplementation. Pinned to `animus-protocol` **v0.1.8** — the first tag\nexposing `animus-trigger-protocol`. The shipped example is a\n`FileWatch` backend built on the `notify` crate: it watches a directory\nand emits one debounced `{{name}}_file_changed` event per file change.\nSwap the watcher in `src/backend.rs` for a Slack socket, webhook\nlistener, cron interval, message queue, or any other event source —\nthe trait surface (`schema`, `watch`, `ack`, `health`) does not change.\n\nReference: the trigger scaffold ships with a real `notify`-based\nbackend that runs as-is; downstream forks customize the event source\nrather than starting from `todo!()`.\n\n## Design pointers\n\n- **Protocol design:** [`docs/architecture/subject-backend-plugins.md`](https://github.com/launchapp-dev/animus-cli/blob/main/docs/architecture/subject-backend-plugins.md)\n- **Naming contract:** [`docs/architecture/naming-contract.md`](https://github.com/launchapp-dev/animus-cli/blob/main/docs/architecture/naming-contract.md)\n- **Repository name:** `animus-plugin-template`\n- **Generated repo names:** `animus-\u003ckind\u003e-\u003cname\u003e` (e.g. `animus-subject-jira`)\n- **Generated crate / binary names:** `animus-\u003ckind\u003e-\u003cname\u003e` (matches the repo name)\n\nPer the v0.4.0 naming convention: repo, crate, and binary all share the\nsame `animus-{kind}-{name}` name. There is no longer an `ao-` prefix\nanywhere.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaunchapp-dev%2Fanimus-plugin-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaunchapp-dev%2Fanimus-plugin-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaunchapp-dev%2Fanimus-plugin-template/lists"}