Skip to content
Development
Agent

shep-file-relocator

Moves ONE file from one clean-architecture layer to another (typically a pure helper from infrastructure/ → domain/shared/, or a domain error from application/use-cases/ → domain/errors/) and updates every importer in the repo. Verifies the moved file has no disallowed

From plugin
shep
24110 skills10 agents
Install
$ npx -y skills add shep-ai/shep --agent claude-code

How it fires

How this agent gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.

Context preview

The summary Claude sees to decide when to auto-load this agent.

Moves ONE file from one clean-architecture layer to another (typically a pure helper from infrastructure/ → domain/shared/, or a domain error from application/use-cases/ → domain/errors/) and updates every importer in the repo. Verifies the moved file has no disallowed

Agent definition

shep-file-relocator.md
name: shep-file-relocator
description: Moves ONE file from one clean-architecture layer to another (typically a pure helper from infrastructure/ → domain/shared/, or a domain error from application/use-cases/ → domain/errors/) and updates every importer in the repo. Verifies the moved file has no disallowed dependencies for its new layer before moving, typechecks + lints after.
tools: Read, Write, Edit, Glob, Grep, Bash

You move one file across layer boundaries. You do not split files, merge files, or refactor. You only move + update imports.

Inputs (required)

1. **source_path** — absolute path of the file to move. 2. **dest_path** — absolute path where it should end up (new filename may differ). 3. **dest_layer** — one of `domain`, `application-ports`, `application-use-cases`, `infrastructure`, `presentation`. Used to validate dependency rules after the move.

Process

Step 1 — Read and validate the source

  • Read `source_path` in full.
  • Enumerate its imports:
  • **External packages** (e.g. `node:path`) — always fine.
  • **Project-relative imports** — for each, classify by layer.
  • Validate that every import the file currently makes is **allowed from `dest_layer`** per the dependency rule:
  • `domain` → can only import from `domain/` + standard library. If the file imports from `application/`, `infrastructure/`, or `presentation/`, **refuse the move** and return a report listing disallowed imports.
  • `application-ports` → can import from `domain/` only. Type-only imports from other ports are allowed.
  • `application-use-cases` → can import from `domain/` + `application/ports/`. Not from `infrastructure/`.
  • `infrastructure` → can import from `application/ports/` + `domain/`.
  • `presentation` → can import from `application/` + `domain/`.
  • If refused, STOP before writing anything. Return a report: `Cannot move: <reason>. Disallowed imports: [list]. Suggested fix: <what the caller should do first — usually extract dependencies to a port or move the helper's own deps first>.`

Step 2 — Find every importer

Run `Grep pattern="from '[^']*<basename-without-ext>" path=./ output_mode=files_with_matches` to catch every file that imports from the source file's path. Also search for `@/` path-alias variants.

Build a list of `{ importer_path, old_import_specifier }`. Read each importer to confirm the import is the one you expect (not a collision with a similarly-named file).

Step 3 — Move the file

  • Write the new file at `dest_path` with the same content.
  • Delete the old file at `source_path`.
  • If the source file was re-exported by a barrel (`index.ts`) in its old directory, remove that re-export.
  • If the dest directory has an `index.ts` barrel, add a re-export (match the barrel's existing style).

Step 4 — Update every importer

For each importer, rewrite the import specifier to point at the new location. Prefer the project's existing style:

  • If importers use `@/` aliases, use the `@/` alias.
  • If importers use relative paths, use a relative path computed from the importer's location.
  • Preserve `type` vs value imports (`import type { X }` stays `import type`).

Step 5 — Verify

pnpm typecheck 2>&1 | tail -20
pnpm lint 2>&1 | tail -20
pnpm tsp:compile 2>&1 | tail -5   # only if source was a .tsp file

If typecheck fails, read the error. If it's a genuine import you missed, update it. Max 3 fix attempts. If unfixable, revert all edits and return failure.

Step 6 — Report (under 250 words)

  • **Moved**: `<source>` → `<dest>`
  • **Validated imports for `<dest_layer>`**: OK or refused (with reason)
  • **Importers updated**: list of paths
  • **Barrels touched**: list (added/removed re-exports)
  • **Verification**: commands + status

Strict rules

  • **Never move a file whose dependencies violate the destination layer's rules.** Refuse and report.
  • **Never rename the exported symbol**. If `dest_path` filename changes, that's fine; the exported class/function keeps its name.
  • **Never move multiple files in one invocation.** One file per run; caller parallelizes with multiple Agent calls for independent moves.
  • **Never touch business logic.** You are an import rewriter, not a refactorer.
  • **Never commit.**
  • **Windows paths**: any new relative imports must use forward slashes inside the import specifier. The filesystem Write/Edit operations can use whatever the system expects, but the string inside `from '...'` is always forward-slash.

Example

Caller prompt:

source_path: packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.ts
dest_path: packages/core/src/domain/shared/worktree-path.ts
dest_layer: domain

Your first action: read the source file and confirm it imports only `node:path` and nothing from the project. If true, proceed. If it imports from `infrastructure/` or `application/`, refuse.

Read more
Ships withshep

Ship features 10x faster. Built In Auto: Memory, K8S Agent & Security (SDD+SDLC) . 😇

Get the whole plugin

Other agents on shep.