feat: initial commit

This commit is contained in:
Tom Kendrick
2026-04-21 20:44:08 +01:00
commit 5027f58be2
6 changed files with 240 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
node_modules/
package-lock.json
.env
bun.lock
package.json

109
AGENTS.md Normal file
View File

@@ -0,0 +1,109 @@
# Agent Rules
## Deployments and Destructive Changes
**NEVER run any command that mutates production infrastructure without the user explicitly saying to deploy.**
If a deploy or mutating action seems like the logical next step, **stop and ask the user** whether they want to proceed. Do not infer consent from context. Do not deploy just because the plan says "next step is deploy". Wait for an explicit instruction like "go ahead and deploy" or "run the deploy now".
Violating this rule is not a minor mistake. It is unacceptable.
### Deployment workflow
We generally deploy services exclusively via CDK in CD. To trigger builds on the test servers, they are triggered by force pushing the current feature branch onto the branches `t1` or `t2`. There are git aliases `git t1` and `git t2` that can be used to do this. Always seek confirmation before using these commands however.
## AWS Access
The `aws` CLI is blocked at the system level. Do not attempt to use it.
For AWS inspection tasks, use the appropriate AWS MCP server. The following servers may be available — ask the user to enable the relevant one if it is not already active:
- `aws-cloudwatch` — CloudWatch logs and metrics
- `aws-ecs` — ECS cluster and service inspection
- `aws-cloudformation` — CloudFormation stacks
- `aws-iac` — Infrastructure-as-code tooling
- `aws-cost-explorer` — Cost and billing
The one exception is `cdk diff`, which runs locally and is permitted:
```
AWS_PROFILE=ro npx cdk diff ...
```
If a task requires write access to AWS, stop and ask the user to run the command themselves.
## Git Worktree Setup
Projects are set up using a `git bare-clone` alias that creates a bare-clone worktree layout:
```
project-name/ ← project root (cd here)
.bare/ ← bare git repo (the actual git data)
.git ← file containing "gitdir: ./.bare"
main/ ← example worktree for main branch
feature-branch/ ← example worktree for a feature
```
**The alias does this:**
```bash
mkdir "$folder_name" && cd "$folder_name"
git clone --bare "$repo_url" .bare
echo "gitdir: ./.bare" > .git
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
```
### Worktree placement rules
- **Always place worktrees as direct children of the project root**, e.g. `~/projects/myrepo/my-feature/`
- **Never use a nested `.worktrees/` subdirectory** — worktrees sit at the top level alongside other branch worktrees
- The project root itself is not a worktree; it's the container. You must `cd` into a branch worktree to do any work
- To add a new worktree: `git worktree add my-feature -b my-feature` (from the project root), or `git worktree add ../my-feature -b my-feature` (from within an existing worktree)
- No `.gitignore` entry is needed for worktree directories since the repo is bare and the project root is not itself a working tree
## Git Commits
Commit early and often. After completing any logical unit of work — a bug fix, a feature addition, a refactor, a config change — create a commit immediately rather than batching everything at the end.
All commits must follow the [Conventional Commits](https://www.conventionalcommits.org/) specification:
```
<type>[optional scope]: <description>
[optional body]
```
Common types:
- `feat` — a new feature
- `fix` — a bug fix
- `refactor` — code change that neither fixes a bug nor adds a feature
- `chore` — maintenance, dependency updates, config changes
- `docs` — documentation only changes
- `test` — adding or updating tests
- `style` — formatting, missing semicolons, etc. (no logic change)
Examples:
```
feat(auth): add JWT refresh token support
fix(api): handle null response from payments endpoint
chore: update dependencies to latest versions
```
Rules:
- Use lowercase for the type and description
- Keep the description concise (under 72 characters)
- Do not end the description with a period
- Commit after each discrete, coherent change — do not wait until the end of a task
<!-- context7 -->
Use Context7 MCP to fetch current documentation whenever the user asks about a library, framework, SDK, API, CLI tool, or cloud service -- even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. This includes API syntax, configuration, version migration, library-specific debugging, setup instructions, and CLI tool usage. Use even when you think you know the answer -- your training data may not reflect recent changes. Prefer this over web search for library docs.
Do not use for: refactoring, writing scripts from scratch, debugging business logic, code review, or general programming concepts.
## Steps
1. Always start with `resolve-library-id` using the library name and the user's question, unless the user provides an exact library ID in `/org/project` format
2. Pick the best match (ID format: `/org/project`) by: exact name match, description relevance, code snippet count, source reputation (High/Medium preferred), and benchmark score (higher is better). If results don't look right, try alternate names or queries (e.g., "next.js" not "nextjs", or rephrase the question). Use version-specific IDs when the user mentions a version
3. `query-docs` with the selected library ID and the user's full question (not single words)
4. Answer using the fetched docs
<!-- context7 -->

View File

@@ -0,0 +1,6 @@
---
description: Open interactive annotation UI for a markdown file
---
The Plannotator Annotate UI has been triggered. Opening the annotation UI...
Acknowledge "Opening annotation UI..." and wait for the user's feedback.

View File

@@ -0,0 +1,6 @@
---
description: Open interactive code review for current changes or a PR URL
---
The Plannotator Code Review has been triggered. Opening the review UI...
Acknowledge "Opening code review..." and wait for the user's feedback.

108
opencode.json Normal file
View File

@@ -0,0 +1,108 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["@plannotator/opencode@latest"],
"mcp": {
"github": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-github"],
"environment": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
},
"enabled": true
},
"shortcut": {
"type": "local",
"command": ["npx", "-y", "@shortcut/mcp@latest"],
"environment": {
"SHORTCUT_API_TOKEN": "${SHORTCUT_API_TOKEN}"
},
"enabled": false
},
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp",
"headers": {
"X-Context7-API-Key": "${CONTEXT7_API_KEY}"
},
"enabled": true
},
"notion": {
"type": "remote",
"url": "https://mcp.notion.com/mcp",
"enabled": false,
"oauth": {}
},
"excalidraw": {
"type": "remote",
"url": "https://excalidraw-mcp-app.vercel.app/mcp",
"enabled": false
},
"grafana-t1": {
"type": "local",
"command": ["uvx", "mcp-grafana"],
"environment": {
"GRAFANA_URL": "https://observability-t1.services.appointedd.com",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "${GRAFANA_T1_TOKEN}"
},
"enabled": false
},
"grafana-t2": {
"type": "local",
"command": ["uvx", "mcp-grafana"],
"environment": {
"GRAFANA_URL": "https://observability-t2.services.appointedd.com",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "${GRAFANA_T2_TOKEN}"
},
"enabled": false
},
"grafana-production": {
"type": "local",
"command": ["uvx", "mcp-grafana"],
"environment": {
"GRAFANA_URL": "https://observability.services.appointedd.com",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "${GRAFANA_PROD_TOKEN}"
},
"enabled": false
},
"aws-cloudwatch": {
"type": "local",
"command": ["uvx", "awslabs.cloudwatch-mcp-server@latest"],
"environment": {
"AWS_PROFILE": "ro",
"AWS_REGION": "eu-west-1",
"FASTMCP_LOG_LEVEL": "ERROR"
},
"enabled": false
},
"aws-cloudformation": {
"type": "local",
"command": ["uvx", "awslabs.cfn-mcp-server@latest"],
"environment": {
"AWS_PROFILE": "ro",
"AWS_REGION": "eu-west-1",
"FASTMCP_LOG_LEVEL": "ERROR"
},
"enabled": false
},
"aws-iac": {
"type": "local",
"command": ["uvx", "awslabs.aws-iac-mcp-server@latest"],
"environment": {
"AWS_PROFILE": "ro",
"AWS_REGION": "eu-west-1",
"FASTMCP_LOG_LEVEL": "ERROR"
},
"enabled": false
},
"nextjs": {
"type": "local",
"command": ["npx", "-y", "next-devtools-mcp@latest"],
"enabled": false
},
"say": {
"type": "local",
"command": ["npx", "say-mcp-server"],
"enabled": false
}
}
}

6
skills/ui/SKILL.md Normal file
View File

@@ -0,0 +1,6 @@
---
name: ui
description: 'Explore, build, and refine UI.'
---
This skill is managed remotely. Use `mcp_uidotsh_uidotsh_fetch` to fetch `uidotsh://ui` from the MCP server, treat the fetched content as this skill's `SKILL.md` instructions, and follow any additional `uidotsh://...` references it points to.