Runcastle

Meeting Notes to Issues

MIT0 downloads

by runcastle

v1.0.1

A single Claude Code agent reads raw meeting notes and turns every actionable item into a clean, ready-to-file issue draft — one markdown file per action with title, context, acceptance criteria, and a suggested owner and label — plus an INDEX.md summary table.

Topology

Disclosures

Disclosures — declared side-effect surface

Everything below runs on your machine or inside the sandbox when you use this workflow. Mismatches between these declarations and the actual code block publishing.

Host hooks

Commands executed on YOUR host machine by Sandcastle lifecycle hooks.

None declared.

Sandbox hooks

Commands executed inside the sandbox container.

None declared.

Network access

None. The agent operates only on the local repository inside the sandbox.

Shell expansion

No shell-expansion blocks in prompt files.

Files

Diff vs the stock Sandcastle 0.12.0 template Dockerfile — green lines were added by the author, red lines were removed from stock.

+# Sandbox image for the Meeting Notes to Issues workflow.
+# Node 22, git, and the Claude Code CLI, running as a non-root `agent` user.
FROM node:22-bookworm
# System dependencies.
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
curl \
jq \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Claude Code CLI (the agent runtime).
RUN npm install -g @anthropic-ai/claude-code
# Non-root agent user. `sandcastle docker build-image` aligns AGENT_UID/GID to
# the host user via --build-arg to avoid permission errors on bind mounts.
+# node:22-bookworm already ships a "node" user at UID/GID 1000, so we RENAME it
+# (the stock Sandcastle template pattern) — groupadd/useradd would collide with
+# the existing IDs on a default build.
ARG AGENT_UID=1000
ARG AGENT_GID=1000
-RUN groupadd --gid ${AGENT_GID} agent \
- && useradd --uid ${AGENT_UID} --gid ${AGENT_GID} --create-home --shell /bin/bash agent
+RUN groupmod -o -g ${AGENT_GID} node \
+ && usermod -o -u ${AGENT_UID} -g ${AGENT_GID} -d /home/agent -m -l agent node
-USER agent
-WORKDIR /workspace
+USER ${AGENT_UID}:${AGENT_GID}
+WORKDIR /home/agent
+
+# Sandcastle bind-mounts the worktree and sets the working directory at
+# container start; the container just needs to stay alive until then.
+ENTRYPOINT ["sleep", "infinity"]
Show full Dockerfile (highlighted)
# Sandbox image for the Meeting Notes to Issues workflow.
# Node 22, git, and the Claude Code CLI, running as a non-root `agent` user.
FROM node:22-bookworm

# System dependencies.
RUN apt-get update && apt-get install -y --no-install-recommends \
      git \
      curl \
      jq \
      ca-certificates \
 && rm -rf /var/lib/apt/lists/*

# Claude Code CLI (the agent runtime).
RUN npm install -g @anthropic-ai/claude-code

# Non-root agent user. `sandcastle docker build-image` aligns AGENT_UID/GID to
# the host user via --build-arg to avoid permission errors on bind mounts.
# node:22-bookworm already ships a "node" user at UID/GID 1000, so we RENAME it
# (the stock Sandcastle template pattern) — groupadd/useradd would collide with
# the existing IDs on a default build.
ARG AGENT_UID=1000
ARG AGENT_GID=1000
RUN groupmod -o -g ${AGENT_GID} node \
 && usermod -o -u ${AGENT_UID} -g ${AGENT_GID} -d /home/agent -m -l agent node

USER ${AGENT_UID}:${AGENT_GID}
WORKDIR /home/agent

# Sandcastle bind-mounts the worktree and sets the working directory at
# container start; the container just needs to stay alive until then.
ENTRYPOINT ["sleep", "infinity"]

README

Meeting Notes to Issues

The fastest path from a wall of meeting notes to a tidy stack of file-ready issues. One Claude Code agent, one Docker sandbox, no network, no hooks.

What it does

The agent reads notes/meeting.md — your raw, unstructured notes — and pulls out every genuinely actionable item: tasks, bugs, follow-up decisions, and concrete open questions. For each one it writes a self-contained draft to issues/<nn>-<title>.md with an imperative title, enough context to stand alone, testable acceptance criteria, a suggested owner and labels, and a priority call with a one-line reason. It then rolls everything up into an issues/INDEX.md summary table so you can triage the whole batch at a glance.

Chatter and already-closed decisions are skipped. Unknowns are marked TBD rather than invented, so nothing in the drafts is fabricated.

How it works

main.ts calls run() once with maxIterations: 1 against a Sonnet agent — a single extraction pass, not a loop. Commits land directly on your current branch through the Docker bind mount, so there is no worktree or merge step, and no network access or shell expansion is used.

Requirements

Drop your notes at notes/meeting.md, set CLAUDE_CODE_OAUTH_TOKEN in .sandcastle/.env (run claude setup-token on your host), then build the image once with npx @ai-hero/sandcastle docker build-image and run it with npx tsx .sandcastle/main.ts. Review the drafts in issues/, tweak as needed, and paste them straight into your tracker.