adding-an-issue-tracker

A contributor guide for adding a new issue tracker to Sandcastle’s project setup command. An issue tracker is a tool for recording and managing tasks, such as GitHub Issues, Jira, or GitLab.

In plain words
What is it for?
Use it to assess a tracker, define commands for listing, viewing, and closing tasks, connect the entry to `sandcastle init`, and update the required files.
Why use it?
It explains how to connect a tracker’s command-line tool to generated projects without building the tracker into Sandcastle itself.

Agent

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add agents/mattpocock/sandcastle/adding-an-issue-tracker
Clone the repo
git clone --depth 1 https://github.com/mattpocock/sandcastle
Per session 0 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 1,638 The whole file, excluding the scripts and references it only reads on demand.
Security scan B 1 finding. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00000 $0.01638
Opus 5 $0.00000 $0.00819
Sonnet 5 $0.00000 $0.00328
Haiku 4.5 $0.00000 $0.00164

Measured 3d ago against content hash 1eb6c36ddb81, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade B, and why

adding-an-issue-tracker scanned grade B with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Asks for rootmediumPrivilege escalation

A mod that escalates privileges can change anything on the machine, not only the project.

- `templateArgs.ISSUE_TRACKER_TOOLS` — Dockerfile snippet that installs the CLI. Substituted into the agent provider's Dockerfile at the `{{ISSUE_TRACKER_TOOLS}}` placeholder, which sits before the `USER agent` line, so
docs/agents/adding-an-issue-tracker.md · 110 lines

How it starts

The opening of the file, as written. The whole thing — 110 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Adding an issue tracker

This document is for contributors adding support for a new issue tracker (e.g. GitHub Issues, Beads, Jira, GitLab) to sandcastle init. It covers:

  1. Evaluating a new issue tracker — the questionnaire used to decide whether an issue tracker can be supported.
  2. The IssueTrackerEntry shape — what you fill in.
  3. Scaffold integration — how the entry plugs into sandcastle init.
  4. Implementation checklist — every file to touch.

For terminology (issue tracker, task, template argument, etc.), see CONTEXT.md.

What an issue tracker integration actually is

Sandcastle does not embed any issue tracker itself. An issue-tracker entry is a scaffold template: when a user picks it during sandcastle init, we substitute three CLI commands (LIST_TASKS_COMMAND, VIEW_TASK_COMMAND, CLOSE_TASK_COMMAND) into the generated prompt files, and we drop a Dockerfile snippet that installs the relevant CLI into the sandbox.

The generated project then runs those commands itself — Sandcastle is not in the loop at runtime.

This means the requirements below are about what the CLI can do unattended inside a Debian-based container, not about what the issue tracker can do as a product.

Evaluating a new issue tracker

Before implementing, confirm the issue tracker satisfies the must-haves below. If a must-have is missing, the integration likely cannot be supported until upstream changes.

Must-have CLI capabilities

  • Official / first-party CLI. We will not ship a third-party CLI as the default integration. Reason: the scaffold prints these commands directly into user prompts and installs the CLI into every generated sandbox — recommending an unofficial tool puts users on a maintenance path we don't control.
  • Non-interactive auth via env var. The CLI must authenticate from an environment variable (typically a personal access token) without an interactive login. The token name goes into .env.example.
  • Non-interactive list command. A single command that prints open tasks, ideally filterable by some "ready" signal (label, status, query). This becomes LIST_TASKS_COMMAND.
  • Non-interactive view command. A command that prints a single task by ID, including its description and (ideally) comments. This becomes VIEW_TASK_COMMAND.
  • Non-interactive close command. A command that closes a task by ID, ideally accepting a closing comment. This becomes CLOSE_TASK_COMMAND.
  • Installable inside a Debian container. The install must be reproducible from a Dockerfile RUN line — apt package, official install script, single static binary, etc. No GUI installer, no per-user OAuth dance.
  • Stable exit codes. Non-zero on error so the agent loop can detect failures.

Read the full file on GitHub · 110 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 3d ago First seen · 110 lines · 0 tokens per session scan B 1eb6c36ddb81

Subscribe to this mod's changes

adding-an-issue-tracker is an agent published in the GitHub repository mattpocock/sandcastle (7,792 stars, last pushed 2mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,638 tokens. A static security scan graded it B with 1 finding (asks for root). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.