nitm-ai-dev-toolkit 3.0.20 → 3.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/monorepo/.claude/prompt-snippets/bootstrap-patch.md +130 -130
- package/src/monorepo/.claude/prompt-snippets/bootstrap-upgrade.md +61 -56
- package/src/monorepo/.claude/prompt-snippets/bootstrap.md +31 -31
- package/src/monorepo/.opencode/opencode.jsonc +21 -0
- package/src/monorepo/.opencode/plugins/ponytail.mjs +63 -49
- package/src/monorepo/AGENTS.md +35 -35
- package/src/monorepo/CLAUDE.md +1 -1
- package/src/repo/.claude/prompt-snippets/bootstrap-patch.md +133 -133
- package/src/repo/.claude/prompt-snippets/bootstrap-upgrade.md +70 -65
- package/src/repo/.claude/prompt-snippets/bootstrap.md +40 -40
- package/src/repo/.opencode/opencode.jsonc +21 -0
- package/src/repo/.opencode/plugins/ponytail.mjs +63 -49
- package/src/repo/AGENTS.md +35 -35
- package/src/repo/CLAUDE.md +1 -1
- package/src/monorepo/.opencode/opencode.json +0 -9
- package/src/repo/.opencode/opencode.json +0 -9
|
@@ -136,16 +136,16 @@ You are helping to bootstrap AI instructions for this monorepo by analyzing the
|
|
|
136
136
|
- `.claude/rules-snippets/*.md` (rules content — source of truth)
|
|
137
137
|
- `.claude/prompt-snippets/*.md` (prompt content — source of truth)
|
|
138
138
|
- `.claude/agents-snippets/*.md` (agent definitions — source of truth)
|
|
139
|
-
- `.opencode/opencode.
|
|
139
|
+
- `.opencode/opencode.jsonc` (OpenCode configuration — ⚠️ see schema validation below)
|
|
140
140
|
- `.opencode/commands/*.md` (OpenCode commands)
|
|
141
141
|
- `.opencode/rules/*.md` (OpenCode rules)
|
|
142
142
|
- `.opencode/agents/*.md` (OpenCode agents)
|
|
143
143
|
- `.toolkit-version` (version tracking)
|
|
144
144
|
- `CLAUDE.md` (if it contains placeholders)
|
|
145
145
|
|
|
146
|
-
**⚠️ OpenCode `opencode.
|
|
146
|
+
**⚠️ OpenCode `opencode.jsonc` Schema Validation:**
|
|
147
147
|
|
|
148
|
-
When creating or modifying `.opencode/opencode.
|
|
148
|
+
When creating or modifying `.opencode/opencode.jsonc`, **only use supported top-level keys**. The schema is defined at `https://opencode.ai/config.json`. Adding unsupported keys will cause validation errors.
|
|
149
149
|
|
|
150
150
|
**Supported top-level keys:** `$schema`, `instructions`, `skills`, `agent`, `default_agent`, `model`, `small_model`, `provider`, `mcp`, `tools`, `permission`, `lsp`, `formatter`, `server`, `shell`, `command`, `plugin`, `watcher`, `snapshot`, `share`, `autoupdate`, `compaction`, `attachment`, `logLevel`, `disabled_providers`, `enabled_providers`, `tool_output`, `enterprise`, `experimental`
|
|
151
151
|
|
|
@@ -174,17 +174,17 @@ After replacing placeholders, update the `paths:` frontmatter in `.claude/rules/
|
|
|
174
174
|
|
|
175
175
|
**Review each path-scoped rule and adjust paths to match your monorepo layout:**
|
|
176
176
|
|
|
177
|
-
| Rule File
|
|
178
|
-
|
|
|
179
|
-
| `api-server.md`
|
|
180
|
-
| `component-structure.md`
|
|
181
|
-
| `core-libraries.md`
|
|
182
|
-
| `logging.md`
|
|
183
|
-
| `logging-comments.md`
|
|
184
|
-
| `prisma-migrations.md`
|
|
185
|
-
| `server-client-separation.md`
|
|
186
|
-
| `testing-quality.md`
|
|
187
|
-
| `ui-accessibility.md`
|
|
177
|
+
| Rule File | Default Paths | Adjust To Match |
|
|
178
|
+
| ----------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------- |
|
|
179
|
+
| `api-server.md` | `src/server/**`, `apps/**/server/**`, `**/*.server.*` | Your API app directories (e.g., `apps/api/**`) |
|
|
180
|
+
| `component-structure.md` | `src/components/**`, `apps/**/components/**`, `packages/**/components/**`, `**/*.{vue,tsx,jsx}` | Your UI app and design system package paths |
|
|
181
|
+
| `core-libraries.md` | `src/**`, `apps/**`, `packages/**` | Adjust if your workspace dirs differ |
|
|
182
|
+
| `logging.md` | `src/**`, `apps/**`, `packages/**` | Adjust if your workspace dirs differ |
|
|
183
|
+
| `logging-comments.md` | `src/**`, `apps/**`, `packages/**` | Adjust if your workspace dirs differ |
|
|
184
|
+
| `prisma-migrations.md` | `prisma/**`, `**/migrations/**`, `**/*.prisma` | Your ORM/migration directories |
|
|
185
|
+
| `server-client-separation.md` | `src/**`, `apps/**`, `packages/**` | Focus on apps with server+client code |
|
|
186
|
+
| `testing-quality.md` | `**/*.{test,spec}.*`, `tests/**`, `apps/**/tests/**`, `packages/**/tests/**` | Your test directories and naming conventions |
|
|
187
|
+
| `ui-accessibility.md` | `src/components/**`, `apps/**/components/**`, `packages/**/components/**`, `**/*.{vue,tsx,jsx,css,scss}` | Your UI app and component package paths |
|
|
188
188
|
|
|
189
189
|
**Common monorepo adjustments:**
|
|
190
190
|
|
|
@@ -243,24 +243,24 @@ The `tools:` block (Claude Code, GitHub Copilot) and `permission:` block (OpenCo
|
|
|
243
243
|
|
|
244
244
|
**1. Capability baseline per role** — what the agent functionally needs:
|
|
245
245
|
|
|
246
|
-
| Agent
|
|
247
|
-
|
|
248
|
-
| Feature Builder, TDD (coordinators)
|
|
249
|
-
| Backend Architect, Frontend Developer, API Specialist, Admin Portal, Implementer, Red, Green, Refactor | ✓
|
|
250
|
-
| Documenter
|
|
251
|
-
| Planner
|
|
252
|
-
| Reviewer
|
|
253
|
-
| Researcher
|
|
246
|
+
| Agent | read | search | write | edit | terminal/bash | spawn subagents |
|
|
247
|
+
| ------------------------------------------------------------------------------------------------------ | ---- | ------ | ---------------- | ---- | --------------------------- | --------------- |
|
|
248
|
+
| Feature Builder, TDD (coordinators) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
249
|
+
| Backend Architect, Frontend Developer, API Specialist, Admin Portal, Implementer, Red, Green, Refactor | ✓ | ✓ | ✓ | ✓ | ✓ | – |
|
|
250
|
+
| Documenter | ✓ | ✓ | ✓ | ✓ | ✓ (doc generators) | – |
|
|
251
|
+
| Planner | ✓ | ✓ | ✓ (persist plan) | – | ✓ (git log, test discovery) | – |
|
|
252
|
+
| Reviewer | ✓ | ✓ | – | – | ✓ (git diff, tests) | – |
|
|
253
|
+
| Researcher | ✓ | ✓ | – | – | – | – |
|
|
254
254
|
|
|
255
255
|
**2. Translate the baseline to each platform's syntax:**
|
|
256
256
|
|
|
257
|
-
| Capability
|
|
258
|
-
|
|
259
|
-
| read
|
|
260
|
-
| search
|
|
261
|
-
| write / edit files | `Write`, `Edit` | `edit`
|
|
262
|
-
| terminal
|
|
263
|
-
| spawn subagents
|
|
257
|
+
| Capability | Claude Code | GitHub Copilot | OpenCode (`permission:`) | Cursor |
|
|
258
|
+
| ------------------ | --------------- | -------------------------------------- | ------------------------ | ------- |
|
|
259
|
+
| read | `Read` | `read` | default | default |
|
|
260
|
+
| search | `Grep` | `search` | default | default |
|
|
261
|
+
| write / edit files | `Write`, `Edit` | `edit` | `edit: allow` | default |
|
|
262
|
+
| terminal | `Bash(*)` | `runInTerminal`, `terminalLastCommand` | `bash: allow` | default |
|
|
263
|
+
| spawn subagents | `agent` | n/a | `task: allow` | default |
|
|
264
264
|
|
|
265
265
|
> **Cursor note:** these templates declare no `tools:` field, so Cursor subagents inherit the full default toolset. Read-only intent (Researcher, Reviewer) is enforced by the agent's instructions, not tool gating. If your Cursor version supports per-agent tool restriction, add a `tools:` field to match the baseline.
|
|
266
266
|
|
|
@@ -316,7 +316,7 @@ This template bundles issue tracker skills in `.agents/skills/`. Verify the corr
|
|
|
316
316
|
|
|
317
317
|
| Detected Tracker | Required Skills | Expected Files |
|
|
318
318
|
| ---------------- | ------------------------------ | ----------------------------------------------------------------------------- |
|
|
319
|
-
| Jira | `issue-tracker` + `acli`
|
|
319
|
+
| Jira | `issue-tracker` + `acli` | `.agents/skills/issue-tracker/SKILL.md`, `.agents/skills/acli/SKILL.md` |
|
|
320
320
|
| GitHub Issues | `issue-tracker` + `gh-cli` | `.agents/skills/issue-tracker/SKILL.md`, `.agents/skills/gh-cli/SKILL.md` |
|
|
321
321
|
| Linear | `issue-tracker` + `linear-cli` | `.agents/skills/issue-tracker/SKILL.md`, `.agents/skills/linear-cli/SKILL.md` |
|
|
322
322
|
|
|
@@ -445,7 +445,7 @@ Root Files Updated:
|
|
|
445
445
|
- .claude/rules-snippets/*.md (rules content)
|
|
446
446
|
- .claude/prompt-snippets/*.md (prompt content)
|
|
447
447
|
- .claude/agents-snippets/*.md (agent content)
|
|
448
|
-
- .opencode/opencode.
|
|
448
|
+
- .opencode/opencode.jsonc
|
|
449
449
|
- .opencode/commands/*.md
|
|
450
450
|
- .opencode/rules/*.md
|
|
451
451
|
- .opencode/agents/*.md
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://opencode.ai/config.json",
|
|
3
|
+
"instructions": [
|
|
4
|
+
"AGENTS.md",
|
|
5
|
+
".opencode/rules/*.md",
|
|
6
|
+
".agents/skills/orient-to-recent-work/SKILL.md"
|
|
7
|
+
],
|
|
8
|
+
"skills": {
|
|
9
|
+
"paths": [
|
|
10
|
+
".agents/skills/**/*.md",
|
|
11
|
+
".claude/skills/**/*.md"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"plugin": [
|
|
15
|
+
"opencode-mem",
|
|
16
|
+
"@tarquinen/opencode-dcp@latest",
|
|
17
|
+
"@dietrichgebert/ponytail",
|
|
18
|
+
"opentmux"
|
|
19
|
+
],
|
|
20
|
+
"lsp": true
|
|
21
|
+
}
|
|
@@ -4,76 +4,90 @@
|
|
|
4
4
|
// intensity, and persists /ponytail mode switches. Reuses the shared instruction
|
|
5
5
|
// builder so Claude Code, Codex, pi, and OpenCode all read one source of truth.
|
|
6
6
|
//
|
|
7
|
-
// OpenCode loads this as a server plugin — add it to your opencode.
|
|
7
|
+
// OpenCode loads this as a server plugin — add it to your opencode.jsonc:
|
|
8
8
|
// { "plugin": ["./.opencode/plugins/ponytail.mjs"] }
|
|
9
9
|
|
|
10
|
-
import { createRequire } from
|
|
11
|
-
import fs from
|
|
12
|
-
import os from
|
|
13
|
-
import path from
|
|
14
|
-
import { fileURLToPath } from
|
|
10
|
+
import { createRequire } from "module";
|
|
11
|
+
import fs from "fs";
|
|
12
|
+
import os from "os";
|
|
13
|
+
import path from "path";
|
|
14
|
+
import { fileURLToPath } from "url";
|
|
15
15
|
|
|
16
16
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
17
17
|
|
|
18
18
|
// The shared instruction builder is CommonJS; bridge to it from this ES module.
|
|
19
19
|
const require = createRequire(import.meta.url);
|
|
20
|
-
const {
|
|
21
|
-
|
|
20
|
+
const {
|
|
21
|
+
getPonytailInstructions,
|
|
22
|
+
} = require("../../hooks/ponytail-instructions");
|
|
23
|
+
const {
|
|
24
|
+
getDefaultMode,
|
|
25
|
+
normalizePersistedMode,
|
|
26
|
+
} = require("../../hooks/ponytail-config");
|
|
22
27
|
|
|
23
28
|
// OpenCode has no flag-file convention of its own; keep mode beside its config.
|
|
24
29
|
const statePath = path.join(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"),
|
|
31
|
+
"opencode",
|
|
32
|
+
".ponytail-active",
|
|
28
33
|
);
|
|
29
34
|
|
|
30
35
|
function readMode() {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
try {
|
|
37
|
+
return (
|
|
38
|
+
normalizePersistedMode(fs.readFileSync(statePath, "utf8").trim()) ||
|
|
39
|
+
getDefaultMode()
|
|
40
|
+
);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
return getDefaultMode();
|
|
43
|
+
}
|
|
36
44
|
}
|
|
37
45
|
|
|
38
46
|
function writeMode(mode) {
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
fs.mkdirSync(path.dirname(statePath), { recursive: true });
|
|
48
|
+
fs.writeFileSync(statePath, mode);
|
|
41
49
|
}
|
|
42
50
|
|
|
43
51
|
export default async ({ client } = {}) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
const log = (level, message) => {
|
|
53
|
+
try {
|
|
54
|
+
client &&
|
|
55
|
+
client.app &&
|
|
56
|
+
client.app.log({ body: { service: "ponytail", level, message } });
|
|
57
|
+
} catch (e) {}
|
|
58
|
+
};
|
|
47
59
|
|
|
48
|
-
|
|
60
|
+
const ponytailSkillsDir = path.resolve(__dirname, "../../.agents/skills");
|
|
49
61
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
62
|
+
return {
|
|
63
|
+
// Register skills directory so opencode discovers ponytail skills.
|
|
64
|
+
config: async (config) => {
|
|
65
|
+
config.skills = config.skills || {};
|
|
66
|
+
config.skills.paths = config.skills.paths || [];
|
|
67
|
+
if (!config.skills.paths.includes(ponytailSkillsDir)) {
|
|
68
|
+
config.skills.paths.push(ponytailSkillsDir);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
59
71
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
72
|
+
// Append the ruleset to the system prompt every turn.
|
|
73
|
+
"experimental.chat.system.transform": async (_input, output) => {
|
|
74
|
+
const mode = readMode();
|
|
75
|
+
if (mode === "off") return;
|
|
76
|
+
output.system.push(getPonytailInstructions(mode));
|
|
77
|
+
},
|
|
66
78
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
// Persist `/ponytail <level>` so the next turn's injection follows it.
|
|
80
|
+
// ponytail: mode applies from the next message, not the current one — the
|
|
81
|
+
// transform reads the flag the command writes. Good enough; switch to a
|
|
82
|
+
// synchronous store if same-turn switching ever matters.
|
|
83
|
+
"command.execute.before": async (input) => {
|
|
84
|
+
if (!input || input.command !== "ponytail") return;
|
|
85
|
+
// `off` is persisted like any mode; the transform reads it and stays silent.
|
|
86
|
+
const mode =
|
|
87
|
+
normalizePersistedMode((input.arguments || "").trim()) ||
|
|
88
|
+
getDefaultMode();
|
|
89
|
+
writeMode(mode);
|
|
90
|
+
log("info", "ponytail " + mode);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
79
93
|
};
|
package/src/monorepo/AGENTS.md
CHANGED
|
@@ -122,40 +122,40 @@ Detailed standards are split into focused instruction files in `.github/instruct
|
|
|
122
122
|
|
|
123
123
|
For detailed standards on specific topics, refer to these skills in `.agents/skills/`:
|
|
124
124
|
|
|
125
|
-
| Skill
|
|
126
|
-
|
|
|
127
|
-
| **Atlassian CLI**
|
|
128
|
-
| **Bitbucket CLI**
|
|
129
|
-
| **Brainstorming**
|
|
130
|
-
| **Code Simplifier**
|
|
131
|
-
| **Code Review**
|
|
132
|
-
| **Debugger**
|
|
133
|
-
| **Debugging**
|
|
134
|
-
| **Documentation**
|
|
135
|
-
| **Executing Plans**
|
|
136
|
-
| **Finishing Branches**
|
|
137
|
-
| **GitHub CLI**
|
|
138
|
-
| **GitLab CLI**
|
|
139
|
-
| **Git Worktrees**
|
|
140
|
-
| **Issue Tracker**
|
|
141
|
-
| **Linear CLI**
|
|
142
|
-
| **Logging**
|
|
143
|
-
| **Orient to Recent Work**
|
|
144
|
-
| **Parallel Agents**
|
|
145
|
-
| **Ponytail**
|
|
146
|
-
| **Ponytail Audit**
|
|
147
|
-
| **Ponytail Debt**
|
|
148
|
-
| **Ponytail Gain**
|
|
149
|
-
| **Ponytail Help**
|
|
150
|
-
| **Ponytail Review**
|
|
151
|
-
| **Receiving Reviews**
|
|
152
|
-
| **Security Review**
|
|
153
|
-
| **Subagent Development**
|
|
154
|
-
| **Superpowers**
|
|
155
|
-
| **TDD**
|
|
156
|
-
| **Verification**
|
|
157
|
-
| **Writing Plans**
|
|
158
|
-
| **Writing Skills**
|
|
125
|
+
| Skill | File | Purpose |
|
|
126
|
+
| ------------------------- | ----------------------------------------- | ---------------------------------------------------- |
|
|
127
|
+
| **Atlassian CLI** | `acli/SKILL.md` | Atlassian CLI (ACLI) command reference |
|
|
128
|
+
| **Bitbucket CLI** | `bkt-cli/SKILL.md` | Bitbucket PRs, issues, repos CLI reference |
|
|
129
|
+
| **Brainstorming** | `brainstorming/SKILL.md` | Structured ideation sessions |
|
|
130
|
+
| **Code Simplifier** | `code-simplifier/SKILL.md` | Simplifies code for clarity without behavior changes |
|
|
131
|
+
| **Code Review** | `requesting-code-review/SKILL.md` | Review process and checklists |
|
|
132
|
+
| **Debugger** | `debugger/SKILL.md` | Structured debugging dispatch with root cause focus |
|
|
133
|
+
| **Debugging** | `systematic-debugging/SKILL.md` | Debugging workflows |
|
|
134
|
+
| **Documentation** | `project-documentation/SKILL.md` | README, comments, ADRs, changelogs |
|
|
135
|
+
| **Executing Plans** | `executing-plans/SKILL.md` | Following through on implementation plans |
|
|
136
|
+
| **Finishing Branches** | `finishing-a-development-branch/SKILL.md` | Completing and merging branches |
|
|
137
|
+
| **GitHub CLI** | `gh-cli/SKILL.md` | GitHub Issues CLI command reference |
|
|
138
|
+
| **GitLab CLI** | `glab-cli/SKILL.md` | GitLab MRs, issues, pipelines CLI reference |
|
|
139
|
+
| **Git Worktrees** | `using-git-worktrees/SKILL.md` | Parallel development branches |
|
|
140
|
+
| **Issue Tracker** | `issue-tracker/SKILL.md` | MCP tools, CLI fallback, epic discovery |
|
|
141
|
+
| **Linear CLI** | `linear-cli/SKILL.md` | Linear CLI command reference |
|
|
142
|
+
| **Logging** | `logging/SKILL.md` | Structured logging standards, log levels |
|
|
143
|
+
| **Orient to Recent Work** | `orient-to-recent-work/SKILL.md` | Build context from recent project activity |
|
|
144
|
+
| **Parallel Agents** | `dispatching-parallel-agents/SKILL.md` | Coordinating multiple AI agents |
|
|
145
|
+
| **Ponytail** | `ponytail/SKILL.md` | YAGNI/stdlib/native/minimum-discipline coding mode |
|
|
146
|
+
| **Ponytail Audit** | `ponytail-audit/SKILL.md` | Whole-repo audit for over-engineering |
|
|
147
|
+
| **Ponytail Debt** | `ponytail-debt/SKILL.md` | Track ponytail shortcuts and deferrals |
|
|
148
|
+
| **Ponytail Gain** | `ponytail-gain/SKILL.md` | Show ponytail's measured impact |
|
|
149
|
+
| **Ponytail Help** | `ponytail-help/SKILL.md` | Quick-reference for ponytail modes and commands |
|
|
150
|
+
| **Ponytail Review** | `ponytail-review/SKILL.md` | Code review focused on over-engineering |
|
|
151
|
+
| **Receiving Reviews** | `receiving-code-review/SKILL.md` | Respond constructively to review feedback |
|
|
152
|
+
| **Security Review** | `security-reviewer/SKILL.md` | Security-focused code review |
|
|
153
|
+
| **Subagent Development** | `subagent-driven-development/SKILL.md` | Breaking tasks into subagent chunks |
|
|
154
|
+
| **Superpowers** | `using-superpowers/SKILL.md` | Leveraging the full skill system |
|
|
155
|
+
| **TDD** | `test-driven-development/SKILL.md` | Test-driven development |
|
|
156
|
+
| **Verification** | `verification-before-completion/SKILL.md` | Quality checks before claiming work done |
|
|
157
|
+
| **Writing Plans** | `writing-plans/SKILL.md` | Creating implementation plans |
|
|
158
|
+
| **Writing Skills** | `writing-skills/SKILL.md` | Creating effective SKILL.md files |
|
|
159
159
|
|
|
160
160
|
## ⚠️ CRITICAL: Orchestration Checkpoint (READ FIRST)
|
|
161
161
|
|
|
@@ -364,4 +364,4 @@ Documentation updates are **mandatory before committing** any feature or fix. Se
|
|
|
364
364
|
- [.opencode/rules/](.opencode/rules/) - OpenCode rules (thin wrappers → rules-snippets)
|
|
365
365
|
- [.opencode/commands/](.opencode/commands/) - OpenCode commands (thin wrappers → prompt-snippets)
|
|
366
366
|
- [.opencode/agents/](.opencode/agents/) - OpenCode agents (thin wrappers → agents-snippets)
|
|
367
|
-
- [.opencode/opencode.
|
|
367
|
+
- [.opencode/opencode.jsonc](.opencode/opencode.jsonc) - OpenCode configuration
|
package/src/monorepo/CLAUDE.md
CHANGED